diff --git a/.bazelrc b/.bazelrc index 8339fc80e2d67..61356f086fda5 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,4 +1,4 @@ -startup --host_jvm_args=-Xmx5g +startup --host_jvm_args=-Xmx8g startup --unlimit_coredumps run:ci --color=yes diff --git a/.bazelversion b/.bazelversion index 84197c89467dd..09b254e90c61e 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -5.3.2 +6.0.0 diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000000..bde24b721461e --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,14 @@ +version: 2 +updates: + - package-ecosystem: "gomod" + directory: "/" + schedule: + interval: "weekly" + day: "friday" + time: "18:00" + timezone: "Asia/Shanghai" + allow: + - dependency-name: "golang.org/*" + - dependency-name: "github.com/golangci/golangci-lint" + open-pull-requests-limit: 2 + diff --git a/.github/licenserc.yml b/.github/licenserc.yml index e1add7017983b..aec59e4f66d57 100644 --- a/.github/licenserc.yml +++ b/.github/licenserc.yml @@ -40,4 +40,5 @@ header: - "tidb-binlog/proto/go-binlog/secondary_binlog.pb.go" - "**/*.sql" - ".bazelversion" + - "build/image/.ci_bazel" comment: on-failure diff --git a/.github/workflows/integration-test-br-compatibility.yml b/.github/workflows/integration-test-br-compatibility.yml deleted file mode 100644 index 5df7168467005..0000000000000 --- a/.github/workflows/integration-test-br-compatibility.yml +++ /dev/null @@ -1,62 +0,0 @@ -name: BR / Compatibility Test - -on: - push: - # merged git action - branches: - - master - - "release-[0-9].[0-9]*" - paths: - - "br/**" - - "!**.html" - - "!**.md" - - "!CNAME" - - "!LICENSE" - - "!br/docs/**" - - "!br/tests/**" - - "!br/docker/**" - # disable pull request only keep the merge action since it is very costly to run those tests - # pull_request: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }} - cancel-in-progress: true - -permissions: - contents: read # to fetch code (actions/checkout) - -jobs: - check: - runs-on: ubuntu-latest - timeout-minutes: 25 - steps: - - uses: actions/checkout@v2 - - - name: Set up Go - uses: actions/setup-go@v3 - with: - go-version-file: 'go.mod' - - - name: Generate compatibility test backup data - timeout-minutes: 15 - run: sh br/compatibility/prepare_backup.sh - - - name: Start server - run: | - TAG=nightly PORT_SUFFIX=1 docker-compose -f br/compatibility/backup_cluster.yaml rm -s -v - TAG=nightly PORT_SUFFIX=1 docker-compose -f br/compatibility/backup_cluster.yaml build - TAG=nightly PORT_SUFFIX=1 docker-compose -f br/compatibility/backup_cluster.yaml up --remove-orphans -d - TAG=nightly PORT_SUFFIX=1 docker-compose -f br/compatibility/backup_cluster.yaml exec -T control go mod tidy - TAG=nightly PORT_SUFFIX=1 docker-compose -f br/compatibility/backup_cluster.yaml exec -T control make build_br - TAG=nightly PORT_SUFFIX=1 docker-compose -f br/compatibility/backup_cluster.yaml exec -T control br/tests/run_compatible.sh run - - - name: Collect component log - if: ${{ failure() }} - run: | - tar czvf ${{ github.workspace }}/logs.tar.gz /tmp/br/docker/backup_logs/* - - - uses: actions/upload-artifact@v2 - if: ${{ failure() }} - with: - name: logs - path: ${{ github.workspace }}/logs.tar.gz diff --git a/.github/workflows/misc.yml b/.github/workflows/misc.yml deleted file mode 100644 index 94b68e9c95510..0000000000000 --- a/.github/workflows/misc.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: misc - -on: - workflow_dispatch: - pull_request: - branches: - - "master" - - "main" - - "release-**" - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -permissions: - contents: read # to fetch code (actions/checkout) - -jobs: - check: - permissions: - contents: read # to fetch code (actions/checkout) - pull-requests: write # to comment on pull-requests - - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Check File Permission - run: make check-file-perm - - name: Check License Header - uses: apache/skywalking-eyes/header@v0.4.0 - with: - log: info - token: ${{ secrets.GITHUB_TOKEN }} - config: .github/licenserc.yml diff --git a/.gitignore b/.gitignore index e2cdcd078a0f1..35af372bcccad 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,4 @@ bazel-out bazel-testlogs bazel-tidb .ijwb/ +/oom_record/ diff --git a/DEPS.bzl b/DEPS.bzl index 4c3e94cca5a14..f46224ad85dab 100644 --- a/DEPS.bzl +++ b/DEPS.bzl @@ -5,8 +5,8 @@ def go_deps(): name = "cc_mvdan_gofumpt", build_file_proto_mode = "disable", importpath = "mvdan.cc/gofumpt", - sum = "h1:avhhrOmv0IuvQVK7fvwV91oFSGAk5/6Po8GXTzICeu8=", - version = "v0.3.1", + sum = "h1:JVf4NN1mIpHogBj7ABpgOyZc65/UUOkKQFkoURsz4MM=", + version = "v0.4.0", ) go_repository( name = "cc_mvdan_interfacer", @@ -26,24 +26,40 @@ def go_deps(): name = "cc_mvdan_unparam", build_file_proto_mode = "disable", importpath = "mvdan.cc/unparam", - sum = "h1:seuXWbRB1qPrS3NQnHmFKLJLtskWyueeIzmLXghMGgk=", - version = "v0.0.0-20220706161116-678bad134442", + sum = "h1:3rvTIIM22r9pvXk+q3swxUQAQOxksVMGK7sml4nG57w=", + version = "v0.0.0-20221223090309-7455f1af531d", ) go_repository( name = "co_honnef_go_tools", build_file_proto_mode = "disable_global", importpath = "honnef.co/go/tools", - sum = "h1:oDx7VAwstgpYpb3wv0oxiZlxY+foCpRAwY7Vk6XpAgA=", - version = "v0.3.3", + sum = "h1:lyXVV1c8wUBJRKqI8JgIpT8TW1VDagfYYaxbKa/HoL8=", + version = "v0.4.0", + ) + go_repository( + name = "com_4d63_gocheckcompilerdirectives", + build_file_proto_mode = "disable", + importpath = "4d63.com/gocheckcompilerdirectives", + sum = "h1:AHcMYuw56NPjq/2y615IGg2kYkBdTvOaojYCBcRE7MA=", + version = "v1.2.1", ) + go_repository( name = "com_4d63_gochecknoglobals", build_file_proto_mode = "disable", importpath = "4d63.com/gochecknoglobals", - sum = "h1:zeZSRqj5yCg28tCkIV/z/lWbwvNm5qnKVS15PI8nhD0=", - version = "v0.1.0", + sum = "h1:1eiorGsgHOFOuoOiJDy2psSrQbRdIHrlge0IJIkUgDc=", + version = "v0.2.1", + ) + go_repository( + name = "com_github_abirdcfly_dupword", + build_file_proto_mode = "disable", + importpath = "github.com/Abirdcfly/dupword", + sum = "h1:MxprGjKq3yDBICXDgEEsyGirIXfMYXkLNT/agPsE1tk=", + version = "v0.0.9", ) + go_repository( name = "com_github_acarl005_stripansi", build_file_proto_mode = "disable", @@ -80,6 +96,14 @@ def go_deps(): sum = "h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E=", version = "v0.0.0-20190924025748-f65c72e2690d", ) + go_repository( + name = "com_github_aleksi_gocov_xml", + build_file_proto_mode = "disable", + importpath = "github.com/AlekSi/gocov-xml", + sum = "h1:4QctJBgXEkbzeKz6PJy6bt3JSPNSN4I2mITYW+eKUoQ=", + version = "v1.0.0", + ) + go_repository( name = "com_github_alexkohler_prealloc", build_file_proto_mode = "disable", @@ -131,6 +155,13 @@ def go_deps(): sum = "h1:PHhrh5ANKFWRBh7TdYmyyq2gyT2lotnvFvvFbylF81Q=", version = "v0.1.1", ) + go_repository( + name = "com_github_apache_skywalking_eyes", + build_file_proto_mode = "disable", + importpath = "github.com/apache/skywalking-eyes", + sum = "h1:O13kdRU6FCEZevfD01mdhTgCZLLfPZIQ0GXZrLl7FpQ=", + version = "v0.4.0", + ) go_repository( name = "com_github_apache_thrift", @@ -167,6 +198,14 @@ def go_deps(): sum = "h1:BUAU3CGlLvorLI26FmByPp2eC2qla6E1Tw+scpcg/to=", version = "v0.0.0-20180808171621-7fddfc383310", ) + go_repository( + name = "com_github_armon_go_socks5", + build_file_proto_mode = "disable", + importpath = "github.com/armon/go-socks5", + sum = "h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=", + version = "v0.0.0-20160902184237-e75332964ef5", + ) + go_repository( name = "com_github_ashanbrown_forbidigo", build_file_proto_mode = "disable", @@ -189,6 +228,14 @@ def go_deps(): sum = "h1:jLDC9RsNoYMLFlKpB8LdqUnoDdC2yvkS4QbuyPQJ8+M=", version = "v1.44.48", ) + go_repository( + name = "com_github_axw_gocov", + build_file_proto_mode = "disable", + importpath = "github.com/axw/gocov", + sum = "h1:YsqYR66hUmilVr23tu8USgnJIJvnwh3n7j5zRn7x4LU=", + version = "v1.0.0", + ) + go_repository( name = "com_github_aymerick_raymond", build_file_proto_mode = "disable_global", @@ -268,6 +315,13 @@ def go_deps(): sum = "h1:tYoz1OeRpx3dJZlh9T4dQt4kAndcmpl+VNdzbSgFC/0=", version = "v0.0.0-20160505134755-913427a1d5e8", ) + go_repository( + name = "com_github_bitly_go_simplejson", + build_file_proto_mode = "disable", + importpath = "github.com/bitly/go-simplejson", + sum = "h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y=", + version = "v0.5.0", + ) go_repository( name = "com_github_bketelsen_crypt", @@ -298,6 +352,14 @@ def go_deps(): sum = "h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M=", version = "v0.8.0", ) + go_repository( + name = "com_github_bmatcuk_doublestar_v2", + build_file_proto_mode = "disable", + importpath = "github.com/bmatcuk/doublestar/v2", + sum = "h1:6I6oUiT/sU27eE2OFcWqBhL1SwjyvQuOssxT4a1yidI=", + version = "v2.0.4", + ) + go_repository( name = "com_github_bombsimon_wsl_v3", build_file_proto_mode = "disable", @@ -305,6 +367,14 @@ def go_deps(): sum = "h1:Mka/+kRLoQJq7g2rggtgQsjuI/K5Efd87WX96EWFxjM=", version = "v3.3.0", ) + go_repository( + name = "com_github_breeswish_gin_jwt_v2", + build_file_proto_mode = "disable", + importpath = "github.com/breeswish/gin-jwt/v2", + sum = "h1:KLE/YeX+9FNaGVW5MtImRVPhjDpfpgJhvkuYWBmOYbo=", + version = "v2.6.4-jwt-patch", + ) + go_repository( name = "com_github_breml_bidichk", build_file_proto_mode = "disable", @@ -324,8 +394,8 @@ def go_deps(): name = "com_github_burntsushi_toml", build_file_proto_mode = "disable_global", importpath = "github.com/BurntSushi/toml", - sum = "h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0=", - version = "v1.2.0", + sum = "h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=", + version = "v1.2.1", ) go_repository( name = "com_github_burntsushi_xgb", @@ -341,6 +411,13 @@ def go_deps(): sum = "h1:QvrO2QF2+/Cx1WA/vETCIYBKtRjc30vesdoPUNo1EbY=", version = "v0.1.1", ) + go_repository( + name = "com_github_cakturk_go_netstat", + build_file_proto_mode = "disable", + importpath = "github.com/cakturk/go-netstat", + sum = "h1:BjkPE3785EwPhhyuFkbINB+2a1xATwk8SNDWnJiD41g=", + version = "v0.0.0-20200220111822-e5b49efee7a5", + ) go_repository( name = "com_github_carlmjohnson_flagext", @@ -356,6 +433,13 @@ def go_deps(): sum = "h1:7vXVw3g7XE+Vnj0A9TmFGtMeP4oZQ5ZzpPvKhLFa80E=", version = "v2.0.0+incompatible", ) + go_repository( + name = "com_github_cenkalti_backoff_v4", + build_file_proto_mode = "disable", + importpath = "github.com/cenkalti/backoff/v4", + sum = "h1:JIufpQLbh4DkbQoii76ItQIUFzevQSqOLZca4eamEDs=", + version = "v4.0.2", + ) go_repository( name = "com_github_census_instrumentation_opencensus_proto", @@ -382,8 +466,8 @@ def go_deps(): name = "com_github_cespare_xxhash_v2", build_file_proto_mode = "disable_global", importpath = "github.com/cespare/xxhash/v2", - sum = "h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=", - version = "v2.1.2", + sum = "h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=", + version = "v2.2.0", ) go_repository( name = "com_github_charithe_durationcheck", @@ -396,8 +480,8 @@ def go_deps(): name = "com_github_chavacava_garif", build_file_proto_mode = "disable", importpath = "github.com/chavacava/garif", - sum = "h1:E7LT642ysztPWE0dfz43cWOvMiF42DyTRC+eZIaO4yI=", - version = "v0.0.0-20220630083739-93517212f375", + sum = "h1:cy5GCEZLUCshCGCRRUjxHrDUqkB4l5cuUt3ShEckQEo=", + version = "v0.0.0-20221024190013-b3ef35877348", ) go_repository( @@ -442,6 +526,14 @@ def go_deps(): sum = "h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI=", version = "v0.3.4", ) + go_repository( + name = "com_github_cloudfoundry_gosigar", + build_file_proto_mode = "disable", + importpath = "github.com/cloudfoundry/gosigar", + sum = "h1:gIc08FbB3QPb+nAQhINIK/qhf5REKkY0FTGgRGXkcVc=", + version = "v1.3.6", + ) + go_repository( name = "com_github_cloudykit_fastprinter", build_file_proto_mode = "disable_global", @@ -657,8 +749,8 @@ def go_deps(): name = "com_github_curioswitch_go_reassign", build_file_proto_mode = "disable", importpath = "github.com/curioswitch/go-reassign", - sum = "h1:ekM07+z+VFT560Exz4mTv0/s1yU9gem6CJc/tlYpkmI=", - version = "v0.1.2", + sum = "h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo=", + version = "v0.2.0", ) go_repository( @@ -686,8 +778,8 @@ def go_deps(): name = "com_github_daixiang0_gci", build_file_proto_mode = "disable", importpath = "github.com/daixiang0/gci", - sum = "h1:wUAqXChk8HbwXn8AfxD9DYSCp9Bpz1L3e6Q4Roe+q9E=", - version = "v0.6.3", + sum = "h1:t8XZ0vK6l0pwPoOmoGyqW2NwQlvbpAQNVvu/GRBgykM=", + version = "v0.9.0", ) go_repository( @@ -752,8 +844,8 @@ def go_deps(): name = "com_github_dgraph_io_ristretto", build_file_proto_mode = "disable_global", importpath = "github.com/dgraph-io/ristretto", - sum = "h1:Wrc3UKTS+cffkOx0xRGFC+ZesNuTfn0ThvEC72N0krk=", - version = "v0.1.1-0.20220403145359-8e850b710d6d", + sum = "h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8=", + version = "v0.1.1", ) go_repository( name = "com_github_dgrijalva_jwt_go", @@ -792,6 +884,14 @@ def go_deps(): sum = "h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI=", version = "v1.2.0", ) + go_repository( + name = "com_github_dnephin_pflag", + build_file_proto_mode = "disable", + importpath = "github.com/dnephin/pflag", + sum = "h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk=", + version = "v1.0.7", + ) + go_repository( name = "com_github_docker_go_units", build_file_proto_mode = "disable_global", @@ -848,6 +948,21 @@ def go_deps(): sum = "h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk=", version = "v1.0.0", ) + go_repository( + name = "com_github_elazarl_goproxy", + build_file_proto_mode = "disable", + importpath = "github.com/elazarl/goproxy", + sum = "h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc=", + version = "v0.0.0-20180725130230-947c36da3153", + ) + go_repository( + name = "com_github_elliotchance_pie_v2", + build_file_proto_mode = "disable", + importpath = "github.com/elliotchance/pie/v2", + sum = "h1:KEVAAzxYxTyFs4hvebFZVzBdEo3YeMzl2HYDWn+P3F4=", + version = "v2.1.0", + ) + go_repository( name = "com_github_emirpasic_gods", build_file_proto_mode = "disable", @@ -860,8 +975,8 @@ def go_deps(): name = "com_github_envoyproxy_go_control_plane", build_file_proto_mode = "disable_global", importpath = "github.com/envoyproxy/go-control-plane", - sum = "h1:fP+fF0up6oPY49OrjPrhIJ8yQfdIM85NXMLkMg1EXVs=", - version = "v0.9.10-0.20210907150352-cf90f659a021", + sum = "h1:xvqufLtNVwAhN8NMyWklVgxnWohi+wtMGQMhtxexlm0=", + version = "v0.10.2-0.20220325020618-49ff273808a1", ) go_repository( name = "com_github_envoyproxy_protoc_gen_validate", @@ -933,8 +1048,8 @@ def go_deps(): name = "com_github_fatih_color", build_file_proto_mode = "disable_global", importpath = "github.com/fatih/color", - sum = "h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=", - version = "v1.13.0", + sum = "h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w=", + version = "v1.14.1", ) go_repository( name = "com_github_fatih_structs", @@ -998,15 +1113,15 @@ def go_deps(): name = "com_github_frankban_quicktest", build_file_proto_mode = "disable_global", importpath = "github.com/frankban/quicktest", - sum = "h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY=", - version = "v1.11.3", + sum = "h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=", + version = "v1.14.3", ) go_repository( name = "com_github_fsnotify_fsnotify", build_file_proto_mode = "disable_global", importpath = "github.com/fsnotify/fsnotify", - sum = "h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=", - version = "v1.5.4", + sum = "h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=", + version = "v1.6.0", ) go_repository( name = "com_github_fsouza_fake_gcs_server", @@ -1058,6 +1173,21 @@ def go_deps(): sum = "h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=", version = "v1.0.0", ) + go_repository( + name = "com_github_gin_contrib_cors", + build_file_proto_mode = "disable", + importpath = "github.com/gin-contrib/cors", + sum = "h1:oJ6gwtUl3lqV0WEIwM/LxPF1QZ5qe2lGWdY2+bz7y0g=", + version = "v1.4.0", + ) + go_repository( + name = "com_github_gin_contrib_gzip", + build_file_proto_mode = "disable", + importpath = "github.com/gin-contrib/gzip", + sum = "h1:ezvKOL6jH+jlzdHNE4h9h8q8uMpDQjyl0NN0Jd7jozc=", + version = "v0.0.1", + ) + go_repository( name = "com_github_gin_contrib_sse", build_file_proto_mode = "disable_global", @@ -1083,8 +1213,15 @@ def go_deps(): name = "com_github_go_critic_go_critic", build_file_proto_mode = "disable", importpath = "github.com/go-critic/go-critic", - sum = "h1:tucuG1pvOyYgpBIrVxw0R6gwO42lNa92Aq3VaDoIs+E=", - version = "v0.6.4", + sum = "h1:fDaR/5GWURljXwF8Eh31T2GZNz9X4jeboS912mWF8Uo=", + version = "v0.6.5", + ) + go_repository( + name = "com_github_go_echarts_go_echarts", + build_file_proto_mode = "disable", + importpath = "github.com/go-echarts/go-echarts", + sum = "h1:n181E4iXwj4zrU9VYmdM2m8dyhERt2w9k9YhHqdp6A8=", + version = "v1.0.0", ) go_repository( @@ -1127,8 +1264,8 @@ def go_deps(): name = "com_github_go_kit_log", build_file_proto_mode = "disable_global", importpath = "github.com/go-kit/log", - sum = "h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw=", - version = "v0.2.0", + sum = "h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=", + version = "v0.2.1", ) go_repository( name = "com_github_go_logfmt_logfmt", @@ -1137,6 +1274,14 @@ def go_deps(): sum = "h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA=", version = "v0.5.1", ) + go_repository( + name = "com_github_go_logr_logr", + build_file_proto_mode = "disable", + importpath = "github.com/go-logr/logr", + sum = "h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=", + version = "v1.2.3", + ) + go_repository( name = "com_github_go_martini_martini", build_file_proto_mode = "disable_global", @@ -1151,12 +1296,69 @@ def go_deps(): sum = "h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=", version = "v1.2.6", ) + go_repository( + name = "com_github_go_openapi_jsonpointer", + build_file_proto_mode = "disable", + importpath = "github.com/go-openapi/jsonpointer", + sum = "h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=", + version = "v0.19.5", + ) + go_repository( + name = "com_github_go_openapi_jsonreference", + build_file_proto_mode = "disable", + importpath = "github.com/go-openapi/jsonreference", + sum = "h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=", + version = "v0.19.6", + ) + go_repository( + name = "com_github_go_openapi_spec", + build_file_proto_mode = "disable", + importpath = "github.com/go-openapi/spec", + sum = "h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M=", + version = "v0.20.4", + ) + go_repository( + name = "com_github_go_openapi_swag", + build_file_proto_mode = "disable", + importpath = "github.com/go-openapi/swag", + sum = "h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM=", + version = "v0.19.15", + ) + go_repository( + name = "com_github_go_playground_locales", + build_file_proto_mode = "disable", + importpath = "github.com/go-playground/locales", + sum = "h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=", + version = "v0.14.0", + ) + go_repository( + name = "com_github_go_playground_universal_translator", + build_file_proto_mode = "disable", + importpath = "github.com/go-playground/universal-translator", + sum = "h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=", + version = "v0.18.0", + ) + go_repository( + name = "com_github_go_playground_validator_v10", + build_file_proto_mode = "disable", + importpath = "github.com/go-playground/validator/v10", + sum = "h1:I7mrTYv78z8k8VXa/qJlOlEXn/nBh+BF8dHX5nt/dr0=", + version = "v10.10.0", + ) + go_repository( + name = "com_github_go_resty_resty_v2", + build_file_proto_mode = "disable", + importpath = "github.com/go-resty/resty/v2", + sum = "h1:joIR5PNLM2EFqqESUjCMGXrWmXNHEU9CEiK813oKYS4=", + version = "v2.6.0", + ) + go_repository( name = "com_github_go_sql_driver_mysql", build_file_proto_mode = "disable_global", importpath = "github.com/go-sql-driver/mysql", - sum = "h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=", - version = "v1.6.0", + sum = "h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=", + version = "v1.7.0", ) go_repository( name = "com_github_go_stack_stack", @@ -1183,15 +1385,15 @@ def go_deps(): name = "com_github_go_toolsmith_astcopy", build_file_proto_mode = "disable", importpath = "github.com/go-toolsmith/astcopy", - sum = "h1:l09oBhAPyV74kLJ3ZO31iBU8htZGTwr9LTjuMCyL8go=", - version = "v1.0.1", + sum = "h1:YnWf5Rnh1hUudj11kei53kI57quN/VH6Hp1n+erozn0=", + version = "v1.0.2", ) go_repository( name = "com_github_go_toolsmith_astequal", build_file_proto_mode = "disable", importpath = "github.com/go-toolsmith/astequal", - sum = "h1:+XvaV8zNxua+9+Oa4AHmgmpo4RYAbwr/qjNppLfX2yM=", - version = "v1.0.2", + sum = "h1:+LVdyRatFS+XO78SGV4I3TCEA0AC7fKEGma+fH+674o=", + version = "v1.0.3", ) go_repository( name = "com_github_go_toolsmith_astfmt", @@ -1225,8 +1427,8 @@ def go_deps(): name = "com_github_go_xmlfmt_xmlfmt", build_file_proto_mode = "disable", importpath = "github.com/go-xmlfmt/xmlfmt", - sum = "h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo=", - version = "v0.0.0-20191208150333-d5b6f63a941b", + sum = "h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U=", + version = "v1.1.2", ) go_repository( name = "com_github_gobwas_glob", @@ -1257,6 +1459,14 @@ def go_deps(): sum = "h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo=", version = "v1.0.2", ) + go_repository( + name = "com_github_goccy_go_graphviz", + build_file_proto_mode = "disable", + importpath = "github.com/goccy/go-graphviz", + sum = "h1:s/FMMJ1Joj6La3S5ApO3Jk2cwM4LpXECC2muFx3IPQQ=", + version = "v0.0.9", + ) + go_repository( name = "com_github_goccy_go_json", build_file_proto_mode = "disable", @@ -1330,6 +1540,14 @@ def go_deps(): sum = "h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=", version = "v0.0.0-20210331224755-41bb18bfe9da", ) + go_repository( + name = "com_github_golang_jwt_jwt", + build_file_proto_mode = "disable", + importpath = "github.com/golang-jwt/jwt", + sum = "h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c=", + version = "v3.2.1+incompatible", + ) + go_repository( name = "com_github_golang_mock", build_file_proto_mode = "disable_global", @@ -1381,15 +1599,15 @@ def go_deps(): name = "com_github_golangci_gofmt", build_file_proto_mode = "disable", importpath = "github.com/golangci/gofmt", - sum = "h1:iR3fYXUjHCR97qWS8ch1y9zPNsgXThGwjKPrYfqMPks=", - version = "v0.0.0-20190930125516-244bba706f1a", + sum = "h1:amWTbTGqOZ71ruzrdA+Nx5WA3tV1N0goTspwmKCQvBY=", + version = "v0.0.0-20220901101216-f2edd75033f2", ) go_repository( name = "com_github_golangci_golangci_lint", build_file_proto_mode = "disable", importpath = "github.com/golangci/golangci-lint", - sum = "h1:I8WHOavragDttlLHtSraHn/h39C+R60bEQ5NoGcHQr8=", - version = "v1.49.0", + sum = "h1:M1bpDymgdaPKNzPwQdebCGki/nzvVkr2f/eUfk9C9oU=", + version = "v1.51.0", ) go_repository( name = "com_github_golangci_gosec", @@ -1417,8 +1635,8 @@ def go_deps(): name = "com_github_golangci_misspell", build_file_proto_mode = "disable", importpath = "github.com/golangci/misspell", - sum = "h1:pLzmVdl3VxTOncgzHcvLOKirdvcx/TydsClUQXTehjo=", - version = "v0.3.5", + sum = "h1:KtVB/hTK4bbL/S6bs64rYyk8adjmh1BygbBiaAiX+a0=", + version = "v0.4.0", ) go_repository( @@ -1457,19 +1675,35 @@ def go_deps(): sum = "h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=", version = "v1.1.2", ) + go_repository( + name = "com_github_google_gnostic", + build_file_proto_mode = "disable", + importpath = "github.com/google/gnostic", + sum = "h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=", + version = "v0.5.7-v3refs", + ) + go_repository( name = "com_github_google_go_cmp", build_file_proto_mode = "disable_global", importpath = "github.com/google/go-cmp", - sum = "h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=", - version = "v0.5.8", + sum = "h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=", + version = "v0.5.9", + ) + go_repository( + name = "com_github_google_go_github_v33", + build_file_proto_mode = "disable", + importpath = "github.com/google/go-github/v33", + sum = "h1:qAf9yP0qc54ufQxzwv+u9H0tiVOnPJxo0lI/JXqw3ZM=", + version = "v33.0.0", ) + go_repository( name = "com_github_google_go_querystring", build_file_proto_mode = "disable_global", importpath = "github.com/google/go-querystring", - sum = "h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=", - version = "v1.0.0", + sum = "h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=", + version = "v1.1.0", ) go_repository( name = "com_github_google_gofuzz", @@ -1478,6 +1712,14 @@ def go_deps(): sum = "h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw=", version = "v1.0.0", ) + go_repository( + name = "com_github_google_licensecheck", + build_file_proto_mode = "disable", + importpath = "github.com/google/licensecheck", + sum = "h1:QoxgoDkaeC4nFrtGN1jV7IPmDCHFNIVh54e5hSt6sPs=", + version = "v0.3.1", + ) + go_repository( name = "com_github_google_martian", build_file_proto_mode = "disable_global", @@ -1506,6 +1748,14 @@ def go_deps(): sum = "h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA=", version = "v0.1.0", ) + go_repository( + name = "com_github_google_shlex", + build_file_proto_mode = "disable", + importpath = "github.com/google/shlex", + sum = "h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=", + version = "v0.0.0-20191202100458-e7afc7fbc510", + ) + go_repository( name = "com_github_google_uuid", build_file_proto_mode = "disable_global", @@ -1513,12 +1763,20 @@ def go_deps(): sum = "h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=", version = "v1.3.0", ) + go_repository( + name = "com_github_googleapis_enterprise_certificate_proxy", + build_file_proto_mode = "disable", + importpath = "github.com/googleapis/enterprise-certificate-proxy", + sum = "h1:y8Yozv7SZtlU//QXbezB6QkpuE6jMD2/gfzk4AftXjs=", + version = "v0.2.0", + ) + go_repository( name = "com_github_googleapis_gax_go_v2", build_file_proto_mode = "disable_global", importpath = "github.com/googleapis/gax-go/v2", - sum = "h1:s7jOdKSaksJVOxE0Y/S32otcfiP+UQ0cL8/GTKaONwE=", - version = "v2.2.0", + sum = "h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ=", + version = "v2.7.0", ) go_repository( name = "com_github_googleapis_gnostic", @@ -1527,6 +1785,14 @@ def go_deps(): sum = "h1:l6N3VoaVzTncYYW+9yOz2LJJammFZGBO13sqgEhpy9g=", version = "v0.2.0", ) + go_repository( + name = "com_github_googleapis_go_type_adapters", + build_file_proto_mode = "disable", + importpath = "github.com/googleapis/go-type-adapters", + sum = "h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA=", + version = "v1.0.0", + ) + go_repository( name = "com_github_gophercloud_gophercloud", build_file_proto_mode = "disable", @@ -1661,6 +1927,13 @@ def go_deps(): sum = "h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU=", version = "v0.0.0-20180507213350-8e809c8a8645", ) + go_repository( + name = "com_github_gtank_cryptopasta", + build_file_proto_mode = "disable", + importpath = "github.com/gtank/cryptopasta", + sum = "h1:7xsUJsB2NrdcttQPa7JLEaGzvdbk7KvfrjgHZXOQRo0=", + version = "v0.0.0-20170601214702-1f550f6f2f69", + ) go_repository( name = "com_github_hashicorp_consul_api", @@ -1817,6 +2090,14 @@ def go_deps(): sum = "h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=", version = "v1.0.0", ) + go_repository( + name = "com_github_huandu_xstrings", + build_file_proto_mode = "disable", + importpath = "github.com/huandu/xstrings", + sum = "h1:4jgBlKK6tLKFvO8u5pmYjG91cqytmDCDvGh7ECVFfFs=", + version = "v1.3.1", + ) + go_repository( name = "com_github_hydrogen18_memlistener", build_file_proto_mode = "disable_global", @@ -1838,6 +2119,14 @@ def go_deps(): sum = "h1:uGg2frlt3IcT7kbV6LEp5ONv4vmoO2FW4qSO+my/aoM=", version = "v0.0.0-20210905161508-09a460cdf81d", ) + go_repository( + name = "com_github_imdario_mergo", + build_file_proto_mode = "disable", + importpath = "github.com/imdario/mergo", + sum = "h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA=", + version = "v0.3.11", + ) + go_repository( name = "com_github_imkira_go_interpol", build_file_proto_mode = "disable_global", @@ -1849,8 +2138,8 @@ def go_deps(): name = "com_github_inconshreveable_mousetrap", build_file_proto_mode = "disable_global", importpath = "github.com/inconshreveable/mousetrap", - sum = "h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=", - version = "v1.0.0", + sum = "h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=", + version = "v1.0.1", ) go_repository( name = "com_github_influxdata_influxdb", @@ -1980,6 +2269,21 @@ def go_deps(): sum = "h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs=", version = "v1.1.1", ) + go_repository( + name = "com_github_jinzhu_inflection", + build_file_proto_mode = "disable", + importpath = "github.com/jinzhu/inflection", + sum = "h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=", + version = "v1.0.0", + ) + go_repository( + name = "com_github_jinzhu_now", + build_file_proto_mode = "disable", + importpath = "github.com/jinzhu/now", + sum = "h1:eVKgfIdy9b6zbWBMgFpfDPoAMifwSZagU9HmEU6zgiI=", + version = "v1.1.2", + ) + go_repository( name = "com_github_jirfag_go_printf_func_name", build_file_proto_mode = "disable", @@ -2002,6 +2306,14 @@ def go_deps(): sum = "h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=", version = "v1.5.1", ) + go_repository( + name = "com_github_joho_godotenv", + build_file_proto_mode = "disable", + importpath = "github.com/joho/godotenv", + sum = "h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg=", + version = "v1.4.0", + ) + go_repository( name = "com_github_joho_sqltocsv", build_file_proto_mode = "disable_global", @@ -2030,6 +2342,21 @@ def go_deps(): sum = "h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ=", version = "v0.2.2", ) + go_repository( + name = "com_github_joomcode_errorx", + build_file_proto_mode = "disable", + importpath = "github.com/joomcode/errorx", + sum = "h1:CalpDWz14ZHd68fIqluJasJosAewpz2TFaJALrUxjrk=", + version = "v1.0.1", + ) + go_repository( + name = "com_github_josharian_intern", + build_file_proto_mode = "disable", + importpath = "github.com/josharian/intern", + sum = "h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=", + version = "v1.0.0", + ) + go_repository( name = "com_github_jpillora_backoff", build_file_proto_mode = "disable_global", @@ -2101,6 +2428,14 @@ def go_deps(): sum = "h1:PJr+ZMXIecYc1Ey2zucXdR73SMBtgjPgwa31099IMv0=", version = "v1.0.3-0.20190309125859-24315acbbda5", ) + go_repository( + name = "com_github_junk1tm_musttag", + build_file_proto_mode = "disable", + importpath = "github.com/junk1tm/musttag", + sum = "h1:I8UHQkDj2u/MClcGU8PbMoYwhykiSQFEbXKKMjixPyk=", + version = "v0.4.3", + ) + go_repository( name = "com_github_k0kubun_colorstring", build_file_proto_mode = "disable_global", @@ -2144,8 +2479,8 @@ def go_deps(): patches = [ "//build/patches:com_github_kisielk_errcheck.patch", ], - sum = "h1:uGQ9xI8/pgc9iOoCe7kWQgRE6SBTrCGmTSf0LrEtY7c=", - version = "v1.6.2", + sum = "h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8=", + version = "v1.6.3", ) go_repository( name = "com_github_kisielk_gotool", @@ -2154,12 +2489,20 @@ def go_deps(): sum = "h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg=", version = "v1.0.0", ) + go_repository( + name = "com_github_kkhaike_contextcheck", + build_file_proto_mode = "disable", + importpath = "github.com/kkHAIKE/contextcheck", + sum = "h1:l4pNvrb8JSwRd51ojtcOxOeHJzHek+MtOyXbaR0uvmw=", + version = "v1.1.3", + ) + go_repository( name = "com_github_klauspost_compress", build_file_proto_mode = "disable_global", importpath = "github.com/klauspost/compress", - sum = "h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A=", - version = "v1.15.1", + sum = "h1:NFn1Wr8cfnenSJSA46lLq4wHCcBzKTSjnBIexDMMOV0=", + version = "v1.15.13", ) go_repository( name = "com_github_klauspost_cpuid", @@ -2225,13 +2568,20 @@ def go_deps(): sum = "h1:FCKYMF1OF2+RveWlABsdnmsvJrei5aoyZoaGS+Ugg8g=", version = "v1.0.6", ) + go_repository( + name = "com_github_kylebanks_depth", + build_file_proto_mode = "disable", + importpath = "github.com/KyleBanks/depth", + sum = "h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=", + version = "v1.2.1", + ) go_repository( name = "com_github_kyoh86_exportloopref", build_file_proto_mode = "disable", importpath = "github.com/kyoh86/exportloopref", - sum = "h1:5Ry/at+eFdkX9Vsdw3qU4YkvGtzuVfzT4X7S77LoN/M=", - version = "v0.1.8", + sum = "h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ=", + version = "v0.1.11", ) go_repository( @@ -2259,15 +2609,23 @@ def go_deps(): name = "com_github_ldez_tagliatelle", build_file_proto_mode = "disable", importpath = "github.com/ldez/tagliatelle", - sum = "h1:3BqVVlReVUZwafJUwQ+oxbx2BEX2vUG4Yu/NOfMiKiM=", - version = "v0.3.1", + sum = "h1:sylp7d9kh6AdXN2DpVGHBRb5guTVAgOxqNGhbqc4b1c=", + version = "v0.4.0", + ) + go_repository( + name = "com_github_leodido_go_urn", + build_file_proto_mode = "disable", + importpath = "github.com/leodido/go-urn", + sum = "h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=", + version = "v1.2.1", ) + go_repository( name = "com_github_leonklingele_grouper", build_file_proto_mode = "disable", importpath = "github.com/leonklingele/grouper", - sum = "h1:tC2y/ygPbMFSBOs3DcyaEMKnnwH7eYKzohOtRrf0SAg=", - version = "v1.1.0", + sum = "h1:suWXRU57D4/Enn6pXR0QVqqWWrnJ9Osrz+5rjt8ivzU=", + version = "v1.1.1", ) go_repository( name = "com_github_lestrrat_go_blackmagic", @@ -2349,6 +2707,22 @@ def go_deps(): sum = "h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=", version = "v1.8.6", ) + go_repository( + name = "com_github_mailru_easyjson", + build_file_proto_mode = "disable", + importpath = "github.com/mailru/easyjson", + sum = "h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=", + version = "v0.7.6", + ) + + go_repository( + name = "com_github_maratori_testableexamples", + build_file_proto_mode = "disable", + importpath = "github.com/maratori/testableexamples", + sum = "h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI=", + version = "v1.0.0", + ) + go_repository( name = "com_github_maratori_testpackage", build_file_proto_mode = "disable", @@ -2356,6 +2730,14 @@ def go_deps(): sum = "h1:GJY4wlzQhuBusMF1oahQCBtUV/AQ/k69IZ68vxaac2Q=", version = "v1.1.0", ) + go_repository( + name = "com_github_masterminds_goutils", + build_file_proto_mode = "disable", + importpath = "github.com/Masterminds/goutils", + sum = "h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=", + version = "v1.1.1", + ) + go_repository( name = "com_github_masterminds_semver", build_file_proto_mode = "disable", @@ -2363,6 +2745,21 @@ def go_deps(): sum = "h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=", version = "v1.5.0", ) + go_repository( + name = "com_github_masterminds_semver_v3", + build_file_proto_mode = "disable", + importpath = "github.com/Masterminds/semver/v3", + sum = "h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=", + version = "v3.1.1", + ) + go_repository( + name = "com_github_masterminds_sprig_v3", + build_file_proto_mode = "disable", + importpath = "github.com/Masterminds/sprig/v3", + sum = "h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8=", + version = "v3.2.2", + ) + go_repository( name = "com_github_matoous_godox", build_file_proto_mode = "disable", @@ -2382,8 +2779,8 @@ def go_deps(): name = "com_github_mattn_go_isatty", build_file_proto_mode = "disable_global", importpath = "github.com/mattn/go-isatty", - sum = "h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=", - version = "v0.0.16", + sum = "h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=", + version = "v0.0.17", ) go_repository( name = "com_github_mattn_go_runewidth", @@ -2392,6 +2789,21 @@ def go_deps(): sum = "h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU=", version = "v0.0.14", ) + go_repository( + name = "com_github_mattn_go_shellwords", + build_file_proto_mode = "disable", + importpath = "github.com/mattn/go-shellwords", + sum = "h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk=", + version = "v1.0.12", + ) + go_repository( + name = "com_github_mattn_go_sqlite3", + build_file_proto_mode = "disable", + importpath = "github.com/mattn/go-sqlite3", + sum = "h1:10HX2Td0ocZpYEjhilsuo6WWtUqttj2Kb0KtD86/KYA=", + version = "v1.14.9", + ) + go_repository( name = "com_github_mattn_goveralls", build_file_proto_mode = "disable_global", @@ -2403,8 +2815,8 @@ def go_deps(): name = "com_github_matttproud_golang_protobuf_extensions", build_file_proto_mode = "disable_global", importpath = "github.com/matttproud/golang_protobuf_extensions", - sum = "h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=", - version = "v1.0.1", + sum = "h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=", + version = "v1.0.4", ) go_repository( name = "com_github_maxatome_go_testdeep", @@ -2448,8 +2860,8 @@ def go_deps(): name = "com_github_mgechev_revive", build_file_proto_mode = "disable", importpath = "github.com/mgechev/revive", - sum = "h1:+2Hd/S8oO2H0Ikq2+egtNwQsVhAeELHjxjIUFX5ajLI=", - version = "v1.2.4", + sum = "h1:UF9AR8pOAuwNmhXj2odp4mxv9Nx2qUIwVz8ZsU+Mbec=", + version = "v1.2.5", ) go_repository( @@ -2466,6 +2878,14 @@ def go_deps(): sum = "h1:oN9gL93BkuPrer2rehDbDx86k4zbYJEnMP6Krh82nh0=", version = "v1.1.10", ) + go_repository( + name = "com_github_minio_sio", + build_file_proto_mode = "disable", + importpath = "github.com/minio/sio", + sum = "h1:syEFBewzOMOYVzSTFpp1MqpSZk8rUNbz8VIIc+PNzus=", + version = "v0.3.0", + ) + go_repository( name = "com_github_mitchellh_cli", build_file_proto_mode = "disable_global", @@ -2473,6 +2893,14 @@ def go_deps(): sum = "h1:iGBIsUe3+HZ/AD/Vd7DErOt5sU9fa8Uj7A2s1aggv1Y=", version = "v1.0.0", ) + go_repository( + name = "com_github_mitchellh_copystructure", + build_file_proto_mode = "disable", + importpath = "github.com/mitchellh/copystructure", + sum = "h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ=", + version = "v1.0.0", + ) + go_repository( name = "com_github_mitchellh_go_homedir", build_file_proto_mode = "disable_global", @@ -2531,6 +2959,13 @@ def go_deps(): sum = "h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE=", version = "v1.0.1", ) + go_repository( + name = "com_github_moby_spdystream", + build_file_proto_mode = "disable", + importpath = "github.com/moby/spdystream", + sum = "h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8=", + version = "v0.2.0", + ) go_repository( name = "com_github_modern_go_concurrent", @@ -2583,6 +3018,14 @@ def go_deps(): sum = "h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=", version = "v0.0.0-20190716064945-2f068394615f", ) + go_repository( + name = "com_github_mxk_go_flowrate", + build_file_proto_mode = "disable", + importpath = "github.com/mxk/go-flowrate", + sum = "h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus=", + version = "v0.0.0-20140419014527-cca7078d478f", + ) + go_repository( name = "com_github_nakabonne_nestif", build_file_proto_mode = "disable", @@ -2652,8 +3095,8 @@ def go_deps(): name = "com_github_nishanths_exhaustive", build_file_proto_mode = "disable", importpath = "github.com/nishanths/exhaustive", - sum = "h1:0QKNascWv9qIHY7zRoZSxeRr6kuk5aAT3YXLTiDmjTo=", - version = "v0.8.1", + sum = "h1:TzssWan6orBiLYVqewCG8faud9qlFntJE30ACpzmGME=", + version = "v0.9.5", ) go_repository( @@ -2663,13 +3106,20 @@ def go_deps(): sum = "h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk=", version = "v0.2.2", ) + go_repository( + name = "com_github_nunnatsa_ginkgolinter", + build_file_proto_mode = "disable", + importpath = "github.com/nunnatsa/ginkgolinter", + sum = "h1:j4mzqx1hkE75mXHs3AUlWghZBi59c3GDWXp6zzcI+kE=", + version = "v0.7.1", + ) go_repository( name = "com_github_nxadm_tail", build_file_proto_mode = "disable_global", importpath = "github.com/nxadm/tail", - sum = "h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=", - version = "v1.4.4", + sum = "h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=", + version = "v1.4.8", ) go_repository( name = "com_github_oklog_run", @@ -2686,6 +3136,14 @@ def go_deps(): sum = "h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=", version = "v1.3.1", ) + go_repository( + name = "com_github_oleiade_reflections", + build_file_proto_mode = "disable", + importpath = "github.com/oleiade/reflections", + sum = "h1:D1XO3LVEYroYskEsoSiGItp9RUxG6jWnCVvrqH0HHQM=", + version = "v1.0.1", + ) + go_repository( name = "com_github_olekukonko_tablewriter", build_file_proto_mode = "disable_global", @@ -2711,22 +3169,22 @@ def go_deps(): name = "com_github_onsi_ginkgo_v2", build_file_proto_mode = "disable_global", importpath = "github.com/onsi/ginkgo/v2", - sum = "h1:CcuG/HvWNkkaqCUpJifQY8z7qEMBJya6aLPx6ftGyjQ=", - version = "v2.0.0", + sum = "h1:+Ig9nvqgS5OBSACXNk15PLdp0U9XPYROt9CFzVdFGIs=", + version = "v2.4.0", ) go_repository( name = "com_github_onsi_gomega", build_file_proto_mode = "disable_global", importpath = "github.com/onsi/gomega", - sum = "h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=", - version = "v1.18.1", + sum = "h1:/oxKu9c2HVap+F3PfKort2Hw5DEU+HGlW8n+tguWsys=", + version = "v1.23.0", ) go_repository( name = "com_github_openpeedeep_depguard", build_file_proto_mode = "disable", importpath = "github.com/OpenPeeDeeP/depguard", - sum = "h1:pjK9nLPS1FwQYGGpPxoMYpe7qACHOhAWQMQzV71i49o=", - version = "v1.1.0", + sum = "h1:TSUznLjvp/4IUP+OQ0t/4jF4QUyxIcVX8YnghZdunyA=", + version = "v1.1.1", ) go_repository( @@ -2805,8 +3263,8 @@ def go_deps(): name = "com_github_pelletier_go_toml_v2", build_file_proto_mode = "disable", importpath = "github.com/pelletier/go-toml/v2", - sum = "h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw=", - version = "v2.0.2", + sum = "h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg=", + version = "v2.0.5", ) go_repository( name = "com_github_peterbourgon_g2s", @@ -2819,8 +3277,8 @@ def go_deps(): name = "com_github_petermattis_goid", build_file_proto_mode = "disable", importpath = "github.com/petermattis/goid", - sum = "h1:rUMC+oZ89Om6l9wvUNjzI0ZrKrSnXzV+opsgAohYUNc=", - version = "v0.0.0-20170504144140-0ded85884ba5", + sum = "h1:64bxqeTEN0/xoEqhKGowgihNuzISS9rEG6YUMU4bzJo=", + version = "v0.0.0-20211229010228-4d14c490ee36", ) go_repository( @@ -2838,6 +3296,14 @@ def go_deps(): sum = "h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc=", version = "v0.0.0-20180830031419-95f893ade6f2", ) + go_repository( + name = "com_github_phf_go_queue", + build_file_proto_mode = "disable", + importpath = "github.com/phf/go-queue", + sum = "h1:U+PMnTlV2tu7RuMK5etusZG3Cf+rpow5hqQByeCzJ2g=", + version = "v0.0.0-20170504031614-9abe38d0371d", + ) + go_repository( name = "com_github_pierrec_lz4", build_file_proto_mode = "disable_global", @@ -2849,29 +3315,37 @@ def go_deps(): name = "com_github_pingcap_badger", build_file_proto_mode = "disable_global", importpath = "github.com/pingcap/badger", - sum = "h1:MKVFZuqFvAMiDtv3AbihOQ6rY5IE8LWflI1BuZ/hF0Y=", - version = "v1.5.1-0.20220314162537-ab58fbf40580", + sum = "h1:AEcvKyVM8CUII3bYzgz8haFXtGiqcrtXW1csu/5UELY=", + version = "v1.5.1-0.20230103063557-828f39b09b6d", ) go_repository( name = "com_github_pingcap_check", build_file_proto_mode = "disable_global", importpath = "github.com/pingcap/check", - sum = "h1:iRtOAQ6FXkY/BGvst3CDfTva4nTqh6CL8WXvanLdbu0=", - version = "v0.0.0-20191107115940-caf2b9e6ccf4", + sum = "h1:R8gStypOBmpnHEx1qi//SaqxJVI4inOqljg/Aj5/390=", + version = "v0.0.0-20200212061837-5e12011dc712", + ) + go_repository( + name = "com_github_pingcap_errcode", + build_file_proto_mode = "disable", + importpath = "github.com/pingcap/errcode", + sum = "h1:IF6LC/4+b1KNwrMlr2rBTUrojFPMexXBcDWZSpNwxjg=", + version = "v0.3.0", ) + go_repository( name = "com_github_pingcap_errors", build_file_proto_mode = "disable_global", importpath = "github.com/pingcap/errors", - sum = "h1:3Dm0DWeQlwV8LbpQxP2tojHhxd9aY59KI+QN0ns6bBo=", - version = "v0.11.5-0.20220729040631-518f63d66278", + sum = "h1:m5ZsBa5o/0CkzZXfXLaThzKuR85SnHHetqBCpzQ30h8=", + version = "v0.11.5-0.20221009092201-b66cddb77c32", ) go_repository( name = "com_github_pingcap_failpoint", build_file_proto_mode = "disable_global", importpath = "github.com/pingcap/failpoint", - sum = "h1:kJolJWbyadVeL8RKBlqmXQR7FRKPsIeU85TUYyhbhiQ=", - version = "v0.0.0-20220423142525-ae43b7f4e5c3", + sum = "h1:CgbKAHto5CQgWM9fSBIvaxsJHuGP0uM74HXtv3MyyGQ=", + version = "v0.0.0-20220801062533-2eaa32854a6c", ) go_repository( name = "com_github_pingcap_fn", @@ -2891,15 +3365,15 @@ def go_deps(): name = "com_github_pingcap_kvproto", build_file_proto_mode = "disable_global", importpath = "github.com/pingcap/kvproto", - sum = "h1:ho5XUD8DVCnkpEj8oiTR57FXDTXnH6znyLe0gyrtzKk=", - version = "v0.0.0-20221103025916-e7e21f0e9cd9", + sum = "h1:QcC52K9hhsP6eVmQBnSMI/b8TiOUVztbaeduTXspmeQ=", + version = "v0.0.0-20230206112125-0561adc37543", ) go_repository( name = "com_github_pingcap_log", build_file_proto_mode = "disable_global", importpath = "github.com/pingcap/log", - sum = "h1:T7e5Low0BU2ZazI2dz2mh3W1qv+w8wtvq1YR8DneA0c=", - version = "v1.1.1-0.20221110065318-21a4942860b3", + sum = "h1:crhkw6DD+07Bg1wYhW5Piw+kYNKZqFQqfC2puUf6gMI=", + version = "v1.1.1-0.20221116035753-734d527bc87c", ) go_repository( name = "com_github_pingcap_sysutil", @@ -2908,12 +3382,20 @@ def go_deps(): sum = "h1:HYbcxtnkN3s5tqrZ/z3eJS4j3Db8wMphEm1q10lY/TM=", version = "v0.0.0-20220114020952-ea68d2dbf5b4", ) + go_repository( + name = "com_github_pingcap_tidb_dashboard", + build_file_proto_mode = "disable", + importpath = "github.com/pingcap/tidb-dashboard", + sum = "h1:FUdoQ6zWktVjIWLokNeulEcqIzGn6TnoOjdS9bQcFUo=", + version = "v0.0.0-20221201151320-ea3ee6971f2e", + ) + go_repository( name = "com_github_pingcap_tipb", build_file_proto_mode = "disable_global", importpath = "github.com/pingcap/tipb", - sum = "h1:Yoo8j5xQGxjlsC3yt0ndsiAz0WZXED9rzsKmEN0U0DY=", - version = "v0.0.0-20221020071514-cd933387bcb5", + sum = "h1:j5sw2YZY7QfgIFZEoUcn1P5cYflms1PCVVS96i+IQiI=", + version = "v0.0.0-20230119054146-c6b7a5a1623b", ) go_repository( name = "com_github_pkg_browser", @@ -2947,8 +3429,8 @@ def go_deps(): name = "com_github_polyfloyd_go_errorlint", build_file_proto_mode = "disable", importpath = "github.com/polyfloyd/go-errorlint", - sum = "h1:kp1yvHflYhTmw5m3MmBy8SCyQkKPjwDthVuMH0ug6Yk=", - version = "v1.0.2", + sum = "h1:ZevdyEGxDoHAMQUVvdTT06hnYuKULe8TQkOmIYx6s1c=", + version = "v1.0.6", ) go_repository( @@ -2969,29 +3451,29 @@ def go_deps(): name = "com_github_prometheus_client_golang", build_file_proto_mode = "disable_global", importpath = "github.com/prometheus/client_golang", - sum = "h1:b71QUfeo5M8gq2+evJdTPfZhYMAU0uKPkyPJ7TPsloU=", - version = "v1.13.0", + sum = "h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw=", + version = "v1.14.0", ) go_repository( name = "com_github_prometheus_client_model", build_file_proto_mode = "disable_global", importpath = "github.com/prometheus/client_model", - sum = "h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=", - version = "v0.2.0", + sum = "h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=", + version = "v0.3.0", ) go_repository( name = "com_github_prometheus_common", build_file_proto_mode = "disable_global", importpath = "github.com/prometheus/common", - sum = "h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE=", - version = "v0.37.0", + sum = "h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI=", + version = "v0.39.0", ) go_repository( name = "com_github_prometheus_procfs", build_file_proto_mode = "disable_global", importpath = "github.com/prometheus/procfs", - sum = "h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=", - version = "v0.8.0", + sum = "h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=", + version = "v0.9.0", ) go_repository( name = "com_github_prometheus_prometheus", @@ -3008,26 +3490,41 @@ def go_deps(): sum = "h1:w1tAGxsBMLkuGrFMhqgcCeBkM5d1YI24udArs+aASuQ=", version = "v0.8.0", ) + go_repository( + name = "com_github_puerkitobio_purell", + build_file_proto_mode = "disable", + importpath = "github.com/PuerkitoBio/purell", + sum = "h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=", + version = "v1.1.1", + ) + go_repository( + name = "com_github_puerkitobio_urlesc", + build_file_proto_mode = "disable", + importpath = "github.com/PuerkitoBio/urlesc", + sum = "h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=", + version = "v0.0.0-20170810143723-de5bf2ad4578", + ) + go_repository( name = "com_github_quasilyte_go_ruleguard", build_file_proto_mode = "disable", importpath = "github.com/quasilyte/go-ruleguard", - sum = "h1:cDdoaSbQg11LXPDQqiCK54QmQXsEQQCTIgdcpeULGSI=", - version = "v0.3.17", + sum = "h1:sd+abO1PEI9fkYennwzHn9kl3nqP6M5vE7FiOzZ+5CE=", + version = "v0.3.18", ) go_repository( name = "com_github_quasilyte_go_ruleguard_dsl", build_file_proto_mode = "disable", importpath = "github.com/quasilyte/go-ruleguard/dsl", - sum = "h1:vNkC6fC6qMLzCOGbnIHOd5ixUGgTbp3Z4fGnUgULlDA=", - version = "v0.3.21", + sum = "h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE=", + version = "v0.3.22", ) go_repository( name = "com_github_quasilyte_gogrep", build_file_proto_mode = "disable", importpath = "github.com/quasilyte/gogrep", - sum = "h1:PDWGei+Rf2bBiuZIbZmM20J2ftEy9IeUCHA8HbQqed8=", - version = "v0.0.0-20220120141003-628d8b3623b5", + sum = "h1:6Gtn2i04RD0gVyYf2/IUMTIs+qYleBt4zxDqkLTcu4U=", + version = "v0.0.0-20220828223005-86e4605de09f", ) go_repository( name = "com_github_quasilyte_regex_syntax", @@ -3058,16 +3555,20 @@ def go_deps(): sum = "h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=", version = "v0.0.0-20200410134404-eec4a21b6bb0", ) + go_repository( + name = "com_github_renekroon_ttlcache_v2", + build_file_proto_mode = "disable", + importpath = "github.com/ReneKroon/ttlcache/v2", + sum = "h1:qZnUjRKIrbKHH6vF5T7Y9Izn5ObfTZfyYpGhvz2BKPo=", + version = "v2.3.0", + ) + go_repository( name = "com_github_rivo_uniseg", build_file_proto_mode = "disable_global", importpath = "github.com/rivo/uniseg", - patch_args = ["-p1"], - patches = [ - "//build/patches:com_github_rivo_uniseg.patch", - ], - sum = "h1:YwD0ulJSJytLpiaWua0sBDusfsCZohxjxzVTYjwxfV8=", - version = "v0.4.2", + sum = "h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw=", + version = "v0.4.3", ) go_repository( name = "com_github_rlmcpherson_s3gof3r", @@ -3091,6 +3592,14 @@ def go_deps(): sum = "h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k=", version = "v1.6.1", ) + go_repository( + name = "com_github_rs_cors", + build_file_proto_mode = "disable", + importpath = "github.com/rs/cors", + sum = "h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=", + version = "v1.7.0", + ) + go_repository( name = "com_github_rubyist_circuitbreaker", build_file_proto_mode = "disable", @@ -3117,8 +3626,8 @@ def go_deps(): name = "com_github_ryancurrah_gomodguard", build_file_proto_mode = "disable", importpath = "github.com/ryancurrah/gomodguard", - sum = "h1:CpMSDKan0LtNGGhPrvupAoLeObRFjND8/tU1rEOtBp4=", - version = "v1.2.4", + sum = "h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJHMLuTw=", + version = "v1.3.0", ) go_repository( name = "com_github_ryanrolds_sqlclosecheck", @@ -3154,8 +3663,8 @@ def go_deps(): name = "com_github_sasha_s_go_deadlock", build_file_proto_mode = "disable", importpath = "github.com/sasha-s/go-deadlock", - sum = "h1:yVBZEAirqhDYAc7xftf/swe8eHcg63jqfwdqN8KSoR8=", - version = "v0.0.0-20161201235124-341000892f3d", + sum = "h1:lMqc+fUb7RrFS3gQLtoQsJ7/6TV/pAIFvBsqX73DK8Y=", + version = "v0.2.0", ) go_repository( name = "com_github_sashamelentyev_interfacebloat", @@ -3168,8 +3677,8 @@ def go_deps(): name = "com_github_sashamelentyev_usestdlibvars", build_file_proto_mode = "disable", importpath = "github.com/sashamelentyev/usestdlibvars", - sum = "h1:uObNudVEEHf6JbOJy5bgKJloA1bWjxR9fwgNFpPzKnI=", - version = "v1.13.0", + sum = "h1:GQGlReyL9Ek8DdJmwtwhHbhwHnuPfsKaprpjnrPcjxc=", + version = "v1.21.1", ) go_repository( @@ -3198,8 +3707,8 @@ def go_deps(): name = "com_github_securego_gosec_v2", build_file_proto_mode = "disable", importpath = "github.com/securego/gosec/v2", - sum = "h1:7mU32qn2dyC81MH9L2kefnQyRMUarfDER3iQyMHcjYM=", - version = "v2.13.1", + sum = "h1:U1hfs0oBackChXA72plCYVA4cOlQ4gO+209dHiSNZbI=", + version = "v2.14.0", ) go_repository( @@ -3216,13 +3725,20 @@ def go_deps(): sum = "h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU=", version = "v0.0.0-20160112020656-b6b7b6733b8c", ) + go_repository( + name = "com_github_shirou_gopsutil", + build_file_proto_mode = "disable", + importpath = "github.com/shirou/gopsutil", + sum = "h1:uenXGGa8ESCQq+dbgtl916dmg6PSAz2cXov0uORQ9v8=", + version = "v3.21.3+incompatible", + ) go_repository( name = "com_github_shirou_gopsutil_v3", build_file_proto_mode = "disable_global", importpath = "github.com/shirou/gopsutil/v3", - sum = "h1:flKnuCMfUUrO+oAvwAd6GKZgnPzr098VA/UJ14nhJd4=", - version = "v3.22.7", + sum = "h1:oG0ns6poeUSxf78JtOsfygNWuEHYYz8hnnNg7P04TJs=", + version = "v3.22.12", ) go_repository( name = "com_github_shopify_goreferrer", @@ -3249,8 +3765,8 @@ def go_deps(): name = "com_github_shopspring_decimal", build_file_proto_mode = "disable", importpath = "github.com/shopspring/decimal", - sum = "h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE=", - version = "v0.0.0-20180709203117-cd690d0c9e24", + sum = "h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=", + version = "v1.2.0", ) go_repository( @@ -3307,8 +3823,15 @@ def go_deps(): name = "com_github_sivchari_tenv", build_file_proto_mode = "disable", importpath = "github.com/sivchari/tenv", - sum = "h1:d4laZMBK6jpe5PWepxlV9S+LC0yXqvYHiq8E6ceoVVE=", - version = "v1.7.0", + sum = "h1:PSpuD4bu6fSmtWMxSGWcvqUUgIn7k3yOJhOIzVWn8Ak=", + version = "v1.7.1", + ) + go_repository( + name = "com_github_smallnest_chanx", + build_file_proto_mode = "disable", + importpath = "github.com/smallnest/chanx", + sum = "h1:Txo4SXVJq/OgEjwgkWoxkMoTjGlcrgsQE/XSghjmu0w=", + version = "v0.0.0-20221229104322-eb4c998d2072", ) go_repository( @@ -3343,16 +3866,16 @@ def go_deps(): name = "com_github_sourcegraph_go_diff", build_file_proto_mode = "disable", importpath = "github.com/sourcegraph/go-diff", - sum = "h1:hmA1LzxW0n1c3Q4YbrFgg4P99GSnebYa3x8gr0HZqLQ=", - version = "v0.6.1", + sum = "h1:FEIBISvqa2IsyC4KQQBQ1Ef2QvweGUgEIjCdE3gz+zs=", + version = "v0.6.2-0.20221031073116-7ef5f68ebea1", ) go_repository( name = "com_github_spaolacci_murmur3", build_file_proto_mode = "disable_global", importpath = "github.com/spaolacci/murmur3", - sum = "h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ=", - version = "v0.0.0-20180118202830-f09979ecbc72", + sum = "h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=", + version = "v1.1.0", ) go_repository( name = "com_github_spf13_afero", @@ -3372,8 +3895,8 @@ def go_deps(): name = "com_github_spf13_cobra", build_file_proto_mode = "disable_global", importpath = "github.com/spf13/cobra", - sum = "h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU=", - version = "v1.5.0", + sum = "h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=", + version = "v1.6.1", ) go_repository( name = "com_github_spf13_jwalterweatherman", @@ -3396,6 +3919,14 @@ def go_deps(): sum = "h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ=", version = "v1.12.0", ) + go_repository( + name = "com_github_spkg_bom", + build_file_proto_mode = "disable", + importpath = "github.com/spkg/bom", + sum = "h1:S939THe0ukL5WcTGiGqkgtaW5JW+O6ITaIlpJXTYY64=", + version = "v1.0.0", + ) + go_repository( name = "com_github_ssgreg_nlreturn_v2", build_file_proto_mode = "disable", @@ -3430,23 +3961,45 @@ def go_deps(): name = "com_github_stretchr_objx", build_file_proto_mode = "disable_global", importpath = "github.com/stretchr/objx", - sum = "h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=", - version = "v0.4.0", + sum = "h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=", + version = "v0.5.0", ) go_repository( name = "com_github_stretchr_testify", build_file_proto_mode = "disable_global", importpath = "github.com/stretchr/testify", - sum = "h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=", - version = "v1.8.0", + sum = "h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=", + version = "v1.8.1", ) go_repository( name = "com_github_subosito_gotenv", build_file_proto_mode = "disable_global", importpath = "github.com/subosito/gotenv", - sum = "h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs=", - version = "v1.4.0", + sum = "h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs=", + version = "v1.4.1", + ) + go_repository( + name = "com_github_swaggo_files", + build_file_proto_mode = "disable", + importpath = "github.com/swaggo/files", + sum = "h1:PyYN9JH5jY9j6av01SpfRMb+1DWg/i3MbGOKPxJ2wjM=", + version = "v0.0.0-20190704085106-630677cd5c14", + ) + go_repository( + name = "com_github_swaggo_http_swagger", + build_file_proto_mode = "disable", + importpath = "github.com/swaggo/http-swagger", + sum = "h1:lUPlXKqgbqT2SVg2Y+eT9mu5wbqMnG+i/+Q9nK7C0Rs=", + version = "v0.0.0-20200308142732-58ac5e232fba", + ) + go_repository( + name = "com_github_swaggo_swag", + build_file_proto_mode = "disable", + importpath = "github.com/swaggo/swag", + sum = "h1:3pZSSCQ//gAH88lfmxM3Cd1+JCsxV8Md6f36b9hrZ5s=", + version = "v1.8.3", ) + go_repository( name = "com_github_sylvia7788_contextcheck", build_file_proto_mode = "disable", @@ -3454,6 +4007,21 @@ def go_deps(): sum = "h1:o2EZgVPyMKE/Mtoqym61DInKEjwEbsmyoxg3VrmjNO4=", version = "v1.0.6", ) + go_repository( + name = "com_github_syndtr_goleveldb", + build_file_proto_mode = "disable", + importpath = "github.com/syndtr/goleveldb", + sum = "h1:1oFLiOyVl+W7bnBzGhf7BbIv9loSFQcieWWYIjLqcAw=", + version = "v1.0.1-0.20190318030020-c3a204f8e965", + ) + go_repository( + name = "com_github_t_yuki_gocover_cobertura", + build_file_proto_mode = "disable", + importpath = "github.com/t-yuki/gocover-cobertura", + sum = "h1:+aPplBwWcHBo6q9xrfWdMrT9o4kltkmmvpemgIjep/8=", + version = "v0.0.0-20180217150009-aaee18c8195c", + ) + go_repository( name = "com_github_tdakkota_asciicheck", build_file_proto_mode = "disable", @@ -3483,6 +4051,13 @@ def go_deps(): sum = "h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw=", version = "v1.4.11", ) + go_repository( + name = "com_github_thoas_go_funk", + build_file_proto_mode = "disable", + importpath = "github.com/thoas/go-funk", + sum = "h1:JP9tKSvnpFVclYgDM0Is7FD9M4fhPvqA0s0BsXmzSRQ=", + version = "v0.8.0", + ) go_repository( name = "com_github_tiancaiamao_appdash", @@ -3491,27 +4066,58 @@ def go_deps(): sum = "h1:mbAskLJ0oJfDRtkanvQPiooDH8HvJ2FBh+iKT/OmiQQ=", version = "v0.0.0-20181126055449-889f96f722a2", ) + go_repository( + name = "com_github_tiancaiamao_gp", + build_file_proto_mode = "disable", + importpath = "github.com/tiancaiamao/gp", + sum = "h1:J/YdBZ46WKpXsxsW93SG+q0F8KI+yFrcIDT4c/RNoc4=", + version = "v0.0.0-20221230034425-4025bc8a4d4a", + ) + go_repository( + name = "com_github_tidwall_gjson", + build_file_proto_mode = "disable", + importpath = "github.com/tidwall/gjson", + sum = "h1:hqzS9wAHMO+KVBBkLxYdkEeeFHuqr95GfClRLKlgK0E=", + version = "v1.9.3", + ) + go_repository( name = "com_github_tikv_client_go_v2", build_file_proto_mode = "disable_global", importpath = "github.com/tikv/client-go/v2", - sum = "h1:nFVdyTXcQYZwQQCdSJcFI1vBFyzG1hVuZ39MAK6wqK4=", - version = "v2.0.3-0.20221108030801-9c0835c80eba", + sum = "h1:kiPiEBubzB2Ef2yPfoItQpjhGepcZSlRyqrXnfs92pQ=", + version = "v2.0.6-0.20230209044022-95ebf6a86301", + ) + go_repository( + name = "com_github_tikv_pd", + build_file_proto_mode = "disable", + importpath = "github.com/tikv/pd", + sum = "h1:iY/RztOIZ2nTbINUiLGsSv3SUGoEiub1GN0SKVKHJYg=", + version = "v1.1.0-beta.0.20230202094356-18df271ce57f", ) + go_repository( name = "com_github_tikv_pd_client", build_file_proto_mode = "disable_global", importpath = "github.com/tikv/pd/client", - sum = "h1:ckPpxKcl75mO2N6a4cJXiZH43hvcHPpqc9dh1TmH1nc=", - version = "v0.0.0-20221031025758-80f0d8ca4d07", + sum = "h1:hauBQBHSyrUxAI0zvkTiBKd472c+Iy+aY0Jd+b9VOJ8=", + version = "v0.0.0-20230209034200-6d23a31c24be", ) go_repository( name = "com_github_timakin_bodyclose", build_file_proto_mode = "disable", importpath = "github.com/timakin/bodyclose", - sum = "h1:kl4KhGNsJIbDHS9/4U9yQo1UcPQM0kOMJHn29EoH/Ro=", - version = "v0.0.0-20210704033933-f49887972144", + sum = "h1:MV6KaVu/hzByHP0UvJ4HcMGE/8a6A4Rggc/0wx2AvJo=", + version = "v0.0.0-20221125081123-e39cf3fc478e", + ) + go_repository( + name = "com_github_timonwong_loggercheck", + build_file_proto_mode = "disable", + importpath = "github.com/timonwong/loggercheck", + sum = "h1:ecACo9fNiHxX4/Bc02rW2+kaJIAMAes7qJ7JKxt0EZI=", + version = "v0.9.3", ) + go_repository( name = "com_github_timonwong_logrlint", build_file_proto_mode = "disable", @@ -3524,15 +4130,15 @@ def go_deps(): name = "com_github_tklauser_go_sysconf", build_file_proto_mode = "disable_global", importpath = "github.com/tklauser/go-sysconf", - sum = "h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw=", - version = "v0.3.10", + sum = "h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM=", + version = "v0.3.11", ) go_repository( name = "com_github_tklauser_numcpus", build_file_proto_mode = "disable_global", importpath = "github.com/tklauser/numcpus", - sum = "h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o=", - version = "v0.4.0", + sum = "h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms=", + version = "v0.6.0", ) go_repository( name = "com_github_tmc_grpc_websocket_proxy", @@ -3545,15 +4151,15 @@ def go_deps(): name = "com_github_tomarrell_wrapcheck_v2", build_file_proto_mode = "disable", importpath = "github.com/tomarrell/wrapcheck/v2", - sum = "h1:3dI6YNcrJTQ/CJQ6M/DUkc0gnqYSIk6o0rChn9E/D0M=", - version = "v2.6.2", + sum = "h1:J/F8DbSKJC83bAvC6FoZaRjZiZ/iKoueSdrEkmGeacA=", + version = "v2.7.0", ) go_repository( name = "com_github_tommy_muehle_go_mnd_v2", build_file_proto_mode = "disable", importpath = "github.com/tommy-muehle/go-mnd/v2", - sum = "h1:iAj0a8e6+dXSL7Liq0aXPox36FiN1dBbjA6lt9fl65s=", - version = "v2.5.0", + sum = "h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw=", + version = "v2.5.1", ) go_repository( @@ -3605,6 +4211,20 @@ def go_deps(): sum = "h1:hh+/cpIcopyMYbZNVov9iSxvJU3OYQg78Sfaqzi/CzI=", version = "v0.0.5", ) + go_repository( + name = "com_github_unrolled_render", + build_file_proto_mode = "disable", + importpath = "github.com/unrolled/render", + sum = "h1:VDDnQQVfBMsOsp3VaCJszSO0nkBIVEYoPWeRThk9spY=", + version = "v1.0.1", + ) + go_repository( + name = "com_github_urfave_cli_v2", + build_file_proto_mode = "disable", + importpath = "github.com/urfave/cli/v2", + sum = "h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M=", + version = "v2.3.0", + ) go_repository( name = "com_github_urfave_negroni", @@ -3672,6 +4292,28 @@ def go_deps(): sum = "h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow=", version = "v1.2.0", ) + go_repository( + name = "com_github_vividcortex_mysqlerr", + build_file_proto_mode = "disable", + importpath = "github.com/VividCortex/mysqlerr", + sum = "h1:5pZ2TZA+YnzPgzBfiUWGqWmKDVNBdrkf9g+DNe1Tiq8=", + version = "v1.0.0", + ) + go_repository( + name = "com_github_vmihailenco_msgpack_v5", + build_file_proto_mode = "disable", + importpath = "github.com/vmihailenco/msgpack/v5", + sum = "h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU=", + version = "v5.3.5", + ) + go_repository( + name = "com_github_vmihailenco_tagparser_v2", + build_file_proto_mode = "disable", + importpath = "github.com/vmihailenco/tagparser/v2", + sum = "h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=", + version = "v2.0.0", + ) + go_repository( name = "com_github_wangjohn_quickselect", build_file_proto_mode = "disable_global", @@ -3714,6 +4356,14 @@ def go_deps(): sum = "h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=", version = "v1.2.0", ) + go_repository( + name = "com_github_xeoncross_go_aesctr_with_hmac", + build_file_proto_mode = "disable", + importpath = "github.com/Xeoncross/go-aesctr-with-hmac", + sum = "h1:L8IbaI/W6h5Cwgh0n4zGeZpVK78r/jBf9ASurHo9+/o=", + version = "v0.0.0-20200623134604-12b17a7ff502", + ) + go_repository( name = "com_github_xiang90_probing", build_file_proto_mode = "disable_global", @@ -3812,110 +4462,932 @@ def go_deps(): name = "com_google_cloud_go", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go", - sum = "h1:t9Iw5QH5v4XtlEQaCtUY7x6sCABps8sW0acw7e2WQ6Y=", - version = "v0.100.2", - ) - go_repository( - name = "com_google_cloud_go_bigquery", - build_file_proto_mode = "disable_global", - importpath = "cloud.google.com/go/bigquery", - sum = "h1:PQcPefKFdaIzjQFbiyOgAqyx8q5djaE7x9Sqe712DPA=", - version = "v1.8.0", + sum = "h1:DNtEKRBAAzeS4KyIory52wWHuClNaXJ5x1F7xa4q+5Y=", + version = "v0.105.0", ) go_repository( - name = "com_google_cloud_go_compute", - build_file_proto_mode = "disable_global", - importpath = "cloud.google.com/go/compute", - sum = "h1:b1zWmYuuHz7gO9kDcM/EpHGr06UgsYNRpNJzI2kFiLM=", + name = "com_google_cloud_go_accessapproval", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/accessapproval", + sum = "h1:/nTivgnV/n1CaAeo+ekGexTYUsKEU9jUVkoY5359+3Q=", version = "v1.5.0", ) go_repository( - name = "com_google_cloud_go_datastore", - build_file_proto_mode = "disable_global", - importpath = "cloud.google.com/go/datastore", - sum = "h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ=", - version = "v1.1.0", + name = "com_google_cloud_go_accesscontextmanager", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/accesscontextmanager", + sum = "h1:CFhNhU7pcD11cuDkQdrE6PQJgv0EXNKNv06jIzbLlCU=", + version = "v1.4.0", ) go_repository( - name = "com_google_cloud_go_firestore", - build_file_proto_mode = "disable_global", - importpath = "cloud.google.com/go/firestore", - sum = "h1:9x7Bx0A9R5/M9jibeJeZWqjeVEIxYW9fZYqB9a70/bY=", - version = "v1.1.0", + name = "com_google_cloud_go_aiplatform", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/aiplatform", + sum = "h1:DBi3Jk9XjCJ4pkkLM4NqKgj3ozUL1wq4l+d3/jTGXAI=", + version = "v1.27.0", ) go_repository( - name = "com_google_cloud_go_iam", - build_file_proto_mode = "disable_global", - importpath = "cloud.google.com/go/iam", - sum = "h1:4CapQyNFjiksks1/x7jsvsygFPhihslYk5GptIrlX68=", - version = "v0.1.1", + name = "com_google_cloud_go_analytics", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/analytics", + sum = "h1:NKw6PpQi6V1O+KsjuTd+bhip9d0REYu4NevC45vtGp8=", + version = "v0.12.0", ) go_repository( - name = "com_google_cloud_go_pubsub", - build_file_proto_mode = "disable_global", - importpath = "cloud.google.com/go/pubsub", - sum = "h1:ukjixP1wl0LpnZ6LWtZJ0mX5tBmjp1f8Sqer8Z2OMUU=", - version = "v1.3.1", + name = "com_google_cloud_go_apigateway", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/apigateway", + sum = "h1:IIoXKR7FKrEAQhMTz5hK2wiDz2WNFHS7eVr/L1lE/rM=", + version = "v1.4.0", ) go_repository( - name = "com_google_cloud_go_storage", - build_file_proto_mode = "disable_global", - importpath = "cloud.google.com/go/storage", - sum = "h1:HwnT2u2D309SFDHQII6m18HlrCi3jAXhUMTLOWXYH14=", - version = "v1.21.0", + name = "com_google_cloud_go_apigeeconnect", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/apigeeconnect", + sum = "h1:AONoTYJviyv1vS4IkvWzq69gEVdvHx35wKXc+e6wjZQ=", + version = "v1.4.0", ) go_repository( - name = "com_shuralyov_dmitri_gpu_mtl", - build_file_proto_mode = "disable_global", - importpath = "dmitri.shuralyov.com/gpu/mtl", - sum = "h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY=", - version = "v0.0.0-20190408044501-666a987793e9", + name = "com_google_cloud_go_appengine", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/appengine", + sum = "h1:lmG+O5oaR9xNwaRBwE2XoMhwQHsHql5IoiGr1ptdDwU=", + version = "v1.5.0", ) go_repository( - name = "com_sourcegraph_sourcegraph_appdash", - build_file_proto_mode = "disable_global", - importpath = "sourcegraph.com/sourcegraph/appdash", - sum = "h1:ucqkfpjg9WzSUubAO62csmucvxl4/JeW3F4I4909XkM=", - version = "v0.0.0-20190731080439-ebfcffb1b5c0", + name = "com_google_cloud_go_area120", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/area120", + sum = "h1:TCMhwWEWhCn8d44/Zs7UCICTWje9j3HuV6nVGMjdpYw=", + version = "v0.6.0", ) go_repository( - name = "com_sourcegraph_sourcegraph_appdash_data", - build_file_proto_mode = "disable_global", - importpath = "sourcegraph.com/sourcegraph/appdash-data", - sum = "h1:e1sMhtVq9AfcEy8AXNb8eSg6gbzfdpYhoNqnPJa+GzI=", - version = "v0.0.0-20151005221446-73f23eafcf67", + name = "com_google_cloud_go_artifactregistry", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/artifactregistry", + sum = "h1:3d0LRAU1K6vfqCahhl9fx2oGHcq+s5gftdix4v8Ibrc=", + version = "v1.9.0", ) go_repository( - name = "com_stathat_c_consistent", + name = "com_google_cloud_go_asset", build_file_proto_mode = "disable", - importpath = "stathat.com/c/consistent", - sum = "h1:ezyc51EGcRPJUxfHGSgJjWzJdj3NiMU9pNfLNGiXV0c=", - version = "v1.0.0", + importpath = "cloud.google.com/go/asset", + sum = "h1:aCrlaLGJWTODJX4G56ZYzJefITKEWNfbjjtHSzWpxW0=", + version = "v1.10.0", ) - go_repository( - name = "in_gopkg_alecthomas_kingpin_v2", - build_file_proto_mode = "disable_global", - importpath = "gopkg.in/alecthomas/kingpin.v2", - sum = "h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=", - version = "v2.2.6", + name = "com_google_cloud_go_assuredworkloads", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/assuredworkloads", + sum = "h1:hhIdCOowsT1GG5eMCIA0OwK6USRuYTou/1ZeNxCSRtA=", + version = "v1.9.0", ) go_repository( - name = "in_gopkg_check_v1", - build_file_proto_mode = "disable_global", - importpath = "gopkg.in/check.v1", - sum = "h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=", - version = "v1.0.0-20201130134442-10cb98267c6c", + name = "com_google_cloud_go_automl", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/automl", + sum = "h1:BMioyXSbg7d7xLibn47cs0elW6RT780IUWr42W8rp2Q=", + version = "v1.8.0", ) go_repository( - name = "in_gopkg_errgo_v2", - build_file_proto_mode = "disable_global", - importpath = "gopkg.in/errgo.v2", - sum = "h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8=", - version = "v2.1.0", + name = "com_google_cloud_go_baremetalsolution", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/baremetalsolution", + sum = "h1:g9KO6SkakcYPcc/XjAzeuUrEOXlYPnMpuiaywYaGrmQ=", + version = "v0.4.0", ) go_repository( - name = "in_gopkg_fsnotify_fsnotify_v1", + name = "com_google_cloud_go_batch", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/batch", + sum = "h1:1jvEBY55OH4Sd2FxEXQfxGExFWov1A/IaRe+Z5Z71Fw=", + version = "v0.4.0", + ) + go_repository( + name = "com_google_cloud_go_beyondcorp", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/beyondcorp", + sum = "h1:w+4kThysgl0JiKshi2MKDCg2NZgOyqOI0wq2eBZyrzA=", + version = "v0.3.0", + ) + + go_repository( + name = "com_google_cloud_go_bigquery", + build_file_proto_mode = "disable_global", + importpath = "cloud.google.com/go/bigquery", + sum = "h1:Wi4dITi+cf9VYp4VH2T9O41w0kCW0uQTELq2Z6tukN0=", + version = "v1.44.0", + ) + go_repository( + name = "com_google_cloud_go_billing", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/billing", + sum = "h1:Xkii76HWELHwBtkQVZvqmSo9GTr0O+tIbRNnMcGdlg4=", + version = "v1.7.0", + ) + go_repository( + name = "com_google_cloud_go_binaryauthorization", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/binaryauthorization", + sum = "h1:pL70vXWn9TitQYXBWTK2abHl2JHLwkFRjYw6VflRqEA=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_certificatemanager", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/certificatemanager", + sum = "h1:tzbR4UHBbgsewMWUD93JHi8EBi/gHBoSAcY1/sThFGk=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_channel", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/channel", + sum = "h1:pNuUlZx0Jb0Ts9P312bmNMuH5IiFWIR4RUtLb70Ke5s=", + version = "v1.9.0", + ) + go_repository( + name = "com_google_cloud_go_cloudbuild", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/cloudbuild", + sum = "h1:TAAmCmAlOJ4uNBu6zwAjwhyl/7fLHHxIEazVhr3QBbQ=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_clouddms", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/clouddms", + sum = "h1:UhzHIlgFfMr6luVYVNydw/pl9/U5kgtjCMJHnSvoVws=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_cloudtasks", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/cloudtasks", + sum = "h1:faUiUgXjW8yVZ7XMnKHKm1WE4OldPBUWWfIRN/3z1dc=", + version = "v1.8.0", + ) + + go_repository( + name = "com_google_cloud_go_compute", + build_file_proto_mode = "disable_global", + importpath = "cloud.google.com/go/compute", + sum = "h1:AYrLkB8NPdDRslNp4Jxmzrhdr03fUAIDbiGFjLWowoU=", + version = "v1.13.0", + ) + go_repository( + name = "com_google_cloud_go_compute_metadata", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/compute/metadata", + sum = "h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48=", + version = "v0.2.1", + ) + go_repository( + name = "com_google_cloud_go_contactcenterinsights", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/contactcenterinsights", + sum = "h1:tTQLI/ZvguUf9Hv+36BkG2+/PeC8Ol1q4pBW+tgCx0A=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_container", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/container", + sum = "h1:nbEK/59GyDRKKlo1SqpohY1TK8LmJ2XNcvS9Gyom2A0=", + version = "v1.7.0", + ) + go_repository( + name = "com_google_cloud_go_containeranalysis", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/containeranalysis", + sum = "h1:2824iym832ljKdVpCBnpqm5K94YT/uHTVhNF+dRTXPI=", + version = "v0.6.0", + ) + go_repository( + name = "com_google_cloud_go_datacatalog", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/datacatalog", + sum = "h1:6kZ4RIOW/uT7QWC5SfPfq/G8sYzr/v+UOmOAxy4Z1TE=", + version = "v1.8.0", + ) + go_repository( + name = "com_google_cloud_go_dataflow", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/dataflow", + sum = "h1:CW3541Fm7KPTyZjJdnX6NtaGXYFn5XbFC5UcjgALKvU=", + version = "v0.7.0", + ) + go_repository( + name = "com_google_cloud_go_dataform", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/dataform", + sum = "h1:vLwowLF2ZB5J5gqiZCzv076lDI/Rd7zYQQFu5XO1PSg=", + version = "v0.5.0", + ) + go_repository( + name = "com_google_cloud_go_datafusion", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/datafusion", + sum = "h1:j5m2hjWovTZDTQak4MJeXAR9yN7O+zMfULnjGw/OOLg=", + version = "v1.5.0", + ) + go_repository( + name = "com_google_cloud_go_datalabeling", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/datalabeling", + sum = "h1:dp8jOF21n/7jwgo/uuA0RN8hvLcKO4q6s/yvwevs2ZM=", + version = "v0.6.0", + ) + go_repository( + name = "com_google_cloud_go_dataplex", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/dataplex", + sum = "h1:cNxeA2DiWliQGi21kPRqnVeQ5xFhNoEjPRt1400Pm8Y=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_dataproc", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/dataproc", + sum = "h1:gVOqNmElfa6n/ccG/QDlfurMWwrK3ezvy2b2eDoCmS0=", + version = "v1.8.0", + ) + go_repository( + name = "com_google_cloud_go_dataqna", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/dataqna", + sum = "h1:gx9jr41ytcA3dXkbbd409euEaWtofCVXYBvJz3iYm18=", + version = "v0.6.0", + ) + + go_repository( + name = "com_google_cloud_go_datastore", + build_file_proto_mode = "disable_global", + importpath = "cloud.google.com/go/datastore", + sum = "h1:4siQRf4zTiAVt/oeH4GureGkApgb2vtPQAtOmhpqQwE=", + version = "v1.10.0", + ) + go_repository( + name = "com_google_cloud_go_datastream", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/datastream", + sum = "h1:PgIgbhedBtYBU6POGXFMn2uSl9vpqubc3ewTNdcU8Mk=", + version = "v1.5.0", + ) + go_repository( + name = "com_google_cloud_go_deploy", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/deploy", + sum = "h1:kI6dxt8Ml0is/x7YZjLveTvR7YPzXAUD/8wQZ2nH5zA=", + version = "v1.5.0", + ) + go_repository( + name = "com_google_cloud_go_dialogflow", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/dialogflow", + sum = "h1:HYHVOkoxQ9bSfNIelSZYNAtUi4CeSrCnROyOsbOqPq8=", + version = "v1.19.0", + ) + go_repository( + name = "com_google_cloud_go_dlp", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/dlp", + sum = "h1:9I4BYeJSVKoSKgjr70fLdRDumqcUeVmHV4fd5f9LR6Y=", + version = "v1.7.0", + ) + go_repository( + name = "com_google_cloud_go_documentai", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/documentai", + sum = "h1:jfq09Fdjtnpnmt/MLyf6A3DM3ynb8B2na0K+vSXvpFM=", + version = "v1.10.0", + ) + go_repository( + name = "com_google_cloud_go_domains", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/domains", + sum = "h1:pu3JIgC1rswIqi5romW0JgNO6CTUydLYX8zyjiAvO1c=", + version = "v0.7.0", + ) + go_repository( + name = "com_google_cloud_go_edgecontainer", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/edgecontainer", + sum = "h1:hd6J2n5dBBRuAqnNUEsKWrp6XNPKsaxwwIyzOPZTokk=", + version = "v0.2.0", + ) + go_repository( + name = "com_google_cloud_go_errorreporting", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/errorreporting", + sum = "h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0=", + version = "v0.3.0", + ) + go_repository( + name = "com_google_cloud_go_essentialcontacts", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/essentialcontacts", + sum = "h1:b6csrQXCHKQmfo9h3dG/pHyoEh+fQG1Yg78a53LAviY=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_eventarc", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/eventarc", + sum = "h1:AgCqrmMMIcel5WWKkzz5EkCUKC3Rl5LNMMYsS+LvsI0=", + version = "v1.8.0", + ) + go_repository( + name = "com_google_cloud_go_filestore", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/filestore", + sum = "h1:yjKOpzvqtDmL5AXbKttLc8j0hL20kuC1qPdy5HPcxp0=", + version = "v1.4.0", + ) + + go_repository( + name = "com_google_cloud_go_firestore", + build_file_proto_mode = "disable_global", + importpath = "cloud.google.com/go/firestore", + sum = "h1:IBlRyxgGySXu5VuW0RgGFlTtLukSnNkpDiEOMkQkmpA=", + version = "v1.9.0", + ) + go_repository( + name = "com_google_cloud_go_functions", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/functions", + sum = "h1:35tgv1fQOtvKqH/uxJMzX3w6usneJ0zXpsFr9KAVhNE=", + version = "v1.9.0", + ) + go_repository( + name = "com_google_cloud_go_gaming", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/gaming", + sum = "h1:97OAEQtDazAJD7yh/kvQdSCQuTKdR0O+qWAJBZJ4xiA=", + version = "v1.8.0", + ) + go_repository( + name = "com_google_cloud_go_gkebackup", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/gkebackup", + sum = "h1:4K+jiv4ocqt1niN8q5Imd8imRoXBHTrdnJVt/uFFxF4=", + version = "v0.3.0", + ) + go_repository( + name = "com_google_cloud_go_gkeconnect", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/gkeconnect", + sum = "h1:zAcvDa04tTnGdu6TEZewaLN2tdMtUOJJ7fEceULjguA=", + version = "v0.6.0", + ) + go_repository( + name = "com_google_cloud_go_gkehub", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/gkehub", + sum = "h1:JTcTaYQRGsVm+qkah7WzHb6e9sf1C0laYdRPn9aN+vg=", + version = "v0.10.0", + ) + go_repository( + name = "com_google_cloud_go_gkemulticloud", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/gkemulticloud", + sum = "h1:8F1NhJj8ucNj7lK51UZMtAjSWTgP1zO18XF6vkfiPPU=", + version = "v0.4.0", + ) + go_repository( + name = "com_google_cloud_go_grafeas", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/grafeas", + sum = "h1:CYjC+xzdPvbV65gi6Dr4YowKcmLo045pm18L0DhdELM=", + version = "v0.2.0", + ) + go_repository( + name = "com_google_cloud_go_gsuiteaddons", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/gsuiteaddons", + sum = "h1:TGT2oGmO5q3VH6SjcrlgPUWI0njhYv4kywLm6jag0to=", + version = "v1.4.0", + ) + + go_repository( + name = "com_google_cloud_go_iam", + build_file_proto_mode = "disable_global", + importpath = "cloud.google.com/go/iam", + sum = "h1:E2osAkZzxI/+8pZcxVLcDtAQx/u+hZXVryUaYQ5O0Kk=", + version = "v0.8.0", + ) + go_repository( + name = "com_google_cloud_go_iap", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/iap", + sum = "h1:BGEXovwejOCt1zDk8hXq0bOhhRu9haXKWXXXp2B4wBM=", + version = "v1.5.0", + ) + go_repository( + name = "com_google_cloud_go_ids", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/ids", + sum = "h1:LncHK4HHucb5Du310X8XH9/ICtMwZ2PCfK0ScjWiJoY=", + version = "v1.2.0", + ) + go_repository( + name = "com_google_cloud_go_iot", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/iot", + sum = "h1:Y9+oZT9jD4GUZzORXTU45XsnQrhxmDT+TFbPil6pRVQ=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_kms", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/kms", + sum = "h1:OWRZzrPmOZUzurjI2FBGtgY2mB1WaJkqhw6oIwSj0Yg=", + version = "v1.6.0", + ) + go_repository( + name = "com_google_cloud_go_language", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/language", + sum = "h1:3Wa+IUMamL4JH3Zd3cDZUHpwyqplTACt6UZKRD2eCL4=", + version = "v1.8.0", + ) + go_repository( + name = "com_google_cloud_go_lifesciences", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/lifesciences", + sum = "h1:tIqhivE2LMVYkX0BLgG7xL64oNpDaFFI7teunglt1tI=", + version = "v0.6.0", + ) + go_repository( + name = "com_google_cloud_go_logging", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/logging", + sum = "h1:ZBsZK+JG+oCDT+vaxwqF2egKNRjz8soXiS6Xv79benI=", + version = "v1.6.1", + ) + go_repository( + name = "com_google_cloud_go_longrunning", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/longrunning", + sum = "h1:NjljC+FYPV3uh5/OwWT6pVU+doBqMg2x/rZlE+CamDs=", + version = "v0.3.0", + ) + go_repository( + name = "com_google_cloud_go_managedidentities", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/managedidentities", + sum = "h1:3Kdajn6X25yWQFhFCErmKSYTSvkEd3chJROny//F1A0=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_maps", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/maps", + sum = "h1:kLReRbclTgJefw2fcCbdLPLhPj0U6UUWN10ldG8sdOU=", + version = "v0.1.0", + ) + + go_repository( + name = "com_google_cloud_go_mediatranslation", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/mediatranslation", + sum = "h1:qAJzpxmEX+SeND10Y/4868L5wfZpo4Y3BIEnIieP4dk=", + version = "v0.6.0", + ) + go_repository( + name = "com_google_cloud_go_memcache", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/memcache", + sum = "h1:yLxUzJkZVSH2kPaHut7k+7sbIBFpvSh1LW9qjM2JDjA=", + version = "v1.7.0", + ) + go_repository( + name = "com_google_cloud_go_metastore", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/metastore", + sum = "h1:3KcShzqWdqxrDEXIBWpYJpOOrgpDj+HlBi07Grot49Y=", + version = "v1.8.0", + ) + go_repository( + name = "com_google_cloud_go_monitoring", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/monitoring", + sum = "h1:c9riaGSPQ4dUKWB+M1Fl0N+iLxstMbCktdEwYSPGDvA=", + version = "v1.8.0", + ) + go_repository( + name = "com_google_cloud_go_networkconnectivity", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/networkconnectivity", + sum = "h1:BVdIKaI68bihnXGdCVL89Jsg9kq2kg+II30fjVqo62E=", + version = "v1.7.0", + ) + go_repository( + name = "com_google_cloud_go_networkmanagement", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/networkmanagement", + sum = "h1:mDHA3CDW00imTvC5RW6aMGsD1bH+FtKwZm/52BxaiMg=", + version = "v1.5.0", + ) + go_repository( + name = "com_google_cloud_go_networksecurity", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/networksecurity", + sum = "h1:qDEX/3sipg9dS5JYsAY+YvgTjPR63cozzAWop8oZS94=", + version = "v0.6.0", + ) + go_repository( + name = "com_google_cloud_go_notebooks", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/notebooks", + sum = "h1:AC8RPjNvel3ExgXjO1YOAz+teg9+j+89TNxa7pIZfww=", + version = "v1.5.0", + ) + go_repository( + name = "com_google_cloud_go_optimization", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/optimization", + sum = "h1:7PxOq9VTT7TMib/6dMoWpMvWS2E4dJEvtYzjvBreaec=", + version = "v1.2.0", + ) + go_repository( + name = "com_google_cloud_go_orchestration", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/orchestration", + sum = "h1:39d6tqvNjd/wsSub1Bn4cEmrYcet5Ur6xpaN+SxOxtY=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_orgpolicy", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/orgpolicy", + sum = "h1:erF5PHqDZb6FeFrUHiYj2JK2BMhsk8CyAg4V4amJ3rE=", + version = "v1.5.0", + ) + go_repository( + name = "com_google_cloud_go_osconfig", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/osconfig", + sum = "h1:NO0RouqCOM7M2S85Eal6urMSSipWwHU8evzwS+siqUI=", + version = "v1.10.0", + ) + go_repository( + name = "com_google_cloud_go_oslogin", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/oslogin", + sum = "h1:pKGDPfeZHDybtw48WsnVLjoIPMi9Kw62kUE5TXCLCN4=", + version = "v1.7.0", + ) + go_repository( + name = "com_google_cloud_go_phishingprotection", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/phishingprotection", + sum = "h1:OrwHLSRSZyaiOt3tnY33dsKSedxbMzsXvqB21okItNQ=", + version = "v0.6.0", + ) + go_repository( + name = "com_google_cloud_go_policytroubleshooter", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/policytroubleshooter", + sum = "h1:NQklJuOUoz1BPP+Epjw81COx7IISWslkZubz/1i0UN8=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_privatecatalog", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/privatecatalog", + sum = "h1:Vz86uiHCtNGm1DeC32HeG2VXmOq5JRYA3VRPf8ZEcSg=", + version = "v0.6.0", + ) + + go_repository( + name = "com_google_cloud_go_pubsub", + build_file_proto_mode = "disable_global", + importpath = "cloud.google.com/go/pubsub", + sum = "h1:q+J/Nfr6Qx4RQeu3rJcnN48SNC0qzlYzSeqkPq93VHs=", + version = "v1.27.1", + ) + go_repository( + name = "com_google_cloud_go_pubsublite", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/pubsublite", + sum = "h1:iqrD8vp3giTb7hI1q4TQQGj77cj8zzgmMPsTZtLnprM=", + version = "v1.5.0", + ) + go_repository( + name = "com_google_cloud_go_recaptchaenterprise", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/recaptchaenterprise", + sum = "h1:u6EznTGzIdsyOsvm+Xkw0aSuKFXQlyjGE9a4exk6iNQ=", + version = "v1.3.1", + ) + go_repository( + name = "com_google_cloud_go_recaptchaenterprise_v2", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/recaptchaenterprise/v2", + sum = "h1:UqzFfb/WvhwXGDF1eQtdHLrmni+iByZXY4h3w9Kdyv8=", + version = "v2.5.0", + ) + go_repository( + name = "com_google_cloud_go_recommendationengine", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/recommendationengine", + sum = "h1:6w+WxPf2LmUEqX0YyvfCoYb8aBYOcbIV25Vg6R0FLGw=", + version = "v0.6.0", + ) + go_repository( + name = "com_google_cloud_go_recommender", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/recommender", + sum = "h1:9kMZQGeYfcOD/RtZfcNKGKtoex3DdoB4zRgYU/WaIwE=", + version = "v1.8.0", + ) + go_repository( + name = "com_google_cloud_go_redis", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/redis", + sum = "h1:/zTwwBKIAD2DEWTrXZp8WD9yD/gntReF/HkPssVYd0U=", + version = "v1.10.0", + ) + go_repository( + name = "com_google_cloud_go_resourcemanager", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/resourcemanager", + sum = "h1:NDao6CHMwEZIaNsdWy+tuvHaavNeGP06o1tgrR0kLvU=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_resourcesettings", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/resourcesettings", + sum = "h1:eTzOwB13WrfF0kuzG2ZXCfB3TLunSHBur4s+HFU6uSM=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_retail", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/retail", + sum = "h1:N9fa//ecFUOEPsW/6mJHfcapPV0wBSwIUwpVZB7MQ3o=", + version = "v1.11.0", + ) + go_repository( + name = "com_google_cloud_go_run", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/run", + sum = "h1:AWPuzU7Xtaj3Jf+QarDWIs6AJ5hM1VFQ+F6Q+VZ6OT4=", + version = "v0.3.0", + ) + go_repository( + name = "com_google_cloud_go_scheduler", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/scheduler", + sum = "h1:K/mxOewgHGeKuATUJNGylT75Mhtjmx1TOkKukATqMT8=", + version = "v1.7.0", + ) + go_repository( + name = "com_google_cloud_go_secretmanager", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/secretmanager", + sum = "h1:xE6uXljAC1kCR8iadt9+/blg1fvSbmenlsDN4fT9gqw=", + version = "v1.9.0", + ) + go_repository( + name = "com_google_cloud_go_security", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/security", + sum = "h1:KSKzzJMyUoMRQzcz7azIgqAUqxo7rmQ5rYvimMhikqg=", + version = "v1.10.0", + ) + go_repository( + name = "com_google_cloud_go_securitycenter", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/securitycenter", + sum = "h1:QTVtk/Reqnx2bVIZtJKm1+mpfmwRwymmNvlaFez7fQY=", + version = "v1.16.0", + ) + go_repository( + name = "com_google_cloud_go_servicecontrol", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/servicecontrol", + sum = "h1:ImIzbOu6y4jL6ob65I++QzvqgFaoAKgHOG+RU9/c4y8=", + version = "v1.5.0", + ) + go_repository( + name = "com_google_cloud_go_servicedirectory", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/servicedirectory", + sum = "h1:f7M8IMcVzO3T425AqlZbP3yLzeipsBHtRza8vVFYMhQ=", + version = "v1.7.0", + ) + go_repository( + name = "com_google_cloud_go_servicemanagement", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/servicemanagement", + sum = "h1:TpkCO5M7dhKSy1bKUD9o/sSEW/U1Gtx7opA1fsiMx0c=", + version = "v1.5.0", + ) + go_repository( + name = "com_google_cloud_go_serviceusage", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/serviceusage", + sum = "h1:b0EwJxPJLpavSljMQh0RcdHsUrr5DQ+Nelt/3BAs5ro=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_shell", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/shell", + sum = "h1:b1LFhFBgKsG252inyhtmsUUZwchqSz3WTvAIf3JFo4g=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_spanner", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/spanner", + sum = "h1:NvdTpRwf7DTegbfFdPjAWyD7bOVu0VeMqcvR9aCQCAc=", + version = "v1.41.0", + ) + go_repository( + name = "com_google_cloud_go_speech", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/speech", + sum = "h1:yK0ocnFH4Wsf0cMdUyndJQ/hPv02oTJOxzi6AgpBy4s=", + version = "v1.9.0", + ) + + go_repository( + name = "com_google_cloud_go_storage", + build_file_proto_mode = "disable_global", + importpath = "cloud.google.com/go/storage", + sum = "h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ=", + version = "v1.27.0", + ) + go_repository( + name = "com_google_cloud_go_storagetransfer", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/storagetransfer", + sum = "h1:fUe3OydbbvHcAYp07xY+2UpH4AermGbmnm7qdEj3tGE=", + version = "v1.6.0", + ) + go_repository( + name = "com_google_cloud_go_talent", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/talent", + sum = "h1:MrekAGxLqAeAol4Sc0allOVqUGO8j+Iim8NMvpiD7tM=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_texttospeech", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/texttospeech", + sum = "h1:ccPiHgTewxgyAeCWgQWvZvrLmbfQSFABTMAfrSPLPyY=", + version = "v1.5.0", + ) + go_repository( + name = "com_google_cloud_go_tpu", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/tpu", + sum = "h1:ztIdKoma1Xob2qm6QwNh4Xi9/e7N3IfvtwG5AcNsj1g=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_trace", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/trace", + sum = "h1:qO9eLn2esajC9sxpqp1YKX37nXC3L4BfGnPS0Cx9dYo=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_translate", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/translate", + sum = "h1:AOYOH3MspzJ/bH1YXzB+xTE8fMpn3mwhLjugwGXvMPI=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_video", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/video", + sum = "h1:ttlvO4J5c1VGq6FkHqWPD/aH6PfdxujHt+muTJlW1Zk=", + version = "v1.9.0", + ) + go_repository( + name = "com_google_cloud_go_videointelligence", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/videointelligence", + sum = "h1:RPFgVVXbI2b5vnrciZjtsUgpNKVtHO/WIyXUhEfuMhA=", + version = "v1.9.0", + ) + go_repository( + name = "com_google_cloud_go_vision", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/vision", + sum = "h1:/CsSTkbmO9HC8iQpxbK8ATms3OQaX3YQUeTMGCxlaK4=", + version = "v1.2.0", + ) + go_repository( + name = "com_google_cloud_go_vision_v2", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/vision/v2", + sum = "h1:TQHxRqvLMi19azwm3qYuDbEzZWmiKJNTpGbkNsfRCik=", + version = "v2.5.0", + ) + go_repository( + name = "com_google_cloud_go_vmmigration", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/vmmigration", + sum = "h1:A2Tl2ZmwMRpvEmhV2ibISY85fmQR+Y5w9a0PlRz5P3s=", + version = "v1.3.0", + ) + go_repository( + name = "com_google_cloud_go_vmwareengine", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/vmwareengine", + sum = "h1:JMPZaOT/gIUxVlTqSl/QQ32Y2k+r0stNeM1NSqhVP9o=", + version = "v0.1.0", + ) + + go_repository( + name = "com_google_cloud_go_vpcaccess", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/vpcaccess", + sum = "h1:woHXXtnW8b9gLFdWO9HLPalAddBQ9V4LT+1vjKwR3W8=", + version = "v1.5.0", + ) + go_repository( + name = "com_google_cloud_go_webrisk", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/webrisk", + sum = "h1:ypSnpGlJnZSXbN9a13PDmAYvVekBLnGKxQ3Q9SMwnYY=", + version = "v1.7.0", + ) + go_repository( + name = "com_google_cloud_go_websecurityscanner", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/websecurityscanner", + sum = "h1:y7yIFg/h/mO+5Y5aCOtVAnpGUOgqCH5rXQ2Oc8Oq2+g=", + version = "v1.4.0", + ) + go_repository( + name = "com_google_cloud_go_workflows", + build_file_proto_mode = "disable", + importpath = "cloud.google.com/go/workflows", + sum = "h1:7Chpin9p50NTU8Tb7qk+I11U/IwVXmDhEoSsdccvInE=", + version = "v1.9.0", + ) + + go_repository( + name = "com_shuralyov_dmitri_gpu_mtl", + build_file_proto_mode = "disable_global", + importpath = "dmitri.shuralyov.com/gpu/mtl", + sum = "h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY=", + version = "v0.0.0-20190408044501-666a987793e9", + ) + go_repository( + name = "com_sourcegraph_sourcegraph_appdash", + build_file_proto_mode = "disable_global", + importpath = "sourcegraph.com/sourcegraph/appdash", + sum = "h1:ucqkfpjg9WzSUubAO62csmucvxl4/JeW3F4I4909XkM=", + version = "v0.0.0-20190731080439-ebfcffb1b5c0", + ) + go_repository( + name = "com_sourcegraph_sourcegraph_appdash_data", + build_file_proto_mode = "disable_global", + importpath = "sourcegraph.com/sourcegraph/appdash-data", + sum = "h1:e1sMhtVq9AfcEy8AXNb8eSg6gbzfdpYhoNqnPJa+GzI=", + version = "v0.0.0-20151005221446-73f23eafcf67", + ) + go_repository( + name = "com_stathat_c_consistent", + build_file_proto_mode = "disable", + importpath = "stathat.com/c/consistent", + sum = "h1:ezyc51EGcRPJUxfHGSgJjWzJdj3NiMU9pNfLNGiXV0c=", + version = "v1.0.0", + ) + + go_repository( + name = "in_gopkg_alecthomas_kingpin_v2", + build_file_proto_mode = "disable_global", + importpath = "gopkg.in/alecthomas/kingpin.v2", + sum = "h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=", + version = "v2.2.6", + ) + go_repository( + name = "in_gopkg_check_v1", + build_file_proto_mode = "disable_global", + importpath = "gopkg.in/check.v1", + sum = "h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=", + version = "v1.0.0-20201130134442-10cb98267c6c", + ) + go_repository( + name = "in_gopkg_errgo_v2", + build_file_proto_mode = "disable_global", + importpath = "gopkg.in/errgo.v2", + sum = "h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8=", + version = "v2.1.0", + ) + go_repository( + name = "in_gopkg_fsnotify_fsnotify_v1", build_file_proto_mode = "disable", importpath = "gopkg.in/fsnotify/fsnotify.v1", sum = "h1:2fkCHbPQZNYRAyRyIV9VX0bpRkxIorlQDiYRmufHnhA=", @@ -3955,8 +5427,8 @@ def go_deps(): name = "in_gopkg_ini_v1", build_file_proto_mode = "disable_global", importpath = "gopkg.in/ini.v1", - sum = "h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI=", - version = "v1.66.6", + sum = "h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=", + version = "v1.67.0", ) go_repository( name = "in_gopkg_jcmturner_aescts_v1", @@ -4004,8 +5476,8 @@ def go_deps(): name = "in_gopkg_natefinch_lumberjack_v2", build_file_proto_mode = "disable_global", importpath = "gopkg.in/natefinch/lumberjack.v2", - sum = "h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=", - version = "v2.0.0", + sum = "h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=", + version = "v2.2.1", ) go_repository( name = "in_gopkg_resty_v1", @@ -4042,6 +5514,14 @@ def go_deps(): sum = "h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU=", version = "v1.3.6", ) + go_repository( + name = "io_etcd_go_etcd", + build_file_proto_mode = "disable", + importpath = "go.etcd.io/etcd", + sum = "h1:fqmtdYQlwZ/vKWSz5amW+a4cnjg23ojz5iL7rjf08Wg=", + version = "v0.5.0-alpha.5.0.20220915004622-85b640cee793", + ) + go_repository( name = "io_etcd_go_etcd_api_v3", build_file_proto_mode = "disable", @@ -4092,10 +5572,6 @@ def go_deps(): name = "io_etcd_go_etcd_raft_v3", build_file_proto_mode = "disable_global", importpath = "go.etcd.io/etcd/raft/v3", - patch_args = ["-p1"], - patches = [ - "//build/patches:io_etcd_go_etcd_raft_v3.patch", - ], sum = "h1:uCC37qOXqBvKqTGHGyhASsaCsnTuJugl1GvneJNwHWo=", version = "v3.5.2", ) @@ -4113,6 +5589,28 @@ def go_deps(): sum = "h1:uk7/uMGVebpBDl+roivowHt6gJ5Fnqwik3syDkoSKdo=", version = "v3.5.2", ) + go_repository( + name = "io_gorm_driver_mysql", + build_file_proto_mode = "disable", + importpath = "gorm.io/driver/mysql", + sum = "h1:mA0XRPjIKi4bkE9nv+NKs6qj6QWOchqUSdWOcpd3x1E=", + version = "v1.0.6", + ) + go_repository( + name = "io_gorm_driver_sqlite", + build_file_proto_mode = "disable", + importpath = "gorm.io/driver/sqlite", + sum = "h1:PDzwYE+sI6De2+mxAneV9Xs11+ZyKV6oxD3wDGkaNvM=", + version = "v1.1.4", + ) + go_repository( + name = "io_gorm_gorm", + build_file_proto_mode = "disable", + importpath = "gorm.io/gorm", + sum = "h1:INieZtn4P2Pw6xPJ8MzT0G4WUOsHq3RhfuDF1M6GW0E=", + version = "v1.21.9", + ) + go_repository( name = "io_k8s_api", build_file_proto_mode = "disable", @@ -4141,6 +5639,14 @@ def go_deps(): sum = "h1:0VPpR+sizsiivjIfIAQH/rl8tan6jvWkS7lU+0di3lE=", version = "v0.3.0", ) + go_repository( + name = "io_k8s_klog_v2", + build_file_proto_mode = "disable", + importpath = "k8s.io/klog/v2", + sum = "h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4=", + version = "v2.80.1", + ) + go_repository( name = "io_k8s_kube_openapi", build_file_proto_mode = "disable", @@ -4148,13 +5654,27 @@ def go_deps(): sum = "h1:tHgpQvrWaYfrnC8G4N0Oszw5HHCsZxKilDi2R7HuCSM=", version = "v0.0.0-20180629012420-d83b052f768a", ) + go_repository( + name = "io_k8s_sigs_json", + build_file_proto_mode = "disable", + importpath = "sigs.k8s.io/json", + sum = "h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k=", + version = "v0.0.0-20220713155537-f223a00ba0e2", + ) + go_repository( + name = "io_k8s_sigs_structured_merge_diff_v4", + build_file_proto_mode = "disable", + importpath = "sigs.k8s.io/structured-merge-diff/v4", + sum = "h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=", + version = "v4.2.3", + ) go_repository( name = "io_k8s_sigs_yaml", build_file_proto_mode = "disable_global", importpath = "sigs.k8s.io/yaml", - sum = "h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=", - version = "v1.2.0", + sum = "h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=", + version = "v1.3.0", ) go_repository( name = "io_k8s_utils", @@ -4163,6 +5683,13 @@ def go_deps(): sum = "h1:8r+l4bNWjRlsFYlQJnKJ2p7s1YQPj4XyXiJVqDHRx7c=", version = "v0.0.0-20190308190857-21c4ce38f2a7", ) + go_repository( + name = "io_moul_zapgorm2", + build_file_proto_mode = "disable", + importpath = "moul.io/zapgorm2", + sum = "h1:qwAlMBYf+qJkJ7PAzJl4oCe6eS6QGiKAXUPeis0+RBE=", + version = "v1.1.0", + ) go_repository( name = "io_opencensus_go", @@ -4289,8 +5816,8 @@ def go_deps(): name = "org_golang_google_api", build_file_proto_mode = "disable_global", importpath = "google.golang.org/api", - sum = "h1:ExR2D+5TYIrMphWgs5JCgwRhEDlPDXXrLwHHMgPHTXE=", - version = "v0.74.0", + sum = "h1:9yuVqlu2JCvcLg9p8S3fcFLZij8EPSyvODIY1rkMizQ=", + version = "v0.103.0", ) go_repository( name = "org_golang_google_appengine", @@ -4303,15 +5830,15 @@ def go_deps(): name = "org_golang_google_genproto", build_file_proto_mode = "disable_global", importpath = "google.golang.org/genproto", - sum = "h1:0m9wktIpOxGw+SSKmydXWB3Z3GTfcPP6+q75HCQa6HI=", - version = "v0.0.0-20220324131243-acbaeb5b85eb", + sum = "h1:vArvWooPH749rNHpBGgVl+U9B9dATjiEhJzcWGlovNs=", + version = "v0.0.0-20230202175211-008b39050e57", ) go_repository( name = "org_golang_google_grpc", build_file_proto_mode = "disable_global", importpath = "google.golang.org/grpc", - sum = "h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M=", - version = "v1.45.0", + sum = "h1:pf7sOysg4LdgBqduXveGKrcEwbStiK2rtfghdzlUYDQ=", + version = "v1.52.3", ) go_repository( name = "org_golang_google_grpc_cmd_protoc_gen_go_grpc", @@ -4331,22 +5858,22 @@ def go_deps(): name = "org_golang_x_crypto", build_file_proto_mode = "disable_global", importpath = "golang.org/x/crypto", - sum = "h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=", - version = "v0.1.0", + sum = "h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=", + version = "v0.5.0", ) go_repository( name = "org_golang_x_exp", build_file_proto_mode = "disable_global", importpath = "golang.org/x/exp", - sum = "h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA=", - version = "v0.0.0-20220722155223-a9213eeb770e", + sum = "h1:SkwG94eNiiYJhbeDE018Grw09HIN/KB9NlRmZsrzfWs=", + version = "v0.0.0-20221023144134-a1e5550cf13e", ) go_repository( name = "org_golang_x_exp_typeparams", build_file_proto_mode = "disable", importpath = "golang.org/x/exp/typeparams", - sum = "h1:+W8Qf4iJtMGKkyAygcKohjxTk4JPsL9DpzApJ22m5Ic=", - version = "v0.0.0-20220613132600-b0d781184e0d", + sum = "h1:Jw5wfR+h9mnIYH+OtGT2im5wV1YGGDora5vTv/aa5bE=", + version = "v0.0.0-20221208152030-732eee02a75a", ) go_repository( @@ -4374,71 +5901,71 @@ def go_deps(): name = "org_golang_x_mod", build_file_proto_mode = "disable_global", importpath = "golang.org/x/mod", - sum = "h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=", - version = "v0.6.0-dev.0.20220419223038-86c51ed26bb4", + sum = "h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA=", + version = "v0.7.0", ) go_repository( name = "org_golang_x_net", build_file_proto_mode = "disable_global", importpath = "golang.org/x/net", - sum = "h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0=", - version = "v0.1.0", + sum = "h1:L4ZwwTvKW9gr0ZMS1yrHD9GZhIuVjOBBnaKH+SPQK0Q=", + version = "v0.6.0", ) go_repository( name = "org_golang_x_oauth2", build_file_proto_mode = "disable_global", importpath = "golang.org/x/oauth2", - sum = "h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE=", - version = "v0.0.0-20220411215720-9780585627b5", + sum = "h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s=", + version = "v0.5.0", ) go_repository( name = "org_golang_x_sync", build_file_proto_mode = "disable_global", importpath = "golang.org/x/sync", - sum = "h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw=", - version = "v0.0.0-20220722155255-886fb9371eb4", + sum = "h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=", + version = "v0.1.0", ) go_repository( name = "org_golang_x_sys", build_file_proto_mode = "disable_global", importpath = "golang.org/x/sys", - sum = "h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=", - version = "v0.1.0", + sum = "h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=", + version = "v0.5.0", ) go_repository( name = "org_golang_x_term", build_file_proto_mode = "disable_global", importpath = "golang.org/x/term", - sum = "h1:g6Z6vPFA9dYBAF7DWcH6sCcOntplXsDKcliusYijMlw=", - version = "v0.1.0", + sum = "h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY=", + version = "v0.5.0", ) go_repository( name = "org_golang_x_text", build_file_proto_mode = "disable_global", importpath = "golang.org/x/text", - sum = "h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=", - version = "v0.4.0", + sum = "h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=", + version = "v0.7.0", ) go_repository( name = "org_golang_x_time", build_file_proto_mode = "disable_global", importpath = "golang.org/x/time", - sum = "h1:M73Iuj3xbbb9Uk1DYhzydthsj6oOd6l9bpuFcNoUvTs=", - version = "v0.0.0-20220224211638-0e9765cccd65", + sum = "h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=", + version = "v0.3.0", ) go_repository( name = "org_golang_x_tools", build_file_proto_mode = "disable_global", importpath = "golang.org/x/tools", - sum = "h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=", - version = "v0.1.12", + sum = "h1:+bSpV5HIeWkuvgaMfI3UmKRThoTA5ODJTUd8T17NO+4=", + version = "v0.5.0", ) go_repository( name = "org_golang_x_xerrors", build_file_proto_mode = "disable_global", importpath = "golang.org/x/xerrors", - sum = "h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U=", - version = "v0.0.0-20220411194840-2f41105eb62f", + sum = "h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=", + version = "v0.0.0-20220907171357-04be3eba64a2", ) go_repository( name = "org_gonum_v1_gonum", @@ -4545,6 +6072,21 @@ def go_deps(): sum = "h1:CpDZl6aOlLhReez+8S3eEotD7Jx0Os++lemPlMULQP0=", version = "v1.4.0", ) + go_repository( + name = "org_uber_go_dig", + build_file_proto_mode = "disable", + importpath = "go.uber.org/dig", + sum = "h1:pJTDXKEhRqBI8W7rU7kwT5EgyRZuSMVSFcZolOvKK9U=", + version = "v1.9.0", + ) + go_repository( + name = "org_uber_go_fx", + build_file_proto_mode = "disable", + importpath = "go.uber.org/fx", + sum = "h1:+1+3Cz9M0dFMPy9SW9XUIUHye8bnPUm7q7DroNGWYG4=", + version = "v1.12.0", + ) + go_repository( name = "org_uber_go_goleak", build_file_proto_mode = "disable_global", @@ -4556,8 +6098,8 @@ def go_deps(): name = "org_uber_go_multierr", build_file_proto_mode = "disable_global", importpath = "go.uber.org/multierr", - sum = "h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=", - version = "v1.8.0", + sum = "h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=", + version = "v1.9.0", ) go_repository( name = "org_uber_go_tools", @@ -4570,6 +6112,20 @@ def go_deps(): name = "org_uber_go_zap", build_file_proto_mode = "disable_global", importpath = "go.uber.org/zap", - sum = "h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY=", - version = "v1.23.0", + sum = "h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=", + version = "v1.24.0", + ) + go_repository( + name = "tools_gotest_gotestsum", + build_file_proto_mode = "disable", + importpath = "gotest.tools/gotestsum", + sum = "h1:RwpqwwFKBAa2h+F6pMEGpE707Edld0etUD3GhqqhDNc=", + version = "v1.7.0", + ) + go_repository( + name = "tools_gotest_v3", + build_file_proto_mode = "disable", + importpath = "gotest.tools/v3", + sum = "h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0=", + version = "v3.0.3", ) diff --git a/Dockerfile b/Dockerfile index 8416ef542a3d3..f3dae2519f53a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,16 +13,24 @@ # limitations under the License. # Builder image -FROM alpine:edge as builder +FROM rockylinux:9 as builder -ADD . https://raw.githubusercontent.com/njhallett/apk-fastest-mirror/c4ca44caef3385d830fea34df2dbc2ba4a17e021/apk-fastest-mirror.sh ./proxy -RUN sh ./proxy/apk-fastest-mirror.sh -t 50 && apk add --no-cache git build-base go +ENV GOLANG_VERSION 1.19.3 +ENV ARCH amd64 +ENV GOLANG_DOWNLOAD_URL https://dl.google.com/go/go$GOLANG_VERSION.linux-$ARCH.tar.gz +ENV GOPATH /go +ENV GOROOT /usr/local/go +ENV PATH $GOPATH/bin:$GOROOT/bin:$PATH +RUN yum update -y && yum groupinstall 'Development Tools' -y \ + && curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz \ + && tar -C /usr/local -xzf golang.tar.gz \ + && rm golang.tar.gz COPY . /tidb ARG GOPROXY RUN export GOPROXY=${GOPROXY} && cd /tidb && make server -FROM alpine:latest +FROM rockylinux:9-minimal COPY --from=builder /tidb/bin/tidb-server /tidb-server diff --git a/Makefile b/Makefile index a01f8c7e7634d..e5da194e75313 100644 --- a/Makefile +++ b/Makefile @@ -31,7 +31,7 @@ dev: checklist check explaintest gogenerate br_unit_test test_part_parser_dev ut # Install the check tools. check-setup:tools/bin/revive -check: parser_yacc check-parallel lint tidy testSuite errdoc check-bazel-prepare +check: parser_yacc check-parallel lint tidy testSuite errdoc license check-bazel-prepare fmt: @echo "gofmt (simplify)" @@ -56,6 +56,12 @@ lint:tools/bin/revive @echo "linting" @tools/bin/revive -formatter friendly -config tools/check/revive.toml $(FILES_TIDB_TESTS) +license: + bazel $(BAZEL_GLOBAL_CONFIG) run $(BAZEL_CMD_CONFIG) \ + --run_under="cd $(CURDIR) && " \ + @com_github_apache_skywalking_eyes//cmd/license-eye:license-eye --run_under="cd $(CURDIR) && " -- -c ./.github/licenserc.yml header check + + tidy: @echo "go mod tidy" ./tools/check/check-tidy.sh @@ -106,7 +112,7 @@ explaintest: server_check @cd cmd/explaintest && ./run-tests.sh -s ../../bin/tidb-server ddltest: - @cd cmd/ddltest && $(GO) test -o ../../bin/ddltest -c + @cd cmd/ddltest && $(GO) test --tags=deadllock,intest -o ../../bin/ddltest -c CLEAN_UT_BINARY := find . -name '*.test.bin'| xargs rm @@ -417,12 +423,12 @@ bazel_test: failpoint-enable bazel_ci_prepare bazel_coverage_test: failpoint-enable bazel_ci_prepare - bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) \ - --build_event_json_file=bazel_1.json --@io_bazel_rules_go//go/config:cover_format=go_cover \ + bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) --test_keep_going=false \ + --@io_bazel_rules_go//go/config:cover_format=go_cover --define gotags=deadlock,intest \ -- //... -//cmd/... -//tests/graceshutdown/... \ -//tests/globalkilltest/... -//tests/readonlytest/... -//br/pkg/task:task_test -//tests/realtikvtest/... - bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) \ - --build_event_json_file=bazel_2.json --@io_bazel_rules_go//go/config:cover_format=go_cover --define gotags=featuretag \ + bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) --test_keep_going=false \ + --@io_bazel_rules_go//go/config:cover_format=go_cover --define gotags=deadlock,intest,distributereorg \ -- //... -//cmd/... -//tests/graceshutdown/... \ -//tests/globalkilltest/... -//tests/readonlytest/... -//br/pkg/task:task_test -//tests/realtikvtest/... @@ -455,27 +461,27 @@ bazel_golangcilinter: -- run $$($(PACKAGE_DIRECTORIES)) --config ./.golangci.yaml bazel_brietest: failpoint-enable bazel_ci_prepare - bazel $(BAZEL_GLOBAL_CONFIG) test $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv \ + bazel $(BAZEL_GLOBAL_CONFIG) test $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ -- //tests/realtikvtest/brietest/... bazel_pessimistictest: failpoint-enable bazel_ci_prepare - bazel $(BAZEL_GLOBAL_CONFIG) test $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv \ + bazel $(BAZEL_GLOBAL_CONFIG) test $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ -- //tests/realtikvtest/pessimistictest/... bazel_sessiontest: failpoint-enable bazel_ci_prepare - bazel $(BAZEL_GLOBAL_CONFIG) test $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv \ + bazel $(BAZEL_GLOBAL_CONFIG) test $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ -- //tests/realtikvtest/sessiontest/... bazel_statisticstest: failpoint-enable bazel_ci_prepare - bazel $(BAZEL_GLOBAL_CONFIG) test $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv \ + bazel $(BAZEL_GLOBAL_CONFIG) test $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ -- //tests/realtikvtest/statisticstest/... bazel_txntest: failpoint-enable bazel_ci_prepare - bazel $(BAZEL_GLOBAL_CONFIG) test $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv \ + bazel $(BAZEL_GLOBAL_CONFIG) test $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ -- //tests/realtikvtest/txntest/... bazel_addindextest: failpoint-enable bazel_ci_prepare - bazel $(BAZEL_GLOBAL_CONFIG) test $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv \ + bazel $(BAZEL_GLOBAL_CONFIG) test $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ -- //tests/realtikvtest/addindextest/... bazel_lint: bazel_prepare diff --git a/Makefile.common b/Makefile.common index e1ff465336c59..3b7caa149f260 100644 --- a/Makefile.common +++ b/Makefile.common @@ -109,7 +109,7 @@ DUMPLING_LDFLAGS += -X "github.com/pingcap/tidb/dumpling/cli.GitHash=$(shell git DUMPLING_LDFLAGS += -X "github.com/pingcap/tidb/dumpling/cli.GitBranch=$(shell git rev-parse --abbrev-ref HEAD)" DUMPLING_LDFLAGS += -X "github.com/pingcap/tidb/dumpling/cli.GoVersion=$(shell go version)" -DUMPLING_GOBUILD := CGO_ENABLED=0 GO111MODULE=on go build -trimpath -ldflags '$(DUMPLING_LDFLAGS)' +DUMPLING_GOBUILD := CGO_ENABLED=1 GO111MODULE=on go build -trimpath -ldflags '$(DUMPLING_LDFLAGS)' DUMPLING_GOTEST := CGO_ENABLED=1 GO111MODULE=on go test -ldflags '$(DUMPLING_LDFLAGS)' TEST_COVERAGE_DIR := "test_coverage" diff --git a/README.md b/README.md index 74a81008de990..0bed69fe5a1bf 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,25 @@ -![](docs/logo_with_text.png) +TiDB, a distributed SQL database [![LICENSE](https://img.shields.io/github/license/pingcap/tidb.svg)](https://github.com/pingcap/tidb/blob/master/LICENSE) [![Language](https://img.shields.io/badge/Language-Go-blue.svg)](https://golang.org/) -[![Build Status](https://travis-ci.org/pingcap/tidb.svg?branch=master)](https://travis-ci.org/pingcap/tidb) +[![Build Status](https://prow.tidb.net/badge.svg?jobs=pingcap/tidb/merged_*)](https://prow.tidb.net/?repo=pingcap%2Ftidb&type=postsubmit) [![Go Report Card](https://goreportcard.com/badge/github.com/pingcap/tidb)](https://goreportcard.com/report/github.com/pingcap/tidb) [![GitHub release](https://img.shields.io/github/tag/pingcap/tidb.svg?label=release)](https://github.com/pingcap/tidb/releases) [![GitHub release date](https://img.shields.io/github/release-date/pingcap/tidb.svg)](https://github.com/pingcap/tidb/releases) -[![CircleCI Status](https://circleci.com/gh/pingcap/tidb.svg?style=shield)](https://circleci.com/gh/pingcap/tidb) [![Coverage Status](https://codecov.io/gh/pingcap/tidb/branch/master/graph/badge.svg)](https://codecov.io/gh/pingcap/tidb) [![GoDoc](https://img.shields.io/badge/Godoc-reference-blue.svg)](https://godoc.org/github.com/pingcap/tidb) ## What is TiDB? -TiDB ("Ti" stands for Titanium) is an open-source NewSQL database that supports Hybrid Transactional and Analytical Processing (HTAP) workloads. It is MySQL compatible and features horizontal scalability, strong consistency, and high availability. +TiDB (/’taɪdiːbi:/, "Ti" stands for Titanium) is an open-source distributed SQL database that supports Hybrid Transactional and Analytical Processing (HTAP) workloads. It is MySQL compatible and features horizontal scalability, strong consistency, and high availability. - [Key features](https://docs.pingcap.com/tidb/stable/overview#key-features) - [Architecture](#architecture) -- [MySQL Compatibility](https://docs.pingcap.com/tidb/stable/mysql-compatibility) +- [MySQL compatibility](https://docs.pingcap.com/tidb/stable/mysql-compatibility) -For more details and latest updates, see [TiDB docs](https://docs.pingcap.com/tidb/stable) and [release notes](https://docs.pingcap.com/tidb/dev/release-notes). +For more details and latest updates, see [TiDB documentation](https://docs.pingcap.com/tidb/stable) and [release notes](https://docs.pingcap.com/tidb/dev/release-notes). -For future plans, see [TiDB Roadmap](roadmap.md). +For future plans, see the [TiDB roadmap](roadmap.md). ## Quick start @@ -38,40 +37,42 @@ See [TiDB Quick Start Guide](https://docs.pingcap.com/tidb/stable/quick-start-wi ### Start developing TiDB -See [Get Started](https://pingcap.github.io/tidb-dev-guide/get-started/introduction.html) chapter of [TiDB Dev Guide](https://pingcap.github.io/tidb-dev-guide/index.html). +See the [Get Started](https://pingcap.github.io/tidb-dev-guide/get-started/introduction.html) chapter of [TiDB Development Guide](https://pingcap.github.io/tidb-dev-guide/index.html). ## Community -You can join these groups and chats to discuss and ask TiDB related questions: +You can join the following groups or channels to discuss or ask questions about TiDB, and to keep yourself informed of the latest TiDB updates: -- [TiDB Internals Forum](https://internals.tidb.io/) -- [Slack Channel](https://slack.tidb.io/invite?team=tidb-community&channel=everyone&ref=pingcap-tidb) -- [TiDB User Group Forum (Chinese)](https://asktug.com) - -In addition, you may enjoy following: - -- [@PingCAP](https://twitter.com/PingCAP) on Twitter -- Question tagged [#tidb on StackOverflow](https://stackoverflow.com/questions/tagged/tidb) -- The PingCAP Team [English Blog](https://en.pingcap.com/blog) and [Chinese Blog](https://pingcap.com/blog-cn/) +- Seek help when you use TiDB + - TiDB Forum: [English](https://ask.pingcap.com/), [Chinese](https://asktug.com) + - Slack channels: [#everyone](https://slack.tidb.io/invite?team=tidb-community&channel=everyone&ref=pingcap-tidb) (English), [#tidb-japan](https://slack.tidb.io/invite?team=tidb-community&channel=tidb-japan&ref=github-tidb) (Japanese) + - [Stack Overflow](https://stackoverflow.com/questions/tagged/tidb) (questions tagged with #tidb) +- Discuss TiDB's implementation and design + - [TiDB Internals forum](https://internals.tidb.io/) +- Get the latest TiDB news or updates + - Follow [@PingCAP](https://twitter.com/PingCAP) on Twitter + - Read the PingCAP [English Blog](https://www.pingcap.com/blog/?from=en) or [Chinese Blog](https://cn.pingcap.com/blog/) For support, please contact [PingCAP](http://bit.ly/contact_us_via_github). ## Contributing -The [community repository](https://github.com/pingcap/community) hosts all information about the TiDB community, including how to contribute to TiDB, how TiDB community is governed, how special interest groups are organized, etc. +The [community repository](https://github.com/pingcap/community) hosts all information about the TiDB community, including [how to contribute](https://github.com/pingcap/community/blob/master/contributors/README.md) to TiDB, how the TiDB community is governed, how [teams](https://github.com/pingcap/community/blob/master/teams/README.md) are organized. + +Contributions are welcomed and greatly appreciated. You can get started with one of the [good first issues](https://github.com/pingcap/tidb/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) or [help wanted issues](https://github.com/pingcap/tidb/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22). For more details on typical contribution workflows, see [Contribute to TiDB](https://pingcap.github.io/tidb-dev-guide/contribute-to-tidb/introduction.html). For more contributing information about where to start, click the contributor icon below. [contribution-map](https://github.com/pingcap/tidb-map/blob/master/maps/contribution-map.md#tidb-is-an-open-source-distributed-htap-database-compatible-with-the-mysql-protocol) -Contributions are welcomed and greatly appreciated. All the contributors are welcomed to claim your reward by filing this [form](https://forms.pingcap.com/f/tidb-contribution-swag). See [Contribution to TiDB](https://pingcap.github.io/tidb-dev-guide/contribute-to-tidb/introduction.html) for details on typical contribution workflows. For more contributing information, click on the contributor icon above. +Every contributor is welcome to claim your contribution swag by filling in and submitting this [form](https://forms.pingcap.com/f/tidb-contribution-swag). ## Case studies -- [English](https://pingcap.com/case-studies) -- [简体中文](https://pingcap.com/cases-cn/) +- [Case studies in English](https://www.pingcap.com/customers/) +- [中文用户案例](https://cn.pingcap.com/case/) ## Architecture -![architecture](./docs/architecture.png) +![TiDB architecture](./docs/tidb-architecture.png) ## License diff --git a/WORKSPACE b/WORKSPACE index e6df7760f5d5e..6fce0d77d8da1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -2,23 +2,23 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( name = "io_bazel_rules_go", - sha256 = "099a9fb96a376ccbbb7d291ed4ecbdfd42f6bc822ab77ae6f1b5cb9e914e94fa", + sha256 = "dd926a88a564a9246713a9c00b35315f54cbd46b31a26d5d8fb264c07045f05d", urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.35.0/rules_go-v0.35.0.zip", - "https://github.com/bazelbuild/rules_go/releases/download/v0.35.0/rules_go-v0.35.0.zip", + "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.38.1/rules_go-v0.38.1.zip", + "https://github.com/bazelbuild/rules_go/releases/download/v0.38.1/rules_go-v0.38.1.zip", ], ) http_archive( name = "bazel_gazelle", - sha256 = "501deb3d5695ab658e82f6f6f549ba681ea3ca2a5fb7911154b5aa45596183fa", + sha256 = "ecba0f04f96b4960a5b250c8e8eeec42281035970aa8852dda73098274d14a1d", urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.26.0/bazel-gazelle-v0.26.0.tar.gz", - "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.26.0/bazel-gazelle-v0.26.0.tar.gz", + "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.29.0/bazel-gazelle-v0.29.0.tar.gz", + "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.29.0/bazel-gazelle-v0.29.0.tar.gz", ], ) -load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") +load("@io_bazel_rules_go//go:deps.bzl", "go_download_sdk", "go_register_toolchains", "go_rules_dependencies") load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies") load("//:DEPS.bzl", "go_deps") @@ -27,9 +27,19 @@ go_deps() go_rules_dependencies() +go_download_sdk( + name = "go_sdk", + urls = [ + "http://ats.apps.svc/golang/{}", + "http://bazel-cache.pingcap.net:8080/golang/{}", + "https://mirrors.aliyun.com/golang/{}", + "https://dl.google.com/go/{}", + ], + version = "1.19.5", +) + go_register_toolchains( nogo = "@//build:tidb_nogo", - version = "1.19.3", ) gazelle_dependencies() @@ -48,3 +58,23 @@ http_archive( load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") protobuf_deps() + +http_archive( + name = "remote_java_tools", + sha256 = "5cd59ea6bf938a1efc1e11ea562d37b39c82f76781211b7cd941a2346ea8484d", + urls = [ + "http://ats.apps.svc/bazel_java_tools/releases/java/v11.9/java_tools-v11.9.zip", + "https://mirror.bazel.build/bazel_java_tools/releases/java/v11.9/java_tools-v11.9.zip", + "https://github.com/bazelbuild/java_tools/releases/download/java_v11.9/java_tools-v11.9.zip", + ], +) + +http_archive( + name = "remote_java_tools_linux", + sha256 = "512582cac5b7ea7974a77b0da4581b21f546c9478f206eedf54687eeac035989", + urls = [ + "http://ats.apps.svc/bazel_java_tools/releases/java/v11.9/java_tools_linux-v11.9.zip", + "https://mirror.bazel.build/bazel_java_tools/releases/java/v11.9/java_tools_linux-v11.9.zip", + "https://github.com/bazelbuild/java_tools/releases/download/java_v11.9/java_tools_linux-v11.9.zip", + ], +) diff --git a/autoid_service/BUILD.bazel b/autoid_service/BUILD.bazel index df3d361d412ed..6b206586fc6bb 100644 --- a/autoid_service/BUILD.bazel +++ b/autoid_service/BUILD.bazel @@ -1,4 +1,4 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "autoid_service", @@ -9,11 +9,14 @@ go_library( "//config", "//kv", "//meta", + "//meta/autoid", "//metrics", "//owner", + "//parser/model", "//util/logutil", "//util/mathutil", "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/autoid", "@io_etcd_go_etcd_client_v3//:client", "@org_golang_google_grpc//:grpc", @@ -21,3 +24,20 @@ go_library( "@org_uber_go_zap//:zap", ], ) + +go_test( + name = "autoid_service_test", + timeout = "short", + srcs = ["autoid_test.go"], + embed = [":autoid_service"], + flaky = True, + deps = [ + "//parser/model", + "//testkit", + "@com_github_pingcap_kvproto//pkg/autoid", + "@com_github_stretchr_testify//require", + "@io_etcd_go_etcd_tests_v3//integration", + "@org_golang_google_grpc//:grpc", + "@org_golang_google_grpc//credentials/insecure", + ], +) diff --git a/autoid_service/autoid.go b/autoid_service/autoid.go index d20c78fd06098..aa6c487cb0b48 100644 --- a/autoid_service/autoid.go +++ b/autoid_service/autoid.go @@ -22,12 +22,15 @@ import ( "time" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/autoid" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" + autoid1 "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/owner" + "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/mathutil" clientv3 "go.etcd.io/etcd/client/v3" @@ -76,7 +79,7 @@ func (alloc *autoIDValue) alloc4Unsigned(ctx context.Context, store kv.Storage, ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnMeta) err := kv.RunInNewTxn(ctx, store, true, func(ctx context.Context, txn kv.Transaction) error { - idAcc := meta.NewMeta(txn).GetAutoIDAccessors(dbID, tblID).RowID() + idAcc := meta.NewMeta(txn).GetAutoIDAccessors(dbID, tblID).IncrementID(model.TableInfoVersion5) var err1 error newBase, err1 = idAcc.Get() if err1 != nil { @@ -137,7 +140,7 @@ func (alloc *autoIDValue) alloc4Signed(ctx context.Context, ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnMeta) err := kv.RunInNewTxn(ctx, store, true, func(ctx context.Context, txn kv.Transaction) error { - idAcc := meta.NewMeta(txn).GetAutoIDAccessors(dbID, tblID).RowID() + idAcc := meta.NewMeta(txn).GetAutoIDAccessors(dbID, tblID).IncrementID(model.TableInfoVersion5) var err1 error newBase, err1 = idAcc.Get() if err1 != nil { @@ -188,7 +191,7 @@ func (alloc *autoIDValue) rebase4Unsigned(ctx context.Context, startTime := time.Now() ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnMeta) err := kv.RunInNewTxn(ctx, store, true, func(ctx context.Context, txn kv.Transaction) error { - idAcc := meta.NewMeta(txn).GetAutoIDAccessors(dbID, tblID).RowID() + idAcc := meta.NewMeta(txn).GetAutoIDAccessors(dbID, tblID).IncrementID(model.TableInfoVersion5) currentEnd, err1 := idAcc.Get() if err1 != nil { return err1 @@ -221,7 +224,7 @@ func (alloc *autoIDValue) rebase4Signed(ctx context.Context, store kv.Storage, d var newBase, newEnd int64 ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnMeta) err := kv.RunInNewTxn(ctx, store, true, func(ctx context.Context, txn kv.Transaction) error { - idAcc := meta.NewMeta(txn).GetAutoIDAccessors(dbID, tblID).RowID() + idAcc := meta.NewMeta(txn).GetAutoIDAccessors(dbID, tblID).IncrementID(model.TableInfoVersion5) currentEnd, err1 := idAcc.Get() if err1 != nil { return err1 @@ -251,6 +254,7 @@ type Service struct { func New(selfAddr string, etcdAddr []string, store kv.Storage, tlsConfig *tls.Config) *Service { cfg := config.GetGlobalConfig() etcdLogCfg := zap.NewProductionConfig() + cli, err := clientv3.New(clientv3.Config{ LogConfig: &etcdLogCfg, Endpoints: etcdAddr, @@ -268,9 +272,12 @@ func New(selfAddr string, etcdAddr []string, store kv.Storage, tlsConfig *tls.Co if err != nil { panic(err) } + return newWithCli(selfAddr, cli, store) +} +func newWithCli(selfAddr string, cli *clientv3.Client, store kv.Storage) *Service { l := owner.NewOwnerManager(context.Background(), cli, "autoid", selfAddr, autoIDLeaderPath) - err = l.CampaignOwner() + err := l.CampaignOwner() if err != nil { panic(err) } @@ -297,7 +304,7 @@ func (m *mockClient) Rebase(ctx context.Context, in *autoid.RebaseRequest, opts var global = make(map[string]*mockClient) // MockForTest is used for testing, the UT test and unistore use this. -func MockForTest(store kv.Storage) *mockClient { +func MockForTest(store kv.Storage) autoid.AutoIDAllocClient { uuid := store.UUID() ret, ok := global[uuid] if !ok { @@ -400,16 +407,44 @@ func (s *Service) getAlloc(dbID, tblID int64, isUnsigned bool) *autoIDValue { func (s *Service) allocAutoID(ctx context.Context, req *autoid.AutoIDRequest) (*autoid.AutoIDResponse, error) { if s.leaderShip != nil && !s.leaderShip.IsOwner() { + logutil.BgLogger().Info("[autoid service] Alloc AutoID fail, not leader") return nil, errors.New("not leader") } + failpoint.Inject("mockErr", func(val failpoint.Value) { + if val.(bool) { + failpoint.Return(nil, errors.New("mock reload failed")) + } + }) + val := s.getAlloc(req.DbID, req.TblID, req.IsUnsigned) - if req.N == 0 && val.base != 0 { - base := val.base + if req.N == 0 { + if val.base != 0 { + return &autoid.AutoIDResponse{ + Min: val.base, + Max: val.base, + }, nil + } + // This item is not initialized, get the data from remote. + var currentEnd int64 + ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnMeta) + err := kv.RunInNewTxn(ctx, s.store, true, func(ctx context.Context, txn kv.Transaction) error { + idAcc := meta.NewMeta(txn).GetAutoIDAccessors(req.DbID, req.TblID).RowID() + var err1 error + currentEnd, err1 = idAcc.Get() + if err1 != nil { + return err1 + } + val.end = currentEnd + return nil + }) + if err != nil { + return &autoid.AutoIDResponse{Errmsg: []byte(err.Error())}, nil + } return &autoid.AutoIDResponse{ - Min: base, - Max: base, + Min: currentEnd, + Max: currentEnd, }, nil } @@ -424,16 +459,19 @@ func (s *Service) allocAutoID(ctx context.Context, req *autoid.AutoIDRequest) (* min, max, err = val.alloc4Signed(ctx, s.store, req.DbID, req.TblID, req.IsUnsigned, req.N, req.Increment, req.Offset) } + if err != nil { + return &autoid.AutoIDResponse{Errmsg: []byte(err.Error())}, nil + } return &autoid.AutoIDResponse{ Min: min, Max: max, - }, err + }, nil } func (alloc *autoIDValue) forceRebase(ctx context.Context, store kv.Storage, dbID, tblID, requiredBase int64, isUnsigned bool) error { ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnMeta) err := kv.RunInNewTxn(ctx, store, true, func(ctx context.Context, txn kv.Transaction) error { - idAcc := meta.NewMeta(txn).GetAutoIDAccessors(dbID, tblID).RowID() + idAcc := meta.NewMeta(txn).GetAutoIDAccessors(dbID, tblID).IncrementID(model.TableInfoVersion5) currentEnd, err1 := idAcc.Get() if err1 != nil { return err1 @@ -459,6 +497,7 @@ func (alloc *autoIDValue) forceRebase(ctx context.Context, store kv.Storage, dbI // req.N = 0 is handled specially, it is used to return the current auto ID value. func (s *Service) Rebase(ctx context.Context, req *autoid.RebaseRequest) (*autoid.RebaseResponse, error) { if s.leaderShip != nil && !s.leaderShip.IsOwner() { + logutil.BgLogger().Info("[autoid service] Rebase() fail, not leader") return nil, errors.New("not leader") } @@ -466,7 +505,7 @@ func (s *Service) Rebase(ctx context.Context, req *autoid.RebaseRequest) (*autoi if req.Force { err := val.forceRebase(ctx, s.store, req.DbID, req.TblID, req.Base, req.IsUnsigned) if err != nil { - return nil, errors.Trace(err) + return &autoid.RebaseResponse{Errmsg: []byte(err.Error())}, nil } } @@ -476,5 +515,12 @@ func (s *Service) Rebase(ctx context.Context, req *autoid.RebaseRequest) (*autoi } else { err = val.rebase4Signed(ctx, s.store, req.DbID, req.TblID, req.Base) } - return &autoid.RebaseResponse{}, err + if err != nil { + return &autoid.RebaseResponse{Errmsg: []byte(err.Error())}, nil + } + return &autoid.RebaseResponse{}, nil +} + +func init() { + autoid1.MockForTest = MockForTest } diff --git a/autoid_service/autoid_test.go b/autoid_service/autoid_test.go new file mode 100644 index 0000000000000..df2722309cf6e --- /dev/null +++ b/autoid_service/autoid_test.go @@ -0,0 +1,202 @@ +// 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, +// 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 autoid + +import ( + "context" + "fmt" + "math" + "net" + "testing" + "time" + + "github.com/pingcap/kvproto/pkg/autoid" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/require" + "go.etcd.io/etcd/tests/v3/integration" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" +) + +type autoIDResp struct { + *autoid.AutoIDResponse + error + *testing.T +} + +func (resp autoIDResp) check(min, max int64) { + require.NoError(resp.T, resp.error) + require.Equal(resp.T, resp.AutoIDResponse, &autoid.AutoIDResponse{Min: min, Max: max}) +} + +func (resp autoIDResp) checkErrmsg() { + require.NoError(resp.T, resp.error) + require.True(resp.T, len(resp.GetErrmsg()) > 0) +} + +type rebaseResp struct { + *autoid.RebaseResponse + error + *testing.T +} + +func (resp rebaseResp) check(msg string) { + require.NoError(resp.T, resp.error) + require.Equal(resp.T, string(resp.RebaseResponse.GetErrmsg()), msg) +} + +func TestAPI(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + cli := MockForTest(store) + tk.MustExec("use test") + tk.MustExec("create table t (id int key auto_increment);") + is := dom.InfoSchema() + dbInfo, ok := is.SchemaByName(model.NewCIStr("test")) + require.True(t, ok) + + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + tbInfo := tbl.Meta() + + ctx := context.Background() + checkCurrValue := func(t *testing.T, cli autoid.AutoIDAllocClient, min, max int64) { + req := &autoid.AutoIDRequest{DbID: dbInfo.ID, TblID: tbInfo.ID, N: 0} + resp, err := cli.AllocAutoID(ctx, req) + require.NoError(t, err) + require.Equal(t, resp, &autoid.AutoIDResponse{Min: min, Max: max}) + } + autoIDRequest := func(t *testing.T, cli autoid.AutoIDAllocClient, unsigned bool, n uint64, more ...int64) autoIDResp { + increment := int64(1) + offset := int64(1) + if len(more) >= 1 { + increment = more[0] + } + if len(more) >= 2 { + offset = more[1] + } + req := &autoid.AutoIDRequest{DbID: dbInfo.ID, TblID: tbInfo.ID, IsUnsigned: unsigned, N: n, Increment: increment, Offset: offset} + resp, err := cli.AllocAutoID(ctx, req) + return autoIDResp{resp, err, t} + } + rebaseRequest := func(t *testing.T, cli autoid.AutoIDAllocClient, unsigned bool, n int64, force ...struct{}) rebaseResp { + req := &autoid.RebaseRequest{ + DbID: dbInfo.ID, + TblID: tbInfo.ID, + Base: n, + IsUnsigned: unsigned, + Force: len(force) > 0, + } + resp, err := cli.Rebase(ctx, req) + return rebaseResp{resp, err, t} + } + var force = struct{}{} + + // basic auto id operation + autoIDRequest(t, cli, false, 1).check(0, 1) + autoIDRequest(t, cli, false, 10).check(1, 11) + checkCurrValue(t, cli, 11, 11) + autoIDRequest(t, cli, false, 128).check(11, 139) + autoIDRequest(t, cli, false, 1, 10, 5).check(139, 145) + + // basic rebase operation + rebaseRequest(t, cli, false, 666).check("") + autoIDRequest(t, cli, false, 1).check(666, 667) + + rebaseRequest(t, cli, false, 6666).check("") + autoIDRequest(t, cli, false, 1).check(6666, 6667) + + // rebase will not decrease the value without 'force' + rebaseRequest(t, cli, false, 44).check("") + checkCurrValue(t, cli, 6667, 6667) + rebaseRequest(t, cli, false, 44, force).check("") + checkCurrValue(t, cli, 44, 44) + + // max increase 1 + rebaseRequest(t, cli, false, math.MaxInt64, force).check("") + checkCurrValue(t, cli, math.MaxInt64, math.MaxInt64) + autoIDRequest(t, cli, false, 1).checkErrmsg() + + rebaseRequest(t, cli, true, 0, force).check("") + checkCurrValue(t, cli, 0, 0) + autoIDRequest(t, cli, true, 1).check(0, 1) + autoIDRequest(t, cli, true, 10).check(1, 11) + autoIDRequest(t, cli, true, 128).check(11, 139) + autoIDRequest(t, cli, true, 1, 10, 5).check(139, 145) + + // max increase 1 + rebaseRequest(t, cli, true, math.MaxInt64).check("") + checkCurrValue(t, cli, math.MaxInt64, math.MaxInt64) + autoIDRequest(t, cli, true, 1).check(math.MaxInt64, math.MinInt64) + autoIDRequest(t, cli, true, 1).check(math.MinInt64, math.MinInt64+1) + + rebaseRequest(t, cli, true, -1).check("") + checkCurrValue(t, cli, -1, -1) + autoIDRequest(t, cli, true, 1).check(-1, 0) +} + +func TestGRPC(t *testing.T) { + integration.BeforeTestExternal(t) + store := testkit.CreateMockStore(t) + cluster := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1}) + defer cluster.Terminate(t) + etcdCli := cluster.RandClient() + + var addr string + var listener net.Listener + for port := 10080; ; port++ { + var err error + addr = fmt.Sprintf("127.0.0.1:%d", port) + listener, err = net.Listen("tcp", addr) + if err == nil { + break + } + } + defer listener.Close() + + service := newWithCli(addr, etcdCli, store) + defer service.Close() + + var i int + for !service.leaderShip.IsOwner() { + time.Sleep(100 * time.Millisecond) + i++ + if i >= 20 { + break + } + } + require.Less(t, i, 20) + + grpcServer := grpc.NewServer() + autoid.RegisterAutoIDAllocServer(grpcServer, service) + go func() { + grpcServer.Serve(listener) + }() + defer grpcServer.Stop() + + grpcConn, err := grpc.Dial("127.0.0.1:10080", grpc.WithTransportCredentials(insecure.NewCredentials())) + require.NoError(t, err) + cli := autoid.NewAutoIDAllocClient(grpcConn) + _, err = cli.AllocAutoID(context.Background(), &autoid.AutoIDRequest{ + DbID: 0, + TblID: 0, + N: 1, + Increment: 1, + Offset: 1, + IsUnsigned: false, + }) + require.NoError(t, err) +} diff --git a/bindinfo/BUILD.bazel b/bindinfo/BUILD.bazel index 93b55bfab21c2..64a11f86d5556 100644 --- a/bindinfo/BUILD.bazel +++ b/bindinfo/BUILD.bazel @@ -34,7 +34,7 @@ go_library( "//util/memory", "//util/parser", "//util/sqlexec", - "//util/stmtsummary", + "//util/stmtsummary/v2:stmtsummary", "//util/table-filter", "//util/timeutil", "@org_golang_x_exp//maps", diff --git a/bindinfo/bind_cache.go b/bindinfo/bind_cache.go index 8ce69deedd840..fe67cbbbf9f43 100644 --- a/bindinfo/bind_cache.go +++ b/bindinfo/bind_cache.go @@ -146,6 +146,23 @@ func (c *bindCache) GetBindRecord(hash, normdOrigSQL, db string) *BindRecord { return nil } +// GetBindRecordBySQLDigest gets the BindRecord from the cache. +// The return value is not read-only, but it shouldn't be changed in the caller functions. +// The function is thread-safe. +func (c *bindCache) GetBindRecordBySQLDigest(sqlDigest string) (*BindRecord, error) { + c.lock.Lock() + defer c.lock.Unlock() + bindings := c.get(bindCacheKey(sqlDigest)) + if len(bindings) > 1 { + // currently, we only allow one binding for a sql + return nil, errors.New("more than 1 binding matched") + } + if len(bindings) == 0 || len(bindings[0].Bindings) == 0 { + return nil, errors.New("can't find any binding for '" + sqlDigest + "'") + } + return bindings[0], nil +} + // GetAllBindRecords return all the bindRecords from the bindCache. // The return value is not read-only, but it shouldn't be changed in the caller functions. // The function is thread-safe. diff --git a/bindinfo/bind_record.go b/bindinfo/bind_record.go index 63517d91ac189..50e8e0ba20784 100644 --- a/bindinfo/bind_record.go +++ b/bindinfo/bind_record.go @@ -54,6 +54,8 @@ const ( Evolve = "evolve" // Builtin indicates the binding is a builtin record for internal locking purpose. It is also the status for the builtin binding. Builtin = "builtin" + // History indicate the binding is created from statement summary by plan digest + History = "history" ) // Binding stores the basic bind hint info. @@ -71,7 +73,9 @@ type Binding struct { // Hint is the parsed hints, it is used to bind hints to stmt node. Hint *hint.HintsSet `json:"-"` // ID is the string form of Hint. It would be non-empty only when the status is `Using` or `PendingVerify`. - ID string `json:"-"` + ID string `json:"-"` + SQLDigest string + PlanDigest string } func (b *Binding) isSame(rb *Binding) bool { @@ -111,6 +115,17 @@ type BindRecord struct { Bindings []Binding } +// Copy get the copy of bindRecord +func (br *BindRecord) Copy() *BindRecord { + nbr := &BindRecord{ + OriginalSQL: br.OriginalSQL, + Db: br.Db, + } + nbr.Bindings = make([]Binding, len(br.Bindings)) + copy(nbr.Bindings, br.Bindings) + return nbr +} + // HasEnabledBinding checks if there are any enabled bindings in bind record. func (br *BindRecord) HasEnabledBinding() bool { for _, binding := range br.Bindings { diff --git a/bindinfo/bind_test.go b/bindinfo/bind_test.go index 07e29923a9790..cb8e62687df8f 100644 --- a/bindinfo/bind_test.go +++ b/bindinfo/bind_test.go @@ -29,6 +29,8 @@ import ( "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/util" + utilparser "github.com/pingcap/tidb/util/parser" + "github.com/pingcap/tidb/util/stmtsummary" "github.com/stretchr/testify/require" ) @@ -1241,3 +1243,148 @@ func TestGCBindRecord(t *testing.T) { tk.MustQuery("show global bindings").Check(testkit.Rows()) tk.MustQuery("select status from mysql.bind_info where original_sql = 'select * from `test` . `t` where `a` = ?'").Check(testkit.Rows()) } + +func TestBindSQLDigest(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(pk int primary key, a int, b int, key(a), key(b))") + + cases := []struct { + origin string + hint string + }{ + // agg hints + {"select count(1) from t", "select /*+ hash_agg() */ count(1) from t"}, + {"select count(1) from t", "select /*+ stream_agg() */ count(1) from t"}, + // join hints + {"select * from t t1, t t2 where t1.a=t2.a", "select /*+ merge_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a"}, + {"select * from t t1, t t2 where t1.a=t2.a", "select /*+ tidb_smj(t1, t2) */ * from t t1, t t2 where t1.a=t2.a"}, + {"select * from t t1, t t2 where t1.a=t2.a", "select /*+ hash_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a"}, + {"select * from t t1, t t2 where t1.a=t2.a", "select /*+ tidb_hj(t1, t2) */ * from t t1, t t2 where t1.a=t2.a"}, + {"select * from t t1, t t2 where t1.a=t2.a", "select /*+ inl_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a"}, + {"select * from t t1, t t2 where t1.a=t2.a", "select /*+ tidb_inlj(t1, t2) */ * from t t1, t t2 where t1.a=t2.a"}, + {"select * from t t1, t t2 where t1.a=t2.a", "select /*+ inl_hash_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a"}, + // index hints + {"select * from t", "select * from t use index(primary)"}, + {"select * from t", "select /*+ use_index(primary) */ * from t"}, + {"select * from t", "select * from t use index(a)"}, + {"select * from t", "select /*+ use_index(a) */ * from t use index(a)"}, + {"select * from t", "select * from t use index(b)"}, + {"select * from t", "select /*+ use_index(b) */ * from t use index(b)"}, + {"select a, b from t where a=1 or b=1", "select /*+ use_index_merge(t, a, b) */ a, b from t where a=1 or b=1"}, + {"select * from t where a=1", "select /*+ ignore_index(t, a) */ * from t where a=1"}, + // push-down hints + {"select * from t limit 10", "select /*+ limit_to_cop() */ * from t limit 10"}, + {"select a, count(*) from t group by a", "select /*+ agg_to_cop() */ a, count(*) from t group by a"}, + // index-merge hints + {"select a, b from t where a>1 or b>1", "select /*+ no_index_merge() */ a, b from t where a>1 or b>1"}, + {"select a, b from t where a>1 or b>1", "select /*+ use_index_merge(t, a, b) */ a, b from t where a>1 or b>1"}, + // runtime hints + {"select * from t", "select /*+ memory_quota(1024 MB) */ * from t"}, + {"select * from t", "select /*+ max_execution_time(1000) */ * from t"}, + // storage hints + {"select * from t", "select /*+ read_from_storage(tikv[t]) */ * from t"}, + // others + {"select t1.a, t1.b from t t1 where t1.a in (select t2.a from t t2)", "select /*+ use_toja(true) */ t1.a, t1.b from t t1 where t1.a in (select t2.a from t t2)"}, + } + for _, c := range cases { + stmtsummary.StmtSummaryByDigestMap.Clear() + utilCleanBindingEnv(tk, dom) + sql := "create global binding for " + c.origin + " using " + c.hint + tk.MustExec(sql) + res := tk.MustQuery(`show global bindings`).Rows() + require.Equal(t, len(res[0]), 11) + + parser4binding := parser.New() + originNode, err := parser4binding.ParseOneStmt(c.origin, "utf8mb4", "utf8mb4_general_ci") + require.NoError(t, err) + _, sqlDigestWithDB := parser.NormalizeDigest(utilparser.RestoreWithDefaultDB(originNode, "test", c.origin)) + require.Equal(t, res[0][9], sqlDigestWithDB.String()) + } +} + +func TestDropBindBySQLDigest(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(pk int primary key, a int, b int, key(a), key(b))") + + cases := []struct { + origin string + hint string + }{ + // agg hints + {"select count(1) from t", "select /*+ hash_agg() */ count(1) from t"}, + {"select count(1) from t", "select /*+ stream_agg() */ count(1) from t"}, + // join hints + {"select * from t t1, t t2 where t1.a=t2.a", "select /*+ merge_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a"}, + {"select * from t t1, t t2 where t1.a=t2.a", "select /*+ tidb_smj(t1, t2) */ * from t t1, t t2 where t1.a=t2.a"}, + {"select * from t t1, t t2 where t1.a=t2.a", "select /*+ hash_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a"}, + {"select * from t t1, t t2 where t1.a=t2.a", "select /*+ tidb_hj(t1, t2) */ * from t t1, t t2 where t1.a=t2.a"}, + {"select * from t t1, t t2 where t1.a=t2.a", "select /*+ inl_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a"}, + {"select * from t t1, t t2 where t1.a=t2.a", "select /*+ tidb_inlj(t1, t2) */ * from t t1, t t2 where t1.a=t2.a"}, + {"select * from t t1, t t2 where t1.a=t2.a", "select /*+ inl_hash_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a"}, + // index hints + {"select * from t", "select * from t use index(primary)"}, + {"select * from t", "select /*+ use_index(primary) */ * from t"}, + {"select * from t", "select * from t use index(a)"}, + {"select * from t", "select /*+ use_index(a) */ * from t use index(a)"}, + {"select * from t", "select * from t use index(b)"}, + {"select * from t", "select /*+ use_index(b) */ * from t use index(b)"}, + {"select a, b from t where a=1 or b=1", "select /*+ use_index_merge(t, a, b) */ a, b from t where a=1 or b=1"}, + {"select * from t where a=1", "select /*+ ignore_index(t, a) */ * from t where a=1"}, + // push-down hints + {"select * from t limit 10", "select /*+ limit_to_cop() */ * from t limit 10"}, + {"select a, count(*) from t group by a", "select /*+ agg_to_cop() */ a, count(*) from t group by a"}, + // index-merge hints + {"select a, b from t where a>1 or b>1", "select /*+ no_index_merge() */ a, b from t where a>1 or b>1"}, + {"select a, b from t where a>1 or b>1", "select /*+ use_index_merge(t, a, b) */ a, b from t where a>1 or b>1"}, + // runtime hints + {"select * from t", "select /*+ memory_quota(1024 MB) */ * from t"}, + {"select * from t", "select /*+ max_execution_time(1000) */ * from t"}, + // storage hints + {"select * from t", "select /*+ read_from_storage(tikv[t]) */ * from t"}, + // others + {"select t1.a, t1.b from t t1 where t1.a in (select t2.a from t t2)", "select /*+ use_toja(true) */ t1.a, t1.b from t t1 where t1.a in (select t2.a from t t2)"}, + } + + h := dom.BindHandle() + // global scope + for _, c := range cases { + utilCleanBindingEnv(tk, dom) + sql := "create global binding for " + c.origin + " using " + c.hint + tk.MustExec(sql) + h.ReloadBindings() + res := tk.MustQuery(`show global bindings`).Rows() + + require.Equal(t, len(res), 1) + require.Equal(t, len(res[0]), 11) + drop := fmt.Sprintf("drop global binding for sql digest '%s'", res[0][9]) + tk.MustExec(drop) + require.NoError(t, h.GCBindRecord()) + h.ReloadBindings() + tk.MustQuery("show global bindings").Check(testkit.Rows()) + } + + // session scope + for _, c := range cases { + utilCleanBindingEnv(tk, dom) + sql := "create binding for " + c.origin + " using " + c.hint + tk.MustExec(sql) + res := tk.MustQuery(`show bindings`).Rows() + + require.Equal(t, len(res), 1) + require.Equal(t, len(res[0]), 11) + drop := fmt.Sprintf("drop binding for sql digest '%s'", res[0][9]) + tk.MustExec(drop) + require.NoError(t, h.GCBindRecord()) + tk.MustQuery("show bindings").Check(testkit.Rows()) + } + + // exception cases + tk.MustGetErrMsg(fmt.Sprintf("drop binding for sql digest '%s'", "1"), "can't find any binding for '1'") + tk.MustGetErrMsg(fmt.Sprintf("drop binding for sql digest '%s'", ""), "sql digest is empty") +} diff --git a/bindinfo/capture_test.go b/bindinfo/capture_test.go index bff6b01045c0b..21b31c883e582 100644 --- a/bindinfo/capture_test.go +++ b/bindinfo/capture_test.go @@ -22,9 +22,11 @@ import ( "github.com/pingcap/tidb/bindinfo" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/testkit" + utilparser "github.com/pingcap/tidb/util/parser" "github.com/pingcap/tidb/util/stmtsummary" "github.com/stretchr/testify/require" "go.opencensus.io/stats/view" @@ -397,7 +399,7 @@ func TestConcurrentCapture(t *testing.T) { // Simulate an existing binding generated by concurrent CREATE BINDING, which has not been synchronized to current tidb-server yet. // Actually, it is more common to be generated by concurrent baseline capture, I use Manual just for simpler test verification. tk.MustExec("insert into mysql.bind_info values('select * from `test` . `t`', 'select * from `test` . `t`', '', 'enabled', '2000-01-01 09:00:00', '2000-01-01 09:00:00', '', '','" + - bindinfo.Manual + "')") + bindinfo.Manual + "', '', '')") tk.MustQuery("select original_sql, source from mysql.bind_info where source != 'builtin'").Check(testkit.Rows( "select * from `test` . `t` manual", )) @@ -432,8 +434,9 @@ func TestUpdateSubqueryCapture(t *testing.T) { rows := tk.MustQuery("show global bindings").Rows() require.Len(t, rows, 1) bindSQL := "UPDATE /*+ hash_join(@`upd_1` `test`.`t1`), use_index(@`upd_1` `test`.`t1` `idx_b`), use_index(@`sel_1` `test`.`t2` ), use_index(@`sel_2` `test`.`t2` )*/ `test`.`t1` SET `b`=1 WHERE `b` = 2 AND (`a` IN (SELECT `a` FROM `test`.`t2` WHERE `b` = 1) OR `c` IN (SELECT `a` FROM `test`.`t2` WHERE `b` = 1))" + originSQL := "UPDATE `test`.`t1` SET `b`=1 WHERE `b` = 2 AND (`a` IN (SELECT `a` FROM `test`.`t2` WHERE `b` = 1) OR `c` IN (SELECT `a` FROM `test`.`t2` WHERE `b` = 1))" require.Equal(t, bindSQL, rows[0][1]) - tk.MustExec(bindSQL) + tk.MustExec(originSQL) require.Len(t, tk.Session().GetSessionVars().StmtCtx.GetWarnings(), 0) } @@ -1011,5 +1014,11 @@ func TestCaptureHints(t *testing.T) { res := tk.MustQuery(`show global bindings`).Rows() require.Equal(t, len(res), 1) // this query is captured, and require.True(t, strings.Contains(res[0][1].(string), capCase.hint)) // the binding contains the expected hint + // test sql digest + parser4binding := parser.New() + originNode, err := parser4binding.ParseOneStmt(capCase.query, "utf8mb4", "utf8mb4_general_ci") + require.NoError(t, err) + _, sqlDigestWithDB := parser.NormalizeDigest(utilparser.RestoreWithDefaultDB(originNode, "test", capCase.query)) + require.Equal(t, res[0][9], sqlDigestWithDB.String()) } } diff --git a/bindinfo/handle.go b/bindinfo/handle.go index f4a9d372e9d85..8501dcfc9939e 100644 --- a/bindinfo/handle.go +++ b/bindinfo/handle.go @@ -41,7 +41,7 @@ import ( "github.com/pingcap/tidb/util/logutil" utilparser "github.com/pingcap/tidb/util/parser" "github.com/pingcap/tidb/util/sqlexec" - "github.com/pingcap/tidb/util/stmtsummary" + stmtsummaryv2 "github.com/pingcap/tidb/util/stmtsummary/v2" tablefilter "github.com/pingcap/tidb/util/table-filter" "github.com/pingcap/tidb/util/timeutil" "go.uber.org/zap" @@ -146,7 +146,7 @@ func (h *BindHandle) Update(fullLoad bool) (err error) { ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBindInfo) // No need to acquire the session context lock for ExecRestrictedSQL, it // uses another background session. - rows, _, err := exec.ExecRestrictedSQL(ctx, nil, `SELECT original_sql, bind_sql, default_db, status, create_time, update_time, charset, collation, source + rows, _, err := exec.ExecRestrictedSQL(ctx, nil, `SELECT original_sql, bind_sql, default_db, status, create_time, update_time, charset, collation, source, sql_digest, plan_digest FROM mysql.bind_info WHERE update_time > %? ORDER BY update_time, create_time`, updateTime) if err != nil { @@ -261,7 +261,7 @@ func (h *BindHandle) CreateBindRecord(sctx sessionctx.Context, record *BindRecor record.Bindings[i].UpdateTime = now // Insert the BindRecord to the storage. - _, err = exec.ExecuteInternal(ctx, `INSERT INTO mysql.bind_info VALUES (%?,%?, %?, %?, %?, %?, %?, %?, %?)`, + _, err = exec.ExecuteInternal(ctx, `INSERT INTO mysql.bind_info VALUES (%?,%?, %?, %?, %?, %?, %?, %?, %?, %?, %?)`, record.OriginalSQL, record.Bindings[i].BindSQL, record.Db, @@ -271,6 +271,8 @@ func (h *BindHandle) CreateBindRecord(sctx sessionctx.Context, record *BindRecor record.Bindings[i].Charset, record.Bindings[i].Collation, record.Bindings[i].Source, + record.Bindings[i].SQLDigest, + record.Bindings[i].PlanDigest, ) if err != nil { return err @@ -349,8 +351,18 @@ func (h *BindHandle) AddBindRecord(sctx sessionctx.Context, record *BindRecord) } record.Bindings[i].UpdateTime = now + if record.Bindings[i].SQLDigest == "" { + parser4binding := parser.New() + var originNode ast.StmtNode + originNode, err = parser4binding.ParseOneStmt(record.OriginalSQL, record.Bindings[i].Charset, record.Bindings[i].Collation) + if err != nil { + return err + } + _, sqlDigestWithDB := parser.NormalizeDigest(utilparser.RestoreWithDefaultDB(originNode, record.Db, record.OriginalSQL)) + record.Bindings[i].SQLDigest = sqlDigestWithDB.String() + } // Insert the BindRecord to the storage. - _, err = exec.ExecuteInternal(ctx, `INSERT INTO mysql.bind_info VALUES (%?, %?, %?, %?, %?, %?, %?, %?, %?)`, + _, err = exec.ExecuteInternal(ctx, `INSERT INTO mysql.bind_info VALUES (%?, %?, %?, %?, %?, %?, %?, %?, %?, %?, %?)`, record.OriginalSQL, record.Bindings[i].BindSQL, record.Db, @@ -360,6 +372,8 @@ func (h *BindHandle) AddBindRecord(sctx sessionctx.Context, record *BindRecord) record.Bindings[i].Charset, record.Bindings[i].Collation, record.Bindings[i].Source, + record.Bindings[i].SQLDigest, + record.Bindings[i].PlanDigest, ) if err != nil { return err @@ -423,6 +437,15 @@ func (h *BindHandle) DropBindRecord(originalSQL, db string, binding *Binding) (d return h.sctx.Context.GetSessionVars().StmtCtx.AffectedRows(), nil } +// DropBindRecordByDigest drop BindRecord to the storage and BindRecord int the cache. +func (h *BindHandle) DropBindRecordByDigest(sqlDigest string) (deletedRows uint64, err error) { + oldRecord, err := h.GetBindRecordBySQLDigest(sqlDigest) + if err != nil { + return 0, err + } + return h.DropBindRecord(oldRecord.OriginalSQL, strings.ToLower(oldRecord.Db), nil) +} + // SetBindRecordStatus set a BindRecord's status to the storage and bind cache. func (h *BindHandle) SetBindRecordStatus(originalSQL string, binding *Binding, newStatus string) (ok bool, err error) { h.bindInfo.Lock() @@ -510,6 +533,15 @@ func (h *BindHandle) SetBindRecordStatus(originalSQL string, binding *Binding, n return } +// SetBindRecordStatusByDigest set a BindRecord's status to the storage and bind cache. +func (h *BindHandle) SetBindRecordStatusByDigest(newStatus, sqlDigest string) (ok bool, err error) { + oldRecord, err := h.GetBindRecordBySQLDigest(sqlDigest) + if err != nil { + return false, err + } + return h.SetBindRecordStatus(oldRecord.OriginalSQL, nil, newStatus) +} + // GCBindRecord physically removes the deleted bind records in mysql.bind_info. func (h *BindHandle) GCBindRecord() (err error) { h.bindInfo.Lock() @@ -644,6 +676,11 @@ func (h *BindHandle) GetBindRecord(hash, normdOrigSQL, db string) *BindRecord { return h.bindInfo.Load().(*bindCache).GetBindRecord(hash, normdOrigSQL, db) } +// GetBindRecordBySQLDigest returns the BindRecord of the sql digest. +func (h *BindHandle) GetBindRecordBySQLDigest(sqlDigest string) (*BindRecord, error) { + return h.bindInfo.Load().(*bindCache).GetBindRecordBySQLDigest(sqlDigest) +} + // GetAllBindRecord returns all bind records in cache. func (h *BindHandle) GetAllBindRecord() (bindRecords []*BindRecord) { return h.bindInfo.Load().(*bindCache).GetAllBindRecords() @@ -680,6 +717,8 @@ func (h *BindHandle) newBindRecord(row chunk.Row) (string, *BindRecord, error) { Charset: row.GetString(6), Collation: row.GetString(7), Source: row.GetString(8), + SQLDigest: row.GetString(9), + PlanDigest: row.GetString(10), } bindRecord := &BindRecord{ OriginalSQL: row.GetString(0), @@ -853,7 +892,7 @@ func (h *BindHandle) CaptureBaselines() { parser4Capture := parser.New() captureFilter := h.extractCaptureFilterFromStorage() emptyCaptureFilter := captureFilter.isEmpty() - bindableStmts := stmtsummary.StmtSummaryByDigestMap.GetMoreThanCntBindableStmt(captureFilter.frequency) + bindableStmts := stmtsummaryv2.GetMoreThanCntBindableStmt(captureFilter.frequency) for _, bindableStmt := range bindableStmts { stmt, err := parser4Capture.ParseOneStmt(bindableStmt.Query, bindableStmt.Charset, bindableStmt.Collation) if err != nil { @@ -900,6 +939,7 @@ func (h *BindHandle) CaptureBaselines() { Charset: charset, Collation: collation, Source: Capture, + SQLDigest: digest.String(), } // We don't need to pass the `sctx` because the BindSQL has been validated already. err = h.CreateBindRecord(nil, &BindRecord{OriginalSQL: normalizedSQL, Db: dbName, Bindings: []Binding{binding}}) @@ -940,12 +980,12 @@ func getHintsForSQL(sctx sessionctx.Context, sql string) (string, error) { } // GenerateBindSQL generates binding sqls from stmt node and plan hints. -func GenerateBindSQL(ctx context.Context, stmtNode ast.StmtNode, planHint string, captured bool, defaultDB string) string { +func GenerateBindSQL(ctx context.Context, stmtNode ast.StmtNode, planHint string, skipCheckIfHasParam bool, defaultDB string) string { // If would be nil for very simple cases such as point get, we do not need to evolve for them. if planHint == "" { return "" } - if !captured { + if !skipCheckIfHasParam { paramChecker := ¶mMarkerChecker{} stmtNode.Accept(paramChecker) // We need to evolve on current sql, but we cannot restore values for paramMarkers yet, @@ -1121,6 +1161,7 @@ func (h *BindHandle) getRunningDuration(sctx sessionctx.Context, db, sql string, } ctx, cancelFunc := context.WithCancel(ctx) timer := time.NewTimer(maxTime) + defer timer.Stop() resultChan := make(chan error) startTime := time.Now() go runSQL(ctx, sctx, sql, resultChan) diff --git a/bindinfo/handle_test.go b/bindinfo/handle_test.go index 01ff0628feb5c..ffea398781f8b 100644 --- a/bindinfo/handle_test.go +++ b/bindinfo/handle_test.go @@ -107,7 +107,7 @@ func TestBindingLastUpdateTimeWithInvalidBind(t *testing.T) { require.Equal(t, updateTime0, "0000-00-00 00:00:00") tk.MustExec("insert into mysql.bind_info values('select * from `test` . `t`', 'select * from `test` . `t` use index(`idx`)', 'test', 'enabled', '2000-01-01 09:00:00', '2000-01-01 09:00:00', '', '','" + - bindinfo.Manual + "')") + bindinfo.Manual + "', '', '')") tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int)") @@ -137,8 +137,9 @@ func TestBindParse(t *testing.T) { charset := "utf8mb4" collation := "utf8mb4_bin" source := bindinfo.Manual - sql := fmt.Sprintf(`INSERT INTO mysql.bind_info(original_sql,bind_sql,default_db,status,create_time,update_time,charset,collation,source) VALUES ('%s', '%s', '%s', '%s', NOW(), NOW(),'%s', '%s', '%s')`, - originSQL, bindSQL, defaultDb, status, charset, collation, source) + mockDigest := "0f644e22c38ecc71d4592c52df127df7f86b6ca7f7c0ee899113b794578f9396" + sql := fmt.Sprintf(`INSERT INTO mysql.bind_info(original_sql,bind_sql,default_db,status,create_time,update_time,charset,collation,source, sql_digest, plan_digest) VALUES ('%s', '%s', '%s', '%s', NOW(), NOW(),'%s', '%s', '%s', '%s', '%s')`, + originSQL, bindSQL, defaultDb, status, charset, collation, source, mockDigest, mockDigest) tk.MustExec(sql) bindHandle := bindinfo.NewBindHandle(tk.Session()) err := bindHandle.Update(true) @@ -221,7 +222,7 @@ func TestEvolveInvalidBindings(t *testing.T) { tk.MustExec("create global binding for select * from t where a > 10 using select /*+ USE_INDEX(t) */ * from t where a > 10") // Manufacture a rejected binding by hacking mysql.bind_info. tk.MustExec("insert into mysql.bind_info values('select * from test . t where a > ?', 'SELECT /*+ USE_INDEX(t,idx_a) */ * FROM test.t WHERE a > 10', 'test', 'rejected', '2000-01-01 09:00:00', '2000-01-01 09:00:00', '', '','" + - bindinfo.Manual + "')") + bindinfo.Manual + "', '', '')") tk.MustQuery("select bind_sql, status from mysql.bind_info where source != 'builtin'").Sort().Check(testkit.Rows( "SELECT /*+ USE_INDEX(`t` )*/ * FROM `test`.`t` WHERE `a` > 10 enabled", "SELECT /*+ USE_INDEX(t,idx_a) */ * FROM test.t WHERE a > 10 rejected", @@ -242,6 +243,8 @@ func TestEvolveInvalidBindings(t *testing.T) { require.Equal(t, "SELECT /*+ USE_INDEX(t,idx_a) */ * FROM test.t WHERE a > 10", rows[1][1]) status = rows[1][3].(string) require.True(t, status == bindinfo.Enabled || status == bindinfo.Rejected) + _, sqlDigestWithDB := parser.NormalizeDigest("select * from test.t where a > 10") // test sqlDigest if exists after add columns to mysql.bind_info + require.Equal(t, rows[0][9], sqlDigestWithDB.String()) } func TestSetBindingStatus(t *testing.T) { @@ -319,9 +322,9 @@ func TestSetBindingStatusWithoutBindingInCache(t *testing.T) { // Simulate creating bindings on other machines tk.MustExec("insert into mysql.bind_info values('select * from `test` . `t` where `a` > ?', 'SELECT /*+ USE_INDEX(`t` `idx_a`)*/ * FROM `test`.`t` WHERE `a` > 10', 'test', 'deleted', '2000-01-01 09:00:00', '2000-01-01 09:00:00', '', '','" + - bindinfo.Manual + "')") + bindinfo.Manual + "', '', '')") tk.MustExec("insert into mysql.bind_info values('select * from `test` . `t` where `a` > ?', 'SELECT /*+ USE_INDEX(`t` `idx_a`)*/ * FROM `test`.`t` WHERE `a` > 10', 'test', 'enabled', '2000-01-02 09:00:00', '2000-01-02 09:00:00', '', '','" + - bindinfo.Manual + "')") + bindinfo.Manual + "', '', '')") dom.BindHandle().Clear() tk.MustExec("set binding disabled for select * from t where a > 10") tk.MustExec("admin reload bindings") @@ -334,9 +337,9 @@ func TestSetBindingStatusWithoutBindingInCache(t *testing.T) { // Simulate creating bindings on other machines tk.MustExec("insert into mysql.bind_info values('select * from `test` . `t` where `a` > ?', 'SELECT * FROM `test`.`t` WHERE `a` > 10', 'test', 'deleted', '2000-01-01 09:00:00', '2000-01-01 09:00:00', '', '','" + - bindinfo.Manual + "')") + bindinfo.Manual + "', '', '')") tk.MustExec("insert into mysql.bind_info values('select * from `test` . `t` where `a` > ?', 'SELECT * FROM `test`.`t` WHERE `a` > 10', 'test', 'disabled', '2000-01-02 09:00:00', '2000-01-02 09:00:00', '', '','" + - bindinfo.Manual + "')") + bindinfo.Manual + "', '', '')") dom.BindHandle().Clear() tk.MustExec("set binding enabled for select * from t where a > 10") tk.MustExec("admin reload bindings") diff --git a/bindinfo/session_handle.go b/bindinfo/session_handle.go index e6baebe3ea960..27b8168ef8e17 100644 --- a/bindinfo/session_handle.go +++ b/bindinfo/session_handle.go @@ -33,13 +33,12 @@ import ( // SessionHandle is used to handle all session sql bind operations. type SessionHandle struct { - ch *bindCache - parser *parser.Parser + ch *bindCache } // NewSessionBindHandle creates a new SessionBindHandle. -func NewSessionBindHandle(parser *parser.Parser) *SessionHandle { - sessionHandle := &SessionHandle{parser: parser} +func NewSessionBindHandle() *SessionHandle { + sessionHandle := &SessionHandle{} sessionHandle.ch = newBindCache() return sessionHandle } @@ -98,11 +97,25 @@ func (h *SessionHandle) DropBindRecord(originalSQL, db string, binding *Binding) return nil } +// DropBindRecordByDigest drop BindRecord in the cache. +func (h *SessionHandle) DropBindRecordByDigest(sqlDigest string) error { + oldRecord, err := h.GetBindRecordBySQLDigest(sqlDigest) + if err != nil { + return err + } + return h.DropBindRecord(oldRecord.OriginalSQL, strings.ToLower(oldRecord.Db), nil) +} + // GetBindRecord return the BindMeta of the (normdOrigSQL,db) if BindMeta exist. func (h *SessionHandle) GetBindRecord(hash, normdOrigSQL, db string) *BindRecord { return h.ch.GetBindRecord(hash, normdOrigSQL, db) } +// GetBindRecordBySQLDigest return all BindMeta corresponding to sqlDigest. +func (h *SessionHandle) GetBindRecordBySQLDigest(sqlDigest string) (*BindRecord, error) { + return h.ch.GetBindRecordBySQLDigest(sqlDigest) +} + // GetAllBindRecord return all session bind info. func (h *SessionHandle) GetAllBindRecord() (bindRecords []*BindRecord) { return h.ch.GetAllBindRecords() diff --git a/bindinfo/session_handle_test.go b/bindinfo/session_handle_test.go index a60f8ff41cd12..a9b05c03eda18 100644 --- a/bindinfo/session_handle_test.go +++ b/bindinfo/session_handle_test.go @@ -219,7 +219,7 @@ func TestBaselineDBLowerCase(t *testing.T) { // Simulate existing bindings with upper case default_db. tk.MustExec("insert into mysql.bind_info values('select * from `spm` . `t`', 'select * from `spm` . `t`', 'SPM', 'enabled', '2000-01-01 09:00:00', '2000-01-01 09:00:00', '', '','" + - bindinfo.Manual + "')") + bindinfo.Manual + "', '', '')") tk.MustQuery("select original_sql, default_db from mysql.bind_info where original_sql = 'select * from `spm` . `t`'").Check(testkit.Rows( "select * from `spm` . `t` SPM", )) @@ -237,7 +237,7 @@ func TestBaselineDBLowerCase(t *testing.T) { utilCleanBindingEnv(tk, dom) // Simulate existing bindings with upper case default_db. tk.MustExec("insert into mysql.bind_info values('select * from `spm` . `t`', 'select * from `spm` . `t`', 'SPM', 'enabled', '2000-01-01 09:00:00', '2000-01-01 09:00:00', '', '','" + - bindinfo.Manual + "')") + bindinfo.Manual + "', '', '')") tk.MustQuery("select original_sql, default_db from mysql.bind_info where original_sql = 'select * from `spm` . `t`'").Check(testkit.Rows( "select * from `spm` . `t` SPM", )) @@ -274,13 +274,13 @@ func TestShowGlobalBindings(t *testing.T) { require.Len(t, rows, 0) // Simulate existing bindings in the mysql.bind_info. tk.MustExec("insert into mysql.bind_info values('select * from `spm` . `t`', 'select * from `spm` . `t` USE INDEX (`a`)', 'SPM', 'enabled', '2000-01-01 09:00:00', '2000-01-01 09:00:00', '', '','" + - bindinfo.Manual + "')") + bindinfo.Manual + "', '', '')") tk.MustExec("insert into mysql.bind_info values('select * from `spm` . `t0`', 'select * from `spm` . `t0` USE INDEX (`a`)', 'SPM', 'enabled', '2000-01-02 09:00:00', '2000-01-02 09:00:00', '', '','" + - bindinfo.Manual + "')") + bindinfo.Manual + "', '', '')") tk.MustExec("insert into mysql.bind_info values('select * from `spm` . `t`', 'select /*+ use_index(`t` `a`)*/ * from `spm` . `t`', 'SPM', 'enabled', '2000-01-03 09:00:00', '2000-01-03 09:00:00', '', '','" + - bindinfo.Manual + "')") + bindinfo.Manual + "', '', '')") tk.MustExec("insert into mysql.bind_info values('select * from `spm` . `t0`', 'select /*+ use_index(`t0` `a`)*/ * from `spm` . `t0`', 'SPM', 'enabled', '2000-01-04 09:00:00', '2000-01-04 09:00:00', '', '','" + - bindinfo.Manual + "')") + bindinfo.Manual + "', '', '')") tk.MustExec("admin reload bindings") rows = tk.MustQuery("show global bindings").Rows() require.Len(t, rows, 4) @@ -521,3 +521,14 @@ func TestPreparedStmt(t *testing.T) { require.Len(t, tk.Session().GetSessionVars().StmtCtx.IndexNames, 1) require.Equal(t, "t:idx_c", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) } + +func TestSetVarBinding(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t1 (a int, b varchar(20))") + tk.MustExec("insert into t1 values (1, '111111111111111')") + tk.MustExec("insert into t1 values (2, '222222222222222')") + tk.MustExec("create binding for select group_concat(b) from test.t1 using select /*+ SET_VAR(group_concat_max_len = 4) */ group_concat(b) from test.t1 ;") + tk.MustQuery("select group_concat(b) from test.t1").Check(testkit.Rows("1111")) +} diff --git a/br/COMPATIBILITY_TEST.md b/br/COMPATIBILITY_TEST.md index b5580835baee8..44984ebcd2bfa 100644 --- a/br/COMPATIBILITY_TEST.md +++ b/br/COMPATIBILITY_TEST.md @@ -3,7 +3,7 @@ ## Background We had some incompatibility issues in the past, which made BR cannot restore backed up data in some situations. -So we need a test workflow to check the compatiblity. +So we need a test workflow to check the compatibility. ## Goal diff --git a/br/cmd/br/restore.go b/br/cmd/br/restore.go index 5f91bee91c6a9..e826df0e59e77 100644 --- a/br/cmd/br/restore.go +++ b/br/cmd/br/restore.go @@ -199,6 +199,5 @@ func newStreamRestoreCommand() *cobra.Command { } task.DefineFilterFlags(command, filterOutSysAndMemTables, true) task.DefineStreamRestoreFlags(command) - command.Hidden = true return command } diff --git a/br/cmd/tidb-lightning-ctl/main.go b/br/cmd/tidb-lightning-ctl/main.go index 4dc70af929083..b0d20ae813734 100644 --- a/br/cmd/tidb-lightning-ctl/main.go +++ b/br/cmd/tidb-lightning-ctl/main.go @@ -88,7 +88,7 @@ func run() error { if err != nil { return err } - if err = cfg.TiDB.Security.RegisterMySQL(); err != nil { + if err = cfg.TiDB.Security.BuildTLSConfig(); err != nil { return err } diff --git a/br/pkg/aws/BUILD.bazel b/br/pkg/aws/BUILD.bazel index 6f33637abc5f3..2930569987d8b 100644 --- a/br/pkg/aws/BUILD.bazel +++ b/br/pkg/aws/BUILD.bazel @@ -23,7 +23,13 @@ go_library( go_test( name = "aws_test", + timeout = "short", srcs = ["ebs_test.go"], embed = [":aws"], - deps = ["@com_github_stretchr_testify//require"], + flaky = True, + deps = [ + "@com_github_aws_aws_sdk_go//aws", + "@com_github_aws_aws_sdk_go//service/ec2", + "@com_github_stretchr_testify//require", + ], ) diff --git a/br/pkg/aws/ebs.go b/br/pkg/aws/ebs.go index 9ded291e1f9b9..fb96b95578ffb 100644 --- a/br/pkg/aws/ebs.go +++ b/br/pkg/aws/ebs.go @@ -307,17 +307,9 @@ func (e *EC2Session) WaitVolumesCreated(volumeIDMap map[string]string, progress return 0, errors.Trace(err) } - var unfinishedVolumes []*string - for _, volume := range resp.Volumes { - if *volume.State == ec2.VolumeStateAvailable { - log.Info("volume is available", zap.String("id", *volume.SnapshotId)) - totalVolumeSize += *volume.Size - progress.Inc() - } else { - log.Debug("volume creating...", zap.Stringer("volume", volume)) - unfinishedVolumes = append(unfinishedVolumes, volume.SnapshotId) - } - } + createdVolumeSize, unfinishedVolumes := e.HandleDescribeVolumesResponse(resp) + progress.IncBy(int64(len(pendingVolumes) - len(unfinishedVolumes))) + totalVolumeSize += createdVolumeSize pendingVolumes = unfinishedVolumes } log.Info("all pending volume are created.") @@ -357,3 +349,20 @@ func (e *EC2Session) DeleteVolumes(volumeIDMap map[string]string) { func ec2Tag(key, val string) *ec2.Tag { return &ec2.Tag{Key: &key, Value: &val} } + +func (e *EC2Session) HandleDescribeVolumesResponse(resp *ec2.DescribeVolumesOutput) (int64, []*string) { + totalVolumeSize := int64(0) + + var unfinishedVolumes []*string + for _, volume := range resp.Volumes { + if *volume.State == ec2.VolumeStateAvailable { + log.Info("volume is available", zap.String("id", *volume.VolumeId)) + totalVolumeSize += *volume.Size + } else { + log.Debug("volume creating...", zap.Stringer("volume", volume)) + unfinishedVolumes = append(unfinishedVolumes, volume.VolumeId) + } + } + + return totalVolumeSize, unfinishedVolumes +} diff --git a/br/pkg/aws/ebs_test.go b/br/pkg/aws/ebs_test.go index 695f31a73c477..d7f3be2a4a4a1 100644 --- a/br/pkg/aws/ebs_test.go +++ b/br/pkg/aws/ebs_test.go @@ -16,26 +16,63 @@ package aws import ( "testing" + awsapi "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/ec2" "github.com/stretchr/testify/require" ) func TestEC2SessionExtractSnapProgress(t *testing.T) { - strPtr := func(s string) *string { - return &s - } tests := []struct { str *string want int64 }{ {nil, 0}, - {strPtr("12.12%"), 12}, - {strPtr("44.99%"), 44}, - {strPtr(" 89.89% "), 89}, - {strPtr("100%"), 100}, - {strPtr("111111%"), 100}, + {awsapi.String("12.12%"), 12}, + {awsapi.String("44.99%"), 44}, + {awsapi.String(" 89.89% "), 89}, + {awsapi.String("100%"), 100}, + {awsapi.String("111111%"), 100}, } e := &EC2Session{} for _, tt := range tests { require.Equal(t, tt.want, e.extractSnapProgress(tt.str)) } } + +func createVolume(snapshotId string, volumeId string, state string) *ec2.Volume { + return &ec2.Volume{ + Attachments: nil, + AvailabilityZone: awsapi.String("us-west-2"), + CreateTime: nil, + Encrypted: awsapi.Bool(true), + FastRestored: awsapi.Bool(true), + Iops: awsapi.Int64(3000), + KmsKeyId: nil, + MultiAttachEnabled: awsapi.Bool(true), + OutpostArn: awsapi.String("arn:12342"), + Size: awsapi.Int64(1), + SnapshotId: awsapi.String(snapshotId), + State: awsapi.String(state), + Tags: nil, + Throughput: nil, + VolumeId: awsapi.String(volumeId), + VolumeType: awsapi.String("gp3"), + } +} +func TestHandleDescribeVolumesResponse(t *testing.T) { + curentVolumesStates := &ec2.DescribeVolumesOutput{ + NextToken: awsapi.String("fake token"), + Volumes: []*ec2.Volume{ + createVolume("snap-0873674883", "vol-98768979", "available"), + createVolume("snap-0873674883", "vol-98768979", "creating"), + createVolume("snap-0873674883", "vol-98768979", "available"), + createVolume("snap-0873674883", "vol-98768979", "available"), + createVolume("snap-0873674883", "vol-98768979", "available"), + }, + } + + e := &EC2Session{} + createdVolumeSize, unfinishedVolumes := e.HandleDescribeVolumesResponse(curentVolumesStates) + require.Equal(t, int64(4), createdVolumeSize) + require.Equal(t, 1, len(unfinishedVolumes)) +} diff --git a/br/pkg/backup/BUILD.bazel b/br/pkg/backup/BUILD.bazel index c8cad292f4607..9f8e01f96007e 100644 --- a/br/pkg/backup/BUILD.bazel +++ b/br/pkg/backup/BUILD.bazel @@ -12,6 +12,7 @@ go_library( importpath = "github.com/pingcap/tidb/br/pkg/backup", visibility = ["//visibility:public"], deps = [ + "//br/pkg/checkpoint", "//br/pkg/checksum", "//br/pkg/conn", "//br/pkg/conn/util", @@ -28,7 +29,6 @@ go_library( "//distsql", "//kv", "//meta", - "//meta/autoid", "//parser/model", "//statistics/handle", "//util", diff --git a/br/pkg/backup/client.go b/br/pkg/backup/client.go index 6ce3d24b0e209..7718d6d33986c 100644 --- a/br/pkg/backup/client.go +++ b/br/pkg/backup/client.go @@ -3,11 +3,14 @@ package backup import ( + "bytes" "context" + "encoding/base64" "encoding/hex" "encoding/json" "fmt" "io" + "math/rand" "os" "strings" "sync" @@ -21,6 +24,7 @@ import ( "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/log" + "github.com/pingcap/tidb/br/pkg/checkpoint" "github.com/pingcap/tidb/br/pkg/conn" connutil "github.com/pingcap/tidb/br/pkg/conn/util" berrors "github.com/pingcap/tidb/br/pkg/errors" @@ -36,7 +40,6 @@ import ( "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/codec" @@ -90,18 +93,31 @@ type Client struct { backend *backuppb.StorageBackend apiVersion kvrpcpb.APIVersion + cipher *backuppb.CipherInfo + checkpointMeta *checkpoint.CheckpointMetadata + checkpointRunner *checkpoint.CheckpointRunner + gcTTL int64 } // NewBackupClient returns a new backup client. -func NewBackupClient(ctx context.Context, mgr ClientMgr) (*Client, error) { +func NewBackupClient(ctx context.Context, mgr ClientMgr) *Client { log.Info("new backup client") pdClient := mgr.GetPDClient() clusterID := pdClient.GetClusterID(ctx) return &Client{ clusterID: clusterID, mgr: mgr, - }, nil + + cipher: nil, + checkpointMeta: nil, + checkpointRunner: nil, + } +} + +// SetCipher for checkpoint to encrypt sst file's metadata +func (bc *Client) SetCipher(cipher *backuppb.CipherInfo) { + bc.cipher = cipher } // GetTS gets a new timestamp from PD. @@ -120,6 +136,11 @@ func (bc *Client) GetTS(ctx context.Context, duration time.Duration, ts uint64) backupTS uint64 err error ) + + if bc.checkpointMeta != nil { + log.Info("reuse checkpoint BackupTS", zap.Uint64("backup-ts", bc.checkpointMeta.BackupTS)) + return bc.checkpointMeta.BackupTS, nil + } if ts > 0 { backupTS = ts } else { @@ -160,6 +181,15 @@ func (bc *Client) SetLockFile(ctx context.Context) error { "This file exists to remind other backup jobs won't use this path")) } +// GetSafePointID get the gc-safe-point's service-id from either checkpoint or immediate generation +func (bc *Client) GetSafePointID() string { + if bc.checkpointMeta != nil { + log.Info("reuse the checkpoint gc-safepoint service id", zap.String("service-id", bc.checkpointMeta.GCServiceId)) + return bc.checkpointMeta.GCServiceId + } + return utils.MakeSafePointID() +} + // SetGCTTL set gcTTL for client. func (bc *Client) SetGCTTL(ttl int64) { if ttl <= 0 { @@ -204,13 +234,145 @@ func (bc *Client) SetStorageAndCheckNotInUse( "there may be some backup files in the path already, "+ "please specify a correct backup directory!", bc.storage.URI()+"/"+metautil.MetaFile) } - err = CheckBackupStorageIsLocked(ctx, bc.storage) + // use checkpoint mode if checkpoint meta exists + exist, err = bc.storage.FileExists(ctx, checkpoint.CheckpointMetaPath) if err != nil { - return err + return errors.Annotatef(err, "error occurred when checking %s file", checkpoint.CheckpointMetaPath) } + + // if there is no checkpoint meta, then checkpoint mode is not used + // or it is the first execution + if exist { + // load the config's hash to keep the config unchanged. + log.Info("load the checkpoint meta, so the existence of lockfile is allowed.") + bc.checkpointMeta, err = checkpoint.LoadCheckpointMetadata(ctx, bc.storage) + if err != nil { + return errors.Annotatef(err, "error occurred when loading %s file", checkpoint.CheckpointMetaPath) + } + } else { + err = CheckBackupStorageIsLocked(ctx, bc.storage) + if err != nil { + return err + } + } + return nil } +// CheckCheckpoint check whether the configs are the same +func (bc *Client) CheckCheckpoint(hash []byte) error { + if bc.checkpointMeta != nil && !bytes.Equal(bc.checkpointMeta.ConfigHash, hash) { + return errors.Annotatef(berrors.ErrInvalidArgument, "failed to backup to %v, "+ + "because the checkpoint mode is used, "+ + "but the hashs of the configs are not the same. Please check the config", + bc.storage.URI(), + ) + } + + // first execution or not using checkpoint mode yet + // or using the same config can pass the check + return nil +} + +func (bc *Client) GetCheckpointRunner() *checkpoint.CheckpointRunner { + return bc.checkpointRunner +} + +// StartCheckpointMeta will +// 1. saves the initial status into the external storage; +// 2. load the checkpoint data from external storage +// 3. start checkpoint runner +func (bc *Client) StartCheckpointRunner( + ctx context.Context, + cfgHash []byte, + backupTS uint64, + ranges []rtree.Range, + safePointID string, + progressCallBack func(ProgressUnit), +) (err error) { + if bc.checkpointMeta == nil { + bc.checkpointMeta = &checkpoint.CheckpointMetadata{ + GCServiceId: safePointID, + ConfigHash: cfgHash, + BackupTS: backupTS, + Ranges: ranges, + } + + // sync the checkpoint meta to the external storage at first + if err := checkpoint.SaveCheckpointMetadata(ctx, bc.storage, bc.checkpointMeta); err != nil { + return errors.Trace(err) + } + } else { + // otherwise, the checkpoint meta is loaded from the external storage, + // no need to save it again + // besides, there are exist checkpoint data need to be loaded before start checkpoint runner + bc.checkpointMeta.CheckpointDataMap, err = bc.loadCheckpointRanges(ctx, progressCallBack) + if err != nil { + return errors.Trace(err) + } + } + + bc.checkpointRunner, err = checkpoint.StartCheckpointRunner(ctx, bc.storage, bc.cipher, bc.mgr.GetPDClient()) + return errors.Trace(err) +} + +func (bc *Client) WaitForFinishCheckpoint(ctx context.Context) { + if bc.checkpointRunner != nil { + bc.checkpointRunner.WaitForFinish(ctx) + } +} + +// GetProgressRange loads the checkpoint(finished) sub-ranges of the current range, and calculate its incompleted sub-ranges. +func (bc *Client) GetProgressRange(r rtree.Range) (*rtree.ProgressRange, error) { + // use groupKey to distinguish different ranges + groupKey := base64.URLEncoding.EncodeToString(r.StartKey) + if bc.checkpointMeta != nil && len(bc.checkpointMeta.CheckpointDataMap) > 0 { + rangeTree, exists := bc.checkpointMeta.CheckpointDataMap[groupKey] + if exists { + incomplete := rangeTree.GetIncompleteRange(r.StartKey, r.EndKey) + delete(bc.checkpointMeta.CheckpointDataMap, groupKey) + return &rtree.ProgressRange{ + Res: rangeTree, + Incomplete: incomplete, + Origin: r, + GroupKey: groupKey, + }, nil + } + } + + // the origin range are not recorded in checkpoint + // return the default progress range + return &rtree.ProgressRange{ + Res: rtree.NewRangeTree(), + Incomplete: []rtree.Range{ + r, + }, + Origin: r, + GroupKey: groupKey, + }, nil +} + +// LoadCheckpointRange loads the checkpoint(finished) sub-ranges of the current range, and calculate its incompleted sub-ranges. +func (bc *Client) loadCheckpointRanges(ctx context.Context, progressCallBack func(ProgressUnit)) (map[string]rtree.RangeTree, error) { + rangeDataMap := make(map[string]rtree.RangeTree) + + pastDureTime, err := checkpoint.WalkCheckpointFile(ctx, bc.storage, bc.cipher, func(groupKey string, rg *rtree.Range) { + rangeTree, exists := rangeDataMap[groupKey] + if !exists { + rangeTree = rtree.NewRangeTree() + rangeDataMap[groupKey] = rangeTree + } + rangeTree.Put(rg.StartKey, rg.EndKey, rg.Files) + progressCallBack(RegionUnit) + }) + + // we should adjust start-time of the summary to `pastDureTime` earlier + log.Info("past cost time", zap.Duration("cost", pastDureTime)) + summary.AdjustStartTimeToEarlierTime(pastDureTime) + + return rangeDataMap, errors.Trace(err) +} + // SetStorage sets ExternalStorage for client. func (bc *Client) SetStorage( ctx context.Context, @@ -239,6 +401,22 @@ func (bc *Client) SetApiVersion(v kvrpcpb.APIVersion) { bc.apiVersion = v } +// Client.BuildBackupRangeAndSchema calls BuildBackupRangeAndSchema, +// if the checkpoint mode is used, return the ranges from checkpoint meta +func (bc *Client) BuildBackupRangeAndSchema( + storage kv.Storage, + tableFilter filter.Filter, + backupTS uint64, + isFullBackup bool, +) ([]rtree.Range, *Schemas, []*backuppb.PlacementPolicy, error) { + if bc.checkpointMeta == nil { + return BuildBackupRangeAndSchema(storage, tableFilter, backupTS, isFullBackup, true) + } + _, schemas, policies, err := BuildBackupRangeAndSchema(storage, tableFilter, backupTS, isFullBackup, false) + schemas.SetCheckpointChecksum(bc.checkpointMeta.CheckpointChecksum) + return bc.checkpointMeta.Ranges, schemas, policies, errors.Trace(err) +} + // CheckBackupStorageIsLocked checks whether backups is locked. // which means we found other backup progress already write // some data files into the same backup directory or cloud prefix. @@ -252,7 +430,7 @@ func CheckBackupStorageIsLocked(ctx context.Context, s storage.ExternalStorage) // should return error to break the walkDir when found lock file and other .sst files. if strings.HasSuffix(path, ".sst") { return errors.Annotatef(berrors.ErrInvalidArgument, "backup lock file and sst file exist in %v, "+ - "there are some backup files in the path already, "+ + "there are some backup files in the path already, but hasn't checkpoint metadata, "+ "please specify a correct backup directory!", s.URI()+"/"+metautil.LockFile) } return nil @@ -290,10 +468,12 @@ func appendRanges(tbl *model.TableInfo, tblID int64) ([]kv.KeyRange, error) { ranges = ranger.FullIntRange(false) } + retRanges := make([]kv.KeyRange, 0, 1+len(tbl.Indices)) kvRanges, err := distsql.TableHandleRangesToKVRanges(nil, []int64{tblID}, tbl.IsCommonHandle, ranges, nil) if err != nil { return nil, errors.Trace(err) } + retRanges = kvRanges.AppendSelfTo(retRanges) for _, index := range tbl.Indices { if index.State != model.StatePublic { @@ -304,9 +484,9 @@ func appendRanges(tbl *model.TableInfo, tblID int64) ([]kv.KeyRange, error) { if err != nil { return nil, errors.Trace(err) } - kvRanges = append(kvRanges, idxRanges...) + retRanges = idxRanges.AppendSelfTo(retRanges) } - return kvRanges, nil + return retRanges, nil } // BuildBackupRangeAndSchema gets KV range and schema of tables. @@ -317,6 +497,7 @@ func BuildBackupRangeAndSchema( tableFilter filter.Filter, backupTS uint64, isFullBackup bool, + buildRange bool, ) ([]rtree.Range, *Schemas, []*backuppb.PlacementPolicy, error) { snapshot := storage.GetSnapshot(kv.NewVersion(backupTS)) m := meta.NewSnapshotMeta(snapshot) @@ -348,7 +529,7 @@ func BuildBackupRangeAndSchema( for _, dbInfo := range dbs { // skip system databases - if !tableFilter.MatchSchema(dbInfo.Name.O) || util.IsMemDB(dbInfo.Name.L) { + if !tableFilter.MatchSchema(dbInfo.Name.O) || util.IsMemDB(dbInfo.Name.L) || utils.IsTemplateSysDB(dbInfo.Name) { continue } @@ -375,29 +556,26 @@ func BuildBackupRangeAndSchema( continue } - logger := log.With( + logger := log.L().With( zap.String("db", dbInfo.Name.O), zap.String("table", tableInfo.Name.O), ) - tblVer := autoid.AllocOptionTableInfoVersion(tableInfo.Version) - idAlloc := autoid.NewAllocator(storage, dbInfo.ID, tableInfo.ID, false, autoid.RowIDAllocType, tblVer) - seqAlloc := autoid.NewAllocator(storage, dbInfo.ID, tableInfo.ID, false, autoid.SequenceType, tblVer) - randAlloc := autoid.NewAllocator(storage, dbInfo.ID, tableInfo.ID, false, autoid.AutoRandomType, tblVer) + autoIDAccess := m.GetAutoIDAccessors(dbInfo.ID, tableInfo.ID) var globalAutoID int64 switch { case tableInfo.IsSequence(): - globalAutoID, err = seqAlloc.NextGlobalAutoID() + globalAutoID, err = autoIDAccess.SequenceValue().Get() case tableInfo.IsView() || !utils.NeedAutoID(tableInfo): // no auto ID for views or table without either rowID nor auto_increment ID. default: - globalAutoID, err = idAlloc.NextGlobalAutoID() + globalAutoID, err = autoIDAccess.RowID().Get() } if err != nil { return nil, nil, nil, errors.Trace(err) } - tableInfo.AutoIncID = globalAutoID + tableInfo.AutoIncID = globalAutoID + 1 if !isFullBackup { // according to https://github.com/pingcap/tidb/issues/32290. // ignore placement policy when not in full backup @@ -410,11 +588,11 @@ func BuildBackupRangeAndSchema( if tableInfo.PKIsHandle && tableInfo.ContainsAutoRandomBits() { // this table has auto_random id, we need backup and rebase in restoration var globalAutoRandID int64 - globalAutoRandID, err = randAlloc.NextGlobalAutoID() + globalAutoRandID, err = autoIDAccess.RandomID().Get() if err != nil { return nil, nil, nil, errors.Trace(err) } - tableInfo.AutoRandID = globalAutoRandID + tableInfo.AutoRandID = globalAutoRandID + 1 logger.Debug("change table AutoRandID", zap.Int64("AutoRandID", globalAutoRandID)) } @@ -433,15 +611,17 @@ func BuildBackupRangeAndSchema( backupSchemas.AddSchema(dbInfo, tableInfo) - tableRanges, err := BuildTableRanges(tableInfo) - if err != nil { - return nil, nil, nil, errors.Trace(err) - } - for _, r := range tableRanges { - ranges = append(ranges, rtree.Range{ - StartKey: r.StartKey, - EndKey: r.EndKey, - }) + if buildRange { + tableRanges, err := BuildTableRanges(tableInfo) + if err != nil { + return nil, nil, nil, errors.Trace(err) + } + for _, r := range tableRanges { + ranges = append(ranges, rtree.Range{ + StartKey: r.StartKey, + EndKey: r.EndKey, + }) + } } } } @@ -579,6 +759,7 @@ func (bc *Client) BackupRanges( ranges []rtree.Range, request backuppb.BackupRequest, concurrency uint, + replicaReadLabel map[string]string, metaWriter *metautil.MetaWriter, progressCallBack func(ProgressUnit), ) error { @@ -602,10 +783,13 @@ func (bc *Client) BackupRanges( id := id req := request req.StartKey, req.EndKey = r.StartKey, r.EndKey - + pr, err := bc.GetProgressRange(r) + if err != nil { + return errors.Trace(err) + } workerPool.ApplyOnErrorGroup(eg, func() error { elctx := logutil.ContextWithField(ectx, logutil.RedactAny("range-sn", id)) - err := bc.BackupRange(elctx, req, metaWriter, progressCallBack) + err := bc.BackupRange(elctx, req, replicaReadLabel, pr, metaWriter, progressCallBack) if err != nil { // The error due to context cancel, stack trace is meaningless, the stack shall be suspended (also clear) if errors.Cause(err) == context.Canceled { @@ -616,6 +800,7 @@ func (bc *Client) BackupRanges( return nil }) } + return eg.Wait() } @@ -623,7 +808,9 @@ func (bc *Client) BackupRanges( // Returns an array of files backed up. func (bc *Client) BackupRange( ctx context.Context, - req backuppb.BackupRequest, + request backuppb.BackupRequest, + replicaReadLabel map[string]string, + progressRange *rtree.ProgressRange, metaWriter *metautil.MetaWriter, progressCallBack func(ProgressUnit), ) (err error) { @@ -631,54 +818,92 @@ func (bc *Client) BackupRange( defer func() { elapsed := time.Since(start) logutil.CL(ctx).Info("backup range completed", - logutil.Key("startKey", req.StartKey), logutil.Key("endKey", req.EndKey), + logutil.Key("startKey", progressRange.Origin.StartKey), logutil.Key("endKey", progressRange.Origin.EndKey), zap.Duration("take", elapsed)) - key := "range start:" + hex.EncodeToString(req.StartKey) + " end:" + hex.EncodeToString(req.EndKey) + key := "range start:" + hex.EncodeToString(progressRange.Origin.StartKey) + " end:" + hex.EncodeToString(progressRange.Origin.EndKey) if err != nil { summary.CollectFailureUnit(key, err) } }() logutil.CL(ctx).Info("backup range started", - logutil.Key("startKey", req.StartKey), logutil.Key("endKey", req.EndKey), - zap.Uint64("rateLimit", req.RateLimit), - zap.Uint32("concurrency", req.Concurrency)) + logutil.Key("startKey", progressRange.Origin.StartKey), logutil.Key("endKey", progressRange.Origin.EndKey), + zap.Uint64("rateLimit", request.RateLimit), + zap.Uint32("concurrency", request.Concurrency)) - var allStores []*metapb.Store - allStores, err = conn.GetAllTiKVStoresWithRetry(ctx, bc.mgr.GetPDClient(), connutil.SkipTiFlash) + allStores, err := conn.GetAllTiKVStoresWithRetry(ctx, bc.mgr.GetPDClient(), connutil.SkipTiFlash) if err != nil { return errors.Trace(err) } + var targetStores []*metapb.Store + targetStoreIds := make(map[uint64]struct{}) + if len(replicaReadLabel) == 0 { + targetStores = allStores // send backup push down request to all stores + } else { + for _, store := range allStores { + for _, label := range store.Labels { + if val, ok := replicaReadLabel[label.Key]; ok && val == label.Value { + targetStores = append(targetStores, store) // send backup push down request to stores that match replica read label + targetStoreIds[store.GetId()] = struct{}{} // record store id for fine grained backup + } + } + } + } + if len(replicaReadLabel) > 0 && len(targetStores) == 0 { + return errors.Errorf("no store matches replica read label: %v", replicaReadLabel) + } logutil.CL(ctx).Info("backup push down started") - push := newPushDown(bc.mgr, len(allStores)) - results, err := push.pushBackup(ctx, req, allStores, progressCallBack) - if err != nil { - return errors.Trace(err) + // either the `incomplete` is origin range itself, + // or the `incomplete` is sub-ranges split by checkpoint of origin range + if len(progressRange.Incomplete) > 0 { + // don't make the origin request dirty, + // since fineGrainedBackup need to use it. + req := request + if len(progressRange.Incomplete) > 1 { + subRanges := make([]*kvrpcpb.KeyRange, 0, len(progressRange.Incomplete)) + for _, r := range progressRange.Incomplete { + subRanges = append(subRanges, &kvrpcpb.KeyRange{ + StartKey: r.StartKey, + EndKey: r.EndKey, + }) + } + req.SubRanges = subRanges + } else { + // compatible with older version of TiKV + req.StartKey = progressRange.Incomplete[0].StartKey + req.EndKey = progressRange.Incomplete[0].EndKey + } + + push := newPushDown(bc.mgr, len(targetStores)) + err = push.pushBackup(ctx, req, progressRange, targetStores, bc.checkpointRunner, progressCallBack) + if err != nil { + return errors.Trace(err) + } } - logutil.CL(ctx).Info("backup push down completed", zap.Int("small-range-count", results.Len())) + logutil.CL(ctx).Info("backup push down completed", zap.Int("small-range-count", progressRange.Res.Len())) // Find and backup remaining ranges. // TODO: test fine grained backup. - if err := bc.fineGrainedBackup(ctx, req, results, progressCallBack); err != nil { + if err := bc.fineGrainedBackup(ctx, request, targetStoreIds, progressRange, progressCallBack); err != nil { return errors.Trace(err) } // update progress of range unit progressCallBack(RangeUnit) - if req.IsRawKv { + if request.IsRawKv { logutil.CL(ctx).Info("raw ranges backed up", - logutil.Key("startKey", req.StartKey), - logutil.Key("endKey", req.EndKey), - zap.String("cf", req.Cf)) + logutil.Key("startKey", progressRange.Origin.StartKey), + logutil.Key("endKey", progressRange.Origin.EndKey), + zap.String("cf", request.Cf)) } else { logutil.CL(ctx).Info("transactional range backup completed", - zap.Reflect("StartTS", req.StartVersion), - zap.Reflect("EndTS", req.EndVersion)) + zap.Reflect("StartTS", request.StartVersion), + zap.Reflect("EndTS", request.EndVersion)) } var ascendErr error - results.Ascend(func(i btree.Item) bool { + progressRange.Res.Ascend(func(i btree.Item) bool { r := i.(*rtree.Range) for _, f := range r.Files { summary.CollectSuccessUnit(summary.TotalKV, 1, f.TotalKvs) @@ -697,12 +922,12 @@ func (bc *Client) BackupRange( } // Check if there are duplicated files. - checkDupFiles(&results) + checkDupFiles(&progressRange.Res) return nil } -func (bc *Client) findRegionLeader(ctx context.Context, key []byte, isRawKv bool) (*metapb.Peer, error) { +func (bc *Client) findTargetPeer(ctx context.Context, key []byte, isRawKv bool, targetStoreIds map[uint64]struct{}) (*metapb.Peer, error) { // Keys are saved in encoded format in TiKV, so the key must be encoded // in order to find the correct region. key = codec.EncodeBytesExt([]byte{}, key, isRawKv) @@ -710,27 +935,47 @@ func (bc *Client) findRegionLeader(ctx context.Context, key []byte, isRawKv bool // better backoff. region, err := bc.mgr.GetPDClient().GetRegion(ctx, key) if err != nil || region == nil { - log.Error("find leader failed", zap.Error(err), zap.Reflect("region", region)) + log.Error("find region failed", zap.Error(err), zap.Reflect("region", region)) time.Sleep(time.Millisecond * time.Duration(100*i)) continue } - if region.Leader != nil { - log.Info("find leader", - zap.Reflect("Leader", region.Leader), logutil.Key("key", key)) - return region.Leader, nil + if len(targetStoreIds) == 0 { + if region.Leader != nil { + log.Info("find leader", + zap.Reflect("Leader", region.Leader), logutil.Key("key", key)) + return region.Leader, nil + } + } else { + candidates := make([]*metapb.Peer, 0, len(region.Meta.Peers)) + for _, peer := range region.Meta.Peers { + if _, ok := targetStoreIds[peer.StoreId]; ok { + candidates = append(candidates, peer) + } + } + if len(candidates) > 0 { + peer := candidates[rand.Intn(len(candidates))] + log.Info("find target peer for backup", + zap.Reflect("Peer", peer), logutil.Key("key", key)) + return peer, nil + } } - log.Warn("no region found", logutil.Key("key", key)) - time.Sleep(time.Millisecond * time.Duration(100*i)) + + log.Warn("fail to find a target peer", logutil.Key("key", key)) + time.Sleep(time.Millisecond * time.Duration(1000*i)) continue } - log.Error("can not find leader", logutil.Key("key", key)) - return nil, errors.Annotatef(berrors.ErrBackupNoLeader, "can not find leader") + log.Error("can not find a valid target peer", logutil.Key("key", key)) + if len(targetStoreIds) == 0 { + return nil, errors.Annotatef(berrors.ErrBackupNoLeader, "can not find a valid leader for key %s", key) + } + return nil, errors.Errorf("can not find a valid target peer for key %s", key) } func (bc *Client) fineGrainedBackup( ctx context.Context, req backuppb.BackupRequest, - rangeTree rtree.RangeTree, + targetStoreIds map[uint64]struct{}, + pr *rtree.ProgressRange, progressCallBack func(ProgressUnit), ) error { if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { @@ -757,7 +1002,7 @@ func (bc *Client) fineGrainedBackup( bo := tikv.NewBackoffer(ctx, backupFineGrainedMaxBackoff) for { // Step1, check whether there is any incomplete range - incomplete := rangeTree.GetIncompleteRange(req.StartKey, req.EndKey) + incomplete := pr.Res.GetIncompleteRange(req.StartKey, req.EndKey) if len(incomplete) == 0 { return nil } @@ -780,7 +1025,7 @@ func (bc *Client) fineGrainedBackup( for rg := range retry { subReq := req subReq.StartKey, subReq.EndKey = rg.StartKey, rg.EndKey - backoffMs, err := bc.handleFineGrained(ctx, boFork, subReq, respCh) + backoffMs, err := bc.handleFineGrained(ctx, boFork, subReq, targetStoreIds, respCh) if err != nil { errCh <- err return @@ -825,7 +1070,18 @@ func (bc *Client) fineGrainedBackup( logutil.Key("fine-grained-range-start", resp.StartKey), logutil.Key("fine-grained-range-end", resp.EndKey), ) - rangeTree.Put(resp.StartKey, resp.EndKey, resp.Files) + if bc.checkpointRunner != nil { + if err := bc.checkpointRunner.Append( + ctx, + pr.GroupKey, + resp.StartKey, + resp.EndKey, + resp.Files, + ); err != nil { + return errors.Annotate(err, "failed to flush checkpoint when fineGrainedBackup") + } + } + pr.Res.Put(resp.StartKey, resp.EndKey, resp.Files) apiVersion := resp.ApiVersion bc.SetApiVersion(apiVersion) @@ -921,13 +1177,14 @@ func (bc *Client) handleFineGrained( ctx context.Context, bo *tikv.Backoffer, req backuppb.BackupRequest, + targetStoreIds map[uint64]struct{}, respCh chan<- *backuppb.BackupResponse, ) (int, error) { - leader, pderr := bc.findRegionLeader(ctx, req.StartKey, req.IsRawKv) + targetPeer, pderr := bc.findTargetPeer(ctx, req.StartKey, req.IsRawKv, targetStoreIds) if pderr != nil { return 0, errors.Trace(pderr) } - storeID := leader.GetStoreId() + storeID := targetPeer.GetStoreId() lockResolver := bc.mgr.GetLockResolver() client, err := bc.mgr.GetBackupClient(ctx, storeID) if err != nil { diff --git a/br/pkg/backup/client_test.go b/br/pkg/backup/client_test.go index 76d885e04a201..592416e8ec03c 100644 --- a/br/pkg/backup/client_test.go +++ b/br/pkg/backup/client_test.go @@ -57,8 +57,7 @@ func createBackupSuite(t *testing.T) *testBackup { mockMgr := &conn.Mgr{PdController: &pdutil.PdController{}} mockMgr.SetPDClient(s.mockPDClient) mockMgr.SetHTTP([]string{"test"}, nil) - s.backupClient, err = backup.NewBackupClient(s.ctx, mockMgr) - require.NoError(t, err) + s.backupClient = backup.NewBackupClient(s.ctx, mockMgr) s.cluster, err = mock.NewCluster() require.NoError(t, err) diff --git a/br/pkg/backup/push.go b/br/pkg/backup/push.go index 45c2b9acca01c..ed929a12895a4 100644 --- a/br/pkg/backup/push.go +++ b/br/pkg/backup/push.go @@ -13,6 +13,7 @@ import ( backuppb "github.com/pingcap/kvproto/pkg/brpb" "github.com/pingcap/kvproto/pkg/errorpb" "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/tidb/br/pkg/checkpoint" berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/logutil" "github.com/pingcap/tidb/br/pkg/redact" @@ -54,9 +55,11 @@ func newPushDown(mgr ClientMgr, capacity int) *pushDown { func (push *pushDown) pushBackup( ctx context.Context, req backuppb.BackupRequest, + pr *rtree.ProgressRange, stores []*metapb.Store, + checkpointRunner *checkpoint.CheckpointRunner, progressCallBack func(ProgressUnit), -) (rtree.RangeTree, error) { +) error { if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { span1 := span.Tracer().StartSpan("pushDown.pushBackup", opentracing.ChildOf(span.Context())) defer span1.Finish() @@ -64,10 +67,9 @@ func (push *pushDown) pushBackup( } // Push down backup tasks to all tikv instances. - res := rtree.NewRangeTree() failpoint.Inject("noop-backup", func(_ failpoint.Value) { logutil.CL(ctx).Warn("skipping normal backup, jump to fine-grained backup, meow :3", logutil.Key("start-key", req.StartKey), logutil.Key("end-key", req.EndKey)) - failpoint.Return(res, nil) + failpoint.Return(nil) }) wg := new(sync.WaitGroup) @@ -84,7 +86,7 @@ func (push *pushDown) pushBackup( // BR should be able to backup even some of stores disconnected. // The regions managed by this store can be retried at fine-grained backup then. logutil.CL(lctx).Warn("fail to connect store, skipping", zap.Error(err)) - return res, nil + return nil } wg.Add(1) go func() { @@ -125,7 +127,7 @@ func (push *pushDown) pushBackup( store := respAndStore.GetStore() if !ok { // Finished. - return res, nil + return nil } failpoint.Inject("backup-timeout-error", func(val failpoint.Value) { msg := val.(string) @@ -165,7 +167,19 @@ func (push *pushDown) pushBackup( }) if resp.GetError() == nil { // None error means range has been backuped successfully. - res.Put( + if checkpointRunner != nil { + if err := checkpointRunner.Append( + ctx, + pr.GroupKey, + resp.StartKey, + resp.EndKey, + resp.Files, + ); err != nil { + // the error is only from flush operator + return errors.Annotate(err, "failed to flush checkpoint") + } + } + pr.Res.Put( resp.GetStartKey(), resp.GetEndKey(), resp.GetFiles()) // Update progress @@ -181,7 +195,7 @@ func (push *pushDown) pushBackup( case *backuppb.Error_ClusterIdError: logutil.CL(ctx).Error("backup occur cluster ID error", zap.Reflect("error", v)) - return res, errors.Annotatef(berrors.ErrKVClusterIDMismatch, "%v", errPb) + return errors.Annotatef(berrors.ErrKVClusterIDMismatch, "%v", errPb) default: if utils.MessageIsRetryableStorageError(errPb.GetMsg()) { logutil.CL(ctx).Warn("backup occur storage error", zap.String("error", errPb.GetMsg())) @@ -204,20 +218,19 @@ func (push *pushDown) pushBackup( if len(errMsg) <= 0 { errMsg = errPb.Msg } - return res, errors.Annotatef(berrors.ErrKVStorage, "error happen in store %v at %s: %s %s", + return errors.Annotatef(berrors.ErrKVStorage, "error happen in store %v at %s: %s", store.GetId(), redact.String(store.GetAddress()), - req.StorageBackend.String(), errMsg, ) } } case err := <-push.errCh: if !berrors.Is(err, berrors.ErrFailedToConnect) { - return res, errors.Annotatef(err, "failed to backup range [%s, %s)", redact.Key(req.StartKey), redact.Key(req.EndKey)) + return errors.Annotatef(err, "failed to backup range [%s, %s)", redact.Key(req.StartKey), redact.Key(req.EndKey)) } logutil.CL(ctx).Warn("skipping disconnected stores", logutil.ShortError(err)) - return res, nil + return nil } } } diff --git a/br/pkg/backup/schema.go b/br/pkg/backup/schema.go index 066043c224064..19910af1c9b9b 100644 --- a/br/pkg/backup/schema.go +++ b/br/pkg/backup/schema.go @@ -12,6 +12,7 @@ import ( "github.com/pingcap/errors" backuppb "github.com/pingcap/kvproto/pkg/brpb" "github.com/pingcap/log" + "github.com/pingcap/tidb/br/pkg/checkpoint" "github.com/pingcap/tidb/br/pkg/checksum" "github.com/pingcap/tidb/br/pkg/glue" "github.com/pingcap/tidb/br/pkg/logutil" @@ -44,14 +45,22 @@ type schemaInfo struct { type Schemas struct { // name -> schema schemas map[string]*schemaInfo + + // checkpoint: table id -> checksum + checkpointChecksum map[int64]*checkpoint.ChecksumItem } func NewBackupSchemas() *Schemas { return &Schemas{ - schemas: make(map[string]*schemaInfo), + schemas: make(map[string]*schemaInfo), + checkpointChecksum: nil, } } +func (ss *Schemas) SetCheckpointChecksum(checkpointChecksum map[int64]*checkpoint.ChecksumItem) { + ss.checkpointChecksum = checkpointChecksum +} + func (ss *Schemas) AddSchema( dbInfo *model.DBInfo, tableInfo *model.TableInfo, ) { @@ -73,6 +82,7 @@ func (ss *Schemas) AddSchema( func (ss *Schemas) BackupSchemas( ctx context.Context, metaWriter *metautil.MetaWriter, + checkpointRunner *checkpoint.CheckpointRunner, store kv.Storage, statsHandle *handle.Handle, backupTS uint64, @@ -100,25 +110,52 @@ func (ss *Schemas) BackupSchemas( schema.dbInfo.Name = utils.TemporaryDBName(schema.dbInfo.Name.O) } + var checksum *checkpoint.ChecksumItem + var exists bool = false + if ss.checkpointChecksum != nil && schema.tableInfo != nil { + checksum, exists = ss.checkpointChecksum[schema.tableInfo.ID] + } workerPool.ApplyOnErrorGroup(errg, func() error { if schema.tableInfo != nil { - logger := log.With( + logger := log.L().With( zap.String("db", schema.dbInfo.Name.O), zap.String("table", schema.tableInfo.Name.O), ) if !skipChecksum { logger.Info("Calculate table checksum start") - start := time.Now() - err := schema.calculateChecksum(ectx, store.GetClient(), backupTS, copConcurrency) - if err != nil { - return errors.Trace(err) + if exists && checksum != nil { + schema.crc64xor = checksum.Crc64xor + schema.totalKvs = checksum.TotalKvs + schema.totalBytes = checksum.TotalBytes + logger.Info("Calculate table checksum completed (from checkpoint)", + zap.Uint64("Crc64Xor", schema.crc64xor), + zap.Uint64("TotalKvs", schema.totalKvs), + zap.Uint64("TotalBytes", schema.totalBytes)) + } else { + start := time.Now() + err := schema.calculateChecksum(ectx, store.GetClient(), backupTS, copConcurrency) + if err != nil { + return errors.Trace(err) + } + calculateCost := time.Since(start) + var flushCost time.Duration + if checkpointRunner != nil { + // if checkpoint runner is running and the checksum is not from checkpoint + // then flush the checksum by the checkpoint runner + startFlush := time.Now() + if err = checkpointRunner.FlushChecksum(ctx, schema.tableInfo.ID, schema.crc64xor, schema.totalKvs, schema.totalBytes, calculateCost.Seconds()); err != nil { + return errors.Trace(err) + } + flushCost = time.Since(startFlush) + } + logger.Info("Calculate table checksum completed", + zap.Uint64("Crc64Xor", schema.crc64xor), + zap.Uint64("TotalKvs", schema.totalKvs), + zap.Uint64("TotalBytes", schema.totalBytes), + zap.Duration("calculate-take", calculateCost), + zap.Duration("flush-take", flushCost)) } - logger.Info("Calculate table checksum completed", - zap.Uint64("Crc64Xor", schema.crc64xor), - zap.Uint64("TotalKvs", schema.totalKvs), - zap.Uint64("TotalBytes", schema.totalBytes), - zap.Duration("take", time.Since(start))) } if statsHandle != nil { if err := schema.dumpStatsToJSON(statsHandle); err != nil { diff --git a/br/pkg/backup/schema_test.go b/br/pkg/backup/schema_test.go index bed9d834d2e10..08d560bf03c25 100644 --- a/br/pkg/backup/schema_test.go +++ b/br/pkg/backup/schema_test.go @@ -108,7 +108,7 @@ func TestBuildBackupRangeAndSchema(t *testing.T) { testFilter, err := filter.Parse([]string{"test.t1"}) require.NoError(t, err) _, backupSchemas, _, err := backup.BuildBackupRangeAndSchema( - m.Storage, testFilter, math.MaxUint64, false) + m.Storage, testFilter, math.MaxUint64, false, true) require.NoError(t, err) require.NotNil(t, backupSchemas) @@ -116,7 +116,7 @@ func TestBuildBackupRangeAndSchema(t *testing.T) { fooFilter, err := filter.Parse([]string{"foo.t1"}) require.NoError(t, err) _, backupSchemas, _, err = backup.BuildBackupRangeAndSchema( - m.Storage, fooFilter, math.MaxUint64, false) + m.Storage, fooFilter, math.MaxUint64, false, true) require.NoError(t, err) require.Nil(t, backupSchemas) @@ -125,7 +125,7 @@ func TestBuildBackupRangeAndSchema(t *testing.T) { noFilter, err := filter.Parse([]string{"*.*", "!mysql.*"}) require.NoError(t, err) _, backupSchemas, _, err = backup.BuildBackupRangeAndSchema( - m.Storage, noFilter, math.MaxUint64, false) + m.Storage, noFilter, math.MaxUint64, false, true) require.NoError(t, err) require.NotNil(t, backupSchemas) @@ -137,7 +137,7 @@ func TestBuildBackupRangeAndSchema(t *testing.T) { var policies []*backuppb.PlacementPolicy _, backupSchemas, policies, err = backup.BuildBackupRangeAndSchema( - m.Storage, testFilter, math.MaxUint64, false) + m.Storage, testFilter, math.MaxUint64, false, true) require.NoError(t, err) require.Equal(t, 1, backupSchemas.Len()) // we expect no policies collected, because it's not full backup. @@ -151,7 +151,7 @@ func TestBuildBackupRangeAndSchema(t *testing.T) { metaWriter := metautil.NewMetaWriter(es, metautil.MetaFileSize, false, "", &cipher) ctx := context.Background() err = backupSchemas.BackupSchemas( - ctx, metaWriter, m.Storage, nil, math.MaxUint64, 1, variable.DefChecksumTableConcurrency, skipChecksum, updateCh) + ctx, metaWriter, nil, m.Storage, nil, math.MaxUint64, 1, variable.DefChecksumTableConcurrency, skipChecksum, updateCh) require.Equal(t, int64(1), updateCh.get()) require.NoError(t, err) err = metaWriter.FlushBackupMeta(ctx) @@ -170,7 +170,7 @@ func TestBuildBackupRangeAndSchema(t *testing.T) { tk.MustExec("insert into t2 values (11);") _, backupSchemas, policies, err = backup.BuildBackupRangeAndSchema( - m.Storage, noFilter, math.MaxUint64, true) + m.Storage, noFilter, math.MaxUint64, true, true) require.NoError(t, err) require.Equal(t, 2, backupSchemas.Len()) // we expect the policy fivereplicas collected in full backup. @@ -180,7 +180,7 @@ func TestBuildBackupRangeAndSchema(t *testing.T) { es2 := GetRandomStorage(t) metaWriter2 := metautil.NewMetaWriter(es2, metautil.MetaFileSize, false, "", &cipher) err = backupSchemas.BackupSchemas( - ctx, metaWriter2, m.Storage, nil, math.MaxUint64, 2, variable.DefChecksumTableConcurrency, skipChecksum, updateCh) + ctx, metaWriter2, nil, m.Storage, nil, math.MaxUint64, 2, variable.DefChecksumTableConcurrency, skipChecksum, updateCh) require.Equal(t, int64(2), updateCh.get()) require.NoError(t, err) err = metaWriter2.FlushBackupMeta(ctx) @@ -219,7 +219,7 @@ func TestBuildBackupRangeAndSchemaWithBrokenStats(t *testing.T) { f, err := filter.Parse([]string{"test.t3"}) require.NoError(t, err) - _, backupSchemas, _, err := backup.BuildBackupRangeAndSchema(m.Storage, f, math.MaxUint64, false) + _, backupSchemas, _, err := backup.BuildBackupRangeAndSchema(m.Storage, f, math.MaxUint64, false, true) require.NoError(t, err) require.Equal(t, 1, backupSchemas.Len()) @@ -234,7 +234,7 @@ func TestBuildBackupRangeAndSchemaWithBrokenStats(t *testing.T) { metaWriter := metautil.NewMetaWriter(es, metautil.MetaFileSize, false, "", &cipher) ctx := context.Background() err = backupSchemas.BackupSchemas( - ctx, metaWriter, m.Storage, nil, math.MaxUint64, 1, variable.DefChecksumTableConcurrency, skipChecksum, updateCh) + ctx, metaWriter, nil, m.Storage, nil, math.MaxUint64, 1, variable.DefChecksumTableConcurrency, skipChecksum, updateCh) require.NoError(t, err) err = metaWriter.FlushBackupMeta(ctx) require.NoError(t, err) @@ -253,7 +253,7 @@ func TestBuildBackupRangeAndSchemaWithBrokenStats(t *testing.T) { // recover the statistics. tk.MustExec("analyze table t3;") - _, backupSchemas, _, err = backup.BuildBackupRangeAndSchema(m.Storage, f, math.MaxUint64, false) + _, backupSchemas, _, err = backup.BuildBackupRangeAndSchema(m.Storage, f, math.MaxUint64, false, true) require.NoError(t, err) require.Equal(t, 1, backupSchemas.Len()) @@ -262,7 +262,7 @@ func TestBuildBackupRangeAndSchemaWithBrokenStats(t *testing.T) { es2 := GetRandomStorage(t) metaWriter2 := metautil.NewMetaWriter(es2, metautil.MetaFileSize, false, "", &cipher) err = backupSchemas.BackupSchemas( - ctx, metaWriter2, m.Storage, statsHandle, math.MaxUint64, 1, variable.DefChecksumTableConcurrency, skipChecksum, updateCh) + ctx, metaWriter2, nil, m.Storage, statsHandle, math.MaxUint64, 1, variable.DefChecksumTableConcurrency, skipChecksum, updateCh) require.NoError(t, err) err = metaWriter2.FlushBackupMeta(ctx) require.NoError(t, err) @@ -294,7 +294,7 @@ func TestBackupSchemasForSystemTable(t *testing.T) { f, err := filter.Parse([]string{"mysql.systable*"}) require.NoError(t, err) - _, backupSchemas, _, err := backup.BuildBackupRangeAndSchema(m.Storage, f, math.MaxUint64, false) + _, backupSchemas, _, err := backup.BuildBackupRangeAndSchema(m.Storage, f, math.MaxUint64, false, true) require.NoError(t, err) require.Equal(t, systemTablesCount, backupSchemas.Len()) @@ -305,7 +305,7 @@ func TestBackupSchemasForSystemTable(t *testing.T) { updateCh := new(simpleProgress) metaWriter2 := metautil.NewMetaWriter(es2, metautil.MetaFileSize, false, "", &cipher) - err = backupSchemas.BackupSchemas(ctx, metaWriter2, m.Storage, nil, + err = backupSchemas.BackupSchemas(ctx, metaWriter2, nil, m.Storage, nil, math.MaxUint64, 1, variable.DefChecksumTableConcurrency, true, updateCh) require.NoError(t, err) err = metaWriter2.FlushBackupMeta(ctx) diff --git a/br/pkg/checkpoint/BUILD.bazel b/br/pkg/checkpoint/BUILD.bazel new file mode 100644 index 0000000000000..e8e0f0bd536d5 --- /dev/null +++ b/br/pkg/checkpoint/BUILD.bazel @@ -0,0 +1,37 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "checkpoint", + srcs = ["checkpoint.go"], + importpath = "github.com/pingcap/tidb/br/pkg/checkpoint", + visibility = ["//visibility:public"], + deps = [ + "//br/pkg/logutil", + "//br/pkg/metautil", + "//br/pkg/rtree", + "//br/pkg/storage", + "//br/pkg/summary", + "//br/pkg/utils", + "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_kvproto//pkg/brpb", + "@com_github_pingcap_log//:log", + "@com_github_tikv_client_go_v2//oracle", + "@org_uber_go_zap//:zap", + ], +) + +go_test( + name = "checkpoint_test", + timeout = "short", + srcs = ["checkpoint_test.go"], + flaky = True, + deps = [ + ":checkpoint", + "//br/pkg/rtree", + "//br/pkg/storage", + "@com_github_pingcap_kvproto//pkg/brpb", + "@com_github_pingcap_kvproto//pkg/encryptionpb", + "@com_github_stretchr_testify//require", + "@com_github_tikv_client_go_v2//oracle", + ], +) diff --git a/br/pkg/checkpoint/checkpoint.go b/br/pkg/checkpoint/checkpoint.go new file mode 100644 index 0000000000000..0af1cefdf2594 --- /dev/null +++ b/br/pkg/checkpoint/checkpoint.go @@ -0,0 +1,759 @@ +// 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, +// 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 checkpoint + +import ( + "bytes" + "context" + "crypto/sha256" + "encoding/base64" + "encoding/json" + "fmt" + "math/rand" + "strings" + "sync" + "time" + + "github.com/pingcap/errors" + backuppb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/log" + "github.com/pingcap/tidb/br/pkg/logutil" + "github.com/pingcap/tidb/br/pkg/metautil" + "github.com/pingcap/tidb/br/pkg/rtree" + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/br/pkg/summary" + "github.com/pingcap/tidb/br/pkg/utils" + "github.com/tikv/client-go/v2/oracle" + "go.uber.org/zap" +) + +const ( + CheckpointMetaPath = "checkpoint.meta" + CheckpointDir = "/checkpoints" + + CheckpointDataDir = CheckpointDir + "/data" + CheckpointChecksumDir = CheckpointDir + "/checksum" + CheckpointLockPath = CheckpointDir + "/checkpoint.lock" +) + +const MaxChecksumTotalCost float64 = 60.0 + +const tickDurationForFlush = 30 * time.Second + +const tickDurationForLock = 4 * time.Minute + +const lockTimeToLive = 5 * time.Minute + +type CheckpointMessage struct { + // start-key of the origin range + GroupKey string + + Group *rtree.Range +} + +// A Checkpoint Range File is like this: +// +// ChecksumData +// +----------------+ RangeGroupData RangeGroups +// | DureTime | +--------------------------+ encrypted +-------------+ +// | RangeGroupData-+---> | RangeGroupsEncriptedData-+----------> | GroupKey | +// | RangeGroupData | | Checksum | | Range | +// | ... | | CipherIv | | ... | +// | RangeGroupData | | Size | | Range | +// +----------------+ +--------------------------+ +-------------+ + +type RangeGroups struct { + GroupKey string `json:"group-key"` + Groups []*rtree.Range `json:"groups"` +} + +type RangeGroupData struct { + RangeGroupsEncriptedData []byte + Checksum []byte + CipherIv []byte + + Size int +} + +type CheckpointData struct { + DureTime time.Duration `json:"dure-time"` + RangeGroupMetas []*RangeGroupData `json:"range-group-metas"` +} + +// A Checkpoint Checksum File is like this: +// +// ChecksumInfo ChecksumItems ChecksumItem +// +-------------+ +--------------+ +--------------+ +// | Content---+-> | ChecksumItem-+---> | TableID | +// | Checksum | | ChecksumItem | | Crc64xor | +// +-------------+ | ... | | TotalKvs | +// | ChecksumItem | | TotalBytes | +// +--------------+ +--------------+ + +type ChecksumItem struct { + TableID int64 `json:"table-id"` + Crc64xor uint64 `json:"crc64-xor"` + TotalKvs uint64 `json:"total-kvs"` + TotalBytes uint64 `json:"total-bytes"` +} + +type ChecksumItems struct { + Items []*ChecksumItem `json:"checksum-items"` +} + +type ChecksumInfo struct { + Content []byte `json:"content"` + Checksum []byte `json:"checksum"` +} + +type ChecksumRunner struct { + sync.Mutex + + checksumItems ChecksumItems + + // when the total time cost is large than the threshold, + // begin to flush checksum + totalCost float64 + + err error + wg sync.WaitGroup + workerPool utils.WorkerPool +} + +func NewChecksumRunner() *ChecksumRunner { + return &ChecksumRunner{ + workerPool: *utils.NewWorkerPool(4, "checksum flush worker"), + } +} + +func (cr *ChecksumRunner) RecordError(err error) { + cr.Lock() + cr.err = err + cr.Unlock() +} + +// FlushChecksum save the checksum in the memory temporarily +// and flush to the external storage if checksum take much time +func (cr *ChecksumRunner) FlushChecksum( + ctx context.Context, + s storage.ExternalStorage, + tableID int64, + crc64xor uint64, + totalKvs uint64, + totalBytes uint64, + timeCost float64, +) error { + checksumItem := &ChecksumItem{ + TableID: tableID, + Crc64xor: crc64xor, + TotalKvs: totalKvs, + TotalBytes: totalBytes, + } + var toBeFlushedChecksumItems *ChecksumItems = nil + cr.Lock() + if cr.err != nil { + err := cr.err + cr.Unlock() + return err + } + if cr.checksumItems.Items == nil { + // reset the checksumInfo + cr.totalCost = 0 + cr.checksumItems.Items = make([]*ChecksumItem, 0) + } + cr.totalCost += timeCost + cr.checksumItems.Items = append(cr.checksumItems.Items, checksumItem) + if cr.totalCost > MaxChecksumTotalCost { + toBeFlushedChecksumItems = &ChecksumItems{ + Items: cr.checksumItems.Items, + } + cr.checksumItems.Items = nil + } + cr.Unlock() + + // now lock is free + if toBeFlushedChecksumItems == nil { + return nil + } + + // create a goroutine to flush checksumInfo to external storage + cr.wg.Add(1) + cr.workerPool.Apply(func() { + defer cr.wg.Done() + + content, err := json.Marshal(toBeFlushedChecksumItems) + if err != nil { + cr.RecordError(err) + return + } + + checksum := sha256.Sum256(content) + checksumInfo := &ChecksumInfo{ + Content: content, + Checksum: checksum[:], + } + + data, err := json.Marshal(checksumInfo) + if err != nil { + cr.RecordError(err) + return + } + + fname := fmt.Sprintf("%s/t%d_and__", CheckpointChecksumDir, tableID) + err = s.WriteFile(ctx, fname, data) + if err != nil { + cr.RecordError(err) + return + } + }) + return nil +} + +type GlobalTimer interface { + GetTS(context.Context) (int64, int64, error) +} + +type CheckpointRunner struct { + lockId uint64 + + meta map[string]*RangeGroups + + checksumRunner *ChecksumRunner + + storage storage.ExternalStorage + cipher *backuppb.CipherInfo + timer GlobalTimer + + appendCh chan *CheckpointMessage + metaCh chan map[string]*RangeGroups + lockCh chan struct{} + errCh chan error + + wg sync.WaitGroup +} + +// only for test +func StartCheckpointRunnerForTest(ctx context.Context, storage storage.ExternalStorage, cipher *backuppb.CipherInfo, tick time.Duration, timer GlobalTimer) (*CheckpointRunner, error) { + runner := &CheckpointRunner{ + meta: make(map[string]*RangeGroups), + + checksumRunner: NewChecksumRunner(), + + storage: storage, + cipher: cipher, + timer: timer, + + appendCh: make(chan *CheckpointMessage), + metaCh: make(chan map[string]*RangeGroups), + lockCh: make(chan struct{}), + errCh: make(chan error, 1), + } + + err := runner.initialLock(ctx) + if err != nil { + return nil, errors.Annotate(err, "Failed to initialize checkpoint lock.") + } + runner.startCheckpointLoop(ctx, tick, tick) + return runner, nil +} + +func StartCheckpointRunner(ctx context.Context, storage storage.ExternalStorage, cipher *backuppb.CipherInfo, timer GlobalTimer) (*CheckpointRunner, error) { + runner := &CheckpointRunner{ + meta: make(map[string]*RangeGroups), + + checksumRunner: NewChecksumRunner(), + + storage: storage, + cipher: cipher, + timer: timer, + + appendCh: make(chan *CheckpointMessage), + metaCh: make(chan map[string]*RangeGroups), + lockCh: make(chan struct{}), + errCh: make(chan error, 1), + } + + err := runner.initialLock(ctx) + if err != nil { + return nil, errors.Trace(err) + } + runner.startCheckpointLoop(ctx, tickDurationForFlush, tickDurationForLock) + return runner, nil +} + +func (r *CheckpointRunner) FlushChecksum(ctx context.Context, tableID int64, crc64xor uint64, totalKvs uint64, totalBytes uint64, timeCost float64) error { + return r.checksumRunner.FlushChecksum(ctx, r.storage, tableID, crc64xor, totalKvs, totalBytes, timeCost) +} + +func (r *CheckpointRunner) Append( + ctx context.Context, + groupKey string, + startKey []byte, + endKey []byte, + files []*backuppb.File, +) error { + select { + case <-ctx.Done(): + return nil + case err := <-r.errCh: + return err + case r.appendCh <- &CheckpointMessage{ + GroupKey: groupKey, + Group: &rtree.Range{ + StartKey: startKey, + EndKey: endKey, + Files: files, + }, + }: + return nil + } +} + +// Note: Cannot be parallel with `Append` function +func (r *CheckpointRunner) WaitForFinish(ctx context.Context) { + // can not append anymore + close(r.appendCh) + // wait the range flusher exit + r.wg.Wait() + // wait the checksum flusher exit + r.checksumRunner.wg.Wait() + // remove the checkpoint lock + err := r.storage.DeleteFile(ctx, CheckpointLockPath) + if err != nil { + log.Warn("failed to remove the checkpoint lock", zap.Error(err)) + } +} + +// Send the meta to the flush goroutine, and reset the CheckpointRunner's meta +func (r *CheckpointRunner) flushMeta(ctx context.Context, errCh chan error) error { + meta := r.meta + r.meta = make(map[string]*RangeGroups) + // do flush + select { + case <-ctx.Done(): + case err := <-errCh: + return err + case r.metaCh <- meta: + } + return nil +} + +func (r *CheckpointRunner) setLock(ctx context.Context, errCh chan error) error { + select { + case <-ctx.Done(): + case err := <-errCh: + return err + case r.lockCh <- struct{}{}: + } + return nil +} + +// start a goroutine to flush the meta, which is sent from `checkpoint looper`, to the external storage +func (r *CheckpointRunner) startCheckpointRunner(ctx context.Context, wg *sync.WaitGroup) chan error { + errCh := make(chan error, 1) + wg.Add(1) + flushWorker := func(ctx context.Context, errCh chan error) { + defer wg.Done() + for { + select { + case <-ctx.Done(): + return + case meta, ok := <-r.metaCh: + if !ok { + log.Info("stop checkpoint flush worker") + return + } + if err := r.doFlush(ctx, meta); err != nil { + errCh <- err + return + } + case _, ok := <-r.lockCh: + if !ok { + log.Info("stop checkpoint flush worker") + return + } + if err := r.updateLock(ctx); err != nil { + errCh <- errors.Annotate(err, "Failed to update checkpoint lock.") + return + } + } + } + } + + go flushWorker(ctx, errCh) + return errCh +} + +func (r *CheckpointRunner) sendError(err error) { + select { + case r.errCh <- err: + default: + log.Error("errCh is blocked", logutil.ShortError(err)) + } + r.checksumRunner.RecordError(err) +} + +func (r *CheckpointRunner) startCheckpointLoop(ctx context.Context, tickDurationForFlush, tickDurationForLock time.Duration) { + r.wg.Add(1) + checkpointLoop := func(ctx context.Context) { + defer r.wg.Done() + cctx, cancel := context.WithCancel(ctx) + defer cancel() + var wg sync.WaitGroup + errCh := r.startCheckpointRunner(cctx, &wg) + flushTicker := time.NewTicker(tickDurationForFlush) + defer flushTicker.Stop() + lockTicker := time.NewTicker(tickDurationForLock) + defer lockTicker.Stop() + for { + select { + case <-ctx.Done(): + return + case <-lockTicker.C: + if err := r.setLock(ctx, errCh); err != nil { + r.sendError(err) + return + } + case <-flushTicker.C: + if err := r.flushMeta(ctx, errCh); err != nil { + r.sendError(err) + return + } + case msg, ok := <-r.appendCh: + if !ok { + log.Info("stop checkpoint runner") + if err := r.flushMeta(ctx, errCh); err != nil { + r.sendError(err) + } + // close the channel to flush worker + // and wait it to consumes all the metas + close(r.metaCh) + close(r.lockCh) + wg.Wait() + return + } + groups, exist := r.meta[msg.GroupKey] + if !exist { + groups = &RangeGroups{ + GroupKey: msg.GroupKey, + Groups: make([]*rtree.Range, 0), + } + r.meta[msg.GroupKey] = groups + } + groups.Groups = append(groups.Groups, msg.Group) + case err := <-errCh: + // pass flush worker's error back + r.sendError(err) + return + } + } + } + + go checkpointLoop(ctx) +} + +// flush the meta to the external storage +func (r *CheckpointRunner) doFlush(ctx context.Context, meta map[string]*RangeGroups) error { + if len(meta) == 0 { + return nil + } + + checkpointData := &CheckpointData{ + DureTime: summary.NowDureTime(), + RangeGroupMetas: make([]*RangeGroupData, 0, len(meta)), + } + + var fname []byte = nil + + for _, group := range meta { + if len(group.Groups) == 0 { + continue + } + + // use the first item's group-key and sub-range-key as the filename + if len(fname) == 0 { + fname = append(append([]byte(group.GroupKey), '.', '.'), group.Groups[0].StartKey...) + } + + // Flush the metaFile to storage + content, err := json.Marshal(group) + if err != nil { + return errors.Trace(err) + } + + encryptBuff, iv, err := metautil.Encrypt(content, r.cipher) + if err != nil { + return errors.Trace(err) + } + + checksum := sha256.Sum256(content) + + checkpointData.RangeGroupMetas = append(checkpointData.RangeGroupMetas, &RangeGroupData{ + RangeGroupsEncriptedData: encryptBuff, + Checksum: checksum[:], + Size: len(content), + CipherIv: iv, + }) + } + + if len(checkpointData.RangeGroupMetas) > 0 { + data, err := json.Marshal(checkpointData) + if err != nil { + return errors.Trace(err) + } + + checksum := sha256.Sum256(fname) + checksumEncoded := base64.URLEncoding.EncodeToString(checksum[:]) + path := fmt.Sprintf("%s/%s_%d.cpt", CheckpointDataDir, checksumEncoded, rand.Uint64()) + if err := r.storage.WriteFile(ctx, path, data); err != nil { + return errors.Trace(err) + } + } + return nil +} + +type CheckpointLock struct { + LockId uint64 `json:"lock-id"` + ExpireAt int64 `json:"expire-at"` +} + +// get ts with retry +func (r *CheckpointRunner) getTS(ctx context.Context) (int64, int64, error) { + var ( + p int64 = 0 + l int64 = 0 + retry int = 0 + ) + errRetry := utils.WithRetry(ctx, func() error { + var err error + p, l, err = r.timer.GetTS(ctx) + if err != nil { + retry++ + log.Info("failed to get ts", zap.Int("retry", retry), zap.Error(err)) + return err + } + + return nil + }, utils.NewPDReqBackoffer()) + + return p, l, errors.Trace(errRetry) +} + +// flush the lock to the external storage +func (r *CheckpointRunner) flushLock(ctx context.Context, p int64) error { + lock := &CheckpointLock{ + LockId: r.lockId, + ExpireAt: p + lockTimeToLive.Milliseconds(), + } + log.Info("start to flush the checkpoint lock", zap.Int64("lock-at", p), zap.Int64("expire-at", lock.ExpireAt)) + data, err := json.Marshal(lock) + if err != nil { + return errors.Trace(err) + } + + err = r.storage.WriteFile(ctx, CheckpointLockPath, data) + return errors.Trace(err) +} + +// check whether this lock belongs to this BR +func (r *CheckpointRunner) checkLockFile(ctx context.Context, now int64) error { + data, err := r.storage.ReadFile(ctx, CheckpointLockPath) + if err != nil { + return errors.Trace(err) + } + lock := &CheckpointLock{} + err = json.Unmarshal(data, lock) + if err != nil { + return errors.Trace(err) + } + if lock.ExpireAt <= now { + if lock.LockId > r.lockId { + return errors.Errorf("There are another BR(%d) running after but setting lock before this one(%d). "+ + "Please check whether the BR is running. If not, you can retry.", lock.LockId, r.lockId) + } + if lock.LockId == r.lockId { + log.Warn("The lock has expired.", zap.Int64("expire-at(ms)", lock.ExpireAt), zap.Int64("now(ms)", now)) + } + } else if lock.LockId != r.lockId { + return errors.Errorf("The existing lock will expire in %d seconds. "+ + "There may be another BR(%d) running. If not, you can wait for the lock to expire, or delete the file `%s%s` manually.", + (lock.ExpireAt-now)/1000, lock.LockId, strings.TrimRight(r.storage.URI(), "/"), CheckpointLockPath) + } + + return nil +} + +// generate a new lock and flush the lock to the external storage +func (r *CheckpointRunner) updateLock(ctx context.Context) error { + p, _, err := r.getTS(ctx) + if err != nil { + return errors.Trace(err) + } + if err = r.checkLockFile(ctx, p); err != nil { + return errors.Trace(err) + } + return errors.Trace(r.flushLock(ctx, p)) +} + +// Attempt to initialize the lock. Need to stop the backup when there is an unexpired locks. +func (r *CheckpointRunner) initialLock(ctx context.Context) error { + p, l, err := r.getTS(ctx) + if err != nil { + return errors.Trace(err) + } + r.lockId = oracle.ComposeTS(p, l) + exist, err := r.storage.FileExists(ctx, CheckpointLockPath) + if err != nil { + return errors.Trace(err) + } + if exist { + if err := r.checkLockFile(ctx, p); err != nil { + return errors.Trace(err) + } + } + if err = r.flushLock(ctx, p); err != nil { + return errors.Trace(err) + } + + // wait for 3 seconds to check whether the lock file is overwritten by another BR + time.Sleep(3 * time.Second) + err = r.checkLockFile(ctx, p) + return errors.Trace(err) +} + +// walk the whole checkpoint range files and retrieve the metadatat of backed up ranges +// and return the total time cost in the past executions +func WalkCheckpointFile(ctx context.Context, s storage.ExternalStorage, cipher *backuppb.CipherInfo, fn func(groupKey string, rg *rtree.Range)) (time.Duration, error) { + // records the total time cost in the past executions + var pastDureTime time.Duration = 0 + err := s.WalkDir(ctx, &storage.WalkOption{SubDir: CheckpointDataDir}, func(path string, size int64) error { + if strings.HasSuffix(path, ".cpt") { + content, err := s.ReadFile(ctx, path) + if err != nil { + return errors.Trace(err) + } + + checkpointData := &CheckpointData{} + if err = json.Unmarshal(content, checkpointData); err != nil { + return errors.Trace(err) + } + + if checkpointData.DureTime > pastDureTime { + pastDureTime = checkpointData.DureTime + } + for _, meta := range checkpointData.RangeGroupMetas { + decryptContent, err := metautil.Decrypt(meta.RangeGroupsEncriptedData, cipher, meta.CipherIv) + if err != nil { + return errors.Trace(err) + } + + checksum := sha256.Sum256(decryptContent) + if !bytes.Equal(meta.Checksum, checksum[:]) { + log.Error("checkpoint checksum info's checksum mismatch, skip it", + zap.ByteString("expect", meta.Checksum), + zap.ByteString("got", checksum[:]), + ) + continue + } + + group := &RangeGroups{} + if err = json.Unmarshal(decryptContent, group); err != nil { + return errors.Trace(err) + } + + for _, g := range group.Groups { + fn(group.GroupKey, g) + } + } + } + return nil + }) + + return pastDureTime, errors.Trace(err) +} + +type CheckpointMetadata struct { + GCServiceId string `json:"gc-service-id"` + ConfigHash []byte `json:"config-hash"` + BackupTS uint64 `json:"backup-ts"` + Ranges []rtree.Range `json:"ranges"` + + CheckpointChecksum map[int64]*ChecksumItem `json:"-"` + CheckpointDataMap map[string]rtree.RangeTree `json:"-"` +} + +// load checkpoint metadata from the external storage +func LoadCheckpointMetadata(ctx context.Context, s storage.ExternalStorage) (*CheckpointMetadata, error) { + data, err := s.ReadFile(ctx, CheckpointMetaPath) + if err != nil { + return nil, errors.Trace(err) + } + m := &CheckpointMetadata{} + err = json.Unmarshal(data, m) + if err != nil { + return nil, errors.Trace(err) + } + m.CheckpointChecksum, err = loadCheckpointChecksum(ctx, s) + return m, errors.Trace(err) +} + +// walk the whole checkpoint checksum files and retrieve checksum information of tables calculated +func loadCheckpointChecksum(ctx context.Context, s storage.ExternalStorage) (map[int64]*ChecksumItem, error) { + checkpointChecksum := make(map[int64]*ChecksumItem) + + err := s.WalkDir(ctx, &storage.WalkOption{SubDir: CheckpointChecksumDir}, func(path string, size int64) error { + data, err := s.ReadFile(ctx, path) + if err != nil { + return errors.Trace(err) + } + info := &ChecksumInfo{} + err = json.Unmarshal(data, info) + if err != nil { + return errors.Trace(err) + } + + checksum := sha256.Sum256(info.Content) + if !bytes.Equal(info.Checksum, checksum[:]) { + log.Error("checkpoint checksum info's checksum mismatch, skip it", + zap.ByteString("expect", info.Checksum), + zap.ByteString("got", checksum[:]), + ) + return nil + } + + items := &ChecksumItems{} + err = json.Unmarshal(info.Content, items) + if err != nil { + return errors.Trace(err) + } + + for _, c := range items.Items { + checkpointChecksum[c.TableID] = c + } + return nil + }) + return checkpointChecksum, errors.Trace(err) +} + +// save the checkpoint metadata into the external storage +func SaveCheckpointMetadata(ctx context.Context, s storage.ExternalStorage, meta *CheckpointMetadata) error { + data, err := json.Marshal(meta) + if err != nil { + return errors.Trace(err) + } + + err = s.WriteFile(ctx, CheckpointMetaPath, data) + return errors.Trace(err) +} diff --git a/br/pkg/checkpoint/checkpoint_test.go b/br/pkg/checkpoint/checkpoint_test.go new file mode 100644 index 0000000000000..29d8b5aa993ac --- /dev/null +++ b/br/pkg/checkpoint/checkpoint_test.go @@ -0,0 +1,229 @@ +// 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, +// 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 checkpoint_test + +import ( + "context" + "encoding/json" + "os" + "strings" + "testing" + "time" + + backuppb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/kvproto/pkg/encryptionpb" + "github.com/pingcap/tidb/br/pkg/checkpoint" + "github.com/pingcap/tidb/br/pkg/rtree" + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/oracle" +) + +func TestCheckpointMeta(t *testing.T) { + ctx := context.Background() + base := t.TempDir() + s, err := storage.NewLocalStorage(base) + require.NoError(t, err) + + checkpointMeta := &checkpoint.CheckpointMetadata{ + ConfigHash: []byte("123456"), + BackupTS: 123456, + } + + err = checkpoint.SaveCheckpointMetadata(ctx, s, checkpointMeta) + require.NoError(t, err) + + checkpointMeta2, err := checkpoint.LoadCheckpointMetadata(ctx, s) + require.NoError(t, err) + require.Equal(t, checkpointMeta.ConfigHash, checkpointMeta2.ConfigHash) + require.Equal(t, checkpointMeta.BackupTS, checkpointMeta2.BackupTS) +} + +type mockTimer struct { + p int64 + l int64 +} + +func NewMockTimer(p, l int64) *mockTimer { + return &mockTimer{p: p, l: l} +} + +func (t *mockTimer) GetTS(ctx context.Context) (int64, int64, error) { + return t.p, t.l, nil +} + +func TestCheckpointRunner(t *testing.T) { + ctx := context.Background() + base := t.TempDir() + s, err := storage.NewLocalStorage(base) + require.NoError(t, err) + os.MkdirAll(base+checkpoint.CheckpointDataDir, 0o755) + os.MkdirAll(base+checkpoint.CheckpointChecksumDir, 0o755) + + cipher := &backuppb.CipherInfo{ + CipherType: encryptionpb.EncryptionMethod_AES256_CTR, + CipherKey: []byte("01234567890123456789012345678901"), + } + checkpointRunner, err := checkpoint.StartCheckpointRunnerForTest(ctx, s, cipher, 5*time.Second, NewMockTimer(10, 10)) + require.NoError(t, err) + + data := map[string]struct { + StartKey string + EndKey string + Name string + Name2 string + }{ + "a": { + StartKey: "a", + EndKey: "b", + Name: "c", + Name2: "d", + }, + "A": { + StartKey: "A", + EndKey: "B", + Name: "C", + Name2: "D", + }, + "1": { + StartKey: "1", + EndKey: "2", + Name: "3", + Name2: "4", + }, + } + + data2 := map[string]struct { + StartKey string + EndKey string + Name string + Name2 string + }{ + "+": { + StartKey: "+", + EndKey: "-", + Name: "*", + Name2: "/", + }, + } + + for _, d := range data { + err = checkpointRunner.Append(ctx, "a", []byte(d.StartKey), []byte(d.EndKey), []*backuppb.File{ + {Name: d.Name}, + {Name: d.Name2}, + }) + require.NoError(t, err) + } + + checkpointRunner.FlushChecksum(ctx, 1, 1, 1, 1, checkpoint.MaxChecksumTotalCost-20.0) + checkpointRunner.FlushChecksum(ctx, 2, 2, 2, 2, 40.0) + // now the checksum is flushed, because the total time cost is larger than `MaxChecksumTotalCost` + checkpointRunner.FlushChecksum(ctx, 3, 3, 3, 3, checkpoint.MaxChecksumTotalCost-20.0) + time.Sleep(6 * time.Second) + // the checksum has not been flushed even though after 6 seconds, + // because the total time cost is less than `MaxChecksumTotalCost` + checkpointRunner.FlushChecksum(ctx, 4, 4, 4, 4, 40.0) + + for _, d := range data2 { + err = checkpointRunner.Append(ctx, "+", []byte(d.StartKey), []byte(d.EndKey), []*backuppb.File{ + {Name: d.Name}, + {Name: d.Name2}, + }) + require.NoError(t, err) + } + + checkpointRunner.WaitForFinish(ctx) + + checker := func(groupKey string, resp *rtree.Range) { + require.NotNil(t, resp) + d, ok := data[string(resp.StartKey)] + if !ok { + d, ok = data2[string(resp.StartKey)] + require.True(t, ok) + } + require.Equal(t, d.StartKey, string(resp.StartKey)) + require.Equal(t, d.EndKey, string(resp.EndKey)) + require.Equal(t, d.Name, resp.Files[0].Name) + require.Equal(t, d.Name2, resp.Files[1].Name) + } + + _, err = checkpoint.WalkCheckpointFile(ctx, s, cipher, checker) + require.NoError(t, err) + + checkpointMeta := &checkpoint.CheckpointMetadata{ + ConfigHash: []byte("123456"), + BackupTS: 123456, + } + + err = checkpoint.SaveCheckpointMetadata(ctx, s, checkpointMeta) + require.NoError(t, err) + meta, err := checkpoint.LoadCheckpointMetadata(ctx, s) + require.NoError(t, err) + + var i int64 + for i = 1; i <= 4; i++ { + require.Equal(t, meta.CheckpointChecksum[i].Crc64xor, uint64(i)) + } + + // only 2 checksum files exists, they are t2_and__ and t4_and__ + count := 0 + err = s.WalkDir(ctx, &storage.WalkOption{SubDir: checkpoint.CheckpointChecksumDir}, func(s string, i int64) error { + count += 1 + if !strings.Contains(s, "t2") { + require.True(t, strings.Contains(s, "t4")) + } + return nil + }) + require.NoError(t, err) + require.Equal(t, count, 2) +} + +func getLockData(p, l int64) ([]byte, error) { + lock := checkpoint.CheckpointLock{ + LockId: oracle.ComposeTS(p, l), + ExpireAt: p + 10, + } + return json.Marshal(lock) +} + +func TestCheckpointRunnerLock(t *testing.T) { + ctx := context.Background() + base := t.TempDir() + s, err := storage.NewLocalStorage(base) + require.NoError(t, err) + os.MkdirAll(base+checkpoint.CheckpointDataDir, 0o755) + os.MkdirAll(base+checkpoint.CheckpointChecksumDir, 0o755) + + cipher := &backuppb.CipherInfo{ + CipherType: encryptionpb.EncryptionMethod_AES256_CTR, + CipherKey: []byte("01234567890123456789012345678901"), + } + + data, err := getLockData(10, 20) + require.NoError(t, err) + err = s.WriteFile(ctx, checkpoint.CheckpointLockPath, data) + require.NoError(t, err) + + _, err = checkpoint.StartCheckpointRunnerForTest(ctx, s, cipher, 5*time.Second, NewMockTimer(10, 10)) + require.Error(t, err) + + runner, err := checkpoint.StartCheckpointRunnerForTest(ctx, s, cipher, 5*time.Second, NewMockTimer(30, 10)) + require.NoError(t, err) + + _, err = checkpoint.StartCheckpointRunnerForTest(ctx, s, cipher, 5*time.Second, NewMockTimer(40, 10)) + require.Error(t, err) + + runner.WaitForFinish(ctx) +} diff --git a/br/pkg/checksum/executor.go b/br/pkg/checksum/executor.go index c30ae49fccdca..300caf706ef25 100644 --- a/br/pkg/checksum/executor.go +++ b/br/pkg/checksum/executor.go @@ -27,6 +27,9 @@ type ExecutorBuilder struct { oldTable *metautil.Table concurrency uint + + oldKeyspace []byte + newKeyspace []byte } // NewExecutorBuilder returns a new executor builder. @@ -51,9 +54,26 @@ func (builder *ExecutorBuilder) SetConcurrency(conc uint) *ExecutorBuilder { return builder } +func (builder *ExecutorBuilder) SetOldKeyspace(keyspace []byte) *ExecutorBuilder { + builder.oldKeyspace = keyspace + return builder +} + +func (builder *ExecutorBuilder) SetNewKeyspace(keyspace []byte) *ExecutorBuilder { + builder.newKeyspace = keyspace + return builder +} + // Build builds a checksum executor. func (builder *ExecutorBuilder) Build() (*Executor, error) { - reqs, err := buildChecksumRequest(builder.table, builder.oldTable, builder.ts, builder.concurrency) + reqs, err := buildChecksumRequest( + builder.table, + builder.oldTable, + builder.ts, + builder.concurrency, + builder.oldKeyspace, + builder.newKeyspace, + ) if err != nil { return nil, errors.Trace(err) } @@ -65,6 +85,8 @@ func buildChecksumRequest( oldTable *metautil.Table, startTS uint64, concurrency uint, + oldKeyspace []byte, + newKeyspace []byte, ) ([]*kv.Request, error) { var partDefs []model.PartitionDefinition if part := newTable.Partition; part != nil { @@ -76,7 +98,7 @@ func buildChecksumRequest( if oldTable != nil { oldTableID = oldTable.Info.ID } - rs, err := buildRequest(newTable, newTable.ID, oldTable, oldTableID, startTS, concurrency) + rs, err := buildRequest(newTable, newTable.ID, oldTable, oldTableID, startTS, concurrency, oldKeyspace, newKeyspace) if err != nil { return nil, errors.Trace(err) } @@ -91,7 +113,7 @@ func buildChecksumRequest( } } } - rs, err := buildRequest(newTable, partDef.ID, oldTable, oldPartID, startTS, concurrency) + rs, err := buildRequest(newTable, partDef.ID, oldTable, oldPartID, startTS, concurrency, oldKeyspace, newKeyspace) if err != nil { return nil, errors.Trace(err) } @@ -108,9 +130,11 @@ func buildRequest( oldTableID int64, startTS uint64, concurrency uint, + oldKeyspace []byte, + newKeyspace []byte, ) ([]*kv.Request, error) { reqs := make([]*kv.Request, 0) - req, err := buildTableRequest(tableInfo, tableID, oldTable, oldTableID, startTS, concurrency) + req, err := buildTableRequest(tableInfo, tableID, oldTable, oldTableID, startTS, concurrency, oldKeyspace, newKeyspace) if err != nil { return nil, errors.Trace(err) } @@ -139,7 +163,7 @@ func buildRequest( } } req, err = buildIndexRequest( - tableID, indexInfo, oldTableID, oldIndexInfo, startTS, concurrency) + tableID, indexInfo, oldTableID, oldIndexInfo, startTS, concurrency, oldKeyspace, newKeyspace) if err != nil { return nil, errors.Trace(err) } @@ -156,12 +180,14 @@ func buildTableRequest( oldTableID int64, startTS uint64, concurrency uint, + oldKeyspace []byte, + newKeyspace []byte, ) (*kv.Request, error) { var rule *tipb.ChecksumRewriteRule if oldTable != nil { rule = &tipb.ChecksumRewriteRule{ - OldPrefix: tablecodec.GenTableRecordPrefix(oldTableID), - NewPrefix: tablecodec.GenTableRecordPrefix(tableID), + OldPrefix: append(append([]byte{}, oldKeyspace...), tablecodec.GenTableRecordPrefix(oldTableID)...), + NewPrefix: append(append([]byte{}, newKeyspace...), tablecodec.GenTableRecordPrefix(tableID)...), } } @@ -195,12 +221,14 @@ func buildIndexRequest( oldIndexInfo *model.IndexInfo, startTS uint64, concurrency uint, + oldKeyspace []byte, + newKeyspace []byte, ) (*kv.Request, error) { var rule *tipb.ChecksumRewriteRule if oldIndexInfo != nil { rule = &tipb.ChecksumRewriteRule{ - OldPrefix: tablecodec.EncodeTableIndexPrefix(oldTableID, oldIndexInfo.ID), - NewPrefix: tablecodec.EncodeTableIndexPrefix(tableID, indexInfo.ID), + OldPrefix: append(append([]byte{}, oldKeyspace...), tablecodec.EncodeTableIndexPrefix(oldTableID, oldIndexInfo.ID)...), + NewPrefix: append(append([]byte{}, newKeyspace...), tablecodec.EncodeTableIndexPrefix(tableID, indexInfo.ID)...), } } checksum := &tipb.ChecksumRequest{ diff --git a/br/pkg/checksum/executor_test.go b/br/pkg/checksum/executor_test.go index adcaed9c314f9..876103bc055a2 100644 --- a/br/pkg/checksum/executor_test.go +++ b/br/pkg/checksum/executor_test.go @@ -104,7 +104,7 @@ func TestChecksum(t *testing.T) { first = false ranges, err := backup.BuildTableRanges(tableInfo3) require.NoError(t, err) - require.Equalf(t, ranges[:1], req.KeyRanges, "%v", req.KeyRanges) + require.Equalf(t, ranges[:1], req.KeyRanges.FirstPartitionRange(), "%v", req.KeyRanges.FirstPartitionRange()) } return nil })) diff --git a/br/pkg/config/BUILD.bazel b/br/pkg/config/BUILD.bazel index 942fd3462a7b9..610787d039894 100644 --- a/br/pkg/config/BUILD.bazel +++ b/br/pkg/config/BUILD.bazel @@ -15,8 +15,10 @@ go_library( go_test( name = "config_test", + timeout = "short", srcs = ["ebs_test.go"], data = ["ebs_backup.json"], embed = [":config"], + flaky = True, deps = ["@com_github_stretchr_testify//require"], ) diff --git a/br/pkg/conn/BUILD.bazel b/br/pkg/conn/BUILD.bazel index fc88f174394f3..da06e516f37ac 100644 --- a/br/pkg/conn/BUILD.bazel +++ b/br/pkg/conn/BUILD.bazel @@ -13,6 +13,7 @@ go_library( "//br/pkg/pdutil", "//br/pkg/utils", "//br/pkg/version", + "//config", "//domain", "//kv", "@com_github_docker_go_units//:go-units", diff --git a/br/pkg/conn/conn.go b/br/pkg/conn/conn.go index 5adbe0a33ab1c..187bc5ef1db79 100644 --- a/br/pkg/conn/conn.go +++ b/br/pkg/conn/conn.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/tidb/br/pkg/pdutil" "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/br/pkg/version" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/tikv/client-go/v2/oracle" @@ -174,7 +175,8 @@ func NewMgr( } // Disable GC because TiDB enables GC already. - storage, err := g.Open(fmt.Sprintf("tikv://%s?disableGC=true", pdAddrs), securityOption) + path := fmt.Sprintf("tikv://%s?disableGC=true&keyspaceName=%s", pdAddrs, config.GetGlobalKeyspaceName()) + storage, err := g.Open(path, securityOption) if err != nil { return nil, errors.Trace(err) } @@ -191,7 +193,6 @@ func NewMgr( return nil, errors.Trace(err) } // we must check tidb(tikv version) any time after concurrent ddl feature implemented in v6.2. - // when tidb < 6.2 we need set EnableConcurrentDDL false to make ddl works. // we will keep this check until 7.0, which allow the breaking changes. // NOTE: must call it after domain created! // FIXME: remove this check in v7.0 @@ -281,7 +282,8 @@ func (mgr *Mgr) GetTS(ctx context.Context) (uint64, error) { } // GetMergeRegionSizeAndCount returns the tikv config `coprocessor.region-split-size` and `coprocessor.region-split-key`. -func (mgr *Mgr) GetMergeRegionSizeAndCount(ctx context.Context, client *http.Client) (uint64, uint64, error) { +// returns the default config when failed. +func (mgr *Mgr) GetMergeRegionSizeAndCount(ctx context.Context, client *http.Client) (uint64, uint64) { regionSplitSize := DefaultMergeRegionSizeBytes regionSplitKeys := DefaultMergeRegionKeyCount type coprocessor struct { @@ -310,9 +312,10 @@ func (mgr *Mgr) GetMergeRegionSizeAndCount(ctx context.Context, client *http.Cli return nil }) if err != nil { - return 0, 0, errors.Trace(err) + log.Warn("meet error when getting config from TiKV; using default", logutil.ShortError(err)) + return DefaultMergeRegionSizeBytes, DefaultMergeRegionKeyCount } - return regionSplitSize, regionSplitKeys, nil + return regionSplitSize, regionSplitKeys } // GetConfigFromTiKV get configs from all alive tikv stores. diff --git a/br/pkg/conn/conn_test.go b/br/pkg/conn/conn_test.go index 01ce8bc08203e..fc822fac123d9 100644 --- a/br/pkg/conn/conn_test.go +++ b/br/pkg/conn/conn_test.go @@ -292,6 +292,38 @@ func TestGetMergeRegionSizeAndCount(t *testing.T) { regionSplitSize: DefaultMergeRegionSizeBytes, regionSplitKeys: DefaultMergeRegionKeyCount, }, + { + stores: []*metapb.Store{ + { + Id: 1, + State: metapb.StoreState_Up, + Labels: []*metapb.StoreLabel{ + { + Key: "engine", + Value: "tiflash", + }, + }, + }, + { + Id: 2, + State: metapb.StoreState_Up, + Labels: []*metapb.StoreLabel{ + { + Key: "engine", + Value: "tikv", + }, + }, + }, + }, + content: []string{ + "", + // Assuming the TiKV has failed due to some reason. + "", + }, + // no tikv detected in this case + regionSplitSize: DefaultMergeRegionSizeBytes, + regionSplitKeys: DefaultMergeRegionKeyCount, + }, { stores: []*metapb.Store{ { @@ -388,8 +420,7 @@ func TestGetMergeRegionSizeAndCount(t *testing.T) { httpCli := mockServer.Client() mgr := &Mgr{PdController: &pdutil.PdController{}} mgr.PdController.SetPDClient(pdCli) - rs, rk, err := mgr.GetMergeRegionSizeAndCount(ctx, httpCli) - require.NoError(t, err) + rs, rk := mgr.GetMergeRegionSizeAndCount(ctx, httpCli) require.Equal(t, ca.regionSplitSize, rs) require.Equal(t, ca.regionSplitKeys, rk) mockServer.Close() diff --git a/br/pkg/errors/errors.go b/br/pkg/errors/errors.go index 07e9fb6317cb9..2b7d76e28d795 100644 --- a/br/pkg/errors/errors.go +++ b/br/pkg/errors/errors.go @@ -83,8 +83,9 @@ var ( ErrStorageInvalidPermission = errors.Normalize("external storage permission", errors.RFCCodeText("BR:ExternalStorage:ErrStorageInvalidPermission")) // Snapshot restore - ErrRestoreTotalKVMismatch = errors.Normalize("restore total tikvs mismatch", errors.RFCCodeText("BR:EBS:ErrRestoreTotalKVMismatch")) - ErrRestoreInvalidPeer = errors.Normalize("restore met a invalid peer", errors.RFCCodeText("BR:EBS:ErrRestoreInvalidPeer")) + ErrRestoreTotalKVMismatch = errors.Normalize("restore total tikvs mismatch", errors.RFCCodeText("BR:EBS:ErrRestoreTotalKVMismatch")) + ErrRestoreInvalidPeer = errors.Normalize("restore met a invalid peer", errors.RFCCodeText("BR:EBS:ErrRestoreInvalidPeer")) + ErrRestoreRegionWithoutPeer = errors.Normalize("restore met a region without any peer", errors.RFCCodeText("BR:EBS:ErrRestoreRegionWithoutPeer")) // Errors reported from TiKV. ErrKVStorage = errors.Normalize("tikv storage occur I/O error", errors.RFCCodeText("BR:KV:ErrKVStorage")) diff --git a/br/pkg/errors/errors_test.go b/br/pkg/errors/errors_test.go index a6f4c412280cc..fab655ba60c7e 100644 --- a/br/pkg/errors/errors_test.go +++ b/br/pkg/errors/errors_test.go @@ -22,3 +22,9 @@ func TestIsContextCanceled(t *testing.T) { require.True(t, berrors.IsContextCanceled(&url.Error{Err: context.Canceled})) require.True(t, berrors.IsContextCanceled(&url.Error{Err: context.DeadlineExceeded})) } + +func TestEqual(t *testing.T) { + err := errors.Annotate(berrors.ErrPDBatchScanRegion, "test error equla") + r := berrors.ErrPDBatchScanRegion.Equal(err) + require.True(t, r) +} diff --git a/br/pkg/gluetidb/glue.go b/br/pkg/gluetidb/glue.go index 5483380d03e65..abe239f7723dc 100644 --- a/br/pkg/gluetidb/glue.go +++ b/br/pkg/gluetidb/glue.go @@ -61,6 +61,10 @@ type tidbSession struct { // GetDomain implements glue.Glue. func (Glue) GetDomain(store kv.Storage) (*domain.Domain, error) { + initStatsSe, err := session.CreateSession(store) + if err != nil { + return nil, errors.Trace(err) + } se, err := session.CreateSession(store) if err != nil { return nil, errors.Trace(err) @@ -69,8 +73,12 @@ func (Glue) GetDomain(store kv.Storage) (*domain.Domain, error) { if err != nil { return nil, errors.Trace(err) } + err = session.InitMDLVariable(store) + if err != nil { + return nil, err + } // create stats handler for backup and restore. - err = dom.UpdateTableStatsLoop(se) + err = dom.UpdateTableStatsLoop(se, initStatsSe) if err != nil { return nil, errors.Trace(err) } @@ -132,6 +140,10 @@ func (g Glue) UseOneShotSession(store kv.Storage, closeDomain bool, fn func(glue if err != nil { return errors.Trace(err) } + if err = session.InitMDLVariable(store); err != nil { + return errors.Trace(err) + } + // because domain was created during the whole program exists. // and it will register br info to info syncer. // we'd better close it as soon as possible. @@ -203,11 +215,36 @@ func (gs *tidbSession) CreatePlacementPolicy(ctx context.Context, policy *model. return d.CreatePlacementPolicyWithInfo(gs.se, policy, ddl.OnExistIgnore) } +// SplitBatchCreateTable provide a way to split batch into small batch when batch size is large than 6 MB. +// The raft entry has limit size of 6 MB, a batch of CreateTables may hit this limitation +// TODO: shall query string be set for each split batch create, it looks does not matter if we set once for all. +func (gs *tidbSession) SplitBatchCreateTable(schema model.CIStr, info []*model.TableInfo, cs ...ddl.CreateTableWithInfoConfigurier) error { + var err error + d := domain.GetDomain(gs.se).DDL() + if err = d.BatchCreateTableWithInfo(gs.se, schema, info, append(cs, ddl.OnExistIgnore)...); kv.ErrEntryTooLarge.Equal(err) { + if len(info) == 1 { + return err + } + mid := len(info) / 2 + err = gs.SplitBatchCreateTable(schema, info[:mid]) + if err != nil { + return err + } + err = gs.SplitBatchCreateTable(schema, info[mid:]) + if err != nil { + return err + } + return nil + } + return err +} + // CreateTables implements glue.BatchCreateTableSession. func (gs *tidbSession) CreateTables(ctx context.Context, tables map[string][]*model.TableInfo, cs ...ddl.CreateTableWithInfoConfigurier) error { - d := domain.GetDomain(gs.se).DDL() var dbName model.CIStr + // Disable foreign key check when batch create tables. + gs.se.GetSessionVars().ForeignKeyChecks = false for db, tablesInDB := range tables { dbName = model.NewCIStr(db) queryBuilder := strings.Builder{} @@ -231,8 +268,7 @@ func (gs *tidbSession) CreateTables(ctx context.Context, tables map[string][]*mo cloneTables = append(cloneTables, table) } gs.se.SetValue(sessionctx.QueryString, queryBuilder.String()) - err := d.BatchCreateTableWithInfo(gs.se, dbName, cloneTables, append(cs, ddl.OnExistIgnore)...) - if err != nil { + if err := gs.SplitBatchCreateTable(dbName, cloneTables); err != nil { //It is possible to failure when TiDB does not support model.ActionCreateTables. //In this circumstance, BatchCreateTableWithInfo returns errno.ErrInvalidDDLJob, //we fall back to old way that creating table one by one @@ -252,6 +288,8 @@ func (gs *tidbSession) CreateTable(ctx context.Context, dbName model.CIStr, tabl return errors.Trace(err) } gs.se.SetValue(sessionctx.QueryString, query) + // Disable foreign key check when batch create tables. + gs.se.GetSessionVars().ForeignKeyChecks = false // Clone() does not clone partitions yet :( table = table.Clone() if table.Partition != nil { @@ -303,7 +341,8 @@ func (gs *tidbSession) showCreatePlacementPolicy(policy *model.PolicyInfo) strin // mockSession is used for test. type mockSession struct { - se session.Session + se session.Session + globalVars map[string]string } // GetSessionCtx implements glue.Glue @@ -368,12 +407,16 @@ func (s *mockSession) Close() { // GetGlobalVariables implements glue.Session. func (s *mockSession) GetGlobalVariable(name string) (string, error) { - return "true", nil + if ret, ok := s.globalVars[name]; ok { + return ret, nil + } + return "True", nil } // MockGlue only used for test type MockGlue struct { - se session.Session + se session.Session + GlobalVars map[string]string } func (m *MockGlue) SetSession(se session.Session) { @@ -388,7 +431,8 @@ func (*MockGlue) GetDomain(store kv.Storage) (*domain.Domain, error) { // CreateSession implements glue.Glue. func (m *MockGlue) CreateSession(store kv.Storage) (glue.Session, error) { glueSession := &mockSession{ - se: m.se, + se: m.se, + globalVars: m.GlobalVars, } return glueSession, nil } diff --git a/br/pkg/lightning/BUILD.bazel b/br/pkg/lightning/BUILD.bazel index 6b3c5f8e3ce31..fc646195c6e2b 100644 --- a/br/pkg/lightning/BUILD.bazel +++ b/br/pkg/lightning/BUILD.bazel @@ -28,7 +28,10 @@ go_library( "//br/pkg/version/build", "//expression", "//planner/core", + "//util", "//util/promutil", + "@com_github_go_sql_driver_mysql//:mysql", + "@com_github_google_uuid//:uuid", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/import_sstpb", @@ -37,6 +40,7 @@ go_library( "@com_github_prometheus_client_golang//prometheus/promhttp", "@com_github_shurcool_httpgzip//:httpgzip", "@org_golang_x_exp//slices", + "@org_uber_go_atomic//:atomic", "@org_uber_go_zap//:zap", "@org_uber_go_zap//zapcore", ], diff --git a/br/pkg/lightning/backend/kv/BUILD.bazel b/br/pkg/lightning/backend/kv/BUILD.bazel index ea2cfefc2440e..b0da8a0e7deb4 100644 --- a/br/pkg/lightning/backend/kv/BUILD.bazel +++ b/br/pkg/lightning/backend/kv/BUILD.bazel @@ -46,13 +46,14 @@ go_test( name = "kv_test", timeout = "short", srcs = [ + "session_internal_test.go", "session_test.go", "sql2kv_test.go", ], + embed = [":kv"], flaky = True, race = "on", deps = [ - ":kv", "//br/pkg/lightning/common", "//br/pkg/lightning/log", "//br/pkg/lightning/verification", @@ -69,6 +70,7 @@ go_test( "//tablecodec", "//types", "//util/mock", + "@com_github_docker_go_units//:go-units", "@com_github_stretchr_testify//require", "@org_uber_go_zap//:zap", "@org_uber_go_zap//zapcore", diff --git a/br/pkg/lightning/backend/kv/allocator.go b/br/pkg/lightning/backend/kv/allocator.go index 02f46ea8c7e36..14703e1143a45 100644 --- a/br/pkg/lightning/backend/kv/allocator.go +++ b/br/pkg/lightning/backend/kv/allocator.go @@ -34,6 +34,7 @@ type panickingAllocator struct { func NewPanickingAllocators(base int64) autoid.Allocators { sharedBase := &base return autoid.NewAllocators( + false, &panickingAllocator{base: sharedBase, ty: autoid.RowIDAllocType}, &panickingAllocator{base: sharedBase, ty: autoid.AutoIncrementType}, &panickingAllocator{base: sharedBase, ty: autoid.AutoRandomType}, diff --git a/br/pkg/lightning/backend/kv/session.go b/br/pkg/lightning/backend/kv/session.go index 1cc261b677fe4..a8c5b5970cdf8 100644 --- a/br/pkg/lightning/backend/kv/session.go +++ b/br/pkg/lightning/backend/kv/session.go @@ -38,6 +38,8 @@ import ( "go.uber.org/zap" ) +const maxAvailableBufSize int = 20 + // invalidIterator is a trimmed down Iterator type which is invalid. type invalidIterator struct { kv.Iterator @@ -92,6 +94,12 @@ func (mb *kvMemBuf) Recycle(buf *bytesBuf) { buf.idx = 0 buf.cap = len(buf.buf) mb.Lock() + if len(mb.availableBufs) >= maxAvailableBufSize { + // too many byte buffers, evict one byte buffer and continue + evictedByteBuf := mb.availableBufs[0] + evictedByteBuf.destroy() + mb.availableBufs = mb.availableBufs[1:] + } mb.availableBufs = append(mb.availableBufs, buf) mb.Unlock() } @@ -99,8 +107,20 @@ func (mb *kvMemBuf) Recycle(buf *bytesBuf) { func (mb *kvMemBuf) AllocateBuf(size int) { mb.Lock() size = mathutil.Max(units.MiB, int(utils.NextPowerOfTwo(int64(size)))*2) - if len(mb.availableBufs) > 0 && mb.availableBufs[0].cap >= size { - mb.buf = mb.availableBufs[0] + var ( + existingBuf *bytesBuf + existingBufIdx int + ) + for i, buf := range mb.availableBufs { + if buf.cap >= size { + existingBuf = buf + existingBufIdx = i + break + } + } + if existingBuf != nil { + mb.buf = existingBuf + mb.availableBufs[existingBufIdx] = mb.availableBufs[0] mb.availableBufs = mb.availableBufs[1:] } else { mb.buf = newBytesBuf(size) diff --git a/br/pkg/lightning/backend/kv/session_internal_test.go b/br/pkg/lightning/backend/kv/session_internal_test.go new file mode 100644 index 0000000000000..97ebd8cc82d1b --- /dev/null +++ b/br/pkg/lightning/backend/kv/session_internal_test.go @@ -0,0 +1,126 @@ +// 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, +// 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 kv + +import ( + "testing" + + "github.com/docker/go-units" + "github.com/stretchr/testify/require" +) + +func TestKVMemBufInterweaveAllocAndRecycle(t *testing.T) { + type testCase struct { + AllocSizes []int + FinalAvailableByteBufCaps []int + } + for _, tc := range []testCase{ + { + AllocSizes: []int{ + 1 * units.MiB, + 2 * units.MiB, + 3 * units.MiB, + 4 * units.MiB, + 5 * units.MiB, + }, + // [2] => [2,4] => [2,4,8] => [4,2,8] => [4,2,8,16] + FinalAvailableByteBufCaps: []int{ + 4 * units.MiB, + 2 * units.MiB, + 8 * units.MiB, + 16 * units.MiB, + }, + }, + { + AllocSizes: []int{ + 5 * units.MiB, + 4 * units.MiB, + 3 * units.MiB, + 2 * units.MiB, + 1 * units.MiB, + }, + // [16] => [16] => [16] => [16] => [16] + FinalAvailableByteBufCaps: []int{16 * units.MiB}, + }, + { + AllocSizes: []int{5, 4, 3, 2, 1}, + // [1] => [1] => [1] => [1] => [1] + FinalAvailableByteBufCaps: []int{1 * units.MiB}, + }, + { + AllocSizes: []int{ + 1 * units.MiB, + 2 * units.MiB, + 3 * units.MiB, + 2 * units.MiB, + 1 * units.MiB, + 5 * units.MiB, + }, + // [2] => [2,4] => [2,4,8] => [2,8,4] => [8,4,2] => [8,4,2,16] + FinalAvailableByteBufCaps: []int{ + 8 * units.MiB, + 4 * units.MiB, + 2 * units.MiB, + 16 * units.MiB, + }, + }, + } { + testKVMemBuf := &kvMemBuf{} + for _, allocSize := range tc.AllocSizes { + testKVMemBuf.AllocateBuf(allocSize) + testKVMemBuf.Recycle(testKVMemBuf.buf) + } + require.Equal(t, len(tc.FinalAvailableByteBufCaps), len(testKVMemBuf.availableBufs)) + for i, bb := range testKVMemBuf.availableBufs { + require.Equal(t, tc.FinalAvailableByteBufCaps[i], bb.cap) + } + } +} + +func TestKVMemBufBatchAllocAndRecycle(t *testing.T) { + type testCase struct { + AllocSizes []int + FinalAvailableByteBufCaps []int + } + testKVMemBuf := &kvMemBuf{} + bBufs := []*bytesBuf{} + for i := 0; i < maxAvailableBufSize; i++ { + testKVMemBuf.AllocateBuf(1 * units.MiB) + bBufs = append(bBufs, testKVMemBuf.buf) + } + for i := 0; i < maxAvailableBufSize; i++ { + testKVMemBuf.AllocateBuf(2 * units.MiB) + bBufs = append(bBufs, testKVMemBuf.buf) + } + for _, bb := range bBufs { + testKVMemBuf.Recycle(bb) + } + require.Equal(t, maxAvailableBufSize, len(testKVMemBuf.availableBufs)) + for _, bb := range testKVMemBuf.availableBufs { + require.Equal(t, 4*units.MiB, bb.cap) + } + bBufs = bBufs[:0] + for i := 0; i < maxAvailableBufSize; i++ { + testKVMemBuf.AllocateBuf(1 * units.MiB) + bb := testKVMemBuf.buf + require.Equal(t, 4*units.MiB, bb.cap) + bBufs = append(bBufs, bb) + require.Equal(t, maxAvailableBufSize-i-1, len(testKVMemBuf.availableBufs)) + } + for _, bb := range bBufs { + testKVMemBuf.Recycle(bb) + } + require.Equal(t, maxAvailableBufSize, len(testKVMemBuf.availableBufs)) +} diff --git a/br/pkg/lightning/backend/kv/sql2kv.go b/br/pkg/lightning/backend/kv/sql2kv.go index 6cebb1e29e329..9ad552ef5f340 100644 --- a/br/pkg/lightning/backend/kv/sql2kv.go +++ b/br/pkg/lightning/backend/kv/sql2kv.go @@ -169,7 +169,7 @@ func collectGeneratedColumns(se *session, meta *model.TableInfo, cols []*table.C var genCols []genCol for i, col := range cols { if col.GeneratedExpr != nil { - expr, err := expression.RewriteAstExpr(se, col.GeneratedExpr, schema, names) + expr, err := expression.RewriteAstExpr(se, col.GeneratedExpr, schema, names, false) if err != nil { return nil, err } diff --git a/br/pkg/lightning/backend/local/BUILD.bazel b/br/pkg/lightning/backend/local/BUILD.bazel index 6e2b5e9a1c43c..42fbadabc9e11 100644 --- a/br/pkg/lightning/backend/local/BUILD.bazel +++ b/br/pkg/lightning/backend/local/BUILD.bazel @@ -69,6 +69,8 @@ go_library( "@org_golang_google_grpc//backoff", "@org_golang_google_grpc//codes", "@org_golang_google_grpc//credentials", + "@org_golang_google_grpc//credentials/insecure", + "@org_golang_google_grpc//encoding/gzip", "@org_golang_google_grpc//keepalive", "@org_golang_google_grpc//status", "@org_golang_x_exp//slices", @@ -94,7 +96,7 @@ go_test( ], embed = [":local"], flaky = True, - shard_count = 20, + shard_count = 40, deps = [ "//br/pkg/errors", "//br/pkg/lightning/backend", @@ -103,12 +105,14 @@ go_test( "//br/pkg/lightning/glue", "//br/pkg/lightning/log", "//br/pkg/lightning/mydump", + "//br/pkg/lightning/worker", "//br/pkg/membuf", "//br/pkg/mock", "//br/pkg/pdutil", "//br/pkg/restore/split", "//br/pkg/utils", "//ddl", + "//keyspace", "//kv", "//parser", "//parser/ast", diff --git a/br/pkg/lightning/backend/local/duplicate.go b/br/pkg/lightning/backend/local/duplicate.go index b2858a8456f36..fe6cd110a026c 100644 --- a/br/pkg/lightning/backend/local/duplicate.go +++ b/br/pkg/lightning/backend/local/duplicate.go @@ -211,7 +211,7 @@ func physicalTableIDs(tableInfo *model.TableInfo) []int64 { } // tableHandleKeyRanges returns all key ranges associated with the tableInfo. -func tableHandleKeyRanges(tableInfo *model.TableInfo) ([]tidbkv.KeyRange, error) { +func tableHandleKeyRanges(tableInfo *model.TableInfo) (*tidbkv.KeyRanges, error) { ranges := ranger.FullIntRange(false) if tableInfo.IsCommonHandle { ranges = ranger.FullRange() @@ -221,18 +221,9 @@ func tableHandleKeyRanges(tableInfo *model.TableInfo) ([]tidbkv.KeyRange, error) } // tableIndexKeyRanges returns all key ranges associated with the tableInfo and indexInfo. -func tableIndexKeyRanges(tableInfo *model.TableInfo, indexInfo *model.IndexInfo) ([]tidbkv.KeyRange, error) { +func tableIndexKeyRanges(tableInfo *model.TableInfo, indexInfo *model.IndexInfo) (*tidbkv.KeyRanges, error) { tableIDs := physicalTableIDs(tableInfo) - //nolint: prealloc - var keyRanges []tidbkv.KeyRange - for _, tid := range tableIDs { - partitionKeysRanges, err := distsql.IndexRangesToKVRanges(nil, tid, indexInfo.ID, ranger.FullRange(), nil) - if err != nil { - return nil, errors.Trace(err) - } - keyRanges = append(keyRanges, partitionKeysRanges...) - } - return keyRanges, nil + return distsql.IndexRangesToKVRangesForTables(nil, tableIDs, indexInfo.ID, ranger.FullRange(), nil) } // DupKVStream is a streaming interface for collecting duplicate key-value pairs. @@ -396,6 +387,7 @@ type DuplicateManager struct { tableName string splitCli split.SplitClient tikvCli *tikv.KVStore + tikvCodec tikv.Codec errorMgr *errormanager.ErrorManager decoder *kv.TableKVDecoder logger log.Logger @@ -410,6 +402,7 @@ func NewDuplicateManager( tableName string, splitCli split.SplitClient, tikvCli *tikv.KVStore, + tikvCodec tikv.Codec, errMgr *errormanager.ErrorManager, sessOpts *kv.SessionOptions, concurrency int, @@ -426,6 +419,7 @@ func NewDuplicateManager( tableName: tableName, splitCli: splitCli, tikvCli: tikvCli, + tikvCodec: tikvCodec, errorMgr: errMgr, decoder: decoder, logger: logger, @@ -448,6 +442,10 @@ func (m *DuplicateManager) RecordDataConflictError(ctx context.Context, stream D if err != nil { return errors.Trace(err) } + key, err = m.tikvCodec.DecodeKey(key) + if err != nil { + return errors.Trace(err) + } m.hasDupe.Store(true) h, err := m.decoder.DecodeHandleFromRowKey(key) @@ -513,6 +511,10 @@ func (m *DuplicateManager) RecordIndexConflictError(ctx context.Context, stream if err != nil { return errors.Trace(err) } + key, err = m.tikvCodec.DecodeKey(key) + if err != nil { + return errors.Trace(err) + } m.hasDupe.Store(true) h, err := m.decoder.DecodeHandleFromIndex(indexInfo, key, val) @@ -561,14 +563,23 @@ func (m *DuplicateManager) buildDupTasks() ([]dupTask, error) { if err != nil { return nil, errors.Trace(err) } - tasks := make([]dupTask, 0, len(keyRanges)) - for _, kr := range keyRanges { - tableID := tablecodec.DecodeTableID(kr.StartKey) - tasks = append(tasks, dupTask{ - KeyRange: kr, - tableID: tableID, - }) + tasks := make([]dupTask, 0, keyRanges.TotalRangeNum()*(1+len(m.tbl.Meta().Indices))) + putToTaskFunc := func(ranges []tidbkv.KeyRange, indexInfo *model.IndexInfo) { + if len(ranges) == 0 { + return + } + tid := tablecodec.DecodeTableID(ranges[0].StartKey) + for _, r := range ranges { + tasks = append(tasks, dupTask{ + KeyRange: r, + tableID: tid, + indexInfo: indexInfo, + }) + } } + keyRanges.ForEachPartition(func(ranges []tidbkv.KeyRange) { + putToTaskFunc(ranges, nil) + }) for _, indexInfo := range m.tbl.Meta().Indices { if indexInfo.State != model.StatePublic { continue @@ -577,14 +588,14 @@ func (m *DuplicateManager) buildDupTasks() ([]dupTask, error) { if err != nil { return nil, errors.Trace(err) } - for _, kr := range keyRanges { - tableID := tablecodec.DecodeTableID(kr.StartKey) - tasks = append(tasks, dupTask{ - KeyRange: kr, - tableID: tableID, - indexInfo: indexInfo, - }) - } + keyRanges.ForEachPartition(func(ranges []tidbkv.KeyRange) { + putToTaskFunc(ranges, indexInfo) + }) + } + + // Encode all the tasks + for i := range tasks { + tasks[i].StartKey, tasks[i].EndKey = m.tikvCodec.EncodeRange(tasks[i].StartKey, tasks[i].EndKey) } return tasks, nil } @@ -598,15 +609,19 @@ func (m *DuplicateManager) buildIndexDupTasks() ([]dupTask, error) { if err != nil { return nil, errors.Trace(err) } - tasks := make([]dupTask, 0, len(keyRanges)) - for _, kr := range keyRanges { - tableID := tablecodec.DecodeTableID(kr.StartKey) - tasks = append(tasks, dupTask{ - KeyRange: kr, - tableID: tableID, - indexInfo: indexInfo, - }) - } + tasks := make([]dupTask, 0, keyRanges.TotalRangeNum()) + keyRanges.ForEachPartition(func(ranges []tidbkv.KeyRange) { + if len(ranges) == 0 { + return + } + tid := tablecodec.DecodeTableID(ranges[0].StartKey) + for _, r := range ranges { + tasks = append(tasks, dupTask{ + KeyRange: r, + tableID: tid, + }) + } + }) return tasks, nil } return nil, nil diff --git a/br/pkg/lightning/backend/local/duplicate_test.go b/br/pkg/lightning/backend/local/duplicate_test.go index d1db76aae92f8..7c7d8a6182e25 100644 --- a/br/pkg/lightning/backend/local/duplicate_test.go +++ b/br/pkg/lightning/backend/local/duplicate_test.go @@ -22,6 +22,7 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/backend/local" "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/keyspace" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" @@ -52,7 +53,7 @@ func TestBuildDupTask(t *testing.T) { {&lkv.SessionOptions{IndexID: info.Indices[1].ID}, false}, } for _, tc := range testCases { - dupMgr, err := local.NewDuplicateManager(tbl, "t", nil, nil, nil, + dupMgr, err := local.NewDuplicateManager(tbl, "t", nil, nil, keyspace.CodecV1, nil, tc.sessOpt, 4, atomic.NewBool(false), log.FromContext(context.Background())) require.NoError(t, err) tasks, err := local.BuildDuplicateTaskForTest(dupMgr) diff --git a/br/pkg/lightning/backend/local/engine.go b/br/pkg/lightning/backend/local/engine.go index 32d004654233f..745454a372b18 100644 --- a/br/pkg/lightning/backend/local/engine.go +++ b/br/pkg/lightning/backend/local/engine.go @@ -32,6 +32,7 @@ import ( "github.com/google/btree" "github.com/google/uuid" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/tidb/br/pkg/lightning/backend" "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" "github.com/pingcap/tidb/br/pkg/lightning/checkpoints" @@ -42,6 +43,7 @@ import ( "github.com/pingcap/tidb/br/pkg/membuf" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/util/hack" + "github.com/tikv/client-go/v2/tikv" "go.uber.org/atomic" "go.uber.org/zap" "golang.org/x/exp/slices" @@ -123,6 +125,8 @@ type Engine struct { config backend.LocalEngineConfig tableInfo *checkpoints.TidbTableInfo + dupDetectOpt dupDetectOpt + // total size of SST files waiting to be ingested pendingFileSize atomic.Int64 @@ -981,7 +985,33 @@ func (e *Engine) newKVIter(ctx context.Context, opts *pebble.IterOptions) Iter { zap.String("table", common.UniqueTable(e.tableInfo.DB, e.tableInfo.Name)), zap.Int64("tableID", e.tableInfo.ID), zap.Stringer("engineUUID", e.UUID)) - return newDupDetectIter(ctx, e.db, e.keyAdapter, opts, e.duplicateDB, logger) + return newDupDetectIter(ctx, e.db, e.keyAdapter, opts, e.duplicateDB, logger, e.dupDetectOpt) +} + +func (e *Engine) getFirstAndLastKey(lowerBound, upperBound []byte) ([]byte, []byte, error) { + opt := &pebble.IterOptions{ + LowerBound: lowerBound, + UpperBound: upperBound, + } + + iter := e.newKVIter(context.Background(), opt) + //nolint: errcheck + defer iter.Close() + // Needs seek to first because NewIter returns an iterator that is unpositioned + hasKey := iter.First() + if iter.Error() != nil { + return nil, nil, errors.Annotate(iter.Error(), "failed to read the first key") + } + if !hasKey { + return nil, nil, nil + } + firstKey := append([]byte{}, iter.Key()...) + iter.Last() + if iter.Error() != nil { + return nil, nil, errors.Annotate(iter.Error(), "failed to seek to the last key") + } + lastKey := append([]byte{}, iter.Key()...) + return firstKey, lastKey, nil } type sstMeta struct { @@ -1017,6 +1047,8 @@ type Writer struct { batchSize int64 lastMetaSeq int32 + + tikvCodec tikv.Codec } func (w *Writer) appendRowsSorted(kvs []common.KvPair) error { @@ -1099,6 +1131,10 @@ func (w *Writer) AppendRows(ctx context.Context, tableName string, columnNames [ return errorEngineClosed } + for i := range kvs { + kvs[i].Key = w.tikvCodec.EncodeKey(kvs[i].Key) + } + w.Lock() defer w.Unlock() @@ -1189,6 +1225,15 @@ func (w *Writer) flushKVs(ctx context.Context) error { if err != nil { return errors.Trace(err) } + + failpoint.Inject("orphanWriterGoRoutine", func() { + _ = common.KillMySelf() + // mimic we meet context cancel error when `addSST` + <-ctx.Done() + time.Sleep(5 * time.Second) + failpoint.Return(errors.Trace(ctx.Err())) + }) + err = w.addSST(ctx, meta) if err != nil { return errors.Trace(err) diff --git a/br/pkg/lightning/backend/local/engine_test.go b/br/pkg/lightning/backend/local/engine_test.go index c7ffe04b95285..2b935f30bb0c2 100644 --- a/br/pkg/lightning/backend/local/engine_test.go +++ b/br/pkg/lightning/backend/local/engine_test.go @@ -31,8 +31,17 @@ import ( "github.com/stretchr/testify/require" ) -func TestIngestSSTWithClosedEngine(t *testing.T) { +func makePebbleDB(t *testing.T, opt *pebble.Options) (*pebble.DB, string) { dir := t.TempDir() + db, err := pebble.Open(path.Join(dir, "test"), opt) + require.NoError(t, err) + tmpPath := filepath.Join(dir, "test.sst") + err = os.Mkdir(tmpPath, 0o755) + require.NoError(t, err) + return db, tmpPath +} + +func TestIngestSSTWithClosedEngine(t *testing.T) { opt := &pebble.Options{ MemTableSize: 1024 * 1024, MaxConcurrentCompactions: 16, @@ -41,11 +50,7 @@ func TestIngestSSTWithClosedEngine(t *testing.T) { DisableWAL: true, ReadOnly: false, } - db, err := pebble.Open(filepath.Join(dir, "test"), opt) - require.NoError(t, err) - tmpPath := filepath.Join(dir, "test.sst") - err = os.Mkdir(tmpPath, 0o755) - require.NoError(t, err) + db, tmpPath := makePebbleDB(t, opt) _, engineUUID := backend.MakeUUID("ww", 0) engineCtx, cancel := context.WithCancel(context.Background()) @@ -84,3 +89,37 @@ func TestIngestSSTWithClosedEngine(t *testing.T) { }, }), errorEngineClosed) } + +func TestGetFirstAndLastKey(t *testing.T) { + db, tmpPath := makePebbleDB(t, nil) + f := &Engine{ + db: db, + sstDir: tmpPath, + } + err := db.Set([]byte("a"), []byte("a"), nil) + require.NoError(t, err) + err = db.Set([]byte("c"), []byte("c"), nil) + require.NoError(t, err) + err = db.Set([]byte("e"), []byte("e"), nil) + require.NoError(t, err) + + first, last, err := f.getFirstAndLastKey(nil, nil) + require.NoError(t, err) + require.Equal(t, []byte("a"), first) + require.Equal(t, []byte("e"), last) + + first, last, err = f.getFirstAndLastKey([]byte("b"), []byte("d")) + require.NoError(t, err) + require.Equal(t, []byte("c"), first) + require.Equal(t, []byte("c"), last) + + first, last, err = f.getFirstAndLastKey([]byte("b"), []byte("f")) + require.NoError(t, err) + require.Equal(t, []byte("c"), first) + require.Equal(t, []byte("e"), last) + + first, last, err = f.getFirstAndLastKey([]byte("y"), []byte("z")) + require.NoError(t, err) + require.Nil(t, first) + require.Nil(t, last) +} diff --git a/br/pkg/lightning/backend/local/iterator.go b/br/pkg/lightning/backend/local/iterator.go index e2cb3a447cfbb..29ed50b743773 100644 --- a/br/pkg/lightning/backend/local/iterator.go +++ b/br/pkg/lightning/backend/local/iterator.go @@ -21,6 +21,7 @@ import ( "github.com/cockroachdb/pebble" sst "github.com/pingcap/kvproto/pkg/import_sstpb" + "github.com/pingcap/tidb/br/pkg/lightning/common" "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/logutil" "go.uber.org/multierr" @@ -82,6 +83,11 @@ type dupDetectIter struct { writeBatch *pebble.Batch writeBatchSize int64 logger log.Logger + option dupDetectOpt +} + +type dupDetectOpt struct { + reportErrOnDup bool } func (d *dupDetectIter) Seek(key []byte) bool { @@ -149,6 +155,14 @@ func (d *dupDetectIter) Next() bool { d.curVal = append(d.curVal[:0], d.iter.Value()...) return true } + if d.option.reportErrOnDup { + dupKey := make([]byte, len(d.curKey)) + dupVal := make([]byte, len(d.iter.Value())) + copy(dupKey, d.curKey) + copy(dupVal, d.curVal) + d.err = common.ErrFoundDuplicateKeys.FastGenByArgs(dupKey, dupVal) + return false + } if !recordFirst { d.record(d.curRawKey, d.curKey, d.curVal) recordFirst = true @@ -192,7 +206,7 @@ func (d *dupDetectIter) OpType() sst.Pair_OP { var _ Iter = &dupDetectIter{} func newDupDetectIter(ctx context.Context, db *pebble.DB, keyAdapter KeyAdapter, - opts *pebble.IterOptions, dupDB *pebble.DB, logger log.Logger) *dupDetectIter { + opts *pebble.IterOptions, dupDB *pebble.DB, logger log.Logger, dupOpt dupDetectOpt) *dupDetectIter { newOpts := &pebble.IterOptions{TableFilter: opts.TableFilter} if len(opts.LowerBound) > 0 { newOpts.LowerBound = keyAdapter.Encode(nil, opts.LowerBound, math.MinInt64) @@ -206,6 +220,7 @@ func newDupDetectIter(ctx context.Context, db *pebble.DB, keyAdapter KeyAdapter, keyAdapter: keyAdapter, writeBatch: dupDB.NewBatch(), logger: logger, + option: dupOpt, } } diff --git a/br/pkg/lightning/backend/local/iterator_test.go b/br/pkg/lightning/backend/local/iterator_test.go index 3abb6fbc3b06c..c183963443bae 100644 --- a/br/pkg/lightning/backend/local/iterator_test.go +++ b/br/pkg/lightning/backend/local/iterator_test.go @@ -122,7 +122,7 @@ func TestDupDetectIterator(t *testing.T) { dupDB, err := pebble.Open(filepath.Join(storeDir, "duplicates"), &pebble.Options{}) require.NoError(t, err) var iter Iter - iter = newDupDetectIter(context.Background(), db, keyAdapter, &pebble.IterOptions{}, dupDB, log.L()) + iter = newDupDetectIter(context.Background(), db, keyAdapter, &pebble.IterOptions{}, dupDB, log.L(), dupDetectOpt{}) sort.Slice(pairs, func(i, j int) bool { key1 := keyAdapter.Encode(nil, pairs[i].Key, pairs[i].RowID) key2 := keyAdapter.Encode(nil, pairs[j].Key, pairs[j].RowID) @@ -217,7 +217,7 @@ func TestDupDetectIterSeek(t *testing.T) { dupDB, err := pebble.Open(filepath.Join(storeDir, "duplicates"), &pebble.Options{}) require.NoError(t, err) - iter := newDupDetectIter(context.Background(), db, keyAdapter, &pebble.IterOptions{}, dupDB, log.L()) + iter := newDupDetectIter(context.Background(), db, keyAdapter, &pebble.IterOptions{}, dupDB, log.L(), dupDetectOpt{}) require.True(t, iter.Seek([]byte{1, 2, 3, 1})) require.Equal(t, pairs[1].Val, iter.Value()) diff --git a/br/pkg/lightning/backend/local/local.go b/br/pkg/lightning/backend/local/local.go index 317124d0b8d19..cd2a7dd44c5cc 100644 --- a/br/pkg/lightning/backend/local/local.go +++ b/br/pkg/lightning/backend/local/local.go @@ -20,6 +20,7 @@ import ( "fmt" "io" "math" + "net" "os" "path/filepath" "strings" @@ -69,12 +70,15 @@ import ( "go.uber.org/atomic" "go.uber.org/multierr" "go.uber.org/zap" + "golang.org/x/exp/slices" "golang.org/x/sync/errgroup" "golang.org/x/time/rate" "google.golang.org/grpc" "google.golang.org/grpc/backoff" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/encoding/gzip" "google.golang.org/grpc/keepalive" "google.golang.org/grpc/status" ) @@ -91,6 +95,7 @@ const ( gRPCKeepAliveTime = 10 * time.Minute gRPCKeepAliveTimeout = 5 * time.Minute gRPCBackOffMaxDelay = 10 * time.Minute + writeStallSleepTime = 10 * time.Second // The max ranges count in a batch to split and scatter. maxBatchSplitRanges = 4096 @@ -127,18 +132,25 @@ type ImportClientFactory interface { } type importClientFactoryImpl struct { - conns *common.GRPCConns - splitCli split.SplitClient - tls *common.TLS - tcpConcurrency int + conns *common.GRPCConns + splitCli split.SplitClient + tls *common.TLS + tcpConcurrency int + compressionType config.CompressionType } -func newImportClientFactoryImpl(splitCli split.SplitClient, tls *common.TLS, tcpConcurrency int) *importClientFactoryImpl { +func newImportClientFactoryImpl( + splitCli split.SplitClient, + tls *common.TLS, + tcpConcurrency int, + compressionType config.CompressionType, +) *importClientFactoryImpl { return &importClientFactoryImpl{ - conns: common.NewGRPCConns(), - splitCli: splitCli, - tls: tls, - tcpConcurrency: tcpConcurrency, + conns: common.NewGRPCConns(), + splitCli: splitCli, + tls: tls, + tcpConcurrency: tcpConcurrency, + compressionType: compressionType, } } @@ -147,11 +159,14 @@ func (f *importClientFactoryImpl) makeConn(ctx context.Context, storeID uint64) if err != nil { return nil, errors.Trace(err) } - opt := grpc.WithInsecure() + var opts []grpc.DialOption if f.tls.TLSConfig() != nil { - opt = grpc.WithTransportCredentials(credentials.NewTLS(f.tls.TLSConfig())) + opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(f.tls.TLSConfig()))) + } else { + opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) } ctx, cancel := context.WithTimeout(ctx, dialTimeout) + defer cancel() bfConf := backoff.DefaultConfig bfConf.MaxDelay = gRPCBackOffMaxDelay @@ -160,10 +175,7 @@ func (f *importClientFactoryImpl) makeConn(ctx context.Context, storeID uint64) if addr == "" { addr = store.GetAddress() } - conn, err := grpc.DialContext( - ctx, - addr, - opt, + opts = append(opts, grpc.WithConnectParams(grpc.ConnectParams{Backoff: bfConf}), grpc.WithKeepaliveParams(keepalive.ClientParameters{ Time: gRPCKeepAliveTime, @@ -171,7 +183,26 @@ func (f *importClientFactoryImpl) makeConn(ctx context.Context, storeID uint64) PermitWithoutStream: true, }), ) - cancel() + switch f.compressionType { + case config.CompressionNone: + // do nothing + case config.CompressionGzip: + opts = append(opts, grpc.WithDefaultCallOptions(grpc.UseCompressor(gzip.Name))) + default: + return nil, common.ErrInvalidConfig.GenWithStack("unsupported compression type %s", f.compressionType) + } + + failpoint.Inject("LoggingImportBytes", func() { + opts = append(opts, grpc.WithContextDialer(func(ctx context.Context, target string) (net.Conn, error) { + conn, err := (&net.Dialer{}).DialContext(ctx, "tcp", target) + if err != nil { + return nil, err + } + return &loggingConn{Conn: conn}, nil + })) + }) + + conn, err := grpc.DialContext(ctx, addr, opts...) if err != nil { return nil, errors.Trace(err) } @@ -197,6 +228,15 @@ func (f *importClientFactoryImpl) Close() { f.conns.Close() } +type loggingConn struct { + net.Conn +} + +func (c loggingConn) Write(b []byte) (int, error) { + log.L().Debug("import write", zap.Int("bytes", len(b))) + return c.Conn.Write(b) +} + // Range record start and end key for localStoreDir.DB // so we can write it to tikv in streaming type Range struct { @@ -346,12 +386,13 @@ func checkTiFlashVersion(ctx context.Context, g glue.Glue, checkCtx *backend.Che type local struct { engines sync.Map // sync version of map[uuid.UUID]*Engine - pdCtl *pdutil.PdController - splitCli split.SplitClient - tikvCli *tikvclient.KVStore - tls *common.TLS - pdAddr string - g glue.Glue + pdCtl *pdutil.PdController + splitCli split.SplitClient + tikvCli *tikvclient.KVStore + tls *common.TLS + pdAddr string + g glue.Glue + tikvCodec tikvclient.Codec localStoreDir string @@ -369,6 +410,7 @@ type local struct { checkTiKVAvaliable bool duplicateDetection bool + duplicateDetectOpt dupDetectOpt duplicateDB *pebble.DB keyAdapter KeyAdapter errorMgr *errormanager.ErrorManager @@ -381,6 +423,12 @@ type local struct { encBuilder backend.EncodingBuilder targetInfoGetter backend.TargetInfoGetter + + // When TiKV is in normal mode, ingesting too many SSTs will cause TiKV write stall. + // To avoid this, we should check write stall before ingesting SSTs. Note that, we + // must check both leader node and followers in client side, because followers will + // not check write stall as long as ingest command is accepted by leader. + shouldCheckWriteStall bool } func openDuplicateDB(storeDir string) (*pebble.DB, error) { @@ -394,6 +442,13 @@ func openDuplicateDB(storeDir string) (*pebble.DB, error) { return pebble.Open(dbPath, opts) } +var ( + // RunInTest indicates whether the current process is running in test. + RunInTest bool + // LastAlloc is the last ID allocator. + LastAlloc manual.Allocator +) + // NewLocalBackend creates new connections to tikv. func NewLocalBackend( ctx context.Context, @@ -402,6 +457,7 @@ func NewLocalBackend( g glue.Glue, maxOpenFiles int, errorMgr *errormanager.ErrorManager, + keyspaceName string, ) (backend.Backend, error) { localFile := cfg.TikvImporter.SortedKVDir rangeConcurrency := cfg.TikvImporter.RangeConcurrency @@ -443,13 +499,24 @@ func NewLocalBackend( if err != nil { return backend.MakeBackend(nil), common.ErrCreateKVClient.Wrap(err).GenWithStackByArgs() } - rpcCli := tikvclient.NewRPCClient(tikvclient.WithSecurity(tls.ToTiKVSecurityConfig())) - pdCliForTiKV := &tikvclient.CodecPDClient{Client: pdCtl.GetPDClient()} + + var pdCliForTiKV *tikvclient.CodecPDClient + if keyspaceName == "" { + pdCliForTiKV = tikvclient.NewCodecPDClient(tikvclient.ModeTxn, pdCtl.GetPDClient()) + } else { + pdCliForTiKV, err = tikvclient.NewCodecPDClientWithKeyspace(tikvclient.ModeTxn, pdCtl.GetPDClient(), keyspaceName) + if err != nil { + return backend.MakeBackend(nil), common.ErrCreatePDClient.Wrap(err).GenWithStackByArgs() + } + } + + tikvCodec := pdCliForTiKV.GetCodec() + rpcCli := tikvclient.NewRPCClient(tikvclient.WithSecurity(tls.ToTiKVSecurityConfig()), tikvclient.WithCodec(tikvCodec)) tikvCli, err := tikvclient.NewKVStore("lightning-local-backend", pdCliForTiKV, spkv, rpcCli) if err != nil { return backend.MakeBackend(nil), common.ErrCreateKVClient.Wrap(err).GenWithStackByArgs() } - importClientFactory := newImportClientFactoryImpl(splitCli, tls, rangeConcurrency) + importClientFactory := newImportClientFactoryImpl(splitCli, tls, rangeConcurrency, cfg.TikvImporter.CompressKVPairs) duplicateDetection := cfg.TikvImporter.DuplicateResolution != config.DupeResAlgNone keyAdapter := KeyAdapter(noopKeyAdapter{}) if duplicateDetection { @@ -461,14 +528,20 @@ func NewLocalBackend( } else { writeLimiter = noopStoreWriteLimiter{} } + alloc := manual.Allocator{} + if RunInTest { + alloc.RefCnt = new(atomic.Int64) + LastAlloc = alloc + } local := &local{ - engines: sync.Map{}, - pdCtl: pdCtl, - splitCli: splitCli, - tikvCli: tikvCli, - tls: tls, - pdAddr: cfg.TiDB.PdAddr, - g: g, + engines: sync.Map{}, + pdCtl: pdCtl, + splitCli: splitCli, + tikvCli: tikvCli, + tls: tls, + pdAddr: cfg.TiDB.PdAddr, + g: g, + tikvCodec: tikvCodec, localStoreDir: localFile, rangeConcurrency: worker.NewPool(ctx, rangeConcurrency, "range"), @@ -481,16 +554,18 @@ func NewLocalBackend( engineMemCacheSize: int(cfg.TikvImporter.EngineMemCacheSize), localWriterMemCacheSize: int64(cfg.TikvImporter.LocalWriterMemCacheSize), duplicateDetection: duplicateDetection, + duplicateDetectOpt: dupDetectOpt{duplicateDetection && cfg.TikvImporter.DuplicateResolution == config.DupeResAlgErr}, checkTiKVAvaliable: cfg.App.CheckRequirements, duplicateDB: duplicateDB, keyAdapter: keyAdapter, errorMgr: errorMgr, importClientFactory: importClientFactory, - bufferPool: membuf.NewPool(membuf.WithAllocator(manual.Allocator{})), + bufferPool: membuf.NewPool(membuf.WithAllocator(alloc)), writeLimiter: writeLimiter, logger: log.FromContext(ctx), encBuilder: NewEncodingBuilder(ctx), targetInfoGetter: NewTargetInfoGetter(tls, g, cfg.TiDB.PdAddr), + shouldCheckWriteStall: cfg.Cron.SwitchMode.Duration == 0, } if m, ok := metric.FromContext(ctx); ok { local.metrics = m @@ -784,6 +859,7 @@ func (local *local) OpenEngine(ctx context.Context, cfg *backend.EngineConfig, e config: engineCfg, tableInfo: cfg.TableInfo, duplicateDetection: local.duplicateDetection, + dupDetectOpt: local.duplicateDetectOpt, duplicateDB: local.duplicateDB, errorMgr: local.errorMgr, keyAdapter: local.keyAdapter, @@ -834,6 +910,7 @@ func (local *local) CloseEngine(ctx context.Context, cfg *backend.EngineConfig, tableInfo: cfg.TableInfo, keyAdapter: local.keyAdapter, duplicateDetection: local.duplicateDetection, + dupDetectOpt: local.duplicateDetectOpt, duplicateDB: local.duplicateDB, errorMgr: local.errorMgr, logger: log.FromContext(ctx), @@ -878,9 +955,15 @@ type rangeStats struct { totalBytes int64 } +type tikvWriteResult struct { + sstMeta []*sst.SSTMeta + finishedRange Range + rangeStats rangeStats +} + // WriteToTiKV writer engine key-value pairs to tikv and return the sst meta generated by tikv. // we don't need to do cleanup for the pairs written to tikv if encounters an error, -// tikv will takes the responsibility to do so. +// tikv will take the responsibility to do so. func (local *local) WriteToTiKV( ctx context.Context, engine *Engine, @@ -888,9 +971,9 @@ func (local *local) WriteToTiKV( start, end []byte, regionSplitSize int64, regionSplitKeys int64, -) ([]*sst.SSTMeta, Range, rangeStats, error) { +) (*tikvWriteResult, error) { failpoint.Inject("WriteToTiKVNotEnoughDiskSpace", func(_ failpoint.Value) { - failpoint.Return(nil, Range{}, rangeStats{}, + failpoint.Return(nil, errors.Errorf("The available disk of TiKV (%s) only left %d, and capacity is %d", "", 0, 0)) }) if local.checkTiKVAvaliable { @@ -906,7 +989,7 @@ func (local *local) WriteToTiKV( // The available disk percent of TiKV ratio := store.Status.Available * 100 / store.Status.Capacity if ratio < 10 { - return nil, Range{}, rangeStats{}, errors.Errorf("The available disk of TiKV (%s) only left %d, and capacity is %d", + return nil, errors.Errorf("The available disk of TiKV (%s) only left %d, and capacity is %d", store.Store.Address, store.Status.Available, store.Status.Capacity) } } @@ -919,29 +1002,20 @@ func (local *local) WriteToTiKV( } begin := time.Now() regionRange := intersectRange(region.Region, Range{start: start, end: end}) - opt := &pebble.IterOptions{LowerBound: regionRange.start, UpperBound: regionRange.end} - iter := engine.newKVIter(ctx, opt) - //nolint: errcheck - defer iter.Close() - stats := rangeStats{} - iter.First() - if iter.Error() != nil { - return nil, Range{}, stats, errors.Annotate(iter.Error(), "failed to read the first key") + firstKey, lastKey, err := engine.getFirstAndLastKey(regionRange.start, regionRange.end) + if err != nil { + return nil, errors.Trace(err) } - if !iter.Valid() { + if firstKey == nil { log.FromContext(ctx).Info("keys within region is empty, skip ingest", logutil.Key("start", start), logutil.Key("regionStart", region.Region.StartKey), logutil.Key("end", end), logutil.Key("regionEnd", region.Region.EndKey)) - return nil, regionRange, stats, nil - } - firstKey := codec.EncodeBytes([]byte{}, iter.Key()) - iter.Last() - if iter.Error() != nil { - return nil, Range{}, stats, errors.Annotate(iter.Error(), "failed to seek to the last key") + return &tikvWriteResult{sstMeta: nil, finishedRange: regionRange, rangeStats: stats}, nil } - lastKey := codec.EncodeBytes([]byte{}, iter.Key()) + firstKey = codec.EncodeBytes([]byte{}, firstKey) + lastKey = codec.EncodeBytes([]byte{}, lastKey) u := uuid.New() meta := &sst.SSTMeta{ @@ -952,6 +1026,7 @@ func (local *local) WriteToTiKV( Start: firstKey, End: lastKey, }, + ApiVersion: local.tikvCodec.GetAPIVersion(), } leaderID := region.Leader.GetId() @@ -961,12 +1036,12 @@ func (local *local) WriteToTiKV( for _, peer := range region.Region.GetPeers() { cli, err := local.getImportClient(ctx, peer.StoreId) if err != nil { - return nil, Range{}, stats, err + return nil, errors.Trace(err) } wstream, err := cli.Write(ctx) if err != nil { - return nil, Range{}, stats, errors.Trace(err) + return nil, errors.Trace(err) } // Bind uuid for this write request @@ -976,7 +1051,7 @@ func (local *local) WriteToTiKV( }, } if err = wstream.Send(req); err != nil { - return nil, Range{}, stats, errors.Trace(err) + return nil, errors.Trace(err) } req.Chunk = &sst.WriteRequest_Batch{ Batch: &sst.WriteBatch{ @@ -1017,6 +1092,11 @@ func (local *local) WriteToTiKV( return nil } + opt := &pebble.IterOptions{LowerBound: regionRange.start, UpperBound: regionRange.end} + iter := engine.newKVIter(ctx, opt) + //nolint: errcheck + defer iter.Close() + for iter.First(); iter.Valid(); iter.Next() { kvSize := int64(len(iter.Key()) + len(iter.Value())) // here we reuse the `*sst.Pair`s to optimize object allocation @@ -1037,7 +1117,7 @@ func (local *local) WriteToTiKV( if count >= local.batchWriteKVPairs || size >= flushLimit { if err := flushKVs(); err != nil { - return nil, Range{}, stats, err + return nil, errors.Trace(err) } count = 0 size = 0 @@ -1049,12 +1129,12 @@ func (local *local) WriteToTiKV( } if iter.Error() != nil { - return nil, Range{}, stats, errors.Trace(iter.Error()) + return nil, errors.Trace(iter.Error()) } if count > 0 { if err := flushKVs(); err != nil { - return nil, Range{}, stats, err + return nil, errors.Trace(err) } count = 0 size = 0 @@ -1065,10 +1145,10 @@ func (local *local) WriteToTiKV( for i, wStream := range clients { resp, closeErr := wStream.CloseAndRecv() if closeErr != nil { - return nil, Range{}, stats, errors.Trace(closeErr) + return nil, errors.Trace(closeErr) } if resp.Error != nil { - return nil, Range{}, stats, errors.New(resp.Error.Message) + return nil, errors.New(resp.Error.Message) } if leaderID == region.Region.Peers[i].GetId() { leaderPeerMetas = resp.Metas @@ -1081,7 +1161,7 @@ func (local *local) WriteToTiKV( log.FromContext(ctx).Warn("write to tikv no leader", logutil.Region(region.Region), logutil.Leader(region.Leader), zap.Uint64("leader_id", leaderID), logutil.SSTMeta(meta), zap.Int64("kv_pairs", totalCount), zap.Int64("total_bytes", size)) - return nil, Range{}, stats, errors.Errorf("write to tikv with no leader returned, region '%d', leader: %d", + return nil, errors.Errorf("write to tikv with no leader returned, region '%d', leader: %d", region.Region.Id, leaderID) } @@ -1103,7 +1183,11 @@ func (local *local) WriteToTiKV( stats.count = totalCount stats.totalBytes = totalSize - return leaderPeerMetas, finishedRange, stats, nil + return &tikvWriteResult{ + sstMeta: leaderPeerMetas, + finishedRange: finishedRange, + rangeStats: stats, + }, nil } func (local *local) Ingest(ctx context.Context, metas []*sst.SSTMeta, region *split.RegionInfo) (*sst.IngestResponse, error) { @@ -1134,6 +1218,16 @@ func (local *local) Ingest(ctx context.Context, metas []*sst.SSTMeta, region *sp return resp, errors.Trace(err) } + if local.shouldCheckWriteStall { + writeStall, resp, err := local.checkWriteStall(ctx, region) + if err != nil { + return nil, errors.Trace(err) + } + if writeStall { + return resp, nil + } + } + req := &sst.MultiIngestRequest{ Context: reqCtx, Ssts: metas, @@ -1142,6 +1236,25 @@ func (local *local) Ingest(ctx context.Context, metas []*sst.SSTMeta, region *sp return resp, errors.Trace(err) } +func (local *local) checkWriteStall(ctx context.Context, region *split.RegionInfo) (bool, *sst.IngestResponse, error) { + for _, peer := range region.Region.GetPeers() { + cli, err := local.getImportClient(ctx, peer.StoreId) + if err != nil { + return false, nil, errors.Trace(err) + } + // currently we use empty MultiIngestRequest to check if TiKV is busy. + // If in future the rate limit feature contains more metrics we can switch to use it. + resp, err := cli.MultiIngest(ctx, &sst.MultiIngestRequest{}) + if err != nil { + return false, nil, errors.Trace(err) + } + if resp.Error != nil && resp.Error.ServerIsBusy != nil { + return true, resp, nil + } + } + return false, nil, nil +} + func splitRangeBySizeProps(fullRange Range, sizeProps *sizeProperties, sizeLimit int64, keysLimit int64) []Range { ranges := make([]Range, 0, sizeProps.totalSize/uint64(sizeLimit)) curSize := uint64(0) @@ -1178,29 +1291,14 @@ func splitRangeBySizeProps(fullRange Range, sizeProps *sizeProperties, sizeLimit } func (local *local) readAndSplitIntoRange(ctx context.Context, engine *Engine, regionSplitSize int64, regionSplitKeys int64) ([]Range, error) { - iter := engine.newKVIter(ctx, &pebble.IterOptions{}) - //nolint: errcheck - defer iter.Close() - - iterError := func(e string) error { - err := iter.Error() - if err != nil { - return errors.Annotate(err, e) - } - return errors.New(e) - } - - var firstKey, lastKey []byte - if iter.First() { - firstKey = append([]byte{}, iter.Key()...) - } else { - return nil, iterError("could not find first pair") + firstKey, lastKey, err := engine.getFirstAndLastKey(nil, nil) + if err != nil { + return nil, err } - if iter.Last() { - lastKey = append([]byte{}, iter.Key()...) - } else { - return nil, iterError("could not find last pair") + if firstKey == nil { + return nil, errors.New("could not find first pair") } + endKey := nextKey(lastKey) engineFileTotalSize := engine.TotalSize.Load() @@ -1230,45 +1328,27 @@ func (local *local) readAndSplitIntoRange(ctx context.Context, engine *Engine, r } func (local *local) writeAndIngestByRange( - ctxt context.Context, + ctx context.Context, engine *Engine, start, end []byte, regionSplitSize int64, regionSplitKeys int64, ) error { - ito := &pebble.IterOptions{ - LowerBound: start, - UpperBound: end, - } - - iter := engine.newKVIter(ctxt, ito) - //nolint: errcheck - defer iter.Close() - // Needs seek to first because NewIter returns an iterator that is unpositioned - hasKey := iter.First() - if iter.Error() != nil { - return errors.Annotate(iter.Error(), "failed to read the first key") + pairStart, pairEnd, err := engine.getFirstAndLastKey(start, end) + if err != nil { + return err } - if !hasKey { - log.FromContext(ctxt).Info("There is no pairs in iterator", + if pairStart == nil { + log.FromContext(ctx).Info("There is no pairs in iterator", logutil.Key("start", start), logutil.Key("end", end)) engine.finishedRanges.add(Range{start: start, end: end}) return nil } - pairStart := append([]byte{}, iter.Key()...) - iter.Last() - if iter.Error() != nil { - return errors.Annotate(iter.Error(), "failed to seek to the last key") - } - pairEnd := append([]byte{}, iter.Key()...) var regions []*split.RegionInfo - var err error - ctx, cancel := context.WithCancel(ctxt) - defer cancel() -WriteAndIngest: +ScanWriteIngest: for retry := 0; retry < maxRetryTimes; { if retry != 0 { select { @@ -1284,7 +1364,7 @@ WriteAndIngest: log.FromContext(ctx).Warn("scan region failed", log.ShortError(err), zap.Int("region_len", len(regions)), logutil.Key("startKey", startKey), logutil.Key("endKey", endKey), zap.Int("retry", retry)) retry++ - continue WriteAndIngest + continue ScanWriteIngest } for _, region := range regions { @@ -1309,7 +1389,7 @@ WriteAndIngest: } log.FromContext(ctx).Info("retry write and ingest kv pairs", logutil.Key("startKey", pairStart), logutil.Key("endKey", end), log.ShortError(err), zap.Int("retry", retry)) - continue WriteAndIngest + continue ScanWriteIngest } } @@ -1325,6 +1405,7 @@ const ( retryNone retryType = iota retryWrite retryIngest + retryBusyIngest ) func (local *local) isRetryableImportTiKVError(err error) bool { @@ -1340,6 +1421,11 @@ func (local *local) isRetryableImportTiKVError(err error) bool { return common.IsRetryableError(err) } +// writeAndIngestPairs writes the kv pairs in the range [start, end) to the peers +// of the region, and then send the ingest command to do RocksDB ingest. +// when return nil, it does not mean the whole task success. The success ranges is +// recorded in the engine.finishedRanges. +// TODO: regionSplitSize and regionSplitKeys can be a member of Engine, no need to pass it in every function. func (local *local) writeAndIngestPairs( ctx context.Context, engine *Engine, @@ -1349,13 +1435,10 @@ func (local *local) writeAndIngestPairs( regionSplitKeys int64, ) error { var err error - + var writeResult *tikvWriteResult loopWrite: for i := 0; i < maxRetryTimes; i++ { - var metas []*sst.SSTMeta - var finishedRange Range - var rangeStats rangeStats - metas, finishedRange, rangeStats, err = local.WriteToTiKV(ctx, engine, region, start, end, regionSplitSize, regionSplitKeys) + writeResult, err = local.WriteToTiKV(ctx, engine, region, start, end, regionSplitSize, regionSplitKeys) if err != nil { if !local.isRetryableImportTiKVError(err) { return err @@ -1364,6 +1447,7 @@ loopWrite: log.FromContext(ctx).Warn("write to tikv failed", log.ShortError(err), zap.Int("retry", i)) continue loopWrite } + metas, finishedRange, rangeStats := writeResult.sstMeta, writeResult.finishedRange, writeResult.rangeStats if len(metas) == 0 { return nil @@ -1430,6 +1514,7 @@ loopWrite: // ingest next meta break } + switch retryTy { case retryNone: log.FromContext(ctx).Warn("ingest failed noretry", log.ShortError(err), logutil.SSTMetas(ingestMetas), @@ -1442,25 +1527,30 @@ loopWrite: case retryIngest: region = newRegion continue + case retryBusyIngest: + log.FromContext(ctx).Warn("meet tikv busy when ingest", log.ShortError(err), logutil.SSTMetas(ingestMetas), + logutil.Region(region.Region)) + // ImportEngine will continue on this unfinished range + return nil } } } - if err != nil { - log.FromContext(ctx).Warn("write and ingest region, will retry import full range", log.ShortError(err), - logutil.Region(region.Region), logutil.Key("start", start), - logutil.Key("end", end)) - } else { + if err == nil { engine.importedKVSize.Add(rangeStats.totalBytes) engine.importedKVCount.Add(rangeStats.count) engine.finishedRanges.add(finishedRange) if local.metrics != nil { local.metrics.BytesCounter.WithLabelValues(metric.BytesStateImported).Add(float64(rangeStats.totalBytes)) } + return nil } + + log.FromContext(ctx).Warn("write and ingest region, will retry import full range", log.ShortError(err), + logutil.Region(region.Region), logutil.Key("start", start), + logutil.Key("end", end)) return errors.Trace(err) } - return errors.Trace(err) } @@ -1603,6 +1693,9 @@ func (local *local) ImportEngine(ctx context.Context, engineUUID uuid.UUID, regi // the table when table is created. needSplit := len(unfinishedRanges) > 1 || lfTotalSize > regionSplitSize || lfLength > regionSplitKeys // split region by given ranges + failpoint.Inject("failToSplit", func(_ failpoint.Value) { + needSplit = true + }) for i := 0; i < maxRetryTimes; i++ { err = local.SplitAndScatterRegionInBatches(ctx, unfinishedRanges, lf.tableInfo, needSplit, regionSplitSize, maxBatchSplitRanges) if err == nil || common.IsContextCanceledError(err) { @@ -1638,7 +1731,7 @@ func (local *local) CollectLocalDuplicateRows(ctx context.Context, tbl table.Tab }() atomicHasDupe := atomic.NewBool(false) - duplicateManager, err := NewDuplicateManager(tbl, tableName, local.splitCli, local.tikvCli, + duplicateManager, err := NewDuplicateManager(tbl, tableName, local.splitCli, local.tikvCli, local.tikvCodec, local.errorMgr, opts, local.dupeConcurrency, atomicHasDupe, log.FromContext(ctx)) if err != nil { return false, errors.Trace(err) @@ -1656,7 +1749,7 @@ func (local *local) CollectRemoteDuplicateRows(ctx context.Context, tbl table.Ta }() atomicHasDupe := atomic.NewBool(false) - duplicateManager, err := NewDuplicateManager(tbl, tableName, local.splitCli, local.tikvCli, + duplicateManager, err := NewDuplicateManager(tbl, tableName, local.splitCli, local.tikvCli, local.tikvCodec, local.errorMgr, opts, local.dupeConcurrency, atomicHasDupe, log.FromContext(ctx)) if err != nil { return false, errors.Trace(err) @@ -1690,13 +1783,18 @@ func (local *local) ResolveDuplicateRows(ctx context.Context, tbl table.Table, t return err } + tableIDs := physicalTableIDs(tbl.Meta()) + keyInTable := func(key []byte) bool { + return slices.Contains(tableIDs, tablecodec.DecodeTableID(key)) + } + errLimiter := rate.NewLimiter(1, 1) pool := utils.NewWorkerPool(uint(local.dupeConcurrency), "resolve duplicate rows") err = local.errorMgr.ResolveAllConflictKeys( ctx, tableName, pool, func(ctx context.Context, handleRows [][2][]byte) error { for { - err := local.deleteDuplicateRows(ctx, logger, handleRows, decoder) + err := local.deleteDuplicateRows(ctx, logger, handleRows, decoder, keyInTable) if err == nil { return nil } @@ -1719,7 +1817,13 @@ func (local *local) ResolveDuplicateRows(ctx context.Context, tbl table.Table, t return errors.Trace(err) } -func (local *local) deleteDuplicateRows(ctx context.Context, logger *log.Task, handleRows [][2][]byte, decoder *kv.TableKVDecoder) (err error) { +func (local *local) deleteDuplicateRows( + ctx context.Context, + logger *log.Task, + handleRows [][2][]byte, + decoder *kv.TableKVDecoder, + keyInTable func(key []byte) bool, +) (err error) { // Starts a Delete transaction. txn, err := local.tikvCli.Begin() if err != nil { @@ -1744,6 +1848,12 @@ func (local *local) deleteDuplicateRows(ctx context.Context, logger *log.Task, h // (if the number of duplicates is small this should fit entirely in memory) // (Txn's MemBuf's bufferSizeLimit is currently infinity) for _, handleRow := range handleRows { + // Skip the row key if it's not in the table. + // This can happen if the table has been recreated or truncated, + // and the duplicate key is from the old table. + if !keyInTable(handleRow[0]) { + continue + } logger.Debug("[resolve-dupe] found row to resolve", logutil.Key("handle", handleRow[0]), logutil.Key("row", handleRow[1])) @@ -1853,16 +1963,17 @@ func (local *local) LocalWriter(ctx context.Context, cfg *backend.LocalWriterCon return nil, errors.Errorf("could not find engine for %s", engineUUID.String()) } engine := e.(*Engine) - return openLocalWriter(cfg, engine, local.localWriterMemCacheSize, local.bufferPool.NewBuffer()) + return openLocalWriter(cfg, engine, local.tikvCodec, local.localWriterMemCacheSize, local.bufferPool.NewBuffer()) } -func openLocalWriter(cfg *backend.LocalWriterConfig, engine *Engine, cacheSize int64, kvBuffer *membuf.Buffer) (*Writer, error) { +func openLocalWriter(cfg *backend.LocalWriterConfig, engine *Engine, tikvCodec tikvclient.Codec, cacheSize int64, kvBuffer *membuf.Buffer) (*Writer, error) { w := &Writer{ engine: engine, memtableSizeLimit: cacheSize, kvBuffer: kvBuffer, isKVSorted: cfg.IsKVSorted, isWriteBatchSorted: true, + tikvCodec: tikvCodec, } // pre-allocate a long enough buffer to avoid a lot of runtime.growslice // this can help save about 3% of CPU. @@ -1959,7 +2070,7 @@ func (local *local) isIngestRetryable( } return retryWrite, newRegion, common.ErrKVRaftProposalDropped.GenWithStack(errPb.GetMessage()) case errPb.ServerIsBusy != nil: - return retryNone, nil, common.ErrKVServerIsBusy.GenWithStack(errPb.GetMessage()) + return retryBusyIngest, nil, common.ErrKVServerIsBusy.GenWithStack(errPb.GetMessage()) case errPb.RegionNotFound != nil: return retryNone, nil, common.ErrKVRegionNotFound.GenWithStack(errPb.GetMessage()) case errPb.ReadIndexNotReady != nil: @@ -1992,7 +2103,8 @@ func nextKey(key []byte) []byte { // in tikv <= 4.x, tikv will truncate the row key, so we should fetch the next valid row key // See: https://github.com/tikv/tikv/blob/f7f22f70e1585d7ca38a59ea30e774949160c3e8/components/raftstore/src/coprocessor/split_observer.rs#L36-L41 - if tablecodec.IsRecordKey(key) { + // we only do this for IntHandle, which is checked by length + if tablecodec.IsRecordKey(key) && len(key) == tablecodec.RecordRowKeyLen { tableID, handle, _ := tablecodec.DecodeRecordKey(key) nextHandle := handle.Next() // int handle overflow, use the next table prefix as nextKey @@ -2002,7 +2114,7 @@ func nextKey(key []byte) []byte { return tablecodec.EncodeRowKeyWithHandle(tableID, nextHandle) } - // if key is an index, directly append a 0x00 to the key. + // for index key and CommonHandle, directly append a 0x00 to the key. res := make([]byte, 0, len(key)+1) res = append(res, key...) res = append(res, 0) diff --git a/br/pkg/lightning/backend/local/local_test.go b/br/pkg/lightning/backend/local/local_test.go index 1a399552becf9..0294cd7c5f05e 100644 --- a/br/pkg/lightning/backend/local/local_test.go +++ b/br/pkg/lightning/backend/local/local_test.go @@ -18,10 +18,10 @@ import ( "bytes" "context" "encoding/binary" + "fmt" "io" "math" "math/rand" - "os" "path/filepath" "sort" "strings" @@ -42,10 +42,12 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" "github.com/pingcap/tidb/br/pkg/lightning/common" "github.com/pingcap/tidb/br/pkg/lightning/log" + "github.com/pingcap/tidb/br/pkg/lightning/worker" "github.com/pingcap/tidb/br/pkg/membuf" "github.com/pingcap/tidb/br/pkg/pdutil" "github.com/pingcap/tidb/br/pkg/restore/split" "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/keyspace" tidbkv "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/tablecodec" @@ -113,10 +115,21 @@ func TestNextKey(t *testing.T) { require.NoError(t, err) nextHdl, err := tidbkv.NewCommonHandle(nextKeyBytes) require.NoError(t, err) - expectNextKey := []byte(tablecodec.EncodeRowKeyWithHandle(1, nextHdl)) - require.Equal(t, expectNextKey, nextKey(key)) + nextValidKey := []byte(tablecodec.EncodeRowKeyWithHandle(1, nextHdl)) + // nextKey may return a key that can't be decoded, but it must not be larger than the valid next key. + require.True(t, bytes.Compare(nextKey(key), nextValidKey) <= 0, "datums: %v", datums) } + // a special case that when len(string datum) % 8 == 7, nextKey twice should not panic. + keyBytes, err := codec.EncodeKey(stmtCtx, nil, types.NewStringDatum("1234567")) + require.NoError(t, err) + h, err := tidbkv.NewCommonHandle(keyBytes) + require.NoError(t, err) + key = tablecodec.EncodeRowKeyWithHandle(1, h) + nextOnce := nextKey(key) + // should not panic + _ = nextKey(nextOnce) + // dIAAAAAAAAD/PV9pgAAAAAD/AAABA4AAAAD/AAAAAQOAAAD/AAAAAAEAAAD8 // a index key with: table: 61, index: 1, int64: 1, int64: 1 a := []byte{116, 128, 0, 0, 0, 0, 0, 0, 255, 61, 95, 105, 128, 0, 0, 0, 0, 255, 0, 0, 1, 3, 128, 0, 0, 0, 255, 0, 0, 0, 1, 3, 128, 0, 0, 255, 0, 0, 0, 0, 1, 0, 0, 0, 252} @@ -237,8 +250,6 @@ func TestRangeProperties(t *testing.T) { } func TestRangePropertiesWithPebble(t *testing.T) { - dir := t.TempDir() - sizeDistance := uint64(500) keysDistance := uint64(20) opt := &pebble.Options{ @@ -259,8 +270,7 @@ func TestRangePropertiesWithPebble(t *testing.T) { }, }, } - db, err := pebble.Open(filepath.Join(dir, "test"), opt) - require.NoError(t, err) + db, _ := makePebbleDB(t, opt) defer db.Close() // local collector @@ -277,7 +287,7 @@ func TestRangePropertiesWithPebble(t *testing.T) { key := make([]byte, 8) valueLen := rand.Intn(50) binary.BigEndian.PutUint64(key, uint64(i*100+j)) - err = wb.Set(key, value[:valueLen], writeOpt) + err := wb.Set(key, value[:valueLen], writeOpt) require.NoError(t, err) err = collector.Add(pebble.InternalKey{UserKey: key, Trailer: pebble.InternalKeyKindSet}, value[:valueLen]) require.NoError(t, err) @@ -304,7 +314,6 @@ func TestRangePropertiesWithPebble(t *testing.T) { } func testLocalWriter(t *testing.T, needSort bool, partitialSort bool) { - dir := t.TempDir() opt := &pebble.Options{ MemTableSize: 1024 * 1024, MaxConcurrentCompactions: 16, @@ -313,12 +322,8 @@ func testLocalWriter(t *testing.T, needSort bool, partitialSort bool) { DisableWAL: true, ReadOnly: false, } - db, err := pebble.Open(filepath.Join(dir, "test"), opt) - require.NoError(t, err) + db, tmpPath := makePebbleDB(t, opt) defer db.Close() - tmpPath := filepath.Join(dir, "test.sst") - err = os.Mkdir(tmpPath, 0o755) - require.NoError(t, err) _, engineUUID := backend.MakeUUID("ww", 0) engineCtx, cancel := context.WithCancel(context.Background()) @@ -339,7 +344,7 @@ func testLocalWriter(t *testing.T, needSort bool, partitialSort bool) { pool := membuf.NewPool() defer pool.Destroy() kvBuffer := pool.NewBuffer() - w, err := openLocalWriter(&backend.LocalWriterConfig{IsKVSorted: sorted}, f, 1024, kvBuffer) + w, err := openLocalWriter(&backend.LocalWriterConfig{IsKVSorted: sorted}, f, keyspace.CodecV1, 1024, kvBuffer) require.NoError(t, err) ctx := context.Background() @@ -564,7 +569,6 @@ func (i testIngester) ingest([]*sstMeta) error { } func TestLocalIngestLoop(t *testing.T) { - dir := t.TempDir() opt := &pebble.Options{ MemTableSize: 1024 * 1024, MaxConcurrentCompactions: 16, @@ -573,18 +577,14 @@ func TestLocalIngestLoop(t *testing.T) { DisableWAL: true, ReadOnly: false, } - db, err := pebble.Open(filepath.Join(dir, "test"), opt) - require.NoError(t, err) + db, tmpPath := makePebbleDB(t, opt) defer db.Close() - tmpPath := filepath.Join(dir, "test.sst") - err = os.Mkdir(tmpPath, 0o755) - require.NoError(t, err) _, engineUUID := backend.MakeUUID("ww", 0) engineCtx, cancel := context.WithCancel(context.Background()) f := Engine{ db: db, UUID: engineUUID, - sstDir: "", + sstDir: tmpPath, ctx: engineCtx, cancel: cancel, sstMetasChan: make(chan metaOrFlush, 64), @@ -637,7 +637,7 @@ func TestLocalIngestLoop(t *testing.T) { wg.Wait() f.mutex.RLock() - err = f.flushEngineWithoutLock(engineCtx) + err := f.flushEngineWithoutLock(engineCtx) require.NoError(t, err) f.mutex.RUnlock() @@ -732,7 +732,6 @@ func TestFilterOverlapRange(t *testing.T) { } func testMergeSSTs(t *testing.T, kvs [][]common.KvPair, meta *sstMeta) { - dir := t.TempDir() opt := &pebble.Options{ MemTableSize: 1024 * 1024, MaxConcurrentCompactions: 16, @@ -741,12 +740,8 @@ func testMergeSSTs(t *testing.T, kvs [][]common.KvPair, meta *sstMeta) { DisableWAL: true, ReadOnly: false, } - db, err := pebble.Open(filepath.Join(dir, "test"), opt) - require.NoError(t, err) + db, tmpPath := makePebbleDB(t, opt) defer db.Close() - tmpPath := filepath.Join(dir, "test.sst") - err = os.Mkdir(tmpPath, 0o755) - require.NoError(t, err) _, engineUUID := backend.MakeUUID("ww", 0) engineCtx, cancel := context.WithCancel(context.Background()) @@ -837,49 +832,90 @@ func TestMergeSSTsDuplicated(t *testing.T) { type mockPdClient struct { pd.Client - stores []*metapb.Store + stores []*metapb.Store + regions []*pd.Region } func (c *mockPdClient) GetAllStores(ctx context.Context, opts ...pd.GetStoreOption) ([]*metapb.Store, error) { return c.stores, nil } +func (c *mockPdClient) ScanRegions(ctx context.Context, key, endKey []byte, limit int) ([]*pd.Region, error) { + return c.regions, nil +} + type mockGrpcErr struct{} func (e mockGrpcErr) GRPCStatus() *status.Status { - return status.New(codes.Unimplemented, "unimplmented") + return status.New(codes.Unimplemented, "unimplemented") } func (e mockGrpcErr) Error() string { - return "unimplmented" + return "unimplemented" } type mockImportClient struct { sst.ImportSSTClient store *metapb.Store + resp *sst.IngestResponse err error retry int cnt int multiIngestCheckFn func(s *metapb.Store) bool + apiInvokeRecorder map[string][]uint64 +} + +func newMockImportClient() *mockImportClient { + return &mockImportClient{ + multiIngestCheckFn: func(s *metapb.Store) bool { + return true + }, + } } func (c *mockImportClient) MultiIngest(context.Context, *sst.MultiIngestRequest, ...grpc.CallOption) (*sst.IngestResponse, error) { defer func() { c.cnt++ }() - if c.cnt < c.retry && c.err != nil { - return nil, c.err + if c.apiInvokeRecorder != nil { + c.apiInvokeRecorder["MultiIngest"] = append(c.apiInvokeRecorder["MultiIngest"], c.store.GetId()) + } + if c.cnt < c.retry && (c.err != nil || c.resp != nil) { + return c.resp, c.err } if !c.multiIngestCheckFn(c.store) { return nil, mockGrpcErr{} } - return nil, nil + return &sst.IngestResponse{}, nil +} + +type mockWriteClient struct { + sst.ImportSST_WriteClient + writeResp *sst.WriteResponse +} + +func (m mockWriteClient) Send(request *sst.WriteRequest) error { + return nil +} + +func (m mockWriteClient) CloseAndRecv() (*sst.WriteResponse, error) { + return m.writeResp, nil +} + +func (c *mockImportClient) Write(ctx context.Context, opts ...grpc.CallOption) (sst.ImportSST_WriteClient, error) { + if c.apiInvokeRecorder != nil { + c.apiInvokeRecorder["Write"] = append(c.apiInvokeRecorder["Write"], c.store.GetId()) + } + return mockWriteClient{writeResp: &sst.WriteResponse{Metas: []*sst.SSTMeta{ + {}, {}, {}, + }}}, nil } type mockImportClientFactory struct { - stores []*metapb.Store - createClientFn func(store *metapb.Store) sst.ImportSSTClient + stores []*metapb.Store + createClientFn func(store *metapb.Store) sst.ImportSSTClient + apiInvokeRecorder map[string][]uint64 } func (f *mockImportClientFactory) Create(_ context.Context, storeID uint64) (sst.ImportSSTClient, error) { @@ -888,7 +924,7 @@ func (f *mockImportClientFactory) Create(_ context.Context, storeID uint64) (sst return f.createClientFn(store), nil } } - return nil, errors.New("store not found") + return nil, fmt.Errorf("store %d not found", storeID) } func (f *mockImportClientFactory) Close() {} @@ -1220,3 +1256,78 @@ func TestLocalIsRetryableTiKVWriteError(t *testing.T) { require.True(t, l.isRetryableImportTiKVError(io.EOF)) require.True(t, l.isRetryableImportTiKVError(errors.Trace(io.EOF))) } + +func TestCheckPeersBusy(t *testing.T) { + ctx := context.Background() + pdCli := &mockPdClient{} + pdCtl := &pdutil.PdController{} + pdCtl.SetPDClient(pdCli) + + keys := [][]byte{[]byte(""), []byte("a"), []byte("b"), []byte("")} + splitCli := initTestSplitClient3Replica(keys, nil) + apiInvokeRecorder := map[string][]uint64{} + serverIsBusyResp := &sst.IngestResponse{ + Error: &errorpb.Error{ + ServerIsBusy: &errorpb.ServerIsBusy{}, + }} + + createTimeStore12 := 0 + local := &local{ + pdCtl: pdCtl, + splitCli: splitCli, + importClientFactory: &mockImportClientFactory{ + stores: []*metapb.Store{ + // region ["", "a") is not used, skip (1, 2, 3) + {Id: 11}, {Id: 12}, {Id: 13}, // region ["a", "b") + {Id: 21}, {Id: 22}, {Id: 23}, // region ["b", "") + }, + createClientFn: func(store *metapb.Store) sst.ImportSSTClient { + importCli := newMockImportClient() + importCli.store = store + importCli.apiInvokeRecorder = apiInvokeRecorder + if store.Id == 12 { + createTimeStore12++ + // the second time to checkWriteStall + if createTimeStore12 == 2 { + importCli.retry = 1 + importCli.resp = serverIsBusyResp + } + } + return importCli + }, + }, + logger: log.L(), + ingestConcurrency: worker.NewPool(ctx, 1, "ingest"), + writeLimiter: noopStoreWriteLimiter{}, + bufferPool: membuf.NewPool(), + supportMultiIngest: true, + shouldCheckWriteStall: true, + tikvCodec: keyspace.CodecV1, + } + + db, tmpPath := makePebbleDB(t, nil) + _, engineUUID := backend.MakeUUID("ww", 0) + engineCtx, cancel := context.WithCancel(context.Background()) + f := &Engine{ + db: db, + UUID: engineUUID, + sstDir: tmpPath, + ctx: engineCtx, + cancel: cancel, + sstMetasChan: make(chan metaOrFlush, 64), + keyAdapter: noopKeyAdapter{}, + logger: log.L(), + } + err := f.db.Set([]byte("a"), []byte("a"), nil) + require.NoError(t, err) + err = f.db.Set([]byte("b"), []byte("b"), nil) + require.NoError(t, err) + err = local.writeAndIngestByRange(ctx, f, []byte("a"), []byte("c"), 0, 0) + require.NoError(t, err) + + require.Equal(t, []uint64{11, 12, 13, 21, 22, 23}, apiInvokeRecorder["Write"]) + // store 12 has a follower busy, so it will break the workflow for region (11, 12, 13) + require.Equal(t, []uint64{11, 12, 21, 22, 23, 21}, apiInvokeRecorder["MultiIngest"]) + // region (11, 12, 13) has key range ["a", "b"), it's not finished. + require.Equal(t, []Range{{start: []byte("b"), end: []byte("c")}}, f.finishedRanges.ranges) +} diff --git a/br/pkg/lightning/backend/local/localhelper.go b/br/pkg/lightning/backend/local/localhelper.go index 8b5819175430b..cd8a27b9bda48 100644 --- a/br/pkg/lightning/backend/local/localhelper.go +++ b/br/pkg/lightning/backend/local/localhelper.go @@ -27,6 +27,7 @@ import ( "github.com/docker/go-units" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" sst "github.com/pingcap/kvproto/pkg/import_sstpb" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/kvproto/pkg/pdpb" @@ -379,7 +380,14 @@ func fetchTableRegionSizeStats(ctx context.Context, db *sql.DB, tableID int64) ( return stats, errors.Trace(err) } -func (local *local) BatchSplitRegions(ctx context.Context, region *split.RegionInfo, keys [][]byte) (*split.RegionInfo, []*split.RegionInfo, error) { +func (local *local) BatchSplitRegions( + ctx context.Context, + region *split.RegionInfo, + keys [][]byte, +) (*split.RegionInfo, []*split.RegionInfo, error) { + failpoint.Inject("failToSplit", func(_ failpoint.Value) { + failpoint.Return(nil, nil, errors.New("retryable error")) + }) region, newRegions, err := local.splitCli.BatchSplitRegionsWithOrigin(ctx, region, keys) if err != nil { return nil, nil, errors.Annotatef(err, "batch split regions failed") diff --git a/br/pkg/lightning/backend/local/localhelper_test.go b/br/pkg/lightning/backend/local/localhelper_test.go index 6cbf7f2f14808..023fade304fae 100644 --- a/br/pkg/lightning/backend/local/localhelper_test.go +++ b/br/pkg/lightning/backend/local/localhelper_test.go @@ -47,7 +47,7 @@ func init() { splitRetryTimes = 2 } -type testClient struct { +type testSplitClient struct { mu sync.RWMutex stores map[uint64]*metapb.Store regions map[uint64]*split.RegionInfo @@ -57,17 +57,17 @@ type testClient struct { hook clientHook } -func newTestClient( +func newTestSplitClient( stores map[uint64]*metapb.Store, regions map[uint64]*split.RegionInfo, nextRegionID uint64, hook clientHook, -) *testClient { +) *testSplitClient { regionsInfo := &pdtypes.RegionTree{} for _, regionInfo := range regions { regionsInfo.SetRegion(pdtypes.NewRegionInfo(regionInfo.Region, regionInfo.Leader)) } - return &testClient{ + return &testSplitClient{ stores: stores, regions: regions, regionsInfo: regionsInfo, @@ -77,17 +77,17 @@ func newTestClient( } // ScatterRegions scatters regions in a batch. -func (c *testClient) ScatterRegions(ctx context.Context, regionInfo []*split.RegionInfo) error { +func (c *testSplitClient) ScatterRegions(ctx context.Context, regionInfo []*split.RegionInfo) error { return nil } -func (c *testClient) GetAllRegions() map[uint64]*split.RegionInfo { +func (c *testSplitClient) GetAllRegions() map[uint64]*split.RegionInfo { c.mu.RLock() defer c.mu.RUnlock() return c.regions } -func (c *testClient) GetStore(ctx context.Context, storeID uint64) (*metapb.Store, error) { +func (c *testSplitClient) GetStore(ctx context.Context, storeID uint64) (*metapb.Store, error) { c.mu.RLock() defer c.mu.RUnlock() store, ok := c.stores[storeID] @@ -97,19 +97,18 @@ func (c *testClient) GetStore(ctx context.Context, storeID uint64) (*metapb.Stor return store, nil } -func (c *testClient) GetRegion(ctx context.Context, key []byte) (*split.RegionInfo, error) { +func (c *testSplitClient) GetRegion(ctx context.Context, key []byte) (*split.RegionInfo, error) { c.mu.RLock() defer c.mu.RUnlock() for _, region := range c.regions { - if bytes.Compare(key, region.Region.StartKey) >= 0 && - (len(region.Region.EndKey) == 0 || bytes.Compare(key, region.Region.EndKey) < 0) { + if bytes.Compare(key, region.Region.StartKey) >= 0 && beforeEnd(key, region.Region.EndKey) { return region, nil } } return nil, errors.Errorf("region not found: key=%s", string(key)) } -func (c *testClient) GetRegionByID(ctx context.Context, regionID uint64) (*split.RegionInfo, error) { +func (c *testSplitClient) GetRegionByID(ctx context.Context, regionID uint64) (*split.RegionInfo, error) { c.mu.RLock() defer c.mu.RUnlock() region, ok := c.regions[regionID] @@ -119,7 +118,7 @@ func (c *testClient) GetRegionByID(ctx context.Context, regionID uint64) (*split return region, nil } -func (c *testClient) SplitRegion( +func (c *testSplitClient) SplitRegion( ctx context.Context, regionInfo *split.RegionInfo, key []byte, @@ -130,7 +129,7 @@ func (c *testClient) SplitRegion( splitKey := codec.EncodeBytes([]byte{}, key) for _, region := range c.regions { if bytes.Compare(splitKey, region.Region.StartKey) >= 0 && - (len(region.Region.EndKey) == 0 || bytes.Compare(splitKey, region.Region.EndKey) < 0) { + beforeEnd(splitKey, region.Region.EndKey) { target = region } } @@ -159,7 +158,7 @@ func (c *testClient) SplitRegion( return newRegion, nil } -func (c *testClient) BatchSplitRegionsWithOrigin( +func (c *testSplitClient) BatchSplitRegionsWithOrigin( ctx context.Context, regionInfo *split.RegionInfo, keys [][]byte, ) (*split.RegionInfo, []*split.RegionInfo, error) { c.mu.Lock() @@ -234,24 +233,24 @@ func (c *testClient) BatchSplitRegionsWithOrigin( return target, newRegions, err } -func (c *testClient) BatchSplitRegions( +func (c *testSplitClient) BatchSplitRegions( ctx context.Context, regionInfo *split.RegionInfo, keys [][]byte, ) ([]*split.RegionInfo, error) { _, newRegions, err := c.BatchSplitRegionsWithOrigin(ctx, regionInfo, keys) return newRegions, err } -func (c *testClient) ScatterRegion(ctx context.Context, regionInfo *split.RegionInfo) error { +func (c *testSplitClient) ScatterRegion(ctx context.Context, regionInfo *split.RegionInfo) error { return nil } -func (c *testClient) GetOperator(ctx context.Context, regionID uint64) (*pdpb.GetOperatorResponse, error) { +func (c *testSplitClient) GetOperator(ctx context.Context, regionID uint64) (*pdpb.GetOperatorResponse, error) { return &pdpb.GetOperatorResponse{ Header: new(pdpb.ResponseHeader), }, nil } -func (c *testClient) ScanRegions(ctx context.Context, key, endKey []byte, limit int) ([]*split.RegionInfo, error) { +func (c *testSplitClient) ScanRegions(ctx context.Context, key, endKey []byte, limit int) ([]*split.RegionInfo, error) { if c.hook != nil { key, endKey, limit = c.hook.BeforeScanRegions(ctx, key, endKey, limit) } @@ -272,19 +271,19 @@ func (c *testClient) ScanRegions(ctx context.Context, key, endKey []byte, limit return regions, err } -func (c *testClient) GetPlacementRule(ctx context.Context, groupID, ruleID string) (r pdtypes.Rule, err error) { +func (c *testSplitClient) GetPlacementRule(ctx context.Context, groupID, ruleID string) (r pdtypes.Rule, err error) { return } -func (c *testClient) SetPlacementRule(ctx context.Context, rule pdtypes.Rule) error { +func (c *testSplitClient) SetPlacementRule(ctx context.Context, rule pdtypes.Rule) error { return nil } -func (c *testClient) DeletePlacementRule(ctx context.Context, groupID, ruleID string) error { +func (c *testSplitClient) DeletePlacementRule(ctx context.Context, groupID, ruleID string) error { return nil } -func (c *testClient) SetStoresLabel(ctx context.Context, stores []uint64, labelKey, labelValue string) error { +func (c *testSplitClient) SetStoresLabel(ctx context.Context, stores []uint64, labelKey, labelValue string) error { return nil } @@ -305,7 +304,7 @@ func cloneRegion(region *split.RegionInfo) *split.RegionInfo { // For keys ["", "aay", "bba", "bbh", "cca", ""], the key ranges of // regions are [, aay), [aay, bba), [bba, bbh), [bbh, cca), [cca, ). -func initTestClient(keys [][]byte, hook clientHook) *testClient { +func initTestSplitClient(keys [][]byte, hook clientHook) *testSplitClient { peers := make([]*metapb.Peer, 1) peers[0] = &metapb.Peer{ Id: 1, @@ -329,13 +328,56 @@ func initTestClient(keys [][]byte, hook clientHook) *testClient { EndKey: endKey, RegionEpoch: &metapb.RegionEpoch{ConfVer: 1, Version: 1}, }, + Leader: peers[0], } } stores := make(map[uint64]*metapb.Store) stores[1] = &metapb.Store{ Id: 1, } - return newTestClient(stores, regions, uint64(len(keys)), hook) + return newTestSplitClient(stores, regions, uint64(len(keys)), hook) +} + +// initTestSplitClient3Replica will create a client that each region has 3 replicas, and their IDs and StoreIDs are +// (1, 2, 3), (11, 12, 13), ... +// For keys ["", "aay", "bba", "bbh", "cca", ""], the key ranges of +// region ranges are [, aay), [aay, bba), [bba, bbh), [bbh, cca), [cca, ). +func initTestSplitClient3Replica(keys [][]byte, hook clientHook) *testSplitClient { + regions := make(map[uint64]*split.RegionInfo) + stores := make(map[uint64]*metapb.Store) + for i := uint64(1); i < uint64(len(keys)); i++ { + startKey := keys[i-1] + if len(startKey) != 0 { + startKey = codec.EncodeBytes([]byte{}, startKey) + } + endKey := keys[i] + if len(endKey) != 0 { + endKey = codec.EncodeBytes([]byte{}, endKey) + } + baseID := (i-1)*10 + 1 + peers := make([]*metapb.Peer, 3) + for j := 0; j < 3; j++ { + peers[j] = &metapb.Peer{ + Id: baseID + uint64(j), + StoreId: baseID + uint64(j), + } + } + + regions[baseID] = &split.RegionInfo{ + Region: &metapb.Region{ + Id: baseID, + Peers: peers, + StartKey: startKey, + EndKey: endKey, + RegionEpoch: &metapb.RegionEpoch{ConfVer: 1, Version: 1}, + }, + Leader: peers[0], + } + stores[baseID] = &metapb.Store{ + Id: baseID, + } + } + return newTestSplitClient(stores, regions, uint64(len(keys)), hook) } func checkRegionRanges(t *testing.T, regions []*split.RegionInfo, keys [][]byte) { @@ -376,7 +418,7 @@ func (h *noopHook) AfterScanRegions(res []*split.RegionInfo, err error) ([]*spli type batchSplitHook interface { setup(t *testing.T) func() - check(t *testing.T, cli *testClient) + check(t *testing.T, cli *testSplitClient) } type defaultHook struct{} @@ -392,7 +434,7 @@ func (d defaultHook) setup(t *testing.T) func() { } } -func (d defaultHook) check(t *testing.T, cli *testClient) { +func (d defaultHook) check(t *testing.T, cli *testSplitClient) { // so with a batch split size of 4, there will be 7 time batch split // 1. region: [aay, bba), keys: [b, ba, bb] // 2. region: [bbh, cca), keys: [bc, bd, be, bf] @@ -414,7 +456,7 @@ func doTestBatchSplitRegionByRanges(ctx context.Context, t *testing.T, hook clie defer deferFunc() keys := [][]byte{[]byte(""), []byte("aay"), []byte("bba"), []byte("bbh"), []byte("cca"), []byte("")} - client := initTestClient(keys, hook) + client := initTestSplitClient(keys, hook) local := &local{ splitCli: client, g: glue.NewExternalTiDBGlue(nil, mysql.ModeNone), @@ -479,7 +521,7 @@ func (h batchSizeHook) setup(t *testing.T) func() { } } -func (h batchSizeHook) check(t *testing.T, cli *testClient) { +func (h batchSizeHook) check(t *testing.T, cli *testSplitClient) { // so with a batch split key size of 6, there will be 9 time batch split // 1. region: [aay, bba), keys: [b, ba, bb] // 2. region: [bbh, cca), keys: [bc, bd, be] @@ -583,7 +625,7 @@ func TestSplitAndScatterRegionInBatches(t *testing.T) { defer deferFunc() keys := [][]byte{[]byte(""), []byte("a"), []byte("b"), []byte("")} - client := initTestClient(keys, nil) + client := initTestSplitClient(keys, nil) local := &local{ splitCli: client, g: glue.NewExternalTiDBGlue(nil, mysql.ModeNone), @@ -670,7 +712,7 @@ func doTestBatchSplitByRangesWithClusteredIndex(t *testing.T, hook clientHook) { keys = append(keys, key) } keys = append(keys, tableEndKey, []byte("")) - client := initTestClient(keys, hook) + client := initTestSplitClient(keys, hook) local := &local{ splitCli: client, g: glue.NewExternalTiDBGlue(nil, mysql.ModeNone), diff --git a/br/pkg/lightning/checkpoints/checkpoints.go b/br/pkg/lightning/checkpoints/checkpoints.go index 13817e28eb668..d20134660de9c 100644 --- a/br/pkg/lightning/checkpoints/checkpoints.go +++ b/br/pkg/lightning/checkpoints/checkpoints.go @@ -262,6 +262,29 @@ func (ccp *ChunkCheckpoint) DeepCopy() *ChunkCheckpoint { } } +func (ccp *ChunkCheckpoint) UnfinishedSize() int64 { + if ccp.FileMeta.Compression == mydump.CompressionNone { + return ccp.Chunk.EndOffset - ccp.Chunk.Offset + } + return ccp.FileMeta.FileSize - ccp.Chunk.RealOffset +} + +func (ccp *ChunkCheckpoint) TotalSize() int64 { + if ccp.FileMeta.Compression == mydump.CompressionNone { + return ccp.Chunk.EndOffset - ccp.Key.Offset + } + // TODO: compressed file won't be split into chunks, so using FileSize as TotalSize is ok + // change this when we support split compressed file into chunks + return ccp.FileMeta.FileSize +} + +func (ccp *ChunkCheckpoint) FinishedSize() int64 { + if ccp.FileMeta.Compression == mydump.CompressionNone { + return ccp.Chunk.Offset - ccp.Key.Offset + } + return ccp.Chunk.RealOffset - ccp.Key.Offset +} + type EngineCheckpoint struct { Status CheckpointStatus Chunks []*ChunkCheckpoint // a sorted array diff --git a/br/pkg/lightning/common/BUILD.bazel b/br/pkg/lightning/common/BUILD.bazel index a5245356b2715..3bd871276d733 100644 --- a/br/pkg/lightning/common/BUILD.bazel +++ b/br/pkg/lightning/common/BUILD.bazel @@ -33,10 +33,51 @@ go_library( "@org_golang_google_grpc//:grpc", "@org_golang_google_grpc//codes", "@org_golang_google_grpc//credentials", + "@org_golang_google_grpc//credentials/insecure", "@org_golang_google_grpc//status", - "@org_golang_x_sys//unix", "@org_uber_go_zap//:zap", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:aix": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:android": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:darwin": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:dragonfly": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:freebsd": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:illumos": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:ios": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:js": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:linux": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:netbsd": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:openbsd": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:plan9": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:solaris": [ + "@org_golang_x_sys//unix", + ], + "//conditions:default": [], + }), ) go_test( diff --git a/br/pkg/lightning/common/errors.go b/br/pkg/lightning/common/errors.go index c2fc3dbaa901f..14645217636a4 100644 --- a/br/pkg/lightning/common/errors.go +++ b/br/pkg/lightning/common/errors.go @@ -51,6 +51,7 @@ var ( ErrCheckTableEmpty = errors.Normalize("check table empty error", errors.RFCCodeText("Lightning:PreCheck:ErrCheckTableEmpty")) ErrCheckCSVHeader = errors.Normalize("check csv header error", errors.RFCCodeText("Lightning:PreCheck:ErrCheckCSVHeader")) ErrCheckDataSource = errors.Normalize("check data source error", errors.RFCCodeText("Lightning:PreCheck:ErrCheckDataSource")) + ErrCheckCDCPiTR = errors.Normalize("check TiCDC/PiTR task error", errors.RFCCodeText("Lightning:PreCheck:ErrCheckCDCPiTR")) ErrOpenCheckpoint = errors.Normalize("open checkpoint error", errors.RFCCodeText("Lightning:Checkpoint:ErrOpenCheckpoint")) ErrReadCheckpoint = errors.Normalize("read checkpoint error", errors.RFCCodeText("Lightning:Checkpoint:ErrReadCheckpoint")) @@ -96,6 +97,7 @@ var ( ErrInvalidMetaStatus = errors.Normalize("invalid meta status: '%s'", errors.RFCCodeText("Lightning:Restore:ErrInvalidMetaStatus")) ErrTableIsChecksuming = errors.Normalize("table '%s' is checksuming", errors.RFCCodeText("Lightning:Restore:ErrTableIsChecksuming")) ErrResolveDuplicateRows = errors.Normalize("resolve duplicate rows error on table '%s'", errors.RFCCodeText("Lightning:Restore:ErrResolveDuplicateRows")) + ErrFoundDuplicateKeys = errors.Normalize("found duplicate key '%s', value '%s'", errors.RFCCodeText("Lightning:Restore:ErrFoundDuplicateKey")) ) type withStack struct { diff --git a/br/pkg/lightning/common/security.go b/br/pkg/lightning/common/security.go index a48abc48c2c54..8d0c98223d18a 100644 --- a/br/pkg/lightning/common/security.go +++ b/br/pkg/lightning/common/security.go @@ -28,6 +28,7 @@ import ( pd "github.com/tikv/pd/client" "google.golang.org/grpc" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" ) type TLS struct { @@ -104,7 +105,7 @@ func (tc *TLS) ToGRPCDialOption() grpc.DialOption { if tc.inner != nil { return grpc.WithTransportCredentials(credentials.NewTLS(tc.inner)) } - return grpc.WithInsecure() + return grpc.WithTransportCredentials(insecure.NewCredentials()) } // WrapListener places a TLS layer on top of the existing listener. diff --git a/br/pkg/lightning/common/util.go b/br/pkg/lightning/common/util.go index 679ba6cc5d48b..b9bdf564403de 100644 --- a/br/pkg/lightning/common/util.go +++ b/br/pkg/lightning/common/util.go @@ -16,6 +16,7 @@ package common import ( "context" + "crypto/tls" "database/sql" "encoding/base64" "encoding/json" @@ -47,14 +48,16 @@ const ( // MySQLConnectParam records the parameters needed to connect to a MySQL database. type MySQLConnectParam struct { - Host string - Port int - User string - Password string - SQLMode string - MaxAllowedPacket uint64 - TLS string - Vars map[string]string + Host string + Port int + User string + Password string + SQLMode string + MaxAllowedPacket uint64 + TLSConfig *tls.Config + AllowFallbackToPlaintext bool + Net string + Vars map[string]string } func (param *MySQLConnectParam) ToDriverConfig() *mysql.Config { @@ -64,11 +67,16 @@ func (param *MySQLConnectParam) ToDriverConfig() *mysql.Config { cfg.User = param.User cfg.Passwd = param.Password cfg.Net = "tcp" + if param.Net != "" { + cfg.Net = param.Net + } cfg.Addr = net.JoinHostPort(param.Host, strconv.Itoa(param.Port)) cfg.Params["charset"] = "utf8mb4" cfg.Params["sql_mode"] = fmt.Sprintf("'%s'", param.SQLMode) cfg.MaxAllowedPacket = int(param.MaxAllowedPacket) - cfg.TLSConfig = param.TLS + + cfg.TLS = param.TLSConfig + cfg.AllowFallbackToPlaintext = param.AllowFallbackToPlaintext for k, v := range param.Vars { cfg.Params[k] = fmt.Sprintf("'%s'", v) diff --git a/br/pkg/lightning/config/BUILD.bazel b/br/pkg/lightning/config/BUILD.bazel index 6d2cb32a9ccc7..b035b506aebf2 100644 --- a/br/pkg/lightning/config/BUILD.bazel +++ b/br/pkg/lightning/config/BUILD.bazel @@ -24,8 +24,9 @@ go_library( "@com_github_carlmjohnson_flagext//:flagext", "@com_github_docker_go_units//:go-units", "@com_github_go_sql_driver_mysql//:mysql", - "@com_github_google_uuid//:uuid", "@com_github_pingcap_errors//:errors", + "@org_golang_google_grpc//:grpc", + "@org_golang_google_grpc//keepalive", "@org_uber_go_atomic//:atomic", "@org_uber_go_zap//:zap", ], diff --git a/br/pkg/lightning/config/config.go b/br/pkg/lightning/config/config.go index fdbe962433806..d535478c5f4c4 100644 --- a/br/pkg/lightning/config/config.go +++ b/br/pkg/lightning/config/config.go @@ -16,6 +16,7 @@ package config import ( "context" + "crypto/tls" "encoding/json" "fmt" "math" @@ -32,7 +33,6 @@ import ( "github.com/BurntSushi/toml" "github.com/docker/go-units" gomysql "github.com/go-sql-driver/mysql" - "github.com/google/uuid" "github.com/pingcap/errors" "github.com/pingcap/tidb/br/pkg/lightning/common" "github.com/pingcap/tidb/br/pkg/lightning/log" @@ -135,6 +135,9 @@ type DBStore struct { IndexSerialScanConcurrency int `toml:"index-serial-scan-concurrency" json:"index-serial-scan-concurrency"` ChecksumTableConcurrency int `toml:"checksum-table-concurrency" json:"checksum-table-concurrency"` Vars map[string]string `toml:"-" json:"vars"` + + IOTotalBytes *atomic.Uint64 `toml:"-" json:"-"` + UUID string `toml:"-" json:"-"` } type Config struct { @@ -340,32 +343,64 @@ type MaxError struct { // In TiDB backend, this also includes all possible SQL errors raised from INSERT, // such as unique key conflict when `on-duplicate` is set to `error`. // When tolerated, the row causing the error will be skipped, and adds 1 to the counter. + // The default value is zero, which means that such errors are not tolerated. Type atomic.Int64 `toml:"type" json:"type"` // Conflict is the maximum number of unique key conflicts in local backend accepted. // When tolerated, every pair of conflict adds 1 to the counter. // Those pairs will NOT be deleted from the target. Conflict resolution is performed separately. - // TODO Currently this is hard-coded to infinity. - Conflict atomic.Int64 `toml:"conflict" json:"-"` + // The default value is max int64, which means conflict errors will be recorded as much as possible. + // Sometime the actual number of conflict record logged will be greater than the value configured here, + // because conflict error data are recorded batch by batch. + // If the limit is reached in a single batch, the entire batch of records will be persisted before an error is reported. + Conflict atomic.Int64 `toml:"conflict" json:"conflict"` } func (cfg *MaxError) UnmarshalTOML(v interface{}) error { + defaultValMap := map[string]int64{ + "syntax": 0, + "charset": math.MaxInt64, + "type": 0, + "conflict": math.MaxInt64, + } + // set default value first + cfg.Syntax.Store(defaultValMap["syntax"]) + cfg.Charset.Store(defaultValMap["charset"]) + cfg.Type.Store(defaultValMap["type"]) + cfg.Conflict.Store(defaultValMap["conflict"]) switch val := v.(type) { case int64: // ignore val that is smaller than 0 - if val < 0 { - val = 0 + if val >= 0 { + // only set type error + cfg.Type.Store(val) } - cfg.Syntax.Store(0) - cfg.Charset.Store(math.MaxInt64) - cfg.Type.Store(val) - cfg.Conflict.Store(math.MaxInt64) return nil case map[string]interface{}: - // TODO support stuff like `max-error = { charset = 1000, type = 1000 }` if proved useful. + // support stuff like `max-error = { charset = 1000, type = 1000 }`. + getVal := func(k string, v interface{}) int64 { + defaultVal, ok := defaultValMap[k] + if !ok { + return 0 + } + iVal, ok := v.(int64) + if !ok || iVal < 0 { + return defaultVal + } + return iVal + } + for k, v := range val { + switch k { + case "type": + cfg.Type.Store(getVal(k, v)) + case "conflict": + cfg.Conflict.Store(getVal(k, v)) + } + } + return nil default: + return errors.Errorf("invalid max-error '%v', should be an integer or a map of string:int64", v) } - return errors.Errorf("invalid max-error '%v', should be an integer", v) } // DuplicateResolutionAlgorithm is the config type of how to resolve duplicates. @@ -381,6 +416,10 @@ const ( // DupeResAlgRemove records all duplicate records like the 'record' algorithm and remove all information related to the // duplicated rows. Users need to analyze the lightning_task_info.conflict_error_v1 table to add back the correct rows. DupeResAlgRemove + + // DupeResAlgErr reports an error and stops the import process. + // Note: this value is only used for internal. + DupeResAlgErr ) func (dra *DuplicateResolutionAlgorithm) UnmarshalTOML(v interface{}) error { @@ -429,6 +468,58 @@ func (dra DuplicateResolutionAlgorithm) String() string { } } +// CompressionType is the config type of compression algorithm. +type CompressionType int + +const ( + // CompressionNone means no compression. + CompressionNone CompressionType = iota + // CompressionGzip means gzip compression. + CompressionGzip +) + +func (t *CompressionType) UnmarshalTOML(v interface{}) error { + if val, ok := v.(string); ok { + return t.FromStringValue(val) + } + return errors.Errorf("invalid compression-type '%v', please choose valid option between ['gzip']", v) +} + +func (t CompressionType) MarshalText() ([]byte, error) { + return []byte(t.String()), nil +} + +func (t *CompressionType) FromStringValue(s string) error { + switch strings.ToLower(s) { + case "": + *t = CompressionNone + case "gz", "gzip": + *t = CompressionGzip + default: + return errors.Errorf("invalid compression-type '%s', please choose valid option between ['gzip']", s) + } + return nil +} + +func (t *CompressionType) MarshalJSON() ([]byte, error) { + return []byte(`"` + t.String() + `"`), nil +} + +func (t *CompressionType) UnmarshalJSON(data []byte) error { + return t.FromStringValue(strings.Trim(string(data), `"`)) +} + +func (t CompressionType) String() string { + switch t { + case CompressionGzip: + return "gzip" + case CompressionNone: + return "" + default: + panic(fmt.Sprintf("invalid compression type '%d'", t)) + } +} + // PostRestore has some options which will be executed after kv restored. type PostRestore struct { Checksum PostOpLevel `toml:"checksum" json:"checksum"` @@ -440,14 +531,18 @@ type PostRestore struct { type CSVConfig struct { // Separator, Delimiter and Terminator should all be in utf8mb4 encoding. - Separator string `toml:"separator" json:"separator"` - Delimiter string `toml:"delimiter" json:"delimiter"` - Terminator string `toml:"terminator" json:"terminator"` - Null string `toml:"null" json:"null"` - Header bool `toml:"header" json:"header"` - TrimLastSep bool `toml:"trim-last-separator" json:"trim-last-separator"` - NotNull bool `toml:"not-null" json:"not-null"` - BackslashEscape bool `toml:"backslash-escape" json:"backslash-escape"` + Separator string `toml:"separator" json:"separator"` + Delimiter string `toml:"delimiter" json:"delimiter"` + Terminator string `toml:"terminator" json:"terminator"` + Null string `toml:"null" json:"null"` + Header bool `toml:"header" json:"header"` + HeaderSchemaMatch bool `toml:"header-schema-match" json:"header-schema-match"` + TrimLastSep bool `toml:"trim-last-separator" json:"trim-last-separator"` + NotNull bool `toml:"not-null" json:"not-null"` + BackslashEscape bool `toml:"backslash-escape" json:"backslash-escape"` + // hide these options for lightning configuration file, they can only be used by LOAD DATA + // https://dev.mysql.com/doc/refman/8.0/en/load-data.html#load-data-field-line-handling + StartingBy string `toml:"-" json:"-"` } type MydumperRuntime struct { @@ -540,6 +635,7 @@ type TikvImporter struct { OnDuplicate string `toml:"on-duplicate" json:"on-duplicate"` MaxKVPairs int `toml:"max-kv-pairs" json:"max-kv-pairs"` SendKVPairs int `toml:"send-kv-pairs" json:"send-kv-pairs"` + CompressKVPairs CompressionType `toml:"compress-kv-pairs" json:"compress-kv-pairs"` RegionSplitSize ByteSize `toml:"region-split-size" json:"region-split-size"` RegionSplitKeys int `toml:"region-split-keys" json:"region-split-keys"` SortedKVDir string `toml:"sorted-kv-dir" json:"sorted-kv-dir"` @@ -575,9 +671,8 @@ type Security struct { // RedactInfoLog indicates that whether enabling redact log RedactInfoLog bool `toml:"redact-info-log" json:"redact-info-log"` - // TLSConfigName is used to set tls config for lightning in DM, so we don't expose this field to user - // DM may running many lightning instances at same time, so we need to set different tls config name for each lightning - TLSConfigName string `toml:"-" json:"-"` + TLSConfig *tls.Config `toml:"-" json:"-"` + AllowFallbackToPlaintext bool `toml:"-" json:"-"` // When DM/engine uses lightning as a library, it can directly pass in the content CABytes []byte `toml:"-" json:"-"` @@ -585,10 +680,9 @@ type Security struct { KeyBytes []byte `toml:"-" json:"-"` } -// RegisterMySQL registers the TLS config with name "cluster" or security.TLSConfigName -// for use in `sql.Open()`. This method is goroutine-safe. -func (sec *Security) RegisterMySQL() error { - if sec == nil { +// BuildTLSConfig builds the tls config which is used by SQL drier later. +func (sec *Security) BuildTLSConfig() error { + if sec == nil || sec.TLSConfig != nil { return nil } @@ -601,21 +695,10 @@ func (sec *Security) RegisterMySQL() error { if err != nil { return errors.Trace(err) } - if tlsConfig != nil { - // error happens only when the key coincides with the built-in names. - _ = gomysql.RegisterTLSConfig(sec.TLSConfigName, tlsConfig) - } + sec.TLSConfig = tlsConfig return nil } -// DeregisterMySQL deregisters the TLS config with security.TLSConfigName -func (sec *Security) DeregisterMySQL() { - if sec == nil || len(sec.CAPath) == 0 { - return - } - gomysql.DeregisterTLSConfig(sec.TLSConfigName) -} - // A duration which can be deserialized from a TOML string. // Implemented as https://github.com/BurntSushi/toml#using-the-encodingtextunmarshaler-interface type Duration struct { @@ -714,13 +797,14 @@ func NewConfig() *Config { Mydumper: MydumperRuntime{ ReadBlockSize: ReadBlockSize, CSV: CSVConfig{ - Separator: ",", - Delimiter: `"`, - Header: true, - NotNull: false, - Null: `\N`, - BackslashEscape: true, - TrimLastSep: false, + Separator: ",", + Delimiter: `"`, + Header: true, + HeaderSchemaMatch: true, + NotNull: false, + Null: `\N`, + BackslashEscape: true, + TrimLastSep: false, }, StrictFormat: false, MaxRegionSize: MaxRegionSize, @@ -808,8 +892,16 @@ func (cfg *Config) LoadFromTOML(data []byte) error { unusedGlobalKeyStrs[key.String()] = struct{}{} } +iterateUnusedKeys: for _, key := range unusedConfigKeys { keyStr := key.String() + switch keyStr { + // these keys are not counted as decoded by toml decoder, but actually they are decoded, + // because the corresponding unmarshal logic handles these key's decoding in a custom way + case "lightning.max-error.type", + "lightning.max-error.conflict": + continue iterateUnusedKeys + } if _, found := unusedGlobalKeyStrs[keyStr]; found { bothUnused = append(bothUnused, keyStr) } else { @@ -1136,18 +1228,27 @@ func (cfg *Config) AdjustCheckPoint() { switch cfg.Checkpoint.Driver { case CheckpointDriverMySQL: param := common.MySQLConnectParam{ - Host: cfg.TiDB.Host, - Port: cfg.TiDB.Port, - User: cfg.TiDB.User, - Password: cfg.TiDB.Psw, - SQLMode: mysql.DefaultSQLMode, - MaxAllowedPacket: defaultMaxAllowedPacket, - TLS: cfg.TiDB.TLS, + Host: cfg.TiDB.Host, + Port: cfg.TiDB.Port, + User: cfg.TiDB.User, + Password: cfg.TiDB.Psw, + SQLMode: mysql.DefaultSQLMode, + MaxAllowedPacket: defaultMaxAllowedPacket, + TLSConfig: cfg.TiDB.Security.TLSConfig, + AllowFallbackToPlaintext: cfg.TiDB.Security.AllowFallbackToPlaintext, } cfg.Checkpoint.MySQLParam = ¶m case CheckpointDriverFile: cfg.Checkpoint.DSN = "/tmp/" + cfg.Checkpoint.Schema + ".pb" } + } else { + // try to remove allowAllFiles + mysqlCfg, err := gomysql.ParseDSN(cfg.Checkpoint.DSN) + if err != nil { + return + } + mysqlCfg.AllowAllFiles = false + cfg.Checkpoint.DSN = mysqlCfg.FormatDSN() } } @@ -1180,22 +1281,22 @@ func (cfg *Config) CheckAndAdjustSecurity() error { } switch cfg.TiDB.TLS { - case "": - if len(cfg.TiDB.Security.CAPath) > 0 || len(cfg.TiDB.Security.CABytes) > 0 || - len(cfg.TiDB.Security.CertPath) > 0 || len(cfg.TiDB.Security.CertBytes) > 0 || - len(cfg.TiDB.Security.KeyPath) > 0 || len(cfg.TiDB.Security.KeyBytes) > 0 { - if cfg.TiDB.Security.TLSConfigName == "" { - cfg.TiDB.Security.TLSConfigName = uuid.NewString() // adjust this the default value + case "skip-verify", "preferred": + if cfg.TiDB.Security.TLSConfig == nil { + /* #nosec G402 */ + cfg.TiDB.Security.TLSConfig = &tls.Config{ + MinVersion: tls.VersionTLS10, + InsecureSkipVerify: true, + NextProtos: []string{"h2", "http/1.1"}, // specify `h2` to let Go use HTTP/2. } - cfg.TiDB.TLS = cfg.TiDB.Security.TLSConfigName - } else { - cfg.TiDB.TLS = "false" + cfg.TiDB.Security.AllowFallbackToPlaintext = true } case "cluster": if len(cfg.Security.CAPath) == 0 { return common.ErrInvalidConfig.GenWithStack("cannot set `tidb.tls` to 'cluster' without a [security] section") } - case "false", "skip-verify", "preferred": + case "", "false": + cfg.TiDB.TLS = "false" return nil default: return common.ErrInvalidConfig.GenWithStack("unsupported `tidb.tls` config %s", cfg.TiDB.TLS) diff --git a/br/pkg/lightning/config/config_test.go b/br/pkg/lightning/config/config_test.go index e74094a6b9066..98635ba4674e9 100644 --- a/br/pkg/lightning/config/config_test.go +++ b/br/pkg/lightning/config/config_test.go @@ -19,6 +19,7 @@ import ( "context" "flag" "fmt" + "math" "net" "net/http" "net/http/httptest" @@ -279,31 +280,34 @@ func TestAdjustWillBatchImportRatioInvalid(t *testing.T) { } func TestAdjustSecuritySection(t *testing.T) { - uuidHolder := "" testCases := []struct { - input string - expectedCA string - expectedTLS string + input string + expectedCA string + hasTLS bool + fallback2NoTLS bool }{ { - input: ``, - expectedCA: "", - expectedTLS: "false", + input: ``, + expectedCA: "", + hasTLS: false, + fallback2NoTLS: false, }, { input: ` [security] `, - expectedCA: "", - expectedTLS: "false", + expectedCA: "", + hasTLS: false, + fallback2NoTLS: false, }, { input: ` [security] ca-path = "/path/to/ca.pem" `, - expectedCA: "/path/to/ca.pem", - expectedTLS: uuidHolder, + expectedCA: "/path/to/ca.pem", + hasTLS: false, + fallback2NoTLS: false, }, { input: ` @@ -311,8 +315,9 @@ func TestAdjustSecuritySection(t *testing.T) { ca-path = "/path/to/ca.pem" [tidb.security] `, - expectedCA: "", - expectedTLS: "false", + expectedCA: "", + hasTLS: false, + fallback2NoTLS: false, }, { input: ` @@ -321,8 +326,9 @@ func TestAdjustSecuritySection(t *testing.T) { [tidb.security] ca-path = "/path/to/ca2.pem" `, - expectedCA: "/path/to/ca2.pem", - expectedTLS: uuidHolder, + expectedCA: "/path/to/ca2.pem", + hasTLS: false, + fallback2NoTLS: false, }, { input: ` @@ -330,8 +336,9 @@ func TestAdjustSecuritySection(t *testing.T) { [tidb.security] ca-path = "/path/to/ca2.pem" `, - expectedCA: "/path/to/ca2.pem", - expectedTLS: uuidHolder, + expectedCA: "/path/to/ca2.pem", + hasTLS: false, + fallback2NoTLS: false, }, { input: ` @@ -340,8 +347,20 @@ func TestAdjustSecuritySection(t *testing.T) { tls = "skip-verify" [tidb.security] `, - expectedCA: "", - expectedTLS: "skip-verify", + expectedCA: "", + hasTLS: true, + fallback2NoTLS: true, + }, + { + input: ` + [security] + [tidb] + tls = "false" + [tidb.security] + `, + expectedCA: "", + hasTLS: false, + fallback2NoTLS: false, }, } @@ -357,19 +376,18 @@ func TestAdjustSecuritySection(t *testing.T) { err = cfg.Adjust(context.Background()) require.NoError(t, err, comment) require.Equal(t, tc.expectedCA, cfg.TiDB.Security.CAPath, comment) - if tc.expectedTLS == uuidHolder { - require.NotEmpty(t, cfg.TiDB.TLS, comment) + if tc.hasTLS { + require.NotNil(t, cfg.TiDB.Security.TLSConfig, comment) } else { - require.Equal(t, tc.expectedTLS, cfg.TiDB.TLS, comment) + require.Nil(t, cfg.TiDB.Security.TLSConfig, comment) } + require.Equal(t, tc.fallback2NoTLS, cfg.TiDB.Security.AllowFallbackToPlaintext, comment) } // test different tls config name cfg := config.NewConfig() assignMinimalLegalValue(cfg) cfg.Security.CAPath = "/path/to/ca.pem" - cfg.Security.TLSConfigName = "tidb-tls" require.NoError(t, cfg.Adjust(context.Background())) - require.Equal(t, cfg.TiDB.TLS, cfg.TiDB.Security.TLSConfigName) } func TestInvalidCSV(t *testing.T) { @@ -544,6 +562,126 @@ func TestDurationUnmarshal(t *testing.T) { require.Regexp(t, "time: unknown unit .?x.? in duration .?13x20s.?", err.Error()) } +func TestMaxErrorUnmarshal(t *testing.T) { + type testCase struct { + TOMLStr string + ExpectedValues map[string]int64 + ExpectErrStr string + CaseName string + } + for _, tc := range []*testCase{ + { + TOMLStr: `max-error = 123`, + ExpectedValues: map[string]int64{ + "syntax": 0, + "charset": math.MaxInt64, + "type": 123, + "conflict": math.MaxInt64, + }, + CaseName: "Normal_Int", + }, + { + TOMLStr: `max-error = -123`, + ExpectedValues: map[string]int64{ + "syntax": 0, + "charset": math.MaxInt64, + "type": 0, + "conflict": math.MaxInt64, + }, + CaseName: "Abnormal_Negative_Int", + }, + { + TOMLStr: `max-error = "abcde"`, + ExpectErrStr: "invalid max-error 'abcde', should be an integer or a map of string:int64", + CaseName: "Abnormal_String", + }, + { + TOMLStr: `[max-error] +syntax = 1 +charset = 2 +type = 3 +conflict = 4 +`, + ExpectedValues: map[string]int64{ + "syntax": 0, + "charset": math.MaxInt64, + "type": 3, + "conflict": 4, + }, + CaseName: "Normal_Map_All_Set", + }, + { + TOMLStr: `[max-error] +conflict = 1000 +`, + ExpectedValues: map[string]int64{ + "syntax": 0, + "charset": math.MaxInt64, + "type": 0, + "conflict": 1000, + }, + CaseName: "Normal_Map_Partial_Set", + }, + { + TOMLStr: `max-error = { conflict = 1000, type = 123 }`, + ExpectedValues: map[string]int64{ + "syntax": 0, + "charset": math.MaxInt64, + "type": 123, + "conflict": 1000, + }, + CaseName: "Normal_OneLineMap_Partial_Set", + }, + { + TOMLStr: `[max-error] +conflict = 1000 +not_exist = 123 +`, + ExpectedValues: map[string]int64{ + "syntax": 0, + "charset": math.MaxInt64, + "type": 0, + "conflict": 1000, + }, + CaseName: "Normal_Map_Partial_Set_Invalid_Key", + }, + { + TOMLStr: `[max-error] +conflict = 1000 +type = -123 +`, + ExpectedValues: map[string]int64{ + "syntax": 0, + "charset": math.MaxInt64, + "type": 0, + "conflict": 1000, + }, + CaseName: "Normal_Map_Partial_Set_Invalid_Value", + }, + { + TOMLStr: `[max-error] +conflict = 1000 +type = abc +`, + ExpectErrStr: `toml: line 3 (last key "max-error.type"): expected value but found "abc" instead`, + CaseName: "Normal_Map_Partial_Set_Invalid_ValueType", + }, + } { + targetLightningCfg := new(config.Lightning) + err := toml.Unmarshal([]byte(tc.TOMLStr), targetLightningCfg) + if len(tc.ExpectErrStr) > 0 { + require.Errorf(t, err, "test case: %s", tc.CaseName) + require.Equalf(t, tc.ExpectErrStr, err.Error(), "test case: %s", tc.CaseName) + } else { + require.NoErrorf(t, err, "test case: %s", tc.CaseName) + require.Equalf(t, tc.ExpectedValues["syntax"], targetLightningCfg.MaxError.Syntax.Load(), "test case: %s", tc.CaseName) + require.Equalf(t, tc.ExpectedValues["charset"], targetLightningCfg.MaxError.Charset.Load(), "test case: %s", tc.CaseName) + require.Equalf(t, tc.ExpectedValues["type"], targetLightningCfg.MaxError.Type.Load(), "test case: %s", tc.CaseName) + require.Equalf(t, tc.ExpectedValues["conflict"], targetLightningCfg.MaxError.Conflict.Load(), "test case: %s", tc.CaseName) + } + } +} + func TestDurationMarshalJSON(t *testing.T) { duration := config.Duration{} err := duration.UnmarshalText([]byte("13m20s")) @@ -626,7 +764,7 @@ func TestLoadConfig(t *testing.T) { err = taskCfg.Adjust(context.Background()) require.NoError(t, err) equivalentDSN := taskCfg.Checkpoint.MySQLParam.ToDriverConfig().FormatDSN() - expectedDSN := "guest:12345@tcp(172.16.30.11:4001)/?tls=false&maxAllowedPacket=67108864&charset=utf8mb4&sql_mode=%27ONLY_FULL_GROUP_BY%2CSTRICT_TRANS_TABLES%2CNO_ZERO_IN_DATE%2CNO_ZERO_DATE%2CERROR_FOR_DIVISION_BY_ZERO%2CNO_AUTO_CREATE_USER%2CNO_ENGINE_SUBSTITUTION%27" + expectedDSN := "guest:12345@tcp(172.16.30.11:4001)/?maxAllowedPacket=67108864&charset=utf8mb4&sql_mode=%27ONLY_FULL_GROUP_BY%2CSTRICT_TRANS_TABLES%2CNO_ZERO_IN_DATE%2CNO_ZERO_DATE%2CERROR_FOR_DIVISION_BY_ZERO%2CNO_AUTO_CREATE_USER%2CNO_ENGINE_SUBSTITUTION%27" require.Equal(t, expectedDSN, equivalentDSN) result := taskCfg.String() @@ -783,6 +921,17 @@ func TestAdjustDiskQuota(t *testing.T) { require.Equal(t, int64(0), int64(cfg.TikvImporter.DiskQuota)) } +func TestRemoveAllowAllFiles(t *testing.T) { + cfg := config.NewConfig() + assignMinimalLegalValue(cfg) + ctx := context.Background() + + cfg.Checkpoint.Driver = config.CheckpointDriverMySQL + cfg.Checkpoint.DSN = "guest:12345@tcp(172.16.30.11:4001)/?tls=false&allowAllFiles=true&charset=utf8mb4" + require.NoError(t, cfg.Adjust(ctx)) + require.Equal(t, "guest:12345@tcp(172.16.30.11:4001)/?tls=false&charset=utf8mb4", cfg.Checkpoint.DSN) +} + func TestDataCharacterSet(t *testing.T) { testCases := []struct { input string @@ -995,3 +1144,17 @@ func TestCreateSeveralConfigsWithDifferentFilters(t *testing.T) { )) require.True(t, common.StringSliceEqual(config.GetDefaultFilter(), originalDefaultCfg)) } + +func TestCompressionType(t *testing.T) { + var ct config.CompressionType + require.NoError(t, ct.FromStringValue("")) + require.Equal(t, config.CompressionNone, ct) + require.NoError(t, ct.FromStringValue("gzip")) + require.Equal(t, config.CompressionGzip, ct) + require.NoError(t, ct.FromStringValue("gz")) + require.Equal(t, config.CompressionGzip, ct) + require.EqualError(t, ct.FromStringValue("zstd"), "invalid compression-type 'zstd', please choose valid option between ['gzip']") + + require.Equal(t, "", config.CompressionNone.String()) + require.Equal(t, "gzip", config.CompressionGzip.String()) +} diff --git a/br/pkg/lightning/config/const.go b/br/pkg/lightning/config/const.go index 23a38ac41117d..767b7a3a06c89 100644 --- a/br/pkg/lightning/config/const.go +++ b/br/pkg/lightning/config/const.go @@ -15,7 +15,11 @@ package config import ( + "time" + "github.com/docker/go-units" + "google.golang.org/grpc" + "google.golang.org/grpc/keepalive" ) const ( @@ -34,3 +38,11 @@ const ( DefaultBatchSize ByteSize = 100 * units.GiB ) + +var ( + DefaultGrpcKeepaliveParams = grpc.WithKeepaliveParams(keepalive.ClientParameters{ + Time: 1 * time.Minute, + Timeout: 2 * time.Minute, + PermitWithoutStream: false, + }) +) diff --git a/br/pkg/lightning/errormanager/errormanager.go b/br/pkg/lightning/errormanager/errormanager.go index 43035716d729c..4085226063d38 100644 --- a/br/pkg/lightning/errormanager/errormanager.go +++ b/br/pkg/lightning/errormanager/errormanager.go @@ -40,9 +40,10 @@ const ( CREATE SCHEMA IF NOT EXISTS %s; ` - syntaxErrorTableName = "syntax_error_v1" - typeErrorTableName = "type_error_v1" - conflictErrorTableName = "conflict_error_v1" + syntaxErrorTableName = "syntax_error_v1" + typeErrorTableName = "type_error_v1" + // ConflictErrorTableName is the table name for duplicate detection. + ConflictErrorTableName = "conflict_error_v1" createSyntaxErrorTable = ` CREATE TABLE IF NOT EXISTS %s.` + syntaxErrorTableName + ` ( @@ -69,7 +70,7 @@ const ( ` createConflictErrorTable = ` - CREATE TABLE IF NOT EXISTS %s.` + conflictErrorTableName + ` ( + CREATE TABLE IF NOT EXISTS %s.` + ConflictErrorTableName + ` ( task_id bigint NOT NULL, create_time datetime(6) NOT NULL DEFAULT now(6), table_name varchar(261) NOT NULL, @@ -91,7 +92,7 @@ const ( ` insertIntoConflictErrorData = ` - INSERT INTO %s.` + conflictErrorTableName + ` + INSERT INTO %s.` + ConflictErrorTableName + ` (task_id, table_name, index_name, key_data, row_data, raw_key, raw_value, raw_handle, raw_row) VALUES ` @@ -99,7 +100,7 @@ const ( sqlValuesConflictErrorData = "(?,?,'PRIMARY',?,?,?,?,raw_key,raw_value)" insertIntoConflictErrorIndex = ` - INSERT INTO %s.` + conflictErrorTableName + ` + INSERT INTO %s.` + ConflictErrorTableName + ` (task_id, table_name, index_name, key_data, row_data, raw_key, raw_value, raw_handle, raw_row) VALUES ` @@ -108,7 +109,7 @@ const ( selectConflictKeys = ` SELECT _tidb_rowid, raw_handle, raw_row - FROM %s.` + conflictErrorTableName + ` + FROM %s.` + ConflictErrorTableName + ` WHERE table_name = ? AND _tidb_rowid >= ? and _tidb_rowid < ? ORDER BY _tidb_rowid LIMIT ?; ` @@ -193,7 +194,8 @@ func (em *ErrorManager) RecordTypeError( if em.remainingError.Type.Dec() < 0 { threshold := em.configError.Type.Load() if threshold > 0 { - encodeErr = errors.Annotatef(encodeErr, "meet errors exceed the max-error.type threshold '%d'", + encodeErr = errors.Annotatef(encodeErr, + "The number of type errors exceeds the threshold configured by `max-error.type`: '%d'", em.configError.Type.Load()) } return encodeErr @@ -240,17 +242,20 @@ func (em *ErrorManager) RecordDataConflictError( tableName string, conflictInfos []DataConflictInfo, ) error { + var gerr error if len(conflictInfos) == 0 { return nil } if em.remainingError.Conflict.Sub(int64(len(conflictInfos))) < 0 { threshold := em.configError.Conflict.Load() - return errors.Errorf(" meet errors exceed the max-error.conflict threshold '%d'", threshold) + // Still need to record this batch of conflict records, and then return this error at last. + // Otherwise, if the max-error.conflict is set a very small value, non of the conflict errors will be recorded + gerr = errors.Errorf("The number of conflict errors exceeds the threshold configured by `max-error.conflict`: '%d'", threshold) } if em.db == nil { - return nil + return gerr } exec := common.SQLWithRetry{ @@ -258,7 +263,7 @@ func (em *ErrorManager) RecordDataConflictError( Logger: logger, HideQueryLog: redact.NeedRedact(), } - return exec.Transact(ctx, "insert data conflict error record", func(c context.Context, txn *sql.Tx) error { + if err := exec.Transact(ctx, "insert data conflict error record", func(c context.Context, txn *sql.Tx) error { sb := &strings.Builder{} fmt.Fprintf(sb, insertIntoConflictErrorData, em.schemaEscaped) var sqlArgs []interface{} @@ -278,7 +283,10 @@ func (em *ErrorManager) RecordDataConflictError( } _, err := txn.ExecContext(c, sb.String(), sqlArgs...) return err - }) + }); err != nil { + gerr = err + } + return gerr } func (em *ErrorManager) RecordIndexConflictError( @@ -289,17 +297,20 @@ func (em *ErrorManager) RecordIndexConflictError( conflictInfos []DataConflictInfo, rawHandles, rawRows [][]byte, ) error { + var gerr error if len(conflictInfos) == 0 { return nil } if em.remainingError.Conflict.Sub(int64(len(conflictInfos))) < 0 { threshold := em.configError.Conflict.Load() - return errors.Errorf(" meet errors exceed the max-error.conflict threshold %d", threshold) + // Still need to record this batch of conflict records, and then return this error at last. + // Otherwise, if the max-error.conflict is set a very small value, non of the conflict errors will be recorded + gerr = errors.Errorf("The number of conflict errors exceeds the threshold configured by `max-error.conflict`: '%d'", threshold) } if em.db == nil { - return nil + return gerr } exec := common.SQLWithRetry{ @@ -307,7 +318,7 @@ func (em *ErrorManager) RecordIndexConflictError( Logger: logger, HideQueryLog: redact.NeedRedact(), } - return exec.Transact(ctx, "insert index conflict error record", func(c context.Context, txn *sql.Tx) error { + if err := exec.Transact(ctx, "insert index conflict error record", func(c context.Context, txn *sql.Tx) error { sb := &strings.Builder{} fmt.Fprintf(sb, insertIntoConflictErrorIndex, em.schemaEscaped) var sqlArgs []interface{} @@ -330,7 +341,10 @@ func (em *ErrorManager) RecordIndexConflictError( } _, err := txn.ExecContext(c, sb.String(), sqlArgs...) return err - }) + }); err != nil { + gerr = err + } + return gerr } // ResolveAllConflictKeys query all conflicting rows (handle and their @@ -468,7 +482,7 @@ func (em *ErrorManager) LogErrorDetails() { em.logger.Warn(fmtErrMsg(errCnt, "data type", "")) } if errCnt := em.conflictError(); errCnt > 0 { - em.logger.Warn(fmtErrMsg(errCnt, "data type", conflictErrorTableName)) + em.logger.Warn(fmtErrMsg(errCnt, "data type", ConflictErrorTableName)) } } @@ -511,7 +525,7 @@ func (em *ErrorManager) Output() string { } if errCnt := em.conflictError(); errCnt > 0 { count++ - t.AppendRow(table.Row{count, "Unique Key Conflict", errCnt, em.fmtTableName(conflictErrorTableName)}) + t.AppendRow(table.Row{count, "Unique Key Conflict", errCnt, em.fmtTableName(ConflictErrorTableName)}) } res := "\nImport Data Error Summary: \n" diff --git a/br/pkg/lightning/lightning.go b/br/pkg/lightning/lightning.go index 3770f7c8f07a4..6ed4b40335b96 100644 --- a/br/pkg/lightning/lightning.go +++ b/br/pkg/lightning/lightning.go @@ -33,6 +33,8 @@ import ( "sync" "time" + "github.com/go-sql-driver/mysql" + "github.com/google/uuid" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/import_sstpb" @@ -53,11 +55,13 @@ import ( "github.com/pingcap/tidb/br/pkg/version/build" _ "github.com/pingcap/tidb/expression" // get rid of `import cycle`: just init expression.RewriteAstExpr,and called at package `backend.kv`. _ "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/promutil" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/collectors" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/shurcooL/httpgzip" + "go.uber.org/atomic" "go.uber.org/zap" "go.uber.org/zap/zapcore" "golang.org/x/exp/slices" @@ -77,6 +81,7 @@ type Lightning struct { promFactory promutil.Factory promRegistry promutil.Registry + metrics *metric.Metrics cancelLock sync.Mutex curTask *config.Config @@ -369,6 +374,36 @@ func (l *Lightning) RunOnceWithOptions(taskCtx context.Context, taskCfg *config. taskCfg.TaskID = int64(val.(int)) }) + failpoint.Inject("SetIOTotalBytes", func(_ failpoint.Value) { + o.logger.Info("set io total bytes") + taskCfg.TiDB.IOTotalBytes = atomic.NewUint64(0) + taskCfg.TiDB.UUID = uuid.New().String() + go func() { + for { + time.Sleep(time.Millisecond * 10) + log.L().Info("IOTotalBytes", zap.Uint64("IOTotalBytes", taskCfg.TiDB.IOTotalBytes.Load())) + } + }() + }) + if taskCfg.TiDB.IOTotalBytes != nil { + o.logger.Info("found IO total bytes counter") + mysql.RegisterDialContext(taskCfg.TiDB.UUID, func(ctx context.Context, addr string) (net.Conn, error) { + o.logger.Debug("connection with IO bytes counter") + d := &net.Dialer{} + conn, err := d.DialContext(ctx, "tcp", addr) + if err != nil { + return nil, err + } + tcpConn := conn.(*net.TCPConn) + // try https://github.com/go-sql-driver/mysql/blob/bcc459a906419e2890a50fc2c99ea6dd927a88f2/connector.go#L56-L64 + err = tcpConn.SetKeepAlive(true) + if err != nil { + o.logger.Warn("set TCP keep alive failed", zap.Error(err)) + } + return util.NewTCPConnWithIOCounter(tcpConn, taskCfg.TiDB.IOTotalBytes), nil + }) + } + return l.run(taskCtx, taskCfg, o) } @@ -377,6 +412,38 @@ var ( taskCfgRecorderKey = "taskCfgRecorderKey" ) +func getKeyspaceName(g glue.Glue) (string, error) { + db, err := g.GetDB() + if err != nil { + return "", err + } + if db == nil { + return "", nil + } + + rows, err := db.Query("show config where Type = 'tidb' and name = 'keyspace-name'") + if err != nil { + return "", err + } + //nolint: errcheck + defer rows.Close() + + var ( + _type string + _instance string + _name string + value string + ) + if rows.Next() { + err = rows.Scan(&_type, &_instance, &_name, &value) + if err != nil { + return "", err + } + } + + return value, rows.Err() +} + func (l *Lightning) run(taskCtx context.Context, taskCfg *config.Config, o *options) (err error) { build.LogInfo(build.Lightning) o.logger.Info("cfg", zap.Stringer("cfg", taskCfg)) @@ -388,6 +455,7 @@ func (l *Lightning) run(taskCtx context.Context, taskCfg *config.Config, o *opti defer func() { metrics.UnregisterFrom(o.promRegistry) }() + l.metrics = metrics ctx := metric.NewContext(taskCtx, metrics) ctx = log.NewContext(ctx, o.logger) @@ -433,18 +501,21 @@ func (l *Lightning) run(taskCtx context.Context, taskCfg *config.Config, o *opti } }) - if err := taskCfg.TiDB.Security.RegisterMySQL(); err != nil { + failpoint.Inject("PrintStatus", func() { + defer func() { + finished, total := l.Status() + o.logger.Warn("PrintStatus Failpoint", + zap.Int64("finished", finished), + zap.Int64("total", total), + zap.Bool("equal", finished == total)) + }() + }) + + if err := taskCfg.TiDB.Security.BuildTLSConfig(); err != nil { return common.ErrInvalidTLSConfig.Wrap(err) } - defer func() { - // deregister TLS config with name "cluster" - if taskCfg.TiDB.Security == nil { - return - } - taskCfg.TiDB.Security.DeregisterMySQL() - }() - // initiation of default glue should be after RegisterMySQL, which is ready to be called after taskCfg.Adjust + // initiation of default glue should be after BuildTLSConfig, which is ready to be called after taskCfg.Adjust // and also put it here could avoid injecting another two SkipRunTask failpoint to caller g := o.glue if g == nil { @@ -502,7 +573,12 @@ func (l *Lightning) run(taskCtx context.Context, taskCfg *config.Config, o *opti dbMetas := mdl.GetDatabases() web.BroadcastInitProgress(dbMetas) - var procedure *restore.Controller + keyspaceName, err := getKeyspaceName(g) + if err != nil { + o.logger.Error("fail to get keyspace name", zap.Error(err)) + return errors.Trace(err) + } + o.logger.Info("acquired keyspace name", zap.String("keyspaceName", keyspaceName)) param := &restore.ControllerParam{ DBMetas: dbMetas, @@ -512,13 +588,21 @@ func (l *Lightning) run(taskCtx context.Context, taskCfg *config.Config, o *opti Glue: g, CheckpointStorage: o.checkpointStorage, CheckpointName: o.checkpointName, + DupIndicator: o.dupIndicator, + KeyspaceName: keyspaceName, } + var procedure *restore.Controller procedure, err = restore.NewRestoreController(ctx, taskCfg, param) if err != nil { o.logger.Error("restore failed", log.ShortError(err)) return errors.Trace(err) } + + failpoint.Inject("orphanWriterGoRoutine", func() { + // don't exit too quickly to expose panic + defer time.Sleep(time.Second * 10) + }) defer procedure.Close() err = procedure.Run(ctx) @@ -544,6 +628,12 @@ func (l *Lightning) Status() (finished int64, total int64) { return } +// Metrics returns the metrics of lightning. +// it's inited during `run`, so might return nil. +func (l *Lightning) Metrics() *metric.Metrics { + return l.metrics +} + func writeJSONError(w http.ResponseWriter, code int, prefix string, err error) { type errorResponse struct { Error string `json:"error"` diff --git a/br/pkg/lightning/manual/BUILD.bazel b/br/pkg/lightning/manual/BUILD.bazel index 6d1fc18dd2495..d54902a23c066 100644 --- a/br/pkg/lightning/manual/BUILD.bazel +++ b/br/pkg/lightning/manual/BUILD.bazel @@ -10,4 +10,5 @@ go_library( cgo = True, importpath = "github.com/pingcap/tidb/br/pkg/lightning/manual", visibility = ["//visibility:public"], + deps = ["@org_uber_go_atomic//:atomic"], ) diff --git a/br/pkg/lightning/manual/allocator.go b/br/pkg/lightning/manual/allocator.go index 821eb750c5030..18aa8cc9353c4 100644 --- a/br/pkg/lightning/manual/allocator.go +++ b/br/pkg/lightning/manual/allocator.go @@ -14,8 +14,33 @@ package manual -type Allocator struct{} +import ( + "fmt" -func (Allocator) Alloc(n int) []byte { return New(n) } + "go.uber.org/atomic" +) -func (Allocator) Free(b []byte) { Free(b) } +type Allocator struct { + RefCnt *atomic.Int64 +} + +func (a Allocator) Alloc(n int) []byte { + if a.RefCnt != nil { + a.RefCnt.Add(1) + } + return New(n) +} + +func (a Allocator) Free(b []byte) { + if a.RefCnt != nil { + a.RefCnt.Add(-1) + } + Free(b) +} + +func (a Allocator) CheckRefCnt() error { + if a.RefCnt != nil && a.RefCnt.Load() != 0 { + return fmt.Errorf("memory leak detected, refCnt: %d", a.RefCnt.Load()) + } + return nil +} diff --git a/br/pkg/lightning/mydump/BUILD.bazel b/br/pkg/lightning/mydump/BUILD.bazel index dccd93f84e7ce..a4aa1626afc46 100644 --- a/br/pkg/lightning/mydump/BUILD.bazel +++ b/br/pkg/lightning/mydump/BUILD.bazel @@ -23,6 +23,7 @@ go_library( "//br/pkg/lightning/metric", "//br/pkg/lightning/worker", "//br/pkg/storage", + "//config", "//parser/mysql", "//types", "//util/filter", @@ -31,6 +32,7 @@ go_library( "//util/slice", "//util/table-filter", "@com_github_pingcap_errors//:errors", + "@com_github_spkg_bom//:bom", "@com_github_xitongsys_parquet_go//parquet", "@com_github_xitongsys_parquet_go//reader", "@com_github_xitongsys_parquet_go//source", diff --git a/br/pkg/lightning/mydump/csv/split_large_file.csv.zst b/br/pkg/lightning/mydump/csv/split_large_file.csv.zst new file mode 100644 index 0000000000000..9609230bf04a5 Binary files /dev/null and b/br/pkg/lightning/mydump/csv/split_large_file.csv.zst differ diff --git a/br/pkg/lightning/mydump/csv_parser.go b/br/pkg/lightning/mydump/csv_parser.go index 96de51bd49c73..d9cd033d70861 100644 --- a/br/pkg/lightning/mydump/csv_parser.go +++ b/br/pkg/lightning/mydump/csv_parser.go @@ -25,6 +25,7 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/lightning/metric" "github.com/pingcap/tidb/br/pkg/lightning/worker" + tidbconfig "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/mathutil" ) @@ -33,16 +34,23 @@ var ( errUnterminatedQuotedField = errors.NewNoStackError("syntax error: unterminated quoted field") errDanglingBackslash = errors.NewNoStackError("syntax error: no character after backslash") errUnexpectedQuoteField = errors.NewNoStackError("syntax error: cannot have consecutive fields without separator") + // LargestEntryLimit is the max size for reading file to buf + LargestEntryLimit int ) +func init() { + LargestEntryLimit = tidbconfig.MaxTxnEntrySizeLimit +} + // CSVParser is basically a copy of encoding/csv, but special-cased for MySQL-like input. type CSVParser struct { blockParser cfg *config.CSVConfig - comma []byte - quote []byte - newLine []byte + comma []byte + quote []byte + newLine []byte + startingBy []byte charsetConvertor *CharsetConvertor // These variables are used with IndexAnyByte to search a byte slice for the @@ -113,6 +121,12 @@ func NewCSVParser( } unquoteStopSet = append(unquoteStopSet, newLineStopSet...) + if len(cfg.StartingBy) > 0 { + if strings.Contains(cfg.StartingBy, terminator) { + return nil, errors.New("starting-by cannot contain (line) terminator") + } + } + escFlavor := backslashEscapeFlavorNone if cfg.BackslashEscape { escFlavor = backslashEscapeFlavorMySQL @@ -131,6 +145,7 @@ func NewCSVParser( comma: []byte(separator), quote: []byte(delimiter), newLine: []byte(terminator), + startingBy: []byte(cfg.StartingBy), escFlavor: escFlavor, quoteByteSet: makeByteSet(quoteStopSet), unquoteByteSet: makeByteSet(unquoteStopSet), @@ -336,6 +351,9 @@ func (parser *CSVParser) readUntil(chars *byteSet) ([]byte, byte, error) { var buf []byte for { buf = append(buf, parser.buf...) + if len(buf) > LargestEntryLimit { + return buf, 0, errors.New("size of row cannot exceed the max value of txn-entry-size-limit") + } parser.buf = nil if err := parser.readBlock(); err != nil || len(parser.buf) == 0 { if err == nil { @@ -360,11 +378,43 @@ func (parser *CSVParser) readRecord(dst []string) ([]string, error) { isEmptyLine := true whitespaceLine := true + foundStartingByThisLine := false prevToken := csvTokenNewLine var firstToken csvToken outside: for { + // we should drop + // 1. the whole line if it does not contain startingBy + // 2. any character before startingBy + // since we have checked startingBy does not contain terminator, we can + // split at terminator to check the substring contains startingBy. Even + // if the terminator is inside a quoted field which means it's not the + // end of a line, the substring can still be dropped by rule 2. + if len(parser.startingBy) > 0 && !foundStartingByThisLine { + oldPos := parser.pos + content, _, err := parser.ReadUntilTerminator() + if err != nil { + if !(errors.Cause(err) == io.EOF) { + return nil, err + } + if len(content) == 0 { + return nil, err + } + // if we reached EOF, we should still check the content contains + // startingBy and try to put back and parse it. + } + idx := bytes.Index(content, parser.startingBy) + if idx == -1 { + continue + } + foundStartingByThisLine = true + content = content[idx+len(parser.startingBy):] + content = append(content, parser.newLine...) + parser.buf = append(content, parser.buf...) + parser.pos = oldPos + int64(idx+len(parser.startingBy)) + } + content, firstByte, err := parser.readUntil(&parser.unquoteByteSet) if len(content) > 0 { @@ -405,6 +455,7 @@ outside: } whitespaceLine = false case csvTokenNewLine: + foundStartingByThisLine = false // new line = end of record (ignore empty lines) prevToken = firstToken if isEmptyLine { @@ -447,9 +498,18 @@ outside: func (parser *CSVParser) readQuotedField() error { for { + prevPos := parser.pos content, terminator, err := parser.readUntil(&parser.quoteByteSet) - err = parser.replaceEOF(err, errUnterminatedQuotedField) if err != nil { + if errors.Cause(err) == io.EOF { + // return the position of quote to the caller. + // because we return an error here, the parser won't + // use the `pos` again, so it's safe to modify it here. + parser.pos = prevPos - 1 + // set buf to parser.buf in order to print err log + parser.buf = content + err = parser.replaceEOF(err, errUnterminatedQuotedField) + } return err } parser.recordBuffer = append(parser.recordBuffer, content...) @@ -547,6 +607,9 @@ func (parser *CSVParser) ReadColumns() error { if err != nil { return errors.Trace(err) } + if !parser.cfg.HeaderSchemaMatch { + return nil + } parser.columns = make([]string, 0, len(columns)) for _, colName := range columns { colName, _, err = parser.unescapeString(colName) @@ -559,17 +622,21 @@ func (parser *CSVParser) ReadColumns() error { } // ReadUntilTerminator seeks the file until the terminator token is found, and -// returns the file offset beyond the terminator. -// This function is used in strict-format dividing a CSV file. -func (parser *CSVParser) ReadUntilTerminator() (int64, error) { +// returns +// - the content before terminator +// - the file offset beyond the terminator +// - error +// Note that the terminator string pattern may be the content of a field, which +// means it's inside quotes. Caller should make sure to handle this case. +func (parser *CSVParser) ReadUntilTerminator() ([]byte, int64, error) { for { - _, firstByte, err := parser.readUntil(&parser.newLineByteSet) + content, firstByte, err := parser.readUntil(&parser.newLineByteSet) if err != nil { - return 0, err + return content, 0, err } parser.skipBytes(1) if ok, err := parser.tryReadNewLine(firstByte); ok || err != nil { - return parser.pos, err + return content, parser.pos, err } } } diff --git a/br/pkg/lightning/mydump/csv_parser_test.go b/br/pkg/lightning/mydump/csv_parser_test.go index 2696a6909c96c..8980ce221fe75 100644 --- a/br/pkg/lightning/mydump/csv_parser_test.go +++ b/br/pkg/lightning/mydump/csv_parser_test.go @@ -1,6 +1,7 @@ package mydump_test import ( + "bytes" "context" "encoding/csv" "fmt" @@ -54,6 +55,35 @@ func runTestCasesCSV(t *testing.T, cfg *config.MydumperRuntime, blockBufSize int } } +func runTestCasesCSVIgnoreNLines(t *testing.T, cfg *config.MydumperRuntime, blockBufSize int64, cases []testCase, ignoreNLines int) { + for _, tc := range cases { + charsetConvertor, err := mydump.NewCharsetConvertor(cfg.DataCharacterSet, cfg.DataInvalidCharReplace) + assert.NoError(t, err) + parser, err := mydump.NewCSVParser(context.Background(), &cfg.CSV, mydump.NewStringReader(tc.input), blockBufSize, ioWorkers, false, charsetConvertor) + assert.NoError(t, err) + + for ignoreNLines > 0 { + // IGNORE N LINES will directly find (line) terminator without checking it's inside quotes + _, _, err = parser.ReadUntilTerminator() + if errors.Cause(err) == io.EOF { + assert.Len(t, tc.expected, 0, "input = %q", tc.input) + return + } + assert.NoError(t, err) + ignoreNLines-- + } + + for i, row := range tc.expected { + comment := fmt.Sprintf("input = %q, row = %d", tc.input, i+1) + e := parser.ReadRow() + assert.NoErrorf(t, e, "input = %q, row = %d, error = %s", tc.input, i+1, errors.ErrorStack(e)) + assert.Equal(t, int64(i)+1, parser.LastRow().RowID, comment) + assert.Equal(t, row, parser.LastRow().Row, comment) + } + assert.ErrorIsf(t, errors.Cause(parser.ReadRow()), io.EOF, "input = %q", tc.input) + } +} + func runFailingTestCasesCSV(t *testing.T, cfg *config.MydumperRuntime, blockBufSize int64, cases []string) { for _, tc := range cases { charsetConvertor, err := mydump.NewCharsetConvertor(cfg.DataCharacterSet, cfg.DataInvalidCharReplace) @@ -451,12 +481,13 @@ func TestSyntaxErrorCSV(t *testing.T) { func TestTSV(t *testing.T) { cfg := config.CSVConfig{ - Separator: "\t", - Delimiter: "", - BackslashEscape: false, - NotNull: false, - Null: "", - Header: true, + Separator: "\t", + Delimiter: "", + BackslashEscape: false, + NotNull: false, + Null: "", + Header: true, + HeaderSchemaMatch: true, } parser, err := mydump.NewCSVParser(context.Background(), &cfg, mydump.NewStringReader(`a b c d e f @@ -547,6 +578,7 @@ func TestCsvWithWhiteSpaceLine(t *testing.T) { require.Nil(t, parser.Close()) cfg.Header = true + cfg.HeaderSchemaMatch = true data = " \r\na,b,c\r\n0,,abc\r\n" parser, err = mydump.NewCSVParser(context.Background(), &cfg, mydump.NewStringReader(data), int64(config.ReadBlockSize), ioWorkers, true, nil) require.NoError(t, err) @@ -579,6 +611,7 @@ func TestEmpty(t *testing.T) { // Try again with headers. cfg.Header = true + cfg.HeaderSchemaMatch = true parser, err = mydump.NewCSVParser(context.Background(), &cfg, mydump.NewStringReader(""), int64(config.ReadBlockSize), ioWorkers, true, nil) require.NoError(t, err) @@ -680,6 +713,29 @@ func TestConsecutiveFields(t *testing.T) { }) } +func TestTooLargeRow(t *testing.T) { + cfg := config.MydumperRuntime{ + CSV: config.CSVConfig{ + Separator: ",", + Delimiter: `"`, + }, + } + var testCase bytes.Buffer + testCase.WriteString("a,b,c,d") + // WARN: will take up 10KB memory here. + mydump.LargestEntryLimit = 10 * 1024 + for i := 0; i < mydump.LargestEntryLimit; i++ { + testCase.WriteByte('d') + } + charsetConvertor, err := mydump.NewCharsetConvertor(cfg.DataCharacterSet, cfg.DataInvalidCharReplace) + require.NoError(t, err) + parser, err := mydump.NewCSVParser(context.Background(), &cfg.CSV, mydump.NewStringReader(testCase.String()), int64(config.ReadBlockSize), ioWorkers, false, charsetConvertor) + require.NoError(t, err) + e := parser.ReadRow() + require.Error(t, e) + require.Contains(t, e.Error(), "size of row cannot exceed the max value of txn-entry-size-limit") +} + func TestSpecialChars(t *testing.T) { cfg := config.MydumperRuntime{ CSV: config.CSVConfig{Separator: ",", Delimiter: `"`}, @@ -911,6 +967,211 @@ func TestTerminator(t *testing.T) { runTestCasesCSV(t, &cfg, 1, testCases) } +func TestStartingBy(t *testing.T) { + cfg := config.MydumperRuntime{ + CSV: config.CSVConfig{ + Separator: ",", + Delimiter: `"`, + Terminator: "\n", + StartingBy: "xxx", + }, + } + testCases := []testCase{ + { + input: `xxx"abc",1 +something xxx"def",2 +"ghi",3`, + expected: [][]types.Datum{ + {types.NewStringDatum("abc"), types.NewStringDatum("1")}, + {types.NewStringDatum("def"), types.NewStringDatum("2")}, + }, + }, + } + runTestCasesCSV(t, &cfg, 1, testCases) + + testCases = []testCase{ + { + input: `xxxabc,1 +something xxxdef,2 +ghi,3 +"bad syntax"aaa`, + expected: [][]types.Datum{ + {types.NewStringDatum("abc"), types.NewStringDatum("1")}, + {types.NewStringDatum("def"), types.NewStringDatum("2")}, + }, + }, + } + runTestCasesCSV(t, &cfg, 1, testCases) + + // test that special characters appears before StartingBy, and StartingBy only takes effect after once + + testCases = []testCase{ + { + input: `xxx"abc",1 +something xxxdef,2 +"ghi",3 +"yyy"xxx"yyy",4 +"yyy",5,xxxyyy,5 +qwe,zzzxxxyyy,6 +"yyyxxx"yyyxxx",7 +yyy",5,xxxxxx,8 +`, + expected: [][]types.Datum{ + {types.NewStringDatum("abc"), types.NewStringDatum("1")}, + {types.NewStringDatum("def"), types.NewStringDatum("2")}, + {types.NewStringDatum("yyy"), types.NewStringDatum("4")}, + {types.NewStringDatum("yyy"), types.NewStringDatum("5")}, + {types.NewStringDatum("yyy"), types.NewStringDatum("6")}, + {types.NewStringDatum("yyyxxx"), types.NewStringDatum("7")}, + {types.NewStringDatum("xxx"), types.NewStringDatum("8")}, + }, + }, + } + runTestCasesCSV(t, &cfg, 1, testCases) + + // test StartingBy contains special characters + + cfg = config.MydumperRuntime{ + CSV: config.CSVConfig{ + Separator: ",", + Delimiter: `"`, + Terminator: "\n", + StartingBy: "x,xx", + }, + } + testCases = []testCase{ + { + input: `x,xx"abc",1 +something x,xxdef,2 +"ghi",3 +"yyy"xxx"yyy",4 +"yyy",5,xxxyyy,5 +qwe,zzzxxxyyy,6 +"yyyxxx"yyyxxx",7 +yyy",5,xx,xxxx,8`, + expected: [][]types.Datum{ + {types.NewStringDatum("abc"), types.NewStringDatum("1")}, + {types.NewStringDatum("def"), types.NewStringDatum("2")}, + {types.NewStringDatum("xx"), types.NewStringDatum("8")}, + }, + }, + } + runTestCasesCSV(t, &cfg, 1, testCases) + + cfg = config.MydumperRuntime{ + CSV: config.CSVConfig{ + Separator: ",", + Delimiter: `"`, + Terminator: "\n", + StartingBy: `x"xx`, + }, + } + testCases = []testCase{ + { + input: `x"xx"abc",1 +something x"xxdef,2 +"ghi",3 +"yyy"xxx"yyy",4 +"yyy",5,xxxyyy,5 +qwe,zzzxxxyyy,6 +"yyyxxx"yyyxxx",7 +yyy",5,xx"xxxx,8 +`, + expected: [][]types.Datum{ + {types.NewStringDatum("abc"), types.NewStringDatum("1")}, + {types.NewStringDatum("def"), types.NewStringDatum("2")}, + {types.NewStringDatum("xx"), types.NewStringDatum("8")}, + }, + }, + } + runTestCasesCSV(t, &cfg, 1, testCases) + + cfg = config.MydumperRuntime{ + CSV: config.CSVConfig{ + Separator: ",", + Delimiter: `"`, + Terminator: "\n", + StartingBy: "x\nxx", + }, + } + _, err := mydump.NewCSVParser(context.Background(), &cfg.CSV, nil, 1, ioWorkers, false, nil) + require.ErrorContains(t, err, "starting-by cannot contain (line) terminator") +} + +func TestCallerCanIgnoreNLines(t *testing.T) { + cfg := config.MydumperRuntime{ + CSV: config.CSVConfig{ + Separator: ",", + Delimiter: `"`, + Terminator: "\n", + }, + } + testCases := []testCase{ + { + input: `1,1 +2,2 +3,3`, + expected: [][]types.Datum{ + {types.NewStringDatum("3"), types.NewStringDatum("3")}, + }, + }, + } + runTestCasesCSVIgnoreNLines(t, &cfg, 1, testCases, 2) + + testCases = []testCase{ + { + input: `"bad syntax"1 +"b",2 +"c",3`, + expected: [][]types.Datum{ + {types.NewStringDatum("c"), types.NewStringDatum("3")}, + }, + }, + } + runTestCasesCSVIgnoreNLines(t, &cfg, 1, testCases, 2) + + cfg = config.MydumperRuntime{ + CSV: config.CSVConfig{ + Separator: ",", + Delimiter: `"`, + Terminator: "\n", + }, + } + testCases = []testCase{ + { + input: `1,1 +2,2 +3,3`, + expected: [][]types.Datum{}, + }, + } + runTestCasesCSVIgnoreNLines(t, &cfg, 1, testCases, 100) + + // test IGNORE N LINES will directly find (line) terminator without checking it's inside quotes + + cfg = config.MydumperRuntime{ + CSV: config.CSVConfig{ + Separator: ",", + Delimiter: `"`, + Terminator: "\n", + }, + } + testCases = []testCase{ + { + input: `"a +",1 +"b +",2 +"c",3`, + expected: [][]types.Datum{ + {types.NewStringDatum("b\n"), types.NewStringDatum("2")}, + {types.NewStringDatum("c"), types.NewStringDatum("3")}, + }, + }, + } + runTestCasesCSVIgnoreNLines(t, &cfg, 1, testCases, 2) +} + func TestCharsetConversion(t *testing.T) { cfg := config.MydumperRuntime{ CSV: config.CSVConfig{ @@ -1034,3 +1295,72 @@ func BenchmarkReadRowUsingEncodingCSV(b *testing.B) { } require.Equal(b, b.N, rowsCount) } + +func TestHeaderSchemaMatch(t *testing.T) { + cfg := config.MydumperRuntime{ + CSV: config.CSVConfig{ + Separator: ",", + Delimiter: `"`, + }, + } + + inputData := `id,val1,val2,val3 +1,111,aaa,1.0 +2,222,bbb,2.0 +3,333,ccc,3.0 +4,444,ddd,4.0` + + parsedDataPart := [][]types.Datum{ + {types.NewStringDatum("1"), types.NewStringDatum("111"), types.NewStringDatum("aaa"), types.NewStringDatum("1.0")}, + {types.NewStringDatum("2"), types.NewStringDatum("222"), types.NewStringDatum("bbb"), types.NewStringDatum("2.0")}, + {types.NewStringDatum("3"), types.NewStringDatum("333"), types.NewStringDatum("ccc"), types.NewStringDatum("3.0")}, + {types.NewStringDatum("4"), types.NewStringDatum("444"), types.NewStringDatum("ddd"), types.NewStringDatum("4.0")}, + } + + type testCase struct { + Header bool + HeaderSchemaMatch bool + ExpectedData [][]types.Datum + ExpectedColumns []string + } + + for _, tc := range []testCase{ + { + Header: true, + HeaderSchemaMatch: true, + ExpectedData: parsedDataPart, + ExpectedColumns: []string{"id", "val1", "val2", "val3"}, + }, + { + Header: true, + HeaderSchemaMatch: false, + ExpectedData: parsedDataPart, + ExpectedColumns: nil, + }, + { + Header: false, + HeaderSchemaMatch: true, + ExpectedData: append([][]types.Datum{ + {types.NewStringDatum("id"), types.NewStringDatum("val1"), types.NewStringDatum("val2"), types.NewStringDatum("val3")}, + }, parsedDataPart...), + ExpectedColumns: nil, + }, + } { + comment := fmt.Sprintf("header = %v, header-schema-match = %v", tc.Header, tc.HeaderSchemaMatch) + cfg.CSV.Header = tc.Header + cfg.CSV.HeaderSchemaMatch = tc.HeaderSchemaMatch + charsetConvertor, err := mydump.NewCharsetConvertor(cfg.DataCharacterSet, cfg.DataInvalidCharReplace) + assert.NoError(t, err) + parser, err := mydump.NewCSVParser(context.Background(), &cfg.CSV, mydump.NewStringReader(inputData), int64(config.ReadBlockSize), ioWorkers, tc.Header, charsetConvertor) + assert.NoError(t, err) + for i, row := range tc.ExpectedData { + comment := fmt.Sprintf("row = %d, header = %v, header-schema-match = %v", i+1, tc.Header, tc.HeaderSchemaMatch) + e := parser.ReadRow() + assert.NoErrorf(t, e, "row = %d, error = %s", i+1, errors.ErrorStack(e)) + assert.Equal(t, int64(i)+1, parser.LastRow().RowID, comment) + assert.Equal(t, row, parser.LastRow().Row, comment) + } + assert.ErrorIsf(t, errors.Cause(parser.ReadRow()), io.EOF, comment) + assert.Equal(t, tc.ExpectedColumns, parser.Columns(), comment) + } +} diff --git a/br/pkg/lightning/mydump/loader.go b/br/pkg/lightning/mydump/loader.go index 98661d3a46f8c..d55bce6f94fc5 100644 --- a/br/pkg/lightning/mydump/loader.go +++ b/br/pkg/lightning/mydump/loader.go @@ -16,6 +16,7 @@ package mydump import ( "context" + "io" "path/filepath" "sort" "strings" @@ -30,6 +31,9 @@ import ( "go.uber.org/zap" ) +// sampleCompressedFileSize represents how many bytes need to be sampled for compressed files +const sampleCompressedFileSize = 4 * 1024 + // MDDatabaseMeta contains some parsed metadata for a database in the source by MyDumper Loader. type MDDatabaseMeta struct { Name string @@ -82,7 +86,9 @@ type SourceFileMeta struct { Compression Compression SortKey string FileSize int64 - ExtendData ExtendColumnData + // WARNING: variables below are not persistent + ExtendData ExtendColumnData + RealSize int64 } // NewMDTableMeta creates an Mydumper table meta with specified character set. @@ -386,7 +392,7 @@ func (s *mdLoaderSetup) setup(ctx context.Context) error { // set a dummy `FileInfo` here without file meta because we needn't restore the table schema tableMeta, _, _ := s.insertTable(FileInfo{TableName: fileInfo.TableName}) tableMeta.DataFiles = append(tableMeta.DataFiles, fileInfo) - tableMeta.TotalSize += fileInfo.FileMeta.FileSize + tableMeta.TotalSize += fileInfo.FileMeta.RealSize } for _, dbMeta := range s.loader.dbs { @@ -453,7 +459,7 @@ func (s *mdLoaderSetup) constructFileInfo(ctx context.Context, path string, size info := FileInfo{ TableName: filter.Table{Schema: res.Schema, Name: res.Name}, - FileMeta: SourceFileMeta{Path: path, Type: res.Type, Compression: res.Compression, SortKey: res.Key, FileSize: size}, + FileMeta: SourceFileMeta{Path: path, Type: res.Type, Compression: res.Compression, SortKey: res.Key, FileSize: size, RealSize: size}, } if s.loader.shouldSkip(&info.TableName) { @@ -470,6 +476,15 @@ func (s *mdLoaderSetup) constructFileInfo(ctx context.Context, path string, size case SourceTypeViewSchema: s.viewSchemas = append(s.viewSchemas, info) case SourceTypeSQL, SourceTypeCSV, SourceTypeParquet: + if info.FileMeta.Compression != CompressionNone { + compressRatio, err2 := SampleFileCompressRatio(ctx, info.FileMeta, s.loader.GetStore()) + if err2 != nil { + logger.Error("[loader] fail to calculate data file compress ratio", + zap.String("schema", res.Schema), zap.String("table", res.Name), zap.Stringer("type", res.Type)) + } else { + info.FileMeta.RealSize = int64(compressRatio * float64(info.FileMeta.FileSize)) + } + } s.tableDatas = append(s.tableDatas, info) } @@ -648,3 +663,81 @@ func (l *MDLoader) GetDatabases() []*MDDatabaseMeta { func (l *MDLoader) GetStore() storage.ExternalStorage { return l.store } + +func calculateFileBytes(ctx context.Context, + dataFile string, + compressType storage.CompressType, + store storage.ExternalStorage, + offset int64) (tot int, pos int64, err error) { + bytes := make([]byte, sampleCompressedFileSize) + reader, err := store.Open(ctx, dataFile) + if err != nil { + return 0, 0, errors.Trace(err) + } + defer reader.Close() + + compressReader, err := storage.NewLimitedInterceptReader(reader, compressType, offset) + if err != nil { + return 0, 0, errors.Trace(err) + } + + readBytes := func() error { + n, err2 := compressReader.Read(bytes) + if err2 != nil && errors.Cause(err2) != io.EOF && errors.Cause(err) != io.ErrUnexpectedEOF { + return err2 + } + tot += n + return err2 + } + + if offset == 0 { + err = readBytes() + if err != nil && errors.Cause(err) != io.EOF && errors.Cause(err) != io.ErrUnexpectedEOF { + return 0, 0, err + } + pos, err = compressReader.Seek(0, io.SeekCurrent) + if err != nil { + return 0, 0, errors.Trace(err) + } + return tot, pos, nil + } + + for { + err = readBytes() + if err != nil { + break + } + } + if err != nil && errors.Cause(err) != io.EOF && errors.Cause(err) != io.ErrUnexpectedEOF { + return 0, 0, errors.Trace(err) + } + return tot, offset, nil +} + +// SampleFileCompressRatio samples the compress ratio of the compressed file. +func SampleFileCompressRatio(ctx context.Context, fileMeta SourceFileMeta, store storage.ExternalStorage) (float64, error) { + if fileMeta.Compression == CompressionNone { + return 1, nil + } + compressType, err := ToStorageCompressType(fileMeta.Compression) + if err != nil { + return 0, err + } + // We use the following method to sample the compress ratio of the first few bytes of the file. + // 1. read first time aiming to find a valid compressed file offset. If we continue read now, the compress reader will + // request more data from file reader buffer them in its memory. We can't compute an accurate compress ratio. + // 2. we use a second reading and limit the file reader only read n bytes(n is the valid position we find in the first reading). + // Then we read all the data out from the compress reader. The data length m we read out is the uncompressed data length. + // Use m/n to compute the compress ratio. + // read first time, aims to find a valid end pos in compressed file + _, pos, err := calculateFileBytes(ctx, fileMeta.Path, compressType, store, 0) + if err != nil { + return 0, err + } + // read second time, original reader ends at first time's valid pos, compute sample data compress ratio + tot, pos, err := calculateFileBytes(ctx, fileMeta.Path, compressType, store, pos) + if err != nil { + return 0, err + } + return float64(tot) / float64(pos), nil +} diff --git a/br/pkg/lightning/mydump/loader_test.go b/br/pkg/lightning/mydump/loader_test.go index da910c70bedc0..58236d7b626f5 100644 --- a/br/pkg/lightning/mydump/loader_test.go +++ b/br/pkg/lightning/mydump/loader_test.go @@ -15,6 +15,8 @@ package mydump_test import ( + "bytes" + "compress/gzip" "context" "fmt" "os" @@ -1053,3 +1055,34 @@ func TestExternalDataRoutes(t *testing.T) { require.Equal(t, expectedExtendVals[i], fileInfo.FileMeta.ExtendData.Values) } } + +func TestSampleFileCompressRatio(t *testing.T) { + s := newTestMydumpLoaderSuite(t) + store, err := storage.NewLocalStorage(s.sourceDir) + require.NoError(t, err) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + byteArray := make([]byte, 0, 4096) + bf := bytes.NewBuffer(byteArray) + compressWriter := gzip.NewWriter(bf) + csvData := []byte("aaaa\n") + for i := 0; i < 1000; i++ { + _, err = compressWriter.Write(csvData) + require.NoError(t, err) + } + err = compressWriter.Flush() + require.NoError(t, err) + + fileName := "test_1.t1.csv.gz" + err = store.WriteFile(ctx, fileName, bf.Bytes()) + require.NoError(t, err) + + ratio, err := md.SampleFileCompressRatio(ctx, md.SourceFileMeta{ + Path: fileName, + Compression: md.CompressionGZ, + }, store) + require.NoError(t, err) + require.InDelta(t, ratio, 5000.0/float64(bf.Len()), 1e-5) +} diff --git a/br/pkg/lightning/mydump/parquet_parser.go b/br/pkg/lightning/mydump/parquet_parser.go index e7ac2baa6d80f..a1b612903c5e8 100644 --- a/br/pkg/lightning/mydump/parquet_parser.go +++ b/br/pkg/lightning/mydump/parquet_parser.go @@ -351,6 +351,12 @@ func (pp *ParquetParser) SetPos(pos int64, rowID int64) error { return nil } +// RealPos implements the Parser interface. +// For parquet it's equal to Pos(). +func (pp *ParquetParser) RealPos() (int64, error) { + return pp.curStart + int64(pp.curIndex), nil +} + // Close closes the parquet file of the parser. // It implements the Parser interface. func (pp *ParquetParser) Close() error { diff --git a/br/pkg/lightning/mydump/parser.go b/br/pkg/lightning/mydump/parser.go index 73f84424bf5e3..0ac82ce189d71 100644 --- a/br/pkg/lightning/mydump/parser.go +++ b/br/pkg/lightning/mydump/parser.go @@ -32,6 +32,7 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/worker" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" + "github.com/spkg/bom" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) @@ -94,6 +95,7 @@ type ChunkParser struct { type Chunk struct { Offset int64 EndOffset int64 + RealOffset int64 PrevRowIDMax int64 RowIDMax int64 Columns []string @@ -126,6 +128,7 @@ const ( type Parser interface { Pos() (pos int64, rowID int64) SetPos(pos int64, rowID int64) error + RealPos() (int64, error) Close() error ReadRow() error LastRow() Row @@ -175,6 +178,11 @@ func (parser *blockParser) SetPos(pos int64, rowID int64) error { return nil } +// RealPos gets the read position of current reader. +func (parser *blockParser) RealPos() (int64, error) { + return parser.reader.Seek(0, io.SeekCurrent) +} + // Pos returns the current file offset. // Attention: for compressed sql/csv files, pos is the position in uncompressed files func (parser *blockParser) Pos() (pos int64, lastRowID int64) { @@ -278,7 +286,13 @@ func (parser *blockParser) readBlock() error { parser.remainBuf.Write(parser.buf) parser.appendBuf.Reset() parser.appendBuf.Write(parser.remainBuf.Bytes()) - parser.appendBuf.Write(parser.blockBuf[:n]) + blockData := parser.blockBuf[:n] + if parser.pos == 0 { + bomCleanedData := bom.Clean(blockData) + parser.pos += int64(n - len(bomCleanedData)) + blockData = bomCleanedData + } + parser.appendBuf.Write(blockData) parser.buf = parser.appendBuf.Bytes() if parser.metrics != nil { parser.metrics.ChunkParserReadBlockSecondsHistogram.Observe(time.Since(startTime).Seconds()) diff --git a/br/pkg/lightning/mydump/reader.go b/br/pkg/lightning/mydump/reader.go index 2988c3675dfa9..3735e97cb48ee 100644 --- a/br/pkg/lightning/mydump/reader.go +++ b/br/pkg/lightning/mydump/reader.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/lightning/worker" "github.com/pingcap/tidb/br/pkg/storage" + "github.com/spkg/bom" "go.uber.org/zap" "golang.org/x/text/encoding/simplifiedchinese" ) @@ -70,13 +71,20 @@ func decodeCharacterSet(data []byte, characterSet string) ([]byte, error) { // ExportStatement exports the SQL statement in the schema file. func ExportStatement(ctx context.Context, store storage.ExternalStorage, sqlFile FileInfo, characterSet string) ([]byte, error) { + if sqlFile.FileMeta.Compression != CompressionNone { + compressType, err := ToStorageCompressType(sqlFile.FileMeta.Compression) + if err != nil { + return nil, errors.Trace(err) + } + store = storage.WithCompression(store, compressType) + } fd, err := store.Open(ctx, sqlFile.FileMeta.Path) if err != nil { return nil, errors.Trace(err) } defer fd.Close() - br := bufio.NewReader(fd) + br := bufio.NewReader(bom.NewReader(fd)) data := make([]byte, 0, sqlFile.FileMeta.FileSize+1) buffer := make([]byte, 0, sqlFile.FileMeta.FileSize+1) diff --git a/br/pkg/lightning/mydump/reader_test.go b/br/pkg/lightning/mydump/reader_test.go index e7506ea869782..1f67f2c31c43a 100644 --- a/br/pkg/lightning/mydump/reader_test.go +++ b/br/pkg/lightning/mydump/reader_test.go @@ -15,6 +15,7 @@ package mydump_test import ( + "compress/gzip" "context" "errors" "os" @@ -173,3 +174,28 @@ func TestExportStatementHandleNonEOFError(t *testing.T) { _, err := ExportStatement(ctx, mockStorage, f, "auto") require.Contains(t, err.Error(), "read error") } + +func TestExportStatementCompressed(t *testing.T) { + dir := t.TempDir() + file, err := os.Create(filepath.Join(dir, "tidb_lightning_test_reader")) + require.NoError(t, err) + defer os.Remove(file.Name()) + + store, err := storage.NewLocalStorage(dir) + require.NoError(t, err) + + gzipFile := gzip.NewWriter(file) + _, err = gzipFile.Write([]byte("CREATE DATABASE whatever;")) + require.NoError(t, err) + err = gzipFile.Close() + require.NoError(t, err) + stat, err := file.Stat() + require.NoError(t, err) + err = file.Close() + require.NoError(t, err) + + f := FileInfo{FileMeta: SourceFileMeta{Path: stat.Name(), FileSize: stat.Size(), Compression: CompressionGZ}} + data, err := ExportStatement(context.TODO(), store, f, "auto") + require.NoError(t, err) + require.Equal(t, []byte("CREATE DATABASE whatever;"), data) +} diff --git a/br/pkg/lightning/mydump/region.go b/br/pkg/lightning/mydump/region.go index 8562acc2867b3..d57a2c4742c73 100644 --- a/br/pkg/lightning/mydump/region.go +++ b/br/pkg/lightning/mydump/region.go @@ -34,6 +34,11 @@ const ( tableRegionSizeWarningThreshold int64 = 1024 * 1024 * 1024 // the increment ratio of large CSV file size threshold by `region-split-size` largeCSVLowerThresholdRation = 10 + // TableFileSizeINF for compressed size, for lightning 10TB is a relatively big value and will strongly affect efficiency + // It's used to make sure compressed files can be read until EOF. Because we can't get the exact decompressed size of the compressed files. + TableFileSizeINF = 10 * 1024 * tableRegionSizeWarningThreshold + // CompressSizeFactor is used to adjust compressed data size + CompressSizeFactor = 5 ) // TableRegion contains information for a table region during import. @@ -292,25 +297,41 @@ func MakeSourceFileRegion( return regions, subFileSizes, err } + fileSize := fi.FileMeta.FileSize + rowIDMax := fileSize / divisor + // for compressed files, suggest the compress ratio is 1% to calculate the rowIDMax. + // set fileSize to INF to make sure compressed files can be read until EOF. Because we can't get the exact size of the compressed files. + if fi.FileMeta.Compression != CompressionNone { + // RealSize the estimated file size. There are some cases that the first few bytes of this compressed file + // has smaller compress ratio than the whole compressed file. So we still need to multiply this factor to + // make sure the rowIDMax computation is correct. + rowIDMax = fi.FileMeta.RealSize * CompressSizeFactor / divisor + fileSize = TableFileSizeINF + } tableRegion := &TableRegion{ DB: meta.DB, Table: meta.Name, FileMeta: fi.FileMeta, Chunk: Chunk{ Offset: 0, - EndOffset: fi.FileMeta.FileSize, + EndOffset: fileSize, + RealOffset: 0, PrevRowIDMax: 0, - RowIDMax: fi.FileMeta.FileSize / divisor, + RowIDMax: rowIDMax, }, } - if tableRegion.Size() > tableRegionSizeWarningThreshold { + regionSize := tableRegion.Size() + if fi.FileMeta.Compression != CompressionNone { + regionSize = fi.FileMeta.RealSize + } + if regionSize > tableRegionSizeWarningThreshold { log.FromContext(ctx).Warn( "file is too big to be processed efficiently; we suggest splitting it at 256 MB each", zap.String("file", fi.FileMeta.Path), - zap.Int64("size", dataFileSize)) + zap.Int64("size", regionSize)) } - return []*TableRegion{tableRegion}, []float64{float64(fi.FileMeta.FileSize)}, nil + return []*TableRegion{tableRegion}, []float64{float64(fi.FileMeta.RealSize)}, nil } // because parquet files can't seek efficiently, there is no benefit in split. @@ -383,7 +404,9 @@ func SplitLargeFile( if err = parser.ReadColumns(); err != nil { return 0, nil, nil, err } - columns = parser.Columns() + if cfg.Mydumper.CSV.HeaderSchemaMatch { + columns = parser.Columns() + } startOffset, _ = parser.Pos() endOffset = startOffset + maxRegionSize if endOffset > dataFile.FileMeta.FileSize { @@ -410,7 +433,7 @@ func SplitLargeFile( if err = parser.SetPos(endOffset, prevRowIDMax); err != nil { return 0, nil, nil, err } - pos, err := parser.ReadUntilTerminator() + _, pos, err := parser.ReadUntilTerminator() if err != nil { if !errors.ErrorEqual(err, io.EOF) { return 0, nil, nil, err diff --git a/br/pkg/lightning/mydump/region_test.go b/br/pkg/lightning/mydump/region_test.go index 0830d378f47ff..362ff8603c7f9 100644 --- a/br/pkg/lightning/mydump/region_test.go +++ b/br/pkg/lightning/mydump/region_test.go @@ -174,13 +174,14 @@ func TestMakeSourceFileRegion(t *testing.T) { ReadBlockSize: config.ReadBlockSize, MaxRegionSize: 1, CSV: config.CSVConfig{ - Separator: ",", - Delimiter: "", - Header: true, - TrimLastSep: false, - NotNull: false, - Null: "NULL", - BackslashEscape: true, + Separator: ",", + Delimiter: "", + Header: true, + HeaderSchemaMatch: true, + TrimLastSep: false, + NotNull: false, + Null: "NULL", + BackslashEscape: true, }, StrictFormat: true, Filter: []string{"*.*"}, @@ -199,7 +200,6 @@ func TestMakeSourceFileRegion(t *testing.T) { store, err := storage.NewLocalStorage(".") assert.NoError(t, err) - // test - no compression fileInfo.FileMeta.Compression = CompressionNone regions, _, err := MakeSourceFileRegion(ctx, meta, fileInfo, colCnt, cfg, ioWorkers, store) assert.NoError(t, err) @@ -217,10 +217,66 @@ func TestMakeSourceFileRegion(t *testing.T) { assert.NoError(t, err) assert.Len(t, regions, 1) assert.Equal(t, int64(0), regions[0].Chunk.Offset) - assert.Equal(t, fileInfo.FileMeta.FileSize, regions[0].Chunk.EndOffset) + assert.Equal(t, TableFileSizeINF, regions[0].Chunk.EndOffset) assert.Len(t, regions[0].Chunk.Columns, 0) } +func TestCompressedMakeSourceFileRegion(t *testing.T) { + meta := &MDTableMeta{ + DB: "csv", + Name: "large_csv_file", + } + cfg := &config.Config{ + Mydumper: config.MydumperRuntime{ + ReadBlockSize: config.ReadBlockSize, + MaxRegionSize: 1, + CSV: config.CSVConfig{ + Separator: ",", + Delimiter: "", + Header: true, + HeaderSchemaMatch: true, + TrimLastSep: false, + NotNull: false, + Null: "NULL", + BackslashEscape: true, + }, + StrictFormat: true, + Filter: []string{"*.*"}, + }, + } + filePath := "./csv/split_large_file.csv.zst" + dataFileInfo, err := os.Stat(filePath) + require.NoError(t, err) + fileSize := dataFileInfo.Size() + + fileInfo := FileInfo{FileMeta: SourceFileMeta{ + Path: filePath, + Type: SourceTypeCSV, + Compression: CompressionZStd, + FileSize: fileSize, + }} + colCnt := 3 + + ctx := context.Background() + ioWorkers := worker.NewPool(ctx, 4, "io") + store, err := storage.NewLocalStorage(".") + assert.NoError(t, err) + compressRatio, err := SampleFileCompressRatio(ctx, fileInfo.FileMeta, store) + require.NoError(t, err) + fileInfo.FileMeta.RealSize = int64(compressRatio * float64(fileInfo.FileMeta.FileSize)) + + regions, sizes, err := MakeSourceFileRegion(ctx, meta, fileInfo, colCnt, cfg, ioWorkers, store) + assert.NoError(t, err) + assert.Len(t, regions, 1) + assert.Equal(t, int64(0), regions[0].Chunk.Offset) + assert.Equal(t, int64(0), regions[0].Chunk.RealOffset) + assert.Equal(t, TableFileSizeINF, regions[0].Chunk.EndOffset) + rowIDMax := fileInfo.FileMeta.RealSize * CompressSizeFactor / int64(colCnt) + assert.Equal(t, rowIDMax, regions[0].Chunk.RowIDMax) + assert.Len(t, regions[0].Chunk.Columns, 0) + assert.Equal(t, fileInfo.FileMeta.RealSize, int64(sizes[0])) +} + func TestSplitLargeFile(t *testing.T) { meta := &MDTableMeta{ DB: "csv", @@ -230,13 +286,14 @@ func TestSplitLargeFile(t *testing.T) { Mydumper: config.MydumperRuntime{ ReadBlockSize: config.ReadBlockSize, CSV: config.CSVConfig{ - Separator: ",", - Delimiter: "", - Header: true, - TrimLastSep: false, - NotNull: false, - Null: "NULL", - BackslashEscape: true, + Separator: ",", + Delimiter: "", + Header: true, + HeaderSchemaMatch: true, + TrimLastSep: false, + NotNull: false, + Null: "NULL", + BackslashEscape: true, }, StrictFormat: true, Filter: []string{"*.*"}, @@ -288,13 +345,14 @@ func TestSplitLargeFileNoNewLineAtEOF(t *testing.T) { Mydumper: config.MydumperRuntime{ ReadBlockSize: config.ReadBlockSize, CSV: config.CSVConfig{ - Separator: ",", - Delimiter: "", - Header: true, - TrimLastSep: false, - NotNull: false, - Null: "NULL", - BackslashEscape: true, + Separator: ",", + Delimiter: "", + Header: true, + HeaderSchemaMatch: true, + TrimLastSep: false, + NotNull: false, + Null: "NULL", + BackslashEscape: true, }, StrictFormat: true, Filter: []string{"*.*"}, @@ -393,13 +451,14 @@ func TestSplitLargeFileOnlyOneChunk(t *testing.T) { Mydumper: config.MydumperRuntime{ ReadBlockSize: config.ReadBlockSize, CSV: config.CSVConfig{ - Separator: ",", - Delimiter: "", - Header: true, - TrimLastSep: false, - NotNull: false, - Null: "NULL", - BackslashEscape: true, + Separator: ",", + Delimiter: "", + Header: true, + HeaderSchemaMatch: true, + TrimLastSep: false, + NotNull: false, + Null: "NULL", + BackslashEscape: true, }, StrictFormat: true, Filter: []string{"*.*"}, diff --git a/br/pkg/lightning/mydump/router.go b/br/pkg/lightning/mydump/router.go index bdc2a922f12f7..bf0ccba834fe0 100644 --- a/br/pkg/lightning/mydump/router.go +++ b/br/pkg/lightning/mydump/router.go @@ -134,7 +134,7 @@ func parseCompressionType(t string) (Compression, error) { return CompressionGZ, nil case "lz4": return CompressionLZ4, nil - case "zstd": + case "zstd", "zst": return CompressionZStd, nil case "xz": return CompressionXZ, nil @@ -324,6 +324,9 @@ func (p regexRouterParser) Parse(r *config.FileRouteRule, logger log.Logger) (*R if err != nil { return err } + if result.Type == SourceTypeParquet && compression != CompressionNone { + return errors.Errorf("can't support whole compressed parquet file, should compress parquet files by choosing correct parquet compress writer, path: %s", r.Path) + } result.Compression = compression return nil }) diff --git a/br/pkg/lightning/mydump/router_test.go b/br/pkg/lightning/mydump/router_test.go index 4e3d8a4215a0d..ab97769e30ce8 100644 --- a/br/pkg/lightning/mydump/router_test.go +++ b/br/pkg/lightning/mydump/router_test.go @@ -292,3 +292,21 @@ func TestRouteWithPath(t *testing.T) { require.NoError(t, err) require.Nil(t, res) } + +func TestRouteWithCompressedParquet(t *testing.T) { + fileName := "myschema.my_table.000.parquet.gz" + rule := &config.FileRouteRule{ + Pattern: `(?i)^(?:[^/]*/)*([^/.]+)\.(.*?)(?:\.([0-9]+))?\.(sql|csv|parquet)(?:\.(\w+))?$`, + Schema: "$1", + Table: "$2", + Type: "$4", + Key: "$3", + Compression: "$5", + Unescape: true, + } + r := *rule + router, err := NewFileRouter([]*config.FileRouteRule{&r}, log.L()) + require.NoError(t, err) + _, err = router.Route(fileName) + require.Error(t, err) +} diff --git a/br/pkg/lightning/restore/BUILD.bazel b/br/pkg/lightning/restore/BUILD.bazel index 175e69e22d02f..647c4cea4d191 100644 --- a/br/pkg/lightning/restore/BUILD.bazel +++ b/br/pkg/lightning/restore/BUILD.bazel @@ -39,11 +39,13 @@ go_library( "//br/pkg/pdutil", "//br/pkg/redact", "//br/pkg/storage", + "//br/pkg/streamhelper", "//br/pkg/utils", "//br/pkg/version", "//br/pkg/version/build", "//ddl", "//errno", + "//keyspace", "//kv", "//meta/autoid", "//parser", @@ -77,6 +79,8 @@ go_library( "@com_github_pingcap_tipb//go-tipb", "@com_github_tikv_client_go_v2//oracle", "@com_github_tikv_pd_client//:client", + "@io_etcd_go_etcd_client_v3//:client", + "@org_golang_google_grpc//:grpc", "@org_golang_x_exp//maps", "@org_golang_x_exp//slices", "@org_golang_x_sync//errgroup", @@ -124,6 +128,7 @@ go_test( "//br/pkg/lightning/worker", "//br/pkg/mock", "//br/pkg/storage", + "//br/pkg/streamhelper", "//br/pkg/version/build", "//ddl", "//errno", @@ -158,6 +163,8 @@ go_test( "@com_github_tikv_pd_client//:client", "@com_github_xitongsys_parquet_go//writer", "@com_github_xitongsys_parquet_go_source//buffer", + "@io_etcd_go_etcd_client_v3//:client", + "@io_etcd_go_etcd_tests_v3//integration", "@org_uber_go_atomic//:atomic", "@org_uber_go_zap//:zap", ], diff --git a/br/pkg/lightning/restore/check_info.go b/br/pkg/lightning/restore/check_info.go index cc4b3b734ebaa..aab9e5ebacef5 100644 --- a/br/pkg/lightning/restore/check_info.go +++ b/br/pkg/lightning/restore/check_info.go @@ -155,3 +155,10 @@ func (rc *Controller) checkSourceSchema(ctx context.Context) error { } return rc.doPreCheckOnItem(ctx, CheckSourceSchemaValid) } + +func (rc *Controller) checkCDCPiTR(ctx context.Context) error { + if rc.cfg.TikvImporter.Backend == config.BackendTiDB { + return nil + } + return rc.doPreCheckOnItem(ctx, CheckTargetUsingCDCPITR) +} diff --git a/br/pkg/lightning/restore/check_info_test.go b/br/pkg/lightning/restore/check_info_test.go index 3a8a666699164..36903ab93b22c 100644 --- a/br/pkg/lightning/restore/check_info_test.go +++ b/br/pkg/lightning/restore/check_info_test.go @@ -493,11 +493,11 @@ func TestCheckTableEmpty(t *testing.T) { require.NoError(t, err) mock.MatchExpectationsInOrder(false) targetInfoGetter.targetDBGlue = glue.NewExternalTiDBGlue(db, mysql.ModeNone) - mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl1` LIMIT 1"). + mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl1` USE INDEX\\(\\) LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).RowError(0, sql.ErrNoRows)) - mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl2` LIMIT 1"). + mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl2` USE INDEX\\(\\) LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).RowError(0, sql.ErrNoRows)) - mock.ExpectQuery("SELECT 1 FROM `test2`.`tbl1` LIMIT 1"). + mock.ExpectQuery("SELECT 1 FROM `test2`.`tbl1` USE INDEX\\(\\) LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).RowError(0, sql.ErrNoRows)) rc.checkTemplate = NewSimpleTemplate() err = rc.checkTableEmpty(ctx) @@ -510,13 +510,13 @@ func TestCheckTableEmpty(t *testing.T) { targetInfoGetter.targetDBGlue = glue.NewExternalTiDBGlue(db, mysql.ModeNone) mock.MatchExpectationsInOrder(false) // test auto retry retryable error - mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl1` LIMIT 1"). + mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl1` USE INDEX\\(\\) LIMIT 1"). WillReturnError(&gmysql.MySQLError{Number: errno.ErrPDServerTimeout}) - mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl1` LIMIT 1"). + mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl1` USE INDEX\\(\\) LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).RowError(0, sql.ErrNoRows)) - mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl2` LIMIT 1"). + mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl2` USE INDEX\\(\\) LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).RowError(0, sql.ErrNoRows)) - mock.ExpectQuery("SELECT 1 FROM `test2`.`tbl1` LIMIT 1"). + mock.ExpectQuery("SELECT 1 FROM `test2`.`tbl1` USE INDEX\\(\\) LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).AddRow(1)) rc.checkTemplate = NewSimpleTemplate() err = rc.checkTableEmpty(ctx) @@ -532,11 +532,11 @@ func TestCheckTableEmpty(t *testing.T) { require.NoError(t, err) targetInfoGetter.targetDBGlue = glue.NewExternalTiDBGlue(db, mysql.ModeNone) mock.MatchExpectationsInOrder(false) - mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl1` LIMIT 1"). + mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl1` USE INDEX\\(\\) LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).AddRow(1)) - mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl2` LIMIT 1"). + mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl2` USE INDEX\\(\\) LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).RowError(0, sql.ErrNoRows)) - mock.ExpectQuery("SELECT 1 FROM `test2`.`tbl1` LIMIT 1"). + mock.ExpectQuery("SELECT 1 FROM `test2`.`tbl1` USE INDEX\\(\\) LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).AddRow(1)) rc.checkTemplate = NewSimpleTemplate() err = rc.checkTableEmpty(ctx) @@ -576,7 +576,7 @@ func TestCheckTableEmpty(t *testing.T) { require.NoError(t, err) targetInfoGetter.targetDBGlue = glue.NewExternalTiDBGlue(db, mysql.ModeNone) // only need to check the one that is not in checkpoint - mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl2` LIMIT 1"). + mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl2` USE INDEX\\(\\) LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).RowError(0, sql.ErrNoRows)) err = rc.checkTableEmpty(ctx) require.NoError(t, err) diff --git a/br/pkg/lightning/restore/checksum.go b/br/pkg/lightning/restore/checksum.go index 71b02801dc2dc..b30fe14e01fc1 100644 --- a/br/pkg/lightning/restore/checksum.go +++ b/br/pkg/lightning/restore/checksum.go @@ -374,7 +374,7 @@ func newGCTTLManager(pdClient pd.Client) gcTTLManager { func (m *gcTTLManager) addOneJob(ctx context.Context, table string, ts uint64) error { // start gc ttl loop if not started yet. - if m.started.CAS(false, true) { + if m.started.CompareAndSwap(false, true) { m.start(ctx) } m.lock.Lock() diff --git a/br/pkg/lightning/restore/get_pre_info.go b/br/pkg/lightning/restore/get_pre_info.go index 287d59c6145a4..4273ff708a89b 100644 --- a/br/pkg/lightning/restore/get_pre_info.go +++ b/br/pkg/lightning/restore/get_pre_info.go @@ -189,7 +189,12 @@ func (g *TargetInfoGetterImpl) IsTableEmpty(ctx context.Context, schemaName stri } var dump int err = exec.QueryRow(ctx, "check table empty", - fmt.Sprintf("SELECT 1 FROM %s LIMIT 1", common.UniqueTable(schemaName, tableName)), + // Here we use the `USE INDEX()` hint to skip fetch the record from index. + // In Lightning, if previous importing is halted half-way, it is possible that + // the data is partially imported, but the index data has not been imported. + // In this situation, if no hint is added, the SQL executor might fetch the record from index, + // which is empty. This will result in missing check. + fmt.Sprintf("SELECT 1 FROM %s USE INDEX() LIMIT 1", common.UniqueTable(schemaName, tableName)), &dump, ) @@ -444,15 +449,7 @@ func (p *PreRestoreInfoGetterImpl) ReadFirstNRowsByTableName(ctx context.Context // ReadFirstNRowsByFileMeta reads the first N rows of an data file. // It implements the PreRestoreInfoGetter interface. func (p *PreRestoreInfoGetterImpl) ReadFirstNRowsByFileMeta(ctx context.Context, dataFileMeta mydump.SourceFileMeta, n int) ([]string, [][]types.Datum, error) { - var ( - reader storage.ReadSeekCloser - err error - ) - if dataFileMeta.Type == mydump.SourceTypeParquet { - reader, err = mydump.OpenParquetReader(ctx, p.srcStorage, dataFileMeta.Path, dataFileMeta.FileSize) - } else { - reader, err = p.srcStorage.Open(ctx, dataFileMeta.Path) - } + reader, err := openReader(ctx, dataFileMeta, p.srcStorage) if err != nil { return nil, nil, errors.Trace(err) } @@ -590,13 +587,7 @@ func (p *PreRestoreInfoGetterImpl) sampleDataFromTable( return resultIndexRatio, isRowOrdered, nil } sampleFile := tableMeta.DataFiles[0].FileMeta - var reader storage.ReadSeekCloser - var err error - if sampleFile.Type == mydump.SourceTypeParquet { - reader, err = mydump.OpenParquetReader(ctx, p.srcStorage, sampleFile.Path, sampleFile.FileSize) - } else { - reader, err = p.srcStorage.Open(ctx, sampleFile.Path) - } + reader, err := openReader(ctx, sampleFile, p.srcStorage) if err != nil { return 0.0, false, errors.Trace(err) } diff --git a/br/pkg/lightning/restore/get_pre_info_test.go b/br/pkg/lightning/restore/get_pre_info_test.go index 8ea57d023c679..71c2810d0b60e 100644 --- a/br/pkg/lightning/restore/get_pre_info_test.go +++ b/br/pkg/lightning/restore/get_pre_info_test.go @@ -14,6 +14,8 @@ package restore import ( + "bytes" + "compress/gzip" "context" "database/sql" "fmt" @@ -24,6 +26,7 @@ import ( mysql_sql_driver "github.com/go-sql-driver/mysql" "github.com/pingcap/errors" "github.com/pingcap/tidb/br/pkg/lightning/config" + "github.com/pingcap/tidb/br/pkg/lightning/mydump" "github.com/pingcap/tidb/br/pkg/lightning/restore/mock" ropts "github.com/pingcap/tidb/br/pkg/lightning/restore/opts" "github.com/pingcap/tidb/errno" @@ -412,6 +415,118 @@ INSERT INTO db01.tbl01 (ival, sval) VALUES (444, 'ddd');` require.Equal(t, theDataInfo.ExpectFirstRowDatums, rowDatums) } +func compressGz(t *testing.T, data []byte) []byte { + t.Helper() + var buf bytes.Buffer + w := gzip.NewWriter(&buf) + _, err := w.Write(data) + require.NoError(t, err) + require.NoError(t, w.Close()) + return buf.Bytes() +} + +func TestGetPreInfoReadCompressedFirstRow(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + var ( + testCSVData01 = []byte(`ival,sval +111,"aaa" +222,"bbb" +`) + testSQLData01 = []byte(`INSERT INTO db01.tbl01 (ival, sval) VALUES (333, 'ccc'); +INSERT INTO db01.tbl01 (ival, sval) VALUES (444, 'ddd');`) + ) + + test1CSVCompressed := compressGz(t, testCSVData01) + test1SQLCompressed := compressGz(t, testSQLData01) + + testDataInfos := []struct { + FileName string + Data []byte + FirstN int + CSVConfig *config.CSVConfig + ExpectFirstRowDatums [][]types.Datum + ExpectColumns []string + }{ + { + FileName: "/db01/tbl01/data.001.csv.gz", + Data: test1CSVCompressed, + FirstN: 1, + ExpectFirstRowDatums: [][]types.Datum{ + { + types.NewStringDatum("111"), + types.NewStringDatum("aaa"), + }, + }, + ExpectColumns: []string{"ival", "sval"}, + }, + { + FileName: "/db01/tbl01/data.001.sql.gz", + Data: test1SQLCompressed, + FirstN: 1, + ExpectFirstRowDatums: [][]types.Datum{ + { + types.NewUintDatum(333), + types.NewStringDatum("ccc"), + }, + }, + ExpectColumns: []string{"ival", "sval"}, + }, + } + + tbl01SchemaBytes := []byte("CREATE TABLE db01.tbl01(id INTEGER PRIMARY KEY AUTO_INCREMENT, ival INTEGER, sval VARCHAR(64));") + tbl01SchemaBytesCompressed := compressGz(t, tbl01SchemaBytes) + + tblMockSourceData := &mock.MockTableSourceData{ + DBName: "db01", + TableName: "tbl01", + SchemaFile: &mock.MockSourceFile{ + FileName: "/db01/tbl01/tbl01.schema.sql.gz", + Data: tbl01SchemaBytesCompressed, + }, + DataFiles: []*mock.MockSourceFile{}, + } + for _, testInfo := range testDataInfos { + tblMockSourceData.DataFiles = append(tblMockSourceData.DataFiles, &mock.MockSourceFile{ + FileName: testInfo.FileName, + Data: testInfo.Data, + }) + } + mockDataMap := map[string]*mock.MockDBSourceData{ + "db01": { + Name: "db01", + Tables: map[string]*mock.MockTableSourceData{ + "tbl01": tblMockSourceData, + }, + }, + } + mockSrc, err := mock.NewMockImportSource(mockDataMap) + require.Nil(t, err) + mockTarget := mock.NewMockTargetInfo() + cfg := config.NewConfig() + cfg.TikvImporter.Backend = config.BackendLocal + ig, err := NewPreRestoreInfoGetter(cfg, mockSrc.GetAllDBFileMetas(), mockSrc.GetStorage(), mockTarget, nil, nil) + require.NoError(t, err) + + cfg.Mydumper.CSV.Header = true + tblMeta := mockSrc.GetDBMetaMap()["db01"].Tables[0] + for i, dataFile := range tblMeta.DataFiles { + theDataInfo := testDataInfos[i] + dataFile.FileMeta.Compression = mydump.CompressionGZ + cols, rowDatums, err := ig.ReadFirstNRowsByFileMeta(ctx, dataFile.FileMeta, theDataInfo.FirstN) + require.Nil(t, err) + t.Logf("%v, %v", cols, rowDatums) + require.Equal(t, theDataInfo.ExpectColumns, cols) + require.Equal(t, theDataInfo.ExpectFirstRowDatums, rowDatums) + } + + theDataInfo := testDataInfos[0] + cols, rowDatums, err := ig.ReadFirstNRowsByTableName(ctx, "db01", "tbl01", theDataInfo.FirstN) + require.NoError(t, err) + require.Equal(t, theDataInfo.ExpectColumns, cols) + require.Equal(t, theDataInfo.ExpectFirstRowDatums, rowDatums) +} + func TestGetPreInfoSampleSource(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -497,6 +612,100 @@ func TestGetPreInfoSampleSource(t *testing.T) { } } +func TestGetPreInfoSampleSourceCompressed(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + dataFileName := "/db01/tbl01/tbl01.data.001.csv.gz" + schemaFileData := []byte("CREATE TABLE db01.tbl01 (id INTEGER PRIMARY KEY AUTO_INCREMENT, ival INTEGER, sval VARCHAR(64));") + schemaFileDataCompressed := compressGz(t, schemaFileData) + mockDataMap := map[string]*mock.MockDBSourceData{ + "db01": { + Name: "db01", + Tables: map[string]*mock.MockTableSourceData{ + "tbl01": { + DBName: "db01", + TableName: "tbl01", + SchemaFile: &mock.MockSourceFile{ + FileName: "/db01/tbl01/tbl01.schema.sql.gz", + Data: schemaFileDataCompressed, + }, + DataFiles: []*mock.MockSourceFile{ + { + FileName: dataFileName, + Data: []byte(nil), + }, + }, + }, + }, + }, + } + mockSrc, err := mock.NewMockImportSource(mockDataMap) + require.Nil(t, err) + mockTarget := mock.NewMockTargetInfo() + cfg := config.NewConfig() + cfg.TikvImporter.Backend = config.BackendLocal + ig, err := NewPreRestoreInfoGetter(cfg, mockSrc.GetAllDBFileMetas(), mockSrc.GetStorage(), mockTarget, nil, nil, ropts.WithIgnoreDBNotExist(true)) + require.NoError(t, err) + + mdDBMeta := mockSrc.GetAllDBFileMetas()[0] + mdTblMeta := mdDBMeta.Tables[0] + dbInfos, err := ig.GetAllTableStructures(ctx) + require.NoError(t, err) + + data := [][]byte{ + []byte(`id,ival,sval +1,111,"aaa" +2,222,"bbb" +`), + []byte(`sval,ival,id +"aaa",111,1 +"bbb",222,2 +`), + []byte(`id,ival,sval +2,222,"bbb" +1,111,"aaa" +`), + []byte(`sval,ival,id +"aaa",111,2 +"bbb",222,1 +`), + } + compressedData := make([][]byte, 0, 4) + for _, d := range data { + compressedData = append(compressedData, compressGz(t, d)) + } + + subTests := []struct { + Data []byte + ExpectIsOrdered bool + }{ + { + Data: compressedData[0], + ExpectIsOrdered: true, + }, + { + Data: compressedData[1], + ExpectIsOrdered: true, + }, + { + Data: compressedData[2], + ExpectIsOrdered: false, + }, + { + Data: compressedData[3], + ExpectIsOrdered: false, + }, + } + for _, subTest := range subTests { + require.NoError(t, mockSrc.GetStorage().WriteFile(ctx, dataFileName, subTest.Data)) + sampledIndexRatio, isRowOrderedFromSample, err := ig.sampleDataFromTable(ctx, "db01", mdTblMeta, dbInfos["db01"].Tables["tbl01"].Core, nil, defaultImportantVariables) + require.NoError(t, err) + t.Logf("%v, %v", sampledIndexRatio, isRowOrderedFromSample) + require.Greater(t, sampledIndexRatio, 1.0) + require.Equal(t, subTest.ExpectIsOrdered, isRowOrderedFromSample) + } +} + func TestGetPreInfoEstimateSourceSize(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -553,7 +762,7 @@ func TestGetPreInfoIsTableEmpty(t *testing.T) { require.NoError(t, err) require.Equal(t, lnConfig, targetGetter.cfg) - mock.ExpectQuery("SELECT 1 FROM `test_db`.`test_tbl` LIMIT 1"). + mock.ExpectQuery("SELECT 1 FROM `test_db`.`test_tbl` USE INDEX\\(\\) LIMIT 1"). WillReturnError(&mysql_sql_driver.MySQLError{ Number: errno.ErrNoSuchTable, Message: "Table 'test_db.test_tbl' doesn't exist", @@ -563,7 +772,7 @@ func TestGetPreInfoIsTableEmpty(t *testing.T) { require.NotNil(t, pIsEmpty) require.Equal(t, true, *pIsEmpty) - mock.ExpectQuery("SELECT 1 FROM `test_db`.`test_tbl` LIMIT 1"). + mock.ExpectQuery("SELECT 1 FROM `test_db`.`test_tbl` USE INDEX\\(\\) LIMIT 1"). WillReturnRows( sqlmock.NewRows([]string{"1"}). RowError(0, sql.ErrNoRows), @@ -573,7 +782,7 @@ func TestGetPreInfoIsTableEmpty(t *testing.T) { require.NotNil(t, pIsEmpty) require.Equal(t, true, *pIsEmpty) - mock.ExpectQuery("SELECT 1 FROM `test_db`.`test_tbl` LIMIT 1"). + mock.ExpectQuery("SELECT 1 FROM `test_db`.`test_tbl` USE INDEX\\(\\) LIMIT 1"). WillReturnRows( sqlmock.NewRows([]string{"1"}).AddRow(1), ) @@ -582,7 +791,7 @@ func TestGetPreInfoIsTableEmpty(t *testing.T) { require.NotNil(t, pIsEmpty) require.Equal(t, false, *pIsEmpty) - mock.ExpectQuery("SELECT 1 FROM `test_db`.`test_tbl` LIMIT 1"). + mock.ExpectQuery("SELECT 1 FROM `test_db`.`test_tbl` USE INDEX\\(\\) LIMIT 1"). WillReturnError(errors.New("some dummy error")) _, err = targetGetter.IsTableEmpty(ctx, "test_db", "test_tbl") require.Error(t, err) diff --git a/br/pkg/lightning/restore/meta_manager.go b/br/pkg/lightning/restore/meta_manager.go index 2d9875ad56960..7f1546d552aa7 100644 --- a/br/pkg/lightning/restore/meta_manager.go +++ b/br/pkg/lightning/restore/meta_manager.go @@ -87,7 +87,7 @@ type tableMetaMgr interface { UpdateTableStatus(ctx context.Context, status metaStatus) error UpdateTableBaseChecksum(ctx context.Context, checksum *verify.KVChecksum) error CheckAndUpdateLocalChecksum(ctx context.Context, checksum *verify.KVChecksum, hasLocalDupes bool) ( - needChecksum bool, needRemoteDupe bool, baseTotalChecksum *verify.KVChecksum, err error) + otherHasDupe bool, needRemoteDupe bool, baseTotalChecksum *verify.KVChecksum, err error) FinishTable(ctx context.Context) error } @@ -370,7 +370,7 @@ func (m *dbTableMetaMgr) UpdateTableStatus(ctx context.Context, status metaStatu } func (m *dbTableMetaMgr) CheckAndUpdateLocalChecksum(ctx context.Context, checksum *verify.KVChecksum, hasLocalDupes bool) ( - needChecksum bool, needRemoteDupe bool, baseTotalChecksum *verify.KVChecksum, err error, + otherHasDupe bool, needRemoteDupe bool, baseTotalChecksum *verify.KVChecksum, err error, ) { conn, err := m.session.Conn(ctx) if err != nil { @@ -393,7 +393,7 @@ func (m *dbTableMetaMgr) CheckAndUpdateLocalChecksum(ctx context.Context, checks taskHasDuplicates bool ) newStatus := metaStatusChecksuming - needChecksum = true + otherHasDupe = false needRemoteDupe = true err = exec.Transact(ctx, "checksum pre-check", func(ctx context.Context, tx *sql.Tx) error { rows, err := tx.QueryContext( @@ -423,9 +423,7 @@ func (m *dbTableMetaMgr) CheckAndUpdateLocalChecksum(ctx context.Context, checks return err } - if taskHasDuplicates { - needChecksum = false - } + otherHasDupe = otherHasDupe || taskHasDuplicates // skip finished meta if status >= metaStatusFinished { @@ -436,7 +434,6 @@ func (m *dbTableMetaMgr) CheckAndUpdateLocalChecksum(ctx context.Context, checks if status >= metaStatusChecksuming { newStatus = status needRemoteDupe = status == metaStatusChecksuming - needChecksum = needChecksum && needRemoteDupe return nil } @@ -445,7 +442,6 @@ func (m *dbTableMetaMgr) CheckAndUpdateLocalChecksum(ctx context.Context, checks if status < metaStatusChecksuming { newStatus = metaStatusChecksumSkipped - needChecksum = false needRemoteDupe = false break } else if status == metaStatusChecksuming { @@ -475,12 +471,13 @@ func (m *dbTableMetaMgr) CheckAndUpdateLocalChecksum(ctx context.Context, checks return false, false, nil, err } - if needChecksum { + if !otherHasDupe && needRemoteDupe { ck := verify.MakeKVChecksum(totalBytes, totalKvs, totalChecksum) baseTotalChecksum = &ck } log.FromContext(ctx).Info("check table checksum", zap.String("table", m.tr.tableName), - zap.Bool("checksum", needChecksum), zap.String("new_status", newStatus.String())) + zap.Bool("otherHasDupe", otherHasDupe), zap.Bool("needRemoteDupe", needRemoteDupe), + zap.String("new_status", newStatus.String())) return } @@ -1073,7 +1070,7 @@ func (m noopTableMetaMgr) UpdateTableBaseChecksum(ctx context.Context, checksum } func (m noopTableMetaMgr) CheckAndUpdateLocalChecksum(ctx context.Context, checksum *verify.KVChecksum, hasLocalDupes bool) (bool, bool, *verify.KVChecksum, error) { - return true, true, &verify.KVChecksum{}, nil + return false, true, &verify.KVChecksum{}, nil } func (m noopTableMetaMgr) FinishTable(ctx context.Context) error { diff --git a/br/pkg/lightning/restore/mock/mock.go b/br/pkg/lightning/restore/mock/mock.go index f43e6c022673e..24e287f11c5f0 100644 --- a/br/pkg/lightning/restore/mock/mock.go +++ b/br/pkg/lightning/restore/mock/mock.go @@ -77,14 +77,19 @@ func NewMockImportSource(dbSrcDataMap map[string]*MockDBSourceData) (*MockImport tblMeta := mydump.NewMDTableMeta("binary") tblMeta.DB = dbName tblMeta.Name = tblName + compression := mydump.CompressionNone + if strings.HasSuffix(tblData.SchemaFile.FileName, ".gz") { + compression = mydump.CompressionGZ + } tblMeta.SchemaFile = mydump.FileInfo{ TableName: filter.Table{ Schema: dbName, Name: tblName, }, FileMeta: mydump.SourceFileMeta{ - Path: tblData.SchemaFile.FileName, - Type: mydump.SourceTypeTableSchema, + Path: tblData.SchemaFile.FileName, + Type: mydump.SourceTypeTableSchema, + Compression: compression, }, } tblMeta.DataFiles = []mydump.FileInfo{} @@ -106,14 +111,20 @@ func NewMockImportSource(dbSrcDataMap map[string]*MockDBSourceData) (*MockImport FileMeta: mydump.SourceFileMeta{ Path: tblDataFile.FileName, FileSize: int64(fileSize), + RealSize: int64(fileSize), }, } + fileName := tblDataFile.FileName + if strings.HasSuffix(fileName, ".gz") { + fileName = strings.TrimSuffix(tblDataFile.FileName, ".gz") + fileInfo.FileMeta.Compression = mydump.CompressionGZ + } switch { - case strings.HasSuffix(tblDataFile.FileName, ".csv"): + case strings.HasSuffix(fileName, ".csv"): fileInfo.FileMeta.Type = mydump.SourceTypeCSV - case strings.HasSuffix(tblDataFile.FileName, ".sql"): + case strings.HasSuffix(fileName, ".sql"): fileInfo.FileMeta.Type = mydump.SourceTypeSQL - case strings.HasSuffix(tblDataFile.FileName, ".parquet"): + case strings.HasSuffix(fileName, ".parquet"): fileInfo.FileMeta.Type = mydump.SourceTypeParquet default: return nil, errors.Errorf("unsupported file type: %s", tblDataFile.FileName) diff --git a/br/pkg/lightning/restore/precheck.go b/br/pkg/lightning/restore/precheck.go index 7dc578053492d..f078fe50f473c 100644 --- a/br/pkg/lightning/restore/precheck.go +++ b/br/pkg/lightning/restore/precheck.go @@ -25,6 +25,7 @@ const ( CheckTargetClusterVersion CheckItemID = "CHECK_TARGET_CLUSTER_VERSION" CheckLocalDiskPlacement CheckItemID = "CHECK_LOCAL_DISK_PLACEMENT" CheckLocalTempKVDir CheckItemID = "CHECK_LOCAL_TEMP_KV_DIR" + CheckTargetUsingCDCPITR CheckItemID = "CHECK_TARGET_USING_CDC_PITR" ) type CheckResult struct { @@ -138,7 +139,9 @@ func (b *PrecheckItemBuilder) BuildPrecheckItem(checkID CheckItemID) (PrecheckIt case CheckLocalDiskPlacement: return NewLocalDiskPlacementCheckItem(b.cfg), nil case CheckLocalTempKVDir: - return NewLocalTempKVDirCheckItem(b.cfg, b.preInfoGetter), nil + return NewLocalTempKVDirCheckItem(b.cfg, b.preInfoGetter, b.dbMetas), nil + case CheckTargetUsingCDCPITR: + return NewCDCPITRCheckItem(b.cfg), nil default: return nil, errors.Errorf("unsupported check item: %v", checkID) } diff --git a/br/pkg/lightning/restore/precheck_impl.go b/br/pkg/lightning/restore/precheck_impl.go index 64e15d5aa828a..3dcd5cce973f9 100644 --- a/br/pkg/lightning/restore/precheck_impl.go +++ b/br/pkg/lightning/restore/precheck_impl.go @@ -14,13 +14,16 @@ package restore import ( + "bytes" "context" + "encoding/json" "fmt" "path/filepath" "reflect" "strconv" "strings" "sync" + "time" "github.com/docker/go-units" "github.com/pingcap/errors" @@ -32,6 +35,7 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/lightning/mydump" "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/br/pkg/streamhelper" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/store/pdtypes" @@ -40,9 +44,11 @@ import ( "github.com/pingcap/tidb/util/engine" "github.com/pingcap/tidb/util/mathutil" "github.com/pingcap/tidb/util/set" + clientv3 "go.etcd.io/etcd/client/v3" "go.uber.org/zap" "golang.org/x/exp/slices" "golang.org/x/sync/errgroup" + "google.golang.org/grpc" ) type clusterResourceCheckItem struct { @@ -428,7 +434,7 @@ func (ci *largeFileCheckItem) Check(ctx context.Context) (*CheckResult, error) { for _, db := range ci.dbMetas { for _, t := range db.Tables { for _, f := range t.DataFiles { - if f.FileMeta.FileSize > defaultCSVSize { + if f.FileMeta.RealSize > defaultCSVSize { theResult.Message = fmt.Sprintf("large csv: %s file exists and it will slow down import performance", f.FileMeta.Path) theResult.Passed = false } @@ -478,12 +484,14 @@ func (ci *localDiskPlacementCheckItem) Check(ctx context.Context) (*CheckResult, type localTempKVDirCheckItem struct { cfg *config.Config preInfoGetter PreRestoreInfoGetter + dbMetas []*mydump.MDDatabaseMeta } -func NewLocalTempKVDirCheckItem(cfg *config.Config, preInfoGetter PreRestoreInfoGetter) PrecheckItem { +func NewLocalTempKVDirCheckItem(cfg *config.Config, preInfoGetter PreRestoreInfoGetter, dbMetas []*mydump.MDDatabaseMeta) PrecheckItem { return &localTempKVDirCheckItem{ cfg: cfg, preInfoGetter: preInfoGetter, + dbMetas: dbMetas, } } @@ -491,10 +499,28 @@ func (ci *localTempKVDirCheckItem) GetCheckItemID() CheckItemID { return CheckLocalTempKVDir } +func (ci *localTempKVDirCheckItem) hasCompressedFiles() bool { + for _, dbMeta := range ci.dbMetas { + for _, tbMeta := range dbMeta.Tables { + for _, file := range tbMeta.DataFiles { + if file.FileMeta.Compression != mydump.CompressionNone { + return true + } + } + } + } + return false +} + func (ci *localTempKVDirCheckItem) Check(ctx context.Context) (*CheckResult, error) { + severity := Critical + // for cases that have compressed files, the estimated size may not be accurate, set severity to Warn to avoid failure + if ci.hasCompressedFiles() { + severity = Warn + } theResult := &CheckResult{ Item: ci.GetCheckItemID(), - Severity: Critical, + Severity: severity, } storageSize, err := common.GetStorageSize(ci.cfg.TikvImporter.SortedKVDir) if err != nil { @@ -672,6 +698,182 @@ func (ci *checkpointCheckItem) checkpointIsValid(ctx context.Context, tableInfo return msgs, nil } +// CDCPITRCheckItem check downstream has enabled CDC or PiTR. It's exposed to let +// caller override the Instruction message. +type CDCPITRCheckItem struct { + cfg *config.Config + Instruction string + // used in test + etcdCli *clientv3.Client +} + +// NewCDCPITRCheckItem creates a checker to check downstream has enabled CDC or PiTR. +func NewCDCPITRCheckItem(cfg *config.Config) PrecheckItem { + return &CDCPITRCheckItem{ + cfg: cfg, + Instruction: "local backend is not compatible with them. Please switch to tidb backend then try again.", + } +} + +// GetCheckItemID implements PrecheckItem interface. +func (ci *CDCPITRCheckItem) GetCheckItemID() CheckItemID { + return CheckTargetUsingCDCPITR +} + +func dialEtcdWithCfg(ctx context.Context, cfg *config.Config) (*clientv3.Client, error) { + cfg2, err := cfg.ToTLS() + if err != nil { + return nil, err + } + tlsConfig := cfg2.TLSConfig() + + return clientv3.New(clientv3.Config{ + TLS: tlsConfig, + Endpoints: []string{cfg.TiDB.PdAddr}, + AutoSyncInterval: 30 * time.Second, + DialTimeout: 5 * time.Second, + DialOptions: []grpc.DialOption{ + config.DefaultGrpcKeepaliveParams, + grpc.WithBlock(), + grpc.WithReturnConnectionError(), + }, + Context: ctx, + }) +} + +// Check implements PrecheckItem interface. +func (ci *CDCPITRCheckItem) Check(ctx context.Context) (*CheckResult, error) { + theResult := &CheckResult{ + Item: ci.GetCheckItemID(), + Severity: Critical, + } + + if ci.cfg.TikvImporter.Backend != config.BackendLocal { + theResult.Passed = true + theResult.Message = "TiDB Lightning is not using local backend, skip this check" + return theResult, nil + } + + if ci.etcdCli == nil { + var err error + ci.etcdCli, err = dialEtcdWithCfg(ctx, ci.cfg) + if err != nil { + return nil, errors.Trace(err) + } + //nolint: errcheck + defer ci.etcdCli.Close() + } + + errorMsg := make([]string, 0, 2) + + pitrCli := streamhelper.NewMetaDataClient(ci.etcdCli) + tasks, err := pitrCli.GetAllTasks(ctx) + if err != nil { + return nil, errors.Trace(err) + } + if len(tasks) > 0 { + names := make([]string, 0, len(tasks)) + for _, task := range tasks { + names = append(names, task.Info.GetName()) + } + errorMsg = append(errorMsg, fmt.Sprintf("found PiTR log streaming task(s): %v,", names)) + } + + // check etcd KV of CDC >= v6.2 + cdcPrefix := "/tidb/cdc/" + changefeedPath := []byte("/changefeed/info/") + + nameSet := make(map[string][]string, 1) + resp, err := ci.etcdCli.Get(ctx, cdcPrefix, clientv3.WithPrefix()) + if err != nil { + return nil, errors.Trace(err) + } + for _, kv := range resp.Kvs { + // example: /tidb/cdc///changefeed/info/ + k := kv.Key[len(cdcPrefix):] + clusterAndNamespace, changefeedID, found := bytes.Cut(k, changefeedPath) + if !found { + continue + } + if !isActiveCDCChangefeed(kv.Value) { + continue + } + + nameSet[string(clusterAndNamespace)] = append(nameSet[string(clusterAndNamespace)], string(changefeedID)) + } + if len(nameSet) == 0 { + // check etcd KV of CDC <= v6.1 + cdcPrefixV61 := "/tidb/cdc/changefeed/info/" + resp, err = ci.etcdCli.Get(ctx, cdcPrefixV61, clientv3.WithPrefix()) + if err != nil { + return nil, errors.Trace(err) + } + for _, kv := range resp.Kvs { + // example: /tidb/cdc/changefeed/info/ + k := kv.Key[len(cdcPrefixV61):] + if len(k) == 0 { + continue + } + if !isActiveCDCChangefeed(kv.Value) { + continue + } + + nameSet[""] = append(nameSet[""], string(k)) + } + } + + if len(nameSet) > 0 { + var changefeedMsgBuf strings.Builder + changefeedMsgBuf.WriteString("found CDC changefeed(s): ") + isFirst := true + for clusterID, captureIDs := range nameSet { + if !isFirst { + changefeedMsgBuf.WriteString(", ") + } + isFirst = false + changefeedMsgBuf.WriteString("cluster/namespace: ") + changefeedMsgBuf.WriteString(clusterID) + changefeedMsgBuf.WriteString(" changefeed(s): ") + changefeedMsgBuf.WriteString(fmt.Sprintf("%v", captureIDs)) + } + changefeedMsgBuf.WriteString(",") + errorMsg = append(errorMsg, changefeedMsgBuf.String()) + } + + if len(errorMsg) > 0 { + errorMsg = append(errorMsg, ci.Instruction) + theResult.Passed = false + theResult.Message = strings.Join(errorMsg, "\n") + } else { + theResult.Passed = true + theResult.Message = "no CDC or PiTR task found" + } + + return theResult, nil +} + +type onlyState struct { + State string `json:"state"` +} + +func isActiveCDCChangefeed(jsonBytes []byte) bool { + s := onlyState{} + err := json.Unmarshal(jsonBytes, &s) + if err != nil { + // maybe a compatible issue, skip this key + log.L().Error("unmarshal etcd value failed when check CDC changefeed, will skip this key", + zap.ByteString("value", jsonBytes), + zap.Error(err)) + return false + } + switch s.State { + case "normal", "stopped", "error": + return true + default: + return false + } +} + type schemaCheckItem struct { cfg *config.Config preInfoGetter PreRestoreInfoGetter diff --git a/br/pkg/lightning/restore/precheck_impl_test.go b/br/pkg/lightning/restore/precheck_impl_test.go index 88f3cf8f9a30b..9d10c34b76d13 100644 --- a/br/pkg/lightning/restore/precheck_impl_test.go +++ b/br/pkg/lightning/restore/precheck_impl_test.go @@ -24,7 +24,11 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/lightning/restore/mock" ropts "github.com/pingcap/tidb/br/pkg/lightning/restore/opts" + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/br/pkg/streamhelper" "github.com/stretchr/testify/suite" + clientv3 "go.etcd.io/etcd/client/v3" + "go.etcd.io/etcd/tests/v3/integration" ) type precheckImplSuite struct { @@ -377,7 +381,7 @@ func (s *precheckImplSuite) TestLocalTempKVDirCheckBasic() { defer cancel() s.cfg.TikvImporter.SortedKVDir = "/tmp/" - ci = NewLocalTempKVDirCheckItem(s.cfg, s.preInfoGetter) + ci = NewLocalTempKVDirCheckItem(s.cfg, s.preInfoGetter, s.mockSrc.GetAllDBFileMetas()) s.Require().Equal(CheckLocalTempKVDir, ci.GetCheckItemID()) result, err = ci.Check(ctx) s.Require().NoError(err) @@ -396,7 +400,7 @@ func (s *precheckImplSuite) TestLocalTempKVDirCheckBasic() { }, ) s.Require().NoError(s.setMockImportData(testMockSrcData)) - ci = NewLocalTempKVDirCheckItem(s.cfg, s.preInfoGetter) + ci = NewLocalTempKVDirCheckItem(s.cfg, s.preInfoGetter, s.mockSrc.GetAllDBFileMetas()) s.Require().Equal(CheckLocalTempKVDir, ci.GetCheckItemID()) result, err = ci.Check(ctx) s.Require().NoError(err) @@ -581,3 +585,99 @@ func (s *precheckImplSuite) TestTableEmptyCheckBasic() { s.T().Logf("check result message: %s", result.Message) s.Require().False(result.Passed) } + +func (s *precheckImplSuite) TestCDCPITRCheckItem() { + integration.BeforeTestExternal(s.T()) + testEtcdCluster := integration.NewClusterV3(s.T(), &integration.ClusterConfig{Size: 1}) + defer testEtcdCluster.Terminate(s.T()) + + ctx := context.Background() + cfg := &config.Config{ + TikvImporter: config.TikvImporter{ + Backend: config.BackendLocal, + }, + } + ci := NewCDCPITRCheckItem(cfg) + checker := ci.(*CDCPITRCheckItem) + checker.etcdCli = testEtcdCluster.RandClient() + result, err := ci.Check(ctx) + s.Require().NoError(err) + s.Require().NotNil(result) + s.Require().Equal(ci.GetCheckItemID(), result.Item) + s.Require().Equal(Critical, result.Severity) + s.Require().True(result.Passed) + s.Require().Equal("no CDC or PiTR task found", result.Message) + + cli := testEtcdCluster.RandClient() + brCli := streamhelper.NewMetaDataClient(cli) + backend, _ := storage.ParseBackend("noop://", nil) + taskInfo, err := streamhelper.NewTaskInfo("br_name"). + FromTS(1). + UntilTS(1000). + WithTableFilter("*.*", "!mysql"). + ToStorage(backend). + Check() + s.Require().NoError(err) + err = brCli.PutTask(ctx, *taskInfo) + s.Require().NoError(err) + checkEtcdPut := func(key string, vals ...string) { + val := "" + if len(vals) == 1 { + val = vals[0] + } + _, err := cli.Put(ctx, key, val) + s.Require().NoError(err) + } + // TiCDC >= v6.2 + checkEtcdPut("/tidb/cdc/default/__cdc_meta__/capture/3ecd5c98-0148-4086-adfd-17641995e71f") + checkEtcdPut("/tidb/cdc/default/__cdc_meta__/meta/meta-version") + checkEtcdPut("/tidb/cdc/default/__cdc_meta__/meta/ticdc-delete-etcd-key-count") + checkEtcdPut("/tidb/cdc/default/__cdc_meta__/owner/22318498f4dd6639") + checkEtcdPut( + "/tidb/cdc/default/default/changefeed/info/test", + `{"upstream-id":7195826648407968958,"namespace":"default","changefeed-id":"test-1","sink-uri":"mysql://root@127.0.0.1:3306?time-zone=","create-time":"2023-02-03T15:23:34.773768+08:00","start-ts":439198420741652483,"target-ts":0,"admin-job-type":0,"sort-engine":"unified","sort-dir":"","config":{"memory-quota":1073741824,"case-sensitive":true,"enable-old-value":true,"force-replicate":false,"check-gc-safe-point":true,"enable-sync-point":false,"bdr-mode":false,"sync-point-interval":600000000000,"sync-point-retention":86400000000000,"filter":{"rules":["*.*"],"ignore-txn-start-ts":null,"event-filters":null},"mounter":{"worker-num":16},"sink":{"transaction-atomicity":"","protocol":"","dispatchers":null,"csv":{"delimiter":",","quote":"\"","null":"\\N","include-commit-ts":false},"column-selectors":null,"schema-registry":"","encoder-concurrency":16,"terminator":"\r\n","date-separator":"none","enable-partition-separator":false},"consistent":{"level":"none","max-log-size":64,"flush-interval":2000,"storage":""},"scheduler":{"region-per-span":0}},"state":"normal","error":null,"creator-version":"v6.5.0-master-dirty"}`, + ) + checkEtcdPut( + "/tidb/cdc/default/default/changefeed/info/test-1", + `{"upstream-id":7195826648407968958,"namespace":"default","changefeed-id":"test-1","sink-uri":"mysql://root@127.0.0.1:3306?time-zone=","create-time":"2023-02-03T15:23:34.773768+08:00","start-ts":439198420741652483,"target-ts":0,"admin-job-type":0,"sort-engine":"unified","sort-dir":"","config":{"memory-quota":1073741824,"case-sensitive":true,"enable-old-value":true,"force-replicate":false,"check-gc-safe-point":true,"enable-sync-point":false,"bdr-mode":false,"sync-point-interval":600000000000,"sync-point-retention":86400000000000,"filter":{"rules":["*.*"],"ignore-txn-start-ts":null,"event-filters":null},"mounter":{"worker-num":16},"sink":{"transaction-atomicity":"","protocol":"","dispatchers":null,"csv":{"delimiter":",","quote":"\"","null":"\\N","include-commit-ts":false},"column-selectors":null,"schema-registry":"","encoder-concurrency":16,"terminator":"\r\n","date-separator":"none","enable-partition-separator":false},"consistent":{"level":"none","max-log-size":64,"flush-interval":2000,"storage":""},"scheduler":{"region-per-span":0}},"state":"failed","error":null,"creator-version":"v6.5.0-master-dirty"}`, + ) + checkEtcdPut("/tidb/cdc/default/default/changefeed/status/test") + checkEtcdPut("/tidb/cdc/default/default/changefeed/status/test-1") + checkEtcdPut("/tidb/cdc/default/default/task/position/3ecd5c98-0148-4086-adfd-17641995e71f/test-1") + checkEtcdPut("/tidb/cdc/default/default/upstream/7168358383033671922") + + result, err = ci.Check(ctx) + s.Require().NoError(err) + s.Require().False(result.Passed) + s.Require().Equal("found PiTR log streaming task(s): [br_name],\n"+ + "found CDC changefeed(s): cluster/namespace: default/default changefeed(s): [test],\n"+ + "local backend is not compatible with them. Please switch to tidb backend then try again.", + result.Message) + + _, err = cli.Delete(ctx, "/tidb/cdc/", clientv3.WithPrefix()) + s.Require().NoError(err) + + // TiCDC <= v6.1 + checkEtcdPut("/tidb/cdc/capture/f14cb04d-5ba1-410e-a59b-ccd796920e9d") + checkEtcdPut( + "/tidb/cdc/changefeed/info/test", + `{"upstream-id":7195826648407968958,"namespace":"default","changefeed-id":"test-1","sink-uri":"mysql://root@127.0.0.1:3306?time-zone=","create-time":"2023-02-03T15:23:34.773768+08:00","start-ts":439198420741652483,"target-ts":0,"admin-job-type":0,"sort-engine":"unified","sort-dir":"","config":{"memory-quota":1073741824,"case-sensitive":true,"enable-old-value":true,"force-replicate":false,"check-gc-safe-point":true,"enable-sync-point":false,"bdr-mode":false,"sync-point-interval":600000000000,"sync-point-retention":86400000000000,"filter":{"rules":["*.*"],"ignore-txn-start-ts":null,"event-filters":null},"mounter":{"worker-num":16},"sink":{"transaction-atomicity":"","protocol":"","dispatchers":null,"csv":{"delimiter":",","quote":"\"","null":"\\N","include-commit-ts":false},"column-selectors":null,"schema-registry":"","encoder-concurrency":16,"terminator":"\r\n","date-separator":"none","enable-partition-separator":false},"consistent":{"level":"none","max-log-size":64,"flush-interval":2000,"storage":""},"scheduler":{"region-per-span":0}},"state":"stopped","error":null,"creator-version":"v6.5.0-master-dirty"}`, + ) + checkEtcdPut("/tidb/cdc/job/test") + checkEtcdPut("/tidb/cdc/owner/223184ad80a88b0b") + checkEtcdPut("/tidb/cdc/task/position/f14cb04d-5ba1-410e-a59b-ccd796920e9d/test") + + result, err = ci.Check(ctx) + s.Require().NoError(err) + s.Require().False(result.Passed) + s.Require().Equal("found PiTR log streaming task(s): [br_name],\n"+ + "found CDC changefeed(s): cluster/namespace: changefeed(s): [test],\n"+ + "local backend is not compatible with them. Please switch to tidb backend then try again.", + result.Message) + + checker.cfg.TikvImporter.Backend = config.BackendTiDB + result, err = ci.Check(ctx) + s.Require().NoError(err) + s.Require().True(result.Passed) + s.Require().Equal("TiDB Lightning is not using local backend, skip this check", result.Message) +} diff --git a/br/pkg/lightning/restore/restore.go b/br/pkg/lightning/restore/restore.go index 0a0e05b45ac5d..1032419ab777f 100644 --- a/br/pkg/lightning/restore/restore.go +++ b/br/pkg/lightning/restore/restore.go @@ -54,6 +54,7 @@ import ( "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/br/pkg/version" "github.com/pingcap/tidb/br/pkg/version/build" + "github.com/pingcap/tidb/keyspace" tidbkv "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/parser/model" @@ -227,12 +228,23 @@ type Controller struct { diskQuotaState atomic.Int32 compactState atomic.Int32 status *LightningStatus + dupIndicator *atomic.Bool preInfoGetter PreRestoreInfoGetter precheckItemBuilder *PrecheckItemBuilder + + keyspaceName string } +// LightningStatus provides the finished bytes and total bytes of the current task. +// It should keep the value after restart from checkpoint. +// When it is tidb backend, FinishedFileSize can be counted after chunk data is +// restored to tidb. When it is local backend it's counted after whole engine is +// imported. +// TotalFileSize may be an estimated value, so when the task is finished, it may +// not equal to FinishedFileSize. type LightningStatus struct { + backend string FinishedFileSize atomic.Int64 TotalFileSize atomic.Int64 } @@ -255,6 +267,10 @@ type ControllerParam struct { CheckpointStorage storage.ExternalStorage // when CheckpointStorage is not nil, save file checkpoint to it with this name CheckpointName string + // DupIndicator can expose the duplicate detection result to the caller + DupIndicator *atomic.Bool + // Keyspace name + KeyspaceName string } func NewRestoreController( @@ -342,7 +358,7 @@ func NewRestoreControllerWithPauser( } } - backend, err = local.NewLocalBackend(ctx, tls, cfg, p.Glue, maxOpenFiles, errorMgr) + backend, err = local.NewLocalBackend(ctx, tls, cfg, p.Glue, maxOpenFiles, errorMgr, p.KeyspaceName) if err != nil { return nil, common.NormalizeOrWrapErr(common.ErrUnknown, err) } @@ -353,6 +369,7 @@ func NewRestoreControllerWithPauser( default: return nil, common.ErrUnknownBackend.GenWithStackByArgs(cfg.TikvImporter.Backend) } + p.Status.backend = cfg.TikvImporter.Backend var metaBuilder metaMgrBuilder isSSTImport := cfg.TikvImporter.Backend == config.BackendLocal @@ -421,9 +438,12 @@ func NewRestoreControllerWithPauser( errorMgr: errorMgr, status: p.Status, taskMgr: nil, + dupIndicator: p.DupIndicator, preInfoGetter: preInfoGetter, precheckItemBuilder: preCheckBuilder, + + keyspaceName: p.KeyspaceName, } return rc, nil @@ -925,7 +945,7 @@ func (rc *Controller) estimateChunkCountIntoMetrics(ctx context.Context) error { if _, ok := fileChunks[c.Key.Path]; !ok { fileChunks[c.Key.Path] = 0.0 } - remainChunkCnt := float64(c.Chunk.EndOffset-c.Chunk.Offset) / float64(c.Chunk.EndOffset-c.Key.Offset) + remainChunkCnt := float64(c.UnfinishedSize()) / float64(c.TotalSize()) fileChunks[c.Key.Path] += remainChunkCnt } } @@ -940,7 +960,8 @@ func (rc *Controller) estimateChunkCountIntoMetrics(ctx context.Context) error { } if fileMeta.FileMeta.Type == mydump.SourceTypeCSV { cfg := rc.cfg.Mydumper - if fileMeta.FileMeta.FileSize > int64(cfg.MaxRegionSize) && cfg.StrictFormat && !cfg.CSV.Header { + if fileMeta.FileMeta.FileSize > int64(cfg.MaxRegionSize) && cfg.StrictFormat && + !cfg.CSV.Header && fileMeta.FileMeta.Compression == mydump.CompressionNone { estimatedChunkCount += math.Round(float64(fileMeta.FileMeta.FileSize) / float64(cfg.MaxRegionSize)) } else { estimatedChunkCount++ @@ -1486,7 +1507,7 @@ func (rc *Controller) restoreTables(ctx context.Context) (finalErr error) { // Disable GC because TiDB enables GC already. kvStore, err = driver.TiKVDriver{}.OpenWithOptions( - fmt.Sprintf("tikv://%s?disableGC=true", rc.cfg.TiDB.PdAddr), + fmt.Sprintf("tikv://%s?disableGC=true&keyspaceName=%s", rc.cfg.TiDB.PdAddr, rc.keyspaceName), driver.WithSecurity(rc.tls.ToTiKVSecurityConfig()), ) if err != nil { @@ -1606,7 +1627,7 @@ func (rc *Controller) restoreTables(ctx context.Context) (finalErr error) { } else { for _, eng := range cp.Engines { for _, chunk := range eng.Chunks { - totalDataSizeToRestore += chunk.Chunk.EndOffset - chunk.Chunk.Offset + totalDataSizeToRestore += chunk.UnfinishedSize() } } } @@ -1832,7 +1853,7 @@ func (rc *Controller) fullCompact(ctx context.Context) error { // wait until any existing level-1 compact to complete first. task := log.FromContext(ctx).Begin(zap.InfoLevel, "wait for completion of existing level 1 compaction") - for !rc.compactState.CAS(compactStateIdle, compactStateDoing) { + for !rc.compactState.CompareAndSwap(compactStateIdle, compactStateDoing) { time.Sleep(100 * time.Millisecond) } task.End(zap.ErrorLevel, nil) @@ -1892,7 +1913,7 @@ func (rc *Controller) switchTiKVMode(ctx context.Context, mode sstpb.SwitchMode) } func (rc *Controller) enforceDiskQuota(ctx context.Context) { - if !rc.diskQuotaState.CAS(diskQuotaStateIdle, diskQuotaStateChecking) { + if !rc.diskQuotaState.CompareAndSwap(diskQuotaStateIdle, diskQuotaStateChecking) { // do not run multiple the disk quota check / import simultaneously. // (we execute the lock check in background to avoid blocking the cron thread) return @@ -2127,6 +2148,10 @@ func (rc *Controller) preCheckRequirements(ctx context.Context) error { return common.ErrCheckClusterRegion.Wrap(err).GenWithStackByArgs() } } + // even if checkpoint exists, we still need to make sure CDC/PiTR task is not running. + if err := rc.checkCDCPiTR(ctx); err != nil { + return common.ErrCheckCDCPiTR.Wrap(err).GenWithStackByArgs() + } } } @@ -2190,23 +2215,7 @@ func newChunkRestore( ) (*chunkRestore, error) { blockBufSize := int64(cfg.Mydumper.ReadBlockSize) - var ( - reader storage.ReadSeekCloser - compressType storage.CompressType - err error - ) - switch { - case chunk.FileMeta.Type == mydump.SourceTypeParquet: - reader, err = mydump.OpenParquetReader(ctx, store, chunk.FileMeta.Path, chunk.FileMeta.FileSize) - case chunk.FileMeta.Compression != mydump.CompressionNone: - compressType, err = mydump.ToStorageCompressType(chunk.FileMeta.Compression) - if err != nil { - break - } - reader, err = storage.WithCompression(store, compressType).Open(ctx, chunk.FileMeta.Path) - default: - reader, err = store.Open(ctx, chunk.FileMeta.Path) - } + reader, err := openReader(ctx, chunk.FileMeta, store) if err != nil { return nil, errors.Trace(err) } @@ -2298,6 +2307,8 @@ type deliveredKVs struct { columns []string offset int64 rowID int64 + + realOffset int64 // indicates file reader's current position, only used for compressed files } type deliverResult struct { @@ -2326,14 +2337,25 @@ func (cr *chunkRestore) deliverLoop( dataSynced := true hasMoreKVs := true + var startRealOffset, currRealOffset int64 // save to 0 at first + for hasMoreKVs { - var dataChecksum, indexChecksum verify.KVChecksum + c := keyspace.CodecV1 + if t.kvStore != nil { + c = t.kvStore.GetCodec() + } + var ( + dataChecksum = verify.NewKVChecksumWithKeyspace(c) + indexChecksum = verify.NewKVChecksumWithKeyspace(c) + ) var columns []string var kvPacket []deliveredKVs // init these two field as checkpoint current value, so even if there are no kv pairs delivered, // chunk checkpoint should stay the same startOffset := cr.chunk.Chunk.Offset currOffset := startOffset + startRealOffset = cr.chunk.Chunk.RealOffset + currRealOffset = startRealOffset rowID := cr.chunk.Chunk.PrevRowIDMax populate: @@ -2348,12 +2370,14 @@ func (cr *chunkRestore) deliverLoop( if p.kvs == nil { // This is the last message. currOffset = p.offset + currRealOffset = p.realOffset hasMoreKVs = false break populate } - p.kvs.ClassifyAndAppend(&dataKVs, &dataChecksum, &indexKVs, &indexChecksum) + p.kvs.ClassifyAndAppend(&dataKVs, dataChecksum, &indexKVs, indexChecksum) columns = p.columns currOffset = p.offset + currRealOffset = p.realOffset rowID = p.rowID } case <-ctx.Done(): @@ -2417,9 +2441,10 @@ func (cr *chunkRestore) deliverLoop( // No need to apply a lock since this is the only thread updating `cr.chunk.**`. // In local mode, we should write these checkpoints after engine flushed. lastOffset := cr.chunk.Chunk.Offset - cr.chunk.Checksum.Add(&dataChecksum) - cr.chunk.Checksum.Add(&indexChecksum) + cr.chunk.Checksum.Add(dataChecksum) + cr.chunk.Checksum.Add(indexChecksum) cr.chunk.Chunk.Offset = currOffset + cr.chunk.Chunk.RealOffset = currRealOffset cr.chunk.Chunk.PrevRowIDMax = rowID if m, ok := metric.FromContext(ctx); ok { @@ -2427,11 +2452,21 @@ func (cr *chunkRestore) deliverLoop( // comes from chunk.Chunk.Offset. so it shouldn't happen that currOffset - startOffset < 0. // but we met it one time, but cannot reproduce it now, we add this check to make code more robust // TODO: reproduce and find the root cause and fix it completely - if currOffset >= startOffset { - m.BytesCounter.WithLabelValues(metric.BytesStateRestored).Add(float64(currOffset - startOffset)) + var lowOffset, highOffset int64 + if cr.chunk.FileMeta.Compression != mydump.CompressionNone { + lowOffset, highOffset = startRealOffset, currRealOffset } else { - deliverLogger.Warn("offset go back", zap.Int64("curr", currOffset), - zap.Int64("start", startOffset)) + lowOffset, highOffset = startOffset, currOffset + } + delta := highOffset - lowOffset + if delta >= 0 { + m.BytesCounter.WithLabelValues(metric.BytesStateRestored).Add(float64(delta)) + if rc.status != nil && rc.status.backend == config.BackendTiDB { + rc.status.FinishedFileSize.Add(delta) + } + } else { + deliverLogger.Warn("offset go back", zap.Int64("curr", highOffset), + zap.Int64("start", lowOffset)) } } @@ -2441,6 +2476,11 @@ func (cr *chunkRestore) deliverLoop( } failpoint.Inject("SlowDownWriteRows", func() { deliverLogger.Warn("Slowed down write rows") + finished := rc.status.FinishedFileSize.Load() + total := rc.status.TotalFileSize.Load() + deliverLogger.Warn("PrintStatus Failpoint", + zap.Int64("finished", finished), + zap.Int64("total", total)) }) failpoint.Inject("FailAfterWriteRows", nil) // TODO: for local backend, we may save checkpoint more frequently, e.g. after written @@ -2607,14 +2647,22 @@ func (cr *chunkRestore) encodeLoop( canDeliver := false kvPacket := make([]deliveredKVs, 0, maxKvPairsCnt) curOffset := offset - var newOffset, rowID int64 + var newOffset, rowID, realOffset int64 var kvSize uint64 + var realOffsetErr error outLoop: for !canDeliver { readDurStart := time.Now() err = cr.parser.ReadRow() columnNames := cr.parser.Columns() newOffset, rowID = cr.parser.Pos() + if cr.chunk.FileMeta.Compression != mydump.CompressionNone { + realOffset, realOffsetErr = cr.parser.RealPos() + if realOffsetErr != nil { + logger.Warn("fail to get data engine RealPos, progress may not be accurate", + log.ShortError(realOffsetErr), zap.String("file", cr.chunk.FileMeta.Path)) + } + } switch errors.Cause(err) { case nil: @@ -2676,7 +2724,8 @@ func (cr *chunkRestore) encodeLoop( continue } - kvPacket = append(kvPacket, deliveredKVs{kvs: kvs, columns: filteredColumns, offset: newOffset, rowID: rowID}) + kvPacket = append(kvPacket, deliveredKVs{kvs: kvs, columns: filteredColumns, offset: newOffset, + rowID: rowID, realOffset: realOffset}) kvSize += kvs.Size() failpoint.Inject("mock-kv-size", func(val failpoint.Value) { kvSize += uint64(val.(int)) @@ -2708,7 +2757,7 @@ func (cr *chunkRestore) encodeLoop( } } - err = send([]deliveredKVs{{offset: cr.chunk.Chunk.EndOffset}}) + err = send([]deliveredKVs{{offset: cr.chunk.Chunk.EndOffset, realOffset: cr.chunk.FileMeta.FileSize}}) return } @@ -2771,3 +2820,20 @@ func (cr *chunkRestore) restore( } return errors.Trace(firstErr(encodeErr, deliverErr)) } + +func openReader(ctx context.Context, fileMeta mydump.SourceFileMeta, store storage.ExternalStorage) ( + reader storage.ReadSeekCloser, err error) { + switch { + case fileMeta.Type == mydump.SourceTypeParquet: + reader, err = mydump.OpenParquetReader(ctx, store, fileMeta.Path, fileMeta.FileSize) + case fileMeta.Compression != mydump.CompressionNone: + compressType, err2 := mydump.ToStorageCompressType(fileMeta.Compression) + if err2 != nil { + return nil, err2 + } + reader, err = storage.WithCompression(store, compressType).Open(ctx, fileMeta.Path) + default: + reader, err = store.Open(ctx, fileMeta.Path) + } + return +} diff --git a/br/pkg/lightning/restore/table_restore.go b/br/pkg/lightning/restore/table_restore.go index 11038d62195ea..a3562cb436a5c 100644 --- a/br/pkg/lightning/restore/table_restore.go +++ b/br/pkg/lightning/restore/table_restore.go @@ -235,10 +235,12 @@ func (tr *TableRestore) restoreEngines(pCtx context.Context, rc *Controller, cp // data-engines that need to be restore or import. Otherwise, all data-engines should // be finished already. + handleDataEngineThisRun := false idxEngineCfg := &backend.EngineConfig{ TableInfo: tr.tableInfo, } if indexEngineCp.Status < checkpoints.CheckpointStatusClosed { + handleDataEngineThisRun = true indexWorker := rc.indexWorkers.Apply() defer rc.indexWorkers.Recycle(indexWorker) @@ -248,7 +250,7 @@ func (tr *TableRestore) restoreEngines(pCtx context.Context, rc *Controller, cp if !common.TableHasAutoRowID(tr.tableInfo.Core) { idxCnt-- } - threshold := estimateCompactionThreshold(cp, int64(idxCnt)) + threshold := estimateCompactionThreshold(tr.tableMeta.DataFiles, cp, int64(idxCnt)) idxEngineCfg.Local = &backend.LocalEngineConfig{ Compact: threshold > 0, CompactConcurrency: 4, @@ -327,9 +329,9 @@ func (tr *TableRestore) restoreEngines(pCtx context.Context, rc *Controller, cp dataWorker := rc.closedEngineLimit.Apply() defer rc.closedEngineLimit.Recycle(dataWorker) err = tr.importEngine(ctx, dataClosedEngine, rc, eid, ecp) - if rc.status != nil { + if rc.status != nil && rc.status.backend == config.BackendLocal { for _, chunk := range ecp.Chunks { - rc.status.FinishedFileSize.Add(chunk.Chunk.EndOffset - chunk.Key.Offset) + rc.status.FinishedFileSize.Add(chunk.TotalSize()) } } } @@ -339,7 +341,7 @@ func (tr *TableRestore) restoreEngines(pCtx context.Context, rc *Controller, cp }(restoreWorker, engineID, engine) } else { for _, chunk := range engine.Chunks { - rc.status.FinishedFileSize.Add(chunk.Chunk.EndOffset - chunk.Key.Offset) + rc.status.FinishedFileSize.Add(chunk.TotalSize()) } } } @@ -370,11 +372,31 @@ func (tr *TableRestore) restoreEngines(pCtx context.Context, rc *Controller, cp return errors.Trace(restoreErr) } + // if data engine is handled in previous run and we continue importing from checkpoint + if !handleDataEngineThisRun { + for _, engine := range cp.Engines { + for _, chunk := range engine.Chunks { + rc.status.FinishedFileSize.Add(chunk.Chunk.EndOffset - chunk.Key.Offset) + } + } + } + if cp.Status < checkpoints.CheckpointStatusIndexImported { var err error if indexEngineCp.Status < checkpoints.CheckpointStatusImported { + failpoint.Inject("FailBeforeStartImportingIndexEngine", func() { + errMsg := "fail before importing index KV data" + tr.logger.Warn(errMsg) + failpoint.Return(errors.New(errMsg)) + }) err = tr.importKV(ctx, closedIndexEngine, rc, indexEngineID) failpoint.Inject("FailBeforeIndexEngineImported", func() { + finished := rc.status.FinishedFileSize.Load() + total := rc.status.TotalFileSize.Load() + tr.logger.Warn("print lightning status", + zap.Int64("finished", finished), + zap.Int64("total", total), + zap.Bool("equal", finished == total)) panic("forcing failure due to FailBeforeIndexEngineImported") }) } @@ -406,6 +428,11 @@ func (tr *TableRestore) restoreEngine( if err != nil { return closedEngine, errors.Trace(err) } + if rc.status != nil && rc.status.backend == config.BackendTiDB { + for _, chunk := range cp.Chunks { + rc.status.FinishedFileSize.Add(chunk.Chunk.EndOffset - chunk.Key.Offset) + } + } return closedEngine, nil } @@ -474,7 +501,11 @@ func (tr *TableRestore) restoreEngine( metrics, _ := metric.FromContext(ctx) // Restore table data +ChunkLoop: for chunkIndex, chunk := range cp.Chunks { + if rc.status != nil && rc.status.backend == config.BackendTiDB { + rc.status.FinishedFileSize.Add(chunk.Chunk.Offset - chunk.Key.Offset) + } if chunk.Chunk.Offset >= chunk.Chunk.EndOffset { continue } @@ -494,9 +525,15 @@ func (tr *TableRestore) restoreEngine( } checkFlushLock.Unlock() + failpoint.Inject("orphanWriterGoRoutine", func() { + if chunkIndex > 0 { + <-pCtx.Done() + } + }) + select { case <-pCtx.Done(): - return nil, pCtx.Err() + break ChunkLoop default: } @@ -516,7 +553,7 @@ func (tr *TableRestore) restoreEngine( } var remainChunkCnt float64 if chunk.Chunk.Offset < chunk.Chunk.EndOffset { - remainChunkCnt = float64(chunk.Chunk.EndOffset-chunk.Chunk.Offset) / float64(chunk.Chunk.EndOffset-chunk.Key.Offset) + remainChunkCnt = float64(chunk.UnfinishedSize()) / float64(chunk.TotalSize()) if metrics != nil { metrics.ChunkCounter.WithLabelValues(metric.ChunkStatePending).Add(remainChunkCnt) } @@ -585,13 +622,18 @@ func (tr *TableRestore) restoreEngine( } wg.Wait() + select { + case <-pCtx.Done(): + return nil, pCtx.Err() + default: + } // Report some statistics into the log for debugging. totalKVSize := uint64(0) totalSQLSize := int64(0) for _, chunk := range cp.Chunks { totalKVSize += chunk.Checksum.SumSize() - totalSQLSize += chunk.Chunk.EndOffset - chunk.Chunk.Offset + totalSQLSize += chunk.UnfinishedSize() } err = chunkErr.Get() @@ -675,7 +717,7 @@ func (tr *TableRestore) importEngine( } // 2. perform a level-1 compact if idling. - if rc.cfg.PostRestore.Level1Compact && rc.compactState.CAS(compactStateIdle, compactStateDoing) { + if rc.cfg.PostRestore.Level1Compact && rc.compactState.CompareAndSwap(compactStateIdle, compactStateDoing) { go func() { // we ignore level-1 compact failure since it is not fatal. // no need log the error, it is done in (*Importer).Compact already. @@ -764,11 +806,19 @@ func (tr *TableRestore) postProcess( } hasDupe = hasLocalDupe } + failpoint.Inject("SlowDownCheckDupe", func(v failpoint.Value) { + sec := v.(int) + tr.logger.Warn("start to sleep several seconds before checking other dupe", + zap.Int("seconds", sec)) + time.Sleep(time.Duration(sec) * time.Second) + }) - needChecksum, needRemoteDupe, baseTotalChecksum, err := metaMgr.CheckAndUpdateLocalChecksum(ctx, &localChecksum, hasDupe) + otherHasDupe, needRemoteDupe, baseTotalChecksum, err := metaMgr.CheckAndUpdateLocalChecksum(ctx, &localChecksum, hasDupe) if err != nil { return false, err } + needChecksum := !otherHasDupe && needRemoteDupe + hasDupe = hasDupe || otherHasDupe if needRemoteDupe && rc.cfg.TikvImporter.DuplicateResolution != config.DupeResAlgNone { opts := &kv.SessionOptions{ @@ -782,12 +832,19 @@ func (tr *TableRestore) postProcess( } hasDupe = hasDupe || hasRemoteDupe - if err = rc.backend.ResolveDuplicateRows(ctx, tr.encTable, tr.tableName, rc.cfg.TikvImporter.DuplicateResolution); err != nil { - tr.logger.Error("resolve remote duplicate keys failed", log.ShortError(err)) - return false, err + if hasDupe { + if err = rc.backend.ResolveDuplicateRows(ctx, tr.encTable, tr.tableName, rc.cfg.TikvImporter.DuplicateResolution); err != nil { + tr.logger.Error("resolve remote duplicate keys failed", log.ShortError(err)) + return false, err + } } } + if rc.dupIndicator != nil { + tr.logger.Debug("set dupIndicator", zap.Bool("has-duplicate", hasDupe)) + rc.dupIndicator.CompareAndSwap(false, hasDupe) + } + nextStage := checkpoints.CheckpointStatusChecksummed if rc.cfg.PostRestore.Checksum != config.OpLevelOff && !hasDupe && needChecksum { if cp.Checksum.SumKVS() > 0 || baseTotalChecksum.SumKVS() > 0 { @@ -1015,15 +1072,23 @@ func (tr *TableRestore) analyzeTable(ctx context.Context, g glue.SQLExecutor) er // Try to limit the total SST files number under 500. But size compress 32GB SST files cost about 20min, // we set the upper bound to 32GB to avoid too long compression time. // factor is the non-clustered(1 for data engine and number of non-clustered index count for index engine). -func estimateCompactionThreshold(cp *checkpoints.TableCheckpoint, factor int64) int64 { +func estimateCompactionThreshold(files []mydump.FileInfo, cp *checkpoints.TableCheckpoint, factor int64) int64 { totalRawFileSize := int64(0) var lastFile string + fileSizeMap := make(map[string]int64, len(files)) + for _, file := range files { + fileSizeMap[file.FileMeta.Path] = file.FileMeta.RealSize + } + for _, engineCp := range cp.Engines { for _, chunk := range engineCp.Chunks { if chunk.FileMeta.Path == lastFile { continue } - size := chunk.FileMeta.FileSize + size, ok := fileSizeMap[chunk.FileMeta.Path] + if !ok { + size = chunk.FileMeta.FileSize + } if chunk.FileMeta.Type == mydump.SourceTypeParquet { // parquet file is compressed, thus estimates with a factor of 2 size *= 2 diff --git a/br/pkg/lightning/restore/table_restore_test.go b/br/pkg/lightning/restore/table_restore_test.go index 17fb97e346e36..0f6d87892e329 100644 --- a/br/pkg/lightning/restore/table_restore_test.go +++ b/br/pkg/lightning/restore/table_restore_test.go @@ -129,6 +129,7 @@ func (s *tableRestoreSuiteBase) setupSuite(t *testing.T) { Type: mydump.SourceTypeSQL, SortKey: strconv.Itoa(i), FileSize: 37, + RealSize: 37, }, }) } @@ -144,6 +145,7 @@ func (s *tableRestoreSuiteBase) setupSuite(t *testing.T) { Type: mydump.SourceTypeCSV, SortKey: "99", FileSize: 14, + RealSize: 14, }, }) @@ -304,6 +306,7 @@ func (s *tableRestoreSuite) TestPopulateChunks() { // set csv header to true, this will cause check columns fail s.cfg.Mydumper.CSV.Header = true + s.cfg.Mydumper.CSV.HeaderSchemaMatch = true s.cfg.Mydumper.StrictFormat = true regionSize := s.cfg.Mydumper.MaxRegionSize s.cfg.Mydumper.MaxRegionSize = 5 @@ -427,7 +430,7 @@ func (s *tableRestoreSuite) TestPopulateChunksCSVHeader() { require.NoError(s.T(), err) fakeDataFiles = append(fakeDataFiles, mydump.FileInfo{ TableName: filter.Table{Schema: "db", Name: "table"}, - FileMeta: mydump.SourceFileMeta{Path: csvName, Type: mydump.SourceTypeCSV, SortKey: fmt.Sprintf("%02d", i), FileSize: int64(len(str))}, + FileMeta: mydump.SourceFileMeta{Path: csvName, Type: mydump.SourceTypeCSV, SortKey: fmt.Sprintf("%02d", i), FileSize: int64(len(str)), RealSize: int64(len(str))}, }) total += len(str) } @@ -453,6 +456,7 @@ func (s *tableRestoreSuite) TestPopulateChunksCSVHeader() { cfg.Mydumper.MaxRegionSize = 40 cfg.Mydumper.CSV.Header = true + cfg.Mydumper.CSV.HeaderSchemaMatch = true cfg.Mydumper.StrictFormat = true rc := &Controller{cfg: cfg, ioWorkers: worker.NewPool(context.Background(), 1, "io"), store: store} @@ -1349,6 +1353,7 @@ func (s *tableRestoreSuite) TestCheckHasLargeCSV() { { FileMeta: mydump.SourceFileMeta{ FileSize: 1 * units.TiB, + RealSize: 1 * units.TiB, Path: "/testPath", }, }, @@ -2132,13 +2137,14 @@ func (s *tableRestoreSuite) TestSchemaIsValid() { Mydumper: config.MydumperRuntime{ ReadBlockSize: config.ReadBlockSize, CSV: config.CSVConfig{ - Separator: ",", - Delimiter: `"`, - Header: ca.hasHeader, - NotNull: false, - Null: `\N`, - BackslashEscape: true, - TrimLastSep: false, + Separator: ",", + Delimiter: `"`, + Header: ca.hasHeader, + HeaderSchemaMatch: true, + NotNull: false, + Null: `\N`, + BackslashEscape: true, + TrimLastSep: false, }, IgnoreColumns: ca.ignoreColumns, }, @@ -2167,13 +2173,14 @@ func (s *tableRestoreSuite) TestGBKEncodedSchemaIsValid() { DataCharacterSet: "gb18030", DataInvalidCharReplace: string(utf8.RuneError), CSV: config.CSVConfig{ - Separator: ",", - Delimiter: `"`, - Header: true, - NotNull: false, - Null: `\N`, - BackslashEscape: true, - TrimLastSep: false, + Separator: ",", + Delimiter: `"`, + Header: true, + HeaderSchemaMatch: true, + NotNull: false, + Null: `\N`, + BackslashEscape: true, + TrimLastSep: false, }, IgnoreColumns: nil, }, diff --git a/br/pkg/lightning/restore/tidb.go b/br/pkg/lightning/restore/tidb.go index 0e114bc035a56..98c780e65dc98 100644 --- a/br/pkg/lightning/restore/tidb.go +++ b/br/pkg/lightning/restore/tidb.go @@ -66,13 +66,15 @@ type TiDBManager struct { func DBFromConfig(ctx context.Context, dsn config.DBStore) (*sql.DB, error) { param := common.MySQLConnectParam{ - Host: dsn.Host, - Port: dsn.Port, - User: dsn.User, - Password: dsn.Psw, - SQLMode: dsn.StrSQLMode, - MaxAllowedPacket: dsn.MaxAllowedPacket, - TLS: dsn.TLS, + Host: dsn.Host, + Port: dsn.Port, + User: dsn.User, + Password: dsn.Psw, + SQLMode: dsn.StrSQLMode, + MaxAllowedPacket: dsn.MaxAllowedPacket, + TLSConfig: dsn.Security.TLSConfig, + AllowFallbackToPlaintext: dsn.Security.AllowFallbackToPlaintext, + Net: dsn.UUID, } db, err := param.Connect() @@ -93,8 +95,10 @@ func DBFromConfig(ctx context.Context, dsn config.DBStore) (*sql.DB, error) { "tidb_opt_write_row_id": "1", // always set auto-commit to ON "autocommit": "1", - // alway set transaction mode to optimistic + // always set transaction mode to optimistic "tidb_txn_mode": "optimistic", + // disable foreign key checks + "foreign_key_checks": "0", } if dsn.Vars != nil { @@ -141,47 +145,6 @@ func (timgr *TiDBManager) Close() { timgr.db.Close() } -func InitSchema(ctx context.Context, g glue.Glue, database string, tablesSchema map[string]string) error { - logger := log.FromContext(ctx).With(zap.String("db", database)) - sqlExecutor := g.GetSQLExecutor() - - var createDatabase strings.Builder - createDatabase.WriteString("CREATE DATABASE IF NOT EXISTS ") - common.WriteMySQLIdentifier(&createDatabase, database) - err := sqlExecutor.ExecuteWithLog(ctx, createDatabase.String(), "create database", logger) - if err != nil { - return errors.Trace(err) - } - - task := logger.Begin(zap.InfoLevel, "create tables") - var sqlCreateStmts []string -loopCreate: - for tbl, sqlCreateTable := range tablesSchema { - task.Debug("create table", zap.String("schema", sqlCreateTable)) - - sqlCreateStmts, err = createIfNotExistsStmt(g.GetParser(), sqlCreateTable, database, tbl) - if err != nil { - break - } - - // TODO: maybe we should put these createStems into a transaction - for _, s := range sqlCreateStmts { - err = sqlExecutor.ExecuteWithLog( - ctx, - s, - "create table", - logger.With(zap.String("table", common.UniqueTable(database, tbl))), - ) - if err != nil { - break loopCreate - } - } - } - task.End(zap.ErrorLevel, err) - - return errors.Trace(err) -} - func createIfNotExistsStmt(p *parser.Parser, createTable, dbName, tblName string) ([]string, error) { stmts, _, err := p.ParseSQL(createTable) if err != nil { @@ -189,7 +152,7 @@ func createIfNotExistsStmt(p *parser.Parser, createTable, dbName, tblName string } var res strings.Builder - ctx := format.NewRestoreCtx(format.DefaultRestoreFlags|format.RestoreTiDBSpecialComment, &res) + ctx := format.NewRestoreCtx(format.DefaultRestoreFlags|format.RestoreTiDBSpecialComment|format.RestoreWithTTLEnableOff, &res) retStmts := make([]string, 0, len(stmts)) for _, stmt := range stmts { @@ -197,6 +160,9 @@ func createIfNotExistsStmt(p *parser.Parser, createTable, dbName, tblName string case *ast.CreateDatabaseStmt: node.Name = model.NewCIStr(dbName) node.IfNotExists = true + case *ast.DropDatabaseStmt: + node.Name = model.NewCIStr(dbName) + node.IfExists = true case *ast.CreateTableStmt: node.Table.Schema = model.NewCIStr(dbName) node.Table.Name = model.NewCIStr(tblName) diff --git a/br/pkg/lightning/restore/tidb_test.go b/br/pkg/lightning/restore/tidb_test.go index 9b204b2da22b1..a3710d822d2dd 100644 --- a/br/pkg/lightning/restore/tidb_test.go +++ b/br/pkg/lightning/restore/tidb_test.go @@ -165,97 +165,6 @@ func TestCreateTableIfNotExistsStmt(t *testing.T) { `, "m")) } -func TestInitSchema(t *testing.T) { - s := newTiDBSuite(t) - ctx := context.Background() - - s.mockDB. - ExpectExec("CREATE DATABASE IF NOT EXISTS `db`"). - WillReturnResult(sqlmock.NewResult(1, 1)) - s.mockDB. - ExpectExec("\\QCREATE TABLE IF NOT EXISTS `db`.`t1` (`a` INT PRIMARY KEY,`b` VARCHAR(200));\\E"). - WillReturnResult(sqlmock.NewResult(2, 1)) - s.mockDB. - ExpectExec("\\QSET @@SESSION.`FOREIGN_KEY_CHECKS`=0;\\E"). - WillReturnResult(sqlmock.NewResult(0, 0)) - s.mockDB. - ExpectExec("\\QCREATE TABLE IF NOT EXISTS `db`.`t2` (`xx` TEXT) AUTO_INCREMENT = 11203;\\E"). - WillReturnResult(sqlmock.NewResult(2, 1)) - s.mockDB. - ExpectClose() - - s.mockDB.MatchExpectationsInOrder(false) // maps are unordered. - err := InitSchema(ctx, s.tiGlue, "db", map[string]string{ - "t1": "create table t1 (a int primary key, b varchar(200));", - "t2": "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;CREATE TABLE `db`.`t2` (xx TEXT) AUTO_INCREMENT=11203;", - }) - s.mockDB.MatchExpectationsInOrder(true) - require.NoError(t, err) -} - -func TestInitSchemaSyntaxError(t *testing.T) { - s := newTiDBSuite(t) - ctx := context.Background() - - s.mockDB. - ExpectExec("CREATE DATABASE IF NOT EXISTS `db`"). - WillReturnResult(sqlmock.NewResult(1, 1)) - s.mockDB. - ExpectClose() - - err := InitSchema(ctx, s.tiGlue, "db", map[string]string{ - "t1": "create table `t1` with invalid syntax;", - }) - require.Error(t, err) -} - -func TestInitSchemaErrorLost(t *testing.T) { - s := newTiDBSuite(t) - ctx := context.Background() - - s.mockDB. - ExpectExec("CREATE DATABASE IF NOT EXISTS `db`"). - WillReturnResult(sqlmock.NewResult(1, 1)) - - s.mockDB. - ExpectExec("CREATE TABLE IF NOT EXISTS.*"). - WillReturnError(&mysql.MySQLError{ - Number: tmysql.ErrTooBigFieldlength, - Message: "Column length too big", - }) - - s.mockDB. - ExpectClose() - - err := InitSchema(ctx, s.tiGlue, "db", map[string]string{ - "t1": "create table `t1` (a int);", - "t2": "create table t2 (a int primary key, b varchar(200));", - }) - require.Regexp(t, ".*Column length too big.*", err.Error()) -} - -func TestInitSchemaUnsupportedSchemaError(t *testing.T) { - s := newTiDBSuite(t) - ctx := context.Background() - - s.mockDB. - ExpectExec("CREATE DATABASE IF NOT EXISTS `db`"). - WillReturnResult(sqlmock.NewResult(1, 1)) - s.mockDB. - ExpectExec("CREATE TABLE IF NOT EXISTS `db`.`t1`.*"). - WillReturnError(&mysql.MySQLError{ - Number: tmysql.ErrTooBigFieldlength, - Message: "Column length too big", - }) - s.mockDB. - ExpectClose() - - err := InitSchema(ctx, s.tiGlue, "db", map[string]string{ - "t1": "create table `t1` (a VARCHAR(999999999));", - }) - require.Regexp(t, ".*Column length too big.*", err.Error()) -} - func TestDropTable(t *testing.T) { s := newTiDBSuite(t) ctx := context.Background() diff --git a/br/pkg/lightning/run_options.go b/br/pkg/lightning/run_options.go index a7b5b90770c02..169c2e47088dd 100644 --- a/br/pkg/lightning/run_options.go +++ b/br/pkg/lightning/run_options.go @@ -19,6 +19,7 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/util/promutil" + "go.uber.org/atomic" "go.uber.org/zap" ) @@ -30,6 +31,7 @@ type options struct { promFactory promutil.Factory promRegistry promutil.Registry logger log.Logger + dupIndicator *atomic.Bool } type Option func(*options) @@ -81,3 +83,10 @@ func WithLogger(logger *zap.Logger) Option { o.logger = log.Logger{Logger: logger} } } + +// WithDupIndicator sets a *bool to indicate duplicate detection has found duplicate data. +func WithDupIndicator(b *atomic.Bool) Option { + return func(o *options) { + o.dupIndicator = b + } +} diff --git a/br/pkg/lightning/tikv/BUILD.bazel b/br/pkg/lightning/tikv/BUILD.bazel index 596aa52075758..48758bfedaacf 100644 --- a/br/pkg/lightning/tikv/BUILD.bazel +++ b/br/pkg/lightning/tikv/BUILD.bazel @@ -7,6 +7,7 @@ go_library( visibility = ["//visibility:public"], deps = [ "//br/pkg/lightning/common", + "//br/pkg/lightning/config", "//br/pkg/lightning/log", "//br/pkg/pdutil", "//br/pkg/version", diff --git a/br/pkg/lightning/tikv/tikv.go b/br/pkg/lightning/tikv/tikv.go index 8d2d797d322d1..53c06cc6102f6 100644 --- a/br/pkg/lightning/tikv/tikv.go +++ b/br/pkg/lightning/tikv/tikv.go @@ -25,6 +25,7 @@ import ( "github.com/pingcap/kvproto/pkg/debugpb" "github.com/pingcap/kvproto/pkg/import_sstpb" "github.com/pingcap/tidb/br/pkg/lightning/common" + "github.com/pingcap/tidb/br/pkg/lightning/config" "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/pdutil" "github.com/pingcap/tidb/br/pkg/version" @@ -88,7 +89,7 @@ func withTiKVConnection(ctx context.Context, tls *common.TLS, tikvAddr string, a // Connect to the ImportSST service on the given TiKV node. // The connection is needed for executing `action` and will be tear down // when this function exits. - conn, err := grpc.DialContext(ctx, tikvAddr, tls.ToGRPCDialOption()) + conn, err := grpc.DialContext(ctx, tikvAddr, tls.ToGRPCDialOption(), config.DefaultGrpcKeepaliveParams) if err != nil { return errors.Trace(err) } @@ -172,7 +173,8 @@ var fetchModeRegexp = regexp.MustCompile(`\btikv_config_rocksdb\{cf="default",na // FetchMode obtains the import mode status of the TiKV node. func FetchMode(ctx context.Context, tls *common.TLS, tikvAddr string) (import_sstpb.SwitchMode, error) { - conn, err := grpc.DialContext(ctx, tikvAddr, tls.ToGRPCDialOption()) + conn, err := grpc.DialContext(ctx, tikvAddr, tls.ToGRPCDialOption(), + config.DefaultGrpcKeepaliveParams) if err != nil { return 0, err } diff --git a/br/pkg/lightning/verification/BUILD.bazel b/br/pkg/lightning/verification/BUILD.bazel index 9f308aeb81e11..122e4b0e8535f 100644 --- a/br/pkg/lightning/verification/BUILD.bazel +++ b/br/pkg/lightning/verification/BUILD.bazel @@ -7,6 +7,7 @@ go_library( visibility = ["//visibility:public"], deps = [ "//br/pkg/lightning/common", + "@com_github_tikv_client_go_v2//tikv", "@org_uber_go_zap//zapcore", ], ) diff --git a/br/pkg/lightning/verification/checksum.go b/br/pkg/lightning/verification/checksum.go index 0a44177f80fe4..9eb2130074eec 100644 --- a/br/pkg/lightning/verification/checksum.go +++ b/br/pkg/lightning/verification/checksum.go @@ -19,15 +19,18 @@ import ( "hash/crc64" "github.com/pingcap/tidb/br/pkg/lightning/common" + "github.com/tikv/client-go/v2/tikv" "go.uber.org/zap/zapcore" ) var ecmaTable = crc64.MakeTable(crc64.ECMA) type KVChecksum struct { - bytes uint64 - kvs uint64 - checksum uint64 + base uint64 + prefixLen int + bytes uint64 + kvs uint64 + checksum uint64 } func NewKVChecksum(checksum uint64) *KVChecksum { @@ -36,6 +39,14 @@ func NewKVChecksum(checksum uint64) *KVChecksum { } } +func NewKVChecksumWithKeyspace(k tikv.Codec) *KVChecksum { + ks := k.GetKeyspace() + return &KVChecksum{ + base: crc64.Update(0, ecmaTable, ks), + prefixLen: len(ks), + } +} + func MakeKVChecksum(bytes uint64, kvs uint64, checksum uint64) KVChecksum { return KVChecksum{ bytes: bytes, @@ -45,10 +56,10 @@ func MakeKVChecksum(bytes uint64, kvs uint64, checksum uint64) KVChecksum { } func (c *KVChecksum) UpdateOne(kv common.KvPair) { - sum := crc64.Update(0, ecmaTable, kv.Key) + sum := crc64.Update(c.base, ecmaTable, kv.Key) sum = crc64.Update(sum, ecmaTable, kv.Val) - c.bytes += uint64(len(kv.Key) + len(kv.Val)) + c.bytes += uint64(c.prefixLen + len(kv.Key) + len(kv.Val)) c.kvs++ c.checksum ^= sum } @@ -62,11 +73,12 @@ func (c *KVChecksum) Update(kvs []common.KvPair) { ) for _, pair := range kvs { - sum = crc64.Update(0, ecmaTable, pair.Key) + sum = crc64.Update(c.base, ecmaTable, pair.Key) sum = crc64.Update(sum, ecmaTable, pair.Val) checksum ^= sum kvNum++ - bytes += (len(pair.Key) + len(pair.Val)) + bytes += c.prefixLen + bytes += len(pair.Key) + len(pair.Val) } c.bytes += uint64(bytes) diff --git a/br/pkg/lightning/web/BUILD.bazel b/br/pkg/lightning/web/BUILD.bazel index 842eb48fb3dd3..93cb28cdaf0ce 100644 --- a/br/pkg/lightning/web/BUILD.bazel +++ b/br/pkg/lightning/web/BUILD.bazel @@ -4,7 +4,7 @@ go_library( name = "web", srcs = [ "progress.go", - "res.go", + "res.go", #keep "res_vfsdata.go", ], importpath = "github.com/pingcap/tidb/br/pkg/lightning/web", diff --git a/br/pkg/lightning/web/progress.go b/br/pkg/lightning/web/progress.go index 8a3412087b94f..d5f3494a14040 100644 --- a/br/pkg/lightning/web/progress.go +++ b/br/pkg/lightning/web/progress.go @@ -64,7 +64,7 @@ func (cpm *checkpointsMap) update(diffs map[string]*checkpoints.TableCheckpointD for _, engine := range cp.Engines { for _, chunk := range engine.Chunks { if engine.Status >= checkpoints.CheckpointStatusAllWritten { - tw += chunk.Chunk.EndOffset - chunk.Key.Offset + tw += chunk.TotalSize() } else { tw += chunk.Chunk.Offset - chunk.Key.Offset } diff --git a/br/pkg/logutil/logging.go b/br/pkg/logutil/logging.go index 028cfc00e5f43..41b8e135c220f 100644 --- a/br/pkg/logutil/logging.go +++ b/br/pkg/logutil/logging.go @@ -306,3 +306,13 @@ func (rng StringifyRange) String() string { sb.WriteString(")") return sb.String() } + +// StringifyMany returns an array marshaler for a slice of stringers. +func StringifyMany[T fmt.Stringer](items []T) zapcore.ArrayMarshaler { + return zapcore.ArrayMarshalerFunc(func(ae zapcore.ArrayEncoder) error { + for _, item := range items { + ae.AppendString(item.String()) + } + return nil + }) +} diff --git a/br/pkg/logutil/rate.go b/br/pkg/logutil/rate.go index 12ef85732efd7..e3e67ed241bff 100644 --- a/br/pkg/logutil/rate.go +++ b/br/pkg/logutil/rate.go @@ -51,5 +51,5 @@ func (r *RateTracer) RateAt(instant time.Time) float64 { // L make a logger with the current speed. func (r *RateTracer) L() *zap.Logger { - return log.With(zap.String("speed", fmt.Sprintf("%.2f ops/s", r.Rate()))) + return log.L().With(zap.String("speed", fmt.Sprintf("%.2f ops/s", r.Rate()))) } diff --git a/br/pkg/metautil/metafile.go b/br/pkg/metautil/metafile.go index 77b3c4de8b6f6..76ac9a248ccf1 100644 --- a/br/pkg/metautil/metafile.go +++ b/br/pkg/metautil/metafile.go @@ -170,12 +170,12 @@ type MetaReader struct { // NewMetaReader creates MetaReader. func NewMetaReader( - backpMeta *backuppb.BackupMeta, + backupMeta *backuppb.BackupMeta, storage storage.ExternalStorage, cipher *backuppb.CipherInfo) *MetaReader { return &MetaReader{ storage: storage, - backupMeta: backpMeta, + backupMeta: backupMeta, cipher: cipher, } } diff --git a/br/pkg/restore/BUILD.bazel b/br/pkg/restore/BUILD.bazel index 2c42717bafe36..35bed1951e9b3 100644 --- a/br/pkg/restore/BUILD.bazel +++ b/br/pkg/restore/BUILD.bazel @@ -43,6 +43,7 @@ go_library( "//br/pkg/summary", "//br/pkg/utils", "//br/pkg/utils/iter", + "//br/pkg/version", "//config", "//ddl", "//ddl/util", @@ -57,8 +58,10 @@ go_library( "//tablecodec", "//util", "//util/codec", + "//util/collate", "//util/hack", "//util/mathutil", + "//util/sqlexec", "//util/table-filter", "@com_github_emirpasic_gods//maps/treemap", "@com_github_go_sql_driver_mysql//:mysql", @@ -85,6 +88,7 @@ go_library( "@org_golang_google_grpc//backoff", "@org_golang_google_grpc//codes", "@org_golang_google_grpc//credentials", + "@org_golang_google_grpc//credentials/insecure", "@org_golang_google_grpc//keepalive", "@org_golang_google_grpc//status", "@org_golang_x_exp//slices", @@ -113,12 +117,13 @@ go_test( "search_test.go", "split_test.go", "stream_metas_test.go", + "systable_restore_test.go", "util_test.go", ], embed = [":restore"], flaky = True, race = "on", - shard_count = 20, + shard_count = 50, deps = [ "//br/pkg/backup", "//br/pkg/conn", diff --git a/br/pkg/restore/batcher_test.go b/br/pkg/restore/batcher_test.go index 2c182cb0351cc..808b1868eed16 100644 --- a/br/pkg/restore/batcher_test.go +++ b/br/pkg/restore/batcher_test.go @@ -49,7 +49,7 @@ func (sender *drySender) Close() { } func waitForSend() { - time.Sleep(10 * time.Millisecond) + time.Sleep(50 * time.Millisecond) } func (sender *drySender) Ranges() []rtree.Range { diff --git a/br/pkg/restore/client.go b/br/pkg/restore/client.go index 81215e675c8c0..a783fed862d29 100644 --- a/br/pkg/restore/client.go +++ b/br/pkg/restore/client.go @@ -20,6 +20,7 @@ import ( "github.com/pingcap/failpoint" backuppb "github.com/pingcap/kvproto/pkg/brpb" "github.com/pingcap/kvproto/pkg/import_sstpb" + "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/log" "github.com/pingcap/tidb/br/pkg/backup" @@ -39,6 +40,7 @@ import ( "github.com/pingcap/tidb/br/pkg/stream" "github.com/pingcap/tidb/br/pkg/summary" "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/br/pkg/version" "github.com/pingcap/tidb/config" ddlutil "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/domain" @@ -50,7 +52,9 @@ import ( "github.com/pingcap/tidb/store/pdtypes" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/mathutil" + "github.com/pingcap/tidb/util/sqlexec" filter "github.com/pingcap/tidb/util/table-filter" "github.com/tikv/client-go/v2/oracle" pd "github.com/tikv/pd/client" @@ -61,6 +65,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/backoff" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/keepalive" ) @@ -165,6 +170,9 @@ type Client struct { // the successfully preallocated table IDs. preallocedTableIDs *tidalloc.PreallocIDs + + // the rewrite mode of the downloaded SST files in TiKV. + rewriteMode RewriteMode } // NewRestoreClient returns a new RestoreClient. @@ -313,6 +321,14 @@ func (rc *Client) GetBatchDdlSize() uint { return rc.batchDdlSize } +func (rc *Client) SetRewriteMode(mode RewriteMode) { + rc.rewriteMode = mode +} + +func (rc *Client) GetRewriteMode() RewriteMode { + return rc.rewriteMode +} + // Close a client. func (rc *Client) Close() { // rc.db can be nil in raw kv mode. @@ -342,7 +358,7 @@ func (rc *Client) SetStorage(ctx context.Context, backend *backuppb.StorageBacke func (rc *Client) InitClients(backend *backuppb.StorageBackend, isRawKvMode bool) { metaClient := split.NewSplitClient(rc.pdClient, rc.tlsConf, isRawKvMode) importCli := NewImportClient(metaClient, rc.tlsConf, rc.keepaliveConf) - rc.fileImporter = NewFileImporter(metaClient, importCli, backend, isRawKvMode) + rc.fileImporter = NewFileImporter(metaClient, importCli, backend, isRawKvMode, rc.rewriteMode) } func (rc *Client) SetRawKVClient(c *RawKVBatchClient) { @@ -446,7 +462,7 @@ func (rc *Client) GetFilesInRawRange(startKey []byte, endKey []byte, cf string) // SetConcurrency sets the concurrency of dbs tables files. func (rc *Client) SetConcurrency(c uint) { - log.Debug("new worker pool", zap.Uint("currency-count", c)) + log.Info("new worker pool", zap.Uint("currency-count", c)) rc.workerPool = utils.NewWorkerPool(c, "file") } @@ -866,7 +882,7 @@ func (rc *Client) createTablesInWorkerPool(ctx context.Context, dom *domain.Doma } }) if err != nil { - log.Error("create tables fail") + log.Error("create tables fail", zap.Error(err)) return err } for _, ct := range cts { @@ -938,7 +954,9 @@ func (rc *Client) CheckSysTableCompatibility(dom *domain.Domain, tables []*metau return errors.Annotate(berrors.ErrRestoreIncompatibleSys, "missed system table: "+table.Info.Name.O) } backupTi := table.Info - if len(ti.Columns) != len(backupTi.Columns) { + // skip checking the number of columns in mysql.user table, + // because higher versions of TiDB may add new columns. + if len(ti.Columns) != len(backupTi.Columns) && backupTi.Name.L != sysUserTableName { log.Error("column count mismatch", zap.Stringer("table", table.Info.Name), zap.Int("col in cluster", len(ti.Columns)), @@ -957,6 +975,13 @@ func (rc *Client) CheckSysTableCompatibility(dom *domain.Domain, tables []*metau col := ti.Columns[i] backupCol := backupColMap[col.Name.L] if backupCol == nil { + // skip when the backed up mysql.user table is missing columns. + if backupTi.Name.L == sysUserTableName { + log.Warn("missing column in backup data", + zap.Stringer("table", table.Info.Name), + zap.String("col", fmt.Sprintf("%s %s", col.Name, col.FieldType.String()))) + continue + } log.Error("missing column in backup data", zap.Stringer("table", table.Info.Name), zap.String("col", fmt.Sprintf("%s %s", col.Name, col.FieldType.String()))) @@ -977,6 +1002,29 @@ func (rc *Client) CheckSysTableCompatibility(dom *domain.Domain, tables []*metau backupCol.Name, backupCol.FieldType.String()) } } + + if backupTi.Name.L == sysUserTableName { + // check whether the columns of table in cluster are less than the backup data + clusterColMap := make(map[string]*model.ColumnInfo) + for i := range ti.Columns { + col := ti.Columns[i] + clusterColMap[col.Name.L] = col + } + // order can be different + for i := range backupTi.Columns { + col := backupTi.Columns[i] + clusterCol := clusterColMap[col.Name.L] + if clusterCol == nil { + log.Error("missing column in cluster data", + zap.Stringer("table", table.Info.Name), + zap.String("col", fmt.Sprintf("%s %s", col.Name, col.FieldType.String()))) + return errors.Annotatef(berrors.ErrRestoreIncompatibleSys, + "missing column in cluster data, table: %s, col: %s %s", + table.Info.Name.O, + col.Name, col.FieldType.String()) + } + } + } } return nil } @@ -1006,7 +1054,7 @@ func MockCallSetSpeedLimit(ctx context.Context, fakeImportClient ImporterClient, rc.SetRateLimit(42) rc.SetConcurrency(concurrency) rc.hasSpeedLimited = false - rc.fileImporter = NewFileImporter(nil, fakeImportClient, nil, false) + rc.fileImporter = NewFileImporter(nil, fakeImportClient, nil, false, RewriteModeLegacy) return rc.setSpeedLimit(ctx, rc.rateLimit) } @@ -1092,6 +1140,18 @@ func (rc *Client) SplitRanges(ctx context.Context, return SplitRanges(ctx, rc, ranges, rewriteRules, updateCh, isRawKv) } +func (rc *Client) WrapLogFilesIterWithSplitHelper(iter LogIter, rules map[int64]*RewriteRules, g glue.Glue, store kv.Storage) (LogIter, error) { + se, err := g.CreateSession(store) + if err != nil { + return nil, errors.Trace(err) + } + execCtx := se.GetSessionCtx().(sqlexec.RestrictedSQLExecutor) + splitSize, splitKeys := utils.GetRegionSplitInfo(execCtx) + log.Info("get split threshold from tikv config", zap.Uint64("split-size", splitSize), zap.Int64("split-keys", splitKeys)) + client := split.NewSplitClient(rc.GetPDClient(), rc.GetTLSConfig(), false) + return NewLogFilesIterWithSplitHelper(iter, rules, client, splitSize, splitKeys), nil +} + // RestoreSSTFiles tries to restore the files. func (rc *Client) RestoreSSTFiles( ctx context.Context, @@ -1134,7 +1194,7 @@ func (rc *Client) RestoreSSTFiles( zap.Duration("take", time.Since(fileStart))) updateCh.Inc() }() - return rc.fileImporter.ImportSSTFiles(ectx, filesReplica, rewriteRules, rc.cipher, rc.backupMeta.ApiVersion) + return rc.fileImporter.ImportSSTFiles(ectx, filesReplica, rewriteRules, rc.cipher, rc.dom.Store().GetCodec().GetAPIVersion()) }) } @@ -1251,7 +1311,7 @@ func (rc *Client) switchTiKVMode(ctx context.Context, mode import_sstpb.SwitchMo finalStore := store rc.workerPool.ApplyOnErrorGroup(eg, func() error { - opt := grpc.WithInsecure() + opt := grpc.WithTransportCredentials(insecure.NewCredentials()) if rc.tlsConf != nil { opt = grpc.WithTransportCredentials(credentials.NewTLS(rc.tlsConf)) } @@ -1363,7 +1423,7 @@ func (rc *Client) execChecksum( concurrency uint, loadStatCh chan<- *CreatedTable, ) error { - logger := log.With( + logger := log.L().With( zap.String("db", tbl.OldTable.DB.Name.O), zap.String("table", tbl.OldTable.Info.Name.O), ) @@ -1386,6 +1446,8 @@ func (rc *Client) execChecksum( exe, err := checksum.NewExecutorBuilder(tbl.Table, startTS). SetOldTable(tbl.OldTable). SetConcurrency(concurrency). + SetOldKeyspace(tbl.RewriteRule.OldKeyspace). + SetNewKeyspace(tbl.RewriteRule.NewKeyspace). Build() if err != nil { return errors.Trace(err) @@ -1427,7 +1489,7 @@ func (rc *Client) updateMetaAndLoadStats(ctx context.Context, input <-chan *Crea } // Not need to return err when failed because of update analysis-meta - restoreTS, err := rc.GetTS(ctx) + restoreTS, err := rc.GetTSWithRetry(ctx) if err != nil { log.Error("getTS failed", zap.Error(err)) } else { @@ -1675,6 +1737,15 @@ func (rc *Client) PreCheckTableTiFlashReplica( tables []*metautil.Table, recorder *tiflashrec.TiFlashRecorder, ) error { + // For TiDB 6.6, we do not support recover TiFlash replica while enabling API V2. + // TODO(iosmanthus): remove this after TiFlash support API V2. + if rc.GetDomain().Store().GetCodec().GetAPIVersion() == kvrpcpb.APIVersion_V2 { + log.Warn("TiFlash does not support API V2, reset replica count to 0") + for _, table := range tables { + table.Info.TiFlashReplica = nil + } + return nil + } tiFlashStoreCount, err := rc.getTiFlashNodeCount(ctx) if err != nil { return err @@ -1807,19 +1878,179 @@ func (rc *Client) FixIndicesOfTable(ctx context.Context, schema string, table *m return nil } +type FilesInRegion struct { + defaultSize uint64 + defaultKVCount int64 + writeSize uint64 + writeKVCount int64 + + defaultFiles []*backuppb.DataFileInfo + writeFiles []*backuppb.DataFileInfo + deleteFiles []*backuppb.DataFileInfo +} + +type FilesInTable struct { + regionMapFiles map[int64]*FilesInRegion +} + +func ApplyKVFilesWithBatchMethod( + ctx context.Context, + iter LogIter, + batchCount int, + batchSize uint64, + applyFunc func(files []*backuppb.DataFileInfo, kvCount int64, size uint64), +) error { + var ( + tableMapFiles = make(map[int64]*FilesInTable) + tmpFiles = make([]*backuppb.DataFileInfo, 0, batchCount) + tmpSize uint64 = 0 + tmpKVCount int64 = 0 + ) + for r := iter.TryNext(ctx); !r.Finished; r = iter.TryNext(ctx) { + if r.Err != nil { + return r.Err + } + + f := r.Item + if f.GetType() == backuppb.FileType_Put && f.GetLength() >= batchSize { + applyFunc([]*backuppb.DataFileInfo{f}, f.GetNumberOfEntries(), f.GetLength()) + continue + } + + fit, exist := tableMapFiles[f.TableId] + if !exist { + fit = &FilesInTable{ + regionMapFiles: make(map[int64]*FilesInRegion), + } + tableMapFiles[f.TableId] = fit + } + fs, exist := fit.regionMapFiles[f.RegionId] + if !exist { + fs = &FilesInRegion{} + fit.regionMapFiles[f.RegionId] = fs + } + + if f.GetType() == backuppb.FileType_Delete { + if fs.defaultFiles == nil { + fs.deleteFiles = make([]*backuppb.DataFileInfo, 0) + } + fs.deleteFiles = append(fs.deleteFiles, f) + } else { + if f.GetCf() == stream.DefaultCF { + if fs.defaultFiles == nil { + fs.defaultFiles = make([]*backuppb.DataFileInfo, 0, batchCount) + } + fs.defaultFiles = append(fs.defaultFiles, f) + fs.defaultSize += f.Length + fs.defaultKVCount += f.GetNumberOfEntries() + if len(fs.defaultFiles) >= batchCount || fs.defaultSize >= batchSize { + applyFunc(fs.defaultFiles, fs.defaultKVCount, fs.defaultSize) + fs.defaultFiles = nil + fs.defaultSize = 0 + fs.defaultKVCount = 0 + } + } else { + if fs.writeFiles == nil { + fs.writeFiles = make([]*backuppb.DataFileInfo, 0, batchCount) + } + fs.writeFiles = append(fs.writeFiles, f) + fs.writeSize += f.GetLength() + fs.writeKVCount += f.GetNumberOfEntries() + if len(fs.writeFiles) >= batchCount || fs.writeSize >= batchSize { + applyFunc(fs.writeFiles, fs.writeKVCount, fs.writeSize) + fs.writeFiles = nil + fs.writeSize = 0 + fs.writeKVCount = 0 + } + } + } + } + + for _, fwt := range tableMapFiles { + for _, fs := range fwt.regionMapFiles { + if len(fs.defaultFiles) > 0 { + applyFunc(fs.defaultFiles, fs.defaultKVCount, fs.defaultSize) + } + if len(fs.writeFiles) > 0 { + applyFunc(fs.writeFiles, fs.writeKVCount, fs.writeSize) + } + } + } + + for _, fwt := range tableMapFiles { + for _, fs := range fwt.regionMapFiles { + for _, d := range fs.deleteFiles { + tmpFiles = append(tmpFiles, d) + tmpSize += d.GetLength() + tmpKVCount += d.GetNumberOfEntries() + + if len(tmpFiles) >= batchCount || tmpSize >= batchSize { + applyFunc(tmpFiles, tmpKVCount, tmpSize) + tmpFiles = make([]*backuppb.DataFileInfo, 0, batchCount) + tmpSize = 0 + tmpKVCount = 0 + } + } + if len(tmpFiles) > 0 { + applyFunc(tmpFiles, tmpKVCount, tmpSize) + tmpFiles = make([]*backuppb.DataFileInfo, 0, batchCount) + tmpSize = 0 + tmpKVCount = 0 + } + } + } + + return nil +} + +func ApplyKVFilesWithSingelMethod( + ctx context.Context, + files LogIter, + applyFunc func(file []*backuppb.DataFileInfo, kvCount int64, size uint64), +) error { + deleteKVFiles := make([]*backuppb.DataFileInfo, 0) + + for r := files.TryNext(ctx); !r.Finished; r = files.TryNext(ctx) { + if r.Err != nil { + return r.Err + } + + f := r.Item + if f.GetType() == backuppb.FileType_Delete { + deleteKVFiles = append(deleteKVFiles, f) + continue + } + applyFunc([]*backuppb.DataFileInfo{f}, f.GetNumberOfEntries(), f.GetLength()) + } + + log.Info("restore delete files", zap.Int("count", len(deleteKVFiles))) + for _, file := range deleteKVFiles { + f := file + applyFunc([]*backuppb.DataFileInfo{f}, f.GetNumberOfEntries(), f.GetLength()) + } + + return nil +} + func (rc *Client) RestoreKVFiles( ctx context.Context, rules map[int64]*RewriteRules, - files LogIter, + iter LogIter, + pitrBatchCount uint32, + pitrBatchSize uint32, updateStats func(kvCount uint64, size uint64), - onProgress func(), + onProgress func(cnt int64), ) error { - var err error - fileCount := 0 - start := time.Now() + var ( + err error + fileCount = 0 + start = time.Now() + supportBatch = version.CheckPITRSupportBatchKVFiles() + skipFile = 0 + ) defer func() { - elapsed := time.Since(start) if err == nil { + elapsed := time.Since(start) log.Info("Restore KV files", zap.Duration("take", elapsed)) summary.CollectSuccessUnit("files", fileCount, elapsed) } @@ -1832,74 +2063,65 @@ func (rc *Client) RestoreKVFiles( } eg, ectx := errgroup.WithContext(ctx) - skipFile := 0 - deleteFiles := make([]*backuppb.DataFileInfo, 0) - - applyFunc := func(file *backuppb.DataFileInfo) { - // get rewrite rule from table id - rule, ok := rules[file.TableId] + applyFunc := func(files []*backuppb.DataFileInfo, kvCount int64, size uint64) { + if len(files) == 0 { + return + } + // get rewrite rule from table id. + // because the tableID of files is the same. + rule, ok := rules[files[0].TableId] if !ok { // TODO handle new created table // For this version we do not handle new created table after full backup. // in next version we will perform rewrite and restore meta key to restore new created tables. // so we can simply skip the file that doesn't have the rule here. - onProgress() - summary.CollectInt("FileSkip", 1) - log.Debug("skip file due to table id not matched", zap.String("file", file.Path), zap.Int64("tableId", file.TableId)) - skipFile++ + onProgress(int64(len(files))) + summary.CollectInt("FileSkip", len(files)) + log.Debug("skip file due to table id not matched", zap.Int64("table-id", files[0].TableId)) + skipFile += len(files) } else { - rc.workerPool.ApplyOnErrorGroup(eg, func() error { + rc.workerPool.ApplyOnErrorGroup(eg, func() (err error) { fileStart := time.Now() defer func() { - onProgress() - updateStats(uint64(file.NumberOfEntries), file.Length) - summary.CollectInt("File", 1) - log.Info("import files done", zap.String("name", file.Path), zap.Duration("take", time.Since(fileStart))) + onProgress(int64(len(files))) + updateStats(uint64(kvCount), size) + summary.CollectInt("File", len(files)) + + if err == nil { + filenames := make([]string, 0, len(files)) + for _, f := range files { + filenames = append(filenames, f.Path+", ") + } + log.Info("import files done", zap.Int("batch-count", len(files)), zap.Uint64("batch-size", size), + zap.Duration("take", time.Since(fileStart)), zap.Strings("files", filenames)) + } }() - startTS := rc.startTS - if file.Cf == stream.DefaultCF { - startTS = rc.shiftStartTS - } - return rc.fileImporter.ImportKVFiles(ectx, file, rule, startTS, rc.restoreTS) + + return rc.fileImporter.ImportKVFiles(ectx, files, rule, rc.shiftStartTS, rc.startTS, rc.restoreTS, supportBatch) }) } } - for r := files.TryNext(ctx); !r.Finished; r = files.TryNext(ctx) { - if r.Err != nil { - return err - } - file := r.Item - if file.Type == backuppb.FileType_Delete { - // collect delete type file and apply it later. - deleteFiles = append(deleteFiles, file) - continue + + rc.workerPool.ApplyOnErrorGroup(eg, func() error { + if supportBatch { + err = ApplyKVFilesWithBatchMethod(ectx, iter, int(pitrBatchCount), uint64(pitrBatchSize), applyFunc) + } else { + err = ApplyKVFilesWithSingelMethod(ectx, iter, applyFunc) } - fileReplica := file - // applyFunc blocks once there aren't enough workers. - // this would help us don't load too many DML file info. - applyFunc(fileReplica) - } - if len(deleteFiles) > 0 { - log.Info("restore delete files", zap.Int("count", len(deleteFiles))) - } - for _, file := range deleteFiles { - fileReplica := file - applyFunc(fileReplica) + return errors.Trace(err) + }) + + if err = eg.Wait(); err != nil { + summary.CollectFailureUnit("file", err) + log.Error("restore files failed", zap.Error(err)) } + log.Info("total skip files due to table id not matched", zap.Int("count", skipFile)) if skipFile > 0 { log.Debug("table id in full backup storage", zap.Any("tables", rules)) } - if err = eg.Wait(); err != nil { - summary.CollectFailureUnit("file", err) - log.Error( - "restore files failed", - zap.Error(err), - ) - return errors.Trace(err) - } - return nil + return errors.Trace(err) } func (rc *Client) CleanUpKVFiles( @@ -2399,7 +2621,7 @@ func (rc *Client) RunGCRowsLoader(ctx context.Context) { func (rc *Client) InsertGCRows(ctx context.Context) error { close(rc.deleteRangeQueryCh) rc.deleteRangeQueryWaitGroup.Wait() - ts, err := rc.GetTS(ctx) + ts, err := rc.GetTSWithRetry(ctx) if err != nil { return errors.Trace(err) } @@ -2433,7 +2655,7 @@ func (rc *Client) SaveSchemas( schemas := TidyOldSchemas(sr) schemasConcurrency := uint(mathutil.Min(64, schemas.Len())) - err := schemas.BackupSchemas(ctx, metaWriter, nil, nil, rc.restoreTS, schemasConcurrency, 0, true, nil) + err := schemas.BackupSchemas(ctx, metaWriter, nil, nil, nil, rc.restoreTS, schemasConcurrency, 0, true, nil) if err != nil { return errors.Trace(err) } @@ -2464,6 +2686,74 @@ func (rc *Client) SetWithSysTable(withSysTable bool) { rc.withSysTable = withSysTable } +func (rc *Client) ResetTiFlashReplicas(ctx context.Context, g glue.Glue, storage kv.Storage) error { + dom, err := g.GetDomain(storage) + if err != nil { + return errors.Trace(err) + } + info := dom.InfoSchema() + allSchema := info.AllSchemas() + recorder := tiflashrec.New() + + expectTiFlashStoreCount := uint64(0) + needTiFlash := false + for _, s := range allSchema { + for _, t := range s.Tables { + if t.TiFlashReplica != nil { + expectTiFlashStoreCount = mathutil.Max(expectTiFlashStoreCount, t.TiFlashReplica.Count) + recorder.AddTable(t.ID, *t.TiFlashReplica) + needTiFlash = true + } + } + } + if !needTiFlash { + log.Info("no need to set tiflash replica, since there is no tables enable tiflash replica") + return nil + } + // we wait for ten minutes to wait tiflash starts. + // since tiflash only starts when set unmark recovery mode finished. + timeoutCtx, cancel := context.WithTimeout(ctx, 10*time.Minute) + defer cancel() + err = utils.WithRetry(timeoutCtx, func() error { + tiFlashStoreCount, err := rc.getTiFlashNodeCount(ctx) + log.Info("get tiflash store count for resetting TiFlash Replica", + zap.Uint64("count", tiFlashStoreCount)) + if err != nil { + return errors.Trace(err) + } + if tiFlashStoreCount < expectTiFlashStoreCount { + log.Info("still waiting for enough tiflash store start", + zap.Uint64("expect", expectTiFlashStoreCount), + zap.Uint64("actual", tiFlashStoreCount), + ) + return errors.New("tiflash store count is less than expected") + } + return nil + }, &waitTiFlashBackoffer{ + Attempts: 30, + BaseBackoff: 4 * time.Second, + }) + if err != nil { + return err + } + + sqls := recorder.GenerateResetAlterTableDDLs(info) + log.Info("Generating SQLs for resetting tiflash replica", + zap.Strings("sqls", sqls)) + + return g.UseOneShotSession(storage, false, func(se glue.Session) error { + for _, sql := range sqls { + if errExec := se.ExecuteInternal(ctx, sql); errExec != nil { + logutil.WarnTerm("Failed to restore tiflash replica config, you may execute the sql restore it manually.", + logutil.ShortError(errExec), + zap.String("sql", sql), + ) + } + } + return nil + }) +} + // MockClient create a fake client used to test. func MockClient(dbs map[string]*utils.Database) *Client { return &Client{databases: dbs} @@ -2495,3 +2785,75 @@ func TidyOldSchemas(sr *stream.SchemasReplace) *backup.Schemas { } return schemas } + +func CheckKeyspaceBREnable(ctx context.Context, pdClient pd.Client) error { + return version.CheckClusterVersion(ctx, pdClient, version.CheckVersionForKeyspaceBR) +} + +func CheckNewCollationEnable( + backupNewCollationEnable string, + g glue.Glue, + storage kv.Storage, + CheckRequirements bool, +) error { + if backupNewCollationEnable == "" { + if CheckRequirements { + return errors.Annotatef(berrors.ErrUnknown, + "the config 'new_collations_enabled_on_first_bootstrap' not found in backupmeta. "+ + "you can use \"show config WHERE name='new_collations_enabled_on_first_bootstrap';\" to manually check the config. "+ + "if you ensure the config 'new_collations_enabled_on_first_bootstrap' in backup cluster is as same as restore cluster, "+ + "use --check-requirements=false to skip this check") + } + log.Warn("the config 'new_collations_enabled_on_first_bootstrap' is not in backupmeta") + return nil + } + + se, err := g.CreateSession(storage) + if err != nil { + return errors.Trace(err) + } + + newCollationEnable, err := se.GetGlobalVariable(utils.GetTidbNewCollationEnabled()) + if err != nil { + return errors.Trace(err) + } + + if !strings.EqualFold(backupNewCollationEnable, newCollationEnable) { + return errors.Annotatef(berrors.ErrUnknown, + "the config 'new_collations_enabled_on_first_bootstrap' not match, upstream:%v, downstream: %v", + backupNewCollationEnable, newCollationEnable) + } + + // collate.newCollationEnabled is set to 1 when the collate package is initialized, + // so we need to modify this value according to the config of the cluster + // before using the collate package. + enabled := newCollationEnable == "True" + // modify collate.newCollationEnabled according to the config of the cluster + collate.SetNewCollationEnabledForTest(enabled) + log.Info("set new_collation_enabled", zap.Bool("new_collation_enabled", enabled)) + return nil +} + +type waitTiFlashBackoffer struct { + Attempts int + BaseBackoff time.Duration +} + +// NextBackoff returns a duration to wait before retrying again +func (b *waitTiFlashBackoffer) NextBackoff(error) time.Duration { + bo := b.BaseBackoff + b.Attempts-- + if b.Attempts == 0 { + return 0 + } + b.BaseBackoff *= 2 + if b.BaseBackoff > 32*time.Second { + b.BaseBackoff = 32 * time.Second + } + return bo +} + +// Attempt returns the remain attempt times +func (b *waitTiFlashBackoffer) Attempt() int { + return b.Attempts +} diff --git a/br/pkg/restore/client_test.go b/br/pkg/restore/client_test.go index c43c3c80c2452..ae943a96f276b 100644 --- a/br/pkg/restore/client_test.go +++ b/br/pkg/restore/client_test.go @@ -25,6 +25,7 @@ import ( "github.com/pingcap/tidb/br/pkg/restore/tiflashrec" "github.com/pingcap/tidb/br/pkg/stream" "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/br/pkg/utils/iter" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/types" @@ -194,32 +195,33 @@ func TestCheckSysTableCompatibility(t *testing.T) { userTI, err := client.GetTableSchema(cluster.Domain, sysDB, model.NewCIStr("user")) require.NoError(t, err) - // column count mismatch + // user table in cluster have more columns(success) mockedUserTI := userTI.Clone() - mockedUserTI.Columns = mockedUserTI.Columns[:len(mockedUserTI.Columns)-1] + userTI.Columns = append(userTI.Columns, &model.ColumnInfo{Name: model.NewCIStr("new-name")}) err = client.CheckSysTableCompatibility(cluster.Domain, []*metautil.Table{{ DB: tmpSysDB, Info: mockedUserTI, }}) - require.True(t, berrors.ErrRestoreIncompatibleSys.Equal(err)) + require.NoError(t, err) + userTI.Columns = userTI.Columns[:len(userTI.Columns)-1] - // column order mismatch(success) + // user table in cluster have less columns(failed) mockedUserTI = userTI.Clone() - mockedUserTI.Columns[4], mockedUserTI.Columns[5] = mockedUserTI.Columns[5], mockedUserTI.Columns[4] + mockedUserTI.Columns = append(mockedUserTI.Columns, &model.ColumnInfo{Name: model.NewCIStr("new-name")}) err = client.CheckSysTableCompatibility(cluster.Domain, []*metautil.Table{{ DB: tmpSysDB, Info: mockedUserTI, }}) - require.NoError(t, err) + require.True(t, berrors.ErrRestoreIncompatibleSys.Equal(err)) - // missing column + // column order mismatch(success) mockedUserTI = userTI.Clone() - mockedUserTI.Columns[0].Name = model.NewCIStr("new-name") + mockedUserTI.Columns[4], mockedUserTI.Columns[5] = mockedUserTI.Columns[5], mockedUserTI.Columns[4] err = client.CheckSysTableCompatibility(cluster.Domain, []*metautil.Table{{ DB: tmpSysDB, Info: mockedUserTI, }}) - require.True(t, berrors.ErrRestoreIncompatibleSys.Equal(err)) + require.NoError(t, err) // incompatible column type mockedUserTI = userTI.Clone() @@ -237,6 +239,19 @@ func TestCheckSysTableCompatibility(t *testing.T) { Info: mockedUserTI, }}) require.NoError(t, err) + + // use the mysql.db table to test for column count mismatch. + dbTI, err := client.GetTableSchema(cluster.Domain, sysDB, model.NewCIStr("db")) + require.NoError(t, err) + + // other system tables in cluster have more columns(failed) + mockedDBTI := dbTI.Clone() + dbTI.Columns = append(dbTI.Columns, &model.ColumnInfo{Name: model.NewCIStr("new-name")}) + err = client.CheckSysTableCompatibility(cluster.Domain, []*metautil.Table{{ + DB: tmpSysDB, + Info: mockedDBTI, + }}) + require.True(t, berrors.ErrRestoreIncompatibleSys.Equal(err)) } func TestInitFullClusterRestore(t *testing.T) { @@ -332,18 +347,17 @@ type fakePDClient struct { pd.Client stores []*metapb.Store - notLeader bool + notLeader bool + retryTimes *int } -var retryTimes int - func (fpdc fakePDClient) GetAllStores(context.Context, ...pd.GetStoreOption) ([]*metapb.Store, error) { return append([]*metapb.Store{}, fpdc.stores...), nil } func (fpdc fakePDClient) GetTS(ctx context.Context) (int64, int64, error) { - retryTimes++ - if retryTimes >= 3 { // the mock PD leader switched successfully + (*fpdc.retryTimes)++ + if *fpdc.retryTimes >= 3 { // the mock PD leader switched successfully fpdc.notLeader = false } @@ -355,24 +369,24 @@ func (fpdc fakePDClient) GetTS(ctx context.Context) (int64, int64, error) { func TestGetTSWithRetry(t *testing.T) { t.Run("PD leader is healthy:", func(t *testing.T) { - retryTimes = -1000 - pDClient := fakePDClient{notLeader: false} + retryTimes := -1000 + pDClient := fakePDClient{notLeader: false, retryTimes: &retryTimes} client := restore.NewRestoreClient(pDClient, nil, defaultKeepaliveCfg, false) _, err := client.GetTSWithRetry(context.Background()) require.NoError(t, err) }) t.Run("PD leader failure:", func(t *testing.T) { - retryTimes = -1000 - pDClient := fakePDClient{notLeader: true} + retryTimes := -1000 + pDClient := fakePDClient{notLeader: true, retryTimes: &retryTimes} client := restore.NewRestoreClient(pDClient, nil, defaultKeepaliveCfg, false) _, err := client.GetTSWithRetry(context.Background()) require.Error(t, err) }) t.Run("PD leader switch successfully", func(t *testing.T) { - retryTimes = 0 - pDClient := fakePDClient{notLeader: true} + retryTimes := 0 + pDClient := fakePDClient{notLeader: true, retryTimes: &retryTimes} client := restore.NewRestoreClient(pDClient, nil, defaultKeepaliveCfg, false) _, err := client.GetTSWithRetry(context.Background()) require.NoError(t, err) @@ -1096,3 +1110,458 @@ func TestSortMetaKVFiles(t *testing.T) { require.Equal(t, files[3].Path, "f4") require.Equal(t, files[4].Path, "f5") } + +func TestApplyKVFilesWithSingelMethod(t *testing.T) { + var ( + totalKVCount int64 = 0 + totalSize uint64 = 0 + logs = make([]string, 0) + ) + ds := []*backuppb.DataFileInfo{ + { + Path: "log3", + NumberOfEntries: 5, + Length: 100, + Cf: stream.WriteCF, + Type: backuppb.FileType_Delete, + }, + { + Path: "log1", + NumberOfEntries: 5, + Length: 100, + Cf: stream.DefaultCF, + Type: backuppb.FileType_Put, + }, { + Path: "log2", + NumberOfEntries: 5, + Length: 100, + Cf: stream.WriteCF, + Type: backuppb.FileType_Put, + }, + } + applyFunc := func( + files []*backuppb.DataFileInfo, + kvCount int64, + size uint64, + ) { + totalKVCount += kvCount + totalSize += size + for _, f := range files { + logs = append(logs, f.GetPath()) + } + } + + restore.ApplyKVFilesWithSingelMethod( + context.TODO(), + iter.FromSlice(ds), + applyFunc, + ) + + require.Equal(t, totalKVCount, int64(15)) + require.Equal(t, totalSize, uint64(300)) + require.Equal(t, logs, []string{"log1", "log2", "log3"}) +} + +func TestApplyKVFilesWithBatchMethod1(t *testing.T) { + var ( + runCount = 0 + batchCount int = 3 + batchSize uint64 = 1000 + totalKVCount int64 = 0 + logs = make([][]string, 0) + ) + ds := []*backuppb.DataFileInfo{ + { + Path: "log5", + NumberOfEntries: 5, + Length: 100, + Cf: stream.WriteCF, + Type: backuppb.FileType_Delete, + RegionId: 1, + }, { + Path: "log3", + NumberOfEntries: 5, + Length: 100, + Cf: stream.WriteCF, + Type: backuppb.FileType_Put, + RegionId: 1, + }, { + Path: "log4", + NumberOfEntries: 5, + Length: 100, + Cf: stream.WriteCF, + Type: backuppb.FileType_Put, + RegionId: 1, + }, { + Path: "log1", + NumberOfEntries: 5, + Length: 800, + Cf: stream.DefaultCF, + Type: backuppb.FileType_Put, + RegionId: 1, + }, + { + Path: "log2", + NumberOfEntries: 5, + Length: 200, + Cf: stream.DefaultCF, + Type: backuppb.FileType_Put, + RegionId: 1, + }, + } + applyFunc := func( + files []*backuppb.DataFileInfo, + kvCount int64, + size uint64, + ) { + runCount += 1 + totalKVCount += kvCount + log := make([]string, 0, len(files)) + for _, f := range files { + log = append(log, f.GetPath()) + } + logs = append(logs, log) + } + + restore.ApplyKVFilesWithBatchMethod( + context.TODO(), + iter.FromSlice(ds), + batchCount, + batchSize, + applyFunc, + ) + + require.Equal(t, runCount, 3) + require.Equal(t, totalKVCount, int64(25)) + require.Equal(t, + logs, + [][]string{ + {"log1", "log2"}, + {"log3", "log4"}, + {"log5"}, + }, + ) +} + +func TestApplyKVFilesWithBatchMethod2(t *testing.T) { + var ( + runCount = 0 + batchCount int = 2 + batchSize uint64 = 1500 + totalKVCount int64 = 0 + logs = make([][]string, 0) + ) + ds := []*backuppb.DataFileInfo{ + { + Path: "log1", + NumberOfEntries: 5, + Length: 100, + Cf: stream.WriteCF, + Type: backuppb.FileType_Delete, + RegionId: 1, + }, { + Path: "log2", + NumberOfEntries: 5, + Length: 100, + Cf: stream.WriteCF, + Type: backuppb.FileType_Put, + RegionId: 1, + }, { + Path: "log3", + NumberOfEntries: 5, + Length: 100, + Cf: stream.WriteCF, + Type: backuppb.FileType_Put, + RegionId: 1, + }, { + Path: "log4", + NumberOfEntries: 5, + Length: 100, + Cf: stream.WriteCF, + Type: backuppb.FileType_Put, + RegionId: 1, + }, { + Path: "log5", + NumberOfEntries: 5, + Length: 800, + Cf: stream.DefaultCF, + Type: backuppb.FileType_Put, + RegionId: 1, + }, + { + Path: "log6", + NumberOfEntries: 5, + Length: 200, + Cf: stream.DefaultCF, + Type: backuppb.FileType_Put, + RegionId: 1, + }, + } + applyFunc := func( + files []*backuppb.DataFileInfo, + kvCount int64, + size uint64, + ) { + runCount += 1 + totalKVCount += kvCount + log := make([]string, 0, len(files)) + for _, f := range files { + log = append(log, f.GetPath()) + } + logs = append(logs, log) + } + + restore.ApplyKVFilesWithBatchMethod( + context.TODO(), + iter.FromSlice(ds), + batchCount, + batchSize, + applyFunc, + ) + + require.Equal(t, runCount, 4) + require.Equal(t, totalKVCount, int64(30)) + require.Equal(t, + logs, + [][]string{ + {"log2", "log3"}, + {"log5", "log6"}, + {"log4"}, + {"log1"}, + }, + ) +} + +func TestApplyKVFilesWithBatchMethod3(t *testing.T) { + var ( + runCount = 0 + batchCount int = 2 + batchSize uint64 = 1500 + totalKVCount int64 = 0 + logs = make([][]string, 0) + ) + ds := []*backuppb.DataFileInfo{ + { + Path: "log1", + NumberOfEntries: 5, + Length: 2000, + Cf: stream.WriteCF, + Type: backuppb.FileType_Delete, + RegionId: 1, + }, { + Path: "log2", + NumberOfEntries: 5, + Length: 2000, + Cf: stream.WriteCF, + Type: backuppb.FileType_Put, + RegionId: 1, + }, { + Path: "log3", + NumberOfEntries: 5, + Length: 100, + Cf: stream.WriteCF, + Type: backuppb.FileType_Put, + RegionId: 1, + }, { + Path: "log5", + NumberOfEntries: 5, + Length: 800, + Cf: stream.DefaultCF, + Type: backuppb.FileType_Put, + RegionId: 3, + }, + { + Path: "log6", + NumberOfEntries: 5, + Length: 200, + Cf: stream.DefaultCF, + Type: backuppb.FileType_Put, + RegionId: 3, + }, + } + applyFunc := func( + files []*backuppb.DataFileInfo, + kvCount int64, + size uint64, + ) { + runCount += 1 + totalKVCount += kvCount + log := make([]string, 0, len(files)) + for _, f := range files { + log = append(log, f.GetPath()) + } + logs = append(logs, log) + } + + restore.ApplyKVFilesWithBatchMethod( + context.TODO(), + iter.FromSlice(ds), + batchCount, + batchSize, + applyFunc, + ) + + require.Equal(t, totalKVCount, int64(25)) + require.Equal(t, + logs, + [][]string{ + {"log2"}, + {"log5", "log6"}, + {"log3"}, + {"log1"}, + }, + ) +} + +func TestApplyKVFilesWithBatchMethod4(t *testing.T) { + var ( + runCount = 0 + batchCount int = 2 + batchSize uint64 = 1500 + totalKVCount int64 = 0 + logs = make([][]string, 0) + ) + ds := []*backuppb.DataFileInfo{ + { + Path: "log1", + NumberOfEntries: 5, + Length: 2000, + Cf: stream.WriteCF, + Type: backuppb.FileType_Delete, + TableId: 1, + }, { + Path: "log2", + NumberOfEntries: 5, + Length: 100, + Cf: stream.WriteCF, + Type: backuppb.FileType_Put, + TableId: 1, + }, { + Path: "log3", + NumberOfEntries: 5, + Length: 100, + Cf: stream.WriteCF, + Type: backuppb.FileType_Put, + TableId: 2, + }, { + Path: "log4", + NumberOfEntries: 5, + Length: 100, + Cf: stream.WriteCF, + Type: backuppb.FileType_Put, + TableId: 1, + }, { + Path: "log5", + NumberOfEntries: 5, + Length: 100, + Cf: stream.DefaultCF, + Type: backuppb.FileType_Put, + TableId: 2, + }, + } + applyFunc := func( + files []*backuppb.DataFileInfo, + kvCount int64, + size uint64, + ) { + runCount += 1 + totalKVCount += kvCount + log := make([]string, 0, len(files)) + for _, f := range files { + log = append(log, f.GetPath()) + } + logs = append(logs, log) + } + + restore.ApplyKVFilesWithBatchMethod( + context.TODO(), + iter.FromSlice(ds), + batchCount, + batchSize, + applyFunc, + ) + + require.Equal(t, runCount, 4) + require.Equal(t, totalKVCount, int64(25)) + require.Equal(t, + logs, + [][]string{ + {"log2", "log4"}, + {"log5"}, + {"log3"}, + {"log1"}, + }, + ) +} + +func TestCheckNewCollationEnable(t *testing.T) { + caseList := []struct { + backupMeta *backuppb.BackupMeta + newCollationEnableInCluster string + CheckRequirements bool + isErr bool + }{ + { + backupMeta: &backuppb.BackupMeta{NewCollationsEnabled: "True"}, + newCollationEnableInCluster: "True", + CheckRequirements: true, + isErr: false, + }, + { + backupMeta: &backuppb.BackupMeta{NewCollationsEnabled: "True"}, + newCollationEnableInCluster: "False", + CheckRequirements: true, + isErr: true, + }, + { + backupMeta: &backuppb.BackupMeta{NewCollationsEnabled: "False"}, + newCollationEnableInCluster: "True", + CheckRequirements: true, + isErr: true, + }, + { + backupMeta: &backuppb.BackupMeta{NewCollationsEnabled: "False"}, + newCollationEnableInCluster: "false", + CheckRequirements: true, + isErr: false, + }, + { + backupMeta: &backuppb.BackupMeta{NewCollationsEnabled: "False"}, + newCollationEnableInCluster: "True", + CheckRequirements: false, + isErr: true, + }, + { + backupMeta: &backuppb.BackupMeta{NewCollationsEnabled: "True"}, + newCollationEnableInCluster: "False", + CheckRequirements: false, + isErr: true, + }, + { + backupMeta: &backuppb.BackupMeta{NewCollationsEnabled: ""}, + newCollationEnableInCluster: "True", + CheckRequirements: false, + isErr: false, + }, + { + backupMeta: &backuppb.BackupMeta{NewCollationsEnabled: ""}, + newCollationEnableInCluster: "True", + CheckRequirements: true, + isErr: true, + }, + } + + for i, ca := range caseList { + g := &gluetidb.MockGlue{ + GlobalVars: map[string]string{"new_collation_enabled": ca.newCollationEnableInCluster}, + } + err := restore.CheckNewCollationEnable(ca.backupMeta.GetNewCollationsEnabled(), g, nil, ca.CheckRequirements) + + t.Logf("[%d] Got Error: %v\n", i, err) + if ca.isErr { + require.Error(t, err) + } else { + require.NoError(t, err) + } + } +} diff --git a/br/pkg/restore/data.go b/br/pkg/restore/data.go index f7efce83362f5..265126b9411af 100644 --- a/br/pkg/restore/data.go +++ b/br/pkg/restore/data.go @@ -4,7 +4,6 @@ package restore import ( "context" "io" - "sync/atomic" "github.com/pingcap/errors" "github.com/pingcap/kvproto/pkg/metapb" @@ -57,7 +56,7 @@ func RecoverData(ctx context.Context, resolveTS uint64, allStores []*metapb.Stor return totalRegions, errors.Trace(err) } - if err := recovery.PrepareFlashbackToVersion(ctx); err != nil { + if err := recovery.PrepareFlashbackToVersion(ctx, resolveTS, restoreTS-1); err != nil { return totalRegions, errors.Trace(err) } @@ -80,14 +79,13 @@ func NewStoreMeta(storeId uint64) StoreMeta { // for test type Recovery struct { - allStores []*metapb.Store - StoreMetas []StoreMeta - RecoveryPlan map[uint64][]*recovpb.RecoverRegionRequest - MaxAllocID uint64 - mgr *conn.Mgr - progress glue.Progress - concurrency uint32 - totalFlashbackRegions uint64 + allStores []*metapb.Store + StoreMetas []StoreMeta + RecoveryPlan map[uint64][]*recovpb.RecoverRegionRequest + MaxAllocID uint64 + mgr *conn.Mgr + progress glue.Progress + concurrency uint32 } func NewRecovery(allStores []*metapb.Store, mgr *conn.Mgr, progress glue.Progress, concurrency uint32) Recovery { @@ -95,14 +93,13 @@ func NewRecovery(allStores []*metapb.Store, mgr *conn.Mgr, progress glue.Progres var StoreMetas = make([]StoreMeta, totalStores) var regionRecovers = make(map[uint64][]*recovpb.RecoverRegionRequest, totalStores) return Recovery{ - allStores: allStores, - StoreMetas: StoreMetas, - RecoveryPlan: regionRecovers, - MaxAllocID: 0, - mgr: mgr, - progress: progress, - concurrency: concurrency, - totalFlashbackRegions: 0} + allStores: allStores, + StoreMetas: StoreMetas, + RecoveryPlan: regionRecovers, + MaxAllocID: 0, + mgr: mgr, + progress: progress, + concurrency: concurrency} } func (recovery *Recovery) newRecoveryClient(ctx context.Context, storeAddr string) (recovpb.RecoverDataClient, *grpc.ClientConn, error) { @@ -304,40 +301,36 @@ func (recovery *Recovery) WaitApply(ctx context.Context) (err error) { } // prepare the region for flashback the data, the purpose is to stop region service, put region in flashback state -func (recovery *Recovery) PrepareFlashbackToVersion(ctx context.Context) (err error) { - var totalRegions atomic.Uint64 - totalRegions.Store(0) - - handler := func(ctx context.Context, r tikvstore.KeyRange) (rangetask.TaskStat, error) { - stats, err := ddl.SendPrepareFlashbackToVersionRPC(ctx, recovery.mgr.GetStorage().(tikv.Storage), r) - totalRegions.Add(uint64(stats.CompletedRegions)) - return stats, err - } - - runner := rangetask.NewRangeTaskRunner("br-flashback-prepare-runner", recovery.mgr.GetStorage().(tikv.Storage), int(recovery.concurrency), handler) - // Run prepare flashback on the entire TiKV cluster. Empty keys means the range is unbounded. - err = runner.RunOnRange(ctx, []byte(""), []byte("")) - if err != nil { - log.Error("region flashback prepare get error") - return errors.Trace(err) - } +func (recovery *Recovery) PrepareFlashbackToVersion(ctx context.Context, resolveTS uint64, startTS uint64) (err error) { + retryErr := utils.WithRetry( + ctx, + func() error { + handler := func(ctx context.Context, r tikvstore.KeyRange) (rangetask.TaskStat, error) { + stats, err := ddl.SendPrepareFlashbackToVersionRPC(ctx, recovery.mgr.GetStorage().(tikv.Storage), resolveTS, startTS, r) + return stats, err + } - recovery.totalFlashbackRegions = totalRegions.Load() - log.Info("region flashback prepare complete", zap.Int("regions", runner.CompletedRegions())) + runner := rangetask.NewRangeTaskRunner("br-flashback-prepare-runner", recovery.mgr.GetStorage().(tikv.Storage), int(recovery.concurrency), handler) + // Run prepare flashback on the entire TiKV cluster. Empty keys means the range is unbounded. + err = runner.RunOnRange(ctx, []byte(""), []byte("")) + if err != nil { + log.Warn("region flashback prepare get error") + return errors.Trace(err) + } + log.Info("region flashback prepare complete", zap.Int("regions", runner.CompletedRegions())) + return nil + }, + utils.NewFlashBackBackoffer(), + ) - return nil + recovery.progress.Inc() + return retryErr } // flashback the region data to version resolveTS func (recovery *Recovery) FlashbackToVersion(ctx context.Context, resolveTS uint64, commitTS uint64) (err error) { - var completedRegions atomic.Uint64 - - // only know the total progress of tikv, progress is total state of the whole restore flow. - ratio := int(recovery.totalFlashbackRegions) / len(recovery.allStores) - handler := func(ctx context.Context, r tikvstore.KeyRange) (rangetask.TaskStat, error) { stats, err := ddl.SendFlashbackToVersionRPC(ctx, recovery.mgr.GetStorage().(tikv.Storage), resolveTS, commitTS-1, commitTS, r) - completedRegions.Add(uint64(stats.CompletedRegions)) return stats, err } @@ -352,13 +345,12 @@ func (recovery *Recovery) FlashbackToVersion(ctx context.Context, resolveTS uint return errors.Trace(err) } - recovery.progress.IncBy(int64(completedRegions.Load()) / int64(ratio)) - log.Info("region flashback complete", zap.Uint64("resolveTS", resolveTS), zap.Uint64("commitTS", commitTS), zap.Int("regions", runner.CompletedRegions())) + recovery.progress.Inc() return nil } @@ -372,6 +364,7 @@ type RecoverRegion struct { // 2. build a leader list for all region during the tikv startup // 3. get max allocate id func (recovery *Recovery) MakeRecoveryPlan() error { + storeBalanceScore := make(map[uint64]int, len(recovery.allStores)) // Group region peer info by region id. find the max allocateId // region [id] [peer[0-n]] var regions = make(map[uint64][]*RecoverRegion, 0) @@ -410,16 +403,20 @@ func (recovery *Recovery) MakeRecoveryPlan() error { } } else { // Generate normal commands. - log.Debug("detected valid peer", zap.Uint64("region id", regionId)) - for i, peer := range peers { - log.Debug("make plan", zap.Uint64("store id", peer.StoreId), zap.Uint64("region id", peer.RegionId)) - plan := &recovpb.RecoverRegionRequest{RegionId: peer.RegionId, AsLeader: i == 0} - // sorted by log term -> last index -> commit index in a region - if plan.AsLeader { - log.Debug("as leader peer", zap.Uint64("store id", peer.StoreId), zap.Uint64("region id", peer.RegionId)) - recovery.RecoveryPlan[peer.StoreId] = append(recovery.RecoveryPlan[peer.StoreId], plan) - } + log.Debug("detected valid region", zap.Uint64("region id", regionId)) + // calc the leader candidates + leaderCandidates, err := LeaderCandidates(peers) + if err != nil { + log.Warn("region without peer", zap.Uint64("region id", regionId)) + return errors.Trace(err) } + + // select the leader base on tikv storeBalanceScore + leader := SelectRegionLeader(storeBalanceScore, leaderCandidates) + log.Debug("as leader peer", zap.Uint64("store id", leader.StoreId), zap.Uint64("region id", leader.RegionId)) + plan := &recovpb.RecoverRegionRequest{RegionId: leader.RegionId, AsLeader: true} + recovery.RecoveryPlan[leader.StoreId] = append(recovery.RecoveryPlan[leader.StoreId], plan) + storeBalanceScore[leader.StoreId] += 1 } } return nil diff --git a/br/pkg/restore/db.go b/br/pkg/restore/db.go index ae62162c3e890..1f3f5d949e26e 100644 --- a/br/pkg/restore/db.go +++ b/br/pkg/restore/db.go @@ -284,7 +284,7 @@ func (db *DB) tableIDAllocFilter() ddl.AllocTableIDIf { if db.preallocedIDs == nil { return true } - prealloced := db.preallocedIDs.Prealloced(ti.ID) + prealloced := db.preallocedIDs.PreallocedFor(ti) if prealloced { log.Info("reusing table ID", zap.Stringer("table", ti.Name)) } @@ -308,6 +308,10 @@ func (db *DB) CreateTables(ctx context.Context, tables []*metautil.Table, return errors.Trace(err) } } + + if ttlInfo := table.Info.TTLInfo; ttlInfo != nil { + ttlInfo.Enable = false + } } if err := batchSession.CreateTables(ctx, m, db.tableIDAllocFilter()); err != nil { return err @@ -336,6 +340,10 @@ func (db *DB) CreateTable(ctx context.Context, table *metautil.Table, } } + if ttlInfo := table.Info.TTLInfo; ttlInfo != nil { + ttlInfo.Enable = false + } + err := db.se.CreateTable(ctx, table.DB.Name, table.Info, db.tableIDAllocFilter()) if err != nil { log.Error("create table failed", diff --git a/br/pkg/restore/db_test.go b/br/pkg/restore/db_test.go index 8801a6af34727..3a5416501e4df 100644 --- a/br/pkg/restore/db_test.go +++ b/br/pkg/restore/db_test.go @@ -381,7 +381,7 @@ func TestGetExistedUserDBs(t *testing.T) { {Name: model.NewCIStr("mysql")}, {Name: model.NewCIStr("test")}, }, - nil, 1) + nil, nil, 1) require.Nil(t, err) dom.MockInfoCacheAndLoadInfoSchema(builder.Build()) dbs = restore.GetExistedUserDBs(dom) @@ -393,7 +393,7 @@ func TestGetExistedUserDBs(t *testing.T) { {Name: model.NewCIStr("test")}, {Name: model.NewCIStr("d1")}, }, - nil, 1) + nil, nil, 1) require.Nil(t, err) dom.MockInfoCacheAndLoadInfoSchema(builder.Build()) dbs = restore.GetExistedUserDBs(dom) @@ -409,7 +409,7 @@ func TestGetExistedUserDBs(t *testing.T) { State: model.StatePublic, }, }, - nil, 1) + nil, nil, 1) require.Nil(t, err) dom.MockInfoCacheAndLoadInfoSchema(builder.Build()) dbs = restore.GetExistedUserDBs(dom) diff --git a/br/pkg/restore/import.go b/br/pkg/restore/import.go index 0245add57554b..47c25672719c5 100644 --- a/br/pkg/restore/import.go +++ b/br/pkg/restore/import.go @@ -6,6 +6,8 @@ import ( "bytes" "context" "crypto/tls" + "fmt" + "math/rand" "strings" "sync" "sync/atomic" @@ -24,8 +26,10 @@ import ( berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/logutil" "github.com/pingcap/tidb/br/pkg/restore/split" + "github.com/pingcap/tidb/br/pkg/stream" "github.com/pingcap/tidb/br/pkg/summary" "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/kv" pd "github.com/tikv/pd/client" "go.uber.org/multierr" "go.uber.org/zap" @@ -34,6 +38,7 @@ import ( "google.golang.org/grpc/backoff" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/keepalive" "google.golang.org/grpc/status" ) @@ -43,6 +48,17 @@ const ( gRPCBackOffMaxDelay = 3 * time.Second ) +// RewriteMode is a mode flag that tells the TiKV how to handle the rewrite rules. +type RewriteMode int + +const ( + // RewriteModeLegacy means no rewrite rule is applied. + RewriteModeLegacy RewriteMode = iota + + // RewriteModeKeyspace means the rewrite rule could be applied to keyspace. + RewriteModeKeyspace +) + // ImporterClient is used to import a file to TiKV. type ImporterClient interface { ClearFiles( @@ -193,7 +209,7 @@ func (ic *importClient) GetImportClient( if err != nil { return nil, errors.Trace(err) } - opt := grpc.WithInsecure() + opt := grpc.WithTransportCredentials(insecure.NewCredentials()) if ic.tlsConf != nil { opt = grpc.WithTransportCredentials(credentials.NewTLS(ic.tlsConf)) } @@ -245,6 +261,9 @@ type FileImporter struct { rawStartKey []byte rawEndKey []byte supportMultiIngest bool + rewriteMode RewriteMode + + cacheKey string } // NewFileImporter returns a new file importClient. @@ -253,12 +272,15 @@ func NewFileImporter( importClient ImporterClient, backend *backuppb.StorageBackend, isRawKvMode bool, + rewriteMode RewriteMode, ) FileImporter { return FileImporter{ metaClient: metaClient, backend: backend, importClient: importClient, isRawKvMode: isRawKvMode, + rewriteMode: rewriteMode, + cacheKey: fmt.Sprintf("BR-%s-%d", time.Now().Format("20060102150405"), rand.Int63()), } } @@ -332,14 +354,16 @@ func (importer *FileImporter) getKeyRangeForFiles( // Import tries to import a file. func (importer *FileImporter) ImportKVFileForRegion( ctx context.Context, - file *backuppb.DataFileInfo, + files []*backuppb.DataFileInfo, rule *RewriteRules, + shiftStartTS uint64, startTS uint64, restoreTS uint64, info *split.RegionInfo, + supportBatch bool, ) RPCResult { // Try to download file. - result := importer.downloadAndApplyKVFile(ctx, file, rule, info, startTS, restoreTS) + result := importer.downloadAndApplyKVFile(ctx, files, rule, info, shiftStartTS, startTS, restoreTS, supportBatch) if !result.OK() { errDownload := result.Err for _, e := range multierr.Errors(errDownload) { @@ -380,39 +404,85 @@ func (importer *FileImporter) ClearFiles(ctx context.Context, pdClient pd.Client return nil } +func FilterFilesByRegion( + files []*backuppb.DataFileInfo, + ranges []kv.KeyRange, + r *split.RegionInfo, +) ([]*backuppb.DataFileInfo, error) { + if len(files) != len(ranges) { + return nil, errors.Annotatef(berrors.ErrInvalidArgument, + "count of files no equals count of ranges, file-count:%v, ranges-count:%v", + len(files), len(ranges)) + } + + output := make([]*backuppb.DataFileInfo, 0, len(files)) + if r != nil && r.Region != nil { + for i, f := range files { + if bytes.Compare(r.Region.StartKey, ranges[i].EndKey) <= 0 && + (len(r.Region.EndKey) == 0 || bytes.Compare(r.Region.EndKey, ranges[i].StartKey) >= 0) { + output = append(output, f) + } + } + } else { + output = files + } + + return output, nil +} + // ImportKVFiles restores the kv events. func (importer *FileImporter) ImportKVFiles( ctx context.Context, - file *backuppb.DataFileInfo, + files []*backuppb.DataFileInfo, rule *RewriteRules, + shiftStartTS uint64, startTS uint64, restoreTS uint64, + supportBatch bool, ) error { - startTime := time.Now() - log.Debug("import kv files", zap.String("file", file.Path)) - startKey, endKey, err := GetRewriteEncodedKeys(file, rule) - if err != nil { - return errors.Trace(err) + var ( + startKey []byte + endKey []byte + ranges = make([]kv.KeyRange, len(files)) + err error + ) + + if !supportBatch && len(files) > 1 { + return errors.Annotatef(berrors.ErrInvalidArgument, + "do not support batch apply but files count:%v > 1", len(files)) + } + log.Debug("import kv files", zap.Int("batch file count", len(files))) + + for i, f := range files { + ranges[i].StartKey, ranges[i].EndKey, err = GetRewriteEncodedKeys(f, rule) + if err != nil { + return errors.Trace(err) + } + + if len(startKey) == 0 || bytes.Compare(ranges[i].StartKey, startKey) < 0 { + startKey = ranges[i].StartKey + } + if len(endKey) == 0 || bytes.Compare(ranges[i].EndKey, endKey) > 0 { + endKey = ranges[i].EndKey + } } log.Debug("rewrite file keys", - zap.String("name", file.Path), - logutil.Key("startKey", startKey), - logutil.Key("endKey", endKey)) + logutil.Key("startKey", startKey), logutil.Key("endKey", endKey)) - // This RetryState will retry 48 time, for 5 min - 6 min. - rs := utils.InitialRetryState(48, 100*time.Millisecond, 8*time.Second) + // This RetryState will retry 45 time, about 10 min. + rs := utils.InitialRetryState(45, 100*time.Millisecond, 15*time.Second) ctl := OverRegionsInRange(startKey, endKey, importer.metaClient, &rs) err = ctl.Run(ctx, func(ctx context.Context, r *split.RegionInfo) RPCResult { - return importer.ImportKVFileForRegion(ctx, file, rule, startTS, restoreTS, r) + subfiles, errFilter := FilterFilesByRegion(files, ranges, r) + if errFilter != nil { + return RPCResultFromError(errFilter) + } + if len(subfiles) == 0 { + return RPCResultOK() + } + return importer.ImportKVFileForRegion(ctx, subfiles, rule, shiftStartTS, startTS, restoreTS, r, supportBatch) }) - - log.Debug("download and apply file done", - zap.String("file", file.Path), - zap.Stringer("take", time.Since(startTime)), - logutil.Key("fileStart", file.StartKey), - logutil.Key("fileEnd", file.EndKey), - ) return errors.Trace(err) } @@ -525,7 +595,7 @@ func (importer *FileImporter) download( if importer.isRawKvMode { downloadMeta, e = importer.downloadRawKVSST(ctx, regionInfo, f, cipher, apiVersion) } else { - downloadMeta, e = importer.downloadSST(ctx, regionInfo, f, rewriteRules, cipher) + downloadMeta, e = importer.downloadSST(ctx, regionInfo, f, rewriteRules, cipher, apiVersion) } failpoint.Inject("restore-storage-error", func(val failpoint.Value) { @@ -542,7 +612,7 @@ func (importer *FileImporter) download( if importer.isRawKvMode { downloadMeta, e = importer.downloadRawKVSST(ctx, regionInfo, f, nil, apiVersion) } else { - downloadMeta, e = importer.downloadSST(ctx, regionInfo, f, rewriteRules, nil) + downloadMeta, e = importer.downloadSST(ctx, regionInfo, f, rewriteRules, nil, apiVersion) } } @@ -566,6 +636,7 @@ func (importer *FileImporter) downloadSST( file *backuppb.File, rewriteRules *RewriteRules, cipher *backuppb.CipherInfo, + apiVersion kvrpcpb.APIVersion, ) (*import_sstpb.SSTMeta, error) { uid := uuid.New() id := uid[:] @@ -574,21 +645,38 @@ func (importer *FileImporter) downloadSST( if fileRule == nil { return nil, errors.Trace(berrors.ErrKVRewriteRuleNotFound) } - rule := import_sstpb.RewriteRule{ - OldKeyPrefix: encodeKeyPrefix(fileRule.GetOldKeyPrefix()), - NewKeyPrefix: encodeKeyPrefix(fileRule.GetNewKeyPrefix()), + + // For the legacy version of TiKV, we need to encode the key prefix, since in the legacy + // version, the TiKV will rewrite the key with the encoded prefix without decoding the keys in + // the SST file. For the new version of TiKV that support keyspace rewrite, we don't need to + // encode the key prefix. The TiKV will decode the keys in the SST file and rewrite the keys + // with the plain prefix and encode the keys before writing to SST. + + // for the keyspace rewrite mode + rule := *fileRule + // for the legacy rewrite mode + if importer.rewriteMode == RewriteModeLegacy { + rule.OldKeyPrefix = encodeKeyPrefix(fileRule.GetOldKeyPrefix()) + rule.NewKeyPrefix = encodeKeyPrefix(fileRule.GetNewKeyPrefix()) + } + + sstMeta, err := GetSSTMetaFromFile(id, file, regionInfo.Region, &rule, importer.rewriteMode) + if err != nil { + return nil, err } - sstMeta := GetSSTMetaFromFile(id, file, regionInfo.Region, &rule) req := &import_sstpb.DownloadRequest{ - Sst: sstMeta, + Sst: *sstMeta, StorageBackend: importer.backend, Name: file.GetName(), RewriteRule: rule, CipherInfo: cipher, + StorageCacheId: importer.cacheKey, + // For the older version of TiDB, the request type will be default to `import_sstpb.RequestType_Legacy` + RequestType: import_sstpb.DownloadRequestType_Keyspace, } log.Debug("download SST", - logutil.SSTMeta(&sstMeta), + logutil.SSTMeta(sstMeta), logutil.File(file), logutil.Region(regionInfo.Region), logutil.Leader(regionInfo.Leader), @@ -614,7 +702,7 @@ func (importer *FileImporter) downloadSST( logutil.Region(regionInfo.Region), logutil.Peer(peer), logutil.Key("resp-range-start", resp.Range.Start), - logutil.Key("resp-range-end", resp.Range.Start), + logutil.Key("resp-range-end", resp.Range.End), zap.Bool("resp-isempty", resp.IsEmpty), zap.Uint32("resp-crc32", resp.Crc32), ) @@ -629,7 +717,8 @@ func (importer *FileImporter) downloadSST( downloadResp := atomicResp.Load().(*import_sstpb.DownloadResponse) sstMeta.Range.Start = TruncateTS(downloadResp.Range.GetStart()) sstMeta.Range.End = TruncateTS(downloadResp.Range.GetEnd()) - return &sstMeta, nil + sstMeta.ApiVersion = apiVersion + return sstMeta, nil } func (importer *FileImporter) downloadRawKVSST( @@ -643,7 +732,10 @@ func (importer *FileImporter) downloadRawKVSST( id := uid[:] // Empty rule var rule import_sstpb.RewriteRule - sstMeta := GetSSTMetaFromFile(id, file, regionInfo.Region, &rule) + sstMeta, err := GetSSTMetaFromFile(id, file, regionInfo.Region, &rule, RewriteModeLegacy) + if err != nil { + return nil, err + } // Cut the SST file's range to fit in the restoring range. if bytes.Compare(importer.rawStartKey, sstMeta.Range.GetStart()) > 0 { @@ -659,14 +751,15 @@ func (importer *FileImporter) downloadRawKVSST( } req := &import_sstpb.DownloadRequest{ - Sst: sstMeta, + Sst: *sstMeta, StorageBackend: importer.backend, Name: file.GetName(), RewriteRule: rule, IsRawKv: true, CipherInfo: cipher, + StorageCacheId: importer.cacheKey, } - log.Debug("download SST", logutil.SSTMeta(&sstMeta), logutil.Region(regionInfo.Region)) + log.Debug("download SST", logutil.SSTMeta(sstMeta), logutil.Region(regionInfo.Region)) var atomicResp atomic.Value eg, ectx := errgroup.WithContext(ctx) @@ -697,7 +790,7 @@ func (importer *FileImporter) downloadRawKVSST( sstMeta.Range.Start = downloadResp.Range.GetStart() sstMeta.Range.End = downloadResp.Range.GetEnd() sstMeta.ApiVersion = apiVersion - return &sstMeta, nil + return sstMeta, nil } func (importer *FileImporter) ingest( @@ -801,41 +894,57 @@ func (importer *FileImporter) ingestSSTs( func (importer *FileImporter) downloadAndApplyKVFile( ctx context.Context, - file *backuppb.DataFileInfo, + files []*backuppb.DataFileInfo, rules *RewriteRules, regionInfo *split.RegionInfo, + shiftStartTS uint64, startTS uint64, restoreTS uint64, + supportBatch bool, ) RPCResult { leader := regionInfo.Leader if leader == nil { return RPCResultFromError(errors.Annotatef(berrors.ErrPDLeaderNotFound, "region id %d has no leader", regionInfo.Region.Id)) } - // Get the rewrite rule for the file. - fileRule := findMatchedRewriteRule(file, rules) - if fileRule == nil { - return RPCResultFromError(errors.Annotatef(berrors.ErrKVRewriteRuleNotFound, - "rewrite rule for file %+v not find (in %+v)", file, rules)) - } - rule := import_sstpb.RewriteRule{ - OldKeyPrefix: encodeKeyPrefix(fileRule.GetOldKeyPrefix()), - NewKeyPrefix: encodeKeyPrefix(fileRule.GetNewKeyPrefix()), - } - meta := &import_sstpb.KVMeta{ - Name: file.Path, - Cf: file.Cf, - RangeOffset: file.RangeOffset, - Length: file.Length, - RangeLength: file.RangeLength, - IsDelete: file.Type == backuppb.FileType_Delete, - StartSnapshotTs: startTS, - RestoreTs: restoreTS, - StartKey: regionInfo.Region.GetStartKey(), - EndKey: regionInfo.Region.GetEndKey(), - Sha256: file.GetSha256(), - CompressionType: file.CompressionType, + metas := make([]*import_sstpb.KVMeta, 0, len(files)) + rewriteRules := make([]*import_sstpb.RewriteRule, 0, len(files)) + + for _, file := range files { + // Get the rewrite rule for the file. + fileRule := findMatchedRewriteRule(file, rules) + if fileRule == nil { + return RPCResultFromError(errors.Annotatef(berrors.ErrKVRewriteRuleNotFound, + "rewrite rule for file %+v not find (in %+v)", file, rules)) + } + rule := import_sstpb.RewriteRule{ + OldKeyPrefix: encodeKeyPrefix(fileRule.GetOldKeyPrefix()), + NewKeyPrefix: encodeKeyPrefix(fileRule.GetNewKeyPrefix()), + } + + meta := &import_sstpb.KVMeta{ + Name: file.Path, + Cf: file.Cf, + RangeOffset: file.RangeOffset, + Length: file.Length, + RangeLength: file.RangeLength, + IsDelete: file.Type == backuppb.FileType_Delete, + StartTs: func() uint64 { + if file.Cf == stream.DefaultCF { + return shiftStartTS + } + return startTS + }(), + RestoreTs: restoreTS, + StartKey: regionInfo.Region.GetStartKey(), + EndKey: regionInfo.Region.GetEndKey(), + Sha256: file.GetSha256(), + CompressionType: file.CompressionType, + } + + metas = append(metas, meta) + rewriteRules = append(rewriteRules, &rule) } reqCtx := &kvrpcpb.Context{ @@ -844,12 +953,25 @@ func (importer *FileImporter) downloadAndApplyKVFile( Peer: leader, } - req := &import_sstpb.ApplyRequest{ - Meta: meta, - StorageBackend: importer.backend, - RewriteRule: rule, - Context: reqCtx, + var req *import_sstpb.ApplyRequest + if supportBatch { + req = &import_sstpb.ApplyRequest{ + Metas: metas, + StorageBackend: importer.backend, + RewriteRules: rewriteRules, + Context: reqCtx, + StorageCacheId: importer.cacheKey, + } + } else { + req = &import_sstpb.ApplyRequest{ + Meta: metas[0], + StorageBackend: importer.backend, + RewriteRule: *rewriteRules[0], + Context: reqCtx, + StorageCacheId: importer.cacheKey, + } } + log.Debug("apply kv file", logutil.Leader(leader)) resp, err := importer.importClient.ApplyKVFile(ctx, leader.GetStoreId(), req) if err != nil { diff --git a/br/pkg/restore/import_retry.go b/br/pkg/restore/import_retry.go index 7dcdb01a6c765..6f3b9fc1cca53 100644 --- a/br/pkg/restore/import_retry.go +++ b/br/pkg/restore/import_retry.go @@ -224,7 +224,8 @@ func (r *RPCResult) StrategyForRetryStoreError() RetryStrategy { if r.StoreError.GetServerIsBusy() != nil || r.StoreError.GetRegionNotInitialized() != nil || - r.StoreError.GetNotLeader() != nil { + r.StoreError.GetNotLeader() != nil || + r.StoreError.GetServerIsBusy() != nil { return StrategyFromThisRegion } diff --git a/br/pkg/restore/import_retry_test.go b/br/pkg/restore/import_retry_test.go index d79e2a317a4c0..6f3d8f490ef13 100644 --- a/br/pkg/restore/import_retry_test.go +++ b/br/pkg/restore/import_retry_test.go @@ -12,12 +12,15 @@ import ( "time" "github.com/pingcap/errors" + backuppb "github.com/pingcap/kvproto/pkg/brpb" "github.com/pingcap/kvproto/pkg/errorpb" "github.com/pingcap/kvproto/pkg/import_sstpb" "github.com/pingcap/kvproto/pkg/metapb" + berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/restore" "github.com/pingcap/tidb/br/pkg/restore/split" "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/pdtypes" "github.com/pingcap/tidb/util/codec" "github.com/stretchr/testify/require" @@ -127,6 +130,41 @@ func TestNotLeader(t *testing.T) { assertRegions(t, meetRegions, "", "aay", "bba", "bbh", "cca", "") } +func TestServerIsBusy(t *testing.T) { + // region: [, aay), [aay, bba), [bba, bbh), [bbh, cca), [cca, ) + cli := initTestClient(false) + rs := utils.InitialRetryState(2, 0, 0) + ctl := restore.OverRegionsInRange([]byte(""), []byte(""), cli, &rs) + ctx := context.Background() + + serverIsBusy := errorpb.Error{ + Message: "server is busy", + ServerIsBusy: &errorpb.ServerIsBusy{ + Reason: "memory is out", + }, + } + // record the regions we didn't touch. + meetRegions := []*split.RegionInfo{} + // record all regions we meet with id == 2. + idEqualsTo2Regions := []*split.RegionInfo{} + theFirstRun := true + err := ctl.Run(ctx, func(ctx context.Context, r *split.RegionInfo) restore.RPCResult { + if theFirstRun && r.Region.Id == 2 { + idEqualsTo2Regions = append(idEqualsTo2Regions, r) + theFirstRun = false + return restore.RPCResult{ + StoreError: &serverIsBusy, + } + } + meetRegions = append(meetRegions, r) + return restore.RPCResultOK() + }) + + require.NoError(t, err) + assertRegions(t, idEqualsTo2Regions, "aay", "bba") + assertRegions(t, meetRegions, "", "aay", "bba", "bbh", "cca", "") +} + func printRegion(name string, infos []*split.RegionInfo) { fmt.Printf(">>>>> %s <<<<<\n", name) for _, info := range infos { @@ -345,3 +383,166 @@ func TestPaginateScanLeader(t *testing.T) { }) assertRegions(t, collectedRegions, "", "aay", "bba") } + +func TestImportKVFiles(t *testing.T) { + var ( + importer = restore.FileImporter{} + ctx = context.Background() + shiftStartTS uint64 = 100 + startTS uint64 = 200 + restoreTS uint64 = 300 + ) + + err := importer.ImportKVFiles( + ctx, + []*backuppb.DataFileInfo{ + { + Path: "log3", + }, + { + Path: "log1", + }, + }, + nil, + shiftStartTS, + startTS, + restoreTS, + false, + ) + require.True(t, berrors.ErrInvalidArgument.Equal(err)) +} + +func TestFilterFilesByRegion(t *testing.T) { + files := []*backuppb.DataFileInfo{ + { + Path: "log1", + }, + { + Path: "log2", + }, + } + ranges := []kv.KeyRange{ + { + StartKey: []byte("1111"), + EndKey: []byte("2222"), + }, { + StartKey: []byte("3333"), + EndKey: []byte("4444"), + }, + } + + testCases := []struct { + r split.RegionInfo + subfiles []*backuppb.DataFileInfo + err error + }{ + { + r: split.RegionInfo{ + Region: &metapb.Region{ + StartKey: []byte("0000"), + EndKey: []byte("1110"), + }, + }, + subfiles: []*backuppb.DataFileInfo{}, + err: nil, + }, + { + r: split.RegionInfo{ + Region: &metapb.Region{ + StartKey: []byte("0000"), + EndKey: []byte("1111"), + }, + }, + subfiles: []*backuppb.DataFileInfo{ + files[0], + }, + err: nil, + }, + { + r: split.RegionInfo{ + Region: &metapb.Region{ + StartKey: []byte("0000"), + EndKey: []byte("2222"), + }, + }, + subfiles: []*backuppb.DataFileInfo{ + files[0], + }, + err: nil, + }, + { + r: split.RegionInfo{ + Region: &metapb.Region{ + StartKey: []byte("2222"), + EndKey: []byte("3332"), + }, + }, + subfiles: []*backuppb.DataFileInfo{ + files[0], + }, + err: nil, + }, + { + r: split.RegionInfo{ + Region: &metapb.Region{ + StartKey: []byte("2223"), + EndKey: []byte("3332"), + }, + }, + subfiles: []*backuppb.DataFileInfo{}, + err: nil, + }, + { + r: split.RegionInfo{ + Region: &metapb.Region{ + StartKey: []byte("3332"), + EndKey: []byte("3333"), + }, + }, + subfiles: []*backuppb.DataFileInfo{ + files[1], + }, + err: nil, + }, + { + r: split.RegionInfo{ + Region: &metapb.Region{ + StartKey: []byte("4444"), + EndKey: []byte("5555"), + }, + }, + subfiles: []*backuppb.DataFileInfo{ + files[1], + }, + err: nil, + }, + { + r: split.RegionInfo{ + Region: &metapb.Region{ + StartKey: []byte("4444"), + EndKey: nil, + }, + }, + subfiles: []*backuppb.DataFileInfo{ + files[1], + }, + err: nil, + }, + { + r: split.RegionInfo{ + Region: &metapb.Region{ + StartKey: []byte("0000"), + EndKey: nil, + }, + }, + subfiles: files, + err: nil, + }, + } + + for _, c := range testCases { + subfile, err := restore.FilterFilesByRegion(files, ranges, &c.r) + require.Equal(t, err, c.err) + require.Equal(t, subfile, c.subfiles) + } +} diff --git a/br/pkg/restore/log_client.go b/br/pkg/restore/log_client.go index 7c01897741ba2..cce295090ba02 100644 --- a/br/pkg/restore/log_client.go +++ b/br/pkg/restore/log_client.go @@ -101,14 +101,17 @@ func (rc *logFileManager) loadShiftTS(ctx context.Context) error { if err != nil { return err } - shiftTS.Lock() - defer shiftTS.Unlock() + log.Info("read meta from storage and parse", zap.String("path", path), zap.Uint64("min-ts", m.MinTs), + zap.Uint64("max-ts", m.MaxTs), zap.Int32("meta-version", int32(m.MetaVersion))) ts, ok := UpdateShiftTS(m, rc.startTS, rc.restoreTS) + shiftTS.Lock() if ok && (!shiftTS.exists || shiftTS.value > ts) { shiftTS.value = ts shiftTS.exists = true } + shiftTS.Unlock() + return nil }) if err != nil { diff --git a/br/pkg/restore/prealloc_table_id/BUILD.bazel b/br/pkg/restore/prealloc_table_id/BUILD.bazel index 8ce80b039178a..b8c69a206ad21 100644 --- a/br/pkg/restore/prealloc_table_id/BUILD.bazel +++ b/br/pkg/restore/prealloc_table_id/BUILD.bazel @@ -5,11 +5,15 @@ go_library( srcs = ["alloc.go"], importpath = "github.com/pingcap/tidb/br/pkg/restore/prealloc_table_id", visibility = ["//visibility:public"], - deps = ["//br/pkg/metautil"], + deps = [ + "//br/pkg/metautil", + "//parser/model", + ], ) go_test( name = "prealloc_table_id_test", + timeout = "short", srcs = ["alloc_test.go"], flaky = True, race = "on", diff --git a/br/pkg/restore/prealloc_table_id/alloc.go b/br/pkg/restore/prealloc_table_id/alloc.go index 9232ed84a8fc8..8554de5e9891b 100644 --- a/br/pkg/restore/prealloc_table_id/alloc.go +++ b/br/pkg/restore/prealloc_table_id/alloc.go @@ -7,6 +7,7 @@ import ( "math" "github.com/pingcap/tidb/br/pkg/metautil" + "github.com/pingcap/tidb/parser/model" ) const ( @@ -48,6 +49,14 @@ func New(tables []*metautil.Table) *PreallocIDs { if t.Info.ID > max && t.Info.ID < insaneTableIDThreshold { max = t.Info.ID } + + if t.Info.Partition != nil && t.Info.Partition.Definitions != nil { + for _, part := range t.Info.Partition.Definitions { + if part.ID > max && part.ID < insaneTableIDThreshold { + max = part.ID + } + } + } } return &PreallocIDs{ end: max + 1, @@ -86,3 +95,17 @@ func (p *PreallocIDs) Alloc(m Allocator) error { func (p *PreallocIDs) Prealloced(tid int64) bool { return p.allocedFrom <= tid && tid < p.end } + +func (p *PreallocIDs) PreallocedFor(ti *model.TableInfo) bool { + if !p.Prealloced(ti.ID) { + return false + } + if ti.Partition != nil && ti.Partition.Definitions != nil { + for _, part := range ti.Partition.Definitions { + if !p.Prealloced(part.ID) { + return false + } + } + } + return true +} diff --git a/br/pkg/restore/prealloc_table_id/alloc_test.go b/br/pkg/restore/prealloc_table_id/alloc_test.go index 8cf6b95fb070e..c1c3f018a2de8 100644 --- a/br/pkg/restore/prealloc_table_id/alloc_test.go +++ b/br/pkg/restore/prealloc_table_id/alloc_test.go @@ -27,6 +27,7 @@ func (t *testAllocator) AdvanceGlobalIDs(n int) (int64, error) { func TestAllocator(t *testing.T) { type Case struct { tableIDs []int64 + partitions map[int64][]int64 hasAllocatedTo int64 successfullyAllocated []int64 shouldAllocatedTo int64 @@ -57,16 +58,41 @@ func TestAllocator(t *testing.T) { successfullyAllocated: []int64{5, 6}, shouldAllocatedTo: 7, }, + { + tableIDs: []int64{1, 2, 5, 6, 7}, + hasAllocatedTo: 6, + successfullyAllocated: []int64{6, 7}, + shouldAllocatedTo: 13, + partitions: map[int64][]int64{ + 7: {8, 9, 10, 11, 12}, + }, + }, + { + tableIDs: []int64{1, 2, 5, 6, 7, 13}, + hasAllocatedTo: 9, + successfullyAllocated: []int64{13}, + shouldAllocatedTo: 14, + partitions: map[int64][]int64{ + 7: {8, 9, 10, 11, 12}, + }, + }, } run := func(t *testing.T, c Case) { tables := make([]*metautil.Table, 0, len(c.tableIDs)) for _, id := range c.tableIDs { - tables = append(tables, &metautil.Table{ + table := metautil.Table{ Info: &model.TableInfo{ - ID: id, + ID: id, + Partition: &model.PartitionInfo{}, }, - }) + } + if c.partitions != nil { + for _, part := range c.partitions[id] { + table.Info.Partition.Definitions = append(table.Info.Partition.Definitions, model.PartitionDefinition{ID: part}) + } + } + tables = append(tables, &table) } ids := prealloctableid.New(tables) @@ -74,9 +100,9 @@ func TestAllocator(t *testing.T) { require.NoError(t, ids.Alloc(&allocator)) allocated := make([]int64, 0, len(c.successfullyAllocated)) - for _, t := range c.tableIDs { - if ids.Prealloced(t) { - allocated = append(allocated, t) + for _, t := range tables { + if ids.PreallocedFor(t.Info) { + allocated = append(allocated, t.Info.ID) } } require.ElementsMatch(t, allocated, c.successfullyAllocated) diff --git a/br/pkg/restore/range.go b/br/pkg/restore/range.go index 72a76105dd440..6f3fa76325b0c 100644 --- a/br/pkg/restore/range.go +++ b/br/pkg/restore/range.go @@ -72,7 +72,9 @@ func SortRanges(ranges []rtree.Range, rewriteRules *RewriteRules) ([]rtree.Range // RewriteRules contains rules for rewriting keys of tables. type RewriteRules struct { - Data []*import_sstpb.RewriteRule + Data []*import_sstpb.RewriteRule + OldKeyspace []byte + NewKeyspace []byte } // Append append its argument to this rewrite rules. diff --git a/br/pkg/restore/split.go b/br/pkg/restore/split.go index a707d0f086ce9..17e04486587b9 100644 --- a/br/pkg/restore/split.go +++ b/br/pkg/restore/split.go @@ -5,12 +5,15 @@ package restore import ( "bytes" "context" + "sort" "strconv" "strings" + "sync" "time" "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" + backuppb "github.com/pingcap/kvproto/pkg/brpb" sst "github.com/pingcap/kvproto/pkg/import_sstpb" "github.com/pingcap/kvproto/pkg/pdpb" "github.com/pingcap/log" @@ -19,9 +22,12 @@ import ( "github.com/pingcap/tidb/br/pkg/restore/split" "github.com/pingcap/tidb/br/pkg/rtree" "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/br/pkg/utils/iter" + "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/util/codec" "go.uber.org/multierr" "go.uber.org/zap" + "golang.org/x/sync/errgroup" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) @@ -428,3 +434,426 @@ func replacePrefix(s []byte, rewriteRules *RewriteRules) ([]byte, *sst.RewriteRu return s, nil } + +type rewriteSplitter struct { + rewriteKey []byte + tableID int64 + rule *RewriteRules + splitter *split.SplitHelper +} + +type splitHelperIterator struct { + tableSplitters []*rewriteSplitter +} + +func (iter *splitHelperIterator) Traverse(fn func(v split.Valued, endKey []byte, rule *RewriteRules) bool) { + for _, entry := range iter.tableSplitters { + endKey := codec.EncodeBytes([]byte{}, tablecodec.EncodeTablePrefix(entry.tableID+1)) + rule := entry.rule + entry.splitter.Traverse(func(v split.Valued) bool { + return fn(v, endKey, rule) + }) + } +} + +func NewSplitHelperIteratorForTest(helper *split.SplitHelper, tableID int64, rule *RewriteRules) *splitHelperIterator { + return &splitHelperIterator{ + tableSplitters: []*rewriteSplitter{ + { + tableID: tableID, + rule: rule, + splitter: helper, + }, + }, + } +} + +type LogSplitHelper struct { + tableSplitter map[int64]*split.SplitHelper + rules map[int64]*RewriteRules + client split.SplitClient + pool *utils.WorkerPool + eg *errgroup.Group + regionsCh chan []*split.RegionInfo + + splitThreSholdSize uint64 + splitThreSholdKeys int64 +} + +func NewLogSplitHelper(rules map[int64]*RewriteRules, client split.SplitClient, splitSize uint64, splitKeys int64) *LogSplitHelper { + return &LogSplitHelper{ + tableSplitter: make(map[int64]*split.SplitHelper), + rules: rules, + client: client, + pool: utils.NewWorkerPool(128, "split region"), + eg: nil, + + splitThreSholdSize: splitSize, + splitThreSholdKeys: splitKeys, + } +} + +func (helper *LogSplitHelper) iterator() *splitHelperIterator { + tableSplitters := make([]*rewriteSplitter, 0, len(helper.tableSplitter)) + for tableID, splitter := range helper.tableSplitter { + delete(helper.tableSplitter, tableID) + rewriteRule, exists := helper.rules[tableID] + if !exists { + log.Info("skip splitting due to no table id matched", zap.Int64("tableID", tableID)) + continue + } + newTableID := GetRewriteTableID(tableID, rewriteRule) + if newTableID == 0 { + log.Warn("failed to get the rewrite table id", zap.Int64("tableID", tableID)) + continue + } + tableSplitters = append(tableSplitters, &rewriteSplitter{ + rewriteKey: codec.EncodeBytes([]byte{}, tablecodec.EncodeTablePrefix(newTableID)), + tableID: newTableID, + rule: rewriteRule, + splitter: splitter, + }) + } + sort.Slice(tableSplitters, func(i, j int) bool { + return bytes.Compare(tableSplitters[i].rewriteKey, tableSplitters[j].rewriteKey) < 0 + }) + return &splitHelperIterator{ + tableSplitters: tableSplitters, + } +} + +const splitFileThreshold = 1024 * 1024 // 1 MB + +func (helper *LogSplitHelper) skipFile(file *backuppb.DataFileInfo) bool { + _, exist := helper.rules[file.TableId] + return file.Length < splitFileThreshold || file.IsMeta || !exist +} + +func (helper *LogSplitHelper) Merge(file *backuppb.DataFileInfo) { + if helper.skipFile(file) { + return + } + splitHelper, exist := helper.tableSplitter[file.TableId] + if !exist { + splitHelper = split.NewSplitHelper() + helper.tableSplitter[file.TableId] = splitHelper + } + + splitHelper.Merge(split.Valued{ + Key: split.Span{ + StartKey: file.StartKey, + EndKey: file.EndKey, + }, + Value: split.Value{ + Size: file.Length, + Number: file.NumberOfEntries, + }, + }) +} + +type splitFunc = func(context.Context, *RegionSplitter, uint64, int64, *split.RegionInfo, []split.Valued) error + +func (helper *LogSplitHelper) splitRegionByPoints( + ctx context.Context, + regionSplitter *RegionSplitter, + initialLength uint64, + initialNumber int64, + region *split.RegionInfo, + valueds []split.Valued, +) error { + var ( + splitPoints [][]byte = make([][]byte, 0) + lastKey []byte = region.Region.StartKey + length uint64 = initialLength + number int64 = initialNumber + ) + for _, v := range valueds { + // decode will discard ts behind the key, which results in the same key for consecutive ranges + if !bytes.Equal(lastKey, v.GetStartKey()) && (v.Value.Size+length > helper.splitThreSholdSize || v.Value.Number+number > helper.splitThreSholdKeys) { + _, rawKey, _ := codec.DecodeBytes(v.GetStartKey(), nil) + splitPoints = append(splitPoints, rawKey) + length = 0 + number = 0 + } + lastKey = v.GetStartKey() + length += v.Value.Size + number += v.Value.Number + } + + if len(splitPoints) == 0 { + return nil + } + + helper.pool.ApplyOnErrorGroup(helper.eg, func() error { + newRegions, errSplit := regionSplitter.splitAndScatterRegions(ctx, region, splitPoints) + if errSplit != nil { + log.Warn("failed to split the scaned region", zap.Error(errSplit)) + _, startKey, _ := codec.DecodeBytes(region.Region.StartKey, nil) + ranges := make([]rtree.Range, 0, len(splitPoints)) + for _, point := range splitPoints { + ranges = append(ranges, rtree.Range{StartKey: startKey, EndKey: point}) + startKey = point + } + + return regionSplitter.Split(ctx, ranges, nil, false, func([][]byte) {}) + } + select { + case <-ctx.Done(): + return nil + case helper.regionsCh <- newRegions: + } + log.Info("split the region", zap.Uint64("region-id", region.Region.Id), zap.Int("split-point-number", len(splitPoints))) + return nil + }) + return nil +} + +// GetRewriteTableID gets rewrite table id by the rewrite rule and original table id +func GetRewriteTableID(tableID int64, rewriteRules *RewriteRules) int64 { + tableKey := tablecodec.GenTableRecordPrefix(tableID) + rule := matchOldPrefix(tableKey, rewriteRules) + if rule == nil { + return 0 + } + + return tablecodec.DecodeTableID(rule.GetNewKeyPrefix()) +} + +// SplitPoint selects ranges overlapped with each region, and calls `splitF` to split the region +func SplitPoint( + ctx context.Context, + iter *splitHelperIterator, + client split.SplitClient, + splitF splitFunc, +) (err error) { + // common status + var ( + regionSplitter *RegionSplitter = NewRegionSplitter(client) + ) + // region traverse status + var ( + // the region buffer of each scan + regions []*split.RegionInfo = nil + regionIndex int = 0 + ) + // region split status + var ( + // range span +----------------+------+---+-------------+ + // region span +------------------------------------+ + // +initial length+ +end valued+ + // regionValueds is the ranges array overlapped with `regionInfo` + regionValueds []split.Valued = nil + // regionInfo is the region to be split + regionInfo *split.RegionInfo = nil + // intialLength is the length of the part of the first range overlapped with the region + initialLength uint64 = 0 + initialNumber int64 = 0 + ) + // range status + var ( + // regionOverCount is the number of regions overlapped with the range + regionOverCount uint64 = 0 + ) + + iter.Traverse(func(v split.Valued, endKey []byte, rule *RewriteRules) bool { + if v.Value.Number == 0 || v.Value.Size == 0 { + return true + } + var ( + vStartKey []byte + vEndKey []byte + ) + // use `vStartKey` and `vEndKey` to compare with region's key + vStartKey, vEndKey, err = GetRewriteEncodedKeys(v, rule) + if err != nil { + return false + } + // traverse to the first region overlapped with the range + for ; regionIndex < len(regions); regionIndex++ { + if bytes.Compare(vStartKey, regions[regionIndex].Region.EndKey) < 0 { + break + } + } + // cannot find any regions overlapped with the range + // need to scan regions again + if regionIndex == len(regions) { + regions = nil + } + regionOverCount = 0 + for { + if regionIndex >= len(regions) { + var startKey []byte + if len(regions) > 0 { + // has traversed over the region buffer, should scan from the last region's end-key of the region buffer + startKey = regions[len(regions)-1].Region.EndKey + } else { + // scan from the range's start-key + startKey = vStartKey + } + // scan at most 64 regions into the region buffer + regions, err = split.ScanRegionsWithRetry(ctx, client, startKey, endKey, 64) + if err != nil { + return false + } + regionIndex = 0 + } + + region := regions[regionIndex] + // this region must be overlapped with the range + regionOverCount++ + // the region is the last one overlapped with the range, + // should split the last recorded region, + // and then record this region as the region to be split + if bytes.Compare(vEndKey, region.Region.EndKey) < 0 { + endLength := v.Value.Size / regionOverCount + endNumber := v.Value.Number / int64(regionOverCount) + if len(regionValueds) > 0 && regionInfo != region { + // add a part of the range as the end part + if bytes.Compare(vStartKey, regionInfo.Region.EndKey) < 0 { + regionValueds = append(regionValueds, split.NewValued(vStartKey, regionInfo.Region.EndKey, split.Value{Size: endLength, Number: endNumber})) + } + // try to split the region + err = splitF(ctx, regionSplitter, initialLength, initialNumber, regionInfo, regionValueds) + if err != nil { + return false + } + regionValueds = make([]split.Valued, 0) + } + if regionOverCount == 1 { + // the region completely contains the range + regionValueds = append(regionValueds, split.Valued{ + Key: split.Span{ + StartKey: vStartKey, + EndKey: vEndKey, + }, + Value: v.Value, + }) + } else { + // the region is overlapped with the last part of the range + initialLength = endLength + initialNumber = endNumber + } + regionInfo = region + // try the next range + return true + } + + // try the next region + regionIndex++ + } + }) + + if err != nil { + return errors.Trace(err) + } + if len(regionValueds) > 0 { + // try to split the region + err = splitF(ctx, regionSplitter, initialLength, initialNumber, regionInfo, regionValueds) + if err != nil { + return errors.Trace(err) + } + } + + return nil +} + +func (helper *LogSplitHelper) Split(ctx context.Context) error { + var ectx context.Context + var wg sync.WaitGroup + helper.eg, ectx = errgroup.WithContext(ctx) + helper.regionsCh = make(chan []*split.RegionInfo, 1024) + wg.Add(1) + go func() { + defer wg.Done() + scatterRegions := make([]*split.RegionInfo, 0) + receiveNewRegions: + for { + select { + case <-ectx.Done(): + return + case newRegions, ok := <-helper.regionsCh: + if !ok { + break receiveNewRegions + } + + scatterRegions = append(scatterRegions, newRegions...) + } + } + + startTime := time.Now() + regionSplitter := NewRegionSplitter(helper.client) + for _, region := range scatterRegions { + regionSplitter.waitForScatterRegion(ctx, region) + // It is too expensive to stop recovery and wait for a small number of regions + // to complete scatter, so the maximum waiting time is reduced to 1 minute. + if time.Since(startTime) > time.Minute { + break + } + } + }() + + iter := helper.iterator() + if err := SplitPoint(ectx, iter, helper.client, helper.splitRegionByPoints); err != nil { + return errors.Trace(err) + } + + // wait for completion of splitting regions + if err := helper.eg.Wait(); err != nil { + return errors.Trace(err) + } + + // wait for completion of scattering regions + close(helper.regionsCh) + wg.Wait() + + return nil +} + +type LogFilesIterWithSplitHelper struct { + iter LogIter + helper *LogSplitHelper + buffer []*backuppb.DataFileInfo + next int +} + +const SplitFilesBufferSize = 4096 + +func NewLogFilesIterWithSplitHelper(iter LogIter, rules map[int64]*RewriteRules, client split.SplitClient, splitSize uint64, splitKeys int64) LogIter { + return &LogFilesIterWithSplitHelper{ + iter: iter, + helper: NewLogSplitHelper(rules, client, splitSize, splitKeys), + buffer: nil, + next: 0, + } +} + +func (splitIter *LogFilesIterWithSplitHelper) TryNext(ctx context.Context) iter.IterResult[*backuppb.DataFileInfo] { + if splitIter.next >= len(splitIter.buffer) { + splitIter.buffer = make([]*backuppb.DataFileInfo, 0, SplitFilesBufferSize) + for r := splitIter.iter.TryNext(ctx); !r.Finished; r = splitIter.iter.TryNext(ctx) { + if r.Err != nil { + return r + } + f := r.Item + splitIter.helper.Merge(f) + splitIter.buffer = append(splitIter.buffer, f) + if len(splitIter.buffer) >= SplitFilesBufferSize { + break + } + } + splitIter.next = 0 + if len(splitIter.buffer) == 0 { + return iter.Done[*backuppb.DataFileInfo]() + } + log.Info("start to split the regions") + startTime := time.Now() + if err := splitIter.helper.Split(ctx); err != nil { + return iter.Throw[*backuppb.DataFileInfo](errors.Trace(err)) + } + log.Info("end to split the regions", zap.Duration("takes", time.Since(startTime))) + } + + res := iter.Emit(splitIter.buffer[splitIter.next]) + splitIter.next += 1 + return res +} diff --git a/br/pkg/restore/split/BUILD.bazel b/br/pkg/restore/split/BUILD.bazel index 49fbec82c543c..7c91f32cfae90 100644 --- a/br/pkg/restore/split/BUILD.bazel +++ b/br/pkg/restore/split/BUILD.bazel @@ -1,4 +1,4 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "split", @@ -6,6 +6,7 @@ go_library( "client.go", "region.go", "split.go", + "sum_sorted.go", ], importpath = "github.com/pingcap/tidb/br/pkg/restore/split", visibility = ["//visibility:public"], @@ -13,10 +14,13 @@ go_library( "//br/pkg/conn/util", "//br/pkg/errors", "//br/pkg/httputil", + "//br/pkg/lightning/config", "//br/pkg/logutil", "//br/pkg/redact", "//br/pkg/utils", + "//kv", "//store/pdtypes", + "@com_github_google_btree//:btree", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/errorpb", @@ -29,8 +33,20 @@ go_library( "@org_golang_google_grpc//:grpc", "@org_golang_google_grpc//codes", "@org_golang_google_grpc//credentials", + "@org_golang_google_grpc//credentials/insecure", "@org_golang_google_grpc//status", "@org_uber_go_multierr//:multierr", "@org_uber_go_zap//:zap", ], ) + +go_test( + name = "split_test", + timeout = "short", + srcs = ["sum_sorted_test.go"], + flaky = True, + deps = [ + ":split", + "@com_github_stretchr_testify//require", + ], +) diff --git a/br/pkg/restore/split/client.go b/br/pkg/restore/split/client.go index fb82135ae2af6..72482a94e87dc 100644 --- a/br/pkg/restore/split/client.go +++ b/br/pkg/restore/split/client.go @@ -27,6 +27,7 @@ import ( "github.com/pingcap/tidb/br/pkg/conn/util" berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/httputil" + "github.com/pingcap/tidb/br/pkg/lightning/config" "github.com/pingcap/tidb/br/pkg/logutil" "github.com/pingcap/tidb/store/pdtypes" pd "github.com/tikv/pd/client" @@ -35,6 +36,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/status" ) @@ -200,7 +202,9 @@ func (c *pdClient) SplitRegion(ctx context.Context, regionInfo *RegionInfo, key if err != nil { return nil, errors.Trace(err) } - conn, err := grpc.Dial(store.GetAddress(), grpc.WithInsecure()) + conn, err := grpc.Dial(store.GetAddress(), + grpc.WithTransportCredentials(insecure.NewCredentials()), + config.DefaultGrpcKeepaliveParams) if err != nil { return nil, errors.Trace(err) } @@ -336,11 +340,12 @@ func sendSplitRegionRequest(ctx context.Context, c *pdClient, regionInfo *Region if err != nil { return false, nil, err } - opt := grpc.WithInsecure() + opt := grpc.WithTransportCredentials(insecure.NewCredentials()) if c.tlsConf != nil { opt = grpc.WithTransportCredentials(credentials.NewTLS(c.tlsConf)) } - conn, err := grpc.Dial(store.GetAddress(), opt) + conn, err := grpc.Dial(store.GetAddress(), opt, + config.DefaultGrpcKeepaliveParams) if err != nil { return false, nil, err } diff --git a/br/pkg/restore/split/split.go b/br/pkg/restore/split/split.go index 6af36a400a03f..e06c8ab1c93d5 100644 --- a/br/pkg/restore/split/split.go +++ b/br/pkg/restore/split/split.go @@ -18,7 +18,7 @@ import ( ) var ( - ScanRegionAttemptTimes = 60 + ScanRegionAttemptTimes = 128 ) // Constants for split retry machinery. @@ -121,6 +121,65 @@ func PaginateScanRegion( return regions, err } +// CheckPartRegionConsistency only checks the continuity of regions and the first region consistency. +func CheckPartRegionConsistency(startKey, endKey []byte, regions []*RegionInfo) error { + // current pd can't guarantee the consistency of returned regions + if len(regions) == 0 { + return errors.Annotatef(berrors.ErrPDBatchScanRegion, "scan region return empty result, startKey: %s, endKey: %s", + redact.Key(startKey), redact.Key(endKey)) + } + + if bytes.Compare(regions[0].Region.StartKey, startKey) > 0 { + return errors.Annotatef(berrors.ErrPDBatchScanRegion, "first region's startKey > startKey, startKey: %s, regionStartKey: %s", + redact.Key(startKey), redact.Key(regions[0].Region.StartKey)) + } + + cur := regions[0] + for _, r := range regions[1:] { + if !bytes.Equal(cur.Region.EndKey, r.Region.StartKey) { + return errors.Annotatef(berrors.ErrPDBatchScanRegion, "region endKey not equal to next region startKey, endKey: %s, startKey: %s", + redact.Key(cur.Region.EndKey), redact.Key(r.Region.StartKey)) + } + cur = r + } + + return nil +} + +func ScanRegionsWithRetry( + ctx context.Context, client SplitClient, startKey, endKey []byte, limit int, +) ([]*RegionInfo, error) { + if len(endKey) != 0 && bytes.Compare(startKey, endKey) > 0 { + return nil, errors.Annotatef(berrors.ErrRestoreInvalidRange, "startKey > endKey, startKey: %s, endkey: %s", + hex.EncodeToString(startKey), hex.EncodeToString(endKey)) + } + + var regions []*RegionInfo + var err error + // we don't need to return multierr. since there only 3 times retry. + // in most case 3 times retry have the same error. so we just return the last error. + // actually we'd better remove all multierr in br/lightning. + // because it's not easy to check multierr equals normal error. + // see https://github.com/pingcap/tidb/issues/33419. + _ = utils.WithRetry(ctx, func() error { + regions, err = client.ScanRegions(ctx, startKey, endKey, limit) + if err != nil { + err = errors.Annotatef(berrors.ErrPDBatchScanRegion, "scan regions from start-key:%s, err: %s", + redact.Key(startKey), err.Error()) + return err + } + + if err = CheckPartRegionConsistency(startKey, endKey, regions); err != nil { + log.Warn("failed to scan region, retrying", logutil.ShortError(err)) + return err + } + + return nil + }, newScanRegionBackoffer()) + + return regions, err +} + type scanRegionBackoffer struct { attempt int } diff --git a/br/pkg/restore/split/sum_sorted.go b/br/pkg/restore/split/sum_sorted.go new file mode 100644 index 0000000000000..c4e9657900e35 --- /dev/null +++ b/br/pkg/restore/split/sum_sorted.go @@ -0,0 +1,204 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. +package split + +import ( + "bytes" + "fmt" + + "github.com/google/btree" + "github.com/pingcap/tidb/br/pkg/logutil" + "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/kv" +) + +// Value is the value type of stored in the span tree. +type Value struct { + Size uint64 + Number int64 +} + +// join finds the upper bound of two values. +func join(a, b Value) Value { + return Value{ + Size: a.Size + b.Size, + Number: a.Number + b.Number, + } +} + +// Span is the type of an adjacent sub key space. +type Span = kv.KeyRange + +// Valued is span binding to a value, which is the entry type of span tree. +type Valued struct { + Key Span + Value Value +} + +func NewValued(startKey, endKey []byte, value Value) Valued { + return Valued{ + Key: Span{ + StartKey: startKey, + EndKey: endKey, + }, + Value: value, + } +} + +func (v Valued) String() string { + return fmt.Sprintf("(%s, %.2f MB, %d)", logutil.StringifyRange(v.Key), float64(v.Value.Size)/1024/1024, v.Value.Number) +} + +func (v Valued) Less(other btree.Item) bool { + return bytes.Compare(v.Key.StartKey, other.(Valued).Key.StartKey) < 0 +} + +// implement for `AppliedFile` +func (v Valued) GetStartKey() []byte { + return v.Key.StartKey +} + +// implement for `AppliedFile` +func (v Valued) GetEndKey() []byte { + return v.Key.EndKey +} + +// SplitHelper represents a set of valued ranges, which doesn't overlap and union of them all is the full key space. +type SplitHelper struct { + inner *btree.BTree +} + +// NewSplitHelper creates a set of a subset of spans, with the full key space as initial status +func NewSplitHelper() *SplitHelper { + t := btree.New(16) + t.ReplaceOrInsert(Valued{Value: Value{Size: 0, Number: 0}, Key: Span{StartKey: []byte(""), EndKey: []byte("")}}) + return &SplitHelper{inner: t} +} + +func (f *SplitHelper) Merge(val Valued) { + if len(val.Key.StartKey) == 0 || len(val.Key.EndKey) == 0 { + return + } + overlaps := make([]Valued, 0, 8) + f.overlapped(val.Key, &overlaps) + f.mergeWithOverlap(val, overlaps) +} + +// traverse the items in ascend order +func (f *SplitHelper) Traverse(m func(Valued) bool) { + f.inner.Ascend(func(item btree.Item) bool { + return m(item.(Valued)) + }) +} + +func (f *SplitHelper) mergeWithOverlap(val Valued, overlapped []Valued) { + // There isn't any range overlaps with the input range, perhaps the input range is empty. + // do nothing for this case. + if len(overlapped) == 0 { + return + } + + for _, r := range overlapped { + f.inner.Delete(r) + } + // Assert All overlapped ranges are deleted. + + // the new valued item's Value is equally dividedd into `len(overlapped)` shares + appendValue := Value{ + Size: val.Value.Size / uint64(len(overlapped)), + Number: val.Value.Number / int64(len(overlapped)), + } + var ( + rightTrail *Valued + leftTrail *Valued + // overlapped ranges +-------------+----------+ + // new valued item +-------------+ + // a b c d e + // the part [a,b] is `standalone` because it is not overlapped with the new valued item + // the part [a,b] and [b,c] are `split` because they are from range [a,c] + emitToCollected = func(rng Valued, standalone bool, split bool) { + merged := rng.Value + if split { + merged.Size /= 2 + merged.Number /= 2 + } + if !standalone { + merged = join(appendValue, merged) + } + rng.Value = merged + f.inner.ReplaceOrInsert(rng) + } + ) + + leftmost := overlapped[0] + if bytes.Compare(leftmost.Key.StartKey, val.Key.StartKey) < 0 { + leftTrail = &Valued{ + Key: Span{StartKey: leftmost.Key.StartKey, EndKey: val.Key.StartKey}, + Value: leftmost.Value, + } + overlapped[0].Key.StartKey = val.Key.StartKey + } + + rightmost := overlapped[len(overlapped)-1] + if utils.CompareBytesExt(rightmost.Key.EndKey, true, val.Key.EndKey, true) > 0 { + rightTrail = &Valued{ + Key: Span{StartKey: val.Key.EndKey, EndKey: rightmost.Key.EndKey}, + Value: rightmost.Value, + } + overlapped[len(overlapped)-1].Key.EndKey = val.Key.EndKey + if len(overlapped) == 1 && leftTrail != nil { + // (split) (split) (split) + // overlapped ranges +-----------------------------+ + // new valued item +-------------+ + // a b c d + // now the overlapped range should be divided into 3 equal parts + // so modify the value to the 2/3x to be compatible with function `emitToCollected` + val := Value{ + Size: rightTrail.Value.Size * 2 / 3, + Number: rightTrail.Value.Number * 2 / 3, + } + leftTrail.Value = val + overlapped[0].Value = val + rightTrail.Value = val + } + } + + if leftTrail != nil { + emitToCollected(*leftTrail, true, true) + } + + for i, rng := range overlapped { + split := (i == 0 && leftTrail != nil) || (i == len(overlapped)-1 && rightTrail != nil) + emitToCollected(rng, false, split) + } + + if rightTrail != nil { + emitToCollected(*rightTrail, true, true) + } +} + +// overlapped inserts the overlapped ranges of the span into the `result` slice. +func (f *SplitHelper) overlapped(k Span, result *[]Valued) { + var first Span + f.inner.DescendLessOrEqual(Valued{Key: k}, func(item btree.Item) bool { + first = item.(Valued).Key + return false + }) + + f.inner.AscendGreaterOrEqual(Valued{Key: first}, func(item btree.Item) bool { + r := item.(Valued) + if !checkOverlaps(r.Key, k) { + return false + } + *result = append(*result, r) + return true + }) +} + +// checkOverlaps checks whether two spans have overlapped part. +// `ap` should be a finite range +func checkOverlaps(a, ap Span) bool { + if len(a.EndKey) == 0 { + return bytes.Compare(ap.EndKey, a.StartKey) > 0 + } + return bytes.Compare(a.StartKey, ap.EndKey) < 0 && bytes.Compare(ap.StartKey, a.EndKey) < 0 +} diff --git a/br/pkg/restore/split/sum_sorted_test.go b/br/pkg/restore/split/sum_sorted_test.go new file mode 100644 index 0000000000000..3a3b3db6d90eb --- /dev/null +++ b/br/pkg/restore/split/sum_sorted_test.go @@ -0,0 +1,141 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. +package split_test + +import ( + "testing" + + "github.com/pingcap/tidb/br/pkg/restore/split" + "github.com/stretchr/testify/require" +) + +func v(s, e string, val split.Value) split.Valued { + return split.Valued{ + Key: split.Span{ + StartKey: []byte(s), + EndKey: []byte(e), + }, + Value: val, + } +} + +func mb(b uint64) split.Value { + return split.Value{ + Size: b * 1024 * 1024, + Number: int64(b), + } +} + +func TestSumSorted(t *testing.T) { + cases := []struct { + values []split.Valued + result []uint64 + }{ + { + values: []split.Valued{ + v("a", "f", mb(100)), + v("a", "c", mb(200)), + v("d", "g", mb(100)), + }, + result: []uint64{0, 250, 25, 75, 50, 0}, + }, + { + values: []split.Valued{ + v("a", "f", mb(100)), + v("a", "c", mb(200)), + v("d", "f", mb(100)), + }, + result: []uint64{0, 250, 25, 125, 0}, + }, + { + values: []split.Valued{ + v("a", "f", mb(100)), + v("a", "c", mb(200)), + v("c", "f", mb(100)), + }, + result: []uint64{0, 250, 150, 0}, + }, + { + values: []split.Valued{ + v("a", "f", mb(100)), + v("a", "c", mb(200)), + v("c", "f", mb(100)), + v("da", "db", mb(100)), + }, + result: []uint64{0, 250, 50, 150, 50, 0}, + }, + { + values: []split.Valued{ + v("a", "f", mb(100)), + v("a", "c", mb(200)), + v("c", "f", mb(100)), + v("da", "db", mb(100)), + v("cb", "db", mb(100)), + }, + result: []uint64{0, 250, 25, 75, 200, 50, 0}, + }, + { + values: []split.Valued{ + v("a", "f", mb(100)), + v("a", "c", mb(200)), + v("c", "f", mb(100)), + v("da", "db", mb(100)), + v("cb", "f", mb(150)), + }, + result: []uint64{0, 250, 25, 75, 200, 100, 0}, + }, + { + values: []split.Valued{ + v("a", "f", mb(100)), + v("a", "c", mb(200)), + v("c", "f", mb(100)), + v("da", "db", mb(100)), + v("cb", "df", mb(150)), + }, + result: []uint64{0, 250, 25, 75, 200, 75, 25, 0}, + }, + { + values: []split.Valued{ + v("a", "f", mb(100)), + v("a", "c", mb(200)), + v("c", "f", mb(100)), + v("da", "db", mb(100)), + v("cb", "df", mb(150)), + }, + result: []uint64{0, 250, 25, 75, 200, 75, 25, 0}, + }, + { + values: []split.Valued{ + v("a", "f", mb(100)), + v("a", "c", mb(200)), + v("c", "f", mb(100)), + v("da", "db", mb(100)), + v("c", "df", mb(150)), + }, + result: []uint64{0, 250, 100, 200, 75, 25, 0}, + }, + { + values: []split.Valued{ + v("a", "f", mb(100)), + v("a", "c", mb(200)), + v("c", "f", mb(100)), + v("da", "db", mb(100)), + v("c", "f", mb(150)), + }, + result: []uint64{0, 250, 100, 200, 100, 0}, + }, + } + + for _, ca := range cases { + full := split.NewSplitHelper() + for _, v := range ca.values { + full.Merge(v) + } + + i := 0 + full.Traverse(func(v split.Valued) bool { + require.Equal(t, mb(ca.result[i]), v.Value) + i++ + return true + }) + } +} diff --git a/br/pkg/restore/split_test.go b/br/pkg/restore/split_test.go index b726a5ec78729..1b560a4e1474d 100644 --- a/br/pkg/restore/split_test.go +++ b/br/pkg/restore/split_test.go @@ -5,6 +5,7 @@ package restore_test import ( "bytes" "context" + "fmt" "sync" "testing" "time" @@ -22,7 +23,9 @@ import ( "github.com/pingcap/tidb/br/pkg/restore/split" "github.com/pingcap/tidb/br/pkg/rtree" "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/br/pkg/utils/iter" "github.com/pingcap/tidb/store/pdtypes" + "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/util/codec" "github.com/stretchr/testify/require" "go.uber.org/multierr" @@ -729,3 +732,316 @@ func TestSplitFailed(t *testing.T) { require.GreaterOrEqual(t, len(r.splitRanges), 2) require.Len(t, r.restoredFiles, 0) } + +func keyWithTablePrefix(tableID int64, key string) []byte { + rawKey := append(tablecodec.GenTableRecordPrefix(tableID), []byte(key)...) + return codec.EncodeBytes([]byte{}, rawKey) +} + +func TestSplitPoint(t *testing.T) { + ctx := context.Background() + var oldTableID int64 = 50 + var tableID int64 = 100 + rewriteRules := &restore.RewriteRules{ + Data: []*import_sstpb.RewriteRule{ + { + OldKeyPrefix: tablecodec.EncodeTablePrefix(oldTableID), + NewKeyPrefix: tablecodec.EncodeTablePrefix(tableID), + }, + }, + } + + // range: b c d e g i + // +---+ +---+ +---------+ + // +-------------+----------+---------+ + // region: a f h j + splitHelper := split.NewSplitHelper() + splitHelper.Merge(split.Valued{Key: split.Span{StartKey: keyWithTablePrefix(oldTableID, "b"), EndKey: keyWithTablePrefix(oldTableID, "c")}, Value: split.Value{Size: 100, Number: 100}}) + splitHelper.Merge(split.Valued{Key: split.Span{StartKey: keyWithTablePrefix(oldTableID, "d"), EndKey: keyWithTablePrefix(oldTableID, "e")}, Value: split.Value{Size: 200, Number: 200}}) + splitHelper.Merge(split.Valued{Key: split.Span{StartKey: keyWithTablePrefix(oldTableID, "g"), EndKey: keyWithTablePrefix(oldTableID, "i")}, Value: split.Value{Size: 300, Number: 300}}) + client := NewFakeSplitClient() + client.AppendRegion(keyWithTablePrefix(tableID, "a"), keyWithTablePrefix(tableID, "f")) + client.AppendRegion(keyWithTablePrefix(tableID, "f"), keyWithTablePrefix(tableID, "h")) + client.AppendRegion(keyWithTablePrefix(tableID, "h"), keyWithTablePrefix(tableID, "j")) + client.AppendRegion(keyWithTablePrefix(tableID, "j"), keyWithTablePrefix(tableID+1, "a")) + + iter := restore.NewSplitHelperIteratorForTest(splitHelper, tableID, rewriteRules) + err := restore.SplitPoint(ctx, iter, client, func(ctx context.Context, rs *restore.RegionSplitter, u uint64, o int64, ri *split.RegionInfo, v []split.Valued) error { + require.Equal(t, u, uint64(0)) + require.Equal(t, o, int64(0)) + require.Equal(t, ri.Region.StartKey, keyWithTablePrefix(tableID, "a")) + require.Equal(t, ri.Region.EndKey, keyWithTablePrefix(tableID, "f")) + require.EqualValues(t, v[0].Key.StartKey, keyWithTablePrefix(tableID, "b")) + require.EqualValues(t, v[0].Key.EndKey, keyWithTablePrefix(tableID, "c")) + require.EqualValues(t, v[1].Key.StartKey, keyWithTablePrefix(tableID, "d")) + require.EqualValues(t, v[1].Key.EndKey, keyWithTablePrefix(tableID, "e")) + require.Equal(t, len(v), 2) + return nil + }) + require.NoError(t, err) +} + +func getCharFromNumber(prefix string, i int) string { + c := '1' + (i % 10) + b := '1' + (i%100)/10 + a := '1' + i/100 + return fmt.Sprintf("%s%c%c%c", prefix, a, b, c) +} + +func TestSplitPoint2(t *testing.T) { + ctx := context.Background() + var oldTableID int64 = 50 + var tableID int64 = 100 + rewriteRules := &restore.RewriteRules{ + Data: []*import_sstpb.RewriteRule{ + { + OldKeyPrefix: tablecodec.EncodeTablePrefix(oldTableID), + NewKeyPrefix: tablecodec.EncodeTablePrefix(tableID), + }, + }, + } + + // range: b c d e f i j k l n + // +---+ +---+ +-----------------+ +----+ +--------+ + // +---------------+--+.....+----+------------+---------+ + // region: a g >128 h m o + splitHelper := split.NewSplitHelper() + splitHelper.Merge(split.Valued{Key: split.Span{StartKey: keyWithTablePrefix(oldTableID, "b"), EndKey: keyWithTablePrefix(oldTableID, "c")}, Value: split.Value{Size: 100, Number: 100}}) + splitHelper.Merge(split.Valued{Key: split.Span{StartKey: keyWithTablePrefix(oldTableID, "d"), EndKey: keyWithTablePrefix(oldTableID, "e")}, Value: split.Value{Size: 200, Number: 200}}) + splitHelper.Merge(split.Valued{Key: split.Span{StartKey: keyWithTablePrefix(oldTableID, "f"), EndKey: keyWithTablePrefix(oldTableID, "i")}, Value: split.Value{Size: 300, Number: 300}}) + splitHelper.Merge(split.Valued{Key: split.Span{StartKey: keyWithTablePrefix(oldTableID, "j"), EndKey: keyWithTablePrefix(oldTableID, "k")}, Value: split.Value{Size: 200, Number: 200}}) + splitHelper.Merge(split.Valued{Key: split.Span{StartKey: keyWithTablePrefix(oldTableID, "l"), EndKey: keyWithTablePrefix(oldTableID, "n")}, Value: split.Value{Size: 200, Number: 200}}) + client := NewFakeSplitClient() + client.AppendRegion(keyWithTablePrefix(tableID, "a"), keyWithTablePrefix(tableID, "g")) + client.AppendRegion(keyWithTablePrefix(tableID, "g"), keyWithTablePrefix(tableID, getCharFromNumber("g", 0))) + for i := 0; i < 256; i++ { + client.AppendRegion(keyWithTablePrefix(tableID, getCharFromNumber("g", i)), keyWithTablePrefix(tableID, getCharFromNumber("g", i+1))) + } + client.AppendRegion(keyWithTablePrefix(tableID, getCharFromNumber("g", 256)), keyWithTablePrefix(tableID, "h")) + client.AppendRegion(keyWithTablePrefix(tableID, "h"), keyWithTablePrefix(tableID, "m")) + client.AppendRegion(keyWithTablePrefix(tableID, "m"), keyWithTablePrefix(tableID, "o")) + client.AppendRegion(keyWithTablePrefix(tableID, "o"), keyWithTablePrefix(tableID+1, "a")) + + firstSplit := true + iter := restore.NewSplitHelperIteratorForTest(splitHelper, tableID, rewriteRules) + err := restore.SplitPoint(ctx, iter, client, func(ctx context.Context, rs *restore.RegionSplitter, u uint64, o int64, ri *split.RegionInfo, v []split.Valued) error { + if firstSplit { + require.Equal(t, u, uint64(0)) + require.Equal(t, o, int64(0)) + require.Equal(t, ri.Region.StartKey, keyWithTablePrefix(tableID, "a")) + require.Equal(t, ri.Region.EndKey, keyWithTablePrefix(tableID, "g")) + require.EqualValues(t, v[0].Key.StartKey, keyWithTablePrefix(tableID, "b")) + require.EqualValues(t, v[0].Key.EndKey, keyWithTablePrefix(tableID, "c")) + require.EqualValues(t, v[1].Key.StartKey, keyWithTablePrefix(tableID, "d")) + require.EqualValues(t, v[1].Key.EndKey, keyWithTablePrefix(tableID, "e")) + require.EqualValues(t, v[2].Key.StartKey, keyWithTablePrefix(tableID, "f")) + require.EqualValues(t, v[2].Key.EndKey, keyWithTablePrefix(tableID, "g")) + require.Equal(t, v[2].Value.Size, uint64(1)) + require.Equal(t, v[2].Value.Number, int64(1)) + require.Equal(t, len(v), 3) + firstSplit = false + } else { + require.Equal(t, u, uint64(1)) + require.Equal(t, o, int64(1)) + require.Equal(t, ri.Region.StartKey, keyWithTablePrefix(tableID, "h")) + require.Equal(t, ri.Region.EndKey, keyWithTablePrefix(tableID, "m")) + require.EqualValues(t, v[0].Key.StartKey, keyWithTablePrefix(tableID, "j")) + require.EqualValues(t, v[0].Key.EndKey, keyWithTablePrefix(tableID, "k")) + require.EqualValues(t, v[1].Key.StartKey, keyWithTablePrefix(tableID, "l")) + require.EqualValues(t, v[1].Key.EndKey, keyWithTablePrefix(tableID, "m")) + require.Equal(t, v[1].Value.Size, uint64(100)) + require.Equal(t, v[1].Value.Number, int64(100)) + require.Equal(t, len(v), 2) + } + return nil + }) + require.NoError(t, err) +} + +type fakeSplitClient struct { + regions []*split.RegionInfo +} + +func NewFakeSplitClient() *fakeSplitClient { + return &fakeSplitClient{ + regions: make([]*split.RegionInfo, 0), + } +} + +func (f *fakeSplitClient) AppendRegion(startKey, endKey []byte) { + f.regions = append(f.regions, &split.RegionInfo{ + Region: &metapb.Region{ + StartKey: startKey, + EndKey: endKey, + }, + }) +} + +func (*fakeSplitClient) GetStore(ctx context.Context, storeID uint64) (*metapb.Store, error) { + return nil, nil +} +func (*fakeSplitClient) GetRegion(ctx context.Context, key []byte) (*split.RegionInfo, error) { + return nil, nil +} +func (*fakeSplitClient) GetRegionByID(ctx context.Context, regionID uint64) (*split.RegionInfo, error) { + return nil, nil +} +func (*fakeSplitClient) SplitRegion(ctx context.Context, regionInfo *split.RegionInfo, key []byte) (*split.RegionInfo, error) { + return nil, nil +} +func (*fakeSplitClient) BatchSplitRegions(ctx context.Context, regionInfo *split.RegionInfo, keys [][]byte) ([]*split.RegionInfo, error) { + return nil, nil +} +func (*fakeSplitClient) BatchSplitRegionsWithOrigin(ctx context.Context, regionInfo *split.RegionInfo, keys [][]byte) (*split.RegionInfo, []*split.RegionInfo, error) { + return nil, nil, nil +} +func (*fakeSplitClient) ScatterRegion(ctx context.Context, regionInfo *split.RegionInfo) error { + return nil +} +func (*fakeSplitClient) ScatterRegions(ctx context.Context, regionInfo []*split.RegionInfo) error { + return nil +} +func (*fakeSplitClient) GetOperator(ctx context.Context, regionID uint64) (*pdpb.GetOperatorResponse, error) { + return nil, nil +} +func (f *fakeSplitClient) ScanRegions(ctx context.Context, startKey, endKey []byte, limit int) ([]*split.RegionInfo, error) { + result := make([]*split.RegionInfo, 0) + count := 0 + for _, rng := range f.regions { + if bytes.Compare(rng.Region.StartKey, endKey) <= 0 && bytes.Compare(rng.Region.EndKey, startKey) > 0 { + result = append(result, rng) + count++ + } + if count >= limit { + break + } + } + return result, nil +} +func (*fakeSplitClient) GetPlacementRule(ctx context.Context, groupID, ruleID string) (pdtypes.Rule, error) { + return pdtypes.Rule{}, nil +} +func (*fakeSplitClient) SetPlacementRule(ctx context.Context, rule pdtypes.Rule) error { return nil } +func (*fakeSplitClient) DeletePlacementRule(ctx context.Context, groupID, ruleID string) error { + return nil +} +func (*fakeSplitClient) SetStoresLabel(ctx context.Context, stores []uint64, labelKey, labelValue string) error { + return nil +} + +func TestGetRewriteTableID(t *testing.T) { + var tableID int64 = 76 + var oldTableID int64 = 80 + { + rewriteRules := &restore.RewriteRules{ + Data: []*import_sstpb.RewriteRule{ + { + OldKeyPrefix: tablecodec.EncodeTablePrefix(oldTableID), + NewKeyPrefix: tablecodec.EncodeTablePrefix(tableID), + }, + }, + } + + newTableID := restore.GetRewriteTableID(oldTableID, rewriteRules) + require.Equal(t, tableID, newTableID) + } + + { + rewriteRules := &restore.RewriteRules{ + Data: []*import_sstpb.RewriteRule{ + { + OldKeyPrefix: tablecodec.GenTableRecordPrefix(oldTableID), + NewKeyPrefix: tablecodec.GenTableRecordPrefix(tableID), + }, + }, + } + + newTableID := restore.GetRewriteTableID(oldTableID, rewriteRules) + require.Equal(t, tableID, newTableID) + } +} + +type mockLogIter struct { + next int +} + +func (m *mockLogIter) TryNext(ctx context.Context) iter.IterResult[*backuppb.DataFileInfo] { + if m.next > 10000 { + return iter.Done[*backuppb.DataFileInfo]() + } + m.next += 1 + return iter.Emit(&backuppb.DataFileInfo{ + StartKey: []byte(fmt.Sprintf("a%d", m.next)), + EndKey: []byte("b"), + Length: 1024, // 1 KB + }) +} + +func TestLogFilesIterWithSplitHelper(t *testing.T) { + var tableID int64 = 76 + var oldTableID int64 = 80 + rewriteRules := &restore.RewriteRules{ + Data: []*import_sstpb.RewriteRule{ + { + OldKeyPrefix: tablecodec.EncodeTablePrefix(oldTableID), + NewKeyPrefix: tablecodec.EncodeTablePrefix(tableID), + }, + }, + } + rewriteRulesMap := map[int64]*restore.RewriteRules{ + oldTableID: rewriteRules, + } + mockIter := &mockLogIter{} + ctx := context.Background() + logIter := restore.NewLogFilesIterWithSplitHelper(mockIter, rewriteRulesMap, NewFakeSplitClient(), 144*1024*1024, 1440000) + next := 0 + for r := logIter.TryNext(ctx); !r.Finished; r = logIter.TryNext(ctx) { + require.NoError(t, r.Err) + next += 1 + require.Equal(t, []byte(fmt.Sprintf("a%d", next)), r.Item.StartKey) + } +} + +func regionInfo(startKey, endKey string) *split.RegionInfo { + return &split.RegionInfo{ + Region: &metapb.Region{ + StartKey: []byte(startKey), + EndKey: []byte(endKey), + }, + } +} + +func TestSplitCheckPartRegionConsistency(t *testing.T) { + var ( + startKey []byte = []byte("a") + endKey []byte = []byte("f") + err error + ) + err = split.CheckPartRegionConsistency(startKey, endKey, nil) + require.Error(t, err) + err = split.CheckPartRegionConsistency(startKey, endKey, []*split.RegionInfo{ + regionInfo("b", "c"), + }) + require.Error(t, err) + err = split.CheckPartRegionConsistency(startKey, endKey, []*split.RegionInfo{ + regionInfo("a", "c"), + regionInfo("d", "e"), + }) + require.Error(t, err) + err = split.CheckPartRegionConsistency(startKey, endKey, []*split.RegionInfo{ + regionInfo("a", "c"), + regionInfo("c", "d"), + }) + require.NoError(t, err) + err = split.CheckPartRegionConsistency(startKey, endKey, []*split.RegionInfo{ + regionInfo("a", "c"), + regionInfo("c", "d"), + regionInfo("d", "f"), + }) + require.NoError(t, err) + err = split.CheckPartRegionConsistency(startKey, endKey, []*split.RegionInfo{ + regionInfo("a", "c"), + regionInfo("c", "z"), + }) + require.NoError(t, err) +} diff --git a/br/pkg/restore/stream_metas_test.go b/br/pkg/restore/stream_metas_test.go index 5b75e9de6b3d8..407f5a0154ca3 100644 --- a/br/pkg/restore/stream_metas_test.go +++ b/br/pkg/restore/stream_metas_test.go @@ -317,7 +317,7 @@ func TestTruncateSafepointForGCS(t *testing.T) { CredentialsBlob: "Fake Credentials", } - l, err := storage.NewGCSStorageForTest(ctx, gcs, &storage.ExternalStorageOptions{ + l, err := storage.NewGCSStorage(ctx, gcs, &storage.ExternalStorageOptions{ SendCredentials: false, CheckPermissions: []storage.Permission{storage.AccessBuckets}, HTTPClient: server.HTTPClient(), diff --git a/br/pkg/restore/systable_restore.go b/br/pkg/restore/systable_restore.go index 40e3450c772f2..ac21b0dba7e42 100644 --- a/br/pkg/restore/systable_restore.go +++ b/br/pkg/restore/systable_restore.go @@ -19,6 +19,12 @@ import ( "go.uber.org/zap" ) +const ( + rootUser = "root" + sysUserTableName = "user" + cloudAdminUser = "cloud_admin" +) + var statsTables = map[string]struct{}{ "stats_buckets": {}, "stats_extended": {}, @@ -49,14 +55,14 @@ var unRecoverableTable = map[string]struct{}{ // skip clearing or restoring 'cloud_admin'@'%' which is a special // user on TiDB Cloud var sysPrivilegeTableMap = map[string]string{ - "user": "not (user = 'cloud_admin' and host = '%')", // since v1.0.0 - "db": "not (user = 'cloud_admin' and host = '%')", // since v1.0.0 - "tables_priv": "not (user = 'cloud_admin' and host = '%')", // since v1.0.0 - "columns_priv": "not (user = 'cloud_admin' and host = '%')", // since v1.0.0 - "default_roles": "not (user = 'cloud_admin' and host = '%')", // since v3.0.0 - "role_edges": "not (to_user = 'cloud_admin' and to_host = '%')", // since v3.0.0 - "global_priv": "not (user = 'cloud_admin' and host = '%')", // since v3.0.8 - "global_grants": "not (user = 'cloud_admin' and host = '%')", // since v5.0.3 + "user": "(user = '%s' and host = '%%')", // since v1.0.0 + "db": "(user = '%s' and host = '%%')", // since v1.0.0 + "tables_priv": "(user = '%s' and host = '%%')", // since v1.0.0 + "columns_priv": "(user = '%s' and host = '%%')", // since v1.0.0 + "default_roles": "(user = '%s' and host = '%%')", // since v3.0.0 + "role_edges": "(to_user = '%s' and to_host = '%%')", // since v3.0.0 + "global_priv": "(user = '%s' and host = '%%')", // since v3.0.8 + "global_grants": "(user = '%s' and host = '%%')", // since v5.0.3 } func isUnrecoverableTable(tableName string) bool { @@ -69,6 +75,78 @@ func isStatsTable(tableName string) bool { return ok } +func generateResetSQLs(db *database, resetUsers []string) []string { + if db.Name.L != mysql.SystemDB { + return nil + } + sqls := make([]string, 0, 10) + // we only need reset root password once + rootReset := false + for tableName := range db.ExistingTables { + if sysPrivilegeTableMap[tableName] != "" { + for _, name := range resetUsers { + if strings.ToLower(name) == rootUser { + if !rootReset { + updateSQL := fmt.Sprintf("UPDATE %s.%s SET authentication_string='',"+ + " Shutdown_priv='Y',"+ + " Config_priv='Y'"+ + " WHERE USER='root' AND Host='%%';", + db.Name.L, sysUserTableName) + sqls = append(sqls, updateSQL) + rootReset = true + } else { + continue + } + } else { + /* #nosec G202: SQL string concatenation */ + whereClause := fmt.Sprintf("WHERE "+sysPrivilegeTableMap[tableName], name) + deleteSQL := fmt.Sprintf("DELETE FROM %s %s;", + utils.EncloseDBAndTable(db.Name.L, tableName), whereClause) + sqls = append(sqls, deleteSQL) + } + } + } + } + return sqls +} + +// ClearSystemUsers is used for volume-snapshot restoration. +// because we can not support restore user in some scenarios, for example in cloud. +// we'd better use this function to drop cloud_admin user after volume-snapshot restore. +func (rc *Client) ClearSystemUsers(ctx context.Context, resetUsers []string) error { + sysDB := mysql.SystemDB + db, ok := rc.getDatabaseByName(sysDB) + if !ok { + log.Warn("target database not exist, aborting", zap.String("database", sysDB)) + return nil + } + execSQL := func(sql string) error { + // SQLs here only contain table name and database name, seems it is no need to redact them. + if err := rc.db.se.Execute(ctx, sql); err != nil { + log.Warn("failed to clear system users", + zap.Stringer("database", db.Name), + zap.String("sql", sql), + zap.Error(err), + ) + return berrors.ErrUnknown.Wrap(err).GenWithStack("failed to execute %s", sql) + } + log.Info("successfully clear system users after restoration", + zap.Stringer("database", db.Name), + zap.String("sql", sql), + ) + return nil + } + + sqls := generateResetSQLs(db, resetUsers) + for _, sql := range sqls { + log.Info("reset system user for cloud", zap.String("sql", sql)) + if err := execSQL(sql); err != nil { + return err + } + } + return nil +} + // RestoreSystemSchemas restores the system schema(i.e. the `mysql` schema). // Detail see https://github.com/pingcap/br/issues/679#issuecomment-762592254. func (rc *Client) RestoreSystemSchemas(ctx context.Context, f filter.Filter) { @@ -201,14 +279,15 @@ func (rc *Client) replaceTemporaryTableToSystable(ctx context.Context, ti *model } if db.ExistingTables[tableName] != nil { - whereClause := "" + whereNotClause := "" if rc.fullClusterRestore && sysPrivilegeTableMap[tableName] != "" { // cloud_admin is a special user on tidb cloud, need to skip it. - whereClause = fmt.Sprintf("WHERE %s", sysPrivilegeTableMap[tableName]) + /* #nosec G202: SQL string concatenation */ + whereNotClause = fmt.Sprintf("WHERE NOT "+sysPrivilegeTableMap[tableName], cloudAdminUser) log.Info("full cluster restore, delete existing data", zap.String("table", tableName), zap.Stringer("schema", db.Name)) deleteSQL := fmt.Sprintf("DELETE FROM %s %s;", - utils.EncloseDBAndTable(db.Name.L, tableName), whereClause) + utils.EncloseDBAndTable(db.Name.L, tableName), whereNotClause) if err := execSQL(deleteSQL); err != nil { return err } @@ -226,7 +305,7 @@ func (rc *Client) replaceTemporaryTableToSystable(ctx context.Context, ti *model utils.EncloseDBAndTable(db.Name.L, tableName), colListStr, colListStr, utils.EncloseDBAndTable(db.TemporaryName.L, tableName), - whereClause) + whereNotClause) return execSQL(replaceIntoSQL) } diff --git a/br/pkg/restore/systable_restore_test.go b/br/pkg/restore/systable_restore_test.go new file mode 100644 index 0000000000000..2371f066a43a1 --- /dev/null +++ b/br/pkg/restore/systable_restore_test.go @@ -0,0 +1,72 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package restore + +import ( + "regexp" + "testing" + + "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/parser/model" + "github.com/stretchr/testify/require" +) + +func testTableInfo(name string) *model.TableInfo { + return &model.TableInfo{ + Name: model.NewCIStr(name), + } +} + +func TestGenerateResetSQL(t *testing.T) { + // case #1: ignore non-mysql databases + mockDB := &database{ + ExistingTables: map[string]*model.TableInfo{}, + Name: model.NewCIStr("non-mysql"), + TemporaryName: utils.TemporaryDBName("non-mysql"), + } + for name := range sysPrivilegeTableMap { + mockDB.ExistingTables[name] = testTableInfo(name) + } + resetUsers := []string{"cloud_admin", "root"} + require.Equal(t, 0, len(generateResetSQLs(mockDB, resetUsers))) + + // case #2: ignore non expected table + mockDB = &database{ + ExistingTables: map[string]*model.TableInfo{}, + Name: model.NewCIStr("mysql"), + TemporaryName: utils.TemporaryDBName("mysql"), + } + for name := range sysPrivilegeTableMap { + name += "non_available" + mockDB.ExistingTables[name] = testTableInfo(name) + } + resetUsers = []string{"cloud_admin", "root"} + require.Equal(t, 0, len(generateResetSQLs(mockDB, resetUsers))) + + // case #3: only reset cloud admin account + for name := range sysPrivilegeTableMap { + mockDB.ExistingTables[name] = testTableInfo(name) + } + resetUsers = []string{"cloud_admin"} + sqls := generateResetSQLs(mockDB, resetUsers) + require.Equal(t, 8, len(sqls)) + for _, sql := range sqls { + // for cloud_admin we only generate DELETE sql + require.Regexp(t, regexp.MustCompile("DELETE*"), sql) + } + + // case #4: reset cloud admin/other account + resetUsers = []string{"cloud_admin", "cloud_other"} + sqls = generateResetSQLs(mockDB, resetUsers) + require.Equal(t, 16, len(sqls)) + for _, sql := range sqls { + // for cloud_admin/cloud_other we only generate DELETE sql + require.Regexp(t, regexp.MustCompile("DELETE*"), sql) + } + + // case #5: reset cloud admin && root account + resetUsers = []string{"cloud_admin", "root"} + sqls = generateResetSQLs(mockDB, resetUsers) + // 8 DELETE sqls for cloud admin and 1 UPDATE sql for root + require.Equal(t, 9, len(sqls)) +} diff --git a/br/pkg/restore/tiflashrec/BUILD.bazel b/br/pkg/restore/tiflashrec/BUILD.bazel index fbe6ba415cb8c..2025370a8d9d0 100644 --- a/br/pkg/restore/tiflashrec/BUILD.bazel +++ b/br/pkg/restore/tiflashrec/BUILD.bazel @@ -19,6 +19,7 @@ go_library( go_test( name = "tiflashrec_test", + timeout = "short", srcs = ["tiflash_recorder_test.go"], flaky = True, deps = [ diff --git a/br/pkg/restore/tiflashrec/tiflash_recorder.go b/br/pkg/restore/tiflashrec/tiflash_recorder.go index 31dde982a7b69..84707f05e1f1b 100644 --- a/br/pkg/restore/tiflashrec/tiflash_recorder.go +++ b/br/pkg/restore/tiflashrec/tiflash_recorder.go @@ -79,6 +79,46 @@ func (r *TiFlashRecorder) Rewrite(oldID int64, newID int64) { } } +func (r *TiFlashRecorder) GenerateResetAlterTableDDLs(info infoschema.InfoSchema) []string { + items := make([]string, 0, len(r.items)) + r.Iterate(func(id int64, replica model.TiFlashReplicaInfo) { + table, ok := info.TableByID(id) + if !ok { + log.Warn("Table do not exist, skipping", zap.Int64("id", id)) + return + } + schema, ok := info.SchemaByTable(table.Meta()) + if !ok { + log.Warn("Schema do not exist, skipping", zap.Int64("id", id), zap.Stringer("table", table.Meta().Name)) + return + } + // Currently, we didn't backup tiflash cluster volume during volume snapshot backup, + // But the table has replica info after volume restoration. + // We should reset it to 0, then set it back. otherwise, it will return error when alter tiflash replica. + altTableSpec, err := alterTableSpecOf(replica, true) + if err != nil { + log.Warn("Failed to generate the alter table spec", logutil.ShortError(err), zap.Any("replica", replica)) + return + } + items = append(items, fmt.Sprintf( + "ALTER TABLE %s %s", + utils.EncloseDBAndTable(schema.Name.O, table.Meta().Name.O), + altTableSpec), + ) + altTableSpec, err = alterTableSpecOf(replica, false) + if err != nil { + log.Warn("Failed to generate the alter table spec", logutil.ShortError(err), zap.Any("replica", replica)) + return + } + items = append(items, fmt.Sprintf( + "ALTER TABLE %s %s", + utils.EncloseDBAndTable(schema.Name.O, table.Meta().Name.O), + altTableSpec), + ) + }) + return items +} + func (r *TiFlashRecorder) GenerateAlterTableDDLs(info infoschema.InfoSchema) []string { items := make([]string, 0, len(r.items)) r.Iterate(func(id int64, replica model.TiFlashReplicaInfo) { @@ -92,7 +132,7 @@ func (r *TiFlashRecorder) GenerateAlterTableDDLs(info infoschema.InfoSchema) []s log.Warn("Schema do not exist, skipping", zap.Int64("id", id), zap.Stringer("table", table.Meta().Name)) return } - altTableSpec, err := alterTableSpecOf(replica) + altTableSpec, err := alterTableSpecOf(replica, false) if err != nil { log.Warn("Failed to generate the alter table spec", logutil.ShortError(err), zap.Any("replica", replica)) return @@ -106,7 +146,7 @@ func (r *TiFlashRecorder) GenerateAlterTableDDLs(info infoschema.InfoSchema) []s return items } -func alterTableSpecOf(replica model.TiFlashReplicaInfo) (string, error) { +func alterTableSpecOf(replica model.TiFlashReplicaInfo, reset bool) (string, error) { spec := &ast.AlterTableSpec{ Tp: ast.AlterTableSetTiFlashReplica, TiFlashReplica: &ast.TiFlashReplicaSpec{ @@ -114,6 +154,14 @@ func alterTableSpecOf(replica model.TiFlashReplicaInfo) (string, error) { Labels: replica.LocationLabels, }, } + if reset { + spec = &ast.AlterTableSpec{ + Tp: ast.AlterTableSetTiFlashReplica, + TiFlashReplica: &ast.TiFlashReplicaSpec{ + Count: 0, + }, + } + } buf := bytes.NewBuffer(make([]byte, 0, 32)) restoreCx := format.NewRestoreCtx( diff --git a/br/pkg/restore/tiflashrec/tiflash_recorder_test.go b/br/pkg/restore/tiflashrec/tiflash_recorder_test.go index b01272caeddc5..f7316a1ed3133 100644 --- a/br/pkg/restore/tiflashrec/tiflash_recorder_test.go +++ b/br/pkg/restore/tiflashrec/tiflash_recorder_test.go @@ -170,3 +170,32 @@ func TestGenSql(t *testing.T) { "ALTER TABLE `test`.`evils` SET TIFLASH REPLICA 1 LOCATION LABELS 'kIll''; OR DROP DATABASE test --', 'dEaTh with " + `\\"quoting\\"` + "'", }) } + +func TestGenResetSql(t *testing.T) { + tInfo := func(id int, name string) *model.TableInfo { + return &model.TableInfo{ + ID: int64(id), + Name: model.NewCIStr(name), + } + } + fakeInfo := infoschema.MockInfoSchema([]*model.TableInfo{ + tInfo(1, "fruits"), + tInfo(2, "whisper"), + }) + rec := tiflashrec.New() + rec.AddTable(1, model.TiFlashReplicaInfo{ + Count: 1, + }) + rec.AddTable(2, model.TiFlashReplicaInfo{ + Count: 2, + LocationLabels: []string{"climate"}, + }) + + sqls := rec.GenerateResetAlterTableDDLs(fakeInfo) + require.ElementsMatch(t, sqls, []string{ + "ALTER TABLE `test`.`whisper` SET TIFLASH REPLICA 0", + "ALTER TABLE `test`.`whisper` SET TIFLASH REPLICA 2 LOCATION LABELS 'climate'", + "ALTER TABLE `test`.`fruits` SET TIFLASH REPLICA 0", + "ALTER TABLE `test`.`fruits` SET TIFLASH REPLICA 1", + }) +} diff --git a/br/pkg/restore/util.go b/br/pkg/restore/util.go index 259d3fa28d888..b29ef6674c74f 100644 --- a/br/pkg/restore/util.go +++ b/br/pkg/restore/util.go @@ -196,7 +196,25 @@ func GetSSTMetaFromFile( file *backuppb.File, region *metapb.Region, regionRule *import_sstpb.RewriteRule, -) import_sstpb.SSTMeta { + rewriteMode RewriteMode, +) (meta *import_sstpb.SSTMeta, err error) { + r := *region + // If the rewrite mode is for keyspace, then the region bound should be decoded. + if rewriteMode == RewriteModeKeyspace { + if len(region.GetStartKey()) > 0 { + _, r.StartKey, err = codec.DecodeBytes(region.GetStartKey(), nil) + if err != nil { + return + } + } + if len(region.GetEndKey()) > 0 { + _, r.EndKey, err = codec.DecodeBytes(region.GetEndKey(), nil) + if err != nil { + return + } + } + } + // Get the column family of the file by the file name. var cfName string if strings.Contains(file.GetName(), defaultCFName) { @@ -208,8 +226,8 @@ func GetSSTMetaFromFile( // Here we rewrites the keys to compare with the keys of the region. rangeStart := regionRule.GetNewKeyPrefix() // rangeStart = max(rangeStart, region.StartKey) - if bytes.Compare(rangeStart, region.GetStartKey()) < 0 { - rangeStart = region.GetStartKey() + if bytes.Compare(rangeStart, r.GetStartKey()) < 0 { + rangeStart = r.GetStartKey() } // Append 10 * 0xff to make sure rangeEnd cover all file key @@ -219,8 +237,8 @@ func GetSSTMetaFromFile( suffix := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} rangeEnd := append(append([]byte{}, regionRule.GetNewKeyPrefix()...), suffix...) // rangeEnd = min(rangeEnd, region.EndKey) - if len(region.GetEndKey()) > 0 && bytes.Compare(rangeEnd, region.GetEndKey()) > 0 { - rangeEnd = region.GetEndKey() + if len(r.GetEndKey()) > 0 && bytes.Compare(rangeEnd, r.GetEndKey()) > 0 { + rangeEnd = r.GetEndKey() } if bytes.Compare(rangeStart, rangeEnd) > 0 { @@ -235,7 +253,7 @@ func GetSSTMetaFromFile( logutil.Key("startKey", rangeStart), logutil.Key("endKey", rangeEnd)) - return import_sstpb.SSTMeta{ + return &import_sstpb.SSTMeta{ Uuid: id, CfName: cfName, Range: &import_sstpb.Range{ @@ -246,7 +264,7 @@ func GetSSTMetaFromFile( RegionId: region.GetId(), RegionEpoch: region.GetRegionEpoch(), CipherIv: file.GetCipherIv(), - } + }, nil } // makeDBPool makes a session pool with specficated size by sessionFactory. @@ -750,3 +768,43 @@ func CheckConsistencyAndValidPeer(regionInfos []*RecoverRegionInfo) (map[uint64] } return validPeers, nil } + +// in cloud, since iops and bandwidth limitation, write operator in raft is slow, so raft state (logterm, lastlog, commitlog...) are the same among the peers +// LeaderCandidates select all peers can be select as a leader during the restore +func LeaderCandidates(peers []*RecoverRegion) ([]*RecoverRegion, error) { + if peers == nil { + return nil, errors.Annotatef(berrors.ErrRestoreRegionWithoutPeer, + "invalid region range") + } + candidates := make([]*RecoverRegion, 0, len(peers)) + // by default, the peers[0] to be assign as a leader, since peers already sorted by leader selection rule + leader := peers[0] + candidates = append(candidates, leader) + for _, peer := range peers[1:] { + // qualificated candidate is leader.logterm = candidate.logterm && leader.lastindex = candidate.lastindex && && leader.commitindex = candidate.commitindex + if peer.LastLogTerm == leader.LastLogTerm && peer.LastIndex == leader.LastIndex && peer.CommitIndex == leader.CommitIndex { + log.Debug("leader candidate", zap.Uint64("store id", peer.StoreId), zap.Uint64("region id", peer.RegionId), zap.Uint64("peer id", peer.PeerId)) + candidates = append(candidates, peer) + } + } + return candidates, nil +} + +// for region A, has candidate leader x, y, z +// peer x on store 1 with storeBalanceScore 3 +// peer y on store 3 with storeBalanceScore 2 +// peer z on store 4 with storeBalanceScore 1 +// result: peer z will be select as leader on store 4 +func SelectRegionLeader(storeBalanceScore map[uint64]int, peers []*RecoverRegion) *RecoverRegion { + // by default, the peers[0] to be assign as a leader + leader := peers[0] + minLeaderStore := storeBalanceScore[leader.StoreId] + for _, peer := range peers[1:] { + log.Debug("leader candidate", zap.Int("score", storeBalanceScore[peer.StoreId]), zap.Int("min-score", minLeaderStore), zap.Uint64("store id", peer.StoreId), zap.Uint64("region id", peer.RegionId), zap.Uint64("peer id", peer.PeerId)) + if storeBalanceScore[peer.StoreId] < minLeaderStore { + minLeaderStore = storeBalanceScore[peer.StoreId] + leader = peer + } + } + return leader +} diff --git a/br/pkg/restore/util_test.go b/br/pkg/restore/util_test.go index 44620e9cb4e5c..4af6922efa30a 100644 --- a/br/pkg/restore/util_test.go +++ b/br/pkg/restore/util_test.go @@ -52,7 +52,8 @@ func TestGetSSTMetaFromFile(t *testing.T) { StartKey: []byte("t2abc"), EndKey: []byte("t3a"), } - sstMeta := restore.GetSSTMetaFromFile([]byte{}, file, region, rule) + sstMeta, err := restore.GetSSTMetaFromFile([]byte{}, file, region, rule, restore.RewriteModeLegacy) + require.Nil(t, err) require.Equal(t, "t2abc", string(sstMeta.GetRange().GetStart())) require.Equal(t, "t2\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff", string(sstMeta.GetRange().GetEnd())) } @@ -460,3 +461,52 @@ func TestCheckConsistencyAndValidPeer(t *testing.T) { require.Error(t, err) require.Regexp(t, ".*invalid restore range.*", err.Error()) } + +func TestLeaderCandidates(t *testing.T) { + //key space is continuous + validPeer1 := newPeerMeta(9, 11, 2, []byte(""), []byte("bb"), 2, 1, 0, 0, false) + validPeer2 := newPeerMeta(19, 22, 3, []byte("bb"), []byte("cc"), 2, 1, 0, 1, false) + validPeer3 := newPeerMeta(29, 30, 1, []byte("cc"), []byte(""), 2, 1, 0, 2, false) + + peers := []*restore.RecoverRegion{ + validPeer1, + validPeer2, + validPeer3, + } + + candidates, err := restore.LeaderCandidates(peers) + require.NoError(t, err) + require.Equal(t, 3, len(candidates)) +} + +func TestSelectRegionLeader(t *testing.T) { + validPeer1 := newPeerMeta(9, 11, 2, []byte(""), []byte("bb"), 2, 1, 0, 0, false) + validPeer2 := newPeerMeta(19, 22, 3, []byte("bb"), []byte("cc"), 2, 1, 0, 1, false) + validPeer3 := newPeerMeta(29, 30, 1, []byte("cc"), []byte(""), 2, 1, 0, 2, false) + + peers := []*restore.RecoverRegion{ + validPeer1, + validPeer2, + validPeer3, + } + // init store banlance score all is 0 + storeBalanceScore := make(map[uint64]int, len(peers)) + leader := restore.SelectRegionLeader(storeBalanceScore, peers) + require.Equal(t, validPeer1, leader) + + // change store banlance store + storeBalanceScore[2] = 3 + storeBalanceScore[3] = 2 + storeBalanceScore[1] = 1 + leader = restore.SelectRegionLeader(storeBalanceScore, peers) + require.Equal(t, validPeer3, leader) + + // one peer + peer := []*restore.RecoverRegion{ + validPeer3, + } + // init store banlance score all is 0 + storeScore := make(map[uint64]int, len(peer)) + leader = restore.SelectRegionLeader(storeScore, peer) + require.Equal(t, validPeer3, leader) +} diff --git a/br/pkg/rtree/rtree.go b/br/pkg/rtree/rtree.go index 9f12b22daca75..f17ebf38df510 100644 --- a/br/pkg/rtree/rtree.go +++ b/br/pkg/rtree/rtree.go @@ -217,3 +217,10 @@ func (rangeTree *RangeTree) GetIncompleteRange( } return incomplete } + +type ProgressRange struct { + Res RangeTree + Incomplete []Range + Origin Range + GroupKey string +} diff --git a/br/pkg/storage/BUILD.bazel b/br/pkg/storage/BUILD.bazel index c67a17713b2ca..68b0a8b03aca2 100644 --- a/br/pkg/storage/BUILD.bazel +++ b/br/pkg/storage/BUILD.bazel @@ -35,6 +35,7 @@ go_library( "@com_github_aws_aws_sdk_go//service/s3", "@com_github_aws_aws_sdk_go//service/s3/s3iface", "@com_github_aws_aws_sdk_go//service/s3/s3manager", + "@com_github_azure_azure_sdk_for_go_sdk_azcore//policy", "@com_github_azure_azure_sdk_for_go_sdk_azidentity//:azidentity", "@com_github_azure_azure_sdk_for_go_sdk_storage_azblob//:azblob", "@com_github_golang_snappy//:snappy", @@ -55,7 +56,7 @@ go_library( go_test( name = "storage_test", - timeout = "short", + timeout = "moderate", srcs = [ "azblob_test.go", "compress_test.go", diff --git a/br/pkg/storage/azblob.go b/br/pkg/storage/azblob.go index c557a79e3ac8f..41d8fa88f559f 100644 --- a/br/pkg/storage/azblob.go +++ b/br/pkg/storage/azblob.go @@ -12,6 +12,7 @@ import ( "path" "strings" + "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" "github.com/google/uuid" @@ -30,6 +31,16 @@ const ( azblobAccountKey = "azblob.account-key" ) +const azblobRetryTimes int32 = 5 + +func getDefaultClientOptions() *azblob.ClientOptions { + return &azblob.ClientOptions{ + Retry: policy.RetryOptions{ + MaxRetries: azblobRetryTimes, + }, + } +} + // AzblobBackendOptions is the options for Azure Blob storage. type AzblobBackendOptions struct { Endpoint string `json:"endpoint" toml:"endpoint"` @@ -99,7 +110,7 @@ type sharedKeyClientBuilder struct { } func (b *sharedKeyClientBuilder) GetServiceClient() (azblob.ServiceClient, error) { - return azblob.NewServiceClientWithSharedKey(b.serviceURL, b.cred, nil) + return azblob.NewServiceClientWithSharedKey(b.serviceURL, b.cred, getDefaultClientOptions()) } func (b *sharedKeyClientBuilder) GetAccountName() string { @@ -114,7 +125,7 @@ type tokenClientBuilder struct { } func (b *tokenClientBuilder) GetServiceClient() (azblob.ServiceClient, error) { - return azblob.NewServiceClient(b.serviceURL, b.cred, nil) + return azblob.NewServiceClient(b.serviceURL, b.cred, getDefaultClientOptions()) } func (b *tokenClientBuilder) GetAccountName() string { @@ -285,7 +296,9 @@ func (s *AzureBlobStorage) ReadFile(ctx context.Context, name string) ([]byte, e return nil, errors.Annotatef(err, "Failed to download azure blob file, file info: bucket(container)='%s', key='%s'", s.options.Bucket, s.withPrefix(name)) } defer resp.RawResponse.Body.Close() - data, err := io.ReadAll(resp.Body(azblob.RetryReaderOptions{})) + data, err := io.ReadAll(resp.Body(azblob.RetryReaderOptions{ + MaxRetryRequests: int(azblobRetryTimes), + })) if err != nil { return nil, errors.Annotatef(err, "Failed to read azure blob file, file info: bucket(container)='%s', key='%s'", s.options.Bucket, s.withPrefix(name)) } diff --git a/br/pkg/storage/azblob_test.go b/br/pkg/storage/azblob_test.go index c099037ea51b2..74ddfa7125699 100644 --- a/br/pkg/storage/azblob_test.go +++ b/br/pkg/storage/azblob_test.go @@ -4,9 +4,13 @@ package storage import ( "context" + "fmt" "io" + "net/http" + "net/http/httptest" "os" "strings" + "sync" "testing" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" @@ -298,3 +302,52 @@ func TestNewAzblobStorage(t *testing.T) { require.Equal(t, "http://127.0.0.1:1000", b.serviceURL) } } + +type fakeClientBuilder struct { + Endpoint string +} + +func (b *fakeClientBuilder) GetServiceClient() (azblob.ServiceClient, error) { + connStr := fmt.Sprintf("DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=%s/devstoreaccount1;", b.Endpoint) + return azblob.NewServiceClientFromConnectionString(connStr, getDefaultClientOptions()) +} + +func (b *fakeClientBuilder) GetAccountName() string { + return "devstoreaccount1" +} + +func TestDownloadRetry(t *testing.T) { + var count int32 = 0 + var lock sync.Mutex + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + t.Log(r.URL) + if strings.Contains(r.URL.String(), "restype=container") { + w.WriteHeader(201) + return + } + lock.Lock() + count += 1 + lock.Unlock() + header := w.Header() + header.Add("Etag", "0x1") + header.Add("Content-Length", "5") + w.WriteHeader(200) + w.Write([]byte("1234567")) + })) + + defer server.Close() + t.Log(server.URL) + + options := &backuppb.AzureBlobStorage{ + Bucket: "test", + Prefix: "a/b/", + } + + ctx := context.Background() + builder := &fakeClientBuilder{Endpoint: server.URL} + s, err := newAzureBlobStorageWithClientBuilder(ctx, options, builder) + require.NoError(t, err) + _, err = s.ReadFile(ctx, "c") + require.Error(t, err) + require.Less(t, azblobRetryTimes, count) +} diff --git a/br/pkg/storage/compress.go b/br/pkg/storage/compress.go index 1d5300cfa8d55..36c07846f3271 100644 --- a/br/pkg/storage/compress.go +++ b/br/pkg/storage/compress.go @@ -80,8 +80,10 @@ func (w *withCompression) ReadFile(ctx context.Context, name string) ([]byte, er return io.ReadAll(compressBf) } +// compressReader is a wrapper for compress.Reader type compressReader struct { io.Reader + io.Seeker io.Closer } @@ -97,11 +99,30 @@ func newInterceptReader(fileReader ExternalFileReader, compressType CompressType return &compressReader{ Reader: r, Closer: fileReader, + Seeker: fileReader, }, nil } -func (*compressReader) Seek(_ int64, _ int) (int64, error) { - return int64(0), errors.Annotatef(berrors.ErrStorageInvalidConfig, "compressReader doesn't support Seek now") +func NewLimitedInterceptReader(fileReader ExternalFileReader, compressType CompressType, n int64) (ExternalFileReader, error) { + newFileReader := fileReader + if n < 0 { + return nil, errors.Annotatef(berrors.ErrStorageInvalidConfig, "compressReader doesn't support negative limit, n: %d", n) + } else if n > 0 { + newFileReader = &compressReader{ + Reader: io.LimitReader(fileReader, n), + Seeker: fileReader, + Closer: fileReader, + } + } + return newInterceptReader(newFileReader, compressType) +} + +func (c *compressReader) Seek(offset int64, whence int) (int64, error) { + // only support get original reader's current offset + if offset == 0 && whence == io.SeekCurrent { + return c.Seeker.Seek(offset, whence) + } + return int64(0), errors.Annotatef(berrors.ErrStorageInvalidConfig, "compressReader doesn't support Seek now, offset %d, whence %d", offset, whence) } func (c *compressReader) Close() error { diff --git a/br/pkg/storage/gcs.go b/br/pkg/storage/gcs.go index 063100a52ad59..ac5098ed16973 100644 --- a/br/pkg/storage/gcs.go +++ b/br/pkg/storage/gcs.go @@ -90,24 +90,36 @@ func (options *GCSBackendOptions) parseFromFlags(flags *pflag.FlagSet) error { return nil } -type gcsStorage struct { +// GCSStorage defines some standard operations for BR/Lightning on the GCS storage. +// It implements the `ExternalStorage` interface. +type GCSStorage struct { gcs *backuppb.GCS bucket *storage.BucketHandle } +// GetBucketHandle gets the handle to the GCS API on the bucket. +func (s *GCSStorage) GetBucketHandle() *storage.BucketHandle { + return s.bucket +} + +// GetOptions gets the external storage operations for the GCS. +func (s *GCSStorage) GetOptions() *backuppb.GCS { + return s.gcs +} + // DeleteFile delete the file in storage -func (s *gcsStorage) DeleteFile(ctx context.Context, name string) error { +func (s *GCSStorage) DeleteFile(ctx context.Context, name string) error { object := s.objectName(name) err := s.bucket.Object(object).Delete(ctx) return errors.Trace(err) } -func (s *gcsStorage) objectName(name string) string { +func (s *GCSStorage) objectName(name string) string { return path.Join(s.gcs.Prefix, name) } // WriteFile writes data to a file to storage. -func (s *gcsStorage) WriteFile(ctx context.Context, name string, data []byte) error { +func (s *GCSStorage) WriteFile(ctx context.Context, name string, data []byte) error { object := s.objectName(name) wc := s.bucket.Object(object).NewWriter(ctx) wc.StorageClass = s.gcs.StorageClass @@ -120,7 +132,7 @@ func (s *gcsStorage) WriteFile(ctx context.Context, name string, data []byte) er } // ReadFile reads the file from the storage and returns the contents. -func (s *gcsStorage) ReadFile(ctx context.Context, name string) ([]byte, error) { +func (s *GCSStorage) ReadFile(ctx context.Context, name string) ([]byte, error) { object := s.objectName(name) rc, err := s.bucket.Object(object).NewReader(ctx) if err != nil { @@ -143,7 +155,7 @@ func (s *gcsStorage) ReadFile(ctx context.Context, name string) ([]byte, error) } // FileExists return true if file exists. -func (s *gcsStorage) FileExists(ctx context.Context, name string) (bool, error) { +func (s *GCSStorage) FileExists(ctx context.Context, name string) (bool, error) { object := s.objectName(name) _, err := s.bucket.Object(object).Attrs(ctx) if err != nil { @@ -156,7 +168,7 @@ func (s *gcsStorage) FileExists(ctx context.Context, name string) (bool, error) } // Open a Reader by file path. -func (s *gcsStorage) Open(ctx context.Context, path string) (ExternalFileReader, error) { +func (s *GCSStorage) Open(ctx context.Context, path string) (ExternalFileReader, error) { object := s.objectName(path) handle := s.bucket.Object(object) @@ -182,7 +194,7 @@ func (s *gcsStorage) Open(ctx context.Context, path string) (ExternalFileReader, // The first argument is the file path that can be used in `Open` // function; the second argument is the size in byte of the file determined // by path. -func (s *gcsStorage) WalkDir(ctx context.Context, opt *WalkOption, fn func(string, int64) error) error { +func (s *GCSStorage) WalkDir(ctx context.Context, opt *WalkOption, fn func(string, int64) error) error { if opt == nil { opt = &WalkOption{} } @@ -221,12 +233,12 @@ func (s *gcsStorage) WalkDir(ctx context.Context, opt *WalkOption, fn func(strin return nil } -func (s *gcsStorage) URI() string { +func (s *GCSStorage) URI() string { return "gcs://" + s.gcs.Bucket + "/" + s.gcs.Prefix } // Create implements ExternalStorage interface. -func (s *gcsStorage) Create(ctx context.Context, name string) (ExternalFileWriter, error) { +func (s *GCSStorage) Create(ctx context.Context, name string) (ExternalFileWriter, error) { object := s.objectName(name) wc := s.bucket.Object(object).NewWriter(ctx) wc.StorageClass = s.gcs.StorageClass @@ -235,7 +247,7 @@ func (s *gcsStorage) Create(ctx context.Context, name string) (ExternalFileWrite } // Rename file name from oldFileName to newFileName. -func (s *gcsStorage) Rename(ctx context.Context, oldFileName, newFileName string) error { +func (s *GCSStorage) Rename(ctx context.Context, oldFileName, newFileName string) error { data, err := s.ReadFile(ctx, oldFileName) if err != nil { return errors.Trace(err) @@ -247,7 +259,8 @@ func (s *gcsStorage) Rename(ctx context.Context, oldFileName, newFileName string return s.DeleteFile(ctx, oldFileName) } -func newGCSStorage(ctx context.Context, gcs *backuppb.GCS, opts *ExternalStorageOptions) (*gcsStorage, error) { +// NewGCSStorage creates a GCS external storage implementation. +func NewGCSStorage(ctx context.Context, gcs *backuppb.GCS, opts *ExternalStorageOptions) (*GCSStorage, error) { var clientOps []option.ClientOption if opts.NoCredentials { clientOps = append(clientOps, option.WithoutAuthentication()) @@ -301,12 +314,7 @@ func newGCSStorage(ctx context.Context, gcs *backuppb.GCS, opts *ExternalStorage // so we need find sst in slash directory gcs.Prefix += "//" } - return &gcsStorage{gcs: gcs, bucket: bucket}, nil -} - -// only for unit test -func NewGCSStorageForTest(ctx context.Context, gcs *backuppb.GCS, opts *ExternalStorageOptions) (*gcsStorage, error) { - return newGCSStorage(ctx, gcs, opts) + return &GCSStorage{gcs: gcs, bucket: bucket}, nil } func hasSSTFiles(ctx context.Context, bucket *storage.BucketHandle, prefix string) bool { @@ -332,7 +340,7 @@ func hasSSTFiles(ctx context.Context, bucket *storage.BucketHandle, prefix strin // gcsObjectReader wrap storage.Reader and add the `Seek` method. type gcsObjectReader struct { - storage *gcsStorage + storage *GCSStorage name string objHandle *storage.ObjectHandle reader io.ReadCloser diff --git a/br/pkg/storage/gcs_test.go b/br/pkg/storage/gcs_test.go index 5801adccf04b7..daefb2bd686d3 100644 --- a/br/pkg/storage/gcs_test.go +++ b/br/pkg/storage/gcs_test.go @@ -32,7 +32,7 @@ func TestGCS(t *testing.T) { PredefinedAcl: "private", CredentialsBlob: "Fake Credentials", } - stg, err := newGCSStorage(ctx, gcs, &ExternalStorageOptions{ + stg, err := NewGCSStorage(ctx, gcs, &ExternalStorageOptions{ SendCredentials: false, CheckPermissions: []Permission{AccessBuckets}, HTTPClient: server.HTTPClient(), @@ -86,7 +86,7 @@ func TestGCS(t *testing.T) { require.NoError(t, err) require.False(t, exist) - checkWalkDir := func(stg *gcsStorage, opt *WalkOption) { + checkWalkDir := func(stg *GCSStorage, opt *WalkOption) { var totalSize int64 = 0 err = stg.WalkDir(ctx, opt, func(name string, size int64) error { totalSize += size @@ -112,7 +112,7 @@ func TestGCS(t *testing.T) { PredefinedAcl: "private", CredentialsBlob: "Fake Credentials", } - stg, err := newGCSStorage(ctx, gcs, &ExternalStorageOptions{ + stg, err := NewGCSStorage(ctx, gcs, &ExternalStorageOptions{ SendCredentials: false, CheckPermissions: []Permission{AccessBuckets}, HTTPClient: server.HTTPClient(), @@ -130,7 +130,7 @@ func TestGCS(t *testing.T) { PredefinedAcl: "private", CredentialsBlob: "Fake Credentials", } - stg, err := newGCSStorage(ctx, gcs, &ExternalStorageOptions{ + stg, err := NewGCSStorage(ctx, gcs, &ExternalStorageOptions{ SendCredentials: false, CheckPermissions: []Permission{AccessBuckets}, HTTPClient: server.HTTPClient(), @@ -147,7 +147,7 @@ func TestGCS(t *testing.T) { PredefinedAcl: "private", CredentialsBlob: "Fake Credentials", } - stg, err := newGCSStorage(ctx, gcs, &ExternalStorageOptions{ + stg, err := NewGCSStorage(ctx, gcs, &ExternalStorageOptions{ SendCredentials: false, CheckPermissions: []Permission{AccessBuckets}, HTTPClient: server.HTTPClient(), @@ -254,7 +254,7 @@ func TestNewGCSStorage(t *testing.T) { PredefinedAcl: "private", CredentialsBlob: "FakeCredentials", } - _, err := newGCSStorage(ctx, gcs, &ExternalStorageOptions{ + _, err := NewGCSStorage(ctx, gcs, &ExternalStorageOptions{ SendCredentials: true, CheckPermissions: []Permission{AccessBuckets}, HTTPClient: server.HTTPClient(), @@ -271,7 +271,7 @@ func TestNewGCSStorage(t *testing.T) { PredefinedAcl: "private", CredentialsBlob: "FakeCredentials", } - _, err := newGCSStorage(ctx, gcs, &ExternalStorageOptions{ + _, err := NewGCSStorage(ctx, gcs, &ExternalStorageOptions{ SendCredentials: false, CheckPermissions: []Permission{AccessBuckets}, HTTPClient: server.HTTPClient(), @@ -302,7 +302,7 @@ func TestNewGCSStorage(t *testing.T) { PredefinedAcl: "private", CredentialsBlob: "", } - _, err = newGCSStorage(ctx, gcs, &ExternalStorageOptions{ + _, err = NewGCSStorage(ctx, gcs, &ExternalStorageOptions{ SendCredentials: true, CheckPermissions: []Permission{AccessBuckets}, HTTPClient: server.HTTPClient(), @@ -333,7 +333,7 @@ func TestNewGCSStorage(t *testing.T) { PredefinedAcl: "private", CredentialsBlob: "", } - s, err := newGCSStorage(ctx, gcs, &ExternalStorageOptions{ + s, err := NewGCSStorage(ctx, gcs, &ExternalStorageOptions{ SendCredentials: false, CheckPermissions: []Permission{AccessBuckets}, HTTPClient: server.HTTPClient(), @@ -352,7 +352,7 @@ func TestNewGCSStorage(t *testing.T) { PredefinedAcl: "private", CredentialsBlob: "", } - _, err := newGCSStorage(ctx, gcs, &ExternalStorageOptions{ + _, err := NewGCSStorage(ctx, gcs, &ExternalStorageOptions{ SendCredentials: true, CheckPermissions: []Permission{AccessBuckets}, HTTPClient: server.HTTPClient(), @@ -368,7 +368,7 @@ func TestNewGCSStorage(t *testing.T) { PredefinedAcl: "private", CredentialsBlob: "FakeCredentials", } - s, err := newGCSStorage(ctx, gcs, &ExternalStorageOptions{ + s, err := NewGCSStorage(ctx, gcs, &ExternalStorageOptions{ SendCredentials: false, CheckPermissions: []Permission{AccessBuckets}, HTTPClient: server.HTTPClient(), diff --git a/br/pkg/storage/local.go b/br/pkg/storage/local.go index 68dc760cc1c9a..0259e715c7968 100644 --- a/br/pkg/storage/local.go +++ b/br/pkg/storage/local.go @@ -9,7 +9,10 @@ import ( "path/filepath" "strings" + "github.com/google/uuid" "github.com/pingcap/errors" + "github.com/pingcap/log" + "go.uber.org/zap" ) const ( @@ -36,9 +39,23 @@ func (l *LocalStorage) DeleteFile(_ context.Context, name string) error { func (l *LocalStorage) WriteFile(_ context.Context, name string, data []byte) error { // because `os.WriteFile` is not atomic, directly write into it may reset the file // to an empty file if write is not finished. - tmpPath := filepath.Join(l.base, name) + ".tmp" + tmpPath := filepath.Join(l.base, name) + ".tmp." + uuid.NewString() if err := os.WriteFile(tmpPath, data, localFilePerm); err != nil { - return errors.Trace(err) + path := filepath.Dir(tmpPath) + log.Info("failed to write file, try to mkdir the path", zap.String("path", path)) + exists, existErr := pathExists(path) + if existErr != nil { + return errors.Annotatef(err, "after failed to write file, failed to check path exists : %v", existErr) + } + if exists { + return errors.Trace(err) + } + if mkdirErr := mkdirAll(path); mkdirErr != nil { + return errors.Annotatef(err, "after failed to write file, failed to mkdir : %v", mkdirErr) + } + if err := os.WriteFile(tmpPath, data, localFilePerm); err != nil { + return errors.Trace(err) + } } if err := os.Rename(tmpPath, filepath.Join(l.base, name)); err != nil { return errors.Trace(err) diff --git a/br/pkg/storage/local_test.go b/br/pkg/storage/local_test.go index 82e7435ae29be..db1ba424b9d6b 100644 --- a/br/pkg/storage/local_test.go +++ b/br/pkg/storage/local_test.go @@ -9,6 +9,7 @@ import ( "runtime" "testing" + "github.com/pingcap/errors" "github.com/stretchr/testify/require" ) @@ -99,4 +100,30 @@ func TestWalkDirWithSoftLinkFile(t *testing.T) { }) require.NoError(t, err) require.Equal(t, 1, i) + + // test file not exists + exists, err := store.FileExists(context.TODO(), "/123/456") + require.NoError(t, err) + require.False(t, exists) + + // test walk nonexistent directory + err = store.WalkDir(context.TODO(), &WalkOption{SubDir: "123/456"}, func(path string, size int64) error { + return errors.New("find file") + }) + require.NoError(t, err) + // write file to a nonexistent directory + err = store.WriteFile(context.TODO(), "/123/456/789.txt", []byte(data)) + require.NoError(t, err) + exists, err = store.FileExists(context.TODO(), "/123/456") + require.NoError(t, err) + require.True(t, exists) + + // test walk existent directory + err = store.WalkDir(context.TODO(), &WalkOption{SubDir: "123/456"}, func(path string, size int64) error { + if path == "123/456/789.txt" { + return nil + } + return errors.Errorf("find other file: %s", path) + }) + require.NoError(t, err) } diff --git a/br/pkg/storage/memstore_test.go b/br/pkg/storage/memstore_test.go index a85a2ff467fa1..3ae9a08d168bc 100644 --- a/br/pkg/storage/memstore_test.go +++ b/br/pkg/storage/memstore_test.go @@ -17,7 +17,6 @@ import ( "bytes" "context" "io" - "io/ioutil" "sync" "testing" "time" @@ -70,7 +69,7 @@ func TestMemStoreBasic(t *testing.T) { require.Nil(t, err) r2, err := store.Open(ctx, "/hello.txt") require.Nil(t, err) - fileContent, err = ioutil.ReadAll(r) + fileContent, err = io.ReadAll(r) require.Nil(t, err) require.True(t, bytes.Equal([]byte("hello world 3"), fileContent)) require.Nil(t, r.Close()) @@ -83,7 +82,7 @@ func TestMemStoreBasic(t *testing.T) { _, err = r2.Seek(5, io.SeekStart) require.Nil(t, err) - fileContent, err = ioutil.ReadAll(r2) + fileContent, err = io.ReadAll(r2) require.Nil(t, err) require.True(t, bytes.Equal([]byte(" world 3"), fileContent)) diff --git a/br/pkg/storage/parse.go b/br/pkg/storage/parse.go index 39aa8743f6d53..05c586fb5c322 100644 --- a/br/pkg/storage/parse.go +++ b/br/pkg/storage/parse.go @@ -35,6 +35,12 @@ func ParseRawURL(rawURL string) (*url.URL, error) { return u, nil } +// ParseBackendFromURL constructs a structured backend description from the +// *url.URL. +func ParseBackendFromURL(u *url.URL, options *BackendOptions) (*backuppb.StorageBackend, error) { + return parseBackend(u, "", options) +} + // ParseBackend constructs a structured backend description from the // storage URL. func ParseBackend(rawURL string, options *BackendOptions) (*backuppb.StorageBackend, error) { @@ -45,6 +51,14 @@ func ParseBackend(rawURL string, options *BackendOptions) (*backuppb.StorageBack if err != nil { return nil, errors.Trace(err) } + return parseBackend(u, rawURL, options) +} + +func parseBackend(u *url.URL, rawURL string, options *BackendOptions) (*backuppb.StorageBackend, error) { + if rawURL == "" { + // try to handle hdfs for ParseBackendFromURL caller + rawURL = u.String() + } switch u.Scheme { case "": absPath, err := filepath.Abs(rawURL) diff --git a/br/pkg/storage/parse_test.go b/br/pkg/storage/parse_test.go index b9a5d75d29322..2dbeaabcb4386 100644 --- a/br/pkg/storage/parse_test.go +++ b/br/pkg/storage/parse_test.go @@ -69,14 +69,15 @@ func TestCreateStorage(t *testing.T) { require.Equal(t, "TestKey", s3.SseKmsKeyId) // special character in access keys - s, err = ParseBackend(`s3://bucket4/prefix/path?access-key=NXN7IPIOSAAKDEEOLMAF&secret-access-key=nREY/7Dt+PaIbYKrKlEEMMF/ExCiJEX=XMLPUANw`, nil) + s, err = ParseBackend(`s3://bucket4/prefix/path?access-key=******&secret-access-key=******+&session-token=******`, nil) require.NoError(t, err) s3 = s.GetS3() require.NotNil(t, s3) require.Equal(t, "bucket4", s3.Bucket) require.Equal(t, "prefix/path", s3.Prefix) - require.Equal(t, "NXN7IPIOSAAKDEEOLMAF", s3.AccessKey) - require.Equal(t, "nREY/7Dt+PaIbYKrKlEEMMF/ExCiJEX=XMLPUANw", s3.SecretAccessKey) + require.Equal(t, "******", s3.AccessKey) + require.Equal(t, "******+", s3.SecretAccessKey) + require.Equal(t, "******", s3.SessionToken) require.True(t, s3.ForcePathStyle) // parse role ARN and external ID diff --git a/br/pkg/storage/s3.go b/br/pkg/storage/s3.go index ff2cbae25d030..aa052ebccc9a5 100644 --- a/br/pkg/storage/s3.go +++ b/br/pkg/storage/s3.go @@ -68,13 +68,24 @@ var permissionCheckFn = map[Permission]func(*s3.S3, *backuppb.S3) error{ GetObject: getObject, } -// S3Storage info for s3 storage. +// S3Storage defines some standard operations for BR/Lightning on the S3 storage. +// It implements the `ExternalStorage` interface. type S3Storage struct { session *session.Session svc s3iface.S3API options *backuppb.S3 } +// GetS3APIHandle gets the handle to the S3 API. +func (rs *S3Storage) GetS3APIHandle() s3iface.S3API { + return rs.svc +} + +// GetOptions gets the external storage operations for the S3. +func (rs *S3Storage) GetOptions() *backuppb.S3 { + return rs.options +} + // S3Uploader does multi-part upload to s3. type S3Uploader struct { svc s3iface.S3API @@ -129,6 +140,7 @@ type S3BackendOptions struct { ACL string `json:"acl" toml:"acl"` AccessKey string `json:"access-key" toml:"access-key"` SecretAccessKey string `json:"secret-access-key" toml:"secret-access-key"` + SessionToken string `json:"session-token" toml:"session-token"` Provider string `json:"provider" toml:"provider"` ForcePathStyle bool `json:"force-path-style" toml:"force-path-style"` UseAccelerateEndpoint bool `json:"use-accelerate-endpoint" toml:"use-accelerate-endpoint"` @@ -173,6 +185,7 @@ func (options *S3BackendOptions) Apply(s3 *backuppb.S3) error { s3.Acl = options.ACL s3.AccessKey = options.AccessKey s3.SecretAccessKey = options.SecretAccessKey + s3.SessionToken = options.SessionToken s3.ForcePathStyle = options.ForcePathStyle s3.RoleArn = options.RoleARN s3.ExternalId = options.ExternalID @@ -248,23 +261,10 @@ func NewS3StorageForTest(svc s3iface.S3API, options *backuppb.S3) *S3Storage { } } -// NewS3Storage initialize a new s3 storage for metadata. -// -// Deprecated: Create the storage via `New()` instead of using this. -func NewS3Storage( // revive:disable-line:flag-parameter - backend *backuppb.S3, - sendCredential bool, -) (*S3Storage, error) { - return newS3Storage(backend, &ExternalStorageOptions{ - SendCredentials: sendCredential, - CheckPermissions: []Permission{AccessBuckets}, - }) -} - // auto access without ak / sk. func autoNewCred(qs *backuppb.S3) (cred *credentials.Credentials, err error) { if qs.AccessKey != "" && qs.SecretAccessKey != "" { - return credentials.NewStaticCredentials(qs.AccessKey, qs.SecretAccessKey, ""), nil + return credentials.NewStaticCredentials(qs.AccessKey, qs.SecretAccessKey, qs.SessionToken), nil } endpoint := qs.Endpoint // if endpoint is empty,return no error and run default(aws) follow. @@ -288,7 +288,8 @@ func createOssRAMCred() (*credentials.Credentials, error) { return credentials.NewStaticCredentials(ncred.AccessKeyId, ncred.AccessKeySecret, ncred.AccessKeyStsToken), nil } -func newS3Storage(backend *backuppb.S3, opts *ExternalStorageOptions) (obj *S3Storage, errRet error) { +// NewS3Storage initialize a new s3 storage for metadata. +func NewS3Storage(backend *backuppb.S3, opts *ExternalStorageOptions) (obj *S3Storage, errRet error) { qs := *backend awsConfig := aws.NewConfig(). WithS3ForcePathStyle(qs.ForcePathStyle). @@ -331,6 +332,7 @@ func newS3Storage(backend *backuppb.S3, opts *ExternalStorageOptions) (obj *S3St // Clear the credentials if exists so that they will not be sent to TiKV backend.AccessKey = "" backend.SecretAccessKey = "" + backend.SessionToken = "" } else if ses.Config.Credentials != nil { if qs.AccessKey == "" || qs.SecretAccessKey == "" { v, cerr := ses.Config.Credentials.Get() @@ -339,6 +341,7 @@ func newS3Storage(backend *backuppb.S3, opts *ExternalStorageOptions) (obj *S3St } backend.AccessKey = v.AccessKeyID backend.SecretAccessKey = v.SecretAccessKey + backend.SessionToken = v.SessionToken } } @@ -355,13 +358,18 @@ func newS3Storage(backend *backuppb.S3, opts *ExternalStorageOptions) (obj *S3St ) } c := s3.New(ses, s3CliConfigs...) - // s3manager.GetBucketRegionWithClient will set credential anonymous, which works with s3. - // we need reassign credential to be compatible with minio authentication. confCred := ses.Config.Credentials setCredOpt := func(req *request.Request) { + // s3manager.GetBucketRegionWithClient will set credential anonymous, which works with s3. + // we need reassign credential to be compatible with minio authentication. if confCred != nil { req.Config.Credentials = confCred } + // s3manager.GetBucketRegionWithClient use path style addressing default. + // we need set S3ForcePathStyle by our config if we set endpoint. + if qs.Endpoint != "" { + req.Config.S3ForcePathStyle = ses.Config.S3ForcePathStyle + } } region, err := s3manager.GetBucketRegionWithClient(context.Background(), c, qs.Bucket, setCredOpt) if err != nil { @@ -400,7 +408,7 @@ func newS3Storage(backend *backuppb.S3, opts *ExternalStorageOptions) (obj *S3St options: &qs, } if opts.CheckS3ObjectLockOptions { - backend.ObjectLockEnabled = s3Storage.isObjectLockEnabled() + backend.ObjectLockEnabled = s3Storage.IsObjectLockEnabled() } return s3Storage, nil } @@ -447,7 +455,7 @@ func getObject(svc *s3.S3, qs *backuppb.S3) error { return nil } -func (rs *S3Storage) isObjectLockEnabled() bool { +func (rs *S3Storage) IsObjectLockEnabled() bool { input := &s3.GetObjectLockConfigurationInput{ Bucket: aws.String(rs.options.Bucket), } @@ -456,8 +464,8 @@ func (rs *S3Storage) isObjectLockEnabled() bool { log.Warn("failed to check object lock for bucket", zap.String("bucket", rs.options.Bucket), zap.Error(err)) return false } - if resp.ObjectLockConfiguration != nil { - if s3.ObjectLockEnabledEnabled == *resp.ObjectLockConfiguration.ObjectLockEnabled { + if resp != nil && resp.ObjectLockConfiguration != nil { + if s3.ObjectLockEnabledEnabled == aws.StringValue(resp.ObjectLockConfiguration.ObjectLockEnabled) { return true } } diff --git a/br/pkg/storage/s3_test.go b/br/pkg/storage/s3_test.go index 3990e5eb82bc1..817e8f46f7f7d 100644 --- a/br/pkg/storage/s3_test.go +++ b/br/pkg/storage/s3_test.go @@ -144,6 +144,7 @@ func TestApplyUpdate(t *testing.T) { if test.setEnv { require.NoError(t, os.Setenv("AWS_ACCESS_KEY_ID", "ab")) require.NoError(t, os.Setenv("AWS_SECRET_ACCESS_KEY", "cd")) + require.NoError(t, os.Setenv("AWS_SESSION_TOKEN", "ef")) } u, err := ParseBackend("s3://bucket/prefix/", &BackendOptions{S3: test.options}) require.NoError(t, err) @@ -260,11 +261,13 @@ func TestApplyUpdate(t *testing.T) { Region: "us-west-2", AccessKey: "ab", SecretAccessKey: "cd", + SessionToken: "ef", }, s3: &backuppb.S3{ Region: "us-west-2", AccessKey: "ab", SecretAccessKey: "cd", + SessionToken: "ef", Bucket: "bucket", Prefix: "prefix", }, @@ -314,10 +317,11 @@ func TestS3Storage(t *testing.T) { { name: "no region", s3: &backuppb.S3{ - Region: "", - Endpoint: s.URL, - Bucket: "bucket", - Prefix: "prefix", + Region: "", + Endpoint: s.URL, + Bucket: "bucket", + Prefix: "prefix", + ForcePathStyle: true, }, errReturn: false, sendCredential: true, @@ -325,10 +329,11 @@ func TestS3Storage(t *testing.T) { { name: "wrong region", s3: &backuppb.S3{ - Region: "us-east-2", - Endpoint: s.URL, - Bucket: "bucket", - Prefix: "prefix", + Region: "us-east-2", + Endpoint: s.URL, + Bucket: "bucket", + Prefix: "prefix", + ForcePathStyle: true, }, errReturn: true, sendCredential: true, @@ -336,10 +341,11 @@ func TestS3Storage(t *testing.T) { { name: "right region", s3: &backuppb.S3{ - Region: "us-west-2", - Endpoint: s.URL, - Bucket: "bucket", - Prefix: "prefix", + Region: "us-west-2", + Endpoint: s.URL, + Bucket: "bucket", + Prefix: "prefix", + ForcePathStyle: true, }, errReturn: false, sendCredential: true, @@ -351,8 +357,10 @@ func TestS3Storage(t *testing.T) { Endpoint: s.URL, AccessKey: "ab", SecretAccessKey: "cd", + SessionToken: "ef", Bucket: "bucket", Prefix: "prefix", + ForcePathStyle: true, }, errReturn: false, sendCredential: true, @@ -365,6 +373,7 @@ func TestS3Storage(t *testing.T) { SecretAccessKey: "cd", Bucket: "bucket", Prefix: "prefix", + ForcePathStyle: true, }, errReturn: false, sendCredential: true, @@ -372,11 +381,12 @@ func TestS3Storage(t *testing.T) { { name: "no secret access key", s3: &backuppb.S3{ - Region: "us-west-2", - Endpoint: s.URL, - AccessKey: "ab", - Bucket: "bucket", - Prefix: "prefix", + Region: "us-west-2", + Endpoint: s.URL, + AccessKey: "ab", + Bucket: "bucket", + Prefix: "prefix", + ForcePathStyle: true, }, errReturn: false, sendCredential: true, @@ -384,11 +394,12 @@ func TestS3Storage(t *testing.T) { { name: "no secret access key", s3: &backuppb.S3{ - Region: "us-west-2", - Endpoint: s.URL, - AccessKey: "ab", - Bucket: "bucket", - Prefix: "prefix", + Region: "us-west-2", + Endpoint: s.URL, + AccessKey: "ab", + Bucket: "bucket", + Prefix: "prefix", + ForcePathStyle: true, }, errReturn: false, sendCredential: false, @@ -1105,10 +1116,12 @@ func TestWalkDirWithEmptyPrefix(t *testing.T) { func TestSendCreds(t *testing.T) { accessKey := "ab" secretAccessKey := "cd" + sessionToken := "ef" backendOpt := BackendOptions{ S3: S3BackendOptions{ AccessKey: accessKey, SecretAccessKey: secretAccessKey, + SessionToken: sessionToken, }, } backend, err := ParseBackend("s3://bucket/prefix/", &backendOpt) @@ -1121,12 +1134,15 @@ func TestSendCreds(t *testing.T) { sentAccessKey := backend.GetS3().AccessKey require.Equal(t, accessKey, sentAccessKey) sentSecretAccessKey := backend.GetS3().SecretAccessKey - require.Equal(t, sentSecretAccessKey, sentSecretAccessKey) + require.Equal(t, secretAccessKey, sentSecretAccessKey) + sentSessionToken := backend.GetS3().SessionToken + require.Equal(t, sessionToken, sentSessionToken) backendOpt = BackendOptions{ S3: S3BackendOptions{ AccessKey: accessKey, SecretAccessKey: secretAccessKey, + SessionToken: sessionToken, }, } backend, err = ParseBackend("s3://bucket/prefix/", &backendOpt) @@ -1140,4 +1156,51 @@ func TestSendCreds(t *testing.T) { require.Equal(t, "", sentAccessKey) sentSecretAccessKey = backend.GetS3().SecretAccessKey require.Equal(t, "", sentSecretAccessKey) + sentSessionToken = backend.GetS3().SessionToken + require.Equal(t, "", sentSessionToken) +} + +func TestObjectLock(t *testing.T) { + s := createS3Suite(t) + // resp is nil + s.s3.EXPECT().GetObjectLockConfiguration(gomock.Any()).Return(nil, nil) + require.Equal(t, false, s.storage.IsObjectLockEnabled()) + + // resp is not nil, but resp.ObjectLockConfiguration is nil + s.s3.EXPECT().GetObjectLockConfiguration(gomock.Any()).Return( + &s3.GetObjectLockConfigurationOutput{ + ObjectLockConfiguration: nil, + }, nil, + ) + require.Equal(t, false, s.storage.IsObjectLockEnabled()) + + // resp.ObjectLockConfiguration is not nil, but resp.ObjectLockConfiguration.ObjectLockEnabled is nil + s.s3.EXPECT().GetObjectLockConfiguration(gomock.Any()).Return( + &s3.GetObjectLockConfigurationOutput{ + ObjectLockConfiguration: &s3.ObjectLockConfiguration{ + ObjectLockEnabled: nil, + }, + }, nil, + ) + require.Equal(t, false, s.storage.IsObjectLockEnabled()) + + // resp.ObjectLockConfiguration.ObjectLockEnabled is illegal string + s.s3.EXPECT().GetObjectLockConfiguration(gomock.Any()).Return( + &s3.GetObjectLockConfigurationOutput{ + ObjectLockConfiguration: &s3.ObjectLockConfiguration{ + ObjectLockEnabled: aws.String("EnaBled"), + }, + }, nil, + ) + require.Equal(t, false, s.storage.IsObjectLockEnabled()) + + // resp.ObjectLockConfiguration.ObjectLockEnabled is enabled + s.s3.EXPECT().GetObjectLockConfiguration(gomock.Any()).Return( + &s3.GetObjectLockConfigurationOutput{ + ObjectLockConfiguration: &s3.ObjectLockConfiguration{ + ObjectLockEnabled: aws.String("Enabled"), + }, + }, nil, + ) + require.Equal(t, true, s.storage.IsObjectLockEnabled()) } diff --git a/br/pkg/storage/storage.go b/br/pkg/storage/storage.go index b73181e582158..1aa2df5f5e36a 100644 --- a/br/pkg/storage/storage.go +++ b/br/pkg/storage/storage.go @@ -158,6 +158,9 @@ func Create(ctx context.Context, backend *backuppb.StorageBackend, sendCreds boo // New creates an ExternalStorage with options. func New(ctx context.Context, backend *backuppb.StorageBackend, opts *ExternalStorageOptions) (ExternalStorage, error) { + if opts == nil { + opts = &ExternalStorageOptions{} + } switch backend := backend.Backend.(type) { case *backuppb.StorageBackend_Local: if backend.Local == nil { @@ -173,14 +176,14 @@ func New(ctx context.Context, backend *backuppb.StorageBackend, opts *ExternalSt if backend.S3 == nil { return nil, errors.Annotate(berrors.ErrStorageInvalidConfig, "s3 config not found") } - return newS3Storage(backend.S3, opts) + return NewS3Storage(backend.S3, opts) case *backuppb.StorageBackend_Noop: return newNoopStorage(), nil case *backuppb.StorageBackend_Gcs: if backend.Gcs == nil { return nil, errors.Annotate(berrors.ErrStorageInvalidConfig, "GCS config not found") } - return newGCSStorage(ctx, backend.Gcs, opts) + return NewGCSStorage(ctx, backend.Gcs, opts) case *backuppb.StorageBackend_AzureBlobStorage: return newAzureBlobStorage(ctx, backend.AzureBlobStorage, opts) default: diff --git a/br/pkg/stream/BUILD.bazel b/br/pkg/stream/BUILD.bazel index f75f9f37d81ea..e5fbc5c87b870 100644 --- a/br/pkg/stream/BUILD.bazel +++ b/br/pkg/stream/BUILD.bazel @@ -56,8 +56,11 @@ go_test( "//br/pkg/storage", "//br/pkg/streamhelper", "//meta", + "//parser/ast", "//parser/model", + "//parser/mysql", "//tablecodec", + "//types", "//util/codec", "//util/table-filter", "@com_github_pingcap_kvproto//pkg/brpb", diff --git a/br/pkg/stream/meta_kv.go b/br/pkg/stream/meta_kv.go index 9d054f0bef454..fb7c2f79f17d1 100644 --- a/br/pkg/stream/meta_kv.go +++ b/br/pkg/stream/meta_kv.go @@ -111,15 +111,34 @@ const ( flagShortValuePrefix = byte('v') flagOverlappedRollback = byte('R') flagGCFencePrefix = byte('F') + flagLastChangePrefix = byte('l') + flagTxnSourcePrefix = byte('S') ) +// RawWriteCFValue represents the value in write columnFamily. +// Detail see line: https://github.com/tikv/tikv/blob/release-6.5/components/txn_types/src/write.rs#L70 type RawWriteCFValue struct { t WriteType startTs uint64 shortValue []byte hasOverlappedRollback bool - hasGCFence bool - gcFence uint64 + + // Records the next version after this version when overlapping rollback + // happens on an already existed commit record. + // + // See [`Write::gc_fence`] for more detail. + hasGCFence bool + gcFence uint64 + + // The number of versions that need skipping from this record + // to find the latest PUT/DELETE record. + // If versions_to_last_change > 0 but last_change_ts == 0, the key does not + // have a PUT/DELETE record before this write record. + lastChangeTs uint64 + versionsToLastChange uint64 + + // The source of this txn. + txnSource uint64 } // ParseFrom decodes the value to get the struct `RawWriteCFValue`. @@ -146,6 +165,10 @@ l_for: switch data[0] { case flagShortValuePrefix: vlen := data[1] + if len(data[2:]) < int(vlen) { + return errors.Annotatef(berrors.ErrInvalidArgument, + "the length of short value is invalid, vlen: %v", int(vlen)) + } v.shortValue = data[2 : vlen+2] data = data[vlen+2:] case flagOverlappedRollback: @@ -157,6 +180,20 @@ l_for: if err != nil { return errors.Annotate(berrors.ErrInvalidArgument, "decode gc fence failed") } + case flagLastChangePrefix: + data, v.lastChangeTs, err = codec.DecodeUint(data[1:]) + if err != nil { + return errors.Annotate(berrors.ErrInvalidArgument, "decode last change ts failed") + } + data, v.versionsToLastChange, err = codec.DecodeUvarint(data) + if err != nil { + return errors.Annotate(berrors.ErrInvalidArgument, "decode versions to last change failed") + } + case flagTxnSourcePrefix: + data, v.txnSource, err = codec.DecodeUvarint(data[1:]) + if err != nil { + return errors.Annotate(berrors.ErrInvalidArgument, "decode txn source failed") + } default: break l_for } @@ -164,6 +201,16 @@ l_for: return nil } +// IsRollback checks whether the value in cf is a `rollback` record. +func (v *RawWriteCFValue) IsRollback() bool { + return v.GetWriteType() == WriteTypeRollback +} + +// IsRollback checks whether the value in cf is a `delete` record. +func (v *RawWriteCFValue) IsDelete() bool { + return v.GetWriteType() == WriteTypeDelete +} + // HasShortValue checks whether short value is stored in write cf. func (v *RawWriteCFValue) HasShortValue() bool { return len(v.shortValue) > 0 @@ -204,5 +251,14 @@ func (v *RawWriteCFValue) EncodeTo() []byte { data = append(data, flagGCFencePrefix) data = codec.EncodeUint(data, v.gcFence) } + if v.lastChangeTs > 0 || v.versionsToLastChange > 0 { + data = append(data, flagLastChangePrefix) + data = codec.EncodeUint(data, v.lastChangeTs) + data = codec.EncodeUvarint(data, v.versionsToLastChange) + } + if v.txnSource > 0 { + data = append(data, flagTxnSourcePrefix) + data = codec.EncodeUvarint(data, v.txnSource) + } return data } diff --git a/br/pkg/stream/meta_kv_test.go b/br/pkg/stream/meta_kv_test.go index eaebf64526243..7a8c5e4fed8b6 100644 --- a/br/pkg/stream/meta_kv_test.go +++ b/br/pkg/stream/meta_kv_test.go @@ -68,29 +68,49 @@ func TestWriteType(t *testing.T) { } func TestWriteCFValueNoShortValue(t *testing.T) { + var ( + ts uint64 = 400036290571534337 + txnSource uint64 = 9527 + ) + buff := make([]byte, 0, 9) - buff = append(buff, byte('P')) - buff = codec.EncodeUvarint(buff, 400036290571534337) + buff = append(buff, WriteTypePut) + buff = codec.EncodeUvarint(buff, ts) + buff = append(buff, flagTxnSourcePrefix) + buff = codec.EncodeUvarint(buff, txnSource) v := new(RawWriteCFValue) err := v.ParseFrom(buff) require.NoError(t, err) + require.False(t, v.IsDelete()) + require.False(t, v.IsRollback()) require.False(t, v.HasShortValue()) + require.False(t, v.hasGCFence) + require.Equal(t, v.lastChangeTs, uint64(0)) + require.Equal(t, v.versionsToLastChange, uint64(0)) + require.Equal(t, v.txnSource, txnSource) encodedBuff := v.EncodeTo() require.True(t, bytes.Equal(buff, encodedBuff)) } func TestWriteCFValueWithShortValue(t *testing.T) { - var ts uint64 = 400036290571534337 - shortValue := []byte("pingCAP") + var ( + ts uint64 = 400036290571534337 + shortValue = []byte("pingCAP") + lastChangeTs uint64 = 9527 + versionsToLastChange uint64 = 95271 + ) buff := make([]byte, 0, 9) - buff = append(buff, byte('P')) + buff = append(buff, WriteTypePut) buff = codec.EncodeUvarint(buff, ts) buff = append(buff, flagShortValuePrefix) buff = append(buff, byte(len(shortValue))) buff = append(buff, shortValue...) + buff = append(buff, flagLastChangePrefix) + buff = codec.EncodeUint(buff, lastChangeTs) + buff = codec.EncodeUvarint(buff, versionsToLastChange) v := new(RawWriteCFValue) err := v.ParseFrom(buff) @@ -99,7 +119,78 @@ func TestWriteCFValueWithShortValue(t *testing.T) { require.True(t, bytes.Equal(v.GetShortValue(), shortValue)) require.False(t, v.hasGCFence) require.False(t, v.hasOverlappedRollback) + require.Equal(t, v.lastChangeTs, lastChangeTs) + require.Equal(t, v.versionsToLastChange, versionsToLastChange) + require.Equal(t, v.txnSource, uint64(0)) data := v.EncodeTo() require.True(t, bytes.Equal(data, buff)) } + +func TestWriteCFValueWithRollback(t *testing.T) { + var ( + ts uint64 = 400036290571534337 + protectedRollbackShortValue = []byte{'P'} + ) + + buff := make([]byte, 0, 9) + buff = append(buff, WriteTypeRollback) + buff = codec.EncodeUvarint(buff, ts) + buff = append(buff, flagShortValuePrefix, byte(len(protectedRollbackShortValue))) + buff = append(buff, protectedRollbackShortValue...) + + v := new(RawWriteCFValue) + err := v.ParseFrom(buff) + require.NoError(t, err) + require.True(t, v.IsRollback()) + require.True(t, v.HasShortValue()) + require.Equal(t, v.GetShortValue(), protectedRollbackShortValue) + require.Equal(t, v.startTs, ts) + require.Equal(t, v.lastChangeTs, uint64(0)) + require.Equal(t, v.versionsToLastChange, uint64(0)) + require.Equal(t, v.txnSource, uint64(0)) + + data := v.EncodeTo() + require.Equal(t, data, buff) +} + +func TestWriteCFValueWithDelete(t *testing.T) { + var ts uint64 = 400036290571534337 + buff := make([]byte, 0, 9) + buff = append(buff, byte('D')) + buff = codec.EncodeUvarint(buff, ts) + + v := new(RawWriteCFValue) + err := v.ParseFrom(buff) + require.NoError(t, err) + require.True(t, v.IsDelete()) + require.False(t, v.HasShortValue()) + + data := v.EncodeTo() + require.Equal(t, data, buff) +} + +func TestWriteCFValueWithGcFence(t *testing.T) { + var ( + ts uint64 = 400036290571534337 + gcFence uint64 = 9527 + ) + + buff := make([]byte, 0, 9) + buff = append(buff, WriteTypePut) + buff = codec.EncodeUvarint(buff, ts) + buff = append(buff, flagOverlappedRollback) + buff = append(buff, flagGCFencePrefix) + buff = codec.EncodeUint(buff, gcFence) + + v := new(RawWriteCFValue) + err := v.ParseFrom(buff) + require.NoError(t, err) + require.Equal(t, v.startTs, ts) + require.True(t, v.hasGCFence) + require.Equal(t, v.gcFence, gcFence) + require.True(t, v.hasOverlappedRollback) + + data := v.EncodeTo() + require.Equal(t, data, buff) +} diff --git a/br/pkg/stream/rewrite_meta_rawkv.go b/br/pkg/stream/rewrite_meta_rawkv.go index 40e76a6130358..3c559ec124ad8 100644 --- a/br/pkg/stream/rewrite_meta_rawkv.go +++ b/br/pkg/stream/rewrite_meta_rawkv.go @@ -336,6 +336,11 @@ func (sr *SchemasReplace) rewriteTableInfo(value []byte, dbID int64) ([]byte, bo } } + // Force to disable TTL_ENABLE when restore + if newTableInfo.TTLInfo != nil { + newTableInfo.TTLInfo.Enable = false + } + if sr.AfterTableRewritten != nil { sr.AfterTableRewritten(false, newTableInfo) } @@ -451,13 +456,20 @@ func (sr *SchemasReplace) rewriteValueV2(value []byte, cf string, rewrite func([ return rewriteResult{}, errors.Trace(err) } - if rawWriteCFValue.t == WriteTypeDelete { + if rawWriteCFValue.IsDelete() { return rewriteResult{ NewValue: value, NeedRewrite: true, Deleted: true, }, nil } + if rawWriteCFValue.IsRollback() { + return rewriteResult{ + NewValue: value, + NeedRewrite: true, + Deleted: false, + }, nil + } if !rawWriteCFValue.HasShortValue() { return rewriteResult{ NewValue: value, @@ -467,6 +479,9 @@ func (sr *SchemasReplace) rewriteValueV2(value []byte, cf string, rewrite func([ shortValue, needWrite, err := rewrite(rawWriteCFValue.GetShortValue()) if err != nil { + log.Info("failed to rewrite short value", + zap.ByteString("write-type", []byte{rawWriteCFValue.GetWriteType()}), + zap.Int("short-value-len", len(rawWriteCFValue.GetShortValue()))) return rewriteResult{}, errors.Trace(err) } if !needWrite { diff --git a/br/pkg/stream/rewrite_meta_rawkv_test.go b/br/pkg/stream/rewrite_meta_rawkv_test.go index d2cbe24e8295d..cd3cf00d46305 100644 --- a/br/pkg/stream/rewrite_meta_rawkv_test.go +++ b/br/pkg/stream/rewrite_meta_rawkv_test.go @@ -7,7 +7,10 @@ import ( "encoding/json" "testing" + "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/types" filter "github.com/pingcap/tidb/util/table-filter" "github.com/stretchr/testify/require" ) @@ -312,6 +315,52 @@ func TestRewriteValueForExchangePartition(t *testing.T) { require.Equal(t, tableInfo.ID, pt1ID+100) } +func TestRewriteValueForTTLTable(t *testing.T) { + var ( + dbId int64 = 40 + tableID int64 = 100 + colID int64 = 1000 + colName = "t" + tableName = "t1" + tableInfo model.TableInfo + ) + + tbl := model.TableInfo{ + ID: tableID, + Name: model.NewCIStr(tableName), + Columns: []*model.ColumnInfo{ + { + ID: colID, + Name: model.NewCIStr(colName), + FieldType: *types.NewFieldType(mysql.TypeTimestamp), + }, + }, + TTLInfo: &model.TTLInfo{ + ColumnName: model.NewCIStr(colName), + IntervalExprStr: "1", + IntervalTimeUnit: int(ast.TimeUnitDay), + Enable: true, + }, + } + value, err := json.Marshal(&tbl) + require.Nil(t, err) + + sr := MockEmptySchemasReplace(nil) + newValue, needRewrite, err := sr.rewriteTableInfo(value, dbId) + require.Nil(t, err) + require.True(t, needRewrite) + + err = json.Unmarshal(newValue, &tableInfo) + require.Nil(t, err) + require.Equal(t, tableInfo.Name.String(), tableName) + require.Equal(t, tableInfo.ID, sr.DbMap[dbId].TableMap[tableID].NewTableID) + require.NotNil(t, tableInfo.TTLInfo) + require.Equal(t, colName, tableInfo.TTLInfo.ColumnName.O) + require.Equal(t, "1", tableInfo.TTLInfo.IntervalExprStr) + require.Equal(t, int(ast.TimeUnitDay), tableInfo.TTLInfo.IntervalTimeUnit) + require.False(t, tableInfo.TTLInfo.Enable) +} + // db:70->80 - // | - t0:71->81 - // | | - p0:72->82 diff --git a/br/pkg/stream/stream_mgr.go b/br/pkg/stream/stream_mgr.go index 61c3e6772a431..5ee184ba04f03 100644 --- a/br/pkg/stream/stream_mgr.go +++ b/br/pkg/stream/stream_mgr.go @@ -312,7 +312,6 @@ func FastUnmarshalMetaData( } readPath := path pool.ApplyOnErrorGroup(eg, func() error { - log.Info("fast read meta file from storage", zap.String("path", readPath)) b, err := s.ReadFile(ectx, readPath) if err != nil { log.Error("failed to read file", zap.String("file", readPath)) diff --git a/br/pkg/streamhelper/BUILD.bazel b/br/pkg/streamhelper/BUILD.bazel index 93e13b1f8d543..0275b61592a1c 100644 --- a/br/pkg/streamhelper/BUILD.bazel +++ b/br/pkg/streamhelper/BUILD.bazel @@ -9,10 +9,10 @@ go_library( "advancer_env.go", "client.go", "collector.go", + "flush_subscriber.go", "models.go", "prefix_scanner.go", "regioniter.go", - "tsheap.go", ], importpath = "github.com/pingcap/tidb/br/pkg/streamhelper", visibility = ["//visibility:public"], @@ -21,17 +21,20 @@ go_library( "//br/pkg/logutil", "//br/pkg/redact", "//br/pkg/streamhelper/config", + "//br/pkg/streamhelper/spans", "//br/pkg/utils", "//config", "//kv", "//metrics", "//owner", + "//util/codec", + "//util/engine", "//util/mathutil", "@com_github_gogo_protobuf//proto", "@com_github_golang_protobuf//proto", - "@com_github_google_btree//:btree", "@com_github_google_uuid//:uuid", "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/brpb", "@com_github_pingcap_kvproto//pkg/logbackuppb", "@com_github_pingcap_kvproto//pkg/metapb", @@ -41,10 +44,12 @@ go_library( "@com_github_tikv_pd_client//:client", "@io_etcd_go_etcd_client_v3//:client", "@org_golang_google_grpc//:grpc", + "@org_golang_google_grpc//codes", "@org_golang_google_grpc//keepalive", + "@org_golang_google_grpc//status", "@org_golang_x_sync//errgroup", + "@org_uber_go_multierr//:multierr", "@org_uber_go_zap//:zap", - "@org_uber_go_zap//zapcore", ], ) @@ -56,7 +61,7 @@ go_test( "basic_lib_for_test.go", "integration_test.go", "regioniter_test.go", - "tsheap_test.go", + "subscription_test.go", ], flaky = True, race = "on", @@ -68,10 +73,13 @@ go_test( "//br/pkg/redact", "//br/pkg/storage", "//br/pkg/streamhelper/config", + "//br/pkg/streamhelper/spans", "//br/pkg/utils", "//kv", "//tablecodec", + "//util/codec", "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/brpb", "@com_github_pingcap_kvproto//pkg/errorpb", "@com_github_pingcap_kvproto//pkg/logbackuppb", @@ -84,6 +92,7 @@ go_test( "@io_etcd_go_etcd_server_v3//mvcc", "@org_golang_google_grpc//:grpc", "@org_golang_google_grpc//codes", + "@org_golang_google_grpc//metadata", "@org_golang_google_grpc//status", "@org_uber_go_zap//:zap", "@org_uber_go_zap//zapcore", diff --git a/br/pkg/streamhelper/advancer.go b/br/pkg/streamhelper/advancer.go index ac01c5167ffc7..33c0e0898b66f 100644 --- a/br/pkg/streamhelper/advancer.go +++ b/br/pkg/streamhelper/advancer.go @@ -3,11 +3,7 @@ package streamhelper import ( - "bytes" "context" - "math" - "reflect" - "sort" "strings" "sync" "time" @@ -17,10 +13,12 @@ import ( "github.com/pingcap/log" "github.com/pingcap/tidb/br/pkg/logutil" "github.com/pingcap/tidb/br/pkg/streamhelper/config" + "github.com/pingcap/tidb/br/pkg/streamhelper/spans" "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" "github.com/tikv/client-go/v2/oracle" + "go.uber.org/multierr" "go.uber.org/zap" "golang.org/x/sync/errgroup" ) @@ -60,81 +58,31 @@ type CheckpointAdvancer struct { // once tick begin, this should not be changed for now. cfg config.Config - // the cache of region checkpoints. - // so we can advance only ranges with huge gap. - cache CheckpointsCache - - // the internal state of advancer. - state advancerState // the cached last checkpoint. // if no progress, this cache can help us don't to send useless requests. lastCheckpoint uint64 -} -// advancerState is the sealed type for the state of advancer. -// the advancer has two stage: full scan and update small tree. -type advancerState interface { - // Note: - // Go doesn't support sealed classes or ADTs currently. - // (it can only be used at generic constraints...) - // Leave it empty for now. - - // ~*fullScan | ~*updateSmallTree -} + checkpoints *spans.ValueSortedFull + checkpointsMu sync.Mutex -// fullScan is the initial state of advancer. -// in this stage, we would "fill" the cache: -// insert ranges that union of them become the full range of task. -type fullScan struct { - fullScanTick int -} - -// updateSmallTree is the "incremental stage" of advancer. -// we have build a "filled" cache, and we can pop a subrange of it, -// try to advance the checkpoint of those ranges. -type updateSmallTree struct { - consistencyCheckTick int + subscriber *FlushSubscriber + subscriberMu sync.Mutex } // NewCheckpointAdvancer creates a checkpoint advancer with the env. func NewCheckpointAdvancer(env Env) *CheckpointAdvancer { return &CheckpointAdvancer{ - env: env, - cfg: config.Default(), - cache: NewCheckpoints(), - state: &fullScan{}, + env: env, + cfg: config.Default(), } } -// disableCache removes the cache. -// note this won't lock the checkpoint advancer at `fullScan` state forever, -// you may need to change the config `AdvancingByCache`. -func (c *CheckpointAdvancer) disableCache() { - c.cache = NoOPCheckpointCache{} - c.state = &fullScan{} -} - -// enable the cache. -// also check `AdvancingByCache` in the config. -func (c *CheckpointAdvancer) enableCache() { - c.cache = NewCheckpoints() - c.state = &fullScan{} -} - // UpdateConfig updates the config for the advancer. // Note this should be called before starting the loop, because there isn't locks, // TODO: support updating config when advancer starts working. // (Maybe by applying changes at begin of ticking, and add locks.) func (c *CheckpointAdvancer) UpdateConfig(newConf config.Config) { - needRefreshCache := newConf.AdvancingByCache != c.cfg.AdvancingByCache c.cfg = newConf - if needRefreshCache { - if c.cfg.AdvancingByCache { - c.enableCache() - } else { - c.disableCache() - } - } } // UpdateConfigWith updates the config by modifying the current config. @@ -161,7 +109,7 @@ func (c *CheckpointAdvancer) GetCheckpointInRange(ctx context.Context, start, en } log.Debug("scan region", zap.Int("len", len(rs))) for _, r := range rs { - err := collector.collectRegion(r) + err := collector.CollectRegion(r) if err != nil { log.Warn("meet error during getting checkpoint", logutil.ShortError(err)) return err @@ -183,28 +131,24 @@ func (c *CheckpointAdvancer) recordTimeCost(message string, fields ...zap.Field) } // tryAdvance tries to advance the checkpoint ts of a set of ranges which shares the same checkpoint. -func (c *CheckpointAdvancer) tryAdvance(ctx context.Context, rst RangesSharesTS) (err error) { - defer c.recordTimeCost("try advance", zap.Uint64("checkpoint", rst.TS), zap.Int("len", len(rst.Ranges)))() - defer func() { - if err != nil { - log.Warn("failed to advance", logutil.ShortError(err), zap.Object("target", rst.Zap())) - c.cache.InsertRanges(rst) - } - }() +func (c *CheckpointAdvancer) tryAdvance(ctx context.Context, length int, getRange func(int) kv.KeyRange) (err error) { + defer c.recordTimeCost("try advance", zap.Int("len", length))() defer utils.PanicToErr(&err) - ranges := CollapseRanges(len(rst.Ranges), func(i int) kv.KeyRange { - return rst.Ranges[i] - }) - workers := utils.NewWorkerPool(4, "sub ranges") + ranges := spans.Collapse(length, getRange) + workers := utils.NewWorkerPool(uint(config.DefaultMaxConcurrencyAdvance)*4, "sub ranges") eg, cx := errgroup.WithContext(ctx) collector := NewClusterCollector(ctx, c.env) - collector.setOnSuccessHook(c.cache.InsertRange) + collector.SetOnSuccessHook(func(u uint64, kr kv.KeyRange) { + c.checkpointsMu.Lock() + defer c.checkpointsMu.Unlock() + c.checkpoints.Merge(spans.Valued{Key: kr, Value: u}) + }) clampedRanges := utils.IntersectAll(ranges, utils.CloneSlice(c.taskRange)) for _, r := range clampedRanges { r := r workers.ApplyOnErrorGroup(eg, func() (e error) { - defer c.recordTimeCost("get regions in range", zap.Uint64("checkpoint", rst.TS))() + defer c.recordTimeCost("get regions in range")() defer utils.PanicToErr(&e) return c.GetCheckpointInRange(cx, r.StartKey, r.EndKey, collector) }) @@ -214,121 +158,47 @@ func (c *CheckpointAdvancer) tryAdvance(ctx context.Context, rst RangesSharesTS) return err } - result, err := collector.Finish(ctx) + _, err = collector.Finish(ctx) if err != nil { return err } - fr := result.FailureSubRanges - if len(fr) != 0 { - log.Debug("failure regions collected", zap.Int("size", len(fr))) - c.cache.InsertRanges(RangesSharesTS{ - TS: rst.TS, - Ranges: fr, - }) - } return nil } -// CalculateGlobalCheckpointLight tries to advance the global checkpoint by the cache. -func (c *CheckpointAdvancer) CalculateGlobalCheckpointLight(ctx context.Context) (uint64, error) { - log.Info("[log backup advancer hint] advancer with cache: current tree", zap.Stringer("ct", c.cache)) - rsts := c.cache.PopRangesWithGapGT(config.DefaultTryAdvanceThreshold) - if len(rsts) == 0 { - return 0, nil +func tsoBefore(n time.Duration) uint64 { + now := time.Now() + return oracle.ComposeTS(now.UnixMilli()-n.Milliseconds(), 0) +} + +func (c *CheckpointAdvancer) CalculateGlobalCheckpointLight(ctx context.Context, threshold time.Duration) (uint64, error) { + var targets []spans.Valued + c.checkpoints.TraverseValuesLessThan(tsoBefore(threshold), func(v spans.Valued) bool { + targets = append(targets, v) + return true + }) + if len(targets) == 0 { + c.checkpointsMu.Lock() + defer c.checkpointsMu.Unlock() + return c.checkpoints.MinValue(), nil } - samples := rsts - if len(rsts) > 3 { - samples = rsts[:3] + samples := targets + if len(targets) > 3 { + samples = targets[:3] } for _, sample := range samples { - log.Info("[log backup advancer hint] sample range.", zap.Object("range", sample.Zap()), zap.Int("total-len", len(rsts))) + log.Info("[log backup advancer hint] sample range.", zap.Stringer("sample", sample), zap.Int("total-len", len(targets))) } - workers := utils.NewWorkerPool(uint(config.DefaultMaxConcurrencyAdvance), "regions") - eg, cx := errgroup.WithContext(ctx) - for _, rst := range rsts { - rst := rst - workers.ApplyOnErrorGroup(eg, func() (err error) { - return c.tryAdvance(cx, *rst) - }) - } - err := eg.Wait() + err := c.tryAdvance(ctx, len(targets), func(i int) kv.KeyRange { return targets[i].Key }) if err != nil { return 0, err } - ts := c.cache.CheckpointTS() + c.checkpointsMu.Lock() + ts := c.checkpoints.MinValue() + c.checkpointsMu.Unlock() return ts, nil } -// CalculateGlobalCheckpoint calculates the global checkpoint, which won't use the cache. -func (c *CheckpointAdvancer) CalculateGlobalCheckpoint(ctx context.Context) (uint64, error) { - var ( - cp = uint64(math.MaxInt64) - thisRun []kv.KeyRange = c.taskRange - nextRun []kv.KeyRange - ) - defer c.recordTimeCost("record all") - for { - coll := NewClusterCollector(ctx, c.env) - coll.setOnSuccessHook(c.cache.InsertRange) - for _, u := range thisRun { - err := c.GetCheckpointInRange(ctx, u.StartKey, u.EndKey, coll) - if err != nil { - return 0, err - } - } - result, err := coll.Finish(ctx) - if err != nil { - return 0, err - } - log.Debug("full: a run finished", zap.Any("checkpoint", result)) - - nextRun = append(nextRun, result.FailureSubRanges...) - if cp > result.Checkpoint { - cp = result.Checkpoint - } - if len(nextRun) == 0 { - return cp, nil - } - thisRun = nextRun - nextRun = nil - log.Debug("backoffing with subranges", zap.Int("subranges", len(thisRun))) - time.Sleep(c.cfg.BackoffTime) - } -} - -// CollapseRanges collapse ranges overlapping or adjacent. -// Example: -// CollapseRanges({[1, 4], [2, 8], [3, 9]}) == {[1, 9]} -// CollapseRanges({[1, 3], [4, 7], [2, 3]}) == {[1, 3], [4, 7]} -func CollapseRanges(length int, getRange func(int) kv.KeyRange) []kv.KeyRange { - frs := make([]kv.KeyRange, 0, length) - for i := 0; i < length; i++ { - frs = append(frs, getRange(i)) - } - - sort.Slice(frs, func(i, j int) bool { - return bytes.Compare(frs[i].StartKey, frs[j].StartKey) < 0 - }) - - result := make([]kv.KeyRange, 0, len(frs)) - i := 0 - for i < len(frs) { - item := frs[i] - for { - i++ - if i >= len(frs) || (len(item.EndKey) != 0 && bytes.Compare(frs[i].StartKey, item.EndKey) > 0) { - break - } - if len(item.EndKey) != 0 && bytes.Compare(item.EndKey, frs[i].EndKey) < 0 || len(frs[i].EndKey) == 0 { - item.EndKey = frs[i].EndKey - } - } - result = append(result, item) - } - return result -} - func (c *CheckpointAdvancer) consumeAllTask(ctx context.Context, ch <-chan TaskEvent) error { for { select { @@ -392,14 +262,16 @@ func (c *CheckpointAdvancer) StartTaskListener(ctx context.Context) { return case e, ok := <-ch: if !ok { + log.Info("[log backup advancer] Task watcher exits due to stream ends.") return } - log.Info("meet task event", zap.Stringer("event", &e)) + log.Info("[log backup advancer] Meet task event", zap.Stringer("event", &e)) if err := c.onTaskEvent(ctx, e); err != nil { if errors.Cause(e.Err) != context.Canceled { log.Error("listen task meet error, would reopen.", logutil.ShortError(err)) time.AfterFunc(c.cfg.BackoffTime, func() { c.StartTaskListener(ctx) }) } + log.Info("[log backup advancer] Task watcher exits due to some error.", logutil.ShortError(err)) return } } @@ -414,24 +286,42 @@ func (c *CheckpointAdvancer) onTaskEvent(ctx context.Context, e TaskEvent) error case EventAdd: utils.LogBackupTaskCountInc() c.task = e.Info - c.taskRange = CollapseRanges(len(e.Ranges), func(i int) kv.KeyRange { return e.Ranges[i] }) + c.taskRange = spans.Collapse(len(e.Ranges), func(i int) kv.KeyRange { return e.Ranges[i] }) + c.checkpoints = spans.Sorted(spans.NewFullWith(e.Ranges, 0)) + c.lastCheckpoint = e.Info.StartTs log.Info("added event", zap.Stringer("task", e.Info), zap.Stringer("ranges", logutil.StringifyKeys(c.taskRange))) case EventDel: utils.LogBackupTaskCountDec() c.task = nil c.taskRange = nil - c.state = &fullScan{} + c.checkpoints = nil + // This would be synced by `taskMu`, perhaps we'd better rename that to `tickMu`. + // Do the null check because some of test cases won't equip the advancer with subscriber. + if c.subscriber != nil { + c.subscriber.Clear() + } if err := c.env.ClearV3GlobalCheckpointForTask(ctx, e.Name); err != nil { log.Warn("failed to clear global checkpoint", logutil.ShortError(err)) } metrics.LastCheckpoint.DeleteLabelValues(e.Name) - c.cache.Clear() case EventErr: return e.Err } return nil } +func (c *CheckpointAdvancer) setCheckpoint(cp uint64) bool { + if cp < c.lastCheckpoint { + log.Warn("failed to update global checkpoint: stale", zap.Uint64("old", c.lastCheckpoint), zap.Uint64("new", cp)) + return false + } + if cp <= c.lastCheckpoint { + return false + } + c.lastCheckpoint = cp + return true +} + // advanceCheckpointBy advances the checkpoint by a checkpoint getter function. func (c *CheckpointAdvancer) advanceCheckpointBy(ctx context.Context, getCheckpoint func(context.Context) (uint64, error)) error { start := time.Now() @@ -439,79 +329,111 @@ func (c *CheckpointAdvancer) advanceCheckpointBy(ctx context.Context, getCheckpo if err != nil { return err } - log.Info("get checkpoint", zap.Uint64("old", c.lastCheckpoint), zap.Uint64("new", cp)) - if cp < c.lastCheckpoint { - log.Warn("failed to update global checkpoint: stale", zap.Uint64("old", c.lastCheckpoint), zap.Uint64("new", cp)) + + if c.setCheckpoint(cp) { + log.Info("uploading checkpoint for task", + zap.Stringer("checkpoint", oracle.GetTimeFromTS(cp)), + zap.Uint64("checkpoint", cp), + zap.String("task", c.task.Name), + zap.Stringer("take", time.Since(start))) + metrics.LastCheckpoint.WithLabelValues(c.task.GetName()).Set(float64(c.lastCheckpoint)) } - if cp <= c.lastCheckpoint { + return nil +} + +func (c *CheckpointAdvancer) stopSubscriber() { + c.subscriberMu.Lock() + defer c.subscriberMu.Unlock() + c.subscriber.Drop() + c.subscriber = nil +} + +func (c *CheckpointAdvancer) spawnSubscriptionHandler(ctx context.Context) { + c.subscriberMu.Lock() + defer c.subscriberMu.Unlock() + c.subscriber = NewSubscriber(c.env, c.env, WithMasterContext(ctx)) + es := c.subscriber.Events() + + go func() { + for { + select { + case <-ctx.Done(): + return + case event, ok := <-es: + if !ok { + return + } + c.checkpointsMu.Lock() + log.Debug("Accepting region flush event.", + zap.Stringer("range", logutil.StringifyRange(event.Key)), + zap.Uint64("checkpoint", event.Value)) + c.checkpoints.Merge(event) + c.checkpointsMu.Unlock() + } + } + }() +} + +func (c *CheckpointAdvancer) subscribeTick(ctx context.Context) error { + if c.subscriber == nil { return nil } + if err := c.subscriber.UpdateStoreTopology(ctx); err != nil { + log.Warn("[log backup advancer] Error when updating store topology.", logutil.ShortError(err)) + } + c.subscriber.HandleErrors(ctx) + return c.subscriber.PendingErrors() +} - log.Info("uploading checkpoint for task", - zap.Stringer("checkpoint", oracle.GetTimeFromTS(cp)), - zap.Uint64("checkpoint", cp), - zap.String("task", c.task.Name), - zap.Stringer("take", time.Since(start))) - if err := c.env.UploadV3GlobalCheckpointForTask(ctx, c.task.Name, cp); err != nil { +func (c *CheckpointAdvancer) importantTick(ctx context.Context) error { + c.checkpointsMu.Lock() + c.setCheckpoint(c.checkpoints.MinValue()) + c.checkpointsMu.Unlock() + if err := c.env.UploadV3GlobalCheckpointForTask(ctx, c.task.Name, c.lastCheckpoint); err != nil { return errors.Annotate(err, "failed to upload global checkpoint") } - c.lastCheckpoint = cp - metrics.LastCheckpoint.WithLabelValues(c.task.GetName()).Set(float64(c.lastCheckpoint)) return nil } -func (c *CheckpointAdvancer) onConsistencyCheckTick(s *updateSmallTree) error { - if s.consistencyCheckTick > 0 { - s.consistencyCheckTick-- - return nil +func (c *CheckpointAdvancer) optionalTick(cx context.Context) error { + threshold := c.Config().GetDefaultStartPollThreshold() + if err := c.subscribeTick(cx); err != nil { + log.Warn("[log backup advancer] Subscriber meet error, would polling the checkpoint.", logutil.ShortError(err)) + threshold = c.Config().GetSubscriberErrorStartPollThreshold() } - defer c.recordTimeCost("consistency check")() - err := c.cache.ConsistencyCheck(c.taskRange) + + err := c.advanceCheckpointBy(cx, func(cx context.Context) (uint64, error) { + return c.CalculateGlobalCheckpointLight(cx, threshold) + }) if err != nil { - log.Error("consistency check failed! log backup may lose data! rolling back to full scan for saving.", logutil.ShortError(err)) - c.state = &fullScan{} return err } - log.Debug("consistency check passed.") - s.consistencyCheckTick = config.DefaultConsistencyCheckTick return nil } func (c *CheckpointAdvancer) tick(ctx context.Context) error { c.taskMu.Lock() defer c.taskMu.Unlock() + if c.task == nil { + log.Debug("No tasks yet, skipping advancing.") + return nil + } - switch s := c.state.(type) { - case *fullScan: - if s.fullScanTick > 0 { - s.fullScanTick-- - break - } - if c.task == nil { - log.Debug("No tasks yet, skipping advancing.") - return nil - } - defer func() { - s.fullScanTick = c.cfg.FullScanTick - }() - err := c.advanceCheckpointBy(ctx, c.CalculateGlobalCheckpoint) - if err != nil { - return err - } + var errs error - if c.cfg.AdvancingByCache { - c.state = &updateSmallTree{} - } - case *updateSmallTree: - if err := c.onConsistencyCheckTick(s); err != nil { - return err - } - err := c.advanceCheckpointBy(ctx, c.CalculateGlobalCheckpointLight) - if err != nil { - return err - } - default: - log.Error("Unknown state type, skipping tick", zap.Stringer("type", reflect.TypeOf(c.state))) + cx, cancel := context.WithTimeout(ctx, c.Config().TickTimeout()) + defer cancel() + err := c.optionalTick(cx) + if err != nil { + log.Warn("[log backup advancer] option tick failed.", logutil.ShortError(err)) + errs = multierr.Append(errs, err) } - return nil + + err = c.importantTick(ctx) + if err != nil { + log.Warn("[log backup advancer] important tick failed.", logutil.ShortError(err)) + errs = multierr.Append(errs, err) + } + + return errs } diff --git a/br/pkg/streamhelper/advancer_cliext.go b/br/pkg/streamhelper/advancer_cliext.go index 611ad3744dfa8..f3d7e1f279d5f 100644 --- a/br/pkg/streamhelper/advancer_cliext.go +++ b/br/pkg/streamhelper/advancer_cliext.go @@ -5,15 +5,22 @@ package streamhelper import ( "bytes" "context" + "encoding/binary" "fmt" + "io" "strings" "github.com/golang/protobuf/proto" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" backuppb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/log" berrors "github.com/pingcap/tidb/br/pkg/errors" + "github.com/pingcap/tidb/br/pkg/logutil" + "github.com/pingcap/tidb/br/pkg/redact" "github.com/pingcap/tidb/kv" clientv3 "go.etcd.io/etcd/client/v3" + "go.uber.org/zap" ) type EventType int @@ -90,6 +97,9 @@ func (t AdvancerExt) toTaskEvent(ctx context.Context, event *clientv3.Event) (Ta func (t AdvancerExt) eventFromWatch(ctx context.Context, resp clientv3.WatchResponse) ([]TaskEvent, error) { result := make([]TaskEvent, 0, len(resp.Events)) + if err := resp.Err(); err != nil { + return nil, err + } for _, event := range resp.Events { te, err := t.toTaskEvent(ctx, event) if err != nil { @@ -106,6 +116,7 @@ func (t AdvancerExt) startListen(ctx context.Context, rev int64, ch chan<- TaskE handleResponse := func(resp clientv3.WatchResponse) bool { events, err := t.eventFromWatch(ctx, resp) if err != nil { + log.Warn("[log backup advancer] Meet error during receiving the task event.", logutil.ShortError(err)) ch <- errorEvent(err) return false } @@ -114,33 +125,44 @@ func (t AdvancerExt) startListen(ctx context.Context, rev int64, ch chan<- TaskE } return true } + collectRemaining := func() { + log.Info("[log backup advancer] Start collecting remaining events in the channel.", zap.Int("remained", len(c))) + defer log.Info("[log backup advancer] Finish collecting remaining events in the channel.") + for { + select { + case resp, ok := <-c: + if !ok { + return + } + if !handleResponse(resp) { + return + } + default: + return + } + } + } go func() { defer close(ch) for { select { case resp, ok := <-c: + failpoint.Inject("advancer_close_channel", func() { + // We cannot really close the channel, just simulating it. + ok = false + }) if !ok { + ch <- errorEvent(io.EOF) return } if !handleResponse(resp) { return } case <-ctx.Done(): - // drain the remain event from channel. - for { - select { - case resp, ok := <-c: - if !ok { - return - } - if !handleResponse(resp) { - return - } - default: - return - } - } + collectRemaining() + ch <- errorEvent(ctx.Err()) + return } } }() @@ -181,11 +203,43 @@ func (t AdvancerExt) Begin(ctx context.Context, ch chan<- TaskEvent) error { return nil } +func (t AdvancerExt) GetGlobalCheckpointForTask(ctx context.Context, taskName string) (uint64, error) { + key := GlobalCheckpointOf(taskName) + resp, err := t.KV.Get(ctx, key) + if err != nil { + return 0, err + } + + if len(resp.Kvs) == 0 { + return 0, nil + } + + firstKV := resp.Kvs[0] + value := firstKV.Value + if len(value) != 8 { + return 0, errors.Annotatef(berrors.ErrPiTRMalformedMetadata, + "the global checkpoint isn't 64bits (it is %d bytes, value = %s)", + len(value), + redact.Key(value)) + } + + return binary.BigEndian.Uint64(value), nil +} + func (t AdvancerExt) UploadV3GlobalCheckpointForTask(ctx context.Context, taskName string, checkpoint uint64) error { key := GlobalCheckpointOf(taskName) value := string(encodeUint64(checkpoint)) - _, err := t.KV.Put(ctx, key, value) + oldValue, err := t.GetGlobalCheckpointForTask(ctx, taskName) + if err != nil { + return err + } + + if checkpoint < oldValue { + log.Warn("[log backup advancer] skipping upload global checkpoint", zap.Uint64("old", oldValue), zap.Uint64("new", checkpoint)) + return nil + } + _, err = t.KV.Put(ctx, key, value) if err != nil { return err } diff --git a/br/pkg/streamhelper/advancer_daemon.go b/br/pkg/streamhelper/advancer_daemon.go index 263d3a761b518..10f43e105ccbe 100644 --- a/br/pkg/streamhelper/advancer_daemon.go +++ b/br/pkg/streamhelper/advancer_daemon.go @@ -30,6 +30,7 @@ func (c *CheckpointAdvancer) OnTick(ctx context.Context) (err error) { func (c *CheckpointAdvancer) OnStart(ctx context.Context) { metrics.AdvancerOwner.Set(1.0) c.StartTaskListener(ctx) + c.spawnSubscriptionHandler(ctx) go func() { <-ctx.Done() c.onStop() @@ -43,6 +44,7 @@ func (c *CheckpointAdvancer) Name() string { func (c *CheckpointAdvancer) onStop() { metrics.AdvancerOwner.Set(0.0) + c.stopSubscriber() } func OwnerManagerForLogBackup(ctx context.Context, etcdCli *clientv3.Client) owner.Manager { diff --git a/br/pkg/streamhelper/advancer_env.go b/br/pkg/streamhelper/advancer_env.go index 181d8933449d4..cf27fda7d5c5b 100644 --- a/br/pkg/streamhelper/advancer_env.go +++ b/br/pkg/streamhelper/advancer_env.go @@ -9,6 +9,7 @@ import ( logbackup "github.com/pingcap/kvproto/pkg/logbackuppb" "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/util/engine" pd "github.com/tikv/pd/client" clientv3 "go.etcd.io/etcd/client/v3" "google.golang.org/grpc" @@ -18,7 +19,7 @@ import ( // Env is the interface required by the advancer. type Env interface { // The region scanner provides the region information. - RegionScanner + TiKVClusterMeta // LogBackupService connects to the TiKV, so we can collect the region checkpoints. LogBackupService // StreamMeta connects to the metadata service (normally PD). @@ -48,6 +49,23 @@ func (c PDRegionScanner) RegionScan(ctx context.Context, key []byte, endKey []by return rls, nil } +func (c PDRegionScanner) Stores(ctx context.Context) ([]Store, error) { + res, err := c.Client.GetAllStores(ctx, pd.WithExcludeTombstone()) + if err != nil { + return nil, err + } + r := make([]Store, 0, len(res)) + for _, re := range res { + if !engine.IsTiFlash(re) { + r = append(r, Store{ + BootAt: uint64(re.StartTimestamp), + ID: re.GetId(), + }) + } + } + return r, nil +} + // clusterEnv is the environment for running in the real cluster. type clusterEnv struct { clis *utils.StoreManager diff --git a/br/pkg/streamhelper/advancer_test.go b/br/pkg/streamhelper/advancer_test.go index aeaadf820af7a..7dd4c71d35b9c 100644 --- a/br/pkg/streamhelper/advancer_test.go +++ b/br/pkg/streamhelper/advancer_test.go @@ -9,6 +9,8 @@ import ( "testing" "time" + "github.com/pingcap/errors" + logbackup "github.com/pingcap/kvproto/pkg/logbackuppb" "github.com/pingcap/log" "github.com/pingcap/tidb/br/pkg/streamhelper" "github.com/pingcap/tidb/br/pkg/streamhelper/config" @@ -51,9 +53,6 @@ func TestTick(t *testing.T) { env := &testEnv{fakeCluster: c, testCtx: t} adv := streamhelper.NewCheckpointAdvancer(env) adv.StartTaskListener(ctx) - adv.UpdateConfigWith(func(cac *config.Config) { - cac.FullScanTick = 0 - }) require.NoError(t, adv.OnTick(ctx)) for i := 0; i < 5; i++ { cp := c.advanceCheckpoints() @@ -76,9 +75,6 @@ func TestWithFailure(t *testing.T) { env := &testEnv{fakeCluster: c, testCtx: t} adv := streamhelper.NewCheckpointAdvancer(env) adv.StartTaskListener(ctx) - adv.UpdateConfigWith(func(cac *config.Config) { - cac.FullScanTick = 0 - }) require.NoError(t, adv.OnTick(ctx)) cp := c.advanceCheckpoints() @@ -226,3 +222,36 @@ func TestTaskRangesWithSplit(t *testing.T) { shouldFinishInTime(t, 10*time.Second, "second advancing", func() { require.NoError(t, adv.OnTick(ctx)) }) require.Greater(t, env.getCheckpoint(), fstCheckpoint) } + +func TestBlocked(t *testing.T) { + log.SetLevel(zapcore.DebugLevel) + c := createFakeCluster(t, 4, true) + ctx := context.Background() + req := require.New(t) + c.splitAndScatter("0012", "0034", "0048") + marked := false + for _, s := range c.stores { + s.clientMu.Lock() + s.onGetRegionCheckpoint = func(glftrr *logbackup.GetLastFlushTSOfRegionRequest) error { + // blocking the thread. + // this may happen when TiKV goes down or too busy. + <-(chan struct{})(nil) + return nil + } + s.clientMu.Unlock() + marked = true + } + req.True(marked, "failed to mark the cluster: ") + env := &testEnv{fakeCluster: c, testCtx: t} + adv := streamhelper.NewCheckpointAdvancer(env) + adv.StartTaskListener(ctx) + adv.UpdateConfigWith(func(c *config.Config) { + // ... So the tick timeout would be 100ms + c.TickDuration = 10 * time.Millisecond + }) + var err error + shouldFinishInTime(t, time.Second, "ticking", func() { + err = adv.OnTick(ctx) + }) + req.ErrorIs(errors.Cause(err), context.DeadlineExceeded) +} diff --git a/br/pkg/streamhelper/basic_lib_for_test.go b/br/pkg/streamhelper/basic_lib_for_test.go index 9e438c32f0f1f..1dff77dd72864 100644 --- a/br/pkg/streamhelper/basic_lib_for_test.go +++ b/br/pkg/streamhelper/basic_lib_for_test.go @@ -7,6 +7,7 @@ import ( "context" "encoding/hex" "fmt" + "io" "math" "math/rand" "sort" @@ -21,10 +22,15 @@ import ( "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/log" "github.com/pingcap/tidb/br/pkg/streamhelper" + "github.com/pingcap/tidb/br/pkg/streamhelper/spans" "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/util/codec" "go.uber.org/zap" "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" ) type flushSimulator struct { @@ -58,7 +64,7 @@ func (c *flushSimulator) fork() flushSimulator { } type region struct { - rng kv.KeyRange + rng spans.Span leader uint64 epoch uint64 id uint64 @@ -70,6 +76,12 @@ type region struct { type fakeStore struct { id uint64 regions map[uint64]*region + + clientMu sync.Mutex + supportsSub bool + bootstrapAt uint64 + fsub func(logbackup.SubscribeFlushEventResponse) + onGetRegionCheckpoint func(*logbackup.GetLastFlushTSOfRegionRequest) error } type fakeCluster struct { @@ -82,16 +94,6 @@ type fakeCluster struct { onGetClient func(uint64) error } -func overlaps(a, b kv.KeyRange) bool { - if len(b.EndKey) == 0 { - return len(a.EndKey) == 0 || bytes.Compare(a.EndKey, b.StartKey) > 0 - } - if len(a.EndKey) == 0 { - return len(b.EndKey) == 0 || bytes.Compare(b.EndKey, a.StartKey) > 0 - } - return bytes.Compare(a.StartKey, b.EndKey) < 0 && bytes.Compare(b.StartKey, a.EndKey) < 0 -} - func (r *region) splitAt(newID uint64, k string) *region { newRegion := ®ion{ rng: kv.KeyRange{StartKey: []byte(k), EndKey: r.rng.EndKey}, @@ -111,7 +113,84 @@ func (r *region) flush() { r.fsim.flushedEpoch.Store(r.epoch) } +type trivialFlushStream struct { + c <-chan logbackup.SubscribeFlushEventResponse + cx context.Context +} + +func (t trivialFlushStream) Recv() (*logbackup.SubscribeFlushEventResponse, error) { + select { + case item, ok := <-t.c: + if !ok { + return nil, io.EOF + } + return &item, nil + case <-t.cx.Done(): + select { + case item, ok := <-t.c: + if !ok { + return nil, io.EOF + } + return &item, nil + default: + } + return nil, status.Error(codes.Canceled, t.cx.Err().Error()) + } +} + +func (t trivialFlushStream) Header() (metadata.MD, error) { + return make(metadata.MD), nil +} + +func (t trivialFlushStream) Trailer() metadata.MD { + return make(metadata.MD) +} + +func (t trivialFlushStream) CloseSend() error { + return nil +} + +func (t trivialFlushStream) Context() context.Context { + return t.cx +} + +func (t trivialFlushStream) SendMsg(m interface{}) error { + return nil +} + +func (t trivialFlushStream) RecvMsg(m interface{}) error { + return nil +} + +func (f *fakeStore) SubscribeFlushEvent(ctx context.Context, in *logbackup.SubscribeFlushEventRequest, opts ...grpc.CallOption) (logbackup.LogBackup_SubscribeFlushEventClient, error) { + f.clientMu.Lock() + defer f.clientMu.Unlock() + if !f.supportsSub { + return nil, status.Error(codes.Unimplemented, "meow?") + } + + ch := make(chan logbackup.SubscribeFlushEventResponse, 1024) + f.fsub = func(glftrr logbackup.SubscribeFlushEventResponse) { + ch <- glftrr + } + return trivialFlushStream{c: ch, cx: ctx}, nil +} + +func (f *fakeStore) SetSupportFlushSub(b bool) { + f.clientMu.Lock() + defer f.clientMu.Unlock() + + f.bootstrapAt += 1 + f.supportsSub = b +} + func (f *fakeStore) GetLastFlushTSOfRegion(ctx context.Context, in *logbackup.GetLastFlushTSOfRegionRequest, opts ...grpc.CallOption) (*logbackup.GetLastFlushTSOfRegionResponse, error) { + if f.onGetRegionCheckpoint != nil { + err := f.onGetRegionCheckpoint(in) + if err != nil { + return nil, err + } + } resp := &logbackup.GetLastFlushTSOfRegionResponse{ Checkpoints: []*logbackup.RegionCheckpoint{}, } @@ -174,7 +253,7 @@ func (f *fakeCluster) RegionScan(ctx context.Context, key []byte, endKey []byte, result := make([]streamhelper.RegionWithLeader, 0, limit) for _, region := range f.regions { - if overlaps(kv.KeyRange{StartKey: key, EndKey: endKey}, region.rng) && len(result) < limit { + if spans.Overlaps(kv.KeyRange{StartKey: key, EndKey: endKey}, region.rng) && len(result) < limit { regionInfo := streamhelper.RegionWithLeader{ Region: &metapb.Region{ Id: region.id, @@ -210,6 +289,15 @@ func (f *fakeCluster) GetLogBackupClient(ctx context.Context, storeID uint64) (l return cli, nil } +// Stores returns the store metadata from the cluster. +func (f *fakeCluster) Stores(ctx context.Context) ([]streamhelper.Store, error) { + r := make([]streamhelper.Store, 0, len(f.stores)) + for id, s := range f.stores { + r = append(r, streamhelper.Store{ID: id, BootAt: s.bootstrapAt}) + } + return r, nil +} + func (f *fakeCluster) findRegionById(rid uint64) *region { for _, r := range f.regions { if r.id == rid { @@ -304,6 +392,34 @@ func (f *fakeCluster) splitAndScatter(keys ...string) { } } +// Remove a store. +// Note: this won't add new peer for regions from the store. +func (f *fakeCluster) removeStore(id uint64) { + f.mu.Lock() + defer f.mu.Unlock() + + s := f.stores[id] + for _, r := range s.regions { + if r.leader == id { + f.updateRegion(r.id, func(r *region) { + ps := f.findPeers(r.id) + for _, p := range ps { + if p != r.leader { + log.Info("remove store: transforming leader", + zap.Uint64("region", r.id), + zap.Uint64("new-leader", p), + zap.Uint64("old-leader", r.leader)) + r.leader = p + break + } + } + }) + } + } + + delete(f.stores, id) +} + // a stub once in the future we want to make different stores hold different region instances. func (f *fakeCluster) updateRegion(rid uint64, mut func(*region)) { r := f.findRegionById(rid) @@ -362,7 +478,7 @@ func createFakeCluster(t *testing.T, n int, simEnabled bool) *fakeCluster { } func (r *region) String() string { - return fmt.Sprintf("%d(%d):[%s,%s);%dL%dF%d", + return fmt.Sprintf("%d(%d):[%s, %s);%dL%dF%d", r.id, r.epoch, hex.EncodeToString(r.rng.StartKey), @@ -382,14 +498,24 @@ func (f *fakeStore) String() string { } func (f *fakeCluster) flushAll() { - for _, r := range f.regions { + for _, r := range f.stores { r.flush() } } func (f *fakeCluster) flushAllExcept(keys ...string) { + for _, s := range f.stores { + s.flushExcept(keys...) + } +} + +func (f *fakeStore) flushExcept(keys ...string) { + resp := make([]*logbackup.FlushEvent, 0, len(f.regions)) outer: for _, r := range f.regions { + if r.leader != f.id { + continue + } // Note: can we make it faster? for _, key := range keys { if utils.CompareBytesExt(r.rng.StartKey, false, []byte(key), false) <= 0 && @@ -397,16 +523,25 @@ outer: continue outer } } - r.flush() - } -} - -func (f *fakeStore) flush() { - for _, r := range f.regions { if r.leader == f.id { r.flush() + resp = append(resp, &logbackup.FlushEvent{ + StartKey: codec.EncodeBytes(nil, r.rng.StartKey), + EndKey: codec.EncodeBytes(nil, r.rng.EndKey), + Checkpoint: r.checkpoint.Load(), + }) } } + + if f.fsub != nil { + f.fsub(logbackup.SubscribeFlushEventResponse{ + Events: resp, + }) + } +} + +func (f *fakeStore) flush() { + f.flushExcept() } func (f *fakeCluster) String() string { diff --git a/br/pkg/streamhelper/client.go b/br/pkg/streamhelper/client.go index 4b52f590dce21..3a004fc80d3e1 100644 --- a/br/pkg/streamhelper/client.go +++ b/br/pkg/streamhelper/client.go @@ -163,6 +163,8 @@ func (c *MetaDataClient) DeleteTask(ctx context.Context, taskName string) error clientv3.OpDelete(CheckPointsOf(taskName), clientv3.WithPrefix()), clientv3.OpDelete(Pause(taskName)), clientv3.OpDelete(LastErrorPrefixOf(taskName), clientv3.WithPrefix()), + clientv3.OpDelete(GlobalCheckpointOf(taskName)), + clientv3.OpDelete(StorageCheckpointOf(taskName), clientv3.WithPrefix()), ). Commit() if err != nil { @@ -372,28 +374,6 @@ func (t *Task) GetStorageCheckpoint(ctx context.Context) (uint64, error) { return storageCheckpoint, nil } -// MinNextBackupTS query the all next backup ts of a store, returning the minimal next backup ts of the store. -func (t *Task) MinNextBackupTS(ctx context.Context, store uint64) (uint64, error) { - key := CheckPointOf(t.Info.Name, store) - resp, err := t.cli.KV.Get(ctx, key) - if err != nil { - return 0, errors.Annotatef(err, "failed to get checkpoints of %s", t.Info.Name) - } - if resp.Count != 1 { - return 0, nil - } - kv := resp.Kvs[0] - if len(kv.Value) != 8 { - return 0, errors.Annotatef(berrors.ErrPiTRMalformedMetadata, - "the next backup ts of store %d isn't 64bits (it is %d bytes, value = %s)", - store, - len(kv.Value), - redact.Key(kv.Value)) - } - nextBackupTS := binary.BigEndian.Uint64(kv.Value) - return nextBackupTS, nil -} - // GetGlobalCheckPointTS gets the global checkpoint timestamp according to log task. func (t *Task) GetGlobalCheckPointTS(ctx context.Context) (uint64, error) { checkPointMap, err := t.NextBackupTSList(ctx) @@ -422,16 +402,6 @@ func (t *Task) GetGlobalCheckPointTS(ctx context.Context) (uint64, error) { return mathutil.Max(checkpoint, ts), nil } -// Step forwards the progress (next_backup_ts) of some region. -// The task should be done by TiKV. This function should only be used for test cases. -func (t *Task) Step(ctx context.Context, store uint64, ts uint64) error { - _, err := t.cli.KV.Put(ctx, CheckPointOf(t.Info.Name, store), string(encodeUint64(ts))) - if err != nil { - return errors.Annotatef(err, "failed forward the progress of %s to %d", t.Info.Name, ts) - } - return nil -} - func (t *Task) UploadGlobalCheckpoint(ctx context.Context, ts uint64) error { _, err := t.cli.KV.Put(ctx, GlobalCheckpointOf(t.Info.Name), string(encodeUint64(ts))) if err != nil { diff --git a/br/pkg/streamhelper/collector.go b/br/pkg/streamhelper/collector.go index ad53acb03b577..bc9285e05e8a8 100644 --- a/br/pkg/streamhelper/collector.go +++ b/br/pkg/streamhelper/collector.go @@ -266,13 +266,13 @@ func NewClusterCollector(ctx context.Context, srv LogBackupService) *clusterColl } } -// setOnSuccessHook sets the hook when getting checkpoint of some region. -func (c *clusterCollector) setOnSuccessHook(hook onSuccessHook) { +// SetOnSuccessHook sets the hook when getting checkpoint of some region. +func (c *clusterCollector) SetOnSuccessHook(hook onSuccessHook) { c.onSuccess = hook } -// collectRegion adds a region to the collector. -func (c *clusterCollector) collectRegion(r RegionWithLeader) error { +// CollectRegion adds a region to the collector. +func (c *clusterCollector) CollectRegion(r RegionWithLeader) error { c.mu.Lock() defer c.mu.Unlock() if c.masterCtx.Err() != nil { diff --git a/br/pkg/streamhelper/config/advancer_conf.go b/br/pkg/streamhelper/config/advancer_conf.go index 548ea2472b172..1440a81f932f9 100644 --- a/br/pkg/streamhelper/config/advancer_conf.go +++ b/br/pkg/streamhelper/config/advancer_conf.go @@ -9,13 +9,14 @@ import ( ) const ( - flagBackoffTime = "backoff-time" - flagTickInterval = "tick-interval" - flagFullScanDiffTick = "full-scan-tick" - flagAdvancingByCache = "advancing-by-cache" + flagBackoffTime = "backoff-time" + flagTickInterval = "tick-interval" + flagFullScanDiffTick = "full-scan-tick" + flagAdvancingByCache = "advancing-by-cache" + flagTryAdvanceThreshold = "try-advance-threshold" DefaultConsistencyCheckTick = 5 - DefaultTryAdvanceThreshold = 108 * time.Second + DefaultTryAdvanceThreshold = 4 * time.Minute DefaultBackOffTime = 5 * time.Second DefaultTickInterval = 12 * time.Second DefaultFullScanTick = 4 @@ -31,27 +32,21 @@ type Config struct { BackoffTime time.Duration `toml:"backoff-time" json:"backoff-time"` // The gap between calculating checkpoints. TickDuration time.Duration `toml:"tick-interval" json:"tick-interval"` - // The backoff time of full scan. - FullScanTick int `toml:"full-scan-tick" json:"full-scan-tick"` - - // Whether enable the optimization -- use a cached heap to advancing the global checkpoint. - // This may reduce the gap of checkpoint but may cost more CPU. - AdvancingByCache bool `toml:"advancing-by-cache" json:"advancing-by-cache"` + // The threshold for polling TiKV for checkpoint of some range. + TryAdvanceThreshold time.Duration `toml:"try-advance-threshold" json:"try-advance-threshold"` } func DefineFlagsForCheckpointAdvancerConfig(f *pflag.FlagSet) { f.Duration(flagBackoffTime, DefaultBackOffTime, "The gap between two retries.") f.Duration(flagTickInterval, DefaultTickInterval, "From how long we trigger the tick (advancing the checkpoint).") - f.Bool(flagAdvancingByCache, DefaultAdvanceByCache, "Whether enable the optimization -- use a cached heap to advancing the global checkpoint.") - f.Int(flagFullScanDiffTick, DefaultFullScanTick, "The backoff of full scan.") + f.Duration(flagTryAdvanceThreshold, DefaultTryAdvanceThreshold, "If the checkpoint lag is greater than how long, we would try to poll TiKV for checkpoints.") } func Default() Config { return Config{ - BackoffTime: DefaultBackOffTime, - TickDuration: DefaultTickInterval, - FullScanTick: DefaultFullScanTick, - AdvancingByCache: DefaultAdvanceByCache, + BackoffTime: DefaultBackOffTime, + TickDuration: DefaultTickInterval, + TryAdvanceThreshold: DefaultTryAdvanceThreshold, } } @@ -65,13 +60,34 @@ func (conf *Config) GetFromFlags(f *pflag.FlagSet) error { if err != nil { return err } - conf.FullScanTick, err = f.GetInt(flagFullScanDiffTick) - if err != nil { - return err - } - conf.AdvancingByCache, err = f.GetBool(flagAdvancingByCache) + conf.TryAdvanceThreshold, err = f.GetDuration(flagTryAdvanceThreshold) if err != nil { return err } return nil } + +// GetDefaultStartPollThreshold returns the threshold of begin polling the checkpoint +// in the normal condition (the subscribe manager is available.) +func (conf Config) GetDefaultStartPollThreshold() time.Duration { + return conf.TryAdvanceThreshold +} + +// GetSubscriberErrorStartPollThreshold returns the threshold of begin polling the checkpoint +// when the subscriber meets error. +func (conf Config) GetSubscriberErrorStartPollThreshold() time.Duration { + // 0.45x of the origin threshold. + // The origin threshold is 0.8x the target RPO, + // and the default flush interval is about 0.5x the target RPO. + // So the relationship between the RPO and the threshold is: + // When subscription is all available, it is 1.7x of the flush interval (which allow us to save in abnormal condition). + // When some of subscriptions are not available, it is 0.75x of the flush interval. + // NOTE: can we make subscription better and give up the poll model? + return conf.TryAdvanceThreshold * 9 / 20 +} + +// TickTimeout returns the max duration for each tick. +func (conf Config) TickTimeout() time.Duration { + // If a tick blocks longer than the interval of ticking, we may need to break it and retry. + return conf.TickDuration +} diff --git a/br/pkg/streamhelper/daemon/BUILD.bazel b/br/pkg/streamhelper/daemon/BUILD.bazel index e096487050d04..751ade885e324 100644 --- a/br/pkg/streamhelper/daemon/BUILD.bazel +++ b/br/pkg/streamhelper/daemon/BUILD.bazel @@ -18,6 +18,7 @@ go_library( go_test( name = "daemon_test", + timeout = "short", srcs = ["owner_daemon_test.go"], flaky = True, deps = [ diff --git a/br/pkg/streamhelper/flush_subscriber.go b/br/pkg/streamhelper/flush_subscriber.go new file mode 100644 index 0000000000000..70cd4d8e4501d --- /dev/null +++ b/br/pkg/streamhelper/flush_subscriber.go @@ -0,0 +1,329 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package streamhelper + +import ( + "context" + "io" + "strconv" + "sync" + "time" + + "github.com/google/uuid" + "github.com/pingcap/errors" + logbackup "github.com/pingcap/kvproto/pkg/logbackuppb" + "github.com/pingcap/log" + "github.com/pingcap/tidb/br/pkg/logutil" + "github.com/pingcap/tidb/br/pkg/streamhelper/spans" + "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/util/codec" + "go.uber.org/multierr" + "go.uber.org/zap" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +// FlushSubscriber maintains the state of subscribing to the cluster. +type FlushSubscriber struct { + dialer LogBackupService + cluster TiKVClusterMeta + + // Current connections. + subscriptions map[uint64]*subscription + // The output channel. + eventsTunnel chan spans.Valued + // The background context for subscribes. + masterCtx context.Context +} + +// SubscriberConfig is a config which cloud be applied into the subscriber. +type SubscriberConfig func(*FlushSubscriber) + +// WithMasterContext sets the "master context" for the subscriber, +// that context would be the "background" context for every subtasks created by the subscription manager. +func WithMasterContext(ctx context.Context) SubscriberConfig { + return func(fs *FlushSubscriber) { fs.masterCtx = ctx } +} + +// NewSubscriber creates a new subscriber via the environment and optional configs. +func NewSubscriber(dialer LogBackupService, cluster TiKVClusterMeta, config ...SubscriberConfig) *FlushSubscriber { + subs := &FlushSubscriber{ + dialer: dialer, + cluster: cluster, + + subscriptions: map[uint64]*subscription{}, + eventsTunnel: make(chan spans.Valued, 1024), + masterCtx: context.Background(), + } + + for _, c := range config { + c(subs) + } + + return subs +} + +// UpdateStoreTopology fetches the current store topology and try to adapt the subscription state with it. +func (f *FlushSubscriber) UpdateStoreTopology(ctx context.Context) error { + stores, err := f.cluster.Stores(ctx) + if err != nil { + return errors.Annotate(err, "failed to get store list") + } + + storeSet := map[uint64]struct{}{} + for _, store := range stores { + sub, ok := f.subscriptions[store.ID] + if !ok { + f.addSubscription(ctx, store) + f.subscriptions[store.ID].connect(f.masterCtx, f.dialer) + } else if sub.storeBootAt != store.BootAt { + sub.storeBootAt = store.BootAt + sub.connect(f.masterCtx, f.dialer) + } + storeSet[store.ID] = struct{}{} + } + + for id := range f.subscriptions { + _, ok := storeSet[id] + if !ok { + f.removeSubscription(id) + } + } + return nil +} + +// Clear clears all the subscriptions. +func (f *FlushSubscriber) Clear() { + log.Info("[log backup flush subscriber] Clearing.") + for id := range f.subscriptions { + f.removeSubscription(id) + } +} + +// Drop terminates the lifetime of the subscriber. +// This subscriber would be no more usable. +func (f *FlushSubscriber) Drop() { + f.Clear() + close(f.eventsTunnel) +} + +// HandleErrors execute the handlers over all pending errors. +// Note that the handler may cannot handle the pending errors, at that time, +// you can fetch the errors via `PendingErrors` call. +func (f *FlushSubscriber) HandleErrors(ctx context.Context) { + for id, sub := range f.subscriptions { + err := sub.loadError() + if err != nil { + retry := f.canBeRetried(err) + log.Warn("[log backup flush subscriber] Meet error.", logutil.ShortError(err), zap.Bool("can-retry?", retry), zap.Uint64("store", id)) + if retry { + sub.connect(f.masterCtx, f.dialer) + } + } + } +} + +// Events returns the output channel of the events. +func (f *FlushSubscriber) Events() <-chan spans.Valued { + return f.eventsTunnel +} + +type eventStream = logbackup.LogBackup_SubscribeFlushEventClient + +type joinHandle <-chan struct{} + +func (jh joinHandle) WaitTimeOut(dur time.Duration) { + var t <-chan time.Time + if dur > 0 { + t = time.After(dur) + } + select { + case <-jh: + case <-t: + log.Warn("join handle timed out.") + } +} + +func spawnJoinable(f func()) joinHandle { + c := make(chan struct{}) + go func() { + defer close(c) + f() + }() + return c +} + +// subscription is the state of subscription of one store. +// initially, it is IDLE, where cancel == nil. +// once `connect` called, it goto CONNECTED, where cancel != nil and err == nil. +// once some error (both foreground or background) happens, it goto ERROR, where err != nil. +type subscription struct { + // the handle to cancel the worker goroutine. + cancel context.CancelFunc + // the handle to wait until the worker goroutine exits. + background joinHandle + errMu sync.Mutex + err error + + // Immutable state. + storeID uint64 + // We record start bootstrap time and once a store restarts + // we need to try reconnect even there is a error cannot be retry. + storeBootAt uint64 + output chan<- spans.Valued +} + +func (s *subscription) emitError(err error) { + s.errMu.Lock() + defer s.errMu.Unlock() + + s.err = err +} + +func (s *subscription) loadError() error { + s.errMu.Lock() + defer s.errMu.Unlock() + + return s.err +} + +func (s *subscription) clearError() { + s.errMu.Lock() + defer s.errMu.Unlock() + + s.err = nil +} + +func newSubscription(toStore Store, output chan<- spans.Valued) *subscription { + return &subscription{ + storeID: toStore.ID, + storeBootAt: toStore.BootAt, + output: output, + } +} + +func (s *subscription) connect(ctx context.Context, dialer LogBackupService) { + err := s.doConnect(ctx, dialer) + if err != nil { + s.emitError(err) + } +} + +func (s *subscription) doConnect(ctx context.Context, dialer LogBackupService) error { + log.Info("[log backup subscription manager] Adding subscription.", zap.Uint64("store", s.storeID), zap.Uint64("boot", s.storeBootAt)) + // We should shutdown the background task firstly. + // Once it yields some error during shuting down, the error won't be brought to next run. + s.close() + s.clearError() + + c, err := dialer.GetLogBackupClient(ctx, s.storeID) + if err != nil { + return errors.Annotate(err, "failed to get log backup client") + } + cx, cancel := context.WithCancel(ctx) + cli, err := c.SubscribeFlushEvent(cx, &logbackup.SubscribeFlushEventRequest{ + ClientId: uuid.NewString(), + }) + if err != nil { + cancel() + return errors.Annotate(err, "failed to subscribe events") + } + s.cancel = cancel + s.background = spawnJoinable(func() { s.listenOver(cli) }) + return nil +} + +func (s *subscription) close() { + if s.cancel != nil { + s.cancel() + s.background.WaitTimeOut(1 * time.Minute) + } + // HACK: don't close the internal channel here, + // because it is a ever-sharing channel. +} + +func (s *subscription) listenOver(cli eventStream) { + storeID := s.storeID + log.Info("[log backup flush subscriber] Listen starting.", zap.Uint64("store", storeID)) + for { + // Shall we use RecvMsg for better performance? + // Note that the spans.Full requires the input slice be immutable. + msg, err := cli.Recv() + if err != nil { + log.Info("[log backup flush subscriber] Listen stopped.", zap.Uint64("store", storeID), logutil.ShortError(err)) + if err == io.EOF || err == context.Canceled || status.Code(err) == codes.Canceled { + return + } + s.emitError(errors.Annotatef(err, "while receiving from store id %d", storeID)) + return + } + + for _, m := range msg.Events { + start, err := decodeKey(m.StartKey) + if err != nil { + log.Warn("start key not encoded, skipping", logutil.Key("event", m.StartKey), logutil.ShortError(err)) + continue + } + end, err := decodeKey(m.EndKey) + if err != nil { + log.Warn("end key not encoded, skipping", logutil.Key("event", m.EndKey), logutil.ShortError(err)) + continue + } + s.output <- spans.Valued{ + Key: spans.Span{ + StartKey: start, + EndKey: end, + }, + Value: m.Checkpoint, + } + } + metrics.RegionCheckpointSubscriptionEvent.WithLabelValues(strconv.Itoa(int(storeID))).Add(float64(len(msg.Events))) + } +} + +func (f *FlushSubscriber) addSubscription(ctx context.Context, toStore Store) { + f.subscriptions[toStore.ID] = newSubscription(toStore, f.eventsTunnel) +} + +func (f *FlushSubscriber) removeSubscription(toStore uint64) { + subs, ok := f.subscriptions[toStore] + if ok { + log.Info("[log backup subscription manager] Removing subscription.", zap.Uint64("store", toStore)) + subs.close() + delete(f.subscriptions, toStore) + } +} + +// decodeKey decodes the key from TiKV, because the region range is encoded in TiKV. +func decodeKey(key []byte) ([]byte, error) { + if len(key) == 0 { + return key, nil + } + // Ignore the timestamp... + _, data, err := codec.DecodeBytes(key, nil) + if err != nil { + return key, err + } + return data, err +} + +func (f *FlushSubscriber) canBeRetried(err error) bool { + for _, e := range multierr.Errors(errors.Cause(err)) { + s := status.Convert(e) + // Is there any other error cannot be retried? + if s.Code() == codes.Unimplemented { + return false + } + } + return true +} + +func (f *FlushSubscriber) PendingErrors() error { + var allErr error + for _, s := range f.subscriptions { + if err := s.loadError(); err != nil { + allErr = multierr.Append(allErr, errors.Annotatef(err, "store %d has error", s.storeID)) + } + } + return allErr +} diff --git a/br/pkg/streamhelper/integration_test.go b/br/pkg/streamhelper/integration_test.go index b3baf433c43f6..4b989dc4ab2ba 100644 --- a/br/pkg/streamhelper/integration_test.go +++ b/br/pkg/streamhelper/integration_test.go @@ -7,13 +7,15 @@ import ( "context" "encoding/binary" "fmt" + "io" "net" "net/url" "path" "testing" "github.com/pingcap/errors" - backup "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/failpoint" + backuppb "github.com/pingcap/kvproto/pkg/brpb" "github.com/pingcap/log" berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/logutil" @@ -138,11 +140,12 @@ func TestIntegration(t *testing.T) { defer etcd.Server.Stop() metaCli := streamhelper.MetaDataClient{Client: cli} t.Run("TestBasic", func(t *testing.T) { testBasic(t, metaCli, etcd) }) - t.Run("TestForwardProgress", func(t *testing.T) { testForwardProgress(t, metaCli, etcd) }) t.Run("testGetStorageCheckpoint", func(t *testing.T) { testGetStorageCheckpoint(t, metaCli) }) t.Run("testGetGlobalCheckPointTS", func(t *testing.T) { testGetGlobalCheckPointTS(t, metaCli) }) t.Run("TestStreamListening", func(t *testing.T) { testStreamListening(t, streamhelper.AdvancerExt{MetaDataClient: metaCli}) }) t.Run("TestStreamCheckpoint", func(t *testing.T) { testStreamCheckpoint(t, streamhelper.AdvancerExt{MetaDataClient: metaCli}) }) + t.Run("testStoptask", func(t *testing.T) { testStoptask(t, streamhelper.AdvancerExt{MetaDataClient: metaCli}) }) + t.Run("TestStreamClose", func(t *testing.T) { testStreamClose(t, streamhelper.AdvancerExt{MetaDataClient: metaCli}) }) } func TestChecking(t *testing.T) { @@ -210,31 +213,6 @@ func testBasic(t *testing.T, metaCli streamhelper.MetaDataClient, etcd *embed.Et rangeIsEmpty(t, []byte(streamhelper.RangesOf(taskName)), etcd) } -func testForwardProgress(t *testing.T, metaCli streamhelper.MetaDataClient, etcd *embed.Etcd) { - ctx := context.Background() - taskName := "many_tables" - taskInfo := simpleTask(taskName, 65) - defer func() { - require.NoError(t, metaCli.DeleteTask(ctx, taskName)) - }() - - require.NoError(t, metaCli.PutTask(ctx, taskInfo)) - task, err := metaCli.GetTask(ctx, taskName) - require.NoError(t, err) - require.NoError(t, task.Step(ctx, 1, 41)) - require.NoError(t, task.Step(ctx, 1, 42)) - require.NoError(t, task.Step(ctx, 2, 40)) - rs, err := task.Ranges(ctx) - require.NoError(t, err) - require.Equal(t, simpleRanges(65), rs) - store1Checkpoint, err := task.MinNextBackupTS(ctx, 1) - require.NoError(t, err) - require.Equal(t, store1Checkpoint, uint64(42)) - store2Checkpoint, err := task.MinNextBackupTS(ctx, 2) - require.NoError(t, err) - require.Equal(t, store2Checkpoint, uint64(40)) -} - func testGetStorageCheckpoint(t *testing.T, metaCli streamhelper.MetaDataClient) { var ( taskName = "my_task" @@ -298,7 +276,7 @@ func testGetGlobalCheckPointTS(t *testing.T, metaCli streamhelper.MetaDataClient require.NoError(t, err) } - task := streamhelper.NewTask(&metaCli, backup.StreamBackupTaskInfo{Name: taskName}) + task := streamhelper.NewTask(&metaCli, backuppb.StreamBackupTaskInfo{Name: taskName}) task.UploadGlobalCheckpoint(ctx, 1003) globalTS, err := task.GetGlobalCheckPointTS(ctx) @@ -320,6 +298,7 @@ func testStreamListening(t *testing.T, metaCli streamhelper.AdvancerExt) { taskInfo2 := simpleTask(taskName2, 4) require.NoError(t, metaCli.PutTask(ctx, taskInfo2)) require.NoError(t, metaCli.DeleteTask(ctx, taskName2)) + first := <-ch require.Equal(t, first.Type, streamhelper.EventAdd) require.Equal(t, first.Name, taskName) @@ -335,27 +314,130 @@ func testStreamListening(t *testing.T, metaCli streamhelper.AdvancerExt) { require.Equal(t, forth.Type, streamhelper.EventDel) require.Equal(t, forth.Name, taskName2) cancel() - _, ok := <-ch - require.False(t, ok) + fifth, ok := <-ch + require.True(t, ok) + require.Equal(t, fifth.Type, streamhelper.EventErr) + require.Error(t, fifth.Err, context.Canceled) + item, ok := <-ch + require.False(t, ok, "%v", item) +} + +func testStreamClose(t *testing.T, metaCli streamhelper.AdvancerExt) { + ctx := context.Background() + taskName := "close_simple" + taskInfo := simpleTask(taskName, 4) + + require.NoError(t, metaCli.PutTask(ctx, taskInfo)) + ch := make(chan streamhelper.TaskEvent, 1024) + require.NoError(t, metaCli.Begin(ctx, ch)) + require.NoError(t, metaCli.DeleteTask(ctx, taskName)) + first := <-ch + require.Equal(t, first.Type, streamhelper.EventAdd) + require.Equal(t, first.Name, taskName) + require.ElementsMatch(t, first.Ranges, simpleRanges(4)) + second := <-ch + require.Equal(t, second.Type, streamhelper.EventDel, "%s", second) + require.Equal(t, second.Name, taskName, "%s", second) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/br/pkg/streamhelper/advancer_close_channel", "return")) + defer failpoint.Disable("github.com/pingcap/tidb/br/pkg/streamhelper/advancer_close_channel") + // We need to make the channel file some events hence we can simulate the closed channel. + taskName2 := "close_simple2" + taskInfo2 := simpleTask(taskName2, 4) + require.NoError(t, metaCli.PutTask(ctx, taskInfo2)) + require.NoError(t, metaCli.DeleteTask(ctx, taskName2)) + + third := <-ch + require.Equal(t, third.Type, streamhelper.EventErr) + require.Error(t, third.Err, io.EOF) + item, ok := <-ch + require.False(t, ok, "%#v", item) } func testStreamCheckpoint(t *testing.T, metaCli streamhelper.AdvancerExt) { ctx := context.Background() task := "simple" req := require.New(t) - getCheckpoint := func() uint64 { - resp, err := metaCli.KV.Get(ctx, streamhelper.GlobalCheckpointOf(task)) - req.NoError(err) - if len(resp.Kvs) == 0 { - return 0 + + req.NoError(metaCli.UploadV3GlobalCheckpointForTask(ctx, task, 5)) + ts, err := metaCli.GetGlobalCheckpointForTask(ctx, task) + req.NoError(err) + req.EqualValues(5, ts) + req.NoError(metaCli.UploadV3GlobalCheckpointForTask(ctx, task, 18)) + ts, err = metaCli.GetGlobalCheckpointForTask(ctx, task) + req.NoError(err) + req.EqualValues(18, ts) + req.NoError(metaCli.UploadV3GlobalCheckpointForTask(ctx, task, 16)) + ts, err = metaCli.GetGlobalCheckpointForTask(ctx, task) + req.NoError(err) + req.EqualValues(18, ts) + req.NoError(metaCli.ClearV3GlobalCheckpointForTask(ctx, task)) + ts, err = metaCli.GetGlobalCheckpointForTask(ctx, task) + req.NoError(err) + req.EqualValues(0, ts) +} + +func testStoptask(t *testing.T, metaCli streamhelper.AdvancerExt) { + var ( + ctx = context.Background() + taskName = "stop_task" + req = require.New(t) + taskInfo = streamhelper.TaskInfo{ + PBInfo: backuppb.StreamBackupTaskInfo{ + Name: taskName, + StartTs: 0, + }, } - req.Len(resp.Kvs, 1) - return binary.BigEndian.Uint64(resp.Kvs[0].Value) - } - metaCli.UploadV3GlobalCheckpointForTask(ctx, task, 5) - req.EqualValues(5, getCheckpoint()) - metaCli.UploadV3GlobalCheckpointForTask(ctx, task, 18) - req.EqualValues(18, getCheckpoint()) - metaCli.ClearV3GlobalCheckpointForTask(ctx, task) - req.EqualValues(0, getCheckpoint()) + storeID = "5" + storageCheckpoint = make([]byte, 8) + ) + + // put task + req.NoError(metaCli.PutTask(ctx, taskInfo)) + t2, err := metaCli.GetTask(ctx, taskName) + req.NoError(err) + req.EqualValues(taskInfo.PBInfo.Name, t2.Info.Name) + + // upload global checkpoint + req.NoError(metaCli.UploadV3GlobalCheckpointForTask(ctx, taskName, 100)) + ts, err := metaCli.GetGlobalCheckpointForTask(ctx, taskName) + req.NoError(err) + req.EqualValues(100, ts) + + //upload storage checkpoint + key := path.Join(streamhelper.StorageCheckpointOf(taskName), storeID) + binary.BigEndian.PutUint64(storageCheckpoint, 90) + _, err = metaCli.Put(ctx, key, string(storageCheckpoint)) + req.NoError(err) + + task := streamhelper.NewTask(&metaCli.MetaDataClient, taskInfo.PBInfo) + ts, err = task.GetStorageCheckpoint(ctx) + req.NoError(err) + req.EqualValues(ts, 90) + + // pause task + req.NoError(metaCli.PauseTask(ctx, taskName)) + resp, err := metaCli.KV.Get(ctx, streamhelper.Pause(taskName)) + req.NoError(err) + req.EqualValues(1, len(resp.Kvs)) + + // stop task + err = metaCli.DeleteTask(ctx, taskName) + req.NoError(err) + + // check task and other meta infomations not existed + _, err = metaCli.GetTask(ctx, taskName) + req.Error(err) + + ts, err = task.GetStorageCheckpoint(ctx) + req.NoError(err) + req.EqualValues(ts, 0) + + ts, err = metaCli.GetGlobalCheckpointForTask(ctx, taskName) + req.NoError(err) + req.EqualValues(0, ts) + + resp, err = metaCli.KV.Get(ctx, streamhelper.Pause(taskName)) + req.NoError(err) + req.EqualValues(0, len(resp.Kvs)) } diff --git a/br/pkg/streamhelper/models.go b/br/pkg/streamhelper/models.go index 8aebfbaaf5aa9..7678e655d216a 100644 --- a/br/pkg/streamhelper/models.go +++ b/br/pkg/streamhelper/models.go @@ -61,12 +61,6 @@ func RangeKeyOf(name string, startKey []byte) string { return RangesOf(name) + string(startKey) } -func writeUint64(buf *bytes.Buffer, num uint64) { - items := [8]byte{} - binary.BigEndian.PutUint64(items[:], num) - buf.Write(items[:]) -} - func encodeUint64(num uint64) []byte { items := [8]byte{} binary.BigEndian.PutUint64(items[:], num) @@ -83,25 +77,17 @@ func CheckPointsOf(task string) string { } // GlobalCheckpointOf returns the path to the "global" checkpoint of some task. +// Normally it would be /checkpoint//central_globa. func GlobalCheckpointOf(task string) string { return path.Join(streamKeyPrefix, taskCheckpointPath, task, checkpointTypeGlobal) } // StorageCheckpointOf get the prefix path of the `storage checkpoint status` of a task. +// Normally it would be /storage-checkpoint/. func StorageCheckpointOf(task string) string { return path.Join(streamKeyPrefix, storageCheckPoint, task) } -// CheckpointOf returns the checkpoint prefix of some store. -// Normally it would be /checkpoint//. -func CheckPointOf(task string, store uint64) string { - buf := bytes.NewBuffer(nil) - buf.WriteString(strings.TrimSuffix(path.Join(streamKeyPrefix, taskCheckpointPath, task), "/")) - buf.WriteRune('/') - writeUint64(buf, store) - return buf.String() -} - // Pause returns the path for pausing the task. // Normally it would be /pause/. func Pause(task string) string { diff --git a/br/pkg/streamhelper/regioniter.go b/br/pkg/streamhelper/regioniter.go index 9dc75e38553fc..239c710db1ba4 100644 --- a/br/pkg/streamhelper/regioniter.go +++ b/br/pkg/streamhelper/regioniter.go @@ -28,14 +28,22 @@ type RegionWithLeader struct { Leader *metapb.Peer } -type RegionScanner interface { +type TiKVClusterMeta interface { // RegionScan gets a list of regions, starts from the region that contains key. // Limit limits the maximum number of regions returned. RegionScan(ctx context.Context, key, endKey []byte, limit int) ([]RegionWithLeader, error) + + // Stores returns the store metadata from the cluster. + Stores(ctx context.Context) ([]Store, error) +} + +type Store struct { + ID uint64 + BootAt uint64 } type RegionIter struct { - cli RegionScanner + cli TiKVClusterMeta startKey, endKey []byte currentStartKey []byte // When the endKey become "", we cannot check whether the scan is done by @@ -57,7 +65,7 @@ func (r *RegionIter) String() string { } // IterateRegion creates an iterater over the region range. -func IterateRegion(cli RegionScanner, startKey, endKey []byte) *RegionIter { +func IterateRegion(cli TiKVClusterMeta, startKey, endKey []byte) *RegionIter { return &RegionIter{ cli: cli, startKey: startKey, diff --git a/br/pkg/streamhelper/regioniter_test.go b/br/pkg/streamhelper/regioniter_test.go index 04ccc04da8a66..1c0d6a28ab0fe 100644 --- a/br/pkg/streamhelper/regioniter_test.go +++ b/br/pkg/streamhelper/regioniter_test.go @@ -13,8 +13,11 @@ import ( "github.com/pingcap/tidb/br/pkg/logutil" "github.com/pingcap/tidb/br/pkg/redact" "github.com/pingcap/tidb/br/pkg/streamhelper" + "github.com/pingcap/tidb/br/pkg/streamhelper/spans" "github.com/pingcap/tidb/kv" "github.com/stretchr/testify/require" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) type constantRegions []streamhelper.RegionWithLeader @@ -55,7 +58,7 @@ func (c constantRegions) String() string { func (c constantRegions) RegionScan(ctx context.Context, key []byte, endKey []byte, limit int) ([]streamhelper.RegionWithLeader, error) { result := make([]streamhelper.RegionWithLeader, 0, limit) for _, region := range c { - if overlaps(kv.KeyRange{StartKey: key, EndKey: endKey}, kv.KeyRange{StartKey: region.Region.StartKey, EndKey: region.Region.EndKey}) && len(result) < limit { + if spans.Overlaps(kv.KeyRange{StartKey: key, EndKey: endKey}, kv.KeyRange{StartKey: region.Region.StartKey, EndKey: region.Region.EndKey}) && len(result) < limit { result = append(result, region) } else if bytes.Compare(region.Region.StartKey, key) > 0 { break @@ -66,6 +69,11 @@ func (c constantRegions) RegionScan(ctx context.Context, key []byte, endKey []by return result, nil } +// Stores returns the store metadata from the cluster. +func (c constantRegions) Stores(ctx context.Context) ([]streamhelper.Store, error) { + return nil, status.Error(codes.Unimplemented, "Unsupported operation") +} + func makeSubrangeRegions(keys ...string) constantRegions { if len(keys) == 0 { return nil diff --git a/br/pkg/streamhelper/spans/BUILD.bazel b/br/pkg/streamhelper/spans/BUILD.bazel new file mode 100644 index 0000000000000..67f9f14546a59 --- /dev/null +++ b/br/pkg/streamhelper/spans/BUILD.bazel @@ -0,0 +1,33 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "spans", + srcs = [ + "sorted.go", + "utils.go", + "value_sorted.go", + ], + importpath = "github.com/pingcap/tidb/br/pkg/streamhelper/spans", + visibility = ["//visibility:public"], + deps = [ + "//br/pkg/logutil", + "//br/pkg/utils", + "//kv", + "@com_github_google_btree//:btree", + ], +) + +go_test( + name = "spans_test", + timeout = "short", + srcs = [ + "sorted_test.go", + "utils_test.go", + "value_sorted_test.go", + ], + flaky = True, + deps = [ + ":spans", + "@com_github_stretchr_testify//require", + ], +) diff --git a/br/pkg/streamhelper/spans/sorted.go b/br/pkg/streamhelper/spans/sorted.go new file mode 100644 index 0000000000000..a15138bf8124c --- /dev/null +++ b/br/pkg/streamhelper/spans/sorted.go @@ -0,0 +1,186 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package spans + +import ( + "bytes" + "fmt" + + "github.com/google/btree" + "github.com/pingcap/tidb/br/pkg/logutil" + "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/kv" +) + +// Value is the value type of stored in the span tree. +type Value = uint64 + +// join finds the upper bound of two values. +func join(a, b Value) Value { + if a > b { + return a + } + return b +} + +// Span is the type of an adjacent sub key space. +type Span = kv.KeyRange + +// Valued is span binding to a value, which is the entry type of span tree. +type Valued struct { + Key Span + Value Value +} + +func (r Valued) String() string { + return fmt.Sprintf("(%s, %d)", logutil.StringifyRange(r.Key), r.Value) +} + +func (r Valued) Less(other btree.Item) bool { + return bytes.Compare(r.Key.StartKey, other.(Valued).Key.StartKey) < 0 +} + +// ValuedFull represents a set of valued ranges, which doesn't overlap and union of them all is the full key space. +type ValuedFull struct { + inner *btree.BTree +} + +// NewFullWith creates a set of a subset of spans. +func NewFullWith(initSpans []Span, init Value) *ValuedFull { + t := btree.New(16) + for _, r := range Collapse(len(initSpans), func(i int) Span { return initSpans[i] }) { + t.ReplaceOrInsert(Valued{Value: init, Key: r}) + } + return &ValuedFull{inner: t} +} + +// Merge merges a new interval into the span set. The value of overlapped +// part with other spans would be "merged" by the `join` function. +// An example: +/* +|___________________________________________________________________________| +^-----------------^-----------------^-----------------^---------------------^ +| c = 42 | c = 43 | c = 45 | c = 41 | + ^--------------------------^ + merge(| c = 44 |) +Would Give: +|___________________________________________________________________________| +^-----------------^----^------------^-------------^---^---------------------^ +| c = 42 | 43 | c = 44 | c = 45 | c = 41 | + |-------------| + Unchanged, because 44 < 45. +*/ +func (f *ValuedFull) Merge(val Valued) { + overlaps := make([]Valued, 0, 16) + f.overlapped(val.Key, &overlaps) + f.mergeWithOverlap(val, overlaps, nil) +} + +// Traverse traverses all ranges by order. +func (f *ValuedFull) Traverse(m func(Valued) bool) { + f.inner.Ascend(func(item btree.Item) bool { + return m(item.(Valued)) + }) +} + +func (f *ValuedFull) mergeWithOverlap(val Valued, overlapped []Valued, newItems *[]Valued) { + // There isn't any range overlaps with the input range, perhaps the input range is empty. + // do nothing for this case. + if len(overlapped) == 0 { + return + } + + for _, r := range overlapped { + f.inner.Delete(r) + // Assert All overlapped ranges are deleted. + } + + var ( + initialized = false + collected Valued + rightTrail *Valued + flushCollected = func() { + if initialized { + f.inner.ReplaceOrInsert(collected) + if newItems != nil { + *newItems = append(*newItems, collected) + } + } + } + emitToCollected = func(rng Valued, standalone bool) { + merged := rng.Value + if !standalone { + merged = join(val.Value, rng.Value) + } + if !initialized { + collected = rng + collected.Value = merged + initialized = true + return + } + if merged == collected.Value && utils.CompareBytesExt(collected.Key.EndKey, true, rng.Key.StartKey, false) == 0 { + collected.Key.EndKey = rng.Key.EndKey + } else { + flushCollected() + collected = Valued{ + Key: rng.Key, + Value: merged, + } + } + } + ) + + leftmost := overlapped[0] + if bytes.Compare(leftmost.Key.StartKey, val.Key.StartKey) < 0 { + emitToCollected(Valued{ + Key: Span{StartKey: leftmost.Key.StartKey, EndKey: val.Key.StartKey}, + Value: leftmost.Value, + }, true) + overlapped[0].Key.StartKey = val.Key.StartKey + } + + rightmost := overlapped[len(overlapped)-1] + if utils.CompareBytesExt(rightmost.Key.EndKey, true, val.Key.EndKey, true) > 0 { + rightTrail = &Valued{ + Key: Span{StartKey: val.Key.EndKey, EndKey: rightmost.Key.EndKey}, + Value: rightmost.Value, + } + overlapped[len(overlapped)-1].Key.EndKey = val.Key.EndKey + } + + for _, rng := range overlapped { + emitToCollected(rng, false) + } + + if rightTrail != nil { + emitToCollected(*rightTrail, true) + } + + flushCollected() +} + +// overlapped inserts the overlapped ranges of the span into the `result` slice. +func (f *ValuedFull) overlapped(k Span, result *[]Valued) { + var ( + first Span + hasFirst bool + ) + // Firstly, let's find whether there is a overlapped region with less start key. + f.inner.DescendLessOrEqual(Valued{Key: k}, func(item btree.Item) bool { + first = item.(Valued).Key + hasFirst = true + return false + }) + if !hasFirst || !Overlaps(first, k) { + first = k + } + + f.inner.AscendGreaterOrEqual(Valued{Key: first}, func(item btree.Item) bool { + r := item.(Valued) + if !Overlaps(r.Key, k) { + return false + } + *result = append(*result, r) + return true + }) +} diff --git a/br/pkg/streamhelper/spans/sorted_test.go b/br/pkg/streamhelper/spans/sorted_test.go new file mode 100644 index 0000000000000..c56c2236a6690 --- /dev/null +++ b/br/pkg/streamhelper/spans/sorted_test.go @@ -0,0 +1,211 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package spans_test + +import ( + "fmt" + "testing" + + "github.com/pingcap/tidb/br/pkg/streamhelper/spans" + "github.com/stretchr/testify/require" +) + +func s(a, b string) spans.Span { + return spans.Span{ + StartKey: []byte(a), + EndKey: []byte(b), + } +} + +func kv(s spans.Span, v spans.Value) spans.Valued { + return spans.Valued{ + Key: s, + Value: v, + } +} + +func TestBasic(t *testing.T) { + type Case struct { + InputSequence []spans.Valued + Result []spans.Valued + } + + run := func(t *testing.T, c Case) { + full := spans.NewFullWith(spans.Full(), 0) + fmt.Println(t.Name()) + for _, i := range c.InputSequence { + full.Merge(i) + var result []spans.Valued + full.Traverse(func(v spans.Valued) bool { + result = append(result, v) + return true + }) + fmt.Printf("%s -> %s\n", i, result) + } + + var result []spans.Valued + full.Traverse(func(v spans.Valued) bool { + result = append(result, v) + return true + }) + + require.True(t, spans.ValuedSetEquals(result, c.Result), "%s\nvs\n%s", result, c.Result) + } + + cases := []Case{ + { + InputSequence: []spans.Valued{ + kv(s("0001", "0002"), 1), + kv(s("0002", "0003"), 2), + }, + Result: []spans.Valued{ + kv(s("", "0001"), 0), + kv(s("0001", "0002"), 1), + kv(s("0002", "0003"), 2), + kv(s("0003", ""), 0), + }, + }, + { + InputSequence: []spans.Valued{ + kv(s("0001", "0002"), 1), + kv(s("0002", "0003"), 2), + kv(s("0001", "0003"), 4), + }, + Result: []spans.Valued{ + kv(s("", "0001"), 0), + kv(s("0001", "0003"), 4), + kv(s("0003", ""), 0), + }, + }, + { + InputSequence: []spans.Valued{ + kv(s("0001", "0004"), 3), + kv(s("0004", "0008"), 5), + kv(s("0001", "0007"), 4), + kv(s("", "0002"), 2), + }, + Result: []spans.Valued{ + kv(s("", "0001"), 2), + kv(s("0001", "0004"), 4), + kv(s("0004", "0008"), 5), + kv(s("0008", ""), 0), + }, + }, + { + InputSequence: []spans.Valued{ + kv(s("0001", "0004"), 3), + kv(s("0004", "0008"), 5), + kv(s("0001", "0009"), 4), + }, + Result: []spans.Valued{ + kv(s("", "0001"), 0), + kv(s("0001", "0004"), 4), + kv(s("0004", "0008"), 5), + kv(s("0008", "0009"), 4), + kv(s("0009", ""), 0), + }, + }, + } + + for i, c := range cases { + t.Run(fmt.Sprintf("#%d", i+1), func(t *testing.T) { run(t, c) }) + } +} + +func TestSubRange(t *testing.T) { + type Case struct { + Range []spans.Span + InputSequence []spans.Valued + Result []spans.Valued + } + + run := func(t *testing.T, c Case) { + full := spans.NewFullWith(c.Range, 0) + fmt.Println(t.Name()) + for _, i := range c.InputSequence { + full.Merge(i) + var result []spans.Valued + full.Traverse(func(v spans.Valued) bool { + result = append(result, v) + return true + }) + fmt.Printf("%s -> %s\n", i, result) + } + + var result []spans.Valued + full.Traverse(func(v spans.Valued) bool { + result = append(result, v) + return true + }) + + require.True(t, spans.ValuedSetEquals(result, c.Result), "%s\nvs\n%s", result, c.Result) + } + + cases := []Case{ + { + Range: []spans.Span{s("0001", "0004"), s("0008", "")}, + InputSequence: []spans.Valued{ + kv(s("0001", "0007"), 42), + kv(s("0000", "0009"), 41), + kv(s("0002", "0005"), 43), + }, + Result: []spans.Valued{ + kv(s("0001", "0002"), 42), + kv(s("0002", "0004"), 43), + kv(s("0008", "0009"), 41), + kv(s("0009", ""), 0), + }, + }, + { + Range: []spans.Span{ + s("0001", "0004"), + s("0008", "")}, + InputSequence: []spans.Valued{kv(s("", ""), 42)}, + Result: []spans.Valued{ + kv(s("0001", "0004"), 42), + kv(s("0008", ""), 42), + }, + }, + { + Range: []spans.Span{ + s("0001", "0004"), + s("0005", "0008"), + }, + InputSequence: []spans.Valued{ + kv(s("0001", "0002"), 42), + kv(s("0002", "0008"), 43), + kv(s("0004", "0007"), 45), + kv(s("0000", "00015"), 48), + }, + Result: []spans.Valued{ + kv(s("0001", "00015"), 48), + kv(s("00015", "0002"), 42), + kv(s("0002", "0004"), 43), + kv(s("0005", "0007"), 45), + kv(s("0007", "0008"), 43), + }, + }, + { + Range: []spans.Span{ + s("0001", "0004"), + s("0005", "0008"), + }, + InputSequence: []spans.Valued{ + kv(s("0004", "0008"), 32), + kv(s("00041", "0007"), 33), + kv(s("0004", "00041"), 99999), + kv(s("0005", "0006"), 34), + }, + Result: []spans.Valued{ + kv(s("0001", "0004"), 0), + kv(s("0005", "0006"), 34), + kv(s("0006", "0007"), 33), + kv(s("0007", "0008"), 32), + }, + }, + } + + for i, c := range cases { + t.Run(fmt.Sprintf("#%d", i+1), func(t *testing.T) { run(t, c) }) + } +} diff --git a/br/pkg/streamhelper/spans/utils.go b/br/pkg/streamhelper/spans/utils.go new file mode 100644 index 0000000000000..621173983185d --- /dev/null +++ b/br/pkg/streamhelper/spans/utils.go @@ -0,0 +1,150 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package spans + +import ( + "bytes" + "fmt" + "math" + "sort" + + "github.com/pingcap/tidb/br/pkg/utils" +) + +// Overlaps checks whether two spans have overlapped part. +func Overlaps(a, b Span) bool { + if len(b.EndKey) == 0 { + return len(a.EndKey) == 0 || bytes.Compare(a.EndKey, b.StartKey) > 0 + } + if len(a.EndKey) == 0 { + return len(b.EndKey) == 0 || bytes.Compare(b.EndKey, a.StartKey) > 0 + } + return bytes.Compare(a.StartKey, b.EndKey) < 0 && bytes.Compare(b.StartKey, a.EndKey) < 0 +} + +func Debug(full *ValueSortedFull) { + var result []Valued + full.Traverse(func(v Valued) bool { + result = append(result, v) + return true + }) + var idx []Valued + full.TraverseValuesLessThan(math.MaxUint64, func(v Valued) bool { + idx = append(idx, v) + return true + }) + fmt.Printf("%s\n\tidx = %s\n", result, idx) +} + +// Collapse collapse ranges overlapping or adjacent. +// Example: +// Collapse({[1, 4], [2, 8], [3, 9]}) == {[1, 9]} +// Collapse({[1, 3], [4, 7], [2, 3]}) == {[1, 3], [4, 7]} +func Collapse(length int, getRange func(int) Span) []Span { + frs := make([]Span, 0, length) + for i := 0; i < length; i++ { + frs = append(frs, getRange(i)) + } + + sort.Slice(frs, func(i, j int) bool { + start := bytes.Compare(frs[i].StartKey, frs[j].StartKey) + if start != 0 { + return start < 0 + } + return utils.CompareBytesExt(frs[i].EndKey, true, frs[j].EndKey, true) < 0 + }) + + result := make([]Span, 0, len(frs)) + i := 0 + for i < len(frs) { + item := frs[i] + for { + i++ + if i >= len(frs) || (len(item.EndKey) != 0 && bytes.Compare(frs[i].StartKey, item.EndKey) > 0) { + break + } + if len(item.EndKey) != 0 && bytes.Compare(item.EndKey, frs[i].EndKey) < 0 || len(frs[i].EndKey) == 0 { + item.EndKey = frs[i].EndKey + } + } + result = append(result, item) + } + return result +} + +// Full returns a full span crossing the key space. +func Full() []Span { + return []Span{{}} +} + +func (x Valued) Equals(y Valued) bool { + return x.Value == y.Value && bytes.Equal(x.Key.StartKey, y.Key.StartKey) && bytes.Equal(x.Key.EndKey, y.Key.EndKey) +} + +func ValuedSetEquals(xs, ys []Valued) bool { + if len(xs) == 0 || len(ys) == 0 { + return len(ys) == len(xs) + } + + sort.Slice(xs, func(i, j int) bool { + start := bytes.Compare(xs[i].Key.StartKey, xs[j].Key.StartKey) + if start != 0 { + return start < 0 + } + return utils.CompareBytesExt(xs[i].Key.EndKey, true, xs[j].Key.EndKey, true) < 0 + }) + sort.Slice(ys, func(i, j int) bool { + start := bytes.Compare(ys[i].Key.StartKey, ys[j].Key.StartKey) + if start != 0 { + return start < 0 + } + return utils.CompareBytesExt(ys[i].Key.EndKey, true, ys[j].Key.EndKey, true) < 0 + }) + + xi := 0 + yi := 0 + + for { + if xi >= len(xs) || yi >= len(ys) { + return (xi >= len(xs)) == (yi >= len(ys)) + } + x := xs[xi] + y := ys[yi] + + if !bytes.Equal(x.Key.StartKey, y.Key.StartKey) { + return false + } + + for { + if xi >= len(xs) || yi >= len(ys) { + return (xi >= len(xs)) == (yi >= len(ys)) + } + x := xs[xi] + y := ys[yi] + + if x.Value != y.Value { + return false + } + + c := utils.CompareBytesExt(x.Key.EndKey, true, y.Key.EndKey, true) + if c == 0 { + xi++ + yi++ + break + } + if c < 0 { + xi++ + // If not adjacent key, return false directly. + if xi < len(xs) && utils.CompareBytesExt(x.Key.EndKey, true, xs[xi].Key.StartKey, false) != 0 { + return false + } + } + if c > 0 { + yi++ + if yi < len(ys) && utils.CompareBytesExt(y.Key.EndKey, true, ys[yi].Key.StartKey, false) != 0 { + return false + } + } + } + } +} diff --git a/br/pkg/streamhelper/spans/utils_test.go b/br/pkg/streamhelper/spans/utils_test.go new file mode 100644 index 0000000000000..48b8fc7f411a5 --- /dev/null +++ b/br/pkg/streamhelper/spans/utils_test.go @@ -0,0 +1,83 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package spans_test + +import ( + "fmt" + "testing" + + "github.com/pingcap/tidb/br/pkg/streamhelper/spans" + "github.com/stretchr/testify/require" +) + +func TestValuedEquals(t *testing.T) { + s := func(start, end string, val spans.Value) spans.Valued { + return spans.Valued{ + Key: spans.Span{ + StartKey: []byte(start), + EndKey: []byte(end), + }, + Value: val, + } + } + type Case struct { + inputA []spans.Valued + inputB []spans.Valued + required bool + } + cases := []Case{ + { + inputA: []spans.Valued{s("0001", "0002", 3)}, + inputB: []spans.Valued{s("0001", "0003", 3)}, + required: false, + }, + { + inputA: []spans.Valued{s("0001", "0002", 3)}, + inputB: []spans.Valued{s("0001", "0002", 3)}, + required: true, + }, + { + inputA: []spans.Valued{s("0001", "0003", 3)}, + inputB: []spans.Valued{s("0001", "0002", 3), s("0002", "0003", 3)}, + required: true, + }, + { + inputA: []spans.Valued{s("0001", "0003", 4)}, + inputB: []spans.Valued{s("0001", "0002", 3), s("0002", "0003", 3)}, + required: false, + }, + { + inputA: []spans.Valued{s("0001", "0003", 3)}, + inputB: []spans.Valued{s("0001", "0002", 4), s("0002", "0003", 3)}, + required: false, + }, + { + inputA: []spans.Valued{s("0001", "0003", 3)}, + inputB: []spans.Valued{s("0001", "0002", 3), s("0002", "0004", 3)}, + required: false, + }, + { + inputA: []spans.Valued{s("", "0003", 3)}, + inputB: []spans.Valued{s("0001", "0002", 3), s("0002", "0003", 3)}, + required: false, + }, + { + inputA: []spans.Valued{s("0001", "", 1)}, + inputB: []spans.Valued{s("0001", "0003", 1), s("0004", "", 1)}, + required: false, + }, + { + inputA: []spans.Valued{s("0001", "0004", 1), s("0001", "0002", 1)}, + inputB: []spans.Valued{s("0001", "0002", 1), s("0001", "0004", 1)}, + required: true, + }, + } + run := func(t *testing.T, c Case) { + require.Equal(t, c.required, spans.ValuedSetEquals(c.inputA, c.inputB)) + require.Equal(t, c.required, spans.ValuedSetEquals(c.inputB, c.inputA)) + } + + for i, c := range cases { + t.Run(fmt.Sprintf("#%d", i+1), func(t *testing.T) { run(t, c) }) + } +} diff --git a/br/pkg/streamhelper/spans/value_sorted.go b/br/pkg/streamhelper/spans/value_sorted.go new file mode 100644 index 0000000000000..2fc1ff2cdbbbc --- /dev/null +++ b/br/pkg/streamhelper/spans/value_sorted.go @@ -0,0 +1,69 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package spans + +import "github.com/google/btree" + +type sortedByValueThenStartKey Valued + +func (s sortedByValueThenStartKey) Less(o btree.Item) bool { + other := o.(sortedByValueThenStartKey) + if s.Value != other.Value { + return s.Value < other.Value + } + return Valued(s).Less(Valued(other)) +} + +// ValueSortedFull is almost the same as `Valued`, however it added an +// extra index hence enabled query range by theirs value. +type ValueSortedFull struct { + *ValuedFull + valueIdx *btree.BTree +} + +// Sorted takes the ownership of a raw `ValuedFull` and then wrap it with `ValueSorted`. +func Sorted(f *ValuedFull) *ValueSortedFull { + vf := &ValueSortedFull{ + ValuedFull: f, + valueIdx: btree.New(16), + } + f.Traverse(func(v Valued) bool { + vf.valueIdx.ReplaceOrInsert(sortedByValueThenStartKey(v)) + return true + }) + return vf +} + +func (v *ValueSortedFull) Merge(newItem Valued) { + v.MergeAll([]Valued{newItem}) +} + +func (v *ValueSortedFull) MergeAll(newItems []Valued) { + var overlapped []Valued + var inserted []Valued + + for _, item := range newItems { + overlapped = overlapped[:0] + inserted = inserted[:0] + + v.overlapped(item.Key, &overlapped) + v.mergeWithOverlap(item, overlapped, &inserted) + + for _, o := range overlapped { + v.valueIdx.Delete(sortedByValueThenStartKey(o)) + } + for _, i := range inserted { + v.valueIdx.ReplaceOrInsert(sortedByValueThenStartKey(i)) + } + } +} + +func (v *ValueSortedFull) TraverseValuesLessThan(n Value, action func(Valued) bool) { + v.valueIdx.AscendLessThan(sortedByValueThenStartKey{Value: n}, func(item btree.Item) bool { + return action(Valued(item.(sortedByValueThenStartKey))) + }) +} + +func (v *ValueSortedFull) MinValue() Value { + return v.valueIdx.Min().(sortedByValueThenStartKey).Value +} diff --git a/br/pkg/streamhelper/spans/value_sorted_test.go b/br/pkg/streamhelper/spans/value_sorted_test.go new file mode 100644 index 0000000000000..ee1a5a8af6500 --- /dev/null +++ b/br/pkg/streamhelper/spans/value_sorted_test.go @@ -0,0 +1,98 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package spans_test + +import ( + "fmt" + "testing" + + "github.com/pingcap/tidb/br/pkg/streamhelper/spans" + "github.com/stretchr/testify/require" +) + +func TestSortedBasic(t *testing.T) { + type Case struct { + InputSequence []spans.Valued + RetainLessThan spans.Value + Result []spans.Valued + } + + run := func(t *testing.T, c Case) { + full := spans.Sorted(spans.NewFullWith(spans.Full(), 0)) + fmt.Println(t.Name()) + for _, i := range c.InputSequence { + full.Merge(i) + spans.Debug(full) + } + + var result []spans.Valued + full.TraverseValuesLessThan(c.RetainLessThan, func(v spans.Valued) bool { + result = append(result, v) + return true + }) + + require.True(t, spans.ValuedSetEquals(result, c.Result), "%s\nvs\n%s", result, c.Result) + } + + cases := []Case{ + { + InputSequence: []spans.Valued{ + kv(s("0001", "0002"), 1), + kv(s("0002", "0003"), 2), + }, + Result: []spans.Valued{ + kv(s("", "0001"), 0), + kv(s("0001", "0002"), 1), + kv(s("0002", "0003"), 2), + kv(s("0003", ""), 0), + }, + RetainLessThan: 10, + }, + { + InputSequence: []spans.Valued{ + kv(s("0001", "0002"), 1), + kv(s("0002", "0003"), 2), + kv(s("0001", "0003"), 4), + }, + RetainLessThan: 1, + Result: []spans.Valued{ + kv(s("", "0001"), 0), + kv(s("0003", ""), 0), + }, + }, + { + InputSequence: []spans.Valued{ + kv(s("0001", "0004"), 3), + kv(s("0004", "0008"), 5), + kv(s("0001", "0007"), 4), + kv(s("", "0002"), 2), + }, + RetainLessThan: 5, + Result: []spans.Valued{ + kv(s("", "0001"), 2), + kv(s("0001", "0004"), 4), + kv(s("0008", ""), 0), + }, + }, + { + InputSequence: []spans.Valued{ + kv(s("0001", "0004"), 3), + kv(s("0004", "0008"), 5), + kv(s("0001", "0007"), 4), + kv(s("", "0002"), 2), + kv(s("0001", "0004"), 5), + kv(s("0008", ""), 10), + kv(s("", "0001"), 20), + }, + RetainLessThan: 11, + Result: []spans.Valued{ + kv(s("0001", "0008"), 5), + kv(s("0008", ""), 10), + }, + }, + } + + for i, c := range cases { + t.Run(fmt.Sprintf("#%d", i+1), func(t *testing.T) { run(t, c) }) + } +} diff --git a/br/pkg/streamhelper/subscription_test.go b/br/pkg/streamhelper/subscription_test.go new file mode 100644 index 0000000000000..2341cb05dc01e --- /dev/null +++ b/br/pkg/streamhelper/subscription_test.go @@ -0,0 +1,226 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package streamhelper_test + +import ( + "context" + "fmt" + "sync" + "testing" + + "github.com/pingcap/tidb/br/pkg/streamhelper" + "github.com/pingcap/tidb/br/pkg/streamhelper/spans" + "github.com/stretchr/testify/require" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func installSubscribeSupport(c *fakeCluster) { + for _, s := range c.stores { + s.SetSupportFlushSub(true) + } +} + +func installSubscribeSupportForRandomN(c *fakeCluster, n int) { + i := 0 + for _, s := range c.stores { + if i == n { + break + } + s.SetSupportFlushSub(true) + i++ + } +} + +func TestSubBasic(t *testing.T) { + req := require.New(t) + ctx := context.Background() + c := createFakeCluster(t, 4, true) + c.splitAndScatter("0001", "0002", "0003", "0008", "0009") + installSubscribeSupport(c) + sub := streamhelper.NewSubscriber(c, c) + req.NoError(sub.UpdateStoreTopology(ctx)) + var cp uint64 + for i := 0; i < 10; i++ { + cp = c.advanceCheckpoints() + c.flushAll() + } + sub.HandleErrors(ctx) + req.NoError(sub.PendingErrors()) + sub.Drop() + s := spans.Sorted(spans.NewFullWith(spans.Full(), 1)) + for k := range sub.Events() { + s.Merge(k) + } + defer func() { + if t.Failed() { + fmt.Println(c) + spans.Debug(s) + } + }() + + req.Equal(cp, s.MinValue(), "%d vs %d", cp, s.MinValue()) +} + +func TestNormalError(t *testing.T) { + req := require.New(t) + ctx := context.Background() + c := createFakeCluster(t, 4, true) + c.splitAndScatter("0001", "0002", "0003", "0008", "0009") + installSubscribeSupport(c) + + sub := streamhelper.NewSubscriber(c, c) + c.onGetClient = oneStoreFailure() + req.NoError(sub.UpdateStoreTopology(ctx)) + c.onGetClient = nil + req.Error(sub.PendingErrors()) + sub.HandleErrors(ctx) + req.NoError(sub.PendingErrors()) + var cp uint64 + for i := 0; i < 10; i++ { + cp = c.advanceCheckpoints() + c.flushAll() + } + sub.Drop() + s := spans.Sorted(spans.NewFullWith(spans.Full(), 1)) + for k := range sub.Events() { + s.Merge(k) + } + req.Equal(cp, s.MinValue(), "%d vs %d", cp, s.MinValue()) +} + +func TestHasFailureStores(t *testing.T) { + req := require.New(t) + ctx := context.Background() + c := createFakeCluster(t, 4, true) + c.splitAndScatter("0001", "0002", "0003", "0008", "0009") + + installSubscribeSupportForRandomN(c, 3) + sub := streamhelper.NewSubscriber(c, c) + req.NoError(sub.UpdateStoreTopology(ctx)) + sub.HandleErrors(ctx) + req.Error(sub.PendingErrors()) + + installSubscribeSupport(c) + req.NoError(sub.UpdateStoreTopology(ctx)) + sub.HandleErrors(ctx) + req.NoError(sub.PendingErrors()) +} + +func TestStoreOffline(t *testing.T) { + req := require.New(t) + ctx := context.Background() + c := createFakeCluster(t, 4, true) + c.splitAndScatter("0001", "0002", "0003", "0008", "0009") + installSubscribeSupport(c) + + c.onGetClient = func(u uint64) error { + return status.Error(codes.DataLoss, "upon an eclipsed night, some of data (not all data) have fled from the dataset") + } + sub := streamhelper.NewSubscriber(c, c) + req.NoError(sub.UpdateStoreTopology(ctx)) + req.Error(sub.PendingErrors()) + + c.onGetClient = nil + sub.HandleErrors(ctx) + req.NoError(sub.PendingErrors()) +} + +func TestStoreRemoved(t *testing.T) { + req := require.New(t) + ctx := context.Background() + c := createFakeCluster(t, 4, true) + c.splitAndScatter("0001", "0002", "0003", "0008", "0009", "0010", "0100", "0956", "1000") + + installSubscribeSupport(c) + sub := streamhelper.NewSubscriber(c, c) + req.NoError(sub.UpdateStoreTopology(ctx)) + + var cp uint64 + for i := 0; i < 10; i++ { + cp = c.advanceCheckpoints() + c.flushAll() + } + sub.HandleErrors(ctx) + req.NoError(sub.PendingErrors()) + for _, s := range c.stores { + c.removeStore(s.id) + break + } + req.NoError(sub.UpdateStoreTopology(ctx)) + for i := 0; i < 10; i++ { + cp = c.advanceCheckpoints() + c.flushAll() + } + sub.HandleErrors(ctx) + req.NoError(sub.PendingErrors()) + + sub.Drop() + s := spans.Sorted(spans.NewFullWith(spans.Full(), 1)) + for k := range sub.Events() { + s.Merge(k) + } + + defer func() { + if t.Failed() { + fmt.Println(c) + spans.Debug(s) + } + }() + + req.Equal(cp, s.MinValue(), "cp = %d, s = %d", cp, s.MinValue()) +} + +func TestSomeOfStoreUnsupported(t *testing.T) { + req := require.New(t) + ctx := context.Background() + c := createFakeCluster(t, 4, true) + c.splitAndScatter("0001", "0002", "0003", "0008", "0009", "0010", "0100", "0956", "1000") + + sub := streamhelper.NewSubscriber(c, c) + installSubscribeSupportForRandomN(c, 3) + req.NoError(sub.UpdateStoreTopology(ctx)) + + var cp uint64 + for i := 0; i < 10; i++ { + cp = c.advanceCheckpoints() + c.flushAll() + } + s := spans.Sorted(spans.NewFullWith(spans.Full(), 1)) + m := new(sync.Mutex) + sub.Drop() + for k := range sub.Events() { + s.Merge(k) + } + + rngs := make([]spans.Span, 0) + s.TraverseValuesLessThan(cp, func(v spans.Valued) bool { + rngs = append(rngs, v.Key) + return true + }) + coll := streamhelper.NewClusterCollector(ctx, c) + coll.SetOnSuccessHook(func(u uint64, kr spans.Span) { + m.Lock() + defer m.Unlock() + s.Merge(spans.Valued{Key: kr, Value: u}) + }) + ld := uint64(0) + for _, rng := range rngs { + iter := streamhelper.IterateRegion(c, rng.StartKey, rng.EndKey) + for !iter.Done() { + rs, err := iter.Next(ctx) + req.NoError(err) + for _, r := range rs { + if ld == 0 { + ld = r.Leader.StoreId + } else { + req.Equal(r.Leader.StoreId, ld, "the leader is from different store: some of events not pushed") + } + coll.CollectRegion(r) + } + } + } + _, err := coll.Finish(ctx) + req.NoError(err) + req.Equal(cp, s.MinValue()) +} diff --git a/br/pkg/streamhelper/tsheap.go b/br/pkg/streamhelper/tsheap.go deleted file mode 100644 index 6c2fb510776e7..0000000000000 --- a/br/pkg/streamhelper/tsheap.go +++ /dev/null @@ -1,326 +0,0 @@ -// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. - -package streamhelper - -import ( - "encoding/hex" - "fmt" - "strings" - "sync" - "time" - - "github.com/google/btree" - "github.com/pingcap/errors" - berrors "github.com/pingcap/tidb/br/pkg/errors" - "github.com/pingcap/tidb/br/pkg/logutil" - "github.com/pingcap/tidb/br/pkg/redact" - "github.com/pingcap/tidb/br/pkg/utils" - "github.com/pingcap/tidb/kv" - "github.com/tikv/client-go/v2/oracle" - "go.uber.org/zap/zapcore" -) - -// CheckpointsCache is the heap-like cache for checkpoints. -// -// "Checkpoint" is the "Resolved TS" of some range. -// A resolved ts is a "watermark" for the system, which: -// - implies there won't be any transactions (in some range) commit with `commit_ts` smaller than this TS. -// - is monotonic increasing. -// A "checkpoint" is a "safe" Resolved TS, which: -// - is a TS *less than* the real resolved ts of now. -// - is based on range (it only promises there won't be new committed txns in the range). -// - the checkpoint of union of ranges is the minimal checkpoint of all ranges. -// As an example: -/* - +----------------------------------+ - ^-----------^ (Checkpoint = 42) - ^---------------^ (Checkpoint = 76) - ^-----------------------^ (Checkpoint = min(42, 76) = 42) -*/ -// For calculating the global checkpoint, we can make a heap-like structure: -// Checkpoint Ranges -// 42 -> {[0, 8], [16, 100]} -// 1002 -> {[8, 16]} -// 1082 -> {[100, inf]} -// For now, the checkpoint of range [8, 16] and [100, inf] won't affect the global checkpoint -// directly, so we can try to advance only the ranges of {[0, 8], [16, 100]} (which's checkpoint is steal). -// Once them get advance, the global checkpoint would be advanced then, -// and we don't need to update all ranges (because some new ranges don't need to be advanced so quickly.) -type CheckpointsCache interface { - fmt.Stringer - // InsertRange inserts a range with specified TS to the cache. - InsertRange(ts uint64, rng kv.KeyRange) - // InsertRanges inserts a set of ranges that sharing checkpoint to the cache. - InsertRanges(rst RangesSharesTS) - // CheckpointTS returns the now global (union of all ranges) checkpoint of the cache. - CheckpointTS() uint64 - // PopRangesWithGapGT pops the ranges which's checkpoint is - PopRangesWithGapGT(d time.Duration) []*RangesSharesTS - // Check whether the ranges in the cache is integrate. - ConsistencyCheck(ranges []kv.KeyRange) error - // Clear the cache. - Clear() -} - -// NoOPCheckpointCache is used when cache disabled. -type NoOPCheckpointCache struct{} - -func (NoOPCheckpointCache) InsertRange(ts uint64, rng kv.KeyRange) {} - -func (NoOPCheckpointCache) InsertRanges(rst RangesSharesTS) {} - -func (NoOPCheckpointCache) Clear() {} - -func (NoOPCheckpointCache) String() string { - return "NoOPCheckpointCache" -} - -func (NoOPCheckpointCache) CheckpointTS() uint64 { - panic("invalid state: NoOPCheckpointCache should never be used in advancing!") -} - -func (NoOPCheckpointCache) PopRangesWithGapGT(d time.Duration) []*RangesSharesTS { - panic("invalid state: NoOPCheckpointCache should never be used in advancing!") -} - -func (NoOPCheckpointCache) ConsistencyCheck([]kv.KeyRange) error { - return errors.Annotatef(berrors.ErrUnsupportedOperation, "invalid state: NoOPCheckpointCache should never be used in advancing!") -} - -// RangesSharesTS is a set of ranges shares the same timestamp. -type RangesSharesTS struct { - TS uint64 - Ranges []kv.KeyRange -} - -func (rst *RangesSharesTS) Zap() zapcore.ObjectMarshaler { - return zapcore.ObjectMarshalerFunc(func(oe zapcore.ObjectEncoder) error { - rngs := rst.Ranges - if len(rst.Ranges) > 3 { - rngs = rst.Ranges[:3] - } - - oe.AddUint64("checkpoint", rst.TS) - return oe.AddArray("items", zapcore.ArrayMarshalerFunc(func(ae zapcore.ArrayEncoder) error { - return ae.AppendObject(zapcore.ObjectMarshalerFunc(func(oe1 zapcore.ObjectEncoder) error { - for _, rng := range rngs { - oe1.AddString("start-key", redact.String(hex.EncodeToString(rng.StartKey))) - oe1.AddString("end-key", redact.String(hex.EncodeToString(rng.EndKey))) - } - return nil - })) - })) - }) -} - -func (rst *RangesSharesTS) String() string { - // Make a more friendly string. - return fmt.Sprintf("@%sR%d", oracle.GetTimeFromTS(rst.TS).Format("0405"), len(rst.Ranges)) -} - -func (rst *RangesSharesTS) Less(other btree.Item) bool { - return rst.TS < other.(*RangesSharesTS).TS -} - -// Checkpoints is a heap that collects all checkpoints of -// regions, it supports query the latest checkpoint fast. -// This structure is thread safe. -type Checkpoints struct { - tree *btree.BTree - - mu sync.Mutex -} - -func NewCheckpoints() *Checkpoints { - return &Checkpoints{ - tree: btree.New(32), - } -} - -// String formats the slowest 5 ranges sharing TS to string. -func (h *Checkpoints) String() string { - h.mu.Lock() - defer h.mu.Unlock() - - b := new(strings.Builder) - count := 0 - total := h.tree.Len() - h.tree.Ascend(func(i btree.Item) bool { - rst := i.(*RangesSharesTS) - b.WriteString(rst.String()) - b.WriteString(";") - count++ - return count < 5 - }) - if total-count > 0 { - fmt.Fprintf(b, "O%d", total-count) - } - return b.String() -} - -// InsertRanges insert a RangesSharesTS directly to the tree. -func (h *Checkpoints) InsertRanges(r RangesSharesTS) { - h.mu.Lock() - defer h.mu.Unlock() - if items := h.tree.Get(&r); items != nil { - i := items.(*RangesSharesTS) - i.Ranges = append(i.Ranges, r.Ranges...) - } else { - h.tree.ReplaceOrInsert(&r) - } -} - -// InsertRange inserts the region and its TS into the region tree. -func (h *Checkpoints) InsertRange(ts uint64, rng kv.KeyRange) { - h.mu.Lock() - defer h.mu.Unlock() - r := h.tree.Get(&RangesSharesTS{TS: ts}) - if r == nil { - r = &RangesSharesTS{TS: ts} - h.tree.ReplaceOrInsert(r) - } - rr := r.(*RangesSharesTS) - rr.Ranges = append(rr.Ranges, rng) -} - -// Clear removes all records in the checkpoint cache. -func (h *Checkpoints) Clear() { - h.mu.Lock() - defer h.mu.Unlock() - h.tree.Clear(false) -} - -// PopRangesWithGapGT pops ranges with gap greater than the specified duration. -// NOTE: maybe make something like `DrainIterator` for better composing? -func (h *Checkpoints) PopRangesWithGapGT(d time.Duration) []*RangesSharesTS { - h.mu.Lock() - defer h.mu.Unlock() - result := []*RangesSharesTS{} - for { - item, ok := h.tree.Min().(*RangesSharesTS) - if !ok { - return result - } - if time.Since(oracle.GetTimeFromTS(item.TS)) >= d { - result = append(result, item) - h.tree.DeleteMin() - } else { - return result - } - } -} - -// CheckpointTS returns the cached checkpoint TS by the current state of the cache. -func (h *Checkpoints) CheckpointTS() uint64 { - h.mu.Lock() - defer h.mu.Unlock() - item, ok := h.tree.Min().(*RangesSharesTS) - if !ok { - return 0 - } - return item.TS -} - -// ConsistencyCheck checks whether the tree contains the full range of key space. -func (h *Checkpoints) ConsistencyCheck(rangesIn []kv.KeyRange) error { - h.mu.Lock() - rangesReal := make([]kv.KeyRange, 0, 1024) - h.tree.Ascend(func(i btree.Item) bool { - rangesReal = append(rangesReal, i.(*RangesSharesTS).Ranges...) - return true - }) - h.mu.Unlock() - - r := CollapseRanges(len(rangesReal), func(i int) kv.KeyRange { return rangesReal[i] }) - ri := CollapseRanges(len(rangesIn), func(i int) kv.KeyRange { return rangesIn[i] }) - - return errors.Annotatef(checkIntervalIsSubset(r, ri), "ranges: (current) %s (not in) %s", logutil.StringifyKeys(r), - logutil.StringifyKeys(ri)) -} - -// A simple algorithm to detect non-overlapped ranges. -// It maintains the "current" probe, and let the ranges to check "consume" it. -// For example: -// toCheck: |_____________________| |_____________| -// . ^checking -// subsetOf: |_________| |_______| |__________| -// . ^probing -// probing is the subrange of checking, consume it and move forward the probe. -// toCheck: |_____________________| |_____________| -// . ^checking -// subsetOf: |_________| |_______| |__________| -// . ^probing -// consume it, too. -// toCheck: |_____________________| |_____________| -// . ^checking -// subsetOf: |_________| |_______| |__________| -// . ^probing -// checking is at the left of probing and no overlaps, moving it forward. -// toCheck: |_____________________| |_____________| -// . ^checking -// subsetOf: |_________| |_______| |__________| -// . ^probing -// consume it. all subset ranges are consumed, check passed. -func checkIntervalIsSubset(toCheck []kv.KeyRange, subsetOf []kv.KeyRange) error { - i := 0 - si := 0 - - for { - // We have checked all ranges. - if si >= len(subsetOf) { - return nil - } - // There are some ranges doesn't reach the end. - if i >= len(toCheck) { - return errors.Annotatef(berrors.ErrPiTRMalformedMetadata, - "there remains a range doesn't be fully consumed: %s", - logutil.StringifyRange(subsetOf[si])) - } - - checking := toCheck[i] - probing := subsetOf[si] - // checking: |___________| - // probing: |_________| - // A rare case: the "first" range is out of bound or not fully covers the probing range. - if utils.CompareBytesExt(checking.StartKey, false, probing.StartKey, false) > 0 { - holeEnd := checking.StartKey - if utils.CompareBytesExt(holeEnd, false, probing.EndKey, true) > 0 { - holeEnd = probing.EndKey - } - return errors.Annotatef(berrors.ErrPiTRMalformedMetadata, "probably a hole in key ranges: %s", logutil.StringifyRange{ - StartKey: probing.StartKey, - EndKey: holeEnd, - }) - } - - // checking: |_____| - // probing: |_______| - // Just move forward checking. - if utils.CompareBytesExt(checking.EndKey, true, probing.StartKey, false) < 0 { - i += 1 - continue - } - - // checking: |_________| - // probing: |__________________| - // Given all of the ranges are "collapsed", the next checking range must - // not be adjacent with the current checking range. - // And hence there must be a "hole" in the probing key space. - if utils.CompareBytesExt(checking.EndKey, true, probing.EndKey, true) < 0 { - next := probing.EndKey - if i+1 < len(toCheck) { - next = toCheck[i+1].EndKey - } - return errors.Annotatef(berrors.ErrPiTRMalformedMetadata, "probably a hole in key ranges: %s", logutil.StringifyRange{ - StartKey: checking.EndKey, - EndKey: next, - }) - } - // checking: |________________| - // probing: |_____________| - // The current checking range fills the current probing range, - // or the current checking range is out of the current range. - // let's move the probing forward. - si += 1 - } -} diff --git a/br/pkg/streamhelper/tsheap_test.go b/br/pkg/streamhelper/tsheap_test.go deleted file mode 100644 index 173bc2e0a0334..0000000000000 --- a/br/pkg/streamhelper/tsheap_test.go +++ /dev/null @@ -1,248 +0,0 @@ -// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. -package streamhelper_test - -import ( - "fmt" - "math" - "math/rand" - "testing" - - "github.com/pingcap/tidb/br/pkg/streamhelper" - "github.com/pingcap/tidb/kv" - "github.com/stretchr/testify/require" -) - -func TestInsert(t *testing.T) { - cases := []func(func(ts uint64, a, b string)){ - func(insert func(ts uint64, a, b string)) { - insert(1, "", "01") - insert(1, "01", "02") - insert(2, "02", "022") - insert(4, "022", "") - }, - func(insert func(ts uint64, a, b string)) { - insert(1, "", "01") - insert(2, "", "01") - insert(2, "011", "02") - insert(1, "", "") - insert(65, "03", "04") - }, - } - - for _, c := range cases { - cps := streamhelper.NewCheckpoints() - expected := map[uint64]*streamhelper.RangesSharesTS{} - checkpoint := uint64(math.MaxUint64) - insert := func(ts uint64, a, b string) { - cps.InsertRange(ts, kv.KeyRange{ - StartKey: []byte(a), - EndKey: []byte(b), - }) - i, ok := expected[ts] - if !ok { - expected[ts] = &streamhelper.RangesSharesTS{TS: ts, Ranges: []kv.KeyRange{{StartKey: []byte(a), EndKey: []byte(b)}}} - } else { - i.Ranges = append(i.Ranges, kv.KeyRange{StartKey: []byte(a), EndKey: []byte(b)}) - } - if ts < checkpoint { - checkpoint = ts - } - } - c(insert) - require.Equal(t, checkpoint, cps.CheckpointTS()) - rngs := cps.PopRangesWithGapGT(0) - for _, rng := range rngs { - other := expected[rng.TS] - require.Equal(t, other, rng) - } - } -} - -func TestMergeRanges(t *testing.T) { - r := func(a, b string) kv.KeyRange { - return kv.KeyRange{StartKey: []byte(a), EndKey: []byte(b)} - } - type Case struct { - expected []kv.KeyRange - parameter []kv.KeyRange - } - cases := []Case{ - { - parameter: []kv.KeyRange{r("01", "01111"), r("0111", "0112")}, - expected: []kv.KeyRange{r("01", "0112")}, - }, - { - parameter: []kv.KeyRange{r("01", "03"), r("02", "04")}, - expected: []kv.KeyRange{r("01", "04")}, - }, - { - parameter: []kv.KeyRange{r("04", "08"), r("09", "10")}, - expected: []kv.KeyRange{r("04", "08"), r("09", "10")}, - }, - { - parameter: []kv.KeyRange{r("01", "03"), r("02", "04"), r("05", "07"), r("08", "09")}, - expected: []kv.KeyRange{r("01", "04"), r("05", "07"), r("08", "09")}, - }, - { - parameter: []kv.KeyRange{r("01", "02"), r("012", "")}, - expected: []kv.KeyRange{r("01", "")}, - }, - { - parameter: []kv.KeyRange{r("", "01"), r("02", "03"), r("021", "")}, - expected: []kv.KeyRange{r("", "01"), r("02", "")}, - }, - { - parameter: []kv.KeyRange{r("", "01"), r("001", "")}, - expected: []kv.KeyRange{r("", "")}, - }, - { - parameter: []kv.KeyRange{r("", "01"), r("", ""), r("", "02")}, - expected: []kv.KeyRange{r("", "")}, - }, - { - parameter: []kv.KeyRange{r("", "01"), r("01", ""), r("", "02"), r("", "03"), r("01", "02")}, - expected: []kv.KeyRange{r("", "")}, - }, - { - parameter: []kv.KeyRange{r("", ""), r("", "01"), r("01", ""), r("01", "02")}, - expected: []kv.KeyRange{r("", "")}, - }, - } - - for i, c := range cases { - result := streamhelper.CollapseRanges(len(c.parameter), func(i int) kv.KeyRange { - return c.parameter[i] - }) - require.Equal(t, c.expected, result, "case = %d", i) - } -} - -func TestInsertRanges(t *testing.T) { - r := func(a, b string) kv.KeyRange { - return kv.KeyRange{StartKey: []byte(a), EndKey: []byte(b)} - } - rs := func(ts uint64, ranges ...kv.KeyRange) streamhelper.RangesSharesTS { - return streamhelper.RangesSharesTS{TS: ts, Ranges: ranges} - } - - type Case struct { - Expected []streamhelper.RangesSharesTS - Parameters []streamhelper.RangesSharesTS - } - - cases := []Case{ - { - Parameters: []streamhelper.RangesSharesTS{ - rs(1, r("0", "1"), r("1", "2")), - rs(1, r("2", "3"), r("3", "4")), - }, - Expected: []streamhelper.RangesSharesTS{ - rs(1, r("0", "1"), r("1", "2"), r("2", "3"), r("3", "4")), - }, - }, - { - Parameters: []streamhelper.RangesSharesTS{ - rs(1, r("0", "1")), - rs(2, r("2", "3")), - rs(1, r("4", "5"), r("6", "7")), - }, - Expected: []streamhelper.RangesSharesTS{ - rs(1, r("0", "1"), r("4", "5"), r("6", "7")), - rs(2, r("2", "3")), - }, - }, - } - - for _, c := range cases { - theTree := streamhelper.NewCheckpoints() - for _, p := range c.Parameters { - theTree.InsertRanges(p) - } - ranges := theTree.PopRangesWithGapGT(0) - for i, rs := range ranges { - require.ElementsMatch(t, c.Expected[i].Ranges, rs.Ranges, "case = %#v", c) - } - } -} - -func TestConsistencyCheckOverRange(t *testing.T) { - r := func(a, b string) kv.KeyRange { - return kv.KeyRange{StartKey: []byte(a), EndKey: []byte(b)} - } - type Case struct { - checking []kv.KeyRange - probing []kv.KeyRange - isSubset bool - } - - cases := []Case{ - // basic: exactly match. - { - checking: []kv.KeyRange{r("0001", "0002"), r("0002", "0003"), r("0004", "0005")}, - probing: []kv.KeyRange{r("0001", "0003"), r("0004", "0005")}, - isSubset: true, - }, - // not fully match, probing longer. - { - checking: []kv.KeyRange{r("0001", "0002"), r("0002", "0003"), r("0004", "0005")}, - probing: []kv.KeyRange{r("0000", "0003"), r("0004", "00051")}, - isSubset: false, - }, - // with infinity end keys. - { - checking: []kv.KeyRange{r("0001", "0002"), r("0002", "0003"), r("0004", "")}, - probing: []kv.KeyRange{r("0001", "0003"), r("0004", "")}, - isSubset: true, - }, - { - checking: []kv.KeyRange{r("0001", "0002"), r("0002", "0003"), r("0004", "")}, - probing: []kv.KeyRange{r("0001", "0003"), r("0004", "0005")}, - isSubset: true, - }, - { - checking: []kv.KeyRange{r("0001", "0002"), r("0002", "0003"), r("0004", "0005")}, - probing: []kv.KeyRange{r("0001", "0003"), r("0004", "")}, - isSubset: false, - }, - // overlapped probe. - { - checking: []kv.KeyRange{r("0001", "0002"), r("0002", "0003"), r("0004", "0007")}, - probing: []kv.KeyRange{r("0001", "0008")}, - isSubset: false, - }, - { - checking: []kv.KeyRange{r("0001", "0008")}, - probing: []kv.KeyRange{r("0001", "0002"), r("0002", "0003"), r("0004", "0007")}, - isSubset: true, - }, - { - checking: []kv.KeyRange{r("0100", "0120"), r("0130", "0141")}, - probing: []kv.KeyRange{r("0000", "0001")}, - isSubset: false, - }, - { - checking: []kv.KeyRange{r("0100", "0120")}, - probing: []kv.KeyRange{r("0090", "0110"), r("0115", "0120")}, - isSubset: false, - }, - } - - run := func(t *testing.T, c Case) { - tree := streamhelper.NewCheckpoints() - for _, r := range c.checking { - tree.InsertRange(rand.Uint64()%10, r) - } - err := tree.ConsistencyCheck(c.probing) - if c.isSubset { - require.NoError(t, err) - } else { - require.Error(t, err) - } - } - - for i, c := range cases { - t.Run(fmt.Sprintf("#%d", i), func(tc *testing.T) { - run(tc, c) - }) - } -} diff --git a/br/pkg/summary/collector.go b/br/pkg/summary/collector.go index 705c26df3e4ac..1a16fb6dc9cfc 100644 --- a/br/pkg/summary/collector.go +++ b/br/pkg/summary/collector.go @@ -46,6 +46,10 @@ type LogCollector interface { SetSuccessStatus(success bool) + NowDureTime() time.Duration + + AdjustStartTimeToEarlierTime(t time.Duration) + Summary(name string) Log(msg string, fields ...zap.Field) @@ -163,6 +167,18 @@ func logKeyFor(key string) string { return strings.ReplaceAll(key, " ", "-") } +func (tc *logCollector) NowDureTime() time.Duration { + tc.mu.Lock() + defer tc.mu.Unlock() + return time.Since(tc.startTime) +} + +func (tc *logCollector) AdjustStartTimeToEarlierTime(t time.Duration) { + tc.mu.Lock() + defer tc.mu.Unlock() + tc.startTime = tc.startTime.Add(-t) +} + func (tc *logCollector) Summary(name string) { tc.mu.Lock() defer func() { diff --git a/br/pkg/summary/summary.go b/br/pkg/summary/summary.go index 7ae488785760e..45c8fbbc55997 100644 --- a/br/pkg/summary/summary.go +++ b/br/pkg/summary/summary.go @@ -43,6 +43,15 @@ func SetSuccessStatus(success bool) { collector.SetSuccessStatus(success) } +// NowDureTime returns the duration between start time and current time +func NowDureTime() time.Duration { + return collector.NowDureTime() +} + +func AdjustStartTimeToEarlierTime(t time.Duration) { + collector.AdjustStartTimeToEarlierTime(t) +} + // Summary outputs summary log. func Summary(name string) { collector.Summary(name) diff --git a/br/pkg/task/BUILD.bazel b/br/pkg/task/BUILD.bazel index 979afd1ba9110..0ad8cde87137e 100644 --- a/br/pkg/task/BUILD.bazel +++ b/br/pkg/task/BUILD.bazel @@ -67,6 +67,7 @@ go_library( "@com_github_spf13_pflag//:pflag", "@com_github_tikv_client_go_v2//config", "@com_github_tikv_client_go_v2//oracle", + "@com_github_tikv_client_go_v2//tikv", "@com_github_tikv_pd_client//:client", "@com_google_cloud_go_storage//:storage", "@io_etcd_go_etcd_client_pkg_v3//transport", diff --git a/br/pkg/task/backup.go b/br/pkg/task/backup.go index 8b3a03c9a8719..5ddaf0e6ccd25 100644 --- a/br/pkg/task/backup.go +++ b/br/pkg/task/backup.go @@ -4,6 +4,8 @@ package task import ( "context" + "crypto/sha256" + "encoding/json" "fmt" "os" "strconv" @@ -26,6 +28,8 @@ import ( "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/br/pkg/summary" "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/br/pkg/version" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/statistics/handle" @@ -45,11 +49,15 @@ const ( flagRemoveSchedulers = "remove-schedulers" flagIgnoreStats = "ignore-stats" flagUseBackupMetaV2 = "use-backupmeta-v2" + flagUseCheckpoint = "use-checkpoint" + flagKeyspaceName = "keyspace-name" + flagReplicaReadLabel = "replica-read-label" flagGCTTL = "gcttl" defaultBackupConcurrency = 4 maxBackupConcurrency = 256 + checkpointDefaultGCTTL = 72 * 60 // 72 minutes ) const ( @@ -70,13 +78,15 @@ type CompressionConfig struct { type BackupConfig struct { Config - TimeAgo time.Duration `json:"time-ago" toml:"time-ago"` - BackupTS uint64 `json:"backup-ts" toml:"backup-ts"` - LastBackupTS uint64 `json:"last-backup-ts" toml:"last-backup-ts"` - GCTTL int64 `json:"gc-ttl" toml:"gc-ttl"` - RemoveSchedulers bool `json:"remove-schedulers" toml:"remove-schedulers"` - IgnoreStats bool `json:"ignore-stats" toml:"ignore-stats"` - UseBackupMetaV2 bool `json:"use-backupmeta-v2"` + TimeAgo time.Duration `json:"time-ago" toml:"time-ago"` + BackupTS uint64 `json:"backup-ts" toml:"backup-ts"` + LastBackupTS uint64 `json:"last-backup-ts" toml:"last-backup-ts"` + GCTTL int64 `json:"gc-ttl" toml:"gc-ttl"` + RemoveSchedulers bool `json:"remove-schedulers" toml:"remove-schedulers"` + IgnoreStats bool `json:"ignore-stats" toml:"ignore-stats"` + UseBackupMetaV2 bool `json:"use-backupmeta-v2"` + UseCheckpoint bool `json:"use-checkpoint" toml:"use-checkpoint"` + ReplicaReadLabel map[string]string `json:"replica-read-label" toml:"replica-read-label"` CompressionConfig // for ebs-based backup @@ -118,6 +128,8 @@ func DefineBackupFlags(flags *pflag.FlagSet) { flags.Bool(flagUseBackupMetaV2, false, "use backup meta v2 to store meta info") + + flags.String(flagKeyspaceName, "", "keyspace name for backup") // This flag will change the structure of backupmeta. // we must make sure the old three version of br can parse the v2 meta to keep compatibility. // so this flag should set to false for three version by default. @@ -126,6 +138,11 @@ func DefineBackupFlags(flags *pflag.FlagSet) { // but will generate v1 meta due to this flag is false. the behaviour is as same as v4.0.15, v4.0.16. // finally v4.0.17 will set this flag to true, and generate v2 meta. _ = flags.MarkHidden(flagUseBackupMetaV2) + + flags.Bool(flagUseCheckpoint, true, "use checkpoint mode") + _ = flags.MarkHidden(flagUseCheckpoint) + + flags.String(flagReplicaReadLabel, "", "specify the label of the stores to be used for backup, e.g. 'label_key:label_value'") } // ParseFromFlags parses the backup-related flags from the flag set. @@ -150,10 +167,34 @@ func (cfg *BackupConfig) ParseFromFlags(flags *pflag.FlagSet) error { if err != nil { return errors.Trace(err) } + cfg.UseBackupMetaV2, err = flags.GetBool(flagUseBackupMetaV2) + if err != nil { + return errors.Trace(err) + } + cfg.UseCheckpoint, err = flags.GetBool(flagUseCheckpoint) + if err != nil { + return errors.Trace(err) + } + if cfg.LastBackupTS > 0 { + // TODO: compatible with incremental backup + cfg.UseCheckpoint = false + log.Info("since incremental backup is used, turn off checkpoint mode") + } + if cfg.UseBackupMetaV2 { + // TODO: compatible with backup meta v2, maybe just clean the meta files + cfg.UseCheckpoint = false + log.Info("since backup meta v2 is used, turn off checkpoint mode") + } gcTTL, err := flags.GetInt64(flagGCTTL) if err != nil { return errors.Trace(err) } + // if use checkpoint and gcTTL is the default value + // update gcttl to checkpoint's default gc ttl + if cfg.UseCheckpoint && gcTTL == utils.DefaultBRGCSafePointTTL { + gcTTL = checkpointDefaultGCTTL + log.Info("use checkpoint's default GC TTL", zap.Int64("GC TTL", gcTTL)) + } cfg.GCTTL = gcTTL compressionCfg, err := parseCompressionFlags(flags) @@ -173,7 +214,7 @@ func (cfg *BackupConfig) ParseFromFlags(flags *pflag.FlagSet) error { if err != nil { return errors.Trace(err) } - cfg.UseBackupMetaV2, err = flags.GetBool(flagUseBackupMetaV2) + cfg.KeyspaceName, err = flags.GetString(flagKeyspaceName) if err != nil { return errors.Trace(err) } @@ -206,6 +247,11 @@ func (cfg *BackupConfig) ParseFromFlags(flags *pflag.FlagSet) error { } } + cfg.ReplicaReadLabel, err = parseReplicaReadLabelFlag(flags) + if err != nil { + return errors.Trace(err) + } + return nil } @@ -269,6 +315,23 @@ func (cfg *BackupConfig) Adjust() { } } +// a rough hash for checkpoint checker +func (cfg *BackupConfig) Hash() ([]byte, error) { + config := &BackupConfig{ + LastBackupTS: cfg.LastBackupTS, + IgnoreStats: cfg.IgnoreStats, + UseCheckpoint: cfg.UseCheckpoint, + Config: cfg.Config, + } + data, err := json.Marshal(config) + if err != nil { + return nil, errors.Trace(err) + } + hash := sha256.Sum256(data) + + return hash[:], nil +} + func isFullBackup(cmdName string) bool { return cmdName == FullBackupCmd } @@ -276,6 +339,9 @@ func isFullBackup(cmdName string) bool { // RunBackup starts a backup task inside the current goroutine. func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig) error { cfg.Adjust() + config.UpdateGlobal(func(conf *config.Config) { + conf.KeyspaceName = cfg.KeyspaceName + }) defer summary.Summary(cmdName) ctx, cancel := context.WithCancel(c) @@ -301,6 +367,14 @@ func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig return errors.Trace(err) } defer mgr.Close() + // after version check, check the cluster whether support checkpoint mode + if cfg.UseCheckpoint { + err = version.CheckCheckpointSupport() + if err != nil { + log.Warn("unable to use checkpoint mode, fall back to normal mode", zap.Error(err)) + cfg.UseCheckpoint = false + } + } var statsHandle *handle.Handle if !skipStats { statsHandle = mgr.GetDomain().StatsHandle() @@ -308,22 +382,23 @@ func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig var newCollationEnable string err = g.UseOneShotSession(mgr.GetStorage(), !needDomain, func(se glue.Session) error { - newCollationEnable, err = se.GetGlobalVariable(tidbNewCollationEnabled) + newCollationEnable, err = se.GetGlobalVariable(utils.GetTidbNewCollationEnabled()) if err != nil { return errors.Trace(err) } log.Info("get new_collations_enabled_on_first_bootstrap config from system table", - zap.String(tidbNewCollationEnabled, newCollationEnable)) + zap.String(utils.GetTidbNewCollationEnabled(), newCollationEnable)) return nil }) if err != nil { return errors.Trace(err) } - client, err := backup.NewBackupClient(ctx, mgr) - if err != nil { - return errors.Trace(err) - } + client := backup.NewBackupClient(ctx, mgr) + + // set cipher only for checkpoint + client.SetCipher(&cfg.CipherInfo) + opts := storage.ExternalStorageOptions{ NoCredentials: cfg.NoCreds, SendCredentials: cfg.SendCreds, @@ -332,6 +407,16 @@ func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig if err = client.SetStorageAndCheckNotInUse(ctx, u, &opts); err != nil { return errors.Trace(err) } + // if checkpoint mode is unused at this time but there is checkpoint meta, + // CheckCheckpoint will stop backing up + cfgHash, err := cfg.Hash() + if err != nil { + return errors.Trace(err) + } + err = client.CheckCheckpoint(cfgHash) + if err != nil { + return errors.Trace(err) + } err = client.SetLockFile(ctx) if err != nil { return errors.Trace(err) @@ -343,24 +428,45 @@ func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig return errors.Trace(err) } g.Record("BackupTS", backupTS) + safePointID := client.GetSafePointID() sp := utils.BRServiceSafePoint{ BackupTS: backupTS, TTL: client.GetGCTTL(), - ID: utils.MakeSafePointID(), + ID: safePointID, } + // use lastBackupTS as safePoint if exists - if cfg.LastBackupTS > 0 { + isIncrementalBackup := cfg.LastBackupTS > 0 + if isIncrementalBackup { sp.BackupTS = cfg.LastBackupTS } log.Info("current backup safePoint job", zap.Object("safePoint", sp)) - err = utils.StartServiceSafePointKeeper(ctx, mgr.GetPDClient(), sp) + cctx, gcSafePointKeeperCancel := context.WithCancel(ctx) + gcSafePointKeeperRemovable := false + defer func() { + // don't reset the gc-safe-point if checkpoint mode is used and backup is not finished + if cfg.UseCheckpoint && !gcSafePointKeeperRemovable { + log.Info("skip removing gc-safepoint keeper for next retry", zap.String("gc-id", sp.ID)) + return + } + log.Info("start to remove gc-safepoint keeper") + // close the gc safe point keeper at first + gcSafePointKeeperCancel() + // set the ttl to 0 to remove the gc-safe-point + sp.TTL = 0 + if err := utils.UpdateServiceSafePoint(ctx, mgr.GetPDClient(), sp); err != nil { + log.Warn("failed to update service safe point, backup may fail if gc triggered", + zap.Error(err), + ) + } + log.Info("finish removing gc-safepoint keeper") + }() + err = utils.StartServiceSafePointKeeper(cctx, mgr.GetPDClient(), sp) if err != nil { return errors.Trace(err) } - isIncrementalBackup := cfg.LastBackupTS > 0 - if cfg.RemoveSchedulers { log.Debug("removing some PD schedulers") restore, e := mgr.RemoveSchedulers(ctx) @@ -388,6 +494,7 @@ func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig CompressionType: cfg.CompressionType, CompressionLevel: cfg.CompressionLevel, CipherInfo: &cfg.CipherInfo, + ReplicaRead: len(cfg.ReplicaReadLabel) != 0, } brVersion := g.GetVersion() clusterVersion, err := mgr.GetClusterVersion(ctx) @@ -395,10 +502,15 @@ func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig return errors.Trace(err) } - ranges, schemas, policies, err := backup.BuildBackupRangeAndSchema(mgr.GetStorage(), cfg.TableFilter, backupTS, isFullBackup(cmdName)) + ranges, schemas, policies, err := client.BuildBackupRangeAndSchema(mgr.GetStorage(), cfg.TableFilter, backupTS, isFullBackup(cmdName)) if err != nil { return errors.Trace(err) } + // Add keyspace prefix to BackupRequest + for i := range ranges { + start, end := ranges[i].StartKey, ranges[i].EndKey + ranges[i].StartKey, ranges[i].EndKey = mgr.GetStorage().GetCodec().EncodeRange(start, end) + } // Metafile size should be less than 64MB. metawriter := metautil.NewMetaWriter(client.GetStorage(), @@ -412,6 +524,7 @@ func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig m.ClusterVersion = clusterVersion m.BrVersion = brVersion m.NewCollationsEnabled = newCollationEnable + m.ApiVersion = mgr.GetStorage().GetCodec().GetAPIVersion() }) log.Info("get placement policies", zap.Int("count", len(policies))) @@ -422,7 +535,7 @@ func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig } // nothing to backup - if ranges == nil || len(ranges) <= 0 { + if len(ranges) == 0 { pdAddress := strings.Join(cfg.PD, ",") log.Warn("Nothing to backup, maybe connected to cluster for restoring", zap.String("PD address", pdAddress)) @@ -503,8 +616,20 @@ func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig }) } } + + if cfg.UseCheckpoint { + if err = client.StartCheckpointRunner(ctx, cfgHash, backupTS, ranges, safePointID, progressCallBack); err != nil { + return errors.Trace(err) + } + defer func() { + if !gcSafePointKeeperRemovable { + log.Info("wait for flush checkpoint...") + client.WaitForFinishCheckpoint(ctx) + } + }() + } metawriter.StartWriteMetasAsync(ctx, metautil.AppendDataFile) - err = client.BackupRanges(ctx, ranges, req, uint(cfg.Concurrency), metawriter, progressCallBack) + err = client.BackupRanges(ctx, ranges, req, uint(cfg.Concurrency), cfg.ReplicaReadLabel, metawriter, progressCallBack) if err != nil { return errors.Trace(err) } @@ -532,7 +657,7 @@ func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig schemasConcurrency := uint(mathutil.Min(backup.DefaultSchemaConcurrency, schemas.Len())) err = schemas.BackupSchemas( - ctx, metawriter, mgr.GetStorage(), statsHandle, backupTS, schemasConcurrency, cfg.ChecksumConcurrency, skipChecksum, updateCh) + ctx, metawriter, client.GetCheckpointRunner(), mgr.GetStorage(), statsHandle, backupTS, schemasConcurrency, cfg.ChecksumConcurrency, skipChecksum, updateCh) if err != nil { return errors.Trace(err) } @@ -541,6 +666,9 @@ func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig if err != nil { return errors.Trace(err) } + // Since backupmeta is flushed on the external storage, + // we can remove the gc safepoint keeper + gcSafePointKeeperRemovable = true // Checksum has finished, close checksum progress. updateCh.Close() @@ -594,7 +722,7 @@ func ParseTSString(ts string, tzCheck bool) (uint64, error) { return 0, errors.Errorf("must set timezone when using datetime format ts, e.g. '2018-05-11 01:42:23+0800'") } } - t, err := types.ParseTime(sc, ts, mysql.TypeTimestamp, types.MaxFsp) + t, err := types.ParseTime(sc, ts, mysql.TypeTimestamp, types.MaxFsp, nil) if err != nil { return 0, errors.Trace(err) } @@ -619,3 +747,18 @@ func parseCompressionType(s string) (backuppb.CompressionType, error) { } return ct, nil } + +func parseReplicaReadLabelFlag(flags *pflag.FlagSet) (map[string]string, error) { + replicaReadLabelStr, err := flags.GetString(flagReplicaReadLabel) + if err != nil { + return nil, errors.Trace(err) + } + if replicaReadLabelStr == "" { + return nil, nil + } + kv := strings.Split(replicaReadLabelStr, ":") + if len(kv) != 2 { + return nil, errors.Annotatef(berrors.ErrInvalidArgument, "invalid replica read label '%s'", replicaReadLabelStr) + } + return map[string]string{kv[0]: kv[1]}, nil +} diff --git a/br/pkg/task/backup_ebs.go b/br/pkg/task/backup_ebs.go index 5d9a262d7cce6..ff0fb6a01a461 100644 --- a/br/pkg/task/backup_ebs.go +++ b/br/pkg/task/backup_ebs.go @@ -111,10 +111,7 @@ func RunBackupEBS(c context.Context, g glue.Glue, cfg *BackupConfig) error { return errors.Trace(err) } defer mgr.Close() - client, err := backup.NewBackupClient(ctx, mgr) - if err != nil { - return errors.Trace(err) - } + client := backup.NewBackupClient(ctx, mgr) opts := storage.ExternalStorageOptions{ NoCredentials: cfg.NoCreds, diff --git a/br/pkg/task/backup_raw.go b/br/pkg/task/backup_raw.go index 9d46c151d23c7..ed7248fd21bf4 100644 --- a/br/pkg/task/backup_raw.go +++ b/br/pkg/task/backup_raw.go @@ -144,10 +144,7 @@ func RunBackupRaw(c context.Context, g glue.Glue, cmdName string, cfg *RawKvConf } defer mgr.Close() - client, err := backup.NewBackupClient(ctx, mgr) - if err != nil { - return errors.Trace(err) - } + client := backup.NewBackupClient(ctx, mgr) opts := storage.ExternalStorageOptions{ NoCredentials: cfg.NoCreds, SendCredentials: cfg.SendCreds, @@ -216,9 +213,18 @@ func RunBackupRaw(c context.Context, g glue.Glue, cmdName string, cfg *RawKvConf CompressionLevel: cfg.CompressionLevel, CipherInfo: &cfg.CipherInfo, } + rg := rtree.Range{ + StartKey: backupRange.StartKey, + EndKey: backupRange.EndKey, + } + progressRange := &rtree.ProgressRange{ + Res: rtree.NewRangeTree(), + Incomplete: []rtree.Range{rg}, + Origin: rg, + } metaWriter := metautil.NewMetaWriter(client.GetStorage(), metautil.MetaFileSize, false, metautil.MetaFile, &cfg.CipherInfo) metaWriter.StartWriteMetasAsync(ctx, metautil.AppendDataFile) - err = client.BackupRange(ctx, req, metaWriter, progressCallBack) + err = client.BackupRange(ctx, req, map[string]string{}, progressRange, metaWriter, progressCallBack) if err != nil { return errors.Trace(err) } diff --git a/br/pkg/task/common.go b/br/pkg/task/common.go index 5d76a2db4f85b..ad223b7e34c67 100644 --- a/br/pkg/task/common.go +++ b/br/pkg/task/common.go @@ -96,8 +96,6 @@ const ( crypterAES192KeyLen = 24 crypterAES256KeyLen = 32 - tidbNewCollationEnabled = "new_collation_enabled" - flagFullBackupType = "type" ) @@ -234,6 +232,9 @@ type Config struct { // whether there's explicit filter ExplicitFilter bool `json:"-" toml:"-"` + + // KeyspaceName is the name of the keyspace of the task + KeyspaceName string `json:"keyspace-name" toml:"keyspace-name"` } // DefineCommonFlags defines the flags common to all BRIE commands. diff --git a/br/pkg/task/restore.go b/br/pkg/task/restore.go index cf1ce4682a09f..2a5c58a9febf3 100644 --- a/br/pkg/task/restore.go +++ b/br/pkg/task/restore.go @@ -26,11 +26,11 @@ import ( "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/br/pkg/version" "github.com/pingcap/tidb/config" - "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/mathutil" "github.com/spf13/cobra" "github.com/spf13/pflag" + "github.com/tikv/client-go/v2/tikv" "go.uber.org/multierr" "go.uber.org/zap" ) @@ -52,20 +52,30 @@ const ( // FlagWithPlacementPolicy corresponds to tidb config with-tidb-placement-mode // current only support STRICT or IGNORE, the default is STRICT according to tidb. FlagWithPlacementPolicy = "with-tidb-placement-mode" + // FlagKeyspaceName corresponds to tidb config keyspace-name + FlagKeyspaceName = "keyspace-name" // FlagStreamStartTS and FlagStreamRestoreTS is used for log restore timestamp range. FlagStreamStartTS = "start-ts" FlagStreamRestoreTS = "restored-ts" // FlagStreamFullBackupStorage is used for log restore, represents the full backup storage. FlagStreamFullBackupStorage = "full-backup-storage" - - defaultRestoreConcurrency = 128 - defaultRestoreStreamConcurrency = 16 - maxRestoreBatchSizeLimit = 10240 - defaultPDConcurrency = 1 - defaultBatchFlushInterval = 16 * time.Second - defaultFlagDdlBatchSize = 128 - resetSpeedLimitRetryTimes = 3 + // FlagPiTRBatchCount and FlagPiTRBatchSize are used for restore log with batch method. + FlagPiTRBatchCount = "pitr-batch-count" + FlagPiTRBatchSize = "pitr-batch-size" + FlagPiTRConcurrency = "pitr-concurrency" + + FlagResetSysUsers = "reset-sys-users" + + defaultPiTRBatchCount = 8 + defaultPiTRBatchSize = 16 * 1024 * 1024 + defaultRestoreConcurrency = 128 + defaultPiTRConcurrency = 16 + maxRestoreBatchSizeLimit = 10240 + defaultPDConcurrency = 1 + defaultBatchFlushInterval = 16 * time.Second + defaultFlagDdlBatchSize = 128 + resetSpeedLimitRetryTimes = 3 ) const ( @@ -88,6 +98,8 @@ type RestoreCommonConfig struct { // determines whether enable restore sys table on default, see fullClusterRestore in restore/client.go WithSysTable bool `json:"with-sys-table" toml:"with-sys-table"` + + ResetSysUsers []string `json:"reset-sys-users" toml:"reset-sys-users"` } // adjust adjusts the abnormal config value in the current config. @@ -113,10 +125,12 @@ func DefineRestoreCommonFlags(flags *pflag.FlagSet) { flags.Uint(FlagPDConcurrency, defaultPDConcurrency, "concurrency pd-relative operations like split & scatter.") flags.Duration(FlagBatchFlushInterval, defaultBatchFlushInterval, - "after how long a restore batch would be auto sended.") + "after how long a restore batch would be auto sent.") flags.Uint(FlagDdlBatchSize, defaultFlagDdlBatchSize, - "batch size for ddl to create a batch of tabes once.") + "batch size for ddl to create a batch of tables once.") flags.Bool(flagWithSysTable, false, "whether restore system privilege tables on default setting") + flags.StringArrayP(FlagResetSysUsers, "", []string{"cloud_admin", "root"}, "whether reset these users after restoration") + _ = flags.MarkHidden(FlagResetSysUsers) _ = flags.MarkHidden(FlagMergeRegionSizeBytes) _ = flags.MarkHidden(FlagMergeRegionKeyCount) _ = flags.MarkHidden(FlagPDConcurrency) @@ -145,6 +159,10 @@ func (cfg *RestoreCommonConfig) ParseFromFlags(flags *pflag.FlagSet) error { return errors.Trace(err) } } + cfg.ResetSysUsers, err = flags.GetStringArray(FlagResetSysUsers) + if err != nil { + return errors.Trace(err) + } return errors.Trace(err) } @@ -169,6 +187,9 @@ type RestoreConfig struct { StartTS uint64 `json:"start-ts" toml:"start-ts"` RestoreTS uint64 `json:"restore-ts" toml:"restore-ts"` tiflashRecorder *tiflashrec.TiFlashRecorder `json:"-" toml:"-"` + PitrBatchCount uint32 `json:"pitr-batch-count" toml:"pitr-batch-count"` + PitrBatchSize uint32 `json:"pitr-batch-size" toml:"pitr-batch-size"` + PitrConcurrency uint32 `json:"-" toml:"-"` // for ebs-based restore FullBackupType FullBackupType `json:"full-backup-type" toml:"full-backup-type"` @@ -188,6 +209,7 @@ func DefineRestoreFlags(flags *pflag.FlagSet) { // Do not expose this flag _ = flags.MarkHidden(flagNoSchema) flags.String(FlagWithPlacementPolicy, "STRICT", "correspond to tidb global/session variable with-tidb-placement-mode") + flags.String(FlagKeyspaceName, "", "correspond to tidb config keyspace-name") DefineRestoreCommonFlags(flags) } @@ -200,6 +222,9 @@ func DefineStreamRestoreFlags(command *cobra.Command) { "support TSO or datetime, e.g. '400036290571534337' or '2018-05-11 01:42:23+0800'") command.Flags().String(FlagStreamFullBackupStorage, "", "specify the backup full storage. "+ "fill it if want restore full backup before restore log.") + command.Flags().Uint32(FlagPiTRBatchCount, defaultPiTRBatchCount, "specify the batch count to restore log.") + command.Flags().Uint32(FlagPiTRBatchSize, defaultPiTRBatchSize, "specify the batch size to retore log.") + command.Flags().Uint32(FlagPiTRConcurrency, defaultPiTRConcurrency, "specify the concurrency to restore log.") } // ParseStreamRestoreFlags parses the `restore stream` flags from the flag set. @@ -228,6 +253,15 @@ func (cfg *RestoreConfig) ParseStreamRestoreFlags(flags *pflag.FlagSet) error { FlagStreamStartTS, FlagStreamFullBackupStorage) } + if cfg.PitrBatchCount, err = flags.GetUint32(FlagPiTRBatchCount); err != nil { + return errors.Trace(err) + } + if cfg.PitrBatchSize, err = flags.GetUint32(FlagPiTRBatchSize); err != nil { + return errors.Trace(err) + } + if cfg.PitrConcurrency, err = flags.GetUint32(FlagPiTRConcurrency); err != nil { + return errors.Trace(err) + } return nil } @@ -267,6 +301,10 @@ func (cfg *RestoreConfig) ParseFromFlags(flags *pflag.FlagSet) error { if err != nil { return errors.Annotatef(err, "failed to get flag %s", FlagWithPlacementPolicy) } + cfg.KeyspaceName, err = flags.GetString(FlagKeyspaceName) + if err != nil { + return errors.Annotatef(err, "failed to get flag %s", FlagKeyspaceName) + } if flags.Lookup(flagFullBackupType) != nil { // for restore full only @@ -354,10 +392,19 @@ func (cfg *RestoreConfig) Adjust() { } func (cfg *RestoreConfig) adjustRestoreConfigForStreamRestore() { - if cfg.Config.Concurrency == 0 || cfg.Config.Concurrency > defaultRestoreStreamConcurrency { - log.Info("set restore kv files concurrency", zap.Int("concurrency", defaultRestoreStreamConcurrency)) - cfg.Config.Concurrency = defaultRestoreStreamConcurrency + if cfg.PitrConcurrency == 0 { + cfg.PitrConcurrency = defaultPiTRConcurrency + } + if cfg.PitrBatchCount == 0 { + cfg.PitrBatchCount = defaultPiTRBatchCount } + if cfg.PitrBatchSize == 0 { + cfg.PitrBatchSize = defaultPiTRBatchSize + } + // another goroutine is used to iterate the backup file + cfg.PitrConcurrency += 1 + log.Info("set restore kv files concurrency", zap.Int("concurrency", int(cfg.PitrConcurrency))) + cfg.Config.Concurrency = cfg.PitrConcurrency } func configureRestoreClient(ctx context.Context, client *restore.Client, cfg *RestoreConfig) error { @@ -375,7 +422,15 @@ func configureRestoreClient(ctx context.Context, client *restore.Client, cfg *Re client.SetPlacementPolicyMode(cfg.WithPlacementPolicy) client.SetWithSysTable(cfg.WithSysTable) - err := client.LoadRestoreStores(ctx) + err := restore.CheckKeyspaceBREnable(ctx, client.GetPDClient()) + if err != nil { + log.Warn("Keyspace BR is not supported in this cluster, fallback to legacy restore", zap.Error(err)) + client.SetRewriteMode(restore.RewriteModeLegacy) + } else { + client.SetRewriteMode(restore.RewriteModeKeyspace) + } + + err = client.LoadRestoreStores(ctx) if err != nil { return errors.Trace(err) } @@ -424,42 +479,6 @@ func CheckRestoreDBAndTable(client *restore.Client, cfg *RestoreConfig) error { return nil } -func CheckNewCollationEnable( - backupNewCollationEnable string, - g glue.Glue, - storage kv.Storage, - CheckRequirements bool, -) error { - if backupNewCollationEnable == "" { - if CheckRequirements { - return errors.Annotatef(berrors.ErrUnknown, - "the config 'new_collations_enabled_on_first_bootstrap' not found in backupmeta. "+ - "you can use \"show config WHERE name='new_collations_enabled_on_first_bootstrap';\" to manually check the config. "+ - "if you ensure the config 'new_collations_enabled_on_first_bootstrap' in backup cluster is as same as restore cluster, "+ - "use --check-requirements=false to skip this check") - } - log.Warn("the config 'new_collations_enabled_on_first_bootstrap' is not in backupmeta") - return nil - } - - se, err := g.CreateSession(storage) - if err != nil { - return errors.Trace(err) - } - - newCollationEnable, err := se.GetGlobalVariable(tidbNewCollationEnabled) - if err != nil { - return errors.Trace(err) - } - - if !strings.EqualFold(backupNewCollationEnable, newCollationEnable) { - return errors.Annotatef(berrors.ErrUnknown, - "the config 'new_collations_enabled_on_first_bootstrap' not match, upstream:%v, downstream: %v", - backupNewCollationEnable, newCollationEnable) - } - return nil -} - func isFullRestore(cmdName string) bool { return cmdName == FullRestoreCmd } @@ -471,10 +490,20 @@ func IsStreamRestore(cmdName string) bool { // RunRestore starts a restore task inside the current goroutine. func RunRestore(c context.Context, g glue.Glue, cmdName string, cfg *RestoreConfig) error { + if err := checkTaskExists(c, cfg); err != nil { + return errors.Annotate(err, "failed to check task exits") + } + + config.UpdateGlobal(func(conf *config.Config) { + conf.KeyspaceName = cfg.KeyspaceName + }) if IsStreamRestore(cmdName) { return RunStreamRestore(c, g, cmdName, cfg) } + return runRestore(c, g, cmdName, cfg) +} +func runRestore(c context.Context, g glue.Glue, cmdName string, cfg *RestoreConfig) error { cfg.Adjust() defer summary.Summary(cmdName) ctx, cancel := context.WithCancel(c) @@ -494,6 +523,7 @@ func RunRestore(c context.Context, g glue.Glue, cmdName string, cfg *RestoreConf return errors.Trace(err) } defer mgr.Close() + codec := mgr.GetStorage().GetCodec() mergeRegionSize := cfg.MergeSmallRegionSizeBytes mergeRegionCount := cfg.MergeSmallRegionKeyCount @@ -502,10 +532,7 @@ func RunRestore(c context.Context, g glue.Glue, cmdName string, cfg *RestoreConf // according to https://github.com/pingcap/tidb/issues/34167. // we should get the real config from tikv to adapt the dynamic region. httpCli := httputil.NewClient(mgr.GetTLSConfig()) - mergeRegionSize, mergeRegionCount, err = mgr.GetMergeRegionSizeAndCount(ctx, httpCli) - if err != nil { - return errors.Trace(err) - } + mergeRegionSize, mergeRegionCount = mgr.GetMergeRegionSizeAndCount(ctx, httpCli) } keepaliveCfg.PermitWithoutStream = true @@ -531,7 +558,7 @@ func RunRestore(c context.Context, g glue.Glue, cmdName string, cfg *RestoreConf return errors.Trace(versionErr) } } - if err = CheckNewCollationEnable(backupMeta.GetNewCollationsEnabled(), g, mgr.GetStorage(), cfg.CheckRequirements); err != nil { + if err = restore.CheckNewCollationEnable(backupMeta.GetNewCollationsEnabled(), g, mgr.GetStorage(), cfg.CheckRequirements); err != nil { return errors.Trace(err) } @@ -555,7 +582,7 @@ func RunRestore(c context.Context, g glue.Glue, cmdName string, cfg *RestoreConf g.Record(summary.RestoreDataSize, archiveSize) //restore from tidb will fetch a general Size issue https://github.com/pingcap/tidb/issues/27247 g.Record("Size", archiveSize) - restoreTS, err := client.GetTS(ctx) + restoreTS, err := client.GetTSWithRetry(ctx) if err != nil { return errors.Trace(err) } @@ -655,10 +682,36 @@ func RunRestore(c context.Context, g glue.Glue, cmdName string, cfg *RestoreConf errCh := make(chan error, 32) tableStream := client.GoCreateTables(ctx, mgr.GetDomain(), tables, newTS, errCh) + if len(files) == 0 { log.Info("no files, empty databases and tables are restored") summary.SetSuccessStatus(true) // don't return immediately, wait all pipeline done. + } else { + oldKeyspace, _, err := tikv.DecodeKey(files[0].GetStartKey(), backupMeta.ApiVersion) + if err != nil { + return errors.Trace(err) + } + newKeyspace := codec.GetKeyspace() + + // If the API V2 data occurs in the restore process, the cluster must + // support the keyspace rewrite mode. + if (len(oldKeyspace) > 0 || len(newKeyspace) > 0) && client.GetRewriteMode() == restore.RewriteModeLegacy { + return errors.Annotate(berrors.ErrRestoreModeMismatch, "cluster only supports legacy rewrite mode") + } + + // Hijack the tableStream and rewrite the rewrite rules. + tableStream = util.ChanMap(tableStream, func(t restore.CreatedTable) restore.CreatedTable { + // Set the keyspace info for the checksum requests + t.RewriteRule.OldKeyspace = oldKeyspace + t.RewriteRule.NewKeyspace = newKeyspace + + for _, rule := range t.RewriteRule.Data { + rule.OldKeyPrefix = append(append([]byte{}, oldKeyspace...), rule.OldKeyPrefix...) + rule.NewKeyPrefix = codec.EncodeKey(rule.NewKeyPrefix) + } + return t + }) } if cfg.tiflashRecorder != nil { diff --git a/br/pkg/task/restore_data.go b/br/pkg/task/restore_data.go index f8e286dd0e72b..74663ea28d39d 100644 --- a/br/pkg/task/restore_data.go +++ b/br/pkg/task/restore_data.go @@ -19,6 +19,7 @@ import ( "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/br/pkg/summary" "github.com/pingcap/tidb/br/pkg/utils" + tidbconfig "github.com/pingcap/tidb/config" "go.uber.org/zap" ) @@ -71,6 +72,11 @@ func RunResolveKvData(c context.Context, g glue.Glue, cmdName string, cfg *Resto defer mgr.Close() keepaliveCfg.PermitWithoutStream = true + tc := tidbconfig.GetGlobalConfig() + tc.SkipRegisterToDashboard = true + tc.EnableGlobalKill = false + tidbconfig.StoreGlobalConfig(tc) + client := restore.NewRestoreClient(mgr.GetPDClient(), mgr.GetTLSConfig(), keepaliveCfg, false) restoreTS, err := client.GetTS(ctx) @@ -133,9 +139,9 @@ func RunResolveKvData(c context.Context, g glue.Glue, cmdName string, cfg *Resto } log.Debug("total tikv", zap.Int("total", numBackupStore), zap.String("progress file", cfg.ProgressFile)) - // progress = read meta + send recovery + iterate tikv + flashback. - progress := g.StartProgress(ctx, cmdName, int64(numBackupStore*4), !cfg.LogProgress) - go progressFileWriterRoutine(ctx, progress, int64(numBackupStore*4), cfg.ProgressFile) + // progress = read meta + send recovery + iterate tikv + (1 * prepareflashback + 1 * flashback) + progress := g.StartProgress(ctx, cmdName, int64(numBackupStore*3+2), !cfg.LogProgress) + go progressFileWriterRoutine(ctx, progress, int64(numBackupStore*3+2), cfg.ProgressFile) // restore tikv data from a snapshot volume var totalRegions int @@ -153,7 +159,23 @@ func RunResolveKvData(c context.Context, g glue.Glue, cmdName string, cfg *Resto //TODO: restore volume type into origin type //ModifyVolume(*ec2.ModifyVolumeInput) (*ec2.ModifyVolumeOutput, error) by backupmeta + // this is used for cloud restoration + err = client.Init(g, mgr.GetStorage()) + if err != nil { + return errors.Trace(err) + } + defer client.Close() + log.Info("start to clear system user for cloud") + err = client.ClearSystemUsers(ctx, cfg.ResetSysUsers) + + if err != nil { + return errors.Trace(err) + } + // since we cannot reset tiflash automaticlly. so we should start it manually + if err = client.ResetTiFlashReplicas(ctx, g, mgr.GetStorage()); err != nil { + return errors.Trace(err) + } progress.Close() summary.CollectDuration("restore duration", time.Since(startAll)) summary.SetSuccessStatus(true) diff --git a/br/pkg/task/restore_raw.go b/br/pkg/task/restore_raw.go index 6c15cd9989512..7b80ac18b4d87 100644 --- a/br/pkg/task/restore_raw.go +++ b/br/pkg/task/restore_raw.go @@ -80,10 +80,7 @@ func RunRestoreRaw(c context.Context, g glue.Glue, cmdName string, cfg *RestoreR // according to https://github.com/pingcap/tidb/issues/34167. // we should get the real config from tikv to adapt the dynamic region. httpCli := httputil.NewClient(mgr.GetTLSConfig()) - mergeRegionSize, mergeRegionCount, err = mgr.GetMergeRegionSizeAndCount(ctx, httpCli) - if err != nil { - return errors.Trace(err) - } + mergeRegionSize, mergeRegionCount = mgr.GetMergeRegionSizeAndCount(ctx, httpCli) } keepaliveCfg := GetKeepalive(&cfg.Config) diff --git a/br/pkg/task/restore_test.go b/br/pkg/task/restore_test.go index 94bbcb3c3692c..b13ecf0eccc08 100644 --- a/br/pkg/task/restore_test.go +++ b/br/pkg/task/restore_test.go @@ -63,6 +63,16 @@ func TestConfigureRestoreClient(t *testing.T) { require.True(t, client.IsOnline()) } +func TestAdjustRestoreConfigForStreamRestore(t *testing.T) { + restoreCfg := RestoreConfig{} + + restoreCfg.adjustRestoreConfigForStreamRestore() + require.Equal(t, restoreCfg.PitrBatchCount, uint32(defaultPiTRBatchCount)) + require.Equal(t, restoreCfg.PitrBatchSize, uint32(defaultPiTRBatchSize)) + require.Equal(t, restoreCfg.PitrConcurrency, uint32(defaultPiTRConcurrency)) + require.Equal(t, restoreCfg.Concurrency, restoreCfg.PitrConcurrency) +} + func TestCheckRestoreDBAndTable(t *testing.T) { cases := []struct { cfgSchemas map[string]struct{} diff --git a/br/pkg/task/stream.go b/br/pkg/task/stream.go index a259452b14b2d..40f851048da37 100644 --- a/br/pkg/task/stream.go +++ b/br/pkg/task/stream.go @@ -307,10 +307,7 @@ func NewStreamMgr(ctx context.Context, cfg *StreamConfig, g glue.Glue, isStreamS mgr: mgr, } if isStreamStart { - client, err := backup.NewBackupClient(ctx, mgr) - if err != nil { - return nil, errors.Trace(err) - } + client := backup.NewBackupClient(ctx, mgr) backend, err := storage.ParseBackend(cfg.Storage, &cfg.BackendOptions) if err != nil { @@ -427,7 +424,7 @@ func (s *streamMgr) backupFullSchemas(ctx context.Context, g glue.Glue) error { } schemasConcurrency := uint(mathutil.Min(backup.DefaultSchemaConcurrency, schemas.Len())) - err = schemas.BackupSchemas(ctx, metaWriter, s.mgr.GetStorage(), nil, + err = schemas.BackupSchemas(ctx, metaWriter, nil, s.mgr.GetStorage(), nil, s.cfg.StartTS, schemasConcurrency, 0, true, nil) if err != nil { return errors.Trace(err) @@ -461,6 +458,39 @@ func (s *streamMgr) checkStreamStartEnable(g glue.Glue) error { return nil } +type RestoreFunc func() error + +// KeepGcDisabled keeps GC disabled and return a function that used to gc enabled. +// gc.ratio-threshold = "-1.0", which represents disable gc in TiKV. +func KeepGcDisabled(g glue.Glue, store kv.Storage) (RestoreFunc, error) { + se, err := g.CreateSession(store) + if err != nil { + return nil, errors.Trace(err) + } + + execCtx := se.GetSessionCtx().(sqlexec.RestrictedSQLExecutor) + oldRatio, err := utils.GetGcRatio(execCtx) + if err != nil { + return nil, errors.Trace(err) + } + + newRatio := "-1.0" + err = utils.SetGcRatio(execCtx, newRatio) + if err != nil { + return nil, errors.Trace(err) + } + + // If the oldRatio is negative, which is not normal status. + // It should set default value "1.1" after PiTR finished. + if strings.HasPrefix(oldRatio, "-") { + oldRatio = "1.1" + } + + return func() error { + return utils.SetGcRatio(execCtx, oldRatio) + }, nil +} + // RunStreamCommand run all kinds of `stream task` func RunStreamCommand( ctx context.Context, @@ -838,8 +868,8 @@ func RunStreamAdvancer(c context.Context, g glue.Glue, cmdName string, cfg *Stre return nil } -func checkConfigForStatus(cfg *StreamConfig) error { - if len(cfg.PD) == 0 { +func checkConfigForStatus(pd []string) error { + if len(pd) == 0 { return errors.Annotatef(berrors.ErrInvalidArgument, "the command needs access to PD, please specify `-u` or `--pd`") } @@ -889,7 +919,7 @@ func RunStreamStatus( ctx = opentracing.ContextWithSpan(ctx, span1) } - if err := checkConfigForStatus(cfg); err != nil { + if err := checkConfigForStatus(cfg.PD); err != nil { return err } ctl, err := makeStatusController(ctx, cfg, g) @@ -1004,6 +1034,32 @@ func RunStreamTruncate(c context.Context, g glue.Glue, cmdName string, cfg *Stre return nil } +// checkTaskExists checks whether there is a log backup task running. +// If so, return an error. +func checkTaskExists(ctx context.Context, cfg *RestoreConfig) error { + if err := checkConfigForStatus(cfg.PD); err != nil { + return err + } + etcdCLI, err := dialEtcdWithCfg(ctx, cfg.Config) + if err != nil { + return err + } + cli := streamhelper.NewMetaDataClient(etcdCLI) + defer func() { + if err := cli.Close(); err != nil { + log.Error("failed to close the etcd client", zap.Error(err)) + } + }() + tasks, err := cli.GetAllTasks(ctx) + if err != nil { + return err + } + if len(tasks) > 0 { + return errors.Errorf("log backup task is running: %s, please stop the task before restore, and after PITR operation finished, create log-backup task again and create a full backup on this cluster", tasks[0].Info.Name) + } + return nil +} + // RunStreamRestore restores stream log. func RunStreamRestore( c context.Context, @@ -1065,7 +1121,7 @@ func RunStreamRestore( logStorage := cfg.Config.Storage cfg.Config.Storage = cfg.FullBackupStorage // TiFlash replica is restored to down-stream on 'pitr' currently. - if err = RunRestore(ctx, g, FullRestoreCmd, cfg); err != nil { + if err = runRestore(ctx, g, FullRestoreCmd, cfg); err != nil { return errors.Trace(err) } cfg.Config.Storage = logStorage @@ -1132,7 +1188,7 @@ func restoreStream( } defer client.Close() - currentTS, err := client.GetTS(ctx) + currentTS, err := client.GetTSWithRetry(ctx) if err != nil { return errors.Trace(err) } @@ -1146,6 +1202,18 @@ func restoreStream( // mode or emptied schedulers defer restorePostWork(ctx, client, restoreSchedulers) + // It need disable GC in TiKV when PiTR. + // because the process of PITR is concurrent and kv events isn't sorted by tso. + restoreGc, err := KeepGcDisabled(g, mgr.GetStorage()) + if err != nil { + return errors.Trace(err) + } + defer func() { + if err := restoreGc(); err != nil { + log.Error("failed to set gc enabled", zap.Error(err)) + } + }() + err = client.InstallLogFileManager(ctx, cfg.StartTS, cfg.RestoreTS) if err != nil { return err @@ -1200,10 +1268,17 @@ func restoreStream( } updateRewriteRules(rewriteRules, schemasReplace) - dmlFiles, err := client.LoadDMLFiles(ctx) + logFilesIter, err := client.LoadDMLFiles(ctx) + if err != nil { + return errors.Trace(err) + } + logFilesIterWithSplit, err := client.WrapLogFilesIterWithSplitHelper(logFilesIter, rewriteRules, g, mgr.GetStorage()) + if err != nil { + return errors.Trace(err) + } pd := g.StartProgress(ctx, "Restore KV Files", int64(dataFileCount), !cfg.LogProgress) err = withProgress(pd, func(p glue.Progress) error { - return client.RestoreKVFiles(ctx, rewriteRules, dmlFiles, updateStats, p.Inc) + return client.RestoreKVFiles(ctx, rewriteRules, logFilesIterWithSplit, cfg.PitrBatchCount, cfg.PitrBatchSize, updateStats, p.IncBy) }) if err != nil { return errors.Annotate(err, "failed to restore kv files") @@ -1549,7 +1624,7 @@ func initRewriteRules(client *restore.Client, tables map[int64]*metautil.Table) zap.Stringer("database", t.DB.Name), zap.Int("old-id", int(t.Info.ID)), zap.Array("rewrite-rules", zapcore.ArrayMarshalerFunc(func(ae zapcore.ArrayEncoder) error { - for _, r := range rules { + for _, r := range tableRules { for _, rule := range r.Data { if err := ae.AppendObject(logutil.RewriteRuleObject(rule)); err != nil { return err diff --git a/br/pkg/utils/BUILD.bazel b/br/pkg/utils/BUILD.bazel index 0ae948d18a779..498400fc53166 100644 --- a/br/pkg/utils/BUILD.bazel +++ b/br/pkg/utils/BUILD.bazel @@ -38,6 +38,7 @@ go_library( "//util", "//util/sqlexec", "@com_github_cheggaaa_pb_v3//:pb", + "@com_github_docker_go_units//:go-units", "@com_github_google_uuid//:uuid", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", @@ -50,6 +51,7 @@ go_library( "@org_golang_google_grpc//backoff", "@org_golang_google_grpc//codes", "@org_golang_google_grpc//credentials", + "@org_golang_google_grpc//credentials/insecure", "@org_golang_google_grpc//keepalive", "@org_golang_google_grpc//status", "@org_golang_x_net//http/httpproxy", @@ -79,6 +81,7 @@ go_test( ], embed = [":utils"], flaky = True, + shard_count = 30, deps = [ "//br/pkg/errors", "//br/pkg/metautil", diff --git a/br/pkg/utils/backoff.go b/br/pkg/utils/backoff.go index 5353c972d24ad..bff2490b56650 100644 --- a/br/pkg/utils/backoff.go +++ b/br/pkg/utils/backoff.go @@ -33,6 +33,11 @@ const ( resetTSRetryTimeExt = 600 resetTSWaitIntervalExt = 500 * time.Millisecond resetTSMaxWaitIntervalExt = 300 * time.Second + + // region heartbeat are 10 seconds by default, if some region has 2 heartbeat missing (15 seconds), it appear to be a network issue between PD and TiKV. + flashbackRetryTime = 3 + flashbackWaitInterval = 3000 * time.Millisecond + flashbackMaxWaitInterval = 15 * time.Second ) // RetryState is the mutable state needed for retrying. @@ -204,3 +209,34 @@ func (bo *pdReqBackoffer) NextBackoff(err error) time.Duration { func (bo *pdReqBackoffer) Attempt() int { return bo.attempt } + +type flashbackBackoffer struct { + attempt int + delayTime time.Duration + maxDelayTime time.Duration +} + +// NewBackoffer creates a new controller regulating a truncated exponential backoff. +func NewFlashBackBackoffer() Backoffer { + return &flashbackBackoffer{ + attempt: flashbackRetryTime, + delayTime: flashbackWaitInterval, + maxDelayTime: flashbackMaxWaitInterval, + } +} + +// retry 3 times when prepare flashback failure. +func (bo *flashbackBackoffer) NextBackoff(err error) time.Duration { + bo.delayTime = 2 * bo.delayTime + bo.attempt-- + log.Warn("region may not ready to serve, retry it...", zap.Error(err)) + + if bo.delayTime > bo.maxDelayTime { + return bo.maxDelayTime + } + return bo.delayTime +} + +func (bo *flashbackBackoffer) Attempt() int { + return bo.attempt +} diff --git a/br/pkg/utils/db.go b/br/pkg/utils/db.go index 23911fa6f0a93..060df603d16cb 100644 --- a/br/pkg/utils/db.go +++ b/br/pkg/utils/db.go @@ -5,16 +5,24 @@ package utils import ( "context" "database/sql" + "strconv" "strings" "sync" + "github.com/docker/go-units" + "github.com/pingcap/errors" "github.com/pingcap/log" + "github.com/pingcap/tidb/br/pkg/logutil" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/sqlexec" "go.uber.org/zap" ) +const ( + tidbNewCollationEnabled = "new_collation_enabled" +) + var ( // check sql.DB and sql.Conn implement QueryExecutor and DBExecutor _ DBExecutor = &sql.DB{} @@ -94,14 +102,113 @@ func IsLogBackupEnabled(ctx sqlexec.RestrictedSQLExecutor) (bool, error) { return true, nil } -// CheckLogBackupTaskExist increases the count of log backup task. +func GetRegionSplitInfo(ctx sqlexec.RestrictedSQLExecutor) (uint64, int64) { + return GetSplitSize(ctx), GetSplitKeys(ctx) +} + +func GetSplitSize(ctx sqlexec.RestrictedSQLExecutor) uint64 { + const defaultSplitSize = 96 * 1024 * 1024 + varStr := "show config where name = 'coprocessor.region-split-size' and type = 'tikv'" + rows, fields, err := ctx.ExecRestrictedSQL( + kv.WithInternalSourceType(context.Background(), kv.InternalTxnBR), + nil, + varStr, + ) + if err != nil { + log.Warn("failed to get split size, use default value", logutil.ShortError(err)) + return defaultSplitSize + } + if len(rows) == 0 { + // use the default value + return defaultSplitSize + } + + d := rows[0].GetDatum(3, &fields[3].Column.FieldType) + splitSizeStr, err := d.ToString() + if err != nil { + log.Warn("failed to get split size, use default value", logutil.ShortError(err)) + return defaultSplitSize + } + splitSize, err := units.FromHumanSize(splitSizeStr) + if err != nil { + log.Warn("failed to get split size, use default value", logutil.ShortError(err)) + return defaultSplitSize + } + return uint64(splitSize) +} + +func GetSplitKeys(ctx sqlexec.RestrictedSQLExecutor) int64 { + const defaultSplitKeys = 960000 + varStr := "show config where name = 'coprocessor.region-split-keys' and type = 'tikv'" + rows, fields, err := ctx.ExecRestrictedSQL( + kv.WithInternalSourceType(context.Background(), kv.InternalTxnBR), + nil, + varStr, + ) + if err != nil { + log.Warn("failed to get split keys, use default value", logutil.ShortError(err)) + return defaultSplitKeys + } + if len(rows) == 0 { + // use the default value + return defaultSplitKeys + } + + d := rows[0].GetDatum(3, &fields[3].Column.FieldType) + splitKeysStr, err := d.ToString() + if err != nil { + log.Warn("failed to get split keys, use default value", logutil.ShortError(err)) + return defaultSplitKeys + } + splitKeys, err := strconv.ParseInt(splitKeysStr, 10, 64) + if err != nil { + log.Warn("failed to get split keys, use default value", logutil.ShortError(err)) + return defaultSplitKeys + } + return splitKeys +} + +func GetGcRatio(ctx sqlexec.RestrictedSQLExecutor) (string, error) { + valStr := "show config where name = 'gc.ratio-threshold' and type = 'tikv'" + rows, fields, errSQL := ctx.ExecRestrictedSQL( + kv.WithInternalSourceType(context.Background(), kv.InternalTxnBR), + nil, + valStr, + ) + if errSQL != nil { + return "", errSQL + } + if len(rows) == 0 { + // no rows mean not support log backup. + return "", nil + } + + d := rows[0].GetDatum(3, &fields[3].Column.FieldType) + return d.ToString() +} + +func SetGcRatio(ctx sqlexec.RestrictedSQLExecutor, ratio string) error { + _, _, err := ctx.ExecRestrictedSQL( + kv.WithInternalSourceType(context.Background(), kv.InternalTxnBR), + nil, + "set config tikv `gc.ratio-threshold`=%?", + ratio, + ) + if err != nil { + return errors.Annotatef(err, "failed to set config `gc.ratio-threshold`=%s", ratio) + } + log.Warn("set config tikv gc.ratio-threshold", zap.String("ratio", ratio)) + return nil +} + +// LogBackupTaskCountInc increases the count of log backup task. func LogBackupTaskCountInc() { LogBackupTaskMutex.Lock() logBackupTaskCount++ LogBackupTaskMutex.Unlock() } -// CheckLogBackupTaskExist decreases the count of log backup task. +// LogBackupTaskCountDec decreases the count of log backup task. func LogBackupTaskCountDec() { LogBackupTaskMutex.Lock() logBackupTaskCount-- @@ -117,3 +224,8 @@ func CheckLogBackupTaskExist() bool { func IsLogBackupInUse(ctx sessionctx.Context) bool { return CheckLogBackupEnabled(ctx) && CheckLogBackupTaskExist() } + +// GetTidbNewCollationEnabled returns the variable name of NewCollationEnabled. +func GetTidbNewCollationEnabled() string { + return tidbNewCollationEnabled +} diff --git a/br/pkg/utils/db_test.go b/br/pkg/utils/db_test.go index 08eac1e82594c..1004764b0d206 100644 --- a/br/pkg/utils/db_test.go +++ b/br/pkg/utils/db_test.go @@ -4,6 +4,7 @@ package utils_test import ( "context" + "strings" "testing" "github.com/pingcap/errors" @@ -35,7 +36,19 @@ func (m *mockRestrictedSQLExecutor) ExecRestrictedSQL(ctx context.Context, opts if m.errHappen { return nil, nil, errors.New("injected error") } - return m.rows, m.fields, nil + + if strings.Contains(sql, "show config") { + return m.rows, m.fields, nil + } else if strings.Contains(sql, "set config") && strings.Contains(sql, "gc.ratio-threshold") { + value := args[0].(string) + + for _, r := range m.rows { + d := types.Datum{} + d.SetString(value, "") + chunk.MutRow(r).SetDatum(3, d) + } + } + return nil, nil, nil } func TestIsLogBackupEnabled(t *testing.T) { @@ -115,3 +128,84 @@ func TestCheckLogBackupTaskExist(t *testing.T) { utils.LogBackupTaskCountDec() require.False(t, utils.CheckLogBackupTaskExist()) } + +func TestGc(t *testing.T) { + // config format: + // MySQL [(none)]> show config where name = 'gc.ratio-threshold'; + // +------+-------------------+--------------------+-------+ + // | Type | Instance | Name | Value | + // +------+-------------------+--------------------+-------+ + // | tikv | 172.16.6.46:3460 | gc.ratio-threshold | 1.1 | + // | tikv | 172.16.6.47:3460 | gc.ratio-threshold | 1.1 | + // +------+-------------------+--------------------+-------+ + fields := make([]*ast.ResultField, 4) + tps := []*types.FieldType{ + types.NewFieldType(mysql.TypeString), + types.NewFieldType(mysql.TypeString), + types.NewFieldType(mysql.TypeString), + types.NewFieldType(mysql.TypeString), + } + for i := 0; i < len(tps); i++ { + rf := new(ast.ResultField) + rf.Column = new(model.ColumnInfo) + rf.Column.FieldType = *tps[i] + fields[i] = rf + } + rows := make([]chunk.Row, 0, 2) + row := chunk.MutRowFromValues("tikv", " 127.0.0.1:20161", "log-backup.enable", "1.1").ToRow() + rows = append(rows, row) + row = chunk.MutRowFromValues("tikv", " 127.0.0.1:20162", "log-backup.enable", "1.1").ToRow() + rows = append(rows, row) + + s := &mockRestrictedSQLExecutor{rows: rows, fields: fields} + ratio, err := utils.GetGcRatio(s) + require.Nil(t, err) + require.Equal(t, ratio, "1.1") + + err = utils.SetGcRatio(s, "-1.0") + require.Nil(t, err) + ratio, err = utils.GetGcRatio(s) + require.Nil(t, err) + require.Equal(t, ratio, "-1.0") +} + +func TestRegionSplitInfo(t *testing.T) { + // config format: + // MySQL [(none)]> show config where name = 'coprocessor.region-split-size'; + // +------+-------------------+-------------------------------+-------+ + // | Type | Instance | Name | Value | + // +------+-------------------+-------------------------------+-------+ + // | tikv | 127.0.0.1:20161 | coprocessor.region-split-size | 10MB | + // +------+-------------------+-------------------------------+-------+ + // MySQL [(none)]> show config where name = 'coprocessor.region-split-keys'; + // +------+-------------------+-------------------------------+--------+ + // | Type | Instance | Name | Value | + // +------+-------------------+-------------------------------+--------+ + // | tikv | 127.0.0.1:20161 | coprocessor.region-split-keys | 100000 | + // +------+-------------------+-------------------------------+--------+ + + fields := make([]*ast.ResultField, 4) + tps := []*types.FieldType{ + types.NewFieldType(mysql.TypeString), + types.NewFieldType(mysql.TypeString), + types.NewFieldType(mysql.TypeString), + types.NewFieldType(mysql.TypeString), + } + for i := 0; i < len(tps); i++ { + rf := new(ast.ResultField) + rf.Column = new(model.ColumnInfo) + rf.Column.FieldType = *tps[i] + fields[i] = rf + } + rows := make([]chunk.Row, 0, 1) + row := chunk.MutRowFromValues("tikv", "127.0.0.1:20161", "coprocessor.region-split-size", "10MB").ToRow() + rows = append(rows, row) + s := &mockRestrictedSQLExecutor{rows: rows, fields: fields} + require.Equal(t, utils.GetSplitSize(s), uint64(10000000)) + + rows = make([]chunk.Row, 0, 1) + row = chunk.MutRowFromValues("tikv", "127.0.0.1:20161", "coprocessor.region-split-keys", "100000").ToRow() + rows = append(rows, row) + s = &mockRestrictedSQLExecutor{rows: rows, fields: fields} + require.Equal(t, utils.GetSplitKeys(s), int64(100000)) +} diff --git a/br/pkg/utils/iter/BUILD.bazel b/br/pkg/utils/iter/BUILD.bazel index 0e4c55ed67d56..eecf8e82e1cd5 100644 --- a/br/pkg/utils/iter/BUILD.bazel +++ b/br/pkg/utils/iter/BUILD.bazel @@ -20,6 +20,7 @@ go_library( go_test( name = "iter_test", + timeout = "short", srcs = ["combinator_test.go"], flaky = True, race = "on", diff --git a/br/pkg/utils/json.go b/br/pkg/utils/json.go index 736032b4beedc..a29725db6b1b3 100644 --- a/br/pkg/utils/json.go +++ b/br/pkg/utils/json.go @@ -114,6 +114,10 @@ func makeJSONSchema(schema *backuppb.Schema) (*jsonSchema, error) { func fromJSONSchema(jSchema *jsonSchema) (*backuppb.Schema, error) { schema := jSchema.Schema + if schema == nil { + schema = &backuppb.Schema{} + } + var err error schema.Db, err = json.Marshal(jSchema.DB) if err != nil { diff --git a/br/pkg/utils/json_test.go b/br/pkg/utils/json_test.go index 8d8eeb6457332..3f03f287d92f1 100644 --- a/br/pkg/utils/json_test.go +++ b/br/pkg/utils/json_test.go @@ -204,6 +204,44 @@ var testMetaJSONs = [][]byte{ "is_raw_kv": true, "br_version": "BR\nRelease Version: v5.0.0-master\nGit Commit Hash: c0d60dae4998cf9ac40f02e5444731c15f0b2522\nGit Branch: HEAD\nGo Version: go1.13.4\nUTC Build Time: 2021-03-25 08:10:08\nRace Enabled: false" }`), + []byte(`{ + "files": [ + { + "sha256": "3ae857ef9b379d498ae913434f1d47c3e90a55f3a4cd9074950bfbd163d5e5fc", + "start_key": "7480000000000000115f720000000000000000", + "end_key": "7480000000000000115f72ffffffffffffffff00", + "name": "1_20_9_36adb8cedcd7af34708edff520499e712e2cfdcb202f5707dc9305a031d55a98_1675066275424_write.sst", + "end_version": 439108573623222300, + "crc64xor": 16261462091570213000, + "total_kvs": 15, + "total_bytes": 1679, + "cf": "write", + "size": 2514, + "cipher_iv": "56MTbxA4CaNILpirKnBxUw==" + } + ], + "schemas": [ + { + "db": { + "charset": "utf8mb4", + "collate": "utf8mb4_bin", + "db_name": { + "L": "test", + "O": "test" + }, + "id": 1, + "policy_ref_info": null, + "state": 5 + } + } + ], + "ddls": [], + "cluster_id": 7194351714070942000, + "cluster_version": "\"6.1.0\"\n", + "br_version": "BR\nRelease Version: v6.1.0\nGit Commit Hash: 1a89decdb192cbdce6a7b0020d71128bc964d30f\nGit Branch: heads/refs/tags/v6.1.0\nGo Version: go1.18.2\nUTC Build Time: 2022-06-05 05:09:12\nRace Enabled: false", + "end_version": 439108573623222300, + "new_collations_enabled": "True" + }`), } func TestEncodeAndDecode(t *testing.T) { diff --git a/br/pkg/utils/key.go b/br/pkg/utils/key.go index 062f4b5aac52d..62d194ca57a2e 100644 --- a/br/pkg/utils/key.go +++ b/br/pkg/utils/key.go @@ -163,7 +163,7 @@ func CloneSlice[T any](s []T) []T { // toClampIn: |_____| |____| |________________| // result: |_____| |_| |______________| // we are assuming the arguments are sorted by the start key and no overlaps. -// you can call CollapseRanges to get key ranges fits this requirements. +// you can call spans.Collapse to get key ranges fits this requirements. // Note: this algorithm is pretty like the `checkIntervalIsSubset`, can we get them together? func IntersectAll(s1 []kv.KeyRange, s2 []kv.KeyRange) []kv.KeyRange { currentClamping := 0 diff --git a/br/pkg/utils/misc.go b/br/pkg/utils/misc.go index 8078802b2e055..ab62a7b7db534 100644 --- a/br/pkg/utils/misc.go +++ b/br/pkg/utils/misc.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/tidb/parser/types" "google.golang.org/grpc" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" ) // IsTypeCompatible checks whether type target is compatible with type src @@ -84,7 +85,7 @@ func IsTypeCompatible(src types.FieldType, target types.FieldType) bool { } func GRPCConn(ctx context.Context, storeAddr string, tlsConf *tls.Config, opts ...grpc.DialOption) (*grpc.ClientConn, error) { - secureOpt := grpc.WithInsecure() + secureOpt := grpc.WithTransportCredentials(insecure.NewCredentials()) if tlsConf != nil { secureOpt = grpc.WithTransportCredentials(credentials.NewTLS(tlsConf)) } diff --git a/br/pkg/utils/schema.go b/br/pkg/utils/schema.go index 8ceba24e140ad..0987e446bfc49 100644 --- a/br/pkg/utils/schema.go +++ b/br/pkg/utils/schema.go @@ -16,6 +16,7 @@ import ( // temporaryDBNamePrefix is the prefix name of system db, e.g. mysql system db will be rename to __TiDB_BR_Temporary_mysql const temporaryDBNamePrefix = "__TiDB_BR_Temporary_" +const temporarySysDB = temporaryDBNamePrefix + "mysql" // NeedAutoID checks whether the table needs backing up with an autoid. func NeedAutoID(tblInfo *model.TableInfo) bool { @@ -96,6 +97,11 @@ func EncloseDBAndTable(database, table string) string { return fmt.Sprintf("%s.%s", EncloseName(database), EncloseName(table)) } +// IsTemplateSysDB checks wheterh the dbname is temporary system database(__TiDB_BR_Temporary_mysql). +func IsTemplateSysDB(dbname model.CIStr) bool { + return dbname.O == temporarySysDB +} + // IsSysDB tests whether the database is system DB. // Currently, the only system DB is mysql. func IsSysDB(dbLowerName string) bool { diff --git a/br/pkg/utils/store_manager.go b/br/pkg/utils/store_manager.go index 8dd50a2a57c82..8a89e49022806 100644 --- a/br/pkg/utils/store_manager.go +++ b/br/pkg/utils/store_manager.go @@ -20,6 +20,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/backoff" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/keepalive" ) @@ -136,7 +137,7 @@ func (mgr *StoreManager) getGrpcConnLocked(ctx context.Context, storeID uint64) if err != nil { return nil, errors.Trace(err) } - opt := grpc.WithInsecure() + opt := grpc.WithTransportCredentials(insecure.NewCredentials()) if mgr.tlsConf != nil { opt = grpc.WithTransportCredentials(credentials.NewTLS(mgr.tlsConf)) } diff --git a/br/pkg/version/BUILD.bazel b/br/pkg/version/BUILD.bazel index 8171081ae5df1..7a15014e378e6 100644 --- a/br/pkg/version/BUILD.bazel +++ b/br/pkg/version/BUILD.bazel @@ -10,7 +10,6 @@ go_library( "//br/pkg/logutil", "//br/pkg/utils", "//br/pkg/version/build", - "//sessionctx/variable", "//util/engine", "@com_github_coreos_go_semver//semver", "@com_github_pingcap_errors//:errors", @@ -29,7 +28,6 @@ go_test( flaky = True, deps = [ "//br/pkg/version/build", - "//sessionctx/variable", "@com_github_coreos_go_semver//semver", "@com_github_data_dog_go_sqlmock//:go-sqlmock", "@com_github_pingcap_kvproto//pkg/metapb", diff --git a/br/pkg/version/version.go b/br/pkg/version/version.go index ba3551f58b463..7bd629fb2c540 100644 --- a/br/pkg/version/version.go +++ b/br/pkg/version/version.go @@ -18,7 +18,6 @@ import ( "github.com/pingcap/tidb/br/pkg/logutil" "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/br/pkg/version/build" - "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/util/engine" pd "github.com/tikv/pd/client" "go.uber.org/zap" @@ -32,6 +31,10 @@ var ( compatibleTiFlashMajor4 = semver.New("4.0.0") versionHash = regexp.MustCompile("-[0-9]+-g[0-9a-f]{7,}") + + checkpointSupportError error = nil + // pitrSupportBatchKVFiles specifies whether TiKV-server supports batch PITR. + pitrSupportBatchKVFiles bool = false ) // NextMajorVersion returns the next major version. @@ -134,6 +137,12 @@ func CheckVersionForBRPiTR(s *metapb.Store, tikvVersion *semver.Version) error { return errors.Annotatef(berrors.ErrVersionMismatch, "TiKV node %s version %s is too low when use PiTR, please update tikv's version to at least v6.1.0(v6.2.0+ recommanded)", s.Address, tikvVersion) } + // If tikv version < 6.5, PITR do not support restoring batch kv files. + if tikvVersion.Major < 6 || (tikvVersion.Major == 6 && tikvVersion.Minor < 5) { + pitrSupportBatchKVFiles = false + } else { + pitrSupportBatchKVFiles = true + } // The versions of BR and TiKV should be the same when use BR 6.1.0 if BRVersion.Major == 6 && BRVersion.Minor == 1 { @@ -148,7 +157,6 @@ func CheckVersionForBRPiTR(s *metapb.Store, tikvVersion *semver.Version) error { s.Address, tikvVersion, build.ReleaseVersion) } } - return nil } @@ -157,9 +165,16 @@ func CheckVersionForDDL(s *metapb.Store, tikvVersion *semver.Version) error { // use tikvVersion instead of tidbVersion since br doesn't have mysql client to connect tidb. requireVersion := semver.New("6.2.0-alpha") if tikvVersion.Compare(*requireVersion) < 0 { - log.Info("detected the old version of tidb cluster. set enable concurrent ddl to false") - variable.EnableConcurrentDDL.Store(false) - return nil + return errors.Errorf("detected the old version of tidb cluster, require: >= 6.2.0, but got %s", tikvVersion.String()) + } + return nil +} + +// CheckVersionForKeyspaceBR checks whether the cluster is support Backup/Restore keyspace data. +func CheckVersionForKeyspaceBR(_ *metapb.Store, tikvVersion *semver.Version) error { + requireVersion := semver.New("6.6.0-alpha") + if tikvVersion.Compare(*requireVersion) < 0 { + return errors.Errorf("detected the old version of tidb cluster, require: >= 6.6.0, but got %s", tikvVersion.String()) } return nil } @@ -199,6 +214,14 @@ func CheckVersionForBR(s *metapb.Store, tikvVersion *semver.Version) error { } } + // reset the checkpoint support error + checkpointSupportError = nil + if tikvVersion.Major < 6 || (tikvVersion.Major == 6 && tikvVersion.Minor < 5) { + // checkpoint mode only support after v6.5.0 + checkpointSupportError = errors.Annotatef(berrors.ErrVersionMismatch, "TiKV node %s version %s is too low when use checkpoint, please update tikv's version to at least v6.5.0", + s.Address, tikvVersion) + } + // don't warn if we are the master build, which always have the version v4.0.0-beta.2-* if build.GitBranch != "master" && tikvVersion.Compare(*BRVersion) > 0 { log.Warn(fmt.Sprintf("BR version is outdated, please consider use version %s of BR", tikvVersion)) @@ -306,6 +329,14 @@ func FetchVersion(ctx context.Context, db utils.QueryExecutor) (string, error) { return versionInfo, nil } +func CheckCheckpointSupport() error { + return checkpointSupportError +} + +func CheckPITRSupportBatchKVFiles() bool { + return pitrSupportBatchKVFiles +} + type ServerType int const ( diff --git a/br/pkg/version/version_test.go b/br/pkg/version/version_test.go index f70a2074be0ec..927eeee119d5b 100644 --- a/br/pkg/version/version_test.go +++ b/br/pkg/version/version_test.go @@ -13,7 +13,6 @@ import ( "github.com/coreos/go-semver/semver" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/tidb/br/pkg/version/build" - "github.com/pingcap/tidb/sessionctx/variable" "github.com/stretchr/testify/require" pd "github.com/tikv/pd/client" ) @@ -76,6 +75,15 @@ func TestCheckClusterVersion(t *testing.T) { require.Regexp(t, `^TiKV .* version mismatch when use PiTR v6.2.0\+, please `, err.Error()) } + { + // Default value of `pitrSupportBatchKVFiles` should be `false`. + build.ReleaseVersion = "v6.5.0" + mock.getAllStores = func() []*metapb.Store { + return []*metapb.Store{{Version: `v6.2.0`}} + } + require.Equal(t, CheckPITRSupportBatchKVFiles(), false) + } + { build.ReleaseVersion = "v6.2.0" mock.getAllStores = func() []*metapb.Store { @@ -83,6 +91,29 @@ func TestCheckClusterVersion(t *testing.T) { } err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBRPiTR) require.NoError(t, err) + require.Equal(t, CheckPITRSupportBatchKVFiles(), false) + } + + { + pitrSupportBatchKVFiles = true + build.ReleaseVersion = "v6.2.0" + mock.getAllStores = func() []*metapb.Store { + return []*metapb.Store{{Version: `v6.4.0`}} + } + err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBRPiTR) + require.NoError(t, err) + require.Equal(t, CheckPITRSupportBatchKVFiles(), false) + } + + { + pitrSupportBatchKVFiles = true + build.ReleaseVersion = "v6.2.0" + mock.getAllStores = func() []*metapb.Store { + return []*metapb.Store{{Version: `v6.5.0`}} + } + err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBRPiTR) + require.NoError(t, err) + require.Equal(t, CheckPITRSupportBatchKVFiles(), true) } { @@ -205,6 +236,29 @@ func TestCheckClusterVersion(t *testing.T) { } err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBR) require.NoError(t, err) + require.Error(t, CheckCheckpointSupport()) + } + + { + build.ReleaseVersion = "v6.0.0-rc.2" + mock.getAllStores = func() []*metapb.Store { + // TiKV v6.0.0-rc.1 with BR v6.0.0-rc.2 is ok + return []*metapb.Store{{Version: "v6.0.0-rc.1"}} + } + err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBR) + require.NoError(t, err) + require.Error(t, CheckCheckpointSupport()) + } + + { + build.ReleaseVersion = "v6.5.0-rc.2" + mock.getAllStores = func() []*metapb.Store { + // TiKV v6.5.0-rc.1 with BR v6.5.0-rc.2 is ok + return []*metapb.Store{{Version: "v6.5.0-rc.1"}} + } + err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBR) + require.NoError(t, err) + require.NoError(t, CheckCheckpointSupport()) } { @@ -266,50 +320,40 @@ func TestCheckClusterVersion(t *testing.T) { mock.getAllStores = func() []*metapb.Store { return []*metapb.Store{{Version: "v6.4.0"}} } - originVal := variable.EnableConcurrentDDL.Load() err := CheckClusterVersion(context.Background(), &mock, CheckVersionForDDL) require.NoError(t, err) - require.Equal(t, originVal, variable.EnableConcurrentDDL.Load()) } { mock.getAllStores = func() []*metapb.Store { return []*metapb.Store{{Version: "v6.2.0"}} } - originVal := variable.EnableConcurrentDDL.Load() err := CheckClusterVersion(context.Background(), &mock, CheckVersionForDDL) require.NoError(t, err) - require.Equal(t, originVal, variable.EnableConcurrentDDL.Load()) } { mock.getAllStores = func() []*metapb.Store { return []*metapb.Store{{Version: "v6.2.0-alpha"}} } - originVal := variable.EnableConcurrentDDL.Load() err := CheckClusterVersion(context.Background(), &mock, CheckVersionForDDL) require.NoError(t, err) - require.Equal(t, originVal, variable.EnableConcurrentDDL.Load()) } { mock.getAllStores = func() []*metapb.Store { return []*metapb.Store{{Version: "v6.1.0"}} } - variable.EnableConcurrentDDL.Store(true) err := CheckClusterVersion(context.Background(), &mock, CheckVersionForDDL) - require.NoError(t, err) - require.False(t, variable.EnableConcurrentDDL.Load()) + require.Error(t, err) } { mock.getAllStores = func() []*metapb.Store { return []*metapb.Store{{Version: "v5.4.0"}} } - variable.EnableConcurrentDDL.Store(true) err := CheckClusterVersion(context.Background(), &mock, CheckVersionForDDL) - require.NoError(t, err) - require.False(t, variable.EnableConcurrentDDL.Load()) + require.Error(t, err) } } diff --git a/br/tests/br_backup_empty/run.sh b/br/tests/br_backup_empty/run.sh index 41ca818139ba4..0289f1d401068 100644 --- a/br/tests/br_backup_empty/run.sh +++ b/br/tests/br_backup_empty/run.sh @@ -67,6 +67,7 @@ run_sql "CREATE TABLE ${DB}1.usertable1 ( \ PRIMARY KEY (YCSB_KEY) \ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;" +# backup empty table echo "backup empty table start..." run_br --pd $PD_ADDR backup full -s "local://$TEST_DIR/empty_table" @@ -75,6 +76,7 @@ while [ $i -le $DB_COUNT ]; do i=$(($i+1)) done +# restore empty table. echo "restore empty table start..." run_br --pd $PD_ADDR restore full -s "local://$TEST_DIR/empty_table" @@ -85,3 +87,15 @@ while [ $i -le $DB_COUNT ]; do run_sql "DROP DATABASE $DB$i;" i=$(($i+1)) done + + +# backup, skip temporary system database(__TiDB_BR_Temporary_mysql) when backup +run_sql "CREATE DATABASE __TiDB_BR_Temporary_mysql"; +run_sql "CREATE TABLE __TiDB_BR_Temporary_mysql.tables_priv(id int);"; +echo "backup and skip __TiDB_BR_Temporary_mysql start..." +run_br --pd $PD_ADDR backup full -s "local://$TEST_DIR/skip_temporary_mysql" + +# restore successfully without panic. +run_sql "DROP DATABASE __TiDB_BR_Temporary_mysql"; +echo "restore the data start..." +run_br restore full -s "local://$TEST_DIR/skip_temporary_mysql" --pd $PD_ADDR --ratelimit 1024 diff --git a/br/tests/br_foreign_key/run.sh b/br/tests/br_foreign_key/run.sh new file mode 100644 index 0000000000000..eafd38a180d40 --- /dev/null +++ b/br/tests/br_foreign_key/run.sh @@ -0,0 +1,53 @@ +#!/bin/sh +# +# 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, +# 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. + +set -eu +DB="$TEST_NAME" + +run_sql "set @@global.foreign_key_checks=1;" +run_sql "set @@foreign_key_checks=1;" +run_sql "create schema $DB;" +run_sql "create table $DB.t1 (id int key);" +run_sql "create table $DB.t2 (id int key, a int, b int, foreign key fk_1 (a) references t1(id) ON UPDATE SET NULL ON DELETE SET NULL, foreign key fk_2 (b) references t1(id) ON DELETE CASCADE ON UPDATE CASCADE);" +run_sql "insert into $DB.t1 values (1), (2), (3);" +run_sql "insert into $DB.t2 values (1, 1, 1), (2, 2, 2), (3, 3, 3);" +run_sql "update $DB.t1 set id=id+10 where id in (1, 3);" +run_sql "delete from $DB.t1 where id = 2;" + +echo "backup start..." +run_br backup db --db "$DB" -s "local://$TEST_DIR/$DB" --pd $PD_ADDR + +run_sql "drop schema $DB;" + +echo "restore start..." +run_br restore db --db $DB -s "local://$TEST_DIR/$DB" --pd $PD_ADDR + +set -x + +run_sql "select count(*) from $DB.t1;" +check_contains 'count(*): 2' + +run_sql "select count(*) from $DB.t2;" +check_contains 'count(*): 2' + +run_sql "select id, a, b from $DB.t2;" +check_contains 'id: 1' +check_contains 'id: 3' +check_contains 'a: NULL' +check_contains 'b: 11' +check_contains 'b: 13' + +run_sql "drop schema $DB" diff --git a/br/tests/br_full_cluster_restore/run.sh b/br/tests/br_full_cluster_restore/run.sh index e75b4d49fc914..14074e61f3825 100644 --- a/br/tests/br_full_cluster_restore/run.sh +++ b/br/tests/br_full_cluster_restore/run.sh @@ -55,7 +55,8 @@ restart_services # mock incompatible manually run_sql "alter table mysql.user add column xx int;" run_br restore full --with-sys-table --log-file $br_log_file -s "local://$backup_dir" > $res_file 2>&1 || true -check_contains "the target cluster is not compatible with the backup data" +run_sql "select count(*) from mysql.user" +check_contains "count(*): 6" echo "--> incompatible system table: less column on target cluster" restart_services diff --git a/br/tests/br_replica_read/placement_rule_with_learner_template.json b/br/tests/br_replica_read/placement_rule_with_learner_template.json new file mode 100644 index 0000000000000..4c0caa5820f27 --- /dev/null +++ b/br/tests/br_replica_read/placement_rule_with_learner_template.json @@ -0,0 +1,25 @@ +[ + { + "group_id": "pd", + "group_index": 0, + "group_override": false, + "rules": [ + { + "group_id": "pd", + "id": "default", + "start_key": "", + "end_key": "", + "role": "voter", + "count": 2 + }, + { + "group_id": "pd", + "id": "learner", + "start_key": "", + "end_key": "", + "role": "learner", + "count": 1 + } + ] + } +] \ No newline at end of file diff --git a/br/tests/br_replica_read/run.sh b/br/tests/br_replica_read/run.sh new file mode 100755 index 0000000000000..c56f54b4fbef8 --- /dev/null +++ b/br/tests/br_replica_read/run.sh @@ -0,0 +1,89 @@ +#!/bin/sh +# +# Copyright 2023 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. + +set -eu +DB="$TEST_NAME" + +VOTER_COUNT=$((TIKV_COUNT-1)) +if [ "$VOTER_COUNT" -lt "1" ];then + echo "Skip test because there is no enough tikv" + exit 0 +fi + +# set random store to read only +random_store_id=$(run_pd_ctl -u https://$PD_ADDR store | jq 'first(.stores[]|select(.store.labels|(.!= null and any(.key == "engine" and .value=="tiflash"))| not)|.store.id)') +echo "random store id: $random_store_id" +run_pd_ctl -u https://$PD_ADDR store label $random_store_id '$mode' 'read_only' + +# set placement rule to add a learner replica for each region in the read only store +run_pd_ctl -u https://$PD_ADDR config placement-rules rule-bundle load --out=$TEST_DIR/default_rules.json +cat tests/br_replica_read/placement_rule_with_learner_template.json | jq ".[].rules[0].count = $VOTER_COUNT" > $TEST_DIR/placement_rule_with_learner.json +run_pd_ctl -u https://$PD_ADDR config placement-rules rule-bundle save --in $TEST_DIR/placement_rule_with_learner.json +sleep 3 # wait for PD to apply the placement rule + +run_sql "CREATE DATABASE $DB;" + +run_sql "CREATE TABLE $DB.usertable1 ( \ + YCSB_KEY varchar(64) NOT NULL, \ + FIELD0 varchar(1) DEFAULT NULL, \ + PRIMARY KEY (YCSB_KEY) \ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;" + +run_sql "INSERT INTO $DB.usertable1 VALUES (\"a\", \"b\");" +run_sql "INSERT INTO $DB.usertable1 VALUES (\"aa\", \"b\");" + +run_sql "CREATE TABLE $DB.usertable2 ( \ + YCSB_KEY varchar(64) NOT NULL, \ + FIELD0 varchar(1) DEFAULT NULL, \ + PRIMARY KEY (YCSB_KEY) \ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;" + +run_sql "INSERT INTO $DB.usertable2 VALUES (\"c\", \"d\");" + +# backup db +echo "backup start..." +run_br -u https://$PD_ADDR backup db --db "$DB" -s "local://$TEST_DIR/$DB" --replica-read-label '$mode:read_only' + +run_sql "DROP DATABASE $DB;" + +# restore db +echo "restore start..." +run_br restore db --db $DB -s "local://$TEST_DIR/$DB" -u https://$PD_ADDR + +run_sql "select count(*) from $DB.usertable1;" +table1_count=$(read_result) +echo "table1 count: $table1_count" +if [ "$table1_count" -ne "2" ];then + echo "TEST: [$TEST_NAME] failed!" + exit 1 +fi + +run_sql "select count(*) from $DB.usertable2;" +table2_count=$(read_result) +echo "table2 count: $table2_count" +if [ "$table2_count" -ne "1" ];then + echo "TEST: [$TEST_NAME] failed!" + exit 1 +fi + +# Test BR DDL query string +echo "testing DDL query..." +run_curl https://$TIDB_STATUS_ADDR/ddl/history | grep -E '/\*from\(br\)\*/CREATE TABLE' +run_curl https://$TIDB_STATUS_ADDR/ddl/history | grep -E '/\*from\(br\)\*/CREATE DATABASE' + +run_sql "DROP DATABASE $DB;" +run_pd_ctl -u https://$PD_ADDR store label $random_store_id '$mode' '' +run_pd_ctl -u https://$PD_ADDR config placement-rules rule-bundle save --in $TEST_DIR/default_rules.json \ No newline at end of file diff --git a/br/tests/br_restore_log_task_enable/run.sh b/br/tests/br_restore_log_task_enable/run.sh new file mode 100644 index 0000000000000..923f8fe7c2b33 --- /dev/null +++ b/br/tests/br_restore_log_task_enable/run.sh @@ -0,0 +1,56 @@ +#!/bin/sh +# +# 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, +# 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. + +set -eux +DB="$TEST_NAME" +TABLE="usertable" + +# start log task +run_br log start --task-name 1234 -s "local://$TEST_DIR/$DB/log" --pd $PD_ADDR + +run_sql "CREATE DATABASE $DB;" +run_sql "CREATE TABLE $DB.$TABLE (id int);" +run_sql "INSERT INTO $DB.$TABLE VALUES (1), (2), (3);" + +# backup full +run_br backup full -s "local://$TEST_DIR/$DB/full" --pd $PD_ADDR + +# clean db +run_sql "DROP DATABASE $DB;" + +# restore full (should be failed) +run_br restore full -s "local://$TEST_DIR/$DB/full" --pd $PD_ADDR && exit 1 + +# restore point (should be failed) +run_br restore point -s "local://$TEST_DIR/$DB/log" --pd $PD_ADDR && exit 1 + +# pause log task +run_br log pause --task-name 1234 --pd $PD_ADDR + +# restore full (should be failed) +run_br restore full -s "local://$TEST_DIR/$DB/full" --pd $PD_ADDR && exit 1 + +# restore point (should be failed) +run_br restore point -s "local://$TEST_DIR/$DB/log" --pd $PD_ADDR && exit 1 + +# stop log task +run_br log stop --task-name 1234 --pd $PD_ADDR + +# restore full (should be success) +run_br restore full -s "local://$TEST_DIR/$DB/full" --pd $PD_ADDR + +# clean db +run_sql "DROP DATABASE $DB" diff --git a/br/tests/br_ttl/run.sh b/br/tests/br_ttl/run.sh new file mode 100644 index 0000000000000..cfb1a38c8281b --- /dev/null +++ b/br/tests/br_ttl/run.sh @@ -0,0 +1,54 @@ +#!/bin/sh +# +# 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, +# 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. + +set -eu +DB="$TEST_NAME" + +PROGRESS_FILE="$TEST_DIR/progress_file" +BACKUPMETAV1_LOG="$TEST_DIR/backup.log" +BACKUPMETAV2_LOG="$TEST_DIR/backupv2.log" +RESTORE_LOG="$TEST_DIR/restore.log" +rm -rf $PROGRESS_FILE + +run_sql "create schema $DB;" +run_sql "create table $DB.ttl_test_tbl(id int primary key, t datetime) TTL=\`t\` + interval 1 day TTL_ENABLE='ON'" + +# backup db +echo "full backup meta v2 start..." +unset BR_LOG_TO_TERM +rm -f $BACKUPMETAV2_LOG +run_br backup full --log-file $BACKUPMETAV2_LOG -s "local://$TEST_DIR/${DB}v2" --pd $PD_ADDR --use-backupmeta-v2 + +echo "full backup meta v1 start..." +rm -f $BACKUPMETAV1_LOG +run_br backup full --log-file $BACKUPMETAV1_LOG -s "local://$TEST_DIR/$DB" --pd $PD_ADDR + +TTL_MARK='![ttl]' +CREATE_SQL_CONTAINS="/*T${TTL_MARK} TTL=\`t\` + INTERVAL 1 DAY */ /*T${TTL_MARK} TTL_ENABLE='OFF' */" + +# restore v2 +run_sql "DROP DATABASE $DB;" +echo "restore ttl table start v2..." +run_br restore db --db $DB -s "local://$TEST_DIR/${DB}v2" --pd $PD_ADDR +run_sql "show create table $DB.ttl_test_tbl;" +check_contains "$CREATE_SQL_CONTAINS" + +# restore v1 +run_sql "DROP DATABASE $DB;" +echo "restore ttl table start v1..." +run_br restore db --db $DB -s "local://$TEST_DIR/$DB" --pd $PD_ADDR +run_sql "show create table $DB.ttl_test_tbl;" +check_contains "$CREATE_SQL_CONTAINS" diff --git a/br/tests/lightning_bom_file/config.toml b/br/tests/lightning_bom_file/config.toml new file mode 100644 index 0000000000000..291d1b166103a --- /dev/null +++ b/br/tests/lightning_bom_file/config.toml @@ -0,0 +1,2 @@ +[mydumper.csv] +header = true diff --git a/br/tests/lightning_bom_file/data/mytest.testtbl-schema.sql b/br/tests/lightning_bom_file/data/mytest.testtbl-schema.sql new file mode 100644 index 0000000000000..4232788898790 --- /dev/null +++ b/br/tests/lightning_bom_file/data/mytest.testtbl-schema.sql @@ -0,0 +1,5 @@ +CREATE TABLE testtbl ( + id INTEGER, + val1 VARCHAR(40) NOT NULL, + INDEX `idx_val1` (`val1`) +); diff --git a/br/tests/lightning_bom_file/data/mytest.testtbl.csv b/br/tests/lightning_bom_file/data/mytest.testtbl.csv new file mode 100644 index 0000000000000..e0931cce2a480 --- /dev/null +++ b/br/tests/lightning_bom_file/data/mytest.testtbl.csv @@ -0,0 +1,6 @@ +id,val1 +1,"aaa01" +2,"aaa01" +3,"aaa02" +4,"aaa02" +5,"aaa05" diff --git a/br/tests/lightning_bom_file/original_data/mytest.testtbl-schema.sql b/br/tests/lightning_bom_file/original_data/mytest.testtbl-schema.sql new file mode 100644 index 0000000000000..dc1e032a16618 --- /dev/null +++ b/br/tests/lightning_bom_file/original_data/mytest.testtbl-schema.sql @@ -0,0 +1,5 @@ +CREATE TABLE testtbl ( + id INTEGER, + val1 VARCHAR(40) NOT NULL, + INDEX `idx_val1` (`val1`) +); diff --git a/br/tests/lightning_bom_file/original_data/mytest.testtbl.csv b/br/tests/lightning_bom_file/original_data/mytest.testtbl.csv new file mode 100644 index 0000000000000..270c410cd79fd --- /dev/null +++ b/br/tests/lightning_bom_file/original_data/mytest.testtbl.csv @@ -0,0 +1,6 @@ +id,val1 +1,"aaa01" +2,"aaa01" +3,"aaa02" +4,"aaa02" +5,"aaa05" diff --git a/br/tests/lightning_bom_file/run.sh b/br/tests/lightning_bom_file/run.sh new file mode 100755 index 0000000000000..88eada54c74a9 --- /dev/null +++ b/br/tests/lightning_bom_file/run.sh @@ -0,0 +1,56 @@ +#!/bin/sh +# +# Copyright 2023 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. + +set -eux + +mydir=$(dirname "${BASH_SOURCE[0]}") + +original_schema_file="${mydir}/original_data/mytest.testtbl-schema.sql" +original_data_file="${mydir}/original_data/mytest.testtbl.csv" +schema_file="${original_schema_file/original_data/data}" +data_file="${original_data_file/original_data/data}" + +# add the BOM header +printf '\xEF\xBB\xBF' | cat - <( sed '1s/^\xEF\xBB\xBF//' "${original_schema_file}" ) > "${schema_file}" +printf '\xEF\xBB\xBF' | cat - <( sed '1s/^\xEF\xBB\xBF//' "${original_data_file}" ) > "${data_file}" + +# verify the BOM header +if ! grep -q $'^\xEF\xBB\xBF' "${schema_file}"; then + echo "schema file doesn't contain the BOM header" >&2 + exit 1 +fi + +if ! grep -q $'^\xEF\xBB\xBF' "${data_file}"; then + echo "data file doesn't contain the BOM header" >&2 + exit 1 +fi + +row_count=$( sed '1d' "${data_file}" | wc -l | xargs echo ) + +run_lightning --backend tidb + +# Check that everything is correctly imported +run_sql 'SELECT count(*) FROM mytest.testtbl' +check_contains "count(*): ${row_count}" + +check_cluster_version 4 0 0 'local backend' || exit 0 +run_sql "DROP TABLE mytest.testtbl" + +run_lightning --backend local + +# Check that everything is correctly imported +run_sql 'SELECT count(*) FROM mytest.testtbl' +check_contains "count(*): ${row_count}" diff --git a/br/tests/lightning_check_partial_imported/config.toml b/br/tests/lightning_check_partial_imported/config.toml new file mode 100644 index 0000000000000..30cb6fe6b4eb3 --- /dev/null +++ b/br/tests/lightning_check_partial_imported/config.toml @@ -0,0 +1,5 @@ +[tikv-importer] +backend = "local" + +[mydumper.csv] +header = true diff --git a/br/tests/lightning_check_partial_imported/data/db01.tbl01-schema.sql b/br/tests/lightning_check_partial_imported/data/db01.tbl01-schema.sql new file mode 100644 index 0000000000000..b6832e95d95e3 --- /dev/null +++ b/br/tests/lightning_check_partial_imported/data/db01.tbl01-schema.sql @@ -0,0 +1,12 @@ +CREATE TABLE tbl01 ( + `id` INTEGER, + `val` VARCHAR(64), + `aaa` CHAR(66) DEFAULT NULL, + `bbb` CHAR(10) NOT NULL, + `ccc` CHAR(42) DEFAULT NULL, + `ddd` CHAR(42) DEFAULT NULL, + `eee` CHAR(66) DEFAULT NULL, + `fff` VARCHAR(128) DEFAULT NULL, + KEY `aaa` (`aaa`), + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; diff --git a/br/tests/lightning_check_partial_imported/data/db01.tbl01.csv b/br/tests/lightning_check_partial_imported/data/db01.tbl01.csv new file mode 100644 index 0000000000000..108134af2ee72 --- /dev/null +++ b/br/tests/lightning_check_partial_imported/data/db01.tbl01.csv @@ -0,0 +1,6 @@ +id,val,aaa,bbb,ccc,ddd,eee,fff +1,"v01","a01","b01","c01","d01","e01","f01" +2,"v02","a02","b02","c02","d02","e02","f02" +3,"v03","a03","b03","c03","d03","e03","f03" +4,"v04","a04","b04","c04","d04","e04","f04" +5,"v05","a05","b05","c05","d05","e05","f05" diff --git a/br/tests/lightning_check_partial_imported/run.sh b/br/tests/lightning_check_partial_imported/run.sh new file mode 100755 index 0000000000000..00ed78a5013d1 --- /dev/null +++ b/br/tests/lightning_check_partial_imported/run.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# +# 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, +# 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. + +MYDIR=$(dirname "${BASH_SOURCE[0]}") +set -eux + +check_cluster_version 4 0 0 'local backend' || exit 0 + +export GO_FAILPOINTS="github.com/pingcap/tidb/br/pkg/lightning/restore/FailBeforeStartImportingIndexEngine=return" +set +e +if run_lightning; then + echo "The first import doesn't fail as expected" >&2 + exit 1 +fi +set -e + +data_records=$(tail -n +2 "${MYDIR}/data/db01.tbl01.csv" | wc -l | xargs echo ) +run_sql "SELECT COUNT(*) FROM db01.tbl01 USE INDEX();" +check_contains "${data_records}" + +export GO_FAILPOINTS="" +set +e +if run_lightning --check-requirements=1; then + echo "The pre-check doesn't find out the non-empty table problem" + exit 2 +fi +set -e + +run_sql "TRUNCATE TABLE db01.tbl01;" +run_lightning --check-requirements=1 +run_sql "SELECT COUNT(*) FROM db01.tbl01;" +check_contains "${data_records}" +run_sql "SELECT COUNT(*) FROM db01.tbl01 USE INDEX();" +check_contains "${data_records}" diff --git a/br/tests/lightning_checkpoint/run.sh b/br/tests/lightning_checkpoint/run.sh index 86551fd6246eb..5263dd90f1acf 100755 --- a/br/tests/lightning_checkpoint/run.sh +++ b/br/tests/lightning_checkpoint/run.sh @@ -79,6 +79,9 @@ for i in $(seq "$TABLE_COUNT"); do done set -e +# at the failure of last table, all data engines are imported so finished == total +grep "print lightning status" "$TEST_DIR/lightning.log" | grep -q "equal=true" + export GO_FAILPOINTS="$SLOWDOWN_FAILPOINTS" # After everything is done, there should be no longer new calls to ImportEngine # (and thus `kill_lightning_after_one_import` will spare this final check) diff --git a/br/tests/lightning_checkpoint_chunks/run.sh b/br/tests/lightning_checkpoint_chunks/run.sh index 35cabe0aadfc5..48d24ca405070 100755 --- a/br/tests/lightning_checkpoint_chunks/run.sh +++ b/br/tests/lightning_checkpoint_chunks/run.sh @@ -48,6 +48,11 @@ for i in $(seq "$CHUNK_COUNT"); do done done +PKG="github.com/pingcap/tidb/br/pkg/lightning" +export GO_FAILPOINTS="$PKG/backend/local/orphanWriterGoRoutine=return();$PKG/restore/orphanWriterGoRoutine=return();$PKG/orphanWriterGoRoutine=return()" +# test won't panic +do_run_lightning config + # Set the failpoint to kill the lightning instance as soon as # one file (after writing totally $ROW_COUNT rows) is imported. # If checkpoint does work, this should kill exactly $CHUNK_COUNT instances of lightnings. diff --git a/br/tests/lightning_checkpoint_columns/run.sh b/br/tests/lightning_checkpoint_columns/run.sh index 401c75cfb9f64..5809d05a1b830 100755 --- a/br/tests/lightning_checkpoint_columns/run.sh +++ b/br/tests/lightning_checkpoint_columns/run.sh @@ -29,6 +29,8 @@ echo "INSERT INTO tbl (j, i) VALUES (3, 1),(4, 2);" > "$DBPATH/cp_tsr.tbl.sql" # Set the failpoint to kill the lightning instance as soon as one row is written PKG="github.com/pingcap/tidb/br/pkg/lightning/restore" export GO_FAILPOINTS="$PKG/SlowDownWriteRows=sleep(1000);$PKG/FailAfterWriteRows=panic;$PKG/SetMinDeliverBytes=return(1)" +# Check after 1 row is written in tidb backend, the finished progress is updated +export GO_FAILPOINTS="${GO_FAILPOINTS};github.com/pingcap/tidb/br/pkg/lightning/PrintStatus=return()" # Start importing the tables. run_sql 'DROP DATABASE IF EXISTS cp_tsr' @@ -40,11 +42,16 @@ set -e run_sql 'SELECT count(*) FROM `cp_tsr`.tbl' check_contains "count(*): 1" +# After FailAfterWriteRows, the finished bytes is 36 as the first row size +grep "PrintStatus Failpoint" "$TEST_DIR/lightning.log" | grep -q "finished=36" + # restart lightning from checkpoint, the second line should be written successfully -export GO_FAILPOINTS= +# also check after restart from checkpoint, final finished equals to total +export GO_FAILPOINTS="github.com/pingcap/tidb/br/pkg/lightning/PrintStatus=return()" set +e run_lightning -d "$DBPATH" --backend tidb --enable-checkpoint=1 2> /dev/null set -e run_sql 'SELECT j FROM `cp_tsr`.tbl WHERE i = 2;' check_contains "j: 4" +grep "PrintStatus Failpoint" "$TEST_DIR/lightning.log" | grep -q "equal=true" diff --git a/br/tests/lightning_compress/config.toml b/br/tests/lightning_compress/config.toml new file mode 100644 index 0000000000000..f4452fe7664a6 --- /dev/null +++ b/br/tests/lightning_compress/config.toml @@ -0,0 +1,14 @@ +[mydumper.csv] +separator = ',' +delimiter = '"' +header = true +not-null = false +null = '\N' +backslash-escape = true +trim-last-separator = false + +[checkpoint] +enable = true +schema = "tidb_lightning_checkpoint_test" +driver = "mysql" +keep-after-success = true diff --git a/br/tests/lightning_compress/data.gzip/compress-schema-create.sql.gz b/br/tests/lightning_compress/data.gzip/compress-schema-create.sql.gz new file mode 100644 index 0000000000000..6571d2a15b507 Binary files /dev/null and b/br/tests/lightning_compress/data.gzip/compress-schema-create.sql.gz differ diff --git a/br/tests/lightning_compress/data.gzip/compress.empty_strings-schema.sql.gz b/br/tests/lightning_compress/data.gzip/compress.empty_strings-schema.sql.gz new file mode 100644 index 0000000000000..542898561bab1 Binary files /dev/null and b/br/tests/lightning_compress/data.gzip/compress.empty_strings-schema.sql.gz differ diff --git a/br/tests/lightning_compress/data.gzip/compress.empty_strings.000000000.csv.gz b/br/tests/lightning_compress/data.gzip/compress.empty_strings.000000000.csv.gz new file mode 100644 index 0000000000000..bfa13ed67b006 Binary files /dev/null and b/br/tests/lightning_compress/data.gzip/compress.empty_strings.000000000.csv.gz differ diff --git a/br/tests/lightning_compress/data.gzip/compress.escapes-schema.sql.gz b/br/tests/lightning_compress/data.gzip/compress.escapes-schema.sql.gz new file mode 100644 index 0000000000000..bed4b7859ac92 Binary files /dev/null and b/br/tests/lightning_compress/data.gzip/compress.escapes-schema.sql.gz differ diff --git a/br/tests/lightning_compress/data.gzip/compress.escapes.000000000.csv.gz b/br/tests/lightning_compress/data.gzip/compress.escapes.000000000.csv.gz new file mode 100644 index 0000000000000..37028e36d9de8 Binary files /dev/null and b/br/tests/lightning_compress/data.gzip/compress.escapes.000000000.csv.gz differ diff --git a/br/tests/lightning_compress/data.gzip/compress.multi_rows-schema.sql.gz b/br/tests/lightning_compress/data.gzip/compress.multi_rows-schema.sql.gz new file mode 100644 index 0000000000000..328fed9cb3df8 Binary files /dev/null and b/br/tests/lightning_compress/data.gzip/compress.multi_rows-schema.sql.gz differ diff --git a/br/tests/lightning_compress/data.gzip/compress.multi_rows.000000000.csv.gz b/br/tests/lightning_compress/data.gzip/compress.multi_rows.000000000.csv.gz new file mode 100644 index 0000000000000..c732af263d576 Binary files /dev/null and b/br/tests/lightning_compress/data.gzip/compress.multi_rows.000000000.csv.gz differ diff --git a/br/tests/lightning_compress/data.gzip/compress.threads-schema.sql.gz b/br/tests/lightning_compress/data.gzip/compress.threads-schema.sql.gz new file mode 100644 index 0000000000000..1782675bfc7fe Binary files /dev/null and b/br/tests/lightning_compress/data.gzip/compress.threads-schema.sql.gz differ diff --git a/br/tests/lightning_compress/data.gzip/compress.threads.000000000.csv.gz b/br/tests/lightning_compress/data.gzip/compress.threads.000000000.csv.gz new file mode 100644 index 0000000000000..683eade1cdb9f Binary files /dev/null and b/br/tests/lightning_compress/data.gzip/compress.threads.000000000.csv.gz differ diff --git a/br/tests/lightning_compress/data.snappy/compress-schema-create.sql.snappy b/br/tests/lightning_compress/data.snappy/compress-schema-create.sql.snappy new file mode 100644 index 0000000000000..afa2211c77475 Binary files /dev/null and b/br/tests/lightning_compress/data.snappy/compress-schema-create.sql.snappy differ diff --git a/br/tests/lightning_compress/data.snappy/compress.empty_strings-schema.sql.snappy b/br/tests/lightning_compress/data.snappy/compress.empty_strings-schema.sql.snappy new file mode 100644 index 0000000000000..cab30d082385a Binary files /dev/null and b/br/tests/lightning_compress/data.snappy/compress.empty_strings-schema.sql.snappy differ diff --git a/br/tests/lightning_compress/data.snappy/compress.empty_strings.000000000.sql.snappy b/br/tests/lightning_compress/data.snappy/compress.empty_strings.000000000.sql.snappy new file mode 100644 index 0000000000000..9c81e8f78f234 Binary files /dev/null and b/br/tests/lightning_compress/data.snappy/compress.empty_strings.000000000.sql.snappy differ diff --git a/br/tests/lightning_compress/data.snappy/compress.escapes-schema.sql.snappy b/br/tests/lightning_compress/data.snappy/compress.escapes-schema.sql.snappy new file mode 100644 index 0000000000000..9e27befa522a0 Binary files /dev/null and b/br/tests/lightning_compress/data.snappy/compress.escapes-schema.sql.snappy differ diff --git a/br/tests/lightning_compress/data.snappy/compress.escapes.000000000.sql.snappy b/br/tests/lightning_compress/data.snappy/compress.escapes.000000000.sql.snappy new file mode 100644 index 0000000000000..1380b47d9881e Binary files /dev/null and b/br/tests/lightning_compress/data.snappy/compress.escapes.000000000.sql.snappy differ diff --git a/br/tests/lightning_compress/data.snappy/compress.multi_rows-schema.sql.snappy b/br/tests/lightning_compress/data.snappy/compress.multi_rows-schema.sql.snappy new file mode 100644 index 0000000000000..5cc0365d1c65d Binary files /dev/null and b/br/tests/lightning_compress/data.snappy/compress.multi_rows-schema.sql.snappy differ diff --git a/br/tests/lightning_compress/data.snappy/compress.multi_rows.000000000.sql.snappy b/br/tests/lightning_compress/data.snappy/compress.multi_rows.000000000.sql.snappy new file mode 100644 index 0000000000000..7f5bf585e106c Binary files /dev/null and b/br/tests/lightning_compress/data.snappy/compress.multi_rows.000000000.sql.snappy differ diff --git a/br/tests/lightning_compress/data.snappy/compress.threads-schema.sql.snappy b/br/tests/lightning_compress/data.snappy/compress.threads-schema.sql.snappy new file mode 100644 index 0000000000000..b1c8b89565bfb Binary files /dev/null and b/br/tests/lightning_compress/data.snappy/compress.threads-schema.sql.snappy differ diff --git a/br/tests/lightning_compress/data.snappy/compress.threads.000000000.sql.snappy b/br/tests/lightning_compress/data.snappy/compress.threads.000000000.sql.snappy new file mode 100644 index 0000000000000..dc7c1ee8adc0b Binary files /dev/null and b/br/tests/lightning_compress/data.snappy/compress.threads.000000000.sql.snappy differ diff --git a/br/tests/lightning_compress/data.zstd/compress-schema-create.sql.zst b/br/tests/lightning_compress/data.zstd/compress-schema-create.sql.zst new file mode 100644 index 0000000000000..12bdbd710973e Binary files /dev/null and b/br/tests/lightning_compress/data.zstd/compress-schema-create.sql.zst differ diff --git a/br/tests/lightning_compress/data.zstd/compress.empty_strings-schema.sql.zst b/br/tests/lightning_compress/data.zstd/compress.empty_strings-schema.sql.zst new file mode 100644 index 0000000000000..f9b922954ff3d Binary files /dev/null and b/br/tests/lightning_compress/data.zstd/compress.empty_strings-schema.sql.zst differ diff --git a/br/tests/lightning_compress/data.zstd/compress.empty_strings.000000000.csv.zst b/br/tests/lightning_compress/data.zstd/compress.empty_strings.000000000.csv.zst new file mode 100644 index 0000000000000..aa89918bb2cee Binary files /dev/null and b/br/tests/lightning_compress/data.zstd/compress.empty_strings.000000000.csv.zst differ diff --git a/br/tests/lightning_compress/data.zstd/compress.escapes-schema.sql.zst b/br/tests/lightning_compress/data.zstd/compress.escapes-schema.sql.zst new file mode 100644 index 0000000000000..fa4b4e6b3497d Binary files /dev/null and b/br/tests/lightning_compress/data.zstd/compress.escapes-schema.sql.zst differ diff --git a/br/tests/lightning_compress/data.zstd/compress.escapes.000000000.csv.zst b/br/tests/lightning_compress/data.zstd/compress.escapes.000000000.csv.zst new file mode 100644 index 0000000000000..40994e745bdf3 Binary files /dev/null and b/br/tests/lightning_compress/data.zstd/compress.escapes.000000000.csv.zst differ diff --git a/br/tests/lightning_compress/data.zstd/compress.multi_rows-schema.sql.zst b/br/tests/lightning_compress/data.zstd/compress.multi_rows-schema.sql.zst new file mode 100644 index 0000000000000..d64a9a4a879d3 Binary files /dev/null and b/br/tests/lightning_compress/data.zstd/compress.multi_rows-schema.sql.zst differ diff --git a/br/tests/lightning_compress/data.zstd/compress.multi_rows.000000000.csv.zst b/br/tests/lightning_compress/data.zstd/compress.multi_rows.000000000.csv.zst new file mode 100644 index 0000000000000..4db1bea4c69f9 Binary files /dev/null and b/br/tests/lightning_compress/data.zstd/compress.multi_rows.000000000.csv.zst differ diff --git a/br/tests/lightning_compress/data.zstd/compress.threads-schema.sql.zst b/br/tests/lightning_compress/data.zstd/compress.threads-schema.sql.zst new file mode 100644 index 0000000000000..3a41c8de4816c Binary files /dev/null and b/br/tests/lightning_compress/data.zstd/compress.threads-schema.sql.zst differ diff --git a/br/tests/lightning_compress/data.zstd/compress.threads.000000000.csv.zst b/br/tests/lightning_compress/data.zstd/compress.threads.000000000.csv.zst new file mode 100644 index 0000000000000..13eef0ba83011 Binary files /dev/null and b/br/tests/lightning_compress/data.zstd/compress.threads.000000000.csv.zst differ diff --git a/br/tests/lightning_compress/run.sh b/br/tests/lightning_compress/run.sh new file mode 100755 index 0000000000000..bf48b09b2cccd --- /dev/null +++ b/br/tests/lightning_compress/run.sh @@ -0,0 +1,61 @@ +#!/bin/sh + +set -eu + +for BACKEND in tidb local; do + for compress in gzip snappy zstd; do + if [ "$BACKEND" = 'local' ]; then + check_cluster_version 4 0 0 'local backend' || continue + fi + + # Set minDeliverBytes to a small enough number to only write only 1 row each time + # Set the failpoint to kill the lightning instance as soon as one row is written + PKG="github.com/pingcap/tidb/br/pkg/lightning/restore" + export GO_FAILPOINTS="$PKG/SlowDownWriteRows=sleep(1000);$PKG/FailAfterWriteRows=panic;$PKG/SetMinDeliverBytes=return(1)" + + # Start importing the tables. + run_sql 'DROP DATABASE IF EXISTS compress' + run_sql 'DROP DATABASE IF EXISTS tidb_lightning_checkpoint_test' + set +e + run_lightning --backend $BACKEND -d "tests/$TEST_NAME/data.$compress" --enable-checkpoint=1 2> /dev/null + set -e + + # restart lightning from checkpoint, the second line should be written successfully + export GO_FAILPOINTS= + set +e + run_lightning --backend $BACKEND -d "tests/$TEST_NAME/data.$compress" --enable-checkpoint=1 2> /dev/null + set -e + + run_sql 'SELECT count(*), sum(PROCESSLIST_TIME), sum(THREAD_OS_ID), count(PROCESSLIST_STATE) FROM compress.threads' + check_contains 'count(*): 43' + check_contains 'sum(PROCESSLIST_TIME): 322253' + check_contains 'sum(THREAD_OS_ID): 303775702' + check_contains 'count(PROCESSLIST_STATE): 3' + + run_sql 'SELECT count(*) FROM compress.threads WHERE PROCESSLIST_TIME IS NOT NULL' + check_contains 'count(*): 12' + + run_sql 'SELECT count(*) FROM compress.multi_rows WHERE a="aaaaaaaaaa"' + check_contains 'count(*): 100000' + + run_sql 'SELECT hex(t), j, hex(b) FROM compress.escapes WHERE i = 1' + check_contains 'hex(t): 5C' + check_contains 'j: {"?": []}' + check_contains 'hex(b): FFFFFFFF' + + run_sql 'SELECT hex(t), j, hex(b) FROM compress.escapes WHERE i = 2' + check_contains 'hex(t): 22' + check_contains 'j: "\n\n\n"' + check_contains 'hex(b): 0D0A0D0A' + + run_sql 'SELECT hex(t), j, hex(b) FROM compress.escapes WHERE i = 3' + check_contains 'hex(t): 0A' + check_contains 'j: [",,,"]' + check_contains 'hex(b): 5C2C5C2C' + + run_sql 'SELECT id FROM compress.empty_strings WHERE a = """"' + check_contains 'id: 3' + run_sql 'SELECT id FROM compress.empty_strings WHERE b <> ""' + check_not_contains 'id:' + done +done diff --git a/br/tests/lightning_config_max_error/data/mytest.testtbl-schema.sql b/br/tests/lightning_config_max_error/data/mytest.testtbl-schema.sql new file mode 100644 index 0000000000000..93582d5178139 --- /dev/null +++ b/br/tests/lightning_config_max_error/data/mytest.testtbl-schema.sql @@ -0,0 +1,5 @@ +CREATE TABLE testtbl ( + id INTEGER PRIMARY KEY, + val1 VARCHAR(40) NOT NULL, + INDEX `idx_val1` (`val1`) +); diff --git a/br/tests/lightning_config_max_error/data/mytest.testtbl.csv b/br/tests/lightning_config_max_error/data/mytest.testtbl.csv new file mode 100644 index 0000000000000..021f6bbf7be1c --- /dev/null +++ b/br/tests/lightning_config_max_error/data/mytest.testtbl.csv @@ -0,0 +1,16 @@ +id,val1 +1,"aaa01" +2,"aaa01" +3,"aaa02" +4,"aaa02" +5,"aaa05" +6,"aaa06" +7,"aaa07" +8,"aaa08" +9,"aaa09" +10,"aaa10" +1,"bbb01" +2,"bbb02" +3,"bbb03" +4,"bbb04" +5,"bbb05" diff --git a/br/tests/lightning_config_max_error/err_config.toml b/br/tests/lightning_config_max_error/err_config.toml new file mode 100644 index 0000000000000..79447e685a8f5 --- /dev/null +++ b/br/tests/lightning_config_max_error/err_config.toml @@ -0,0 +1,8 @@ +[lightning.max-error] +conflict = 4 + +[mydumper.csv] +header = true + +[tikv-importer] +duplicate-resolution = 'remove' diff --git a/br/tests/lightning_config_max_error/normal_config.toml b/br/tests/lightning_config_max_error/normal_config.toml new file mode 100644 index 0000000000000..92e08739fe04a --- /dev/null +++ b/br/tests/lightning_config_max_error/normal_config.toml @@ -0,0 +1,8 @@ +[lightning.max-error] +conflict = 20 + +[mydumper.csv] +header = true + +[tikv-importer] +duplicate-resolution = 'remove' diff --git a/br/tests/lightning_config_max_error/normal_config_old_style.toml b/br/tests/lightning_config_max_error/normal_config_old_style.toml new file mode 100644 index 0000000000000..fe402d071f5e0 --- /dev/null +++ b/br/tests/lightning_config_max_error/normal_config_old_style.toml @@ -0,0 +1,8 @@ +[lightning] +max-error = 0 # this actually sets the type error + +[mydumper.csv] +header = true + +[tikv-importer] +duplicate-resolution = 'remove' diff --git a/br/tests/lightning_config_max_error/run.sh b/br/tests/lightning_config_max_error/run.sh new file mode 100755 index 0000000000000..1d850ae55f0d8 --- /dev/null +++ b/br/tests/lightning_config_max_error/run.sh @@ -0,0 +1,81 @@ +#!/bin/sh +# +# Copyright 2023 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. + +set -eux + +check_cluster_version 4 0 0 'local backend' || exit 0 + +mydir=$(dirname "${BASH_SOURCE[0]}") + +data_file="${mydir}/data/mytest.testtbl.csv" + +total_row_count=$( sed '1d' "${data_file}" | wc -l | xargs echo ) +uniq_row_count=$( sed '1d' "${data_file}" | awk -F, '{print $1}' | sort | uniq -c | awk '{print $1}' | grep -c '1' | xargs echo ) +duplicated_row_count=$(( ${total_row_count} - ${uniq_row_count} )) + +run_sql 'DROP TABLE IF EXISTS mytest.testtbl' +run_sql 'DROP TABLE IF EXISTS lightning_task_info.conflict_error_v1' + +stderr_file="/tmp/${TEST_NAME}.stderr" + +set +e +if run_lightning --backend local --config "${mydir}/err_config.toml" 2> "${stderr_file}"; then + echo "The lightning import doesn't fail as expected" >&2 + exit 1 +fi +set -e + +err_msg=$( cat << EOF +tidb lightning encountered error: collect local duplicate rows failed: The number of conflict errors exceeds the threshold configured by \`max-error.conflict\`: '4' +EOF +) +cat "${stderr_file}" +grep -q "${err_msg}" "${stderr_file}" + +run_sql 'SELECT COUNT(*) FROM lightning_task_info.conflict_error_v1' +# Although conflict error number exceeds the max-error limit, +# all the conflict errors are recorded, +# because recording of conflict errors are executed batch by batch (batch size 1024), +# this batch of conflict errors are all recorded +check_contains "COUNT(*): ${duplicated_row_count}" + +# import a second time + +run_sql 'DROP TABLE IF EXISTS mytest.testtbl' +run_sql 'DROP TABLE IF EXISTS lightning_task_info.conflict_error_v1' + +run_lightning --backend local --config "${mydir}/normal_config.toml" + +run_sql 'SELECT COUNT(*) FROM lightning_task_info.conflict_error_v1' +check_contains "COUNT(*): ${duplicated_row_count}" + +# Check remaining records in the target table +run_sql 'SELECT COUNT(*) FROM mytest.testtbl' +check_contains "COUNT(*): ${uniq_row_count}" + +# import a third time + +run_sql 'DROP TABLE IF EXISTS mytest.testtbl' +run_sql 'DROP TABLE IF EXISTS lightning_task_info.conflict_error_v1' + +run_lightning --backend local --config "${mydir}/normal_config_old_style.toml" + +run_sql 'SELECT COUNT(*) FROM lightning_task_info.conflict_error_v1' +check_contains "COUNT(*): ${duplicated_row_count}" + +# Check remaining records in the target table +run_sql 'SELECT COUNT(*) FROM mytest.testtbl' +check_contains "COUNT(*): ${uniq_row_count}" diff --git a/br/tests/lightning_config_skip_csv_header/data/mytest.testtbl-schema.sql b/br/tests/lightning_config_skip_csv_header/data/mytest.testtbl-schema.sql new file mode 100644 index 0000000000000..93582d5178139 --- /dev/null +++ b/br/tests/lightning_config_skip_csv_header/data/mytest.testtbl-schema.sql @@ -0,0 +1,5 @@ +CREATE TABLE testtbl ( + id INTEGER PRIMARY KEY, + val1 VARCHAR(40) NOT NULL, + INDEX `idx_val1` (`val1`) +); diff --git a/br/tests/lightning_config_skip_csv_header/data/mytest.testtbl.csv b/br/tests/lightning_config_skip_csv_header/data/mytest.testtbl.csv new file mode 100644 index 0000000000000..5958ab0c80cb2 --- /dev/null +++ b/br/tests/lightning_config_skip_csv_header/data/mytest.testtbl.csv @@ -0,0 +1,6 @@ +aaa,bbb +1,"aaa01" +2,"aaa01" +3,"aaa02" +4,"aaa02" +5,"aaa05" diff --git a/br/tests/lightning_config_skip_csv_header/err_config.toml b/br/tests/lightning_config_skip_csv_header/err_config.toml new file mode 100644 index 0000000000000..95493db0dff44 --- /dev/null +++ b/br/tests/lightning_config_skip_csv_header/err_config.toml @@ -0,0 +1,9 @@ +[lightning] +check-requirements=true + +[mydumper.csv] +header = true +header-schema-match = true + +[tikv-importer] +duplicate-resolution = 'remove' diff --git a/br/tests/lightning_config_skip_csv_header/err_default_config.toml b/br/tests/lightning_config_skip_csv_header/err_default_config.toml new file mode 100644 index 0000000000000..a7b17c7276d92 --- /dev/null +++ b/br/tests/lightning_config_skip_csv_header/err_default_config.toml @@ -0,0 +1,8 @@ +[lightning] +check-requirements=true + +[mydumper.csv] +header = true + +[tikv-importer] +duplicate-resolution = 'remove' diff --git a/br/tests/lightning_config_skip_csv_header/normal_config.toml b/br/tests/lightning_config_skip_csv_header/normal_config.toml new file mode 100644 index 0000000000000..190e635cfc4e9 --- /dev/null +++ b/br/tests/lightning_config_skip_csv_header/normal_config.toml @@ -0,0 +1,9 @@ +[lightning] +check-requirements=true + +[mydumper.csv] +header = true +header-schema-match = false + +[tikv-importer] +duplicate-resolution = 'remove' diff --git a/br/tests/lightning_config_skip_csv_header/run.sh b/br/tests/lightning_config_skip_csv_header/run.sh new file mode 100755 index 0000000000000..80ad201e2d323 --- /dev/null +++ b/br/tests/lightning_config_skip_csv_header/run.sh @@ -0,0 +1,59 @@ +#!/bin/bash +# +# Copyright 2023 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. + +set -eux + +mydir=$(dirname "${BASH_SOURCE[0]}") + +data_file="${mydir}/data/mytest.testtbl.csv" + +total_row_count=$( sed '1d' "${data_file}" | wc -l | xargs echo ) + +run_sql 'DROP TABLE IF EXISTS mytest.testtbl' + +console_output_file="/tmp/${TEST_NAME}.out" + +echo "Use config that causes errors" +run_lightning --backend tidb --config "${mydir}/err_config.toml" 2>&1 | tee "${console_output_file}" +if [[ ${PIPESTATUS[0]} -eq 0 ]]; then + echo "The lightning import doesn't fail as expected" >&2 + exit 1 +fi + +grep -q "Lightning:Restore:ErrUnknownColumns" "${console_output_file}" + +# import a second time +echo "Use default config that causes errors" +run_lightning --backend tidb --config "${mydir}/err_default_config.toml" 2>&1 | tee "${console_output_file}" +if [[ ${PIPESTATUS[0]} -eq 0 ]]; then + echo "The lightning import doesn't fail as expected" >&2 + exit 1 +fi + +grep -q "Lightning:Restore:ErrUnknownColumns" "${console_output_file}" + +# import a thrid time + +run_sql 'DROP TABLE IF EXISTS mytest.testtbl' + +echo "Use config that can sucessfully import the data" +run_lightning --backend tidb --config "${mydir}/normal_config.toml" + +run_sql 'SELECT * FROM mytest.testtbl' +run_sql 'SELECT COUNT(*) FROM mytest.testtbl' +check_contains "COUNT(*): ${total_row_count}" +run_sql 'SELECT COUNT(*) FROM mytest.testtbl WHERE id > 0' +check_contains "COUNT(*): ${total_row_count}" diff --git a/br/tests/lightning_csv/errData/db-schema-create.sql b/br/tests/lightning_csv/errData/db-schema-create.sql new file mode 100755 index 0000000000000..6adfeca7f7dab --- /dev/null +++ b/br/tests/lightning_csv/errData/db-schema-create.sql @@ -0,0 +1 @@ +create database if not exists db; diff --git a/br/tests/lightning_csv/errData/db.test-schema.sql b/br/tests/lightning_csv/errData/db.test-schema.sql new file mode 100755 index 0000000000000..955632c7761b2 --- /dev/null +++ b/br/tests/lightning_csv/errData/db.test-schema.sql @@ -0,0 +1 @@ +create table test(a int primary key, b int, c int, d int); diff --git a/br/tests/lightning_csv/errData/db.test.1.csv b/br/tests/lightning_csv/errData/db.test.1.csv new file mode 100755 index 0000000000000..2e8450c25786e --- /dev/null +++ b/br/tests/lightning_csv/errData/db.test.1.csv @@ -0,0 +1,3 @@ +1,2,3,4 +2,10,4,5 +1111,",7,8 diff --git a/br/tests/lightning_csv/run.sh b/br/tests/lightning_csv/run.sh index 83c4917b4b76c..682bc55b08e26 100755 --- a/br/tests/lightning_csv/run.sh +++ b/br/tests/lightning_csv/run.sh @@ -41,3 +41,11 @@ for BACKEND in tidb local; do check_not_contains 'id:' done + +set +e +run_lightning --backend local -d "tests/$TEST_NAME/errData" --log-file "$TEST_DIR/lightning-err.log" 2>/dev/null +set -e +# err content presented +grep ",7,8" "$TEST_DIR/lightning-err.log" +# pos should not set to end +grep "[\"syntax error\"] [pos=22]" "$TEST_DIR/lightning-err.log" \ No newline at end of file diff --git a/br/tests/lightning_disable_scheduler_by_key_range/run.sh b/br/tests/lightning_disable_scheduler_by_key_range/run.sh index 9df6067c8baf8..2a88f0e0cac8e 100644 --- a/br/tests/lightning_disable_scheduler_by_key_range/run.sh +++ b/br/tests/lightning_disable_scheduler_by_key_range/run.sh @@ -50,16 +50,16 @@ ready_for_import_engine run_curl "https://${PD_ADDR}/pd/api/v1/config/cluster-version" -length=$(run_curl "https://${PD_ADDR}/pd/api/v1/config/region-label/rules" | jq 'select(.[].rule_type == "key-range") | length') +length=$(run_curl "https://${PD_ADDR}/pd/api/v1/config/region-label/rules" | jq '[ .[] | select(.rule_type == "key-range" and .labels[0].key == "schedule") ] | length') if [ "$length" != "1" ]; then - echo "region-label key-range rules should be 1, but got $length" >&2 + echo "region-label key-range schedule rules should be 1, but got $length" >&2 exit 1 fi wait "$shpid" -length=$(run_curl "https://${PD_ADDR}/pd/api/v1/config/region-label/rules" | jq 'select(.[].rule_type == "key-range") | length') +length=$(run_curl "https://${PD_ADDR}/pd/api/v1/config/region-label/rules" | jq '[ .[] | select(.rule_type == "key-range" and .labels[0].key == "schedule") ] | length') if [ -n "$length" ] && [ "$length" -ne 0 ]; then - echo "region-label key-range rules should be 0, but got $length" >&2 + echo "region-label key-range schedule rules should be 0, but got $length" >&2 exit 1 fi diff --git a/br/tests/lightning_duplicate_resolution_incremental/config1.toml b/br/tests/lightning_duplicate_resolution_incremental/config1.toml new file mode 100644 index 0000000000000..a72bc7a3718cb --- /dev/null +++ b/br/tests/lightning_duplicate_resolution_incremental/config1.toml @@ -0,0 +1,41 @@ +[lightning] +task-info-schema-name = 'lightning_task_info_dupe_resolve_incremental' +index-concurrency = 10 +table-concurrency = 10 + +[tikv-importer] +backend = "local" +on-duplicate = "replace" +duplicate-resolution = "remove" +incremental-import = true + +[checkpoint] +enable = true +schema = "tidb_lightning_checkpoint_dupe_resolve_incremental1" +driver = "mysql" + +[[mydumper.files]] +pattern = '(?i).*(-schema-trigger|-schema-post)\.sql$' +type = 'ignore' + +[[mydumper.files]] +pattern = '(?i)^(?:[^/]*/)*([^/.]+)-schema-create\.sql$' +schema = '$1' +type = 'schema-schema' + +[[mydumper.files]] +pattern = '(?i)^(?:[^/]*/)*([^/.]+)\.(.*?)-schema\.sql$' +schema = '$1' +table = '$2' +type = 'table-schema' + +[[mydumper.files]] +pattern = '(?i)^(?:[^/]*/)*([^/.]+)\.(.*?)\.0\.sql$' +schema = '$1' +table = '$2' +key = '0' +type = 'sql' + +[post-restore] +analyze = false +checksum = "optional" diff --git a/br/tests/lightning_duplicate_resolution_incremental/config2.toml b/br/tests/lightning_duplicate_resolution_incremental/config2.toml new file mode 100644 index 0000000000000..bb29511a9b432 --- /dev/null +++ b/br/tests/lightning_duplicate_resolution_incremental/config2.toml @@ -0,0 +1,41 @@ +[lightning] +task-info-schema-name = 'lightning_task_info_dupe_resolve_incremental' +index-concurrency = 10 +table-concurrency = 10 + +[tikv-importer] +backend = "local" +on-duplicate = "replace" +duplicate-resolution = "remove" +incremental-import = true + +[checkpoint] +enable = true +schema = "tidb_lightning_checkpoint_dupe_resolve_incremental2" +driver = "mysql" + +[[mydumper.files]] +pattern = '(?i).*(-schema-trigger|-schema-post)\.sql$' +type = 'ignore' + +[[mydumper.files]] +pattern = '(?i)^(?:[^/]*/)*([^/.]+)-schema-create\.sql$' +schema = '$1' +type = 'schema-schema' + +[[mydumper.files]] +pattern = '(?i)^(?:[^/]*/)*([^/.]+)\.(.*?)-schema\.sql$' +schema = '$1' +table = '$2' +type = 'table-schema' + +[[mydumper.files]] +pattern = '(?i)^(?:[^/]*/)*([^/.]+)\.(.*?)\.1\.sql$' +schema = '$1' +table = '$2' +key = '1' +type = 'sql' + +[post-restore] +analyze = false +checksum = "optional" diff --git a/br/tests/lightning_duplicate_resolution_incremental/data/dup_resolve_detect-schema-create.sql b/br/tests/lightning_duplicate_resolution_incremental/data/dup_resolve_detect-schema-create.sql new file mode 100644 index 0000000000000..202de81067861 --- /dev/null +++ b/br/tests/lightning_duplicate_resolution_incremental/data/dup_resolve_detect-schema-create.sql @@ -0,0 +1 @@ +create schema dup_resolve_detect; diff --git a/br/tests/lightning_duplicate_resolution_incremental/data/dup_resolve_detect.ta-schema.sql b/br/tests/lightning_duplicate_resolution_incremental/data/dup_resolve_detect.ta-schema.sql new file mode 100644 index 0000000000000..fb6cf2d5a7651 --- /dev/null +++ b/br/tests/lightning_duplicate_resolution_incremental/data/dup_resolve_detect.ta-schema.sql @@ -0,0 +1,6 @@ +create table ta ( + id varchar(11) not null primary key nonclustered, -- use varchar here to make sure _tidb_rowid will be generated + name varchar(20) not null, + size bigint not null, + unique key uni_name(name) +); diff --git a/br/tests/lightning_duplicate_resolution_incremental/data/dup_resolve_detect.ta.0.sql b/br/tests/lightning_duplicate_resolution_incremental/data/dup_resolve_detect.ta.0.sql new file mode 100644 index 0000000000000..ee29f689e8792 --- /dev/null +++ b/br/tests/lightning_duplicate_resolution_incremental/data/dup_resolve_detect.ta.0.sql @@ -0,0 +1,20 @@ +insert into ta values (3, '3c49f3bd', 6194643990092531757); +insert into ta values (13, '1da87b44', 3724743701402246028); +insert into ta values (6, '8b080186', 4840750639653607661); +insert into ta values (1, 'c83c0e6a', 5057094372111243649); +insert into ta values (12, 'dd73baf5', 2295098755414696158); +insert into ta values (4, '1cf99fa1', 2520784525406914042); +insert into ta values (11, 'b238a0e6', 3314555604794199537); +insert into ta values (10, 'a489c47a', 7706822128523578708); +insert into ta values (10, '9a54941e', 4969369552499069659); +insert into ta values (2, 'e7c90179', 1305347797378229715); +insert into ta values (9, '75e0344a', 500154046394880294); +insert into ta values (9, 'c3e8fc36', 5880042654284780409); +insert into ta values (6, 'd6835599', 2703142091339420770); +insert into ta values (5, 'c4a9c3a3', 6725275961959702206); +insert into ta values (14, 'eb1ab0dd', 5442878220607642694); +insert into ta values (7, '78e166f4', 7062852002089313920); +insert into ta values (8, '20986b65', 5485014514564267319); +insert into ta values (8, '9bd4d7a9', 9085469020413045798); +insert into ta values (15, 'd4aa9a8a', 546189610059969690); +insert into ta values (7, 'a7870c06', 3615729521258364152); diff --git a/br/tests/lightning_duplicate_resolution_incremental/data/dup_resolve_detect.ta.1.sql b/br/tests/lightning_duplicate_resolution_incremental/data/dup_resolve_detect.ta.1.sql new file mode 100644 index 0000000000000..88b67b051fe6e --- /dev/null +++ b/br/tests/lightning_duplicate_resolution_incremental/data/dup_resolve_detect.ta.1.sql @@ -0,0 +1,16 @@ +insert into ta values (111, 'bcf4e75f', 3304674741328415661); +insert into ta values (112, 'c08078e9', 7464585077725645791); +insert into ta values (113, 'ca05b4b2', 1280363363179468054); +insert into ta values (114, '8a094c96', 107578474892900608); +insert into ta values (115, 'f38efac2', 5273601814057696410); +insert into ta values (116, '5bf0cb56', 7276272767003446282); +insert into ta values (117, 'c8836b45', 653431702983792793); +insert into ta values (118, '7470ba67', 5617407618564683998); +insert into ta values (119, '466e1e95', 6827370124386922419); +insert into ta values (120, '41df97f3', 2296443172527920942); +insert into ta values (121, 'bd644f43', 6038622426427289955); +insert into ta values (122, '96aeb918', 1496857236328804363); +insert into ta values (123, '232448f7', 1199921720244646472); +insert into ta values (124, 'd296d6e4', 5705035255191089143); +insert into ta values (125, '194ec1d8', 6895413645725179445); +insert into ta values (126, 'a53238ec', 1527836891202149330); diff --git a/br/tests/lightning_duplicate_resolution_incremental/run.sh b/br/tests/lightning_duplicate_resolution_incremental/run.sh new file mode 100644 index 0000000000000..b1bf1e3869d27 --- /dev/null +++ b/br/tests/lightning_duplicate_resolution_incremental/run.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# +# 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, +# 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. + +set -eux + +check_cluster_version 5 2 0 'duplicate detection' || exit 0 + +LOG_FILE1="$TEST_DIR/lightning-duplicate-resolution1.log" +LOG_FILE2="$TEST_DIR/lightning-duplicate-resolution2.log" + +# let lightning run a bit slow to avoid some table in the first lightning finish too fast. +export GO_FAILPOINTS="github.com/pingcap/tidb/br/pkg/lightning/restore/SlowDownCheckDupe=return(10)" +run_lightning --backend local --sorted-kv-dir "$TEST_DIR/lightning_duplicate_resolution_incremental.sorted1" \ + --enable-checkpoint=1 --log-file "$LOG_FILE1" --config "tests/$TEST_NAME/config1.toml" & + +counter=0 +while [ $counter -lt 10 ]; do + if grep -Fq "start to sleep several seconds before checking other dupe" "$LOG_FILE1"; then + echo "lightning 1 already starts waiting for dupe" + break + fi + ((counter += 1)) + echo "waiting for lightning 1 starts" + sleep 1 +done + +if [ $counter -ge 10 ]; then + echo "fail to wait for lightning 1 starts" + exit 1 +fi + +run_lightning --backend local --sorted-kv-dir "$TEST_DIR/lightning_duplicate_resolution_incremental.sorted2" \ + --enable-checkpoint=1 --log-file "$LOG_FILE2" --config "tests/$TEST_NAME/config2.toml" & + +wait + +export GO_FAILPOINTS="" + +# Ensure table is consistent. +run_sql 'admin check table dup_resolve_detect.ta' + +# Check data correctness +run_sql 'select count(*), sum(id) from dup_resolve_detect.ta where id < 100' +check_contains 'count(*): 10' +check_contains 'sum(id): 80' + +run_sql 'select count(*), sum(id) from dup_resolve_detect.ta where id > 100' +check_contains 'count(*): 16' +check_contains 'sum(id): 1896' diff --git a/br/tests/lightning_fail_fast/run.sh b/br/tests/lightning_fail_fast/run.sh index 7e057e3ee999c..5f8efb8b44712 100755 --- a/br/tests/lightning_fail_fast/run.sh +++ b/br/tests/lightning_fail_fast/run.sh @@ -25,7 +25,7 @@ for CFG in chunk engine; do ! run_lightning --backend tidb --enable-checkpoint=0 --log-file "$TEST_DIR/lightning-tidb.log" --config "tests/$TEST_NAME/$CFG.toml" [ $? -eq 0 ] - tail -n 10 $TEST_DIR/lightning-tidb.log | grep "ERROR" | tail -n 1 | grep -Fq "Error 1062: Duplicate entry '1-1' for key 'tb.uq'" + tail -n 10 $TEST_DIR/lightning-tidb.log | grep "ERROR" | tail -n 1 | grep -Fq "Error 1062 (23000): Duplicate entry '1-1' for key 'tb.uq'" ! grep -Fq "restore file completed" $TEST_DIR/lightning-tidb.log [ $? -eq 0 ] diff --git a/br/tests/lightning_foreign_key/config.toml b/br/tests/lightning_foreign_key/config.toml new file mode 100644 index 0000000000000..3c85a830bfa22 --- /dev/null +++ b/br/tests/lightning_foreign_key/config.toml @@ -0,0 +1,3 @@ +[tikv-importer] +# Set on-duplicate=error to force using insert statement to write data. +on-duplicate = "error" diff --git a/br/tests/lightning_foreign_key/data/fk.child-schema.sql b/br/tests/lightning_foreign_key/data/fk.child-schema.sql new file mode 100644 index 0000000000000..18c361bf4c2e0 --- /dev/null +++ b/br/tests/lightning_foreign_key/data/fk.child-schema.sql @@ -0,0 +1 @@ +create table child (id int key, pid int, constraint fk_1 foreign key (pid) references parent(id)); diff --git a/br/tests/lightning_foreign_key/data/fk.child.sql b/br/tests/lightning_foreign_key/data/fk.child.sql new file mode 100644 index 0000000000000..12e531eb96a34 --- /dev/null +++ b/br/tests/lightning_foreign_key/data/fk.child.sql @@ -0,0 +1 @@ +insert into child values (1,1),(2,2),(3,3),(4,4); diff --git a/br/tests/lightning_foreign_key/data/fk.parent-schema.sql b/br/tests/lightning_foreign_key/data/fk.parent-schema.sql new file mode 100644 index 0000000000000..8ae8af2de6a2e --- /dev/null +++ b/br/tests/lightning_foreign_key/data/fk.parent-schema.sql @@ -0,0 +1 @@ +create table parent(id int key, a int); diff --git a/br/tests/lightning_foreign_key/data/fk.parent.sql b/br/tests/lightning_foreign_key/data/fk.parent.sql new file mode 100644 index 0000000000000..7a31a9f18db0f --- /dev/null +++ b/br/tests/lightning_foreign_key/data/fk.parent.sql @@ -0,0 +1 @@ +insert into parent values (1,1),(2,2),(3,3),(4,4); diff --git a/br/tests/lightning_foreign_key/data/fk.t-schema.sql b/br/tests/lightning_foreign_key/data/fk.t-schema.sql new file mode 100644 index 0000000000000..98f00b9cadca8 --- /dev/null +++ b/br/tests/lightning_foreign_key/data/fk.t-schema.sql @@ -0,0 +1,8 @@ +CREATE TABLE `t` +( + `a` bigint(20) NOT NULL, + `b` bigint(20) DEFAULT NULL, + PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */, + KEY `fk_1` (`b`), + CONSTRAINT `fk_1` FOREIGN KEY (`b`) REFERENCES `test`.`t2` (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; diff --git a/br/tests/lightning_foreign_key/data/fk.t.csv b/br/tests/lightning_foreign_key/data/fk.t.csv new file mode 100644 index 0000000000000..cd0368580a4c8 --- /dev/null +++ b/br/tests/lightning_foreign_key/data/fk.t.csv @@ -0,0 +1,6 @@ +a,b +1,1 +2,2 +3,3 +4,4 +5,5 diff --git a/br/tests/lightning_foreign_key/run.sh b/br/tests/lightning_foreign_key/run.sh new file mode 100755 index 0000000000000..1c045b61f43be --- /dev/null +++ b/br/tests/lightning_foreign_key/run.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# +# 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, +# 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. + +set -eu + +run_sql 'DROP DATABASE IF EXISTS fk;' +run_sql 'CREATE DATABASE IF NOT EXISTS fk;' +# Create existing tables that import data will reference. +run_sql 'CREATE TABLE fk.t2 (a BIGINT PRIMARY KEY);' + +for BACKEND in tidb local; do + run_sql 'DROP TABLE IF EXISTS fk.t, fk.parent, fk.child;' + + run_lightning --backend $BACKEND + run_sql 'SELECT GROUP_CONCAT(a) FROM fk.t ORDER BY a;' + check_contains '1,2,3,4,5' + + run_sql 'SELECT count(1), sum(a) FROM fk.parent;' + check_contains 'count(1): 4' + check_contains 'sum(a): 10' + + run_sql 'SELECT count(1), sum(pid) FROM fk.child;' + check_contains 'count(1): 4' + check_contains 'sum(pid): 10' +done diff --git a/br/tests/lightning_import_compress/config.toml b/br/tests/lightning_import_compress/config.toml new file mode 100644 index 0000000000000..30df6c8e0c98e --- /dev/null +++ b/br/tests/lightning_import_compress/config.toml @@ -0,0 +1,5 @@ +[tikv-importer] +backend = 'local' + +[mydumper.csv] +header = false diff --git a/br/tests/lightning_import_compress/config_gz.toml b/br/tests/lightning_import_compress/config_gz.toml new file mode 100644 index 0000000000000..d26e6ae237c18 --- /dev/null +++ b/br/tests/lightning_import_compress/config_gz.toml @@ -0,0 +1,6 @@ +[tikv-importer] +backend = 'local' +compress-kv-pairs = 'gz' + +[mydumper.csv] +header = false diff --git a/br/tests/lightning_import_compress/config_gzip.toml b/br/tests/lightning_import_compress/config_gzip.toml new file mode 100644 index 0000000000000..24a873a27599b --- /dev/null +++ b/br/tests/lightning_import_compress/config_gzip.toml @@ -0,0 +1,6 @@ +[tikv-importer] +backend = 'local' +compress-kv-pairs = 'gzip' + +[mydumper.csv] +header = false diff --git a/br/tests/lightning_import_compress/run.sh b/br/tests/lightning_import_compress/run.sh new file mode 100644 index 0000000000000..e6414881e4e0e --- /dev/null +++ b/br/tests/lightning_import_compress/run.sh @@ -0,0 +1,56 @@ +#!/bin/bash +# +# Copyright 2023 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. + +set -eu + +export GO_FAILPOINTS="github.com/pingcap/tidb/br/pkg/lightning/backend/local/LoggingImportBytes=return" + +mkdir -p "$TEST_DIR/data" + +cat <"$TEST_DIR/data/test-schema-create.sql" +CREATE DATABASE test; +EOF +cat <"$TEST_DIR/data/test.t-schema.sql" +CREATE TABLE test.t (id int primary key, a int, b int, c int); +EOF + +# Generate 200k rows. Total size is about 5MiB. +for i in {1..200000}; do + echo "$i,$i,$i,$i" >>"$TEST_DIR/data/test.t.0.csv" +done + +LOG_FILE1="$TEST_DIR/lightning-import-compress1.log" +LOG_FILE2="$TEST_DIR/lightning-import-compress2.log" +LOG_FILE3="$TEST_DIR/lightning-import-compress3.log" + +run_lightning --backend local -d "$TEST_DIR/data" --config "tests/$TEST_NAME/config.toml" --log-file "$LOG_FILE1" -L debug +run_sql 'DROP DATABASE test;' +run_lightning --backend local -d "$TEST_DIR/data" --config "tests/$TEST_NAME/config_gz.toml" --log-file "$LOG_FILE2" -L debug +run_sql 'DROP DATABASE test;' +run_lightning --backend local -d "$TEST_DIR/data" --config "tests/$TEST_NAME/config_gzip.toml" --log-file "$LOG_FILE3" -L debug + +uncompress=$(grep "import write" /tmp/backup_restore_test/lightning-import-compress1.log | + grep -Eo "bytes=[0-9]+" | sed 's/bytes=//g' | awk '{sum+=$1} END {print sum}') +gzip=$(grep "import write" /tmp/backup_restore_test/lightning-import-compress2.log | + grep -Eo "bytes=[0-9]+" | sed 's/bytes=//g' | awk '{sum+=$1} END {print sum}') +gz=$(grep "import write" /tmp/backup_restore_test/lightning-import-compress3.log | + grep -Eo "bytes=[0-9]+" | sed 's/bytes=//g' | awk '{sum+=$1} END {print sum}') + +echo "uncompress: ${uncompress}, gzip: ${gzip}, gz: ${gz}" +if [ "$uncompress" -le "$gzip" ] || [ "$uncompress" -le "$gz" ]; then + echo "compress is not working" + exit 1 +fi diff --git a/br/tests/lightning_issue_40657/config.toml b/br/tests/lightning_issue_40657/config.toml new file mode 100644 index 0000000000000..74561bc05f026 --- /dev/null +++ b/br/tests/lightning_issue_40657/config.toml @@ -0,0 +1,6 @@ +[tikv-importer] +backend = "local" +duplicate-resolution = "remove" + +[mydumper.csv] +header = true diff --git a/br/tests/lightning_issue_40657/data1/test.t-schema.sql b/br/tests/lightning_issue_40657/data1/test.t-schema.sql new file mode 100644 index 0000000000000..ef7136b531abc --- /dev/null +++ b/br/tests/lightning_issue_40657/data1/test.t-schema.sql @@ -0,0 +1,6 @@ +CREATE TABLE `t` ( + `id` int(11) NOT NULL, + `name` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */, + UNIQUE KEY `uni_name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; diff --git a/br/tests/lightning_issue_40657/data1/test.t.0.csv b/br/tests/lightning_issue_40657/data1/test.t.0.csv new file mode 100644 index 0000000000000..2987cee08b206 --- /dev/null +++ b/br/tests/lightning_issue_40657/data1/test.t.0.csv @@ -0,0 +1,6 @@ +id,name +1,"aaa01" +2,"aaa02" +3,"aaa03" +4,"aaa04" +5,"aaa04" diff --git a/br/tests/lightning_issue_40657/data2/test.t-schema.sql b/br/tests/lightning_issue_40657/data2/test.t-schema.sql new file mode 100644 index 0000000000000..ef7136b531abc --- /dev/null +++ b/br/tests/lightning_issue_40657/data2/test.t-schema.sql @@ -0,0 +1,6 @@ +CREATE TABLE `t` ( + `id` int(11) NOT NULL, + `name` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */, + UNIQUE KEY `uni_name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; diff --git a/br/tests/lightning_issue_40657/data2/test.t.0.csv b/br/tests/lightning_issue_40657/data2/test.t.0.csv new file mode 100644 index 0000000000000..f64aebd0630d9 --- /dev/null +++ b/br/tests/lightning_issue_40657/data2/test.t.0.csv @@ -0,0 +1,6 @@ +id,name +1,"aaa01" +2,"aaa02" +3,"aaa03" +4,"aaa04" +5,"aaa05" diff --git a/br/tests/lightning_issue_40657/run.sh b/br/tests/lightning_issue_40657/run.sh new file mode 100644 index 0000000000000..a20600b79d14b --- /dev/null +++ b/br/tests/lightning_issue_40657/run.sh @@ -0,0 +1,32 @@ +#!/bin/bash +# +# Copyright 2023 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. + +set -eux + +check_cluster_version 5 2 0 'duplicate detection' || exit 0 + +run_lightning -d "tests/$TEST_NAME/data1" +run_sql 'admin check table test.t' +run_sql 'select count(*) from test.t' +check_contains 'count(*): 3' +run_sql 'select count(*) from lightning_task_info.conflict_error_v1' +check_contains 'count(*): 2' + +run_sql 'truncate table test.t' +run_lightning -d "tests/$TEST_NAME/data2" +run_sql 'admin check table test.t' +run_sql 'select count(*) from test.t' +check_contains 'count(*): 5' diff --git a/br/tests/lightning_local_backend/data/cpeng.a-schema.sql b/br/tests/lightning_local_backend/data/cpeng.a-schema.sql index fe3f493b6edfd..6c1f5ee154c58 100644 --- a/br/tests/lightning_local_backend/data/cpeng.a-schema.sql +++ b/br/tests/lightning_local_backend/data/cpeng.a-schema.sql @@ -1 +1 @@ -create table a (c int); +create table a (c VARCHAR(20) PRIMARY KEY); diff --git a/br/tests/lightning_local_backend/data/cpeng.a.1.sql b/br/tests/lightning_local_backend/data/cpeng.a.1.sql index 58829b7d87492..a75039e1304e3 100644 --- a/br/tests/lightning_local_backend/data/cpeng.a.1.sql +++ b/br/tests/lightning_local_backend/data/cpeng.a.1.sql @@ -1 +1 @@ -insert into a values (1); +insert into a values ('0000001'); diff --git a/br/tests/lightning_local_backend/data/cpeng.a.2.sql b/br/tests/lightning_local_backend/data/cpeng.a.2.sql index ccbcb5801f72b..a1b15acdecb11 100644 --- a/br/tests/lightning_local_backend/data/cpeng.a.2.sql +++ b/br/tests/lightning_local_backend/data/cpeng.a.2.sql @@ -1 +1 @@ -insert into a values (2); +insert into a values ('0000002'); diff --git a/br/tests/lightning_local_backend/data/cpeng.a.3.sql b/br/tests/lightning_local_backend/data/cpeng.a.3.sql index effdc8f3eab3c..0a457febecf55 100644 --- a/br/tests/lightning_local_backend/data/cpeng.a.3.sql +++ b/br/tests/lightning_local_backend/data/cpeng.a.3.sql @@ -1 +1 @@ -insert into a values (3),(4); +insert into a values ('0000003'),('0000004'); diff --git a/br/tests/lightning_local_backend/run.sh b/br/tests/lightning_local_backend/run.sh index 5177f98d1ecba..60fca277d8cf6 100755 --- a/br/tests/lightning_local_backend/run.sh +++ b/br/tests/lightning_local_backend/run.sh @@ -36,10 +36,11 @@ grep -Fq 'table(s) [`cpeng`.`a`, `cpeng`.`b`] are not empty' $TEST_DIR/lightning # First, verify that inject with not leader error is fine. -export GO_FAILPOINTS='github.com/pingcap/tidb/br/pkg/lightning/backend/local/FailIngestMeta=1*return("notleader")' +export GO_FAILPOINTS='github.com/pingcap/tidb/br/pkg/lightning/backend/local/FailIngestMeta=1*return("notleader");github.com/pingcap/tidb/br/pkg/lightning/backend/local/failToSplit=5*return("")' rm -f "$TEST_DIR/lightning-local.log" run_sql 'DROP DATABASE IF EXISTS cpeng;' -run_lightning --backend local --enable-checkpoint=1 --log-file "$TEST_DIR/lightning-local.log" --config "tests/$TEST_NAME/config.toml" +run_lightning --backend local --enable-checkpoint=1 --log-file "$TEST_DIR/lightning-local.log" --config "tests/$TEST_NAME/config.toml" -L debug +grep -Eq "split regions.*retryable error" "$TEST_DIR/lightning-local.log" # Check that everything is correctly imported run_sql 'SELECT count(*), sum(c) FROM cpeng.a' diff --git a/br/tests/lightning_record_network/config.toml b/br/tests/lightning_record_network/config.toml new file mode 100644 index 0000000000000..2de41a1f43dab --- /dev/null +++ b/br/tests/lightning_record_network/config.toml @@ -0,0 +1,2 @@ +[tikv-importer] +backend = 'tidb' diff --git a/br/tests/lightning_record_network/data/db-schema-create.sql b/br/tests/lightning_record_network/data/db-schema-create.sql new file mode 100644 index 0000000000000..c88b0e3150e76 --- /dev/null +++ b/br/tests/lightning_record_network/data/db-schema-create.sql @@ -0,0 +1 @@ +create database db; \ No newline at end of file diff --git a/br/tests/lightning_record_network/data/db.test-schema.sql b/br/tests/lightning_record_network/data/db.test-schema.sql new file mode 100644 index 0000000000000..7bee5f9ad639c --- /dev/null +++ b/br/tests/lightning_record_network/data/db.test-schema.sql @@ -0,0 +1 @@ +create table test ( id int primary key, a int, b int ); \ No newline at end of file diff --git a/br/tests/lightning_record_network/data/db.test.1.sql b/br/tests/lightning_record_network/data/db.test.1.sql new file mode 100644 index 0000000000000..3748d5fa91e80 --- /dev/null +++ b/br/tests/lightning_record_network/data/db.test.1.sql @@ -0,0 +1,21 @@ +insert into db.test values +(1,1,1), +(2,1,1), +(3,1,1), +(4,1,1), +(5,1,1), +(6,1,1), +(7,1,1), +(8,1,1), +(9,1,1), +(10,1,1), +(11,1,1), +(12,1,1), +(13,1,1), +(14,1,1), +(15,1,1), +(16,1,1), +(17,1,1), +(18,1,1), +(19,1,1), +(20,1,1); \ No newline at end of file diff --git a/br/tests/lightning_record_network/run.sh b/br/tests/lightning_record_network/run.sh new file mode 100644 index 0000000000000..e31f9d151d76a --- /dev/null +++ b/br/tests/lightning_record_network/run.sh @@ -0,0 +1,22 @@ +#!/bin/sh +# +# 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, +# 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. + +set -euE + +export GO_FAILPOINTS="github.com/pingcap/tidb/br/pkg/lightning/SetIOTotalBytes=return(1)" +run_lightning + +grep 'IOTotal' "$TEST_DIR/lightning.log" | grep -v 'IOTotalBytes=0' diff --git a/br/tests/lightning_reload_cert/run.sh b/br/tests/lightning_reload_cert/run.sh index e06ef8d7fbf51..be0c5ff40421e 100644 --- a/br/tests/lightning_reload_cert/run.sh +++ b/br/tests/lightning_reload_cert/run.sh @@ -29,7 +29,7 @@ shpid="$!" sleep 15 ok=0 for _ in {0..60}; do - if grep -Fq "connection closed before server preface received" "$TEST_DIR"/lightning.log; then + if grep -Fq "connection error" "$TEST_DIR"/lightning.log; then ok=1 break fi diff --git a/br/tests/lightning_ttl/config.toml b/br/tests/lightning_ttl/config.toml new file mode 100644 index 0000000000000..d2152b47c922a --- /dev/null +++ b/br/tests/lightning_ttl/config.toml @@ -0,0 +1,2 @@ +[tikv-importer] +backend = 'local' diff --git a/br/tests/lightning_ttl/data/ttldb-schema-create.sql b/br/tests/lightning_ttl/data/ttldb-schema-create.sql new file mode 100644 index 0000000000000..46609f11e6635 --- /dev/null +++ b/br/tests/lightning_ttl/data/ttldb-schema-create.sql @@ -0,0 +1 @@ +CREATE DATABASE `ttldb`; diff --git a/br/tests/lightning_ttl/data/ttldb.t1-schema.sql b/br/tests/lightning_ttl/data/ttldb.t1-schema.sql new file mode 100644 index 0000000000000..7531d7f18ae01 --- /dev/null +++ b/br/tests/lightning_ttl/data/ttldb.t1-schema.sql @@ -0,0 +1,4 @@ +CREATE TABLE `t1` ( + `id` int(11) PRIMARY KEY, + `t` datetime +) TTL = `t` + INTERVAL 1 DAY TTL_ENABLE = 'ON'; diff --git a/br/tests/lightning_ttl/run.sh b/br/tests/lightning_ttl/run.sh new file mode 100644 index 0000000000000..4a1d9ffc04d57 --- /dev/null +++ b/br/tests/lightning_ttl/run.sh @@ -0,0 +1,26 @@ +#!/bin/sh +# +# 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, +# 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. + +set -eu + +run_sql 'drop database if exists ttldb;' +run_lightning + +TTL_MARK='![ttl]' +CREATE_SQL_CONTAINS="/*T${TTL_MARK} TTL=\`t\` + INTERVAL 1 DAY */ /*T${TTL_MARK} TTL_ENABLE='OFF' */" + +run_sql 'show create table ttldb.t1' +check_contains "$CREATE_SQL_CONTAINS" diff --git a/build/BUILD.bazel b/build/BUILD.bazel index 23cf263d525e3..3c2a569dd80d8 100644 --- a/build/BUILD.bazel +++ b/build/BUILD.bazel @@ -55,6 +55,7 @@ STATICHECK_ANALYZERS = [ "S1039", "S1040", "SA1019", + "SA1029", "SA2000", "SA2001", "SA2003", diff --git a/build/image/.ci_bazel b/build/image/.ci_bazel new file mode 100644 index 0000000000000..6114f8bf17db9 --- /dev/null +++ b/build/image/.ci_bazel @@ -0,0 +1 @@ +build:ci --remote_cache=http://bazel-cache.pingcap.net:8080/tidb --remote_timeout="15s" diff --git a/build/image/README.md b/build/image/README.md new file mode 100644 index 0000000000000..b109968354940 --- /dev/null +++ b/build/image/README.md @@ -0,0 +1,7 @@ +## CI Image + +Here is the Dockerfile for the CI image. + +- ```base``` is the base image with golang, development tools and so on. +- ```centos7_jenkins``` is the production image with CI environment tool in tidb repo. it is based on ```base```. +- ```.ci_bazel``` is the global default bazel config. it tell bazel where to get cache. diff --git a/build/image/base b/build/image/base new file mode 100644 index 0000000000000..85c3dbba6816f --- /dev/null +++ b/build/image/base @@ -0,0 +1,44 @@ +# Copyright 2023 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. + +FROM hub.pingcap.net/jenkins/centos7_jenkins + +USER root +WORKDIR /root + +ENV GOLANG_VERSION 1.19.5 +ENV GOLANG_DOWNLOAD_URL https://dl.google.com/go/go$GOLANG_VERSION.linux-amd64.tar.gz +ENV GOLANG_DOWNLOAD_SHA256 36519702ae2fd573c9869461990ae550c8c0d955cd28d2827a6b159fda81ff95 +ENV GOPATH /go +ENV GOROOT /usr/local/go +ENV PATH $GOPATH/bin:$GOROOT/bin:$PATH +ADD https://github.com/bazelbuild/bazel/releases/download/5.3.2/bazel-5.3.2-linux-x86_64 /usr/bin/bazel +ADD https://uploader.codecov.io/latest/linux/codecov /usr/bin/codecov +RUN curl https://setup.ius.io | sh || true && \ + chmod u+x /usr/bin/bazel && yum update -y && \ + yum install -y supervisor tree libcurl-devel gettext autoconf python-pip python3-pip patch git wget gcc python autoconf make curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-CPAN perl-devel && \ + git clone --depth=1 --branch=v2.37.2 https://github.com/git/git && cd git && yum remove -y git && make configure && ./configure --prefix=/usr/local && make -j16 install && cd .. && rm -rf git && \ + pip3 install s3cmd requests && pip3 install requests && \ + curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz \ + && echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - \ + && tar -C /usr/local -xzf golang.tar.gz \ + && rm golang.tar.gz && \ + mkdir /go && chown jenkins:jenkins /go && \ + curl -fsSL "http://pingcap-dev.hk.ufileos.com/jenkins/jenkins-slave-docker-sqllogictest.tar.gz" | tar xz -C "/git" \ + && chown -R jenkins:jenkins /git && \ + chown jenkins:jenkins /usr/bin/bazel && \ + chown jenkins:jenkins /usr/bin/codecov && \ + chmod +x /usr/bin/codecov +USER jenkins +WORKDIR /home/jenkins diff --git a/build/image/centos7_jenkins b/build/image/centos7_jenkins new file mode 100644 index 0000000000000..0f56c705ca114 --- /dev/null +++ b/build/image/centos7_jenkins @@ -0,0 +1,24 @@ +# Copyright 2023 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. + +FROM hub.pingcap.net/wangweizhen/base_image:go11920230111 +USER root +WORKDIR /root +COPY .ci_bazel /data/bazel +RUN mkdir -p /data/tikv1 /data/tikv2 /data/tikv3 /data/pd && \ + chown -R jenkins:jenkins /data +USER jenkins +WORKDIR /home/jenkins +RUN go install github.com/hawkingrei/bazel_collect@latest && \ + go install github.com/bazelbuild/bazel-gazelle/cmd/gazelle@latest diff --git a/build/linter/BUILD.bazel b/build/linter/BUILD.bazel new file mode 100644 index 0000000000000..e5407284430fa --- /dev/null +++ b/build/linter/BUILD.bazel @@ -0,0 +1,9 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "linter", + srcs = ["linter.go"], + importpath = "github.com/pingcap/tidb/build/linter", + visibility = ["//visibility:public"], + deps = ["@com_github_apache_skywalking_eyes//pkg/config"], +) diff --git a/build/linter/linter.go b/build/linter/linter.go new file mode 100644 index 0000000000000..794a7c37039ef --- /dev/null +++ b/build/linter/linter.go @@ -0,0 +1,20 @@ +// Copyright 2023 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 linter + +import ( + // it is necessary to make skywalking-eye into gomod. + _ "github.com/apache/skywalking-eyes/pkg/config" +) diff --git a/build/nogo_config.json b/build/nogo_config.json index 731eed4c54f00..90a5b7cae853f 100644 --- a/build/nogo_config.json +++ b/build/nogo_config.json @@ -1,7 +1,7 @@ { "all_revive": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", "/rules_go_work-*": "ignore generated code", ".*_/testmain\\.go$": "ignore code" @@ -9,32 +9,32 @@ }, "asciicheck": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", "br/pkg/lightning/web/res_vfsdata.go": "ignore code" } }, "asmdecl": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "assign": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "atomic": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "atomicalign": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, @@ -46,31 +46,31 @@ }, "bools": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "buildtag": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "printf": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "unreachable": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "composites": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", "br/pkg/glue/console_glue_test.go": "ignore code", "br/pkg/restore/db_test.go": "ignore code", @@ -79,45 +79,45 @@ }, "copylocks": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", "/cgo/": "ignore cgo code" } }, "ctrlflow": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "deadcode": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "deepequalerrors": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "durationcheck": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", "/rules_go_work-*": "ignore generated code", ".*_generated\\.go$": "ignore generated code" } }, "errorsas": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "errcheck": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", ".*_test\\.go$": "ignore generated code", "util/logutil": "ignore util/logutil code", @@ -131,20 +131,20 @@ }, "exportloopref": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "filepermission": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", ".*_/testmain\\.go$": "ignore code" } }, "fieldalignment": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", ".*_/testmain\\.go$": "ignore code", ".*_test\\.go$": "ignore test code" @@ -188,13 +188,13 @@ }, "findcall": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "forcetypeassert": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" }, "only_files": { @@ -219,7 +219,7 @@ }, "gofmt": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", "/cgo/": "ignore cgo code", "/rules_go_work-*": "ignore generated code", @@ -229,7 +229,8 @@ }, "gci": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", "/cgo/": "ignore cgo code", ".*\\.pb\\.go$": "generated code", @@ -259,37 +260,37 @@ }, "httpresponse": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "ifaceassert": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "ineffassign": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "inspect": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "loopclosure": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "lostcancel": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, @@ -297,33 +298,33 @@ "exclude_files": { "/cgo/": "ignore cgo code", ".*_test\\.go$": "ignore generated code", - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "misspell": { "exclude_files": { "/cgo/": "ignore cgo code", - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "nilfunc": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "nilness": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", "/cgo/": "ignore cgo" } }, "noloopclosure": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" }, "only_files": { @@ -338,13 +339,13 @@ }, "pkgfact": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "revive": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", "GOROOT/": "ignore code", "/cgo/": "ignore cgo", "tools/": "ignore tool code", @@ -364,6 +365,8 @@ "ddl/backfilling.go": "ddl/backfilling.go", "ddl/column.go": "ddl/column.go", "ddl/index.go": "ddl/index.go", + "ddl/ttl.go": "ddl/ttl.go", + "ddl/ttl_test.go": "ddl/ttl_test.go", "ddl/ingest/": "ddl/ingest/", "expression/builtin_cast.go": "expression/builtin_cast code", "server/conn.go": "server/conn.go", @@ -401,54 +404,56 @@ "util/": "util code", "parser/": "parser code", "meta/": "parser code", - "extension/": "extension code" + "extension/": "extension code", + "resourcemanager/": "resourcemanager code", + "keyspace": "keyspace code" } }, "shift": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "sortslice": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "stdmethods": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "stringintconv": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "structtag": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "testinggoroutine": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "tests": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "unconvert": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*\\.pb\\.go$": "generated code", "parser/parser.go": "generated code", "/cgo/": "no need to vet third party code for cgo", @@ -460,27 +465,27 @@ }, "unmarshal": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "unsafeptr": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", "parser/digester.go": "ignore code" } }, "unusedresult": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", "parser/digester_test.go": "ignore code" } }, "rowserrcheck": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", "server/tidb_test.go": "ignore test code", "server/tidb_serial_test.go": "ignore test code", @@ -492,250 +497,250 @@ }, "S1000": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1001": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1002": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1003": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1004": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1005": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1006": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1007": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1008": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1009": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1010": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1011": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1012": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1013": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1014": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1015": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1016": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1017": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1018": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1019": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", "parser/parser.go": "ignore code" } }, "S1020": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1021": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", "tools/check/ut.go": "ignore code" } }, "S1022": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1023": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", "parser/parser.go": "ignore code" } }, "S1024": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1025": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1026": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1027": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1028": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1029": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1030": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1031": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1032": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1033": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1034": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1035": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1036": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1037": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1038": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1039": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "S1040": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", "parser/parser.go": "ignore generated code" } @@ -743,155 +748,167 @@ "SA1019": { "exclude_files": { "/build/": "no need to linter code", - "/external/": "no need to vet third party code", - ".*_generated\\.go$": "ignore generated code" + "external/": "no need to vet third party code", + ".*_generated\\.go$": "ignore generated code", + ".*_test\\.go$": "ignore test code", + "br/pkg/restore/split/client.go": "github.com/golang/protobuf deprecated", + "br/pkg/streamhelper/advancer_cliext.go": "github.com/golang/protobuf deprecated", + "br/pkg/lightning/checkpoints/checkpoints.go": "cfg.TikvImporter.Addr is deprecated", + "br/pkg/lightning/checkpoints/glue_checkpoint.go": "cfg.TikvImporter.Addr is deprecated" }, "only_files": { "util/gctuner": "util/gctuner", - "br/pkg/lightning/mydump/": "br/pkg/lightning/mydump/", - "br/pkg/lightning/restore/opts": "br/pkg/lightning/restore/opts", + "util/cgroup": "util/cgroup code", + "util/watcher": "util/watcher", + "br/pkg/": "br/pkg", "executor/aggregate.go": "executor/aggregate.go", - "types/json_binary_functions.go": "types/json_binary_functions.go", - "types/json_binary_test.go": "types/json_binary_test.go", + "types/": "types", "ddl/": "enable to ddl", - "util/cgroup": "util/cgroup code", "expression/builtin_cast.go": "enable expression/builtin_cast.go", "planner/core/plan.go": "planner/core/plan.go", - "server/conn.go": "server/conn.go", - "server/conn_stmt.go": "server/conn_stmt.go", - "server/conn_test.go": "server/conn_test.go", - "extension/": "extension code" + "extension/": "extension code", + "resourcemanager/": "resourcemanager code", + "keyspace/": "keyspace code", + "server/": "server code", + "meta": "meta code" } }, - "SA2000": { + "SA1029": { "exclude_files": { "/external/": "no need to vet third party code", + ".*_generated\\.go$": "ignore generated code", + ".*_test\\.go$": "ignore test code" + } + }, + "SA2000": { + "exclude_files": { + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA2001": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA2003": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA3000": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA3001": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA4009": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA5000": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA5001": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA5002": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA5003": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA5004": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA5005": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA5007": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA5008": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA5009": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA5010": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA5011": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA5012": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA6000": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA6001": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "SA6005": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } }, "prealloc": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", "parser/yy_parser.go": "ignore generated code", "/cgo/": "no need to vet third party code for cgo" @@ -899,7 +916,7 @@ }, "predeclared": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", "parser/yy_parser.go": "ignore generated code", "parser/parser.go": "ignore generated code", @@ -908,7 +925,7 @@ }, "U1000": { "exclude_files": { - "/external/": "no need to vet third party code", + "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code" } } diff --git a/build/patches/com_github_rivo_uniseg.patch b/build/patches/com_github_rivo_uniseg.patch deleted file mode 100644 index 43c2c40933b11..0000000000000 --- a/build/patches/com_github_rivo_uniseg.patch +++ /dev/null @@ -1,542 +0,0 @@ -From 1492043a155839cb863210d4f564be3fa640c0d9 Mon Sep 17 00:00:00 2001 -From: Weizhen Wang -Date: Sat, 8 Oct 2022 11:41:06 +0800 -Subject: [PATCH] update - -Signed-off-by: Weizhen Wang ---- - BUILD.bazel | 27 +++++ - WORKSPACE | 2 + - gen_breaktest.go | 213 -------------------------------------- - gen_properties.go | 256 ---------------------------------------------- - 4 files changed, 29 insertions(+), 469 deletions(-) - create mode 100644 BUILD.bazel - create mode 100644 WORKSPACE - delete mode 100644 gen_breaktest.go - delete mode 100644 gen_properties.go - -diff --git a/BUILD.bazel b/BUILD.bazel -new file mode 100644 -index 0000000..a1e5c89 ---- /dev/null -+++ b/BUILD.bazel -@@ -0,0 +1,27 @@ -+load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") -+ -+go_library( -+ name = "uniseg", -+ srcs = [ -+ "doc.go", -+ "eastasianwidth.go", -+ "emojipresentation.go", -+ "grapheme.go", -+ "graphemeproperties.go", -+ "graphemerules.go", -+ "line.go", -+ "lineproperties.go", -+ "linerules.go", -+ "properties.go", -+ "sentence.go", -+ "sentenceproperties.go", -+ "sentencerules.go", -+ "step.go", -+ "width.go", -+ "word.go", -+ "wordproperties.go", -+ "wordrules.go", -+ ], -+ importpath = "github.com/rivo/uniseg", -+ visibility = ["//visibility:public"], -+) -diff --git a/WORKSPACE b/WORKSPACE -new file mode 100644 -index 0000000..d596273 ---- /dev/null -+++ b/WORKSPACE -@@ -0,0 +1,2 @@ -+# DO NOT EDIT: automatically generated WORKSPACE file for go_repository rule -+workspace(name = "com_github_rivo_uniseg") -diff --git a/gen_breaktest.go b/gen_breaktest.go -deleted file mode 100644 -index e613c4c..0000000 ---- a/gen_breaktest.go -+++ /dev/null -@@ -1,213 +0,0 @@ --//go:build generate -- --// This program generates a Go containing a slice of test cases based on the --// Unicode Character Database auxiliary data files. The command line arguments --// are as follows: --// --// 1. The name of the Unicode data file (just the filename, without extension). --// 2. The name of the locally generated Go file. --// 3. The name of the slice containing the test cases. --// 4. The name of the generator, for logging purposes. --// --//go:generate go run gen_breaktest.go GraphemeBreakTest graphemebreak_test.go graphemeBreakTestCases graphemes --//go:generate go run gen_breaktest.go WordBreakTest wordbreak_test.go wordBreakTestCases words --//go:generate go run gen_breaktest.go SentenceBreakTest sentencebreak_test.go sentenceBreakTestCases sentences --//go:generate go run gen_breaktest.go LineBreakTest linebreak_test.go lineBreakTestCases lines -- --package main -- --import ( -- "bufio" -- "bytes" -- "errors" -- "fmt" -- "go/format" -- "io/ioutil" -- "log" -- "net/http" -- "os" -- "time" --) -- --// We want to test against a specific version rather than the latest. When the --// package is upgraded to a new version, change these to generate new tests. --const ( -- testCaseURL = `https://www.unicode.org/Public/14.0.0/ucd/auxiliary/%s.txt` --) -- --func main() { -- if len(os.Args) < 5 { -- fmt.Println("Not enough arguments, see code for details") -- os.Exit(1) -- } -- -- log.SetPrefix("gen_breaktest (" + os.Args[4] + "): ") -- log.SetFlags(0) -- -- // Read text of testcases and parse into Go source code. -- src, err := parse(fmt.Sprintf(testCaseURL, os.Args[1])) -- if err != nil { -- log.Fatal(err) -- } -- -- // Format the Go code. -- formatted, err := format.Source(src) -- if err != nil { -- log.Fatalln("gofmt:", err) -- } -- -- // Write it out. -- log.Print("Writing to ", os.Args[2]) -- if err := ioutil.WriteFile(os.Args[2], formatted, 0644); err != nil { -- log.Fatal(err) -- } --} -- --// parse reads a break text file, either from a local file or from a URL. It --// parses the file data into Go source code representing the test cases. --func parse(url string) ([]byte, error) { -- log.Printf("Parsing %s", url) -- res, err := http.Get(url) -- if err != nil { -- return nil, err -- } -- body := res.Body -- defer body.Close() -- -- buf := new(bytes.Buffer) -- buf.Grow(120 << 10) -- buf.WriteString(`package uniseg -- --// Code generated via go generate from gen_breaktest.go. DO NOT EDIT. -- --// ` + os.Args[3] + ` are Grapheme testcases taken from --// ` + url + ` --// on ` + time.Now().Format("January 2, 2006") + `. See --// https://www.unicode.org/license.html for the Unicode license agreement. --var ` + os.Args[3] + ` = []testCase { --`) -- -- sc := bufio.NewScanner(body) -- num := 1 -- var line []byte -- original := make([]byte, 0, 64) -- expected := make([]byte, 0, 64) -- for sc.Scan() { -- num++ -- line = sc.Bytes() -- if len(line) == 0 || line[0] == '#' { -- continue -- } -- var comment []byte -- if i := bytes.IndexByte(line, '#'); i >= 0 { -- comment = bytes.TrimSpace(line[i+1:]) -- line = bytes.TrimSpace(line[:i]) -- } -- original, expected, err := parseRuneSequence(line, original[:0], expected[:0]) -- if err != nil { -- return nil, fmt.Errorf(`line %d: %v: %q`, num, err, line) -- } -- fmt.Fprintf(buf, "\t{original: \"%s\", expected: %s}, // %s\n", original, expected, comment) -- } -- if err := sc.Err(); err != nil { -- return nil, err -- } -- -- // Check for final "# EOF", useful check if we're streaming via HTTP -- if !bytes.Equal(line, []byte("# EOF")) { -- return nil, fmt.Errorf(`line %d: exected "# EOF" as final line, got %q`, num, line) -- } -- buf.WriteString("}\n") -- return buf.Bytes(), nil --} -- --// Used by parseRuneSequence to match input via bytes.HasPrefix. --var ( -- prefixBreak = []byte("÷ ") -- prefixDontBreak = []byte("× ") -- breakOk = []byte("÷") -- breakNo = []byte("×") --) -- --// parseRuneSequence parses a rune + breaking opportunity sequence from b --// and appends the Go code for testcase.original to orig --// and appends the Go code for testcase.expected to exp. --// It retuns the new orig and exp slices. --// --// E.g. for the input b="÷ 0020 × 0308 ÷ 1F1E6 ÷" --// it will append --// "\u0020\u0308\U0001F1E6" --// and "[][]rune{{0x0020,0x0308},{0x1F1E6},}" --// to orig and exp respectively. --// --// The formatting of exp is expected to be cleaned up by gofmt or format.Source. --// Note we explicitly require the sequence to start with ÷ and we implicitly --// require it to end with ÷. --func parseRuneSequence(b, orig, exp []byte) ([]byte, []byte, error) { -- // Check for and remove first ÷ or ×. -- if !bytes.HasPrefix(b, prefixBreak) && !bytes.HasPrefix(b, prefixDontBreak) { -- return nil, nil, errors.New("expected ÷ or × as first character") -- } -- if bytes.HasPrefix(b, prefixBreak) { -- b = b[len(prefixBreak):] -- } else { -- b = b[len(prefixDontBreak):] -- } -- -- boundary := true -- exp = append(exp, "[][]rune{"...) -- for len(b) > 0 { -- if boundary { -- exp = append(exp, '{') -- } -- exp = append(exp, "0x"...) -- // Find end of hex digits. -- var i int -- for i = 0; i < len(b) && b[i] != ' '; i++ { -- if d := b[i]; ('0' <= d || d <= '9') || -- ('A' <= d || d <= 'F') || -- ('a' <= d || d <= 'f') { -- continue -- } -- return nil, nil, errors.New("bad hex digit") -- } -- switch i { -- case 4: -- orig = append(orig, "\\u"...) -- case 5: -- orig = append(orig, "\\U000"...) -- default: -- return nil, nil, errors.New("unsupport code point hex length") -- } -- orig = append(orig, b[:i]...) -- exp = append(exp, b[:i]...) -- b = b[i:] -- -- // Check for space between hex and ÷ or ×. -- if len(b) < 1 || b[0] != ' ' { -- return nil, nil, errors.New("bad input") -- } -- b = b[1:] -- -- // Check for next boundary. -- switch { -- case bytes.HasPrefix(b, breakOk): -- boundary = true -- b = b[len(breakOk):] -- case bytes.HasPrefix(b, breakNo): -- boundary = false -- b = b[len(breakNo):] -- default: -- return nil, nil, errors.New("missing ÷ or ×") -- } -- if boundary { -- exp = append(exp, '}') -- } -- exp = append(exp, ',') -- if len(b) > 0 && b[0] == ' ' { -- b = b[1:] -- } -- } -- exp = append(exp, '}') -- return orig, exp, nil --} -diff --git a/gen_properties.go b/gen_properties.go -deleted file mode 100644 -index 999d5ef..0000000 ---- a/gen_properties.go -+++ /dev/null -@@ -1,256 +0,0 @@ --//go:build generate -- --// This program generates a property file in Go file from Unicode Character --// Database auxiliary data files. The command line arguments are as follows: --// --// 1. The name of the Unicode data file (just the filename, without extension). --// Can be "-" (to skip) if the emoji flag is included. --// 2. The name of the locally generated Go file. --// 3. The name of the slice mapping code points to properties. --// 4. The name of the generator, for logging purposes. --// 5. (Optional) Flags, comma-separated. The following flags are available: --// - "emojis=": include the specified emoji properties (e.g. --// "Extended_Pictographic"). --// - "gencat": include general category properties. --// --//go:generate go run gen_properties.go auxiliary/GraphemeBreakProperty graphemeproperties.go graphemeCodePoints graphemes emojis=Extended_Pictographic --//go:generate go run gen_properties.go auxiliary/WordBreakProperty wordproperties.go workBreakCodePoints words emojis=Extended_Pictographic --//go:generate go run gen_properties.go auxiliary/SentenceBreakProperty sentenceproperties.go sentenceBreakCodePoints sentences --//go:generate go run gen_properties.go LineBreak lineproperties.go lineBreakCodePoints lines gencat --//go:generate go run gen_properties.go EastAsianWidth eastasianwidth.go eastAsianWidth eastasianwidth --//go:generate go run gen_properties.go - emojipresentation.go emojiPresentation emojipresentation emojis=Emoji_Presentation --package main -- --import ( -- "bufio" -- "bytes" -- "errors" -- "fmt" -- "go/format" -- "io/ioutil" -- "log" -- "net/http" -- "os" -- "regexp" -- "sort" -- "strconv" -- "strings" -- "time" --) -- --// We want to test against a specific version rather than the latest. When the --// package is upgraded to a new version, change these to generate new tests. --const ( -- propertyURL = `https://www.unicode.org/Public/14.0.0/ucd/%s.txt` -- emojiURL = `https://unicode.org/Public/14.0.0/ucd/emoji/emoji-data.txt` --) -- --// The regular expression for a line containing a code point range property. --var propertyPattern = regexp.MustCompile(`^([0-9A-F]{4,6})(\.\.([0-9A-F]{4,6}))?\s*;\s*([A-Za-z0-9_]+)\s*#\s(.+)$`) -- --func main() { -- if len(os.Args) < 5 { -- fmt.Println("Not enough arguments, see code for details") -- os.Exit(1) -- } -- -- log.SetPrefix("gen_properties (" + os.Args[4] + "): ") -- log.SetFlags(0) -- -- // Parse flags. -- flags := make(map[string]string) -- if len(os.Args) >= 6 { -- for _, flag := range strings.Split(os.Args[5], ",") { -- flagFields := strings.Split(flag, "=") -- if len(flagFields) == 1 { -- flags[flagFields[0]] = "yes" -- } else { -- flags[flagFields[0]] = flagFields[1] -- } -- } -- } -- -- // Parse the text file and generate Go source code from it. -- _, includeGeneralCategory := flags["gencat"] -- var mainURL string -- if os.Args[1] != "-" { -- mainURL = fmt.Sprintf(propertyURL, os.Args[1]) -- } -- src, err := parse(mainURL, flags["emojis"], includeGeneralCategory) -- if err != nil { -- log.Fatal(err) -- } -- -- // Format the Go code. -- formatted, err := format.Source([]byte(src)) -- if err != nil { -- log.Fatal("gofmt:", err) -- } -- -- // Save it to the (local) target file. -- log.Print("Writing to ", os.Args[2]) -- if err := ioutil.WriteFile(os.Args[2], formatted, 0644); err != nil { -- log.Fatal(err) -- } --} -- --// parse parses the Unicode Properties text files located at the given URLs and --// returns their equivalent Go source code to be used in the uniseg package. If --// "emojiProperty" is not an empty string, emoji code points for that emoji --// property (e.g. "Extended_Pictographic") will be included. In those cases, you --// may pass an empty "propertyURL" to skip parsing the main properties file. If --// "includeGeneralCategory" is true, the Unicode General Category property will --// be extracted from the comments and included in the output. --func parse(propertyURL, emojiProperty string, includeGeneralCategory bool) (string, error) { -- if propertyURL == "" && emojiProperty == "" { -- return "", errors.New("no properties to parse") -- } -- -- // Temporary buffer to hold properties. -- var properties [][4]string -- -- // Open the first URL. -- if propertyURL != "" { -- log.Printf("Parsing %s", propertyURL) -- res, err := http.Get(propertyURL) -- if err != nil { -- return "", err -- } -- in1 := res.Body -- defer in1.Close() -- -- // Parse it. -- scanner := bufio.NewScanner(in1) -- num := 0 -- for scanner.Scan() { -- num++ -- line := strings.TrimSpace(scanner.Text()) -- -- // Skip comments and empty lines. -- if strings.HasPrefix(line, "#") || line == "" { -- continue -- } -- -- // Everything else must be a code point range, a property and a comment. -- from, to, property, comment, err := parseProperty(line) -- if err != nil { -- return "", fmt.Errorf("%s line %d: %v", os.Args[4], num, err) -- } -- properties = append(properties, [4]string{from, to, property, comment}) -- } -- if err := scanner.Err(); err != nil { -- return "", err -- } -- } -- -- // Open the second URL. -- if emojiProperty != "" { -- log.Printf("Parsing %s", emojiURL) -- res, err := http.Get(emojiURL) -- if err != nil { -- return "", err -- } -- in2 := res.Body -- defer in2.Close() -- -- // Parse it. -- scanner := bufio.NewScanner(in2) -- num := 0 -- for scanner.Scan() { -- num++ -- line := scanner.Text() -- -- // Skip comments, empty lines, and everything not containing -- // "Extended_Pictographic". -- if strings.HasPrefix(line, "#") || line == "" || !strings.Contains(line, emojiProperty) { -- continue -- } -- -- // Everything else must be a code point range, a property and a comment. -- from, to, property, comment, err := parseProperty(line) -- if err != nil { -- return "", fmt.Errorf("emojis line %d: %v", num, err) -- } -- properties = append(properties, [4]string{from, to, property, comment}) -- } -- if err := scanner.Err(); err != nil { -- return "", err -- } -- } -- -- // Sort properties. -- sort.Slice(properties, func(i, j int) bool { -- left, _ := strconv.ParseUint(properties[i][0], 16, 64) -- right, _ := strconv.ParseUint(properties[j][0], 16, 64) -- return left < right -- }) -- -- // Header. -- var ( -- buf bytes.Buffer -- emojiComment string -- ) -- columns := 3 -- if includeGeneralCategory { -- columns = 4 -- } -- if emojiURL != "" { -- emojiComment = ` --// and --// ` + emojiURL + ` --// ("Extended_Pictographic" only)` -- } -- buf.WriteString(`package uniseg -- --// Code generated via go generate from gen_properties.go. DO NOT EDIT. -- --// ` + os.Args[3] + ` are taken from --// ` + propertyURL + emojiComment + ` --// on ` + time.Now().Format("January 2, 2006") + `. See https://www.unicode.org/license.html for the Unicode --// license agreement. --var ` + os.Args[3] + ` = [][` + strconv.Itoa(columns) + `]int{ -- `) -- -- // Properties. -- for _, prop := range properties { -- if includeGeneralCategory { -- generalCategory := "gc" + prop[3][:2] -- if generalCategory == "gcL&" { -- generalCategory = "gcLC" -- } -- prop[3] = prop[3][3:] -- fmt.Fprintf(&buf, "{0x%s,0x%s,%s,%s}, // %s\n", prop[0], prop[1], translateProperty("pr", prop[2]), generalCategory, prop[3]) -- } else { -- fmt.Fprintf(&buf, "{0x%s,0x%s,%s}, // %s\n", prop[0], prop[1], translateProperty("pr", prop[2]), prop[3]) -- } -- } -- -- // Tail. -- buf.WriteString("}") -- -- return buf.String(), nil --} -- --// parseProperty parses a line of the Unicode properties text file containing a --// property for a code point range and returns it along with its comment. --func parseProperty(line string) (from, to, property, comment string, err error) { -- fields := propertyPattern.FindStringSubmatch(line) -- if fields == nil { -- err = errors.New("no property found") -- return -- } -- from = fields[1] -- to = fields[3] -- if to == "" { -- to = from -- } -- property = fields[4] -- comment = fields[5] -- return --} -- --// translateProperty translates a property name as used in the Unicode data file --// to a variable used in the Go code. --func translateProperty(prefix, property string) string { -- return prefix + strings.ReplaceAll(property, "_", "") --} --- -2.38.0 - diff --git a/build/patches/io_etcd_go_etcd_raft_v3.patch b/build/patches/io_etcd_go_etcd_raft_v3.patch deleted file mode 100644 index 11c777b38f4de..0000000000000 --- a/build/patches/io_etcd_go_etcd_raft_v3.patch +++ /dev/null @@ -1,22 +0,0 @@ -diff -urN a/raftpb/BUILD.bazel b/raftpb/BUILD.bazel ---- a/raftpb/BUILD.bazel 1969-12-31 19:00:00.000000000 -0500 -+++ b/raftpb/BUILD.bazel 2000-01-01 00:00:00.000000000 -0000 -@@ -1,4 +1,5 @@ - load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") -+load("@rules_proto//proto:defs.bzl", "proto_library") - - go_library( - name = "raftpb", -@@ -28,3 +29,12 @@ - srcs = ["confstate_test.go"], - embed = [":raftpb"], - ) -+ -+# keep -+proto_library( -+ name = "raftpb_proto", -+ srcs = ["raft.proto"], -+ deps = ["@com_github_gogo_protobuf//gogoproto:gogo_proto"], -+ import_prefix = "etcd/raft/v3/", -+ visibility = ["//visibility:public"], -+) diff --git a/ci.md b/ci.md index 8b5abfd8fefd3..f7ebabd7a1331 100644 --- a/ci.md +++ b/ci.md @@ -2,30 +2,24 @@ ## Guide -1. ci pipeline will be triggered when your comment on pull request matched command. -2. "**Only triggered by command**". What does that mean? - * Yes, this ci will be triggered only when your comment on pr matched command. - * No, this ci will be triggered by every new commit on current pr, comment matched command also trigger ci pipeline. +ci pipeline will be triggered when your comment on pull request matched command. But we have some task that will be triggered manually. ## Commands -| ci pipeline | Commands | Only triggered by command | -| ---------------------------------------- | ------------------------------------------------------------ | ------------------------- | -| tidb_ghpr_build | /run-build
/run-all-tests
/merge | No | -| tidb_ghpr_check | /run-check_dev
/run-all-tests
/merge | No | -| tidb_ghpr_check_2 | /run-check_dev_2
/run-all-tests
/merge | No | -| tidb_ghpr_coverage | /run-coverage | Yes | -| tidb_ghpr_build_arm64 | /run-build-arm64 | Yes | -| tidb_ghpr_common_test | /run-common-test
/run-integration-tests | Yes | -| tidb_ghpr_integration_br_test | /run-integration-br-test
/run-integration-tests | Yes | -| tidb_ghpr_integration_campatibility_test | /run-integration-compatibility-test
/run-integration-tests | Yes | -| tidb_ghpr_integration_common_test | /run-integration-common-test
/run-integration-tests | Yes | -| tidb_ghpr_integration_copr_test | /run-integration-copr-test
/run-integration-tests | Yes | -| tidb_ghpr_integration_ddl_test | /run-integration-ddl-test
/run-integration-tests | Yes | -| tidb_ghpr_monitor_test | /run-monitor-test | Yes | -| tidb_ghpr_mybatis | /run-mybatis-test
/run-integration-tests | Yes | -| tidb_ghpr_sqllogic_test_1 | /run-sqllogic-test
/run-integration-tests | Yes | -| tidb_ghpr_sqllogic_test_2 | /run-sqllogic-test
/run-integration-tests | Yes | -| tidb_ghpr_tics_test | /run-tics-test
/run-integration-tests | Yes | -| tidb_ghpr_unit_test | /run-unit-test
/run-all-tests
/merge | Yes | +| ci pipeline | Commands | +| ---------------------------------------- |-----------------------------------------------------------------| +| tidb_ghpr_coverage | /run-coverage | +| tidb_ghpr_build_arm64 | /run-build-arm64 comment=true | +| tidb_ghpr_common_test | /run-common-test
/run-integration-tests | +| tidb_ghpr_integration_br_test | /run-integration-br-test
/run-integration-tests | +| tidb_ghpr_integration_campatibility_test | /run-integration-compatibility-test
/run-integration-tests | +| tidb_ghpr_integration_common_test | /run-integration-common-test
/run-integration-tests | +| tidb_ghpr_integration_copr_test | /run-integration-copr-test
/run-integration-tests | +| tidb_ghpr_integration_ddl_test | /run-integration-ddl-test
/run-integration-tests | +| tidb_ghpr_monitor_test | /run-monitor-test | +| tidb_ghpr_mybatis | /run-mybatis-test
/run-integration-tests | +| tidb_ghpr_sqllogic_test_1 | /run-sqllogic-test
/run-integration-tests | +| tidb_ghpr_sqllogic_test_2 | /run-sqllogic-test
/run-integration-tests | +| tidb_ghpr_tics_test | /run-tics-test
/run-integration-tests | +| tidb_ghpr_unit_test | /run-unit-test
/run-all-tests
/merge | diff --git a/cmd/benchkv/main.go b/cmd/benchkv/main.go index 73a388bebbfe5..2b7cf5c9e9abb 100644 --- a/cmd/benchkv/main.go +++ b/cmd/benchkv/main.go @@ -14,7 +14,6 @@ package main -// #nosec G108 import ( "context" "flag" diff --git a/cmd/benchraw/main.go b/cmd/benchraw/main.go index 80f1a1d2289bc..c042d59e9f180 100644 --- a/cmd/benchraw/main.go +++ b/cmd/benchraw/main.go @@ -14,7 +14,6 @@ package main -// #nosec G108 import ( "context" "flag" diff --git a/cmd/ddltest/BUILD.bazel b/cmd/ddltest/BUILD.bazel index 344d46dac3cad..39ac3c9bdb7b4 100644 --- a/cmd/ddltest/BUILD.bazel +++ b/cmd/ddltest/BUILD.bazel @@ -11,6 +11,7 @@ go_test( "random_test.go", ], flaky = True, + race = "on", deps = [ "//config", "//domain", diff --git a/cmd/ddltest/index_test.go b/cmd/ddltest/index_test.go index 7d3206197eba4..dbd96aa62aa39 100644 --- a/cmd/ddltest/index_test.go +++ b/cmd/ddltest/index_test.go @@ -18,11 +18,13 @@ import ( goctx "context" "fmt" "math" + "os" "sync" "sync/atomic" "testing" "time" + "github.com/pingcap/log" "github.com/pingcap/tidb/store/gcworker" "github.com/pingcap/tidb/table" "github.com/stretchr/testify/require" @@ -48,6 +50,11 @@ func (s *ddlSuite) checkDropIndex(t *testing.T, tableName string) { // TestIndex operations on table test_index (c int, c1 bigint, c2 double, c3 varchar(256), primary key(c)). func TestIndex(t *testing.T) { + err := os.Setenv("tidb_manager_ttl", fmt.Sprintf("%d", *lease+5)) + if err != nil { + log.Fatal("set tidb_manager_ttl failed") + } + s := createDDLSuite(t) defer s.teardown(t) diff --git a/cmd/ddltest/main_test.go b/cmd/ddltest/main_test.go index 7f6815d4f6340..d0ca25b750a14 100644 --- a/cmd/ddltest/main_test.go +++ b/cmd/ddltest/main_test.go @@ -41,6 +41,7 @@ func TestMain(m *testing.M) { goleak.IgnoreTopFunction("net/http.(*persistConn).writeLoop"), goleak.IgnoreTopFunction("github.com/go-sql-driver/mysql.(*mysqlConn).startWatcher.func1"), goleak.IgnoreTopFunction("database/sql.(*DB).connectionOpener"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/client/v3.waitRetryBackoff"), } goleak.VerifyTestMain(m, opts...) } diff --git a/cmd/explaintest/r/collation_agg_func_disabled.result b/cmd/explaintest/r/collation_agg_func_disabled.result index 4b4a9d1074af8..b5075b3c82f83 100644 --- a/cmd/explaintest/r/collation_agg_func_disabled.result +++ b/cmd/explaintest/r/collation_agg_func_disabled.result @@ -133,13 +133,13 @@ approx_count_distinct(value collate utf8mb4_bin, value1) create table tt(a char(10), b enum('a', 'B', 'c'), c set('a', 'B', 'c'), d json) collate utf8mb4_general_ci; insert into tt values ("a", "a", "a", JSON_OBJECT("a", "a")); insert into tt values ("A", "A", "A", JSON_OBJECT("A", "A")); -Error 1265: Data truncated for column 'b' at row 1 +Error 1265 (01000): Data truncated for column 'b' at row 1 insert into tt values ("b", "b", "b", JSON_OBJECT("b", "b")); -Error 1265: Data truncated for column 'b' at row 1 +Error 1265 (01000): Data truncated for column 'b' at row 1 insert into tt values ("B", "B", "B", JSON_OBJECT("B", "B")); insert into tt values ("c", "c", "c", JSON_OBJECT("c", "c")); insert into tt values ("C", "C", "C", JSON_OBJECT("C", "C")); -Error 1265: Data truncated for column 'b' at row 1 +Error 1265 (01000): Data truncated for column 'b' at row 1 split table tt by (0), (1), (2), (3), (4), (5); desc format='brief' select min(a) from tt; id estRows task access object operator info @@ -210,9 +210,9 @@ select min(b) from tt; min(b) B desc format='brief' select min(b collate utf8mb4_bin) from tt; -Error 1235: This version of TiDB doesn't yet support 'use collate clause for enum or set' +Error 1235 (42000): This version of TiDB doesn't yet support 'use collate clause for enum or set' select min(b collate utf8mb4_bin) from tt; -Error 1235: This version of TiDB doesn't yet support 'use collate clause for enum or set' +Error 1235 (42000): This version of TiDB doesn't yet support 'use collate clause for enum or set' desc format='brief' select max(b) from tt; id estRows task access object operator info StreamAgg 1.00 root funcs:max(Column#8)->Column#6 @@ -223,9 +223,9 @@ select max(b) from tt; max(b) c desc format='brief' select max(b collate utf8mb4_bin) from tt; -Error 1235: This version of TiDB doesn't yet support 'use collate clause for enum or set' +Error 1235 (42000): This version of TiDB doesn't yet support 'use collate clause for enum or set' select max(b collate utf8mb4_bin) from tt; -Error 1235: This version of TiDB doesn't yet support 'use collate clause for enum or set' +Error 1235 (42000): This version of TiDB doesn't yet support 'use collate clause for enum or set' desc format='brief' select min(c) from tt; id estRows task access object operator info HashAgg 1.00 root funcs:min(collation_agg_func.tt.c)->Column#6 @@ -235,9 +235,9 @@ select min(c) from tt; min(c) B desc format='brief' select min(c collate utf8mb4_bin) from tt; -Error 1235: This version of TiDB doesn't yet support 'use collate clause for enum or set' +Error 1235 (42000): This version of TiDB doesn't yet support 'use collate clause for enum or set' select min(c collate utf8mb4_bin) from tt; -Error 1235: This version of TiDB doesn't yet support 'use collate clause for enum or set' +Error 1235 (42000): This version of TiDB doesn't yet support 'use collate clause for enum or set' desc format='brief' select max(c) from tt; id estRows task access object operator info HashAgg 1.00 root funcs:max(collation_agg_func.tt.c)->Column#6 @@ -247,9 +247,9 @@ select max(c) from tt; max(c) c desc format='brief' select max(c collate utf8mb4_bin) from tt; -Error 1235: This version of TiDB doesn't yet support 'use collate clause for enum or set' +Error 1235 (42000): This version of TiDB doesn't yet support 'use collate clause for enum or set' select max(c collate utf8mb4_bin) from tt; -Error 1235: This version of TiDB doesn't yet support 'use collate clause for enum or set' +Error 1235 (42000): This version of TiDB doesn't yet support 'use collate clause for enum or set' desc format='brief' select min(d) from tt; id estRows task access object operator info StreamAgg 1.00 root funcs:min(collation_agg_func.tt.d)->Column#6 diff --git a/cmd/explaintest/r/collation_agg_func_enabled.result b/cmd/explaintest/r/collation_agg_func_enabled.result index ea345c13ede58..5b587ff02d279 100644 --- a/cmd/explaintest/r/collation_agg_func_enabled.result +++ b/cmd/explaintest/r/collation_agg_func_enabled.result @@ -207,9 +207,9 @@ select min(b) from tt; min(b) a desc format='brief' select min(b collate utf8mb4_bin) from tt; -Error 1235: This version of TiDB doesn't yet support 'use collate clause for enum or set' +Error 1235 (42000): This version of TiDB doesn't yet support 'use collate clause for enum or set' select min(b collate utf8mb4_bin) from tt; -Error 1235: This version of TiDB doesn't yet support 'use collate clause for enum or set' +Error 1235 (42000): This version of TiDB doesn't yet support 'use collate clause for enum or set' desc format='brief' select max(b) from tt; id estRows task access object operator info StreamAgg 1.00 root funcs:max(Column#8)->Column#6 @@ -220,9 +220,9 @@ select max(b) from tt; max(b) c desc format='brief' select max(b collate utf8mb4_bin) from tt; -Error 1235: This version of TiDB doesn't yet support 'use collate clause for enum or set' +Error 1235 (42000): This version of TiDB doesn't yet support 'use collate clause for enum or set' select max(b collate utf8mb4_bin) from tt; -Error 1235: This version of TiDB doesn't yet support 'use collate clause for enum or set' +Error 1235 (42000): This version of TiDB doesn't yet support 'use collate clause for enum or set' desc format='brief' select min(c) from tt; id estRows task access object operator info HashAgg 1.00 root funcs:min(collation_agg_func.tt.c)->Column#6 @@ -232,9 +232,9 @@ select min(c) from tt; min(c) a desc format='brief' select min(c collate utf8mb4_bin) from tt; -Error 1235: This version of TiDB doesn't yet support 'use collate clause for enum or set' +Error 1235 (42000): This version of TiDB doesn't yet support 'use collate clause for enum or set' select min(c collate utf8mb4_bin) from tt; -Error 1235: This version of TiDB doesn't yet support 'use collate clause for enum or set' +Error 1235 (42000): This version of TiDB doesn't yet support 'use collate clause for enum or set' desc format='brief' select max(c) from tt; id estRows task access object operator info HashAgg 1.00 root funcs:max(collation_agg_func.tt.c)->Column#6 @@ -244,9 +244,9 @@ select max(c) from tt; max(c) c desc format='brief' select max(c collate utf8mb4_bin) from tt; -Error 1235: This version of TiDB doesn't yet support 'use collate clause for enum or set' +Error 1235 (42000): This version of TiDB doesn't yet support 'use collate clause for enum or set' select max(c collate utf8mb4_bin) from tt; -Error 1235: This version of TiDB doesn't yet support 'use collate clause for enum or set' +Error 1235 (42000): This version of TiDB doesn't yet support 'use collate clause for enum or set' desc format='brief' select min(d) from tt; id estRows task access object operator info StreamAgg 1.00 root funcs:min(collation_agg_func.tt.d)->Column#6 diff --git a/cmd/explaintest/r/collation_check_use_collation_disabled.result b/cmd/explaintest/r/collation_check_use_collation_disabled.result index 493b26812bfbb..9e633133b1f4f 100644 --- a/cmd/explaintest/r/collation_check_use_collation_disabled.result +++ b/cmd/explaintest/r/collation_check_use_collation_disabled.result @@ -32,7 +32,7 @@ drop table if exists t; create table t(a enum('a', 'b') charset utf8mb4 collate utf8mb4_general_ci, b varchar(20)); insert into t values ("b", "c"); insert into t values ("B", "b"); -Error 1265: Data truncated for column 'a' at row 1 +Error 1265 (01000): Data truncated for column 'a' at row 1 select * from t where 'B' collate utf8mb4_general_ci in (a); a b select * from t where 'B' collate utf8mb4_bin in (a); @@ -82,7 +82,7 @@ drop table if exists t; create table t(a set('a', 'b') charset utf8mb4 collate utf8mb4_general_ci, b varchar(20)); insert into t values ("b", "c"); insert into t values ("B", "b"); -Error 1265: Data truncated for column 'a' at row 1 +Error 1265 (01000): Data truncated for column 'a' at row 1 select * from t where 'B' collate utf8mb4_general_ci in (a); a b select * from t where 'B' collate utf8mb4_bin in (a); @@ -154,4 +154,28 @@ insert into t1 values ('-1'); insert into t2 values (0x2d31, ''); select * from t1, t2 where t1.a in (t2.b, 3); a b c +drop table if exists t0; +drop table if exists t1; +CREATE TABLE t0(c0 BOOL, c1 INT); +CREATE TABLE t1 LIKE t0; +CREATE VIEW v0(c0) AS SELECT IS_IPV4(t0.c1) FROM t0, t1; +INSERT INTO t0(c0, c1) VALUES (true, 0); +INSERT INTO t1(c0, c1) VALUES (true, 2); +SELECT v0.c0 FROM v0; +c0 +0 +SELECT (v0.c0)NOT LIKE(BINARY v0.c0) FROM v0; +(v0.c0)NOT LIKE(BINARY v0.c0) +0 +SELECT v0.c0 FROM v0 WHERE (v0.c0)NOT LIKE(BINARY v0.c0); +c0 +desc format='brief' SELECT v0.c0 FROM v0 WHERE (v0.c0)NOT LIKE(BINARY v0.c0); +id estRows task access object operator info +Projection 80000000.00 root is_ipv4(cast(collation_check_use_collation.t0.c1, var_string(20)))->Column#7 +└─HashJoin 80000000.00 root CARTESIAN inner join + ├─Selection(Build) 8000.00 root not(like(cast(is_ipv4(cast(collation_check_use_collation.t0.c1, var_string(20))), var_string(20)), cast(is_ipv4(cast(collation_check_use_collation.t0.c1, var_string(20))), binary(1)), 92)) + │ └─TableReader 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:t0 keep order:false, stats:pseudo + └─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo use test diff --git a/cmd/explaintest/r/collation_check_use_collation_enabled.result b/cmd/explaintest/r/collation_check_use_collation_enabled.result index 838c6beba6535..3f1113fbcd868 100644 --- a/cmd/explaintest/r/collation_check_use_collation_enabled.result +++ b/cmd/explaintest/r/collation_check_use_collation_enabled.result @@ -173,4 +173,28 @@ insert into t1 values ('-1'); insert into t2 values (0x2d31, ''); select * from t1, t2 where t1.a in (t2.b, 3); a b c +drop table if exists t0; +drop table if exists t1; +CREATE TABLE t0(c0 BOOL, c1 INT); +CREATE TABLE t1 LIKE t0; +CREATE VIEW v0(c0) AS SELECT IS_IPV4(t0.c1) FROM t0, t1; +INSERT INTO t0(c0, c1) VALUES (true, 0); +INSERT INTO t1(c0, c1) VALUES (true, 2); +SELECT v0.c0 FROM v0; +c0 +0 +SELECT (v0.c0)NOT LIKE(BINARY v0.c0) FROM v0; +(v0.c0)NOT LIKE(BINARY v0.c0) +0 +SELECT v0.c0 FROM v0 WHERE (v0.c0)NOT LIKE(BINARY v0.c0); +c0 +desc format='brief' SELECT v0.c0 FROM v0 WHERE (v0.c0)NOT LIKE(BINARY v0.c0); +id estRows task access object operator info +Projection 80000000.00 root is_ipv4(cast(collation_check_use_collation.t0.c1, var_string(20)))->Column#7 +└─HashJoin 80000000.00 root CARTESIAN inner join + ├─Selection(Build) 8000.00 root not(like(cast(is_ipv4(cast(collation_check_use_collation.t0.c1, var_string(20))), var_string(20)), cast(is_ipv4(cast(collation_check_use_collation.t0.c1, var_string(20))), binary(1)), 92)) + │ └─TableReader 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:t0 keep order:false, stats:pseudo + └─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo use test diff --git a/cmd/explaintest/r/collation_misc_disabled.result b/cmd/explaintest/r/collation_misc_disabled.result index eff046aa33009..a66f63ead2db9 100644 --- a/cmd/explaintest/r/collation_misc_disabled.result +++ b/cmd/explaintest/r/collation_misc_disabled.result @@ -15,7 +15,7 @@ select * from t; a t_value alter table t modify column a varchar(20) charset utf8; -Error 8200: Unsupported modify charset from latin1 to utf8 +Error 8200 (HY000): Unsupported modify charset from latin1 to utf8 drop table t; create table t(a varchar(20) charset latin1); insert into t values ("t_value"); @@ -38,13 +38,13 @@ drop table t; create table t(a varchar(20) charset latin1); insert into t values ("t_value"); alter table t modify column a varchar(20) charset utf8 collate utf8_bin; -Error 8200: Unsupported modify charset from latin1 to utf8 +Error 8200 (HY000): Unsupported modify charset from latin1 to utf8 alter table t modify column a varchar(20) charset utf8mb4 collate utf8bin; [ddl:1273]Unknown collation: 'utf8bin' alter table t collate LATIN1_GENERAL_CI charset utf8 collate utf8_bin; -Error 1302: Conflicting declarations: 'CHARACTER SET latin1' and 'CHARACTER SET utf8' +Error 1302 (HY000): Conflicting declarations: 'CHARACTER SET latin1' and 'CHARACTER SET utf8' alter table t collate LATIN1_GENERAL_CI collate UTF8MB4_UNICODE_ci collate utf8_bin; -Error 1253: COLLATION 'utf8mb4_unicode_ci' is not valid for CHARACTER SET 'latin1' +Error 1253 (42000): COLLATION 'utf8mb4_unicode_ci' is not valid for CHARACTER SET 'latin1' drop table t; create table t(a varchar(20) charset latin1); insert into t values ("t_value"); diff --git a/cmd/explaintest/r/collation_misc_enabled.result b/cmd/explaintest/r/collation_misc_enabled.result index 235d5896380ee..a088ddb0b2c9d 100644 --- a/cmd/explaintest/r/collation_misc_enabled.result +++ b/cmd/explaintest/r/collation_misc_enabled.result @@ -15,7 +15,7 @@ select * from t; a t_value alter table t modify column a varchar(20) charset utf8; -Error 8200: Unsupported modify charset from latin1 to utf8 +Error 8200 (HY000): Unsupported modify charset from latin1 to utf8 drop table t; create table t(a varchar(20) charset latin1); insert into t values ("t_value"); @@ -38,13 +38,13 @@ drop table t; create table t(a varchar(20) charset latin1); insert into t values ("t_value"); alter table t modify column a varchar(20) charset utf8 collate utf8_bin; -Error 8200: Unsupported modify charset from latin1 to utf8 +Error 8200 (HY000): Unsupported modify charset from latin1 to utf8 alter table t modify column a varchar(20) charset utf8mb4 collate utf8bin; [ddl:1273]Unknown collation: 'utf8bin' alter table t collate LATIN1_GENERAL_CI charset utf8 collate utf8_bin; -Error 1273: Unsupported collation when new collation is enabled: 'latin1_general_ci' +Error 1273 (HY000): Unsupported collation when new collation is enabled: 'latin1_general_ci' alter table t collate LATIN1_GENERAL_CI collate UTF8MB4_UNICODE_ci collate utf8_bin; -Error 1273: Unsupported collation when new collation is enabled: 'latin1_general_ci' +Error 1273 (HY000): Unsupported collation when new collation is enabled: 'latin1_general_ci' drop table t; create table t(a varchar(20) charset latin1); insert into t values ("t_value"); @@ -56,7 +56,7 @@ a t_value create database if not exists cd_test_utf8 CHARACTER SET utf8 COLLATE utf8_bin; create database if not exists cd_test_latin1 CHARACTER SET latin1 COLLATE latin1_swedish_ci; -Error 1273: Unsupported collation when new collation is enabled: 'latin1_swedish_ci' +Error 1273 (HY000): Unsupported collation when new collation is enabled: 'latin1_swedish_ci' use cd_test_utf8; select @@character_set_database; @@character_set_database @@ -65,7 +65,7 @@ select @@collation_database; @@collation_database utf8_bin use cd_test_latin1; -Error 1049: Unknown database 'cd_test_latin1' +Error 1049 (42000): Unknown database 'cd_test_latin1' select @@character_set_database; @@character_set_database utf8 @@ -73,7 +73,7 @@ select @@collation_database; @@collation_database utf8_bin create database if not exists test_db CHARACTER SET latin1 COLLATE latin1_swedish_ci; -Error 1273: Unsupported collation when new collation is enabled: 'latin1_swedish_ci' +Error 1273 (HY000): Unsupported collation when new collation is enabled: 'latin1_swedish_ci' with cte as (select cast('2010-09-09' as date) a union select '2010-09-09 ') select count(*) from cte; count(*) 1 diff --git a/cmd/explaintest/r/collation_pointget_disabled.result b/cmd/explaintest/r/collation_pointget_disabled.result index a763c54c96344..db7b0a9ab630f 100644 --- a/cmd/explaintest/r/collation_pointget_disabled.result +++ b/cmd/explaintest/r/collation_pointget_disabled.result @@ -111,15 +111,15 @@ select *, a, b from t tmp where tmp.a = "aa"; a b a b aa bb aa bb select a from t where xxxxx.a = "aa"; -Error 1054: Unknown column 'xxxxx.a' in 'where clause' +Error 1054 (42S22): Unknown column 'xxxxx.a' in 'where clause' select xxxxx.a from t where a = "aa"; -Error 1054: Unknown column 'xxxxx.a' in 'field list' +Error 1054 (42S22): Unknown column 'xxxxx.a' in 'field list' select a from t tmp where t.a = "aa"; -Error 1054: Unknown column 't.a' in 'where clause' +Error 1054 (42S22): Unknown column 't.a' in 'where clause' select t.a from t tmp where a = "aa"; -Error 1054: Unknown column 't.a' in 'field list' +Error 1054 (42S22): Unknown column 't.a' in 'field list' select t.* from t tmp where a = "aa"; -Error 1051: Unknown table 't' +Error 1051 (42S02): Unknown table 't' drop table if exists t; create table t(a char(4) primary key, b char(4)); insert into t values("aa", "bb"); diff --git a/cmd/explaintest/r/collation_pointget_enabled.result b/cmd/explaintest/r/collation_pointget_enabled.result index 156e4d87f931c..7c404177ce587 100644 --- a/cmd/explaintest/r/collation_pointget_enabled.result +++ b/cmd/explaintest/r/collation_pointget_enabled.result @@ -124,15 +124,15 @@ select *, a, b from t tmp where tmp.a = "aa"; a b a b aa bb aa bb select a from t where xxxxx.a = "aa"; -Error 1054: Unknown column 'xxxxx.a' in 'where clause' +Error 1054 (42S22): Unknown column 'xxxxx.a' in 'where clause' select xxxxx.a from t where a = "aa"; -Error 1054: Unknown column 'xxxxx.a' in 'field list' +Error 1054 (42S22): Unknown column 'xxxxx.a' in 'field list' select a from t tmp where t.a = "aa"; -Error 1054: Unknown column 't.a' in 'where clause' +Error 1054 (42S22): Unknown column 't.a' in 'where clause' select t.a from t tmp where a = "aa"; -Error 1054: Unknown column 't.a' in 'field list' +Error 1054 (42S22): Unknown column 't.a' in 'field list' select t.* from t tmp where a = "aa"; -Error 1051: Unknown table 't' +Error 1051 (42S02): Unknown table 't' drop table if exists t; create table t(a char(4) primary key, b char(4)); insert into t values("aa", "bb"); diff --git a/cmd/explaintest/r/cte.result b/cmd/explaintest/r/cte.result index 7a8677c848294..6f277815bb566 100644 --- a/cmd/explaintest/r/cte.result +++ b/cmd/explaintest/r/cte.result @@ -91,7 +91,7 @@ c1 c2 1 1 1 2 with recursive tbl_0 (col_943,col_944,col_945,col_946,col_947) AS ( with recursive tbl_0 (col_948,col_949,col_950,col_951,col_952) AS ( select 1, 2,3,4,5 UNION ALL select col_948 + 1,col_949 + 1,col_950 + 1,col_951 + 1,col_952 + 1 from tbl_0 where col_948 < 5 ) select col_948,col_949,col_951,col_950,col_952 from tbl_0 UNION ALL select col_943 + 1,col_944 + 1,col_945 + 1,col_946 + 1,col_947 + 1 from tbl_0 where col_943 < 5 ) select * from tbl_0; -Error 1054: Unknown column 'col_943' in 'where clause' +Error 1054 (42S22): Unknown column 'col_943' in 'where clause' with recursive cte1 (c1, c2) as (select 1, '1' union select concat(c1, 1), c2 + 1 from cte1 where c1 < 100) select * from cte1; c1 c2 1 1 @@ -283,15 +283,15 @@ union all select 3, 0 from qn ) select * from qn; -Error 1222: The used SELECT statements have a different number of columns +Error 1222 (21000): The used SELECT statements have a different number of columns with recursive cte1 as (select 1 union all (select 1 from cte1 limit 10)) select * from cte1; -Error 1235: This version of TiDB doesn't yet support 'ORDER BY / LIMIT / SELECT DISTINCT in recursive query block of Common Table Expression' +Error 1235 (42000): This version of TiDB doesn't yet support 'ORDER BY / LIMIT / SELECT DISTINCT in recursive query block of Common Table Expression' with recursive qn as (select 123 as a union all select null from qn where a is not null) select * from qn; a 123 NULL with recursive q (b) as (select 1, 1 union all select 1, 1 from q) select b from q; -Error 1353: In definition of view, derived table or common table expression, SELECT list and column names list have different column counts +Error 1353 (HY000): In definition of view, derived table or common table expression, SELECT list and column names list have different column counts drop table if exists t1; create table t1(a int); insert into t1 values(1); @@ -356,7 +356,7 @@ drop table if exists t1; create table t1(c1 bigint unsigned); insert into t1 values(0); with recursive cte1 as (select c1 - 1 c1 from t1 union all select c1 - 1 c1 from cte1 where c1 != 0) select * from cte1 dt1, cte1 dt2; -Error 1690: BIGINT UNSIGNED value is out of range in '(test.t1.c1 - 1)' +Error 1690 (22003): BIGINT UNSIGNED value is out of range in '(test.t1.c1 - 1)' drop table if exists t; create table t(a int, b int, key (b)); desc with cte as (select * from t) select * from cte; diff --git a/cmd/explaintest/r/explain_complex.result b/cmd/explaintest/r/explain_complex.result index 8d8b47237b453..d8e1f186a4028 100644 --- a/cmd/explaintest/r/explain_complex.result +++ b/cmd/explaintest/r/explain_complex.result @@ -243,6 +243,7 @@ created_on datetime DEFAULT NULL, updated_on datetime DEFAULT NULL, UNIQUE KEY org_employee_position_pk (hotel_id,user_id,position_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +set tidb_cost_model_version=2; explain format = 'brief' SELECT d.id, d.ctx, d.name, d.left_value, d.right_value, d.depth, d.leader_id, d.status, d.created_on, d.updated_on FROM org_department AS d LEFT JOIN org_position AS p ON p.department_id = d.id AND p.status = 1000 LEFT JOIN org_employee_position AS ep ON ep.position_id = p.id AND ep.status = 1000 WHERE (d.ctx = 1 AND (ep.user_id = 62 OR d.id = 20 OR d.id = 20) AND d.status = 1000) GROUP BY d.id ORDER BY d.left_value; id estRows task access object operator info Sort 1.00 root test.org_department.left_value @@ -262,6 +263,7 @@ Sort 1.00 root test.org_department.left_value └─TableReader(Probe) 9.99 root data:Selection └─Selection 9.99 cop[tikv] eq(test.org_employee_position.status, 1000), not(isnull(test.org_employee_position.position_id)) └─TableFullScan 10000.00 cop[tikv] table:ep keep order:false, stats:pseudo +set tidb_cost_model_version=1; create table test.Tab_A (id int primary key,bid int,cid int,name varchar(20),type varchar(20),num int,amt decimal(11,2)); create table test.Tab_B (id int primary key,name varchar(20)); create table test.Tab_C (id int primary key,name varchar(20),amt decimal(11,2)); diff --git a/cmd/explaintest/r/explain_foreign_key.result b/cmd/explaintest/r/explain_foreign_key.result new file mode 100644 index 0000000000000..2e92440278a49 --- /dev/null +++ b/cmd/explaintest/r/explain_foreign_key.result @@ -0,0 +1,167 @@ +set @@foreign_key_checks=1; +use test; +drop table if exists t1,t2; +create table t1 (id int key); +create table t2 (id int key, foreign key fk(id) references t1(id) ON UPDATE CASCADE ON DELETE CASCADE); +create table t3 (id int, unique index idx(id)); +create table t4 (id int, index idx_id(id),foreign key fk(id) references t3(id)); +create table t5 (id int key, id2 int, id3 int, unique index idx2(id2), index idx3(id3)); +create table t6 (id int, id2 int, id3 int, index idx_id(id), index idx_id2(id2), foreign key fk_1 (id) references t5(id) ON UPDATE CASCADE ON DELETE CASCADE, foreign key fk_2 (id2) references t5(id2) ON UPDATE CASCADE, foreign key fk_3 (id3) references t5(id3) ON DELETE CASCADE); +explain format = 'brief' insert into t2 values (1); +id estRows task access object operator info +Insert N/A root N/A +└─Foreign_Key_Check 0.00 root table:t1 foreign_key:fk, check_exist +explain format = 'brief' update t2 set id=id+1 where id = 1; +id estRows task access object operator info +Update N/A root N/A +├─Point_Get 1.00 root table:t2 handle:1, lock +└─Foreign_Key_Check 0.00 root table:t1 foreign_key:fk, check_exist +explain format = 'brief' delete from t1 where id > 1; +id estRows task access object operator info +Delete N/A root N/A +├─SelectLock 3333.33 root for update 0 +│ └─TableReader 3333.33 root data:TableRangeScan +│ └─TableRangeScan 3333.33 cop[tikv] table:t1 range:(1,+inf], keep order:false, stats:pseudo +└─Foreign_Key_Cascade 0.00 root table:t2 foreign_key:fk, on_delete:CASCADE +explain format = 'brief' update t1 set id=id+1 where id = 1; +id estRows task access object operator info +Update N/A root N/A +├─Point_Get 1.00 root table:t1 handle:1, lock +└─Foreign_Key_Cascade 0.00 root table:t2 foreign_key:fk, on_update:CASCADE +explain format = 'brief' insert into t1 values (1); +id estRows task access object operator info +Insert N/A root N/A +explain format = 'brief' insert into t1 values (1) on duplicate key update id = 100; +id estRows task access object operator info +Insert N/A root N/A +└─Foreign_Key_Cascade 0.00 root table:t2 foreign_key:fk, on_update:CASCADE +explain format = 'brief' insert into t4 values (1); +id estRows task access object operator info +Insert N/A root N/A +└─Foreign_Key_Check 0.00 root table:t3, index:idx foreign_key:fk, check_exist +explain format = 'brief' update t4 set id=id+1 where id = 1; +id estRows task access object operator info +Update N/A root N/A +├─SelectLock 10.00 root for update 0 +│ └─IndexReader 10.00 root index:IndexRangeScan +│ └─IndexRangeScan 10.00 cop[tikv] table:t4, index:idx_id(id) range:[1,1], keep order:false, stats:pseudo +└─Foreign_Key_Check 0.00 root table:t3, index:idx foreign_key:fk, check_exist +explain format = 'brief' delete from t3 where id > 1; +id estRows task access object operator info +Delete N/A root N/A +├─SelectLock 3333.33 root for update 0 +│ └─IndexReader 3333.33 root index:IndexRangeScan +│ └─IndexRangeScan 3333.33 cop[tikv] table:t3, index:idx(id) range:(1,+inf], keep order:false, stats:pseudo +└─Foreign_Key_Check 0.00 root table:t4, index:idx_id foreign_key:fk, check_not_exist +explain format = 'brief' update t3 set id=id+1 where id = 1; +id estRows task access object operator info +Update N/A root N/A +├─Point_Get 1.00 root table:t3, index:idx(id) lock +└─Foreign_Key_Check 0.00 root table:t4, index:idx_id foreign_key:fk, check_not_exist +explain format = 'brief' insert into t3 values (1); +id estRows task access object operator info +Insert N/A root N/A +explain format = 'brief' insert into t3 values (1) on duplicate key update id = 100; +id estRows task access object operator info +Insert N/A root N/A +└─Foreign_Key_Check 0.00 root table:t4, index:idx_id foreign_key:fk, check_not_exist +explain format = 'brief' insert into t6 values (1,1,1); +id estRows task access object operator info +Insert N/A root N/A +├─Foreign_Key_Check 0.00 root table:t5 foreign_key:fk_1, check_exist +├─Foreign_Key_Check 0.00 root table:t5, index:idx2 foreign_key:fk_2, check_exist +└─Foreign_Key_Check 0.00 root table:t5, index:idx3 foreign_key:fk_3, check_exist +explain format = 'brief' update t6 set id=id+1, id3=id2+1 where id = 1; +id estRows task access object operator info +Update N/A root N/A +├─SelectLock 10.00 root for update 0 +│ └─IndexLookUp 10.00 root +│ ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t6, index:idx_id(id) range:[1,1], keep order:false, stats:pseudo +│ └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t6 keep order:false, stats:pseudo +├─Foreign_Key_Check 0.00 root table:t5 foreign_key:fk_1, check_exist +└─Foreign_Key_Check 0.00 root table:t5, index:idx3 foreign_key:fk_3, check_exist +explain format = 'brief' delete from t5 where id > 1; +id estRows task access object operator info +Delete N/A root N/A +├─SelectLock 3333.33 root for update 0 +│ └─TableReader 3333.33 root data:TableRangeScan +│ └─TableRangeScan 3333.33 cop[tikv] table:t5 range:(1,+inf], keep order:false, stats:pseudo +├─Foreign_Key_Check 0.00 root table:t6, index:idx_id2 foreign_key:fk_2, check_not_exist +├─Foreign_Key_Cascade 0.00 root table:t6, index:idx_id foreign_key:fk_1, on_delete:CASCADE +└─Foreign_Key_Cascade 0.00 root table:t6, index:fk_3 foreign_key:fk_3, on_delete:CASCADE +explain format = 'brief' update t5 set id=id+1, id2=id2+1 where id = 1; +id estRows task access object operator info +Update N/A root N/A +├─Point_Get 1.00 root table:t5 handle:1, lock +├─Foreign_Key_Cascade 0.00 root table:t6, index:idx_id foreign_key:fk_1, on_update:CASCADE +└─Foreign_Key_Cascade 0.00 root table:t6, index:idx_id2 foreign_key:fk_2, on_update:CASCADE +explain format = 'brief' update t5 set id=id+1, id2=id2+1, id3=id3+1 where id = 1; +id estRows task access object operator info +Update N/A root N/A +├─Point_Get 1.00 root table:t5 handle:1, lock +├─Foreign_Key_Check 0.00 root table:t6, index:fk_3 foreign_key:fk_3, check_not_exist +├─Foreign_Key_Cascade 0.00 root table:t6, index:idx_id foreign_key:fk_1, on_update:CASCADE +└─Foreign_Key_Cascade 0.00 root table:t6, index:idx_id2 foreign_key:fk_2, on_update:CASCADE +explain format = 'brief' insert into t5 values (1,1,1); +id estRows task access object operator info +Insert N/A root N/A +explain format = 'brief' insert into t5 values (1,1,1) on duplicate key update id = 100, id3=100; +id estRows task access object operator info +Insert N/A root N/A +├─Foreign_Key_Check 0.00 root table:t6, index:fk_3 foreign_key:fk_3, check_not_exist +└─Foreign_Key_Cascade 0.00 root table:t6, index:idx_id foreign_key:fk_1, on_update:CASCADE +explain format = 'brief' insert into t5 values (1,1,1) on duplicate key update id = 100, id2=100, id3=100; +id estRows task access object operator info +Insert N/A root N/A +├─Foreign_Key_Check 0.00 root table:t6, index:fk_3 foreign_key:fk_3, check_not_exist +├─Foreign_Key_Cascade 0.00 root table:t6, index:idx_id foreign_key:fk_1, on_update:CASCADE +└─Foreign_Key_Cascade 0.00 root table:t6, index:idx_id2 foreign_key:fk_2, on_update:CASCADE +drop table if exists t1,t2,t3,t4,t5,t6; +drop table if exists t_1,t_2,t_3,t_4; +create table t_1 (id int key); +create table t_2 (id int key); +create table t_3 (id int key, id2 int, foreign key fk_1(id) references t_1(id), foreign key fk_2(id2) references t_1(id), foreign key fk_3(id) references t_2(id) ON UPDATE CASCADE ON DELETE CASCADE); +create table t_4 (id int key, id2 int, foreign key fk_1(id) references t_2(id), foreign key fk_2(id2) references t_1(id), foreign key fk_3(id) references t_1(id) ON UPDATE CASCADE ON DELETE CASCADE); +explain format = 'brief' update t_1,t_2 set t_1.id=2,t_2.id=2 where t_1.id=t_2.id and t_1.id=1; +id estRows task access object operator info +Update N/A root N/A +├─HashJoin 1.00 root CARTESIAN inner join +│ ├─Point_Get(Build) 1.00 root table:t_2 handle:1 +│ └─Point_Get(Probe) 1.00 root table:t_1 handle:1 +├─Foreign_Key_Check 0.00 root table:t_3 foreign_key:fk_1, check_not_exist +├─Foreign_Key_Check 0.00 root table:t_3, index:fk_2 foreign_key:fk_2, check_not_exist +├─Foreign_Key_Check 0.00 root table:t_4, index:fk_2 foreign_key:fk_2, check_not_exist +├─Foreign_Key_Check 0.00 root table:t_4 foreign_key:fk_1, check_not_exist +├─Foreign_Key_Cascade 0.00 root table:t_4 foreign_key:fk_3, on_update:CASCADE +└─Foreign_Key_Cascade 0.00 root table:t_3 foreign_key:fk_3, on_update:CASCADE +explain format = 'brief' delete t_1,t_2 from t_1 join t_2 where t_1.id=t_2.id and t_1.id > 0; +id estRows task access object operator info +Delete N/A root N/A +├─MergeJoin 4166.67 root inner join, left key:test.t_1.id, right key:test.t_2.id +│ ├─TableReader(Build) 3333.33 root data:TableRangeScan +│ │ └─TableRangeScan 3333.33 cop[tikv] table:t_2 range:(0,+inf], keep order:true, stats:pseudo +│ └─TableReader(Probe) 3333.33 root data:TableRangeScan +│ └─TableRangeScan 3333.33 cop[tikv] table:t_1 range:(0,+inf], keep order:true, stats:pseudo +├─Foreign_Key_Check 0.00 root table:t_3 foreign_key:fk_1, check_not_exist +├─Foreign_Key_Check 0.00 root table:t_3, index:fk_2 foreign_key:fk_2, check_not_exist +├─Foreign_Key_Check 0.00 root table:t_4, index:fk_2 foreign_key:fk_2, check_not_exist +├─Foreign_Key_Check 0.00 root table:t_4 foreign_key:fk_1, check_not_exist +├─Foreign_Key_Cascade 0.00 root table:t_4 foreign_key:fk_3, on_delete:CASCADE +└─Foreign_Key_Cascade 0.00 root table:t_3 foreign_key:fk_3, on_delete:CASCADE +set @@foreign_key_checks=0; +explain format = 'brief' update t_1,t_2 set t_1.id=2,t_2.id=2 where t_1.id=t_2.id and t_1.id=1; +id estRows task access object operator info +Update N/A root N/A +└─HashJoin 1.00 root CARTESIAN inner join + ├─Point_Get(Build) 1.00 root table:t_2 handle:1 + └─Point_Get(Probe) 1.00 root table:t_1 handle:1 +explain format = 'brief' delete t_1,t_2 from t_1 join t_2 where t_1.id=t_2.id and t_1.id > 0; +id estRows task access object operator info +Delete N/A root N/A +└─MergeJoin 4166.67 root inner join, left key:test.t_1.id, right key:test.t_2.id + ├─TableReader(Build) 3333.33 root data:TableRangeScan + │ └─TableRangeScan 3333.33 cop[tikv] table:t_2 range:(0,+inf], keep order:true, stats:pseudo + └─TableReader(Probe) 3333.33 root data:TableRangeScan + └─TableRangeScan 3333.33 cop[tikv] table:t_1 range:(0,+inf], keep order:true, stats:pseudo +drop table if exists t_1,t_2,t_3,t_4; +set @@foreign_key_checks=0; diff --git a/cmd/explaintest/r/explain_indexmerge.result b/cmd/explaintest/r/explain_indexmerge.result index 07530b9596bb5..46ba855e6c2a8 100644 --- a/cmd/explaintest/r/explain_indexmerge.result +++ b/cmd/explaintest/r/explain_indexmerge.result @@ -7,33 +7,33 @@ create index td on t (d); load stats 's/explain_indexmerge_stats_t.json'; explain format = 'brief' select * from t where a < 50 or b < 50; id estRows task access object operator info -IndexMerge 98.00 root +IndexMerge 98.00 root type: union ├─TableRangeScan(Build) 49.00 cop[tikv] table:t range:[-inf,50), keep order:false ├─IndexRangeScan(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false └─TableRowIDScan(Probe) 98.00 cop[tikv] table:t keep order:false explain format = 'brief' select * from t where (a < 50 or b < 50) and f > 100; id estRows task access object operator info -IndexMerge 98.00 root +IndexMerge 98.00 root type: union ├─TableRangeScan(Build) 49.00 cop[tikv] table:t range:[-inf,50), keep order:false ├─IndexRangeScan(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false └─Selection(Probe) 98.00 cop[tikv] gt(test.t.f, 100) └─TableRowIDScan 98.00 cop[tikv] table:t keep order:false explain format = 'brief' select * from t where b < 50 or c < 50; id estRows task access object operator info -IndexMerge 98.00 root +IndexMerge 98.00 root type: union ├─IndexRangeScan(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false ├─IndexRangeScan(Build) 49.00 cop[tikv] table:t, index:tc(c) range:[-inf,50), keep order:false └─TableRowIDScan(Probe) 98.00 cop[tikv] table:t keep order:false set session tidb_enable_index_merge = on; explain format = 'brief' select * from t where a < 50 or b < 50; id estRows task access object operator info -IndexMerge 98.00 root +IndexMerge 98.00 root type: union ├─TableRangeScan(Build) 49.00 cop[tikv] table:t range:[-inf,50), keep order:false ├─IndexRangeScan(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false └─TableRowIDScan(Probe) 98.00 cop[tikv] table:t keep order:false explain format = 'brief' select * from t where (a < 50 or b < 50) and f > 100; id estRows task access object operator info -IndexMerge 98.00 root +IndexMerge 98.00 root type: union ├─TableRangeScan(Build) 49.00 cop[tikv] table:t range:[-inf,50), keep order:false ├─IndexRangeScan(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false └─Selection(Probe) 98.00 cop[tikv] gt(test.t.f, 100) @@ -45,7 +45,7 @@ TableReader 4999999.00 root data:Selection └─TableFullScan 5000000.00 cop[tikv] table:t keep order:false explain format = 'brief' select * from t where b < 50 or c < 50; id estRows task access object operator info -IndexMerge 98.00 root +IndexMerge 98.00 root type: union ├─IndexRangeScan(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false ├─IndexRangeScan(Build) 49.00 cop[tikv] table:t, index:tc(c) range:[-inf,50), keep order:false └─TableRowIDScan(Probe) 98.00 cop[tikv] table:t keep order:false @@ -56,14 +56,14 @@ TableReader 4999999.00 root data:Selection └─TableFullScan 5000000.00 cop[tikv] table:t keep order:false explain format = 'brief' select * from t where a < 50 or b < 50 or c < 50; id estRows task access object operator info -IndexMerge 147.00 root +IndexMerge 147.00 root type: union ├─TableRangeScan(Build) 49.00 cop[tikv] table:t range:[-inf,50), keep order:false ├─IndexRangeScan(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false ├─IndexRangeScan(Build) 49.00 cop[tikv] table:t, index:tc(c) range:[-inf,50), keep order:false └─TableRowIDScan(Probe) 147.00 cop[tikv] table:t keep order:false explain format = 'brief' select * from t where (b < 10000 or c < 10000) and (a < 10 or d < 10) and f < 10; id estRows task access object operator info -IndexMerge 0.00 root +IndexMerge 0.00 root type: union ├─TableRangeScan(Build) 9.00 cop[tikv] table:t range:[-inf,10), keep order:false ├─IndexRangeScan(Build) 9.00 cop[tikv] table:t, index:td(d) range:[-inf,10), keep order:false └─Selection(Probe) 0.00 cop[tikv] lt(test.t.f, 10), or(lt(test.t.b, 10000), lt(test.t.c, 10000)) @@ -104,20 +104,20 @@ label = "cop" set session tidb_enable_index_merge = off; explain format = 'brief' select /*+ use_index_merge(t, primary, tb, tc) */ * from t where a <= 500000 or b <= 1000000 or c <= 3000000; id estRows task access object operator info -IndexMerge 3560000.00 root +IndexMerge 3560000.00 root type: union ├─TableRangeScan(Build) 500000.00 cop[tikv] table:t range:[-inf,500000], keep order:false ├─IndexRangeScan(Build) 1000000.00 cop[tikv] table:t, index:tb(b) range:[-inf,1000000], keep order:false ├─IndexRangeScan(Build) 3000000.00 cop[tikv] table:t, index:tc(c) range:[-inf,3000000], keep order:false └─TableRowIDScan(Probe) 3560000.00 cop[tikv] table:t keep order:false explain format = 'brief' select /*+ use_index_merge(t, tb, tc) */ * from t where b < 50 or c < 5000000; id estRows task access object operator info -IndexMerge 4999999.00 root +IndexMerge 4999999.00 root type: union ├─IndexRangeScan(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false ├─IndexRangeScan(Build) 4999999.00 cop[tikv] table:t, index:tc(c) range:[-inf,5000000), keep order:false └─TableRowIDScan(Probe) 4999999.00 cop[tikv] table:t keep order:false explain format = 'brief' select /*+ use_index_merge(t, tb, tc) */ * from t where (b < 10000 or c < 10000) and (a < 10 or d < 10) and f < 10; id estRows task access object operator info -IndexMerge 0.00 root +IndexMerge 0.00 root type: union ├─IndexRangeScan(Build) 9999.00 cop[tikv] table:t, index:tb(b) range:[-inf,10000), keep order:false ├─IndexRangeScan(Build) 9999.00 cop[tikv] table:t, index:tc(c) range:[-inf,10000), keep order:false └─Selection(Probe) 0.00 cop[tikv] lt(test.t.f, 10), or(lt(test.t.a, 10), lt(test.t.d, 10)) @@ -134,7 +134,7 @@ TableReader 4999999.00 root data:Selection └─TableFullScan 5000000.00 cop[tikv] table:t keep order:false explain format = 'brief' select /*+ use_index_merge(t, primary, tb) */ * from t where a < 50 or b < 5000000; id estRows task access object operator info -IndexMerge 4999999.00 root +IndexMerge 4999999.00 root type: union ├─TableRangeScan(Build) 49.00 cop[tikv] table:t range:[-inf,50), keep order:false ├─IndexRangeScan(Build) 4999999.00 cop[tikv] table:t, index:tb(b) range:[-inf,5000000), keep order:false └─TableRowIDScan(Probe) 4999999.00 cop[tikv] table:t keep order:false @@ -151,7 +151,7 @@ KEY `aid_c2` (`aid`,`c2`) ); desc select /*+ USE_INDEX_MERGE(t, aid_c1, aid_c2) */ * from t where (aid = 1 and c1='aaa') or (aid = 2 and c2='bbb'); id estRows task access object operator info -IndexMerge_8 8.08 root +IndexMerge_8 8.08 root type: union ├─IndexRangeScan_5(Build) 0.10 cop[tikv] table:t, index:aid_c1(aid, c1) range:[1 "aaa",1 "aaa"], keep order:false, stats:pseudo ├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t, index:aid_c2(aid, c2) range:[2 "bbb",2 "bbb"], keep order:false, stats:pseudo └─TableRowIDScan_7(Probe) 8.08 cop[tikv] table:t keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/index_merge.result b/cmd/explaintest/r/index_merge.result index 1870b6bcd8d5d..6b44c6122987e 100644 --- a/cmd/explaintest/r/index_merge.result +++ b/cmd/explaintest/r/index_merge.result @@ -15,7 +15,7 @@ Sort_8 4433.77 root test.t1.c1 └─HashJoin_12 5542.21 root CARTESIAN left outer semi join, other cond:eq(test.t1.c3, test.t1.c3) ├─TableReader_18(Build) 10000.00 root data:TableFullScan_17 │ └─TableFullScan_17 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo - └─IndexMerge_16(Probe) 5542.21 root + └─IndexMerge_16(Probe) 5542.21 root type: union ├─IndexRangeScan_13(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_14(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─TableRowIDScan_15(Probe) 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo @@ -35,7 +35,7 @@ Sort_8 4433.77 root test.t1.c1 └─HashJoin_12 5542.21 root CARTESIAN anti left outer semi join, other cond:eq(test.t1.c3, test.t1.c3) ├─TableReader_18(Build) 10000.00 root data:TableFullScan_17 │ └─TableFullScan_17 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo - └─IndexMerge_16(Probe) 5542.21 root + └─IndexMerge_16(Probe) 5542.21 root type: union ├─IndexRangeScan_13(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_14(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─TableRowIDScan_15(Probe) 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo @@ -50,7 +50,7 @@ c1 c2 c3 explain select /*+ use_index_merge(t1) */ * from t1 where c1 < 10 or c2 < 10 and c3 = (select max(c3) from t1) order by 1; id estRows task access object operator info Sort_33 3325.55 root test.t1.c1 -└─IndexMerge_40 1843.09 root +└─IndexMerge_40 1843.09 root type: union ├─IndexRangeScan_36(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_37(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_39(Probe) 1843.09 cop[tikv] or(lt(test.t1.c1, 10), and(lt(test.t1.c2, 10), eq(test.t1.c3, 5))) @@ -71,7 +71,7 @@ Sort_9 4433.77 root test.t1.c1 └─HashJoin_22 5542.21 root left outer semi join, equal:[eq(test.t1.c1, test.t2.c1)] ├─IndexReader_30(Build) 10000.00 root index:IndexFullScan_29 │ └─IndexFullScan_29 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:false, stats:pseudo - └─IndexMerge_26(Probe) 5542.21 root + └─IndexMerge_26(Probe) 5542.21 root type: union ├─IndexRangeScan_23(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_24(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─TableRowIDScan_25(Probe) 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo @@ -91,7 +91,7 @@ Sort_9 4433.77 root test.t1.c1 └─HashJoin_22 5542.21 root anti left outer semi join, equal:[eq(test.t1.c1, test.t2.c1)] ├─IndexReader_30(Build) 10000.00 root index:IndexFullScan_29 │ └─IndexFullScan_29 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:false, stats:pseudo - └─IndexMerge_26(Probe) 5542.21 root + └─IndexMerge_26(Probe) 5542.21 root type: union ├─IndexRangeScan_23(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_24(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─TableRowIDScan_25(Probe) 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo @@ -106,7 +106,7 @@ c1 c2 c3 explain select /*+ use_index_merge(t1) */ * from t1 where c1 < 10 or c2 < 10 and c3 = (select count(1) from t2) order by 1; id estRows task access object operator info Sort_38 3325.55 root test.t1.c1 -└─IndexMerge_45 1843.09 root +└─IndexMerge_45 1843.09 root type: union ├─IndexRangeScan_41(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_42(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_44(Probe) 1843.09 cop[tikv] or(lt(test.t1.c1, 10), and(lt(test.t1.c2, 10), eq(test.t1.c3, 5))) @@ -128,7 +128,7 @@ Sort_11 5098.44 root test.t1.c1 │ └─IndexReader_44 1.00 root index:StreamAgg_27 │ └─StreamAgg_27 1.00 cop[tikv] funcs:count(1)->Column#25 │ └─IndexFullScan_41 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:false, stats:pseudo - └─IndexMerge_21(Probe) 2825.66 root + └─IndexMerge_21(Probe) 2825.66 root type: union ├─IndexRangeScan_17(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_18(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_20(Probe) 2825.66 cop[tikv] or(lt(test.t1.c1, 10), and(lt(test.t1.c2, 10), if(isnull(test.t1.c3), NULL, 1))) @@ -150,7 +150,7 @@ Sort_11 5098.44 root test.t1.c1 │ └─IndexReader_44 1.00 root index:StreamAgg_27 │ └─StreamAgg_27 1.00 cop[tikv] funcs:count(1)->Column#25 │ └─IndexFullScan_41 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:false, stats:pseudo - └─IndexMerge_21(Probe) 2825.66 root + └─IndexMerge_21(Probe) 2825.66 root type: union ├─IndexRangeScan_17(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_18(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_20(Probe) 2825.66 cop[tikv] or(lt(test.t1.c1, 10), and(lt(test.t1.c2, 10), if(isnull(test.t1.c3), NULL, 1))) @@ -172,7 +172,7 @@ Sort_11 5542.21 root test.t1.c1 │ └─IndexReader_43 1.00 root index:StreamAgg_26 │ └─StreamAgg_26 1.00 cop[tikv] funcs:count(1)->Column#25 │ └─IndexFullScan_40 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:false, stats:pseudo - └─IndexMerge_20(Probe) 5542.21 root + └─IndexMerge_20(Probe) 5542.21 root type: union ├─IndexRangeScan_17(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_18(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─TableRowIDScan_19(Probe) 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo @@ -194,7 +194,7 @@ Sort_39 5542.21 root test.t1.c1 │ └─IndexReader_71 1.00 root index:StreamAgg_54 │ └─StreamAgg_54 1.00 cop[tikv] funcs:count(1)->Column#38 │ └─IndexFullScan_68 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:false, stats:pseudo - └─IndexMerge_48(Probe) 5542.21 root + └─IndexMerge_48(Probe) 5542.21 root type: union ├─IndexRangeScan_45(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_46(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─TableRowIDScan_47(Probe) 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo @@ -220,7 +220,7 @@ Sort_14 4433.77 root test.t1.c1 │ └─TableReader_51(Probe) 9990.00 root data:Selection_50 │ └─Selection_50 9990.00 cop[tikv] not(isnull(test.t2.c2)) │ └─TableFullScan_49 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo - └─IndexMerge_22(Probe) 5542.21 root + └─IndexMerge_22(Probe) 5542.21 root type: union ├─IndexRangeScan_19(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_20(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─TableRowIDScan_21(Probe) 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo @@ -239,7 +239,7 @@ explain select /*+ use_index_merge(t1) */ * from t1 where c1 < 10 or c2 < 10 and id estRows task access object operator info Sort_5 4060.74 root test.t1.c1 └─Selection_12 2250.55 root or(lt(test.t1.c1, 10), and(lt(test.t1.c2, 10), lt(test.t1.c3, 10))) - └─IndexMerge_11 5542.21 root + └─IndexMerge_11 5542.21 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─TableRowIDScan_10(Probe) 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo @@ -254,7 +254,7 @@ explain select /*+ use_index_merge(t1) */ * from t1 where c1 < 10 or c2 < 10 and id estRows task access object operator info Sort_5 5098.44 root test.t1.c1 └─Selection_12 2825.66 root or(lt(test.t1.c1, 10), and(lt(test.t1.c2, 10), eq(test.t1.c3, plus(test.t1.c1, test.t1.c2)))) - └─IndexMerge_11 5542.21 root + └─IndexMerge_11 5542.21 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─TableRowIDScan_10(Probe) 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo @@ -269,7 +269,7 @@ explain select /*+ use_index_merge(t1) */ * from t1 where c1 < 10 or c2 < 10 and id estRows task access object operator info Sort_5 5098.44 root test.t1.c1 └─Selection_12 2825.66 root or(lt(test.t1.c1, 10), and(lt(test.t1.c2, 10), istrue_with_null(cast(substring(cast(test.t1.c3, var_string(20)), test.t1.c2), double BINARY)))) - └─IndexMerge_11 5542.21 root + └─IndexMerge_11 5542.21 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─TableRowIDScan_10(Probe) 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo @@ -284,7 +284,7 @@ explain select /*+ use_index_merge(t1) */ * from t1 where c1 < 10 or c2 < 10 and id estRows task access object operator info Sort_5 4800.37 root test.t1.c1 └─Selection_12 2660.47 root or(lt(test.t1.c1, 10), and(lt(test.t1.c2, 10), test.t1.c3)) - └─IndexMerge_11 5542.21 root + └─IndexMerge_11 5542.21 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─TableRowIDScan_10(Probe) 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo @@ -304,7 +304,7 @@ explain select * from t1 where c1 < 10 or c2 < 10 and c3 < 10 order by 1; id estRows task access object operator info Sort_5 4060.74 root test.t1.c1 └─Selection_12 2250.55 root or(lt(test.t1.c1, 10), and(lt(test.t1.c2, 10), lt(test.t1.c3, 10))) - └─IndexMerge_11 5542.21 root + └─IndexMerge_11 5542.21 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─TableRowIDScan_10(Probe) 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo @@ -338,7 +338,7 @@ insert into t1 values(1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5); explain select /*+ use_index_merge(t1) */ * from t1 where c1 < 10 or c2 < 10 and c3 < 10 order by 1; id estRows task access object operator info Sort_5 4060.74 root test.t1.c1 -└─IndexMerge_12 2250.55 root +└─IndexMerge_12 2250.55 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_11(Probe) 2250.55 cop[tikv] or(lt(test.t1.c1, 10), and(lt(test.t1.c2, 10), lt(test.t1.c3, 10))) @@ -368,7 +368,7 @@ alter table t1 add index c1(c1); explain select /*+ use_index_merge(t1) */ * from t1 where c1 < 10 or c2 < 10 and c3 < 10 order by 1; id estRows task access object operator info Sort_5 4060.74 root test.t1.c1 -└─IndexMerge_12 2250.55 root +└─IndexMerge_12 2250.55 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_11(Probe) 2250.55 cop[tikv] or(lt(test.t1.c1, 10), and(lt(test.t1.c2, 10), lt(test.t1.c3, 10))) @@ -391,7 +391,7 @@ Delete_11 N/A root N/A └─SelectLock_17 4056.68 root for update 0 └─HashJoin_33 4056.68 root inner join, equal:[eq(test.t1.c1, test.t1.c1)] ├─HashAgg_36(Build) 3245.34 root group by:test.t1.c1, funcs:firstrow(test.t1.c1)->test.t1.c1 - │ └─IndexMerge_41 2248.30 root + │ └─IndexMerge_41 2248.30 root type: union │ ├─IndexRangeScan_37(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo │ ├─IndexRangeScan_38(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo │ └─Selection_40(Probe) 2248.30 cop[tikv] not(isnull(test.t1.c1)), or(lt(test.t1.c1, 10), and(lt(test.t1.c2, 10), lt(test.t1.c3, 10))) @@ -409,7 +409,7 @@ Update_10 N/A root N/A └─SelectLock_14 4056.68 root for update 0 └─HashJoin_30 4056.68 root inner join, equal:[eq(test.t1.c1, test.t1.c1)] ├─HashAgg_33(Build) 3245.34 root group by:test.t1.c1, funcs:firstrow(test.t1.c1)->test.t1.c1 - │ └─IndexMerge_38 2248.30 root + │ └─IndexMerge_38 2248.30 root type: union │ ├─IndexRangeScan_34(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo │ ├─IndexRangeScan_35(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo │ └─Selection_37(Probe) 2248.30 cop[tikv] not(isnull(test.t1.c1)), or(lt(test.t1.c1, 10), and(lt(test.t1.c2, 10), lt(test.t1.c3, 10))) @@ -426,7 +426,7 @@ id estRows task access object operator info Sort_6 4060.74 root test.t1.c1 └─Projection_8 4060.74 root test.t1.c1, test.t1.c2, test.t1.c3 └─SelectLock_9 4060.74 root for update 0 - └─IndexMerge_14 2250.55 root + └─IndexMerge_14 2250.55 root type: union ├─IndexRangeScan_10(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_11(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_13(Probe) 2250.55 cop[tikv] or(lt(test.t1.c1, 10), and(lt(test.t1.c2, 10), lt(test.t1.c3, 10))) @@ -455,9 +455,9 @@ c1 c2 c3 ///// MEMORY Table explain select count(c1) from (select /*+ use_index_merge(t_alias), stream_agg() */ count(1) c1 from information_schema.statements_summary where sum_latency >= 0 or max_latency >= 0 order by 1) dt; id estRows task access object operator info -StreamAgg_10 1.00 root funcs:count(Column#93)->Column#94 -└─Sort_11 1.00 root Column#93 - └─StreamAgg_14 1.00 root funcs:count(1)->Column#93 +StreamAgg_10 1.00 root funcs:count(Column#96)->Column#97 +└─Sort_11 1.00 root Column#96 + └─StreamAgg_14 1.00 root funcs:count(1)->Column#96 └─MemTableScan_18 10000.00 root table:STATEMENTS_SUMMARY show warnings; Level Code Message @@ -471,7 +471,7 @@ insert into t1 values(1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5); explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and c3 < 10 order by 1 limit 1 offset 2; id estRows task access object operator info TopN_10 1.00 root test.t1.c1, offset:2, count:1 -└─IndexMerge_19 1841.86 root +└─IndexMerge_19 1841.86 root type: union ├─IndexRangeScan_15(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_16(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_18(Probe) 1841.86 cop[tikv] lt(test.t1.c3, 10) @@ -485,7 +485,7 @@ id estRows task access object operator info Sort_6 1473.49 root Column#5 └─HashAgg_11 1473.49 root group by:Column#10, funcs:sum(Column#9)->Column#5 └─Projection_18 1841.86 root cast(test.t1.c1, decimal(10,0) BINARY)->Column#9, test.t1.c1 - └─IndexMerge_16 1841.86 root + └─IndexMerge_16 1841.86 root type: union ├─IndexRangeScan_12(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_13(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_15(Probe) 1841.86 cop[tikv] lt(test.t1.c3, 10) @@ -507,7 +507,7 @@ Sort_12 1841.86 root test.t1.c1 └─Projection_14 1841.86 root test.t1.c1, test.t1.c2, test.t1.c3 └─Apply_16 1841.86 root inner join, equal:[eq(Column#10, Column#9)] ├─Projection_17(Build) 1841.86 root test.t1.c1, test.t1.c2, test.t1.c3, cast(test.t1.c1, decimal(10,0) BINARY)->Column#10 - │ └─IndexMerge_22 1841.86 root + │ └─IndexMerge_22 1841.86 root type: union │ ├─IndexRangeScan_18(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo │ ├─IndexRangeScan_19(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,-1), keep order:false, stats:pseudo │ └─Selection_21(Probe) 1841.86 cop[tikv] lt(test.t1.c3, 10) @@ -530,7 +530,7 @@ Sort_16 1841.86 root test.t1.c1 └─Projection_18 1841.86 root test.t1.c1, test.t1.c2, test.t1.c3 └─Apply_20 1841.86 root inner join, equal:[eq(Column#11, Column#9)] ├─Projection_21(Build) 1841.86 root test.t1.c1, test.t1.c2, test.t1.c3, cast(test.t1.c1, decimal(10,0) BINARY)->Column#11 - │ └─IndexMerge_26 1841.86 root + │ └─IndexMerge_26 1841.86 root type: union │ ├─IndexRangeScan_22(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo │ ├─IndexRangeScan_23(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,-1), keep order:false, stats:pseudo │ └─Selection_25(Probe) 1841.86 cop[tikv] lt(test.t1.c3, 10) @@ -538,7 +538,7 @@ Sort_16 1841.86 root test.t1.c1 └─TopN_29(Probe) 1841.86 root test.t2.c1, offset:2, count:1 └─HashAgg_36 4900166.23 root group by:Column#21, funcs:avg(Column#19)->Column#9, funcs:firstrow(Column#20)->test.t2.c1 └─Projection_48 6125207.79 root cast(test.t2.c1, decimal(10,0) BINARY)->Column#19, test.t2.c1, test.t2.c1 - └─IndexMerge_41 6125207.79 root + └─IndexMerge_41 6125207.79 root type: union ├─Selection_38(Build) 6121.12 cop[tikv] eq(test.t1.c1, test.t2.c1) │ └─IndexRangeScan_37 6121120.92 cop[tikv] table:t2, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_39(Build) 6121120.92 cop[tikv] table:t2, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo @@ -553,7 +553,7 @@ insert into t1 values(1, 1, 1, 1, 1), (2, 2, 2, 2, 2), (3, 3, 3, 3, 3), (4, 4, 4 explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and (c3 < 10 or c4 < 10) order by 1; id estRows task access object operator info Sort_5 3071.61 root test.t1.c1 -└─IndexMerge_12 3071.61 root +└─IndexMerge_12 3071.61 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_11(Probe) 3071.61 cop[tikv] or(lt(test.t1.c3, 10), lt(test.t1.c4, 10)) @@ -568,7 +568,7 @@ c1 c2 c3 c4 c5 explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 and c2 < 10) or (c3 < 10 and c4 < 10) order by 1; id estRows task access object operator info Sort_5 2086.93 root test.t1.c1 -└─IndexMerge_12 1156.62 root +└─IndexMerge_12 1156.62 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c3(c3) range:[-inf,10), keep order:false, stats:pseudo └─Selection_11(Probe) 1156.62 cop[tikv] or(and(lt(test.t1.c1, 10), lt(test.t1.c2, 10)), and(lt(test.t1.c3, 10), lt(test.t1.c4, 10))) @@ -583,7 +583,7 @@ c1 c2 c3 c4 c5 explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 and c2 < 10) or (c3 < 10 and c4 < 10) and c5 < 10 order by 1; id estRows task access object operator info Sort_5 1430.96 root test.t1.c1 -└─IndexMerge_12 793.07 root +└─IndexMerge_12 793.07 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c3(c3) range:[-inf,10), keep order:false, stats:pseudo └─Selection_11(Probe) 793.07 cop[tikv] or(and(lt(test.t1.c1, 10), lt(test.t1.c2, 10)), and(lt(test.t1.c3, 10), and(lt(test.t1.c4, 10), lt(test.t1.c5, 10)))) @@ -598,7 +598,7 @@ c1 c2 c3 c4 c5 explain select /*+ use_index_merge(t1) */ * from t1 where ((c1 < 10 and c4 < 10) or c2 < 10) and (c3 < 10 or c5 < 10) order by 1; id estRows task access object operator info Sort_5 2250.55 root test.t1.c1 -└─IndexMerge_12 1247.30 root +└─IndexMerge_12 1247.30 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_11(Probe) 1247.30 cop[tikv] or(and(lt(test.t1.c1, 10), lt(test.t1.c4, 10)), lt(test.t1.c2, 10)), or(lt(test.t1.c3, 10), lt(test.t1.c5, 10)) @@ -628,7 +628,7 @@ c1 c2 c3 c4 c5 explain select /*+ use_index_merge(t1) */ * from t1 where (((c1 < 10 or c3 < 10) and c1 < 10) or c2 < 10) and (c3 < 10 or c5 < 10) order by 1; id estRows task access object operator info Sort_5 2523.42 root test.t1.c1 -└─IndexMerge_12 1398.53 root +└─IndexMerge_12 1398.53 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_11(Probe) 1398.53 cop[tikv] or(and(or(lt(test.t1.c1, 10), lt(test.t1.c3, 10)), lt(test.t1.c1, 10)), lt(test.t1.c2, 10)), or(lt(test.t1.c3, 10), lt(test.t1.c5, 10)) @@ -645,7 +645,7 @@ c1 c2 c3 c4 c5 explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and coalesce(c1, c2, c4) = 1 order by 1; id estRows task access object operator info Sort_5 4433.77 root test.t1.c1 -└─IndexMerge_12 4433.77 root +└─IndexMerge_12 4433.77 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_11(Probe) 4433.77 cop[tikv] eq(coalesce(test.t1.c1, test.t1.c2, test.t1.c4), 1) @@ -657,7 +657,7 @@ explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) a id estRows task access object operator info Sort_5 4433.77 root test.t1.c1 └─Selection_12 4433.77 root eq(greatest(test.t1.c1, test.t1.c2, test.t1.c4), 1) - └─IndexMerge_11 5542.21 root + └─IndexMerge_11 5542.21 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─TableRowIDScan_10(Probe) 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo @@ -668,7 +668,7 @@ c1 c2 c3 c4 c5 explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and abs(c1) = 1 order by 1; id estRows task access object operator info Sort_5 4433.77 root test.t1.c1 -└─IndexMerge_12 4433.77 root +└─IndexMerge_12 4433.77 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_11(Probe) 4433.77 cop[tikv] eq(abs(test.t1.c1), 1) @@ -679,7 +679,7 @@ c1 c2 c3 c4 c5 explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and pi() order by 1; id estRows task access object operator info Sort_5 5542.21 root test.t1.c1 -└─IndexMerge_11 5542.21 root +└─IndexMerge_11 5542.21 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─TableRowIDScan_10(Probe) 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo @@ -693,7 +693,7 @@ c1 c2 c3 c4 c5 explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and ceil(c1) order by 1; id estRows task access object operator info Sort_5 4433.77 root test.t1.c1 -└─IndexMerge_12 4433.77 root +└─IndexMerge_12 4433.77 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_11(Probe) 4433.77 cop[tikv] ceil(test.t1.c1) @@ -709,7 +709,7 @@ explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) a id estRows task access object operator info Sort_5 4433.77 root test.t1.c1 └─Selection_8 4433.77 root eq(truncate(test.t1.c1, 1), 1) - └─IndexMerge_12 5542.21 root + └─IndexMerge_12 5542.21 root type: union ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_10(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─TableRowIDScan_11(Probe) 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo @@ -725,7 +725,7 @@ c1 c2 c3 c4 c5 explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and substring(c3, 1, 1) = '1' order by 1; id estRows task access object operator info Sort_5 4433.77 root test.t1.c1 -└─IndexMerge_12 4433.77 root +└─IndexMerge_12 4433.77 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_11(Probe) 4433.77 cop[tikv] eq(substring(cast(test.t1.c3, var_string(20)), 1, 1), "1") @@ -737,7 +737,7 @@ c1 c2 c3 c4 c5 explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and ifnull(c1, c2) order by 1; id estRows task access object operator info Sort_5 4433.77 root test.t1.c1 -└─IndexMerge_12 4433.77 root +└─IndexMerge_12 4433.77 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_11(Probe) 4433.77 cop[tikv] ifnull(test.t1.c1, test.t1.c2) @@ -752,7 +752,7 @@ c1 c2 c3 c4 c5 explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and if(c1, c2, c3) order by 1; id estRows task access object operator info Sort_5 4433.77 root test.t1.c1 -└─IndexMerge_12 4433.77 root +└─IndexMerge_12 4433.77 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_11(Probe) 4433.77 cop[tikv] if(test.t1.c1, test.t1.c2, test.t1.c3) @@ -767,7 +767,7 @@ c1 c2 c3 c4 c5 explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and (c1 between 1 and 2) order by 1; id estRows task access object operator info Sort_5 138.56 root test.t1.c1 -└─IndexMerge_12 138.56 root +└─IndexMerge_12 138.56 root type: union ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_11(Probe) 138.56 cop[tikv] ge(test.t1.c1, 1), le(test.t1.c1, 2) @@ -782,7 +782,7 @@ explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) a id estRows task access object operator info Sort_5 4433.77 root test.t1.c1 └─Selection_8 4433.77 root eq(length(substring(cast(sqrt(cast(test.t1.c3, double BINARY)), var_string(5)), getvar("a"), 1)), char_length(cast(if(test.t1.c1, test.t1.c2, test.t1.c3), var_string(20)))) - └─IndexMerge_12 5542.21 root + └─IndexMerge_12 5542.21 root type: union ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_10(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─TableRowIDScan_11(Probe) 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo @@ -800,7 +800,7 @@ insert into t1 values(1, 1, 1, 1, 1), (2, 2, 2, 2, 2), (3, 3, 3, 3, 3), (4, 4, 4 explain with cte1 as (select /*+ use_index_merge(t1) */ * from t1 where c1 < 10 or c2 < 10 and c3 < 10) select * from cte1 order by 1; id estRows task access object operator info Sort_10 4060.74 root test.t1.c1 -└─IndexMerge_17 2250.55 root +└─IndexMerge_17 2250.55 root type: union ├─IndexRangeScan_13(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo ├─IndexRangeScan_14(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo └─Selection_16(Probe) 2250.55 cop[tikv] or(lt(test.t1.c1, 10), and(lt(test.t1.c2, 10), lt(test.t1.c3, 10))) @@ -818,7 +818,7 @@ Sort_23 7309.33 root test.t1.c1 └─CTEFullScan_26 7309.33 root CTE:cte1 data:CTE_0 CTE_0 7309.33 root Recursive CTE ├─Projection_14(Seed Part) 4060.74 root test.t1.c1 -│ └─IndexMerge_19 2250.55 root +│ └─IndexMerge_19 2250.55 root type: union │ ├─IndexRangeScan_15(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo │ ├─IndexRangeScan_16(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo │ └─Selection_18(Probe) 2250.55 cop[tikv] or(lt(test.t1.c1, 10), and(lt(test.t1.c2, 10), lt(test.t1.c3, 10))) diff --git a/cmd/explaintest/r/new_character_set_builtin.result b/cmd/explaintest/r/new_character_set_builtin.result index f044ecca1019c..77c9400e3128a 100644 --- a/cmd/explaintest/r/new_character_set_builtin.result +++ b/cmd/explaintest/r/new_character_set_builtin.result @@ -399,17 +399,17 @@ a like 0xe4b880 b like 0xd2bb 1 1 1 1 select a = 0xb6fe from t; -Error 3854: Cannot convert string '\xB6\xFE' from binary to utf8mb4 +Error 3854 (HY000): Cannot convert string '\xB6\xFE' from binary to utf8mb4 select b = 0xe4ba8c from t; -Error 3854: Cannot convert string '\xE4\xBA\x8C' from binary to gbk +Error 3854 (HY000): Cannot convert string '\xE4\xBA\x8C' from binary to gbk select concat(a, 0xb6fe) from t; -Error 3854: Cannot convert string '\xB6\xFE' from binary to utf8mb4 +Error 3854 (HY000): Cannot convert string '\xB6\xFE' from binary to utf8mb4 select concat(b, 0xe4ba8c) from t; -Error 3854: Cannot convert string '\xE4\xBA\x8C' from binary to gbk +Error 3854 (HY000): Cannot convert string '\xE4\xBA\x8C' from binary to gbk select concat(convert('a' using gbk), 0x3fff) from t; -Error 3854: Cannot convert string '?\xFF' from binary to gbk +Error 3854 (HY000): Cannot convert string '?\xFF' from binary to gbk select concat(convert('a' using gbk), 0x3fffffffffffffff) from t; -Error 3854: Cannot convert string '?\xFF\xFF\xFF\xFF\xFF...' from binary to gbk +Error 3854 (HY000): Cannot convert string '?\xFF\xFF\xFF\xFF\xFF...' from binary to gbk set @@tidb_enable_vectorized_expression = false; select hex(concat(a, c)), hex(concat(b, c)) from t; hex(concat(a, c)) hex(concat(b, c)) @@ -502,13 +502,13 @@ a like 0xe4b880 b like 0xd2bb 1 1 1 1 select a = 0xb6fe from t; -Error 3854: Cannot convert string '\xB6\xFE' from binary to utf8mb4 +Error 3854 (HY000): Cannot convert string '\xB6\xFE' from binary to utf8mb4 select b = 0xe4ba8c from t; -Error 3854: Cannot convert string '\xE4\xBA\x8C' from binary to gbk +Error 3854 (HY000): Cannot convert string '\xE4\xBA\x8C' from binary to gbk select concat(a, 0xb6fe) from t; -Error 3854: Cannot convert string '\xB6\xFE' from binary to utf8mb4 +Error 3854 (HY000): Cannot convert string '\xB6\xFE' from binary to utf8mb4 select concat(b, 0xe4ba8c) from t; -Error 3854: Cannot convert string '\xE4\xBA\x8C' from binary to gbk +Error 3854 (HY000): Cannot convert string '\xE4\xBA\x8C' from binary to gbk drop table if exists t; create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); insert into t values ('一二三', '一二三', '一二三'); diff --git a/cmd/explaintest/r/new_character_set_invalid.result b/cmd/explaintest/r/new_character_set_invalid.result index 7eea6348e2bc7..e0c749d81ab15 100644 --- a/cmd/explaintest/r/new_character_set_invalid.result +++ b/cmd/explaintest/r/new_character_set_invalid.result @@ -4,11 +4,11 @@ drop table if exists t; create table t (a varchar(255) charset gbk, b varchar(255) charset ascii, c varchar(255) charset utf8); insert into t values ('中文', 'asdf', '字符集'); insert into t values ('À', 'ø', '😂'); -Error 1366: Incorrect string value '\xC3\x80' for column 'a' +Error 1366 (HY000): Incorrect string value '\xC3\x80' for column 'a' insert into t values ('中文À中文', 'asdføfdsa', '字符集😂字符集'); -Error 1366: Incorrect string value '\xC3\x80' for column 'a' +Error 1366 (HY000): Incorrect string value '\xC3\x80' for column 'a' insert into t values (0x4040ffff, 0x4040ffff, 0x4040ffff); -Error 1366: Incorrect string value '\xFF\xFF' for column 'a' +Error 1366 (HY000): Incorrect string value '\xFF\xFF' for column 'a' select * from t; a b c 中文 asdf 字符集 diff --git a/cmd/explaintest/r/select.result b/cmd/explaintest/r/select.result index 02f2486542f45..70101f0218ca8 100644 --- a/cmd/explaintest/r/select.result +++ b/cmd/explaintest/r/select.result @@ -96,9 +96,9 @@ SELECT * from t a left join t2 b on a.c1 = b.c1; c1 c2 c3 c1 c2 1 2 3 1 2 SELECT * from (SELECT 1, 1) as a; -Error 1060: Duplicate column name '1' +Error 1060 (42S21): Duplicate column name '1' SELECT * from (SELECT * FROM t, t2) as a; -Error 1060: Duplicate column name 'c1' +Error 1060 (42S21): Duplicate column name 'c1' DROP TABLE IF EXISTS t; CREATE TABLE t (c1 INT, c2 INT); INSERT INTO t VALUES (1, 2), (1, 1), (1, 3); @@ -656,5 +656,5 @@ drop table if exists t3; create table t3(a char(10), primary key (a)); insert into t3 values ('a'); select * from t3 where a > 0x80; -Error 1105: Cannot convert string '\x80' from binary to utf8mb4 +Error 1105 (HY000): Cannot convert string '\x80' from binary to utf8mb4 set @@tidb_enable_outer_join_reorder=false; diff --git a/cmd/explaintest/r/subquery.result b/cmd/explaintest/r/subquery.result index 0cf9302f425c0..ea5a17f2ff3e3 100644 --- a/cmd/explaintest/r/subquery.result +++ b/cmd/explaintest/r/subquery.result @@ -56,13 +56,11 @@ insert into exam values(1, 'math', 100); set names utf8 collate utf8_general_ci; explain format = 'brief' select * from stu where stu.name not in (select 'guo' from exam where exam.stu_id = stu.id); id estRows task access object operator info -Apply 10000.00 root CARTESIAN anti semi join, other cond:eq(test.stu.name, Column#8) +HashJoin 8000.00 root anti semi join, equal:[eq(test.stu.id, test.exam.stu_id)], other cond:eq(test.stu.name, "guo") ├─TableReader(Build) 10000.00 root data:TableFullScan -│ └─TableFullScan 10000.00 cop[tikv] table:stu keep order:false, stats:pseudo -└─Projection(Probe) 100000.00 root guo->Column#8 - └─TableReader 100000.00 root data:Selection - └─Selection 100000.00 cop[tikv] eq(test.exam.stu_id, test.stu.id) - └─TableFullScan 100000000.00 cop[tikv] table:exam keep order:false, stats:pseudo +│ └─TableFullScan 10000.00 cop[tikv] table:exam keep order:false, stats:pseudo +└─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:stu keep order:false, stats:pseudo select * from stu where stu.name not in (select 'guo' from exam where exam.stu_id = stu.id); id name set names utf8mb4; diff --git a/cmd/explaintest/r/tpch.result b/cmd/explaintest/r/tpch.result index 28328e4c63241..a2fc266a653d7 100644 --- a/cmd/explaintest/r/tpch.result +++ b/cmd/explaintest/r/tpch.result @@ -27,16 +27,13 @@ S_NATIONKEY INTEGER NOT NULL, S_PHONE CHAR(15) NOT NULL, S_ACCTBAL DECIMAL(15,2) NOT NULL, S_COMMENT VARCHAR(101) NOT NULL, -PRIMARY KEY (S_SUPPKEY), -CONSTRAINT FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) references nation(N_NATIONKEY)); +PRIMARY KEY (S_SUPPKEY)); CREATE TABLE IF NOT EXISTS partsupp ( PS_PARTKEY INTEGER NOT NULL, PS_SUPPKEY INTEGER NOT NULL, PS_AVAILQTY INTEGER NOT NULL, PS_SUPPLYCOST DECIMAL(15,2) NOT NULL, PS_COMMENT VARCHAR(199) NOT NULL, -PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY), -CONSTRAINT FOREIGN KEY PARTSUPP_FK1 (PS_SUPPKEY) references supplier(S_SUPPKEY), -CONSTRAINT FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) references part(P_PARTKEY)); +PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY)); CREATE TABLE IF NOT EXISTS customer ( C_CUSTKEY INTEGER NOT NULL, C_NAME VARCHAR(25) NOT NULL, C_ADDRESS VARCHAR(40) NOT NULL, @@ -45,8 +42,7 @@ C_PHONE CHAR(15) NOT NULL, C_ACCTBAL DECIMAL(15,2) NOT NULL, C_MKTSEGMENT CHAR(10) NOT NULL, C_COMMENT VARCHAR(117) NOT NULL, -PRIMARY KEY (C_CUSTKEY), -CONSTRAINT FOREIGN KEY CUSTOMER_FK1 (C_NATIONKEY) references nation(N_NATIONKEY)); +PRIMARY KEY (C_CUSTKEY)); CREATE TABLE IF NOT EXISTS orders ( O_ORDERKEY INTEGER NOT NULL, O_CUSTKEY INTEGER NOT NULL, O_ORDERSTATUS CHAR(1) NOT NULL, @@ -56,8 +52,7 @@ O_ORDERPRIORITY CHAR(15) NOT NULL, O_CLERK CHAR(15) NOT NULL, O_SHIPPRIORITY INTEGER NOT NULL, O_COMMENT VARCHAR(79) NOT NULL, -PRIMARY KEY (O_ORDERKEY), -CONSTRAINT FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) references customer(C_CUSTKEY)); +PRIMARY KEY (O_ORDERKEY)); CREATE TABLE IF NOT EXISTS lineitem ( L_ORDERKEY INTEGER NOT NULL, L_PARTKEY INTEGER NOT NULL, L_SUPPKEY INTEGER NOT NULL, @@ -74,9 +69,7 @@ L_RECEIPTDATE DATE NOT NULL, L_SHIPINSTRUCT CHAR(25) NOT NULL, L_SHIPMODE CHAR(10) NOT NULL, L_COMMENT VARCHAR(44) NOT NULL, -PRIMARY KEY (L_ORDERKEY,L_LINENUMBER), -CONSTRAINT FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY) references orders(O_ORDERKEY), -CONSTRAINT FOREIGN KEY LINEITEM_FK2 (L_PARTKEY,L_SUPPKEY) references partsupp(PS_PARTKEY, PS_SUPPKEY)); +PRIMARY KEY (L_ORDERKEY,L_LINENUMBER)); load stats 's/tpch_stats/nation.json'; load stats 's/tpch_stats/region.json'; load stats 's/tpch_stats/part.json'; diff --git a/cmd/explaintest/t/collation_check_use_collation.test b/cmd/explaintest/t/collation_check_use_collation.test index 62fbea05ae628..adcd8695b38c0 100644 --- a/cmd/explaintest/t/collation_check_use_collation.test +++ b/cmd/explaintest/t/collation_check_use_collation.test @@ -110,5 +110,19 @@ insert into t1 values ('-1'); insert into t2 values (0x2d31, ''); select * from t1, t2 where t1.a in (t2.b, 3); +# issue 38736 +drop table if exists t0; +drop table if exists t1; +CREATE TABLE t0(c0 BOOL, c1 INT); +CREATE TABLE t1 LIKE t0; +CREATE VIEW v0(c0) AS SELECT IS_IPV4(t0.c1) FROM t0, t1; +INSERT INTO t0(c0, c1) VALUES (true, 0); +INSERT INTO t1(c0, c1) VALUES (true, 2); + +SELECT v0.c0 FROM v0; +SELECT (v0.c0)NOT LIKE(BINARY v0.c0) FROM v0; +SELECT v0.c0 FROM v0 WHERE (v0.c0)NOT LIKE(BINARY v0.c0); +desc format='brief' SELECT v0.c0 FROM v0 WHERE (v0.c0)NOT LIKE(BINARY v0.c0); + # cleanup environment use test diff --git a/cmd/explaintest/t/explain_complex.test b/cmd/explaintest/t/explain_complex.test index d9d1b9285f727..187ec571857d8 100644 --- a/cmd/explaintest/t/explain_complex.test +++ b/cmd/explaintest/t/explain_complex.test @@ -174,7 +174,9 @@ CREATE TABLE org_position ( UNIQUE KEY org_employee_position_pk (hotel_id,user_id,position_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +set tidb_cost_model_version=2; explain format = 'brief' SELECT d.id, d.ctx, d.name, d.left_value, d.right_value, d.depth, d.leader_id, d.status, d.created_on, d.updated_on FROM org_department AS d LEFT JOIN org_position AS p ON p.department_id = d.id AND p.status = 1000 LEFT JOIN org_employee_position AS ep ON ep.position_id = p.id AND ep.status = 1000 WHERE (d.ctx = 1 AND (ep.user_id = 62 OR d.id = 20 OR d.id = 20) AND d.status = 1000) GROUP BY d.id ORDER BY d.left_value; +set tidb_cost_model_version=1; create table test.Tab_A (id int primary key,bid int,cid int,name varchar(20),type varchar(20),num int,amt decimal(11,2)); create table test.Tab_B (id int primary key,name varchar(20)); diff --git a/cmd/explaintest/t/explain_foreign_key.test b/cmd/explaintest/t/explain_foreign_key.test new file mode 100644 index 0000000000000..ec222d020a5ab --- /dev/null +++ b/cmd/explaintest/t/explain_foreign_key.test @@ -0,0 +1,45 @@ +set @@foreign_key_checks=1; +use test; +drop table if exists t1,t2; +create table t1 (id int key); +create table t2 (id int key, foreign key fk(id) references t1(id) ON UPDATE CASCADE ON DELETE CASCADE); +create table t3 (id int, unique index idx(id)); +create table t4 (id int, index idx_id(id),foreign key fk(id) references t3(id)); +create table t5 (id int key, id2 int, id3 int, unique index idx2(id2), index idx3(id3)); +create table t6 (id int, id2 int, id3 int, index idx_id(id), index idx_id2(id2), foreign key fk_1 (id) references t5(id) ON UPDATE CASCADE ON DELETE CASCADE, foreign key fk_2 (id2) references t5(id2) ON UPDATE CASCADE, foreign key fk_3 (id3) references t5(id3) ON DELETE CASCADE); + +explain format = 'brief' insert into t2 values (1); +explain format = 'brief' update t2 set id=id+1 where id = 1; +explain format = 'brief' delete from t1 where id > 1; +explain format = 'brief' update t1 set id=id+1 where id = 1; +explain format = 'brief' insert into t1 values (1); +explain format = 'brief' insert into t1 values (1) on duplicate key update id = 100; +explain format = 'brief' insert into t4 values (1); +explain format = 'brief' update t4 set id=id+1 where id = 1; +explain format = 'brief' delete from t3 where id > 1; +explain format = 'brief' update t3 set id=id+1 where id = 1; +explain format = 'brief' insert into t3 values (1); +explain format = 'brief' insert into t3 values (1) on duplicate key update id = 100; +explain format = 'brief' insert into t6 values (1,1,1); +explain format = 'brief' update t6 set id=id+1, id3=id2+1 where id = 1; +explain format = 'brief' delete from t5 where id > 1; +explain format = 'brief' update t5 set id=id+1, id2=id2+1 where id = 1; +explain format = 'brief' update t5 set id=id+1, id2=id2+1, id3=id3+1 where id = 1; +explain format = 'brief' insert into t5 values (1,1,1); +explain format = 'brief' insert into t5 values (1,1,1) on duplicate key update id = 100, id3=100; +explain format = 'brief' insert into t5 values (1,1,1) on duplicate key update id = 100, id2=100, id3=100; +drop table if exists t1,t2,t3,t4,t5,t6; + +drop table if exists t_1,t_2,t_3,t_4; +create table t_1 (id int key); +create table t_2 (id int key); +create table t_3 (id int key, id2 int, foreign key fk_1(id) references t_1(id), foreign key fk_2(id2) references t_1(id), foreign key fk_3(id) references t_2(id) ON UPDATE CASCADE ON DELETE CASCADE); +create table t_4 (id int key, id2 int, foreign key fk_1(id) references t_2(id), foreign key fk_2(id2) references t_1(id), foreign key fk_3(id) references t_1(id) ON UPDATE CASCADE ON DELETE CASCADE); + +explain format = 'brief' update t_1,t_2 set t_1.id=2,t_2.id=2 where t_1.id=t_2.id and t_1.id=1; +explain format = 'brief' delete t_1,t_2 from t_1 join t_2 where t_1.id=t_2.id and t_1.id > 0; +set @@foreign_key_checks=0; +explain format = 'brief' update t_1,t_2 set t_1.id=2,t_2.id=2 where t_1.id=t_2.id and t_1.id=1; +explain format = 'brief' delete t_1,t_2 from t_1 join t_2 where t_1.id=t_2.id and t_1.id > 0; +drop table if exists t_1,t_2,t_3,t_4; +set @@foreign_key_checks=0; diff --git a/cmd/explaintest/t/tpch.test b/cmd/explaintest/t/tpch.test index 33e4256b59e99..fbf20e25637f4 100644 --- a/cmd/explaintest/t/tpch.test +++ b/cmd/explaintest/t/tpch.test @@ -31,17 +31,14 @@ CREATE TABLE IF NOT EXISTS supplier ( S_SUPPKEY INTEGER NOT NULL, S_PHONE CHAR(15) NOT NULL, S_ACCTBAL DECIMAL(15,2) NOT NULL, S_COMMENT VARCHAR(101) NOT NULL, - PRIMARY KEY (S_SUPPKEY), - CONSTRAINT FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) references nation(N_NATIONKEY)); + PRIMARY KEY (S_SUPPKEY)); CREATE TABLE IF NOT EXISTS partsupp ( PS_PARTKEY INTEGER NOT NULL, PS_SUPPKEY INTEGER NOT NULL, PS_AVAILQTY INTEGER NOT NULL, PS_SUPPLYCOST DECIMAL(15,2) NOT NULL, PS_COMMENT VARCHAR(199) NOT NULL, - PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY), - CONSTRAINT FOREIGN KEY PARTSUPP_FK1 (PS_SUPPKEY) references supplier(S_SUPPKEY), - CONSTRAINT FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) references part(P_PARTKEY)); + PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY)); CREATE TABLE IF NOT EXISTS customer ( C_CUSTKEY INTEGER NOT NULL, C_NAME VARCHAR(25) NOT NULL, @@ -51,8 +48,7 @@ CREATE TABLE IF NOT EXISTS customer ( C_CUSTKEY INTEGER NOT NULL, C_ACCTBAL DECIMAL(15,2) NOT NULL, C_MKTSEGMENT CHAR(10) NOT NULL, C_COMMENT VARCHAR(117) NOT NULL, - PRIMARY KEY (C_CUSTKEY), - CONSTRAINT FOREIGN KEY CUSTOMER_FK1 (C_NATIONKEY) references nation(N_NATIONKEY)); + PRIMARY KEY (C_CUSTKEY)); CREATE TABLE IF NOT EXISTS orders ( O_ORDERKEY INTEGER NOT NULL, O_CUSTKEY INTEGER NOT NULL, @@ -63,8 +59,7 @@ CREATE TABLE IF NOT EXISTS orders ( O_ORDERKEY INTEGER NOT NULL, O_CLERK CHAR(15) NOT NULL, O_SHIPPRIORITY INTEGER NOT NULL, O_COMMENT VARCHAR(79) NOT NULL, - PRIMARY KEY (O_ORDERKEY), - CONSTRAINT FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) references customer(C_CUSTKEY)); + PRIMARY KEY (O_ORDERKEY)); CREATE TABLE IF NOT EXISTS lineitem ( L_ORDERKEY INTEGER NOT NULL, L_PARTKEY INTEGER NOT NULL, @@ -82,9 +77,7 @@ CREATE TABLE IF NOT EXISTS lineitem ( L_ORDERKEY INTEGER NOT NULL, L_SHIPINSTRUCT CHAR(25) NOT NULL, L_SHIPMODE CHAR(10) NOT NULL, L_COMMENT VARCHAR(44) NOT NULL, - PRIMARY KEY (L_ORDERKEY,L_LINENUMBER), - CONSTRAINT FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY) references orders(O_ORDERKEY), - CONSTRAINT FOREIGN KEY LINEITEM_FK2 (L_PARTKEY,L_SUPPKEY) references partsupp(PS_PARTKEY, PS_SUPPKEY)); + PRIMARY KEY (L_ORDERKEY,L_LINENUMBER)); -- load stats. load stats 's/tpch_stats/nation.json'; load stats 's/tpch_stats/region.json'; diff --git a/config/BUILD.bazel b/config/BUILD.bazel index e06843bec3df2..e3034c60caff6 100644 --- a/config/BUILD.bazel +++ b/config/BUILD.bazel @@ -13,6 +13,7 @@ go_library( "//br/pkg/streamhelper/config", "//parser/terror", "//util/logutil", + "//util/tiflashcompute", "//util/tikvutil", "//util/versioninfo", "@com_github_burntsushi_toml//:toml", @@ -36,6 +37,7 @@ go_test( data = glob(["**"]), embed = [":config"], flaky = True, + shard_count = 2, deps = [ "//testkit/testsetup", "//util/logutil", diff --git a/config/config.go b/config/config.go index 1ba2c7fbd1595..b868e5ac8bdb3 100644 --- a/config/config.go +++ b/config/config.go @@ -35,6 +35,7 @@ import ( logbackupconf "github.com/pingcap/tidb/br/pkg/streamhelper/config" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/tiflashcompute" "github.com/pingcap/tidb/util/tikvutil" "github.com/pingcap/tidb/util/versioninfo" tikvcfg "github.com/tikv/client-go/v2/config" @@ -46,10 +47,13 @@ import ( // Config number limitations const ( MaxLogFileSize = 4096 // MB + // MaxTxnEntrySize is the max value of TxnEntrySizeLimit. + MaxTxnEntrySizeLimit = 120 * 1024 * 1024 // 120MB // DefTxnEntrySizeLimit is the default value of TxnEntrySizeLimit. DefTxnEntrySizeLimit = 6 * 1024 * 1024 // DefTxnTotalSizeLimit is the default value of TxnTxnTotalSizeLimit. - DefTxnTotalSizeLimit = 100 * 1024 * 1024 + DefTxnTotalSizeLimit = 100 * 1024 * 1024 + SuperLargeTxnSize uint64 = 100 * 1024 * 1024 * 1024 * 1024 // 100T, we expect a txn can never be this large // DefMaxIndexLength is the maximum index length(in bytes). This value is consistent with MySQL. DefMaxIndexLength = 3072 // DefMaxOfMaxIndexLength is the maximum index length(in bytes) for TiDB v3.0.7 and previous version. @@ -88,6 +92,8 @@ const ( DefTempDir = "/tmp/tidb" // DefAuthTokenRefreshInterval is the default time interval to refresh tidb auth token. DefAuthTokenRefreshInterval = time.Hour + // EnvVarKeyspaceName is the system env name for keyspace name. + EnvVarKeyspaceName = "KEYSPACE_NAME" ) // Valid config maps @@ -182,6 +188,7 @@ type Config struct { VersionComment string `toml:"version-comment" json:"version-comment"` TiDBEdition string `toml:"tidb-edition" json:"tidb-edition"` TiDBReleaseVersion string `toml:"tidb-release-version" json:"tidb-release-version"` + KeyspaceName string `toml:"keyspace-name" json:"keyspace-name"` Log Log `toml:"log" json:"log"` Instance Instance `toml:"instance" json:"instance"` Security Security `toml:"security" json:"security"` @@ -260,6 +267,9 @@ type Config struct { // EnableGlobalKill indicates whether to enable global kill. TrxSummary TrxSummary `toml:"transaction-summary" json:"transaction-summary"` EnableGlobalKill bool `toml:"enable-global-kill" json:"enable-global-kill"` + // InitializeSQLFile is a file that will be executed after first bootstrap only. + // It can be used to set GLOBAL system variable values + InitializeSQLFile string `toml:"initialize-sql-file" json:"initialize-sql-file"` // The following items are deprecated. We need to keep them here temporarily // to support the upgrade process. They can be removed in future. @@ -278,10 +288,22 @@ type Config struct { Plugin Plugin `toml:"plugin" json:"plugin"` MaxServerConnections uint32 `toml:"max-server-connections" json:"max-server-connections"` RunDDL bool `toml:"run-ddl" json:"run-ddl"` + + // These configs are related to disaggregated-tiflash mode. + DisaggregatedTiFlash bool `toml:"disaggregated-tiflash" json:"disaggregated-tiflash"` + TiFlashComputeAutoScalerType string `toml:"autoscaler-type" json:"autoscaler-type"` + TiFlashComputeAutoScalerAddr string `toml:"autoscaler-addr" json:"autoscaler-addr"` + IsTiFlashComputeFixedPool bool `toml:"is-tiflashcompute-fixed-pool" json:"is-tiflashcompute-fixed-pool"` + AutoScalerClusterID string `toml:"autoscaler-cluster-id" json:"autoscaler-cluster-id"` + // todo: remove this after AutoScaler is stable. + UseAutoScaler bool `toml:"use-autoscaler" json:"use-autoscaler"` + // TiDBMaxReuseChunk indicates max cached chunk num TiDBMaxReuseChunk uint32 `toml:"tidb-max-reuse-chunk" json:"tidb-max-reuse-chunk"` // TiDBMaxReuseColumn indicates max cached column num TiDBMaxReuseColumn uint32 `toml:"tidb-max-reuse-column" json:"tidb-max-reuse-column"` + // TiDBEnableExitCheck indicates whether exit-checking in domain for background process + TiDBEnableExitCheck bool `toml:"tidb-enable-exit-check" json:"tidb-enable-exit-check"` } // UpdateTempStoragePath is to update the `TempStoragePath` if port/statusPort was changed @@ -480,6 +502,20 @@ type Instance struct { DDLSlowOprThreshold uint32 `toml:"ddl_slow_threshold" json:"ddl_slow_threshold"` // ExpensiveQueryTimeThreshold indicates the time threshold of expensive query. ExpensiveQueryTimeThreshold uint64 `toml:"tidb_expensive_query_time_threshold" json:"tidb_expensive_query_time_threshold"` + // StmtSummaryEnablePersistent indicates whether to enable file persistence for stmtsummary. + StmtSummaryEnablePersistent bool `toml:"tidb_stmt_summary_enable_persistent" json:"tidb_stmt_summary_enable_persistent"` + // StmtSummaryFilename indicates the file name written by stmtsummary + // when StmtSummaryEnablePersistent is true. + StmtSummaryFilename string `toml:"tidb_stmt_summary_filename" json:"tidb_stmt_summary_filename"` + // StmtSummaryFileMaxDays indicates how many days the files written by + // stmtsummary will be kept when StmtSummaryEnablePersistent is true. + StmtSummaryFileMaxDays int `toml:"tidb_stmt_summary_file_max_days" json:"tidb_stmt_summary_file_max_days"` + // StmtSummaryFileMaxSize indicates the maximum size (in mb) of a single file + // written by stmtsummary when StmtSummaryEnablePersistent is true. + StmtSummaryFileMaxSize int `toml:"tidb_stmt_summary_file_max_size" json:"tidb_stmt_summary_file_max_size"` + // StmtSummaryFileMaxBackups indicates the maximum number of files written + // by stmtsummary when StmtSummaryEnablePersistent is true. + StmtSummaryFileMaxBackups int `toml:"tidb_stmt_summary_file_max_backups" json:"tidb_stmt_summary_file_max_backups"` // These variables exist in both 'instance' section and another place. // The configuration in 'instance' section takes precedence. @@ -556,6 +592,8 @@ type Security struct { AuthTokenJWKS string `toml:"auth-token-jwks" json:"auth-token-jwks"` // The refresh time interval of JWKS AuthTokenRefreshInterval string `toml:"auth-token-refresh-interval" json:"auth-token-refresh-interval"` + // Disconnect directly when the password is expired + DisconnectOnExpiredPassword bool `toml:"disconnect-on-expired-password" json:"disconnect-on-expired-password"` } // The ErrConfigValidationFailed error is used so that external callers can do a type assertion @@ -655,14 +693,15 @@ type Performance struct { // Deprecated MemProfileInterval string `toml:"-" json:"-"` - IndexUsageSyncLease string `toml:"index-usage-sync-lease" json:"index-usage-sync-lease"` - PlanReplayerGCLease string `toml:"plan-replayer-gc-lease" json:"plan-replayer-gc-lease"` - GOGC int `toml:"gogc" json:"gogc"` - EnforceMPP bool `toml:"enforce-mpp" json:"enforce-mpp"` - StatsLoadConcurrency uint `toml:"stats-load-concurrency" json:"stats-load-concurrency"` - StatsLoadQueueSize uint `toml:"stats-load-queue-size" json:"stats-load-queue-size"` - AnalyzePartitionConcurrencyQuota uint `toml:"analyze-partition-concurrency-quota" json:"analyze-partition-concurrency-quota"` - EnableStatsCacheMemQuota bool `toml:"enable-stats-cache-mem-quota" json:"enable-stats-cache-mem-quota"` + IndexUsageSyncLease string `toml:"index-usage-sync-lease" json:"index-usage-sync-lease"` + PlanReplayerGCLease string `toml:"plan-replayer-gc-lease" json:"plan-replayer-gc-lease"` + GOGC int `toml:"gogc" json:"gogc"` + EnforceMPP bool `toml:"enforce-mpp" json:"enforce-mpp"` + StatsLoadConcurrency uint `toml:"stats-load-concurrency" json:"stats-load-concurrency"` + StatsLoadQueueSize uint `toml:"stats-load-queue-size" json:"stats-load-queue-size"` + AnalyzePartitionConcurrencyQuota uint `toml:"analyze-partition-concurrency-quota" json:"analyze-partition-concurrency-quota"` + PlanReplayerDumpWorkerConcurrency uint `toml:"plan-replayer-dump-worker-concurrency" json:"plan-replayer-dump-worker-concurrency"` + EnableStatsCacheMemQuota bool `toml:"enable-stats-cache-mem-quota" json:"enable-stats-cache-mem-quota"` // The following items are deprecated. We need to keep them here temporarily // to support the upgrade process. They can be removed in future. @@ -876,6 +915,11 @@ var defaultConf = Config{ EnablePProfSQLCPU: false, DDLSlowOprThreshold: DefDDLSlowOprThreshold, ExpensiveQueryTimeThreshold: DefExpensiveQueryTimeThreshold, + StmtSummaryEnablePersistent: false, + StmtSummaryFilename: "tidb-statements.log", + StmtSummaryFileMaxDays: 3, + StmtSummaryFileMaxSize: 64, + StmtSummaryFileMaxBackups: 0, EnableSlowLog: *NewAtomicBool(logutil.DefaultTiDBEnableSlowLog), SlowThreshold: logutil.DefaultSlowThreshold, RecordPlanInSlowLog: logutil.DefaultRecordPlanInSlowLog, @@ -920,16 +964,17 @@ var defaultConf = Config{ CommitterConcurrency: defTiKVCfg.CommitterConcurrency, MaxTxnTTL: defTiKVCfg.MaxTxnTTL, // 1hour // TODO: set indexUsageSyncLease to 60s. - IndexUsageSyncLease: "0s", - GOGC: 100, - EnforceMPP: false, - PlanReplayerGCLease: "10m", - StatsLoadConcurrency: 5, - StatsLoadQueueSize: 1000, - AnalyzePartitionConcurrencyQuota: 16, - EnableStatsCacheMemQuota: false, - RunAutoAnalyze: true, - EnableLoadFMSketch: false, + IndexUsageSyncLease: "0s", + GOGC: 100, + EnforceMPP: false, + PlanReplayerGCLease: "10m", + StatsLoadConcurrency: 5, + StatsLoadQueueSize: 1000, + AnalyzePartitionConcurrencyQuota: 16, + PlanReplayerDumpWorkerConcurrency: 1, + EnableStatsCacheMemQuota: false, + RunAutoAnalyze: true, + EnableLoadFMSketch: false, }, ProxyProtocol: ProxyProtocol{ Networks: "", @@ -974,6 +1019,7 @@ var defaultConf = Config{ RSAKeySize: 4096, AuthTokenJWKS: "", AuthTokenRefreshInterval: DefAuthTokenRefreshInterval.String(), + DisconnectOnExpiredPassword: true, }, DeprecateIntegerDisplayWidth: false, EnableEnumLengthLimit: true, @@ -982,8 +1028,15 @@ var defaultConf = Config{ NewCollationsEnabledOnFirstBootstrap: true, EnableGlobalKill: true, TrxSummary: DefaultTrxSummary(), + DisaggregatedTiFlash: false, + TiFlashComputeAutoScalerType: tiflashcompute.DefASStr, + TiFlashComputeAutoScalerAddr: tiflashcompute.DefAWSAutoScalerAddr, + IsTiFlashComputeFixedPool: false, + AutoScalerClusterID: "", + UseAutoScaler: true, TiDBMaxReuseChunk: 64, TiDBMaxReuseColumn: 256, + TiDBEnableExitCheck: false, } var ( @@ -1012,6 +1065,26 @@ func StoreGlobalConfig(config *Config) { tikvcfg.StoreGlobalConfig(&cfg) } +// GetAutoScalerClusterID returns KeyspaceName or AutoScalerClusterID. +func GetAutoScalerClusterID() (string, error) { + c := GetGlobalConfig() + keyspaceName := c.KeyspaceName + clusterID := c.AutoScalerClusterID + + if keyspaceName != "" && clusterID != "" { + return "", errors.Errorf("config.KeyspaceName(%s) and config.AutoScalerClusterID(%s) are not empty both", keyspaceName, clusterID) + } + if keyspaceName == "" && clusterID == "" { + return "", errors.Errorf("config.KeyspaceName and config.AutoScalerClusterID are both empty") + } + + res := keyspaceName + if res == "" { + res = clusterID + } + return res, nil +} + // removedConfig contains items that are no longer supported. // they might still be in the config struct to support import, // but are not actively used. @@ -1296,6 +1369,17 @@ func (c *Config) Valid() error { return fmt.Errorf("stats-load-queue-size should be [%d, %d]", DefStatsLoadQueueSizeLimit, DefMaxOfStatsLoadQueueSizeLimit) } + // Check tiflash_compute topo fetch is valid. + if c.DisaggregatedTiFlash && c.UseAutoScaler { + if !tiflashcompute.IsValidAutoScalerConfig(c.TiFlashComputeAutoScalerType) { + return fmt.Errorf("invalid AutoScaler type, expect %s, %s or %s, got %s", + tiflashcompute.MockASStr, tiflashcompute.AWSASStr, tiflashcompute.GCPASStr, c.TiFlashComputeAutoScalerType) + } + if c.TiFlashComputeAutoScalerAddr == "" { + return fmt.Errorf("autoscaler-addr cannot be empty when disaggregated-tiflash mode is true") + } + } + // test log level l := zap.NewAtomicLevel() return l.UnmarshalText([]byte(c.Log.Level)) @@ -1446,3 +1530,9 @@ func ContainHiddenConfig(s string) bool { } return false } + +// GetGlobalKeyspaceName is used to get global keyspace name +// from config file or command line. +func GetGlobalKeyspaceName() string { + return GetGlobalConfig().KeyspaceName +} diff --git a/config/config.toml.example b/config/config.toml.example index 588379f204602..74cbc9413a496 100644 --- a/config/config.toml.example +++ b/config/config.toml.example @@ -114,6 +114,25 @@ enable-enum-length-limit = true # command can be forwarded to the right TiDB instance to execute. enable-global-kill = true +# disaggregated-tiflash indicates whether TiDB is in disaggregated tiflash mode, if true, MPP will runs on tiflash_compute nodes. +disaggregated-tiflash = false + +# autoscaler-type indicates which type of AutoScaler will be used. Possible values are: mock, aws, gcp. +# Only meaningful when disaggregated-tiflash is true. +autoscaler-type = "aws" + +# autoscaler-addr is the host of AutoScaler, Only meaningful when disaggregated-tiflash is true. +# Only meaningful when disaggregated-tiflash is true. +autoscaler-addr = "tiflash-autoscale-lb.tiflash-autoscale.svc.cluster.local:8081" + +# autoscaler-cluster-id is the unique id for each TiDB cluster, which will used by AutoScaler. +# Only meaningful when disaggregated-tiflash is true. +autoscaler-cluster-id = "" + +# use-autoscaler indicates whether use AutoScaler or PD for tiflash_compute nodes, only meaningful when disaggregated-tiflash is true. +# Will remove this after AutoScaler is stable. +use-autoscaler = true + [log] # Log level: debug, info, warn, error, fatal. level = "info" diff --git a/config/config_test.go b/config/config_test.go index 9a6d12a284817..4bd0911661e11 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -1288,3 +1288,18 @@ func TestStatsLoadLimit(t *testing.T) { checkQueueSizeValid(DefMaxOfStatsLoadQueueSizeLimit, true) checkQueueSizeValid(DefMaxOfStatsLoadQueueSizeLimit+1, false) } + +func TestGetGlobalKeyspaceName(t *testing.T) { + conf := NewConfig() + require.Empty(t, conf.KeyspaceName) + + UpdateGlobal(func(conf *Config) { + conf.KeyspaceName = "test" + }) + + require.Equal(t, "test", GetGlobalKeyspaceName()) + + UpdateGlobal(func(conf *Config) { + conf.KeyspaceName = "" + }) +} diff --git a/config/main_test.go b/config/main_test.go index 3458dc358ad86..9c9d4ac738f72 100644 --- a/config/main_test.go +++ b/config/main_test.go @@ -28,6 +28,7 @@ func TestMain(m *testing.M) { goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + goleak.IgnoreTopFunction("syscall.syscall"), } goleak.VerifyTestMain(m, opts...) } diff --git a/ddl/BUILD.bazel b/ddl/BUILD.bazel index b54f52a6d192c..2fbe94b2fcd16 100644 --- a/ddl/BUILD.bazel +++ b/ddl/BUILD.bazel @@ -24,9 +24,12 @@ go_library( "ddl_workerpool.go", "delete_range.go", "delete_range_util.go", + "dist_backfilling.go", + "dist_owner.go", "foreign_key.go", "generated_column.go", "index.go", + "index_cop.go", "index_merge_tmp.go", "job_table.go", "mock.go", @@ -35,6 +38,7 @@ go_library( "partition.go", "placement_policy.go", "reorg.go", + "resource_group.go", "rollingback.go", "sanity_check.go", "schema.go", @@ -44,17 +48,20 @@ go_library( "stat.go", "table.go", "table_lock.go", + "ttl.go", ], importpath = "github.com/pingcap/tidb/ddl", visibility = [ ":ddl_friend", ], deps = [ + "//br/pkg/lightning/common", "//br/pkg/utils", "//config", "//ddl/ingest", "//ddl/label", "//ddl/placement", + "//ddl/resourcegroup", "//ddl/syncer", "//ddl/util", "//distsql", @@ -75,6 +82,9 @@ go_library( "//parser/opcode", "//parser/terror", "//parser/types", + "//privilege", + "//resourcemanager/pooltask", + "//resourcemanager/util", "//sessionctx", "//sessionctx/binloginfo", "//sessionctx/stmtctx", @@ -99,7 +109,11 @@ go_library( "//util/domainutil", "//util/filter", "//util/gcutil", + "//util/generic", + "//util/gpool", + "//util/gpool/spmc", "//util/hack", + "//util/intest", "//util/logutil", "//util/mathutil", "//util/mock", @@ -110,6 +124,7 @@ go_library( "//util/slice", "//util/sqlexec", "//util/stringutil", + "//util/syncutil", "//util/timeutil", "//util/topsql", "//util/topsql/state", @@ -117,6 +132,7 @@ go_library( "@com_github_ngaut_pools//:pools", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", + "@com_github_pingcap_kvproto//pkg/errorpb", "@com_github_pingcap_kvproto//pkg/kvrpcpb", "@com_github_pingcap_kvproto//pkg/metapb", "@com_github_pingcap_log//:log", @@ -141,7 +157,6 @@ go_test( srcs = [ "attributes_sql_test.go", "backfilling_test.go", - "callback_test.go", "cancel_test.go", "cluster_test.go", "column_change_test.go", @@ -161,27 +176,29 @@ go_test( "ddl_api_test.go", "ddl_error_test.go", "ddl_test.go", - "ddl_tiflash_test.go", "ddl_worker_test.go", "ddl_workerpool_test.go", "export_test.go", "fail_test.go", "foreign_key_test.go", "index_change_test.go", - "index_merge_tmp_test.go", + "index_cop_test.go", "index_modify_test.go", "integration_test.go", "job_table_test.go", "main_test.go", "modify_column_test.go", "multi_schema_change_test.go", + "mv_index_test.go", "options_test.go", "partition_test.go", "placement_policy_ddl_test.go", "placement_policy_test.go", "placement_sql_test.go", "primary_key_handle_test.go", + "reorg_partition_test.go", "repair_table_test.go", + "resource_group_test.go", "restart_test.go", "rollingback_test.go", "schema_test.go", @@ -192,13 +209,15 @@ go_test( "table_split_test.go", "table_test.go", "tiflash_replica_test.go", + "ttl_test.go", ], embed = [":ddl"], flaky = True, shard_count = 50, deps = [ + "//autoid_service", "//config", - "//ddl/ingest", + "//ddl/internal/callback", "//ddl/placement", "//ddl/schematracker", "//ddl/testutil", @@ -208,6 +227,7 @@ go_test( "//errno", "//executor", "//infoschema", + "//keyspace", "//kv", "//meta", "//meta/autoid", @@ -229,7 +249,6 @@ go_test( "//store/gcworker", "//store/helper", "//store/mockstore", - "//store/mockstore/unistore", "//table", "//table/tables", "//tablecodec", @@ -245,13 +264,13 @@ go_test( "//util/domainutil", "//util/gcutil", "//util/logutil", + "//util/mathutil", "//util/mock", "//util/sem", "//util/sqlexec", "@com_github_ngaut_pools//:pools", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", - "@com_github_pingcap_kvproto//pkg/metapb", "@com_github_stretchr_testify//assert", "@com_github_stretchr_testify//require", "@com_github_tikv_client_go_v2//oracle", diff --git a/ddl/attributes_sql_test.go b/ddl/attributes_sql_test.go index 95f881e6fb3fe..4d5300d600470 100644 --- a/ddl/attributes_sql_test.go +++ b/ddl/attributes_sql_test.go @@ -24,6 +24,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/domain/infosync" + "github.com/pingcap/tidb/keyspace" "github.com/pingcap/tidb/store/gcworker" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/util/gcutil" @@ -73,6 +74,8 @@ func TestAlterTableAttributes(t *testing.T) { // without equal tk.MustExec(`alter table alter_t attributes " merge_option=allow ";`) tk.MustExec(`alter table alter_t attributes " merge_option=allow , key=value ";`) + + tk.MustExec("drop table alter_t") } func TestAlterTablePartitionAttributes(t *testing.T) { @@ -134,6 +137,8 @@ PARTITION BY RANGE (c) ( require.Len(t, rows4, 1) require.NotEqual(t, rows3[0][3], rows4[0][3]) require.NotEqual(t, rows[0][3], rows4[0][3]) + + tk.MustExec("drop table alter_p") } func TestTruncateTable(t *testing.T) { @@ -269,7 +274,7 @@ PARTITION BY RANGE (c) ( func TestFlashbackTable(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) - _, err := infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), true) + _, err := infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), dom.GetEtcdClient(), dom.GetPDClient(), keyspace.CodecV1, true) require.NoError(t, err) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") @@ -327,7 +332,7 @@ PARTITION BY RANGE (c) ( func TestDropTable(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) - _, err := infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), true) + _, err := infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), dom.GetEtcdClient(), dom.GetPDClient(), keyspace.CodecV1, true) require.NoError(t, err) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") @@ -380,7 +385,7 @@ PARTITION BY RANGE (c) ( func TestCreateWithSameName(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) - _, err := infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), true) + _, err := infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), dom.GetEtcdClient(), dom.GetPDClient(), keyspace.CodecV1, true) require.NoError(t, err) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") @@ -444,7 +449,7 @@ PARTITION BY RANGE (c) ( func TestPartition(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) - _, err := infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), true) + _, err := infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), dom.GetEtcdClient(), dom.GetPDClient(), keyspace.CodecV1, true) require.NoError(t, err) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") @@ -504,7 +509,7 @@ PARTITION BY RANGE (c) ( func TestDropSchema(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) - _, err := infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), true) + _, err := infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), dom.GetEtcdClient(), dom.GetPDClient(), keyspace.CodecV1, true) require.NoError(t, err) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") @@ -530,7 +535,7 @@ PARTITION BY RANGE (c) ( func TestDefaultKeyword(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) - _, err := infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), true) + _, err := infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), dom.GetEtcdClient(), dom.GetPDClient(), keyspace.CodecV1, true) require.NoError(t, err) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") diff --git a/ddl/backfilling.go b/ddl/backfilling.go index dfd213652ab2e..c6bb38297402d 100644 --- a/ddl/backfilling.go +++ b/ddl/backfilling.go @@ -15,7 +15,6 @@ package ddl import ( - "bytes" "context" "encoding/hex" "fmt" @@ -32,13 +31,16 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/copr" "github.com/pingcap/tidb/store/driver/backoff" "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/logutil" @@ -46,29 +48,108 @@ import ( decoder "github.com/pingcap/tidb/util/rowDecoder" "github.com/pingcap/tidb/util/timeutil" "github.com/pingcap/tidb/util/topsql" + "github.com/tikv/client-go/v2/oracle" "github.com/tikv/client-go/v2/tikv" "go.uber.org/zap" ) -type backfillWorkerType byte +type backfillerType byte const ( - typeAddIndexWorker backfillWorkerType = 0 - typeUpdateColumnWorker backfillWorkerType = 1 - typeCleanUpIndexWorker backfillWorkerType = 2 - typeAddIndexMergeTmpWorker backfillWorkerType = 3 + typeAddIndexWorker backfillerType = 0 + typeUpdateColumnWorker backfillerType = 1 + typeCleanUpIndexWorker backfillerType = 2 + typeAddIndexMergeTmpWorker backfillerType = 3 + typeReorgPartitionWorker backfillerType = 4 + + // InstanceLease is the instance lease. + InstanceLease = 1 * time.Minute + updateInstanceLease = 25 * time.Second + genTaskBatch = 4096 + genPhysicalTableTaskBatch = 256 + minGenTaskBatch = 1024 + minGenPhysicalTableTaskBatch = 64 + minDistTaskCnt = 64 + retrySQLTimes = 10 ) +// RetrySQLInterval is export for test. +var RetrySQLInterval = 300 * time.Millisecond + +func (bT backfillerType) String() string { + switch bT { + case typeAddIndexWorker: + return "add index" + case typeUpdateColumnWorker: + return "update column" + case typeCleanUpIndexWorker: + return "clean up index" + case typeAddIndexMergeTmpWorker: + return "merge temporary index" + case typeReorgPartitionWorker: + return "reorganize partition" + default: + return "unknown" + } +} + +// BackfillJob is for a tidb_background_subtask table's record. +type BackfillJob struct { + ID int64 + JobID int64 + EleID int64 + EleKey []byte + PhysicalTableID int64 + Tp backfillerType + State model.JobState + InstanceID string + InstanceLease types.Time + StartTS uint64 + StateUpdateTS uint64 + Meta *model.BackfillMeta +} + +// AbbrStr returns the BackfillJob's info without the Meta info. +func (bj *BackfillJob) AbbrStr() string { + return fmt.Sprintf("ID:%d, JobID:%d, EleID:%d, Type:%s, State:%s, InstanceID:%s, InstanceLease:%s", + bj.ID, bj.JobID, bj.EleID, bj.Tp, bj.State, bj.InstanceID, bj.InstanceLease) +} + +// GetOracleTimeWithStartTS returns the current time with txn's startTS. +func GetOracleTimeWithStartTS(se *session) (time.Time, error) { + txn, err := se.Txn(true) + if err != nil { + return time.Time{}, err + } + return oracle.GetTimeFromTS(txn.StartTS()).UTC(), nil +} + +// GetOracleTime returns the current time from TS without txn. +func GetOracleTime(store kv.Storage) (time.Time, error) { + currentVer, err := store.CurrentVersion(kv.GlobalTxnScope) + if err != nil { + return time.Time{}, errors.Trace(err) + } + return oracle.GetTimeFromTS(currentVer.Ver).UTC(), nil +} + +// GetLeaseGoTime returns a types.Time by adding a lease. +func GetLeaseGoTime(currTime time.Time, lease time.Duration) types.Time { + leaseTime := currTime.Add(lease) + return types.NewTime(types.FromGoTime(leaseTime.In(time.UTC)), mysql.TypeTimestamp, types.MaxFsp) +} + // By now the DDL jobs that need backfilling include: // 1: add-index // 2: modify-column-type // 3: clean-up global index +// 4: reorganize partition // // They all have a write reorganization state to back fill data into the rows existed. // Backfilling is time consuming, to accelerate this process, TiDB has built some sub // workers to do this in the DDL owner node. // -// DDL owner thread +// DDL owner thread (also see comments before runReorgJob func) // ^ // | (reorgCtx.doneCh) // | @@ -111,24 +192,52 @@ const ( // Instead, it is divided into batches, each time a kv transaction completes the backfilling // of a partial batch. -func (bWT backfillWorkerType) String() string { - switch bWT { - case typeAddIndexWorker: - return "add index" - case typeUpdateColumnWorker: - return "update column" - case typeCleanUpIndexWorker: - return "clean up index" - case typeAddIndexMergeTmpWorker: - return "merge temporary index" - default: - return "unknown" +// backfillTaskContext is the context of the batch adding indices or updating column values. +// After finishing the batch adding indices or updating column values, result in backfillTaskContext will be merged into backfillResult. +type backfillTaskContext struct { + nextKey kv.Key + done bool + addedCount int + scanCount int + warnings map[errors.ErrorID]*terror.Error + warningsCount map[errors.ErrorID]int64 + finishTS uint64 +} + +type backfillCtx struct { + id int + *ddlCtx + reorgTp model.ReorgType + sessCtx sessionctx.Context + schemaName string + table table.Table + batchCnt int +} + +func newBackfillCtx(ctx *ddlCtx, id int, sessCtx sessionctx.Context, reorgTp model.ReorgType, + schemaName string, tbl table.Table) *backfillCtx { + if id == 0 { + id = int(backfillContextID.Add(1)) + } + return &backfillCtx{ + id: id, + ddlCtx: ctx, + sessCtx: sessCtx, + reorgTp: reorgTp, + schemaName: schemaName, + table: tbl, + batchCnt: int(variable.GetDDLReorgBatchSize()), } } type backfiller interface { BackfillDataInTxn(handleRange reorgBackfillTask) (taskCtx backfillTaskContext, errInTxn error) AddMetricInfo(float64) + GetTasks() ([]*BackfillJob, error) + UpdateTask(bfJob *BackfillJob) error + FinishTask(bfJob *BackfillJob) error + GetCtx() *backfillCtx + String() string } type backfillResult struct { @@ -139,30 +248,40 @@ type backfillResult struct { err error } -// backfillTaskContext is the context of the batch adding indices or updating column values. -// After finishing the batch adding indices or updating column values, result in backfillTaskContext will be merged into backfillResult. -type backfillTaskContext struct { - nextKey kv.Key - done bool - addedCount int - scanCount int - warnings map[errors.ErrorID]*terror.Error - warningsCount map[errors.ErrorID]int64 +type reorgBackfillTask struct { + bfJob *BackfillJob + physicalTable table.PhysicalTable + + // TODO: Remove the following fields after remove the function of run. + id int + startKey kv.Key + endKey kv.Key + endInclude bool + jobID int64 + sqlQuery string + priority int } -type reorgBackfillTask struct { - id int - physicalTableID int64 - startKey kv.Key - endKey kv.Key - endInclude bool +func (r *reorgBackfillTask) getJobID() int64 { + jobID := r.jobID + if r.bfJob != nil { + jobID = r.bfJob.JobID + } + return jobID +} + +func (r *reorgBackfillTask) excludedEndKey() kv.Key { + if r.endInclude { + return r.endKey.Next() + } + return r.endKey } func (r *reorgBackfillTask) String() string { - physicalID := strconv.FormatInt(r.physicalTableID, 10) - startKey := tryDecodeToHandleString(r.startKey) - endKey := tryDecodeToHandleString(r.endKey) - rangeStr := "physicalTableID_" + physicalID + "_" + "[" + startKey + "," + endKey + physicalID := strconv.FormatInt(r.physicalTable.GetPhysicalID(), 10) + startKey := hex.EncodeToString(r.startKey) + endKey := hex.EncodeToString(r.endKey) + rangeStr := "taskID_" + strconv.Itoa(r.id) + "_physicalTableID_" + physicalID + "_" + "[" + startKey + "," + endKey if r.endInclude { return rangeStr + "]" } @@ -177,35 +296,43 @@ func mergeBackfillCtxToResult(taskCtx *backfillTaskContext, result *backfillResu } type backfillWorker struct { - id int - reorgInfo *reorgInfo - batchCnt int - sessCtx sessionctx.Context - taskCh chan *reorgBackfillTask - resultCh chan *backfillResult - table table.Table - priority int - tp backfillWorkerType - ctx context.Context - cancel func() -} - -func newBackfillWorker(ctx context.Context, sessCtx sessionctx.Context, id int, t table.PhysicalTable, - reorgInfo *reorgInfo, tp backfillWorkerType) *backfillWorker { + backfiller + taskCh chan *reorgBackfillTask + resultCh chan *backfillResult + ctx context.Context + cancel func() +} + +func newBackfillWorker(ctx context.Context, bf backfiller) *backfillWorker { bfCtx, cancel := context.WithCancel(ctx) return &backfillWorker{ - id: id, - table: t, - reorgInfo: reorgInfo, - batchCnt: int(variable.GetDDLReorgBatchSize()), - sessCtx: sessCtx, - priority: reorgInfo.Job.Priority, - tp: tp, - ctx: bfCtx, - cancel: cancel, + backfiller: bf, + taskCh: make(chan *reorgBackfillTask, 1), + resultCh: make(chan *backfillResult, 1), + ctx: bfCtx, + cancel: cancel, } } +func (w *backfillWorker) updateLease(execID string, bfJob *BackfillJob, nextKey kv.Key) error { + leaseTime, err := GetOracleTime(w.GetCtx().store) + if err != nil { + return err + } + bfJob.Meta.CurrKey = nextKey + bfJob.InstanceID = execID + bfJob.InstanceLease = GetLeaseGoTime(leaseTime, InstanceLease) + return w.backfiller.UpdateTask(bfJob) +} + +func (w *backfillWorker) finishJob(bfJob *BackfillJob) error { + return w.backfiller.FinishTask(bfJob) +} + +func (w *backfillWorker) String() string { + return fmt.Sprintf("backfill-worker %d, tp %s", w.GetCtx().id, w.backfiller.String()) +} + func (w *backfillWorker) Close() { if w.cancel != nil { w.cancel() @@ -231,17 +358,23 @@ func (w *backfillWorker) handleBackfillTask(d *ddlCtx, task *reorgBackfillTask, addedCount: 0, nextKey: handleRange.startKey, } + batchStartTime := time.Now() lastLogCount := 0 lastLogTime := time.Now() startTime := lastLogTime - rc := d.getReorgCtx(w.reorgInfo.Job) + jobID := task.getJobID() + rc := d.getReorgCtx(jobID) + isDistReorg := task.bfJob != nil + if isDistReorg { + w.initPartitionIndexInfo(task) + } for { // Give job chance to be canceled, if we not check it here, // if there is panic in bf.BackfillDataInTxn we will never cancel the job. // Because reorgRecordTask may run a long time, // we should check whether this ddl job is still runnable. - err := d.isReorgRunnable(w.reorgInfo.Job) + err := d.isReorgRunnable(jobID, isDistReorg) if err != nil { result.err = err return result @@ -267,13 +400,11 @@ func (w *backfillWorker) handleBackfillTask(d *ddlCtx, task *reorgBackfillTask, rc.increaseRowCount(int64(taskCtx.addedCount)) rc.mergeWarnings(taskCtx.warnings, taskCtx.warningsCount) - if num := result.scanCount - lastLogCount; num >= 30000 { + if num := result.scanCount - lastLogCount; num >= 90000 { lastLogCount = result.scanCount - logutil.BgLogger().Info("[ddl] backfill worker back fill index", - zap.Int("workerID", w.id), - zap.Int("addedCount", result.addedCount), - zap.Int("scanCount", result.scanCount), - zap.String("nextHandle", tryDecodeToHandleString(taskCtx.nextKey)), + logutil.BgLogger().Info("[ddl] backfill worker back fill index", zap.Stringer("worker", w), + zap.Int("addedCount", result.addedCount), zap.Int("scanCount", result.scanCount), + zap.String("next key", hex.EncodeToString(taskCtx.nextKey)), zap.Float64("speed(rows/s)", float64(num)/time.Since(lastLogTime).Seconds())) lastLogTime = time.Now() } @@ -282,47 +413,110 @@ func (w *backfillWorker) handleBackfillTask(d *ddlCtx, task *reorgBackfillTask, if taskCtx.done { break } + + if isDistReorg { + // TODO: Adjust the updating lease frequency by batch processing time carefully. + if time.Since(batchStartTime) < updateInstanceLease { + continue + } + batchStartTime = time.Now() + if err := w.updateLease(w.GetCtx().uuid, task.bfJob, result.nextKey); err != nil { + logutil.BgLogger().Info("[ddl] backfill worker handle task, update lease failed", zap.Stringer("worker", w), + zap.Stringer("task", task), zap.String("backfill job", task.bfJob.AbbrStr()), zap.Error(err)) + result.err = err + return result + } + } } logutil.BgLogger().Info("[ddl] backfill worker finish task", - zap.Stringer("type", w.tp), - zap.Int("workerID", w.id), - zap.String("task", task.String()), - zap.Int("addedCount", result.addedCount), - zap.Int("scanCount", result.scanCount), - zap.String("nextHandle", tryDecodeToHandleString(result.nextKey)), - zap.String("takeTime", time.Since(startTime).String())) + zap.Stringer("worker", w), zap.Stringer("task", task), + zap.Int("added count", result.addedCount), + zap.Int("scan count", result.scanCount), + zap.String("next key", hex.EncodeToString(result.nextKey)), + zap.Stringer("take time", time.Since(startTime))) if ResultCounterForTest != nil && result.err == nil { ResultCounterForTest.Add(1) } return result } +func (w *backfillWorker) initPartitionIndexInfo(task *reorgBackfillTask) { + if pt, ok := w.GetCtx().table.(table.PartitionedTable); ok { + if addIdxWorker, ok := w.backfiller.(*addIndexWorker); ok { + indexInfo := model.FindIndexInfoByID(pt.Meta().Indices, task.bfJob.EleID) + addIdxWorker.index = tables.NewIndex(task.bfJob.PhysicalTableID, pt.Meta(), indexInfo) + } + } +} + +func (w *backfillWorker) runTask(task *reorgBackfillTask) (result *backfillResult) { + logutil.BgLogger().Info("[ddl] backfill worker start", zap.Stringer("worker", w), zap.String("task", task.String())) + defer util.Recover(metrics.LabelDDL, "backfillWorker.runTask", func() { + result = &backfillResult{taskID: task.id, err: dbterror.ErrReorgPanic} + }, false) + defer w.GetCtx().setDDLLabelForTopSQL(task.jobID, task.sqlQuery) + + failpoint.Inject("mockBackfillRunErr", func() { + if w.GetCtx().id == 0 { + result := &backfillResult{taskID: task.id, addedCount: 0, nextKey: nil, err: errors.Errorf("mock backfill error")} + failpoint.Return(result) + } + }) + failpoint.Inject("mockHighLoadForAddIndex", func() { + sqlPrefixes := []string{"alter"} + topsql.MockHighCPULoad(task.sqlQuery, sqlPrefixes, 5) + }) + failpoint.Inject("mockBackfillSlow", func() { + time.Sleep(100 * time.Millisecond) + }) + + // Change the batch size dynamically. + w.GetCtx().batchCnt = int(variable.GetDDLReorgBatchSize()) + result = w.handleBackfillTask(w.GetCtx().ddlCtx, task, w.backfiller) + task.bfJob.Meta.RowCount = int64(result.addedCount) + if result.err != nil { + logutil.BgLogger().Warn("[ddl] backfill worker runTask failed", + zap.Stringer("worker", w), zap.String("backfillJob", task.bfJob.AbbrStr()), zap.Error(result.err)) + if dbterror.ErrDDLJobNotFound.Equal(result.err) { + result.err = nil + return result + } + task.bfJob.State = model.JobStateCancelled + task.bfJob.Meta.Error = toTError(result.err) + if err := w.finishJob(task.bfJob); err != nil { + logutil.BgLogger().Info("[ddl] backfill worker runTask, finishJob failed", + zap.Stringer("worker", w), zap.String("backfillJob", task.bfJob.AbbrStr()), zap.Error(err)) + result.err = err + } + } else { + task.bfJob.State = model.JobStateDone + result.err = w.finishJob(task.bfJob) + } + return result +} + func (w *backfillWorker) run(d *ddlCtx, bf backfiller, job *model.Job) { - logutil.BgLogger().Info("[ddl] backfill worker start", - zap.Stringer("type", w.tp), - zap.Int("workerID", w.id)) + logutil.BgLogger().Info("[ddl] backfill worker start", zap.Stringer("worker", w)) var curTaskID int defer util.Recover(metrics.LabelDDL, "backfillWorker.run", func() { w.resultCh <- &backfillResult{taskID: curTaskID, err: dbterror.ErrReorgPanic} }, false) for { if util.HasCancelled(w.ctx) { - logutil.BgLogger().Info("[ddl] backfill worker exit on context done", - zap.Stringer("type", w.tp), zap.Int("workerID", w.id)) + logutil.BgLogger().Info("[ddl] backfill worker exit on context done", zap.Stringer("worker", w)) return } task, more := <-w.taskCh if !more { - logutil.BgLogger().Info("[ddl] backfill worker exit", - zap.Stringer("type", w.tp), zap.Int("workerID", w.id)) + logutil.BgLogger().Info("[ddl] backfill worker exit", zap.Stringer("worker", w)) return } curTaskID = task.id - d.setDDLLabelForTopSQL(job) + d.setDDLLabelForTopSQL(job.ID, job.Query) - logutil.BgLogger().Debug("[ddl] backfill worker got task", zap.Int("workerID", w.id), zap.String("task", task.String())) + logutil.BgLogger().Debug("[ddl] backfill worker got task", zap.Int("workerID", w.GetCtx().id), zap.String("task", task.String())) failpoint.Inject("mockBackfillRunErr", func() { - if w.id == 0 { + if w.GetCtx().id == 0 { result := &backfillResult{taskID: task.id, addedCount: 0, nextKey: nil, err: errors.Errorf("mock backfill error")} w.resultCh <- result failpoint.Continue() @@ -339,20 +533,25 @@ func (w *backfillWorker) run(d *ddlCtx, bf backfiller, job *model.Job) { }) // Change the batch size dynamically. - w.batchCnt = int(variable.GetDDLReorgBatchSize()) + w.GetCtx().batchCnt = int(variable.GetDDLReorgBatchSize()) result := w.handleBackfillTask(d, task, bf) w.resultCh <- result + if result.err != nil { + logutil.BgLogger().Info("[ddl] backfill worker exit on error", + zap.Stringer("worker", w), zap.Error(result.err)) + return + } } } // splitTableRanges uses PD region's key ranges to split the backfilling table key range space, // to speed up backfilling data in table with disperse handle. // The `t` should be a non-partitioned table or a partition. -func splitTableRanges(t table.PhysicalTable, store kv.Storage, startKey, endKey kv.Key) ([]kv.KeyRange, error) { +func splitTableRanges(t table.PhysicalTable, store kv.Storage, startKey, endKey kv.Key, limit int) ([]kv.KeyRange, error) { logutil.BgLogger().Info("[ddl] split table range from PD", zap.Int64("physicalTableID", t.GetPhysicalID()), - zap.String("startHandle", tryDecodeToHandleString(startKey)), - zap.String("endHandle", tryDecodeToHandleString(endKey))) + zap.String("start key", hex.EncodeToString(startKey)), + zap.String("end key", hex.EncodeToString(endKey))) kvRange := kv.KeyRange{StartKey: startKey, EndKey: endKey} s, ok := store.(tikv.Storage) if !ok { @@ -363,7 +562,7 @@ func splitTableRanges(t table.PhysicalTable, store kv.Storage, startKey, endKey maxSleep := 10000 // ms bo := backoff.NewBackofferWithVars(context.Background(), maxSleep, nil) rc := copr.NewRegionCache(s.GetRegionCache()) - ranges, err := rc.SplitRegionRanges(bo, []kv.KeyRange{kvRange}) + ranges, err := rc.SplitRegionRanges(bo, []kv.KeyRange{kvRange}, limit) if err != nil { return nil, errors.Trace(err) } @@ -428,6 +627,9 @@ func (dc *ddlCtx) sendTasksAndWait(scheduler *backfillScheduler, totalAddedCount batchTasks []*reorgBackfillTask) error { reorgInfo := scheduler.reorgInfo for _, task := range batchTasks { + if scheduler.copReqSenderPool != nil { + scheduler.copReqSenderPool.sendTask(task) + } scheduler.taskCh <- task } @@ -436,77 +638,48 @@ func (dc *ddlCtx) sendTasksAndWait(scheduler *backfillScheduler, totalAddedCount nextKey, taskAddedCount, err := waitTaskResults(scheduler, batchTasks, totalAddedCount) elapsedTime := time.Since(startTime) if err == nil { - err = dc.isReorgRunnable(reorgInfo.Job) + err = dc.isReorgRunnable(reorgInfo.Job.ID, false) } + // Update the reorg handle that has been processed. + err1 := reorgInfo.UpdateReorgMeta(nextKey, scheduler.sessPool) + if err != nil { - // Update the reorg handle that has been processed. - err1 := reorgInfo.UpdateReorgMeta(nextKey, scheduler.sessPool) metrics.BatchAddIdxHistogram.WithLabelValues(metrics.LblError).Observe(elapsedTime.Seconds()) logutil.BgLogger().Warn("[ddl] backfill worker handle batch tasks failed", - zap.ByteString("elementType", reorgInfo.currElement.TypeKey), - zap.Int64("elementID", reorgInfo.currElement.ID), - zap.Int64("totalAddedCount", *totalAddedCount), - zap.String("startHandle", tryDecodeToHandleString(startKey)), - zap.String("nextHandle", tryDecodeToHandleString(nextKey)), - zap.Int64("batchAddedCount", taskAddedCount), - zap.String("taskFailedError", err.Error()), - zap.String("takeTime", elapsedTime.String()), + + zap.Int64("total added count", *totalAddedCount), + zap.String("start key", hex.EncodeToString(startKey)), + zap.String("next key", hex.EncodeToString(nextKey)), + zap.Int64("batch added count", taskAddedCount), + zap.String("task failed error", err.Error()), + zap.String("take time", elapsedTime.String()), zap.NamedError("updateHandleError", err1)) + failpoint.Inject("MockGetIndexRecordErr", func() { + // Make sure this job didn't failed because by the "Write conflict" error. + if dbterror.ErrNotOwner.Equal(err) { + time.Sleep(50 * time.Millisecond) + } + }) return errors.Trace(err) } - // nextHandle will be updated periodically in runReorgJob, so no need to update it here. - dc.getReorgCtx(reorgInfo.Job).setNextKey(nextKey) + dc.getReorgCtx(reorgInfo.Job.ID).setNextKey(nextKey) metrics.BatchAddIdxHistogram.WithLabelValues(metrics.LblOK).Observe(elapsedTime.Seconds()) logutil.BgLogger().Info("[ddl] backfill workers successfully processed batch", - zap.ByteString("elementType", reorgInfo.currElement.TypeKey), - zap.Int64("elementID", reorgInfo.currElement.ID), - zap.Int64("totalAddedCount", *totalAddedCount), - zap.String("startHandle", tryDecodeToHandleString(startKey)), - zap.String("nextHandle", tryDecodeToHandleString(nextKey)), - zap.Int64("batchAddedCount", taskAddedCount), - zap.String("takeTime", elapsedTime.String())) + zap.Stringer("element", reorgInfo.currElement), + zap.Int64("total added count", *totalAddedCount), + zap.String("start key", hex.EncodeToString(startKey)), + zap.String("next key", hex.EncodeToString(nextKey)), + zap.Int64("batch added count", taskAddedCount), + zap.String("take time", elapsedTime.String()), + zap.NamedError("updateHandleError", err1)) return nil } -func tryDecodeToHandleString(key kv.Key) string { - defer func() { - if r := recover(); r != nil { - logutil.BgLogger().Warn("tryDecodeToHandleString panic", - zap.Any("recover()", r), - zap.Binary("key", key)) - } - }() - handle, err := tablecodec.DecodeRowKey(key) - if err != nil { - recordPrefixIdx := bytes.Index(key, []byte("_r")) - if recordPrefixIdx == -1 { - return fmt.Sprintf("key: %x", key) - } - handleBytes := key[recordPrefixIdx+2:] - terminatedWithZero := len(handleBytes) > 0 && handleBytes[len(handleBytes)-1] == 0 - if terminatedWithZero { - handle, err := tablecodec.DecodeRowKey(key[:len(key)-1]) - if err == nil { - return handle.String() + ".next" - } - } - return fmt.Sprintf("%x", handleBytes) - } - return handle.String() -} - -// handleRangeTasks sends tasks to workers, and returns remaining kvRanges that is not handled. -func (dc *ddlCtx) handleRangeTasks(scheduler *backfillScheduler, t table.Table, - totalAddedCount *int64, kvRanges []kv.KeyRange) ([]kv.KeyRange, error) { - batchTasks := make([]*reorgBackfillTask, 0, backfillTaskChanSize) - reorgInfo := scheduler.reorgInfo - physicalTableID := reorgInfo.PhysicalTableID +func getBatchTasks(t table.Table, reorgInfo *reorgInfo, kvRanges []kv.KeyRange, batch int) []*reorgBackfillTask { + batchTasks := make([]*reorgBackfillTask, 0, batch) var prefix kv.Key - if tbl, ok := t.(table.PartitionedTable); ok { - t = tbl.GetPartition(physicalTableID) - } if reorgInfo.mergingTmpIdx { prefix = t.IndexPrefix() } else { @@ -514,31 +687,49 @@ func (dc *ddlCtx) handleRangeTasks(scheduler *backfillScheduler, t table.Table, } // Build reorg tasks. job := reorgInfo.Job + //nolint:forcetypeassert + phyTbl := t.(table.PhysicalTable) + jobCtx := reorgInfo.d.jobContext(job.ID) for i, keyRange := range kvRanges { + startKey := keyRange.StartKey endKey := keyRange.EndKey - endK, err := getRangeEndKey(scheduler.jobCtx, dc.store, job.Priority, prefix, keyRange.StartKey, endKey) + endK, err := getRangeEndKey(jobCtx, reorgInfo.d.store, job.Priority, prefix, keyRange.StartKey, endKey) if err != nil { - logutil.BgLogger().Info("[ddl] send range task to workers, get reverse key failed", zap.Error(err)) + logutil.BgLogger().Info("[ddl] get backfill range task, get reverse key failed", zap.Error(err)) } else { - logutil.BgLogger().Info("[ddl] send range task to workers, change end key", + logutil.BgLogger().Info("[ddl] get backfill range task, change end key", zap.Int64("pTbl", phyTbl.GetPhysicalID()), zap.String("end key", hex.EncodeToString(endKey)), zap.String("current end key", hex.EncodeToString(endK))) endKey = endK } + if len(startKey) == 0 { + startKey = prefix + } + if len(endKey) == 0 { + endKey = prefix.PrefixNext() + } task := &reorgBackfillTask{ - id: i, - physicalTableID: physicalTableID, - startKey: keyRange.StartKey, - endKey: endKey, + id: i, + jobID: reorgInfo.Job.ID, + physicalTable: phyTbl, + priority: reorgInfo.Priority, + startKey: startKey, + endKey: endKey, // If the boundaries overlap, we should ignore the preceding endKey. endInclude: endK.Cmp(keyRange.EndKey) != 0 || i == len(kvRanges)-1} batchTasks = append(batchTasks, task) - if len(batchTasks) >= backfillTaskChanSize { + if len(batchTasks) >= batch { break } } + return batchTasks +} +// handleRangeTasks sends tasks to workers, and returns remaining kvRanges that is not handled. +func (dc *ddlCtx) handleRangeTasks(scheduler *backfillScheduler, t table.PhysicalTable, + totalAddedCount *int64, kvRanges []kv.KeyRange) ([]kv.KeyRange, error) { + batchTasks := getBatchTasks(t, scheduler.reorgInfo, kvRanges, backfillTaskChanSize) if len(batchTasks) == 0 { return nil, nil } @@ -577,8 +768,7 @@ func loadDDLReorgVars(ctx context.Context, sessPool *sessionPool) error { return ddlutil.LoadDDLReorgVars(ctx, sCtx) } -func makeupDecodeColMap(sessCtx sessionctx.Context, t table.Table) (map[int64]decoder.Column, error) { - dbName := model.NewCIStr(sessCtx.GetSessionVars().CurrentDB) +func makeupDecodeColMap(sessCtx sessionctx.Context, dbName model.CIStr, t table.Table) (map[int64]decoder.Column, error) { writableColInfos := make([]*model.ColumnInfo, 0, len(t.WritableCols())) for _, col := range t.WritableCols() { writableColInfos = append(writableColInfos, col.ColumnInfo) @@ -594,11 +784,16 @@ func makeupDecodeColMap(sessCtx sessionctx.Context, t table.Table) (map[int64]de return decodeColMap, nil } -func setSessCtxLocation(sctx sessionctx.Context, info *reorgInfo) error { +func setSessCtxLocation(sctx sessionctx.Context, tzLocation *model.TimeZoneLocation) error { // It is set to SystemLocation to be compatible with nil LocationInfo. - *sctx.GetSessionVars().TimeZone = *timeutil.SystemLocation() - if info.ReorgMeta.Location != nil { - loc, err := info.ReorgMeta.Location.GetLocation() + tz := *timeutil.SystemLocation() + if sctx.GetSessionVars().TimeZone == nil { + sctx.GetSessionVars().TimeZone = &tz + } else { + *sctx.GetSessionVars().TimeZone = tz + } + if tzLocation != nil { + loc, err := tzLocation.GetLocation() if err != nil { return errors.Trace(err) } @@ -611,7 +806,7 @@ type backfillScheduler struct { ctx context.Context reorgInfo *reorgInfo sessPool *sessionPool - tp backfillWorkerType + tp backfillerType tbl table.PhysicalTable decodeColMap map[int64]decoder.Column jobCtx *JobContext @@ -621,12 +816,14 @@ type backfillScheduler struct { taskCh chan *reorgBackfillTask resultCh chan *backfillResult + + copReqSenderPool *copReqSenderPool // for add index in ingest way. } const backfillTaskChanSize = 1024 func newBackfillScheduler(ctx context.Context, info *reorgInfo, sessPool *sessionPool, - tp backfillWorkerType, tbl table.PhysicalTable, decColMap map[int64]decoder.Column, + tp backfillerType, tbl table.PhysicalTable, decColMap map[int64]decoder.Column, jobCtx *JobContext) *backfillScheduler { return &backfillScheduler{ ctx: ctx, @@ -645,15 +842,26 @@ func newBackfillScheduler(ctx context.Context, info *reorgInfo, sessPool *sessio func (b *backfillScheduler) newSessCtx() (sessionctx.Context, error) { reorgInfo := b.reorgInfo sessCtx := newContext(reorgInfo.d.store) + if err := initSessCtx(sessCtx, reorgInfo.ReorgMeta.SQLMode, reorgInfo.ReorgMeta.Location); err != nil { + return nil, errors.Trace(err) + } + return sessCtx, nil +} + +func initSessCtx(sessCtx sessionctx.Context, sqlMode mysql.SQLMode, tzLocation *model.TimeZoneLocation) error { + // Unify the TimeZone settings in newContext. + if sessCtx.GetSessionVars().StmtCtx.TimeZone == nil { + tz := *time.UTC + sessCtx.GetSessionVars().StmtCtx.TimeZone = &tz + } sessCtx.GetSessionVars().StmtCtx.IsDDLJobInQueue = true // Set the row encode format version. rowFormat := variable.GetDDLReorgRowFormat() sessCtx.GetSessionVars().RowEncoder.Enable = rowFormat != variable.DefTiDBRowFormatV1 // Simulate the sql mode environment in the worker sessionCtx. - sqlMode := reorgInfo.ReorgMeta.SQLMode sessCtx.GetSessionVars().SQLMode = sqlMode - if err := setSessCtxLocation(sessCtx, reorgInfo); err != nil { - return nil, errors.Trace(err) + if err := setSessCtxLocation(sessCtx, tzLocation); err != nil { + return errors.Trace(err) } sessCtx.GetSessionVars().StmtCtx.BadNullAsWarning = !sqlMode.HasStrictMode() sessCtx.GetSessionVars().StmtCtx.TruncateAsWarning = !sqlMode.HasStrictMode() @@ -662,7 +870,10 @@ func (b *backfillScheduler) newSessCtx() (sessionctx.Context, error) { sessCtx.GetSessionVars().StmtCtx.DividedByZeroAsWarning = !sqlMode.HasStrictMode() sessCtx.GetSessionVars().StmtCtx.IgnoreZeroInDate = !sqlMode.HasStrictMode() || sqlMode.HasAllowInvalidDatesMode() sessCtx.GetSessionVars().StmtCtx.NoZeroDate = sqlMode.HasStrictMode() - return sessCtx, nil + // Prevent initializing the mock context in the workers concurrently. + // For details, see https://github.com/pingcap/tidb/issues/40879. + _ = sessCtx.GetDomainInfoSchema() + return nil } func (b *backfillScheduler) setMaxWorkerSize(maxSize int) { @@ -674,6 +885,7 @@ func (b *backfillScheduler) workerSize() int { } func (b *backfillScheduler) adjustWorkerSize() error { + b.initCopReqSenderPool() reorgInfo := b.reorgInfo job := reorgInfo.Job jc := b.jobCtx @@ -681,7 +893,11 @@ func (b *backfillScheduler) adjustWorkerSize() error { logutil.BgLogger().Error("[ddl] load DDL reorganization variable failed", zap.Error(err)) } workerCnt := int(variable.GetDDLReorgWorkerCounter()) - workerCnt = mathutil.Min(workerCnt, b.maxSize) + if b.copReqSenderPool != nil { + workerCnt = mathutil.Min(workerCnt/2+1, b.maxSize) + } else { + workerCnt = mathutil.Min(workerCnt, b.maxSize) + } // Increase the worker. for i := len(b.workers); i < workerCnt; i++ { sessCtx, err := b.newSessCtx() @@ -694,22 +910,40 @@ func (b *backfillScheduler) adjustWorkerSize() error { ) switch b.tp { case typeAddIndexWorker: - idxWorker, err := newAddIndexWorker(sessCtx, i, b.tbl, b.decodeColMap, reorgInfo, jc, job) + backfillCtx := newBackfillCtx(reorgInfo.d, i, sessCtx, reorgInfo.ReorgMeta.ReorgTp, job.SchemaName, b.tbl) + idxWorker, err := newAddIndexWorker(b.decodeColMap, b.tbl, backfillCtx, + jc, job.ID, reorgInfo.currElement.ID, reorgInfo.currElement.TypeKey) if err != nil { - return errors.Trace(err) + if canSkipError(b.reorgInfo.ID, len(b.workers), err) { + continue + } + return err } - worker, runner = idxWorker, idxWorker.backfillWorker + idxWorker.copReqSenderPool = b.copReqSenderPool + runner = newBackfillWorker(jc.ddlJobCtx, idxWorker) + worker = idxWorker case typeAddIndexMergeTmpWorker: - tmpIdxWorker := newMergeTempIndexWorker(sessCtx, i, b.tbl, reorgInfo, jc) - worker, runner = tmpIdxWorker, tmpIdxWorker.backfillWorker + backfillCtx := newBackfillCtx(reorgInfo.d, i, sessCtx, reorgInfo.ReorgMeta.ReorgTp, job.SchemaName, b.tbl) + tmpIdxWorker := newMergeTempIndexWorker(backfillCtx, i, b.tbl, reorgInfo.currElement.ID, jc) + runner = newBackfillWorker(jc.ddlJobCtx, tmpIdxWorker) + worker = tmpIdxWorker case typeUpdateColumnWorker: // Setting InCreateOrAlterStmt tells the difference between SELECT casting and ALTER COLUMN casting. sessCtx.GetSessionVars().StmtCtx.InCreateOrAlterStmt = true updateWorker := newUpdateColumnWorker(sessCtx, i, b.tbl, b.decodeColMap, reorgInfo, jc) - worker, runner = updateWorker, updateWorker.backfillWorker + runner = newBackfillWorker(jc.ddlJobCtx, updateWorker) + worker = updateWorker case typeCleanUpIndexWorker: idxWorker := newCleanUpIndexWorker(sessCtx, i, b.tbl, b.decodeColMap, reorgInfo, jc) - worker, runner = idxWorker, idxWorker.backfillWorker + runner = newBackfillWorker(jc.ddlJobCtx, idxWorker) + worker = idxWorker + case typeReorgPartitionWorker: + partWorker, err := newReorgPartitionWorker(sessCtx, i, b.tbl, b.decodeColMap, reorgInfo, jc) + if err != nil { + return err + } + runner = newBackfillWorker(jc.ddlJobCtx, partWorker) + worker = partWorker default: return errors.New("unknown backfill type") } @@ -724,10 +958,51 @@ func (b *backfillScheduler) adjustWorkerSize() error { b.workers = b.workers[:workerCnt] closeBackfillWorkers(workers) } - return injectCheckBackfillWorkerNum(len(b.workers)) + if b.copReqSenderPool != nil { + b.copReqSenderPool.adjustSize(len(b.workers)) + } + return injectCheckBackfillWorkerNum(len(b.workers), b.tp == typeAddIndexMergeTmpWorker) +} + +func (b *backfillScheduler) initCopReqSenderPool() { + if b.tp != typeAddIndexWorker || b.reorgInfo.Job.ReorgMeta.ReorgTp != model.ReorgTypeLitMerge || + b.copReqSenderPool != nil || len(b.workers) > 0 { + return + } + indexInfo := model.FindIndexInfoByID(b.tbl.Meta().Indices, b.reorgInfo.currElement.ID) + if indexInfo == nil { + logutil.BgLogger().Warn("[ddl-ingest] cannot init cop request sender", + zap.Int64("table ID", b.tbl.Meta().ID), zap.Int64("index ID", b.reorgInfo.currElement.ID)) + return + } + sessCtx, err := b.newSessCtx() + if err != nil { + logutil.BgLogger().Warn("[ddl-ingest] cannot init cop request sender", zap.Error(err)) + return + } + copCtx, err := newCopContext(b.tbl.Meta(), indexInfo, sessCtx) + if err != nil { + logutil.BgLogger().Warn("[ddl-ingest] cannot init cop request sender", zap.Error(err)) + return + } + b.copReqSenderPool = newCopReqSenderPool(b.ctx, copCtx, sessCtx.GetStore()) +} + +func canSkipError(jobID int64, workerCnt int, err error) bool { + if workerCnt > 0 { + // The error can be skipped because the rest workers can handle the tasks. + return true + } + logutil.BgLogger().Warn("[ddl] create add index backfill worker failed", + zap.Int("current worker count", workerCnt), + zap.Int64("job ID", jobID), zap.Error(err)) + return false } func (b *backfillScheduler) Close() { + if b.copReqSenderPool != nil { + b.copReqSenderPool.close() + } closeBackfillWorkers(b.workers) close(b.taskCh) close(b.resultCh) @@ -748,18 +1023,18 @@ func (b *backfillScheduler) Close() { // // The above operations are completed in a transaction. // Finally, update the concurrent processing of the total number of rows, and store the completed handle value. -func (dc *ddlCtx) writePhysicalTableRecord(sessPool *sessionPool, t table.PhysicalTable, bfWorkerType backfillWorkerType, reorgInfo *reorgInfo) error { +func (dc *ddlCtx) writePhysicalTableRecord(sessPool *sessionPool, t table.PhysicalTable, bfWorkerType backfillerType, reorgInfo *reorgInfo) error { job := reorgInfo.Job totalAddedCount := job.GetRowCount() startKey, endKey := reorgInfo.StartKey, reorgInfo.EndKey sessCtx := newContext(reorgInfo.d.store) - decodeColMap, err := makeupDecodeColMap(sessCtx, t) + decodeColMap, err := makeupDecodeColMap(sessCtx, reorgInfo.dbInfo.Name, t) if err != nil { return errors.Trace(err) } - if err := dc.isReorgRunnable(reorgInfo.Job); err != nil { + if err := dc.isReorgRunnable(reorgInfo.Job.ID, false); err != nil { return errors.Trace(err) } if startKey == nil && endKey == nil { @@ -773,12 +1048,21 @@ func (dc *ddlCtx) writePhysicalTableRecord(sessPool *sessionPool, t table.Physic } }) - jc := dc.jobContext(job) + jc := dc.jobContext(job.ID) scheduler := newBackfillScheduler(dc.ctx, reorgInfo, sessPool, bfWorkerType, t, decodeColMap, jc) defer scheduler.Close() + var ingestBeCtx *ingest.BackendContext + if bfWorkerType == typeAddIndexWorker && job.ReorgMeta.ReorgTp == model.ReorgTypeLitMerge { + if bc, ok := ingest.LitBackCtxMgr.Load(job.ID); ok { + ingestBeCtx = bc + } else { + return errors.New(ingest.LitErrGetBackendFail) + } + } + for { - kvRanges, err := splitTableRanges(t, reorgInfo.d.store, startKey, endKey) + kvRanges, err := splitTableRanges(t, reorgInfo.d.store, startKey, endKey, backfillTaskChanSize) if err != nil { return errors.Trace(err) } @@ -795,14 +1079,11 @@ func (dc *ddlCtx) writePhysicalTableRecord(sessPool *sessionPool, t table.Physic zap.Int("regionCnt", len(kvRanges)), zap.String("startKey", hex.EncodeToString(startKey)), zap.String("endKey", hex.EncodeToString(endKey))) - if bfWorkerType == typeAddIndexWorker && job.ReorgMeta.ReorgTp == model.ReorgTypeLitMerge { - if bc, ok := ingest.LitBackCtxMgr.Load(job.ID); ok { - err := bc.Flush(reorgInfo.currElement.ID) - if err != nil { - return errors.Trace(err) - } - } else { - return errors.New(ingest.LitErrGetBackendFail) + + if ingestBeCtx != nil { + err := ingestBeCtx.Flush(reorgInfo.currElement.ID) + if err != nil { + return errors.Trace(err) } } remains, err := dc.handleRangeTasks(scheduler, t, &totalAddedCount, kvRanges) @@ -811,6 +1092,9 @@ func (dc *ddlCtx) writePhysicalTableRecord(sessPool *sessionPool, t table.Physic } if len(remains) == 0 { + if ingestBeCtx != nil { + ingestBeCtx.EngMgr.ResetWorkers(ingestBeCtx, job.ID, reorgInfo.currElement.ID) + } break } startKey = remains[0].StartKey @@ -818,7 +1102,10 @@ func (dc *ddlCtx) writePhysicalTableRecord(sessPool *sessionPool, t table.Physic return nil } -func injectCheckBackfillWorkerNum(curWorkerSize int) error { +func injectCheckBackfillWorkerNum(curWorkerSize int, isMergeWorker bool) error { + if isMergeWorker { + return nil + } failpoint.Inject("checkBackfillWorkerNum", func(val failpoint.Value) { //nolint:forcetypeassert if val.(bool) { @@ -837,6 +1124,100 @@ func injectCheckBackfillWorkerNum(curWorkerSize int) error { return nil } +func addBatchBackfillJobs(sess *session, reorgInfo *reorgInfo, sJobCtx *splitJobContext, phyTblID int64, notDistTask bool, + batchTasks []*reorgBackfillTask, bJobs []*BackfillJob) error { + bJobs = bJobs[:0] + instanceID := "" + if notDistTask { + instanceID = reorgInfo.d.uuid + } + + // TODO: Adjust the number of ranges(region) for each task. + for _, task := range batchTasks { + bm := &model.BackfillMeta{ + IsUnique: sJobCtx.isUnique, + EndInclude: task.endInclude, + ReorgTp: reorgInfo.Job.ReorgMeta.ReorgTp, + SQLMode: reorgInfo.ReorgMeta.SQLMode, + Location: reorgInfo.ReorgMeta.Location, + JobMeta: &model.JobMeta{ + SchemaID: reorgInfo.Job.SchemaID, + TableID: reorgInfo.Job.TableID, + Type: reorgInfo.Job.Type, + Query: reorgInfo.Job.Query, + }, + StartKey: task.startKey, + EndKey: task.endKey, + } + bj := &BackfillJob{ + ID: sJobCtx.currBackfillJobID.Add(1), + JobID: reorgInfo.Job.ID, + EleID: reorgInfo.currElement.ID, + EleKey: reorgInfo.currElement.TypeKey, + PhysicalTableID: phyTblID, + Tp: sJobCtx.bfWorkerType, + State: model.JobStateNone, + InstanceID: instanceID, + Meta: bm, + } + bj.Meta.CurrKey = task.startKey + bJobs = append(bJobs, bj) + } + if err := AddBackfillJobs(sess, bJobs); err != nil { + return errors.Trace(err) + } + return nil +} + +func (dc *ddlCtx) splitTableToBackfillJobs(sess *session, reorgInfo *reorgInfo, sJobCtx *splitJobContext, pTblMeta *BackfillJobRangeMeta) error { + isFirstOps := !sJobCtx.isMultiPhyTbl + batchSize := sJobCtx.batchSize + startKey, endKey := pTblMeta.StartKey, pTblMeta.EndKey + bJobs := make([]*BackfillJob, 0, batchSize) + for { + kvRanges, err := splitTableRanges(pTblMeta.PhyTbl, reorgInfo.d.store, startKey, endKey, batchSize) + if err != nil { + return errors.Trace(err) + } + batchTasks := getBatchTasks(pTblMeta.PhyTbl, reorgInfo, kvRanges, batchSize) + if len(batchTasks) == 0 { + break + } + notNeedDistProcess := isFirstOps && (len(kvRanges) < minDistTaskCnt) + if err = addBatchBackfillJobs(sess, reorgInfo, sJobCtx, pTblMeta.PhyTblID, notNeedDistProcess, batchTasks, bJobs); err != nil { + return errors.Trace(err) + } + isFirstOps = false + + remains := kvRanges[len(batchTasks):] + dc.asyncNotifyWorker(dc.backfillJobCh, addingBackfillJob, reorgInfo.Job.ID, "backfill_job") + logutil.BgLogger().Info("[ddl] split backfill jobs to the backfill table", + zap.Int64("physicalID", pTblMeta.PhyTblID), + zap.Int("batchTasksCnt", len(batchTasks)), + zap.Int("totalRegionCnt", len(kvRanges)), + zap.Int("remainRegionCnt", len(remains)), + zap.String("startHandle", hex.EncodeToString(startKey)), + zap.String("endHandle", hex.EncodeToString(endKey))) + + if len(remains) == 0 { + break + } + + for { + bJobCnt, err := checkBackfillJobCount(sess, reorgInfo.Job.ID, reorgInfo.currElement.ID, reorgInfo.currElement.TypeKey, pTblMeta.PhyTblID) + if err != nil { + return errors.Trace(err) + } + if bJobCnt < sJobCtx.minBatchSize { + break + } + time.Sleep(RetrySQLInterval) + } + startKey = remains[0].StartKey + } + return nil +} + // recordIterFunc is used for low-level record iteration. type recordIterFunc func(h kv.Handle, rowKey kv.Key, rawRecord []byte) (more bool, err error) diff --git a/ddl/cancel_test.go b/ddl/cancel_test.go index cd446f3441baf..3f02029ffced7 100644 --- a/ddl/cancel_test.go +++ b/ddl/cancel_test.go @@ -22,6 +22,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/testkit" @@ -149,8 +150,8 @@ var allTestCase = []testCancelJob{ {"alter table t modify column c11 char(10)", true, model.StateWriteReorganization, true, true, nil}, {"alter table t modify column c11 char(10)", false, model.StatePublic, false, true, nil}, // Add foreign key. - {"alter table t add constraint fk foreign key a(c1) references t_ref(c1)", true, model.StateNone, true, false, []string{"create table t_ref (c1 int, c2 int, c3 int, c11 tinyint);"}}, - {"alter table t add constraint fk foreign key a(c1) references t_ref(c1)", false, model.StatePublic, false, true, nil}, + {"alter table t add constraint fk foreign key a(c1) references t_ref(c1)", true, model.StateNone, true, false, []string{"create table t_ref (c1 int key, c2 int, c3 int, c11 tinyint);"}}, + {"alter table t add constraint fk foreign key a(c1) references t_ref(c1)", false, model.StatePublic, false, true, []string{"insert into t_ref (c1) select c1 from t;"}}, // Drop foreign key. {"alter table t drop foreign key fk", true, model.StatePublic, true, false, nil}, {"alter table t drop foreign key fk", false, model.StateNone, false, true, nil}, @@ -264,7 +265,7 @@ func TestCancel(t *testing.T) { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockBackfillSlow")) }() - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} i := atomicutil.NewInt64(0) cancel := atomicutil.NewBool(false) cancelResult := atomicutil.NewBool(false) @@ -282,12 +283,12 @@ func TestCancel(t *testing.T) { } dom.DDL().SetHook(hook.Clone()) - restHook := func(h *ddl.TestDDLCallback) { + restHook := func(h *callback.TestDDLCallback) { h.OnJobRunBeforeExported = nil h.OnJobUpdatedExported.Store(nil) dom.DDL().SetHook(h.Clone()) } - registHook := func(h *ddl.TestDDLCallback, onJobRunBefore bool) { + registHook := func(h *callback.TestDDLCallback, onJobRunBefore bool) { if onJobRunBefore { h.OnJobRunBeforeExported = hookFunc } else { diff --git a/ddl/cluster.go b/ddl/cluster.go index ebb833156cec2..ea0567dfb9c73 100644 --- a/ddl/cluster.go +++ b/ddl/cluster.go @@ -24,10 +24,10 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" + "github.com/pingcap/kvproto/pkg/errorpb" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/domain/infosync" - "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" @@ -50,11 +50,7 @@ import ( ) var pdScheduleKey = []string{ - "hot-region-schedule-limit", - "leader-schedule-limit", "merge-schedule-limit", - "region-schedule-limit", - "replica-schedule-limit", } const ( @@ -68,7 +64,10 @@ const ( autoAnalyzeOffset readOnlyOffset totalLockedRegionsOffset + startTSOffset commitTSOffset + ttlJobEnableOffSet + keyRangesOffset ) func closePDSchedule() error { @@ -99,6 +98,16 @@ func recoverPDSchedule(pdScheduleParam map[string]interface{}) error { return infosync.SetPDScheduleConfig(context.Background(), pdScheduleParam) } +func getStoreGlobalMinSafeTS(s kv.Storage) time.Time { + minSafeTS := s.GetMinSafeTS(kv.GlobalTxnScope) + // Inject mocked SafeTS for test. + failpoint.Inject("injectSafeTS", func(val failpoint.Value) { + injectTS := val.(int) + minSafeTS = uint64(injectTS) + }) + return oracle.GetTimeFromTS(minSafeTS) +} + // ValidateFlashbackTS validates that flashBackTS in range [gcSafePoint, currentTS). func ValidateFlashbackTS(ctx context.Context, sctx sessionctx.Context, flashBackTS uint64) error { currentTS, err := sctx.GetStore().GetOracle().GetStaleTimestamp(ctx, oracle.GlobalTxnScope, 0) @@ -111,12 +120,34 @@ func ValidateFlashbackTS(ctx context.Context, sctx sessionctx.Context, flashBack } currentTS = currentVer.Ver } - if oracle.GetTimeFromTS(flashBackTS).After(oracle.GetTimeFromTS(currentTS)) { + oracleFlashbackTS := oracle.GetTimeFromTS(flashBackTS) + if oracleFlashbackTS.After(oracle.GetTimeFromTS(currentTS)) { return errors.Errorf("cannot set flashback timestamp to future time") } - if oracle.GetTimeFromTS(flashBackTS).After(expression.GetMinSafeTime(sctx)) { - return errors.Errorf("cannot set flashback timestamp to too close to present time") + + flashbackGetMinSafeTimeTimeout := time.Minute + failpoint.Inject("changeFlashbackGetMinSafeTimeTimeout", func(val failpoint.Value) { + t := val.(int) + flashbackGetMinSafeTimeTimeout = time.Duration(t) + }) + + start := time.Now() + minSafeTime := getStoreGlobalMinSafeTS(sctx.GetStore()) + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + for oracleFlashbackTS.After(minSafeTime) { + if time.Since(start) >= flashbackGetMinSafeTimeTimeout { + return errors.Errorf("cannot set flashback timestamp after min-resolved-ts(%s)", minSafeTime) + } + select { + case <-ticker.C: + minSafeTime = getStoreGlobalMinSafeTS(sctx.GetStore()) + break + case <-ctx.Done(): + return ctx.Err() + } } + gcSafePoint, err := gcutil.GetGCSafePoint(sctx) if err != nil { return err @@ -125,6 +156,18 @@ func ValidateFlashbackTS(ctx context.Context, sctx sessionctx.Context, flashBack return gcutil.ValidateSnapshotWithGCSafePoint(flashBackTS, gcSafePoint) } +func getTiDBTTLJobEnable(sess sessionctx.Context) (string, error) { + val, err := sess.GetSessionVars().GlobalVarsAccessor.GetGlobalSysVar(variable.TiDBTTLJobEnable) + if err != nil { + return "", errors.Trace(err) + } + return val, nil +} + +func setTiDBTTLJobEnable(ctx context.Context, sess sessionctx.Context, value string) error { + return sess.GetSessionVars().GlobalVarsAccessor.SetGlobalSysVar(ctx, variable.TiDBTTLJobEnable, value) +} + func setTiDBEnableAutoAnalyze(ctx context.Context, sess sessionctx.Context, value string) error { return sess.GetSessionVars().GlobalVarsAccessor.SetGlobalSysVar(ctx, variable.TiDBEnableAutoAnalyze, value) } @@ -149,6 +192,32 @@ func getTiDBSuperReadOnly(sess sessionctx.Context) (string, error) { return val, nil } +func isFlashbackSupportedDDLAction(action model.ActionType) bool { + switch action { + case model.ActionSetTiFlashReplica, model.ActionUpdateTiFlashReplicaStatus, model.ActionAlterPlacementPolicy, + model.ActionAlterTablePlacement, model.ActionAlterTablePartitionPlacement, model.ActionCreatePlacementPolicy, + model.ActionDropPlacementPolicy, model.ActionModifySchemaDefaultPlacement, + model.ActionAlterTableAttributes, model.ActionAlterTablePartitionAttributes: + return false + default: + return true + } +} + +func checkSystemSchemaID(t *meta.Meta, schemaID int64, flashbackTSString string) error { + if schemaID <= 0 { + return nil + } + DBInfo, err := t.GetDatabase(schemaID) + if err != nil || DBInfo == nil { + return errors.Trace(err) + } + if filter.IsSystemSchema(DBInfo.Name.L) { + return errors.Errorf("Detected modified system table during [%s, now), can't do flashback", flashbackTSString) + } + return nil +} + func checkAndSetFlashbackClusterInfo(sess sessionctx.Context, d *ddlCtx, t *meta.Meta, job *model.Job, flashbackTS uint64) (err error) { if err = ValidateFlashbackTS(d.ctx, sess, flashbackTS); err != nil { return err @@ -166,25 +235,63 @@ func checkAndSetFlashbackClusterInfo(sess sessionctx.Context, d *ddlCtx, t *meta if err = setTiDBSuperReadOnly(d.ctx, sess, variable.On); err != nil { return err } + if err = setTiDBTTLJobEnable(d.ctx, sess, variable.Off); err != nil { + return err + } nowSchemaVersion, err := t.GetSchemaVersion() if err != nil { return errors.Trace(err) } - flashbackSchemaVersion, err := meta.NewSnapshotMeta(d.store.GetSnapshot(kv.NewVersion(flashbackTS))).GetSchemaVersion() + flashbackSnapshotMeta := meta.NewSnapshotMeta(d.store.GetSnapshot(kv.NewVersion(flashbackTS))) + flashbackSchemaVersion, err := flashbackSnapshotMeta.GetSchemaVersion() + if err != nil { + return errors.Trace(err) + } + + flashbackTSString := oracle.GetTimeFromTS(flashbackTS).String() + + // Check if there is an upgrade during [flashbackTS, now) + sql := fmt.Sprintf("select VARIABLE_VALUE from mysql.tidb as of timestamp '%s' where VARIABLE_NAME='tidb_server_version'", flashbackTSString) + rows, err := newSession(sess).execute(d.ctx, sql, "check_tidb_server_version") + if err != nil || len(rows) == 0 { + return errors.Errorf("Get history `tidb_server_version` failed, can't do flashback") + } + sql = fmt.Sprintf("select 1 from mysql.tidb where VARIABLE_NAME='tidb_server_version' and VARIABLE_VALUE=%s", rows[0].GetString(0)) + rows, err = newSession(sess).execute(d.ctx, sql, "check_tidb_server_version") if err != nil { return errors.Trace(err) } + if len(rows) == 0 { + return errors.Errorf("Detected TiDB upgrade during [%s, now), can't do flashback", flashbackTSString) + } + + // Check is there a DDL task at flashbackTS. + sql = fmt.Sprintf("select count(*) from mysql.%s as of timestamp '%s'", JobTable, flashbackTSString) + rows, err = newSession(sess).execute(d.ctx, sql, "check_history_job") + if err != nil || len(rows) == 0 { + return errors.Errorf("Get history ddl jobs failed, can't do flashback") + } + if rows[0].GetInt64(0) != 0 { + return errors.Errorf("Detected another DDL job at %s, can't do flashback", flashbackTSString) + } - // If flashbackSchemaVersion not same as nowSchemaVersion, we've done ddl during [flashbackTs, now). + // If flashbackSchemaVersion not same as nowSchemaVersion, we should check all schema diffs during [flashbackTs, now). for i := flashbackSchemaVersion + 1; i <= nowSchemaVersion; i++ { diff, err := t.GetSchemaDiff(i) if err != nil { return errors.Trace(err) } - if diff != nil && diff.Type != model.ActionFlashbackCluster { - return errors.Errorf("Detected schema change due to another DDL job during [%s, now), can't do flashback", oracle.GetTimeFromTS(flashbackTS)) + if diff == nil { + continue + } + if !isFlashbackSupportedDDLAction(diff.Type) { + return errors.Errorf("Detected unsupported DDL job type(%s) during [%s, now), can't do flashback", diff.Type.String(), flashbackTSString) + } + err = checkSystemSchemaID(flashbackSnapshotMeta, diff.SchemaID, flashbackTSString) + if err != nil { + return errors.Trace(err) } } @@ -206,73 +313,100 @@ func checkAndSetFlashbackClusterInfo(sess sessionctx.Context, d *ddlCtx, t *meta return nil } -type flashbackID struct { - id int64 - excluded bool +func addToSlice(schema string, tableName string, tableID int64, flashbackIDs []int64) []int64 { + if filter.IsSystemSchema(schema) && !strings.HasPrefix(tableName, "stats_") && tableName != "gc_delete_range" { + flashbackIDs = append(flashbackIDs, tableID) + } + return flashbackIDs } -func addToSlice(schema string, tableName string, tableID int64, flashbackIDs []flashbackID) []flashbackID { - var excluded bool - if filter.IsSystemSchema(schema) && !strings.HasPrefix(tableName, "stats_") { - excluded = true +// GetTableDataKeyRanges get keyRanges by `flashbackIDs`. +// This func will return all flashback table data key ranges. +func GetTableDataKeyRanges(nonFlashbackTableIDs []int64) []kv.KeyRange { + var keyRanges []kv.KeyRange + + nonFlashbackTableIDs = append(nonFlashbackTableIDs, -1) + + slices.SortFunc(nonFlashbackTableIDs, func(a, b int64) bool { + return a < b + }) + + for i := 1; i < len(nonFlashbackTableIDs); i++ { + keyRanges = append(keyRanges, kv.KeyRange{ + StartKey: tablecodec.EncodeTablePrefix(nonFlashbackTableIDs[i-1] + 1), + EndKey: tablecodec.EncodeTablePrefix(nonFlashbackTableIDs[i]), + }) } - flashbackIDs = append(flashbackIDs, flashbackID{ - id: tableID, - excluded: excluded, + + // Add all other key ranges. + keyRanges = append(keyRanges, kv.KeyRange{ + StartKey: tablecodec.EncodeTablePrefix(nonFlashbackTableIDs[len(nonFlashbackTableIDs)-1] + 1), + EndKey: tablecodec.EncodeTablePrefix(meta.MaxGlobalID), }) - return flashbackIDs + + return keyRanges } -// GetFlashbackKeyRanges make keyRanges efficiently for flashback cluster when many tables in cluster, +// GetFlashbackKeyRanges get keyRanges for flashback cluster. +// It contains all non system table key ranges and meta data key ranges. // The time complexity is O(nlogn). -func GetFlashbackKeyRanges(sess sessionctx.Context) ([]kv.KeyRange, error) { +func GetFlashbackKeyRanges(sess sessionctx.Context, flashbackTS uint64) ([]kv.KeyRange, error) { schemas := sess.GetDomainInfoSchema().(infoschema.InfoSchema).AllSchemas() // The semantic of keyRanges(output). - var keyRanges []kv.KeyRange + keyRanges := make([]kv.KeyRange, 0) + + // get snapshot schema IDs. + flashbackSnapshotMeta := meta.NewSnapshotMeta(sess.GetStore().GetSnapshot(kv.NewVersion(flashbackTS))) + snapshotSchemas, err := flashbackSnapshotMeta.ListDatabases() + if err != nil { + return nil, errors.Trace(err) + } + + schemaIDs := make(map[int64]struct{}) + for _, schema := range schemas { + if !filter.IsSystemSchema(schema.Name.L) { + schemaIDs[schema.ID] = struct{}{} + } + } + for _, schema := range snapshotSchemas { + if !filter.IsSystemSchema(schema.Name.L) { + schemaIDs[schema.ID] = struct{}{} + } + } + + // The meta data key ranges. + for schemaID := range schemaIDs { + metaStartKey := tablecodec.EncodeMetaKeyPrefix(meta.DBkey(schemaID)) + metaEndKey := tablecodec.EncodeMetaKeyPrefix(meta.DBkey(schemaID + 1)) + keyRanges = append(keyRanges, kv.KeyRange{ + StartKey: metaStartKey, + EndKey: metaEndKey, + }) + } + + startKey := tablecodec.EncodeMetaKeyPrefix([]byte("DBs")) + keyRanges = append(keyRanges, kv.KeyRange{ + StartKey: startKey, + EndKey: startKey.PrefixNext(), + }) - var flashbackIDs []flashbackID + var nonFlashbackTableIDs []int64 for _, db := range schemas { for _, table := range db.Tables { if !table.IsBaseTable() || table.ID > meta.MaxGlobalID { continue } - flashbackIDs = addToSlice(db.Name.L, table.Name.L, table.ID, flashbackIDs) + nonFlashbackTableIDs = addToSlice(db.Name.L, table.Name.L, table.ID, nonFlashbackTableIDs) if table.Partition != nil { for _, partition := range table.Partition.Definitions { - flashbackIDs = addToSlice(db.Name.L, table.Name.L, partition.ID, flashbackIDs) + nonFlashbackTableIDs = addToSlice(db.Name.L, table.Name.L, partition.ID, nonFlashbackTableIDs) } } } } - slices.SortFunc(flashbackIDs, func(a, b flashbackID) bool { - return a.id < b.id - }) - - lastExcludeIdx := -1 - for i, id := range flashbackIDs { - if id.excluded { - // Found a range [lastExcludeIdx, i) needs to be added. - if i > lastExcludeIdx+1 { - keyRanges = append(keyRanges, kv.KeyRange{ - StartKey: tablecodec.EncodeTablePrefix(flashbackIDs[lastExcludeIdx+1].id), - EndKey: tablecodec.EncodeTablePrefix(flashbackIDs[i-1].id + 1), - }) - } - lastExcludeIdx = i - } - } - - // The last part needs to be added. - if lastExcludeIdx < len(flashbackIDs)-1 { - keyRanges = append(keyRanges, kv.KeyRange{ - StartKey: tablecodec.EncodeTablePrefix(flashbackIDs[lastExcludeIdx+1].id), - EndKey: tablecodec.EncodeTablePrefix(flashbackIDs[len(flashbackIDs)-1].id + 1), - }) - } - - return keyRanges, nil + return append(keyRanges, GetTableDataKeyRanges(nonFlashbackTableIDs)...), nil } // SendPrepareFlashbackToVersionRPC prepares regions for flashback, the purpose is to put region into flashback state which region stop write @@ -280,6 +414,7 @@ func GetFlashbackKeyRanges(sess sessionctx.Context) ([]kv.KeyRange, error) { func SendPrepareFlashbackToVersionRPC( ctx context.Context, s tikv.Storage, + flashbackTS, startTS uint64, r tikvstore.KeyRange, ) (rangetask.TaskStat, error) { startKey, rangeEndKey := r.StartKey, r.EndKey @@ -314,6 +449,8 @@ func SendPrepareFlashbackToVersionRPC( req := tikvrpc.NewRequest(tikvrpc.CmdPrepareFlashbackToVersion, &kvrpcpb.PrepareFlashbackToVersionRequest{ StartKey: startKey, EndKey: endKey, + StartTs: startTS, + Version: flashbackTS, }) resp, err := s.SendReq(bo, req, loc.Region, flashbackTimeout) @@ -324,15 +461,36 @@ func SendPrepareFlashbackToVersionRPC( if err != nil { return taskStat, err } + failpoint.Inject("mockPrepareMeetsEpochNotMatch", func(val failpoint.Value) { + if val.(bool) && bo.ErrorsNum() == 0 { + regionErr = &errorpb.Error{ + Message: "stale epoch", + EpochNotMatch: &errorpb.EpochNotMatch{}, + } + } + }) if regionErr != nil { - return taskStat, errors.Errorf(regionErr.String()) + err = bo.Backoff(tikv.BoRegionMiss(), errors.New(regionErr.String())) + if err != nil { + return taskStat, err + } + continue } if resp.Resp == nil { - return taskStat, errors.Errorf("prepare flashback missing resp body") + logutil.BgLogger().Warn("prepare flashback miss resp body", zap.Uint64("region_id", loc.Region.GetID())) + err = bo.Backoff(tikv.BoTiKVRPC(), errors.New("prepare flashback rpc miss resp body")) + if err != nil { + return taskStat, err + } + continue } prepareFlashbackToVersionResp := resp.Resp.(*kvrpcpb.PrepareFlashbackToVersionResponse) if err := prepareFlashbackToVersionResp.GetError(); err != "" { - return taskStat, errors.Errorf(err) + boErr := bo.Backoff(tikv.BoTiKVRPC(), errors.New(err)) + if boErr != nil { + return taskStat, boErr + } + continue } taskStat.CompletedRegions++ if isLast { @@ -465,8 +623,8 @@ func splitRegionsByKeyRanges(d *ddlCtx, keyRanges []kv.KeyRange) { // A Flashback has 4 different stages. // 1. before lock flashbackClusterJobID, check clusterJobID and lock it. -// 2. before flashback start, check timestamp, disable GC and close PD schedule. -// 3. phase 1, get key ranges, lock all regions. +// 2. before flashback start, check timestamp, disable GC and close PD schedule, get flashback key ranges. +// 3. phase 1, lock flashback key ranges. // 4. phase 2, send flashback RPC, do flashback jobs. func (w *worker) onFlashbackCluster(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, err error) { inFlashbackTest := false @@ -481,11 +639,12 @@ func (w *worker) onFlashbackCluster(d *ddlCtx, t *meta.Meta, job *model.Job) (ve return ver, errors.Errorf("Not support flashback cluster in non-TiKV env") } - var flashbackTS, lockedRegions, commitTS uint64 + var flashbackTS, lockedRegions, startTS, commitTS uint64 var pdScheduleValue map[string]interface{} - var autoAnalyzeValue, readOnlyValue string + var autoAnalyzeValue, readOnlyValue, ttlJobEnableValue string var gcEnabledValue bool - if err := job.DecodeArgs(&flashbackTS, &pdScheduleValue, &gcEnabledValue, &autoAnalyzeValue, &readOnlyValue, &lockedRegions, &commitTS); err != nil { + var keyRanges []kv.KeyRange + if err := job.DecodeArgs(&flashbackTS, &pdScheduleValue, &gcEnabledValue, &autoAnalyzeValue, &readOnlyValue, &lockedRegions, &startTS, &commitTS, &ttlJobEnableValue, &keyRanges); err != nil { job.State = model.JobStateCancelled return ver, errors.Trace(err) } @@ -525,34 +684,48 @@ func (w *worker) onFlashbackCluster(d *ddlCtx, t *meta.Meta, job *model.Job) (ve return ver, errors.Trace(err) } job.Args[readOnlyOffset] = &readOnlyValue + ttlJobEnableValue, err = getTiDBTTLJobEnable(sess) + if err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + job.Args[ttlJobEnableOffSet] = &ttlJobEnableValue job.SchemaState = model.StateDeleteOnly return ver, nil - // Stage 2, check flashbackTS, close GC and PD schedule. + // Stage 2, check flashbackTS, close GC and PD schedule, get flashback key ranges. case model.StateDeleteOnly: if err = checkAndSetFlashbackClusterInfo(sess, d, t, job, flashbackTS); err != nil { job.State = model.JobStateCancelled return ver, errors.Trace(err) } + // We should get startTS here to avoid lost startTS when TiDB crashed during send prepare flashback RPC. + startTS, err = d.store.GetOracle().GetTimestamp(d.ctx, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) + if err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + job.Args[startTSOffset] = startTS + keyRanges, err = GetFlashbackKeyRanges(sess, flashbackTS) + if err != nil { + return ver, errors.Trace(err) + } + job.Args[keyRangesOffset] = keyRanges job.SchemaState = model.StateWriteOnly - return ver, nil - // Stage 3, get key ranges and get locks. + return updateSchemaVersion(d, t, job) + // Stage 3, lock related key ranges. case model.StateWriteOnly: // TODO: Support flashback in unistore. if inFlashbackTest { job.SchemaState = model.StateWriteReorganization return updateSchemaVersion(d, t, job) } - keyRanges, err := GetFlashbackKeyRanges(sess) - if err != nil { - return ver, errors.Trace(err) - } // Split region by keyRanges, make sure no unrelated key ranges be locked. splitRegionsByKeyRanges(d, keyRanges) totalRegions.Store(0) for _, r := range keyRanges { if err = flashbackToVersion(d.ctx, d, func(ctx context.Context, r tikvstore.KeyRange) (rangetask.TaskStat, error) { - stats, err := SendPrepareFlashbackToVersionRPC(ctx, d.store.(tikv.Storage), r) + stats, err := SendPrepareFlashbackToVersionRPC(ctx, d.store.(tikv.Storage), flashbackTS, startTS, r) totalRegions.Add(uint64(stats.CompletedRegions)) return stats, err }, r.StartKey, r.EndKey); err != nil { @@ -569,7 +742,7 @@ func (w *worker) onFlashbackCluster(d *ddlCtx, t *meta.Meta, job *model.Job) (ve } job.Args[commitTSOffset] = commitTS job.SchemaState = model.StateWriteReorganization - return updateSchemaVersion(d, t, job) + return ver, nil // Stage 4, get key ranges and send flashback RPC. case model.StateWriteReorganization: // TODO: Support flashback in unistore. @@ -579,16 +752,12 @@ func (w *worker) onFlashbackCluster(d *ddlCtx, t *meta.Meta, job *model.Job) (ve job.SchemaState = model.StatePublic return ver, nil } - keyRanges, err := GetFlashbackKeyRanges(sess) - if err != nil { - return ver, errors.Trace(err) - } for _, r := range keyRanges { if err = flashbackToVersion(d.ctx, d, func(ctx context.Context, r tikvstore.KeyRange) (rangetask.TaskStat, error) { - // Use commitTS - 1 as startTS, make sure it less than commitTS. - stats, err := SendFlashbackToVersionRPC(ctx, d.store.(tikv.Storage), flashbackTS, commitTS-1, commitTS, r) + // Use same startTS as prepare phase to simulate 1PC txn. + stats, err := SendFlashbackToVersionRPC(ctx, d.store.(tikv.Storage), flashbackTS, startTS, commitTS, r) completedRegions.Add(uint64(stats.CompletedRegions)) logutil.BgLogger().Info("[ddl] flashback cluster stats", zap.Uint64("complete regions", completedRegions.Load()), @@ -604,7 +773,7 @@ func (w *worker) onFlashbackCluster(d *ddlCtx, t *meta.Meta, job *model.Job) (ve asyncNotifyEvent(d, &util.Event{Tp: model.ActionFlashbackCluster}) job.State = model.JobStateDone job.SchemaState = model.StatePublic - return ver, nil + return updateSchemaVersion(d, t, job) } return ver, nil } @@ -615,12 +784,12 @@ func finishFlashbackCluster(w *worker, job *model.Job) error { return nil } - var flashbackTS, lockedRegions, commitTS uint64 + var flashbackTS, lockedRegions, startTS, commitTS uint64 var pdScheduleValue map[string]interface{} - var autoAnalyzeValue, readOnlyValue string + var autoAnalyzeValue, readOnlyValue, ttlJobEnableValue string var gcEnabled bool - if err := job.DecodeArgs(&flashbackTS, &pdScheduleValue, &gcEnabled, &autoAnalyzeValue, &readOnlyValue, &lockedRegions, &commitTS); err != nil { + if err := job.DecodeArgs(&flashbackTS, &pdScheduleValue, &gcEnabled, &autoAnalyzeValue, &readOnlyValue, &lockedRegions, &startTS, &commitTS, &ttlJobEnableValue); err != nil { return errors.Trace(err) } sess, err := w.sessPool.get() @@ -641,6 +810,14 @@ func finishFlashbackCluster(w *worker, job *model.Job) error { if err = setTiDBSuperReadOnly(w.ctx, sess, readOnlyValue); err != nil { return err } + + if job.IsCancelled() { + // only restore `tidb_ttl_job_enable` when flashback failed + if err = setTiDBTTLJobEnable(w.ctx, sess, ttlJobEnableValue); err != nil { + return err + } + } + return setTiDBEnableAutoAnalyze(w.ctx, sess, autoAnalyzeValue) }) if err != nil { diff --git a/ddl/cluster_test.go b/ddl/cluster_test.go index 2cbf5ee45336a..29c237270c5f9 100644 --- a/ddl/cluster_test.go +++ b/ddl/cluster_test.go @@ -22,11 +22,13 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/parser/model" - "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/util/dbterror" "github.com/stretchr/testify/assert" @@ -34,55 +36,32 @@ import ( "github.com/tikv/client-go/v2/oracle" ) -func TestGetFlashbackKeyRanges(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - se, err := session.CreateSession4Test(store) - require.NoError(t, err) - - kvRanges, err := ddl.GetFlashbackKeyRanges(se) - require.NoError(t, err) - // The results are 6 key ranges - // 0: (stats_meta,stats_histograms,stats_buckets) - // 1: (stats_feedback) - // 2: (stats_top_n) - // 3: (stats_extended) - // 4: (stats_fm_sketch) - // 5: (stats_history, stats_meta_history) - // 6: (stats_table_locked) - require.Len(t, kvRanges, 7) - - tk.MustExec("use test") - tk.MustExec("CREATE TABLE employees (" + - " id INT NOT NULL," + - " store_id INT NOT NULL" + - ") PARTITION BY RANGE (store_id) (" + - " PARTITION p0 VALUES LESS THAN (6)," + - " PARTITION p1 VALUES LESS THAN (11)," + - " PARTITION p2 VALUES LESS THAN (16)," + - " PARTITION p3 VALUES LESS THAN (21)" + - ");") - tk.MustExec("truncate table mysql.analyze_jobs") - - // truncate all `stats_` tables, make table ID consecutive. - tk.MustExec("truncate table mysql.stats_meta") - tk.MustExec("truncate table mysql.stats_histograms") - tk.MustExec("truncate table mysql.stats_buckets") - tk.MustExec("truncate table mysql.stats_feedback") - tk.MustExec("truncate table mysql.stats_top_n") - tk.MustExec("truncate table mysql.stats_extended") - tk.MustExec("truncate table mysql.stats_fm_sketch") - tk.MustExec("truncate table mysql.stats_history") - tk.MustExec("truncate table mysql.stats_meta_history") - tk.MustExec("truncate table mysql.stats_table_locked") - kvRanges, err = ddl.GetFlashbackKeyRanges(se) - require.NoError(t, err) - require.Len(t, kvRanges, 2) - - tk.MustExec("truncate table test.employees") - kvRanges, err = ddl.GetFlashbackKeyRanges(se) - require.NoError(t, err) - require.Len(t, kvRanges, 1) +func TestGetTableDataKeyRanges(t *testing.T) { + // case 1, empty flashbackIDs + keyRanges := ddl.GetTableDataKeyRanges([]int64{}) + require.Len(t, keyRanges, 1) + require.Equal(t, keyRanges[0].StartKey, tablecodec.EncodeTablePrefix(0)) + require.Equal(t, keyRanges[0].EndKey, tablecodec.EncodeTablePrefix(meta.MaxGlobalID)) + + // case 2, insert a execluded table ID + keyRanges = ddl.GetTableDataKeyRanges([]int64{3}) + require.Len(t, keyRanges, 2) + require.Equal(t, keyRanges[0].StartKey, tablecodec.EncodeTablePrefix(0)) + require.Equal(t, keyRanges[0].EndKey, tablecodec.EncodeTablePrefix(3)) + require.Equal(t, keyRanges[1].StartKey, tablecodec.EncodeTablePrefix(4)) + require.Equal(t, keyRanges[1].EndKey, tablecodec.EncodeTablePrefix(meta.MaxGlobalID)) + + // case 3, insert some execluded table ID + keyRanges = ddl.GetTableDataKeyRanges([]int64{3, 5, 9}) + require.Len(t, keyRanges, 4) + require.Equal(t, keyRanges[0].StartKey, tablecodec.EncodeTablePrefix(0)) + require.Equal(t, keyRanges[0].EndKey, tablecodec.EncodeTablePrefix(3)) + require.Equal(t, keyRanges[1].StartKey, tablecodec.EncodeTablePrefix(4)) + require.Equal(t, keyRanges[1].EndKey, tablecodec.EncodeTablePrefix(5)) + require.Equal(t, keyRanges[2].StartKey, tablecodec.EncodeTablePrefix(6)) + require.Equal(t, keyRanges[2].EndKey, tablecodec.EncodeTablePrefix(9)) + require.Equal(t, keyRanges[3].StartKey, tablecodec.EncodeTablePrefix(10)) + require.Equal(t, keyRanges[3].EndKey, tablecodec.EncodeTablePrefix(meta.MaxGlobalID)) } func TestFlashbackCloseAndResetPDSchedule(t *testing.T) { @@ -92,13 +71,11 @@ func TestFlashbackCloseAndResetPDSchedule(t *testing.T) { injectSafeTS := oracle.GoTimeToTS(time.Now().Add(10 * time.Second)) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockFlashbackTest", `return(true)`)) - require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS", - fmt.Sprintf("return(%v)", injectSafeTS))) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS", + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", fmt.Sprintf("return(%v)", injectSafeTS))) oldValue := map[string]interface{}{ - "hot-region-schedule-limit": 1, + "merge-schedule-limit": 1, } require.NoError(t, infosync.SetPDScheduleConfig(context.Background(), oldValue)) @@ -106,13 +83,13 @@ func TestFlashbackCloseAndResetPDSchedule(t *testing.T) { defer resetGC() tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} hook.OnJobRunBeforeExported = func(job *model.Job) { assert.Equal(t, model.ActionFlashbackCluster, job.Type) if job.SchemaState == model.StateWriteReorganization { closeValue, err := infosync.GetPDScheduleConfig(context.Background()) assert.NoError(t, err) - assert.Equal(t, closeValue["hot-region-schedule-limit"], 0) + assert.Equal(t, closeValue["merge-schedule-limit"], 0) // cancel flashback job job.State = model.JobStateCancelled job.Error = dbterror.ErrCancelledDDLJob @@ -120,6 +97,7 @@ func TestFlashbackCloseAndResetPDSchedule(t *testing.T) { } dom.DDL().SetHook(hook) + time.Sleep(10 * time.Millisecond) ts, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) require.NoError(t, err) @@ -128,11 +106,10 @@ func TestFlashbackCloseAndResetPDSchedule(t *testing.T) { finishValue, err := infosync.GetPDScheduleConfig(context.Background()) require.NoError(t, err) - require.EqualValues(t, finishValue["hot-region-schedule-limit"], 1) + require.EqualValues(t, finishValue["merge-schedule-limit"], 1) require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockFlashbackTest")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS")) - require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) } func TestAddDDLDuringFlashback(t *testing.T) { @@ -142,25 +119,25 @@ func TestAddDDLDuringFlashback(t *testing.T) { tk.MustExec("use test") tk.MustExec("create table t(a int)") + time.Sleep(10 * time.Millisecond) ts, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) require.NoError(t, err) injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(10 * time.Second)) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockFlashbackTest", `return(true)`)) - require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS", - fmt.Sprintf("return(%v)", injectSafeTS))) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS", + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", fmt.Sprintf("return(%v)", injectSafeTS))) timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk) defer resetGC() tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} hook.OnJobRunBeforeExported = func(job *model.Job) { assert.Equal(t, model.ActionFlashbackCluster, job.Type) if job.SchemaState == model.StateWriteOnly { - _, err := tk.Exec("alter table t add column b int") + tk1 := testkit.NewTestKit(t, store) + _, err := tk1.Exec("alter table test.t add column b int") assert.ErrorContains(t, err, "Can't add ddl job, have flashback cluster job") } } @@ -169,8 +146,7 @@ func TestAddDDLDuringFlashback(t *testing.T) { dom.DDL().SetHook(originHook) require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockFlashbackTest")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS")) - require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) } func TestGlobalVariablesOnFlashback(t *testing.T) { @@ -180,21 +156,20 @@ func TestGlobalVariablesOnFlashback(t *testing.T) { tk.MustExec("use test") tk.MustExec("create table t(a int)") + time.Sleep(10 * time.Millisecond) ts, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) require.NoError(t, err) injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(10 * time.Second)) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockFlashbackTest", `return(true)`)) - require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS", - fmt.Sprintf("return(%v)", injectSafeTS))) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS", + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", fmt.Sprintf("return(%v)", injectSafeTS))) timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk) defer resetGC() tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} hook.OnJobRunBeforeExported = func(job *model.Job) { assert.Equal(t, model.ActionFlashbackCluster, job.Type) if job.SchemaState == model.StateWriteReorganization { @@ -207,12 +182,16 @@ func TestGlobalVariablesOnFlashback(t *testing.T) { rs, err = tk.Exec("show variables like 'tidb_super_read_only'") assert.NoError(t, err) assert.Equal(t, tk.ResultSetToResult(rs, "").Rows()[0][1], variable.On) + rs, err = tk.Exec("show variables like 'tidb_ttl_job_enable'") + assert.NoError(t, err) + assert.Equal(t, tk.ResultSetToResult(rs, "").Rows()[0][1], variable.Off) } } dom.DDL().SetHook(hook) - // first try with `tidb_gc_enable` = on and `tidb_super_read_only` = off + // first try with `tidb_gc_enable` = on and `tidb_super_read_only` = off and `tidb_ttl_job_enable` = on tk.MustExec("set global tidb_gc_enable = on") tk.MustExec("set global tidb_super_read_only = off") + tk.MustExec("set global tidb_ttl_job_enable = on") tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) @@ -222,10 +201,14 @@ func TestGlobalVariablesOnFlashback(t *testing.T) { rs, err = tk.Exec("show variables like 'tidb_gc_enable'") require.NoError(t, err) require.Equal(t, tk.ResultSetToResult(rs, "").Rows()[0][1], variable.On) + rs, err = tk.Exec("show variables like 'tidb_ttl_job_enable'") + require.NoError(t, err) + require.Equal(t, tk.ResultSetToResult(rs, "").Rows()[0][1], variable.Off) - // second try with `tidb_gc_enable` = off and `tidb_super_read_only` = on + // second try with `tidb_gc_enable` = off and `tidb_super_read_only` = on and `tidb_ttl_job_enable` = off tk.MustExec("set global tidb_gc_enable = off") tk.MustExec("set global tidb_super_read_only = on") + tk.MustExec("set global tidb_ttl_job_enable = off") ts, err = tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) require.NoError(t, err) @@ -236,25 +219,27 @@ func TestGlobalVariablesOnFlashback(t *testing.T) { rs, err = tk.Exec("show variables like 'tidb_gc_enable'") require.NoError(t, err) require.Equal(t, tk.ResultSetToResult(rs, "").Rows()[0][1], variable.Off) + rs, err = tk.Exec("show variables like 'tidb_ttl_job_enable'") + assert.NoError(t, err) + assert.Equal(t, tk.ResultSetToResult(rs, "").Rows()[0][1], variable.Off) dom.DDL().SetHook(originHook) require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockFlashbackTest")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS")) - require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) } func TestCancelFlashbackCluster(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) originHook := dom.DDL().GetHook() tk := testkit.NewTestKit(t, store) + + time.Sleep(10 * time.Millisecond) ts, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) require.NoError(t, err) injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(10 * time.Second)) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockFlashbackTest", `return(true)`)) - require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS", - fmt.Sprintf("return(%v)", injectSafeTS))) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS", + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", fmt.Sprintf("return(%v)", injectSafeTS))) timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk) @@ -266,9 +251,14 @@ func TestCancelFlashbackCluster(t *testing.T) { return job.SchemaState == model.StateDeleteOnly }) dom.DDL().SetHook(hook) + tk.MustExec("set global tidb_ttl_job_enable = on") tk.MustGetErrCode(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts)), errno.ErrCancelledDDLJob) hook.MustCancelDone(t) + rs, err := tk.Exec("show variables like 'tidb_ttl_job_enable'") + assert.NoError(t, err) + assert.Equal(t, tk.ResultSetToResult(rs, "").Rows()[0][1], variable.On) + // Try canceled on StateWriteReorganization, cancel failed hook = newCancelJobHook(t, store, dom, func(job *model.Job) bool { return job.SchemaState == model.StateWriteReorganization @@ -277,9 +267,12 @@ func TestCancelFlashbackCluster(t *testing.T) { tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) hook.MustCancelFailed(t) + rs, err = tk.Exec("show variables like 'tidb_ttl_job_enable'") + assert.NoError(t, err) + assert.Equal(t, tk.ResultSetToResult(rs, "").Rows()[0][1], variable.Off) + dom.DDL().SetHook(originHook) require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockFlashbackTest")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS")) - require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) } diff --git a/ddl/column.go b/ddl/column.go index 06f6e2897f3ae..4148537ac1d88 100644 --- a/ddl/column.go +++ b/ddl/column.go @@ -17,6 +17,7 @@ package ddl import ( "bytes" "context" + "encoding/hex" "fmt" "math/bits" "strings" @@ -341,6 +342,9 @@ func checkDropColumn(d *ddlCtx, t *meta.Meta, job *model.Job) (*model.TableInfo, if err = checkDropColumnWithForeignKeyConstraintInOwner(d, t, job, tblInfo, colName.L); err != nil { return nil, nil, nil, false, errors.Trace(err) } + if err = checkDropColumnWithTTLConfig(tblInfo, colName.L); err != nil { + return nil, nil, nil, false, errors.Trace(err) + } idxInfos := listIndicesWithColumn(colName.L, tblInfo.Indices) return tblInfo, colInfo, idxInfos, false, nil } @@ -548,6 +552,10 @@ func (w *worker) onModifyColumn(d *ddlCtx, t *meta.Meta, job *model.Job) (ver in job.State = model.JobStateCancelled return ver, errors.Trace(err) } + if tblInfo.Partition != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(dbterror.ErrUnsupportedModifyColumn.GenWithStackByArgs("table is partition table")) + } changingCol := modifyInfo.changingCol if changingCol == nil { @@ -802,8 +810,18 @@ func doReorgWorkForModifyColumnMultiSchema(w *worker, d *ddlCtx, t *meta.Meta, j func doReorgWorkForModifyColumn(w *worker, d *ddlCtx, t *meta.Meta, job *model.Job, tbl table.Table, oldCol, changingCol *model.ColumnInfo, changingIdxs []*model.IndexInfo) (done bool, ver int64, err error) { job.ReorgMeta.ReorgTp = model.ReorgTypeTxn - rh := newReorgHandler(t, w.sess, w.concurrentDDL) - reorgInfo, err := getReorgInfo(d.jobContext(job), d, rh, job, tbl, BuildElements(changingCol, changingIdxs), false) + sctx, err1 := w.sessPool.get() + if err1 != nil { + err = errors.Trace(err1) + return + } + defer w.sessPool.put(sctx) + rh := newReorgHandler(newSession(sctx)) + dbInfo, err := t.GetDatabase(job.SchemaID) + if err != nil { + return false, ver, errors.Trace(err) + } + reorgInfo, err := getReorgInfo(d.jobContext(job.ID), d, rh, job, dbInfo, tbl, BuildElements(changingCol, changingIdxs), false) if err != nil || reorgInfo.first { // If we run reorg firstly, we should update the job snapshot version // and then run the reorg next time. @@ -830,7 +848,7 @@ func doReorgWorkForModifyColumn(w *worker, d *ddlCtx, t *meta.Meta, job *model.J // If timeout, we should return, check for the owner and re-wait job done. return false, ver, nil } - if kv.IsTxnRetryableError(err) { + if kv.IsTxnRetryableError(err) || dbterror.ErrNotOwner.Equal(err) { return false, ver, errors.Trace(err) } if err1 := rh.RemoveDDLReorgHandle(job, reorgInfo.elements); err1 != nil { @@ -857,6 +875,9 @@ func adjustTableInfoAfterModifyColumnWithData(tblInfo *model.TableInfo, pos *ast indexesToRemove := filterIndexesToRemove(changingIdxs, newName, tblInfo) replaceOldIndexes(tblInfo, indexesToRemove) } + if tblInfo.TTLInfo != nil { + updateTTLInfoWhenModifyColumn(tblInfo, oldCol.Name, changingCol.Name) + } // Move the new column to a correct offset. destOffset, err := LocateOffsetToMove(changingCol.Offset, pos, tblInfo) if err != nil { @@ -931,6 +952,17 @@ func updateFKInfoWhenModifyColumn(tblInfo *model.TableInfo, oldCol, newCol model } } +func updateTTLInfoWhenModifyColumn(tblInfo *model.TableInfo, oldCol, newCol model.CIStr) { + if oldCol.L == newCol.L { + return + } + if tblInfo.TTLInfo != nil { + if tblInfo.TTLInfo.ColumnName.L == oldCol.L { + tblInfo.TTLInfo.ColumnName = newCol + } + } +} + // filterIndexesToRemove filters out the indexes that can be removed. func filterIndexesToRemove(changingIdxs []*model.IndexInfo, colName model.CIStr, tblInfo *model.TableInfo) []*model.IndexInfo { indexesToRemove := make([]*model.IndexInfo, 0, len(changingIdxs)) @@ -1029,11 +1061,18 @@ func (w *worker) updatePhysicalTableRow(t table.Table, reorgInfo *reorgInfo) err if p == nil { return dbterror.ErrCancelledDDLJob.GenWithStack("Can not find partition id %d for table %d", reorgInfo.PhysicalTableID, t.Meta().ID) } - err := w.writePhysicalTableRecord(w.sessPool, p, typeUpdateColumnWorker, reorgInfo) + workType := typeReorgPartitionWorker + if reorgInfo.Job.Type != model.ActionReorganizePartition { + // workType = typeUpdateColumnWorker + // TODO: Support Modify Column on partitioned table + // https://github.com/pingcap/tidb/issues/38297 + return dbterror.ErrCancelledDDLJob.GenWithStack("Modify Column on partitioned table / typeUpdateColumnWorker not yet supported.") + } + err := w.writePhysicalTableRecord(w.sessPool, p, workType, reorgInfo) if err != nil { return err } - done, err = w.updateReorgInfo(tbl, reorgInfo) + done, err = updateReorgInfo(w.sessPool, tbl, reorgInfo) if err != nil { return errors.Trace(err) } @@ -1058,32 +1097,34 @@ func (w *worker) updateCurrentElement(t table.Table, reorgInfo *reorgInfo) error TestReorgGoroutineRunning <- a for { time.Sleep(30 * time.Millisecond) - if w.getReorgCtx(reorgInfo.Job).isReorgCanceled() { + if w.getReorgCtx(reorgInfo.Job.ID).isReorgCanceled() { // Job is cancelled. So it can't be done. failpoint.Return(dbterror.ErrCancelledDDLJob) } } } }) + // TODO: Support partition tables. if bytes.Equal(reorgInfo.currElement.TypeKey, meta.ColumnElementKey) { - err := w.updatePhysicalTableRow(t, reorgInfo) + //nolint:forcetypeassert + err := w.updatePhysicalTableRow(t.(table.PhysicalTable), reorgInfo) if err != nil { return errors.Trace(err) } } - var physTbl table.PhysicalTable - if tbl, ok := t.(table.PartitionedTable); ok { - physTbl = tbl.GetPartition(reorgInfo.PhysicalTableID) - } else if tbl, ok := t.(table.PhysicalTable); ok { - physTbl = tbl + if _, ok := t.(table.PartitionedTable); ok { + // TODO: remove when modify column of partitioned table is supported + // https://github.com/pingcap/tidb/issues/38297 + return dbterror.ErrCancelledDDLJob.GenWithStack("Modify Column on partitioned table / typeUpdateColumnWorker not yet supported.") } // Get the original start handle and end handle. currentVer, err := getValidCurrentVersion(reorgInfo.d.store) if err != nil { return errors.Trace(err) } - originalStartHandle, originalEndHandle, err := getTableRange(reorgInfo.d.jobContext(reorgInfo.Job), reorgInfo.d, physTbl, currentVer.Ver, reorgInfo.Job.Priority) + //nolint:forcetypeassert + originalStartHandle, originalEndHandle, err := getTableRange(reorgInfo.d.jobContext(reorgInfo.Job.ID), reorgInfo.d, t.(table.PhysicalTable), currentVer.Ver, reorgInfo.Job.Priority) if err != nil { return errors.Trace(err) } @@ -1106,21 +1147,21 @@ func (w *worker) updateCurrentElement(t table.Table, reorgInfo *reorgInfo) error // Then the handle range of the rest elements' is [originalStartHandle, originalEndHandle]. if i == startElementOffsetToResetHandle+1 { reorgInfo.StartKey, reorgInfo.EndKey = originalStartHandle, originalEndHandle + w.getReorgCtx(reorgInfo.Job.ID).setNextKey(reorgInfo.StartKey) } // Update the element in the reorgCtx to keep the atomic access for daemon-worker. - w.getReorgCtx(reorgInfo.Job).setCurrentElement(reorgInfo.elements[i+1]) + w.getReorgCtx(reorgInfo.Job.ID).setCurrentElement(reorgInfo.elements[i+1]) // Update the element in the reorgInfo for updating the reorg meta below. reorgInfo.currElement = reorgInfo.elements[i+1] // Write the reorg info to store so the whole reorganize process can recover from panic. err := reorgInfo.UpdateReorgMeta(reorgInfo.StartKey, w.sessPool) logutil.BgLogger().Info("[ddl] update column and indexes", - zap.Int64("jobID", reorgInfo.Job.ID), - zap.ByteString("elementType", reorgInfo.currElement.TypeKey), - zap.Int64("elementID", reorgInfo.currElement.ID), - zap.String("startHandle", tryDecodeToHandleString(reorgInfo.StartKey)), - zap.String("endHandle", tryDecodeToHandleString(reorgInfo.EndKey))) + zap.Int64("job ID", reorgInfo.Job.ID), + zap.Stringer("element", reorgInfo.currElement), + zap.String("start key", hex.EncodeToString(reorgInfo.StartKey)), + zap.String("end key", hex.EncodeToString(reorgInfo.EndKey))) if err != nil { return errors.Trace(err) } @@ -1133,7 +1174,7 @@ func (w *worker) updateCurrentElement(t table.Table, reorgInfo *reorgInfo) error } type updateColumnWorker struct { - *backfillWorker + *backfillCtx oldColInfo *model.ColumnInfo newColInfo *model.ColumnInfo metricCounter prometheus.Counter @@ -1145,7 +1186,6 @@ type updateColumnWorker struct { rowMap map[int64]types.Datum // For SQL Mode and warnings. - sqlMode mysql.SQLMode jobContext *JobContext } @@ -1165,14 +1205,13 @@ func newUpdateColumnWorker(sessCtx sessionctx.Context, id int, t table.PhysicalT } rowDecoder := decoder.NewRowDecoder(t, t.WritableCols(), decodeColMap) return &updateColumnWorker{ - backfillWorker: newBackfillWorker(jc.ddlJobCtx, sessCtx, id, t, reorgInfo, typeUpdateColumnWorker), - oldColInfo: oldCol, - newColInfo: newCol, - metricCounter: metrics.BackfillTotalCounter.WithLabelValues(metrics.GenerateReorgLabel("update_col_rate", reorgInfo.SchemaName, t.Meta().Name.String())), - rowDecoder: rowDecoder, - rowMap: make(map[int64]types.Datum, len(decodeColMap)), - sqlMode: reorgInfo.ReorgMeta.SQLMode, - jobContext: jc, + backfillCtx: newBackfillCtx(reorgInfo.d, id, sessCtx, reorgInfo.ReorgMeta.ReorgTp, reorgInfo.SchemaName, t), + oldColInfo: oldCol, + newColInfo: newCol, + metricCounter: metrics.BackfillTotalCounter.WithLabelValues(metrics.GenerateReorgLabel("update_col_rate", reorgInfo.SchemaName, t.Meta().Name.String())), + rowDecoder: rowDecoder, + rowMap: make(map[int64]types.Datum, len(decodeColMap)), + jobContext: jc, } } @@ -1180,14 +1219,34 @@ func (w *updateColumnWorker) AddMetricInfo(cnt float64) { w.metricCounter.Add(cnt) } +func (*updateColumnWorker) String() string { + return typeUpdateColumnWorker.String() +} + +func (*updateColumnWorker) GetTasks() ([]*BackfillJob, error) { + panic("[ddl] update column worker GetTask function doesn't implement") +} + +func (*updateColumnWorker) UpdateTask(*BackfillJob) error { + panic("[ddl] update column worker UpdateTask function doesn't implement") +} + +func (*updateColumnWorker) FinishTask(*BackfillJob) error { + panic("[ddl] update column worker FinishTask function doesn't implement") +} + +func (w *updateColumnWorker) GetCtx() *backfillCtx { + return w.backfillCtx +} + type rowRecord struct { key []byte // It's used to lock a record. Record it to reduce the encoding time. vals []byte // It's the record. warning *terror.Error // It's used to record the cast warning of a record. } -// getNextKey gets next handle of entry that we are going to process. -func (*updateColumnWorker) getNextKey(taskRange reorgBackfillTask, +// getNextHandleKey gets next handle of entry that we are going to process. +func getNextHandleKey(taskRange reorgBackfillTask, taskDone bool, lastAccessedHandle kv.Key) (nextHandle kv.Key) { if !taskDone { // The task is not done. So we need to pick the last processed entry's handle and add one. @@ -1205,8 +1264,8 @@ func (w *updateColumnWorker) fetchRowColVals(txn kv.Transaction, taskRange reorg taskDone := false var lastAccessedHandle kv.Key oprStartTime := startTime - err := iterateSnapshotKeys(w.reorgInfo.d.jobContext(w.reorgInfo.Job), w.sessCtx.GetStore(), w.priority, w.table.RecordPrefix(), txn.StartTS(), taskRange.startKey, taskRange.endKey, - func(handle kv.Handle, recordKey kv.Key, rawRow []byte) (bool, error) { + err := iterateSnapshotKeys(w.GetCtx().jobContext(taskRange.getJobID()), w.sessCtx.GetStore(), taskRange.priority, taskRange.physicalTable.RecordPrefix(), + txn.StartTS(), taskRange.startKey, taskRange.endKey, func(handle kv.Handle, recordKey kv.Key, rawRow []byte) (bool, error) { oprEndTime := time.Now() logSlowOperations(oprEndTime.Sub(oprStartTime), "iterateSnapshotKeys in updateColumnWorker fetchRowColVals", 0) oprStartTime = oprEndTime @@ -1237,7 +1296,7 @@ func (w *updateColumnWorker) fetchRowColVals(txn kv.Transaction, taskRange reorg } logutil.BgLogger().Debug("[ddl] txn fetches handle info", zap.Uint64("txnStartTS", txn.StartTS()), zap.String("taskRange", taskRange.String()), zap.Duration("takeTime", time.Since(startTime))) - return w.rowRecords, w.getNextKey(taskRange, taskDone, lastAccessedHandle), taskDone, errors.Trace(err) + return w.rowRecords, getNextHandleKey(taskRange, taskDone, lastAccessedHandle), taskDone, errors.Trace(err) } func (w *updateColumnWorker) getRowRecord(handle kv.Handle, recordKey []byte, rawRow []byte) error { @@ -1274,8 +1333,8 @@ func (w *updateColumnWorker) getRowRecord(handle kv.Handle, recordKey []byte, ra if err != nil { return w.reformatErrors(err) } - if w.sessCtx.GetSessionVars().StmtCtx.GetWarnings() != nil && len(w.sessCtx.GetSessionVars().StmtCtx.GetWarnings()) != 0 { - warn := w.sessCtx.GetSessionVars().StmtCtx.GetWarnings() + warn := w.sessCtx.GetSessionVars().StmtCtx.GetWarnings() + if len(warn) != 0 { //nolint:forcetypeassert recordWarning = errors.Cause(w.reformatErrors(warn[0].Err)).(*terror.Error) } @@ -1347,8 +1406,8 @@ func (w *updateColumnWorker) BackfillDataInTxn(handleRange reorgBackfillTask) (t errInTxn = kv.RunInNewTxn(ctx, w.sessCtx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) error { taskCtx.addedCount = 0 taskCtx.scanCount = 0 - txn.SetOption(kv.Priority, w.priority) - if tagger := w.reorgInfo.d.getResourceGroupTaggerForTopSQL(w.reorgInfo.Job); tagger != nil { + txn.SetOption(kv.Priority, handleRange.priority) + if tagger := w.GetCtx().getResourceGroupTaggerForTopSQL(handleRange.getJobID()); tagger != nil { txn.SetOption(kv.ResourceGroupTagger, tagger) } @@ -1359,8 +1418,9 @@ func (w *updateColumnWorker) BackfillDataInTxn(handleRange reorgBackfillTask) (t taskCtx.nextKey = nextKey taskCtx.done = taskDone - warningsMap := make(map[errors.ErrorID]*terror.Error, len(rowRecords)) - warningsCountMap := make(map[errors.ErrorID]int64, len(rowRecords)) + // Optimize for few warnings! + warningsMap := make(map[errors.ErrorID]*terror.Error, 2) + warningsCountMap := make(map[errors.ErrorID]int64, 2) for _, rowRecord := range rowRecords { taskCtx.scanCount++ @@ -1473,6 +1533,7 @@ func adjustTableInfoAfterModifyColumn( tblInfo.MoveColumnInfo(oldCol.Offset, destOffset) updateNewIdxColsNameOffset(tblInfo.Indices, oldCol.Name, newCol) updateFKInfoWhenModifyColumn(tblInfo, oldCol.Name, newCol.Name) + updateTTLInfoWhenModifyColumn(tblInfo, oldCol.Name, newCol.Name) return nil } @@ -1524,7 +1585,7 @@ func checkAndApplyAutoRandomBits(d *ddlCtx, m *meta.Meta, dbInfo *model.DBInfo, return nil } idAcc := m.GetAutoIDAccessors(dbInfo.ID, tblInfo.ID) - err := checkNewAutoRandomBits(idAcc, oldCol, newCol, newAutoRandBits, tblInfo.AutoRandomRangeBits, tblInfo.Version) + err := checkNewAutoRandomBits(idAcc, oldCol, newCol, newAutoRandBits, tblInfo.AutoRandomRangeBits, tblInfo.SepAutoInc()) if err != nil { return err } @@ -1533,13 +1594,17 @@ func checkAndApplyAutoRandomBits(d *ddlCtx, m *meta.Meta, dbInfo *model.DBInfo, // checkNewAutoRandomBits checks whether the new auto_random bits number can cause overflow. func checkNewAutoRandomBits(idAccessors meta.AutoIDAccessors, oldCol *model.ColumnInfo, - newCol *model.ColumnInfo, newShardBits, newRangeBits uint64, tblVer uint16) error { + newCol *model.ColumnInfo, newShardBits, newRangeBits uint64, sepAutoInc bool) error { shardFmt := autoid.NewShardIDFormat(&newCol.FieldType, newShardBits, newRangeBits) idAcc := idAccessors.RandomID() convertedFromAutoInc := mysql.HasAutoIncrementFlag(oldCol.GetFlag()) if convertedFromAutoInc { - idAcc = idAccessors.IncrementID(tblVer) + if sepAutoInc { + idAcc = idAccessors.IncrementID(model.TableInfoVersion5) + } else { + idAcc = idAccessors.RowID() + } } // Generate a new auto ID first to prevent concurrent update in DML. _, err := idAcc.Inc(1) @@ -1650,6 +1715,15 @@ func updateColumnDefaultValue(d *ddlCtx, t *meta.Meta, job *model.Job, newCol *m job.State = model.JobStateCancelled return ver, infoschema.ErrColumnNotExists.GenWithStackByArgs(newCol.Name, tblInfo.Name) } + + if hasDefaultValue, _, err := checkColumnDefaultValue(newContext(d.store), table.ToColumn(oldCol.Clone()), newCol.DefaultValue); err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } else if !hasDefaultValue { + job.State = model.JobStateCancelled + return ver, dbterror.ErrInvalidDefaultValue.GenWithStackByArgs(newCol.Name) + } + // The newCol's offset may be the value of the old schema version, so we can't use newCol directly. oldCol.DefaultValue = newCol.DefaultValue oldCol.DefaultValueBit = newCol.DefaultValueBit diff --git a/ddl/column_change_test.go b/ddl/column_change_test.go index 4528564d2f231..76a3b377a5abe 100644 --- a/ddl/column_change_test.go +++ b/ddl/column_change_test.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/parser/model" @@ -48,7 +49,7 @@ func TestColumnAdd(t *testing.T) { tk.MustExec("insert t values (1, 2);") d := dom.DDL() - tc := &ddl.TestDDLCallback{Do: dom} + tc := &callback.TestDDLCallback{Do: dom} ct := testNewContext(store) // set up hook @@ -149,7 +150,7 @@ func TestModifyAutoRandColumnWithMetaKeyChanged(t *testing.T) { tk.MustExec("create table t (a bigint primary key clustered AUTO_RANDOM(5));") d := dom.DDL() - tc := &ddl.TestDDLCallback{Do: dom} + tc := &callback.TestDDLCallback{Do: dom} var errCount int32 = 3 var genAutoRandErr error @@ -437,3 +438,36 @@ func testNewContext(store kv.Storage) sessionctx.Context { ctx.Store = store return ctx } + +func TestIssue40150(t *testing.T) { + store, _ := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustExec("CREATE TABLE t40150 (a int) PARTITION BY HASH (a) PARTITIONS 2") + tk.MustContainErrMsg(`alter table t40150 rename column a to c`, "[ddl:3855]Column 'a' has a partitioning function dependency and cannot be dropped or renamed") +} + +func TestIssue40135(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + + tk.MustExec("CREATE TABLE t40135 ( a tinyint DEFAULT NULL, b varchar(32) DEFAULT 'md') PARTITION BY HASH (a) PARTITIONS 2") + one := true + hook := &callback.TestDDLCallback{Do: dom} + var checkErr error + hook.OnJobRunBeforeExported = func(job *model.Job) { + if one { + one = false + _, checkErr = tk1.Exec("alter table t40135 change column a aNew SMALLINT NULL DEFAULT '-14996'") + } + } + dom.DDL().SetHook(hook) + tk.MustExec("alter table t40135 modify column a MEDIUMINT NULL DEFAULT '6243108' FIRST") + + require.ErrorContains(t, checkErr, "[ddl:3855]Column 'a' has a partitioning function dependency and cannot be dropped or renamed") +} diff --git a/ddl/column_modify_test.go b/ddl/column_modify_test.go index f933182737d05..574de0ee8f08a 100644 --- a/ddl/column_modify_test.go +++ b/ddl/column_modify_test.go @@ -24,7 +24,7 @@ import ( "time" "github.com/pingcap/errors" - "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" testddlutil "github.com/pingcap/tidb/ddl/testutil" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" @@ -289,8 +289,7 @@ func TestDropColumn(t *testing.T) { tk.MustExec("drop table if exists t1") tk.MustExec("create table t1 (a int,b int) partition by hash(a) partitions 4;") err := tk.ExecToErr("alter table t1 drop column a") - // TODO: refine the error message to compatible with MySQL - require.EqualError(t, err, "[planner:1054]Unknown column 'a' in 'expression'") + require.EqualError(t, err, "[ddl:3855]Column 'a' has a partitioning function dependency and cannot be dropped or renamed") } func TestChangeColumn(t *testing.T) { @@ -665,7 +664,7 @@ func TestTransactionWithWriteOnlyColumn(t *testing.T) { }, } - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} var checkErr error hook.OnJobRunBeforeExported = func(job *model.Job) { if checkErr != nil { @@ -689,7 +688,7 @@ func TestTransactionWithWriteOnlyColumn(t *testing.T) { dom.DDL().SetHook(hook) done := make(chan error, 1) // test transaction on add column. - go backgroundExec(store, "alter table t1 add column c int not null", done) + go backgroundExec(store, "test", "alter table t1 add column c int not null", done) err := <-done require.NoError(t, err) require.NoError(t, checkErr) @@ -697,7 +696,7 @@ func TestTransactionWithWriteOnlyColumn(t *testing.T) { tk.MustExec("delete from t1") // test transaction on drop column. - go backgroundExec(store, "alter table t1 drop column c", done) + go backgroundExec(store, "test", "alter table t1 drop column c", done) err = <-done require.NoError(t, err) require.NoError(t, checkErr) @@ -873,7 +872,7 @@ func TestAddGeneratedColumnAndInsert(t *testing.T) { tk1.MustExec("use test") d := dom.DDL() - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} ctx := mock.NewContext() ctx.Store = store times := 0 @@ -917,7 +916,7 @@ func TestColumnTypeChangeGenUniqueChangingName(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test") - hook := &ddl.TestDDLCallback{} + hook := &callback.TestDDLCallback{} var checkErr error assertChangingColName := "_col$_c2_0" assertChangingIdxName := "_idx$_idx_0" @@ -1030,77 +1029,3 @@ func TestColumnTypeChangeGenUniqueChangingName(t *testing.T) { tk.MustExec("drop table if exists t") } - -func TestWriteReorgForColumnTypeChangeOnAmendTxn(t *testing.T) { - store, dom := testkit.CreateMockStoreAndDomainWithSchemaLease(t, columnModifyLease) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("set global tidb_enable_metadata_lock=0") - tk.MustExec("set global tidb_enable_amend_pessimistic_txn = ON") - defer tk.MustExec("set global tidb_enable_amend_pessimistic_txn = OFF") - - d := dom.DDL() - testInsertOnModifyColumn := func(sql string, startColState, commitColState model.SchemaState, retStrs []string, retErr error) { - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t1") - tk.MustExec("create table t1 (c1 int, c2 int, c3 int, unique key(c1))") - tk.MustExec("insert into t1 values (20, 20, 20);") - - var checkErr error - tk1 := testkit.NewTestKit(t, store) - defer func() { - if tk1.Session() != nil { - tk1.Session().Close() - } - }() - hook := &ddl.TestDDLCallback{Do: dom} - times := 0 - hook.OnJobRunBeforeExported = func(job *model.Job) { - if job.Type != model.ActionModifyColumn || checkErr != nil || job.SchemaState != startColState { - return - } - - tk1.MustExec("use test") - tk1.MustExec("begin pessimistic;") - tk1.MustExec("insert into t1 values(101, 102, 103)") - } - onJobUpdatedExportedFunc := func(job *model.Job) { - if job.Type != model.ActionModifyColumn || checkErr != nil || job.SchemaState != commitColState { - return - } - if times == 0 { - _, checkErr = tk1.Exec("commit;") - } - times++ - } - hook.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) - d.SetHook(hook) - - tk.MustExec(sql) - if retErr == nil { - require.NoError(t, checkErr) - } else { - require.Error(t, checkErr) - require.Contains(t, checkErr.Error(), retErr.Error()) - } - tk.MustQuery("select * from t1").Check(testkit.Rows(retStrs...)) - tk.MustExec("admin check table t1") - } - - // Testing it needs reorg data. - ddlStatement := "alter table t1 change column c2 cc smallint;" - testInsertOnModifyColumn(ddlStatement, model.StateNone, model.StateWriteReorganization, []string{"20 20 20"}, domain.ErrInfoSchemaChanged) - testInsertOnModifyColumn(ddlStatement, model.StateDeleteOnly, model.StateWriteReorganization, []string{"20 20 20"}, domain.ErrInfoSchemaChanged) - testInsertOnModifyColumn(ddlStatement, model.StateWriteOnly, model.StateWriteReorganization, []string{"20 20 20"}, domain.ErrInfoSchemaChanged) - testInsertOnModifyColumn(ddlStatement, model.StateNone, model.StatePublic, []string{"20 20 20"}, domain.ErrInfoSchemaChanged) - testInsertOnModifyColumn(ddlStatement, model.StateDeleteOnly, model.StatePublic, []string{"20 20 20"}, domain.ErrInfoSchemaChanged) - testInsertOnModifyColumn(ddlStatement, model.StateWriteOnly, model.StatePublic, []string{"20 20 20"}, domain.ErrInfoSchemaChanged) - - // Testing it needs not reorg data. This case only have two states: none, public. - ddlStatement = "alter table t1 change column c2 cc bigint;" - testInsertOnModifyColumn(ddlStatement, model.StateNone, model.StateWriteReorganization, []string{"20 20 20"}, nil) - testInsertOnModifyColumn(ddlStatement, model.StateWriteOnly, model.StateWriteReorganization, []string{"20 20 20"}, nil) - testInsertOnModifyColumn(ddlStatement, model.StateNone, model.StatePublic, []string{"20 20 20", "101 102 103"}, nil) - testInsertOnModifyColumn(ddlStatement, model.StateWriteOnly, model.StatePublic, []string{"20 20 20"}, nil) -} diff --git a/ddl/column_test.go b/ddl/column_test.go index cae9a27318dec..d378c03e297b5 100644 --- a/ddl/column_test.go +++ b/ddl/column_test.go @@ -23,7 +23,7 @@ import ( "testing" "github.com/pingcap/errors" - "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/model" @@ -672,7 +672,7 @@ func TestAddColumn(t *testing.T) { checkOK := false - tc := &ddl.TestDDLCallback{Do: dom} + tc := &callback.TestDDLCallback{Do: dom} onJobUpdatedExportedFunc := func(job *model.Job) { if checkOK { return @@ -740,7 +740,7 @@ func TestAddColumns(t *testing.T) { err = txn.Commit(context.Background()) require.NoError(t, err) - tc := &ddl.TestDDLCallback{Do: dom} + tc := &callback.TestDDLCallback{Do: dom} onJobUpdatedExportedFunc := func(job *model.Job) { mu.Lock() defer mu.Unlock() @@ -810,7 +810,7 @@ func TestDropColumnInColumnTest(t *testing.T) { var mu sync.Mutex d := dom.DDL() - tc := &ddl.TestDDLCallback{Do: dom} + tc := &callback.TestDDLCallback{Do: dom} onJobUpdatedExportedFunc := func(job *model.Job) { mu.Lock() defer mu.Unlock() @@ -872,7 +872,7 @@ func TestDropColumns(t *testing.T) { var mu sync.Mutex d := dom.DDL() - tc := &ddl.TestDDLCallback{Do: dom} + tc := &callback.TestDDLCallback{Do: dom} onJobUpdatedExportedFunc := func(job *model.Job) { mu.Lock() defer mu.Unlock() @@ -959,3 +959,65 @@ func TestGetDefaultValueOfColumn(t *testing.T) { tk.MustQuery("select * from t1").Check(testkit.RowsWithSep("|", ""+ "1962-03-03 1962-03-03 00:00:00 12:23:23 2020-10-13 2020-03-27")) } + +func TestIssue39080(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("CREATE TABLE t1(id INTEGER PRIMARY KEY, authorId INTEGER AUTO_INCREMENT UNIQUE)") + + tk.MustQuery("show create table t1").Check(testkit.RowsWithSep("|", ""+ + "t1 CREATE TABLE `t1` (\n"+ + " `id` int(11) NOT NULL,\n"+ + " `authorId` int(11) NOT NULL AUTO_INCREMENT,\n"+ + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,\n"+ + " UNIQUE KEY `authorId` (`authorId`)\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + + //Do not affect the specified name + tk.MustExec("CREATE TABLE `t2`( `id` INTEGER PRIMARY KEY, `authorId` int(11) AUTO_INCREMENT, UNIQUE KEY `authorIdx` (`authorId`))") + + tk.MustQuery("show create table t2").Check(testkit.RowsWithSep("|", ""+ + "t2 CREATE TABLE `t2` (\n"+ + " `id` int(11) NOT NULL,\n"+ + " `authorId` int(11) NOT NULL AUTO_INCREMENT,\n"+ + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,\n"+ + " UNIQUE KEY `authorIdx` (`authorId`)\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) +} + +func TestWriteDataWriteOnlyMode(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomainWithSchemaLease(t, dbTestLease) + + tk := testkit.NewTestKit(t, store) + tk2 := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk2.MustExec("use test") + tk.MustExec("CREATE TABLE t (`col1` bigint(20) DEFAULT 1,`col2` float,UNIQUE KEY `key1` (`col1`))") + + originalCallback := dom.DDL().GetHook() + defer dom.DDL().SetHook(originalCallback) + + hook := &callback.TestDDLCallback{Do: dom} + hook.OnJobRunBeforeExported = func(job *model.Job) { + if job.SchemaState != model.StateWriteOnly { + return + } + tk2.MustExec("insert ignore into t values (1, 2)") + tk2.MustExec("insert ignore into t values (2, 2)") + } + dom.DDL().SetHook(hook) + tk.MustExec("alter table t change column `col1` `col1` varchar(20)") + + hook = &callback.TestDDLCallback{Do: dom} + hook.OnJobRunBeforeExported = func(job *model.Job) { + if job.SchemaState != model.StateWriteOnly { + return + } + tk2.MustExec("insert ignore into t values (1)") + tk2.MustExec("insert ignore into t values (2)") + } + dom.DDL().SetHook(hook) + tk.MustExec("alter table t drop column `col1`") + dom.DDL().SetHook(originalCallback) +} diff --git a/ddl/column_type_change_test.go b/ddl/column_type_change_test.go index 818d0714080f1..0aa303c984398 100644 --- a/ddl/column_type_change_test.go +++ b/ddl/column_type_change_test.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/model" @@ -121,7 +122,7 @@ func TestColumnTypeChangeStateBetweenInteger(t *testing.T) { require.Equal(t, 2, len(tbl.Cols())) require.NotNil(t, external.GetModifyColumn(t, tk, "test", "t", "c2", false)) - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} var checkErr error hook.OnJobRunBeforeExported = func(job *model.Job) { if checkErr != nil { @@ -185,7 +186,7 @@ func TestRollbackColumnTypeChangeBetweenInteger(t *testing.T) { require.Equal(t, 2, len(tbl.Cols())) require.NotNil(t, external.GetModifyColumn(t, tk, "test", "t", "c2", false)) - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} // Mock roll back at model.StateNone. customizeHookRollbackAtState(hook, tbl, model.StateNone) dom.DDL().SetHook(hook) @@ -217,7 +218,7 @@ func TestRollbackColumnTypeChangeBetweenInteger(t *testing.T) { assertRollBackedColUnchanged(t, tk) } -func customizeHookRollbackAtState(hook *ddl.TestDDLCallback, tbl table.Table, state model.SchemaState) { +func customizeHookRollbackAtState(hook *callback.TestDDLCallback, tbl table.Table, state model.SchemaState) { hook.OnJobRunBeforeExported = func(job *model.Job) { if tbl.Meta().ID != job.TableID { return @@ -934,7 +935,7 @@ func TestColumnTypeChangeIgnoreDisplayLength(t *testing.T) { assertHasAlterWriteReorg := func(tbl table.Table) { // Restore assertResult to false. assertResult = false - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} hook.OnJobRunBeforeExported = func(job *model.Job) { if tbl.Meta().ID != job.TableID { return @@ -1600,7 +1601,7 @@ func TestChangingColOriginDefaultValue(t *testing.T) { tbl := external.GetTableByName(t, tk, "test", "t") originalHook := dom.DDL().GetHook() - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} var ( once bool checkErr error @@ -1679,7 +1680,7 @@ func TestChangingColOriginDefaultValueAfterAddColAndCastSucc(t *testing.T) { tbl := external.GetTableByName(t, tk, "test", "t") originalHook := dom.DDL().GetHook() - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} var ( once bool checkErr error @@ -1764,7 +1765,7 @@ func TestChangingColOriginDefaultValueAfterAddColAndCastFail(t *testing.T) { tbl := external.GetTableByName(t, tk, "test", "t") originalHook := dom.DDL().GetHook() - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} var checkErr error hook.OnJobRunBeforeExported = func(job *model.Job) { if checkErr != nil { @@ -1812,8 +1813,7 @@ func TestChangingAttributeOfColumnWithFK(t *testing.T) { tk.MustExec("use test") prepare := func() { - tk.MustExec("drop table if exists users") - tk.MustExec("drop table if exists orders") + tk.MustExec("drop table if exists users, orders") tk.MustExec("CREATE TABLE users (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, doc JSON);") tk.MustExec("CREATE TABLE orders (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, doc JSON, FOREIGN KEY fk_user_id (user_id) REFERENCES users(id));") } @@ -1894,7 +1894,7 @@ func TestDDLExitWhenCancelMeetPanic(t *testing.T) { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockExceedErrorLimit")) }() - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} var jobID int64 hook.OnJobRunBeforeExported = func(job *model.Job) { if jobID != 0 { @@ -1969,7 +1969,7 @@ func TestCancelCTCInReorgStateWillCauseGoroutineLeak(t *testing.T) { tk.MustExec("insert into ctc_goroutine_leak values(1),(2),(3)") tbl := external.GetTableByName(t, tk, "test", "ctc_goroutine_leak") - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} var jobID int64 hook.OnJobRunBeforeExported = func(job *model.Job) { if jobID != 0 { @@ -2211,7 +2211,7 @@ func TestCastDateToTimestampInReorgAttribute(t *testing.T) { var checkErr1 error var checkErr2 error - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} hook.OnJobRunBeforeExported = func(job *model.Job) { if checkErr1 != nil || checkErr2 != nil || tbl.Meta().ID != job.TableID { return @@ -2422,3 +2422,18 @@ func TestColumnTypeChangeTimestampToInt(t *testing.T) { tk.MustExec("alter table t add index idx1(id, c1);") tk.MustExec("admin check table t") } + +func TestFixDDLTxnWillConflictWithReorgTxn(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustExec("create table t (a int)") + tk.MustExec("set global tidb_ddl_enable_fast_reorg = OFF") + tk.MustExec("alter table t add index(a)") + tk.MustExec("set @@sql_mode=''") + tk.MustExec("insert into t values(128),(129)") + tk.MustExec("alter table t modify column a tinyint") + + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1690 2 warnings with this error code, first warning: constant 128 overflows tinyint")) +} diff --git a/ddl/concurrentddltest/switch_test.go b/ddl/concurrentddltest/switch_test.go deleted file mode 100644 index d487859260eb2..0000000000000 --- a/ddl/concurrentddltest/switch_test.go +++ /dev/null @@ -1,136 +0,0 @@ -// 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, -// 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 concurrentddltest - -import ( - "context" - "fmt" - "math/rand" - "testing" - "time" - - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/testkit" - "github.com/pingcap/tidb/util" - "github.com/stretchr/testify/require" - "go.uber.org/atomic" -) - -func TestConcurrentDDLSwitch(t *testing.T) { - store := testkit.CreateMockStore(t) - - type table struct { - columnIdx int - indexIdx int - } - - var tables []*table - tblCount := 20 - for i := 0; i < tblCount; i++ { - tables = append(tables, &table{1, 0}) - } - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set global tidb_enable_metadata_lock=0") - tk.MustExec("set @@global.tidb_ddl_reorg_worker_cnt=1") - tk.MustExec("set @@global.tidb_ddl_reorg_batch_size=32") - - for i := range tables { - tk.MustExec(fmt.Sprintf("create table t%d (col0 int)", i)) - for j := 0; j < 1000; j++ { - tk.MustExec(fmt.Sprintf("insert into t%d values (%d)", i, j)) - } - } - - ddls := make([]string, 0, tblCount) - ddlCount := 100 - for i := 0; i < ddlCount; i++ { - tblIdx := rand.Intn(tblCount) - if rand.Intn(2) == 0 { - ddls = append(ddls, fmt.Sprintf("alter table t%d add index idx%d (col0)", tblIdx, tables[tblIdx].indexIdx)) - tables[tblIdx].indexIdx++ - } else { - ddls = append(ddls, fmt.Sprintf("alter table t%d add column col%d int", tblIdx, tables[tblIdx].columnIdx)) - tables[tblIdx].columnIdx++ - } - } - - c := atomic.NewInt32(0) - ch := make(chan struct{}) - go func() { - var wg util.WaitGroupWrapper - for i := range ddls { - wg.Add(1) - go func(idx int) { - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec(ddls[idx]) - c.Add(1) - wg.Done() - }(i) - } - wg.Wait() - ch <- struct{}{} - }() - - // sleep 2s to make sure the ddl jobs is into table. - time.Sleep(2 * time.Second) - ticker := time.NewTicker(time.Second) - count := 0 - done := false - for !done { - select { - case <-ch: - done = true - case <-ticker.C: - var b bool - var err error - err = kv.RunInNewTxn(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), store, false, func(ctx context.Context, txn kv.Transaction) error { - b, err = meta.NewMeta(txn).IsConcurrentDDL() - return err - }) - require.NoError(t, err) - rs, err := testkit.NewTestKit(t, store).Exec(fmt.Sprintf("set @@global.tidb_enable_concurrent_ddl=%t", !b)) - if rs != nil { - require.NoError(t, rs.Close()) - } - if err == nil { - count++ - if b { - tk := testkit.NewTestKit(t, store) - tk.Session().GetSessionVars().MemQuotaQuery = -1 - tk.MustQuery("select count(*) from mysql.tidb_ddl_job").Check(testkit.Rows("0")) - tk.MustQuery("select count(*) from mysql.tidb_ddl_reorg").Check(testkit.Rows("0")) - } - } - } - } - - require.Equal(t, int32(ddlCount), c.Load()) - require.Greater(t, count, 0) - - tk = testkit.NewTestKit(t, store) - tk.Session().GetSessionVars().MemQuotaQuery = -1 - tk.MustExec("use test") - for i, tbl := range tables { - tk.MustQuery(fmt.Sprintf("select count(*) from information_schema.columns where TABLE_SCHEMA = 'test' and TABLE_NAME = 't%d'", i)).Check(testkit.Rows(fmt.Sprintf("%d", tbl.columnIdx))) - tk.MustExec(fmt.Sprintf("admin check table t%d", i)) - for j := 0; j < tbl.indexIdx; j++ { - tk.MustExec(fmt.Sprintf("admin check index t%d idx%d", i, j)) - } - } -} diff --git a/ddl/constant.go b/ddl/constant.go index bf4d69fb8fd33..99d6498c0cea1 100644 --- a/ddl/constant.go +++ b/ddl/constant.go @@ -25,6 +25,10 @@ const ( ReorgTable = "tidb_ddl_reorg" // HistoryTable stores the history DDL jobs. HistoryTable = "tidb_ddl_history" + // BackgroundSubtaskTable stores the information of backfill jobs. + BackgroundSubtaskTable = "tidb_background_subtask" + // BackgroundSubtaskHistoryTable stores the information of history backfill jobs. + BackgroundSubtaskHistoryTable = "tidb_background_subtask_history" // JobTableID is the table ID of `tidb_ddl_job`. JobTableID = meta.MaxInt48 - 1 @@ -34,6 +38,10 @@ const ( HistoryTableID = meta.MaxInt48 - 3 // MDLTableID is the table ID of `tidb_mdl_info`. MDLTableID = meta.MaxInt48 - 4 + // BackgroundSubtaskTableID is the table ID of `tidb_background_subtask`. + BackgroundSubtaskTableID = meta.MaxInt48 - 5 + // BackgroundSubtaskHistoryTableID is the table ID of `tidb_background_subtask_history`. + BackgroundSubtaskHistoryTableID = meta.MaxInt48 - 6 // JobTableSQL is the CREATE TABLE SQL of `tidb_ddl_job`. JobTableSQL = "create table " + JobTable + "(job_id bigint not null, reorg int, schema_ids text(65535), table_ids text(65535), job_meta longblob, type int, processing int, primary key(job_id))" @@ -41,4 +49,34 @@ const ( ReorgTableSQL = "create table " + ReorgTable + "(job_id bigint not null, ele_id bigint, ele_type blob, start_key blob, end_key blob, physical_id bigint, reorg_meta longblob, unique key(job_id, ele_id, ele_type(20)))" // HistoryTableSQL is the CREATE TABLE SQL of `tidb_ddl_history`. HistoryTableSQL = "create table " + HistoryTable + "(job_id bigint not null, job_meta longblob, db_name char(64), table_name char(64), schema_ids text(65535), table_ids text(65535), create_time datetime, primary key(job_id))" + // BackgroundSubtaskTableSQL is the CREATE TABLE SQL of `tidb_background_subtask`. + BackgroundSubtaskTableSQL = "create table " + BackgroundSubtaskTable + `( + id bigint not null auto_increment primary key, + namespace varchar(256), + task_key varchar(256), + ddl_physical_tid bigint(20), + type int, + exec_id varchar(256), + exec_expired timestamp, + state varchar(64) not null, + checkpoint longblob not null, + start_time bigint, + state_update_time bigint, + meta longblob, + unique key(namespace, task_key))` + // BackgroundSubtaskHistoryTableSQL is the CREATE TABLE SQL of `tidb_background_subtask_history`. + BackgroundSubtaskHistoryTableSQL = "create table " + BackgroundSubtaskHistoryTable + `( + id bigint not null auto_increment primary key, + namespace varchar(256), + task_key varchar(256), + ddl_physical_tid bigint(20), + type int, + exec_id varchar(256), + exec_expired timestamp, + state varchar(64) not null, + checkpoint longblob not null, + start_time bigint, + state_update_time bigint, + meta longblob, + unique key(namespace, task_key))` ) diff --git a/ddl/db_change_test.go b/ddl/db_change_test.go index d865c970e7f42..2dc12c6cda9e8 100644 --- a/ddl/db_change_test.go +++ b/ddl/db_change_test.go @@ -24,6 +24,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/executor" @@ -74,7 +75,7 @@ func TestShowCreateTable(t *testing.T) { "CREATE TABLE `t2` (\n `a` int(11) DEFAULT NULL,\n `b` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL,\n `c` varchar(1) COLLATE utf8mb4_general_ci DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci"}, } prevState := model.StateNone - callback := &ddl.TestDDLCallback{} + callback := &callback.TestDDLCallback{} currTestCaseOffset := 0 onJobUpdatedExportedFunc := func(job *model.Job) { if job.SchemaState == prevState || checkErr != nil { @@ -143,7 +144,7 @@ func TestDropNotNullColumn(t *testing.T) { var checkErr error d := dom.DDL() originalCallback := d.GetHook() - callback := &ddl.TestDDLCallback{} + callback := &callback.TestDDLCallback{} sqlNum := 0 onJobUpdatedExportedFunc := func(job *model.Job) { if checkErr != nil { @@ -222,7 +223,7 @@ func TestTwoStates(t *testing.T) { key(c1, c2))`) tk.MustExec("insert into t values(1, 'a', 'N', '2017-07-01')") - callback := &ddl.TestDDLCallback{} + callback := &callback.TestDDLCallback{} prevState := model.StateNone require.NoError(t, testInfo.parseSQLs(parser.New())) @@ -809,7 +810,7 @@ func runTestInSchemaState( // Make sure these SQLs use the plan of index scan. tk.MustExec("drop stats t") - callback := &ddl.TestDDLCallback{Do: dom} + callback := &callback.TestDDLCallback{Do: dom} prevState := model.StateNone var checkErr error se, err := session.CreateSession(store) @@ -872,7 +873,7 @@ func TestShowIndex(t *testing.T) { tk.MustExec("use test_db_state") tk.MustExec(`create table t(c1 int primary key nonclustered, c2 int)`) - callback := &ddl.TestDDLCallback{} + callback := &callback.TestDDLCallback{} prevState := model.StateNone showIndexSQL := `show index from t` var checkErr error @@ -1325,7 +1326,7 @@ func TestParallelAlterAndDropSchema(t *testing.T) { } func prepareTestControlParallelExecSQL(t *testing.T, store kv.Storage, dom *domain.Domain) (*testkit.TestKit, *testkit.TestKit, chan struct{}, ddl.Callback) { - callback := &ddl.TestDDLCallback{} + callback := &callback.TestDDLCallback{} times := 0 callback.OnJobRunBeforeExported = func(job *model.Job) { if times != 0 { @@ -1433,7 +1434,7 @@ func dbChangeTestParallelExecSQL(t *testing.T, store kv.Storage, dom *domain.Dom var err2, err3 error var wg util.WaitGroupWrapper - callback := &ddl.TestDDLCallback{} + callback := &callback.TestDDLCallback{} once := sync.Once{} onJobUpdatedExportedFunc := func(job *model.Job) { // sleep a while, let other job enqueue. @@ -1531,7 +1532,7 @@ func TestParallelDDLBeforeRunDDLJob(t *testing.T) { tk2 := testkit.NewTestKit(t, store) tk2.MustExec("use test_db_state") - intercept := &ddl.TestInterceptor{} + intercept := &callback.TestInterceptor{} var sessionToStart sync.WaitGroup // sessionToStart is a waitgroup to wait for two session to get the same information schema sessionToStart.Add(2) @@ -1574,7 +1575,7 @@ func TestParallelDDLBeforeRunDDLJob(t *testing.T) { wg.Wait() - intercept = &ddl.TestInterceptor{} + intercept = &callback.TestInterceptor{} d.(ddl.DDLForTest).SetInterceptor(intercept) } @@ -1666,7 +1667,7 @@ func TestCreateExpressionIndex(t *testing.T) { d := dom.DDL() originalCallback := d.GetHook() defer d.SetHook(originalCallback) - callback := &ddl.TestDDLCallback{} + callback := &callback.TestDDLCallback{} onJobUpdatedExportedFunc := func(job *model.Job) { if checkErr != nil { return @@ -1712,6 +1713,14 @@ func TestCreateExpressionIndex(t *testing.T) { require.NoError(t, checkErr) tk.MustExec("admin check table t") tk.MustQuery("select * from t order by a, b").Check(testkit.Rows("0 9", "0 11", "0 11", "1 7", "2 7", "5 7", "8 8", "10 10", "10 10")) + + // https://github.com/pingcap/tidb/issues/39784 + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(name varchar(20))") + tk.MustExec("insert into t values ('Abc'), ('Bcd'), ('abc')") + tk.MustExec("create index idx on test.t((lower(test.t.name)))") + tk.MustExec("admin check table t") } func TestCreateUniqueExpressionIndex(t *testing.T) { @@ -1733,13 +1742,11 @@ func TestCreateUniqueExpressionIndex(t *testing.T) { d := dom.DDL() originalCallback := d.GetHook() defer d.SetHook(originalCallback) - callback := &ddl.TestDDLCallback{} + callback := &callback.TestDDLCallback{} onJobUpdatedExportedFunc := func(job *model.Job) { if checkErr != nil { return } - err := originalCallback.OnChanged(nil) - require.NoError(t, err) switch job.SchemaState { case model.StateDeleteOnly: for _, sql := range stateDeleteOnlySQLs { @@ -1844,7 +1851,7 @@ func TestDropExpressionIndex(t *testing.T) { d := dom.DDL() originalCallback := d.GetHook() defer d.SetHook(originalCallback) - callback := &ddl.TestDDLCallback{} + callback := &callback.TestDDLCallback{} onJobUpdatedExportedFunc := func(job *model.Job) { if checkErr != nil { return @@ -1916,7 +1923,7 @@ func TestParallelRenameTable(t *testing.T) { d2 := dom.DDL() originalCallback := d2.GetHook() defer d2.SetHook(originalCallback) - callback := &ddl.TestDDLCallback{Do: dom} + callback := &callback.TestDDLCallback{Do: dom} callback.OnJobRunBeforeExported = func(job *model.Job) { switch job.SchemaState { case model.StateNone: @@ -2031,7 +2038,7 @@ func TestConcurrentSetDefaultValue(t *testing.T) { d := dom.DDL() originalCallback := d.GetHook() defer d.SetHook(originalCallback) - callback := &ddl.TestDDLCallback{Do: dom} + callback := &callback.TestDDLCallback{Do: dom} skip := false callback.OnJobRunBeforeExported = func(job *model.Job) { switch job.SchemaState { diff --git a/ddl/db_foreign_key_test.go b/ddl/db_foreign_key_test.go index dc60b53112291..f45db3934d89a 100644 --- a/ddl/db_foreign_key_test.go +++ b/ddl/db_foreign_key_test.go @@ -26,8 +26,7 @@ func TestDuplicateForeignKey(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("drop table if exists t1") + tk.MustExec("drop table if exists t, t1") // Foreign table. tk.MustExec("create table t(id int key)") // Create target table with duplicate fk. @@ -38,8 +37,7 @@ func TestDuplicateForeignKey(t *testing.T) { // Alter target table with duplicate fk. tk.MustGetErrCode("alter table t1 add CONSTRAINT `fk_aaa` FOREIGN KEY (`id_fk`) REFERENCES `t` (`id`)", mysql.ErrFkDupName) tk.MustGetErrCode("alter table t1 add CONSTRAINT `fk_aAa` FOREIGN KEY (`id_fk`) REFERENCES `t` (`id`)", mysql.ErrFkDupName) - tk.MustExec("drop table if exists t") - tk.MustExec("drop table if exists t1") + tk.MustExec("drop table if exists t, t1") } func TestTemporaryTableForeignKey(t *testing.T) { diff --git a/ddl/db_integration_test.go b/ddl/db_integration_test.go index b7cb35a9f8727..ad2d0066c56dc 100644 --- a/ddl/db_integration_test.go +++ b/ddl/db_integration_test.go @@ -26,8 +26,9 @@ import ( "time" "github.com/pingcap/errors" + _ "github.com/pingcap/tidb/autoid_service" "github.com/pingcap/tidb/config" - "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/ddl/schematracker" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" @@ -686,7 +687,7 @@ func TestUpdateMultipleTable(t *testing.T) { tk2.MustExec("use test") d := dom.DDL() - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} onJobUpdatedExportedFunc := func(job *model.Job) { if job.SchemaState == model.StateWriteOnly { tk2.MustExec("update t1, t2 set t1.c1 = 8, t2.c2 = 10 where t1.c2 = t2.c1") @@ -1214,14 +1215,14 @@ func TestBitDefaultValue(t *testing.T) { );`) } -func backgroundExec(s kv.Storage, sql string, done chan error) { +func backgroundExec(s kv.Storage, schema, sql string, done chan error) { se, err := session.CreateSession4Test(s) if err != nil { done <- errors.Trace(err) return } defer se.Close() - _, err = se.Execute(context.Background(), "use test") + _, err = se.Execute(context.Background(), "use "+schema) if err != nil { done <- errors.Trace(err) return @@ -2373,11 +2374,49 @@ func TestSqlFunctionsInGeneratedColumns(t *testing.T) { tk.MustExec("create table t (a int, b int as ((a)))") } +func TestSchemaNameAndTableNameInGeneratedExpr(t *testing.T) { + store := testkit.CreateMockStore(t, mockstore.WithDDLChecker()) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("create database if not exists test") + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + + tk.MustExec("create table t(a int, b int as (lower(test.t.a)))") + tk.MustQuery("show create table t").Check(testkit.Rows("t CREATE TABLE `t` (\n" + + " `a` int(11) DEFAULT NULL,\n" + + " `b` int(11) GENERATED ALWAYS AS (lower(`a`)) VIRTUAL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + + tk.MustExec("drop table t") + tk.MustExec("create table t(a int)") + tk.MustExec("alter table t add column b int as (lower(test.t.a))") + tk.MustQuery("show create table t").Check(testkit.Rows("t CREATE TABLE `t` (\n" + + " `a` int(11) DEFAULT NULL,\n" + + " `b` int(11) GENERATED ALWAYS AS (lower(`a`)) VIRTUAL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + + tk.MustGetErrCode("alter table t add index idx((lower(test.t1.a)))", errno.ErrBadField) + + tk.MustExec("drop table t") + tk.MustGetErrCode("create table t(a int, b int as (lower(test1.t.a)))", errno.ErrWrongDBName) + + tk.MustExec("create table t(a int)") + tk.MustGetErrCode("alter table t add column b int as (lower(test.t1.a))", errno.ErrWrongTableName) + + tk.MustExec("alter table t add column c int") + tk.MustGetErrCode("alter table t modify column c int as (test.t1.a + 1) stored", errno.ErrWrongTableName) + + tk.MustExec("alter table t add column d int as (lower(test.T.a))") + tk.MustExec("alter table t add column e int as (lower(Test.t.a))") +} + func TestParserIssue284(t *testing.T) { store := testkit.CreateMockStore(t, mockstore.WithDDLChecker()) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set @@foreign_key_checks=0") tk.MustExec("create table test.t_parser_issue_284(c1 int not null primary key)") _, err := tk.Exec("create table test.t_parser_issue_284_2(id int not null primary key, c1 int not null, constraint foreign key (c1) references t_parser_issue_284(c1))") require.NoError(t, err) @@ -2894,17 +2933,23 @@ func TestAutoIncrementTableOption(t *testing.T) { tk.MustExec("create database test_auto_inc_table_opt;") tk.MustExec("use test_auto_inc_table_opt;") - // Empty auto_inc allocator should not cause error. - tk.MustExec("create table t (a bigint primary key clustered) auto_increment = 10;") - tk.MustExec("alter table t auto_increment = 10;") - tk.MustExec("alter table t auto_increment = 12345678901234567890;") - - // Rebase the auto_inc allocator to a large integer should work. - tk.MustExec("drop table t;") - tk.MustExec("create table t (a bigint unsigned auto_increment, unique key idx(a));") - tk.MustExec("alter table t auto_increment = 12345678901234567890;") - tk.MustExec("insert into t values ();") - tk.MustQuery("select * from t;").Check(testkit.Rows("12345678901234567890")) + for _, str := range []string{"", " AUTO_ID_CACHE 1"} { + // Empty auto_inc allocator should not cause error. + tk.MustExec("create table t (a bigint primary key clustered) auto_increment = 10" + str) + tk.MustExec("alter table t auto_increment = 10;") + tk.MustExec("alter table t auto_increment = 12345678901234567890;") + tk.MustExec("drop table t;") + + // Rebase the auto_inc allocator to a large integer should work. + tk.MustExec("create table t (a bigint unsigned auto_increment, unique key idx(a))" + str) + // Set auto_inc to negative is not supported + err := tk.ExecToErr("alter table t auto_increment = -1;") + require.Error(t, err) + tk.MustExec("alter table t auto_increment = 12345678901234567890;") + tk.MustExec("insert into t values ();") + tk.MustQuery("select * from t;").Check(testkit.Rows("12345678901234567890")) + tk.MustExec("drop table t;") + } } func TestAutoIncrementForce(t *testing.T) { @@ -2919,8 +2964,9 @@ func TestAutoIncrementForce(t *testing.T) { require.NoError(t, err) return gid } + // Rebase _tidb_row_id. - tk.MustExec("create table t (a int);") + tk.MustExec("create table t (a int)") tk.MustExec("alter table t force auto_increment = 2;") tk.MustExec("insert into t values (1),(2);") tk.MustQuery("select a, _tidb_rowid from t;").Check(testkit.Rows("1 2", "2 3")) @@ -2932,10 +2978,10 @@ func TestAutoIncrementForce(t *testing.T) { tk.MustExec("insert into t values (3);") require.Equal(t, "[kv:1062]Duplicate entry '2' for key 't.PRIMARY'", tk.ExecToErr("insert into t values (3);").Error()) tk.MustQuery("select a, _tidb_rowid from t;").Check(testkit.Rows("3 1", "1 2", "2 3")) + tk.MustExec("drop table if exists t;") // Rebase auto_increment. - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t (a int primary key auto_increment, b int);") + tk.MustExec("create table t (a int primary key auto_increment, b int)") tk.MustExec("insert into t values (1, 1);") tk.MustExec("insert into t values (100000000, 1);") tk.MustExec("delete from t where a = 100000000;") @@ -2946,10 +2992,10 @@ func TestAutoIncrementForce(t *testing.T) { require.Equal(t, uint64(2), getNextGlobalID()) tk.MustExec("insert into t(b) values (2);") tk.MustQuery("select a, b from t;").Check(testkit.Rows("1 1", "2 2")) + tk.MustExec("drop table if exists t;") // Rebase auto_random. - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t (a bigint primary key auto_random(5));") + tk.MustExec("create table t (a bigint primary key auto_random(5))") tk.MustExec("insert into t values ();") tk.MustExec("set @@allow_auto_random_explicit_insert = true") tk.MustExec("insert into t values (100000000);") @@ -2961,14 +3007,15 @@ func TestAutoIncrementForce(t *testing.T) { require.Equal(t, uint64(2), getNextGlobalID()) tk.MustExec("insert into t values ();") tk.MustQuery("select (a & 3) from t order by 1;").Check(testkit.Rows("1", "2")) + tk.MustExec("drop table if exists t;") // Change next global ID. - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t (a bigint primary key auto_increment);") + tk.MustExec("create table t (a bigint primary key auto_increment)") tk.MustExec("insert into t values (1);") bases := []uint64{1, 65535, 10, math.MaxUint64, math.MaxInt64 + 1, 1, math.MaxUint64, math.MaxInt64, 2} lastBase := fmt.Sprintf("%d", bases[len(bases)-1]) for _, b := range bases { + fmt.Println("execute alter table force increment to ==", b) tk.MustExec(fmt.Sprintf("alter table t force auto_increment = %d;", b)) require.Equal(t, b, getNextGlobalID()) } @@ -2976,7 +3023,7 @@ func TestAutoIncrementForce(t *testing.T) { tk.MustQuery("select a from t;").Check(testkit.Rows("1", lastBase)) // Force alter unsigned int auto_increment column. tk.MustExec("drop table if exists t;") - tk.MustExec("create table t (a bigint unsigned primary key auto_increment);") + tk.MustExec("create table t (a bigint unsigned primary key auto_increment)") for _, b := range bases { tk.MustExec(fmt.Sprintf("alter table t force auto_increment = %d;", b)) require.Equal(t, b, getNextGlobalID()) @@ -2984,10 +3031,10 @@ func TestAutoIncrementForce(t *testing.T) { tk.MustQuery("select a from t;").Check(testkit.Rows(fmt.Sprintf("%d", b))) tk.MustExec("delete from t;") } + tk.MustExec("drop table if exists t;") // Force alter with @@auto_increment_increment and @@auto_increment_offset. - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t(a int key auto_increment);") + tk.MustExec("create table t(a int key auto_increment)") tk.MustExec("set @@auto_increment_offset=2;") tk.MustExec("set @@auto_increment_increment = 11;") tk.MustExec("insert into t values (500);") @@ -3015,6 +3062,135 @@ func TestAutoIncrementForce(t *testing.T) { tk.MustExec("drop table t") } +func TestAutoIncrementForceAutoIDCache(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("drop database if exists auto_inc_force;") + tk.MustExec("create database auto_inc_force;") + tk.MustExec("use auto_inc_force;") + getNextGlobalID := func() uint64 { + gidStr := tk.MustQuery("show table t next_row_id").Rows()[0][3] + gid, err := strconv.ParseUint(gidStr.(string), 10, 64) + require.NoError(t, err) + return gid + } + + // When AUTO_ID_CACHE is 1, row id and auto increment id use separate allocator, so the behaviour differs. + // "Alter table t force auto_increment" has no effect on row id. + tk.MustExec("create table t (a int) AUTO_ID_CACHE 1") + tk.MustExec("alter table t force auto_increment = 2;") + tk.MustExec("insert into t values (1),(2);") + tk.MustQuery("select a, _tidb_rowid from t;").Check(testkit.Rows("1 1", "2 2")) + // Cannot set next global ID to 0. + tk.MustExec("alter table t force auto_increment = 0;") + tk.MustExec("alter table t force auto_increment = 1;") + tk.MustQuery("show table t next_row_id").Check(testkit.Rows( + "auto_inc_force t _tidb_rowid 5001 _TIDB_ROWID", + )) + + // inserting new rows can overwrite the existing data. + tk.MustExec("insert into t values (3);") + tk.MustExec("insert into t values (3);") + tk.MustQuery("select a, _tidb_rowid from t;").Check(testkit.Rows("1 1", "2 2", "3 5001", "3 5002")) + tk.MustExec("drop table if exists t;") + + // Rebase auto_increment. + tk.MustExec("create table t (a int primary key auto_increment, b int) AUTO_ID_CACHE 1") + tk.MustExec("insert into t values (1, 1);") + tk.MustExec("insert into t values (100000000, 1);") + tk.MustExec("delete from t where a = 100000000;") + tk.MustQuery("show table t next_row_id").Check(testkit.Rows( + "auto_inc_force t a 1 _TIDB_ROWID", + "auto_inc_force t a 100000001 AUTO_INCREMENT", + )) + // Cannot set next global ID to 0. + tk.MustGetErrCode("alter table t /*T![force_inc] force */ auto_increment = 0;", errno.ErrAutoincReadFailed) + tk.MustExec("alter table t /*T![force_inc] force */ auto_increment = 2;") + tk.MustQuery("show table t next_row_id").Check(testkit.Rows( + "auto_inc_force t a 1 _TIDB_ROWID", + "auto_inc_force t a 2 AUTO_INCREMENT", + )) + + tk.MustExec("insert into t(b) values (2);") + tk.MustQuery("select a, b from t;").Check(testkit.Rows("1 1", "2 2")) + tk.MustExec("drop table if exists t;") + + // Rebase auto_random. + tk.MustExec("create table t (a bigint primary key auto_random(5)) AUTO_ID_CACHE 1") + tk.MustExec("insert into t values ();") + tk.MustExec("set @@allow_auto_random_explicit_insert = true") + tk.MustExec("insert into t values (100000000);") + tk.MustExec("delete from t where a = 100000000;") + require.Greater(t, getNextGlobalID(), uint64(100000000)) + // Cannot set next global ID to 0. + tk.MustGetErrCode("alter table t force auto_random_base = 0;", errno.ErrAutoincReadFailed) + tk.MustExec("alter table t force auto_random_base = 2;") + require.Equal(t, uint64(2), getNextGlobalID()) + tk.MustExec("insert into t values ();") + tk.MustQuery("select (a & 3) from t order by 1;").Check(testkit.Rows("1", "2")) + tk.MustExec("drop table if exists t;") + + // Change next global ID. + tk.MustExec("create table t (a bigint primary key auto_increment) AUTO_ID_CACHE 1") + tk.MustExec("insert into t values (1);") + bases := []uint64{1, 65535, 10, math.MaxUint64, math.MaxInt64 + 1, 1, math.MaxUint64, math.MaxInt64, 2} + lastBase := fmt.Sprintf("%d", bases[len(bases)-1]) + for _, b := range bases { + fmt.Println("execute alter table force increment to ==", b) + tk.MustExec(fmt.Sprintf("alter table t force auto_increment = %d;", b)) + tk.MustQuery("show table t next_row_id").Check(testkit.Rows( + "auto_inc_force t a 1 _TIDB_ROWID", + fmt.Sprintf("auto_inc_force t a %d AUTO_INCREMENT", b), + )) + } + tk.MustExec("insert into t values ();") + tk.MustQuery("select a from t;").Check(testkit.Rows("1", lastBase)) + // Force alter unsigned int auto_increment column. + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a bigint unsigned primary key auto_increment) AUTO_ID_CACHE 1") + for _, b := range bases { + tk.MustExec(fmt.Sprintf("alter table t force auto_increment = %d;", b)) + tk.MustQuery("show table t next_row_id").Check(testkit.Rows( + "auto_inc_force t a 1 _TIDB_ROWID", + fmt.Sprintf("auto_inc_force t a %d AUTO_INCREMENT", b), + )) + tk.MustExec("insert into t values ();") + tk.MustQuery("select a from t;").Check(testkit.Rows(fmt.Sprintf("%d", b))) + tk.MustExec("delete from t;") + } + tk.MustExec("drop table if exists t;") + + // Force alter with @@auto_increment_increment and @@auto_increment_offset. + tk.MustExec("create table t(a int key auto_increment) AUTO_ID_CACHE 1") + tk.MustExec("set @@auto_increment_offset=2;") + tk.MustExec("set @@auto_increment_increment = 11;") + tk.MustExec("insert into t values (500);") + tk.MustExec("alter table t force auto_increment=100;") + tk.MustExec("insert into t values (), ();") + tk.MustQuery("select * from t;").Check(testkit.Rows("101", "112", "500")) + tk.MustQuery("select * from t order by a;").Check(testkit.Rows("101", "112", "500")) + tk.MustExec("drop table if exists t;") + + // Check for warning in case we can't set the auto_increment to the desired value + tk.MustExec("create table t(a int primary key auto_increment) AUTO_ID_CACHE 1") + tk.MustExec("insert into t values (200)") + tk.MustQuery("show create table t").Check(testkit.Rows( + "t CREATE TABLE `t` (\n" + + " `a` int(11) NOT NULL AUTO_INCREMENT,\n" + + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![auto_id_cache] AUTO_ID_CACHE=1 */")) + tk.MustExec("alter table t auto_increment=100;") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 Can't reset AUTO_INCREMENT to 100 without FORCE option, using 201 instead")) + tk.MustExec("insert into t values ()") + tk.MustQuery("select * from t").Check(testkit.Rows("200", "211")) + tk.MustQuery("show create table t").Check(testkit.Rows( + "t CREATE TABLE `t` (\n" + + " `a` int(11) NOT NULL AUTO_INCREMENT,\n" + + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![auto_id_cache] AUTO_ID_CACHE=1 */")) + tk.MustExec("drop table t") +} + func TestIssue20490(t *testing.T) { store := testkit.CreateMockStore(t, mockstore.WithDDLChecker()) @@ -4135,3 +4311,78 @@ func TestRegexpFunctionsGeneratedColumn(t *testing.T) { tk.MustExec("drop table if exists reg_like") } + +func TestReorgPartitionRangeFailure(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec(`create schema reorgfail`) + tk.MustExec("use reorgfail") + + tk.MustExec("CREATE TABLE t (id int, d varchar(255)) partition by range (id) (partition p0 values less than (1000000), partition p1 values less than (2000000), partition p2 values less than (3000000))") + tk.MustContainErrMsg(`ALTER TABLE t REORGANIZE PARTITION p0,p2 INTO (PARTITION p0 VALUES LESS THAN (1000000))`, "[ddl:8200]Unsupported REORGANIZE PARTITION of RANGE; not adjacent partitions") + tk.MustContainErrMsg(`ALTER TABLE t REORGANIZE PARTITION p0,p2 INTO (PARTITION p0 VALUES LESS THAN (4000000))`, "[ddl:8200]Unsupported REORGANIZE PARTITION of RANGE; not adjacent partitions") +} + +func TestReorgPartitionDocs(t *testing.T) { + // To test what is added as partition management in the docs + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec(`create schema reorgdocs`) + tk.MustExec("use reorgdocs") + tk.MustExec(`CREATE TABLE members ( + id int, + fname varchar(255), + lname varchar(255), + dob date, + data json +) +PARTITION BY RANGE (YEAR(dob)) ( + PARTITION pBefore1950 VALUES LESS THAN (1950), + PARTITION p1950 VALUES LESS THAN (1960), + PARTITION p1960 VALUES LESS THAN (1970), + PARTITION p1970 VALUES LESS THAN (1980), + PARTITION p1980 VALUES LESS THAN (1990), + PARTITION p1990 VALUES LESS THAN (2000))`) + tk.MustExec(`CREATE TABLE member_level ( + id int, + level int, + achievements json +) +PARTITION BY LIST (level) ( + PARTITION l1 VALUES IN (1), + PARTITION l2 VALUES IN (2), + PARTITION l3 VALUES IN (3), + PARTITION l4 VALUES IN (4), + PARTITION l5 VALUES IN (5));`) + tk.MustExec(`ALTER TABLE members DROP PARTITION p1990`) + tk.MustExec(`ALTER TABLE member_level DROP PARTITION l5`) + tk.MustExec(`ALTER TABLE members TRUNCATE PARTITION p1980`) + tk.MustExec(`ALTER TABLE member_level TRUNCATE PARTITION l4`) + tk.MustExec("ALTER TABLE members ADD PARTITION (PARTITION `p1990to2010` VALUES LESS THAN (2010))") + tk.MustExec(`ALTER TABLE member_level ADD PARTITION (PARTITION l5_6 VALUES IN (5,6))`) + tk.MustContainErrMsg(`ALTER TABLE members ADD PARTITION (PARTITION p1990 VALUES LESS THAN (2000))`, "[ddl:1493]VALUES LESS THAN value must be strictly increasing for each partition") + tk.MustExec(`ALTER TABLE members REORGANIZE PARTITION p1990to2010 INTO +(PARTITION p1990 VALUES LESS THAN (2000), + PARTITION p2000 VALUES LESS THAN (2010), + PARTITION p2010 VALUES LESS THAN (2020), + PARTITION p2020 VALUES LESS THAN (2030), + PARTITION pMax VALUES LESS THAN (MAXVALUE))`) + tk.MustExec(`ALTER TABLE member_level REORGANIZE PARTITION l5_6 INTO +(PARTITION l5 VALUES IN (5), + PARTITION l6 VALUES IN (6))`) + tk.MustExec(`ALTER TABLE members REORGANIZE PARTITION pBefore1950,p1950 INTO (PARTITION pBefore1960 VALUES LESS THAN (1960))`) + tk.MustExec(`ALTER TABLE member_level REORGANIZE PARTITION l1,l2 INTO (PARTITION l1_2 VALUES IN (1,2))`) + tk.MustExec(`ALTER TABLE members REORGANIZE PARTITION pBefore1960,p1960,p1970,p1980,p1990,p2000,p2010,p2020,pMax INTO +(PARTITION p1800 VALUES LESS THAN (1900), + PARTITION p1900 VALUES LESS THAN (2000), + PARTITION p2000 VALUES LESS THAN (2100))`) + tk.MustExec(`ALTER TABLE member_level REORGANIZE PARTITION l1_2,l3,l4,l5,l6 INTO +(PARTITION lOdd VALUES IN (1,3,5), + PARTITION lEven VALUES IN (2,4,6))`) + tk.MustContainErrMsg(`ALTER TABLE members REORGANIZE PARTITION p1800,p2000 INTO (PARTITION p2000 VALUES LESS THAN (2100))`, "[ddl:8200]Unsupported REORGANIZE PARTITION of RANGE; not adjacent partitions") + tk.MustExec(`INSERT INTO members VALUES (313, "John", "Doe", "2022-11-22", NULL)`) + tk.MustExec(`ALTER TABLE members REORGANIZE PARTITION p2000 INTO (PARTITION p2000 VALUES LESS THAN (2050))`) + tk.MustContainErrMsg(`ALTER TABLE members REORGANIZE PARTITION p2000 INTO (PARTITION p2000 VALUES LESS THAN (2020))`, "[table:1526]Table has no partition for value 2022") + tk.MustExec(`INSERT INTO member_level (id, level) values (313, 6)`) + tk.MustContainErrMsg(`ALTER TABLE member_level REORGANIZE PARTITION lEven INTO (PARTITION lEven VALUES IN (2,4))`, "[table:1526]Table has no partition for value 6") +} diff --git a/ddl/db_partition_test.go b/ddl/db_partition_test.go index e5ad2aa2bbfec..d9d609858bb06 100644 --- a/ddl/db_partition_test.go +++ b/ddl/db_partition_test.go @@ -20,6 +20,7 @@ import ( "fmt" "math/rand" "strings" + "sync" "sync/atomic" "testing" "time" @@ -27,6 +28,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/ddl/testutil" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" @@ -1409,7 +1411,7 @@ func TestAlterTableDropPartitionByList(t *testing.T) { );`) tk.MustExec(`insert into t values (1),(3),(5),(null)`) tk.MustExec(`alter table t drop partition p1`) - tk.MustQuery("select * from t").Sort().Check(testkit.Rows("1", "5", "")) + tk.MustQuery("select * from t order by id").Check(testkit.Rows("", "1", "5")) ctx := tk.Session() is := domain.GetDomain(ctx).InfoSchema() tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) @@ -2246,14 +2248,6 @@ func TestExchangePartitionTableCompatiable(t *testing.T) { "alter table pt8 exchange partition p0 with table nt8;", dbterror.ErrTablesDifferentMetadata, }, - { - // foreign key test - // Partition table doesn't support to add foreign keys in mysql - "create table pt9 (id int not null primary key auto_increment,t_id int not null) partition by hash(id) partitions 1;", - "create table nt9 (id int not null primary key auto_increment, t_id int not null,foreign key fk_id (t_id) references pt5(id));", - "alter table pt9 exchange partition p0 with table nt9;", - dbterror.ErrPartitionExchangeForeignKey, - }, { // Generated column (virtual) "create table pt10 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname,' ')) virtual) partition by hash(id) partitions 1;", @@ -2454,7 +2448,7 @@ func TestExchangePartitionHook(t *testing.T) { tk.MustExec(`insert into pt values (0), (4), (7)`) tk.MustExec("insert into nt values (1)") - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} dom.DDL().SetHook(hook) hookFunc := func(job *model.Job) { @@ -3343,9 +3337,6 @@ func TestPartitionErrorCode(t *testing.T) { );`) tk.MustGetDBError("alter table t_part coalesce partition 4;", dbterror.ErrCoalesceOnlyOnHashPartition) - tk.MustGetErrCode(`alter table t_part reorganize partition p0, p1 into ( - partition p0 values less than (1980));`, errno.ErrUnsupportedDDLOperation) - tk.MustGetErrCode("alter table t_part check partition p0, p1;", errno.ErrUnsupportedDDLOperation) tk.MustGetErrCode("alter table t_part optimize partition p0,p1;", errno.ErrUnsupportedDDLOperation) tk.MustGetErrCode("alter table t_part rebuild partition p0,p1;", errno.ErrUnsupportedDDLOperation) @@ -3740,7 +3731,7 @@ func TestTruncatePartitionMultipleTimes(t *testing.T) { dom := domain.GetDomain(tk.Session()) originHook := dom.DDL().GetHook() defer dom.DDL().SetHook(originHook) - hook := &ddl.TestDDLCallback{} + hook := &callback.TestDDLCallback{} dom.DDL().SetHook(hook) injected := false hook.OnJobRunBeforeExported = func(job *model.Job) { @@ -3757,9 +3748,9 @@ func TestTruncatePartitionMultipleTimes(t *testing.T) { } hook.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) done1 := make(chan error, 1) - go backgroundExec(store, "alter table test.t truncate partition p0;", done1) + go backgroundExec(store, "test", "alter table test.t truncate partition p0;", done1) done2 := make(chan error, 1) - go backgroundExec(store, "alter table test.t truncate partition p0;", done2) + go backgroundExec(store, "test", "alter table test.t truncate partition p0;", done2) <-done1 <-done2 require.LessOrEqual(t, errCount, int32(1)) @@ -4536,134 +4527,61 @@ func TestPartitionTableWithAnsiQuotes(t *testing.T) { ` PARTITION "pMax" VALUES LESS THAN (MAXVALUE,MAXVALUE))`)) } -func TestAlterModifyColumnOnPartitionedTable(t *testing.T) { +func TestIssue40135Ver2(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + + tk3 := testkit.NewTestKit(t, store) + tk3.MustExec("use test") + + tk.MustExec("CREATE TABLE t40135 ( a int DEFAULT NULL, b varchar(32) DEFAULT 'md', index(a)) PARTITION BY HASH (a) PARTITIONS 6") + tk.MustExec("insert into t40135 values (1, 'md'), (2, 'ma'), (3, 'md'), (4, 'ma'), (5, 'md'), (6, 'ma')") + one := true + hook := &callback.TestDDLCallback{Do: dom} + var checkErr error + var wg sync.WaitGroup + wg.Add(1) + hook.OnJobRunBeforeExported = func(job *model.Job) { + if job.SchemaState == model.StateDeleteOnly { + tk3.MustExec("delete from t40135 where a = 1") + } + if one { + one = false + go func() { + _, checkErr = tk1.Exec("alter table t40135 modify column a int NULL") + wg.Done() + }() + } + } + dom.DDL().SetHook(hook) + tk.MustExec("alter table t40135 modify column a bigint NULL DEFAULT '6243108' FIRST") + wg.Wait() + require.ErrorContains(t, checkErr, "[ddl:8200]Unsupported modify column: table is partition table") + tk.MustExec("admin check table t40135") +} + +func TestAlterModifyPartitionColTruncateWarning(t *testing.T) { + t.Skip("waiting for supporting Modify Partition Column again") store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) - tk.MustExec("create database AlterPartTable") - tk.MustExec("use AlterPartTable") - tk.MustExec(`create table t (a int unsigned PRIMARY KEY, b varchar(255), key (b))`) - tk.MustExec(`insert into t values (7, "07"), (8, "08"),(23,"23"),(34,"34💥"),(46,"46"),(57,"57")`) - tk.MustQuery(`show create table t`).Check(testkit.Rows( - "t CREATE TABLE `t` (\n" + - " `a` int(10) unsigned NOT NULL,\n" + - " `b` varchar(255) DEFAULT NULL,\n" + - " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */,\n" + - " KEY `b` (`b`)\n" + - ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) - // TODO: Why does it allow 💥 as a latin1 character? - tk.MustQuery(`select hex(b) from t where a = 34`).Check(testkit.Rows("3334F09F92A5")) - tk.MustExec(`alter table t modify b varchar(200) charset latin1`) - tk.MustQuery(`show create table t`).Check(testkit.Rows( - "t CREATE TABLE `t` (\n" + - " `a` int(10) unsigned NOT NULL,\n" + - " `b` varchar(200) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,\n" + - " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */,\n" + - " KEY `b` (`b`)\n" + - ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) - tk.MustQuery(`select hex(b) from t where a = 34`).Check(testkit.Rows("3334F09F92A5")) - tk.MustQuery(`select * from t`).Sort().Check(testkit.Rows(""+ - "23 23", - "34 34💥", - "46 46", - "57 57", - "7 07", - "8 08")) - tk.MustQuery(`select * from t order by b`).Check(testkit.Rows(""+ - "7 07", - "8 08", - "23 23", - "34 34💥", - "46 46", - "57 57")) - tk.MustExec(`alter table t change b c varchar(200) charset utf8mb4`) - tk.MustExec(`drop table t`) - tk.MustExec(`create table t (a int unsigned PRIMARY KEY, b varchar(255), key (b)) partition by range (a) ` + - `(partition p0 values less than (10),` + - ` partition p1 values less than (20),` + - ` partition p2 values less than (30),` + - ` partition pMax values less than (MAXVALUE))`) - tk.MustExec(`insert into t values (7, "07"), (8, "08"),(23,"23"),(34,"34💥"),(46,"46"),(57,"57")`) - tk.MustQuery(`select * from t`).Sort().Check(testkit.Rows(""+ - "23 23", - "34 34💥", - "46 46", - "57 57", - "7 07", - "8 08")) - tk.MustQuery(`select * from t order by b`).Check(testkit.Rows(""+ - "7 07", - "8 08", - "23 23", - "34 34💥", - "46 46", - "57 57")) - tk.MustQuery(`show create table t`).Check(testkit.Rows( - "t CREATE TABLE `t` (\n" + - " `a` int(10) unsigned NOT NULL,\n" + - " `b` varchar(255) DEFAULT NULL,\n" + - " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */,\n" + - " KEY `b` (`b`)\n" + - ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + - "PARTITION BY RANGE (`a`)\n" + - "(PARTITION `p0` VALUES LESS THAN (10),\n" + - " PARTITION `p1` VALUES LESS THAN (20),\n" + - " PARTITION `p2` VALUES LESS THAN (30),\n" + - " PARTITION `pMax` VALUES LESS THAN (MAXVALUE))")) - tk.MustExec(`alter table t modify b varchar(200) charset latin1`) - tk.MustQuery(`show create table t`).Check(testkit.Rows( - "t CREATE TABLE `t` (\n" + - " `a` int(10) unsigned NOT NULL,\n" + - " `b` varchar(200) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,\n" + - " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */,\n" + - " KEY `b` (`b`)\n" + - ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + - "PARTITION BY RANGE (`a`)\n" + - "(PARTITION `p0` VALUES LESS THAN (10),\n" + - " PARTITION `p1` VALUES LESS THAN (20),\n" + - " PARTITION `p2` VALUES LESS THAN (30),\n" + - " PARTITION `pMax` VALUES LESS THAN (MAXVALUE))")) - tk.MustQuery(`select * from t`).Sort().Check(testkit.Rows(""+ - "23 23", - "34 34💥", - "46 46", - "57 57", - "7 07", - "8 08")) - tk.MustQuery(`select * from t order by b`).Check(testkit.Rows(""+ - "7 07", - "8 08", - "23 23", - "34 34💥", - "46 46", - "57 57")) - tk.MustExec(`alter table t change b c varchar(150) charset utf8mb4`) - tk.MustQuery(`show create table t`).Check(testkit.Rows( - "t CREATE TABLE `t` (\n" + - " `a` int(10) unsigned NOT NULL,\n" + - " `c` varchar(150) DEFAULT NULL,\n" + - " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */,\n" + - " KEY `b` (`c`)\n" + - ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + - "PARTITION BY RANGE (`a`)\n" + - "(PARTITION `p0` VALUES LESS THAN (10),\n" + - " PARTITION `p1` VALUES LESS THAN (20),\n" + - " PARTITION `p2` VALUES LESS THAN (30),\n" + - " PARTITION `pMax` VALUES LESS THAN (MAXVALUE))")) - tk.MustQuery(`select * from t`).Sort().Check(testkit.Rows(""+ - "23 23", - "34 34💥", - "46 46", - "57 57", - "7 07", - "8 08")) - tk.MustQuery(`select * from t order by c`).Check(testkit.Rows(""+ - "7 07", - "8 08", - "23 23", - "34 34💥", - "46 46", - "57 57")) - tk.MustGetErrCode(`alter table t modify a varchar(20)`, errno.ErrUnsupportedDDLOperation) + schemaName := "truncWarn" + tk.MustExec("create database " + schemaName) + tk.MustExec("use " + schemaName) + tk.MustExec(`set sql_mode = default`) + tk.MustExec(`create table t (a varchar(255)) partition by range columns (a) (partition p1 values less than ("0"), partition p2 values less than ("zzzz"))`) + tk.MustExec(`insert into t values ("123456"),(" 654321")`) + tk.MustContainErrMsg(`alter table t modify a varchar(5)`, "[types:1265]Data truncated for column 'a', value is '") + tk.MustExec(`set sql_mode = ''`) + tk.MustExec(`alter table t modify a varchar(5)`) + // Fix the duplicate warning, see https://github.com/pingcap/tidb/issues/38699 + tk.MustQuery(`show warnings`).Check(testkit.Rows(""+ + "Warning 1265 Data truncated for column 'a', value is ' 654321'", + "Warning 1265 Data truncated for column 'a', value is ' 654321'")) + tk.MustExec(`admin check table t`) } func TestAlterModifyColumnOnPartitionedTableRename(t *testing.T) { @@ -4673,94 +4591,49 @@ func TestAlterModifyColumnOnPartitionedTableRename(t *testing.T) { tk.MustExec("create database " + schemaName) tk.MustExec("use " + schemaName) tk.MustExec(`create table t (a int, b char) partition by range (a) (partition p0 values less than (10))`) - tk.MustContainErrMsg(`alter table t change a c int`, "[planner:1054]Unknown column 'a' in 'expression'") + tk.MustContainErrMsg(`alter table t change a c int`, "[ddl:3855]Column 'a' has a partitioning function dependency and cannot be dropped or renamed") tk.MustExec(`drop table t`) tk.MustExec(`create table t (a char, b char) partition by range columns (a) (partition p0 values less than ('z'))`) - tk.MustContainErrMsg(`alter table t change a c char`, "[ddl:8200]New column does not match partition definitions: [ddl:1567]partition column name cannot be found") + tk.MustContainErrMsg(`alter table t change a c char`, "[ddl:3855]Column 'a' has a partitioning function dependency and cannot be dropped or renamed") tk.MustExec(`drop table t`) tk.MustExec(`create table t (a int, b char) partition by list (a) (partition p0 values in (10))`) - tk.MustContainErrMsg(`alter table t change a c int`, "[planner:1054]Unknown column 'a' in 'expression'") + tk.MustContainErrMsg(`alter table t change a c int`, "[ddl:3855]Column 'a' has a partitioning function dependency and cannot be dropped or renamed") tk.MustExec(`drop table t`) tk.MustExec(`create table t (a char, b char) partition by list columns (a) (partition p0 values in ('z'))`) - tk.MustContainErrMsg(`alter table t change a c char`, "[ddl:8200]New column does not match partition definitions: [ddl:1567]partition column name cannot be found") + tk.MustContainErrMsg(`alter table t change a c char`, "[ddl:3855]Column 'a' has a partitioning function dependency and cannot be dropped or renamed") tk.MustExec(`drop table t`) tk.MustExec(`create table t (a int, b char) partition by hash (a) partitions 3`) - tk.MustContainErrMsg(`alter table t change a c int`, "[planner:1054]Unknown column 'a' in 'expression'") + tk.MustContainErrMsg(`alter table t change a c int`, "[ddl:3855]Column 'a' has a partitioning function dependency and cannot be dropped or renamed") } -func TestAlterModifyColumnOnPartitionedTableFail(t *testing.T) { +func TestDropPartitionKeyColumn(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) - schemaName := "modColPartFail" - tk.MustExec("create database " + schemaName) - tk.MustExec("use " + schemaName) - tk.MustExec(`create table t (a int unsigned, b varchar(255), key (b)) partition by range (a) (partition p0 values less than (10), partition p1 values less than (20), partition pMax values less than (MAXVALUE))`) - tk.MustExec(`insert into t values (7, "07"), (8, "08"),(23,"23"),(34,"34💥"),(46,"46"),(57,"57")`) - tk.MustGetErrCode(`alter table t modify a varchar(255)`, errno.ErrUnsupportedDDLOperation) - tk.MustGetErrCode(`alter table t modify a float`, mysql.ErrFieldTypeNotAllowedAsPartitionField) - tk.MustExec(`drop table t`) - tk.MustExec(`create table t (b int unsigned, a varchar(255), key (b)) partition by range columns (a) (partition p0 values less than (""), partition p1 values less than ("11111"), partition pMax values less than (MAXVALUE))`) - tk.MustExec(`insert into t values (7, "07"), (8, "08"),(23,"23"),(34,"34 💥💥Longer than 11111"),(46,"46"),(57,"57")`) - tk.MustExec(`alter table t modify a varchar(50)`) - tk.MustGetErrCode(`alter table t modify a float`, mysql.ErrFieldTypeNotAllowedAsPartitionField) - tk.MustGetErrCode(`alter table t modify a int`, errno.ErrUnsupportedDDLOperation) - tk.MustContainErrMsg(`alter table t modify a varchar(4)`, "[ddl:8200]New column does not match partition definitions: [ddl:1654]Partition column values of incorrect type") - tk.MustGetErrCode(`alter table t modify a varchar(5)`, errno.WarnDataTruncated) - tk.MustExec(`SET SQL_MODE = ''`) - tk.MustExec(`alter table t modify a varchar(5)`) - // fix https://github.com/pingcap/tidb/issues/38669 and update this - tk.MustQuery(`show warnings`).Check(testkit.Rows()) - tk.MustExec(`SET SQL_MODE = DEFAULT`) - tk.MustQuery(`select * from t`).Sort().Check(testkit.Rows(""+ - "23 23", - "34 34 💥💥", - "46 46", - "57 57", - "7 07", - "8 08")) - tStr := "" + - "CREATE TABLE `t` (\n" + - " `b` int(10) unsigned DEFAULT NULL,\n" + - " `a` varchar(5) DEFAULT NULL,\n" + - " KEY `b` (`b`)\n" + - ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + - "PARTITION BY RANGE COLUMNS(`a`)\n" + - "(PARTITION `p0` VALUES LESS THAN (''),\n" + - " PARTITION `p1` VALUES LESS THAN ('11111'),\n" + - " PARTITION `pMax` VALUES LESS THAN (MAXVALUE))" - tk.MustQuery(`show create table t`).Check(testkit.Rows("t " + tStr)) - tk.MustExec(`drop table t`) - tk.MustExec(tStr) - tk.MustExec(`drop table t`) - tk.MustExec("create table t (a int, b varchar(255), key (b)) partition by range (a) (partition `p-300` values less than (-300), partition p0 values less than (0), partition p300 values less than (300))") - tk.MustExec(`insert into t values (-400, "-400"), (-100, "-100"), (0, "0"), (100, "100"), (290, "290")`) - tk.MustContainErrMsg(`alter table t modify a int unsigned`, "[ddl:8200]Unsupported modify column, decreasing length of int may result in truncation and change of partition") - tk.MustContainErrMsg(`alter table t modify a tinyint`, "[ddl:8200]Unsupported modify column, decreasing length of int may result in truncation and change of partition") - tk.MustExec(`set sql_mode = ''`) - tk.MustContainErrMsg(`alter table t modify a tinyint`, "[ddl:8200]Unsupported modify column, decreasing length of int may result in truncation and change of partition") - tk.MustQuery("select * from t partition (`p-300`)").Sort().Check(testkit.Rows("-400 -400")) - tk.MustExec(`set sql_mode = default`) - tk.MustContainErrMsg(`alter table t modify a smallint`, "[ddl:8200]Unsupported modify column, decreasing length of int may result in truncation and change of partition") - tk.MustExec(`alter table t modify a bigint`) - tk.MustExec(`drop table t`) - tk.MustExec("create table t (a int, b varchar(255), key (b)) partition by range columns (a) (partition `p-300` values less than (-300), partition p0 values less than (0), partition p300 values less than (300))") - tk.MustExec(`insert into t values (-400, "-400"), (-100, "-100"), (0, "0"), (100, "100"), (290, "290")`) - tk.MustContainErrMsg(`alter table t modify a int unsigned`, "[ddl:8200]Unsupported modify column: can't change the partitioning column, since it would require reorganize all partitions") - tk.MustContainErrMsg(`alter table t modify a tinyint`, "[ddl:8200]New column does not match partition definitions: [ddl:1654]Partition column values of incorrect type") - tk.MustExec(`set sql_mode = ''`) - tk.MustContainErrMsg(`alter table t modify a tinyint`, "[ddl:8200]New column does not match partition definitions: [ddl:1654]Partition column values of incorrect type") - tk.MustQuery("select * from t partition (`p-300`)").Sort().Check(testkit.Rows("-400 -400")) - tk.MustExec(`set sql_mode = default`) - // OK to decrease, since with RANGE COLUMNS, it will check the partition definition values against the new type - tk.MustExec(`alter table t modify a smallint`) - tk.MustExec(`alter table t modify a bigint`) + tk.MustExec("create database DropPartitionKeyColumn") + defer tk.MustExec("drop database DropPartitionKeyColumn") + tk.MustExec("use DropPartitionKeyColumn") - tk.MustExec(`drop table t`) + tk.MustExec("create table t1 (a tinyint, b char) partition by range (a) ( partition p0 values less than (10) )") + err := tk.ExecToErr("alter table t1 drop column a") + require.Error(t, err) + require.Equal(t, "[ddl:3855]Column 'a' has a partitioning function dependency and cannot be dropped or renamed", err.Error()) + tk.MustExec("alter table t1 drop column b") - tk.MustExec(`create table t (a int, b varchar(255), key (b)) partition by list columns (b) (partition p1 values in ("1", "ab", "12345"), partition p2 values in ("2", "abc", "999999"))`) - tk.MustExec(`insert into t values (1, "1"), (2, "2"), (999999, "999999")`) - tk.MustContainErrMsg(`alter table t modify column b varchar(5)`, "[ddl:8200]New column does not match partition definitions: [ddl:1654]Partition column values of incorrect type") - tk.MustExec(`set sql_mode = ''`) - tk.MustContainErrMsg(`alter table t modify column b varchar(5)`, "[ddl:8200]New column does not match partition definitions: [ddl:1654]Partition column values of incorrect type") - tk.MustExec(`set sql_mode = default`) + tk.MustExec("create table t2 (a tinyint, b char) partition by range (a-1) ( partition p0 values less than (10) )") + err = tk.ExecToErr("alter table t2 drop column a") + require.Error(t, err) + require.Equal(t, "[ddl:3855]Column 'a' has a partitioning function dependency and cannot be dropped or renamed", err.Error()) + tk.MustExec("alter table t2 drop column b") + + tk.MustExec("create table t3 (a tinyint, b char) partition by hash(a) partitions 4;") + err = tk.ExecToErr("alter table t3 drop column a") + require.Error(t, err) + require.Equal(t, "[ddl:3855]Column 'a' has a partitioning function dependency and cannot be dropped or renamed", err.Error()) + tk.MustExec("alter table t3 drop column b") + + tk.MustExec("create table t4 (a char, b char) partition by list columns (a) ( partition p0 values in ('0'), partition p1 values in ('a'), partition p2 values in ('b'));") + err = tk.ExecToErr("alter table t4 drop column a") + require.Error(t, err) + require.Equal(t, "[ddl:3855]Column 'a' has a partitioning function dependency and cannot be dropped or renamed", err.Error()) + tk.MustExec("alter table t4 drop column b") } diff --git a/ddl/db_table_test.go b/ddl/db_table_test.go index 2771a06ecc291..96a0e3524ae3c 100644 --- a/ddl/db_table_test.go +++ b/ddl/db_table_test.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" testddlutil "github.com/pingcap/tidb/ddl/testutil" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" @@ -51,7 +52,7 @@ func TestTableForeignKey(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") - tk.MustExec("create table t1 (a int, b int);") + tk.MustExec("create table t1 (a int, b int, index(a), index(b));") // test create table with foreign key. failSQL := "create table t2 (c int, foreign key (a) references t1(a));" tk.MustGetErrCode(failSQL, errno.ErrKeyColumnDoesNotExits) @@ -185,7 +186,7 @@ func TestTransactionOnAddDropColumn(t *testing.T) { originHook := dom.DDL().GetHook() defer dom.DDL().SetHook(originHook) - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} var checkErr error hook.OnJobRunBeforeExported = func(job *model.Job) { if checkErr != nil { @@ -209,7 +210,7 @@ func TestTransactionOnAddDropColumn(t *testing.T) { dom.DDL().SetHook(hook) done := make(chan error, 1) // test transaction on add column. - go backgroundExec(store, "alter table t1 add column c int not null after a", done) + go backgroundExec(store, "test", "alter table t1 add column c int not null after a", done) err := <-done require.NoError(t, err) require.Nil(t, checkErr) @@ -217,7 +218,7 @@ func TestTransactionOnAddDropColumn(t *testing.T) { tk.MustExec("delete from t1") // test transaction on drop column. - go backgroundExec(store, "alter table t1 drop column c", done) + go backgroundExec(store, "test", "alter table t1 drop column c", done) err = <-done require.NoError(t, err) require.Nil(t, checkErr) @@ -871,8 +872,7 @@ func TestDDLWithInvalidTableInfo(t *testing.T) { tk.MustExec("create table t (a bigint, b int, c int generated always as (b+1)) partition by hash(a) partitions 4;") // Test drop partition column. - // TODO: refine the error message to compatible with MySQL - tk.MustGetErrMsg("alter table t drop column a;", "[planner:1054]Unknown column 'a' in 'expression'") + tk.MustGetErrMsg("alter table t drop column a;", "[ddl:3855]Column 'a' has a partitioning function dependency and cannot be dropped or renamed") // Test modify column with invalid expression. tk.MustGetErrMsg("alter table t modify column c int GENERATED ALWAYS AS ((case when (a = 0) then 0when (a > 0) then (b / a) end));", "[parser:1064]You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use line 1 column 97 near \"then (b / a) end));\" ") // Test add column with invalid expression. @@ -889,7 +889,7 @@ func TestAddColumn2(t *testing.T) { originHook := dom.DDL().GetHook() defer dom.DDL().SetHook(originHook) - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} var writeOnlyTable table.Table hook.OnJobRunBeforeExported = func(job *model.Job) { if job.SchemaState == model.StateWriteOnly { @@ -899,7 +899,7 @@ func TestAddColumn2(t *testing.T) { dom.DDL().SetHook(hook) done := make(chan error, 1) // test transaction on add column. - go backgroundExec(store, "alter table t1 add column c int not null", done) + go backgroundExec(store, "test", "alter table t1 add column c int not null", done) err := <-done require.NoError(t, err) @@ -918,7 +918,7 @@ func TestAddColumn2(t *testing.T) { require.NoError(t, err) _, err = writeOnlyTable.AddRecord(tk.Session(), types.MakeDatums(oldRow[0].GetInt64(), 2, oldRow[2].GetInt64()), table.IsUpdate) require.NoError(t, err) - tk.Session().StmtCommit() + tk.Session().StmtCommit(ctx) err = tk.Session().CommitTxn(ctx) require.NoError(t, err) @@ -940,7 +940,7 @@ func TestAddColumn2(t *testing.T) { } dom.DDL().SetHook(hook) - go backgroundExec(store, "alter table t2 add column b int not null default 3", done) + go backgroundExec(store, "test", "alter table t2 add column b int not null default 3", done) err = <-done require.NoError(t, err) re.Check(testkit.Rows("1 2")) diff --git a/ddl/db_test.go b/ddl/db_test.go index 207aad4e0f116..ca442f15c9ba5 100644 --- a/ddl/db_test.go +++ b/ddl/db_test.go @@ -20,6 +20,7 @@ import ( "math" "strconv" "strings" + "sync" "testing" "time" @@ -27,6 +28,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" ddlutil "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" @@ -40,7 +42,6 @@ import ( "github.com/pingcap/tidb/parser/terror" parsertypes "github.com/pingcap/tidb/parser/types" "github.com/pingcap/tidb/planner/core" - "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/sessiontxn" "github.com/pingcap/tidb/store/mockstore" @@ -54,7 +55,6 @@ import ( "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/oracle" "github.com/tikv/client-go/v2/tikv" - "golang.org/x/exp/slices" ) const ( @@ -270,7 +270,7 @@ func TestIssue22307(t *testing.T) { tk.MustExec("create table t (a int, b int)") tk.MustExec("insert into t values(1, 1);") - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} var checkErr1, checkErr2 error hook.OnJobRunBeforeExported = func(job *model.Job) { if job.SchemaState != model.StateWriteOnly { @@ -282,7 +282,7 @@ func TestIssue22307(t *testing.T) { dom.DDL().SetHook(hook) done := make(chan error, 1) // test transaction on add column. - go backgroundExec(store, "alter table t drop column b;", done) + go backgroundExec(store, "test", "alter table t drop column b;", done) err := <-done require.NoError(t, err) require.EqualError(t, checkErr1, "[planner:1054]Unknown column 'b' in 'where clause'") @@ -571,7 +571,7 @@ func TestAddExpressionIndexRollback(t *testing.T) { tk1.MustExec("use test") d := dom.DDL() - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} var currJob *model.Job ctx := mock.NewContext() ctx.Store = store @@ -619,10 +619,7 @@ func TestAddExpressionIndexRollback(t *testing.T) { // Check whether the reorg information is cleaned up. err := sessiontxn.NewTxn(context.Background(), ctx) require.NoError(t, err) - txn, err := ctx.Txn(true) - require.NoError(t, err) - m := meta.NewMeta(txn) - element, start, end, physicalID, err := ddl.NewReorgHandlerForTest(m, testkit.NewTestKit(t, store).Session()).GetDDLReorgHandle(currJob) + element, start, end, physicalID, err := ddl.NewReorgHandlerForTest(testkit.NewTestKit(t, store).Session()).GetDDLReorgHandle(currJob) require.True(t, meta.ErrDDLReorgElementNotExist.Equal(err)) require.Nil(t, element) require.Nil(t, start) @@ -898,11 +895,11 @@ func TestAutoIncrementIDOnTemporaryTable(t *testing.T) { tk.MustExec("drop table if exists global_temp_auto_id") tk.MustExec("create global temporary table global_temp_auto_id(id int primary key auto_increment) on commit delete rows") tk.MustExec("begin") - tk.MustQuery("show table global_temp_auto_id next_row_id").Check(testkit.Rows("test global_temp_auto_id id 1 AUTO_INCREMENT")) + tk.MustQuery("show table global_temp_auto_id next_row_id").Check(testkit.Rows("test global_temp_auto_id id 1 _TIDB_ROWID")) tk.MustExec("insert into global_temp_auto_id value(null)") tk.MustQuery("select @@last_insert_id").Check(testkit.Rows("1")) tk.MustQuery("select id from global_temp_auto_id").Check(testkit.Rows("1")) - tk.MustQuery("show table global_temp_auto_id next_row_id").Check(testkit.Rows("test global_temp_auto_id id 2 AUTO_INCREMENT")) + tk.MustQuery("show table global_temp_auto_id next_row_id").Check(testkit.Rows("test global_temp_auto_id id 2 _TIDB_ROWID")) tk.MustExec("commit") tk.MustExec("drop table global_temp_auto_id") @@ -914,12 +911,12 @@ func TestAutoIncrementIDOnTemporaryTable(t *testing.T) { " `id` int(11) NOT NULL AUTO_INCREMENT,\n" + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=100 ON COMMIT DELETE ROWS")) - tk.MustQuery("show table global_temp_auto_id next_row_id").Check(testkit.Rows("test global_temp_auto_id id 100 AUTO_INCREMENT")) + tk.MustQuery("show table global_temp_auto_id next_row_id").Check(testkit.Rows("test global_temp_auto_id id 100 _TIDB_ROWID")) tk.MustExec("begin") tk.MustExec("insert into global_temp_auto_id value(null)") tk.MustQuery("select @@last_insert_id").Check(testkit.Rows("100")) tk.MustQuery("select id from global_temp_auto_id").Check(testkit.Rows("100")) - tk.MustQuery("show table global_temp_auto_id next_row_id").Check(testkit.Rows("test global_temp_auto_id id 101 AUTO_INCREMENT")) + tk.MustQuery("show table global_temp_auto_id next_row_id").Check(testkit.Rows("test global_temp_auto_id id 101 _TIDB_ROWID")) tk.MustExec("commit") } tk.MustExec("drop table global_temp_auto_id") @@ -962,7 +959,7 @@ func TestDDLJobErrorCount(t *testing.T) { }() var jobID int64 - hook := &ddl.TestDDLCallback{} + hook := &callback.TestDDLCallback{} onJobUpdatedExportedFunc := func(job *model.Job) { jobID = job.ID } @@ -980,201 +977,6 @@ func TestDDLJobErrorCount(t *testing.T) { require.True(t, kv.ErrEntryTooLarge.Equal(historyJob.Error)) } -func TestCommitTxnWithIndexChange(t *testing.T) { - store, dom := testkit.CreateMockStoreAndDomainWithSchemaLease(t, dbTestLease) - // Prepare work. - tk := testkit.NewTestKit(t, store) - tk.MustExec("set global tidb_enable_metadata_lock=0") - tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") - tk.MustExec("use test") - tk.MustExec("create table t1 (c1 int primary key, c2 int, c3 int, index ok2(c2))") - tk.MustExec("insert t1 values (1, 10, 100), (2, 20, 200)") - tk.MustExec("alter table t1 add index k2(c2)") - tk.MustExec("alter table t1 drop index k2") - tk.MustExec("alter table t1 add index k2(c2)") - tk.MustExec("alter table t1 drop index k2") - tk2 := testkit.NewTestKit(t, store) - tk2.MustExec("use test") - - // tkSQLs are the sql statements for the pessimistic transaction. - // tk2DDL are the ddl statements executed before the pessimistic transaction. - // idxDDL is the DDL statement executed between pessimistic transaction begin and commit. - // failCommit means the pessimistic transaction commit should fail not. - type caseUnit struct { - tkSQLs []string - tk2DDL []string - idxDDL string - checkSQLs []string - rowsExps [][]string - failCommit bool - stateEnd model.SchemaState - } - - cases := []caseUnit{ - // Test secondary index - {[]string{"insert into t1 values(3, 30, 300)", - "insert into t2 values(11, 11, 11)"}, - []string{"alter table t1 add index k2(c2)", - "alter table t1 drop index k2", - "alter table t1 add index kk2(c2, c1)", - "alter table t1 add index k2(c2)", - "alter table t1 drop index k2"}, - "alter table t1 add index k2(c2)", - []string{"select c3, c2 from t1 use index(k2) where c2 = 20", - "select c3, c2 from t1 use index(k2) where c2 = 10", - "select * from t1", - "select * from t2 where c1 = 11"}, - [][]string{{"200 20"}, - {"100 10"}, - {"1 10 100", "2 20 200", "3 30 300"}, - {"11 11 11"}}, - false, - model.StateNone}, - // Test secondary index - {[]string{"insert into t2 values(5, 50, 500)", - "insert into t2 values(11, 11, 11)", - "delete from t2 where c2 = 11", - "update t2 set c2 = 110 where c1 = 11"}, - // "update t2 set c1 = 10 where c3 = 100"}, - []string{"alter table t1 add index k2(c2)", - "alter table t1 drop index k2", - "alter table t1 add index kk2(c2, c1)", - "alter table t1 add index k2(c2)", - "alter table t1 drop index k2"}, - "alter table t1 add index k2(c2)", - []string{"select c3, c2 from t1 use index(k2) where c2 = 20", - "select c3, c2 from t1 use index(k2) where c2 = 10", - "select * from t1", - "select * from t2 where c1 = 11", - "select * from t2 where c3 = 100"}, - [][]string{{"200 20"}, - {"100 10"}, - {"1 10 100", "2 20 200"}, - {}, - {"1 10 100"}}, - false, - model.StateNone}, - // Test unique index - {[]string{"insert into t1 values(3, 30, 300)", - "insert into t1 values(4, 40, 400)", - "insert into t2 values(11, 11, 11)", - "insert into t2 values(12, 12, 11)"}, - []string{"alter table t1 add unique index uk3(c3)", - "alter table t1 drop index uk3", - "alter table t2 add unique index ukc1c3(c1, c3)", - "alter table t2 add unique index ukc3(c3)", - "alter table t2 drop index ukc1c3", - "alter table t2 drop index ukc3", - "alter table t2 add index kc3(c3)"}, - "alter table t1 add unique index uk3(c3)", - []string{"select c3, c2 from t1 use index(uk3) where c3 = 200", - "select c3, c2 from t1 use index(uk3) where c3 = 300", - "select c3, c2 from t1 use index(uk3) where c3 = 400", - "select * from t1", - "select * from t2"}, - [][]string{{"200 20"}, - {"300 30"}, - {"400 40"}, - {"1 10 100", "2 20 200", "3 30 300", "4 40 400"}, - {"1 10 100", "2 20 200", "11 11 11", "12 12 11"}}, - false, model.StateNone}, - // Test unique index fail to commit, this case needs the new index could be inserted - {[]string{"insert into t1 values(3, 30, 300)", - "insert into t1 values(4, 40, 300)", - "insert into t2 values(11, 11, 11)", - "insert into t2 values(12, 11, 12)"}, - //[]string{"alter table t1 add unique index uk3(c3)", "alter table t1 drop index uk3"}, - []string{}, - "alter table t1 add unique index uk3(c3)", - []string{"select c3, c2 from t1 use index(uk3) where c3 = 200", - "select c3, c2 from t1 use index(uk3) where c3 = 300", - "select c3, c2 from t1 where c1 = 4", - "select * from t1", - "select * from t2"}, - [][]string{{"200 20"}, - {}, - {}, - {"1 10 100", "2 20 200"}, - {"1 10 100", "2 20 200"}}, - true, - model.StateWriteOnly}, - } - tk.MustQuery("select * from t1;").Check(testkit.Rows("1 10 100", "2 20 200")) - - // Test add index state change - do := dom.DDL() - startStates := []model.SchemaState{model.StateNone, model.StateDeleteOnly} - for _, startState := range startStates { - endStatMap := session.ConstOpAddIndex[startState] - var endStates []model.SchemaState - for st := range endStatMap { - endStates = append(endStates, st) - } - slices.Sort(endStates) - for _, endState := range endStates { - for _, curCase := range cases { - if endState < curCase.stateEnd { - break - } - tk2.MustExec("drop table if exists t1") - tk2.MustExec("drop table if exists t2") - tk2.MustExec("create table t1 (c1 int primary key, c2 int, c3 int, index ok2(c2))") - tk2.MustExec("create table t2 (c1 int primary key, c2 int, c3 int, index ok2(c2))") - tk2.MustExec("insert t1 values (1, 10, 100), (2, 20, 200)") - tk2.MustExec("insert t2 values (1, 10, 100), (2, 20, 200)") - tk2.MustQuery("select * from t1;").Check(testkit.Rows("1 10 100", "2 20 200")) - tk.MustQuery("select * from t1;").Check(testkit.Rows("1 10 100", "2 20 200")) - tk.MustQuery("select * from t2;").Check(testkit.Rows("1 10 100", "2 20 200")) - - for _, DDLSQL := range curCase.tk2DDL { - tk2.MustExec(DDLSQL) - } - hook := &ddl.TestDDLCallback{Do: dom} - prepared := false - committed := false - hook.OnJobRunBeforeExported = func(job *model.Job) { - if job.SchemaState == startState { - if !prepared { - tk.MustExec("begin pessimistic") - for _, tkSQL := range curCase.tkSQLs { - tk.MustExec(tkSQL) - } - prepared = true - } - } - } - onJobUpdatedExportedFunc := func(job *model.Job) { - if job.SchemaState == endState { - if !committed { - if curCase.failCommit { - err := tk.ExecToErr("commit") - require.Error(t, err) - } else { - tk.MustExec("commit") - } - } - committed = true - } - } - hook.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) - originalCallback := do.GetHook() - do.SetHook(hook) - tk2.MustExec(curCase.idxDDL) - do.SetHook(originalCallback) - tk2.MustExec("admin check table t1") - for i, checkSQL := range curCase.checkSQLs { - if len(curCase.rowsExps[i]) > 0 { - tk2.MustQuery(checkSQL).Check(testkit.Rows(curCase.rowsExps[i]...)) - } else { - tk2.MustQuery(checkSQL).Check(nil) - } - } - } - } - } - tk.MustExec("admin check table t1") -} - // TestAddIndexFailOnCaseWhenCanExit is used to close #19325. func TestAddIndexFailOnCaseWhenCanExit(t *testing.T) { require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/MockCaseWhenParseFailure", `return(true)`)) @@ -1189,7 +991,11 @@ func TestAddIndexFailOnCaseWhenCanExit(t *testing.T) { tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int, b int)") tk.MustExec("insert into t values(1, 1)") - tk.MustGetErrMsg("alter table t add index idx(b)", "[ddl:-1]DDL job rollback, error msg: job.ErrCount:1, mock unknown type: ast.whenClause.") + if variable.DDLEnableDistributeReorg.Load() { + tk.MustGetErrMsg("alter table t add index idx(b)", "[ddl:-1]job.ErrCount:0, mock unknown type: ast.whenClause.") + } else { + tk.MustGetErrMsg("alter table t add index idx(b)", "[ddl:-1]DDL job rollback, error msg: job.ErrCount:1, mock unknown type: ast.whenClause.") + } tk.MustExec("drop table if exists t") } @@ -1289,7 +1095,7 @@ func TestCancelJobWriteConflict(t *testing.T) { var cancelErr error var rs []sqlexec.RecordSet - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} d := dom.DDL() originalHook := d.GetHook() d.SetHook(hook) @@ -1378,54 +1184,6 @@ func TestTxnSavepointWithDDL(t *testing.T) { tk.MustExec("admin check table t1, t2") } -func TestAmendTxnSavepointWithDDL(t *testing.T) { - store, _ := testkit.CreateMockStoreAndDomainWithSchemaLease(t, dbTestLease) - tk := testkit.NewTestKit(t, store) - tk2 := testkit.NewTestKit(t, store) - tk.MustExec("use test;") - tk.MustExec("set global tidb_enable_metadata_lock=0") - tk2.MustExec("use test;") - tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") - - prepareFn := func() { - tk.MustExec("drop table if exists t1, t2") - tk.MustExec("create table t1 (c1 int primary key, c2 int)") - tk.MustExec("create table t2 (c1 int primary key, c2 int)") - } - - prepareFn() - tk.MustExec("truncate table t1") - tk.MustExec("begin pessimistic") - tk.MustExec("savepoint s1") - tk.MustExec("insert t1 values (1, 11)") - tk.MustExec("savepoint s2") - tk.MustExec("insert t2 values (1, 11)") - tk.MustExec("rollback to s2") - tk2.MustExec("alter table t1 add index idx2(c2)") - tk2.MustExec("alter table t2 add index idx2(c2)") - tk.MustExec("commit") - tk.MustQuery("select * from t1").Check(testkit.Rows("1 11")) - tk.MustQuery("select * from t2").Check(testkit.Rows()) - tk.MustExec("admin check table t1, t2") - - prepareFn() - tk.MustExec("truncate table t1") - tk.MustExec("begin pessimistic") - tk.MustExec("savepoint s1") - tk.MustExec("insert t1 values (1, 11)") - tk.MustExec("savepoint s2") - tk.MustExec("insert t2 values (1, 11)") - tk.MustExec("savepoint s3") - tk.MustExec("insert t2 values (2, 22)") - tk.MustExec("rollback to s3") - tk2.MustExec("alter table t1 add index idx2(c2)") - tk2.MustExec("alter table t2 add index idx2(c2)") - tk.MustExec("commit") - tk.MustQuery("select * from t1").Check(testkit.Rows("1 11")) - tk.MustQuery("select * from t2").Check(testkit.Rows("1 11")) - tk.MustExec("admin check table t1, t2") -} - func TestSnapshotVersion(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomainWithSchemaLease(t, dbTestLease) @@ -1582,13 +1340,11 @@ func TestLogAndShowSlowLog(t *testing.T) { } func TestReportingMinStartTimestamp(t *testing.T) { - _, dom := testkit.CreateMockStoreAndDomainWithSchemaLease(t, dbTestLease) + store, dom := testkit.CreateMockStoreAndDomainWithSchemaLease(t, dbTestLease) + tk := testkit.NewTestKit(t, store) + se := tk.Session() infoSyncer := dom.InfoSyncer() - sm := &testkit.MockSessionManager{ - PS: make([]*util.ProcessInfo, 0), - } - infoSyncer.SetSessionManager(sm) beforeTS := oracle.GoTimeToTS(time.Now()) infoSyncer.ReportMinStartTS(dom.Store()) afterTS := oracle.GoTimeToTS(time.Now()) @@ -1597,13 +1353,21 @@ func TestReportingMinStartTimestamp(t *testing.T) { now := time.Now() validTS := oracle.GoTimeToLowerLimitStartTS(now.Add(time.Minute), tikv.MaxTxnTimeUse) lowerLimit := oracle.GoTimeToLowerLimitStartTS(now, tikv.MaxTxnTimeUse) + sm := se.GetSessionManager().(*testkit.MockSessionManager) sm.PS = []*util.ProcessInfo{ - {CurTxnStartTS: 0}, - {CurTxnStartTS: math.MaxUint64}, - {CurTxnStartTS: lowerLimit}, - {CurTxnStartTS: validTS}, + {CurTxnStartTS: 0, ProtectedTSList: &se.GetSessionVars().ProtectedTSList}, + {CurTxnStartTS: math.MaxUint64, ProtectedTSList: &se.GetSessionVars().ProtectedTSList}, + {CurTxnStartTS: lowerLimit, ProtectedTSList: &se.GetSessionVars().ProtectedTSList}, + {CurTxnStartTS: validTS, ProtectedTSList: &se.GetSessionVars().ProtectedTSList}, } - infoSyncer.SetSessionManager(sm) + infoSyncer.ReportMinStartTS(dom.Store()) + require.Equal(t, validTS, infoSyncer.GetMinStartTS()) + + unhold := se.GetSessionVars().ProtectedTSList.HoldTS(validTS - 1) + infoSyncer.ReportMinStartTS(dom.Store()) + require.Equal(t, validTS-1, infoSyncer.GetMinStartTS()) + + unhold() infoSyncer.ReportMinStartTS(dom.Store()) require.Equal(t, validTS, infoSyncer.GetMinStartTS()) } @@ -1736,3 +1500,131 @@ func TestTiDBDownBeforeUpdateGlobalVersion(t *testing.T) { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockDownBeforeUpdateGlobalVersion")) require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/checkDownBeforeUpdateGlobalVersion")) } + +func TestDDLBlockedCreateView(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(a int)") + + hook := &callback.TestDDLCallback{Do: dom} + first := true + hook.OnJobRunBeforeExported = func(job *model.Job) { + if job.SchemaState != model.StateWriteOnly { + return + } + if !first { + return + } + first = false + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + tk2.MustExec("create view v as select * from t") + } + dom.DDL().SetHook(hook) + tk.MustExec("alter table t modify column a char(10)") +} + +func TestHashPartitionAddColumn(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(a int, b int) partition by hash(a) partitions 4") + + hook := &callback.TestDDLCallback{Do: dom} + hook.OnJobRunBeforeExported = func(job *model.Job) { + if job.SchemaState != model.StateWriteOnly { + return + } + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + tk2.MustExec("delete from t") + } + dom.DDL().SetHook(hook) + tk.MustExec("alter table t add column c int") +} + +func TestSetInvalidDefaultValueAfterModifyColumn(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(a int, b int)") + + var wg sync.WaitGroup + var checkErr error + one := false + hook := &callback.TestDDLCallback{Do: dom} + hook.OnJobRunBeforeExported = func(job *model.Job) { + if job.SchemaState != model.StateDeleteOnly { + return + } + if !one { + one = true + } else { + return + } + wg.Add(1) + go func() { + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + _, checkErr = tk2.Exec("alter table t alter column a set default 1") + wg.Done() + }() + } + dom.DDL().SetHook(hook) + tk.MustExec("alter table t modify column a text(100)") + wg.Wait() + require.EqualError(t, checkErr, "[ddl:1101]BLOB/TEXT/JSON column 'a' can't have a default value") +} + +func TestMDLTruncateTable(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk2 := testkit.NewTestKit(t, store) + tk3 := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(a int);") + tk.MustExec("begin") + tk.MustExec("select * from t for update") + + var wg sync.WaitGroup + + hook := &callback.TestDDLCallback{Do: dom} + wg.Add(2) + var timetk2 time.Time + var timetk3 time.Time + + one := false + f := func(job *model.Job) { + if !one { + one = true + } else { + return + } + go func() { + tk3.MustExec("truncate table test.t") + timetk3 = time.Now() + wg.Done() + }() + } + + hook.OnJobUpdatedExported.Store(&f) + dom.DDL().SetHook(hook) + + go func() { + tk2.MustExec("truncate table test.t") + timetk2 = time.Now() + wg.Done() + }() + + time.Sleep(2 * time.Second) + timeMain := time.Now() + tk.MustExec("commit") + wg.Wait() + require.True(t, timetk2.After(timeMain)) + require.True(t, timetk3.After(timeMain)) +} diff --git a/ddl/ddl.go b/ddl/ddl.go index 7eeaa8c1f357e..e658547b471d3 100644 --- a/ddl/ddl.go +++ b/ddl/ddl.go @@ -21,7 +21,6 @@ package ddl import ( "context" "encoding/json" - "flag" "fmt" "runtime" "strconv" @@ -49,6 +48,7 @@ import ( "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" + rmutil "github.com/pingcap/tidb/resourcemanager/util" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/binloginfo" "github.com/pingcap/tidb/sessionctx/variable" @@ -60,9 +60,11 @@ import ( "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/gcutil" + "github.com/pingcap/tidb/util/gpool/spmc" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/mathutil" "github.com/pingcap/tidb/util/sqlexec" + "github.com/pingcap/tidb/util/syncutil" "github.com/tikv/client-go/v2/tikvrpc" clientv3 "go.etcd.io/etcd/client/v3" atomicutil "go.uber.org/atomic" @@ -83,8 +85,9 @@ const ( batchAddingJobs = 10 - reorgWorkerCnt = 10 - generalWorkerCnt = 1 + reorgWorkerCnt = 10 + generalWorkerCnt = 1 + backfillWorkerCnt = 32 // checkFlagIndexInJobArgs is the recoverCheckFlag index used in RecoverTable/RecoverSchema job arg list. checkFlagIndexInJobArgs = 1 @@ -188,6 +191,9 @@ type DDL interface { CreatePlacementPolicy(ctx sessionctx.Context, stmt *ast.CreatePlacementPolicyStmt) error DropPlacementPolicy(ctx sessionctx.Context, stmt *ast.DropPlacementPolicyStmt) error AlterPlacementPolicy(ctx sessionctx.Context, stmt *ast.AlterPlacementPolicyStmt) error + AddResourceGroup(ctx sessionctx.Context, stmt *ast.CreateResourceGroupStmt) error + AlterResourceGroup(ctx sessionctx.Context, stmt *ast.AlterResourceGroupStmt) error + DropResourceGroup(ctx sessionctx.Context, stmt *ast.DropResourceGroupStmt) error FlashbackCluster(ctx sessionctx.Context, flashbackTS uint64) error // CreateSchemaWithInfo creates a database (schema) given its database info. @@ -252,10 +258,6 @@ type DDL interface { GetInfoSchemaWithInterceptor(ctx sessionctx.Context) infoschema.InfoSchema // DoDDLJob does the DDL job, it's exported for test. DoDDLJob(ctx sessionctx.Context, job *model.Job) error - // MoveJobFromQueue2Table move existing DDLs from queue to table. - MoveJobFromQueue2Table(bool) error - // MoveJobFromTable2Queue move existing DDLs from table to queue. - MoveJobFromTable2Queue() error } type limitJobTask struct { @@ -270,13 +272,14 @@ type ddl struct { limitJobCh chan *limitJobTask *ddlCtx - workers map[workerType]*worker sessPool *sessionPool delRangeMgr delRangeManager enableTiFlashPoll *atomicutil.Bool // used in the concurrency ddl. reorgWorkerPool *workerPool generalDDLWorkerPool *workerPool + backfillCtxPool *backfillCtxPool + backfillWorkerPool *spmc.Pool[*reorgBackfillTask, *backfillResult, int, *backfillWorker, *backfillWorkerContext] // get notification if any DDL coming. ddlJobCh chan struct{} } @@ -332,6 +335,8 @@ type ddlCtx struct { statsHandle *handle.Handle tableLockCkr util.DeadTableLockChecker etcdCli *clientv3.Client + // backfillJobCh gets notification if any backfill jobs coming. + backfillJobCh chan struct{} *waitSchemaSyncedController *schemaVersionManager @@ -343,10 +348,11 @@ type ddlCtx struct { // It holds the running DDL jobs ID. runningJobIDs []string // reorgCtx is used for reorganization. - reorgCtx struct { - sync.RWMutex - // reorgCtxMap maps job ID to reorg context. - reorgCtxMap map[int64]*reorgCtx + reorgCtx reorgContexts + // backfillCtx is used for backfill workers. + backfillCtx struct { + syncutil.RWMutex + jobCtxMap map[int64]*JobContext } jobCtx struct { @@ -422,32 +428,32 @@ func (dc *ddlCtx) isOwner() bool { return isOwner } -func (dc *ddlCtx) setDDLLabelForTopSQL(job *model.Job) { +func (dc *ddlCtx) setDDLLabelForTopSQL(jobID int64, jobQuery string) { dc.jobCtx.Lock() defer dc.jobCtx.Unlock() - ctx, exists := dc.jobCtx.jobCtxMap[job.ID] + ctx, exists := dc.jobCtx.jobCtxMap[jobID] if !exists { ctx = NewJobContext() - dc.jobCtx.jobCtxMap[job.ID] = ctx + dc.jobCtx.jobCtxMap[jobID] = ctx } - ctx.setDDLLabelForTopSQL(job) + ctx.setDDLLabelForTopSQL(jobQuery) } -func (dc *ddlCtx) setDDLSourceForDiagnosis(job *model.Job) { +func (dc *ddlCtx) setDDLSourceForDiagnosis(jobID int64, jobType model.ActionType) { dc.jobCtx.Lock() defer dc.jobCtx.Unlock() - ctx, exists := dc.jobCtx.jobCtxMap[job.ID] + ctx, exists := dc.jobCtx.jobCtxMap[jobID] if !exists { ctx = NewJobContext() - ctx.setDDLLabelForDiagnosis(job) - dc.jobCtx.jobCtxMap[job.ID] = ctx + dc.jobCtx.jobCtxMap[jobID] = ctx } + ctx.setDDLLabelForDiagnosis(jobType) } -func (dc *ddlCtx) getResourceGroupTaggerForTopSQL(job *model.Job) tikvrpc.ResourceGroupTagger { +func (dc *ddlCtx) getResourceGroupTaggerForTopSQL(jobID int64) tikvrpc.ResourceGroupTagger { dc.jobCtx.Lock() defer dc.jobCtx.Unlock() - ctx, exists := dc.jobCtx.jobCtxMap[job.ID] + ctx, exists := dc.jobCtx.jobCtxMap[jobID] if !exists { return nil } @@ -460,44 +466,105 @@ func (dc *ddlCtx) removeJobCtx(job *model.Job) { delete(dc.jobCtx.jobCtxMap, job.ID) } -func (dc *ddlCtx) jobContext(job *model.Job) *JobContext { +func (dc *ddlCtx) jobContext(jobID int64) *JobContext { dc.jobCtx.RLock() defer dc.jobCtx.RUnlock() - if jobContext, exists := dc.jobCtx.jobCtxMap[job.ID]; exists { + if jobContext, exists := dc.jobCtx.jobCtxMap[jobID]; exists { return jobContext } return NewJobContext() } -func (dc *ddlCtx) getReorgCtx(job *model.Job) *reorgCtx { +func (dc *ddlCtx) removeBackfillCtxJobCtx(jobID int64) { + dc.backfillCtx.Lock() + delete(dc.backfillCtx.jobCtxMap, jobID) + dc.backfillCtx.Unlock() +} + +func (dc *ddlCtx) backfillCtxJobIDs() []int64 { + dc.backfillCtx.Lock() + defer dc.backfillCtx.Unlock() + + runningJobIDs := make([]int64, 0, len(dc.backfillCtx.jobCtxMap)) + for id := range dc.backfillCtx.jobCtxMap { + runningJobIDs = append(runningJobIDs, id) + } + return runningJobIDs +} + +func (dc *ddlCtx) setBackfillCtxJobContext(jobID int64, jobQuery string, jobType model.ActionType) (*JobContext, bool) { + dc.backfillCtx.Lock() + defer dc.backfillCtx.Unlock() + + jobCtx, existent := dc.backfillCtx.jobCtxMap[jobID] + if !existent { + dc.setDDLLabelForTopSQL(jobID, jobQuery) + dc.setDDLSourceForDiagnosis(jobID, jobType) + jobCtx = dc.jobContext(jobID) + dc.backfillCtx.jobCtxMap[jobID] = jobCtx + } + return jobCtx, existent +} + +type reorgContexts struct { + sync.RWMutex + // reorgCtxMap maps job ID to reorg context. + reorgCtxMap map[int64]*reorgCtx +} + +func getReorgCtx(reorgCtxs *reorgContexts, jobID int64) *reorgCtx { + reorgCtxs.RLock() + defer reorgCtxs.RUnlock() + return reorgCtxs.reorgCtxMap[jobID] +} + +// TODO: Using getReorgCtx instead of dc.getReorgCtx. +func (dc *ddlCtx) getReorgCtx(jobID int64) *reorgCtx { dc.reorgCtx.RLock() defer dc.reorgCtx.RUnlock() - return dc.reorgCtx.reorgCtxMap[job.ID] + return dc.reorgCtx.reorgCtxMap[jobID] } -func (dc *ddlCtx) newReorgCtx(r *reorgInfo) *reorgCtx { +func (dc *ddlCtx) newReorgCtx(jobID int64, startKey []byte, currElement *meta.Element, rowCount int64) *reorgCtx { rc := &reorgCtx{} rc.doneCh = make(chan error, 1) // initial reorgCtx - rc.setRowCount(r.Job.GetRowCount()) - rc.setNextKey(r.StartKey) - rc.setCurrentElement(r.currElement) + rc.setRowCount(rowCount) + rc.setNextKey(startKey) + rc.setCurrentElement(currElement) rc.mu.warnings = make(map[errors.ErrorID]*terror.Error) rc.mu.warningsCount = make(map[errors.ErrorID]int64) + rc.references.Add(1) dc.reorgCtx.Lock() defer dc.reorgCtx.Unlock() - dc.reorgCtx.reorgCtxMap[r.Job.ID] = rc + dc.reorgCtx.reorgCtxMap[jobID] = rc return rc } -func (dc *ddlCtx) removeReorgCtx(job *model.Job) { +func (dc *ddlCtx) setReorgCtxForBackfill(bfJob *BackfillJob) { + rc := dc.getReorgCtx(bfJob.JobID) + if rc == nil { + ele := &meta.Element{ID: bfJob.EleID, TypeKey: bfJob.EleKey} + dc.newReorgCtx(bfJob.JobID, bfJob.Meta.StartKey, ele, bfJob.Meta.RowCount) + } else { + rc.references.Add(1) + } +} + +func (dc *ddlCtx) removeReorgCtx(jobID int64) { dc.reorgCtx.Lock() defer dc.reorgCtx.Unlock() - delete(dc.reorgCtx.reorgCtxMap, job.ID) + ctx, ok := dc.reorgCtx.reorgCtxMap[jobID] + if ok { + ctx.references.Sub(1) + if ctx.references.Load() == 0 { + delete(dc.reorgCtx.reorgCtxMap, jobID) + } + } } func (dc *ddlCtx) notifyReorgCancel(job *model.Job) { - rc := dc.getReorgCtx(job) + rc := dc.getReorgCtx(job.ID) if rc == nil { return } @@ -624,7 +691,6 @@ func newDDL(ctx context.Context, options ...Option) *ddl { // Register functions for enable/disable ddl when changing system variable `tidb_enable_ddl`. variable.EnableDDL = d.EnableDDL variable.DisableDDL = d.DisableDDL - variable.SwitchConcurrentDDL = d.SwitchConcurrentDDL variable.SwitchMDL = d.SwitchMDL return d @@ -656,7 +722,7 @@ func (d *ddl) newDeleteRangeManager(mock bool) delRangeManager { func (d *ddl) prepareWorkers4ConcurrencyDDL() { workerFactory := func(tp workerType) func() (pools.Resource, error) { return func() (pools.Resource, error) { - wk := newWorker(d.ctx, tp, d.sessPool, d.delRangeMgr, d.ddlCtx, true) + wk := newWorker(d.ctx, tp, d.sessPool, d.delRangeMgr, d.ddlCtx) sessForJob, err := d.sessPool.get() if err != nil { return nil, err @@ -679,21 +745,22 @@ func (d *ddl) prepareWorkers4ConcurrencyDDL() { d.wg.Run(d.startDispatchLoop) } -func (d *ddl) prepareWorkers4legacyDDL() { - d.workers = make(map[workerType]*worker, 2) - d.workers[generalWorker] = newWorker(d.ctx, generalWorker, d.sessPool, d.delRangeMgr, d.ddlCtx, false) - d.workers[addIdxWorker] = newWorker(d.ctx, addIdxWorker, d.sessPool, d.delRangeMgr, d.ddlCtx, false) - for _, worker := range d.workers { - worker.wg.Add(1) - w := worker - go w.start(d.ddlCtx) - - metrics.DDLCounter.WithLabelValues(fmt.Sprintf("%s_%s", metrics.CreateDDL, worker.String())).Inc() - - // When the start function is called, we will send a fake job to let worker - // checks owner firstly and try to find whether a job exists and run. - asyncNotify(worker.ddlJobCh) +func (d *ddl) prepareBackfillWorkers() error { + workerFactory := func() (pools.Resource, error) { + bk := newBackfillWorker(context.Background(), nil) + metrics.DDLCounter.WithLabelValues(fmt.Sprintf("%s_backfill_worker", metrics.CreateDDL)).Inc() + return bk, nil + } + d.backfillCtxPool = newBackfillContextPool(pools.NewResourcePool(workerFactory, backfillWorkerCnt, backfillWorkerCnt, 0)) + var err error + d.backfillWorkerPool, err = spmc.NewSPMCPool[*reorgBackfillTask, *backfillResult, int, *backfillWorker, + *backfillWorkerContext]("backfill", int32(backfillWorkerCnt), rmutil.DDL) + if err != nil { + return err } + d.backfillJobCh = make(chan struct{}, 1) + d.wg.Run(d.startDispatchBackfillJobsLoop) + return nil } // Start implements DDL.Start interface. @@ -713,19 +780,23 @@ func (d *ddl) Start(ctxPool *pools.ResourcePool) error { d.delRangeMgr = d.newDeleteRangeManager(ctxPool == nil) d.prepareWorkers4ConcurrencyDDL() - d.prepareWorkers4legacyDDL() if config.TableLockEnabled() { d.wg.Add(1) go d.startCleanDeadTableLock() } - // If tidb_enable_ddl is true, we need campaign owner and do DDL job. + // If tidb_enable_ddl is true, we need campaign owner and do DDL jobs. Besides, we also can do backfill jobs. // Otherwise, we needn't do that. if config.GetGlobalConfig().Instance.TiDBEnableDDL.Load() { if err := d.EnableDDL(); err != nil { return err } + + // TODO: Currently, it is only processed during initialization and is expected to be added to EnableDDL later. + if err := d.prepareBackfillWorkers(); err != nil { + return err + } } variable.RegisterStatistics(d) @@ -798,10 +869,13 @@ func (d *ddl) close() { if d.generalDDLWorkerPool != nil { d.generalDDLWorkerPool.close() } - - for _, worker := range d.workers { - worker.Close() + if d.backfillCtxPool != nil { + d.backfillCtxPool.close() + } + if d.backfillWorkerPool != nil { + d.backfillWorkerPool.ReleaseAndWait() } + // d.delRangeMgr using sessions from d.sessPool. // Put it before d.sessPool.close to reduce the time spent by d.sessPool.close. if d.delRangeMgr != nil { @@ -907,7 +981,8 @@ func getIntervalFromPolicy(policy []time.Duration, i int) (time.Duration, bool) func getJobCheckInterval(job *model.Job, i int) (time.Duration, bool) { switch job.Type { - case model.ActionAddIndex, model.ActionAddPrimaryKey, model.ActionModifyColumn: + case model.ActionAddIndex, model.ActionAddPrimaryKey, model.ActionModifyColumn, + model.ActionReorganizePartition: return getIntervalFromPolicy(slowDDLIntervalPolicy, i) case model.ActionCreateTable, model.ActionCreateSchema: return getIntervalFromPolicy(fastDDLIntervalPolicy, i) @@ -916,29 +991,16 @@ func getJobCheckInterval(job *model.Job, i int) (time.Duration, bool) { } } -func (d *ddl) asyncNotifyWorker(job *model.Job) { +func (dc *ddlCtx) asyncNotifyWorker(ch chan struct{}, etcdPath string, jobID int64, jobType string) { // If the workers don't run, we needn't notify workers. + // TODO: It does not affect informing the backfill worker. if !config.GetGlobalConfig().Instance.TiDBEnableDDL.Load() { return } - if variable.EnableConcurrentDDL.Load() { - if d.isOwner() { - asyncNotify(d.ddlJobCh) - } else { - d.asyncNotifyByEtcd(addingDDLJobConcurrent, job) - } + if dc.isOwner() { + asyncNotify(ch) } else { - var worker *worker - if job.MayNeedReorg() { - worker = d.workers[addIdxWorker] - } else { - worker = d.workers[generalWorker] - } - if d.ownerManager.IsOwner() { - asyncNotify(worker.ddlJobCh) - } else { - d.asyncNotifyByEtcd(worker.addingDDLJobKey, job) - } + dc.asyncNotifyByEtcd(etcdPath, jobID, jobType) } } @@ -979,7 +1041,6 @@ func (d *ddl) DoDDLJob(ctx sessionctx.Context, job *model.Job) error { // Instead, we merge all the jobs into one pending job. return appendToSubJobs(mci, job) } - // Get a global job ID and put the DDL job in the queue. setDDLJobQuery(ctx, job) task := &limitJobTask{job, make(chan error)} @@ -1008,7 +1069,7 @@ func (d *ddl) DoDDLJob(ctx sessionctx.Context, job *model.Job) error { sessVars.StmtCtx.IsDDLJobInQueue = true // Notice worker that we push a new job and wait the job done. - d.asyncNotifyWorker(job) + d.asyncNotifyWorker(d.ddlJobCh, addingDDLJobConcurrent, job.ID, job.Type.String()) logutil.BgLogger().Info("[ddl] start DDL job", zap.String("job", job.String()), zap.String("query", job.Query)) var historyJob *model.Job @@ -1056,7 +1117,7 @@ func (d *ddl) DoDDLJob(ctx sessionctx.Context, job *model.Job) error { continue } sessVars.StmtCtx.DDLJobID = 0 // Avoid repeat. - errs, err := CancelJobs(se, d.store, []int64{jobID}) + errs, err := CancelJobs(se, []int64{jobID}) d.sessPool.put(se) if len(errs) > 0 { logutil.BgLogger().Warn("error canceling DDL job", zap.Error(errs[0])) @@ -1094,8 +1155,13 @@ func (d *ddl) DoDDLJob(ctx sessionctx.Context, job *model.Job) error { logutil.BgLogger().Info("[ddl] DDL warnings doesn't match the warnings count", zap.Int64("jobID", jobID)) } else { for key, warning := range historyJob.ReorgMeta.Warnings { - for j := int64(0); j < historyJob.ReorgMeta.WarningsCount[key]; j++ { + keyCount := historyJob.ReorgMeta.WarningsCount[key] + if keyCount == 1 { ctx.GetSessionVars().StmtCtx.AppendWarning(warning) + } else { + newMsg := fmt.Sprintf("%d warnings with this error code, first warning: "+warning.GetMsg(), keyCount) + newWarning := dbterror.ClassTypes.Synthesize(terror.ErrCode(warning.Code()), newMsg) + ctx.GetSessionVars().StmtCtx.AppendWarning(newWarning) } } } @@ -1178,49 +1244,12 @@ func (d *ddl) startCleanDeadTableLock() { } } -// SwitchConcurrentDDL changes the DDL to concurrent DDL if toConcurrentDDL is true, otherwise, queue based DDL. -func (d *ddl) SwitchConcurrentDDL(toConcurrentDDL bool) error { - if !d.isOwner() { - return kv.RunInNewTxn(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), d.store, true, func(ctx context.Context, txn kv.Transaction) error { - isConcurrentDDL, err := meta.NewMeta(txn).IsConcurrentDDL() - if err != nil { - return err - } - if isConcurrentDDL != toConcurrentDDL { - return errors.New("please set it on the DDL owner node") - } - return nil - }) - } - - ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) - defer cancel() - d.waiting.Store(true) - defer d.waiting.Store(false) - if err := d.wait4Switch(ctx); err != nil { - return err - } - - var err error - if toConcurrentDDL { - err = d.MoveJobFromQueue2Table(false) - } else { - err = d.MoveJobFromTable2Queue() - } - if err == nil { - variable.EnableConcurrentDDL.Store(toConcurrentDDL) - } - logutil.BgLogger().Info("[ddl] SwitchConcurrentDDL", zap.Bool("toConcurrentDDL", toConcurrentDDL), zap.Error(err)) - return err -} - // SwitchMDL enables MDL or disable DDL. func (d *ddl) SwitchMDL(enable bool) error { ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) defer cancel() - // Disable MDL for test. - if enable && !variable.DefTiDBEnableConcurrentDDL { + if enable { sql := fmt.Sprintf("UPDATE HIGH_PRIORITY %[1]s.%[2]s SET VARIABLE_VALUE = %[4]d WHERE VARIABLE_NAME = '%[3]s'", mysql.SystemDB, mysql.GlobalVariablesTable, variable.TiDBEnableMDL, 0) sess, err := d.sessPool.get() @@ -1259,25 +1288,23 @@ func (d *ddl) SwitchMDL(enable bool) error { } variable.EnableMDL.Store(enable) - logutil.BgLogger().Info("[ddl] switch metadata lock feature", zap.Bool("enable", enable), zap.Error(err)) - return nil -} - -func (d *ddl) wait4Switch(ctx context.Context) error { - for { - select { - case <-ctx.Done(): - return ctx.Err() - default: + err = kv.RunInNewTxn(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), d.store, true, func(ctx context.Context, txn kv.Transaction) error { + m := meta.NewMeta(txn) + oldEnable, _, err := m.GetMetadataLock() + if err != nil { + return err } - d.runningJobs.RLock() - if len(d.runningJobs.ids) == 0 { - d.runningJobs.RUnlock() - return nil + if oldEnable != enable { + err = m.SetMetadataLock(enable) } - d.runningJobs.RUnlock() - time.Sleep(time.Second * 1) + return err + }) + if err != nil { + logutil.BgLogger().Warn("[ddl] switch metadata lock feature", zap.Bool("enable", enable), zap.Error(err)) + return err } + logutil.BgLogger().Info("[ddl] switch metadata lock feature", zap.Bool("enable", enable)) + return nil } // RecoverInfo contains information needed by DDL.RecoverTable. @@ -1304,6 +1331,12 @@ type RecoverSchemaInfo struct { // It should be called before any DDL that could break data consistency. // This provides a safe window for async commit and 1PC to commit with an old schema. func delayForAsyncCommit() { + if variable.EnableMDL.Load() { + // If metadata lock is enabled. The transaction of DDL must begin after prewrite of the async commit transaction, + // then the commit ts of DDL must be greater than the async commit transaction. In this case, the corresponding schema of the async commit transaction + // is correct. But if metadata lock is disabled, we can't ensure that the corresponding schema of the async commit transaction isn't change. + return + } cfg := config.GetGlobalConfig().TiKVClient.AsyncCommit duration := cfg.SafeWindow + cfg.AllowedClockDrift logutil.BgLogger().Info("sleep before DDL finishes to make async commit and 1PC safe", @@ -1316,12 +1349,6 @@ var ( RunInGoTest bool ) -func init() { - if flag.Lookup("test.v") != nil || flag.Lookup("check.v") != nil { - RunInGoTest = true - } -} - // GetDropOrTruncateTableInfoFromJobsByStore implements GetDropOrTruncateTableInfoFromJobs func GetDropOrTruncateTableInfoFromJobsByStore(jobs []*model.Job, gcSafePoint uint64, getTable func(uint64, int64, int64) (*model.TableInfo, error), fn func(*model.Job, *model.TableInfo) (bool, error)) (bool, error) { for _, job := range jobs { @@ -1388,13 +1415,8 @@ func GetDDLInfo(s sessionctx.Context) (*Info, error) { } t := meta.NewMeta(txn) info.Jobs = make([]*model.Job, 0, 2) - enable := variable.EnableConcurrentDDL.Load() var generalJob, reorgJob *model.Job - if enable { - generalJob, reorgJob, err = get2JobsFromTable(sess) - } else { - generalJob, reorgJob, err = get2JobsFromQueue(t) - } + generalJob, reorgJob, err = get2JobsFromTable(sess) if err != nil { return nil, errors.Trace(err) } @@ -1415,7 +1437,7 @@ func GetDDLInfo(s sessionctx.Context) (*Info, error) { return info, nil } - _, info.ReorgHandle, _, _, err = newReorgHandler(t, sess, enable).GetDDLReorgHandle(reorgJob) + _, info.ReorgHandle, _, _, err = newReorgHandler(sess).GetDDLReorgHandle(reorgJob) if err != nil { if meta.ErrDDLReorgElementNotExist.Equal(err) { return info, nil @@ -1426,19 +1448,6 @@ func GetDDLInfo(s sessionctx.Context) (*Info, error) { return info, nil } -func get2JobsFromQueue(t *meta.Meta) (*model.Job, *model.Job, error) { - generalJob, err := t.GetDDLJobByIdx(0) - if err != nil { - return nil, nil, errors.Trace(err) - } - reorgJob, err := t.GetDDLJobByIdx(0, meta.AddIndexJobListKey) - if err != nil { - return nil, nil, errors.Trace(err) - } - - return generalJob, reorgJob, nil -} - func get2JobsFromTable(sess *session) (*model.Job, *model.Job, error) { var generalJob, reorgJob *model.Job jobs, err := getJobsBySQL(sess, JobTable, "not reorg order by job_id limit 1") @@ -1460,82 +1469,8 @@ func get2JobsFromTable(sess *session) (*model.Job, *model.Job, error) { } // CancelJobs cancels the DDL jobs. -func CancelJobs(se sessionctx.Context, store kv.Storage, ids []int64) (errs []error, err error) { - if variable.EnableConcurrentDDL.Load() { - return cancelConcurrencyJobs(se, ids) - } - - err = kv.RunInNewTxn(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), store, true, func(ctx context.Context, txn kv.Transaction) error { - errs, err = cancelLegacyJobs(txn, ids) - return err - }) - return -} - -func cancelLegacyJobs(txn kv.Transaction, ids []int64) ([]error, error) { - if len(ids) == 0 { - return nil, nil - } - - errs := make([]error, len(ids)) - t := meta.NewMeta(txn) - generalJobs, err := getDDLJobsInQueue(t, meta.DefaultJobListKey) - if err != nil { - return nil, errors.Trace(err) - } - addIdxJobs, err := getDDLJobsInQueue(t, meta.AddIndexJobListKey) - if err != nil { - return nil, errors.Trace(err) - } - jobs := append(generalJobs, addIdxJobs...) - jobsMap := make(map[int64]int) - for i, id := range ids { - jobsMap[id] = i - } - for j, job := range jobs { - i, ok := jobsMap[job.ID] - if !ok { - logutil.BgLogger().Debug("the job that needs to be canceled isn't equal to current job", - zap.Int64("need to canceled job ID", job.ID), - zap.Int64("current job ID", job.ID)) - continue - } - delete(jobsMap, job.ID) - // These states can't be cancelled. - if job.IsDone() || job.IsSynced() { - errs[i] = dbterror.ErrCancelFinishedDDLJob.GenWithStackByArgs(job.ID) - continue - } - // If the state is rolling back, it means the work is cleaning the data after cancelling the job. - if job.IsCancelled() || job.IsRollingback() || job.IsRollbackDone() { - continue - } - if !job.IsRollbackable() { - errs[i] = dbterror.ErrCannotCancelDDLJob.GenWithStackByArgs(job.ID) - continue - } - - job.State = model.JobStateCancelling - // Make sure RawArgs isn't overwritten. - err := json.Unmarshal(job.RawArgs, &job.Args) - if err != nil { - errs[i] = errors.Trace(err) - continue - } - if j >= len(generalJobs) { - offset := int64(j - len(generalJobs)) - err = t.UpdateDDLJob(offset, job, true, meta.AddIndexJobListKey) - } else { - err = t.UpdateDDLJob(int64(j), job, true) - } - if err != nil { - errs[i] = errors.Trace(err) - } - } - for id, i := range jobsMap { - errs[i] = dbterror.ErrDDLJobNotFound.GenWithStackByArgs(id) - } - return errs, nil +func CancelJobs(se sessionctx.Context, ids []int64) (errs []error, err error) { + return cancelConcurrencyJobs(se, ids) } // cancelConcurrencyJobs cancels the DDL jobs that are in the concurrent state. @@ -1614,45 +1549,9 @@ func cancelConcurrencyJobs(se sessionctx.Context, ids []int64) ([]error, error) return errs, nil } -func getDDLJobsInQueue(t *meta.Meta, jobListKey meta.JobListKeyType) ([]*model.Job, error) { - cnt, err := t.DDLJobQueueLen(jobListKey) - if err != nil { - return nil, errors.Trace(err) - } - jobs := make([]*model.Job, cnt) - for i := range jobs { - jobs[i], err = t.GetDDLJobByIdx(int64(i), jobListKey) - if err != nil { - return nil, errors.Trace(err) - } - } - return jobs, nil -} - // GetAllDDLJobs get all DDL jobs and sorts jobs by job.ID. func GetAllDDLJobs(sess sessionctx.Context, t *meta.Meta) ([]*model.Job, error) { - if variable.EnableConcurrentDDL.Load() { - return getJobsBySQL(newSession(sess), JobTable, "1 order by job_id") - } - - return getDDLJobs(t) -} - -// getDDLJobs get all DDL jobs and sorts jobs by job.ID. -func getDDLJobs(t *meta.Meta) ([]*model.Job, error) { - generalJobs, err := getDDLJobsInQueue(t, meta.DefaultJobListKey) - if err != nil { - return nil, errors.Trace(err) - } - addIdxJobs, err := getDDLJobsInQueue(t, meta.AddIndexJobListKey) - if err != nil { - return nil, errors.Trace(err) - } - jobs := append(generalJobs, addIdxJobs...) - slices.SortFunc(jobs, func(i, j *model.Job) bool { - return i.ID < j.ID - }) - return jobs, nil + return getJobsBySQL(newSession(sess), JobTable, "1 order by job_id") } // MaxHistoryJobs is exported for testing. @@ -1732,7 +1631,7 @@ func (s *session) begin() error { } func (s *session) commit() error { - s.StmtCommit() + s.StmtCommit(context.Background()) return s.CommitTxn(context.Background()) } @@ -1741,12 +1640,12 @@ func (s *session) txn() (kv.Transaction, error) { } func (s *session) rollback() { - s.StmtRollback() + s.StmtRollback(context.Background(), false) s.RollbackTxn(context.Background()) } func (s *session) reset() { - s.StmtRollback() + s.StmtRollback(context.Background(), false) } func (s *session) execute(ctx context.Context, query string, label string) ([]chunk.Row, error) { @@ -1755,7 +1654,11 @@ func (s *session) execute(ctx context.Context, query string, label string) ([]ch defer func() { metrics.DDLJobTableDuration.WithLabelValues(label + "-" + metrics.RetLabel(err)).Observe(time.Since(startTime).Seconds()) }() - rs, err := s.Context.(sqlexec.SQLExecutor).ExecuteInternal(kv.WithInternalSourceType(ctx, kv.InternalTxnDDL), query) + + if ctx.Value(kv.RequestSourceKey) == nil { + ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnDDL) + } + rs, err := s.Context.(sqlexec.SQLExecutor).ExecuteInternal(ctx, query) if err != nil { return nil, errors.Trace(err) } @@ -1775,6 +1678,31 @@ func (s *session) session() sessionctx.Context { return s.Context } +func (s *session) runInTxn(f func(*session) error) (err error) { + err = s.begin() + if err != nil { + return err + } + failpoint.Inject("NotifyBeginTxnCh", func(val failpoint.Value) { + //nolint:forcetypeassert + v := val.(int) + if v == 1 { + mockDDLErrOnce = 1 + TestNotifyBeginTxnCh <- struct{}{} + } else if v == 2 && mockDDLErrOnce == 1 { + <-TestNotifyBeginTxnCh + mockDDLErrOnce = 0 + } + }) + + err = f(s) + if err != nil { + s.rollback() + return + } + return errors.Trace(s.commit()) +} + // GetAllHistoryDDLJobs get all the done DDL jobs. func GetAllHistoryDDLJobs(m *meta.Meta) ([]*model.Job, error) { iterator, err := GetLastHistoryDDLJobsIterator(m) @@ -1838,19 +1766,11 @@ func GetHistoryJobByID(sess sessionctx.Context, id int64) (*model.Job, error) { return job, errors.Trace(err) } -// AddHistoryDDLJobForTest used for test. -func AddHistoryDDLJobForTest(sess sessionctx.Context, t *meta.Meta, job *model.Job, updateRawArgs bool) error { - return AddHistoryDDLJob(newSession(sess), t, job, updateRawArgs, variable.EnableConcurrentDDL.Load()) -} - // AddHistoryDDLJob record the history job. -func AddHistoryDDLJob(sess *session, t *meta.Meta, job *model.Job, updateRawArgs bool, concurrentDDL bool) error { - if concurrentDDL { - // only add history job into table if it is concurrent DDL. - err := addHistoryDDLJob2Table(sess, job, updateRawArgs) - if err != nil { - logutil.BgLogger().Info("[ddl] failed to add DDL job to history table", zap.Error(err)) - } +func AddHistoryDDLJob(sess *session, t *meta.Meta, job *model.Job, updateRawArgs bool) error { + err := addHistoryDDLJob2Table(sess, job, updateRawArgs) + if err != nil { + logutil.BgLogger().Info("[ddl] failed to add DDL job to history table", zap.Error(err)) } // we always add history DDL job to job list at this moment. return t.AddHistoryDDLJob(job, updateRawArgs) diff --git a/ddl/ddl_api.go b/ddl/ddl_api.go index bbf3d4fc59856..cc2a0f8d2f5fc 100644 --- a/ddl/ddl_api.go +++ b/ddl/ddl_api.go @@ -33,6 +33,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl/label" + "github.com/pingcap/tidb/ddl/resourcegroup" ddlutil "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" @@ -46,6 +47,7 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" field_types "github.com/pingcap/tidb/parser/types" + "github.com/pingcap/tidb/privilege" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/sessiontxn" @@ -946,7 +948,7 @@ func checkColumnDefaultValue(ctx sessionctx.Context, col *table.Column, value in if value != nil && ctx.GetSessionVars().SQLMode.HasNoZeroDateMode() && ctx.GetSessionVars().SQLMode.HasStrictMode() && types.IsTypeTime(col.GetType()) { if vv, ok := value.(string); ok { - timeValue, err := expression.GetTimeValue(ctx, vv, col.GetType(), col.GetDecimal()) + timeValue, err := expression.GetTimeValue(ctx, vv, col.GetType(), col.GetDecimal(), nil) if err != nil { return hasDefaultValue, value, errors.Trace(err) } @@ -971,7 +973,7 @@ func convertTimestampDefaultValToUTC(ctx sessionctx.Context, defaultVal interfac } if vv, ok := defaultVal.(string); ok { if vv != types.ZeroDatetimeStr && !strings.EqualFold(vv, ast.CurrentTimestamp) { - t, err := types.ParseTime(ctx.GetSessionVars().StmtCtx, vv, col.GetType(), col.GetDecimal()) + t, err := types.ParseTime(ctx.GetSessionVars().StmtCtx, vv, col.GetType(), col.GetDecimal(), nil) if err != nil { return defaultVal, errors.Trace(err) } @@ -1082,7 +1084,7 @@ func columnDefToCol(ctx sessionctx.Context, offset int, colDef *ast.ColumnDef, o var sb strings.Builder restoreFlags := format.RestoreStringSingleQuotes | format.RestoreKeyWordLowercase | format.RestoreNameBackQuotes | - format.RestoreSpacesAroundBinaryOperation + format.RestoreSpacesAroundBinaryOperation | format.RestoreWithoutSchemaName | format.RestoreWithoutTableName restoreCtx := format.NewRestoreCtx(restoreFlags, &sb) for _, v := range colDef.Options { @@ -1142,7 +1144,10 @@ func columnDefToCol(ctx sessionctx.Context, offset int, colDef *ast.ColumnDef, o } col.GeneratedExprString = sb.String() col.GeneratedStored = v.Stored - _, dependColNames := findDependedColumnNames(colDef) + _, dependColNames, err := findDependedColumnNames(model.NewCIStr(""), model.NewCIStr(""), colDef) + if err != nil { + return nil, nil, errors.Trace(err) + } col.Dependences = dependColNames case ast.ColumnOptionCollate: if field_types.HasCharset(colDef.Tp) { @@ -1165,7 +1170,7 @@ func columnDefToCol(ctx sessionctx.Context, offset int, colDef *ast.ColumnDef, o // getFuncCallDefaultValue gets the default column value of function-call expression. func getFuncCallDefaultValue(col *table.Column, option *ast.ColumnOption, expr *ast.FuncCallExpr) (interface{}, bool, error) { switch expr.FnName.L { - case ast.CurrentTimestamp: + case ast.CurrentTimestamp, ast.CurrentDate: tp, fsp := col.FieldType.GetType(), col.FieldType.GetDecimal() if tp == mysql.TypeTimestamp || tp == mysql.TypeDatetime { defaultFsp := 0 @@ -1218,8 +1223,8 @@ func getDefaultValue(ctx sessionctx.Context, col *table.Column, option *ast.Colu // If the function call is ast.CurrentTimestamp, it needs to be continuously processed. } - if tp == mysql.TypeTimestamp || tp == mysql.TypeDatetime { - vd, err := expression.GetTimeValue(ctx, option.Expr, tp, fsp) + if tp == mysql.TypeTimestamp || tp == mysql.TypeDatetime || tp == mysql.TypeDate { + vd, err := expression.GetTimeValue(ctx, option.Expr, tp, fsp, nil) value := vd.GetValue() if err != nil { return nil, false, dbterror.ErrInvalidDefaultValue.GenWithStackByArgs(col.Name.O) @@ -1561,7 +1566,7 @@ func IsAutoRandomColumnID(tblInfo *model.TableInfo, colID int64) bool { return false } -func checkGeneratedColumn(ctx sessionctx.Context, colDefs []*ast.ColumnDef) error { +func checkGeneratedColumn(ctx sessionctx.Context, schemaName model.CIStr, tableName model.CIStr, colDefs []*ast.ColumnDef) error { var colName2Generation = make(map[string]columnGenerationInDDL, len(colDefs)) var exists bool var autoIncrementColumn string @@ -1576,7 +1581,10 @@ func checkGeneratedColumn(ctx sessionctx.Context, colDefs []*ast.ColumnDef) erro if containsColumnOption(colDef, ast.ColumnOptionAutoIncrement) { exists, autoIncrementColumn = true, colDef.Name.Name.L } - generated, depCols := findDependedColumnNames(colDef) + generated, depCols, err := findDependedColumnNames(schemaName, tableName, colDef) + if err != nil { + return errors.Trace(err) + } if !generated { colName2Generation[colDef.Name.Name.L] = columnGenerationInDDL{ position: i, @@ -1693,7 +1701,7 @@ func setEmptyConstraintName(namesMap map[string]bool, constr *ast.Constraint) { } } if colName == "" { - colName = constr.Keys[0].Column.Name.L + colName = constr.Keys[0].Column.Name.O } constrName := colName i := 2 @@ -1980,7 +1988,7 @@ func addIndexForForeignKey(ctx sessionctx.Context, tbInfo *model.TableInfo) erro if handleCol != nil && len(fk.Cols) == 1 && handleCol.Name.L == fk.Cols[0].L { continue } - if model.FindIndexByColumns(tbInfo, fk.Cols...) != nil { + if model.FindIndexByColumns(tbInfo, tbInfo.Indices, fk.Cols...) != nil { continue } idxName := fk.Name @@ -2094,7 +2102,7 @@ func CheckTableInfoValidWithStmt(ctx sessionctx.Context, tbInfo *model.TableInfo func checkTableInfoValidWithStmt(ctx sessionctx.Context, tbInfo *model.TableInfo, s *ast.CreateTableStmt) (err error) { // All of these rely on the AST structure of expressions, which were // lost in the model (got serialized into strings). - if err := checkGeneratedColumn(ctx, s.Cols); err != nil { + if err := checkGeneratedColumn(ctx, s.Table.Schema, tbInfo.Name, s.Cols); err != nil { return errors.Trace(err) } @@ -2115,6 +2123,11 @@ func checkTableInfoValidWithStmt(ctx sessionctx.Context, tbInfo *model.TableInfo } } } + if tbInfo.TTLInfo != nil { + if err := checkTTLInfoValid(ctx, s.Table.Schema, tbInfo); err != nil { + return errors.Trace(err) + } + } return nil } @@ -2147,7 +2160,7 @@ func checkPartitionDefinitionConstraints(ctx sessionctx.Context, tbInfo *model.T // checkTableInfoValid uses to check table info valid. This is used to validate table info. func checkTableInfoValid(tblInfo *model.TableInfo) error { - _, err := tables.TableFromMeta(nil, tblInfo) + _, err := tables.TableFromMeta(autoid.NewAllocators(false), tblInfo) if err != nil { return err } @@ -2193,6 +2206,10 @@ func BuildTableInfoWithLike(ctx sessionctx.Context, ident ast.Ident, referTblInf copy(pi.Definitions, referTblInfo.Partition.Definitions) tblInfo.Partition = &pi } + + if referTblInfo.TTLInfo != nil { + tblInfo.TTLInfo = referTblInfo.TTLInfo.Clone() + } return &tblInfo, nil } @@ -2484,7 +2501,13 @@ func (d *ddl) createTableWithInfoPost( // Default tableAutoIncID base is 0. // If the first ID is expected to greater than 1, we need to do rebase. newEnd := tbInfo.AutoIncID - 1 - if err = d.handleAutoIncID(tbInfo, schemaID, newEnd, autoid.RowIDAllocType); err != nil { + var allocType autoid.AllocatorType + if tbInfo.SepAutoInc() { + allocType = autoid.AutoIncrementType + } else { + allocType = autoid.RowIDAllocType + } + if err = d.handleAutoIncID(tbInfo, schemaID, newEnd, allocType); err != nil { return errors.Trace(err) } } @@ -2709,6 +2732,14 @@ func (d *ddl) preSplitAndScatter(ctx sessionctx.Context, tbInfo *model.TableInfo func (d *ddl) FlashbackCluster(ctx sessionctx.Context, flashbackTS uint64) error { logutil.BgLogger().Info("[ddl] get flashback cluster job", zap.String("flashbackTS", oracle.GetTimeFromTS(flashbackTS).String())) + nowTS, err := ctx.GetStore().GetOracle().GetTimestamp(d.ctx, &oracle.Option{}) + if err != nil { + return errors.Trace(err) + } + gap := time.Until(oracle.GetTimeFromTS(nowTS)).Abs() + if gap > 1*time.Second { + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("Gap between local time and PD TSO is %s, please check PD/system time", gap)) + } job := &model.Job{ Type: model.ActionFlashbackCluster, BinlogInfo: &model.HistoryInfo{}, @@ -2720,9 +2751,12 @@ func (d *ddl) FlashbackCluster(ctx sessionctx.Context, flashbackTS uint64) error variable.On, /* tidb_enable_auto_analyze */ variable.Off, /* tidb_super_read_only */ 0, /* totalRegions */ - 0 /* newCommitTS */}, + 0, /* startTS */ + 0, /* commitTS */ + variable.On, /* tidb_ttl_job_enable */ + []kv.KeyRange{} /* flashback key_ranges */}, } - err := d.DoDDLJob(ctx, job) + err = d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) return errors.Trace(err) } @@ -2992,14 +3026,45 @@ func SetDirectPlacementOpt(placementSettings *model.PlacementSettings, placement placementSettings.FollowerConstraints = stringVal case ast.PlacementOptionVoterConstraints: placementSettings.VoterConstraints = stringVal + case ast.PlacementOptionSurvivalPreferences: + placementSettings.SurvivalPreferences = stringVal default: return errors.Trace(errors.New("unknown placement policy option")) } return nil } +// SetDirectResourceGroupUnit tries to set the ResourceGroupSettings. +func SetDirectResourceGroupUnit(resourceGroupSettings *model.ResourceGroupSettings, typ ast.ResourceUnitType, stringVal string, uintVal uint64, boolValue bool) error { + switch typ { + case ast.ResourceRURate: + resourceGroupSettings.RURate = uintVal + case ast.ResourceUnitCPU: + resourceGroupSettings.CPULimiter = stringVal + case ast.ResourceUnitIOReadBandwidth: + resourceGroupSettings.IOReadBandwidth = stringVal + case ast.ResourceUnitIOWriteBandwidth: + resourceGroupSettings.IOWriteBandwidth = stringVal + case ast.ResourceBurstableOpiton: + // Some about BurstLimit(b): + // - If b == 0, that means the limiter is unlimited capacity. default use in resource controller (burst with a rate within a unlimited capacity). + // - If b < 0, that means the limiter is unlimited capacity and fillrate(r) is ignored, can be seen as r == Inf (burst with a inf rate within a unlimited capacity). + // - If b > 0, that means the limiter is limited capacity. (current not used). + limit := int64(0) + if boolValue { + limit = -1 + } + resourceGroupSettings.BurstLimit = limit + default: + return errors.Trace(errors.New("unknown resource unit type")) + } + return nil +} + // handleTableOptions updates tableInfo according to table options. func handleTableOptions(options []*ast.TableOption, tbInfo *model.TableInfo) error { + var ttlOptionsHandled bool + for _, op := range options { switch op.Tp { case ast.TableOptionAutoIncrement: @@ -3036,6 +3101,28 @@ func handleTableOptions(options []*ast.TableOption, tbInfo *model.TableInfo) err tbInfo.PlacementPolicyRef = &model.PolicyRefInfo{ Name: model.NewCIStr(op.StrValue), } + case ast.TableOptionTTL, ast.TableOptionTTLEnable, ast.TableOptionTTLJobInterval: + if ttlOptionsHandled { + continue + } + + ttlInfo, ttlEnable, ttlJobInterval, err := getTTLInfoInOptions(options) + if err != nil { + return err + } + // It's impossible that `ttlInfo` and `ttlEnable` are all nil, because we have met this option. + // After exclude the situation `ttlInfo == nil && ttlEnable != nil`, we could say `ttlInfo != nil` + if ttlInfo == nil { + if ttlEnable != nil { + return errors.Trace(dbterror.ErrSetTTLOptionForNonTTLTable.FastGenByArgs("TTL_ENABLE")) + } + if ttlJobInterval != nil { + return errors.Trace(dbterror.ErrSetTTLOptionForNonTTLTable.FastGenByArgs("TTL_JOB_INTERVAL")) + } + } + + tbInfo.TTLInfo = ttlInfo + ttlOptionsHandled = true } } shardingBits := shardingBits(tbInfo) @@ -3221,12 +3308,21 @@ func (d *ddl) AlterTable(ctx context.Context, sctx sessionctx.Context, stmt *ast return dbterror.ErrOptOnCacheTable.GenWithStackByArgs("Alter Table") } } + // set name for anonymous foreign key. + maxForeignKeyID := tb.Meta().MaxForeignKeyID + for _, spec := range validSpecs { + if spec.Tp == ast.AlterTableAddConstraint && spec.Constraint.Tp == ast.ConstraintForeignKey && spec.Constraint.Name == "" { + maxForeignKeyID++ + spec.Constraint.Name = fmt.Sprintf("fk_%d", maxForeignKeyID) + } + } if len(validSpecs) > 1 { sctx.GetSessionVars().StmtCtx.MultiSchemaInfo = model.NewMultiSchemaInfo() } for _, spec := range validSpecs { var handledCharsetOrCollate bool + var ttlOptionsHandled bool switch spec.Tp { case ast.AlterTableAddColumns: err = d.AddColumn(sctx, ident, spec) @@ -3235,7 +3331,7 @@ func (d *ddl) AlterTable(ctx context.Context, sctx sessionctx.Context, stmt *ast case ast.AlterTableCoalescePartitions: err = d.CoalescePartitions(sctx, ident, spec) case ast.AlterTableReorganizePartition: - err = errors.Trace(dbterror.ErrUnsupportedReorganizePartition) + err = d.ReorganizePartitions(sctx, ident, spec) case ast.AlterTableReorganizeFirstPartition: err = dbterror.ErrGeneralUnsupportedDDL.GenWithStackByArgs("MERGE FIRST PARTITION") case ast.AlterTableReorganizeLastPartition: @@ -3332,7 +3428,7 @@ func (d *ddl) AlterTable(ctx context.Context, sctx sessionctx.Context, stmt *ast } err = d.ShardRowID(sctx, ident, opt.UintValue) case ast.TableOptionAutoIncrement: - err = d.RebaseAutoID(sctx, ident, int64(opt.UintValue), autoid.RowIDAllocType, opt.BoolValue) + err = d.RebaseAutoID(sctx, ident, int64(opt.UintValue), autoid.AutoIncrementType, opt.BoolValue) case ast.TableOptionAutoIdCache: if opt.UintValue > uint64(math.MaxInt64) { // TODO: Refine this error. @@ -3363,6 +3459,21 @@ func (d *ddl) AlterTable(ctx context.Context, sctx sessionctx.Context, stmt *ast Name: model.NewCIStr(opt.StrValue), } case ast.TableOptionEngine: + case ast.TableOptionTTL, ast.TableOptionTTLEnable, ast.TableOptionTTLJobInterval: + var ttlInfo *model.TTLInfo + var ttlEnable *bool + var ttlJobInterval *string + + if ttlOptionsHandled { + continue + } + ttlInfo, ttlEnable, ttlJobInterval, err = getTTLInfoInOptions(spec.Options) + if err != nil { + return err + } + err = d.AlterTableTTLInfoOrEnable(sctx, ident, ttlInfo, ttlEnable, ttlJobInterval) + + ttlOptionsHandled = true default: err = dbterror.ErrUnsupportedAlterTableOption } @@ -3406,6 +3517,9 @@ func (d *ddl) AlterTable(ctx context.Context, sctx sessionctx.Context, stmt *ast case ast.AlterTableDisableKeys, ast.AlterTableEnableKeys: // Nothing to do now, see https://github.com/pingcap/tidb/issues/1051 // MyISAM specific + case ast.AlterTableRemoveTTL: + // the parser makes sure we have only one `ast.AlterTableRemoveTTL` in an alter statement + err = d.AlterTableRemoveTTL(sctx, ident) default: err = errors.Trace(dbterror.ErrUnsupportedAlterTableSpec) } @@ -3446,6 +3560,10 @@ func (d *ddl) RebaseAutoID(ctx sessionctx.Context, ident ast.Ident, newBase int6 actionType = model.ActionRebaseAutoRandomBase case autoid.RowIDAllocType: actionType = model.ActionRebaseAutoID + case autoid.AutoIncrementType: + actionType = model.ActionRebaseAutoID + default: + panic(fmt.Sprintf("unimplemented rebase autoid type %s", tp)) } if !force { @@ -3599,7 +3717,10 @@ func CreateNewColumn(ctx sessionctx.Context, ti ast.Ident, schema *model.DBInfo, return nil, dbterror.ErrUnsupportedOnGeneratedColumn.GenWithStackByArgs("Adding generated stored column through ALTER TABLE") } - _, dependColNames := findDependedColumnNames(specNewColumn) + _, dependColNames, err := findDependedColumnNames(schema.Name, t.Meta().Name, specNewColumn) + if err != nil { + return nil, errors.Trace(err) + } if !ctx.GetSessionVars().EnableAutoIncrementInGenerated { if err := checkAutoIncrementRef(specNewColumn.Name.Name.L, dependColNames, t.Meta()); err != nil { return nil, errors.Trace(err) @@ -3786,6 +3907,181 @@ func (d *ddl) AddTablePartitions(ctx sessionctx.Context, ident ast.Ident, spec * return errors.Trace(err) } +// getReorganizedDefinitions return the definitions as they would look like after the REORGANIZE PARTITION is done. +func getReorganizedDefinitions(pi *model.PartitionInfo, firstPartIdx, lastPartIdx int, idMap map[int]struct{}) []model.PartitionDefinition { + tmpDefs := make([]model.PartitionDefinition, 0, len(pi.Definitions)+len(pi.AddingDefinitions)-len(idMap)) + if pi.Type == model.PartitionTypeList { + replaced := false + for i := range pi.Definitions { + if _, ok := idMap[i]; ok { + if !replaced { + tmpDefs = append(tmpDefs, pi.AddingDefinitions...) + replaced = true + } + continue + } + tmpDefs = append(tmpDefs, pi.Definitions[i]) + } + if !replaced { + // For safety, for future non-partitioned table -> partitioned + tmpDefs = append(tmpDefs, pi.AddingDefinitions...) + } + return tmpDefs + } + // Range + tmpDefs = append(tmpDefs, pi.Definitions[:firstPartIdx]...) + tmpDefs = append(tmpDefs, pi.AddingDefinitions...) + if len(pi.Definitions) > (lastPartIdx + 1) { + tmpDefs = append(tmpDefs, pi.Definitions[lastPartIdx+1:]...) + } + return tmpDefs +} + +func getReplacedPartitionIDs(names []model.CIStr, pi *model.PartitionInfo) (int, int, map[int]struct{}, error) { + idMap := make(map[int]struct{}) + var firstPartIdx, lastPartIdx = -1, -1 + for _, name := range names { + partIdx := pi.FindPartitionDefinitionByName(name.L) + if partIdx == -1 { + return 0, 0, nil, errors.Trace(dbterror.ErrWrongPartitionName) + } + if _, ok := idMap[partIdx]; ok { + return 0, 0, nil, errors.Trace(dbterror.ErrSameNamePartition) + } + idMap[partIdx] = struct{}{} + if firstPartIdx == -1 { + firstPartIdx = partIdx + } else { + firstPartIdx = mathutil.Min[int](firstPartIdx, partIdx) + } + if lastPartIdx == -1 { + lastPartIdx = partIdx + } else { + lastPartIdx = mathutil.Max[int](lastPartIdx, partIdx) + } + } + if pi.Type == model.PartitionTypeRange { + if len(idMap) != (lastPartIdx - firstPartIdx + 1) { + return 0, 0, nil, errors.Trace(dbterror.ErrGeneralUnsupportedDDL.GenWithStackByArgs( + "REORGANIZE PARTITION of RANGE; not adjacent partitions")) + } + } + + return firstPartIdx, lastPartIdx, idMap, nil +} + +// ReorganizePartitions reorganize one set of partitions to a new set of partitions. +func (d *ddl) ReorganizePartitions(ctx sessionctx.Context, ident ast.Ident, spec *ast.AlterTableSpec) error { + schema, t, err := d.getSchemaAndTableByIdent(ctx, ident) + if err != nil { + return errors.Trace(infoschema.ErrTableNotExists.FastGenByArgs(ident.Schema, ident.Name)) + } + + meta := t.Meta() + pi := meta.GetPartitionInfo() + if pi == nil { + return dbterror.ErrPartitionMgmtOnNonpartitioned + } + switch pi.Type { + case model.PartitionTypeRange, model.PartitionTypeList: + default: + return errors.Trace(dbterror.ErrUnsupportedReorganizePartition) + } + firstPartIdx, lastPartIdx, idMap, err := getReplacedPartitionIDs(spec.PartitionNames, pi) + if err != nil { + return errors.Trace(err) + } + partInfo, err := BuildAddedPartitionInfo(ctx, meta, spec) + if err != nil { + return errors.Trace(err) + } + if err = d.assignPartitionIDs(partInfo.Definitions); err != nil { + return errors.Trace(err) + } + if err = checkReorgPartitionDefs(ctx, meta, partInfo, firstPartIdx, lastPartIdx, idMap); err != nil { + return errors.Trace(err) + } + if err = handlePartitionPlacement(ctx, partInfo); err != nil { + return errors.Trace(err) + } + + tzName, tzOffset := ddlutil.GetTimeZone(ctx) + job := &model.Job{ + SchemaID: schema.ID, + TableID: meta.ID, + SchemaName: schema.Name.L, + TableName: t.Meta().Name.L, + Type: model.ActionReorganizePartition, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{spec.PartitionNames, partInfo}, + ReorgMeta: &model.DDLReorgMeta{ + SQLMode: ctx.GetSessionVars().SQLMode, + Warnings: make(map[errors.ErrorID]*terror.Error), + WarningsCount: make(map[errors.ErrorID]int64), + Location: &model.TimeZoneLocation{Name: tzName, Offset: tzOffset}, + }, + } + + // No preSplitAndScatter here, it will be done by the worker in onReorganizePartition instead. + err = d.DoDDLJob(ctx, job) + err = d.callHookOnChanged(job, err) + return errors.Trace(err) +} + +func checkReorgPartitionDefs(ctx sessionctx.Context, tblInfo *model.TableInfo, partInfo *model.PartitionInfo, firstPartIdx, lastPartIdx int, idMap map[int]struct{}) error { + // partInfo contains only the new added partition, we have to combine it with the + // old partitions to check all partitions is strictly increasing. + pi := tblInfo.Partition + clonedMeta := tblInfo.Clone() + clonedMeta.Partition.AddingDefinitions = partInfo.Definitions + clonedMeta.Partition.Definitions = getReorganizedDefinitions(clonedMeta.Partition, firstPartIdx, lastPartIdx, idMap) + if err := checkPartitionDefinitionConstraints(ctx, clonedMeta); err != nil { + return errors.Trace(err) + } + if pi.Type == model.PartitionTypeRange { + if lastPartIdx == len(pi.Definitions)-1 { + // Last partition dropped, OK to change the end range + // Also includes MAXVALUE + return nil + } + // Check if the replaced end range is the same as before + lastAddingPartition := partInfo.Definitions[len(partInfo.Definitions)-1] + lastOldPartition := pi.Definitions[lastPartIdx] + if len(pi.Columns) > 0 { + newGtOld, err := checkTwoRangeColumns(ctx, &lastAddingPartition, &lastOldPartition, pi, tblInfo) + if err != nil { + return errors.Trace(err) + } + if newGtOld { + return errors.Trace(dbterror.ErrRangeNotIncreasing) + } + oldGtNew, err := checkTwoRangeColumns(ctx, &lastOldPartition, &lastAddingPartition, pi, tblInfo) + if err != nil { + return errors.Trace(err) + } + if oldGtNew { + return errors.Trace(dbterror.ErrRangeNotIncreasing) + } + return nil + } + + isUnsigned := isPartExprUnsigned(tblInfo) + currentRangeValue, _, err := getRangeValue(ctx, pi.Definitions[lastPartIdx].LessThan[0], isUnsigned) + if err != nil { + return errors.Trace(err) + } + newRangeValue, _, err := getRangeValue(ctx, partInfo.Definitions[len(partInfo.Definitions)-1].LessThan[0], isUnsigned) + if err != nil { + return errors.Trace(err) + } + + if currentRangeValue != newRangeValue { + return errors.Trace(dbterror.ErrRangeNotIncreasing) + } + } + return nil +} + // CoalescePartitions coalesce partitions can be used with a table that is partitioned by hash or key to reduce the number of partitions by number. func (d *ddl) CoalescePartitions(ctx sessionctx.Context, ident ast.Ident, spec *ast.AlterTableSpec) error { is := d.infoCache.GetLatest() @@ -4233,11 +4529,19 @@ func checkIsDroppableColumn(ctx sessionctx.Context, is infoschema.InfoSchema, sc if err = isDroppableColumn(tblInfo, colName); err != nil { return false, errors.Trace(err) } + if err = checkDropColumnWithPartitionConstraint(t, colName); err != nil { + return false, errors.Trace(err) + } // Check the column with foreign key. err = checkDropColumnWithForeignKeyConstraint(is, schema.Name.L, tblInfo, colName.L) if err != nil { return false, errors.Trace(err) } + // Check the column with TTL config + err = checkDropColumnWithTTLConfig(tblInfo, colName.L) + if err != nil { + return false, errors.Trace(err) + } // We don't support dropping column with PK handle covered now. if col.IsPKHandleColumn(tblInfo) { return false, dbterror.ErrUnsupportedPKHandle @@ -4248,6 +4552,24 @@ func checkIsDroppableColumn(ctx sessionctx.Context, is infoschema.InfoSchema, sc return true, nil } +// checkDropColumnWithPartitionConstraint is used to check the partition constraint of the drop column. +func checkDropColumnWithPartitionConstraint(t table.Table, colName model.CIStr) error { + if t.Meta().Partition == nil { + return nil + } + pt, ok := t.(table.PartitionedTable) + if !ok { + // Should never happen! + return errors.Trace(dbterror.ErrDependentByPartitionFunctional.GenWithStackByArgs(colName.L)) + } + for _, name := range pt.GetPartitionColumnNames() { + if strings.EqualFold(name.L, colName.L) { + return errors.Trace(dbterror.ErrDependentByPartitionFunctional.GenWithStackByArgs(colName.L)) + } + } + return nil +} + func checkVisibleColumnCnt(t table.Table, addCnt, dropCnt int) error { tblInfo := t.Meta() visibleColumCnt := 0 @@ -4386,7 +4708,7 @@ func setColumnComment(ctx sessionctx.Context, col *table.Column, option *ast.Col func processColumnOptions(ctx sessionctx.Context, col *table.Column, options []*ast.ColumnOption) error { var sb strings.Builder restoreFlags := format.RestoreStringSingleQuotes | format.RestoreKeyWordLowercase | format.RestoreNameBackQuotes | - format.RestoreSpacesAroundBinaryOperation + format.RestoreSpacesAroundBinaryOperation | format.RestoreWithoutSchemaName | format.RestoreWithoutSchemaName restoreCtx := format.NewRestoreCtx(restoreFlags, &sb) var hasDefaultValue, setOnUpdateNow bool @@ -4611,6 +4933,9 @@ func GetModifiableColumnJob( if err = isGeneratedRelatedColumn(t.Meta(), newCol.ColumnInfo, col.ColumnInfo); err != nil { return nil, errors.Trace(err) } + if t.Meta().Partition != nil { + return nil, dbterror.ErrUnsupportedModifyColumn.GenWithStackByArgs("table is partition table") + } } // Check that the column change does not affect the partitioning column @@ -4625,9 +4950,15 @@ func GetModifiableColumnJob( for _, name := range pt.GetPartitionColumnNames() { if strings.EqualFold(name.L, col.Name.L) { isPartitioningColumn = true + break } } if isPartitioningColumn { + // TODO: update the partitioning columns with new names if column is renamed + // Would be an extension from MySQL which does not support it. + if col.Name.L != newCol.Name.L { + return nil, dbterror.ErrDependentByPartitionFunctional.GenWithStackByArgs(col.Name.L) + } if !isColTypeAllowedAsPartitioningCol(newCol.FieldType) { return nil, dbterror.ErrNotAllowedTypeInPartition.GenWithStackByArgs(newCol.Name.O) } @@ -4671,7 +5002,6 @@ func GetModifiableColumnJob( newTblInfo.Columns = newCols var buf bytes.Buffer - // TODO: update the partitioning columns with new names if column is renamed AppendPartitionInfo(tblInfo.GetPartitionInfo(), &buf, mysql.ModeNone) // The parser supports ALTER TABLE ... PARTITION BY ... even if the ddl code does not yet :) // Ignoring warnings @@ -4720,10 +5050,17 @@ func GetModifiableColumnJob( } // As same with MySQL, we don't support modifying the stored status for generated columns. - if err = checkModifyGeneratedColumn(sctx, t, col, newCol, specNewColumn, spec.Position); err != nil { + if err = checkModifyGeneratedColumn(sctx, schema.Name, t, col, newCol, specNewColumn, spec.Position); err != nil { return nil, errors.Trace(err) } + if t.Meta().TTLInfo != nil { + // the column referenced by TTL should be a time type + if t.Meta().TTLInfo.ColumnName.L == originalColName.L && !types.IsTypeTime(newCol.ColumnInfo.FieldType.GetType()) { + return nil, errors.Trace(dbterror.ErrUnsupportedColumnInTTLConfig.GenWithStackByArgs(newCol.ColumnInfo.Name.O)) + } + } + var newAutoRandBits uint64 if newAutoRandBits, err = checkAutoRandom(t.Meta(), col, specNewColumn); err != nil { return nil, errors.Trace(err) @@ -4996,6 +5333,11 @@ func (d *ddl) RenameColumn(ctx sessionctx.Context, ident ast.Ident, spec *ast.Al } } + err = checkDropColumnWithPartitionConstraint(tbl, oldColName) + if err != nil { + return errors.Trace(err) + } + tzName, tzOffset := ddlutil.GetTimeZone(ctx) newCol := oldCol.Clone() @@ -5145,6 +5487,11 @@ func (d *ddl) AlterTableAutoIDCache(ctx sessionctx.Context, ident ast.Ident, new if err != nil { return errors.Trace(err) } + tbInfo := tb.Meta() + if (newCache == 1 && tbInfo.AutoIdCache != 1) || + (newCache != 1 && tbInfo.AutoIdCache == 1) { + return fmt.Errorf("Can't Alter AUTO_ID_CACHE between 1 and non-1, the underlying implementation is different") + } job := &model.Job{ SchemaID: schema.ID, @@ -5262,6 +5609,96 @@ func (d *ddl) AlterTableSetTiFlashReplica(ctx sessionctx.Context, ident ast.Iden return errors.Trace(err) } +// AlterTableTTLInfoOrEnable submit ddl job to change table info according to the ttlInfo, or ttlEnable +// at least one of the `ttlInfo`, `ttlEnable` or `ttlCronJobSchedule` should be not nil. +// When `ttlInfo` is nil, and `ttlEnable` is not, it will use the original `.TTLInfo` in the table info and modify the +// `.Enable`. If the `.TTLInfo` in the table info is empty, this function will return an error. +// When `ttlInfo` is nil, and `ttlCronJobSchedule` is not, it will use the original `.TTLInfo` in the table info and modify the +// `.JobInterval`. If the `.TTLInfo` in the table info is empty, this function will return an error. +// When `ttlInfo` is not nil, it simply submits the job with the `ttlInfo` and ignore the `ttlEnable`. +func (d *ddl) AlterTableTTLInfoOrEnable(ctx sessionctx.Context, ident ast.Ident, ttlInfo *model.TTLInfo, ttlEnable *bool, ttlCronJobSchedule *string) error { + is := d.infoCache.GetLatest() + schema, ok := is.SchemaByName(ident.Schema) + if !ok { + return infoschema.ErrDatabaseNotExists.GenWithStackByArgs(ident.Schema) + } + + tb, err := is.TableByName(ident.Schema, ident.Name) + if err != nil { + return errors.Trace(infoschema.ErrTableNotExists.GenWithStackByArgs(ident.Schema, ident.Name)) + } + + tblInfo := tb.Meta().Clone() + tableID := tblInfo.ID + tableName := tblInfo.Name.L + + var job *model.Job + if ttlInfo != nil { + tblInfo.TTLInfo = ttlInfo + err = checkTTLInfoValid(ctx, ident.Schema, tblInfo) + if err != nil { + return err + } + } else { + if tblInfo.TTLInfo == nil { + if ttlEnable != nil { + return errors.Trace(dbterror.ErrSetTTLOptionForNonTTLTable.FastGenByArgs("TTL_ENABLE")) + } + if ttlCronJobSchedule != nil { + return errors.Trace(dbterror.ErrSetTTLOptionForNonTTLTable.FastGenByArgs("TTL_JOB_INTERVAL")) + } + } + } + + job = &model.Job{ + SchemaID: schema.ID, + TableID: tableID, + SchemaName: schema.Name.L, + TableName: tableName, + Type: model.ActionAlterTTLInfo, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{ttlInfo, ttlEnable, ttlCronJobSchedule}, + } + + err = d.DoDDLJob(ctx, job) + err = d.callHookOnChanged(job, err) + return errors.Trace(err) +} + +func (d *ddl) AlterTableRemoveTTL(ctx sessionctx.Context, ident ast.Ident) error { + is := d.infoCache.GetLatest() + + schema, ok := is.SchemaByName(ident.Schema) + if !ok { + return infoschema.ErrDatabaseNotExists.GenWithStackByArgs(ident.Schema) + } + + tb, err := is.TableByName(ident.Schema, ident.Name) + if err != nil { + return errors.Trace(infoschema.ErrTableNotExists.GenWithStackByArgs(ident.Schema, ident.Name)) + } + + tblInfo := tb.Meta().Clone() + tableID := tblInfo.ID + tableName := tblInfo.Name.L + + if tblInfo.TTLInfo != nil { + job := &model.Job{ + SchemaID: schema.ID, + TableID: tableID, + SchemaName: schema.Name.L, + TableName: tableName, + Type: model.ActionAlterTTLRemove, + BinlogInfo: &model.HistoryInfo{}, + } + err = d.DoDDLJob(ctx, job) + err = d.callHookOnChanged(job, err) + return errors.Trace(err) + } + + return nil +} + func isTableTiFlashSupported(schema *model.DBInfo, tb table.Table) error { // Memory tables and system tables are not supported by TiFlash if util.IsMemOrSysDB(schema.Name.L) { @@ -5987,7 +6424,7 @@ func (d *ddl) CreatePrimaryKey(ctx sessionctx.Context, ti ast.Ident, indexName m // After DDL job is put to the queue, and if the check fail, TiDB will run the DDL cancel logic. // The recover step causes DDL wait a few seconds, makes the unit test painfully slow. // For same reason, decide whether index is global here. - indexColumns, err := buildIndexColumns(ctx, tblInfo.Columns, indexPartSpecifications) + indexColumns, _, err := buildIndexColumns(ctx, tblInfo.Columns, indexPartSpecifications) if err != nil { return errors.Trace(err) } @@ -6090,14 +6527,14 @@ func BuildHiddenColumnInfo(ctx sessionctx.Context, indexPartSpecifications []*as var sb strings.Builder restoreFlags := format.RestoreStringSingleQuotes | format.RestoreKeyWordLowercase | format.RestoreNameBackQuotes | - format.RestoreSpacesAroundBinaryOperation + format.RestoreSpacesAroundBinaryOperation | format.RestoreWithoutSchemaName | format.RestoreWithoutTableName restoreCtx := format.NewRestoreCtx(restoreFlags, &sb) sb.Reset() err := idxPart.Expr.Restore(restoreCtx) if err != nil { return nil, errors.Trace(err) } - expr, err := expression.RewriteSimpleExprWithTableInfo(ctx, tblInfo, idxPart.Expr) + expr, err := expression.RewriteSimpleExprWithTableInfo(ctx, tblInfo, idxPart.Expr, true) if err != nil { // TODO: refine the error message. return nil, err @@ -6212,7 +6649,7 @@ func (d *ddl) createIndex(ctx sessionctx.Context, ti ast.Ident, keyType ast.Inde // After DDL job is put to the queue, and if the check fail, TiDB will run the DDL cancel logic. // The recover step causes DDL wait a few seconds, makes the unit test painfully slow. // For same reason, decide whether index is global here. - indexColumns, err := buildIndexColumns(ctx, finalColumns, indexPartSpecifications) + indexColumns, _, err := buildIndexColumns(ctx, finalColumns, indexPartSpecifications) if err != nil { return errors.Trace(err) } @@ -6393,7 +6830,7 @@ func (d *ddl) CreateForeignKey(ctx sessionctx.Context, ti ast.Ident, fkName mode if err != nil { return err } - if model.FindIndexByColumns(t.Meta(), fkInfo.Cols...) == nil { + if model.FindIndexByColumns(t.Meta(), t.Meta().Indices, fkInfo.Cols...) == nil { // Need to auto create index for fk cols if ctx.GetSessionVars().StmtCtx.MultiSchemaInfo == nil { ctx.GetSessionVars().StmtCtx.MultiSchemaInfo = model.NewMultiSchemaInfo() @@ -7353,6 +7790,142 @@ func checkIgnorePlacementDDL(ctx sessionctx.Context) bool { return false } +// AddResourceGroup implements the DDL interface, creates a resource group. +func (d *ddl) AddResourceGroup(ctx sessionctx.Context, stmt *ast.CreateResourceGroupStmt) (err error) { + groupName := stmt.ResourceGroupName + groupInfo := &model.ResourceGroupInfo{Name: groupName, ResourceGroupSettings: &model.ResourceGroupSettings{}} + groupInfo, err = buildResourceGroup(groupInfo, stmt.ResourceGroupOptionList) + if err != nil { + return err + } + + if _, ok := d.GetInfoSchemaWithInterceptor(ctx).ResourceGroupByName(groupName); ok { + if stmt.IfNotExists { + err = infoschema.ErrResourceGroupExists.GenWithStackByArgs(groupName) + ctx.GetSessionVars().StmtCtx.AppendNote(err) + return nil + } + return infoschema.ErrResourceGroupExists.GenWithStackByArgs(groupName) + } + + if groupName.L == variable.DefaultResourceGroupName { + return errors.Trace(infoschema.ErrReservedSyntax.GenWithStackByArgs(groupName)) + } + + if err := d.checkResourceGroupValidation(groupInfo); err != nil { + return err + } + + logutil.BgLogger().Debug("create resource group", zap.String("name", groupName.O), zap.Stringer("resource group settings", groupInfo.ResourceGroupSettings)) + groupIDs, err := d.genGlobalIDs(1) + if err != nil { + return err + } + groupInfo.ID = groupIDs[0] + + job := &model.Job{ + SchemaName: groupName.L, + Type: model.ActionCreateResourceGroup, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{groupInfo, false}, + } + err = d.DoDDLJob(ctx, job) + err = d.callHookOnChanged(job, err) + return err +} + +func (d *ddl) checkResourceGroupValidation(groupInfo *model.ResourceGroupInfo) error { + _, err := resourcegroup.NewGroupFromOptions(groupInfo.Name.L, groupInfo.ResourceGroupSettings) + return err +} + +// DropResourceGroup implements the DDL interface. +func (d *ddl) DropResourceGroup(ctx sessionctx.Context, stmt *ast.DropResourceGroupStmt) (err error) { + groupName := stmt.ResourceGroupName + is := d.GetInfoSchemaWithInterceptor(ctx) + // Check group existence. + group, ok := is.ResourceGroupByName(groupName) + if !ok { + err = infoschema.ErrResourceGroupNotExists.GenWithStackByArgs(groupName) + if stmt.IfExists { + ctx.GetSessionVars().StmtCtx.AppendNote(err) + return nil + } + return err + } + + // check to see if some user has dependency on the group + checker := privilege.GetPrivilegeManager(ctx) + if checker == nil { + return errors.New("miss privilege checker") + } + user, matched := checker.MatchUserResourceGroupName(groupName.L) + if matched { + err = errors.Errorf("user [%s] depends on the resource group to drop", user) + return err + } + + job := &model.Job{ + SchemaID: group.ID, + SchemaName: group.Name.L, + Type: model.ActionDropResourceGroup, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{groupName}, + } + err = d.DoDDLJob(ctx, job) + err = d.callHookOnChanged(job, err) + return err +} + +func buildResourceGroup(oldGroup *model.ResourceGroupInfo, options []*ast.ResourceGroupOption) (*model.ResourceGroupInfo, error) { + groupInfo := &model.ResourceGroupInfo{Name: oldGroup.Name, ID: oldGroup.ID, ResourceGroupSettings: &model.ResourceGroupSettings{}} + for _, opt := range options { + err := SetDirectResourceGroupUnit(groupInfo.ResourceGroupSettings, opt.Tp, opt.StrValue, opt.UintValue, opt.BoolValue) + if err != nil { + return nil, err + } + } + groupInfo.ResourceGroupSettings.Adjust() + return groupInfo, nil +} + +// AlterResourceGroup implements the DDL interface. +func (d *ddl) AlterResourceGroup(ctx sessionctx.Context, stmt *ast.AlterResourceGroupStmt) (err error) { + groupName := stmt.ResourceGroupName + is := d.GetInfoSchemaWithInterceptor(ctx) + // Check group existence. + group, ok := is.ResourceGroupByName(groupName) + if !ok { + err := infoschema.ErrResourceGroupNotExists.GenWithStackByArgs(groupName) + if stmt.IfExists { + ctx.GetSessionVars().StmtCtx.AppendNote(err) + return nil + } + return err + } + newGroupInfo, err := buildResourceGroup(group, stmt.ResourceGroupOptionList) + if err != nil { + return errors.Trace(err) + } + + if err := d.checkResourceGroupValidation(newGroupInfo); err != nil { + return err + } + + logutil.BgLogger().Debug("alter resource group", zap.String("name", groupName.L), zap.Stringer("new resource group settings", newGroupInfo.ResourceGroupSettings)) + + job := &model.Job{ + SchemaID: newGroupInfo.ID, + SchemaName: newGroupInfo.Name.L, + Type: model.ActionAlterResourceGroup, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{newGroupInfo}, + } + err = d.DoDDLJob(ctx, job) + err = d.callHookOnChanged(job, err) + return err +} + func (d *ddl) CreatePlacementPolicy(ctx sessionctx.Context, stmt *ast.CreatePlacementPolicyStmt) (err error) { if checkIgnorePlacementDDL(ctx) { return nil diff --git a/ddl/ddl_api_test.go b/ddl/ddl_api_test.go index f4010015f5456..9f36cc95f806c 100644 --- a/ddl/ddl_api_test.go +++ b/ddl/ddl_api_test.go @@ -115,73 +115,6 @@ func TestGetDDLJobsIsSort(t *testing.T) { require.NoError(t, err) } -func TestGetHistoryDDLJobs(t *testing.T) { - store := testkit.CreateMockStore(t) - - // delete the internal DDL record. - err := kv.RunInNewTxn(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), store, false, func(ctx context.Context, txn kv.Transaction) error { - return meta.NewMeta(txn).ClearAllHistoryJob() - }) - require.NoError(t, err) - testkit.NewTestKit(t, store).MustExec("delete from mysql.tidb_ddl_history") - - tk := testkit.NewTestKit(t, store) - sess := tk.Session() - tk.MustExec("begin") - - txn, err := sess.Txn(true) - require.NoError(t, err) - - m := meta.NewMeta(txn) - cnt := 11 - jobs := make([]*model.Job, cnt) - for i := 0; i < cnt; i++ { - jobs[i] = &model.Job{ - ID: int64(i), - SchemaID: 1, - Type: model.ActionCreateTable, - } - err = ddl.AddHistoryDDLJobForTest(sess, m, jobs[i], true) - require.NoError(t, err) - - historyJobs, err := ddl.GetLastNHistoryDDLJobs(m, ddl.DefNumHistoryJobs) - require.NoError(t, err) - - if i+1 > ddl.MaxHistoryJobs { - require.Len(t, historyJobs, ddl.MaxHistoryJobs) - } else { - require.Len(t, historyJobs, i+1) - } - } - - delta := cnt - ddl.MaxHistoryJobs - historyJobs, err := ddl.GetLastNHistoryDDLJobs(m, ddl.DefNumHistoryJobs) - require.NoError(t, err) - require.Len(t, historyJobs, ddl.MaxHistoryJobs) - - l := len(historyJobs) - 1 - for i, job := range historyJobs { - require.Equal(t, jobs[delta+l-i].ID, job.ID) - require.Equal(t, int64(1), job.SchemaID) - require.Equal(t, model.ActionCreateTable, job.Type) - } - - var historyJobs2 []*model.Job - err = ddl.IterHistoryDDLJobs(txn, func(jobs []*model.Job) (b bool, e error) { - for _, job := range jobs { - historyJobs2 = append(historyJobs2, job) - if len(historyJobs2) == ddl.DefNumHistoryJobs { - return true, nil - } - } - return false, nil - }) - require.NoError(t, err) - require.Equal(t, historyJobs, historyJobs2) - - tk.MustExec("rollback") -} - func TestIsJobRollbackable(t *testing.T) { cases := []struct { tp model.ActionType diff --git a/ddl/ddl_test.go b/ddl/ddl_test.go index 9760608674c6f..99e01a8e740c4 100644 --- a/ddl/ddl_test.go +++ b/ddl/ddl_test.go @@ -19,7 +19,6 @@ import ( "testing" "time" - "github.com/pingcap/failpoint" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" @@ -40,9 +39,14 @@ import ( const testLease = 5 * time.Millisecond +// DDLForTest exports for testing. type DDLForTest interface { // SetInterceptor sets the interceptor. SetInterceptor(h Interceptor) + NewReorgCtx(jobID int64, startKey []byte, currElement *meta.Element, rowCount int64) *reorgCtx + SetReorgCtxForBackfill(bfJob *BackfillJob) + GetReorgCtx(jobID int64) *reorgCtx + RemoveReorgCtx(id int64) } // SetInterceptor implements DDL.SetInterceptor interface. @@ -53,9 +57,45 @@ func (d *ddl) SetInterceptor(i Interceptor) { d.mu.interceptor = i } +// IsReorgCanceled exports for testing. +func (rc *reorgCtx) IsReorgCanceled() bool { + return rc.isReorgCanceled() +} + +// NewReorgCtx exports for testing. +func (d *ddl) NewReorgCtx(jobID int64, startKey []byte, currElement *meta.Element, rowCount int64) *reorgCtx { + return d.newReorgCtx(jobID, startKey, currElement, rowCount) +} + +// SetReorgCtxForBackfill exports for testing. +func (d *ddl) SetReorgCtxForBackfill(bfJob *BackfillJob) { + d.setReorgCtxForBackfill(bfJob) +} + +// GetReorgCtx exports for testing. +func (d *ddl) GetReorgCtx(jobID int64) *reorgCtx { + return d.getReorgCtx(jobID) +} + +// RemoveReorgCtx exports for testing. +func (d *ddl) RemoveReorgCtx(id int64) { + d.removeReorgCtx(id) +} + // JobNeedGCForTest is only used for test. var JobNeedGCForTest = jobNeedGC +// NewSession is only used for test. +var NewSession = newSession + +// GetJobWithoutPartition is only used for test. +const GetJobWithoutPartition = getJobWithoutPartition + +// GetDDLCtx returns ddlCtx for test. +func GetDDLCtx(d DDL) *ddlCtx { + return d.(*ddl).ddlCtx +} + // GetMaxRowID is used for test. func GetMaxRowID(store kv.Storage, priority int, t table.Table, startHandle, endHandle kv.Key) (kv.Key, error) { return getRangeEndKey(NewJobContext(), store, priority, t.RecordPrefix(), startHandle, endHandle) @@ -268,109 +308,6 @@ func TestBuildJobDependence(t *testing.T) { require.NoError(t, err) } -func TestNotifyDDLJob(t *testing.T) { - store := createMockStore(t) - defer func() { - require.NoError(t, store.Close()) - }() - - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/NoDDLDispatchLoop", `return(true)`)) - defer require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/NoDDLDispatchLoop")) - - getFirstNotificationAfterStartDDL := func(d *ddl) { - select { - case <-d.workers[addIdxWorker].ddlJobCh: - default: - // The notification may be received by the worker. - } - select { - case <-d.workers[generalWorker].ddlJobCh: - default: - // The notification may be received by the worker. - } - - select { - case <-d.ddlJobCh: - default: - } - } - - d, err := testNewDDLAndStart( - context.Background(), - WithStore(store), - WithLease(testLease), - ) - require.NoError(t, err) - defer func() { - require.NoError(t, d.Stop()) - }() - getFirstNotificationAfterStartDDL(d) - // Ensure that the notification is not handled in workers `start` function. - d.cancel() - for _, worker := range d.workers { - worker.Close() - } - - job := &model.Job{ - SchemaID: 1, - TableID: 2, - Type: model.ActionCreateTable, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{}, - } - // Test the notification mechanism of the owner and the server receiving the DDL request on the same TiDB. - // This DDL request is a general DDL job. - d.asyncNotifyWorker(job) - select { - case <-d.workers[generalWorker].ddlJobCh: - case <-d.ddlJobCh: - default: - require.FailNow(t, "do not get the general job notification") - } - // Test the notification mechanism of the owner and the server receiving the DDL request on the same TiDB. - // This DDL request is a add index DDL job. - job.Type = model.ActionAddIndex - d.asyncNotifyWorker(job) - select { - case <-d.workers[addIdxWorker].ddlJobCh: - case <-d.ddlJobCh: - default: - require.FailNow(t, "do not get the add index job notification") - } - - // Test the notification mechanism that the owner and the server receiving the DDL request are not on the same TiDB. - // And the etcd client is nil. - d1, err := testNewDDLAndStart( - context.Background(), - WithStore(store), - WithLease(testLease), - ) - require.NoError(t, err) - defer func() { - require.NoError(t, d1.Stop()) - }() - getFirstNotificationAfterStartDDL(d1) - // Ensure that the notification is not handled by worker's "start". - d1.cancel() - for _, worker := range d1.workers { - worker.Close() - } - d1.ownerManager.RetireOwner() - d1.asyncNotifyWorker(job) - job.Type = model.ActionCreateTable - d1.asyncNotifyWorker(job) - require.False(t, d1.OwnerManager().IsOwner()) - select { - case <-d1.workers[addIdxWorker].ddlJobCh: - require.FailNow(t, "should not get the add index job notification") - case <-d1.workers[generalWorker].ddlJobCh: - require.FailNow(t, "should not get the general job notification") - case <-d1.ddlJobCh: - require.FailNow(t, "should not get the job notification") - default: - } -} - func TestError(t *testing.T) { kvErrs := []*terror.Error{ dbterror.ErrDDLJobNotFound, diff --git a/ddl/ddl_tiflash_api.go b/ddl/ddl_tiflash_api.go index 7e456815acd8c..c601093ca5963 100644 --- a/ddl/ddl_tiflash_api.go +++ b/ddl/ddl_tiflash_api.go @@ -29,20 +29,15 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/ddl/placement" ddlutil "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/parser/model" - "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/helper" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/util" - "github.com/pingcap/tidb/util/gcutil" + "github.com/pingcap/tidb/util/intest" "github.com/pingcap/tidb/util/logutil" atomicutil "go.uber.org/atomic" "go.uber.org/zap" @@ -50,12 +45,13 @@ import ( // TiFlashReplicaStatus records status for each TiFlash replica. type TiFlashReplicaStatus struct { - ID int64 - Count uint64 - LocationLabels []string - Available bool - HighPriority bool - IsPartition bool + ID int64 + Count uint64 + LocationLabels []string + Available bool + LogicalTableAvailable bool + HighPriority bool + IsPartition bool } // TiFlashTick is type for backoff threshold. @@ -283,16 +279,16 @@ func LoadTiFlashReplicaInfo(tblInfo *model.TableInfo, tableList *[]TiFlashReplic for _, p := range pi.Definitions { logutil.BgLogger().Debug(fmt.Sprintf("Table %v has partition %v\n", tblInfo.ID, p.ID)) *tableList = append(*tableList, TiFlashReplicaStatus{p.ID, - tblInfo.TiFlashReplica.Count, tblInfo.TiFlashReplica.LocationLabels, tblInfo.TiFlashReplica.IsPartitionAvailable(p.ID), false, true}) + tblInfo.TiFlashReplica.Count, tblInfo.TiFlashReplica.LocationLabels, tblInfo.TiFlashReplica.IsPartitionAvailable(p.ID), tblInfo.TiFlashReplica.Available, false, true}) } // partitions that in adding mid-state for _, p := range pi.AddingDefinitions { logutil.BgLogger().Debug(fmt.Sprintf("Table %v has partition adding %v\n", tblInfo.ID, p.ID)) - *tableList = append(*tableList, TiFlashReplicaStatus{p.ID, tblInfo.TiFlashReplica.Count, tblInfo.TiFlashReplica.LocationLabels, tblInfo.TiFlashReplica.IsPartitionAvailable(p.ID), true, true}) + *tableList = append(*tableList, TiFlashReplicaStatus{p.ID, tblInfo.TiFlashReplica.Count, tblInfo.TiFlashReplica.LocationLabels, tblInfo.TiFlashReplica.IsPartitionAvailable(p.ID), tblInfo.TiFlashReplica.Available, true, true}) } } else { logutil.BgLogger().Debug(fmt.Sprintf("Table %v has no partition\n", tblInfo.ID)) - *tableList = append(*tableList, TiFlashReplicaStatus{tblInfo.ID, tblInfo.TiFlashReplica.Count, tblInfo.TiFlashReplica.LocationLabels, tblInfo.TiFlashReplica.Available, false, false}) + *tableList = append(*tableList, TiFlashReplicaStatus{tblInfo.ID, tblInfo.TiFlashReplica.Count, tblInfo.TiFlashReplica.LocationLabels, tblInfo.TiFlashReplica.Available, tblInfo.TiFlashReplica.Available, false, false}) } } @@ -355,22 +351,6 @@ func updateTiFlashStores(pollTiFlashContext *TiFlashManagementContext) error { return nil } -func getTiFlashPeerWithoutLagCount(pollTiFlashContext *TiFlashManagementContext, tableID int64) (int, error) { - // storeIDs -> regionID, PD will not create two peer on the same store - var flashPeerCount int - for _, store := range pollTiFlashContext.TiFlashStores { - regionReplica := make(map[int64]int) - err := helper.CollectTiFlashStatus(store.Store.StatusAddress, tableID, ®ionReplica) - if err != nil { - logutil.BgLogger().Error("Fail to get peer status from TiFlash.", - zap.Int64("tableID", tableID)) - return 0, err - } - flashPeerCount += len(regionReplica) - } - return flashPeerCount, nil -} - func pollAvailableTableProgress(schemas infoschema.InfoSchema, ctx sessionctx.Context, pollTiFlashContext *TiFlashManagementContext) { pollMaxCount := RefreshProgressMaxTableCount failpoint.Inject("PollAvailableTableProgressMaxCount", func(val failpoint.Value) { @@ -419,6 +399,13 @@ func pollAvailableTableProgress(schemas infoschema.InfoSchema, ctx sessionctx.Co zap.Int64("tableID", availableTableID.ID), zap.Bool("IsPartition", availableTableID.IsPartition), ) + if intest.InTest { + // In the test, the server cannot start up because the port is occupied. + // Although the port is random. so we need to quickly return when to + // fail to get tiflash sync. + // https://github.com/pingcap/tidb/issues/39949 + panic(err) + } continue } err = infosync.UpdateTiFlashProgressCache(availableTableID.ID, progress) @@ -445,6 +432,14 @@ func (d *ddl) refreshTiFlashTicker(ctx sessionctx.Context, pollTiFlashContext *T return err } } + + failpoint.Inject("OneTiFlashStoreDown", func() { + for storeID, store := range pollTiFlashContext.TiFlashStores { + store.Store.StateName = "Down" + pollTiFlashContext.TiFlashStores[storeID] = store + break + } + }) pollTiFlashContext.PollCounter++ // Start to process every table. @@ -466,6 +461,21 @@ func (d *ddl) refreshTiFlashTicker(ctx sessionctx.Context, pollTiFlashContext *T } } + failpoint.Inject("waitForAddPartition", func(val failpoint.Value) { + for _, phyTable := range tableList { + is := d.infoCache.GetLatest() + _, ok := is.TableByID(phyTable.ID) + if !ok { + tb, _, _ := is.FindTableByPartitionID(phyTable.ID) + if tb == nil { + logutil.BgLogger().Info("[ddl] waitForAddPartition") + sleepSecond := val.(int) + time.Sleep(time.Duration(sleepSecond) * time.Second) + } + } + } + }) + needPushPending := false if pollTiFlashContext.UpdatingProgressTables.Len() == 0 { needPushPending = true @@ -479,7 +489,7 @@ func (d *ddl) refreshTiFlashTicker(ctx sessionctx.Context, pollTiFlashContext *T available = val.(bool) }) // We only check unavailable tables here, so doesn't include blocked add partition case. - if !available { + if !available && !tb.LogicalTableAvailable { enabled, inqueue, _ := pollTiFlashContext.Backoff.Tick(tb.ID) if inqueue && !enabled { logutil.BgLogger().Info("Escape checking available status due to backoff", zap.Int64("tableId", tb.ID)) @@ -540,110 +550,6 @@ func (d *ddl) refreshTiFlashTicker(ctx sessionctx.Context, pollTiFlashContext *T return nil } -func getDropOrTruncateTableTiflash(ctx sessionctx.Context, currentSchema infoschema.InfoSchema, tikvHelper *helper.Helper, replicaInfos *[]TiFlashReplicaStatus) error { - store := tikvHelper.Store.(kv.Storage) - - txn, err := store.Begin() - if err != nil { - return errors.Trace(err) - } - gcSafePoint, err := gcutil.GetGCSafePoint(ctx) - if err != nil { - return err - } - uniqueIDMap := make(map[int64]struct{}) - handleJobAndTableInfo := func(job *model.Job, tblInfo *model.TableInfo) (bool, error) { - // Avoid duplicate table ID info. - if _, ok := currentSchema.TableByID(tblInfo.ID); ok { - return false, nil - } - if _, ok := uniqueIDMap[tblInfo.ID]; ok { - return false, nil - } - uniqueIDMap[tblInfo.ID] = struct{}{} - LoadTiFlashReplicaInfo(tblInfo, replicaInfos) - return false, nil - } - fn := func(jobs []*model.Job) (bool, error) { - getTable := func(StartTS uint64, SchemaID int64, TableID int64) (*model.TableInfo, error) { - snapMeta := meta.NewSnapshotMeta(store.GetSnapshot(kv.NewVersion(StartTS))) - if err != nil { - return nil, err - } - tbl, err := snapMeta.GetTable(SchemaID, TableID) - return tbl, err - } - return GetDropOrTruncateTableInfoFromJobsByStore(jobs, gcSafePoint, getTable, handleJobAndTableInfo) - } - - err = IterAllDDLJobs(ctx, txn, fn) - if err != nil { - if terror.ErrorEqual(variable.ErrSnapshotTooOld, err) { - // The err indicate that current ddl job and remain DDL jobs was been deleted by GC, - // just ignore the error and return directly. - return nil - } - return err - } - return nil -} - -// HandlePlacementRuleRoutine fetch all rules from pd, remove all obsolete rules. -// It handles rare situation, when we fail to alter pd rules. -func HandlePlacementRuleRoutine(ctx sessionctx.Context, d *ddl, tableList []TiFlashReplicaStatus) error { - c := context.Background() - tikvStore, ok := ctx.GetStore().(helper.Storage) - if !ok { - return errors.New("Can not get Helper") - } - tikvHelper := &helper.Helper{ - Store: tikvStore, - RegionCache: tikvStore.GetRegionCache(), - } - - allRulesArr, err := infosync.GetTiFlashGroupRules(c, "tiflash") - if err != nil { - return errors.Trace(err) - } - allRules := make(map[string]placement.TiFlashRule) - for _, r := range allRulesArr { - allRules[r.ID] = r - } - - start := time.Now() - originLen := len(tableList) - currentSchema := d.GetInfoSchemaWithInterceptor(ctx) - if err := getDropOrTruncateTableTiflash(ctx, currentSchema, tikvHelper, &tableList); err != nil { - // may fail when no `tikv_gc_safe_point` available, should return in order to remove valid pd rules. - logutil.BgLogger().Error("getDropOrTruncateTableTiflash returns error", zap.Error(err)) - return errors.Trace(err) - } - elapsed := time.Since(start) - logutil.BgLogger().Info("getDropOrTruncateTableTiflash cost", zap.Duration("time", elapsed), zap.Int("updated", len(tableList)-originLen)) - for _, tb := range tableList { - // For every region in each table, if it has one replica, we reckon it ready. - ruleID := fmt.Sprintf("table-%v-r", tb.ID) - if _, ok := allRules[ruleID]; !ok { - // Mostly because of a previous failure of setting pd rule. - logutil.BgLogger().Warn(fmt.Sprintf("Table %v exists, but there are no rule for it", tb.ID)) - newRule := infosync.MakeNewRule(tb.ID, tb.Count, tb.LocationLabels) - _ = infosync.SetTiFlashPlacementRule(context.Background(), *newRule) - } - // For every existing table, we do not remove their rules. - delete(allRules, ruleID) - } - - // Remove rules of non-existing table - for _, v := range allRules { - logutil.BgLogger().Info("Remove TiFlash rule", zap.String("id", v.ID)) - if err := infosync.DeleteTiFlashPlacementRule(c, "tiflash", v.ID); err != nil { - logutil.BgLogger().Warn("delete TiFlash pd rule failed", zap.Error(err), zap.String("ruleID", v.ID)) - } - } - - return nil -} - func (d *ddl) PollTiFlashRoutine() { pollTiflashContext, err := NewTiFlashManagementContext() if err != nil { diff --git a/ddl/ddl_worker.go b/ddl/ddl_worker.go index 956f4c805347f..48faea6c6e02c 100644 --- a/ddl/ddl_worker.go +++ b/ddl/ddl_worker.go @@ -40,6 +40,7 @@ import ( tidbutil "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/mathutil" "github.com/pingcap/tidb/util/resourcegrouptag" "github.com/pingcap/tidb/util/topsql" topsqlstate "github.com/pingcap/tidb/util/topsql/state" @@ -52,10 +53,14 @@ import ( var ( // ddlWorkerID is used for generating the next DDL worker ID. ddlWorkerID = atomicutil.NewInt32(0) + // backfillContextID is used for generating the next backfill context ID. + backfillContextID = atomicutil.NewInt32(0) // WaitTimeWhenErrorOccurred is waiting interval when processing DDL jobs encounter errors. WaitTimeWhenErrorOccurred = int64(1 * time.Second) mockDDLErrOnce = int64(0) + // TestNotifyBeginTxnCh is used for if the txn is beginning in runInTxn. + TestNotifyBeginTxnCh = make(chan struct{}) ) // GetWaitTimeWhenErrorOccurred return waiting interval when processing DDL jobs encounter errors. @@ -97,8 +102,6 @@ type worker struct { logCtx context.Context lockSeqNum bool - concurrentDDL bool - *ddlCtx } @@ -119,11 +122,11 @@ func NewJobContext() *JobContext { cacheSQL: "", cacheNormalizedSQL: "", cacheDigest: nil, - tp: "unknown", + tp: "", } } -func newWorker(ctx context.Context, tp workerType, sessPool *sessionPool, delRangeMgr delRangeManager, dCtx *ddlCtx, concurrentDDL bool) *worker { +func newWorker(ctx context.Context, tp workerType, sessPool *sessionPool, delRangeMgr delRangeManager, dCtx *ddlCtx) *worker { worker := &worker{ id: ddlWorkerID.Add(1), tp: tp, @@ -132,7 +135,6 @@ func newWorker(ctx context.Context, tp workerType, sessPool *sessionPool, delRan ddlCtx: dCtx, sessPool: sessPool, delRangeManager: delRangeMgr, - concurrentDDL: concurrentDDL, } worker.addingDDLJobKey = addingDDLJobPrefix + worker.typeStr() worker.logCtx = logutil.WithKeyValue(context.Background(), "worker", worker.String()) @@ -165,71 +167,19 @@ func (w *worker) Close() { logutil.Logger(w.logCtx).Info("[ddl] DDL worker closed", zap.Duration("take time", time.Since(startTime))) } -// start is used for async online schema changing, it will try to become the owner firstly, -// then wait or pull the job queue to handle a schema change job. -func (w *worker) start(d *ddlCtx) { - logutil.Logger(w.logCtx).Info("[ddl] start DDL worker") - defer w.wg.Done() - defer tidbutil.Recover( - metrics.LabelDDLWorker, - fmt.Sprintf("DDL ID %s, %s start", d.uuid, w), - nil, true, - ) - - // We use 4 * lease time to check owner's timeout, so here, we will update owner's status - // every 2 * lease time. If lease is 0, we will use default 1s. - // But we use etcd to speed up, normally it takes less than 1s now, so we use 1s as the max value. - checkTime := chooseLeaseTime(2*d.lease, 1*time.Second) - - ticker := time.NewTicker(checkTime) - defer ticker.Stop() - var notifyDDLJobByEtcdCh clientv3.WatchChan - if d.etcdCli != nil { - notifyDDLJobByEtcdCh = d.etcdCli.Watch(context.Background(), w.addingDDLJobKey) - } - - rewatchCnt := 0 - for { - ok := true - select { - case <-ticker.C: - logutil.Logger(w.logCtx).Debug("[ddl] wait to check DDL status again", zap.Duration("interval", checkTime)) - case <-w.ddlJobCh: - case _, ok = <-notifyDDLJobByEtcdCh: - case <-w.ctx.Done(): - return - } - - if !ok { - logutil.Logger(w.logCtx).Warn("[ddl] start worker watch channel closed", zap.String("watch key", w.addingDDLJobKey)) - notifyDDLJobByEtcdCh = d.etcdCli.Watch(context.Background(), w.addingDDLJobKey) - rewatchCnt++ - if rewatchCnt > 10 { - time.Sleep(time.Duration(rewatchCnt) * time.Second) - } - continue - } - - rewatchCnt = 0 - err := w.handleDDLJobQueue(d) - if err != nil { - logutil.Logger(w.logCtx).Warn("[ddl] handle DDL job failed", zap.Error(err)) - } - } -} - -func (d *ddl) asyncNotifyByEtcd(addingDDLJobKey string, job *model.Job) { +func (d *ddlCtx) asyncNotifyByEtcd(etcdPath string, jobID int64, jobType string) { if d.etcdCli == nil { return } - jobID := strconv.FormatInt(job.ID, 10) + jobIDStr := strconv.FormatInt(jobID, 10) timeStart := time.Now() - err := util.PutKVToEtcd(d.ctx, d.etcdCli, 1, addingDDLJobKey, jobID) + err := util.PutKVToEtcd(d.ctx, d.etcdCli, 1, etcdPath, jobIDStr) if err != nil { - logutil.BgLogger().Info("[ddl] notify handling DDL job failed", zap.String("jobID", jobID), zap.Error(err)) + logutil.BgLogger().Info("[ddl] notify handling DDL job failed", + zap.String("etcdPath", etcdPath), zap.Int64("jobID", jobID), zap.String("type", jobType), zap.Error(err)) } - metrics.DDLWorkerHistogram.WithLabelValues(metrics.WorkerNotifyDDLJob, job.Type.String(), metrics.RetLabel(err)).Observe(time.Since(timeStart).Seconds()) + metrics.DDLWorkerHistogram.WithLabelValues(metrics.WorkerNotifyDDLJob, jobType, metrics.RetLabel(err)).Observe(time.Since(timeStart).Seconds()) } func asyncNotify(ch chan struct{}) { @@ -239,37 +189,6 @@ func asyncNotify(ch chan struct{}) { } } -// buildJobDependence sets the curjob's dependency-ID. -// The dependency-job's ID must less than the current job's ID, and we need the largest one in the list. -func buildJobDependence(t *meta.Meta, curJob *model.Job) error { - // Jobs in the same queue are ordered. If we want to find a job's dependency-job, we need to look for - // it from the other queue. So if the job is "ActionAddIndex" job, we need find its dependency-job from DefaultJobList. - jobListKey := meta.DefaultJobListKey - if !curJob.MayNeedReorg() { - jobListKey = meta.AddIndexJobListKey - } - jobs, err := t.GetAllDDLJobsInQueue(jobListKey) - if err != nil { - return errors.Trace(err) - } - - for _, job := range jobs { - if curJob.ID < job.ID { - continue - } - isDependent, err := curJob.IsDependentOn(job) - if err != nil { - return errors.Trace(err) - } - if isDependent { - logutil.BgLogger().Info("[ddl] current DDL job depends on other job", zap.String("currentJob", curJob.String()), zap.String("dependentJob", job.String())) - curJob.DependencyID = job.ID - break - } - } - return nil -} - func (d *ddl) limitDDLJobs() { defer tidbutil.Recover(metrics.LabelDDL, "limitDDLJobs", nil, true) @@ -295,7 +214,7 @@ func (d *ddl) addBatchDDLJobs(tasks []*limitJobTask) { startTime := time.Now() var err error // DDLForce2Queue is a flag to tell DDL worker to always push the job to the DDL queue. - toTable := variable.EnableConcurrentDDL.Load() && !variable.DDLForce2Queue.Load() + toTable := !variable.DDLForce2Queue.Load() if toTable { err = d.addBatchDDLJobs2Table(tasks) } else { @@ -315,6 +234,37 @@ func (d *ddl) addBatchDDLJobs(tasks []*limitJobTask) { } } +// buildJobDependence sets the curjob's dependency-ID. +// The dependency-job's ID must less than the current job's ID, and we need the largest one in the list. +func buildJobDependence(t *meta.Meta, curJob *model.Job) error { + // Jobs in the same queue are ordered. If we want to find a job's dependency-job, we need to look for + // it from the other queue. So if the job is "ActionAddIndex" job, we need find its dependency-job from DefaultJobList. + jobListKey := meta.DefaultJobListKey + if !curJob.MayNeedReorg() { + jobListKey = meta.AddIndexJobListKey + } + jobs, err := t.GetAllDDLJobsInQueue(jobListKey) + if err != nil { + return errors.Trace(err) + } + + for _, job := range jobs { + if curJob.ID < job.ID { + continue + } + isDependent, err := curJob.IsDependentOn(job) + if err != nil { + return errors.Trace(err) + } + if isDependent { + logutil.BgLogger().Info("[ddl] current DDL job depends on other job", zap.String("currentJob", curJob.String()), zap.String("dependentJob", job.String())) + curJob.DependencyID = job.ID + break + } + } + return nil +} + func (d *ddl) addBatchDDLJobs2Queue(tasks []*limitJobTask) error { ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL) return kv.RunInNewTxn(ctx, d.store, true, func(ctx context.Context, txn kv.Transaction) error { @@ -425,6 +375,7 @@ func (d *ddl) addBatchDDLJobs2Table(tasks []*limitJobTask) error { jobTasks[i] = job injectModifyJobArgFailPoint(job) } + sess.SetDiskFullOpt(kvrpcpb.DiskFullOpt_AllowedOnAlmostFull) err = insertDDLJobs2Table(newSession(sess), true, jobTasks...) } @@ -443,13 +394,6 @@ func injectFailPointForGetJob(job *model.Job) { }) } -// getFirstDDLJob gets the first DDL job form DDL queue. -func (w *worker) getFirstDDLJob(t *meta.Meta) (*model.Job, error) { - job, err := t.GetDDLJobByIdx(0) - injectFailPointForGetJob(job) - return job, errors.Trace(err) -} - // handleUpdateJobError handles the too large DDL job. func (w *worker) handleUpdateJobError(t *meta.Meta, job *model.Job, err error) error { if err == nil { @@ -470,7 +414,7 @@ func (w *worker) handleUpdateJobError(t *meta.Meta, job *model.Job, err error) e // updateDDLJob updates the DDL job information. // Every time we enter another state except final state, we must call this function. -func (w *worker) updateDDLJob(t *meta.Meta, job *model.Job, meetErr bool) error { +func (w *worker) updateDDLJob(job *model.Job, meetErr bool) error { failpoint.Inject("mockErrEntrySizeTooLarge", func(val failpoint.Value) { if val.(bool) { failpoint.Return(kv.ErrEntryTooLarge) @@ -481,13 +425,7 @@ func (w *worker) updateDDLJob(t *meta.Meta, job *model.Job, meetErr bool) error logutil.Logger(w.logCtx).Info("[ddl] meet something wrong before update DDL job, shouldn't update raw args", zap.String("job", job.String())) } - var err error - if w.concurrentDDL { - err = updateDDLJob2Table(w.sess, job, updateRawArgs) - } else { - err = t.UpdateDDLJob(0, job, updateRawArgs) - } - return errors.Trace(err) + return errors.Trace(updateDDLJob2Table(w.sess, job, updateRawArgs)) } // registerMDLInfo registers metadata lock info. @@ -512,7 +450,7 @@ func (w *worker) registerMDLInfo(job *model.Job, ver int64) error { } // cleanMDLInfo cleans metadata lock info. -func cleanMDLInfo(pool *sessionPool, jobID int64) { +func cleanMDLInfo(pool *sessionPool, jobID int64, ec *clientv3.Client) { if !variable.EnableMDL.Load() { return } @@ -525,19 +463,30 @@ func cleanMDLInfo(pool *sessionPool, jobID int64) { if err != nil { logutil.BgLogger().Warn("unexpected error when clean mdl info", zap.Error(err)) } + if ec != nil { + path := fmt.Sprintf("%s/%d/", util.DDLAllSchemaVersionsByJob, jobID) + _, err = ec.Delete(context.Background(), path, clientv3.WithPrefix()) + if err != nil { + logutil.BgLogger().Warn("[ddl] delete versions failed", zap.Any("job id", jobID), zap.Error(err)) + } + } } // checkMDLInfo checks if metadata lock info exists. It means the schema is locked by some TiDBs if exists. -func checkMDLInfo(jobID int64, pool *sessionPool) (bool, error) { - sql := fmt.Sprintf("select * from mysql.tidb_mdl_info where job_id = %d", jobID) +func checkMDLInfo(jobID int64, pool *sessionPool) (bool, int64, error) { + sql := fmt.Sprintf("select version from mysql.tidb_mdl_info where job_id = %d", jobID) sctx, _ := pool.get() defer pool.put(sctx) sess := newSession(sctx) rows, err := sess.execute(context.Background(), sql, "check-mdl-info") if err != nil { - return false, err + return false, 0, err + } + if len(rows) == 0 { + return false, 0, nil } - return len(rows) > 0, nil + ver := rows[0].GetInt64(0) + return true, ver, nil } func needUpdateRawArgs(job *model.Job, meetErr bool) bool { @@ -571,7 +520,8 @@ func jobNeedGC(job *model.Job) bool { switch job.Type { case model.ActionDropSchema, model.ActionDropTable, model.ActionTruncateTable, model.ActionDropIndex, model.ActionDropPrimaryKey, model.ActionDropTablePartition, model.ActionTruncateTablePartition, model.ActionDropColumn, model.ActionModifyColumn, - model.ActionAddIndex, model.ActionAddPrimaryKey: + model.ActionAddIndex, model.ActionAddPrimaryKey, + model.ActionReorganizePartition: return true case model.ActionMultiSchemaChange: for _, sub := range job.MultiSchemaInfo.SubJobs { @@ -619,11 +569,7 @@ func (w *worker) finishDDLJob(t *meta.Meta, job *model.Job) (err error) { if err != nil { return errors.Trace(err) } - if w.concurrentDDL { - err = w.deleteDDLJob(job) - } else { - _, err = t.DeQueueDDLJob() - } + err = w.deleteDDLJob(job) if err != nil { return errors.Trace(err) } @@ -638,7 +584,7 @@ func (w *worker) finishDDLJob(t *meta.Meta, job *model.Job) (err error) { } w.writeDDLSeqNum(job) w.removeJobCtx(job) - err = AddHistoryDDLJob(w.sess, t, job, updateRawArgs, w.concurrentDDL) + err = AddHistoryDDLJob(w.sess, t, job, updateRawArgs) return errors.Trace(err) } @@ -702,21 +648,14 @@ func isDependencyJobDone(t *meta.Meta, job *model.Job) (bool, error) { return true, nil } -func newMetaWithQueueTp(txn kv.Transaction, tp workerType) *meta.Meta { - if tp == addIdxWorker { - return meta.NewMeta(txn, meta.AddIndexJobListKey) - } - return meta.NewMeta(txn) -} - -func (w *JobContext) setDDLLabelForTopSQL(job *model.Job) { - if !topsqlstate.TopSQLEnabled() || job == nil { +func (w *JobContext) setDDLLabelForTopSQL(jobQuery string) { + if !topsqlstate.TopSQLEnabled() || jobQuery == "" { return } - if job.Query != w.cacheSQL || w.cacheDigest == nil { - w.cacheNormalizedSQL, w.cacheDigest = parser.NormalizeDigest(job.Query) - w.cacheSQL = job.Query + if jobQuery != w.cacheSQL || w.cacheDigest == nil { + w.cacheNormalizedSQL, w.cacheDigest = parser.NormalizeDigest(jobQuery) + w.cacheSQL = jobQuery w.ddlJobCtx = topsql.AttachAndRegisterSQLInfo(context.Background(), w.cacheNormalizedSQL, w.cacheDigest, false) } else { topsql.AttachAndRegisterSQLInfo(w.ddlJobCtx, w.cacheNormalizedSQL, w.cacheDigest, false) @@ -736,20 +675,24 @@ func (w *worker) unlockSeqNum(err error) { // DDLBackfillers contains the DDL need backfill step. var DDLBackfillers = map[model.ActionType]string{ - model.ActionAddIndex: "add_index", - model.ActionModifyColumn: "modify_column", - model.ActionDropIndex: "drop_index", + model.ActionAddIndex: "add_index", + model.ActionModifyColumn: "modify_column", + model.ActionDropIndex: "drop_index", + model.ActionReorganizePartition: "reorganize_partition", } -func getDDLRequestSource(job *model.Job) string { - if tp, ok := DDLBackfillers[job.Type]; ok { +func getDDLRequestSource(jobType model.ActionType) string { + if tp, ok := DDLBackfillers[jobType]; ok { return kv.InternalTxnBackfillDDLPrefix + tp } return kv.InternalTxnDDL } -func (w *JobContext) setDDLLabelForDiagnosis(job *model.Job) { - w.tp = getDDLRequestSource(job) +func (w *JobContext) setDDLLabelForDiagnosis(jobType model.ActionType) { + if w.tp != "" { + return + } + w.tp = getDDLRequestSource(jobType) w.ddlJobCtx = kv.WithInternalSourceType(w.ddlJobCtx, w.ddlJobSourceType()) } @@ -764,6 +707,7 @@ func (w *worker) HandleJobDone(d *ddlCtx, job *model.Job, t *meta.Meta) error { if err != nil { return err } + CleanupDDLReorgHandles(job, w.sess) asyncNotify(d.ddlJobDoneCh) return nil } @@ -782,7 +726,7 @@ func (w *worker) HandleDDLJobTable(d *ddlCtx, job *model.Job) (int64, error) { if err != nil { return 0, err } - if !variable.EnableConcurrentDDL.Load() || d.waiting.Load() { + if d.waiting.Load() { w.sess.rollback() return 0, nil } @@ -800,10 +744,10 @@ func (w *worker) HandleDDLJobTable(d *ddlCtx, job *model.Job) (int64, error) { if w.tp == addIdxWorker && job.IsRunning() { txn.SetDiskFullOpt(kvrpcpb.DiskFullOpt_NotAllowedOnFull) } - w.setDDLLabelForTopSQL(job) - w.setDDLSourceForDiagnosis(job) - jobContext := w.jobContext(job) - if tagger := w.getResourceGroupTaggerForTopSQL(job); tagger != nil { + w.setDDLLabelForTopSQL(job.ID, job.Query) + w.setDDLSourceForDiagnosis(job.ID, job.Type) + jobContext := w.jobContext(job.ID) + if tagger := w.getResourceGroupTaggerForTopSQL(job.ID); tagger != nil { txn.SetOption(kv.ResourceGroupTagger, tagger) } t := meta.NewMeta(txn) @@ -852,7 +796,7 @@ func (w *worker) HandleDDLJobTable(d *ddlCtx, job *model.Job) (int64, error) { d.unlockSchemaVersion(job.ID) return 0, err } - err = w.updateDDLJob(t, job, runJobErr != nil) + err = w.updateDDLJob(job, runJobErr != nil) if err = w.handleUpdateJobError(t, job, err); err != nil { w.sess.rollback() d.unlockSchemaVersion(job.ID) @@ -896,152 +840,6 @@ func (w *JobContext) ddlJobSourceType() string { return w.tp } -// handleDDLJobQueue handles DDL jobs in DDL Job queue. -func (w *worker) handleDDLJobQueue(d *ddlCtx) error { - once := true - waitDependencyJobCnt := 0 - for { - if isChanClosed(w.ctx.Done()) { - return nil - } - - var ( - job *model.Job - schemaVer int64 - runJobErr error - ) - waitTime := 2 * d.lease - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL) - err := kv.RunInNewTxn(ctx, d.store, false, func(ctx context.Context, txn kv.Transaction) error { - d.runningJobs.Lock() - // We are not owner, return and retry checking later. - if !d.isOwner() || variable.EnableConcurrentDDL.Load() || d.waiting.Load() { - d.runningJobs.Unlock() - return nil - } - - var err error - t := newMetaWithQueueTp(txn, w.tp) - - // We become the owner. Get the first job and run it. - job, err = w.getFirstDDLJob(t) - if job == nil || err != nil { - d.runningJobs.Unlock() - return errors.Trace(err) - } - d.runningJobs.ids[job.ID] = struct{}{} - d.runningJobs.Unlock() - - defer d.deleteRunningDDLJobMap(job.ID) - - // only general ddls allowed to be executed when TiKV is disk full. - if w.tp == addIdxWorker && job.IsRunning() { - txn.SetDiskFullOpt(kvrpcpb.DiskFullOpt_NotAllowedOnFull) - } - - w.setDDLLabelForTopSQL(job) - w.setDDLSourceForDiagnosis(job) - jobContext := w.jobContext(job) - if tagger := w.getResourceGroupTaggerForTopSQL(job); tagger != nil { - txn.SetOption(kv.ResourceGroupTagger, tagger) - } - if isDone, err1 := isDependencyJobDone(t, job); err1 != nil || !isDone { - return errors.Trace(err1) - } - - if once { - err = waitSchemaSynced(d, job, waitTime) - if err == nil { - once = false - } - return err - } - - if job.IsDone() || job.IsRollbackDone() { - if !job.IsRollbackDone() { - job.State = model.JobStateSynced - } - err = w.finishDDLJob(t, job) - return errors.Trace(err) - } - - d.mu.RLock() - d.mu.hook.OnJobRunBefore(job) - d.mu.RUnlock() - - // set request source type to DDL type - txn.SetOption(kv.RequestSourceType, jobContext.ddlJobSourceType()) - // If running job meets error, we will save this error in job Error - // and retry later if the job is not cancelled. - schemaVer, runJobErr = w.runDDLJob(d, t, job) - if job.IsCancelled() { - txn.Reset() - err = w.finishDDLJob(t, job) - return errors.Trace(err) - } - if runJobErr != nil && !job.IsRollingback() && !job.IsRollbackDone() { - // If the running job meets an error - // and the job state is rolling back, it means that we have already handled this error. - // Some DDL jobs (such as adding indexes) may need to update the table info and the schema version, - // then shouldn't discard the KV modification. - // And the job state is rollback done, it means the job was already finished, also shouldn't discard too. - // Otherwise, we should discard the KV modification when running job. - txn.Reset() - // If error happens after updateSchemaVersion(), then the schemaVer is updated. - // Result in the retry duration is up to 2 * lease. - schemaVer = 0 - } - err = w.updateDDLJob(t, job, runJobErr != nil) - if err = w.handleUpdateJobError(t, job, err); err != nil { - return errors.Trace(err) - } - writeBinlog(d.binlogCli, txn, job) - return nil - }) - - if runJobErr != nil { - // wait a while to retry again. If we don't wait here, DDL will retry this job immediately, - // which may act like a deadlock. - logutil.Logger(w.logCtx).Info("[ddl] run DDL job failed, sleeps a while then retries it.", - zap.Duration("waitTime", GetWaitTimeWhenErrorOccurred()), zap.Error(runJobErr)) - time.Sleep(GetWaitTimeWhenErrorOccurred()) - } - if job != nil { - d.unlockSchemaVersion(job.ID) - } - - if err != nil { - w.unlockSeqNum(err) - return errors.Trace(err) - } else if job == nil { - // No job now, return and retry getting later. - return nil - } - w.unlockSeqNum(err) - w.waitDependencyJobFinished(job, &waitDependencyJobCnt) - - // Here means the job enters another state (delete only, write only, public, etc...) or is cancelled. - // If the job is done or still running or rolling back, we will wait 2 * lease time to guarantee other servers to update - // the newest schema. - waitSchemaChanged(context.Background(), d, waitTime, schemaVer, job) - - if RunInGoTest { - // d.mu.hook is initialed from domain / test callback, which will force the owner host update schema diff synchronously. - d.mu.RLock() - d.mu.hook.OnSchemaStateChanged(schemaVer) - d.mu.RUnlock() - } - - d.mu.RLock() - d.mu.hook.OnJobUpdated(job) - d.mu.RUnlock() - - if job.IsSynced() || job.IsCancelled() || job.IsRollbackDone() { - asyncNotify(d.ddlJobDoneCh) - } - } -} - func skipWriteBinlog(job *model.Job) bool { switch job.Type { // ActionUpdateTiFlashReplicaStatus is a TiDB internal DDL, @@ -1232,7 +1030,7 @@ func (w *worker) runDDLJob(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, case model.ActionTruncateTable: ver, err = onTruncateTable(d, t, job) case model.ActionRebaseAutoID: - ver, err = onRebaseRowIDType(d, t, job) + ver, err = onRebaseAutoIncrementIDType(d, t, job) case model.ActionRebaseAutoRandomBase: ver, err = onRebaseAutoRandomType(d, t, job) case model.ActionRenameTable: @@ -1279,6 +1077,12 @@ func (w *worker) runDDLJob(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, ver, err = onAlterTablePartitionPlacement(d, t, job) case model.ActionAlterTablePlacement: ver, err = onAlterTablePlacement(d, t, job) + case model.ActionCreateResourceGroup: + ver, err = onCreateResourceGroup(d, t, job) + case model.ActionAlterResourceGroup: + ver, err = onAlterResourceGroup(d, t, job) + case model.ActionDropResourceGroup: + ver, err = onDropResourceGroup(d, t, job) case model.ActionAlterCacheTable: ver, err = onAlterCacheTable(d, t, job) case model.ActionAlterNoCacheTable: @@ -1287,6 +1091,12 @@ func (w *worker) runDDLJob(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, ver, err = w.onFlashbackCluster(d, t, job) case model.ActionMultiSchemaChange: ver, err = onMultiSchemaChange(w, d, t, job) + case model.ActionReorganizePartition: + ver, err = w.onReorganizePartition(d, t, job) + case model.ActionAlterTTLInfo: + ver, err = onTTLInfoChange(d, t, job) + case model.ActionAlterTTLRemove: + ver, err = onTTLInfoRemove(d, t, job) default: // Invalid job, cancel it. job.State = model.JobStateCancelled @@ -1365,6 +1175,32 @@ func waitSchemaChanged(ctx context.Context, d *ddlCtx, waitTime time.Duration, l zap.String("job", job.String())) } +// waitSchemaSyncedForMDL likes waitSchemaSynced, but it waits for getting the metadata lock of the latest version of this DDL. +func waitSchemaSyncedForMDL(d *ddlCtx, job *model.Job, latestSchemaVersion int64) error { + failpoint.Inject("checkDownBeforeUpdateGlobalVersion", func(val failpoint.Value) { + if val.(bool) { + if mockDDLErrOnce > 0 && mockDDLErrOnce != latestSchemaVersion { + panic("check down before update global version failed") + } else { + mockDDLErrOnce = -1 + } + } + }) + + timeStart := time.Now() + // OwnerCheckAllVersions returns only when all TiDB schemas are synced(exclude the isolated TiDB). + err := d.schemaSyncer.OwnerCheckAllVersions(context.Background(), job.ID, latestSchemaVersion) + if err != nil { + logutil.Logger(d.ctx).Info("[ddl] wait latest schema version encounter error", zap.Int64("ver", latestSchemaVersion), zap.Error(err)) + return err + } + logutil.Logger(d.ctx).Info("[ddl] wait latest schema version changed(get the metadata lock if tidb_enable_metadata_lock is true)", + zap.Int64("ver", latestSchemaVersion), + zap.Duration("take time", time.Since(timeStart)), + zap.String("job", job.String())) + return nil +} + // waitSchemaSynced handles the following situation: // If the job enters a new state, and the worker crashs when it's in the process of waiting for 2 * lease time, // Then the worker restarts quickly, we may run the job immediately again, @@ -1530,6 +1366,22 @@ func updateSchemaVersion(d *ddlCtx, t *meta.Meta, job *model.Job, multiInfos ... diff.AffectedOpts = buildPlacementAffects(oldIDs, oldIDs) } } + case model.ActionReorganizePartition: + diff.TableID = job.TableID + if len(job.CtxVars) > 0 { + if droppedIDs, ok := job.CtxVars[0].([]int64); ok { + if addedIDs, ok := job.CtxVars[1].([]int64); ok { + // to use AffectedOpts we need both new and old to have the same length + maxParts := mathutil.Max[int](len(droppedIDs), len(addedIDs)) + // Also initialize them to 0! + oldIDs := make([]int64, maxParts) + copy(oldIDs, droppedIDs) + newIDs := make([]int64, maxParts) + copy(newIDs, addedIDs) + diff.AffectedOpts = buildPlacementAffects(oldIDs, newIDs) + } + } + } case model.ActionCreateTable: diff.TableID = job.TableID if len(job.Args) > 0 { @@ -1564,6 +1416,11 @@ func updateSchemaVersion(d *ddlCtx, t *meta.Meta, job *model.Job, multiInfos ... OldTableID: recoverTabsInfo[i].TableInfo.ID, } } + case model.ActionFlashbackCluster: + diff.TableID = -1 + if job.SchemaState == model.StatePublic { + diff.RegenerateSchemaMap = true + } default: diff.TableID = job.TableID } diff --git a/ddl/ddl_worker_test.go b/ddl/ddl_worker_test.go index e07d1661f7d99..b946490e18e25 100644 --- a/ddl/ddl_worker_test.go +++ b/ddl/ddl_worker_test.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx" @@ -97,7 +98,7 @@ func TestParallelDDL(t *testing.T) { // set hook to execute jobs after all jobs are in queue. jobCnt := 11 - tc := &ddl.TestDDLCallback{Do: dom} + tc := &callback.TestDDLCallback{Do: dom} once := sync.Once{} var checkErr error tc.OnJobRunBeforeExported = func(job *model.Job) { @@ -308,3 +309,31 @@ func TestJobNeedGC(t *testing.T) { }}} require.True(t, ddl.JobNeedGCForTest(job)) } + +func TestUsingReorgCtx(t *testing.T) { + _, domain := testkit.CreateMockStoreAndDomainWithSchemaLease(t, testLease) + d := domain.DDL() + + wg := util.WaitGroupWrapper{} + wg.Run(func() { + jobID := int64(1) + m := &model.BackfillMeta{StartKey: []byte("skey"), RowCount: 1} + bfJob := &ddl.BackfillJob{JobID: jobID, EleID: 1, EleKey: nil, Meta: m} + for i := 0; i < 100; i++ { + d.(ddl.DDLForTest).SetReorgCtxForBackfill(bfJob) + d.(ddl.DDLForTest).GetReorgCtx(jobID).IsReorgCanceled() + d.(ddl.DDLForTest).RemoveReorgCtx(jobID) + } + }) + wg.Run(func() { + jobID := int64(1) + startKey := []byte("skey") + ele := &meta.Element{ID: 1, TypeKey: nil} + for i := 0; i < 100; i++ { + d.(ddl.DDLForTest).NewReorgCtx(jobID, startKey, ele, 0) + d.(ddl.DDLForTest).GetReorgCtx(jobID).IsReorgCanceled() + d.(ddl.DDLForTest).RemoveReorgCtx(jobID) + } + }) + wg.Wait() +} diff --git a/ddl/ddl_workerpool.go b/ddl/ddl_workerpool.go index de709b6faeb3b..3ed4d8f499fa9 100644 --- a/ddl/ddl_workerpool.go +++ b/ddl/ddl_workerpool.go @@ -88,38 +88,38 @@ func (wp *workerPool) tp() jobType { return wp.t } -// backfilWorkerPool is used to new backfill worker. -type backfilWorkerPool struct { +// backfillCtxPool is used to new backfill context. +type backfillCtxPool struct { exit atomic.Bool resPool *pools.ResourcePool } -func newBackfillWorkerPool(resPool *pools.ResourcePool) *backfilWorkerPool { - return &backfilWorkerPool{ +func newBackfillContextPool(resPool *pools.ResourcePool) *backfillCtxPool { + return &backfillCtxPool{ exit: *atomic.NewBool(false), resPool: resPool, } } // setCapacity changes the capacity of the pool. -// A setCapacity of 0 is equivalent to closing the backfilWorkerPool. -func (bwp *backfilWorkerPool) setCapacity(capacity int) error { - return bwp.resPool.SetCapacity(capacity) +// A setCapacity of 0 is equivalent to closing the backfillCtxPool. +func (bcp *backfillCtxPool) setCapacity(capacity int) error { + return bcp.resPool.SetCapacity(capacity) } -// get gets backfilWorkerPool from context resource pool. -// Please remember to call put after you finished using backfilWorkerPool. -func (bwp *backfilWorkerPool) get() (*backfillWorker, error) { - if bwp.resPool == nil { +// get gets backfillCtxPool from context resource pool. +// Please remember to call put after you finished using backfillCtxPool. +func (bcp *backfillCtxPool) get() (*backfillWorker, error) { + if bcp.resPool == nil { return nil, nil } - if bwp.exit.Load() { + if bcp.exit.Load() { return nil, errors.Errorf("backfill worker pool is closed") } - // no need to protect bwp.resPool - resource, err := bwp.resPool.TryGet() + // no need to protect bcp.resPool + resource, err := bcp.resPool.TryGet() if err != nil { return nil, errors.Trace(err) } @@ -131,24 +131,55 @@ func (bwp *backfilWorkerPool) get() (*backfillWorker, error) { return worker, nil } +// batchGet gets a batch backfillWorkers from context resource pool. +// Please remember to call batchPut after you finished using backfillWorkerPool. +func (bcp *backfillCtxPool) batchGet(cnt int) ([]*backfillWorker, error) { + if bcp.resPool == nil { + return nil, nil + } + + if bcp.exit.Load() { + return nil, errors.Errorf("backfill worker pool is closed") + } + + workers := make([]*backfillWorker, 0, cnt) + for i := 0; i < cnt; i++ { + // no need to protect bcp.resPool + res, err := bcp.resPool.TryGet() + if err != nil { + return nil, errors.Trace(err) + } + if res == nil { + if len(workers) == 0 { + return nil, nil + } + return workers, nil + } + worker := res.(*backfillWorker) + workers = append(workers, worker) + } + + return workers, nil +} + // put returns workerPool to context resource pool. -func (bwp *backfilWorkerPool) put(wk *backfillWorker) { - if bwp.resPool == nil || bwp.exit.Load() { +func (bcp *backfillCtxPool) put(wk *backfillWorker) { + if bcp.resPool == nil || bcp.exit.Load() { return } - // No need to protect bwp.resPool, even the bwp.resPool is closed, the ctx still need to + // No need to protect bcp.resPool, even the bcp.resPool is closed, the ctx still need to // put into resPool, because when resPool is closing, it will wait all the ctx returns, then resPool finish closing. - bwp.resPool.Put(wk) + bcp.resPool.Put(wk) } -// close clean up the backfilWorkerPool. -func (bwp *backfilWorkerPool) close() { +// close clean up the backfillCtxPool. +func (bcp *backfillCtxPool) close() { // Prevent closing resPool twice. - if bwp.resPool == nil || bwp.exit.Load() { + if bcp.resPool == nil || bcp.exit.Load() { return } - bwp.exit.Store(true) + bcp.exit.Store(true) logutil.BgLogger().Info("[ddl] closing workerPool") - bwp.resPool.Close() + bcp.resPool.Close() } diff --git a/ddl/ddl_workerpool_test.go b/ddl/ddl_workerpool_test.go index e9f324ce9dff8..8f86e816507d5 100644 --- a/ddl/ddl_workerpool_test.go +++ b/ddl/ddl_workerpool_test.go @@ -19,14 +19,13 @@ import ( "testing" "github.com/ngaut/pools" - "github.com/pingcap/tidb/parser/model" "github.com/stretchr/testify/require" ) func TestDDLWorkerPool(t *testing.T) { f := func() func() (pools.Resource, error) { return func() (pools.Resource, error) { - wk := newWorker(nil, addIdxWorker, nil, nil, nil, true) + wk := newWorker(nil, addIdxWorker, nil, nil, nil) return wk, nil } } @@ -36,39 +35,56 @@ func TestDDLWorkerPool(t *testing.T) { } func TestBackfillWorkerPool(t *testing.T) { - reorgInfo := &reorgInfo{Job: &model.Job{ID: 1}} f := func() func() (pools.Resource, error) { return func() (pools.Resource, error) { - wk := newBackfillWorker(context.Background(), nil, 1, nil, reorgInfo, typeAddIndexWorker) + wk := newBackfillWorker(context.Background(), nil) return wk, nil } } - pool := newBackfillWorkerPool(pools.NewResourcePool(f(), 1, 2, 0)) - bwp, err := pool.get() + pool := newBackfillContextPool(pools.NewResourcePool(f(), 3, 4, 0)) + bc, err := pool.get() require.NoError(t, err) - require.Equal(t, 1, bwp.id) + require.NotNil(t, bc) + require.Nil(t, bc.backfiller) + bcs, err := pool.batchGet(3) + require.NoError(t, err) + require.Len(t, bcs, 2) // test it to reach the capacity - bwp1, err := pool.get() + bc1, err := pool.get() + require.NoError(t, err) + require.Nil(t, bc1) + bcs1, err := pool.batchGet(1) require.NoError(t, err) - require.Nil(t, bwp1) + require.Nil(t, bcs1) // test setCapacity - err = pool.setCapacity(2) + err = pool.setCapacity(5) + require.Equal(t, "capacity 5 is out of range", err.Error()) + err = pool.setCapacity(4) require.NoError(t, err) - bwp1, err = pool.get() + bc1, err = pool.get() require.NoError(t, err) - require.Equal(t, 1, bwp1.id) - pool.put(bwp) - pool.put(bwp1) + require.NotNil(t, bc) + require.Nil(t, bc.backfiller) + pool.put(bc) + pool.put(bc1) + for _, bc := range bcs { + pool.put(bc) + } // test close pool.close() pool.close() require.Equal(t, true, pool.exit.Load()) - pool.put(bwp1) + pool.put(bc1) + + bc, err = pool.get() + require.Error(t, err) + require.Equal(t, "backfill worker pool is closed", err.Error()) + require.Nil(t, bc) - bwp, err = pool.get() + bcs, err = pool.batchGet(1) require.Error(t, err) require.Equal(t, "backfill worker pool is closed", err.Error()) - require.Nil(t, bwp) + require.Nil(t, bcs) } diff --git a/ddl/delete_range.go b/ddl/delete_range.go index 669ff286ea9dd..8734d2c482968 100644 --- a/ddl/delete_range.go +++ b/ddl/delete_range.go @@ -266,7 +266,7 @@ func insertJobIntoDeleteRangeTable(ctx context.Context, sctx sessionctx.Context, return errors.Trace(err) } - ctx = kv.WithInternalSourceType(ctx, getDDLRequestSource(job)) + ctx = kv.WithInternalSourceType(ctx, getDDLRequestSource(job.Type)) s := sctx.(sqlexec.SQLExecutor) switch job.Type { case model.ActionDropSchema: @@ -307,9 +307,13 @@ func insertJobIntoDeleteRangeTable(ctx context.Context, sctx sessionctx.Context, endKey := tablecodec.EncodeTablePrefix(tableID + 1) elemID := ea.allocForPhysicalID(tableID) return doInsert(ctx, s, job.ID, elemID, startKey, endKey, now, fmt.Sprintf("table ID is %d", tableID)) - case model.ActionDropTablePartition, model.ActionTruncateTablePartition: + case model.ActionDropTablePartition, model.ActionTruncateTablePartition, model.ActionReorganizePartition: var physicalTableIDs []int64 - if err := job.DecodeArgs(&physicalTableIDs); err != nil { + // partInfo is not used, but is set in ReorgPartition. + // Better to have an additional argument in job.DecodeArgs since it is ignored, + // instead of having one to few, which will remove the data from the job arguments... + var partInfo model.PartitionInfo + if err := job.DecodeArgs(&physicalTableIDs, &partInfo); err != nil { return errors.Trace(err) } for _, physicalTableID := range physicalTableIDs { diff --git a/ddl/dist_backfilling.go b/ddl/dist_backfilling.go new file mode 100644 index 0000000000000..9b2524beb86c5 --- /dev/null +++ b/ddl/dist_backfilling.go @@ -0,0 +1,272 @@ +// Copyright 2023 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 ddl + +import ( + "sync" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/ddl/ingest" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/resourcemanager/pooltask" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/dbterror" + "github.com/pingcap/tidb/util/gpool" + "github.com/pingcap/tidb/util/gpool/spmc" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" +) + +const getJobWithoutPartition = -1 + +type backfillWorkerContext struct { + currID int + mu sync.Mutex + sessCtxs []sessionctx.Context + backfillWorkers []*backfillWorker +} + +type newBackfillerFunc func(bfCtx *backfillCtx) (bf backfiller, err error) + +func newBackfillWorkerContext(d *ddl, schemaName string, tbl table.Table, workerCnt int, jobID int64, bfMeta *model.BackfillMeta, + bfFunc newBackfillerFunc) (*backfillWorkerContext, error) { + if workerCnt <= 0 { + return nil, nil + } + + bwCtx := &backfillWorkerContext{backfillWorkers: make([]*backfillWorker, 0, workerCnt), sessCtxs: make([]sessionctx.Context, 0, workerCnt)} + var err error + defer func() { + if err != nil { + bwCtx.close(d) + } + }() + + for i := 0; i < workerCnt; i++ { + var se sessionctx.Context + se, err = d.sessPool.get() + if err != nil { + logutil.BgLogger().Error("[ddl] new backfill worker context, get a session failed", zap.Int64("jobID", jobID), zap.Error(err)) + return nil, errors.Trace(err) + } + bwCtx.sessCtxs = append(bwCtx.sessCtxs, se) + err = initSessCtx(se, bfMeta.SQLMode, bfMeta.Location) + if err != nil { + logutil.BgLogger().Error("[ddl] new backfill worker context, init the session ctx failed", zap.Int64("jobID", jobID), zap.Error(err)) + return nil, errors.Trace(err) + } + + var bf backfiller + bf, err = bfFunc(newBackfillCtx(d.ddlCtx, 0, se, bfMeta.ReorgTp, schemaName, tbl)) + if err != nil { + if canSkipError(jobID, len(bwCtx.backfillWorkers), err) { + err = nil + continue + } + logutil.BgLogger().Error("[ddl] new backfill worker context, do bfFunc failed", zap.Int64("jobID", jobID), zap.Error(err)) + return nil, errors.Trace(err) + } + var bCtx *backfillWorker + bCtx, err = d.backfillCtxPool.get() + if err != nil || bCtx == nil { + logutil.BgLogger().Info("[ddl] new backfill worker context, get backfill context failed", zap.Int64("jobID", jobID), zap.Error(err)) + err = nil + break + } + bCtx.backfiller = bf + bwCtx.backfillWorkers = append(bwCtx.backfillWorkers, bCtx) + } + return bwCtx, nil +} + +func (bwCtx *backfillWorkerContext) GetContext() *backfillWorker { + bwCtx.mu.Lock() + // TODO: Special considerations are required if the number of consumers we get from the backfillWorkerPool is increased. + offset := bwCtx.currID % len(bwCtx.backfillWorkers) + // To prevent different workers from using the same session. + bw := bwCtx.backfillWorkers[offset] + logutil.BgLogger().Info("[ddl] backfill worker get context", zap.Int("workerCount", len(bwCtx.backfillWorkers)), + zap.Int("currID", bwCtx.currID), zap.Int("offset", offset), zap.Stringer("backfill worker", bw)) + bwCtx.currID++ + bwCtx.mu.Unlock() + return bw +} + +func runBackfillJobs(d *ddl, sess *session, ingestBackendCtx *ingest.BackendContext, bJob *BackfillJob, jobCtx *JobContext) (table.Table, error) { + dbInfo, tbl, err := d.getTableByTxn(d.store, bJob.Meta.SchemaID, bJob.Meta.TableID) + if err != nil { + logutil.BgLogger().Warn("[ddl] runBackfillJobs gets table failed", zap.String("bfJob", bJob.AbbrStr()), zap.Error(err)) + return nil, err + } + + workerCnt := int(variable.GetDDLReorgWorkerCounter()) + // TODO: Different worker using different newBackfillerFunc. + workerCtx, err := newAddIndexWorkerContext(d, dbInfo.Name, tbl, workerCnt, bJob, jobCtx) + if err != nil || workerCtx == nil { + logutil.BgLogger().Info("[ddl] new adding index worker context failed", zap.Reflect("workerCtx", workerCtx), zap.Error(err)) + return nil, errors.Trace(err) + } + workerCnt = len(workerCtx.backfillWorkers) + bwMgr := newBackfilWorkerManager(workerCtx) + d.backfillWorkerPool.SetConsumerFunc(func(task *reorgBackfillTask, _ int, bfWorker *backfillWorker) *backfillResult { + return bfWorker.runTask(task) + }) + + runningPID := int64(0) + // If txn-merge we needn't to claim the backfill job through the partition table + if ingestBackendCtx == nil { + runningPID = getJobWithoutPartition + } + proFunc := func() ([]*reorgBackfillTask, error) { + // TODO: After BackfillJob replaces reorgBackfillTask, use backfiller's GetTasks instead of it. + return GetTasks(d.ddlCtx, sess, tbl, bJob.JobID, &runningPID, workerCnt+5) + } + // add new task + resultCh, control := d.backfillWorkerPool.AddProduceBySlice(proFunc, 0, workerCtx, spmc.WithConcurrency(workerCnt)) + bwMgr.waitFinalResult(resultCh, ingestBackendCtx, bJob.EleID, control) + + // waiting task finishing + control.Wait() + err = bwMgr.close(d) + + return tbl, err +} + +func (bwCtx *backfillWorkerContext) close(d *ddl) { + for _, s := range bwCtx.sessCtxs { + d.sessPool.put(s) + } + for _, w := range bwCtx.backfillWorkers { + d.backfillCtxPool.put(w) + } +} + +type backfilWorkerManager struct { + bwCtx *backfillWorkerContext + wg util.WaitGroupWrapper + unsyncErr error + exitCh chan struct{} +} + +func newBackfilWorkerManager(bwCtx *backfillWorkerContext) *backfilWorkerManager { + return &backfilWorkerManager{ + bwCtx: bwCtx, + exitCh: make(chan struct{}), + } +} + +func (bwm *backfilWorkerManager) waitFinalResult(resultCh <-chan *backfillResult, ingestBackendCtx *ingest.BackendContext, eleID int64, + tControl pooltask.TaskController[*reorgBackfillTask, *backfillResult, int, *backfillWorker, *backfillWorkerContext]) { + bwm.wg.Run(func() { + i := 0 + workerCnt := len(bwm.bwCtx.backfillWorkers) + + for { + select { + case result, ok := <-resultCh: + if !ok { + return + } + if result.err != nil { + logutil.BgLogger().Warn("handle backfill task failed", zap.Error(result.err)) + bwm.unsyncErr = result.err + tControl.Stop() + return + } + + if ingestBackendCtx != nil && i%workerCnt == 0 { + err := ingestBackendCtx.Flush(eleID) + if err != nil { + bwm.unsyncErr = err + return + } + } + i++ + case <-bwm.exitCh: + return + } + } + }) +} + +func (bwm *backfilWorkerManager) close(d *ddl) error { + close(bwm.exitCh) + bwm.wg.Wait() + + bwm.bwCtx.close(d) + + return bwm.unsyncErr +} + +// backfillJob2Task builds reorg task. +func (dc *ddlCtx) backfillJob2Task(t table.Table, bfJob *BackfillJob) (*reorgBackfillTask, error) { + pt := t.(table.PhysicalTable) + if tbl, ok := t.(table.PartitionedTable); ok { + pt = tbl.GetPartition(bfJob.PhysicalTableID) + if pt == nil { + return nil, dbterror.ErrCancelledDDLJob.GenWithStack("Can not find partition id %d for table %d", bfJob.PhysicalTableID, t.Meta().ID) + } + } + return &reorgBackfillTask{ + bfJob: bfJob, + physicalTable: pt, + // TODO: Remove these fields after remove the old logic. + sqlQuery: bfJob.Meta.Query, + startKey: bfJob.Meta.StartKey, + endKey: bfJob.Meta.EndKey, + endInclude: bfJob.Meta.EndInclude, + priority: bfJob.Meta.Priority}, nil +} + +// GetTasks gets the backfill tasks associated with the non-runningJobID. +func GetTasks(d *ddlCtx, sess *session, tbl table.Table, runningJobID int64, runningPID *int64, concurrency int) ([]*reorgBackfillTask, error) { + // TODO: At present, only add index is processed. In the future, different elements need to be distinguished. + var err error + for i := 0; i < retrySQLTimes; i++ { + bJobs, err := GetAndMarkBackfillJobsForOneEle(sess, concurrency, runningJobID, d.uuid, *runningPID, InstanceLease) + if err != nil { + // TODO: add test: if all tidbs can't get the unmark backfill job(a tidb mark a backfill job, other tidbs returned, then the tidb can't handle this job.) + if dbterror.ErrDDLJobNotFound.Equal(err) { + logutil.BgLogger().Info("no backfill job, handle backfill task finished") + return nil, gpool.ErrProducerClosed + } + if kv.ErrWriteConflict.Equal(err) { + logutil.BgLogger().Info("GetAndMarkBackfillJobsForOneEle failed", zap.Error(err)) + time.Sleep(RetrySQLInterval) + continue + } + } + + if *runningPID != getJobWithoutPartition { + *runningPID = bJobs[0].PhysicalTableID + } + tasks := make([]*reorgBackfillTask, 0, len(bJobs)) + for _, bJ := range bJobs { + task, err := d.backfillJob2Task(tbl, bJ) + if err != nil { + return nil, err + } + tasks = append(tasks, task) + } + return tasks, nil + } + + return nil, err +} diff --git a/ddl/dist_owner.go b/ddl/dist_owner.go new file mode 100644 index 0000000000000..43a6dff87bc97 --- /dev/null +++ b/ddl/dist_owner.go @@ -0,0 +1,532 @@ +// Copyright 2023 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 ddl + +import ( + "context" + "encoding/hex" + "fmt" + "strconv" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/meta" + "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/table" + tidbutil "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/dbterror" + "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/mathutil" + atomicutil "go.uber.org/atomic" + "go.uber.org/zap" +) + +// CheckBackfillJobFinishInterval is export for test. +var ( + CheckBackfillJobFinishInterval = 300 * time.Millisecond + telemetryDistReorgUsage = metrics.TelemetryDistReorgCnt +) + +const ( + distPhysicalTableConcurrency = 16 +) + +func initDistReorg(reorgMeta *model.DDLReorgMeta) { + isDistReorg := variable.DDLEnableDistributeReorg.Load() + reorgMeta.IsDistReorg = isDistReorg + if isDistReorg { + metrics.TelemetryDistReorgCnt.Inc() + } +} + +// BackfillJobRangeMeta is export for test. +type BackfillJobRangeMeta struct { + ID int64 + PhyTblID int64 + PhyTbl table.PhysicalTable + StartKey []byte + EndKey []byte +} + +func (m *BackfillJobRangeMeta) String() string { + physicalID := strconv.FormatInt(m.PhyTblID, 10) + startKey := hex.EncodeToString(m.StartKey) + endKey := hex.EncodeToString(m.EndKey) + rangeStr := "taskID_" + strconv.Itoa(int(m.ID)) + "_physicalTableID_" + physicalID + "_" + "[" + startKey + "," + endKey + ")" + return rangeStr +} + +type splitJobContext struct { + ctx context.Context + cancel context.CancelFunc + isMultiPhyTbl bool + bfWorkerType backfillerType + isUnique bool + batchSize int + minBatchSize int + currBackfillJobID *atomicutil.Int64 + currPhysicalID int64 + phyTblMetaCh chan *BackfillJobRangeMeta + resultCh chan error +} + +func getRunningPhysicalTableMetas(sess *session, sJobCtx *splitJobContext, reorgInfo *reorgInfo) ([]*BackfillJobRangeMeta, error) { + ddlJobID, eleID, eleKey, currPID := reorgInfo.Job.ID, reorgInfo.currElement.ID, reorgInfo.currElement.TypeKey, reorgInfo.PhysicalTableID + pTblMetas, err := GetPhysicalTableMetas(sess, ddlJobID, eleID, eleKey) + if err != nil { + return nil, errors.Trace(err) + } + + currBfJobID := int64(1) + physicalTIDs := make([]int64, 0, len(pTblMetas)) + phyTblMetas := make([]*BackfillJobRangeMeta, 0, len(pTblMetas)) + if len(pTblMetas) == 0 { + bfJM := &BackfillJobRangeMeta{PhyTblID: currPID, StartKey: reorgInfo.StartKey, EndKey: reorgInfo.EndKey} + phyTblMetas = append(phyTblMetas, bfJM) + physicalTIDs = append(physicalTIDs, bfJM.PhyTblID) + } else { + for _, pMeta := range pTblMetas { + phyTblMetas = append(phyTblMetas, pMeta) + currPID = mathutil.Max(pMeta.PhyTblID, currPID) + currBfJobID = mathutil.Max(pMeta.ID, currBfJobID) + physicalTIDs = append(physicalTIDs, pMeta.PhyTblID) + } + } + sJobCtx.currPhysicalID = currPID + sJobCtx.currBackfillJobID = atomicutil.NewInt64(currBfJobID) + logutil.BgLogger().Info("[ddl] unprocessed physical table ranges get from table", zap.Int64("jobID", ddlJobID), + zap.Int64("eleID", eleID), zap.ByteString("eleKey", eleKey), + zap.Int64("currPID", sJobCtx.currPhysicalID), zap.Int64s("phyTblIDs", physicalTIDs)) + return phyTblMetas, nil +} + +func (dc *ddlCtx) sendPhysicalTableMetas(reorgInfo *reorgInfo, t table.Table, sJobCtx *splitJobContext, runningPTblMetas []*BackfillJobRangeMeta) { + var err error + physicalTIDs := make([]int64, 0, distPhysicalTableConcurrency) + defer func() { + logutil.BgLogger().Info("[ddl] send physical table ranges to split finished", zap.Int64("jobID", reorgInfo.Job.ID), + zap.Stringer("ele", reorgInfo.currElement), zap.Int64s("phyTblIDs", physicalTIDs), zap.Error(err)) + if err != nil { + sJobCtx.cancel() + } else { + close(sJobCtx.phyTblMetaCh) + } + }() + + for _, pTblM := range runningPTblMetas { + err = dc.isReorgRunnable(reorgInfo.Job.ID, false) + if err != nil { + return + } + + if tbl, ok := t.(table.PartitionedTable); ok { + pTblM.PhyTbl = tbl.GetPartition(pTblM.PhyTblID) + sJobCtx.phyTblMetaCh <- pTblM + } else { + //nolint:forcetypeassert + phyTbl := t.(table.PhysicalTable) + pTblM.PhyTbl = phyTbl + sJobCtx.phyTblMetaCh <- pTblM + } + physicalTIDs = append(physicalTIDs, pTblM.PhyTblID) + } + + if tbl, ok := t.(table.PartitionedTable); ok { + currPhysicalID := sJobCtx.currPhysicalID + for { + err = dc.isReorgRunnable(reorgInfo.Job.ID, false) + if err != nil { + return + } + select { + case <-sJobCtx.ctx.Done(): + err = sJobCtx.ctx.Err() + return + default: + } + + pID, startKey, endKey, err1 := getNextPartitionInfo(reorgInfo, tbl, currPhysicalID) + if err1 != nil { + err = err1 + return + } + if pID == 0 { + // Next partition does not exist, all the job done. + return + } + pTbl := tbl.GetPartition(pID) + if pTbl == nil { + err = dbterror.ErrCancelledDDLJob.GenWithStack("Can not find partition id %d for table %d", pID, t.Meta().ID) + return + } + bfJM := &BackfillJobRangeMeta{PhyTblID: pID, PhyTbl: pTbl, StartKey: startKey, EndKey: endKey} + sJobCtx.phyTblMetaCh <- bfJM + currPhysicalID = pID + + physicalTIDs = append(physicalTIDs, pID) + } + } +} + +func (dc *ddlCtx) controlWriteTableRecord(sessPool *sessionPool, t table.Table, bfWorkerType backfillerType, reorgInfo *reorgInfo) error { + startKey, endKey := reorgInfo.StartKey, reorgInfo.EndKey + if startKey == nil && endKey == nil { + return nil + } + + ddlJobID := reorgInfo.Job.ID + currEle := reorgInfo.currElement + logutil.BgLogger().Info("[ddl] control write table record start", + zap.Int64("jobID", ddlJobID), zap.Stringer("ele", currEle), + zap.Int64("tblID", t.Meta().ID), zap.Int64("currPID", reorgInfo.PhysicalTableID)) + sCtx, err := sessPool.get() + if err != nil { + return errors.Trace(err) + } + defer sessPool.put(sCtx) + sess := newSession(sCtx) + + if err := dc.isReorgRunnable(ddlJobID, true); err != nil { + return errors.Trace(err) + } + var isUnique bool + if bfWorkerType == typeAddIndexWorker { + idxInfo := model.FindIndexInfoByID(t.Meta().Indices, currEle.ID) + isUnique = idxInfo.Unique + } + + wg := tidbutil.WaitGroupWrapper{} + sJobCtx := &splitJobContext{ + bfWorkerType: bfWorkerType, + isUnique: isUnique, + batchSize: genTaskBatch, + minBatchSize: minGenTaskBatch, + phyTblMetaCh: make(chan *BackfillJobRangeMeta, 1), + resultCh: make(chan error, distPhysicalTableConcurrency), + } + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL) + sJobCtx.ctx, sJobCtx.cancel = context.WithCancel(ctx) + concurrency := 1 + if tbl, ok := t.(table.PartitionedTable); ok { + ids := len(tbl.GetAllPartitionIDs()) + if ids > 1 { + sJobCtx.isMultiPhyTbl = true + concurrency = ids + } + if ids > distPhysicalTableConcurrency { + concurrency = distPhysicalTableConcurrency + } + sJobCtx.batchSize = genPhysicalTableTaskBatch + sJobCtx.minBatchSize = minGenPhysicalTableTaskBatch + } + + err = checkAndHandleInterruptedBackfillJobs(sess, ddlJobID, currEle.ID, currEle.TypeKey) + if err != nil { + return errors.Trace(err) + } + phyTblMetas, err := getRunningPhysicalTableMetas(sess, sJobCtx, reorgInfo) + if err != nil { + return err + } + + sCtxs := make([]sessionctx.Context, 0, concurrency) + for i := 0; i < concurrency; i++ { + sCtx, err := sessPool.get() + if err != nil { + return err + } + sCtxs = append(sCtxs, sCtx) + } + + wg.Run(func() { + defer tidbutil.Recover(metrics.LabelDistReorg, "sendPhysicalTableMeta", nil, false) + dc.sendPhysicalTableMetas(reorgInfo, t, sJobCtx, phyTblMetas) + }) + for _, sCtx := range sCtxs { + func(ctx sessionctx.Context) { + wg.Run(func() { + defer func() { + tidbutil.Recover(metrics.LabelDistReorg, "splitTableToBackfillJobs", nil, false) + }() + se := newSession(ctx) + dc.splitPhysicalTableToBackfillJobs(se, reorgInfo, sJobCtx) + }) + }(sCtx) + } + wg.Wait() + for _, sCtx := range sCtxs { + sessPool.put(sCtx) + } + return checkReorgJobFinished(dc.ctx, sess, &dc.reorgCtx, ddlJobID, currEle) +} + +func (dc *ddlCtx) splitPhysicalTableToBackfillJobs(sess *session, reorgInfo *reorgInfo, sJobCtx *splitJobContext) { + defaultSQLMode := sess.GetSessionVars().SQLMode + defer func() { sess.GetSessionVars().SQLMode = defaultSQLMode }() + // Make timestamp type can be inserted ZeroTimestamp. + sess.GetSessionVars().SQLMode = mysql.ModeNone + + var err error + var pTblMetaCnt int + var pTblMeta *BackfillJobRangeMeta + defer func() { + if err != nil { + sJobCtx.cancel() + } + logutil.BgLogger().Info("[ddl] split backfill jobs to table finish", zap.Int64("jobID", reorgInfo.Job.ID), + zap.Stringer("ele", reorgInfo.currElement), zap.Int("donePTbls", pTblMetaCnt), zap.Stringer("physical_tbl", pTblMeta), zap.Error(err)) + }() + + var ok bool + for { + select { + case <-sJobCtx.ctx.Done(): + err = sJobCtx.ctx.Err() + case pTblMeta, ok = <-sJobCtx.phyTblMetaCh: + if !ok { + return + } + if err = dc.isReorgRunnable(reorgInfo.Job.ID, false); err != nil { + return + } + + err = dc.splitTableToBackfillJobs(sess, reorgInfo, sJobCtx, pTblMeta) + if err != nil { + return + } + pTblMetaCnt++ + } + } +} + +func checkReorgJobFinished(ctx context.Context, sess *session, reorgCtxs *reorgContexts, ddlJobID int64, currEle *meta.Element) error { + var times int64 + var bfJob *BackfillJob + var backfillJobFinished bool + ticker := time.NewTicker(CheckBackfillJobFinishInterval) + defer ticker.Stop() + for { + if getReorgCtx(reorgCtxs, ddlJobID).isReorgCanceled() { + // Job is cancelled. So it can't be done. + return dbterror.ErrCancelledDDLJob + } + + select { + case <-ticker.C: + times++ + // Print this log every 5 min. + if times%1000 == 0 { + logutil.BgLogger().Info("[ddl] check all backfill jobs is finished", + zap.Int64("job ID", ddlJobID), zap.Bool("isFinished", backfillJobFinished), zap.Reflect("bfJob", bfJob)) + } + if !backfillJobFinished { + err := checkAndHandleInterruptedBackfillJobs(sess, ddlJobID, currEle.ID, currEle.TypeKey) + if err != nil { + logutil.BgLogger().Warn("[ddl] finish interrupted backfill jobs", zap.Int64("job ID", ddlJobID), zap.Stringer("ele", currEle), zap.Error(err)) + return errors.Trace(err) + } + + bfJobs, err := getBackfillJobWithRetry(sess, BackgroundSubtaskTable, ddlJobID, currEle.ID, currEle.TypeKey) + if err != nil { + logutil.BgLogger().Info("[ddl] getBackfillJobWithRetry failed", zap.Int64("job ID", ddlJobID), zap.Stringer("ele", currEle), zap.Error(err)) + return errors.Trace(err) + } + if len(bfJobs) == 0 { + backfillJobFinished = true + logutil.BgLogger().Info("[ddl] finish all backfill jobs", zap.Int64("job ID", ddlJobID), zap.Stringer("ele", currEle)) + } + } + if backfillJobFinished { + // TODO: Consider whether these backfill jobs are always out of sync. + isSynced, err := checkJobIsFinished(sess, ddlJobID) + if err != nil { + logutil.BgLogger().Warn("[ddl] checkJobIsFinished failed", zap.Int64("job ID", ddlJobID), zap.Stringer("ele", currEle), zap.Error(err)) + return errors.Trace(err) + } + if isSynced { + logutil.BgLogger().Info("[ddl] finish all backfill jobs and put them to history", zap.Int64("job ID", ddlJobID), zap.Stringer("ele", currEle)) + return GetBackfillErr(sess, ddlJobID, currEle.ID, currEle.TypeKey) + } + } + case <-ctx.Done(): + return ctx.Err() + } + } +} + +func checkJobIsFinished(sess *session, ddlJobID int64) (bool, error) { + var err error + var unsyncedInstanceIDs []string + for i := 0; i < retrySQLTimes; i++ { + unsyncedInstanceIDs, err = getUnsyncedInstanceIDs(sess, ddlJobID, "check_backfill_history_job_sync") + if err == nil && len(unsyncedInstanceIDs) == 0 { + return true, nil + } + + time.Sleep(RetrySQLInterval) + } + logutil.BgLogger().Info("[ddl] checkJobIsSynced failed", + zap.Strings("unsyncedInstanceIDs", unsyncedInstanceIDs), zap.Int("tryTimes", retrySQLTimes), zap.Error(err)) + + return false, errors.Trace(err) +} + +// GetBackfillErr gets the error in backfill job. +func GetBackfillErr(sess *session, ddlJobID, currEleID int64, currEleKey []byte) error { + var err error + var metas []*model.BackfillMeta + for i := 0; i < retrySQLTimes; i++ { + metas, err = GetBackfillMetas(sess, BackgroundSubtaskHistoryTable, fmt.Sprintf("task_key like \"%d_%s_%d_%%\"", + ddlJobID, hex.EncodeToString(currEleKey), currEleID), "get_backfill_job_metas") + if err == nil { + for _, m := range metas { + if m.Error != nil { + return m.Error + } + } + return nil + } + + logutil.BgLogger().Info("[ddl] GetBackfillMetas failed in checkJobIsSynced", zap.Int("tryTimes", i), zap.Error(err)) + time.Sleep(RetrySQLInterval) + } + + return errors.Trace(err) +} + +func checkAndHandleInterruptedBackfillJobs(sess *session, ddlJobID, currEleID int64, currEleKey []byte) (err error) { + var bJobs []*BackfillJob + for i := 0; i < retrySQLTimes; i++ { + bJobs, err = GetInterruptedBackfillJobForOneEle(sess, ddlJobID, currEleID, currEleKey) + if err == nil { + break + } + logutil.BgLogger().Info("[ddl] getInterruptedBackfillJobsForOneEle failed", zap.Error(err)) + time.Sleep(RetrySQLInterval) + } + if err != nil { + return errors.Trace(err) + } + if len(bJobs) == 0 { + return nil + } + + for i := 0; i < retrySQLTimes; i++ { + err = MoveBackfillJobsToHistoryTable(sess, bJobs[0]) + if err == nil { + return bJobs[0].Meta.Error + } + logutil.BgLogger().Info("[ddl] MoveBackfillJobsToHistoryTable failed", zap.Error(err)) + time.Sleep(RetrySQLInterval) + } + return errors.Trace(err) +} + +func checkBackfillJobCount(sess *session, ddlJobID, currEleID int64, currEleKey []byte, pTblID int64) (backfillJobCnt int, err error) { + err = checkAndHandleInterruptedBackfillJobs(sess, ddlJobID, currEleID, currEleKey) + if err != nil { + return 0, errors.Trace(err) + } + + backfillJobCnt, err = GetBackfillJobCount(sess, BackgroundSubtaskTable, + fmt.Sprintf("task_key like \"%d_%s_%d_%%\"", + ddlJobID, hex.EncodeToString(currEleKey), currEleID), "check_backfill_job_count") + if err != nil { + return 0, errors.Trace(err) + } + + return backfillJobCnt, nil +} + +func getBackfillJobWithRetry(sess *session, tableName string, ddlJobID, currEleID int64, currEleKey []byte) ([]*BackfillJob, error) { + var err error + var bJobs []*BackfillJob + for i := 0; i < retrySQLTimes; i++ { + bJobs, err = GetBackfillJobs(sess, tableName, fmt.Sprintf("task_key like \"%d_%s_%d_%%\" limit 1", + ddlJobID, hex.EncodeToString(currEleKey), currEleID), "check_backfill_job_state") + if err != nil { + logutil.BgLogger().Warn("[ddl] GetBackfillJobs failed", zap.Error(err)) + time.Sleep(RetrySQLInterval) + continue + } + return bJobs, nil + } + return nil, errors.Trace(err) +} + +// GetPhysicalTableMetas gets the max backfill metas per physical table in BackgroundSubtaskTable and BackgroundSubtaskHistoryTable. +func GetPhysicalTableMetas(sess *session, ddlJobID, currEleID int64, currEleKey []byte) (map[int64]*BackfillJobRangeMeta, error) { + condition := fmt.Sprintf("task_key like \"%d_%s_%d_%%\"", ddlJobID, hex.EncodeToString(currEleKey), currEleID) + pTblMs, err := GetBackfillIDAndMetas(sess, BackgroundSubtaskTable, condition, "get_ptbl_metas") + if err != nil { + return nil, errors.Trace(err) + } + hPTblMs, err := GetBackfillIDAndMetas(sess, BackgroundSubtaskHistoryTable, condition, "get_ptbl_metas") + if err != nil { + return nil, errors.Trace(err) + } + metaMap := make(map[int64]*BackfillJobRangeMeta, len(pTblMs)+len(hPTblMs)) + for _, m := range pTblMs { + metaMap[m.PhyTblID] = m + } + for _, m := range hPTblMs { + val, ok := metaMap[m.PhyTblID] + if !ok || (ok && m.ID > val.ID) { + metaMap[m.PhyTblID] = m + } + } + return metaMap, nil +} + +// MoveBackfillJobsToHistoryTable moves backfill table jobs to the backfill history table. +func MoveBackfillJobsToHistoryTable(sctx sessionctx.Context, bfJob *BackfillJob) error { + s, ok := sctx.(*session) + if !ok { + return errors.Errorf("sess ctx:%#v convert session failed", sctx) + } + + return s.runInTxn(func(se *session) error { + // TODO: Consider batch by batch update backfill jobs and insert backfill history jobs. + bJobs, err := GetBackfillJobs(se, BackgroundSubtaskTable, fmt.Sprintf("task_key like \"%d_%s_%d_%%\"", + bfJob.JobID, hex.EncodeToString(bfJob.EleKey), bfJob.EleID), "update_backfill_job") + if err != nil { + return errors.Trace(err) + } + if len(bJobs) == 0 { + return nil + } + + txn, err := se.txn() + if err != nil { + return errors.Trace(err) + } + startTS := txn.StartTS() + err = RemoveBackfillJob(se, true, bJobs[0]) + if err == nil { + for _, bj := range bJobs { + bj.State = model.JobStateCancelled + bj.StateUpdateTS = startTS + } + err = AddBackfillHistoryJob(se, bJobs) + } + logutil.BgLogger().Info("[ddl] move backfill jobs to history table", zap.Int("job count", len(bJobs))) + return errors.Trace(err) + }) +} diff --git a/ddl/export_test.go b/ddl/export_test.go index 708b3474515c5..d83549609c890 100644 --- a/ddl/export_test.go +++ b/ddl/export_test.go @@ -14,6 +14,44 @@ package ddl +import ( + "context" + + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/types" +) + func SetBatchInsertDeleteRangeSize(i int) { batchInsertDeleteRangeSize = i } + +var NewCopContext4Test = newCopContext + +func FetchRowsFromCop4Test(copCtx *copContext, tbl table.PhysicalTable, startKey, endKey kv.Key, store kv.Storage, + batchSize int) ([]*indexRecord, bool, error) { + variable.SetDDLReorgBatchSize(int32(batchSize)) + task := &reorgBackfillTask{ + id: 1, + startKey: startKey, + endKey: endKey, + physicalTable: tbl, + } + pool := newCopReqSenderPool(context.Background(), copCtx, store) + pool.adjustSize(1) + pool.tasksCh <- task + idxRec, _, _, done, err := pool.fetchRowColValsFromCop(*task) + pool.close() + return idxRec, done, err +} + +type IndexRecord4Test = *indexRecord + +func (i IndexRecord4Test) GetHandle() kv.Handle { + return i.handle +} + +func (i IndexRecord4Test) GetIndexValues() []types.Datum { + return i.vals +} diff --git a/ddl/fail_test.go b/ddl/fail_test.go index 39437b43a2b73..3c4ca0769bc1e 100644 --- a/ddl/fail_test.go +++ b/ddl/fail_test.go @@ -18,7 +18,7 @@ import ( "testing" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/testkit" "github.com/stretchr/testify/require" @@ -38,7 +38,7 @@ func TestFailBeforeDecodeArgs(t *testing.T) { tableID = int64(tableIDi) d := dom.DDL() - tc := &ddl.TestDDLCallback{Do: dom} + tc := &callback.TestDDLCallback{Do: dom} first := true stateCnt := 0 diff --git a/ddl/failtest/BUILD.bazel b/ddl/failtest/BUILD.bazel index 025f6097ae8be..4b7980412adc0 100644 --- a/ddl/failtest/BUILD.bazel +++ b/ddl/failtest/BUILD.bazel @@ -2,7 +2,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_test") go_test( name = "failtest_test", - timeout = "short", + timeout = "moderate", srcs = [ "fail_db_test.go", "main_test.go", diff --git a/ddl/failtest/fail_db_test.go b/ddl/failtest/fail_db_test.go index bde5e9b1b9569..6f33f6b2107dd 100644 --- a/ddl/failtest/fail_db_test.go +++ b/ddl/failtest/fail_db_test.go @@ -18,6 +18,7 @@ import ( "context" "fmt" "math/rand" + "strings" "sync/atomic" "testing" "time" @@ -332,6 +333,10 @@ func TestRunDDLJobPanicDisableClusteredIndex(t *testing.T) { } func testAddIndexWorkerNum(t *testing.T, s *failedSuite, test func(*testkit.TestKit)) { + if variable.DDLEnableDistributeReorg.Load() { + t.Skip("dist reorg didn't support checkBackfillWorkerNum, skip this test") + } + tk := testkit.NewTestKit(t, s.store) tk.MustExec("create database if not exists test_db") tk.MustExec("use test_db") @@ -493,6 +498,8 @@ func TestModifyColumn(t *testing.T) { tk.MustExec("admin check table t") // Test unsupported statements. + tk.MustExec("create table t1(a int) partition by hash (a) partitions 2") + tk.MustGetErrMsg("alter table t1 modify column a mediumint", "[ddl:8200]Unsupported modify column: table is partition table") tk.MustExec("create table t2(id int, a int, b int generated always as (abs(a)) virtual, c int generated always as (a+1) stored)") tk.MustGetErrMsg("alter table t2 modify column b mediumint", "[ddl:8200]Unsupported modify column: newCol IsGenerated false, oldCol IsGenerated true") tk.MustGetErrMsg("alter table t2 modify column c mediumint", "[ddl:8200]Unsupported modify column: newCol IsGenerated false, oldCol IsGenerated true") @@ -529,7 +536,35 @@ func TestModifyColumn(t *testing.T) { tk.MustExec("insert into t5 values (1,1),(2,2),(3,3),(4,4),(5,5);") tk.MustExec("alter table t5 modify a int not null;") - tk.MustExec("drop table t, t2, t3, t4, t5") + tk.MustExec("drop table t, t1, t2, t3, t4, t5") +} + +func TestIssue38699(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + //Test multi records + tk.MustExec("USE test") + tk.MustExec("set sql_mode=''") + tk.MustExec("DROP TABLE IF EXISTS t;") + tk.MustExec("CREATE TABLE t (a int)") + tk.MustExec("insert into t values (1000000000), (2000000)") + tk.MustExec("alter table t modify a tinyint") + result := tk.MustQuery("show warnings") + require.Len(t, result.Rows(), 1) + result.CheckWithFunc(testkit.Rows("Warning 1690 2 warnings with this error code"), func(actual []string, expected []interface{}) bool { + //Check if it starts with x warning(s) + return strings.EqualFold(actual[0], expected[0].(string)) && strings.EqualFold(actual[1], expected[1].(string)) && strings.HasPrefix(actual[2], expected[2].(string)) + }) + + //Test single record + tk.MustExec("DROP TABLE IF EXISTS t;") + tk.MustExec("CREATE TABLE t (a int)") + tk.MustExec("insert into t values (1000000000)") + tk.MustExec("alter table t modify a tinyint") + result = tk.MustQuery("show warnings") + require.Len(t, result.Rows(), 1) + result.Check(testkit.Rows("Warning 1690 constant 1000000000 overflows tinyint")) } func TestPartitionAddPanic(t *testing.T) { diff --git a/ddl/fktest/BUILD.bazel b/ddl/fktest/BUILD.bazel new file mode 100644 index 0000000000000..9e2c14fe0718a --- /dev/null +++ b/ddl/fktest/BUILD.bazel @@ -0,0 +1,30 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_test") + +go_test( + name = "fktest_test", + timeout = "short", + srcs = [ + "foreign_key_test.go", + "main_test.go", + ], + flaky = True, + shard_count = 4, + deps = [ + "//config", + "//ddl", + "//domain", + "//infoschema", + "//meta", + "//meta/autoid", + "//parser/auth", + "//parser/model", + "//planner/core", + "//sessiontxn", + "//testkit", + "//testkit/testsetup", + "//util/dbterror", + "@com_github_stretchr_testify//require", + "@com_github_tikv_client_go_v2//tikv", + "@org_uber_go_goleak//:goleak", + ], +) diff --git a/ddl/fktest/foreign_key_test.go b/ddl/fktest/foreign_key_test.go new file mode 100644 index 0000000000000..489e125dc8a3c --- /dev/null +++ b/ddl/fktest/foreign_key_test.go @@ -0,0 +1,1837 @@ +// 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, +// 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 ddl_test + +import ( + "bytes" + "context" + "fmt" + "sync" + "testing" + "time" + + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/meta" + "github.com/pingcap/tidb/parser/auth" + "github.com/pingcap/tidb/parser/model" + plannercore "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/sessiontxn" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/util/dbterror" + "github.com/stretchr/testify/require" +) + +func TestCreateTableWithForeignKeyMetaInfo(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("use test") + tk.MustExec("create table t1 (id int key, a int,b int as (a) virtual);") + tk.MustExec("create database test2") + tk.MustExec("use test2") + tk.MustExec("create table t2 (id int key, b int, foreign key fk_b(b) references test.t1(id) ON UPDATE RESTRICT ON DELETE CASCADE)") + tb1Info := getTableInfo(t, dom, "test", "t1") + tb2Info := getTableInfo(t, dom, "test2", "t2") + require.Equal(t, 1, len(dom.InfoSchema().GetTableReferredForeignKeys("test", "t1"))) + require.Equal(t, 0, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t2"))) + require.Equal(t, 0, len(tb1Info.ForeignKeys)) + tb1ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t1") + require.Equal(t, 1, len(tb1ReferredFKs)) + require.Equal(t, model.ReferredFKInfo{ + Cols: []model.CIStr{model.NewCIStr("id")}, + ChildSchema: model.NewCIStr("test2"), + ChildTable: model.NewCIStr("t2"), + ChildFKName: model.NewCIStr("fk_b"), + }, *tb1ReferredFKs[0]) + tb2ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test2", "t2") + require.Equal(t, 0, len(tb2ReferredFKs)) + require.Equal(t, 1, len(tb2Info.ForeignKeys)) + require.Equal(t, model.FKInfo{ + ID: 1, + Name: model.NewCIStr("fk_b"), + RefSchema: model.NewCIStr("test"), + RefTable: model.NewCIStr("t1"), + RefCols: []model.CIStr{model.NewCIStr("id")}, + Cols: []model.CIStr{model.NewCIStr("b")}, + OnDelete: 2, + OnUpdate: 1, + State: model.StatePublic, + Version: 1, + }, *tb2Info.ForeignKeys[0]) + // Auto create index for foreign key usage. + require.Equal(t, 1, len(tb2Info.Indices)) + require.Equal(t, "fk_b", tb2Info.Indices[0].Name.L) + require.Equal(t, "`test2`.`t2`, CONSTRAINT `fk_b` FOREIGN KEY (`b`) REFERENCES `test`.`t1` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT", tb2Info.ForeignKeys[0].String("test2", "t2")) + + tk.MustExec("create table t3 (id int, b int, index idx_b(b), foreign key fk_b(b) references t2(id) ON UPDATE SET NULL ON DELETE NO ACTION)") + tb2Info = getTableInfo(t, dom, "test2", "t2") + tb3Info := getTableInfo(t, dom, "test2", "t3") + require.Equal(t, 1, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t2"))) + require.Equal(t, 0, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t3"))) + require.Equal(t, 1, len(tb2Info.ForeignKeys)) + tb2ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test2", "t2") + require.Equal(t, 1, len(tb2ReferredFKs)) + require.Equal(t, model.ReferredFKInfo{ + Cols: []model.CIStr{model.NewCIStr("id")}, + ChildSchema: model.NewCIStr("test2"), + ChildTable: model.NewCIStr("t3"), + ChildFKName: model.NewCIStr("fk_b"), + }, *tb2ReferredFKs[0]) + tb3ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test2", "t3") + require.Equal(t, 0, len(tb3ReferredFKs)) + require.Equal(t, 1, len(tb3Info.ForeignKeys)) + require.Equal(t, model.FKInfo{ + ID: 1, + Name: model.NewCIStr("fk_b"), + RefSchema: model.NewCIStr("test2"), + RefTable: model.NewCIStr("t2"), + RefCols: []model.CIStr{model.NewCIStr("id")}, + Cols: []model.CIStr{model.NewCIStr("b")}, + OnDelete: 4, + OnUpdate: 3, + State: model.StatePublic, + Version: 1, + }, *tb3Info.ForeignKeys[0]) + require.Equal(t, 1, len(tb3Info.Indices)) + require.Equal(t, "idx_b", tb3Info.Indices[0].Name.L) + require.Equal(t, "`test2`.`t3`, CONSTRAINT `fk_b` FOREIGN KEY (`b`) REFERENCES `t2` (`id`) ON DELETE NO ACTION ON UPDATE SET NULL", tb3Info.ForeignKeys[0].String("test2", "t3")) + + tk.MustExec("create table t5 (id int key, a int, b int, foreign key (a) references t5(id));") + tb5Info := getTableInfo(t, dom, "test2", "t5") + require.Equal(t, 1, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t5"))) + require.Equal(t, 1, len(tb5Info.ForeignKeys)) + tb5ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test2", "t5") + require.Equal(t, 1, len(tb5ReferredFKs)) + require.Equal(t, model.ReferredFKInfo{ + Cols: []model.CIStr{model.NewCIStr("id")}, + ChildSchema: model.NewCIStr("test2"), + ChildTable: model.NewCIStr("t5"), + ChildFKName: model.NewCIStr("fk_1"), + }, *tb5ReferredFKs[0]) + require.Equal(t, model.FKInfo{ + ID: 1, + Name: model.NewCIStr("fk_1"), + RefSchema: model.NewCIStr("test2"), + RefTable: model.NewCIStr("t5"), + RefCols: []model.CIStr{model.NewCIStr("id")}, + Cols: []model.CIStr{model.NewCIStr("a")}, + State: model.StatePublic, + Version: 1, + }, *tb5Info.ForeignKeys[0]) + require.Equal(t, 1, len(tb5Info.Indices)) + require.Equal(t, "fk_1", tb5Info.Indices[0].Name.L) + require.Equal(t, 1, len(dom.InfoSchema().GetTableReferredForeignKeys("test", "t1"))) + require.Equal(t, 1, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t2"))) + require.Equal(t, 0, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t3"))) + require.Equal(t, 1, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t5"))) + + tk.MustExec("set @@global.tidb_enable_foreign_key=0") + tk.MustExec("drop database test2") + require.Equal(t, 0, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t2"))) + require.Equal(t, 0, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t3"))) + require.Equal(t, 0, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t5"))) +} + +func TestCreateTableWithForeignKeyMetaInfo2(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("create database test2") + tk.MustExec("set @@foreign_key_checks=0") + tk.MustExec("use test2") + tk.MustExec("create table t2 (id int key, b int, foreign key fk_b(b) references test.t1(id) ON UPDATE RESTRICT ON DELETE CASCADE)") + tk.MustExec("use test") + tk.MustExec("create table t1 (id int key, a int, b int as (a) virtual);") + tb1Info := getTableInfo(t, dom, "test", "t1") + tb2Info := getTableInfo(t, dom, "test2", "t2") + require.Equal(t, 0, len(tb1Info.ForeignKeys)) + tb1ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t1") + require.Equal(t, 1, len(tb1ReferredFKs)) + require.Equal(t, model.ReferredFKInfo{ + Cols: []model.CIStr{model.NewCIStr("id")}, + ChildSchema: model.NewCIStr("test2"), + ChildTable: model.NewCIStr("t2"), + ChildFKName: model.NewCIStr("fk_b"), + }, *tb1ReferredFKs[0]) + tb2ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test2", "t2") + require.Equal(t, 0, len(tb2ReferredFKs)) + require.Equal(t, 1, len(tb2Info.ForeignKeys)) + require.Equal(t, model.FKInfo{ + ID: 1, + Name: model.NewCIStr("fk_b"), + RefSchema: model.NewCIStr("test"), + RefTable: model.NewCIStr("t1"), + RefCols: []model.CIStr{model.NewCIStr("id")}, + Cols: []model.CIStr{model.NewCIStr("b")}, + OnDelete: 2, + OnUpdate: 1, + State: model.StatePublic, + Version: 1, + }, *tb2Info.ForeignKeys[0]) + // Auto create index for foreign key usage. + require.Equal(t, 1, len(tb2Info.Indices)) + require.Equal(t, "fk_b", tb2Info.Indices[0].Name.L) + require.Equal(t, "`test2`.`t2`, CONSTRAINT `fk_b` FOREIGN KEY (`b`) REFERENCES `test`.`t1` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT", tb2Info.ForeignKeys[0].String("test2", "t2")) + + tk.MustExec("create table t3 (id int key, a int, foreign key fk_a(a) references test.t1(id) ON DELETE CASCADE ON UPDATE RESTRICT, foreign key fk_a2(a) references test2.t2(id))") + tb1Info = getTableInfo(t, dom, "test", "t1") + tb3Info := getTableInfo(t, dom, "test", "t3") + require.Equal(t, 0, len(tb1Info.ForeignKeys)) + tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") + require.Equal(t, 2, len(tb1ReferredFKs)) + require.Equal(t, model.ReferredFKInfo{ + Cols: []model.CIStr{model.NewCIStr("id")}, + ChildSchema: model.NewCIStr("test"), + ChildTable: model.NewCIStr("t3"), + ChildFKName: model.NewCIStr("fk_a"), + }, *tb1ReferredFKs[0]) + require.Equal(t, model.ReferredFKInfo{ + Cols: []model.CIStr{model.NewCIStr("id")}, + ChildSchema: model.NewCIStr("test2"), + ChildTable: model.NewCIStr("t2"), + ChildFKName: model.NewCIStr("fk_b"), + }, *tb1ReferredFKs[1]) + tb3ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t3") + require.Equal(t, 0, len(tb3ReferredFKs)) + require.Equal(t, 2, len(tb3Info.ForeignKeys)) + require.Equal(t, model.FKInfo{ + ID: 1, + Name: model.NewCIStr("fk_a"), + RefSchema: model.NewCIStr("test"), + RefTable: model.NewCIStr("t1"), + RefCols: []model.CIStr{model.NewCIStr("id")}, + Cols: []model.CIStr{model.NewCIStr("a")}, + OnDelete: 2, + OnUpdate: 1, + State: model.StatePublic, + Version: 1, + }, *tb3Info.ForeignKeys[0]) + require.Equal(t, model.FKInfo{ + ID: 2, + Name: model.NewCIStr("fk_a2"), + RefSchema: model.NewCIStr("test2"), + RefTable: model.NewCIStr("t2"), + RefCols: []model.CIStr{model.NewCIStr("id")}, + Cols: []model.CIStr{model.NewCIStr("a")}, + State: model.StatePublic, + Version: 1, + }, *tb3Info.ForeignKeys[1]) + // Auto create index for foreign key usage. + require.Equal(t, 1, len(tb3Info.Indices)) + require.Equal(t, "fk_a", tb3Info.Indices[0].Name.L) + require.Equal(t, "`test`.`t3`, CONSTRAINT `fk_a` FOREIGN KEY (`a`) REFERENCES `t1` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT", tb3Info.ForeignKeys[0].String("test", "t3")) + require.Equal(t, "`test`.`t3`, CONSTRAINT `fk_a2` FOREIGN KEY (`a`) REFERENCES `test2`.`t2` (`id`)", tb3Info.ForeignKeys[1].String("test", "t3")) + + tk.MustExec("set @@foreign_key_checks=0") + tk.MustExec("drop table test2.t2") + tb1Info = getTableInfo(t, dom, "test", "t1") + tb3Info = getTableInfo(t, dom, "test", "t3") + require.Equal(t, 0, len(tb1Info.ForeignKeys)) + tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") + require.Equal(t, 1, len(tb1ReferredFKs)) + require.Equal(t, model.ReferredFKInfo{ + Cols: []model.CIStr{model.NewCIStr("id")}, + ChildSchema: model.NewCIStr("test"), + ChildTable: model.NewCIStr("t3"), + ChildFKName: model.NewCIStr("fk_a"), + }, *tb1ReferredFKs[0]) + tb3ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t3") + require.Equal(t, 0, len(tb3ReferredFKs)) + require.Equal(t, 2, len(tb3Info.ForeignKeys)) + require.Equal(t, model.FKInfo{ + ID: 1, + Name: model.NewCIStr("fk_a"), + RefSchema: model.NewCIStr("test"), + RefTable: model.NewCIStr("t1"), + RefCols: []model.CIStr{model.NewCIStr("id")}, + Cols: []model.CIStr{model.NewCIStr("a")}, + OnDelete: 2, + OnUpdate: 1, + State: model.StatePublic, + Version: 1, + }, *tb3Info.ForeignKeys[0]) + require.Equal(t, model.FKInfo{ + ID: 2, + Name: model.NewCIStr("fk_a2"), + RefSchema: model.NewCIStr("test2"), + RefTable: model.NewCIStr("t2"), + RefCols: []model.CIStr{model.NewCIStr("id")}, + Cols: []model.CIStr{model.NewCIStr("a")}, + State: model.StatePublic, + Version: 1, + }, *tb3Info.ForeignKeys[1]) +} + +func TestCreateTableWithForeignKeyMetaInfo3(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("set @@foreign_key_checks=1") + tk.MustExec("use test") + tk.MustExec("create table t1 (id int key, a int, b int as (a) virtual);") + tk.MustExec("create table t2 (id int key, b int, foreign key fk_b(b) references test.t1(id))") + tk.MustExec("create table t3 (id int key, b int, foreign key fk_b(b) references test.t1(id))") + tk.MustExec("create table t4 (id int key, b int, foreign key fk_b(b) references test.t1(id))") + tb1ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t1") + tk.MustExec("drop table t3") + tk.MustExec("create table t5 (id int key, b int, foreign key fk_b(b) references test.t1(id))") + require.Equal(t, 3, len(tb1ReferredFKs)) + require.Equal(t, "t2", tb1ReferredFKs[0].ChildTable.L) + require.Equal(t, "t3", tb1ReferredFKs[1].ChildTable.L) + require.Equal(t, "t4", tb1ReferredFKs[2].ChildTable.L) +} + +func TestCreateTableWithForeignKeyPrivilegeCheck(t *testing.T) { + store, _ := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustExec("create user 'u1'@'%' identified by '';") + tk.MustExec("grant create on *.* to 'u1'@'%';") + tk.MustExec("create table t1 (id int key);") + + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + tk2.Session().Auth(&auth.UserIdentity{Username: "u1", Hostname: "localhost", CurrentUser: true, AuthUsername: "u1", AuthHostname: "%"}, nil, []byte("012345678901234567890")) + err := tk2.ExecToErr("create table t2 (a int, foreign key fk(a) references t1(id));") + require.Error(t, err) + require.Equal(t, "[planner:1142]REFERENCES command denied to user 'u1'@'%' for table 't1'", err.Error()) + + tk.MustExec("grant references on test.t1 to 'u1'@'%';") + tk2.MustExec("create table t2 (a int, foreign key fk(a) references t1(id));") + tk2.MustExec("create table t3 (id int key)") + err = tk2.ExecToErr("create table t4 (a int, foreign key fk(a) references t1(id), foreign key (a) references t3(id));") + require.Error(t, err) + require.Equal(t, "[planner:1142]REFERENCES command denied to user 'u1'@'%' for table 't3'", err.Error()) + + tk.MustExec("grant references on test.t3 to 'u1'@'%';") + tk2.MustExec("create table t4 (a int, foreign key fk(a) references t1(id), foreign key (a) references t3(id));") +} + +func TestAlterTableWithForeignKeyPrivilegeCheck(t *testing.T) { + store, _ := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create user 'u1'@'%' identified by '';") + tk.MustExec("grant create,alter on *.* to 'u1'@'%';") + tk.MustExec("create table t1 (id int key);") + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + tk2.Session().Auth(&auth.UserIdentity{Username: "u1", Hostname: "localhost", CurrentUser: true, AuthUsername: "u1", AuthHostname: "%"}, nil, []byte("012345678901234567890")) + tk2.MustExec("create table t2 (a int)") + err := tk2.ExecToErr("alter table t2 add foreign key (a) references t1 (id) on update cascade") + require.Error(t, err) + require.Equal(t, "[planner:1142]REFERENCES command denied to user 'u1'@'%' for table 't1'", err.Error()) + tk.MustExec("grant references on test.t1 to 'u1'@'%';") + tk2.MustExec("alter table t2 add foreign key (a) references t1 (id) on update cascade") +} + +func TestRenameTableWithForeignKeyMetaInfo(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("create database test2") + tk.MustExec("create database test3") + tk.MustExec("use test") + tk.MustExec("create table t1 (id int key, a int, b int, foreign key fk(a) references t1(id))") + tk.MustExec("rename table test.t1 to test2.t2") + // check the schema diff + diff := getLatestSchemaDiff(t, tk) + require.Equal(t, model.ActionRenameTable, diff.Type) + require.Equal(t, 0, len(diff.AffectedOpts)) + tk.MustQuery("show create table test2.t2").Check(testkit.Rows("t2 CREATE TABLE `t2` (\n" + + " `id` int(11) NOT NULL,\n" + + " `a` int(11) DEFAULT NULL,\n" + + " `b` int(11) DEFAULT NULL,\n" + + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,\n" + + " KEY `fk` (`a`),\n" + + " CONSTRAINT `fk` FOREIGN KEY (`a`) REFERENCES `test2`.`t2` (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + tblInfo := getTableInfo(t, dom, "test2", "t2") + tbReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test2", "t2") + require.Equal(t, 1, len(tblInfo.ForeignKeys)) + require.Equal(t, 1, len(tbReferredFKs)) + require.Equal(t, model.ReferredFKInfo{ + Cols: []model.CIStr{model.NewCIStr("id")}, + ChildSchema: model.NewCIStr("test2"), + ChildTable: model.NewCIStr("t2"), + ChildFKName: model.NewCIStr("fk"), + }, *tbReferredFKs[0]) + require.Equal(t, model.FKInfo{ + ID: 1, + Name: model.NewCIStr("fk"), + RefSchema: model.NewCIStr("test2"), + RefTable: model.NewCIStr("t2"), + RefCols: []model.CIStr{model.NewCIStr("id")}, + Cols: []model.CIStr{model.NewCIStr("a")}, + State: model.StatePublic, + Version: 1, + }, *tblInfo.ForeignKeys[0]) + + tk.MustExec("drop table test2.t2") + tk.MustExec("use test") + tk.MustExec("create table t1 (id int key, a int, b int as (a) virtual);") + tk.MustExec("create table t2 (id int key, b int, foreign key fk_b(b) references test.t1(id))") + tk.MustExec("use test2") + tk.MustExec("rename table test.t2 to test2.tt2") + // check the schema diff + diff = getLatestSchemaDiff(t, tk) + require.Equal(t, model.ActionRenameTable, diff.Type) + require.Equal(t, 0, len(diff.AffectedOpts)) + tb1Info := getTableInfo(t, dom, "test", "t1") + tb2Info := getTableInfo(t, dom, "test2", "tt2") + require.Equal(t, 0, len(tb1Info.ForeignKeys)) + tb1ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t1") + require.Equal(t, 1, len(tb1ReferredFKs)) + require.Equal(t, model.ReferredFKInfo{ + Cols: []model.CIStr{model.NewCIStr("id")}, + ChildSchema: model.NewCIStr("test2"), + ChildTable: model.NewCIStr("tt2"), + ChildFKName: model.NewCIStr("fk_b"), + }, *tb1ReferredFKs[0]) + tb2ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test2", "tt2") + require.Equal(t, 0, len(tb2ReferredFKs)) + require.Equal(t, 1, len(tb2Info.ForeignKeys)) + require.Equal(t, model.FKInfo{ + ID: 1, + Name: model.NewCIStr("fk_b"), + RefSchema: model.NewCIStr("test"), + RefTable: model.NewCIStr("t1"), + RefCols: []model.CIStr{model.NewCIStr("id")}, + Cols: []model.CIStr{model.NewCIStr("b")}, + State: model.StatePublic, + Version: 1, + }, *tb2Info.ForeignKeys[0]) + // Auto create index for foreign key usage. + require.Equal(t, 1, len(tb2Info.Indices)) + require.Equal(t, "fk_b", tb2Info.Indices[0].Name.L) + require.Equal(t, "`test2`.`tt2`, CONSTRAINT `fk_b` FOREIGN KEY (`b`) REFERENCES `test`.`t1` (`id`)", tb2Info.ForeignKeys[0].String("test2", "tt2")) + + tk.MustExec("rename table test.t1 to test3.tt1") + tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test3", "tt1") + require.Equal(t, 1, len(tb1ReferredFKs)) + require.Equal(t, 1, len(tb1ReferredFKs[0].Cols)) + // check the schema diff + diff = getLatestSchemaDiff(t, tk) + require.Equal(t, model.ActionRenameTable, diff.Type) + require.Equal(t, 1, len(diff.AffectedOpts)) + require.Equal(t, model.ReferredFKInfo{ + Cols: []model.CIStr{model.NewCIStr("id")}, + ChildSchema: model.NewCIStr("test2"), + ChildTable: model.NewCIStr("tt2"), + ChildFKName: model.NewCIStr("fk_b"), + }, *tb1ReferredFKs[0]) + tbl2Info := getTableInfo(t, dom, "test2", "tt2") + tb2ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test2", "tt2") + require.Equal(t, 0, len(tb2ReferredFKs)) + require.Equal(t, 1, len(tbl2Info.ForeignKeys)) + require.Equal(t, model.FKInfo{ + ID: 1, + Name: model.NewCIStr("fk_b"), + RefSchema: model.NewCIStr("test3"), + RefTable: model.NewCIStr("tt1"), + RefCols: []model.CIStr{model.NewCIStr("id")}, + Cols: []model.CIStr{model.NewCIStr("b")}, + State: model.StatePublic, + Version: 1, + }, *tbl2Info.ForeignKeys[0]) + tk.MustQuery("show create table test2.tt2").Check(testkit.Rows("tt2 CREATE TABLE `tt2` (\n" + + " `id` int(11) NOT NULL,\n" + + " `b` int(11) DEFAULT NULL,\n" + + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,\n" + + " KEY `fk_b` (`b`),\n" + + " CONSTRAINT `fk_b` FOREIGN KEY (`b`) REFERENCES `test3`.`tt1` (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) +} + +func TestCreateTableWithForeignKeyDML(t *testing.T) { + store, _ := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("use test") + tk.MustExec("create table t1 (id int key, a int);") + tk.MustExec("begin") + tk.MustExec("insert into t1 values (1, 1)") + tk.MustExec("update t1 set a = 2 where id = 1") + + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + tk2.MustExec("create table t2 (id int key, b int, foreign key fk_b(b) references test.t1(id))") + + tk.MustExec("commit") +} + +func TestCreateTableWithForeignKeyError(t *testing.T) { + store, _ := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("use test") + + cases := []struct { + prepare []string + refer string + create string + err string + }{ + { + refer: "create table t1 (id int, a int, b int);", + create: "create table t2 (a int, b int, foreign key fk_b(b) references T_unknown(b));", + err: "[schema:1824]Failed to open the referenced table 'T_unknown'", + }, + { + refer: "create table t1 (id int, a int, b int);", + create: "create table t2 (a int, b int, foreign key fk_b(b) references t1(c_unknown));", + err: "[schema:3734]Failed to add the foreign key constraint. Missing column 'c_unknown' for constraint 'fk_b' in the referenced table 't1'", + }, + { + refer: "create table t1 (id int key, a int, b int);", + create: "create table t2 (a int, b int, foreign key fk(c_unknown) references t1(id));", + err: "[ddl:1072]Key column 'c_unknown' doesn't exist in table", + }, + { + refer: "create table t1 (id int, a int, b int);", + create: "create table t2 (a int, b int, foreign key fk_b(b) references t1(b));", + err: "[schema:1822]Failed to add the foreign key constraint. Missing index for constraint 'fk_b' in the referenced table 't1'", + }, + { + refer: "create table t1 (id int, a int, b int not null, index(b));", + create: "create table t2 (a int, b int not null, foreign key fk_b(b) references t1(b) on update set null);", + err: "[schema:1830]Column 'b' cannot be NOT NULL: needed in a foreign key constraint 'fk_b' SET NULL", + }, + { + refer: "create table t1 (id int, a int, b int not null, index(b));", + create: "create table t2 (a int, b int not null, foreign key fk_b(b) references t1(b) on delete set null);", + err: "[schema:1830]Column 'b' cannot be NOT NULL: needed in a foreign key constraint 'fk_b' SET NULL", + }, + { + refer: "create table t1 (id int key, a int, b int as (a) virtual, index(b));", + create: "create table t2 (a int, b int, foreign key fk_b(b) references t1(b));", + err: "[schema:3733]Foreign key 'fk_b' uses virtual column 'b' which is not supported.", + }, + { + refer: "create table t1 (id int key, a int, b int, index(b));", + create: "create table t2 (a int, b int as (a) virtual, foreign key fk_b(b) references t1(b));", + err: "[schema:3733]Foreign key 'fk_b' uses virtual column 'b' which is not supported.", + }, + { + refer: "create table t1 (id int key, a int);", + create: "create table t2 (a int, b varchar(10), foreign key fk(b) references t1(id));", + err: "[ddl:3780]Referencing column 'b' and referenced column 'id' in foreign key constraint 'fk' are incompatible.", + }, + { + refer: "create table t1 (id int key, a int not null, index(a));", + create: "create table t2 (a int, b int unsigned, foreign key fk_b(b) references t1(a));", + err: "[ddl:3780]Referencing column 'b' and referenced column 'a' in foreign key constraint 'fk_b' are incompatible.", + }, + { + refer: "create table t1 (id int key, a bigint, index(a));", + create: "create table t2 (a int, b int, foreign key fk_b(b) references t1(a));", + err: "[ddl:3780]Referencing column 'b' and referenced column 'a' in foreign key constraint 'fk_b' are incompatible.", + }, + { + refer: "create table t1 (id int key, a varchar(10) charset utf8, index(a));", + create: "create table t2 (a int, b varchar(10) charset utf8mb4, foreign key fk_b(b) references t1(a));", + err: "[ddl:3780]Referencing column 'b' and referenced column 'a' in foreign key constraint 'fk_b' are incompatible.", + }, + { + refer: "create table t1 (id int key, a varchar(10) collate utf8_bin, index(a));", + create: "create table t2 (a int, b varchar(10) collate utf8mb4_bin, foreign key fk_b(b) references t1(a));", + err: "[ddl:3780]Referencing column 'b' and referenced column 'a' in foreign key constraint 'fk_b' are incompatible.", + }, + { + refer: "create table t1 (id int key, a varchar(10));", + create: "create table t2 (a int, b varchar(10), foreign key fk_b(b) references t1(a));", + err: "[schema:1822]Failed to add the foreign key constraint. Missing index for constraint 'fk_b' in the referenced table 't1'", + }, + { + refer: "create table t1 (id int key, a varchar(10), index (a(5)));", + create: "create table t2 (a int, b varchar(10), foreign key fk_b(b) references t1(a));", + err: "[schema:1822]Failed to add the foreign key constraint. Missing index for constraint 'fk_b' in the referenced table 't1'", + }, + { + refer: "create table t1 (id int key, a int, index(a));", + create: "create table t2 (a int, b int, foreign key fk_b(b) references t1(id, a));", + err: "[schema:1239]Incorrect foreign key definition for 'fk_b': Key reference and table reference don't match", + }, + { + create: "create table t2 (a int key, foreign key (a) references t2(a));", + err: "[schema:1215]Cannot add foreign key constraint", + }, + { + create: "create table t2 (a int, b int, index(a,b), index(b,a), foreign key (a,b) references t2(a,b));", + err: "[schema:1215]Cannot add foreign key constraint", + }, + { + create: "create table t2 (a int, b int, index(a,b), foreign key (a,b) references t2(b,a));", + err: "[schema:1822]Failed to add the foreign key constraint. Missing index for constraint 'fk_1' in the referenced table 't2'", + }, + { + prepare: []string{ + "set @@foreign_key_checks=0;", + "create table t2 (a int, b int, index(a), foreign key (a) references t1(id));", + }, + create: "create table t1 (id int, a int);", + err: "[schema:1822]Failed to add the foreign key constraint. Missing index for constraint 'fk_1' in the referenced table 't1'", + }, + { + prepare: []string{ + "set @@foreign_key_checks=0;", + "create table t2 (a int, b int, index(a), foreign key (a) references t1(id));", + }, + create: "create table t1 (id bigint key, a int);", + err: "[ddl:3780]Referencing column 'a' and referenced column 'id' in foreign key constraint 'fk_1' are incompatible.", + }, + { + // foreign key is not support in temporary table. + refer: "create temporary table t1 (id int key, b int, index(b))", + create: "create table t2 (a int, b int, foreign key fk(b) references t1(b))", + err: "[schema:1824]Failed to open the referenced table 't1'", + }, + { + // foreign key is not support in temporary table. + refer: "create global temporary table t1 (id int key, b int, index(b)) on commit delete rows", + create: "create table t2 (a int, b int, foreign key fk(b) references t1(b))", + err: "[schema:1215]Cannot add foreign key constraint", + }, + { + // foreign key is not support in temporary table. + refer: "create table t1 (id int key, b int, index(b))", + create: "create temporary table t2 (a int, b int, foreign key fk(b) references t1(b))", + err: "[schema:1215]Cannot add foreign key constraint", + }, + { + // foreign key is not support in temporary table. + refer: "create table t1 (id int key, b int, index(b))", + create: "create global temporary table t2 (a int, b int, foreign key fk(b) references t1(b)) on commit delete rows", + err: "[schema:1215]Cannot add foreign key constraint", + }, + { + create: "create table t1 (a int, foreign key ``(a) references t1(a));", + err: "[ddl:1280]Incorrect index name ''", + }, + { + create: "create table t1 (a int, constraint `` foreign key (a) references t1(a));", + err: "[ddl:1280]Incorrect index name ''", + }, + { + create: "create table t1 (a int, constraint `fk` foreign key (a,a) references t1(a, b));", + err: "[schema:1060]Duplicate column name 'a'", + }, + { + refer: "create table t1(a int, b int, index(a,b));", + create: "create table t2 (a int, b int, foreign key (a,b) references t1(a,a));", + err: "[schema:1822]Failed to add the foreign key constraint. Missing index for constraint 'fk_1' in the referenced table 't1'", + }, + { + refer: "create table t1 (id int key, b int, index(b))", + create: "create table t2 (a int, b int, index fk_1(a), foreign key (b) references t1(b));", + err: "[ddl:1061]duplicate key name fk_1", + }, + { + refer: "create table t1 (id int key);", + create: "create table t2 (id int key, foreign key name5678901234567890123456789012345678901234567890123456789012345(id) references t1(id));", + err: "[ddl:1059]Identifier name 'name5678901234567890123456789012345678901234567890123456789012345' is too long", + }, + { + refer: "create table t1 (id int key);", + create: "create table t2 (id int key, constraint name5678901234567890123456789012345678901234567890123456789012345 foreign key (id) references t1(id));", + err: "[ddl:1059]Identifier name 'name5678901234567890123456789012345678901234567890123456789012345' is too long", + }, + { + create: "create table t2 (id int key, constraint fk foreign key (id) references name5678901234567890123456789012345678901234567890123456789012345.t1(id));", + err: "[ddl:1059]Identifier name 'name5678901234567890123456789012345678901234567890123456789012345' is too long", + }, + { + prepare: []string{ + "set @@foreign_key_checks=0;", + }, + create: "create table t2 (id int key, constraint fk foreign key (id) references name5678901234567890123456789012345678901234567890123456789012345(id));", + err: "[ddl:1059]Identifier name 'name5678901234567890123456789012345678901234567890123456789012345' is too long", + }, + { + prepare: []string{ + "set @@foreign_key_checks=0;", + }, + create: "create table t2 (id int key, constraint fk foreign key (id) references t1(name5678901234567890123456789012345678901234567890123456789012345));", + err: "[ddl:1059]Identifier name 'name5678901234567890123456789012345678901234567890123456789012345' is too long", + }, + // Test foreign key with temporary table + { + refer: "create temporary table t1 (id int key);", + create: "create table t2 (id int key, constraint fk foreign key (id) references t1(id));", + err: "[schema:1824]Failed to open the referenced table 't1'", + }, + { + refer: "create table t1 (id int key);", + create: "create temporary table t2 (id int key, constraint fk foreign key (id) references t1(id));", + err: "[schema:1215]Cannot add foreign key constraint", + }, + // Test foreign key with partition table + { + refer: "create table t1 (id int key) partition by hash(id) partitions 3;", + create: "create table t2 (id int key, constraint fk foreign key (id) references t1(id));", + err: "[schema:1506]Foreign key clause is not yet supported in conjunction with partitioning", + }, + { + refer: "create table t1 (id int key);", + create: "create table t2 (id int key, constraint fk foreign key (id) references t1(id)) partition by hash(id) partitions 3;", + err: "[schema:1506]Foreign key clause is not yet supported in conjunction with partitioning", + }, + } + for _, ca := range cases { + tk.MustExec("drop table if exists t2") + tk.MustExec("drop table if exists t1") + tk.MustExec("set @@foreign_key_checks=1") + for _, sql := range ca.prepare { + tk.MustExec(sql) + } + if ca.refer != "" { + tk.MustExec(ca.refer) + } + err := tk.ExecToErr(ca.create) + require.Error(t, err, ca.create) + require.Equal(t, ca.err, err.Error(), ca.create) + } + + passCases := [][]string{ + { + "create table t1 (id int key, a int, b int, foreign key fk(a) references t1(id))", + }, + { + "create table t1 (id int key, b int not null, index(b))", + "create table t2 (a int, b int, foreign key fk_b(b) references t1(b));", + }, + { + "create table t1 (id int key, a varchar(10), index(a));", + "create table t2 (a int, b varchar(20), foreign key fk_b(b) references t1(a));", + }, + { + "create table t1 (id int key, a decimal(10,5), index(a));", + "create table t2 (a int, b decimal(20, 10), foreign key fk_b(b) references t1(a));", + }, + { + "create table t1 (id int key, a varchar(10), index (a(10)));", + "create table t2 (a int, b varchar(20), foreign key fk_b(b) references t1(a));", + }, + { + "set @@foreign_key_checks=0;", + "create table t2 (a int, b int, foreign key fk_b(b) references t_unknown(b));", + "set @@foreign_key_checks=1;", + }, + { + "create table t2 (a int, b int, index(a,b), index(b,a), foreign key (a,b) references t2(b,a));", + }, + { + "create table t1 (a int key, b int, index(b))", + "create table t2 (a int, b int, foreign key (a) references t1(a), foreign key (b) references t1(b));", + }, + { + "create table t1 (id int key);", + "create table t2 (id int key, foreign key name567890123456789012345678901234567890123456789012345678901234(id) references t1(id));", + }, + } + for _, ca := range passCases { + tk.MustExec("drop table if exists t2") + tk.MustExec("drop table if exists t1") + for _, sql := range ca { + tk.MustExec(sql) + } + } +} + +func TestModifyColumnWithForeignKey(t *testing.T) { + store, _ := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("set @@foreign_key_checks=1;") + tk.MustExec("use test") + + tk.MustExec("create table t1 (id int key, b varchar(10), index(b));") + tk.MustExec("create table t2 (a varchar(10), constraint fk foreign key (a) references t1(b));") + tk.MustExec("insert into t1 values (1, '123456789');") + tk.MustExec("insert into t2 values ('123456789');") + tk.MustGetErrMsg("alter table t1 modify column b varchar(5);", "[ddl:1833]Cannot change column 'b': used in a foreign key constraint 'fk' of table 'test.t2'") + tk.MustGetErrMsg("alter table t1 modify column b bigint;", "[ddl:3780]Referencing column 'a' and referenced column 'b' in foreign key constraint 'fk' are incompatible.") + tk.MustExec("alter table t1 modify column b varchar(20);") + tk.MustGetErrMsg("alter table t1 modify column b varchar(10);", "[ddl:1833]Cannot change column 'b': used in a foreign key constraint 'fk' of table 'test.t2'") + tk.MustExec("alter table t2 modify column a varchar(20);") + tk.MustExec("alter table t2 modify column a varchar(21);") + tk.MustGetErrMsg("alter table t2 modify column a varchar(5);", "[ddl:1832]Cannot change column 'a': used in a foreign key constraint 'fk'") + tk.MustGetErrMsg("alter table t2 modify column a bigint;", "[ddl:3780]Referencing column 'a' and referenced column 'b' in foreign key constraint 'fk' are incompatible.") + + tk.MustExec("drop table t2") + tk.MustExec("drop table t1") + tk.MustExec("create table t1 (id int key, b decimal(10, 5), index(b));") + tk.MustExec("create table t2 (a decimal(10, 5), constraint fk foreign key (a) references t1(b));") + tk.MustExec("insert into t1 values (1, 12345.67891);") + tk.MustExec("insert into t2 values (12345.67891);") + tk.MustGetErrMsg("alter table t1 modify column b decimal(10, 6);", "[ddl:1833]Cannot change column 'b': used in a foreign key constraint 'fk' of table 'test.t2'") + tk.MustGetErrMsg("alter table t1 modify column b decimal(10, 3);", "[ddl:1833]Cannot change column 'b': used in a foreign key constraint 'fk' of table 'test.t2'") + tk.MustGetErrMsg("alter table t1 modify column b decimal(5, 2);", "[ddl:1833]Cannot change column 'b': used in a foreign key constraint 'fk' of table 'test.t2'") + tk.MustGetErrMsg("alter table t1 modify column b decimal(20, 10);", "[ddl:1833]Cannot change column 'b': used in a foreign key constraint 'fk' of table 'test.t2'") + tk.MustGetErrMsg("alter table t2 modify column a decimal(30, 15);", "[ddl:1832]Cannot change column 'a': used in a foreign key constraint 'fk'") + tk.MustGetErrMsg("alter table t2 modify column a decimal(5, 2);", "[ddl:1832]Cannot change column 'a': used in a foreign key constraint 'fk'") +} + +func TestDropChildTableForeignKeyMetaInfo(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("use test") + tk.MustExec("create table t1 (id int key, a int, b int, CONSTRAINT fk foreign key (a) references t1(id))") + tb1ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t1") + require.Equal(t, 1, len(tb1ReferredFKs)) + tk.MustExec("drop table t1") + tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") + require.Equal(t, 0, len(tb1ReferredFKs)) + + tk.MustExec("create table t1 (id int key, b int, index(b))") + tk.MustExec("create table t2 (a int, b int, foreign key fk (a) references t1(b));") + tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") + require.Equal(t, 1, len(tb1ReferredFKs)) + tk.MustExec("drop table t2") + tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") + require.Equal(t, 0, len(tb1ReferredFKs)) +} + +func TestDropForeignKeyMetaInfo(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("use test") + tk.MustExec("create table t1 (id int key, a int, b int, CONSTRAINT fk foreign key (a) references t1(id))") + tb1ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t1") + require.Equal(t, 1, len(tb1ReferredFKs)) + tk.MustExec("alter table t1 drop foreign key fk") + tbl1Info := getTableInfo(t, dom, "test", "t1") + tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") + require.Equal(t, 0, len(tbl1Info.ForeignKeys)) + require.Equal(t, 0, len(tb1ReferredFKs)) + + tk.MustExec("drop table t1") + tk.MustExec("create table t1 (id int key, b int, index(b))") + tk.MustExec("create table t2 (a int, b int, foreign key fk (a) references t1(b));") + tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") + require.Equal(t, 1, len(tb1ReferredFKs)) + tk.MustExec("alter table t2 drop foreign key fk") + tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") + require.Equal(t, 0, len(tb1ReferredFKs)) + tbl2Info := getTableInfo(t, dom, "test", "t2") + require.Equal(t, 0, len(tbl2Info.ForeignKeys)) +} + +func TestTruncateOrDropTableWithForeignKeyReferred(t *testing.T) { + store, _ := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("use test") + + cases := []struct { + prepares []string + tbl string + truncateErr string + dropErr string + }{ + { + prepares: []string{ + "create table t1 (id int key, b int not null, index(b))", + "create table t2 (a int, b int, foreign key fk_b(b) references t1(b));", + }, + tbl: "t1", + truncateErr: "[ddl:1701]Cannot truncate a table referenced in a foreign key constraint (`test`.`t2` CONSTRAINT `fk_b`)", + dropErr: "[ddl:3730]Cannot drop table 't1' referenced by a foreign key constraint 'fk_b' on table 't2'.", + }, + { + prepares: []string{ + "create table t1 (id int key, a varchar(10), index(a));", + "create table t2 (a int, b varchar(20), foreign key fk_b(b) references t1(a));", + }, + tbl: "t1", + truncateErr: "[ddl:1701]Cannot truncate a table referenced in a foreign key constraint (`test`.`t2` CONSTRAINT `fk_b`)", + dropErr: "[ddl:3730]Cannot drop table 't1' referenced by a foreign key constraint 'fk_b' on table 't2'.", + }, + { + prepares: []string{ + "create table t1 (id int key, a varchar(10), index (a(10)));", + "create table t2 (a int, b varchar(20), foreign key fk_b(b) references t1(a));", + }, + tbl: "t1", + truncateErr: "[ddl:1701]Cannot truncate a table referenced in a foreign key constraint (`test`.`t2` CONSTRAINT `fk_b`)", + dropErr: "[ddl:3730]Cannot drop table 't1' referenced by a foreign key constraint 'fk_b' on table 't2'.", + }, + } + + for _, ca := range cases { + tk.MustExec("drop table if exists t2") + tk.MustExec("drop table if exists t1") + for _, sql := range ca.prepares { + tk.MustExec(sql) + } + truncateSQL := fmt.Sprintf("truncate table %v", ca.tbl) + tk.MustExec("set @@foreign_key_checks=1;") + err := tk.ExecToErr(truncateSQL) + require.Error(t, err) + require.Equal(t, ca.truncateErr, err.Error()) + dropSQL := fmt.Sprintf("drop table %v", ca.tbl) + err = tk.ExecToErr(dropSQL) + require.Error(t, err) + require.Equal(t, ca.dropErr, err.Error()) + + tk.MustExec("set @@foreign_key_checks=0;") + tk.MustExec(truncateSQL) + } + passCases := [][]string{ + { + "create table t1 (id int key, a int, b int, foreign key fk(a) references t1(id))", + "truncate table t1", + "drop table t1", + }, + { + "create table t1 (id int key, a varchar(10), index (a(10)));", + "create table t2 (a int, b varchar(20), foreign key fk_b(b) references t1(a));", + "drop table t1, t2", + }, + { + "set @@foreign_key_checks=0;", + "create table t1 (id int key, a varchar(10), index (a(10)));", + "create table t2 (a int, b varchar(20), foreign key fk_b(b) references t1(a));", + "truncate table t1", + "drop table t1", + }, + } + for _, ca := range passCases { + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("set @@foreign_key_checks=1;") + for _, sql := range ca { + tk.MustExec(sql) + } + } +} + +func TestDropTableWithForeignKeyReferred(t *testing.T) { + store, _ := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("set @@foreign_key_checks=1;") + tk.MustExec("use test") + + tk.MustExec("create table t1 (id int key, b int, index(b));") + tk.MustExec("create table t2 (id int key, b int, foreign key fk_b(b) references t1(id));") + tk.MustExec("create table t3 (id int key, b int, foreign key fk_b(b) references t2(id));") + err := tk.ExecToErr("drop table if exists t1,t2;") + require.Error(t, err) + require.Equal(t, "[ddl:3730]Cannot drop table 't2' referenced by a foreign key constraint 'fk_b' on table 't3'.", err.Error()) + tk.MustQuery("show tables").Check(testkit.Rows("t1", "t2", "t3")) +} + +func TestDropIndexNeededInForeignKey(t *testing.T) { + store, _ := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("set @@foreign_key_checks=1") + tk.MustExec("use test") + + cases := []struct { + prepares []string + drops []string + err string + }{ + { + prepares: []string{ + "create table t1 (id int key, b int, index idx (b))", + "create table t2 (a int, b int, index idx (b), foreign key fk_b(b) references t1(b));", + }, + drops: []string{ + "alter table t1 drop index idx", + "alter table t2 drop index idx", + }, + err: "[ddl:1553]Cannot drop index 'idx': needed in a foreign key constraint", + }, + { + prepares: []string{ + "create table t1 (id int, b int, index idx (id, b))", + "create table t2 (a int, b int, index idx (b, a), foreign key fk_b(b) references t1(id));", + }, + drops: []string{ + "alter table t1 drop index idx", + "alter table t2 drop index idx", + }, + err: "[ddl:1553]Cannot drop index 'idx': needed in a foreign key constraint", + }, + } + + for _, ca := range cases { + tk.MustExec("drop table if exists t2") + tk.MustExec("drop table if exists t1") + for _, sql := range ca.prepares { + tk.MustExec(sql) + } + for _, drop := range ca.drops { + // even disable foreign key check, still can't drop the index used by foreign key. + tk.MustExec("set @@foreign_key_checks=0;") + err := tk.ExecToErr(drop) + require.Error(t, err) + require.Equal(t, ca.err, err.Error()) + tk.MustExec("set @@foreign_key_checks=1;") + err = tk.ExecToErr(drop) + require.Error(t, err) + require.Equal(t, ca.err, err.Error()) + } + } + passCases := [][]string{ + { + "create table t1 (id int key, b int, index idxb (b))", + "create table t2 (a int, b int key, index idxa (a),index idxb (b), foreign key fk_b(b) references t1(id));", + "alter table t1 drop index idxb", + "alter table t2 drop index idxa", + "alter table t2 drop index idxb", + }, + { + "create table t1 (id int key, b int, index idxb (b), unique index idx(b, id))", + "create table t2 (a int, b int key, index idx (b, a),index idxb (b), index idxab(a, b), foreign key fk_b(b) references t1(b));", + "alter table t1 drop index idxb", + "alter table t1 add index idxb (b)", + "alter table t1 drop index idx", + "alter table t2 drop index idx", + "alter table t2 add index idx (b, a)", + "alter table t2 drop index idxb", + "alter table t2 drop index idxab", + }, + } + tk.MustExec("set @@foreign_key_checks=1;") + for _, ca := range passCases { + tk.MustExec("drop table if exists t2") + tk.MustExec("drop table if exists t1") + for _, sql := range ca { + tk.MustExec(sql) + } + } +} + +func getTableInfo(t *testing.T, dom *domain.Domain, db, tb string) *model.TableInfo { + err := dom.Reload() + require.NoError(t, err) + is := dom.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr(db), model.NewCIStr(tb)) + require.NoError(t, err) + _, exist := is.TableByID(tbl.Meta().ID) + require.True(t, exist) + return tbl.Meta() +} + +func getTableInfoReferredForeignKeys(t *testing.T, dom *domain.Domain, db, tb string) []*model.ReferredFKInfo { + err := dom.Reload() + require.NoError(t, err) + return dom.InfoSchema().GetTableReferredForeignKeys(db, tb) +} + +func TestDropColumnWithForeignKey(t *testing.T) { + store, _ := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("set @@foreign_key_checks=1;") + tk.MustExec("use test") + + tk.MustExec("create table t1 (id int key, a int, b int, index(b), CONSTRAINT fk foreign key (a) references t1(b))") + tk.MustGetErrMsg("alter table t1 drop column a;", "[ddl:1828]Cannot drop column 'a': needed in a foreign key constraint 'fk'") + tk.MustGetErrMsg("alter table t1 drop column b;", "[ddl:1829]Cannot drop column 'b': needed in a foreign key constraint 'fk' of table 't1'") + + tk.MustExec("drop table t1") + tk.MustExec("create table t1 (id int key, b int, index(b));") + tk.MustExec("create table t2 (a int, b int, constraint fk foreign key (a) references t1(b));") + tk.MustGetErrMsg("alter table t1 drop column b;", "[ddl:1829]Cannot drop column 'b': needed in a foreign key constraint 'fk' of table 't2'") + tk.MustGetErrMsg("alter table t2 drop column a;", "[ddl:1828]Cannot drop column 'a': needed in a foreign key constraint 'fk'") +} + +func TestRenameColumnWithForeignKeyMetaInfo(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("set @@foreign_key_checks=1;") + tk.MustExec("use test") + + tk.MustExec("create table t1 (id int key, a int, b int, foreign key fk(a) references t1(id))") + tk.MustExec("alter table t1 change id kid int") + tk.MustExec("alter table t1 rename column a to aa") + tbl1Info := getTableInfo(t, dom, "test", "t1") + tb1ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t1") + require.Equal(t, 1, len(tbl1Info.ForeignKeys)) + require.Equal(t, 1, len(tb1ReferredFKs)) + require.Equal(t, "kid", tb1ReferredFKs[0].Cols[0].L) + require.Equal(t, "kid", tbl1Info.ForeignKeys[0].RefCols[0].L) + require.Equal(t, "aa", tbl1Info.ForeignKeys[0].Cols[0].L) + + tk.MustExec("drop table t1") + tk.MustExec("create table t1 (id int key, b int, index(b))") + tk.MustExec("create table t2 (a int, b int, foreign key fk(a) references t1(b));") + tk.MustExec("alter table t2 change a aa int") + tbl1Info = getTableInfo(t, dom, "test", "t1") + tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") + require.Equal(t, 1, len(tb1ReferredFKs)) + require.Equal(t, 1, len(tb1ReferredFKs[0].Cols)) + require.Equal(t, "b", tb1ReferredFKs[0].Cols[0].L) + tbl2Info := getTableInfo(t, dom, "test", "t2") + tb2ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t2") + require.Equal(t, 0, len(tb2ReferredFKs)) + require.Equal(t, 1, len(tbl2Info.ForeignKeys)) + require.Equal(t, 1, len(tbl2Info.ForeignKeys[0].Cols)) + require.Equal(t, 1, len(tbl2Info.ForeignKeys[0].RefCols)) + require.Equal(t, "aa", tbl2Info.ForeignKeys[0].Cols[0].L) + require.Equal(t, "b", tbl2Info.ForeignKeys[0].RefCols[0].L) + + tk.MustExec("alter table t1 change id kid int") + tk.MustExec("alter table t1 change b bb int") + tbl1Info = getTableInfo(t, dom, "test", "t1") + tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") + require.Equal(t, 1, len(tb1ReferredFKs)) + require.Equal(t, 1, len(tb1ReferredFKs[0].Cols)) + require.Equal(t, "bb", tb1ReferredFKs[0].Cols[0].L) + tbl2Info = getTableInfo(t, dom, "test", "t2") + tb2ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t2") + require.Equal(t, 0, len(tb2ReferredFKs)) + require.Equal(t, 1, len(tbl2Info.ForeignKeys)) + require.Equal(t, 1, len(tbl2Info.ForeignKeys[0].Cols)) + require.Equal(t, 1, len(tbl2Info.ForeignKeys[0].RefCols)) + require.Equal(t, "aa", tbl2Info.ForeignKeys[0].Cols[0].L) + require.Equal(t, "bb", tbl2Info.ForeignKeys[0].RefCols[0].L) + + tk.MustExec("drop table t1, t2") + tk.MustExec("create table t1 (id int key, b int, index(b))") + tk.MustExec("create table t2 (a int, b int, foreign key (a) references t1(b), foreign key (b) references t1(b));") + tk.MustExec("alter table t1 change b bb int") + tbl1Info = getTableInfo(t, dom, "test", "t1") + tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") + require.Equal(t, 2, len(tb1ReferredFKs)) + require.Equal(t, 1, len(tb1ReferredFKs[0].Cols)) + require.Equal(t, 1, len(tb1ReferredFKs[1].Cols)) + require.Equal(t, "bb", tb1ReferredFKs[0].Cols[0].L) + require.Equal(t, "bb", tb1ReferredFKs[1].Cols[0].L) + tbl2Info = getTableInfo(t, dom, "test", "t2") + tb2ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t2") + require.Equal(t, 0, len(tb2ReferredFKs)) + require.Equal(t, 2, len(tbl2Info.ForeignKeys)) + require.Equal(t, 1, len(tbl2Info.ForeignKeys[0].Cols)) + require.Equal(t, 1, len(tbl2Info.ForeignKeys[0].RefCols)) + require.Equal(t, "a", tbl2Info.ForeignKeys[0].Cols[0].L) + require.Equal(t, "bb", tbl2Info.ForeignKeys[0].RefCols[0].L) + require.Equal(t, 1, len(tbl2Info.ForeignKeys[1].Cols)) + require.Equal(t, 1, len(tbl2Info.ForeignKeys[1].RefCols)) + require.Equal(t, "b", tbl2Info.ForeignKeys[1].Cols[0].L) + require.Equal(t, "bb", tbl2Info.ForeignKeys[1].RefCols[0].L) + tk.MustExec("alter table t2 rename column a to aa") + tk.MustExec("alter table t2 change b bb int") + tk.MustQuery("show create table t2"). + Check(testkit.Rows("t2 CREATE TABLE `t2` (\n" + + " `aa` int(11) DEFAULT NULL,\n" + + " `bb` int(11) DEFAULT NULL,\n" + + " KEY `fk_1` (`aa`),\n KEY `fk_2` (`bb`),\n" + + " CONSTRAINT `fk_1` FOREIGN KEY (`aa`) REFERENCES `test`.`t1` (`bb`),\n" + + " CONSTRAINT `fk_2` FOREIGN KEY (`bb`) REFERENCES `test`.`t1` (`bb`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) +} + +func TestDropDatabaseWithForeignKeyReferred(t *testing.T) { + store, _ := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("set @@foreign_key_checks=1;") + tk.MustExec("use test") + + tk.MustExec("create table t1 (id int key, b int, index(b));") + tk.MustExec("create table t2 (id int key, b int, foreign key fk_b(b) references t1(id));") + tk.MustExec("create database test2") + tk.MustExec("create table test2.t3 (id int key, b int, foreign key fk_b(b) references test.t2(id));") + err := tk.ExecToErr("drop database test;") + require.Error(t, err) + require.Equal(t, "[ddl:3730]Cannot drop table 't2' referenced by a foreign key constraint 'fk_b' on table 't3'.", err.Error()) + tk.MustExec("set @@foreign_key_checks=0;") + tk.MustExec("drop database test") + + tk.MustExec("set @@foreign_key_checks=1;") + tk.MustExec("create database test") + tk.MustExec("use test") + tk.MustExec("create table t1 (id int key, b int, index(b));") + tk.MustExec("create table t2 (id int key, b int, foreign key fk_b(b) references t1(id));") + err = tk.ExecToErr("drop database test;") + require.Error(t, err) + require.Equal(t, "[ddl:3730]Cannot drop table 't2' referenced by a foreign key constraint 'fk_b' on table 't3'.", err.Error()) + tk.MustExec("drop table test2.t3") + tk.MustExec("drop database test") +} + +func TestAddForeignKey(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("set @@foreign_key_checks=1;") + tk.MustExec("use test") + tk.MustExec("create table t1 (id int key, b int);") + tk.MustExec("create table t2 (id int key, b int);") + tk.MustExec("alter table t2 add index(b)") + tk.MustExec("alter table t2 add foreign key (b) references t1(id);") + tbl2Info := getTableInfo(t, dom, "test", "t2") + require.Equal(t, int64(1), tbl2Info.MaxForeignKeyID) + tk.MustGetDBError("alter table t2 add foreign key (b) references t1(b);", infoschema.ErrForeignKeyNoIndexInParent) + tk.MustExec("alter table t1 add index(b)") + tk.MustExec("alter table t2 add foreign key (b) references t1(b);") + tk.MustGetDBError("alter table t2 add foreign key (b) references t2(b);", infoschema.ErrCannotAddForeign) + // Test auto-create index when create foreign key constraint. + tk.MustExec("drop table if exists t1,t2") + tk.MustExec("create table t1 (id int key, b int, index(b));") + tk.MustExec("create table t2 (id int key, b int);") + tk.MustExec("alter table t2 add constraint fk foreign key (b) references t1(b);") + tbl2Info = getTableInfo(t, dom, "test", "t2") + require.Equal(t, 1, len(tbl2Info.Indices)) + require.Equal(t, "fk", tbl2Info.Indices[0].Name.L) + require.Equal(t, model.StatePublic, tbl2Info.Indices[0].State) + tk.MustQuery("select b from t2 use index(fk)").Check(testkit.Rows()) + res := tk.MustQuery("explain select b from t2 use index(fk)") + plan := bytes.NewBuffer(nil) + rows := res.Rows() + for _, row := range rows { + for _, c := range row { + plan.WriteString(c.(string)) + plan.WriteString(" ") + } + } + require.Regexp(t, ".*IndexReader.*index:fk.*", plan.String()) + + // Test add multiple foreign key constraint in one statement. + tk.MustExec("alter table t2 add column c int, add column d int, add column e int;") + tk.MustExec("alter table t2 add index idx_c(c, d, e)") + tk.MustExec("alter table t2 add constraint fk_c foreign key (c) references t1(b), " + + "add constraint fk_d foreign key (d) references t1(b)," + + "add constraint fk_e foreign key (e) references t1(b)") + tbl2Info = getTableInfo(t, dom, "test", "t2") + require.Equal(t, 4, len(tbl2Info.Indices)) + names := []string{"fk", "idx_c", "fk_d", "fk_e"} + for i, idx := range tbl2Info.Indices { + require.Equal(t, names[i], idx.Name.L) + require.Equal(t, model.StatePublic, idx.State) + } + names = []string{"fk", "fk_c", "fk_d", "fk_e"} + for i, fkInfo := range tbl2Info.ForeignKeys { + require.Equal(t, names[i], fkInfo.Name.L) + require.Equal(t, model.StatePublic, fkInfo.State) + } + tk.MustGetDBError("insert into t2 (id, b) values (1,1)", plannercore.ErrNoReferencedRow2) + tk.MustGetDBError("insert into t2 (id, c) values (1,1)", plannercore.ErrNoReferencedRow2) + tk.MustGetDBError("insert into t2 (id, d) values (1,1)", plannercore.ErrNoReferencedRow2) + tk.MustGetDBError("insert into t2 (id, e) values (1,1)", plannercore.ErrNoReferencedRow2) + + // Test add multiple foreign key constraint in one statement but failed. + tk.MustExec("alter table t2 drop foreign key fk") + tk.MustExec("alter table t2 drop foreign key fk_c") + tk.MustExec("alter table t2 drop foreign key fk_d") + tk.MustExec("alter table t2 drop foreign key fk_e") + tk.MustGetDBError("alter table t2 add constraint fk_c foreign key (c) references t1(b), "+ + "add constraint fk_d foreign key (d) references t1(b),"+ + "add constraint fk_e foreign key (e) references t1(unknown_col)", infoschema.ErrForeignKeyNoColumnInParent) + tbl2Info = getTableInfo(t, dom, "test", "t2") + require.Equal(t, 0, len(tbl2Info.ForeignKeys)) + tk.MustGetDBError("alter table t2 drop index idx_c, add constraint fk_c foreign key (c) references t1(b)", dbterror.ErrDropIndexNeededInForeignKey) + + // Test circular dependency add foreign key failed. + tk.MustExec("drop table if exists t1,t2") + tk.MustExec("create table t1 (id int key,a int, index(a));") + tk.MustExec("create table t2 (id int key,a int, foreign key fk(a) references t1(id) ON DELETE CASCADE);") + tk.MustExec("insert into t1 values (1,1);") + err := tk.ExecToErr("ALTER TABLE t1 ADD foreign key fk(a) references t2(id) ON DELETE CASCADE;") + require.Error(t, err) + require.Equal(t, "[ddl:1452]Cannot add or update a child row: a foreign key constraint fails (`test`.`t1`, CONSTRAINT `fk` FOREIGN KEY (`a`) REFERENCES `t2` (`id`) ON DELETE CASCADE)", err.Error()) + tbl1Info := getTableInfo(t, dom, "test", "t1") + require.Equal(t, 0, len(tbl1Info.ForeignKeys)) + referredFKs := dom.InfoSchema().GetTableReferredForeignKeys("test", "t2") + require.Equal(t, 0, len(referredFKs)) + tk.MustQuery("show create table t1").Check(testkit.Rows("t1 CREATE TABLE `t1` (\n" + + " `id` int(11) NOT NULL,\n" + + " `a` int(11) DEFAULT NULL,\n" + + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,\n" + + " KEY `a` (`a`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + + // Test add foreign key with auto-create index failed. + tk.MustExec("drop table if exists t1,t2") + tk.MustExec("create table t1 (id int key,a int);") + tk.MustExec("create table t2 (id int key);") + tk.MustExec("insert into t1 values (1,1);") + err = tk.ExecToErr("ALTER TABLE t1 ADD foreign key fk(a) references t2(id) ON DELETE CASCADE;") + require.Error(t, err) + require.Equal(t, "[ddl:1452]Cannot add or update a child row: a foreign key constraint fails (`test`.`t1`, CONSTRAINT `fk` FOREIGN KEY (`a`) REFERENCES `t2` (`id`) ON DELETE CASCADE)", err.Error()) + tbl1Info = getTableInfo(t, dom, "test", "t1") + require.Equal(t, 0, len(tbl1Info.ForeignKeys)) + referredFKs = dom.InfoSchema().GetTableReferredForeignKeys("test", "t2") + require.Equal(t, 0, len(referredFKs)) + tk.MustQuery("show create table t1").Check(testkit.Rows("t1 CREATE TABLE `t1` (\n" + + " `id` int(11) NOT NULL,\n" + + " `a` int(11) DEFAULT NULL,\n" + + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) +} + +func TestAlterTableAddForeignKeyError(t *testing.T) { + store, _ := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("set @@foreign_key_checks=1;") + tk.MustExec("use test") + cases := []struct { + prepares []string + alter string + err string + }{ + { + prepares: []string{ + "create table t1 (id int, a int, b int);", + "create table t2 (a int, b int);", + }, + alter: "alter table t2 add foreign key fk(b) references t_unknown(id)", + err: "[schema:1824]Failed to open the referenced table 't_unknown'", + }, + { + prepares: []string{ + "create table t1 (id int, a int, b int);", + "create table t2 (a int, b int);", + }, + alter: "alter table t2 add foreign key fk(b) references t1(c_unknown)", + err: "[schema:3734]Failed to add the foreign key constraint. Missing column 'c_unknown' for constraint 'fk' in the referenced table 't1'", + }, + { + prepares: []string{ + "create table t1 (id int, a int, b int);", + "create table t2 (a int, b int);", + }, + alter: "alter table t2 add foreign key fk_b(b) references t1(b)", + err: "[schema:1822]Failed to add the foreign key constraint. Missing index for constraint 'fk_b' in the referenced table 't1'", + }, + { + prepares: []string{ + "create table t1 (id int, a int, b int not null, index(b));", + "create table t2 (a int, b int not null);", + }, + alter: "alter table t2 add foreign key fk_b(b) references t1(b) on update set null", + err: "[schema:1830]Column 'b' cannot be NOT NULL: needed in a foreign key constraint 'fk_b' SET NULL", + }, + { + prepares: []string{ + "create table t1 (id int, a int, b int not null, index(b));", + "create table t2 (a int, b int not null);", + }, + alter: "alter table t2 add foreign key fk_b(b) references t1(b) on delete set null", + err: "[schema:1830]Column 'b' cannot be NOT NULL: needed in a foreign key constraint 'fk_b' SET NULL", + }, + { + prepares: []string{ + "create table t1 (id int key, a int, b int as (a) virtual, index(b));", + "create table t2 (a int, b int);", + }, + alter: "alter table t2 add foreign key fk_b(b) references t1(b)", + err: "[schema:3733]Foreign key 'fk_b' uses virtual column 'b' which is not supported.", + }, + { + prepares: []string{ + "create table t1 (id int key, a int, b int, index(b));", + "create table t2 (a int, b int as (a) virtual);", + }, + alter: "alter table t2 add foreign key fk_b(b) references t1(b)", + err: "[schema:3733]Foreign key 'fk_b' uses virtual column 'b' which is not supported.", + }, + { + prepares: []string{ + "create table t1 (id int key, a int);", + "create table t2 (a int, b varchar(10));", + }, + alter: "alter table t2 add foreign key fk(b) references t1(id)", + err: "[ddl:3780]Referencing column 'b' and referenced column 'id' in foreign key constraint 'fk' are incompatible.", + }, + { + prepares: []string{ + "create table t1 (id int key, a int not null, index(a));", + "create table t2 (a int, b int unsigned);", + }, + alter: "alter table t2 add foreign key fk_b(b) references t1(a)", + err: "[ddl:3780]Referencing column 'b' and referenced column 'a' in foreign key constraint 'fk_b' are incompatible.", + }, + { + prepares: []string{ + "create table t1 (id int key, a bigint, index(a));", + "create table t2 (a int, b int);", + }, + alter: "alter table t2 add foreign key fk_b(b) references t1(a)", + err: "[ddl:3780]Referencing column 'b' and referenced column 'a' in foreign key constraint 'fk_b' are incompatible.", + }, + { + prepares: []string{ + "create table t1 (id int key, a varchar(10) charset utf8, index(a));", + "create table t2 (a int, b varchar(10) charset utf8mb4);", + }, + alter: "alter table t2 add foreign key fk_b(b) references t1(a)", + err: "[ddl:3780]Referencing column 'b' and referenced column 'a' in foreign key constraint 'fk_b' are incompatible.", + }, + { + prepares: []string{ + "create table t1 (id int key, a varchar(10) collate utf8_bin, index(a));", + "create table t2 (a int, b varchar(10) collate utf8mb4_bin);", + }, + alter: "alter table t2 add foreign key fk_b(b) references t1(a)", + err: "[ddl:3780]Referencing column 'b' and referenced column 'a' in foreign key constraint 'fk_b' are incompatible.", + }, + { + prepares: []string{ + "create table t1 (id int key, a varchar(10));", + "create table t2 (a int, b varchar(10));", + }, + alter: "alter table t2 add foreign key fk_b(b) references t1(a)", + err: "[schema:1822]Failed to add the foreign key constraint. Missing index for constraint 'fk_b' in the referenced table 't1'", + }, + { + prepares: []string{ + "create table t1 (id int key, a varchar(10), index (a(5)));", + "create table t2 (a int, b varchar(10));", + }, + alter: "alter table t2 add foreign key fk_b(b) references t1(a)", + err: "[schema:1822]Failed to add the foreign key constraint. Missing index for constraint 'fk_b' in the referenced table 't1'", + }, + { + prepares: []string{ + "create table t1 (id int key, a int)", + "create table t2 (id int, b int, index(b))", + "insert into t2 values (1,1)", + }, + alter: "alter table t2 add foreign key fk_b(b) references t1(id)", + err: "[ddl:1452]Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `fk_b` FOREIGN KEY (`b`) REFERENCES `t1` (`id`))", + }, + { + prepares: []string{ + "create table t1 (id int, a int, b int, index(a,b))", + "create table t2 (id int, a int, b int, index(a,b))", + "insert into t2 values (1, 1, null), (2, null, 1), (3, null, null), (4, 1, 1)", + }, + alter: "alter table t2 add foreign key fk_b(a, b) references t1(a, b)", + err: "[ddl:1452]Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `fk_b` FOREIGN KEY (`a`, `b`) REFERENCES `t1` (`a`, `b`))", + }, + { + prepares: []string{ + "create table t1 (id int key);", + "create table t2 (a int, b int unique);", + }, + alter: "alter table t2 add foreign key name5678901234567890123456789012345678901234567890123456789012345(b) references t1(id)", + err: "[ddl:1059]Identifier name 'name5678901234567890123456789012345678901234567890123456789012345' is too long", + }, + { + prepares: []string{ + "create table t1 (id int key);", + "create table t2 (a int, b int unique);", + }, + alter: "alter table t2 add constraint name5678901234567890123456789012345678901234567890123456789012345 foreign key (b) references t1(id)", + err: "[ddl:1059]Identifier name 'name5678901234567890123456789012345678901234567890123456789012345' is too long", + }, + // Test foreign key with temporary table. + { + prepares: []string{ + "create temporary table t1 (id int key);", + "create table t2 (a int, b int unique);", + }, + alter: "alter table t2 add constraint fk foreign key (b) references t1(id)", + err: "[schema:1824]Failed to open the referenced table 't1'", + }, + { + prepares: []string{ + "create table t1 (id int key);", + "create temporary table t2 (a int, b int unique);", + }, + alter: "alter table t2 add constraint fk foreign key (b) references t1(id)", + err: "[ddl:8200]TiDB doesn't support ALTER TABLE for local temporary table", + }, + // Test foreign key with partition table + { + prepares: []string{ + "create table t1 (id int key) partition by hash(id) partitions 3;", + "create table t2 (id int key);", + }, + alter: "alter table t2 add constraint fk foreign key (id) references t1(id)", + err: "[schema:1506]Foreign key clause is not yet supported in conjunction with partitioning", + }, + { + prepares: []string{ + "create table t1 (id int key);", + "create table t2 (id int key) partition by hash(id) partitions 3;;", + }, + alter: "alter table t2 add constraint fk foreign key (id) references t1(id)", + err: "[schema:1506]Foreign key clause is not yet supported in conjunction with partitioning", + }, + } + for i, ca := range cases { + tk.MustExec("drop table if exists t2") + tk.MustExec("drop table if exists t1") + for _, sql := range ca.prepares { + tk.MustExec(sql) + } + err := tk.ExecToErr(ca.alter) + require.Error(t, err, fmt.Sprintf("%v, %v", i, ca.err)) + require.Equal(t, ca.err, err.Error()) + } + + passCases := [][]string{ + { + "create table t1 (id int key, a int, b int, index(a))", + "alter table t1 add foreign key fk(a) references t1(id)", + }, + { + "create table t1 (id int key, b int not null, index(b))", + "create table t2 (a int, b int, index(b));", + "alter table t2 add foreign key fk_b(b) references t1(b)", + }, + { + "create table t1 (id int key, a varchar(10), index(a));", + "create table t2 (a int, b varchar(20), index(b));", + "alter table t2 add foreign key fk_b(b) references t1(a)", + }, + { + "create table t1 (id int key, a decimal(10,5), index(a));", + "create table t2 (a int, b decimal(20, 10), index(b));", + "alter table t2 add foreign key fk_b(b) references t1(a)", + }, + { + "create table t1 (id int key, a varchar(10), index (a(10)));", + "create table t2 (a int, b varchar(20), index(b));", + "alter table t2 add foreign key fk_b(b) references t1(a)", + }, + { + "create table t1 (id int key, a int)", + "create table t2 (id int, b int, index(b))", + "insert into t2 values (1, null)", + "alter table t2 add foreign key fk_b(b) references t1(id)", + }, + { + "create table t1 (id int, a int, b int, index(a,b))", + "create table t2 (id int, a int, b int, index(a,b))", + "insert into t2 values (1, 1, null), (2, null, 1), (3, null, null)", + "alter table t2 add foreign key fk_b(a, b) references t1(a, b)", + }, + { + "set @@foreign_key_checks=0;", + "create table t1 (id int, a int, b int, index(a,b))", + "create table t2 (id int, a int, b int, index(a,b))", + "insert into t2 values (1, 1, 1)", + "alter table t2 add foreign key fk_b(a, b) references t1(a, b)", + "set @@foreign_key_checks=1;", + }, + { + "set @@foreign_key_checks=0;", + "create table t2 (a int, b int, index(b));", + "alter table t2 add foreign key fk_b(b) references t_unknown(a)", + "set @@foreign_key_checks=1;", + }, + { + "create table t1 (id int key);", + "create table t2 (a int, b int unique);", + "alter table t2 add foreign key name567890123456789012345678901234567890123456789012345678901234(b) references t1(id)", + }, + } + for _, ca := range passCases { + tk.MustExec("drop table if exists t2") + tk.MustExec("drop table if exists t1") + for _, sql := range ca { + tk.MustExec(sql) + } + } +} + +func TestRenameTablesWithForeignKey(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("set @@foreign_key_checks=0;") + tk.MustExec("create database test1") + tk.MustExec("create database test2") + tk.MustExec("use test") + tk.MustExec("create table t0 (id int key, b int);") + tk.MustExec("create table t1 (id int key, b int, index(b), foreign key fk(b) references t2(id));") + tk.MustExec("create table t2 (id int key, b int, index(b), foreign key fk(b) references t1(id));") + tk.MustExec("rename table test.t1 to test1.tt1, test.t2 to test2.tt2, test.t0 to test.tt0") + + // check the schema diff + diff := getLatestSchemaDiff(t, tk) + require.Equal(t, model.ActionRenameTables, diff.Type) + require.Equal(t, 3, len(diff.AffectedOpts)) + + // check referred foreign key information. + t1ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t1") + t2ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t2") + require.Equal(t, 0, len(t1ReferredFKs)) + require.Equal(t, 0, len(t2ReferredFKs)) + tt1ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test1", "tt1") + tt2ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test2", "tt2") + require.Equal(t, 1, len(tt1ReferredFKs)) + require.Equal(t, 1, len(tt2ReferredFKs)) + require.Equal(t, model.ReferredFKInfo{ + Cols: []model.CIStr{model.NewCIStr("id")}, + ChildSchema: model.NewCIStr("test2"), + ChildTable: model.NewCIStr("tt2"), + ChildFKName: model.NewCIStr("fk"), + }, *tt1ReferredFKs[0]) + require.Equal(t, model.ReferredFKInfo{ + Cols: []model.CIStr{model.NewCIStr("id")}, + ChildSchema: model.NewCIStr("test1"), + ChildTable: model.NewCIStr("tt1"), + ChildFKName: model.NewCIStr("fk"), + }, *tt2ReferredFKs[0]) + + // check show create table information + tk.MustQuery("show create table test1.tt1").Check(testkit.Rows("tt1 CREATE TABLE `tt1` (\n" + + " `id` int(11) NOT NULL,\n" + + " `b` int(11) DEFAULT NULL,\n" + + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,\n" + + " KEY `b` (`b`),\n" + + " CONSTRAINT `fk` FOREIGN KEY (`b`) REFERENCES `test2`.`tt2` (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + tk.MustQuery("show create table test2.tt2").Check(testkit.Rows("tt2 CREATE TABLE `tt2` (\n" + + " `id` int(11) NOT NULL,\n" + + " `b` int(11) DEFAULT NULL,\n" + + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,\n" + + " KEY `b` (`b`),\n" + + " CONSTRAINT `fk` FOREIGN KEY (`b`) REFERENCES `test1`.`tt1` (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) +} + +func getLatestSchemaDiff(t *testing.T, tk *testkit.TestKit) *model.SchemaDiff { + ctx := tk.Session() + err := sessiontxn.NewTxn(context.Background(), ctx) + require.NoError(t, err) + txn, err := ctx.Txn(true) + require.NoError(t, err) + m := meta.NewMeta(txn) + ver, err := m.GetSchemaVersion() + require.NoError(t, err) + diff, err := m.GetSchemaDiff(ver) + require.NoError(t, err) + return diff +} + +func TestMultiSchemaAddForeignKey(t *testing.T) { + store, _ := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@foreign_key_checks=1;") + tk.MustExec("use test") + tk.MustExec("create table t1 (id int key);") + tk.MustExec("create table t2 (a int, b int);") + tk.MustExec("alter table t2 add foreign key (a) references t1(id), add foreign key (b) references t1(id)") + tk.MustExec("alter table t2 add column c int, add column d int") + tk.MustExec("alter table t2 add foreign key (c) references t1(id), add foreign key (d) references t1(id), add index(c), add index(d)") + tk.MustExec("drop table t2") + tk.MustExec("create table t2 (a int, b int, index idx1(a), index idx2(b));") + tk.MustGetErrMsg("alter table t2 drop index idx1, drop index idx2, add foreign key (a) references t1(id), add foreign key (b) references t1(id)", + "[ddl:1553]Cannot drop index 'idx1': needed in a foreign key constraint") + tk.MustExec("alter table t2 drop index idx1, drop index idx2") + tk.MustExec("alter table t2 add foreign key (a) references t1(id), add foreign key (b) references t1(id)") + tk.MustQuery("show create table t2").Check(testkit.Rows("t2 CREATE TABLE `t2` (\n" + + " `a` int(11) DEFAULT NULL,\n" + + " `b` int(11) DEFAULT NULL,\n" + + " KEY `fk_1` (`a`),\n" + + " KEY `fk_2` (`b`),\n" + + " CONSTRAINT `fk_1` FOREIGN KEY (`a`) REFERENCES `test`.`t1` (`id`),\n" + + " CONSTRAINT `fk_2` FOREIGN KEY (`b`) REFERENCES `test`.`t1` (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + tk.MustExec("drop table t2") + tk.MustExec("create table t2 (a int, b int, index idx0(a,b), index idx1(a), index idx2(b));") + tk.MustExec("alter table t2 drop index idx1, add foreign key (a) references t1(id), add foreign key (b) references t1(id)") +} + +func TestAddForeignKeyInBigTable(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@foreign_key_checks=1;") + tk.MustExec("use test") + tk.MustExec("create table employee (id bigint auto_increment key, pid bigint)") + tk.MustExec("insert into employee (id) values (1),(2),(3),(4),(5),(6),(7),(8)") + for i := 0; i < 14; i++ { + tk.MustExec("insert into employee (pid) select pid from employee") + } + tk.MustExec("update employee set pid=id-1 where id>1") + start := time.Now() + tk.MustExec("alter table employee add foreign key fk_1(pid) references employee(id)") + require.Less(t, time.Since(start), time.Minute) +} + +func TestForeignKeyWithCacheTable(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@foreign_key_checks=1;") + tk.MustExec("use test") + // Test foreign key refer cache table. + tk.MustExec("create table t1 (id int key);") + tk.MustExec("insert into t1 values (1),(2),(3),(4)") + tk.MustExec("alter table t1 cache;") + tk.MustExec("create table t2 (b int);") + tk.MustExec("alter table t2 add constraint fk foreign key (b) references t1(id) on delete cascade on update cascade") + tk.MustExec("insert into t2 values (1),(2),(3),(4)") + tk.MustGetDBError("insert into t2 values (5)", plannercore.ErrNoReferencedRow2) + tk.MustExec("update t1 set id = id+10 where id=1") + tk.MustExec("delete from t1 where id<10") + tk.MustQuery("select * from t1").Check(testkit.Rows("11")) + tk.MustQuery("select * from t2").Check(testkit.Rows("11")) + tk.MustExec("alter table t1 nocache;") + tk.MustExec("drop table t1,t2;") + + // Test add foreign key on cache table. + tk.MustExec("create table t1 (id int key);") + tk.MustExec("create table t2 (b int);") + tk.MustExec("alter table t2 add constraint fk foreign key (b) references t1(id) on delete cascade on update cascade") + tk.MustExec("alter table t2 cache;") + tk.MustExec("insert into t1 values (1),(2),(3),(4)") + tk.MustExec("insert into t2 values (1),(2),(3),(4)") + tk.MustGetDBError("insert into t2 values (5)", plannercore.ErrNoReferencedRow2) + tk.MustExec("update t1 set id = id+10 where id=1") + tk.MustExec("delete from t1 where id<10") + tk.MustQuery("select * from t1").Check(testkit.Rows("11")) + tk.MustQuery("select * from t2").Check(testkit.Rows("11")) + tk.MustExec("alter table t2 nocache;") + tk.MustExec("drop table t1,t2;") +} + +func TestForeignKeyAndConcurrentDDL(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@foreign_key_checks=1;") + tk.MustExec("use test") + // Test foreign key refer cache table. + tk.MustExec("create table t1 (a int, b int, c int, index(a), index(b), index(c));") + tk.MustExec("create table t2 (a int, b int, c int, index(a), index(b), index(c));") + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("set @@foreign_key_checks=1;") + tk2.MustExec("use test") + passCases := []struct { + prepare []string + ddl1 string + ddl2 string + }{ + { + ddl1: "alter table t2 add constraint fk_1 foreign key (a) references t1(a)", + ddl2: "alter table t2 add constraint fk_2 foreign key (b) references t1(b)", + }, + { + ddl1: "alter table t2 drop foreign key fk_1", + ddl2: "alter table t2 drop foreign key fk_2", + }, + { + prepare: []string{ + "alter table t2 drop index a", + }, + ddl1: "alter table t2 add index(a)", + ddl2: "alter table t2 add constraint fk_1 foreign key (a) references t1(a)", + }, + { + ddl1: "alter table t2 drop index c", + ddl2: "alter table t2 add constraint fk_2 foreign key (b) references t1(b)", + }, + } + for _, ca := range passCases { + var wg sync.WaitGroup + wg.Add(2) + go func() { + defer wg.Done() + tk.MustExec(ca.ddl1) + }() + go func() { + defer wg.Done() + tk2.MustExec(ca.ddl2) + }() + wg.Wait() + } + errorCases := []struct { + prepare []string + ddl1 string + err1 string + ddl2 string + err2 string + }{ + { + ddl1: "alter table t2 add constraint fk foreign key (a) references t1(a)", + err1: "[ddl:1826]Duplicate foreign key constraint name 'fk'", + ddl2: "alter table t2 add constraint fk foreign key (b) references t1(b)", + err2: "[ddl:1826]Duplicate foreign key constraint name 'fk'", + }, + { + prepare: []string{ + "alter table t2 add constraint fk_1 foreign key (a) references t1(a)", + }, + ddl1: "alter table t2 drop foreign key fk_1", + err1: "[schema:1091]Can't DROP 'fk_1'; check that column/key exists", + ddl2: "alter table t2 drop foreign key fk_1", + err2: "[schema:1091]Can't DROP 'fk_1'; check that column/key exists", + }, + { + ddl1: "alter table t2 drop index a", + err1: "[ddl:1553]Cannot drop index 'a': needed in a foreign key constraint", + ddl2: "alter table t2 add constraint fk_1 foreign key (a) references t1(a)", + err2: "[ddl:-1]Failed to add the foreign key constraint. Missing index for 'fk_1' foreign key columns in the table 't2'", + }, + } + tk.MustExec("drop table t1,t2") + tk.MustExec("create table t1 (a int, b int, c int, index(a), index(b), index(c));") + tk.MustExec("create table t2 (a int, b int, c int, index(a), index(b), index(c));") + for i, ca := range errorCases { + for _, sql := range ca.prepare { + tk.MustExec(sql) + } + var wg sync.WaitGroup + var err1, err2 error + wg.Add(2) + go func() { + defer wg.Done() + err1 = tk.ExecToErr(ca.ddl1) + }() + go func() { + defer wg.Done() + err2 = tk2.ExecToErr(ca.ddl2) + }() + wg.Wait() + if (err1 == nil && err2 == nil) || (err1 != nil && err2 != nil) { + require.Failf(t, "both ddl1 and ddl2 execute success, but expect 1 error", fmt.Sprintf("idx: %v, err1: %v, err2: %v", i, err1, err2)) + } + if err1 != nil { + require.Equal(t, ca.err1, err1.Error()) + } + if err2 != nil { + require.Equal(t, ca.err2, err2.Error()) + } + } +} + +func TestForeignKeyAndRenameIndex(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@foreign_key_checks=1;") + tk.MustExec("use test") + tk.MustExec("create table t1 (id int key, b int, index idx1(b));") + tk.MustExec("create table t2 (id int key, b int, constraint fk foreign key (b) references t1(b));") + tk.MustExec("insert into t1 values (1,1),(2,2)") + tk.MustExec("insert into t2 values (1,1),(2,2)") + tk.MustGetDBError("insert into t2 values (3,3)", plannercore.ErrNoReferencedRow2) + tk.MustGetDBError("delete from t1 where id=1", plannercore.ErrRowIsReferenced2) + tk.MustExec("alter table t1 rename index idx1 to idx2") + tk.MustExec("alter table t2 rename index fk to idx") + tk.MustGetDBError("insert into t2 values (3,3)", plannercore.ErrNoReferencedRow2) + tk.MustGetDBError("delete from t1 where id=1", plannercore.ErrRowIsReferenced2) + tk.MustExec("alter table t2 drop foreign key fk") + tk.MustExec("alter table t2 add foreign key fk (b) references t1(b) on delete cascade on update cascade") + tk.MustExec("alter table t1 rename index idx2 to idx3") + tk.MustExec("alter table t2 rename index idx to idx0") + tk.MustExec("delete from t1 where id=1") + tk.MustQuery("select * from t1").Check(testkit.Rows("2 2")) + tk.MustQuery("select * from t2").Check(testkit.Rows("2 2")) + tk.MustExec("admin check table t1,t2") +} diff --git a/ddl/fktest/main_test.go b/ddl/fktest/main_test.go new file mode 100644 index 0000000000000..36f34049a9d03 --- /dev/null +++ b/ddl/fktest/main_test.go @@ -0,0 +1,56 @@ +// 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, +// 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 ddl_test + +import ( + "testing" + "time" + + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/meta/autoid" + "github.com/pingcap/tidb/testkit/testsetup" + "github.com/tikv/client-go/v2/tikv" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + testsetup.SetupForCommonTest() + tikv.EnableFailpoints() + + domain.SchemaOutOfDateRetryInterval.Store(50 * time.Millisecond) + domain.SchemaOutOfDateRetryTimes.Store(50) + + autoid.SetStep(5000) + ddl.RunInGoTest = true + + config.UpdateGlobal(func(conf *config.Config) { + conf.Instance.SlowThreshold = 10000 + conf.TiKVClient.AsyncCommit.SafeWindow = 0 + conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 + conf.Experimental.AllowsExpressionIndex = true + }) + + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/txnkv/transaction.keepAlive"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } + + goleak.VerifyTestMain(m, opts...) +} diff --git a/ddl/foreign_key.go b/ddl/foreign_key.go index 6f1d02d464ac8..1a06719cb404b 100644 --- a/ddl/foreign_key.go +++ b/ddl/foreign_key.go @@ -44,6 +44,9 @@ func (w *worker) onCreateForeignKey(d *ddlCtx, t *meta.Meta, job *model.Job) (ve job.State = model.JobStateCancelled return ver, errors.Trace(err) } + if job.IsRollingback() { + return dropForeignKey(d, t, job, tblInfo, fkInfo.Name) + } switch job.SchemaState { case model.StateNone: err = checkAddForeignKeyValidInOwner(d, t, job.SchemaName, tblInfo, &fkInfo, fkCheck) @@ -63,7 +66,7 @@ func (w *worker) onCreateForeignKey(d *ddlCtx, t *meta.Meta, job *model.Job) (ve case model.StateWriteOnly: err = checkForeignKeyConstrain(w, job.SchemaName, tblInfo.Name.L, &fkInfo, fkCheck) if err != nil { - job.State = model.JobStateCancelled + job.State = model.JobStateRollingback return ver, err } tblInfo.ForeignKeys[len(tblInfo.ForeignKeys)-1].State = model.StateWriteReorganization @@ -94,29 +97,27 @@ func onDropForeignKey(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ err return ver, errors.Trace(err) } - var ( - fkName model.CIStr - found bool - fkInfo model.FKInfo - ) + var fkName model.CIStr err = job.DecodeArgs(&fkName) if err != nil { job.State = model.JobStateCancelled return ver, errors.Trace(err) } + return dropForeignKey(d, t, job, tblInfo, fkName) +} +func dropForeignKey(d *ddlCtx, t *meta.Meta, job *model.Job, tblInfo *model.TableInfo, fkName model.CIStr) (ver int64, err error) { + var fkInfo *model.FKInfo for _, fk := range tblInfo.ForeignKeys { if fk.Name.L == fkName.L { - found = true - fkInfo = *fk + fkInfo = fk + break } } - - if !found { + if fkInfo == nil { job.State = model.JobStateCancelled return ver, infoschema.ErrForeignKeyNotExists.GenWithStackByArgs(fkName) } - nfks := tblInfo.ForeignKeys[:0] for _, fk := range tblInfo.ForeignKeys { if fk.Name.L != fkName.L { @@ -124,24 +125,18 @@ func onDropForeignKey(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ err } } tblInfo.ForeignKeys = nfks - - originalState := fkInfo.State - switch fkInfo.State { - case model.StatePublic: - // We just support record the foreign key, so we just make it none. - // public -> none - fkInfo.State = model.StateNone - ver, err = updateVersionAndTableInfo(d, t, job, tblInfo, originalState != fkInfo.State) - if err != nil { - return ver, errors.Trace(err) - } - // Finish this job. + ver, err = updateVersionAndTableInfo(d, t, job, tblInfo, true) + if err != nil { + return ver, errors.Trace(err) + } + // Finish this job. + if job.IsRollingback() { + job.FinishTableJob(model.JobStateRollbackDone, model.StateNone, ver, tblInfo) + } else { job.FinishTableJob(model.JobStateDone, model.StateNone, ver, tblInfo) - job.SchemaState = fkInfo.State - return ver, nil - default: - return ver, dbterror.ErrInvalidDDLState.GenWithStackByArgs("foreign key", fkInfo.State) } + job.SchemaState = model.StateNone + return ver, err } func allocateFKIndexID(tblInfo *model.TableInfo) int64 { @@ -268,6 +263,12 @@ func checkTableForeignKey(referTblInfo, tblInfo *model.TableInfo, fkInfo *model. if referTblInfo.TempTableType != model.TempTableNone || tblInfo.TempTableType != model.TempTableNone { return infoschema.ErrCannotAddForeign } + if referTblInfo.TTLInfo != nil { + return dbterror.ErrUnsupportedTTLReferencedByFK + } + if referTblInfo.GetPartitionInfo() != nil || tblInfo.GetPartitionInfo() != nil { + return infoschema.ErrForeignKeyOnPartitioned + } // check refer columns in parent table. for i := range fkInfo.RefCols { @@ -293,7 +294,7 @@ func checkTableForeignKey(referTblInfo, tblInfo *model.TableInfo, fkInfo *model. } } // check refer columns should have index. - if model.FindIndexByColumns(referTblInfo, fkInfo.RefCols...) == nil { + if model.FindIndexByColumns(referTblInfo, referTblInfo.Indices, fkInfo.RefCols...) == nil { return infoschema.ErrForeignKeyNoIndexInParent.GenWithStackByArgs(fkInfo.Name, fkInfo.RefTable) } return nil @@ -662,7 +663,7 @@ func checkAddForeignKeyValidInOwner(d *ddlCtx, t *meta.Meta, schema string, tbIn return nil } } - if model.FindIndexByColumns(tbInfo, fk.Cols...) == nil { + if model.FindIndexByColumns(tbInfo, tbInfo.Indices, fk.Cols...) == nil { return errors.Errorf("Failed to add the foreign key constraint. Missing index for '%s' foreign key columns in the table '%s'", fk.Name, tbInfo.Name) } return nil @@ -676,7 +677,12 @@ func checkForeignKeyConstrain(w *worker, schema, table string, fkInfo *model.FKI if err != nil { return errors.Trace(err) } - defer w.sessPool.put(sctx) + originValue := sctx.GetSessionVars().OptimizerEnableNAAJ + sctx.GetSessionVars().OptimizerEnableNAAJ = true + defer func() { + sctx.GetSessionVars().OptimizerEnableNAAJ = originValue + w.sessPool.put(sctx) + }() var buf strings.Builder buf.WriteString("select 1 from %n.%n where ") @@ -711,7 +717,7 @@ func checkForeignKeyConstrain(w *worker, schema, table string, fkInfo *model.FKI } buf.WriteString(" from %n.%n ) limit 1") paramsList = append(paramsList, fkInfo.RefSchema.L, fkInfo.RefTable.L) - rows, _, err := sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(w.ctx, nil, buf.String(), paramsList...) + rows, _, err := sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(w.ctx, []sqlexec.OptionFuncAlias{sqlexec.ExecOptionUseCurSession}, buf.String(), paramsList...) if err != nil { return errors.Trace(err) } diff --git a/ddl/foreign_key_test.go b/ddl/foreign_key_test.go index a50fd80e03681..032adfb296120 100644 --- a/ddl/foreign_key_test.go +++ b/ddl/foreign_key_test.go @@ -15,9 +15,7 @@ package ddl_test import ( - "bytes" "context" - "fmt" "strings" "sync" "testing" @@ -25,17 +23,13 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/ddl" - "github.com/pingcap/tidb/domain" - "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/parser/auth" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/parser/model" - plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessiontxn" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/testkit" - "github.com/pingcap/tidb/util/dbterror" + "github.com/pingcap/tidb/types" "github.com/stretchr/testify/require" ) @@ -115,14 +109,24 @@ func TestForeignKey(t *testing.T) { testCreateSchema(t, testkit.NewTestKit(t, store).Session(), dom.DDL(), dbInfo) tblInfo, err := testTableInfo(store, "t", 3) require.NoError(t, err) - + tblInfo.Indices = append(tblInfo.Indices, &model.IndexInfo{ + ID: 1, + Name: model.NewCIStr("idx_fk"), + Table: model.NewCIStr("t"), + Columns: []*model.IndexColumn{{ + Name: model.NewCIStr("c1"), + Offset: 0, + Length: types.UnspecifiedLength, + }}, + State: model.StatePublic, + }) testCreateTable(t, testkit.NewTestKit(t, store).Session(), d, dbInfo, tblInfo) // fix data race var mu sync.Mutex checkOK := false var hookErr error - tc := &ddl.TestDDLCallback{} + tc := &callback.TestDDLCallback{} onJobUpdatedExportedFunc := func(job *model.Job) { if job.State != model.JobStateDone { return @@ -164,7 +168,7 @@ func TestForeignKey(t *testing.T) { checkOK = false mu.Unlock() // fix data race pr/#9491 - tc2 := &ddl.TestDDLCallback{} + tc2 := &callback.TestDDLCallback{} onJobUpdatedExportedFunc2 := func(job *model.Job) { if job.State != model.JobStateDone { return @@ -204,853 +208,6 @@ func TestForeignKey(t *testing.T) { require.NoError(t, err) } -func TestCreateTableWithForeignKeyMetaInfo(t *testing.T) { - store, dom := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@global.tidb_enable_foreign_key=1") - tk.MustExec("use test") - tk.MustExec("create table t1 (id int key, a int,b int as (a) virtual);") - tk.MustExec("create database test2") - tk.MustExec("use test2") - tk.MustExec("create table t2 (id int key, b int, foreign key fk_b(b) references test.t1(id) ON UPDATE RESTRICT ON DELETE CASCADE)") - tb1Info := getTableInfo(t, dom, "test", "t1") - tb2Info := getTableInfo(t, dom, "test2", "t2") - require.Equal(t, 1, len(dom.InfoSchema().GetTableReferredForeignKeys("test", "t1"))) - require.Equal(t, 0, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t2"))) - require.Equal(t, 0, len(tb1Info.ForeignKeys)) - tb1ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t1") - require.Equal(t, 1, len(tb1ReferredFKs)) - require.Equal(t, model.ReferredFKInfo{ - Cols: []model.CIStr{model.NewCIStr("id")}, - ChildSchema: model.NewCIStr("test2"), - ChildTable: model.NewCIStr("t2"), - ChildFKName: model.NewCIStr("fk_b"), - }, *tb1ReferredFKs[0]) - tb2ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test2", "t2") - require.Equal(t, 0, len(tb2ReferredFKs)) - require.Equal(t, 1, len(tb2Info.ForeignKeys)) - require.Equal(t, model.FKInfo{ - ID: 1, - Name: model.NewCIStr("fk_b"), - RefSchema: model.NewCIStr("test"), - RefTable: model.NewCIStr("t1"), - RefCols: []model.CIStr{model.NewCIStr("id")}, - Cols: []model.CIStr{model.NewCIStr("b")}, - OnDelete: 2, - OnUpdate: 1, - State: model.StatePublic, - Version: 1, - }, *tb2Info.ForeignKeys[0]) - // Auto create index for foreign key usage. - require.Equal(t, 1, len(tb2Info.Indices)) - require.Equal(t, "fk_b", tb2Info.Indices[0].Name.L) - require.Equal(t, "`test2`.`t2`, CONSTRAINT `fk_b` FOREIGN KEY (`b`) REFERENCES `test`.`t1` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT", tb2Info.ForeignKeys[0].String("test2", "t2")) - - tk.MustExec("create table t3 (id int, b int, index idx_b(b), foreign key fk_b(b) references t2(id) ON UPDATE SET NULL ON DELETE NO ACTION)") - tb2Info = getTableInfo(t, dom, "test2", "t2") - tb3Info := getTableInfo(t, dom, "test2", "t3") - require.Equal(t, 1, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t2"))) - require.Equal(t, 0, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t3"))) - require.Equal(t, 1, len(tb2Info.ForeignKeys)) - tb2ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test2", "t2") - require.Equal(t, 1, len(tb2ReferredFKs)) - require.Equal(t, model.ReferredFKInfo{ - Cols: []model.CIStr{model.NewCIStr("id")}, - ChildSchema: model.NewCIStr("test2"), - ChildTable: model.NewCIStr("t3"), - ChildFKName: model.NewCIStr("fk_b"), - }, *tb2ReferredFKs[0]) - tb3ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test2", "t3") - require.Equal(t, 0, len(tb3ReferredFKs)) - require.Equal(t, 1, len(tb3Info.ForeignKeys)) - require.Equal(t, model.FKInfo{ - ID: 1, - Name: model.NewCIStr("fk_b"), - RefSchema: model.NewCIStr("test2"), - RefTable: model.NewCIStr("t2"), - RefCols: []model.CIStr{model.NewCIStr("id")}, - Cols: []model.CIStr{model.NewCIStr("b")}, - OnDelete: 4, - OnUpdate: 3, - State: model.StatePublic, - Version: 1, - }, *tb3Info.ForeignKeys[0]) - require.Equal(t, 1, len(tb3Info.Indices)) - require.Equal(t, "idx_b", tb3Info.Indices[0].Name.L) - require.Equal(t, "`test2`.`t3`, CONSTRAINT `fk_b` FOREIGN KEY (`b`) REFERENCES `t2` (`id`) ON DELETE NO ACTION ON UPDATE SET NULL", tb3Info.ForeignKeys[0].String("test2", "t3")) - - tk.MustExec("create table t5 (id int key, a int, b int, foreign key (a) references t5(id));") - tb5Info := getTableInfo(t, dom, "test2", "t5") - require.Equal(t, 1, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t5"))) - require.Equal(t, 1, len(tb5Info.ForeignKeys)) - tb5ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test2", "t5") - require.Equal(t, 1, len(tb5ReferredFKs)) - require.Equal(t, model.ReferredFKInfo{ - Cols: []model.CIStr{model.NewCIStr("id")}, - ChildSchema: model.NewCIStr("test2"), - ChildTable: model.NewCIStr("t5"), - ChildFKName: model.NewCIStr("fk_1"), - }, *tb5ReferredFKs[0]) - require.Equal(t, model.FKInfo{ - ID: 1, - Name: model.NewCIStr("fk_1"), - RefSchema: model.NewCIStr("test2"), - RefTable: model.NewCIStr("t5"), - RefCols: []model.CIStr{model.NewCIStr("id")}, - Cols: []model.CIStr{model.NewCIStr("a")}, - State: model.StatePublic, - Version: 1, - }, *tb5Info.ForeignKeys[0]) - require.Equal(t, 1, len(tb5Info.Indices)) - require.Equal(t, "fk_1", tb5Info.Indices[0].Name.L) - require.Equal(t, 1, len(dom.InfoSchema().GetTableReferredForeignKeys("test", "t1"))) - require.Equal(t, 1, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t2"))) - require.Equal(t, 0, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t3"))) - require.Equal(t, 1, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t5"))) - - tk.MustExec("set @@global.tidb_enable_foreign_key=0") - tk.MustExec("drop database test2") - require.Equal(t, 0, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t2"))) - require.Equal(t, 0, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t3"))) - require.Equal(t, 0, len(dom.InfoSchema().GetTableReferredForeignKeys("test2", "t5"))) -} - -func TestCreateTableWithForeignKeyMetaInfo2(t *testing.T) { - store, dom := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@global.tidb_enable_foreign_key=1") - tk.MustExec("create database test2") - tk.MustExec("set @@foreign_key_checks=0") - tk.MustExec("use test2") - tk.MustExec("create table t2 (id int key, b int, foreign key fk_b(b) references test.t1(id) ON UPDATE RESTRICT ON DELETE CASCADE)") - tk.MustExec("use test") - tk.MustExec("create table t1 (id int key, a int, b int as (a) virtual);") - tb1Info := getTableInfo(t, dom, "test", "t1") - tb2Info := getTableInfo(t, dom, "test2", "t2") - require.Equal(t, 0, len(tb1Info.ForeignKeys)) - tb1ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t1") - require.Equal(t, 1, len(tb1ReferredFKs)) - require.Equal(t, model.ReferredFKInfo{ - Cols: []model.CIStr{model.NewCIStr("id")}, - ChildSchema: model.NewCIStr("test2"), - ChildTable: model.NewCIStr("t2"), - ChildFKName: model.NewCIStr("fk_b"), - }, *tb1ReferredFKs[0]) - tb2ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test2", "t2") - require.Equal(t, 0, len(tb2ReferredFKs)) - require.Equal(t, 1, len(tb2Info.ForeignKeys)) - require.Equal(t, model.FKInfo{ - ID: 1, - Name: model.NewCIStr("fk_b"), - RefSchema: model.NewCIStr("test"), - RefTable: model.NewCIStr("t1"), - RefCols: []model.CIStr{model.NewCIStr("id")}, - Cols: []model.CIStr{model.NewCIStr("b")}, - OnDelete: 2, - OnUpdate: 1, - State: model.StatePublic, - Version: 1, - }, *tb2Info.ForeignKeys[0]) - // Auto create index for foreign key usage. - require.Equal(t, 1, len(tb2Info.Indices)) - require.Equal(t, "fk_b", tb2Info.Indices[0].Name.L) - require.Equal(t, "`test2`.`t2`, CONSTRAINT `fk_b` FOREIGN KEY (`b`) REFERENCES `test`.`t1` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT", tb2Info.ForeignKeys[0].String("test2", "t2")) - - tk.MustExec("create table t3 (id int key, a int, foreign key fk_a(a) references test.t1(id) ON DELETE CASCADE ON UPDATE RESTRICT, foreign key fk_a2(a) references test2.t2(id))") - tb1Info = getTableInfo(t, dom, "test", "t1") - tb3Info := getTableInfo(t, dom, "test", "t3") - require.Equal(t, 0, len(tb1Info.ForeignKeys)) - tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") - require.Equal(t, 2, len(tb1ReferredFKs)) - require.Equal(t, model.ReferredFKInfo{ - Cols: []model.CIStr{model.NewCIStr("id")}, - ChildSchema: model.NewCIStr("test"), - ChildTable: model.NewCIStr("t3"), - ChildFKName: model.NewCIStr("fk_a"), - }, *tb1ReferredFKs[0]) - require.Equal(t, model.ReferredFKInfo{ - Cols: []model.CIStr{model.NewCIStr("id")}, - ChildSchema: model.NewCIStr("test2"), - ChildTable: model.NewCIStr("t2"), - ChildFKName: model.NewCIStr("fk_b"), - }, *tb1ReferredFKs[1]) - tb3ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t3") - require.Equal(t, 0, len(tb3ReferredFKs)) - require.Equal(t, 2, len(tb3Info.ForeignKeys)) - require.Equal(t, model.FKInfo{ - ID: 1, - Name: model.NewCIStr("fk_a"), - RefSchema: model.NewCIStr("test"), - RefTable: model.NewCIStr("t1"), - RefCols: []model.CIStr{model.NewCIStr("id")}, - Cols: []model.CIStr{model.NewCIStr("a")}, - OnDelete: 2, - OnUpdate: 1, - State: model.StatePublic, - Version: 1, - }, *tb3Info.ForeignKeys[0]) - require.Equal(t, model.FKInfo{ - ID: 2, - Name: model.NewCIStr("fk_a2"), - RefSchema: model.NewCIStr("test2"), - RefTable: model.NewCIStr("t2"), - RefCols: []model.CIStr{model.NewCIStr("id")}, - Cols: []model.CIStr{model.NewCIStr("a")}, - State: model.StatePublic, - Version: 1, - }, *tb3Info.ForeignKeys[1]) - // Auto create index for foreign key usage. - require.Equal(t, 1, len(tb3Info.Indices)) - require.Equal(t, "fk_a", tb3Info.Indices[0].Name.L) - require.Equal(t, "`test`.`t3`, CONSTRAINT `fk_a` FOREIGN KEY (`a`) REFERENCES `t1` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT", tb3Info.ForeignKeys[0].String("test", "t3")) - require.Equal(t, "`test`.`t3`, CONSTRAINT `fk_a2` FOREIGN KEY (`a`) REFERENCES `test2`.`t2` (`id`)", tb3Info.ForeignKeys[1].String("test", "t3")) - - tk.MustExec("set @@foreign_key_checks=0") - tk.MustExec("drop table test2.t2") - tb1Info = getTableInfo(t, dom, "test", "t1") - tb3Info = getTableInfo(t, dom, "test", "t3") - require.Equal(t, 0, len(tb1Info.ForeignKeys)) - tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") - require.Equal(t, 1, len(tb1ReferredFKs)) - require.Equal(t, model.ReferredFKInfo{ - Cols: []model.CIStr{model.NewCIStr("id")}, - ChildSchema: model.NewCIStr("test"), - ChildTable: model.NewCIStr("t3"), - ChildFKName: model.NewCIStr("fk_a"), - }, *tb1ReferredFKs[0]) - tb3ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t3") - require.Equal(t, 0, len(tb3ReferredFKs)) - require.Equal(t, 2, len(tb3Info.ForeignKeys)) - require.Equal(t, model.FKInfo{ - ID: 1, - Name: model.NewCIStr("fk_a"), - RefSchema: model.NewCIStr("test"), - RefTable: model.NewCIStr("t1"), - RefCols: []model.CIStr{model.NewCIStr("id")}, - Cols: []model.CIStr{model.NewCIStr("a")}, - OnDelete: 2, - OnUpdate: 1, - State: model.StatePublic, - Version: 1, - }, *tb3Info.ForeignKeys[0]) - require.Equal(t, model.FKInfo{ - ID: 2, - Name: model.NewCIStr("fk_a2"), - RefSchema: model.NewCIStr("test2"), - RefTable: model.NewCIStr("t2"), - RefCols: []model.CIStr{model.NewCIStr("id")}, - Cols: []model.CIStr{model.NewCIStr("a")}, - State: model.StatePublic, - Version: 1, - }, *tb3Info.ForeignKeys[1]) -} - -func TestCreateTableWithForeignKeyMetaInfo3(t *testing.T) { - store, dom := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@global.tidb_enable_foreign_key=1") - tk.MustExec("set @@foreign_key_checks=1") - tk.MustExec("use test") - tk.MustExec("create table t1 (id int key, a int, b int as (a) virtual);") - tk.MustExec("create table t2 (id int key, b int, foreign key fk_b(b) references test.t1(id))") - tk.MustExec("create table t3 (id int key, b int, foreign key fk_b(b) references test.t1(id))") - tk.MustExec("create table t4 (id int key, b int, foreign key fk_b(b) references test.t1(id))") - tb1ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t1") - tk.MustExec("drop table t3") - tk.MustExec("create table t5 (id int key, b int, foreign key fk_b(b) references test.t1(id))") - require.Equal(t, 3, len(tb1ReferredFKs)) - require.Equal(t, "t2", tb1ReferredFKs[0].ChildTable.L) - require.Equal(t, "t3", tb1ReferredFKs[1].ChildTable.L) - require.Equal(t, "t4", tb1ReferredFKs[2].ChildTable.L) -} - -func TestCreateTableWithForeignKeyPrivilegeCheck(t *testing.T) { - store, _ := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - - tk.MustExec("create user 'u1'@'%' identified by '';") - tk.MustExec("grant create on *.* to 'u1'@'%';") - tk.MustExec("create table t1 (id int key);") - - tk2 := testkit.NewTestKit(t, store) - tk2.MustExec("use test") - tk2.Session().Auth(&auth.UserIdentity{Username: "u1", Hostname: "localhost", CurrentUser: true, AuthUsername: "u1", AuthHostname: "%"}, nil, []byte("012345678901234567890")) - err := tk2.ExecToErr("create table t2 (a int, foreign key fk(a) references t1(id));") - require.Error(t, err) - require.Equal(t, "[planner:1142]REFERENCES command denied to user 'u1'@'%' for table 't1'", err.Error()) - - tk.MustExec("grant references on test.t1 to 'u1'@'%';") - tk2.MustExec("create table t2 (a int, foreign key fk(a) references t1(id));") - tk2.MustExec("create table t3 (id int key)") - err = tk2.ExecToErr("create table t4 (a int, foreign key fk(a) references t1(id), foreign key (a) references t3(id));") - require.Error(t, err) - require.Equal(t, "[planner:1142]REFERENCES command denied to user 'u1'@'%' for table 't3'", err.Error()) - - tk.MustExec("grant references on test.t3 to 'u1'@'%';") - tk2.MustExec("create table t4 (a int, foreign key fk(a) references t1(id), foreign key (a) references t3(id));") -} - -func TestRenameTableWithForeignKeyMetaInfo(t *testing.T) { - store, dom := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@global.tidb_enable_foreign_key=1") - tk.MustExec("create database test2") - tk.MustExec("create database test3") - tk.MustExec("use test") - tk.MustExec("create table t1 (id int key, a int, b int, foreign key fk(a) references t1(id))") - tk.MustExec("rename table test.t1 to test2.t2") - // check the schema diff - diff := getLatestSchemaDiff(t, tk) - require.Equal(t, model.ActionRenameTable, diff.Type) - require.Equal(t, 0, len(diff.AffectedOpts)) - tk.MustQuery("show create table test2.t2").Check(testkit.Rows("t2 CREATE TABLE `t2` (\n" + - " `id` int(11) NOT NULL,\n" + - " `a` int(11) DEFAULT NULL,\n" + - " `b` int(11) DEFAULT NULL,\n" + - " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,\n" + - " KEY `fk` (`a`),\n" + - " CONSTRAINT `fk` FOREIGN KEY (`a`) REFERENCES `test2`.`t2` (`id`)\n" + - ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) - tblInfo := getTableInfo(t, dom, "test2", "t2") - tbReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test2", "t2") - require.Equal(t, 1, len(tblInfo.ForeignKeys)) - require.Equal(t, 1, len(tbReferredFKs)) - require.Equal(t, model.ReferredFKInfo{ - Cols: []model.CIStr{model.NewCIStr("id")}, - ChildSchema: model.NewCIStr("test2"), - ChildTable: model.NewCIStr("t2"), - ChildFKName: model.NewCIStr("fk"), - }, *tbReferredFKs[0]) - require.Equal(t, model.FKInfo{ - ID: 1, - Name: model.NewCIStr("fk"), - RefSchema: model.NewCIStr("test2"), - RefTable: model.NewCIStr("t2"), - RefCols: []model.CIStr{model.NewCIStr("id")}, - Cols: []model.CIStr{model.NewCIStr("a")}, - State: model.StatePublic, - Version: 1, - }, *tblInfo.ForeignKeys[0]) - - tk.MustExec("drop table test2.t2") - tk.MustExec("use test") - tk.MustExec("create table t1 (id int key, a int, b int as (a) virtual);") - tk.MustExec("create table t2 (id int key, b int, foreign key fk_b(b) references test.t1(id))") - tk.MustExec("use test2") - tk.MustExec("rename table test.t2 to test2.tt2") - // check the schema diff - diff = getLatestSchemaDiff(t, tk) - require.Equal(t, model.ActionRenameTable, diff.Type) - require.Equal(t, 0, len(diff.AffectedOpts)) - tb1Info := getTableInfo(t, dom, "test", "t1") - tb2Info := getTableInfo(t, dom, "test2", "tt2") - require.Equal(t, 0, len(tb1Info.ForeignKeys)) - tb1ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t1") - require.Equal(t, 1, len(tb1ReferredFKs)) - require.Equal(t, model.ReferredFKInfo{ - Cols: []model.CIStr{model.NewCIStr("id")}, - ChildSchema: model.NewCIStr("test2"), - ChildTable: model.NewCIStr("tt2"), - ChildFKName: model.NewCIStr("fk_b"), - }, *tb1ReferredFKs[0]) - tb2ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test2", "tt2") - require.Equal(t, 0, len(tb2ReferredFKs)) - require.Equal(t, 1, len(tb2Info.ForeignKeys)) - require.Equal(t, model.FKInfo{ - ID: 1, - Name: model.NewCIStr("fk_b"), - RefSchema: model.NewCIStr("test"), - RefTable: model.NewCIStr("t1"), - RefCols: []model.CIStr{model.NewCIStr("id")}, - Cols: []model.CIStr{model.NewCIStr("b")}, - State: model.StatePublic, - Version: 1, - }, *tb2Info.ForeignKeys[0]) - // Auto create index for foreign key usage. - require.Equal(t, 1, len(tb2Info.Indices)) - require.Equal(t, "fk_b", tb2Info.Indices[0].Name.L) - require.Equal(t, "`test2`.`tt2`, CONSTRAINT `fk_b` FOREIGN KEY (`b`) REFERENCES `test`.`t1` (`id`)", tb2Info.ForeignKeys[0].String("test2", "tt2")) - - tk.MustExec("rename table test.t1 to test3.tt1") - tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test3", "tt1") - require.Equal(t, 1, len(tb1ReferredFKs)) - require.Equal(t, 1, len(tb1ReferredFKs[0].Cols)) - // check the schema diff - diff = getLatestSchemaDiff(t, tk) - require.Equal(t, model.ActionRenameTable, diff.Type) - require.Equal(t, 1, len(diff.AffectedOpts)) - require.Equal(t, model.ReferredFKInfo{ - Cols: []model.CIStr{model.NewCIStr("id")}, - ChildSchema: model.NewCIStr("test2"), - ChildTable: model.NewCIStr("tt2"), - ChildFKName: model.NewCIStr("fk_b"), - }, *tb1ReferredFKs[0]) - tbl2Info := getTableInfo(t, dom, "test2", "tt2") - tb2ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test2", "tt2") - require.Equal(t, 0, len(tb2ReferredFKs)) - require.Equal(t, 1, len(tbl2Info.ForeignKeys)) - require.Equal(t, model.FKInfo{ - ID: 1, - Name: model.NewCIStr("fk_b"), - RefSchema: model.NewCIStr("test3"), - RefTable: model.NewCIStr("tt1"), - RefCols: []model.CIStr{model.NewCIStr("id")}, - Cols: []model.CIStr{model.NewCIStr("b")}, - State: model.StatePublic, - Version: 1, - }, *tbl2Info.ForeignKeys[0]) - tk.MustQuery("show create table test2.tt2").Check(testkit.Rows("tt2 CREATE TABLE `tt2` (\n" + - " `id` int(11) NOT NULL,\n" + - " `b` int(11) DEFAULT NULL,\n" + - " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,\n" + - " KEY `fk_b` (`b`),\n" + - " CONSTRAINT `fk_b` FOREIGN KEY (`b`) REFERENCES `test3`.`tt1` (`id`)\n" + - ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) -} - -func TestCreateTableWithForeignKeyDML(t *testing.T) { - store, _ := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@global.tidb_enable_foreign_key=1") - tk.MustExec("use test") - tk.MustExec("create table t1 (id int key, a int);") - tk.MustExec("begin") - tk.MustExec("insert into t1 values (1, 1)") - tk.MustExec("update t1 set a = 2 where id = 1") - - tk2 := testkit.NewTestKit(t, store) - tk2.MustExec("use test") - tk2.MustExec("create table t2 (id int key, b int, foreign key fk_b(b) references test.t1(id))") - - tk.MustExec("commit") -} - -func TestCreateTableWithForeignKeyError(t *testing.T) { - store, _ := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@global.tidb_enable_foreign_key=1") - tk.MustExec("use test") - - cases := []struct { - prepare []string - refer string - create string - err string - }{ - { - refer: "create table t1 (id int, a int, b int);", - create: "create table t2 (a int, b int, foreign key fk_b(b) references T_unknown(b));", - err: "[schema:1824]Failed to open the referenced table 'T_unknown'", - }, - { - refer: "create table t1 (id int, a int, b int);", - create: "create table t2 (a int, b int, foreign key fk_b(b) references t1(c_unknown));", - err: "[schema:3734]Failed to add the foreign key constraint. Missing column 'c_unknown' for constraint 'fk_b' in the referenced table 't1'", - }, - { - refer: "create table t1 (id int key, a int, b int);", - create: "create table t2 (a int, b int, foreign key fk(c_unknown) references t1(id));", - err: "[ddl:1072]Key column 'c_unknown' doesn't exist in table", - }, - { - refer: "create table t1 (id int, a int, b int);", - create: "create table t2 (a int, b int, foreign key fk_b(b) references t1(b));", - err: "[schema:1822]Failed to add the foreign key constraint. Missing index for constraint 'fk_b' in the referenced table 't1'", - }, - { - refer: "create table t1 (id int, a int, b int not null, index(b));", - create: "create table t2 (a int, b int not null, foreign key fk_b(b) references t1(b) on update set null);", - err: "[schema:1830]Column 'b' cannot be NOT NULL: needed in a foreign key constraint 'fk_b' SET NULL", - }, - { - refer: "create table t1 (id int, a int, b int not null, index(b));", - create: "create table t2 (a int, b int not null, foreign key fk_b(b) references t1(b) on delete set null);", - err: "[schema:1830]Column 'b' cannot be NOT NULL: needed in a foreign key constraint 'fk_b' SET NULL", - }, - { - refer: "create table t1 (id int key, a int, b int as (a) virtual, index(b));", - create: "create table t2 (a int, b int, foreign key fk_b(b) references t1(b));", - err: "[schema:3733]Foreign key 'fk_b' uses virtual column 'b' which is not supported.", - }, - { - refer: "create table t1 (id int key, a int, b int, index(b));", - create: "create table t2 (a int, b int as (a) virtual, foreign key fk_b(b) references t1(b));", - err: "[schema:3733]Foreign key 'fk_b' uses virtual column 'b' which is not supported.", - }, - { - refer: "create table t1 (id int key, a int);", - create: "create table t2 (a int, b varchar(10), foreign key fk(b) references t1(id));", - err: "[ddl:3780]Referencing column 'b' and referenced column 'id' in foreign key constraint 'fk' are incompatible.", - }, - { - refer: "create table t1 (id int key, a int not null, index(a));", - create: "create table t2 (a int, b int unsigned, foreign key fk_b(b) references t1(a));", - err: "[ddl:3780]Referencing column 'b' and referenced column 'a' in foreign key constraint 'fk_b' are incompatible.", - }, - { - refer: "create table t1 (id int key, a bigint, index(a));", - create: "create table t2 (a int, b int, foreign key fk_b(b) references t1(a));", - err: "[ddl:3780]Referencing column 'b' and referenced column 'a' in foreign key constraint 'fk_b' are incompatible.", - }, - { - refer: "create table t1 (id int key, a varchar(10) charset utf8, index(a));", - create: "create table t2 (a int, b varchar(10) charset utf8mb4, foreign key fk_b(b) references t1(a));", - err: "[ddl:3780]Referencing column 'b' and referenced column 'a' in foreign key constraint 'fk_b' are incompatible.", - }, - { - refer: "create table t1 (id int key, a varchar(10) collate utf8_bin, index(a));", - create: "create table t2 (a int, b varchar(10) collate utf8mb4_bin, foreign key fk_b(b) references t1(a));", - err: "[ddl:3780]Referencing column 'b' and referenced column 'a' in foreign key constraint 'fk_b' are incompatible.", - }, - { - refer: "create table t1 (id int key, a varchar(10));", - create: "create table t2 (a int, b varchar(10), foreign key fk_b(b) references t1(a));", - err: "[schema:1822]Failed to add the foreign key constraint. Missing index for constraint 'fk_b' in the referenced table 't1'", - }, - { - refer: "create table t1 (id int key, a varchar(10), index (a(5)));", - create: "create table t2 (a int, b varchar(10), foreign key fk_b(b) references t1(a));", - err: "[schema:1822]Failed to add the foreign key constraint. Missing index for constraint 'fk_b' in the referenced table 't1'", - }, - { - refer: "create table t1 (id int key, a int, index(a));", - create: "create table t2 (a int, b int, foreign key fk_b(b) references t1(id, a));", - err: "[schema:1239]Incorrect foreign key definition for 'fk_b': Key reference and table reference don't match", - }, - { - create: "create table t2 (a int key, foreign key (a) references t2(a));", - err: "[schema:1215]Cannot add foreign key constraint", - }, - { - create: "create table t2 (a int, b int, index(a,b), index(b,a), foreign key (a,b) references t2(a,b));", - err: "[schema:1215]Cannot add foreign key constraint", - }, - { - create: "create table t2 (a int, b int, index(a,b), foreign key (a,b) references t2(b,a));", - err: "[schema:1822]Failed to add the foreign key constraint. Missing index for constraint 'fk_1' in the referenced table 't2'", - }, - { - prepare: []string{ - "set @@foreign_key_checks=0;", - "create table t2 (a int, b int, index(a), foreign key (a) references t1(id));", - }, - create: "create table t1 (id int, a int);", - err: "[schema:1822]Failed to add the foreign key constraint. Missing index for constraint 'fk_1' in the referenced table 't1'", - }, - { - prepare: []string{ - "set @@foreign_key_checks=0;", - "create table t2 (a int, b int, index(a), foreign key (a) references t1(id));", - }, - create: "create table t1 (id bigint key, a int);", - err: "[ddl:3780]Referencing column 'a' and referenced column 'id' in foreign key constraint 'fk_1' are incompatible.", - }, - { - // foreign key is not support in temporary table. - refer: "create temporary table t1 (id int key, b int, index(b))", - create: "create table t2 (a int, b int, foreign key fk(b) references t1(b))", - err: "[schema:1824]Failed to open the referenced table 't1'", - }, - { - // foreign key is not support in temporary table. - refer: "create global temporary table t1 (id int key, b int, index(b)) on commit delete rows", - create: "create table t2 (a int, b int, foreign key fk(b) references t1(b))", - err: "[schema:1215]Cannot add foreign key constraint", - }, - { - // foreign key is not support in temporary table. - refer: "create table t1 (id int key, b int, index(b))", - create: "create temporary table t2 (a int, b int, foreign key fk(b) references t1(b))", - err: "[schema:1215]Cannot add foreign key constraint", - }, - { - // foreign key is not support in temporary table. - refer: "create table t1 (id int key, b int, index(b))", - create: "create global temporary table t2 (a int, b int, foreign key fk(b) references t1(b)) on commit delete rows", - err: "[schema:1215]Cannot add foreign key constraint", - }, - { - create: "create table t1 (a int, foreign key ``(a) references t1(a));", - err: "[ddl:1280]Incorrect index name ''", - }, - { - create: "create table t1 (a int, constraint `` foreign key (a) references t1(a));", - err: "[ddl:1280]Incorrect index name ''", - }, - { - create: "create table t1 (a int, constraint `fk` foreign key (a,a) references t1(a, b));", - err: "[schema:1060]Duplicate column name 'a'", - }, - { - refer: "create table t1(a int, b int, index(a,b));", - create: "create table t2 (a int, b int, foreign key (a,b) references t1(a,a));", - err: "[schema:1822]Failed to add the foreign key constraint. Missing index for constraint 'fk_1' in the referenced table 't1'", - }, - { - refer: "create table t1 (id int key, b int, index(b))", - create: "create table t2 (a int, b int, index fk_1(a), foreign key (b) references t1(b));", - err: "[ddl:1061]duplicate key name fk_1", - }, - { - refer: "create table t1 (id int key);", - create: "create table t2 (id int key, foreign key name5678901234567890123456789012345678901234567890123456789012345(id) references t1(id));", - err: "[ddl:1059]Identifier name 'name5678901234567890123456789012345678901234567890123456789012345' is too long", - }, - { - refer: "create table t1 (id int key);", - create: "create table t2 (id int key, constraint name5678901234567890123456789012345678901234567890123456789012345 foreign key (id) references t1(id));", - err: "[ddl:1059]Identifier name 'name5678901234567890123456789012345678901234567890123456789012345' is too long", - }, - { - create: "create table t2 (id int key, constraint fk foreign key (id) references name5678901234567890123456789012345678901234567890123456789012345.t1(id));", - err: "[ddl:1059]Identifier name 'name5678901234567890123456789012345678901234567890123456789012345' is too long", - }, - { - prepare: []string{ - "set @@foreign_key_checks=0;", - }, - create: "create table t2 (id int key, constraint fk foreign key (id) references name5678901234567890123456789012345678901234567890123456789012345(id));", - err: "[ddl:1059]Identifier name 'name5678901234567890123456789012345678901234567890123456789012345' is too long", - }, - { - prepare: []string{ - "set @@foreign_key_checks=0;", - }, - create: "create table t2 (id int key, constraint fk foreign key (id) references t1(name5678901234567890123456789012345678901234567890123456789012345));", - err: "[ddl:1059]Identifier name 'name5678901234567890123456789012345678901234567890123456789012345' is too long", - }, - } - for _, ca := range cases { - tk.MustExec("drop table if exists t2") - tk.MustExec("drop table if exists t1") - tk.MustExec("set @@foreign_key_checks=1") - for _, sql := range ca.prepare { - tk.MustExec(sql) - } - if ca.refer != "" { - tk.MustExec(ca.refer) - } - err := tk.ExecToErr(ca.create) - require.Error(t, err, ca.create) - require.Equal(t, ca.err, err.Error(), ca.create) - } - - passCases := [][]string{ - { - "create table t1 (id int key, a int, b int, foreign key fk(a) references t1(id))", - }, - { - "create table t1 (id int key, b int not null, index(b))", - "create table t2 (a int, b int, foreign key fk_b(b) references t1(b));", - }, - { - "create table t1 (id int key, a varchar(10), index(a));", - "create table t2 (a int, b varchar(20), foreign key fk_b(b) references t1(a));", - }, - { - "create table t1 (id int key, a decimal(10,5), index(a));", - "create table t2 (a int, b decimal(20, 10), foreign key fk_b(b) references t1(a));", - }, - { - "create table t1 (id int key, a varchar(10), index (a(10)));", - "create table t2 (a int, b varchar(20), foreign key fk_b(b) references t1(a));", - }, - { - "set @@foreign_key_checks=0;", - "create table t2 (a int, b int, foreign key fk_b(b) references t_unknown(b));", - "set @@foreign_key_checks=1;", - }, - { - "create table t2 (a int, b int, index(a,b), index(b,a), foreign key (a,b) references t2(b,a));", - }, - { - "create table t1 (a int key, b int, index(b))", - "create table t2 (a int, b int, foreign key (a) references t1(a), foreign key (b) references t1(b));", - }, - { - "create table t1 (id int key);", - "create table t2 (id int key, foreign key name567890123456789012345678901234567890123456789012345678901234(id) references t1(id));", - }, - } - for _, ca := range passCases { - tk.MustExec("drop table if exists t2") - tk.MustExec("drop table if exists t1") - for _, sql := range ca { - tk.MustExec(sql) - } - } -} - -func TestModifyColumnWithForeignKey(t *testing.T) { - store, _ := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@global.tidb_enable_foreign_key=1") - tk.MustExec("set @@foreign_key_checks=1;") - tk.MustExec("use test") - - tk.MustExec("create table t1 (id int key, b varchar(10), index(b));") - tk.MustExec("create table t2 (a varchar(10), constraint fk foreign key (a) references t1(b));") - tk.MustExec("insert into t1 values (1, '123456789');") - tk.MustExec("insert into t2 values ('123456789');") - tk.MustGetErrMsg("alter table t1 modify column b varchar(5);", "[ddl:1833]Cannot change column 'b': used in a foreign key constraint 'fk' of table 'test.t2'") - tk.MustGetErrMsg("alter table t1 modify column b bigint;", "[ddl:3780]Referencing column 'a' and referenced column 'b' in foreign key constraint 'fk' are incompatible.") - tk.MustExec("alter table t1 modify column b varchar(20);") - tk.MustGetErrMsg("alter table t1 modify column b varchar(10);", "[ddl:1833]Cannot change column 'b': used in a foreign key constraint 'fk' of table 'test.t2'") - tk.MustExec("alter table t2 modify column a varchar(20);") - tk.MustExec("alter table t2 modify column a varchar(21);") - tk.MustGetErrMsg("alter table t2 modify column a varchar(5);", "[ddl:1832]Cannot change column 'a': used in a foreign key constraint 'fk'") - tk.MustGetErrMsg("alter table t2 modify column a bigint;", "[ddl:3780]Referencing column 'a' and referenced column 'b' in foreign key constraint 'fk' are incompatible.") - - tk.MustExec("drop table t2") - tk.MustExec("drop table t1") - tk.MustExec("create table t1 (id int key, b decimal(10, 5), index(b));") - tk.MustExec("create table t2 (a decimal(10, 5), constraint fk foreign key (a) references t1(b));") - tk.MustExec("insert into t1 values (1, 12345.67891);") - tk.MustExec("insert into t2 values (12345.67891);") - tk.MustGetErrMsg("alter table t1 modify column b decimal(10, 6);", "[ddl:1833]Cannot change column 'b': used in a foreign key constraint 'fk' of table 'test.t2'") - tk.MustGetErrMsg("alter table t1 modify column b decimal(10, 3);", "[ddl:1833]Cannot change column 'b': used in a foreign key constraint 'fk' of table 'test.t2'") - tk.MustGetErrMsg("alter table t1 modify column b decimal(5, 2);", "[ddl:1833]Cannot change column 'b': used in a foreign key constraint 'fk' of table 'test.t2'") - tk.MustGetErrMsg("alter table t1 modify column b decimal(20, 10);", "[ddl:1833]Cannot change column 'b': used in a foreign key constraint 'fk' of table 'test.t2'") - tk.MustGetErrMsg("alter table t2 modify column a decimal(30, 15);", "[ddl:1832]Cannot change column 'a': used in a foreign key constraint 'fk'") - tk.MustGetErrMsg("alter table t2 modify column a decimal(5, 2);", "[ddl:1832]Cannot change column 'a': used in a foreign key constraint 'fk'") -} - -func TestDropChildTableForeignKeyMetaInfo(t *testing.T) { - store, dom := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@global.tidb_enable_foreign_key=1") - tk.MustExec("use test") - tk.MustExec("create table t1 (id int key, a int, b int, CONSTRAINT fk foreign key (a) references t1(id))") - tb1ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t1") - require.Equal(t, 1, len(tb1ReferredFKs)) - tk.MustExec("drop table t1") - tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") - require.Equal(t, 0, len(tb1ReferredFKs)) - - tk.MustExec("create table t1 (id int key, b int, index(b))") - tk.MustExec("create table t2 (a int, b int, foreign key fk (a) references t1(b));") - tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") - require.Equal(t, 1, len(tb1ReferredFKs)) - tk.MustExec("drop table t2") - tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") - require.Equal(t, 0, len(tb1ReferredFKs)) -} - -func TestDropForeignKeyMetaInfo(t *testing.T) { - store, dom := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@global.tidb_enable_foreign_key=1") - tk.MustExec("use test") - tk.MustExec("create table t1 (id int key, a int, b int, CONSTRAINT fk foreign key (a) references t1(id))") - tb1ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t1") - require.Equal(t, 1, len(tb1ReferredFKs)) - tk.MustExec("alter table t1 drop foreign key fk") - tbl1Info := getTableInfo(t, dom, "test", "t1") - tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") - require.Equal(t, 0, len(tbl1Info.ForeignKeys)) - require.Equal(t, 0, len(tb1ReferredFKs)) - - tk.MustExec("drop table t1") - tk.MustExec("create table t1 (id int key, b int, index(b))") - tk.MustExec("create table t2 (a int, b int, foreign key fk (a) references t1(b));") - tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") - require.Equal(t, 1, len(tb1ReferredFKs)) - tk.MustExec("alter table t2 drop foreign key fk") - tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") - require.Equal(t, 0, len(tb1ReferredFKs)) - tbl2Info := getTableInfo(t, dom, "test", "t2") - require.Equal(t, 0, len(tbl2Info.ForeignKeys)) -} - -func TestTruncateOrDropTableWithForeignKeyReferred(t *testing.T) { - store, _ := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@global.tidb_enable_foreign_key=1") - tk.MustExec("use test") - - cases := []struct { - prepares []string - tbl string - truncateErr string - dropErr string - }{ - { - prepares: []string{ - "create table t1 (id int key, b int not null, index(b))", - "create table t2 (a int, b int, foreign key fk_b(b) references t1(b));", - }, - tbl: "t1", - truncateErr: "[ddl:1701]Cannot truncate a table referenced in a foreign key constraint (`test`.`t2` CONSTRAINT `fk_b`)", - dropErr: "[ddl:3730]Cannot drop table 't1' referenced by a foreign key constraint 'fk_b' on table 't2'.", - }, - { - prepares: []string{ - "create table t1 (id int key, a varchar(10), index(a));", - "create table t2 (a int, b varchar(20), foreign key fk_b(b) references t1(a));", - }, - tbl: "t1", - truncateErr: "[ddl:1701]Cannot truncate a table referenced in a foreign key constraint (`test`.`t2` CONSTRAINT `fk_b`)", - dropErr: "[ddl:3730]Cannot drop table 't1' referenced by a foreign key constraint 'fk_b' on table 't2'.", - }, - { - prepares: []string{ - "create table t1 (id int key, a varchar(10), index (a(10)));", - "create table t2 (a int, b varchar(20), foreign key fk_b(b) references t1(a));", - }, - tbl: "t1", - truncateErr: "[ddl:1701]Cannot truncate a table referenced in a foreign key constraint (`test`.`t2` CONSTRAINT `fk_b`)", - dropErr: "[ddl:3730]Cannot drop table 't1' referenced by a foreign key constraint 'fk_b' on table 't2'.", - }, - } - - for _, ca := range cases { - tk.MustExec("drop table if exists t2") - tk.MustExec("drop table if exists t1") - for _, sql := range ca.prepares { - tk.MustExec(sql) - } - truncateSQL := fmt.Sprintf("truncate table %v", ca.tbl) - tk.MustExec("set @@foreign_key_checks=1;") - err := tk.ExecToErr(truncateSQL) - require.Error(t, err) - require.Equal(t, ca.truncateErr, err.Error()) - dropSQL := fmt.Sprintf("drop table %v", ca.tbl) - err = tk.ExecToErr(dropSQL) - require.Error(t, err) - require.Equal(t, ca.dropErr, err.Error()) - - tk.MustExec("set @@foreign_key_checks=0;") - tk.MustExec(truncateSQL) - } - passCases := [][]string{ - { - "create table t1 (id int key, a int, b int, foreign key fk(a) references t1(id))", - "truncate table t1", - "drop table t1", - }, - { - "create table t1 (id int key, a varchar(10), index (a(10)));", - "create table t2 (a int, b varchar(20), foreign key fk_b(b) references t1(a));", - "drop table t1, t2", - }, - { - "set @@foreign_key_checks=0;", - "create table t1 (id int key, a varchar(10), index (a(10)));", - "create table t2 (a int, b varchar(20), foreign key fk_b(b) references t1(a));", - "truncate table t1", - "drop table t1", - }, - } - for _, ca := range passCases { - tk.MustExec("drop table if exists t1, t2") - tk.MustExec("set @@foreign_key_checks=1;") - for _, sql := range ca { - tk.MustExec(sql) - } - } -} - func TestTruncateOrDropTableWithForeignKeyReferred2(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomainWithSchemaLease(t, testLease) d := dom.DDL() @@ -1068,7 +225,7 @@ func TestTruncateOrDropTableWithForeignKeyReferred2(t *testing.T) { var wg sync.WaitGroup var truncateErr, dropErr error testTruncate := true - tc := &ddl.TestDDLCallback{} + tc := &callback.TestDDLCallback{} tc.OnJobRunBeforeExported = func(job *model.Job) { if job.SchemaState != model.StateNone { return @@ -1108,106 +265,6 @@ func TestTruncateOrDropTableWithForeignKeyReferred2(t *testing.T) { require.Equal(t, "[ddl:1701]Cannot truncate a table referenced in a foreign key constraint (`test`.`t2` CONSTRAINT `fk`)", dropErr.Error()) } -func TestDropTableWithForeignKeyReferred(t *testing.T) { - store, _ := testkit.CreateMockStoreAndDomainWithSchemaLease(t, testLease) - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@global.tidb_enable_foreign_key=1") - tk.MustExec("set @@foreign_key_checks=1;") - tk.MustExec("use test") - - tk.MustExec("create table t1 (id int key, b int, index(b));") - tk.MustExec("create table t2 (id int key, b int, foreign key fk_b(b) references t1(id));") - tk.MustExec("create table t3 (id int key, b int, foreign key fk_b(b) references t2(id));") - err := tk.ExecToErr("drop table if exists t1,t2;") - require.Error(t, err) - require.Equal(t, "[ddl:3730]Cannot drop table 't2' referenced by a foreign key constraint 'fk_b' on table 't3'.", err.Error()) - tk.MustQuery("show tables").Check(testkit.Rows("t1", "t2", "t3")) -} - -func TestDropIndexNeededInForeignKey(t *testing.T) { - store, _ := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@global.tidb_enable_foreign_key=1") - tk.MustExec("set @@foreign_key_checks=1") - tk.MustExec("use test") - - cases := []struct { - prepares []string - drops []string - err string - }{ - { - prepares: []string{ - "create table t1 (id int key, b int, index idx (b))", - "create table t2 (a int, b int, index idx (b), foreign key fk_b(b) references t1(b));", - }, - drops: []string{ - "alter table t1 drop index idx", - "alter table t2 drop index idx", - }, - err: "[ddl:1553]Cannot drop index 'idx': needed in a foreign key constraint", - }, - { - prepares: []string{ - "create table t1 (id int, b int, index idx (id, b))", - "create table t2 (a int, b int, index idx (b, a), foreign key fk_b(b) references t1(id));", - }, - drops: []string{ - "alter table t1 drop index idx", - "alter table t2 drop index idx", - }, - err: "[ddl:1553]Cannot drop index 'idx': needed in a foreign key constraint", - }, - } - - for _, ca := range cases { - tk.MustExec("drop table if exists t2") - tk.MustExec("drop table if exists t1") - for _, sql := range ca.prepares { - tk.MustExec(sql) - } - for _, drop := range ca.drops { - // even disable foreign key check, still can't drop the index used by foreign key. - tk.MustExec("set @@foreign_key_checks=0;") - err := tk.ExecToErr(drop) - require.Error(t, err) - require.Equal(t, ca.err, err.Error()) - tk.MustExec("set @@foreign_key_checks=1;") - err = tk.ExecToErr(drop) - require.Error(t, err) - require.Equal(t, ca.err, err.Error()) - } - } - passCases := [][]string{ - { - "create table t1 (id int key, b int, index idxb (b))", - "create table t2 (a int, b int key, index idxa (a),index idxb (b), foreign key fk_b(b) references t1(id));", - "alter table t1 drop index idxb", - "alter table t2 drop index idxa", - "alter table t2 drop index idxb", - }, - { - "create table t1 (id int key, b int, index idxb (b), unique index idx(b, id))", - "create table t2 (a int, b int key, index idx (b, a),index idxb (b), index idxab(a, b), foreign key fk_b(b) references t1(b));", - "alter table t1 drop index idxb", - "alter table t1 add index idxb (b)", - "alter table t1 drop index idx", - "alter table t2 drop index idx", - "alter table t2 add index idx (b, a)", - "alter table t2 drop index idxb", - "alter table t2 drop index idxab", - }, - } - tk.MustExec("set @@foreign_key_checks=1;") - for _, ca := range passCases { - tk.MustExec("drop table if exists t2") - tk.MustExec("drop table if exists t1") - for _, sql := range ca { - tk.MustExec(sql) - } - } -} - func TestDropIndexNeededInForeignKey2(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomainWithSchemaLease(t, testLease) d := dom.DDL() @@ -1224,7 +281,7 @@ func TestDropIndexNeededInForeignKey2(t *testing.T) { var wg sync.WaitGroup var dropErr error - tc := &ddl.TestDDLCallback{} + tc := &callback.TestDDLCallback{} tc.OnJobRunBeforeExported = func(job *model.Job) { if job.SchemaState != model.StatePublic || job.Type != model.ActionDropIndex { return @@ -1247,157 +304,6 @@ func TestDropIndexNeededInForeignKey2(t *testing.T) { require.Equal(t, "[ddl:1553]Cannot drop index 'idx2': needed in a foreign key constraint", dropErr.Error()) } -func getTableInfo(t *testing.T, dom *domain.Domain, db, tb string) *model.TableInfo { - err := dom.Reload() - require.NoError(t, err) - is := dom.InfoSchema() - tbl, err := is.TableByName(model.NewCIStr(db), model.NewCIStr(tb)) - require.NoError(t, err) - _, exist := is.TableByID(tbl.Meta().ID) - require.True(t, exist) - return tbl.Meta() -} - -func getTableInfoReferredForeignKeys(t *testing.T, dom *domain.Domain, db, tb string) []*model.ReferredFKInfo { - err := dom.Reload() - require.NoError(t, err) - return dom.InfoSchema().GetTableReferredForeignKeys(db, tb) -} - -func TestDropColumnWithForeignKey(t *testing.T) { - store, _ := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@global.tidb_enable_foreign_key=1") - tk.MustExec("set @@foreign_key_checks=1;") - tk.MustExec("use test") - - tk.MustExec("create table t1 (id int key, a int, b int, index(b), CONSTRAINT fk foreign key (a) references t1(b))") - tk.MustGetErrMsg("alter table t1 drop column a;", "[ddl:1828]Cannot drop column 'a': needed in a foreign key constraint 'fk'") - tk.MustGetErrMsg("alter table t1 drop column b;", "[ddl:1829]Cannot drop column 'b': needed in a foreign key constraint 'fk' of table 't1'") - - tk.MustExec("drop table t1") - tk.MustExec("create table t1 (id int key, b int, index(b));") - tk.MustExec("create table t2 (a int, b int, constraint fk foreign key (a) references t1(b));") - tk.MustGetErrMsg("alter table t1 drop column b;", "[ddl:1829]Cannot drop column 'b': needed in a foreign key constraint 'fk' of table 't2'") - tk.MustGetErrMsg("alter table t2 drop column a;", "[ddl:1828]Cannot drop column 'a': needed in a foreign key constraint 'fk'") -} - -func TestRenameColumnWithForeignKeyMetaInfo(t *testing.T) { - store, dom := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@global.tidb_enable_foreign_key=1") - tk.MustExec("set @@foreign_key_checks=1;") - tk.MustExec("use test") - - tk.MustExec("create table t1 (id int key, a int, b int, foreign key fk(a) references t1(id))") - tk.MustExec("alter table t1 change id kid int") - tk.MustExec("alter table t1 rename column a to aa") - tbl1Info := getTableInfo(t, dom, "test", "t1") - tb1ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t1") - require.Equal(t, 1, len(tbl1Info.ForeignKeys)) - require.Equal(t, 1, len(tb1ReferredFKs)) - require.Equal(t, "kid", tb1ReferredFKs[0].Cols[0].L) - require.Equal(t, "kid", tbl1Info.ForeignKeys[0].RefCols[0].L) - require.Equal(t, "aa", tbl1Info.ForeignKeys[0].Cols[0].L) - - tk.MustExec("drop table t1") - tk.MustExec("create table t1 (id int key, b int, index(b))") - tk.MustExec("create table t2 (a int, b int, foreign key fk(a) references t1(b));") - tk.MustExec("alter table t2 change a aa int") - tbl1Info = getTableInfo(t, dom, "test", "t1") - tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") - require.Equal(t, 1, len(tb1ReferredFKs)) - require.Equal(t, 1, len(tb1ReferredFKs[0].Cols)) - require.Equal(t, "b", tb1ReferredFKs[0].Cols[0].L) - tbl2Info := getTableInfo(t, dom, "test", "t2") - tb2ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t2") - require.Equal(t, 0, len(tb2ReferredFKs)) - require.Equal(t, 1, len(tbl2Info.ForeignKeys)) - require.Equal(t, 1, len(tbl2Info.ForeignKeys[0].Cols)) - require.Equal(t, 1, len(tbl2Info.ForeignKeys[0].RefCols)) - require.Equal(t, "aa", tbl2Info.ForeignKeys[0].Cols[0].L) - require.Equal(t, "b", tbl2Info.ForeignKeys[0].RefCols[0].L) - - tk.MustExec("alter table t1 change id kid int") - tk.MustExec("alter table t1 change b bb int") - tbl1Info = getTableInfo(t, dom, "test", "t1") - tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") - require.Equal(t, 1, len(tb1ReferredFKs)) - require.Equal(t, 1, len(tb1ReferredFKs[0].Cols)) - require.Equal(t, "bb", tb1ReferredFKs[0].Cols[0].L) - tbl2Info = getTableInfo(t, dom, "test", "t2") - tb2ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t2") - require.Equal(t, 0, len(tb2ReferredFKs)) - require.Equal(t, 1, len(tbl2Info.ForeignKeys)) - require.Equal(t, 1, len(tbl2Info.ForeignKeys[0].Cols)) - require.Equal(t, 1, len(tbl2Info.ForeignKeys[0].RefCols)) - require.Equal(t, "aa", tbl2Info.ForeignKeys[0].Cols[0].L) - require.Equal(t, "bb", tbl2Info.ForeignKeys[0].RefCols[0].L) - - tk.MustExec("drop table t1, t2") - tk.MustExec("create table t1 (id int key, b int, index(b))") - tk.MustExec("create table t2 (a int, b int, foreign key (a) references t1(b), foreign key (b) references t1(b));") - tk.MustExec("alter table t1 change b bb int") - tbl1Info = getTableInfo(t, dom, "test", "t1") - tb1ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t1") - require.Equal(t, 2, len(tb1ReferredFKs)) - require.Equal(t, 1, len(tb1ReferredFKs[0].Cols)) - require.Equal(t, 1, len(tb1ReferredFKs[1].Cols)) - require.Equal(t, "bb", tb1ReferredFKs[0].Cols[0].L) - require.Equal(t, "bb", tb1ReferredFKs[1].Cols[0].L) - tbl2Info = getTableInfo(t, dom, "test", "t2") - tb2ReferredFKs = getTableInfoReferredForeignKeys(t, dom, "test", "t2") - require.Equal(t, 0, len(tb2ReferredFKs)) - require.Equal(t, 2, len(tbl2Info.ForeignKeys)) - require.Equal(t, 1, len(tbl2Info.ForeignKeys[0].Cols)) - require.Equal(t, 1, len(tbl2Info.ForeignKeys[0].RefCols)) - require.Equal(t, "a", tbl2Info.ForeignKeys[0].Cols[0].L) - require.Equal(t, "bb", tbl2Info.ForeignKeys[0].RefCols[0].L) - require.Equal(t, 1, len(tbl2Info.ForeignKeys[1].Cols)) - require.Equal(t, 1, len(tbl2Info.ForeignKeys[1].RefCols)) - require.Equal(t, "b", tbl2Info.ForeignKeys[1].Cols[0].L) - require.Equal(t, "bb", tbl2Info.ForeignKeys[1].RefCols[0].L) - tk.MustExec("alter table t2 rename column a to aa") - tk.MustExec("alter table t2 change b bb int") - tk.MustQuery("show create table t2"). - Check(testkit.Rows("t2 CREATE TABLE `t2` (\n" + - " `aa` int(11) DEFAULT NULL,\n" + - " `bb` int(11) DEFAULT NULL,\n" + - " KEY `fk_1` (`aa`),\n KEY `fk_2` (`bb`),\n" + - " CONSTRAINT `fk_1` FOREIGN KEY (`aa`) REFERENCES `test`.`t1` (`bb`),\n" + - " CONSTRAINT `fk_2` FOREIGN KEY (`bb`) REFERENCES `test`.`t1` (`bb`)\n" + - ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) -} - -func TestDropDatabaseWithForeignKeyReferred(t *testing.T) { - store, _ := testkit.CreateMockStoreAndDomainWithSchemaLease(t, testLease) - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@global.tidb_enable_foreign_key=1") - tk.MustExec("set @@foreign_key_checks=1;") - tk.MustExec("use test") - - tk.MustExec("create table t1 (id int key, b int, index(b));") - tk.MustExec("create table t2 (id int key, b int, foreign key fk_b(b) references t1(id));") - tk.MustExec("create database test2") - tk.MustExec("create table test2.t3 (id int key, b int, foreign key fk_b(b) references test.t2(id));") - err := tk.ExecToErr("drop database test;") - require.Error(t, err) - require.Equal(t, "[ddl:3730]Cannot drop table 't2' referenced by a foreign key constraint 'fk_b' on table 't3'.", err.Error()) - tk.MustExec("set @@foreign_key_checks=0;") - tk.MustExec("drop database test") - - tk.MustExec("set @@foreign_key_checks=1;") - tk.MustExec("create database test") - tk.MustExec("use test") - tk.MustExec("create table t1 (id int key, b int, index(b));") - tk.MustExec("create table t2 (id int key, b int, foreign key fk_b(b) references t1(id));") - err = tk.ExecToErr("drop database test;") - require.Error(t, err) - require.Equal(t, "[ddl:3730]Cannot drop table 't2' referenced by a foreign key constraint 'fk_b' on table 't3'.", err.Error()) - tk.MustExec("drop table test2.t3") - tk.MustExec("drop database test") -} - func TestDropDatabaseWithForeignKeyReferred2(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomainWithSchemaLease(t, testLease) d := dom.DDL() @@ -1414,7 +320,7 @@ func TestDropDatabaseWithForeignKeyReferred2(t *testing.T) { tk.MustExec("create database test2") var wg sync.WaitGroup var dropErr error - tc := &ddl.TestDDLCallback{} + tc := &callback.TestDDLCallback{} tc.OnJobRunBeforeExported = func(job *model.Job) { if job.SchemaState != model.StateNone { return @@ -1442,79 +348,6 @@ func TestDropDatabaseWithForeignKeyReferred2(t *testing.T) { tk.MustExec("drop database test") } -func TestAddForeignKey(t *testing.T) { - store, dom := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@global.tidb_enable_foreign_key=1") - tk.MustExec("set @@foreign_key_checks=1;") - tk.MustExec("use test") - tk.MustExec("create table t1 (id int key, b int);") - tk.MustExec("create table t2 (id int key, b int);") - tk.MustExec("alter table t2 add index(b)") - tk.MustExec("alter table t2 add foreign key (b) references t1(id);") - tbl2Info := getTableInfo(t, dom, "test", "t2") - require.Equal(t, int64(1), tbl2Info.MaxForeignKeyID) - tk.MustGetDBError("alter table t2 add foreign key (b) references t1(b);", infoschema.ErrForeignKeyNoIndexInParent) - tk.MustExec("alter table t1 add index(b)") - tk.MustExec("alter table t2 add foreign key (b) references t1(b);") - tk.MustGetDBError("alter table t2 add foreign key (b) references t2(b);", infoschema.ErrCannotAddForeign) - // Test auto-create index when create foreign key constraint. - tk.MustExec("drop table if exists t1,t2") - tk.MustExec("create table t1 (id int key, b int, index(b));") - tk.MustExec("create table t2 (id int key, b int);") - tk.MustExec("alter table t2 add constraint fk foreign key (b) references t1(b);") - tbl2Info = getTableInfo(t, dom, "test", "t2") - require.Equal(t, 1, len(tbl2Info.Indices)) - require.Equal(t, "fk", tbl2Info.Indices[0].Name.L) - require.Equal(t, model.StatePublic, tbl2Info.Indices[0].State) - tk.MustQuery("select b from t2 use index(fk)").Check(testkit.Rows()) - res := tk.MustQuery("explain select b from t2 use index(fk)") - plan := bytes.NewBuffer(nil) - rows := res.Rows() - for _, row := range rows { - for _, c := range row { - plan.WriteString(c.(string)) - plan.WriteString(" ") - } - } - require.Regexp(t, ".*IndexReader.*index:fk.*", plan.String()) - - // Test add multiple foreign key constraint in one statement. - tk.MustExec("alter table t2 add column c int, add column d int, add column e int;") - tk.MustExec("alter table t2 add index idx_c(c, d, e)") - tk.MustExec("alter table t2 add constraint fk_c foreign key (c) references t1(b), " + - "add constraint fk_d foreign key (d) references t1(b)," + - "add constraint fk_e foreign key (e) references t1(b)") - tbl2Info = getTableInfo(t, dom, "test", "t2") - require.Equal(t, 4, len(tbl2Info.Indices)) - names := []string{"fk", "idx_c", "fk_d", "fk_e"} - for i, idx := range tbl2Info.Indices { - require.Equal(t, names[i], idx.Name.L) - require.Equal(t, model.StatePublic, idx.State) - } - names = []string{"fk", "fk_c", "fk_d", "fk_e"} - for i, fkInfo := range tbl2Info.ForeignKeys { - require.Equal(t, names[i], fkInfo.Name.L) - require.Equal(t, model.StatePublic, fkInfo.State) - } - tk.MustGetDBError("insert into t2 (id, b) values (1,1)", plannercore.ErrNoReferencedRow2) - tk.MustGetDBError("insert into t2 (id, c) values (1,1)", plannercore.ErrNoReferencedRow2) - tk.MustGetDBError("insert into t2 (id, d) values (1,1)", plannercore.ErrNoReferencedRow2) - tk.MustGetDBError("insert into t2 (id, e) values (1,1)", plannercore.ErrNoReferencedRow2) - - // Test add multiple foreign key constraint in one statement but failed. - tk.MustExec("alter table t2 drop foreign key fk") - tk.MustExec("alter table t2 drop foreign key fk_c") - tk.MustExec("alter table t2 drop foreign key fk_d") - tk.MustExec("alter table t2 drop foreign key fk_e") - tk.MustGetDBError("alter table t2 add constraint fk_c foreign key (c) references t1(b), "+ - "add constraint fk_d foreign key (d) references t1(b),"+ - "add constraint fk_e foreign key (e) references t1(unknown_col)", infoschema.ErrForeignKeyNoColumnInParent) - tbl2Info = getTableInfo(t, dom, "test", "t2") - require.Equal(t, 0, len(tbl2Info.ForeignKeys)) - tk.MustGetDBError("alter table t2 drop index idx_c, add constraint fk_c foreign key (c) references t1(b)", dbterror.ErrDropIndexNeededInForeignKey) -} - func TestAddForeignKey2(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomainWithSchemaLease(t, testLease) d := dom.DDL() @@ -1528,7 +361,7 @@ func TestAddForeignKey2(t *testing.T) { tk.MustExec("create table t2 (id int key, b int, index(b));") var wg sync.WaitGroup var addErr error - tc := &ddl.TestDDLCallback{} + tc := &callback.TestDDLCallback{} tc.OnJobRunBeforeExported = func(job *model.Job) { if job.SchemaState != model.StatePublic || job.Type != model.ActionDropIndex { return @@ -1568,7 +401,7 @@ func TestAddForeignKey3(t *testing.T) { var insertErrs []error var deleteErrs []error - tc := &ddl.TestDDLCallback{} + tc := &callback.TestDDLCallback{} tc.OnJobRunBeforeExported = func(job *model.Job) { if job.Type != model.ActionAddForeignKey { return @@ -1597,309 +430,3 @@ func TestAddForeignKey3(t *testing.T) { tk.MustQuery("select * from t1 order by id").Check(testkit.Rows("1 1", "2 2", "3 3")) tk.MustQuery("select * from t2 order by id").Check(testkit.Rows("1 1", "2 2", "3 3")) } - -func TestAlterTableAddForeignKeyError(t *testing.T) { - store, _ := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@global.tidb_enable_foreign_key=1") - tk.MustExec("set @@foreign_key_checks=1;") - tk.MustExec("use test") - cases := []struct { - prepares []string - alter string - err string - }{ - { - prepares: []string{ - "create table t1 (id int, a int, b int);", - "create table t2 (a int, b int);", - }, - alter: "alter table t2 add foreign key fk(b) references t_unknown(id)", - err: "[schema:1824]Failed to open the referenced table 't_unknown'", - }, - { - prepares: []string{ - "create table t1 (id int, a int, b int);", - "create table t2 (a int, b int);", - }, - alter: "alter table t2 add foreign key fk(b) references t1(c_unknown)", - err: "[schema:3734]Failed to add the foreign key constraint. Missing column 'c_unknown' for constraint 'fk' in the referenced table 't1'", - }, - { - prepares: []string{ - "create table t1 (id int, a int, b int);", - "create table t2 (a int, b int);", - }, - alter: "alter table t2 add foreign key fk_b(b) references t1(b)", - err: "[schema:1822]Failed to add the foreign key constraint. Missing index for constraint 'fk_b' in the referenced table 't1'", - }, - { - prepares: []string{ - "create table t1 (id int, a int, b int not null, index(b));", - "create table t2 (a int, b int not null);", - }, - alter: "alter table t2 add foreign key fk_b(b) references t1(b) on update set null", - err: "[schema:1830]Column 'b' cannot be NOT NULL: needed in a foreign key constraint 'fk_b' SET NULL", - }, - { - prepares: []string{ - "create table t1 (id int, a int, b int not null, index(b));", - "create table t2 (a int, b int not null);", - }, - alter: "alter table t2 add foreign key fk_b(b) references t1(b) on delete set null", - err: "[schema:1830]Column 'b' cannot be NOT NULL: needed in a foreign key constraint 'fk_b' SET NULL", - }, - { - prepares: []string{ - "create table t1 (id int key, a int, b int as (a) virtual, index(b));", - "create table t2 (a int, b int);", - }, - alter: "alter table t2 add foreign key fk_b(b) references t1(b)", - err: "[schema:3733]Foreign key 'fk_b' uses virtual column 'b' which is not supported.", - }, - { - prepares: []string{ - "create table t1 (id int key, a int, b int, index(b));", - "create table t2 (a int, b int as (a) virtual);", - }, - alter: "alter table t2 add foreign key fk_b(b) references t1(b)", - err: "[schema:3733]Foreign key 'fk_b' uses virtual column 'b' which is not supported.", - }, - { - prepares: []string{ - "create table t1 (id int key, a int);", - "create table t2 (a int, b varchar(10));", - }, - alter: "alter table t2 add foreign key fk(b) references t1(id)", - err: "[ddl:3780]Referencing column 'b' and referenced column 'id' in foreign key constraint 'fk' are incompatible.", - }, - { - prepares: []string{ - "create table t1 (id int key, a int not null, index(a));", - "create table t2 (a int, b int unsigned);", - }, - alter: "alter table t2 add foreign key fk_b(b) references t1(a)", - err: "[ddl:3780]Referencing column 'b' and referenced column 'a' in foreign key constraint 'fk_b' are incompatible.", - }, - { - prepares: []string{ - "create table t1 (id int key, a bigint, index(a));", - "create table t2 (a int, b int);", - }, - alter: "alter table t2 add foreign key fk_b(b) references t1(a)", - err: "[ddl:3780]Referencing column 'b' and referenced column 'a' in foreign key constraint 'fk_b' are incompatible.", - }, - { - prepares: []string{ - "create table t1 (id int key, a varchar(10) charset utf8, index(a));", - "create table t2 (a int, b varchar(10) charset utf8mb4);", - }, - alter: "alter table t2 add foreign key fk_b(b) references t1(a)", - err: "[ddl:3780]Referencing column 'b' and referenced column 'a' in foreign key constraint 'fk_b' are incompatible.", - }, - { - prepares: []string{ - "create table t1 (id int key, a varchar(10) collate utf8_bin, index(a));", - "create table t2 (a int, b varchar(10) collate utf8mb4_bin);", - }, - alter: "alter table t2 add foreign key fk_b(b) references t1(a)", - err: "[ddl:3780]Referencing column 'b' and referenced column 'a' in foreign key constraint 'fk_b' are incompatible.", - }, - { - prepares: []string{ - "create table t1 (id int key, a varchar(10));", - "create table t2 (a int, b varchar(10));", - }, - alter: "alter table t2 add foreign key fk_b(b) references t1(a)", - err: "[schema:1822]Failed to add the foreign key constraint. Missing index for constraint 'fk_b' in the referenced table 't1'", - }, - { - prepares: []string{ - "create table t1 (id int key, a varchar(10), index (a(5)));", - "create table t2 (a int, b varchar(10));", - }, - alter: "alter table t2 add foreign key fk_b(b) references t1(a)", - err: "[schema:1822]Failed to add the foreign key constraint. Missing index for constraint 'fk_b' in the referenced table 't1'", - }, - { - prepares: []string{ - "create table t1 (id int key, a int)", - "create table t2 (id int, b int, index(b))", - "insert into t2 values (1,1)", - }, - alter: "alter table t2 add foreign key fk_b(b) references t1(id)", - err: "[ddl:1452]Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `fk_b` FOREIGN KEY (`b`) REFERENCES `t1` (`id`))", - }, - { - prepares: []string{ - "create table t1 (id int, a int, b int, index(a,b))", - "create table t2 (id int, a int, b int, index(a,b))", - "insert into t2 values (1, 1, null), (2, null, 1), (3, null, null), (4, 1, 1)", - }, - alter: "alter table t2 add foreign key fk_b(a, b) references t1(a, b)", - err: "[ddl:1452]Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `fk_b` FOREIGN KEY (`a`, `b`) REFERENCES `t1` (`a`, `b`))", - }, - { - prepares: []string{ - "create table t1 (id int key);", - "create table t2 (a int, b int unique);", - }, - alter: "alter table t2 add foreign key name5678901234567890123456789012345678901234567890123456789012345(b) references t1(id)", - err: "[ddl:1059]Identifier name 'name5678901234567890123456789012345678901234567890123456789012345' is too long", - }, - { - prepares: []string{ - "create table t1 (id int key);", - "create table t2 (a int, b int unique);", - }, - alter: "alter table t2 add constraint name5678901234567890123456789012345678901234567890123456789012345 foreign key (b) references t1(id)", - err: "[ddl:1059]Identifier name 'name5678901234567890123456789012345678901234567890123456789012345' is too long", - }, - } - for i, ca := range cases { - tk.MustExec("drop table if exists t2") - tk.MustExec("drop table if exists t1") - for _, sql := range ca.prepares { - tk.MustExec(sql) - } - err := tk.ExecToErr(ca.alter) - require.Error(t, err, fmt.Sprintf("%v, %v", i, ca.err)) - require.Equal(t, ca.err, err.Error()) - } - - passCases := [][]string{ - { - "create table t1 (id int key, a int, b int, index(a))", - "alter table t1 add foreign key fk(a) references t1(id)", - }, - { - "create table t1 (id int key, b int not null, index(b))", - "create table t2 (a int, b int, index(b));", - "alter table t2 add foreign key fk_b(b) references t1(b)", - }, - { - "create table t1 (id int key, a varchar(10), index(a));", - "create table t2 (a int, b varchar(20), index(b));", - "alter table t2 add foreign key fk_b(b) references t1(a)", - }, - { - "create table t1 (id int key, a decimal(10,5), index(a));", - "create table t2 (a int, b decimal(20, 10), index(b));", - "alter table t2 add foreign key fk_b(b) references t1(a)", - }, - { - "create table t1 (id int key, a varchar(10), index (a(10)));", - "create table t2 (a int, b varchar(20), index(b));", - "alter table t2 add foreign key fk_b(b) references t1(a)", - }, - { - "create table t1 (id int key, a int)", - "create table t2 (id int, b int, index(b))", - "insert into t2 values (1, null)", - "alter table t2 add foreign key fk_b(b) references t1(id)", - }, - { - "create table t1 (id int, a int, b int, index(a,b))", - "create table t2 (id int, a int, b int, index(a,b))", - "insert into t2 values (1, 1, null), (2, null, 1), (3, null, null)", - "alter table t2 add foreign key fk_b(a, b) references t1(a, b)", - }, - { - "set @@foreign_key_checks=0;", - "create table t1 (id int, a int, b int, index(a,b))", - "create table t2 (id int, a int, b int, index(a,b))", - "insert into t2 values (1, 1, 1)", - "alter table t2 add foreign key fk_b(a, b) references t1(a, b)", - "set @@foreign_key_checks=1;", - }, - { - "set @@foreign_key_checks=0;", - "create table t2 (a int, b int, index(b));", - "alter table t2 add foreign key fk_b(b) references t_unknown(a)", - "set @@foreign_key_checks=1;", - }, - { - "create table t1 (id int key);", - "create table t2 (a int, b int unique);", - "alter table t2 add foreign key name567890123456789012345678901234567890123456789012345678901234(b) references t1(id)", - }, - } - for _, ca := range passCases { - tk.MustExec("drop table if exists t2") - tk.MustExec("drop table if exists t1") - for _, sql := range ca { - tk.MustExec(sql) - } - } -} - -func TestRenameTablesWithForeignKey(t *testing.T) { - store, dom := testkit.CreateMockStoreAndDomainWithSchemaLease(t, testLease) - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@global.tidb_enable_foreign_key=1") - tk.MustExec("set @@foreign_key_checks=0;") - tk.MustExec("create database test1") - tk.MustExec("create database test2") - tk.MustExec("use test") - tk.MustExec("create table t0 (id int key, b int);") - tk.MustExec("create table t1 (id int key, b int, index(b), foreign key fk(b) references t2(id));") - tk.MustExec("create table t2 (id int key, b int, index(b), foreign key fk(b) references t1(id));") - tk.MustExec("rename table test.t1 to test1.tt1, test.t2 to test2.tt2, test.t0 to test.tt0") - - // check the schema diff - diff := getLatestSchemaDiff(t, tk) - require.Equal(t, model.ActionRenameTables, diff.Type) - require.Equal(t, 3, len(diff.AffectedOpts)) - - // check referred foreign key information. - t1ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t1") - t2ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test", "t2") - require.Equal(t, 0, len(t1ReferredFKs)) - require.Equal(t, 0, len(t2ReferredFKs)) - tt1ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test1", "tt1") - tt2ReferredFKs := getTableInfoReferredForeignKeys(t, dom, "test2", "tt2") - require.Equal(t, 1, len(tt1ReferredFKs)) - require.Equal(t, 1, len(tt2ReferredFKs)) - require.Equal(t, model.ReferredFKInfo{ - Cols: []model.CIStr{model.NewCIStr("id")}, - ChildSchema: model.NewCIStr("test2"), - ChildTable: model.NewCIStr("tt2"), - ChildFKName: model.NewCIStr("fk"), - }, *tt1ReferredFKs[0]) - require.Equal(t, model.ReferredFKInfo{ - Cols: []model.CIStr{model.NewCIStr("id")}, - ChildSchema: model.NewCIStr("test1"), - ChildTable: model.NewCIStr("tt1"), - ChildFKName: model.NewCIStr("fk"), - }, *tt2ReferredFKs[0]) - - // check show create table information - tk.MustQuery("show create table test1.tt1").Check(testkit.Rows("tt1 CREATE TABLE `tt1` (\n" + - " `id` int(11) NOT NULL,\n" + - " `b` int(11) DEFAULT NULL,\n" + - " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,\n" + - " KEY `b` (`b`),\n" + - " CONSTRAINT `fk` FOREIGN KEY (`b`) REFERENCES `test2`.`tt2` (`id`)\n" + - ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) - tk.MustQuery("show create table test2.tt2").Check(testkit.Rows("tt2 CREATE TABLE `tt2` (\n" + - " `id` int(11) NOT NULL,\n" + - " `b` int(11) DEFAULT NULL,\n" + - " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,\n" + - " KEY `b` (`b`),\n" + - " CONSTRAINT `fk` FOREIGN KEY (`b`) REFERENCES `test1`.`tt1` (`id`)\n" + - ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) -} - -func getLatestSchemaDiff(t *testing.T, tk *testkit.TestKit) *model.SchemaDiff { - ctx := tk.Session() - err := sessiontxn.NewTxn(context.Background(), ctx) - require.NoError(t, err) - txn, err := ctx.Txn(true) - require.NoError(t, err) - m := meta.NewMeta(txn) - ver, err := m.GetSchemaVersion() - require.NoError(t, err) - diff, err := m.GetSchemaDiff(ver) - require.NoError(t, err) - return diff -} diff --git a/ddl/generated_column.go b/ddl/generated_column.go index 2f4ceee8b60a9..0e877a3e63eb3 100644 --- a/ddl/generated_column.go +++ b/ddl/generated_column.go @@ -122,13 +122,19 @@ func findPositionRelativeColumn(cols []*table.Column, pos *ast.ColumnPosition) ( // findDependedColumnNames returns a set of string, which indicates // the names of the columns that are depended by colDef. -func findDependedColumnNames(colDef *ast.ColumnDef) (generated bool, colsMap map[string]struct{}) { +func findDependedColumnNames(schemaName model.CIStr, tableName model.CIStr, colDef *ast.ColumnDef) (generated bool, colsMap map[string]struct{}, err error) { colsMap = make(map[string]struct{}) for _, option := range colDef.Options { if option.Tp == ast.ColumnOptionGenerated { generated = true colNames := FindColumnNamesInExpr(option.Expr) for _, depCol := range colNames { + if depCol.Schema.L != "" && schemaName.L != "" && depCol.Schema.L != schemaName.L { + return false, nil, dbterror.ErrWrongDBName.GenWithStackByArgs(depCol.Schema.O) + } + if depCol.Table.L != "" && tableName.L != "" && depCol.Table.L != tableName.L { + return false, nil, dbterror.ErrWrongTableName.GenWithStackByArgs(depCol.Table.O) + } colsMap[depCol.Name.L] = struct{}{} } break @@ -192,7 +198,7 @@ func (c *generatedColumnChecker) Leave(inNode ast.Node) (node ast.Node, ok bool) // 3. check if the modified expr contains non-deterministic functions // 4. check whether new column refers to any auto-increment columns. // 5. check if the new column is indexed or stored -func checkModifyGeneratedColumn(sctx sessionctx.Context, tbl table.Table, oldCol, newCol *table.Column, newColDef *ast.ColumnDef, pos *ast.ColumnPosition) error { +func checkModifyGeneratedColumn(sctx sessionctx.Context, schemaName model.CIStr, tbl table.Table, oldCol, newCol *table.Column, newColDef *ast.ColumnDef, pos *ast.ColumnPosition) error { // rule 1. oldColIsStored := !oldCol.IsGenerated() || oldCol.GeneratedStored newColIsStored := !newCol.IsGenerated() || newCol.GeneratedStored @@ -252,7 +258,10 @@ func checkModifyGeneratedColumn(sctx sessionctx.Context, tbl table.Table, oldCol } // rule 4. - _, dependColNames := findDependedColumnNames(newColDef) + _, dependColNames, err := findDependedColumnNames(schemaName, tbl.Meta().Name, newColDef) + if err != nil { + return errors.Trace(err) + } if !sctx.GetSessionVars().EnableAutoIncrementInGenerated { if err := checkAutoIncrementRef(newColDef.Name.Name.L, dependColNames, tbl.Meta()); err != nil { return errors.Trace(err) @@ -268,12 +277,14 @@ func checkModifyGeneratedColumn(sctx sessionctx.Context, tbl table.Table, oldCol } type illegalFunctionChecker struct { - hasIllegalFunc bool - hasAggFunc bool - hasRowVal bool // hasRowVal checks whether the functional index refers to a row value - hasWindowFunc bool - hasNotGAFunc4ExprIdx bool - otherErr error + hasIllegalFunc bool + hasAggFunc bool + hasRowVal bool // hasRowVal checks whether the functional index refers to a row value + hasWindowFunc bool + hasNotGAFunc4ExprIdx bool + hasCastArrayFunc bool + disallowCastArrayFunc bool + otherErr error } func (c *illegalFunctionChecker) Enter(inNode ast.Node) (outNode ast.Node, skipChildren bool) { @@ -308,7 +319,16 @@ func (c *illegalFunctionChecker) Enter(inNode ast.Node) (outNode ast.Node, skipC case *ast.WindowFuncExpr: c.hasWindowFunc = true return inNode, true + case *ast.FuncCastExpr: + c.hasCastArrayFunc = c.hasCastArrayFunc || node.Tp.IsArray() + if c.disallowCastArrayFunc && node.Tp.IsArray() { + c.otherErr = expression.ErrNotSupportedYet.GenWithStackByArgs("Use of CAST( .. AS .. ARRAY) outside of functional index in CREATE(non-SELECT)/ALTER TABLE or in general expressions") + return inNode, true + } + case *ast.ParenthesesExpr: + return inNode, false } + c.disallowCastArrayFunc = true return inNode, false } @@ -355,6 +375,9 @@ func checkIllegalFn4Generated(name string, genType int, expr ast.ExprNode) error if genType == typeIndex && c.hasNotGAFunc4ExprIdx && !config.GetGlobalConfig().Experimental.AllowsExpressionIndex { return dbterror.ErrUnsupportedExpressionIndex } + if genType == typeColumn && c.hasCastArrayFunc { + return expression.ErrNotSupportedYet.GenWithStackByArgs("Use of CAST( .. AS .. ARRAY) outside of functional index in CREATE(non-SELECT)/ALTER TABLE or in general expressions") + } return nil } diff --git a/ddl/index.go b/ddl/index.go index 69622ec3b5bef..f7430cc864cdf 100644 --- a/ddl/index.go +++ b/ddl/index.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/tidb/br/pkg/lightning/common" "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl/ingest" @@ -38,12 +39,14 @@ import ( "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/logutil" decoder "github.com/pingcap/tidb/util/rowDecoder" @@ -63,26 +66,33 @@ var ( telemetryAddIndexIngestUsage = metrics.TelemetryAddIndexIngestCnt ) -func buildIndexColumns(ctx sessionctx.Context, columns []*model.ColumnInfo, indexPartSpecifications []*ast.IndexPartSpecification) ([]*model.IndexColumn, error) { +func buildIndexColumns(ctx sessionctx.Context, columns []*model.ColumnInfo, indexPartSpecifications []*ast.IndexPartSpecification) ([]*model.IndexColumn, bool, error) { // Build offsets. idxParts := make([]*model.IndexColumn, 0, len(indexPartSpecifications)) var col *model.ColumnInfo + var mvIndex bool maxIndexLength := config.GetGlobalConfig().MaxIndexLength // The sum of length of all index columns. sumLength := 0 for _, ip := range indexPartSpecifications { col = model.FindColumnInfo(columns, ip.Column.Name.L) if col == nil { - return nil, dbterror.ErrKeyColumnDoesNotExits.GenWithStack("column does not exist: %s", ip.Column.Name) + return nil, false, dbterror.ErrKeyColumnDoesNotExits.GenWithStack("column does not exist: %s", ip.Column.Name) } if err := checkIndexColumn(ctx, col, ip.Length); err != nil { - return nil, err + return nil, false, err + } + if col.FieldType.IsArray() { + if mvIndex { + return nil, false, dbterror.ErrNotSupportedYet.GenWithStackByArgs("more than one multi-valued key part per index") + } + mvIndex = true } indexColLen := ip.Length indexColumnLength, err := getIndexColumnLength(col, ip.Length) if err != nil { - return nil, err + return nil, false, err } sumLength += indexColumnLength @@ -91,16 +101,16 @@ func buildIndexColumns(ctx sessionctx.Context, columns []*model.ColumnInfo, inde // The multiple column index and the unique index in which the length sum exceeds the maximum size // will return an error instead produce a warning. if ctx == nil || ctx.GetSessionVars().StrictSQLMode || mysql.HasUniKeyFlag(col.GetFlag()) || len(indexPartSpecifications) > 1 { - return nil, dbterror.ErrTooLongKey.GenWithStackByArgs(maxIndexLength) + return nil, false, dbterror.ErrTooLongKey.GenWithStackByArgs(sumLength, maxIndexLength) } // truncate index length and produce warning message in non-restrict sql mode. colLenPerUint, err := getIndexColumnLength(col, 1) if err != nil { - return nil, err + return nil, false, err } indexColLen = maxIndexLength / colLenPerUint // produce warning message - ctx.GetSessionVars().StmtCtx.AppendWarning(dbterror.ErrTooLongKey.FastGenByArgs(maxIndexLength)) + ctx.GetSessionVars().StmtCtx.AppendWarning(dbterror.ErrTooLongKey.FastGenByArgs(sumLength, maxIndexLength)) } idxParts = append(idxParts, &model.IndexColumn{ @@ -110,7 +120,7 @@ func buildIndexColumns(ctx sessionctx.Context, columns []*model.ColumnInfo, inde }) } - return idxParts, nil + return idxParts, mvIndex, nil } // CheckPKOnGeneratedColumn checks the specification of PK is valid. @@ -139,7 +149,7 @@ func checkIndexPrefixLength(columns []*model.ColumnInfo, idxColumns []*model.Ind return err } if idxLen > config.GetGlobalConfig().MaxIndexLength { - return dbterror.ErrTooLongKey.GenWithStackByArgs(config.GetGlobalConfig().MaxIndexLength) + return dbterror.ErrTooLongKey.GenWithStackByArgs(idxLen, config.GetGlobalConfig().MaxIndexLength) } return nil } @@ -153,7 +163,7 @@ func checkIndexColumn(ctx sessionctx.Context, col *model.ColumnInfo, indexColumn } // JSON column cannot index. - if col.FieldType.GetType() == mysql.TypeJSON { + if col.FieldType.GetType() == mysql.TypeJSON && !col.FieldType.IsArray() { if col.Hidden { return dbterror.ErrFunctionalIndexOnJSONOrGeometryFunction } @@ -201,7 +211,7 @@ func checkIndexColumn(ctx sessionctx.Context, col *model.ColumnInfo, indexColumn maxIndexLength := config.GetGlobalConfig().MaxIndexLength if indexColumnLen > maxIndexLength && (ctx == nil || ctx.GetSessionVars().StrictSQLMode) { // return error in strict sql mode - return dbterror.ErrTooLongKey.GenWithStackByArgs(maxIndexLength) + return dbterror.ErrTooLongKey.GenWithStackByArgs(indexColumnLen, maxIndexLength) } return nil } @@ -262,7 +272,7 @@ func BuildIndexInfo( return nil, errors.Trace(err) } - idxColumns, err := buildIndexColumns(ctx, allTableColumns, indexPartSpecifications) + idxColumns, mvIndex, err := buildIndexColumns(ctx, allTableColumns, indexPartSpecifications) if err != nil { return nil, errors.Trace(err) } @@ -275,6 +285,7 @@ func BuildIndexInfo( Primary: isPrimary, Unique: isUnique, Global: isGlobal, + MVIndex: mvIndex, } if indexOption != nil { @@ -644,6 +655,10 @@ func (w *worker) onCreateIndex(d *ddlCtx, t *meta.Meta, job *model.Job, isPK boo // Initialize SnapshotVer to 0 for later reorganization check. job.SnapshotVer = 0 job.SchemaState = model.StateWriteReorganization + + if job.MultiSchemaInfo == nil { + initDistReorg(job.ReorgMeta) + } case model.StateWriteReorganization: // reorganization -> public tbl, err := getTable(d.store, schemaID, tblInfo) @@ -655,7 +670,11 @@ func (w *worker) onCreateIndex(d *ddlCtx, t *meta.Meta, job *model.Job, isPK boo if job.MultiSchemaInfo != nil { done, ver, err = doReorgWorkForCreateIndexMultiSchema(w, d, t, job, tbl, indexInfo) } else { - done, ver, err = doReorgWorkForCreateIndex(w, d, t, job, tbl, indexInfo) + if job.ReorgMeta.IsDistReorg { + done, ver, err = doReorgWorkForCreateIndexWithDistReorg(w, d, t, job, tbl, indexInfo) + } else { + done, ver, err = doReorgWorkForCreateIndex(w, d, t, job, tbl, indexInfo) + } } if !done { return ver, err @@ -676,6 +695,9 @@ func (w *worker) onCreateIndex(d *ddlCtx, t *meta.Meta, job *model.Job, isPK boo job.Args = []interface{}{indexInfo.ID, false /*if exists*/, getPartitionIDs(tbl.Meta())} // Finish this job. job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tblInfo) + if job.ReorgMeta.ReorgTp == model.ReorgTypeLitMerge { + ingest.LitBackCtxMgr.Unregister(job.ID) + } default: err = dbterror.ErrInvalidDDLState.GenWithStackByArgs("index", tblInfo.State) } @@ -691,15 +713,18 @@ func pickBackfillType(w *worker, job *model.Job) model.ReorgType { return job.ReorgMeta.ReorgTp } if IsEnableFastReorg() { - canUseIngest := canUseIngest(w) - if ingest.LitInitialized && canUseIngest { - job.ReorgMeta.ReorgTp = model.ReorgTypeLitMerge - return model.ReorgTypeLitMerge + var useIngest bool + if ingest.LitInitialized { + useIngest = canUseIngest(w) + if useIngest { + job.ReorgMeta.ReorgTp = model.ReorgTypeLitMerge + return model.ReorgTypeLitMerge + } } // The lightning environment is unavailable, but we can still use the txn-merge backfill. logutil.BgLogger().Info("[ddl] fallback to txn-merge backfill process", zap.Bool("lightning env initialized", ingest.LitInitialized), - zap.Bool("can use ingest", canUseIngest)) + zap.Bool("can use ingest", useIngest)) job.ReorgMeta.ReorgTp = model.ReorgTypeTxnMerge return model.ReorgTypeTxnMerge } @@ -710,7 +735,10 @@ func pickBackfillType(w *worker, job *model.Job) model.ReorgType { // canUseIngest indicates whether it can use ingest way to backfill index. func canUseIngest(w *worker) bool { // We only allow one task to use ingest at the same time, in order to limit the CPU usage. - if len(ingest.LitBackCtxMgr.Keys()) > 0 { + activeJobIDs := ingest.LitBackCtxMgr.Keys() + if len(activeJobIDs) > 0 { + logutil.BgLogger().Info("[ddl-ingest] ingest backfill is already in use by another DDL job", + zap.Int64("job ID", activeJobIDs[0])) return false } ctx, err := w.sessPool.get() @@ -753,12 +781,15 @@ func IngestJobsNotExisted(ctx sessionctx.Context) bool { } // tryFallbackToTxnMerge changes the reorg type to txn-merge if the lightning backfill meets something wrong. -func tryFallbackToTxnMerge(job *model.Job, err error) { +func tryFallbackToTxnMerge(job *model.Job, err error) error { if job.State != model.JobStateRollingback { logutil.BgLogger().Info("[ddl] fallback to txn-merge backfill process", zap.Error(err)) job.ReorgMeta.ReorgTp = model.ReorgTypeTxnMerge job.SnapshotVer = 0 + job.RowCount = 0 + return nil } + return err } func doReorgWorkForCreateIndexMultiSchema(w *worker, d *ddlCtx, t *meta.Meta, job *model.Job, @@ -767,6 +798,9 @@ func doReorgWorkForCreateIndexMultiSchema(w *worker, d *ddlCtx, t *meta.Meta, jo done, ver, err = doReorgWorkForCreateIndex(w, d, t, job, tbl, indexInfo) if done { job.MarkNonRevertible() + if err == nil { + ver, err = updateVersionAndTableInfo(d, t, job, tbl.Meta(), true) + } } // We need another round to wait for all the others sub-jobs to finish. return false, ver, err @@ -782,8 +816,10 @@ func doReorgWorkForCreateIndex(w *worker, d *ddlCtx, t *meta.Meta, job *model.Jo } switch indexInfo.BackfillState { case model.BackfillStateRunning: - logutil.BgLogger().Info("[ddl] index backfill state running", zap.Int64("job ID", job.ID), - zap.String("table", tbl.Meta().Name.O), zap.String("index", indexInfo.Name.O)) + logutil.BgLogger().Info("[ddl] index backfill state running", + zap.Int64("job ID", job.ID), zap.String("table", tbl.Meta().Name.O), + zap.Bool("ingest mode", bfProcess == model.ReorgTypeLitMerge), + zap.String("index", indexInfo.Name.O)) switch bfProcess { case model.ReorgTypeLitMerge: bc, ok := ingest.LitBackCtxMgr.Load(job.ID) @@ -793,17 +829,18 @@ func doReorgWorkForCreateIndex(w *worker, d *ddlCtx, t *meta.Meta, job *model.Jo if !ok && job.SnapshotVer != 0 { // The owner is crashed or changed, we need to restart the backfill. job.SnapshotVer = 0 + job.RowCount = 0 return false, ver, nil } bc, err = ingest.LitBackCtxMgr.Register(w.ctx, indexInfo.Unique, job.ID, job.ReorgMeta.SQLMode) if err != nil { - tryFallbackToTxnMerge(job, err) + err = tryFallbackToTxnMerge(job, err) return false, ver, errors.Trace(err) } done, ver, err = runReorgJobAndHandleErr(w, d, t, job, tbl, indexInfo, false) if err != nil { ingest.LitBackCtxMgr.Unregister(job.ID) - tryFallbackToTxnMerge(job, err) + err = tryFallbackToTxnMerge(job, err) return false, ver, errors.Trace(err) } if !done { @@ -811,12 +848,15 @@ func doReorgWorkForCreateIndex(w *worker, d *ddlCtx, t *meta.Meta, job *model.Jo } err = bc.FinishImport(indexInfo.ID, indexInfo.Unique, tbl) if err != nil { - if kv.ErrKeyExists.Equal(err) { + if kv.ErrKeyExists.Equal(err) || common.ErrFoundDuplicateKeys.Equal(err) { logutil.BgLogger().Warn("[ddl] import index duplicate key, convert job to rollback", zap.String("job", job.String()), zap.Error(err)) + if common.ErrFoundDuplicateKeys.Equal(err) { + err = convertToKeyExistsErr(err, indexInfo, tbl.Meta()) + } ver, err = convertAddIdxJob2RollbackJob(d, t, job, tbl.Meta(), indexInfo, err) } else { logutil.BgLogger().Warn("[ddl] lightning import error", zap.Error(err)) - tryFallbackToTxnMerge(job, err) + err = tryFallbackToTxnMerge(job, err) } ingest.LitBackCtxMgr.Unregister(job.ID) return false, ver, errors.Trace(err) @@ -841,6 +881,56 @@ func doReorgWorkForCreateIndex(w *worker, d *ddlCtx, t *meta.Meta, job *model.Jo job.SnapshotVer = 0 // Reset the snapshot version for merge index reorg. ver, err = updateVersionAndTableInfo(d, t, job, tbl.Meta(), true) return false, ver, errors.Trace(err) + case model.BackfillStateMerging: + done, ver, err = runReorgJobAndHandleErr(w, d, t, job, tbl, indexInfo, true) + if !done { + return false, ver, err + } + indexInfo.BackfillState = model.BackfillStateInapplicable // Prevent double-write on this index. + return true, ver, err + default: + return false, 0, dbterror.ErrInvalidDDLState.GenWithStackByArgs("backfill", indexInfo.BackfillState) + } +} + +func doReorgWorkForCreateIndexWithDistReorg(w *worker, d *ddlCtx, t *meta.Meta, job *model.Job, + tbl table.Table, indexInfo *model.IndexInfo) (done bool, ver int64, err error) { + bfProcess := pickBackfillType(w, job) + if !bfProcess.NeedMergeProcess() { + return runReorgJobAndHandleErr(w, d, t, job, tbl, indexInfo, false) + } + switch indexInfo.BackfillState { + case model.BackfillStateRunning: + logutil.BgLogger().Info("[ddl] index backfill state running", + zap.Int64("job ID", job.ID), zap.String("table", tbl.Meta().Name.O), + zap.Bool("ingest mode", bfProcess == model.ReorgTypeLitMerge), + zap.String("index", indexInfo.Name.O)) + switch bfProcess { + case model.ReorgTypeLitMerge: + done, ver, err = runReorgJobAndHandleErr(w, d, t, job, tbl, indexInfo, false) + if err != nil { + logutil.BgLogger().Warn("[ddl] dist lightning import error", zap.Error(err)) + return false, ver, errors.Trace(err) + } + if !done { + return false, ver, nil + } + case model.ReorgTypeTxnMerge: + done, ver, err = runReorgJobAndHandleErr(w, d, t, job, tbl, indexInfo, false) + if err != nil || !done { + return false, ver, errors.Trace(err) + } + } + indexInfo.BackfillState = model.BackfillStateReadyToMerge + ver, err = updateVersionAndTableInfo(d, t, job, tbl.Meta(), true) + return false, ver, errors.Trace(err) + case model.BackfillStateReadyToMerge: + logutil.BgLogger().Info("[ddl] index backfill state ready to merge", zap.Int64("job ID", job.ID), + zap.String("table", tbl.Meta().Name.O), zap.String("index", indexInfo.Name.O)) + indexInfo.BackfillState = model.BackfillStateMerging + job.SnapshotVer = 0 // Reset the snapshot version for merge index reorg. + ver, err = updateVersionAndTableInfo(d, t, job, tbl.Meta(), true) + return false, ver, errors.Trace(err) case model.BackfillStateMerging: done, ver, err = runReorgJobAndHandleErr(w, d, t, job, tbl, indexInfo, true) if !done { @@ -853,11 +943,46 @@ func doReorgWorkForCreateIndex(w *worker, d *ddlCtx, t *meta.Meta, job *model.Jo } } +func convertToKeyExistsErr(originErr error, idxInfo *model.IndexInfo, tblInfo *model.TableInfo) error { + tErr, ok := errors.Cause(originErr).(*terror.Error) + if !ok { + return originErr + } + if len(tErr.Args()) != 2 { + return originErr + } + key, keyIsByte := tErr.Args()[0].([]byte) + value, valIsByte := tErr.Args()[1].([]byte) + if !keyIsByte || !valIsByte { + return originErr + } + return genKeyExistsErr(key, value, idxInfo, tblInfo) +} + func runReorgJobAndHandleErr(w *worker, d *ddlCtx, t *meta.Meta, job *model.Job, tbl table.Table, indexInfo *model.IndexInfo, mergingTmpIdx bool) (done bool, ver int64, err error) { elements := []*meta.Element{{ID: indexInfo.ID, TypeKey: meta.IndexElementKey}} - rh := newReorgHandler(t, w.sess, w.concurrentDDL) - reorgInfo, err := getReorgInfo(d.jobContext(job), d, rh, job, tbl, elements, mergingTmpIdx) + + failpoint.Inject("mockDMLExecutionStateMerging", func(val failpoint.Value) { + //nolint:forcetypeassert + if val.(bool) && indexInfo.BackfillState == model.BackfillStateMerging && + MockDMLExecutionStateMerging != nil { + MockDMLExecutionStateMerging() + } + }) + + sctx, err1 := w.sessPool.get() + if err1 != nil { + err = err1 + return + } + defer w.sessPool.put(sctx) + rh := newReorgHandler(newSession(sctx)) + dbInfo, err := t.GetDatabase(job.SchemaID) + if err != nil { + return false, ver, errors.Trace(err) + } + reorgInfo, err := getReorgInfo(d.jobContext(job.ID), d, rh, job, dbInfo, tbl, elements, mergingTmpIdx) if err != nil || reorgInfo.first { // If we run reorg firstly, we should update the job snapshot version // and then run the reorg next time. @@ -875,7 +1000,9 @@ func runReorgJobAndHandleErr(w *worker, d *ddlCtx, t *meta.Meta, job *model.Job, // if timeout, we should return, check for the owner and re-wait job done. return false, ver, nil } - if kv.ErrKeyExists.Equal(err) || dbterror.ErrCancelledDDLJob.Equal(err) || dbterror.ErrCantDecodeRecord.Equal(err) { + if kv.ErrKeyExists.Equal(err) || dbterror.ErrCancelledDDLJob.Equal(err) || dbterror.ErrCantDecodeRecord.Equal(err) || + // TODO: Remove this check make it can be retry. Related test is TestModifyColumnReorgInfo. + job.ReorgMeta.IsDistReorg { logutil.BgLogger().Warn("[ddl] run add index job failed, convert job to rollback", zap.String("job", job.String()), zap.Error(err)) ver, err = convertAddIdxJob2RollbackJob(d, t, job, tbl.Meta(), indexInfo, err) if err1 := rh.RemoveDDLReorgHandle(job, reorgInfo.elements); err1 != nil { @@ -953,6 +1080,9 @@ func onDropIndex(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) { // Finish this job. if job.IsRollingback() { job.FinishTableJob(model.JobStateRollbackDone, model.StateNone, ver, tblInfo) + if job.ReorgMeta.ReorgTp == model.ReorgTypeLitMerge { + ingest.LitBackCtxMgr.Unregister(job.ID) + } job.Args[0] = indexInfo.ID } else { // the partition ids were append by convertAddIdxJob2RollbackJob, it is weird, but for the compatibility, @@ -1159,9 +1289,10 @@ type indexRecord struct { } type baseIndexWorker struct { - *backfillWorker + *backfillCtx indexes []table.Index + tp backfillerType metricCounter prometheus.Counter // The following attributes are used to reduce memory allocation. @@ -1170,43 +1301,43 @@ type baseIndexWorker struct { rowMap map[int64]types.Datum rowDecoder *decoder.RowDecoder - sqlMode mysql.SQLMode jobContext *JobContext } type addIndexWorker struct { baseIndexWorker - index table.Index - writerCtx *ingest.WriterContext + index table.Index + writerCtx *ingest.WriterContext + copReqSenderPool *copReqSenderPool // The following attributes are used to reduce memory allocation. idxKeyBufs [][]byte batchCheckKeys []kv.Key + batchCheckValues [][]byte distinctCheckFlags []bool } -func newAddIndexWorker(sessCtx sessionctx.Context, id int, t table.PhysicalTable, decodeColMap map[int64]decoder.Column, - reorgInfo *reorgInfo, jc *JobContext, job *model.Job) (*addIndexWorker, error) { - if !bytes.Equal(reorgInfo.currElement.TypeKey, meta.IndexElementKey) { - logutil.BgLogger().Error("Element type for addIndexWorker incorrect", zap.String("jobQuery", reorgInfo.Query), - zap.String("reorgInfo", reorgInfo.String())) - return nil, errors.Errorf("element type is not index, typeKey: %v", reorgInfo.currElement.TypeKey) +func newAddIndexWorker(decodeColMap map[int64]decoder.Column, t table.PhysicalTable, bfCtx *backfillCtx, jc *JobContext, jobID, eleID int64, eleTypeKey []byte) (*addIndexWorker, error) { + if !bytes.Equal(eleTypeKey, meta.IndexElementKey) { + logutil.BgLogger().Error("Element type for addIndexWorker incorrect", zap.String("jobQuery", jc.cacheSQL), + zap.Int64("job ID", jobID), zap.ByteString("element type", eleTypeKey), zap.Int64("element ID", eleID)) + return nil, errors.Errorf("element type is not index, typeKey: %v", eleTypeKey) } - indexInfo := model.FindIndexInfoByID(t.Meta().Indices, reorgInfo.currElement.ID) + indexInfo := model.FindIndexInfoByID(t.Meta().Indices, eleID) index := tables.NewIndex(t.GetPhysicalID(), t.Meta(), indexInfo) rowDecoder := decoder.NewRowDecoder(t, t.WritableCols(), decodeColMap) var lwCtx *ingest.WriterContext - if job.ReorgMeta.ReorgTp == model.ReorgTypeLitMerge { - bc, ok := ingest.LitBackCtxMgr.Load(job.ID) + if bfCtx.reorgTp == model.ReorgTypeLitMerge { + bc, ok := ingest.LitBackCtxMgr.Load(jobID) if !ok { return nil, errors.Trace(errors.New(ingest.LitErrGetBackendFail)) } - ei, err := bc.EngMgr.Register(bc, job, reorgInfo.currElement.ID) + ei, err := bc.EngMgr.Register(bc, jobID, eleID, bfCtx.schemaName, t.Meta().Name.O) if err != nil { - return nil, errors.Trace(errors.New(ingest.LitErrCreateEngineFail)) + return nil, errors.Trace(err) } - lwCtx, err = ei.NewWriterCtx(id) + lwCtx, err = ei.NewWriterCtx(bfCtx.id, indexInfo.Unique) if err != nil { return nil, err } @@ -1214,14 +1345,13 @@ func newAddIndexWorker(sessCtx sessionctx.Context, id int, t table.PhysicalTable return &addIndexWorker{ baseIndexWorker: baseIndexWorker{ - backfillWorker: newBackfillWorker(jc.ddlJobCtx, sessCtx, id, t, reorgInfo, typeAddIndexWorker), - indexes: []table.Index{index}, - rowDecoder: rowDecoder, - defaultVals: make([]types.Datum, len(t.WritableCols())), - rowMap: make(map[int64]types.Datum, len(decodeColMap)), - metricCounter: metrics.BackfillTotalCounter.WithLabelValues(metrics.GenerateReorgLabel("add_idx_rate", reorgInfo.SchemaName, t.Meta().Name.String())), - sqlMode: reorgInfo.ReorgMeta.SQLMode, - jobContext: jc, + backfillCtx: bfCtx, + indexes: []table.Index{index}, + rowDecoder: rowDecoder, + defaultVals: make([]types.Datum, len(t.WritableCols())), + rowMap: make(map[int64]types.Datum, len(decodeColMap)), + metricCounter: metrics.BackfillTotalCounter.WithLabelValues(metrics.GenerateReorgLabel("add_idx_rate", bfCtx.schemaName, t.Meta().Name.String())), + jobContext: jc, }, index: index, writerCtx: lwCtx, @@ -1232,6 +1362,75 @@ func (w *baseIndexWorker) AddMetricInfo(cnt float64) { w.metricCounter.Add(cnt) } +func (*baseIndexWorker) GetTasks() ([]*BackfillJob, error) { + return nil, nil +} + +func (w *baseIndexWorker) String() string { + return w.tp.String() +} + +func (w *baseIndexWorker) UpdateTask(bfJob *BackfillJob) error { + s := newSession(w.backfillCtx.sessCtx) + + return s.runInTxn(func(se *session) error { + jobs, err := GetBackfillJobs(se, BackgroundSubtaskTable, fmt.Sprintf("task_key = '%d_%s_%d_%d'", + bfJob.JobID, hex.EncodeToString(bfJob.EleKey), bfJob.EleID, bfJob.ID), "update_backfill_task") + if err != nil { + return err + } + if len(jobs) == 0 { + return dbterror.ErrDDLJobNotFound.FastGen("get zero backfill job") + } + if jobs[0].InstanceID != bfJob.InstanceID { + return dbterror.ErrDDLJobNotFound.FastGenByArgs(fmt.Sprintf("get a backfill job %v, want instance ID %s", jobs[0], bfJob.InstanceID)) + } + + currTime, err := GetOracleTimeWithStartTS(se) + if err != nil { + return err + } + bfJob.InstanceLease = GetLeaseGoTime(currTime, InstanceLease) + return updateBackfillJob(se, BackgroundSubtaskTable, bfJob, "update_backfill_task") + }) +} + +func (w *baseIndexWorker) FinishTask(bfJob *BackfillJob) error { + s := newSession(w.backfillCtx.sessCtx) + return s.runInTxn(func(se *session) error { + txn, err := se.txn() + if err != nil { + return errors.Trace(err) + } + bfJob.StateUpdateTS = txn.StartTS() + err = RemoveBackfillJob(se, false, bfJob) + if err != nil { + return err + } + return AddBackfillHistoryJob(se, []*BackfillJob{bfJob}) + }) +} + +func (w *baseIndexWorker) GetCtx() *backfillCtx { + return w.backfillCtx +} + +func newAddIndexWorkerContext(d *ddl, schemaName model.CIStr, tbl table.Table, workerCnt int, + bfJob *BackfillJob, jobCtx *JobContext) (*backfillWorkerContext, error) { + //nolint:forcetypeassert + phyTbl := tbl.(table.PhysicalTable) + return newBackfillWorkerContext(d, schemaName.O, tbl, workerCnt, bfJob.JobID, bfJob.Meta, + func(bfCtx *backfillCtx) (backfiller, error) { + decodeColMap, err := makeupDecodeColMap(bfCtx.sessCtx, schemaName, phyTbl) + if err != nil { + logutil.BgLogger().Error("[ddl] make up decode column map failed", zap.Error(err)) + return nil, errors.Trace(err) + } + bf, err1 := newAddIndexWorker(decodeColMap, phyTbl, bfCtx, jobCtx, bfJob.JobID, bfJob.EleID, bfJob.EleKey) + return bf, err1 + }) +} + // mockNotOwnerErrOnce uses to make sure `notOwnerErr` only mock error once. var mockNotOwnerErrOnce uint32 @@ -1245,7 +1444,7 @@ func (w *baseIndexWorker) getIndexRecord(idxInfo *model.IndexInfo, handle kv.Han failpoint.Return(nil, errors.Trace(dbterror.ErrCantDecodeRecord.GenWithStackByArgs("index", errors.New("mock can't decode record error")))) case "modifyColumnNotOwnerErr": - if idxInfo.Name.O == "_Idx$_idx" && handle.IntValue() == 7168 && atomic.CompareAndSwapUint32(&mockNotOwnerErrOnce, 0, 1) { + if idxInfo.Name.O == "_Idx$_idx_0" && handle.IntValue() == 7168 && atomic.CompareAndSwapUint32(&mockNotOwnerErrOnce, 0, 1) { failpoint.Return(nil, errors.Trace(dbterror.ErrNotOwner)) } case "addIdxNotOwnerErr": @@ -1290,7 +1489,7 @@ func (w *baseIndexWorker) getNextKey(taskRange reorgBackfillTask, taskDone bool) if !taskDone { // The task is not done. So we need to pick the last processed entry's handle and add one. lastHandle := w.idxRecords[len(w.idxRecords)-1].handle - recordKey := tablecodec.EncodeRecordKey(w.table.RecordPrefix(), lastHandle) + recordKey := tablecodec.EncodeRecordKey(taskRange.physicalTable.RecordPrefix(), lastHandle) return recordKey.Next() } if taskRange.endInclude { @@ -1322,8 +1521,9 @@ func (w *baseIndexWorker) fetchRowColVals(txn kv.Transaction, taskRange reorgBac // taskDone means that the reorged handle is out of taskRange.endHandle. taskDone := false oprStartTime := startTime - err := iterateSnapshotKeys(w.reorgInfo.d.jobContext(w.reorgInfo.Job), w.sessCtx.GetStore(), w.priority, w.table.RecordPrefix(), txn.StartTS(), taskRange.startKey, taskRange.endKey, - func(handle kv.Handle, recordKey kv.Key, rawRow []byte) (bool, error) { + jobID := taskRange.getJobID() + err := iterateSnapshotKeys(w.GetCtx().jobContext(jobID), w.sessCtx.GetStore(), taskRange.priority, taskRange.physicalTable.RecordPrefix(), txn.StartTS(), + taskRange.startKey, taskRange.endKey, func(handle kv.Handle, recordKey kv.Key, rawRow []byte) (bool, error) { oprEndTime := time.Now() logSlowOperations(oprEndTime.Sub(oprStartTime), "iterateSnapshotKeys in baseIndexWorker fetchRowColVals", 0) oprStartTime = oprEndTime @@ -1365,7 +1565,7 @@ func (w *baseIndexWorker) fetchRowColVals(txn kv.Transaction, taskRange reorgBac taskDone = true } - logutil.BgLogger().Debug("[ddl] txn fetches handle info", zap.Uint64("txnStartTS", txn.StartTS()), + logutil.BgLogger().Debug("[ddl] txn fetches handle info", zap.Stringer("worker", w), zap.Uint64("txnStartTS", txn.StartTS()), zap.String("taskRange", taskRange.String()), zap.Duration("takeTime", time.Since(startTime))) return w.idxRecords, w.getNextKey(taskRange, taskDone), taskDone, errors.Trace(err) } @@ -1376,6 +1576,7 @@ func (w *addIndexWorker) initBatchCheckBufs(batchCount int) { } w.batchCheckKeys = w.batchCheckKeys[:0] + w.batchCheckValues = w.batchCheckValues[:0] w.distinctCheckFlags = w.distinctCheckFlags[:0] } @@ -1391,22 +1592,34 @@ func (w *addIndexWorker) checkHandleExists(key kv.Key, value []byte, handle kv.H if hasBeenBackFilled { return nil } + return genKeyExistsErr(key, value, idxInfo, tblInfo) +} + +func genKeyExistsErr(key, value []byte, idxInfo *model.IndexInfo, tblInfo *model.TableInfo) error { + idxColLen := len(idxInfo.Columns) + indexName := fmt.Sprintf("%s.%s", tblInfo.Name.String(), idxInfo.Name.String()) colInfos := tables.BuildRowcodecColInfoForIndexColumns(idxInfo, tblInfo) values, err := tablecodec.DecodeIndexKV(key, value, idxColLen, tablecodec.HandleNotNeeded, colInfos) if err != nil { - return err + logutil.BgLogger().Warn("decode index key value failed", zap.String("index", indexName), + zap.String("key", hex.EncodeToString(key)), zap.String("value", hex.EncodeToString(value)), zap.Error(err)) + return kv.ErrKeyExists.FastGenByArgs(key, indexName) } - indexName := fmt.Sprintf("%s.%s", w.index.TableMeta().Name.String(), w.index.Meta().Name.String()) valueStr := make([]string, 0, idxColLen) for i, val := range values[:idxColLen] { d, err := tablecodec.DecodeColumnValue(val, colInfos[i].Ft, time.Local) if err != nil { - return kv.ErrKeyExists.FastGenByArgs(key.String(), indexName) + logutil.BgLogger().Warn("decode column value failed", zap.String("index", indexName), + zap.String("key", hex.EncodeToString(key)), zap.String("value", hex.EncodeToString(value)), zap.Error(err)) + return kv.ErrKeyExists.FastGenByArgs(key, indexName) } str, err := d.ToString() if err != nil { str = string(val) } + if types.IsBinaryStr(colInfos[i].Ft) || types.IsTypeBit(colInfos[i].Ft) { + str = util.FmtNonASCIIPrintableCharToHex(str) + } valueStr = append(valueStr, str) } return kv.ErrKeyExists.FastGenByArgs(strings.Join(valueStr, "-"), indexName) @@ -1422,16 +1635,28 @@ func (w *addIndexWorker) batchCheckUniqueKey(txn kv.Transaction, idxRecords []*i w.initBatchCheckBufs(len(idxRecords)) stmtCtx := w.sessCtx.GetSessionVars().StmtCtx + cnt := 0 for i, record := range idxRecords { - idxKey, distinct, err := w.index.GenIndexKey(stmtCtx, record.vals, record.handle, w.idxKeyBufs[i]) - if err != nil { - return errors.Trace(err) + iter := w.index.GenIndexKVIter(stmtCtx, record.vals, record.handle, idxRecords[i].rsData) + for iter.Valid() { + var buf []byte + if cnt < len(w.idxKeyBufs) { + buf = w.idxKeyBufs[cnt] + } + key, val, distinct, err := iter.Next(buf) + if err != nil { + return errors.Trace(err) + } + if cnt < len(w.idxKeyBufs) { + w.idxKeyBufs[cnt] = key + } else { + w.idxKeyBufs = append(w.idxKeyBufs, key) + } + cnt++ + w.batchCheckKeys = append(w.batchCheckKeys, key) + w.batchCheckValues = append(w.batchCheckValues, val) + w.distinctCheckFlags = append(w.distinctCheckFlags, distinct) } - // save the buffer to reduce memory allocations. - w.idxKeyBufs[i] = idxKey - - w.batchCheckKeys = append(w.batchCheckKeys, idxKey) - w.distinctCheckFlags = append(w.distinctCheckFlags, distinct) } batchVals, err := txn.BatchGet(context.Background(), w.batchCheckKeys) @@ -1453,12 +1678,7 @@ func (w *addIndexWorker) batchCheckUniqueKey(txn kv.Transaction, idxRecords []*i } else if w.distinctCheckFlags[i] { // The keys in w.batchCheckKeys also maybe duplicate, // so we need to backfill the not found key into `batchVals` map. - needRsData := tables.NeedRestoredData(w.index.Meta().Columns, w.table.Meta().Columns) - val, err := tablecodec.GenIndexValuePortal(stmtCtx, w.table.Meta(), w.index.Meta(), needRsData, w.distinctCheckFlags[i], false, idxRecords[i].vals, idxRecords[i].handle, 0, idxRecords[i].rsData) - if err != nil { - return errors.Trace(err) - } - batchVals[string(key)] = val + batchVals[string(key)] = w.batchCheckValues[i] } } // Constrains is already checked. @@ -1480,16 +1700,29 @@ func (w *addIndexWorker) BackfillDataInTxn(handleRange reorgBackfillTask) (taskC needMergeTmpIdx := w.index.Meta().BackfillState != model.BackfillStateInapplicable oprStartTime := time.Now() + jobID := handleRange.getJobID() ctx := kv.WithInternalSourceType(context.Background(), w.jobContext.ddlJobSourceType()) - errInTxn = kv.RunInNewTxn(ctx, w.sessCtx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) error { + errInTxn = kv.RunInNewTxn(ctx, w.sessCtx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) (err error) { + taskCtx.finishTS = txn.StartTS() taskCtx.addedCount = 0 taskCtx.scanCount = 0 - txn.SetOption(kv.Priority, w.priority) - if tagger := w.reorgInfo.d.getResourceGroupTaggerForTopSQL(w.reorgInfo.Job); tagger != nil { + txn.SetOption(kv.Priority, handleRange.priority) + if tagger := w.GetCtx().getResourceGroupTaggerForTopSQL(jobID); tagger != nil { txn.SetOption(kv.ResourceGroupTagger, tagger) } - idxRecords, nextKey, taskDone, err := w.fetchRowColVals(txn, handleRange) + var ( + idxRecords []*indexRecord + copChunk *chunk.Chunk // only used by the coprocessor request sender. + nextKey kv.Key + taskDone bool + ) + if w.copReqSenderPool != nil { + idxRecords, copChunk, nextKey, taskDone, err = w.copReqSenderPool.fetchRowColValsFromCop(handleRange) + defer w.copReqSenderPool.recycleIdxRecordsAndChunk(idxRecords, copChunk) + } else { + idxRecords, nextKey, taskDone, err = w.fetchRowColVals(txn, handleRange) + } if err != nil { return errors.Trace(err) } @@ -1534,19 +1767,18 @@ func (w *addIndexWorker) BackfillDataInTxn(handleRange reorgBackfillTask) (taskC } else { // The lightning environment is ready. vars := w.sessCtx.GetSessionVars() sCtx, writeBufs := vars.StmtCtx, vars.GetWriteStmtBufs() - key, distinct, err := w.index.GenIndexKey(sCtx, idxRecord.vals, idxRecord.handle, writeBufs.IndexKeyBuf) - if err != nil { - return errors.Trace(err) - } - idxVal, err := w.index.GenIndexValue(sCtx, distinct, idxRecord.vals, idxRecord.handle, idxRecord.rsData) - if err != nil { - return errors.Trace(err) - } - err = w.writerCtx.WriteRow(key, idxVal) - if err != nil { - return errors.Trace(err) + iter := w.index.GenIndexKVIter(sCtx, idxRecord.vals, idxRecord.handle, idxRecord.rsData) + for iter.Valid() { + key, idxVal, _, err := iter.Next(writeBufs.IndexKeyBuf) + if err != nil { + return errors.Trace(err) + } + err = w.writerCtx.WriteRow(key, idxVal) + if err != nil { + return errors.Trace(err) + } + writeBufs.IndexKeyBuf = key } - writeBufs.IndexKeyBuf = key } taskCtx.addedCount++ } @@ -1554,10 +1786,24 @@ func (w *addIndexWorker) BackfillDataInTxn(handleRange reorgBackfillTask) (taskC return nil }) logSlowOperations(time.Since(oprStartTime), "AddIndexBackfillDataInTxn", 3000) - + failpoint.Inject("mockDMLExecution", func(val failpoint.Value) { + //nolint:forcetypeassert + if val.(bool) && MockDMLExecution != nil { + MockDMLExecution() + } + }) return } +// MockDMLExecution is only used for test. +var MockDMLExecution func() + +// MockDMLExecutionMerging is only used for test. +var MockDMLExecutionMerging func() + +// MockDMLExecutionStateMerging is only used for test. +var MockDMLExecutionStateMerging func() + func (w *worker) addPhysicalTableIndex(t table.PhysicalTable, reorgInfo *reorgInfo) error { if reorgInfo.mergingTmpIdx { logutil.BgLogger().Info("[ddl] start to merge temp index", zap.String("job", reorgInfo.Job.String()), zap.String("reorgInfo", reorgInfo.String())) @@ -1569,6 +1815,11 @@ func (w *worker) addPhysicalTableIndex(t table.PhysicalTable, reorgInfo *reorgIn // addTableIndex handles the add index reorganization state for a table. func (w *worker) addTableIndex(t table.Table, reorgInfo *reorgInfo) error { + // TODO: Support typeAddIndexMergeTmpWorker. + if reorgInfo.Job.ReorgMeta.IsDistReorg && !reorgInfo.mergingTmpIdx { + return w.controlWriteTableRecord(w.sessPool, t, typeAddIndexWorker, reorgInfo) + } + var err error if tbl, ok := t.(table.PartitionedTable); ok { var finish bool @@ -1581,36 +1832,43 @@ func (w *worker) addTableIndex(t table.Table, reorgInfo *reorgInfo) error { if err != nil { break } - finish, err = w.updateReorgInfo(tbl, reorgInfo) + finish, err = updateReorgInfo(w.sessPool, tbl, reorgInfo) if err != nil { return errors.Trace(err) } } } else { //nolint:forcetypeassert - err = w.addPhysicalTableIndex(t.(table.PhysicalTable), reorgInfo) + phyTbl := t.(table.PhysicalTable) + err = w.addPhysicalTableIndex(phyTbl, reorgInfo) } return errors.Trace(err) } -// updateReorgInfo will find the next partition according to current reorgInfo. -// If no more partitions, or table t is not a partitioned table, returns true to -// indicate that the reorganize work is finished. -func (w *worker) updateReorgInfo(t table.PartitionedTable, reorg *reorgInfo) (bool, error) { +func getNextPartitionInfo(reorg *reorgInfo, t table.PartitionedTable, currPhysicalTableID int64) (int64, kv.Key, kv.Key, error) { pi := t.Meta().GetPartitionInfo() if pi == nil { - return true, nil + return 0, nil, nil, nil } - pid, err := findNextPartitionID(reorg.PhysicalTableID, pi.Definitions) + // During data copying, copy data from partitions to be dropped + nextPartitionDefs := pi.DroppingDefinitions + if bytes.Equal(reorg.currElement.TypeKey, meta.IndexElementKey) { + // During index re-creation, process data from partitions to be added + nextPartitionDefs = pi.AddingDefinitions + } + if nextPartitionDefs == nil { + nextPartitionDefs = pi.Definitions + } + pid, err := findNextPartitionID(currPhysicalTableID, nextPartitionDefs) if err != nil { // Fatal error, should not run here. logutil.BgLogger().Error("[ddl] find next partition ID failed", zap.Reflect("table", t), zap.Error(err)) - return false, errors.Trace(err) + return 0, nil, nil, errors.Trace(err) } if pid == 0 { // Next partition does not exist, all the job done. - return true, nil + return 0, nil, nil, nil } failpoint.Inject("mockUpdateCachedSafePoint", func(val failpoint.Value) { @@ -1623,28 +1881,43 @@ func (w *worker) updateReorgInfo(t table.PartitionedTable, reorg *reorgInfo) (bo time.Sleep(time.Second * 3) } }) + + var startKey, endKey kv.Key if reorg.mergingTmpIdx { indexID := reorg.currElement.ID - reorg.StartKey, reorg.EndKey = tablecodec.GetTableIndexKeyRange(pid, tablecodec.TempIndexPrefix|indexID) + startKey, endKey = tablecodec.GetTableIndexKeyRange(pid, tablecodec.TempIndexPrefix|indexID) } else { currentVer, err := getValidCurrentVersion(reorg.d.store) if err != nil { - return false, errors.Trace(err) + return 0, nil, nil, errors.Trace(err) } - start, end, err := getTableRange(reorg.d.jobContext(reorg.Job), reorg.d, t.GetPartition(pid), currentVer.Ver, reorg.Job.Priority) + startKey, endKey, err = getTableRange(reorg.d.jobContext(reorg.Job.ID), reorg.d, t.GetPartition(pid), currentVer.Ver, reorg.Job.Priority) if err != nil { - return false, errors.Trace(err) + return 0, nil, nil, errors.Trace(err) } - reorg.StartKey, reorg.EndKey = start, end } - reorg.PhysicalTableID = pid + return pid, startKey, endKey, nil +} + +// updateReorgInfo will find the next partition according to current reorgInfo. +// If no more partitions, or table t is not a partitioned table, returns true to +// indicate that the reorganize work is finished. +func updateReorgInfo(sessPool *sessionPool, t table.PartitionedTable, reorg *reorgInfo) (bool, error) { + pid, startKey, endKey, err := getNextPartitionInfo(reorg, t, reorg.PhysicalTableID) + if err != nil { + return false, errors.Trace(err) + } + if pid == 0 { + // Next partition does not exist, all the job done. + return true, nil + } + reorg.PhysicalTableID, reorg.StartKey, reorg.EndKey = pid, startKey, endKey // Write the reorg info to store so the whole reorganize process can recover from panic. - err = reorg.UpdateReorgMeta(reorg.StartKey, w.sessPool) + err = reorg.UpdateReorgMeta(reorg.StartKey, sessPool) logutil.BgLogger().Info("[ddl] job update reorgInfo", zap.Int64("jobID", reorg.Job.ID), - zap.ByteString("elementType", reorg.currElement.TypeKey), - zap.Int64("elementID", reorg.currElement.ID), + zap.Stringer("element", reorg.currElement), zap.Int64("partitionTableID", pid), zap.String("startKey", hex.EncodeToString(reorg.StartKey)), zap.String("endKey", hex.EncodeToString(reorg.EndKey)), zap.Error(err)) @@ -1712,14 +1985,13 @@ func newCleanUpIndexWorker(sessCtx sessionctx.Context, id int, t table.PhysicalT } return &cleanUpIndexWorker{ baseIndexWorker: baseIndexWorker{ - backfillWorker: newBackfillWorker(jc.ddlJobCtx, sessCtx, id, t, reorgInfo, typeCleanUpIndexWorker), - indexes: indexes, - rowDecoder: rowDecoder, - defaultVals: make([]types.Datum, len(t.WritableCols())), - rowMap: make(map[int64]types.Datum, len(decodeColMap)), - metricCounter: metrics.BackfillTotalCounter.WithLabelValues(metrics.GenerateReorgLabel("cleanup_idx_rate", reorgInfo.SchemaName, t.Meta().Name.String())), - sqlMode: reorgInfo.ReorgMeta.SQLMode, - jobContext: jc, + backfillCtx: newBackfillCtx(reorgInfo.d, id, sessCtx, reorgInfo.ReorgMeta.ReorgTp, reorgInfo.SchemaName, t), + indexes: indexes, + rowDecoder: rowDecoder, + defaultVals: make([]types.Datum, len(t.WritableCols())), + rowMap: make(map[int64]types.Datum, len(decodeColMap)), + metricCounter: metrics.BackfillTotalCounter.WithLabelValues(metrics.GenerateReorgLabel("cleanup_idx_rate", reorgInfo.SchemaName, t.Meta().Name.String())), + jobContext: jc, }, } } @@ -1737,8 +2009,8 @@ func (w *cleanUpIndexWorker) BackfillDataInTxn(handleRange reorgBackfillTask) (t errInTxn = kv.RunInNewTxn(ctx, w.sessCtx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) error { taskCtx.addedCount = 0 taskCtx.scanCount = 0 - txn.SetOption(kv.Priority, w.priority) - if tagger := w.reorgInfo.d.getResourceGroupTaggerForTopSQL(w.reorgInfo.Job); tagger != nil { + txn.SetOption(kv.Priority, handleRange.priority) + if tagger := w.GetCtx().getResourceGroupTaggerForTopSQL(handleRange.getJobID()); tagger != nil { txn.SetOption(kv.ResourceGroupTagger, tagger) } @@ -1821,7 +2093,7 @@ func (w *worker) updateReorgInfoForPartitions(t table.PartitionedTable, reorg *r if err != nil { return false, errors.Trace(err) } - start, end, err := getTableRange(reorg.d.jobContext(reorg.Job), reorg.d, t.GetPartition(pid), currentVer.Ver, reorg.Job.Priority) + start, end, err := getTableRange(reorg.d.jobContext(reorg.Job.ID), reorg.d, t.GetPartition(pid), currentVer.Ver, reorg.Job.Priority) if err != nil { return false, errors.Trace(err) } @@ -1829,13 +2101,39 @@ func (w *worker) updateReorgInfoForPartitions(t table.PartitionedTable, reorg *r // Write the reorg info to store so the whole reorganize process can recover from panic. err = reorg.UpdateReorgMeta(reorg.StartKey, w.sessPool) - logutil.BgLogger().Info("[ddl] job update reorgInfo", zap.Int64("jobID", reorg.Job.ID), - zap.ByteString("elementType", reorg.currElement.TypeKey), zap.Int64("elementID", reorg.currElement.ID), - zap.Int64("partitionTableID", pid), zap.String("startHandle", tryDecodeToHandleString(start)), - zap.String("endHandle", tryDecodeToHandleString(end)), zap.Error(err)) + logutil.BgLogger().Info("[ddl] job update reorg info", zap.Int64("jobID", reorg.Job.ID), + zap.Stringer("element", reorg.currElement), + zap.Int64("partition table ID", pid), zap.String("start key", hex.EncodeToString(start)), + zap.String("end key", hex.EncodeToString(end)), zap.Error(err)) return false, errors.Trace(err) } +func runBackfillJobsWithLightning(d *ddl, sess *session, bfJob *BackfillJob, jobCtx *JobContext) error { + bc, err := ingest.LitBackCtxMgr.Register(d.ctx, bfJob.Meta.IsUnique, bfJob.JobID, bfJob.Meta.SQLMode) + if err != nil { + logutil.BgLogger().Warn("[ddl] lightning register error", zap.Error(err)) + return err + } + + tbl, err := runBackfillJobs(d, sess, bc, bfJob, jobCtx) + if err != nil { + logutil.BgLogger().Warn("[ddl] runBackfillJobs error", zap.Error(err)) + ingest.LitBackCtxMgr.Unregister(bfJob.JobID) + return err + } + + bc.EngMgr.ResetWorkers(bc, bfJob.JobID, bfJob.EleID) + err = bc.FinishImport(bfJob.EleID, bfJob.Meta.IsUnique, tbl) + if err != nil { + logutil.BgLogger().Warn("[ddl] lightning import error", zap.String("first backfill job", bfJob.AbbrStr()), zap.Error(err)) + ingest.LitBackCtxMgr.Unregister(bfJob.JobID) + return err + } + ingest.LitBackCtxMgr.Unregister(bfJob.ID) + bc.SetDone() + return nil +} + // changingIndex is used to store the index that need to be changed during modifying column. type changingIndex struct { IndexInfo *model.IndexInfo diff --git a/ddl/index_change_test.go b/ddl/index_change_test.go index b5d2c9d6ce983..dc1b98f205f08 100644 --- a/ddl/index_change_test.go +++ b/ddl/index_change_test.go @@ -21,6 +21,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx" @@ -41,7 +42,7 @@ func TestIndexChange(t *testing.T) { tk.MustExec("insert t values (1, 1), (2, 2), (3, 3);") d := dom.DDL() - tc := &ddl.TestDDLCallback{Do: dom} + tc := &callback.TestDDLCallback{Do: dom} // set up hook prevState := model.StateNone addIndexDone := false @@ -219,6 +220,7 @@ func checkAddWriteOnlyForAddIndex(ctx sessionctx.Context, delOnlyTbl, writeOnlyT } func checkAddPublicForAddIndex(ctx sessionctx.Context, writeTbl, publicTbl table.Table) error { + var err1 error // WriteOnlyTable: insert t values (6, 6) err := sessiontxn.NewTxn(context.Background(), ctx) if err != nil { @@ -229,7 +231,11 @@ func checkAddPublicForAddIndex(ctx sessionctx.Context, writeTbl, publicTbl table return errors.Trace(err) } err = checkIndexExists(ctx, publicTbl, 6, 6, true) - if err != nil { + if ddl.IsEnableFastReorg() { + // Need check temp index also. + err1 = checkIndexExists(ctx, writeTbl, 6, 6, true) + } + if err != nil && err1 != nil { return errors.Trace(err) } // PublicTable: insert t values (7, 7) @@ -248,10 +254,18 @@ func checkAddPublicForAddIndex(ctx sessionctx.Context, writeTbl, publicTbl table return errors.Trace(err) } err = checkIndexExists(ctx, publicTbl, 5, 7, true) - if err != nil { + if ddl.IsEnableFastReorg() { + // Need check temp index also. + err1 = checkIndexExists(ctx, writeTbl, 5, 7, true) + } + if err != nil && err1 != nil { return errors.Trace(err) } - err = checkIndexExists(ctx, publicTbl, 7, 7, false) + if ddl.IsEnableFastReorg() { + err = checkIndexExists(ctx, writeTbl, 7, 7, false) + } else { + err = checkIndexExists(ctx, publicTbl, 7, 7, false) + } if err != nil { return errors.Trace(err) } @@ -281,7 +295,11 @@ func checkAddPublicForAddIndex(ctx sessionctx.Context, writeTbl, publicTbl table idxVal := row[1].GetInt64() handle := row[0].GetInt64() err = checkIndexExists(ctx, publicTbl, idxVal, handle, true) - if err != nil { + if ddl.IsEnableFastReorg() { + // Need check temp index also. + err1 = checkIndexExists(ctx, writeTbl, idxVal, handle, true) + } + if err != nil && err1 != nil { return errors.Trace(err) } } diff --git a/ddl/index_cop.go b/ddl/index_cop.go new file mode 100644 index 0000000000000..fab097727139b --- /dev/null +++ b/ddl/index_cop.go @@ -0,0 +1,546 @@ +// 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, +// 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 ddl + +import ( + "context" + "sync" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/distsql" + "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/statistics" + "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/table/tables" + "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/dbterror" + "github.com/pingcap/tidb/util/generic" + "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/timeutil" + "github.com/pingcap/tipb/go-tipb" + "go.uber.org/zap" +) + +// copReadBatchSize is the batch size of coprocessor read. +// It multiplies the tidb_ddl_reorg_batch_size by 10 to avoid +// sending too many cop requests for the same handle range. +func copReadBatchSize() int { + return 10 * int(variable.GetDDLReorgBatchSize()) +} + +// copReadChunkPoolSize is the size of chunk pool, which +// represents the max concurrent ongoing coprocessor requests. +// It multiplies the tidb_ddl_reorg_worker_cnt by 10. +func copReadChunkPoolSize() int { + return 10 * int(variable.GetDDLReorgWorkerCounter()) +} + +func (c *copReqSenderPool) fetchRowColValsFromCop(handleRange reorgBackfillTask) ([]*indexRecord, *chunk.Chunk, kv.Key, bool, error) { + ticker := time.NewTicker(500 * time.Millisecond) + defer ticker.Stop() + for { + select { + case rs, ok := <-c.resultsCh: + if !ok { + logutil.BgLogger().Info("[ddl-ingest] cop-response channel is closed", + zap.Int("id", handleRange.id), zap.String("task", handleRange.String())) + return nil, nil, handleRange.endKey, true, nil + } + if rs.err != nil { + return nil, nil, handleRange.startKey, false, rs.err + } + if rs.done { + logutil.BgLogger().Info("[ddl-ingest] finish a cop-request task", + zap.Int("id", rs.id), zap.Int("total", rs.total)) + c.results.Store(rs.id, struct{}{}) + } + if _, found := c.results.Load(handleRange.id); found { + logutil.BgLogger().Info("[ddl-ingest] task is found in results", + zap.Int("id", handleRange.id), zap.String("task", handleRange.String())) + c.results.Delete(handleRange.id) + return rs.records, rs.chunk, handleRange.endKey, true, nil + } + return rs.records, rs.chunk, handleRange.startKey, false, nil + case <-ticker.C: + logutil.BgLogger().Info("[ddl-ingest] cop-request result channel is empty", + zap.Int("id", handleRange.id)) + if _, found := c.results.Load(handleRange.id); found { + c.results.Delete(handleRange.id) + return nil, nil, handleRange.endKey, true, nil + } + } + } +} + +type copReqSenderPool struct { + tasksCh chan *reorgBackfillTask + resultsCh chan idxRecResult + results generic.SyncMap[int, struct{}] + + ctx context.Context + copCtx *copContext + store kv.Storage + + senders []*copReqSender + wg sync.WaitGroup + + idxBufPool chan []*indexRecord + srcChkPool chan *chunk.Chunk +} + +type copReqSender struct { + senderPool *copReqSenderPool + + ctx context.Context + cancel context.CancelFunc +} + +func (c *copReqSender) run() { + p := c.senderPool + defer p.wg.Done() + var curTaskID int + defer util.Recover(metrics.LabelDDL, "copReqSender.run", func() { + p.resultsCh <- idxRecResult{id: curTaskID, err: dbterror.ErrReorgPanic} + }, false) + for { + if util.HasCancelled(c.ctx) { + return + } + task, ok := <-p.tasksCh + if !ok { + return + } + curTaskID = task.id + logutil.BgLogger().Info("[ddl-ingest] start a cop-request task", + zap.Int("id", task.id), zap.String("task", task.String())) + ver, err := p.store.CurrentVersion(kv.GlobalTxnScope) + if err != nil { + p.resultsCh <- idxRecResult{id: task.id, err: err} + return + } + rs, err := p.copCtx.buildTableScan(p.ctx, ver.Ver, task.startKey, task.excludedEndKey()) + if err != nil { + p.resultsCh <- idxRecResult{id: task.id, err: err} + return + } + failpoint.Inject("MockCopSenderPanic", func(val failpoint.Value) { + if val.(bool) { + panic("mock panic") + } + }) + var done bool + var total int + for !done { + idxRec, srcChk := p.getIndexRecordsAndChunks() + idxRec, done, err = p.copCtx.fetchTableScanResult(p.ctx, rs, srcChk, idxRec) + if err != nil { + p.resultsCh <- idxRecResult{id: task.id, err: err} + p.recycleIdxRecordsAndChunk(idxRec, srcChk) + terror.Call(rs.Close) + return + } + total += len(idxRec) + p.resultsCh <- idxRecResult{id: task.id, records: idxRec, chunk: srcChk, done: done, total: total} + } + terror.Call(rs.Close) + } +} + +func newCopReqSenderPool(ctx context.Context, copCtx *copContext, store kv.Storage) *copReqSenderPool { + poolSize := copReadChunkPoolSize() + idxBufPool := make(chan []*indexRecord, poolSize) + srcChkPool := make(chan *chunk.Chunk, poolSize) + for i := 0; i < poolSize; i++ { + idxBufPool <- make([]*indexRecord, 0, copReadBatchSize()) + srcChkPool <- chunk.NewChunkWithCapacity(copCtx.fieldTps, copReadBatchSize()) + } + return &copReqSenderPool{ + tasksCh: make(chan *reorgBackfillTask, backfillTaskChanSize), + resultsCh: make(chan idxRecResult, backfillTaskChanSize), + results: generic.NewSyncMap[int, struct{}](10), + ctx: ctx, + copCtx: copCtx, + store: store, + senders: make([]*copReqSender, 0, variable.GetDDLReorgWorkerCounter()), + wg: sync.WaitGroup{}, + idxBufPool: idxBufPool, + srcChkPool: srcChkPool, + } +} + +func (c *copReqSenderPool) sendTask(task *reorgBackfillTask) { + c.tasksCh <- task +} + +func (c *copReqSenderPool) adjustSize(n int) { + // Add some senders. + for i := len(c.senders); i < n; i++ { + ctx, cancel := context.WithCancel(c.ctx) + c.senders = append(c.senders, &copReqSender{ + senderPool: c, + ctx: ctx, + cancel: cancel, + }) + c.wg.Add(1) + go c.senders[i].run() + } + // Remove some senders. + if n < len(c.senders) { + for i := n; i < len(c.senders); i++ { + c.senders[i].cancel() + } + c.senders = c.senders[:n] + } +} + +func (c *copReqSenderPool) close() { + logutil.BgLogger().Info("[ddl-ingest] close cop-request sender pool", zap.Int("results not handled", len(c.results.Keys()))) + close(c.tasksCh) + for _, w := range c.senders { + w.cancel() + } + cleanupWg := util.WaitGroupWrapper{} + cleanupWg.Run(c.drainResults) + // Wait for all cop-req senders to exit. + c.wg.Wait() + close(c.resultsCh) + cleanupWg.Wait() + close(c.idxBufPool) + close(c.srcChkPool) +} + +func (c *copReqSenderPool) drainResults() { + // Consume the rest results because the writers are inactive anymore. + for rs := range c.resultsCh { + c.recycleIdxRecordsAndChunk(rs.records, rs.chunk) + } +} + +func (c *copReqSenderPool) getIndexRecordsAndChunks() ([]*indexRecord, *chunk.Chunk) { + ir := <-c.idxBufPool + chk := <-c.srcChkPool + newCap := copReadBatchSize() + if chk.Capacity() != newCap { + chk = chunk.NewChunkWithCapacity(c.copCtx.fieldTps, newCap) + } + chk.Reset() + return ir[:0], chk +} + +// recycleIdxRecordsAndChunk puts the index record slice and the chunk back to the pool for reuse. +func (c *copReqSenderPool) recycleIdxRecordsAndChunk(idxRecs []*indexRecord, chk *chunk.Chunk) { + if idxRecs == nil || chk == nil { + return + } + c.idxBufPool <- idxRecs + c.srcChkPool <- chk +} + +// copContext contains the information that is needed when building a coprocessor request. +// It is unchanged after initialization. +type copContext struct { + tblInfo *model.TableInfo + idxInfo *model.IndexInfo + pkInfo *model.IndexInfo + colInfos []*model.ColumnInfo + fieldTps []*types.FieldType + sessCtx sessionctx.Context + + expColInfos []*expression.Column + idxColOutputOffsets []int + handleOutputOffsets []int + virtualColOffsets []int + virtualColFieldTps []*types.FieldType +} + +func newCopContext(tblInfo *model.TableInfo, idxInfo *model.IndexInfo, sessCtx sessionctx.Context) (*copContext, error) { + var err error + usedColumnIDs := make(map[int64]struct{}, len(idxInfo.Columns)) + usedColumnIDs, err = fillUsedColumns(usedColumnIDs, idxInfo, tblInfo) + var handleIDs []int64 + if err != nil { + return nil, err + } + var primaryIdx *model.IndexInfo + if tblInfo.PKIsHandle { + pkCol := tblInfo.GetPkColInfo() + usedColumnIDs[pkCol.ID] = struct{}{} + handleIDs = []int64{pkCol.ID} + } else if tblInfo.IsCommonHandle { + primaryIdx = tables.FindPrimaryIndex(tblInfo) + handleIDs = make([]int64, 0, len(primaryIdx.Columns)) + for _, pkCol := range primaryIdx.Columns { + col := tblInfo.Columns[pkCol.Offset] + handleIDs = append(handleIDs, col.ID) + } + usedColumnIDs, err = fillUsedColumns(usedColumnIDs, primaryIdx, tblInfo) + if err != nil { + return nil, err + } + } + + // Only collect the columns that are used by the index. + colInfos := make([]*model.ColumnInfo, 0, len(idxInfo.Columns)) + fieldTps := make([]*types.FieldType, 0, len(idxInfo.Columns)) + for i := range tblInfo.Columns { + col := tblInfo.Columns[i] + if _, found := usedColumnIDs[col.ID]; found { + colInfos = append(colInfos, col) + fieldTps = append(fieldTps, &col.FieldType) + } + } + + // Append the extra handle column when _tidb_rowid is used. + if !tblInfo.HasClusteredIndex() { + extra := model.NewExtraHandleColInfo() + colInfos = append(colInfos, extra) + fieldTps = append(fieldTps, &extra.FieldType) + handleIDs = []int64{extra.ID} + } + + expColInfos, _, err := expression.ColumnInfos2ColumnsAndNames(sessCtx, + model.CIStr{} /* unused */, tblInfo.Name, colInfos, tblInfo) + if err != nil { + return nil, err + } + idxOffsets := resolveIndicesForIndex(expColInfos, idxInfo, tblInfo) + hdColOffsets := resolveIndicesForHandle(expColInfos, handleIDs) + vColOffsets, vColFts := collectVirtualColumnOffsetsAndTypes(expColInfos) + + copCtx := &copContext{ + tblInfo: tblInfo, + idxInfo: idxInfo, + pkInfo: primaryIdx, + colInfos: colInfos, + fieldTps: fieldTps, + sessCtx: sessCtx, + + expColInfos: expColInfos, + idxColOutputOffsets: idxOffsets, + handleOutputOffsets: hdColOffsets, + virtualColOffsets: vColOffsets, + virtualColFieldTps: vColFts, + } + return copCtx, nil +} + +func fillUsedColumns(usedCols map[int64]struct{}, idxInfo *model.IndexInfo, tblInfo *model.TableInfo) (map[int64]struct{}, error) { + colsToChecks := make([]*model.ColumnInfo, 0, len(idxInfo.Columns)) + for _, idxCol := range idxInfo.Columns { + colsToChecks = append(colsToChecks, tblInfo.Columns[idxCol.Offset]) + } + for len(colsToChecks) > 0 { + next := colsToChecks[0] + colsToChecks = colsToChecks[1:] + usedCols[next.ID] = struct{}{} + for depColName := range next.Dependences { + // Expand the virtual generated columns. + depCol := model.FindColumnInfo(tblInfo.Columns, depColName) + if depCol == nil { + return nil, errors.Trace(errors.Errorf("dependent column %s not found", depColName)) + } + if _, ok := usedCols[depCol.ID]; !ok { + colsToChecks = append(colsToChecks, depCol) + } + } + } + return usedCols, nil +} + +func resolveIndicesForIndex(outputCols []*expression.Column, idxInfo *model.IndexInfo, tblInfo *model.TableInfo) []int { + offsets := make([]int, 0, len(idxInfo.Columns)) + for _, idxCol := range idxInfo.Columns { + hid := tblInfo.Columns[idxCol.Offset].ID + for j, col := range outputCols { + if col.ID == hid { + offsets = append(offsets, j) + break + } + } + } + return offsets +} + +func resolveIndicesForHandle(cols []*expression.Column, handleIDs []int64) []int { + offsets := make([]int, 0, len(handleIDs)) + for _, hid := range handleIDs { + for j, col := range cols { + if col.ID == hid { + offsets = append(offsets, j) + break + } + } + } + return offsets +} + +func collectVirtualColumnOffsetsAndTypes(cols []*expression.Column) ([]int, []*types.FieldType) { + var offsets []int + var fts []*types.FieldType + for i, col := range cols { + if col.VirtualExpr != nil { + offsets = append(offsets, i) + fts = append(fts, col.GetType()) + } + } + return offsets, fts +} + +func (c *copContext) buildTableScan(ctx context.Context, startTS uint64, start, end kv.Key) (distsql.SelectResult, error) { + dagPB, err := buildDAGPB(c.sessCtx, c.tblInfo, c.colInfos) + if err != nil { + return nil, err + } + + var builder distsql.RequestBuilder + kvReq, err := builder. + SetDAGRequest(dagPB). + SetStartTS(startTS). + SetKeyRanges([]kv.KeyRange{{StartKey: start, EndKey: end}}). + SetKeepOrder(true). + SetFromSessionVars(c.sessCtx.GetSessionVars()). + SetFromInfoSchema(c.sessCtx.GetDomainInfoSchema()). + SetConcurrency(1). + Build() + if err != nil { + return nil, err + } + return distsql.Select(ctx, c.sessCtx, kvReq, c.fieldTps, statistics.NewQueryFeedback(0, nil, 0, false)) +} + +func (c *copContext) fetchTableScanResult(ctx context.Context, result distsql.SelectResult, + chk *chunk.Chunk, buf []*indexRecord) ([]*indexRecord, bool, error) { + sctx := c.sessCtx.GetSessionVars().StmtCtx + err := result.Next(ctx, chk) + if err != nil { + return nil, false, errors.Trace(err) + } + if chk.NumRows() == 0 { + return buf, true, nil + } + iter := chunk.NewIterator4Chunk(chk) + err = table.FillVirtualColumnValue(c.virtualColFieldTps, c.virtualColOffsets, c.expColInfos, c.colInfos, c.sessCtx, chk) + if err != nil { + return nil, false, errors.Trace(err) + } + for row := iter.Begin(); row != iter.End(); row = iter.Next() { + idxDt := extractDatumByOffsets(row, c.idxColOutputOffsets, c.expColInfos) + hdDt := extractDatumByOffsets(row, c.handleOutputOffsets, c.expColInfos) + handle, err := buildHandle(hdDt, c.tblInfo, c.pkInfo, sctx) + if err != nil { + return nil, false, errors.Trace(err) + } + rsData := getRestoreData(c.tblInfo, c.idxInfo, c.pkInfo, hdDt) + buf = append(buf, &indexRecord{handle: handle, key: nil, vals: idxDt, rsData: rsData, skip: false}) + } + return buf, false, nil +} + +func getRestoreData(tblInfo *model.TableInfo, targetIdx, pkIdx *model.IndexInfo, handleDts []types.Datum) []types.Datum { + if !collate.NewCollationEnabled() || !tblInfo.IsCommonHandle || tblInfo.CommonHandleVersion == 0 { + return nil + } + if pkIdx == nil { + return nil + } + for i, pkIdxCol := range pkIdx.Columns { + pkCol := tblInfo.Columns[pkIdxCol.Offset] + if !types.NeedRestoredData(&pkCol.FieldType) { + // Since the handle data cannot be null, we can use SetNull to + // indicate that this column does not need to be restored. + handleDts[i].SetNull() + continue + } + tables.TryTruncateRestoredData(&handleDts[i], pkCol, pkIdxCol, targetIdx) + tables.ConvertDatumToTailSpaceCount(&handleDts[i], pkCol) + } + dtToRestored := handleDts[:0] + for _, handleDt := range handleDts { + if !handleDt.IsNull() { + dtToRestored = append(dtToRestored, handleDt) + } + } + return dtToRestored +} + +func buildDAGPB(sCtx sessionctx.Context, tblInfo *model.TableInfo, colInfos []*model.ColumnInfo) (*tipb.DAGRequest, error) { + dagReq := &tipb.DAGRequest{} + dagReq.TimeZoneName, dagReq.TimeZoneOffset = timeutil.Zone(sCtx.GetSessionVars().Location()) + sc := sCtx.GetSessionVars().StmtCtx + dagReq.Flags = sc.PushDownFlags() + for i := range colInfos { + dagReq.OutputOffsets = append(dagReq.OutputOffsets, uint32(i)) + } + execPB, err := constructTableScanPB(sCtx, tblInfo, colInfos) + if err != nil { + return nil, err + } + dagReq.Executors = append(dagReq.Executors, execPB) + distsql.SetEncodeType(sCtx, dagReq) + return dagReq, nil +} + +func constructTableScanPB(sCtx sessionctx.Context, tblInfo *model.TableInfo, colInfos []*model.ColumnInfo) (*tipb.Executor, error) { + tblScan := tables.BuildTableScanFromInfos(tblInfo, colInfos) + tblScan.TableId = tblInfo.ID + err := tables.SetPBColumnsDefaultValue(sCtx, tblScan.Columns, colInfos) + return &tipb.Executor{Tp: tipb.ExecType_TypeTableScan, TblScan: tblScan}, err +} + +func extractDatumByOffsets(row chunk.Row, offsets []int, expCols []*expression.Column) []types.Datum { + datumBuf := make([]types.Datum, 0, len(offsets)) + for _, offset := range offsets { + c := expCols[offset] + rowDt := row.GetDatum(offset, c.GetType()) + datumBuf = append(datumBuf, rowDt) + } + return datumBuf +} + +func buildHandle(pkDts []types.Datum, tblInfo *model.TableInfo, + pkInfo *model.IndexInfo, stmtCtx *stmtctx.StatementContext) (kv.Handle, error) { + if tblInfo.IsCommonHandle { + tablecodec.TruncateIndexValues(tblInfo, pkInfo, pkDts) + handleBytes, err := codec.EncodeKey(stmtCtx, nil, pkDts...) + if err != nil { + return nil, err + } + return kv.NewCommonHandle(handleBytes) + } + return kv.IntHandle(pkDts[0].GetInt64()), nil +} + +type idxRecResult struct { + id int + records []*indexRecord + chunk *chunk.Chunk + err error + done bool + total int +} diff --git a/ddl/index_cop_test.go b/ddl/index_cop_test.go new file mode 100644 index 0000000000000..5edc1680b2308 --- /dev/null +++ b/ddl/index_cop_test.go @@ -0,0 +1,102 @@ +// 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, +// 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 ddl_test + +import ( + "fmt" + "strconv" + "testing" + + "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/types" + "github.com/stretchr/testify/require" +) + +func TestAddIndexFetchRowsFromCoprocessor(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + testFetchRows := func(db, tb, idx string) ([]kv.Handle, [][]types.Datum) { + tbl, err := dom.InfoSchema().TableByName(model.NewCIStr(db), model.NewCIStr(tb)) + require.NoError(t, err) + tblInfo := tbl.Meta() + idxInfo := tblInfo.FindIndexByName(idx) + copCtx, err := ddl.NewCopContext4Test(tblInfo, idxInfo, tk.Session()) + require.NoError(t, err) + startKey := tbl.RecordPrefix() + endKey := startKey.PrefixNext() + txn, err := store.Begin() + require.NoError(t, err) + idxRec, done, err := ddl.FetchRowsFromCop4Test(copCtx, tbl.(table.PhysicalTable), startKey, endKey, store, 10) + require.NoError(t, err) + require.False(t, done) + require.NoError(t, txn.Rollback()) + + handles := make([]kv.Handle, 0, len(idxRec)) + values := make([][]types.Datum, 0, len(idxRec)) + for _, rec := range idxRec { + handles = append(handles, rec.GetHandle()) + values = append(values, rec.GetIndexValues()) + } + return handles, values + } + + // Test nonclustered primary key table. + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a bigint, b int, index idx (b));") + for i := 0; i < 8; i++ { + tk.MustExec("insert into t values (?, ?)", i, i) + } + hds, vals := testFetchRows("test", "t", "idx") + require.Len(t, hds, 8) + for i := 0; i < 8; i++ { + require.Equal(t, hds[i].IntValue(), int64(i+1)) + require.Len(t, vals[i], 1) + require.Equal(t, vals[i][0].GetInt64(), int64(i)) + } + + // Test clustered primary key table(pk_is_handle). + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a bigint primary key, b int, index idx (b));") + for i := 0; i < 8; i++ { + tk.MustExec("insert into t values (?, ?)", i, i) + } + hds, vals = testFetchRows("test", "t", "idx") + require.Len(t, hds, 8) + for i := 0; i < 8; i++ { + require.Equal(t, hds[i].IntValue(), int64(i)) + require.Len(t, vals[i], 1) + require.Equal(t, vals[i][0].GetInt64(), int64(i)) + } + + // Test clustered primary key table(common_handle). + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a varchar(10), b int, c char(10), primary key (a, c) clustered, index idx (b));") + for i := 0; i < 8; i++ { + tk.MustExec("insert into t values (?, ?, ?)", strconv.Itoa(i), i, strconv.Itoa(i)) + } + hds, vals = testFetchRows("test", "t", "idx") + require.Len(t, hds, 8) + for i := 0; i < 8; i++ { + require.Equal(t, hds[i].String(), fmt.Sprintf("{%d, %d}", i, i)) + require.Len(t, vals[i], 1) + require.Equal(t, vals[i][0].GetInt64(), int64(i)) + } +} diff --git a/ddl/index_merge_tmp.go b/ddl/index_merge_tmp.go index b33111119facc..029c87542de11 100644 --- a/ddl/index_merge_tmp.go +++ b/ddl/index_merge_tmp.go @@ -20,9 +20,9 @@ import ( "time" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/model" - "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" @@ -49,16 +49,12 @@ func (w *mergeIndexWorker) batchCheckTemporaryUniqueKey(txn kv.Transaction, idxR return errors.Trace(err) } - // 1. unique-key/primary-key is duplicate and the handle is equal, skip it. - // 2. unique-key/primary-key is duplicate and the handle is not equal, return duplicate error. - // 3. non-unique-key is duplicate, skip it. for i, key := range w.originIdxKeys { if val, found := batchVals[string(key)]; found { - if idxRecords[i].distinct && !bytes.Equal(val, idxRecords[i].vals) { - return kv.ErrKeyExists - } - if !idxRecords[i].delete { - idxRecords[i].skip = true + // Found a value in the original index key. + err := checkTempIndexKey(txn, idxRecords[i], val, w.table) + if err != nil { + return errors.Trace(err) } } else if idxRecords[i].distinct { // The keys in w.batchCheckKeys also maybe duplicate, @@ -69,6 +65,48 @@ func (w *mergeIndexWorker) batchCheckTemporaryUniqueKey(txn kv.Transaction, idxR return nil } +func checkTempIndexKey(txn kv.Transaction, tmpRec *temporaryIndexRecord, originIdxVal []byte, tblInfo table.Table) error { + if !tmpRec.delete { + if tmpRec.distinct && !bytes.Equal(originIdxVal, tmpRec.vals) { + return kv.ErrKeyExists + } + // The key has been found in the original index, skip merging it. + tmpRec.skip = true + return nil + } + // Delete operation. + distinct := tablecodec.IndexKVIsUnique(originIdxVal) + if !distinct { + // For non-distinct key, it is consist of a null value and the handle. + // Same as the non-unique indexes, replay the delete operation on non-distinct keys. + return nil + } + // For distinct index key values, prevent deleting an unexpected index KV in original index. + hdInVal, err := tablecodec.DecodeHandleInUniqueIndexValue(originIdxVal, tblInfo.Meta().IsCommonHandle) + if err != nil { + return errors.Trace(err) + } + if !tmpRec.handle.Equal(hdInVal) { + // The inequality means multiple modifications happened in the same key. + // We use the handle in origin index value to check if the row exists. + rowKey := tablecodec.EncodeRecordKey(tblInfo.RecordPrefix(), hdInVal) + _, err := txn.Get(context.Background(), rowKey) + if err != nil { + if kv.IsErrNotFound(err) { + // The row is deleted, so we can merge the delete operation to the origin index. + tmpRec.skip = false + return nil + } + // Unexpected errors. + return errors.Trace(err) + } + // Don't delete the index key if the row exists. + tmpRec.skip = true + return nil + } + return nil +} + // temporaryIndexRecord is the record information of an index. type temporaryIndexRecord struct { vals []byte @@ -76,10 +114,12 @@ type temporaryIndexRecord struct { delete bool unique bool distinct bool + handle kv.Handle + rowKey kv.Key } type mergeIndexWorker struct { - *backfillWorker + *backfillCtx index table.Index @@ -89,15 +129,15 @@ type mergeIndexWorker struct { jobContext *JobContext } -func newMergeTempIndexWorker(sessCtx sessionctx.Context, id int, t table.PhysicalTable, reorgInfo *reorgInfo, jc *JobContext) *mergeIndexWorker { - indexInfo := model.FindIndexInfoByID(t.Meta().Indices, reorgInfo.currElement.ID) +func newMergeTempIndexWorker(bfCtx *backfillCtx, id int, t table.PhysicalTable, eleID int64, jc *JobContext) *mergeIndexWorker { + indexInfo := model.FindIndexInfoByID(t.Meta().Indices, eleID) index := tables.NewIndex(t.GetPhysicalID(), t.Meta(), indexInfo) return &mergeIndexWorker{ - backfillWorker: newBackfillWorker(jc.ddlJobCtx, sessCtx, id, t, reorgInfo, typeAddIndexMergeTmpWorker), - index: index, - jobContext: jc, + backfillCtx: bfCtx, + index: index, + jobContext: jc, } } @@ -108,8 +148,8 @@ func (w *mergeIndexWorker) BackfillDataInTxn(taskRange reorgBackfillTask) (taskC errInTxn = kv.RunInNewTxn(ctx, w.sessCtx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) error { taskCtx.addedCount = 0 taskCtx.scanCount = 0 - txn.SetOption(kv.Priority, w.priority) - if tagger := w.reorgInfo.d.getResourceGroupTaggerForTopSQL(w.reorgInfo.Job); tagger != nil { + txn.SetOption(kv.Priority, taskRange.priority) + if tagger := w.GetCtx().getResourceGroupTaggerForTopSQL(taskRange.getJobID()); tagger != nil { txn.SetOption(kv.ResourceGroupTagger, tagger) } @@ -133,6 +173,15 @@ func (w *mergeIndexWorker) BackfillDataInTxn(taskRange reorgBackfillTask) (taskC if idxRecord.skip { continue } + + // Lock the corresponding row keys so that it doesn't modify the index KVs + // that are changing by a pessimistic transaction. + rowKey := tablecodec.EncodeRecordKey(w.table.RecordPrefix(), idxRecord.handle) + err := txn.LockKeys(context.Background(), new(kv.LockCtx), rowKey) + if err != nil { + return errors.Trace(err) + } + if idxRecord.delete { if idxRecord.unique { err = txn.GetMemBuffer().DeleteWithFlags(w.originIdxKeys[i], kv.SetNeedLocked) @@ -149,11 +198,38 @@ func (w *mergeIndexWorker) BackfillDataInTxn(taskRange reorgBackfillTask) (taskC } return nil }) + + failpoint.Inject("mockDMLExecutionMerging", func(val failpoint.Value) { + //nolint:forcetypeassert + if val.(bool) && MockDMLExecutionMerging != nil { + MockDMLExecutionMerging() + } + }) logSlowOperations(time.Since(oprStartTime), "AddIndexMergeDataInTxn", 3000) return } -func (w *mergeIndexWorker) AddMetricInfo(cnt float64) { +func (*mergeIndexWorker) AddMetricInfo(float64) { +} + +func (*mergeIndexWorker) String() string { + return typeAddIndexMergeTmpWorker.String() +} + +func (*mergeIndexWorker) GetTasks() ([]*BackfillJob, error) { + panic("[ddl] merge index worker GetTask function doesn't implement") +} + +func (*mergeIndexWorker) UpdateTask(*BackfillJob) error { + panic("[ddl] merge index worker UpdateTask function doesn't implement") +} + +func (*mergeIndexWorker) FinishTask(*BackfillJob) error { + panic("[ddl] merge index worker FinishTask function doesn't implement") +} + +func (w *mergeIndexWorker) GetCtx() *backfillCtx { + return w.backfillCtx } func (w *mergeIndexWorker) fetchTempIndexVals(txn kv.Transaction, taskRange reorgBackfillTask) ([]*temporaryIndexRecord, kv.Key, bool, error) { @@ -166,7 +242,8 @@ func (w *mergeIndexWorker) fetchTempIndexVals(txn kv.Transaction, taskRange reor oprStartTime := startTime idxPrefix := w.table.IndexPrefix() var lastKey kv.Key - err := iterateSnapshotKeys(w.reorgInfo.d.jobContext(w.reorgInfo.Job), w.sessCtx.GetStore(), w.priority, idxPrefix, txn.StartTS(), + isCommonHandle := w.table.Meta().IsCommonHandle + err := iterateSnapshotKeys(w.GetCtx().jobContext(taskRange.getJobID()), w.sessCtx.GetStore(), taskRange.priority, idxPrefix, txn.StartTS(), taskRange.startKey, taskRange.endKey, func(_ kv.Handle, indexKey kv.Key, rawValue []byte) (more bool, err error) { oprEndTime := time.Now() logSlowOperations(oprEndTime.Sub(oprStartTime), "iterate temporary index in merge process", 0) @@ -182,38 +259,49 @@ func (w *mergeIndexWorker) fetchTempIndexVals(txn kv.Transaction, taskRange reor return false, nil } - isDelete := false - unique := false - length := len(rawValue) - keyVer := rawValue[length-1] - if keyVer == tables.TempIndexKeyTypeMerge { - // The kv is written in the merging state. It has been written to the origin index, we can skip it. - return true, nil - } - rawValue = rawValue[:length-1] - if bytes.Equal(rawValue, tables.DeleteMarker) { - isDelete = true - } else if bytes.Equal(rawValue, tables.DeleteMarkerUnique) { - isDelete = true - unique = true + tempIdxVal, err := tablecodec.DecodeTempIndexValue(rawValue, isCommonHandle) + if err != nil { + return false, err } + tempIdxVal = tempIdxVal.FilterOverwritten() - originIdxKey := make([]byte, len(indexKey)) - copy(originIdxKey, indexKey) - tablecodec.TempIndexKey2IndexKey(w.index.Meta().ID, originIdxKey) + // Extract the operations on the original index and replay them later. + for _, elem := range tempIdxVal { + if elem.KeyVer == tables.TempIndexKeyTypeMerge || elem.KeyVer == tables.TempIndexKeyTypeDelete { + // For 'm' version kvs, they are double-written. + // For 'd' version kvs, they are written in the delete-only state and can be dropped safely. + continue + } - idxRecord := &temporaryIndexRecord{ - delete: isDelete, - unique: unique, - skip: false, - } - if !isDelete { - idxRecord.vals = rawValue - idxRecord.distinct = tablecodec.IndexKVIsUnique(rawValue) + if elem.Handle == nil { + // If the handle is not found in the value of the temp index, it means + // 1) This is not a deletion marker, the handle is in the key or the origin value. + // 2) This is a deletion marker, but the handle is in the key of temp index. + elem.Handle, err = tablecodec.DecodeIndexHandle(indexKey, elem.Value, len(w.index.Meta().Columns)) + if err != nil { + return false, err + } + } + + originIdxKey := make([]byte, len(indexKey)) + copy(originIdxKey, indexKey) + tablecodec.TempIndexKey2IndexKey(w.index.Meta().ID, originIdxKey) + + idxRecord := &temporaryIndexRecord{ + handle: elem.Handle, + delete: elem.Delete, + unique: elem.Distinct, + skip: false, + } + if !elem.Delete { + idxRecord.vals = elem.Value + idxRecord.distinct = tablecodec.IndexKVIsUnique(elem.Value) + } + w.tmpIdxRecords = append(w.tmpIdxRecords, idxRecord) + w.originIdxKeys = append(w.originIdxKeys, originIdxKey) + w.tmpIdxKeys = append(w.tmpIdxKeys, indexKey) } - w.tmpIdxRecords = append(w.tmpIdxRecords, idxRecord) - w.originIdxKeys = append(w.originIdxKeys, originIdxKey) - w.tmpIdxKeys = append(w.tmpIdxKeys, indexKey) + lastKey = indexKey return true, nil }) diff --git a/ddl/index_merge_tmp_test.go b/ddl/index_merge_tmp_test.go deleted file mode 100644 index eb0a935690068..0000000000000 --- a/ddl/index_merge_tmp_test.go +++ /dev/null @@ -1,195 +0,0 @@ -// 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, -// 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 ddl_test - -import ( - "testing" - - "github.com/pingcap/tidb/ddl" - "github.com/pingcap/tidb/ddl/ingest" - "github.com/pingcap/tidb/domain" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/parser/model" - "github.com/pingcap/tidb/tablecodec" - "github.com/pingcap/tidb/testkit" - "github.com/pingcap/tidb/util/logutil" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.uber.org/zap" -) - -func TestAddIndexMergeProcess(t *testing.T) { - store, dom := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk2 := testkit.NewTestKit(t, store) - tk2.MustExec("use test") - tk.MustExec("create table t (c1 int primary key, c2 int, c3 int)") - tk.MustExec("insert into t values (1, 2, 3), (4, 5, 6);") - // Force onCreateIndex use the txn-merge process. - ingest.LitInitialized = false - tk.MustExec("set @@global.tidb_ddl_enable_fast_reorg = 1;") - - var checkErr error - var runDML, backfillDone bool - originHook := dom.DDL().GetHook() - callback := &ddl.TestDDLCallback{ - Do: dom, - } - onJobUpdatedExportedFunc := func(job *model.Job) { - if !runDML && job.Type == model.ActionAddIndex && job.SchemaState == model.StateWriteReorganization { - idx := findIdxInfo(dom, "test", "t", "idx") - if idx == nil || idx.BackfillState != model.BackfillStateRunning { - return - } - if !backfillDone { - // Wait another round so that the backfill range is determined(1-4). - backfillDone = true - return - } - runDML = true - // Write record 7 to the temporary index. - _, checkErr = tk2.Exec("insert into t values (7, 8, 9);") - } - } - callback.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) - dom.DDL().SetHook(callback) - tk.MustExec("alter table t add index idx(c1);") - dom.DDL().SetHook(originHook) - require.True(t, backfillDone) - require.True(t, runDML) - require.NoError(t, checkErr) - tk.MustExec("admin check table t;") - tk.MustQuery("select * from t use index (idx);").Check(testkit.Rows("1 2 3", "4 5 6", "7 8 9")) - tk.MustQuery("select * from t ignore index (idx);").Check(testkit.Rows("1 2 3", "4 5 6", "7 8 9")) -} - -func TestAddPrimaryKeyMergeProcess(t *testing.T) { - // Disable auto schema reload. - store, dom := testkit.CreateMockStoreAndDomainWithSchemaLease(t, 0) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk2 := testkit.NewTestKit(t, store) - tk2.MustExec("use test") - tk.MustExec("create table t (c1 int, c2 int, c3 int)") - tk.MustExec("insert into t values (1, 2, 3), (4, 5, 6);") - // Force onCreateIndex use the backfill-merge process. - ingest.LitInitialized = false - tk.MustExec("set @@global.tidb_ddl_enable_fast_reorg = 1;") - - var checkErr error - var runDML, backfillDone bool - originHook := dom.DDL().GetHook() - callback := &ddl.TestDDLCallback{ - Do: nil, // We'll reload the schema manually. - - } - onJobUpdatedExportedFunc := func(job *model.Job) { - if !runDML && job.Type == model.ActionAddPrimaryKey && job.SchemaState == model.StateWriteReorganization { - idx := findIdxInfo(dom, "test", "t", "primary") - if idx == nil || idx.BackfillState != model.BackfillStateRunning || job.SnapshotVer == 0 { - return - } - if !backfillDone { - // Wait another round so that the backfill process is finished, but - // the info schema is not updated. - backfillDone = true - return - } - runDML = true - // Add delete record 4 to the temporary index. - _, checkErr = tk2.Exec("delete from t where c1 = 4;") - } - assert.NoError(t, dom.Reload()) - } - callback.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) - dom.DDL().SetHook(callback) - tk.MustExec("alter table t add primary key idx(c1);") - dom.DDL().SetHook(originHook) - require.True(t, backfillDone) - require.True(t, runDML) - require.NoError(t, checkErr) - tk.MustExec("admin check table t;") - tk.MustQuery("select * from t use index (primary);").Check(testkit.Rows("1 2 3")) - tk.MustQuery("select * from t ignore index (primary);").Check(testkit.Rows("1 2 3")) -} - -func TestAddIndexMergeVersionIndexValue(t *testing.T) { - store, dom := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk2 := testkit.NewTestKit(t, store) - tk2.MustExec("use test") - tk.MustExec("create table t (c1 int);") - // Force onCreateIndex use the txn-merge process. - ingest.LitInitialized = false - tk.MustExec("set @@global.tidb_ddl_enable_fast_reorg = 1;") - - var checkErr error - var runDML bool - var tblID, idxID int64 - originHook := dom.DDL().GetHook() - callback := &ddl.TestDDLCallback{ - Do: dom, - } - onJobUpdatedExportedFunc := func(job *model.Job) { - if !runDML && job.Type == model.ActionAddIndex && job.SchemaState == model.StateWriteReorganization { - idx := findIdxInfo(dom, "test", "t", "idx") - if idx == nil || idx.BackfillState != model.BackfillStateReadyToMerge { - return - } - runDML = true - tblID = job.TableID - idxID = idx.ID - _, checkErr = tk2.Exec("insert into t values (1);") - } - } - callback.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) - dom.DDL().SetHook(callback) - tk.MustExec("alter table t add unique index idx(c1);") - dom.DDL().SetHook(originHook) - require.True(t, runDML) - require.NoError(t, checkErr) - tk.MustExec("admin check table t;") - tk.MustQuery("select * from t use index (idx);").Check(testkit.Rows("1")) - tk.MustQuery("select * from t ignore index (idx);").Check(testkit.Rows("1")) - - snap := store.GetSnapshot(kv.MaxVersion) - iter, err := snap.Iter(tablecodec.GetTableIndexKeyRange(tblID, idxID)) - require.NoError(t, err) - require.True(t, iter.Valid()) - // The origin index value should not have 'm' version appended. - require.Equal(t, []byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1}, iter.Value()) -} - -func findIdxInfo(dom *domain.Domain, dbName, tbName, idxName string) *model.IndexInfo { - tbl, err := dom.InfoSchema().TableByName(model.NewCIStr(dbName), model.NewCIStr(tbName)) - if err != nil { - logutil.BgLogger().Warn("cannot find table", zap.String("dbName", dbName), zap.String("tbName", tbName)) - return nil - } - return tbl.Meta().FindIndexByName(idxName) -} - -func TestPessimisticAmendIncompatibleWithFastReorg(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set global tidb_ddl_enable_fast_reorg = 1;") - tk.MustExec("set global tidb_ddl_enable_fast_reorg = 1;") - - tk.MustGetErrMsg("set @@tidb_enable_amend_pessimistic_txn = 1;", - "amend pessimistic transactions is not compatible with tidb_ddl_enable_fast_reorg") -} diff --git a/ddl/index_modify_test.go b/ddl/index_modify_test.go index c24f2dfb1b783..2caf54c31c157 100644 --- a/ddl/index_modify_test.go +++ b/ddl/index_modify_test.go @@ -416,7 +416,7 @@ func testAddIndexRollback(t *testing.T, idxName, addIdxSQL, errMsg string, hasNu } done := make(chan error, 1) - go backgroundExec(store, addIdxSQL, done) + go backgroundExec(store, "test", addIdxSQL, done) times := 0 ticker := time.NewTicker(indexModifyLease / 2) diff --git a/ddl/indexmergetest/BUILD.bazel b/ddl/indexmergetest/BUILD.bazel new file mode 100644 index 0000000000000..b70146ae8d461 --- /dev/null +++ b/ddl/indexmergetest/BUILD.bazel @@ -0,0 +1,33 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_test") + +go_test( + name = "indexmergetest_test", + timeout = "moderate", + srcs = [ + "main_test.go", + "merge_test.go", + ], + flaky = True, + race = "on", + shard_count = 4, + deps = [ + "//config", + "//ddl", + "//ddl/ingest", + "//ddl/internal/callback", + "//ddl/testutil", + "//domain", + "//errno", + "//kv", + "//meta/autoid", + "//parser/model", + "//tablecodec", + "//testkit", + "//testkit/testsetup", + "@com_github_pingcap_failpoint//:failpoint", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + "@com_github_tikv_client_go_v2//tikv", + "@org_uber_go_goleak//:goleak", + ], +) diff --git a/ddl/indexmergetest/main_test.go b/ddl/indexmergetest/main_test.go new file mode 100644 index 0000000000000..b4de8700ce167 --- /dev/null +++ b/ddl/indexmergetest/main_test.go @@ -0,0 +1,56 @@ +// Copyright 2023 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 indexmergetest + +import ( + "testing" + "time" + + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/meta/autoid" + "github.com/pingcap/tidb/testkit/testsetup" + "github.com/tikv/client-go/v2/tikv" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + testsetup.SetupForCommonTest() + tikv.EnableFailpoints() + + domain.SchemaOutOfDateRetryInterval.Store(50 * time.Millisecond) + domain.SchemaOutOfDateRetryTimes.Store(50) + + autoid.SetStep(5000) + ddl.RunInGoTest = true + + config.UpdateGlobal(func(conf *config.Config) { + conf.Instance.SlowThreshold = 10000 + conf.TiKVClient.AsyncCommit.SafeWindow = 0 + conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 + conf.Experimental.AllowsExpressionIndex = true + }) + + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/txnkv/transaction.keepAlive"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } + + goleak.VerifyTestMain(m, opts...) +} diff --git a/ddl/indexmergetest/merge_test.go b/ddl/indexmergetest/merge_test.go new file mode 100644 index 0000000000000..f74db4e0b9eb9 --- /dev/null +++ b/ddl/indexmergetest/merge_test.go @@ -0,0 +1,860 @@ +// Copyright 2023 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 indexmergetest + +import ( + "testing" + "time" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/ingest" + "github.com/pingcap/tidb/ddl/internal/callback" + "github.com/pingcap/tidb/ddl/testutil" + "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestAddIndexMergeProcess(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + tk.MustExec("create table t (c1 int primary key, c2 int, c3 int)") + tk.MustExec("insert into t values (1, 2, 3), (4, 5, 6);") + // Force onCreateIndex use the txn-merge process. + ingest.LitInitialized = false + tk.MustExec("set @@global.tidb_ddl_enable_fast_reorg = 1;") + + var checkErr error + var runDML, backfillDone bool + originHook := dom.DDL().GetHook() + callback := &callback.TestDDLCallback{ + Do: dom, + } + onJobUpdatedExportedFunc := func(job *model.Job) { + if !runDML && job.Type == model.ActionAddIndex && job.SchemaState == model.StateWriteReorganization { + idx := testutil.FindIdxInfo(dom, "test", "t", "idx") + if idx == nil || idx.BackfillState != model.BackfillStateRunning { + return + } + if !backfillDone { + // Wait another round so that the backfill range is determined(1-4). + backfillDone = true + return + } + runDML = true + // Write record 7 to the temporary index. + _, checkErr = tk2.Exec("insert into t values (7, 8, 9);") + } + } + callback.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) + dom.DDL().SetHook(callback) + tk.MustExec("alter table t add index idx(c1);") + dom.DDL().SetHook(originHook) + require.True(t, backfillDone) + require.True(t, runDML) + require.NoError(t, checkErr) + tk.MustExec("admin check table t;") + tk.MustQuery("select * from t use index (idx);").Check(testkit.Rows("1 2 3", "4 5 6", "7 8 9")) + tk.MustQuery("select * from t ignore index (idx);").Check(testkit.Rows("1 2 3", "4 5 6", "7 8 9")) +} + +func TestAddPrimaryKeyMergeProcess(t *testing.T) { + // Disable auto schema reload. + store, dom := testkit.CreateMockStoreAndDomainWithSchemaLease(t, 0) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + tk.MustExec("create table t (c1 int, c2 int, c3 int)") + tk.MustExec("insert into t values (1, 2, 3), (4, 5, 6);") + // Force onCreateIndex use the backfill-merge process. + ingest.LitInitialized = false + tk.MustExec("set @@global.tidb_ddl_enable_fast_reorg = 1;") + + var checkErr error + var runDML, backfillDone bool + originHook := dom.DDL().GetHook() + callback := &callback.TestDDLCallback{ + Do: nil, // We'll reload the schema manually. + + } + onJobUpdatedExportedFunc := func(job *model.Job) { + if !runDML && job.Type == model.ActionAddPrimaryKey && job.SchemaState == model.StateWriteReorganization { + idx := testutil.FindIdxInfo(dom, "test", "t", "primary") + if idx == nil || idx.BackfillState != model.BackfillStateRunning || job.SnapshotVer == 0 { + return + } + if !backfillDone { + // Wait another round so that the backfill process is finished, but + // the info schema is not updated. + backfillDone = true + return + } + runDML = true + // Add delete record 4 to the temporary index. + _, checkErr = tk2.Exec("delete from t where c1 = 4;") + } + assert.NoError(t, dom.Reload()) + } + callback.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) + dom.DDL().SetHook(callback) + tk.MustExec("alter table t add primary key idx(c1);") + dom.DDL().SetHook(originHook) + require.True(t, backfillDone) + require.True(t, runDML) + require.NoError(t, checkErr) + tk.MustExec("admin check table t;") + tk.MustQuery("select * from t use index (primary);").Check(testkit.Rows("1 2 3")) + tk.MustQuery("select * from t ignore index (primary);").Check(testkit.Rows("1 2 3")) +} + +func TestAddIndexMergeVersionIndexValue(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + tk.MustExec("create table t (c1 int);") + // Force onCreateIndex use the txn-merge process. + ingest.LitInitialized = false + tk.MustExec("set @@global.tidb_ddl_enable_fast_reorg = 1;") + + var checkErr error + var runDML bool + var tblID, idxID int64 + originHook := dom.DDL().GetHook() + callback := &callback.TestDDLCallback{ + Do: dom, + } + onJobUpdatedExportedFunc := func(job *model.Job) { + if !runDML && job.Type == model.ActionAddIndex && job.SchemaState == model.StateWriteReorganization { + idx := testutil.FindIdxInfo(dom, "test", "t", "idx") + if idx == nil || idx.BackfillState != model.BackfillStateReadyToMerge { + return + } + runDML = true + tblID = job.TableID + idxID = idx.ID + _, checkErr = tk2.Exec("insert into t values (1);") + } + } + callback.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) + dom.DDL().SetHook(callback) + tk.MustExec("alter table t add unique index idx(c1);") + dom.DDL().SetHook(originHook) + require.True(t, runDML) + require.NoError(t, checkErr) + tk.MustExec("admin check table t;") + tk.MustQuery("select * from t use index (idx);").Check(testkit.Rows("1")) + tk.MustQuery("select * from t ignore index (idx);").Check(testkit.Rows("1")) + + snap := store.GetSnapshot(kv.MaxVersion) + iter, err := snap.Iter(tablecodec.GetTableIndexKeyRange(tblID, idxID)) + require.NoError(t, err) + require.True(t, iter.Valid()) + // The origin index value should not have 'm' version appended. + require.Equal(t, []byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1}, iter.Value()) +} + +func TestAddIndexMergeIndexUntouchedValue(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + tk.MustExec(`create table t ( + id int not null auto_increment, + k int not null default '0', + c char(120) not null default '', + pad char(60) not null default '', + primary key (id) clustered, + key k_1(k));`) + tk.MustExec("insert into t values (1, 1, 'a', 'a')") + // Force onCreateIndex use the txn-merge process. + ingest.LitInitialized = false + tk.MustExec("set @@global.tidb_ddl_enable_fast_reorg = 1;") + + var checkErrs []error + var runInsert bool + var runUpdate bool + originHook := dom.DDL().GetHook() + callback := &callback.TestDDLCallback{ + Do: dom, + } + onJobUpdatedExportedFunc := func(job *model.Job) { + if job.Type != model.ActionAddIndex || job.SchemaState != model.StateWriteReorganization { + return + } + idx := testutil.FindIdxInfo(dom, "test", "t", "idx") + if idx == nil { + return + } + if !runInsert { + if idx.BackfillState != model.BackfillStateRunning || job.SnapshotVer == 0 { + return + } + runInsert = true + _, err := tk2.Exec("insert into t values (100, 1, 'a', 'a');") + checkErrs = append(checkErrs, err) + } + if !runUpdate { + if idx.BackfillState != model.BackfillStateReadyToMerge { + return + } + runUpdate = true + _, err := tk2.Exec("begin;") + checkErrs = append(checkErrs, err) + _, err = tk2.Exec("update t set k=k+1 where id = 100;") + checkErrs = append(checkErrs, err) + _, err = tk2.Exec("commit;") + checkErrs = append(checkErrs, err) + } + } + callback.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) + dom.DDL().SetHook(callback) + tk.MustExec("alter table t add index idx(c);") + dom.DDL().SetHook(originHook) + require.True(t, runUpdate) + for _, err := range checkErrs { + require.NoError(t, err) + } + tk.MustExec("admin check table t;") + tk.MustQuery("select * from t use index (idx);").Check(testkit.Rows("1 1 a a", "100 2 a a")) + tk.MustQuery("select * from t ignore index (idx);").Check(testkit.Rows("1 1 a a", "100 2 a a")) +} + +// TestCreateUniqueIndexKeyExist this case will test below things: +// Create one unique index idx((a*b+1)); +// insert (0, 6) and delete it; +// insert (0, 9), it should be successful; +// Should check temp key exist and skip deleted mark +// The error returned below: +// Error: Received unexpected error: +// +// [kv:1062]Duplicate entry '1' for key 't.idx' +func TestCreateUniqueIndexKeyExist(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(a int default 0, b int default 0)") + tk.MustExec("insert into t values (1, 1), (2, 2), (3, 3), (4, 4)") + + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + + stateDeleteOnlySQLs := []string{"insert into t values (5, 5)", "begin pessimistic;", "insert into t select * from t", "rollback", "insert into t set b = 6", "update t set b = 7 where a = 1", "delete from t where b = 4"} + + // If waitReorg timeout, the worker may enter writeReorg more than 2 times. + reorgTime := 0 + d := dom.DDL() + originalCallback := d.GetHook() + defer d.SetHook(originalCallback) + callback := &callback.TestDDLCallback{} + onJobUpdatedExportedFunc := func(job *model.Job) { + if t.Failed() { + return + } + var err error + switch job.SchemaState { + case model.StateDeleteOnly: + for _, sql := range stateDeleteOnlySQLs { + _, err = tk1.Exec(sql) + assert.NoError(t, err) + } + // (1, 7), (2, 2), (3, 3), (5, 5), (0, 6) + case model.StateWriteOnly: + _, err = tk1.Exec("insert into t values (8, 8)") + assert.NoError(t, err) + _, err = tk1.Exec("update t set b = 7 where a = 2") + assert.NoError(t, err) + _, err = tk1.Exec("delete from t where b = 3") + assert.NoError(t, err) + // (1, 7), (2, 7), (5, 5), (0, 6), (8, 8) + case model.StateWriteReorganization: + if reorgTime < 1 { + reorgTime++ + } else { + return + } + _, err = tk1.Exec("insert into t values (10, 10)") + assert.NoError(t, err) + _, err = tk1.Exec("delete from t where b = 6") + assert.NoError(t, err) + _, err = tk1.Exec("insert into t set b = 9") + assert.NoError(t, err) + _, err = tk1.Exec("update t set b = 7 where a = 5") + assert.NoError(t, err) + // (1, 7), (2, 7), (5, 7), (8, 8), (10, 10), (0, 9) + } + } + callback.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) + d.SetHook(callback) + tk.MustExec("alter table t add unique index idx((a*b+1))") + tk.MustExec("admin check table t") + tk.MustQuery("select * from t order by a, b").Check(testkit.Rows("0 9", "1 7", "2 7", "5 7", "8 8", "10 10")) +} + +func TestAddIndexMergeIndexUpdateOnDeleteOnly(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + tk.MustExec(`CREATE TABLE t (a DATE NULL DEFAULT '1619-01-18', b BOOL NULL DEFAULT '0') CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_bin';`) + tk.MustExec(`INSERT INTO t SET b = '1';`) + + updateSQLs := []string{ + "UPDATE t SET a = '9432-05-10', b = '0';", + "UPDATE t SET a = '9432-05-10', b = '1';", + } + + // Force onCreateIndex use the txn-merge process. + ingest.LitInitialized = false + tk.MustExec("set @@global.tidb_ddl_enable_fast_reorg = 1;") + tk.MustExec("set @@global.tidb_enable_mutation_checker = 1;") + tk.MustExec("set @@global.tidb_txn_assertion_level = 'STRICT';") + + var checkErrs []error + originHook := dom.DDL().GetHook() + callback := &callback.TestDDLCallback{ + Do: dom, + } + onJobUpdatedBefore := func(job *model.Job) { + if job.SchemaState == model.StateDeleteOnly { + for _, sql := range updateSQLs { + _, err := tk2.Exec(sql) + if err != nil { + checkErrs = append(checkErrs, err) + } + } + } + } + callback.OnJobUpdatedExported.Store(&onJobUpdatedBefore) + dom.DDL().SetHook(callback) + tk.MustExec("alter table t add index idx(b);") + dom.DDL().SetHook(originHook) + for _, err := range checkErrs { + require.NoError(t, err) + } + tk.MustExec("admin check table t;") +} + +func TestAddIndexMergeDeleteUniqueOnWriteOnly(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(a int default 0, b int default 0);") + tk.MustExec("insert into t values (1, 1), (2, 2), (3, 3), (4, 4);") + + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + + d := dom.DDL() + originalCallback := d.GetHook() + defer d.SetHook(originalCallback) + callback := &callback.TestDDLCallback{} + onJobUpdatedExportedFunc := func(job *model.Job) { + if t.Failed() { + return + } + var err error + switch job.SchemaState { + case model.StateDeleteOnly: + _, err = tk1.Exec("insert into t values (5, 5);") + assert.NoError(t, err) + case model.StateWriteOnly: + _, err = tk1.Exec("insert into t values (5, 7);") + assert.NoError(t, err) + _, err = tk1.Exec("delete from t where b = 7;") + assert.NoError(t, err) + } + } + callback.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) + d.SetHook(callback) + tk.MustExec("alter table t add unique index idx(a);") + tk.MustExec("admin check table t;") +} + +func TestAddIndexMergeDeleteNullUnique(t *testing.T) { + store := testkit.CreateMockStore(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(id int primary key, a int default 0);") + tk.MustExec("insert into t values (1, 1), (2, null);") + + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + + ddl.MockDMLExecution = func() { + _, err := tk1.Exec("delete from t where id = 2;") + assert.NoError(t, err) + } + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockDMLExecution", "1*return(true)->return(false)")) + tk.MustExec("alter table t add unique index idx(a);") + tk.MustQuery("select count(1) from t;").Check(testkit.Rows("1")) + tk.MustExec("admin check table t;") + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockDMLExecution")) +} + +func TestAddIndexMergeDoubleDelete(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(id int primary key, a int default 0);") + + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + + d := dom.DDL() + originalCallback := d.GetHook() + defer d.SetHook(originalCallback) + callback := &callback.TestDDLCallback{} + onJobUpdatedExportedFunc := func(job *model.Job) { + if t.Failed() { + return + } + switch job.SchemaState { + case model.StateWriteOnly: + _, err := tk1.Exec("insert into t values (1, 1);") + assert.NoError(t, err) + } + } + callback.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) + d.SetHook(callback) + + ddl.MockDMLExecution = func() { + _, err := tk1.Exec("delete from t where id = 1;") + assert.NoError(t, err) + _, err = tk1.Exec("insert into t values (2, 1);") + assert.NoError(t, err) + _, err = tk1.Exec("delete from t where id = 2;") + assert.NoError(t, err) + } + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockDMLExecution", "1*return(true)->return(false)")) + tk.MustExec("alter table t add unique index idx(a);") + tk.MustQuery("select count(1) from t;").Check(testkit.Rows("0")) + tk.MustExec("admin check table t;") + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockDMLExecution")) +} + +func TestAddIndexMergeConflictWithPessimistic(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + tk.MustExec(`CREATE TABLE t (id int primary key, a int);`) + tk.MustExec(`INSERT INTO t VALUES (1, 1);`) + + // Make shorten the conversion time from ReorgTypeLitMerge to BackfillStateReadyToMerge. + interval := ddl.CheckBackfillJobFinishInterval + ddl.CheckBackfillJobFinishInterval = 50 * time.Millisecond + defer func() { ddl.CheckBackfillJobFinishInterval = interval }() + + // Force onCreateIndex use the txn-merge process. + ingest.LitInitialized = false + tk.MustExec("set @@global.tidb_ddl_enable_fast_reorg = 1;") + tk.MustExec("set @@global.tidb_enable_metadata_lock = 0;") + + originHook := dom.DDL().GetHook() + callback := &callback.TestDDLCallback{Do: dom} + + runPessimisticTxn := false + afterPessDML := make(chan struct{}, 1) + callback.OnJobRunBeforeExported = func(job *model.Job) { + if t.Failed() { + return + } + if job.SchemaState == model.StateWriteOnly { + // Write a record to the temp index. + _, err := tk2.Exec("update t set a = 2 where id = 1;") + assert.NoError(t, err) + } + if !runPessimisticTxn && job.SchemaState == model.StateWriteReorganization { + idx := testutil.FindIdxInfo(dom, "test", "t", "idx") + if idx == nil { + return + } + if idx.BackfillState != model.BackfillStateReadyToMerge { + return + } + runPessimisticTxn = true + _, err := tk2.Exec("begin pessimistic;") + assert.NoError(t, err) + _, err = tk2.Exec("update t set a = 3 where id = 1;") + assert.NoError(t, err) + afterPessDML <- struct{}{} + } + } + dom.DDL().SetHook(callback) + afterCommit := make(chan struct{}, 1) + go func() { + tk.MustExec("alter table t add index idx(a);") + afterCommit <- struct{}{} + }() + timer := time.NewTimer(300 * time.Millisecond) + select { + case <-timer.C: + break + case <-afterCommit: + require.Fail(t, "should be blocked by the pessimistic txn") + } + <-afterPessDML + tk2.MustExec("rollback;") + <-afterCommit + dom.DDL().SetHook(originHook) + tk.MustExec("admin check table t;") + tk.MustQuery("select * from t;").Check(testkit.Rows("1 2")) +} + +func TestAddIndexMergeInsertOnMerging(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(a int default 0, b int default 0)") + + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + + d := dom.DDL() + originalCallback := d.GetHook() + defer d.SetHook(originalCallback) + callback := &callback.TestDDLCallback{} + onJobUpdatedExportedFunc := func(job *model.Job) { + if t.Failed() { + return + } + var err error + switch job.SchemaState { + case model.StateDeleteOnly: + _, err = tk1.Exec("insert into t values (5, 5)") + assert.NoError(t, err) + case model.StateWriteOnly: + _, err = tk1.Exec("insert into t values (5, 7)") + assert.NoError(t, err) + _, err = tk1.Exec("delete from t where b = 7") + assert.NoError(t, err) + } + } + callback.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) + d.SetHook(callback) + + ddl.MockDMLExecutionStateMerging = func() { + _, err := tk1.Exec("insert into t values (5, 8);") + assert.Error(t, err) // [kv:1062]Duplicate entry '5' for key 't.idx' + _, err = tk1.Exec("insert into t values (5, 8) on duplicate key update a = 6;") + assert.NoError(t, err) // The row should be normally updated to (6, 5). + ddl.MockDMLExecutionStateMerging = nil + } + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockDMLExecutionStateMerging", "return(true)")) + tk.MustExec("alter table t add unique index idx(a);") + tk.MustExec("admin check table t;") + tk.MustQuery("select * from t;").Check(testkit.Rows("6 5")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockDMLExecutionStateMerging")) +} + +func TestAddIndexMergeReplaceOnMerging(t *testing.T) { + store := testkit.CreateMockStore(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(a int default 0, b int default 0);") + tk.MustExec("insert into t values (5, 5);") + + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + + ddl.MockDMLExecution = func() { + _, err := tk1.Exec("delete from t where b = 5;") + assert.NoError(t, err) + } + + ddl.MockDMLExecutionStateMerging = func() { + _, err := tk1.Exec("replace into t values (5, 8);") + assert.NoError(t, err) + ddl.MockDMLExecutionStateMerging = nil + } + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockDMLExecution", "1*return(true)->return(false)")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockDMLExecutionStateMerging", "return(true)")) + tk.MustExec("alter table t add unique index idx(a);") + tk.MustExec("admin check table t;") + tk.MustQuery("select * from t;").Check(testkit.Rows("5 8")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockDMLExecution")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockDMLExecutionStateMerging")) +} + +func TestAddIndexMergeInsertToDeletedTempIndex(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(a int default 0, b int default 0)") + tk.MustExec("insert into t values (5, 5);") + + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + + d := dom.DDL() + originalCallback := d.GetHook() + defer d.SetHook(originalCallback) + callback := &callback.TestDDLCallback{} + onJobUpdatedExportedFunc := func(job *model.Job) { + if t.Failed() { + return + } + var err error + switch job.SchemaState { + case model.StateWriteOnly: + _, err = tk1.Exec("delete from t where b = 5") + assert.NoError(t, err) + _, err := tk1.Exec("set @@tidb_constraint_check_in_place = true;") + assert.NoError(t, err) + _, err = tk1.Exec("insert into t values (5, 8);") + assert.NoError(t, err) + _, err = tk1.Exec("insert into t values (5, 8);") + assert.Error(t, err) + _, err = tk1.Exec("set @@tidb_constraint_check_in_place = false;") + assert.NoError(t, err) + _, err = tk1.Exec("insert into t values (5, 8);") + assert.Error(t, err) + } + } + callback.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) + d.SetHook(callback) + + tk.MustExec("alter table t add unique index idx(a);") + tk.MustExec("admin check table t;") + tk.MustQuery("select * from t;").Check(testkit.Rows("5 8")) +} + +func TestAddIndexMergeReplaceDelete(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(id int primary key, a int default 0);") + + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + + d := dom.DDL() + originalCallback := d.GetHook() + defer d.SetHook(originalCallback) + callback := &callback.TestDDLCallback{} + onJobUpdatedExportedFunc := func(job *model.Job) { + if t.Failed() { + return + } + switch job.SchemaState { + case model.StateDeleteOnly: + _, err := tk1.Exec("insert into t values (1, 1);") + assert.NoError(t, err) + } + } + callback.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) + d.SetHook(callback) + + ddl.MockDMLExecutionMerging = func() { + _, err := tk1.Exec("replace into t values (2, 1);") + assert.NoError(t, err) + _, err = tk1.Exec("delete from t where id = 2;") + assert.NoError(t, err) + } + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockDMLExecutionMerging", "1*return(true)->return(false)")) + tk.MustExec("alter table t add unique index idx(a);") + tk.MustExec("admin check table t;") + tk.MustQuery("select * from t;").Check(testkit.Rows()) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockDMLExecutionMerging")) +} + +func TestAddIndexMergeDeleteDifferentHandle(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(id int primary key, c char(10));") + tk.MustExec("insert into t values (1, 'a');") + + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + + d := dom.DDL() + originalCallback := d.GetHook() + defer d.SetHook(originalCallback) + callback := &callback.TestDDLCallback{} + runDML := false + onJobUpdatedExportedFunc := func(job *model.Job) { + if t.Failed() || runDML { + return + } + if job.SnapshotVer == 0 { + return + } + switch job.SchemaState { + case model.StateWriteReorganization: + _, err := tk1.Exec("insert into t values (2, 'a');") + assert.NoError(t, err) + _, err = tk1.Exec("replace into t values (3, 'a');") + assert.NoError(t, err) + runDML = true + } + } + callback.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) + d.SetHook(callback) + + ddl.MockDMLExecution = func() { + // It is too late to remove the duplicated index value. + _, err := tk1.Exec("delete from t where id = 1;") + assert.NoError(t, err) + } + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockDMLExecution", "1*return(true)->return(false)")) + tk.MustGetErrCode("alter table t add unique index idx(c);", errno.ErrDupEntry) + tk.MustExec("admin check table t;") + tk.MustQuery("select * from t;").Check(testkit.Rows("3 a")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockDMLExecution")) +} + +func TestAddIndexDecodeTempIndexCommonHandle(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(id_a bigint, id_b char(20), c char(20), primary key (id_a, id_b));") + tk.MustExec("insert into t values (1, 'id_1', 'char_1');") + + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + + d := dom.DDL() + originalCallback := d.GetHook() + defer d.SetHook(originalCallback) + callback := &callback.TestDDLCallback{} + runDML := false + onJobUpdatedExportedFunc := func(job *model.Job) { + if t.Failed() || runDML { + return + } + if job.SnapshotVer == 0 { + return + } + switch job.SchemaState { + case model.StateWriteReorganization: + _, err := tk1.Exec("insert into t values (2, 'id_2', 'char_2');") + assert.NoError(t, err) + _, err = tk1.Exec("insert into t values (3, 'id_3', 'char_3');") + assert.NoError(t, err) + runDML = true + } + } + callback.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) + d.SetHook(callback) + + tk.MustExec("alter table t add unique index idx(c);") + tk.MustExec("admin check table t;") + tk.MustQuery("select * from t;").Check(testkit.Rows("1 id_1 char_1", "2 id_2 char_2", "3 id_3 char_3")) +} + +func TestAddIndexInsertIgnoreOnBackfill(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(id int primary key, b int);") + + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + + d := dom.DDL() + originalCallback := d.GetHook() + defer d.SetHook(originalCallback) + callback := &callback.TestDDLCallback{} + runDML := false + onJobUpdatedExportedFunc := func(job *model.Job) { + if t.Failed() || runDML { + return + } + switch job.SchemaState { + case model.StateWriteReorganization: + _, err := tk1.Exec("insert ignore into t values (1, 1);") + assert.NoError(t, err) + _, err = tk1.Exec("insert ignore into t values (2, 2);") + assert.NoError(t, err) + _, err = tk1.Exec("update t set b = null where id = 1;") + assert.NoError(t, err) + runDML = true + } + } + callback.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) + d.SetHook(callback) + + tk.MustExec("alter table t add unique index idx(b);") + tk.MustExec("admin check table t;") + tk.MustQuery("select * from t;").Check(testkit.Rows("1 ", "2 2")) +} + +func TestAddIndexMultipleDelete(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(id int primary key, b int);") + tk.MustExec("insert into t values (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1);") + + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + + d := dom.DDL() + originalCallback := d.GetHook() + defer d.SetHook(originalCallback) + callback := &callback.TestDDLCallback{} + onJobUpdatedExportedFunc := func(job *model.Job) { + if t.Failed() { + return + } + switch job.SchemaState { + case model.StateDeleteOnly: + _, err := tk1.Exec("delete from t where id in (4, 5, 6);") + assert.NoError(t, err) + case model.StateWriteOnly: + _, err := tk1.Exec("delete from t where id in (2, 3);") + assert.NoError(t, err) + } + } + callback.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) + d.SetHook(callback) + + ddl.MockDMLExecution = func() { + _, err := tk1.Exec("delete from t where id = 1;") + assert.NoError(t, err) + } + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockDMLExecution", "1*return(true)->return(false)")) + tk.MustExec("alter table t add unique index idx(b);") + tk.MustExec("admin check table t;") + tk.MustQuery("select * from t;").Check(testkit.Rows()) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockDMLExecution")) +} diff --git a/ddl/ingest/BUILD.bazel b/ddl/ingest/BUILD.bazel index 3fd286e450b25..902900c316a12 100644 --- a/ddl/ingest/BUILD.bazel +++ b/ddl/ingest/BUILD.bazel @@ -33,19 +33,20 @@ go_library( "//sessionctx/variable", "//table", "//util", + "//util/dbterror", "//util/generic", "//util/logutil", "//util/mathutil", "//util/size", "@com_github_google_uuid//:uuid", "@com_github_pingcap_errors//:errors", - "@com_github_pkg_errors//:errors", "@org_uber_go_zap//:zap", ], ) go_test( name = "ingest_test", + timeout = "short", srcs = [ "env_test.go", "mem_root_test.go", diff --git a/ddl/ingest/backend.go b/ddl/ingest/backend.go index 63034f0be3a22..a94639d89d6bb 100644 --- a/ddl/ingest/backend.go +++ b/ddl/ingest/backend.go @@ -17,13 +17,13 @@ package ingest import ( "context" - "github.com/pingcap/errors" "github.com/pingcap/tidb/br/pkg/lightning/backend" "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" - "github.com/pingcap/tidb/br/pkg/lightning/config" + lightning "github.com/pingcap/tidb/br/pkg/lightning/config" tikv "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/logutil" "go.uber.org/zap" ) @@ -33,7 +33,7 @@ type BackendContext struct { jobID int64 backend *backend.Backend ctx context.Context - cfg *config.Config + cfg *lightning.Config EngMgr engineManager sysVars map[string]string diskRoot DiskRoot @@ -45,7 +45,7 @@ type BackendContext struct { func (bc *BackendContext) FinishImport(indexID int64, unique bool, tbl table.Table) error { ei, exist := bc.EngMgr.Load(indexID) if !exist { - return errors.New(LitErrGetEngineFail) + return dbterror.ErrIngestFailed.FastGenByArgs("ingest engine not found") } err := ei.ImportAndClean() @@ -63,7 +63,7 @@ func (bc *BackendContext) FinishImport(indexID int64, unique bool, tbl table.Tab if err != nil { logutil.BgLogger().Error(LitInfoRemoteDupCheck, zap.Error(err), zap.String("table", tbl.Meta().Name.O), zap.Int64("index ID", indexID)) - return errors.New(LitInfoRemoteDupCheck) + return err } else if hasDupe { logutil.BgLogger().Error(LitErrRemoteDupExistErr, zap.String("table", tbl.Meta().Name.O), zap.Int64("index ID", indexID)) @@ -80,7 +80,7 @@ func (bc *BackendContext) Flush(indexID int64) error { ei, exist := bc.EngMgr.Load(indexID) if !exist { logutil.BgLogger().Error(LitErrGetEngineFail, zap.Int64("index ID", indexID)) - return errors.New(LitErrGetEngineFail) + return dbterror.ErrIngestFailed.FastGenByArgs("ingest engine not found") } err := bc.diskRoot.UpdateUsageAndQuota() @@ -99,7 +99,7 @@ func (bc *BackendContext) Flush(indexID int64) error { logutil.BgLogger().Info(LitInfoUnsafeImport, zap.Int64("index ID", indexID), zap.Uint64("current disk usage", bc.diskRoot.CurrentUsage()), zap.Uint64("max disk quota", bc.diskRoot.MaxQuota())) - err = bc.backend.UnsafeImportAndReset(bc.ctx, ei.uuid, int64(config.SplitRegionSize)*int64(config.MaxSplitRegionSizeRatio), int64(config.SplitRegionKeys)) + err = bc.backend.UnsafeImportAndReset(bc.ctx, ei.uuid, int64(lightning.SplitRegionSize)*int64(lightning.MaxSplitRegionSizeRatio), int64(lightning.SplitRegionKeys)) if err != nil { logutil.BgLogger().Error(LitErrIngestDataErr, zap.Int64("index ID", indexID), zap.Error(err), zap.Uint64("current disk usage", bc.diskRoot.CurrentUsage()), diff --git a/ddl/ingest/backend_mgr.go b/ddl/ingest/backend_mgr.go index 14bb4fb3aa67a..49788c9760b58 100644 --- a/ddl/ingest/backend_mgr.go +++ b/ddl/ingest/backend_mgr.go @@ -56,7 +56,7 @@ func (m *backendCtxManager) Register(ctx context.Context, unique bool, jobID int if !ok { return nil, genBackendAllocMemFailedErr(m.memRoot, jobID) } - cfg, err := generateLightningConfig(m.memRoot, jobID, unique) + cfg, err := genConfig(m.memRoot, jobID, unique) if err != nil { logutil.BgLogger().Warn(LitWarnConfigError, zap.Int64("job ID", jobID), zap.Error(err)) return nil, err @@ -67,7 +67,7 @@ func (m *backendCtxManager) Register(ctx context.Context, unique bool, jobID int return nil, err } - bcCtx := newBackendContext(ctx, jobID, &bd, cfg, defaultImportantVariables, m.memRoot, m.diskRoot) + bcCtx := newBackendContext(ctx, jobID, &bd, cfg.Lightning, defaultImportantVariables, m.memRoot, m.diskRoot) m.Store(jobID, bcCtx) m.memRoot.Consume(StructSizeBackendCtx) @@ -80,15 +80,16 @@ func (m *backendCtxManager) Register(ctx context.Context, unique bool, jobID int return bc, nil } -func createLocalBackend(ctx context.Context, cfg *config.Config, glue glue.Glue) (backend.Backend, error) { - tls, err := cfg.ToTLS() +func createLocalBackend(ctx context.Context, cfg *Config, glue glue.Glue) (backend.Backend, error) { + tls, err := cfg.Lightning.ToTLS() if err != nil { logutil.BgLogger().Error(LitErrCreateBackendFail, zap.Error(err)) return backend.Backend{}, err } - errorMgr := errormanager.New(nil, cfg, log.Logger{Logger: logutil.BgLogger()}) - return local.NewLocalBackend(ctx, tls, cfg, glue, int(LitRLimit), errorMgr) + logutil.BgLogger().Info("[ddl-ingest] create local backend for adding index", zap.String("keyspaceName", cfg.KeyspaceName)) + errorMgr := errormanager.New(nil, cfg.Lightning, log.Logger{Logger: logutil.BgLogger()}) + return local.NewLocalBackend(ctx, tls, cfg.Lightning, glue, int(LitRLimit), errorMgr, cfg.KeyspaceName) } func newBackendContext(ctx context.Context, jobID int64, be *backend.Backend, diff --git a/ddl/ingest/config.go b/ddl/ingest/config.go index 3a96e8ae5201b..7362c2fbc5823 100644 --- a/ddl/ingest/config.go +++ b/ddl/ingest/config.go @@ -16,22 +16,35 @@ package ingest import ( "path/filepath" + "sync/atomic" "github.com/pingcap/tidb/br/pkg/lightning/backend" "github.com/pingcap/tidb/br/pkg/lightning/checkpoints" - "github.com/pingcap/tidb/br/pkg/lightning/config" - tidbconf "github.com/pingcap/tidb/config" + lightning "github.com/pingcap/tidb/br/pkg/lightning/config" + tidb "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/size" "go.uber.org/zap" ) -func generateLightningConfig(memRoot MemRoot, jobID int64, unique bool) (*config.Config, error) { - tidbCfg := tidbconf.GetGlobalConfig() - cfg := config.NewConfig() - cfg.TikvImporter.Backend = config.BackendLocal +// ImporterRangeConcurrencyForTest is only used for test. +var ImporterRangeConcurrencyForTest *atomic.Int32 + +// Config is the configuration for the lightning local backend used in DDL. +type Config struct { + Lightning *lightning.Config + KeyspaceName string +} + +func genConfig(memRoot MemRoot, jobID int64, unique bool) (*Config, error) { + tidbCfg := tidb.GetGlobalConfig() + cfg := lightning.NewConfig() + cfg.TikvImporter.Backend = lightning.BackendLocal // Each backend will build a single dir in lightning dir. cfg.TikvImporter.SortedKVDir = filepath.Join(LitSortPath, encodeBackendTag(jobID)) + if ImporterRangeConcurrencyForTest != nil { + cfg.TikvImporter.RangeConcurrency = int(ImporterRangeConcurrencyForTest.Load()) + } _, err := cfg.AdjustCommon() if err != nil { logutil.BgLogger().Warn(LitWarnConfigError, zap.Error(err)) @@ -40,9 +53,9 @@ func generateLightningConfig(memRoot MemRoot, jobID int64, unique bool) (*config adjustImportMemory(memRoot, cfg) cfg.Checkpoint.Enable = true if unique { - cfg.TikvImporter.DuplicateResolution = config.DupeResAlgRecord + cfg.TikvImporter.DuplicateResolution = lightning.DupeResAlgErr } else { - cfg.TikvImporter.DuplicateResolution = config.DupeResAlgNone + cfg.TikvImporter.DuplicateResolution = lightning.DupeResAlgNone } cfg.TiDB.PdAddr = tidbCfg.Path cfg.TiDB.Host = "127.0.0.1" @@ -52,7 +65,12 @@ func generateLightningConfig(memRoot MemRoot, jobID int64, unique bool) (*config cfg.Security.CertPath = tidbCfg.Security.ClusterSSLCert cfg.Security.KeyPath = tidbCfg.Security.ClusterSSLKey - return cfg, err + c := &Config{ + Lightning: cfg, + KeyspaceName: tidb.GetGlobalKeyspaceName(), + } + + return c, err } var ( @@ -76,7 +94,7 @@ func generateLocalEngineConfig(id int64, dbName, tbName string) *backend.EngineC } // adjustImportMemory adjusts the lightning memory parameters according to the memory root's max limitation. -func adjustImportMemory(memRoot MemRoot, cfg *config.Config) { +func adjustImportMemory(memRoot MemRoot, cfg *lightning.Config) { var scale int64 // Try aggressive resource usage successful. if tryAggressiveMemory(memRoot, cfg) { @@ -97,8 +115,8 @@ func adjustImportMemory(memRoot MemRoot, cfg *config.Config) { return } - cfg.TikvImporter.LocalWriterMemCacheSize /= config.ByteSize(scale) - cfg.TikvImporter.EngineMemCacheSize /= config.ByteSize(scale) + cfg.TikvImporter.LocalWriterMemCacheSize /= lightning.ByteSize(scale) + cfg.TikvImporter.EngineMemCacheSize /= lightning.ByteSize(scale) // TODO: adjust range concurrency number to control total concurrency in the future. logutil.BgLogger().Info(LitInfoChgMemSetting, zap.Int64("local writer memory cache size", int64(cfg.TikvImporter.LocalWriterMemCacheSize)), @@ -107,7 +125,7 @@ func adjustImportMemory(memRoot MemRoot, cfg *config.Config) { } // tryAggressiveMemory lightning memory parameters according memory root's max limitation. -func tryAggressiveMemory(memRoot MemRoot, cfg *config.Config) bool { +func tryAggressiveMemory(memRoot MemRoot, cfg *lightning.Config) bool { var defaultMemSize int64 defaultMemSize = int64(int(cfg.TikvImporter.LocalWriterMemCacheSize) * cfg.TikvImporter.RangeConcurrency) defaultMemSize += int64(cfg.TikvImporter.EngineMemCacheSize) diff --git a/ddl/ingest/disk_root.go b/ddl/ingest/disk_root.go index c1c98f3fe681a..e2a1176a76878 100644 --- a/ddl/ingest/disk_root.go +++ b/ddl/ingest/disk_root.go @@ -15,7 +15,8 @@ package ingest import ( - "github.com/pingcap/errors" + "sync" + lcom "github.com/pingcap/tidb/br/pkg/lightning/common" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/util/logutil" @@ -38,6 +39,7 @@ type diskRootImpl struct { currentUsage uint64 maxQuota uint64 bcCtx *backendCtxManager + mu sync.RWMutex } // NewDiskRootImpl creates a new DiskRoot. @@ -50,22 +52,32 @@ func NewDiskRootImpl(path string, bcCtx *backendCtxManager) DiskRoot { // CurrentUsage implements DiskRoot interface. func (d *diskRootImpl) CurrentUsage() uint64 { - return d.currentUsage + d.mu.RLock() + usage := d.currentUsage + d.mu.RUnlock() + return usage } // MaxQuota implements DiskRoot interface. func (d *diskRootImpl) MaxQuota() uint64 { - return d.maxQuota + d.mu.RLock() + quota := d.maxQuota + d.mu.RUnlock() + return quota } // UpdateUsageAndQuota implements DiskRoot interface. func (d *diskRootImpl) UpdateUsageAndQuota() error { - d.currentUsage = d.bcCtx.TotalDiskUsage() + totalDiskUsage := d.bcCtx.TotalDiskUsage() sz, err := lcom.GetStorageSize(d.path) if err != nil { logutil.BgLogger().Error(LitErrGetStorageQuota, zap.Error(err)) - return errors.New(LitErrGetStorageQuota) + return err } - d.maxQuota = mathutil.Min(variable.DDLDiskQuota.Load(), uint64(capacityThreshold*float64(sz.Capacity))) + maxQuota := mathutil.Min(variable.DDLDiskQuota.Load(), uint64(capacityThreshold*float64(sz.Capacity))) + d.mu.Lock() + d.currentUsage = totalDiskUsage + d.maxQuota = maxQuota + d.mu.Unlock() return nil } diff --git a/ddl/ingest/engine.go b/ddl/ingest/engine.go index d875d78e346d0..24779ef9d7718 100644 --- a/ddl/ingest/engine.go +++ b/ddl/ingest/engine.go @@ -17,6 +17,7 @@ package ingest import ( "context" "strconv" + "sync/atomic" "github.com/google/uuid" "github.com/pingcap/tidb/br/pkg/lightning/backend" @@ -25,7 +26,6 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/config" "github.com/pingcap/tidb/util/generic" "github.com/pingcap/tidb/util/logutil" - "github.com/pkg/errors" "go.uber.org/zap" ) @@ -42,6 +42,7 @@ type engineInfo struct { writerCache generic.SyncMap[int, *backend.LocalEngineWriter] memRoot MemRoot diskRoot DiskRoot + rowSeq atomic.Int64 } // NewEngineInfo create a new EngineInfo struct. @@ -83,6 +84,11 @@ func (ei *engineInfo) Clean() { zap.Int64("job ID", ei.jobID), zap.Int64("index ID", ei.indexID)) } ei.openedEngine = nil + err = ei.closeWriters() + if err != nil { + logutil.BgLogger().Error(LitErrCloseWriterErr, zap.Error(err), + zap.Int64("job ID", ei.jobID), zap.Int64("index ID", ei.indexID)) + } // Here the local intermediate files will be removed. err = closedEngine.Cleanup(ei.ctx) if err != nil { @@ -99,11 +105,17 @@ func (ei *engineInfo) ImportAndClean() error { if err1 != nil { logutil.BgLogger().Error(LitErrCloseEngineErr, zap.Error(err1), zap.Int64("job ID", ei.jobID), zap.Int64("index ID", ei.indexID)) - return errors.New(LitErrCloseEngineErr) + return err1 } ei.openedEngine = nil + err := ei.closeWriters() + if err != nil { + logutil.BgLogger().Error(LitErrCloseWriterErr, zap.Error(err), + zap.Int64("job ID", ei.jobID), zap.Int64("index ID", ei.indexID)) + return err + } - err := ei.diskRoot.UpdateUsageAndQuota() + err = ei.diskRoot.UpdateUsageAndQuota() if err != nil { logutil.BgLogger().Error(LitErrUpdateDiskStats, zap.Error(err), zap.Int64("job ID", ei.jobID), zap.Int64("index ID", ei.indexID)) @@ -118,7 +130,7 @@ func (ei *engineInfo) ImportAndClean() error { if err != nil { logutil.BgLogger().Error(LitErrIngestDataErr, zap.Error(err), zap.Int64("job ID", ei.jobID), zap.Int64("index ID", ei.indexID)) - return errors.New(LitErrIngestDataErr) + return err } // Clean up the engine local workspace. @@ -126,7 +138,7 @@ func (ei *engineInfo) ImportAndClean() error { if err != nil { logutil.BgLogger().Error(LitErrCloseEngineErr, zap.Error(err), zap.Int64("job ID", ei.jobID), zap.Int64("index ID", ei.indexID)) - return errors.New(LitErrCloseEngineErr) + return err } return nil } @@ -134,17 +146,18 @@ func (ei *engineInfo) ImportAndClean() error { // WriterContext is used to keep a lightning local writer for each backfill worker. type WriterContext struct { ctx context.Context + rowSeq func() int64 lWrite *backend.LocalEngineWriter } -func (ei *engineInfo) NewWriterCtx(id int) (*WriterContext, error) { +func (ei *engineInfo) NewWriterCtx(id int, unique bool) (*WriterContext, error) { ei.memRoot.RefreshConsumption() ok := ei.memRoot.CheckConsume(StructSizeWriterCtx) if !ok { return nil, genEngineAllocMemFailedErr(ei.memRoot, ei.jobID, ei.indexID) } - wCtx, err := ei.newWriterContext(id) + wCtx, err := ei.newWriterContext(id, unique) if err != nil { logutil.BgLogger().Error(LitErrCreateContextFail, zap.Error(err), zap.Int64("job ID", ei.jobID), zap.Int64("index ID", ei.indexID), @@ -165,7 +178,7 @@ func (ei *engineInfo) NewWriterCtx(id int) (*WriterContext, error) { // If local writer not exist, then create new one and store it into engine info writer cache. // note: operate ei.writeCache map is not thread safe please make sure there is sync mechanism to // make sure the safe. -func (ei *engineInfo) newWriterContext(workerID int) (*WriterContext, error) { +func (ei *engineInfo) newWriterContext(workerID int, unique bool) (*WriterContext, error) { lWrite, exist := ei.writerCache.Load(workerID) if !exist { var err error @@ -176,10 +189,32 @@ func (ei *engineInfo) newWriterContext(workerID int) (*WriterContext, error) { // Cache the local writer. ei.writerCache.Store(workerID, lWrite) } - return &WriterContext{ + wc := &WriterContext{ ctx: ei.ctx, lWrite: lWrite, - }, nil + } + if unique { + wc.rowSeq = func() int64 { + return ei.rowSeq.Add(1) + } + } + return wc, nil +} + +func (ei *engineInfo) closeWriters() error { + var firstErr error + for _, wid := range ei.writerCache.Keys() { + if w, ok := ei.writerCache.Load(wid); ok { + _, err := w.Close(ei.ctx) + if err != nil { + if firstErr == nil { + firstErr = err + } + } + } + ei.writerCache.Delete(wid) + } + return firstErr } // WriteRow Write one row into local writer buffer. @@ -187,6 +222,9 @@ func (wCtx *WriterContext) WriteRow(key, idxVal []byte) error { kvs := make([]common.KvPair, 1) kvs[0].Key = key kvs[0].Val = idxVal + if wCtx.rowSeq != nil { + kvs[0].RowID = wCtx.rowSeq() + } row := kv.MakeRowsFromKvPairs(kvs) return wCtx.lWrite.WriteRows(wCtx.ctx, nil, row) } diff --git a/ddl/ingest/engine_mgr.go b/ddl/ingest/engine_mgr.go index 44ecff9941932..f9b006ec9e369 100644 --- a/ddl/ingest/engine_mgr.go +++ b/ddl/ingest/engine_mgr.go @@ -18,7 +18,7 @@ import ( "fmt" "github.com/pingcap/errors" - "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/generic" "github.com/pingcap/tidb/util/logutil" "go.uber.org/zap" @@ -37,7 +37,7 @@ func (m *engineManager) init(memRoot MemRoot, diskRoot DiskRoot) { } // Register create a new engineInfo and register it to the engineManager. -func (m *engineManager) Register(bc *BackendContext, job *model.Job, indexID int64) (*engineInfo, error) { +func (m *engineManager) Register(bc *BackendContext, jobID, indexID int64, schemaName, tableName string) (*engineInfo, error) { // Calculate lightning concurrency degree and set memory usage // and pre-allocate memory usage for worker. m.MemRoot.RefreshConsumption() @@ -55,29 +55,31 @@ func (m *engineManager) Register(bc *BackendContext, job *model.Job, indexID int return nil, genEngineAllocMemFailedErr(m.MemRoot, bc.jobID, indexID) } - cfg := generateLocalEngineConfig(job.ID, job.SchemaName, job.TableName) - openedEn, err := bc.backend.OpenEngine(bc.ctx, cfg, job.TableName, int32(indexID)) + cfg := generateLocalEngineConfig(jobID, schemaName, tableName) + openedEn, err := bc.backend.OpenEngine(bc.ctx, cfg, tableName, int32(indexID)) if err != nil { - return nil, errors.New(LitErrCreateEngineFail) + logutil.BgLogger().Warn(LitErrCreateEngineFail, zap.Int64("job ID", jobID), + zap.Int64("index ID", indexID), zap.Error(err)) + return nil, errors.Trace(err) } id := openedEn.GetEngineUUID() - en = NewEngineInfo(bc.ctx, job.ID, indexID, cfg, openedEn, id, 1, m.MemRoot, m.DiskRoot) + en = NewEngineInfo(bc.ctx, jobID, indexID, cfg, openedEn, id, 1, m.MemRoot, m.DiskRoot) m.Store(indexID, en) m.MemRoot.Consume(StructSizeEngineInfo) - m.MemRoot.ConsumeWithTag(encodeEngineTag(job.ID, indexID), engineCacheSize) + m.MemRoot.ConsumeWithTag(encodeEngineTag(jobID, indexID), engineCacheSize) info = LitInfoOpenEngine } else { if en.writerCount+1 > bc.cfg.TikvImporter.RangeConcurrency { - logutil.BgLogger().Warn(LitErrExceedConcurrency, zap.Int64("job ID", job.ID), + logutil.BgLogger().Warn(LitErrExceedConcurrency, zap.Int64("job ID", jobID), zap.Int64("index ID", indexID), zap.Int("concurrency", bc.cfg.TikvImporter.RangeConcurrency)) - return nil, errors.New(LitErrExceedConcurrency) + return nil, dbterror.ErrIngestFailed.FastGenByArgs("concurrency quota exceeded") } en.writerCount++ info = LitInfoAddWriter } - m.MemRoot.ConsumeWithTag(encodeEngineTag(job.ID, indexID), int64(bc.cfg.TikvImporter.LocalWriterMemCacheSize)) - logutil.BgLogger().Info(info, zap.Int64("job ID", job.ID), + m.MemRoot.ConsumeWithTag(encodeEngineTag(jobID, indexID), int64(bc.cfg.TikvImporter.LocalWriterMemCacheSize)) + logutil.BgLogger().Info(info, zap.Int64("job ID", jobID), zap.Int64("index ID", indexID), zap.Int64("current memory usage", m.MemRoot.CurrentUsage()), zap.Int64("memory limitation", m.MemRoot.MaxMemoryQuota()), @@ -99,6 +101,20 @@ func (m *engineManager) Unregister(jobID, indexID int64) { m.MemRoot.Release(StructSizeEngineInfo) } +// ResetWorkers reset the writer count of the engineInfo because +// the goroutines of backfill workers have been terminated. +func (m *engineManager) ResetWorkers(bc *BackendContext, jobID, indexID int64) { + ei, exist := m.Load(indexID) + if !exist { + return + } + m.MemRoot.Release(StructSizeWriterCtx * int64(ei.writerCount)) + m.MemRoot.ReleaseWithTag(encodeEngineTag(jobID, indexID)) + engineCacheSize := int64(bc.cfg.TikvImporter.EngineMemCacheSize) + m.MemRoot.ConsumeWithTag(encodeEngineTag(jobID, indexID), engineCacheSize) + ei.writerCount = 0 +} + // UnregisterAll delete all engineInfo from the engineManager. func (m *engineManager) UnregisterAll(jobID int64) { for _, idxID := range m.Keys() { diff --git a/ddl/ingest/env.go b/ddl/ingest/env.go index 185f873b820a4..864cc61ae4e02 100644 --- a/ddl/ingest/env.go +++ b/ddl/ingest/env.go @@ -47,6 +47,14 @@ const maxMemoryQuota = 2 * size.GB // InitGlobalLightningEnv initialize Lightning backfill environment. func InitGlobalLightningEnv() { log.SetAppLogger(logutil.BgLogger()) + globalCfg := config.GetGlobalConfig() + if globalCfg.Store != "tikv" { + logutil.BgLogger().Warn(LitWarnEnvInitFail, + zap.String("storage limitation", "only support TiKV storage"), + zap.String("current storage", globalCfg.Store), + zap.Bool("lightning is initialized", LitInitialized)) + return + } sPath, err := genLightningDataDir() if err != nil { logutil.BgLogger().Warn(LitWarnEnvInitFail, zap.Error(err), @@ -102,8 +110,5 @@ func genLightningDataDir() (string, error) { return sortPath, nil } -// GenRLimitForTest is only used for test. -var GenRLimitForTest = util.GenRLimit() - // GenLightningDataDirForTest is only used for test. var GenLightningDataDirForTest = genLightningDataDir diff --git a/ddl/ingest/mem_root.go b/ddl/ingest/mem_root.go index a36d934c0abcd..522e5ddc1f7cc 100644 --- a/ddl/ingest/mem_root.go +++ b/ddl/ingest/mem_root.go @@ -122,7 +122,7 @@ func (m *memRootImpl) ConsumeWithTag(tag string, size int64) { m.structSize[tag] = size } -// TestConsume implements MemRoot. +// CheckConsume implements MemRoot. func (m *memRootImpl) CheckConsume(size int64) bool { m.mu.RLock() defer m.mu.RUnlock() diff --git a/ddl/ingest/message.go b/ddl/ingest/message.go index 3858d40ec4e0a..4996aab49a415 100644 --- a/ddl/ingest/message.go +++ b/ddl/ingest/message.go @@ -15,7 +15,7 @@ package ingest import ( - "github.com/pingcap/errors" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/logutil" "go.uber.org/zap" ) @@ -23,28 +23,26 @@ import ( // Message const text const ( LitErrAllocMemFail string = "[ddl-ingest] allocate memory failed" - LitErrOutMaxMem string = "[ddl-ingest] memory used up for lightning add index" - LitErrCreateDirFail string = "[ddl-ingest] create lightning sort path error" - LitErrStatDirFail string = "[ddl-ingest] stat lightning sort path error" - LitErrDeleteDirFail string = "[ddl-ingest] delete lightning sort path error" - LitErrCreateBackendFail string = "[ddl-ingest] build lightning backend failed, will use kernel index reorg method to backfill the index" - LitErrGetBackendFail string = "[ddl-ingest]: Can not get cached backend" - LitErrCreateEngineFail string = "[ddl-ingest] build lightning engine failed, will use kernel index reorg method to backfill the index" - LitErrCreateContextFail string = "[ddl-ingest] build lightning worker context failed, will use kernel index reorg method to backfill the index" - LitErrGetEngineFail string = "[ddl-ingest] can not get cached engine info" + LitErrCreateDirFail string = "[ddl-ingest] create ingest sort path error" + LitErrStatDirFail string = "[ddl-ingest] stat ingest sort path error" + LitErrDeleteDirFail string = "[ddl-ingest] delete ingest sort path error" + LitErrCreateBackendFail string = "[ddl-ingest] build ingest backend failed" + LitErrGetBackendFail string = "[ddl-ingest] cannot get ingest backend" + LitErrCreateEngineFail string = "[ddl-ingest] build ingest engine failed" + LitErrCreateContextFail string = "[ddl-ingest] build ingest writer context failed" + LitErrGetEngineFail string = "[ddl-ingest] can not get ingest engine info" LitErrGetStorageQuota string = "[ddl-ingest] get storage quota error" LitErrCloseEngineErr string = "[ddl-ingest] close engine error" LitErrCleanEngineErr string = "[ddl-ingest] clean engine error" LitErrFlushEngineErr string = "[ddl-ingest] flush engine data err" LitErrIngestDataErr string = "[ddl-ingest] ingest data into storage error" LitErrRemoteDupExistErr string = "[ddl-ingest] remote duplicate index key exist" - LitErrExceedConcurrency string = "[ddl-ingest] the concurrency is greater than lightning limit(tikv-importer.range-concurrency)" + LitErrExceedConcurrency string = "[ddl-ingest] the concurrency is greater than ingest limit" LitErrUpdateDiskStats string = "[ddl-ingest] update disk usage error" LitWarnEnvInitFail string = "[ddl-ingest] initialize environment failed" LitWarnConfigError string = "[ddl-ingest] build config for backend failed" - LitWarnGenMemLimit string = "[ddl-ingest] generate memory max limitation" - LitInfoEnvInitSucc string = "[ddl-ingest] init global lightning backend environment finished" - LitInfoSortDir string = "[ddl-ingest] the lightning sorted dir" + LitInfoEnvInitSucc string = "[ddl-ingest] init global ingest backend environment finished" + LitInfoSortDir string = "[ddl-ingest] the ingest sorted directory" LitInfoCreateBackend string = "[ddl-ingest] create one backend for an DDL job" LitInfoCloseBackend string = "[ddl-ingest] close one backend for DDL job" LitInfoOpenEngine string = "[ddl-ingest] open an engine for index reorg task" @@ -53,17 +51,17 @@ const ( LitInfoCloseEngine string = "[ddl-ingest] flush all writer and get closed engine" LitInfoRemoteDupCheck string = "[ddl-ingest] start remote duplicate checking" LitInfoStartImport string = "[ddl-ingest] start to import data" - LitInfoSetMemLimit string = "[ddl-ingest] set max memory limitation" - LitInfoChgMemSetting string = "[ddl-ingest] change memory setting for lightning" - LitInfoInitMemSetting string = "[ddl-ingest] initial memory setting for lightning" + LitInfoChgMemSetting string = "[ddl-ingest] change memory setting for ingest" + LitInfoInitMemSetting string = "[ddl-ingest] initial memory setting for ingest" LitInfoUnsafeImport string = "[ddl-ingest] do a partial import data into the storage" + LitErrCloseWriterErr string = "[ddl-ingest] close writer error" ) func genBackendAllocMemFailedErr(memRoot MemRoot, jobID int64) error { logutil.BgLogger().Warn(LitErrAllocMemFail, zap.Int64("job ID", jobID), zap.Int64("current memory usage", memRoot.CurrentUsage()), zap.Int64("max memory quota", memRoot.MaxMemoryQuota())) - return errors.New(LitErrOutMaxMem) + return dbterror.ErrIngestFailed.FastGenByArgs("memory used up") } func genEngineAllocMemFailedErr(memRoot MemRoot, jobID, idxID int64) error { @@ -71,5 +69,5 @@ func genEngineAllocMemFailedErr(memRoot MemRoot, jobID, idxID int64) error { zap.Int64("index ID", idxID), zap.Int64("current memory usage", memRoot.CurrentUsage()), zap.Int64("max memory quota", memRoot.MaxMemoryQuota())) - return errors.New(LitErrOutMaxMem) + return dbterror.ErrIngestFailed.FastGenByArgs("memory used up") } diff --git a/ddl/integration_test.go b/ddl/integration_test.go index 29e69aa855274..264e755889899 100644 --- a/ddl/integration_test.go +++ b/ddl/integration_test.go @@ -18,7 +18,7 @@ import ( "fmt" "testing" - "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/testkit" "github.com/stretchr/testify/require" @@ -86,7 +86,7 @@ func TestDDLStatementsBackFill(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") needReorg := false - callback := &ddl.TestDDLCallback{ + callback := &callback.TestDDLCallback{ Do: dom, } onJobUpdatedExportedFunc := func(job *model.Job) { diff --git a/ddl/internal/callback/BUILD.bazel b/ddl/internal/callback/BUILD.bazel new file mode 100644 index 0000000000000..63a4cf7f4687f --- /dev/null +++ b/ddl/internal/callback/BUILD.bazel @@ -0,0 +1,28 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "callback", + srcs = ["callback.go"], + importpath = "github.com/pingcap/tidb/ddl/internal/callback", + visibility = ["//ddl:__subpackages__"], + deps = [ + "//ddl", + "//infoschema", + "//parser/model", + "//sessionctx", + "//util/logutil", + "@org_uber_go_zap//:zap", + ], +) + +go_test( + name = "callback_test", + timeout = "short", + srcs = ["callback_test.go"], + embed = [":callback"], + flaky = True, + deps = [ + "//ddl", + "@com_github_stretchr_testify//require", + ], +) diff --git a/ddl/callback_test.go b/ddl/internal/callback/callback.go similarity index 93% rename from ddl/callback_test.go rename to ddl/internal/callback/callback.go index 5a97e8212689e..a3c84d774dd5c 100644 --- a/ddl/callback_test.go +++ b/ddl/internal/callback/callback.go @@ -1,4 +1,4 @@ -// Copyright 2015 PingCAP, Inc. +// Copyright 2023 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,27 +12,28 @@ // See the License for the specific language governing permissions and // limitations under the License. -package ddl +package callback import ( "context" "sync/atomic" - "testing" + "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/logutil" - "github.com/stretchr/testify/require" "go.uber.org/zap" ) +// TestInterceptor is a test interceptor in the ddl type TestInterceptor struct { - *BaseInterceptor + *ddl.BaseInterceptor OnGetInfoSchemaExported func(ctx sessionctx.Context, is infoschema.InfoSchema) infoschema.InfoSchema } +// OnGetInfoSchema is to run when to call GetInfoSchema func (ti *TestInterceptor) OnGetInfoSchema(ctx sessionctx.Context, is infoschema.InfoSchema) infoschema.InfoSchema { if ti.OnGetInfoSchemaExported != nil { return ti.OnGetInfoSchemaExported(ctx, is) @@ -43,10 +44,10 @@ func (ti *TestInterceptor) OnGetInfoSchema(ctx sessionctx.Context, is infoschema // TestDDLCallback is used to customize user callback themselves. type TestDDLCallback struct { - *BaseCallback + *ddl.BaseCallback // We recommended to pass the domain parameter to the test ddl callback, it will ensure // domain to reload schema before your ddl stepping into the next state change. - Do DomainReloader + Do ddl.DomainReloader onJobRunBefore func(*model.Job) OnJobRunBeforeExported func(*model.Job) @@ -149,11 +150,3 @@ func (tc *TestDDLCallback) OnGetJobAfter(jobType string, job *model.Job) { func (tc *TestDDLCallback) Clone() *TestDDLCallback { return &*tc } - -func TestCallback(t *testing.T) { - cb := &BaseCallback{} - require.Nil(t, cb.OnChanged(nil)) - cb.OnJobRunBefore(nil) - cb.OnJobUpdated(nil) - cb.OnWatched(context.TODO()) -} diff --git a/ddl/internal/callback/callback_test.go b/ddl/internal/callback/callback_test.go new file mode 100644 index 0000000000000..f611394909e48 --- /dev/null +++ b/ddl/internal/callback/callback_test.go @@ -0,0 +1,31 @@ +// Copyright 2023 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 callback + +import ( + "context" + "testing" + + "github.com/pingcap/tidb/ddl" + "github.com/stretchr/testify/require" +) + +func TestCallback(t *testing.T) { + cb := &ddl.BaseCallback{} + require.Nil(t, cb.OnChanged(nil)) + cb.OnJobRunBefore(nil) + cb.OnJobUpdated(nil) + cb.OnWatched(context.TODO()) +} diff --git a/ddl/job_table.go b/ddl/job_table.go index d23f083539e87..710fc7ad9d0ce 100644 --- a/ddl/job_table.go +++ b/ddl/job_table.go @@ -17,6 +17,7 @@ package ddl import ( "bytes" "context" + "encoding/hex" "fmt" "math" "strconv" @@ -26,11 +27,16 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/tidb/ddl/ingest" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/types" + tidbutil "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/logutil" clientv3 "go.etcd.io/etcd/client/v3" "go.uber.org/zap" @@ -39,6 +45,7 @@ import ( var ( addingDDLJobConcurrent = "/tidb/ddl/add_ddl_job_general" + addingBackfillJob = "/tidb/ddl/add_backfill_job" ) func (dc *ddlCtx) insertRunningDDLJobMap(id int64) { @@ -67,7 +74,7 @@ func (dc *ddlCtx) excludeJobIDs() string { } const ( - getJobSQL = "select job_meta, processing from mysql.tidb_ddl_job where job_id in (select min(job_id) from mysql.tidb_ddl_job group by schema_ids, table_ids) and %s reorg %s order by processing desc, job_id" + getJobSQL = "select job_meta, processing from mysql.tidb_ddl_job where job_id in (select min(job_id) from mysql.tidb_ddl_job group by schema_ids, table_ids, processing) and %s reorg %s order by processing desc, job_id" ) type jobType int @@ -173,7 +180,7 @@ func (d *ddl) startDispatchLoop() { if isChanClosed(d.ctx.Done()) { return } - if !variable.EnableConcurrentDDL.Load() || !d.isOwner() || d.waiting.Load() { + if !d.isOwner() || d.waiting.Load() { d.once.Store(true) time.Sleep(time.Second) continue @@ -236,7 +243,7 @@ func (d *ddl) delivery2worker(wk *worker, pool *workerPool, job *model.Job) { // check if this ddl job is synced to all servers. if !d.isSynced(job) || d.once.Load() { if variable.EnableMDL.Load() { - exist, err := checkMDLInfo(job.ID, d.sessPool) + exist, version, err := checkMDLInfo(job.ID, d.sessPool) if err != nil { logutil.BgLogger().Warn("[ddl] check MDL info failed", zap.Error(err), zap.String("job", job.String())) // Release the worker resource. @@ -245,14 +252,12 @@ func (d *ddl) delivery2worker(wk *worker, pool *workerPool, job *model.Job) { } else if exist { // Release the worker resource. pool.put(wk) - err = waitSchemaSynced(d.ddlCtx, job, 2*d.lease) + err = waitSchemaSyncedForMDL(d.ddlCtx, job, version) if err != nil { - logutil.BgLogger().Warn("[ddl] wait ddl job sync failed", zap.Error(err), zap.String("job", job.String())) - time.Sleep(time.Second) return } d.once.Store(false) - cleanMDLInfo(d.sessPool, job.ID) + cleanMDLInfo(d.sessPool, job.ID, d.etcdCli) // Don't have a worker now. return } @@ -287,7 +292,7 @@ func (d *ddl) delivery2worker(wk *worker, pool *workerPool, job *model.Job) { // If the job is done or still running or rolling back, we will wait 2 * lease time to guarantee other servers to update // the newest schema. waitSchemaChanged(context.Background(), d.ddlCtx, d.lease*2, schemaVer, job) - cleanMDLInfo(d.sessPool, job.ID) + cleanMDLInfo(d.sessPool, job.ID, d.etcdCli) d.synced(job) if RunInGoTest { @@ -310,6 +315,122 @@ func (d *ddl) markJobProcessing(sess *session, job *model.Job) error { return errors.Trace(err) } +func (d *ddl) startDispatchBackfillJobsLoop() { + d.backfillCtx.jobCtxMap = make(map[int64]*JobContext) + + var notifyBackfillJobByEtcdCh clientv3.WatchChan + if d.etcdCli != nil { + notifyBackfillJobByEtcdCh = d.etcdCli.Watch(d.ctx, addingBackfillJob) + } + ticker := time.NewTicker(500 * time.Millisecond) + defer ticker.Stop() + for { + if isChanClosed(d.ctx.Done()) { + return + } + select { + case <-d.backfillJobCh: + case <-ticker.C: + case _, ok := <-notifyBackfillJobByEtcdCh: + if !ok { + logutil.BgLogger().Warn("[ddl] start backfill worker watch channel closed", zap.String("watch key", addingBackfillJob)) + notifyBackfillJobByEtcdCh = d.etcdCli.Watch(d.ctx, addingBackfillJob) + time.Sleep(time.Second) + continue + } + case <-d.ctx.Done(): + return + } + d.loadBackfillJobAndRun() + } +} + +func (d *ddl) getTableByTxn(store kv.Storage, schemaID, tableID int64) (*model.DBInfo, table.Table, error) { + var tbl table.Table + var dbInfo *model.DBInfo + err := kv.RunInNewTxn(d.ctx, store, false, func(ctx context.Context, txn kv.Transaction) error { + t := meta.NewMeta(txn) + var err1 error + dbInfo, err1 = t.GetDatabase(schemaID) + if err1 != nil { + return errors.Trace(err1) + } + tblInfo, err1 := getTableInfo(t, tableID, schemaID) + if err1 != nil { + return errors.Trace(err1) + } + tbl, err1 = getTable(store, schemaID, tblInfo) + return errors.Trace(err1) + }) + return dbInfo, tbl, err +} + +func (d *ddl) loadBackfillJobAndRun() { + isDistReorg := variable.DDLEnableDistributeReorg.Load() + if !isDistReorg { + return + } + se, err := d.sessPool.get() + if err != nil { + logutil.BgLogger().Fatal("dispatch backfill jobs loop get session failed, it should not happen, please try restart TiDB", zap.Error(err)) + } + sess := newSession(se) + + runningJobIDs := d.backfillCtxJobIDs() + if len(runningJobIDs) >= reorgWorkerCnt { + d.sessPool.put(se) + return + } + + // TODO: Add ele info to distinguish backfill jobs. + // Get a Backfill job to get the reorg info like element info, schema ID and so on. + bfJob, err := GetBackfillJobForOneEle(sess, runningJobIDs, InstanceLease) + if err != nil || bfJob == nil { + if err != nil { + logutil.BgLogger().Warn("[ddl] get backfill jobs failed in this instance", zap.Error(err)) + } else { + logutil.BgLogger().Debug("[ddl] get no backfill job in this instance") + } + d.sessPool.put(se) + return + } + + jobCtx, existent := d.setBackfillCtxJobContext(bfJob.JobID, bfJob.Meta.Query, bfJob.Meta.Type) + if existent { + logutil.BgLogger().Warn("[ddl] get the type of backfill job is running in this instance", zap.String("backfill job", bfJob.AbbrStr())) + d.sessPool.put(se) + return + } + // TODO: Adjust how the non-owner uses ReorgCtx. + d.setReorgCtxForBackfill(bfJob) + d.wg.Run(func() { + defer func() { + tidbutil.Recover(metrics.LabelDistReorg, "runBackfillJobs", nil, false) + d.removeBackfillCtxJobCtx(bfJob.JobID) + d.removeReorgCtx(bfJob.JobID) + d.sessPool.put(se) + }() + + if bfJob.Meta.ReorgTp == model.ReorgTypeLitMerge { + if !ingest.LitInitialized { + logutil.BgLogger().Warn("[ddl] we can't do ingest in this instance", + zap.Bool("LitInitialized", ingest.LitInitialized), zap.String("bfJob", bfJob.AbbrStr())) + return + } + logutil.BgLogger().Info("[ddl] run backfill jobs with ingest in this instance", zap.String("bfJob", bfJob.AbbrStr())) + err = runBackfillJobsWithLightning(d, sess, bfJob, jobCtx) + } else { + logutil.BgLogger().Info("[ddl] run backfill jobs with txn-merge in this instance", zap.String("bfJob", bfJob.AbbrStr())) + _, err = runBackfillJobs(d, sess, nil, bfJob, jobCtx) + } + + if err == nil { + err = syncBackfillHistoryJobs(sess, d.uuid, bfJob) + } + logutil.BgLogger().Info("[ddl] run backfill jobs finished in this instance", zap.Stringer("reorg type", bfJob.Meta.ReorgTp), zap.Error(err)) + }) +} + const ( addDDLJobSQL = "insert into mysql.tidb_ddl_job(job_id, reorg, schema_ids, table_ids, job_meta, type, processing) values" updateDDLJobSQL = "update mysql.tidb_ddl_job set job_meta = %s where job_id = %d" @@ -371,6 +492,8 @@ func job2UniqueIDs(job *model.Job, schema bool) string { } slices.Sort(s) return strings.Join(s, ",") + case model.ActionTruncateTable: + return strconv.FormatInt(job.TableID, 10) + "," + strconv.FormatInt(job.Args[0].(int64), 10) } if schema { return strconv.FormatInt(job.SchemaID, 10) @@ -397,7 +520,8 @@ func updateDDLJob2Table(sctx *session, job *model.Job, updateRawArgs bool) error // getDDLReorgHandle gets DDL reorg handle. func getDDLReorgHandle(sess *session, job *model.Job) (element *meta.Element, startKey, endKey kv.Key, physicalTableID int64, err error) { sql := fmt.Sprintf("select ele_id, ele_type, start_key, end_key, physical_id from mysql.tidb_ddl_reorg where job_id = %d", job.ID) - rows, err := sess.execute(context.Background(), sql, "get_handle") + ctx := kv.WithInternalSourceType(context.Background(), getDDLRequestSource(job.Type)) + rows, err := sess.execute(ctx, sql, "get_handle") if err != nil { return nil, nil, nil, 0, err } @@ -430,15 +554,8 @@ func getDDLReorgHandle(sess *session, job *model.Job) (element *meta.Element, st return } -// updateDDLReorgStartHandle update the startKey of the handle. -func updateDDLReorgStartHandle(sess *session, job *model.Job, element *meta.Element, startKey kv.Key) error { - sql := fmt.Sprintf("update mysql.tidb_ddl_reorg set ele_id = %d, ele_type = %s, start_key = %s where job_id = %d", - element.ID, wrapKey2String(element.TypeKey), wrapKey2String(startKey), job.ID) - _, err := sess.execute(context.Background(), sql, "update_start_handle") - return err -} - // updateDDLReorgHandle update startKey, endKey physicalTableID and element of the handle. +// Caller should wrap this in a separate transaction, to avoid conflicts. func updateDDLReorgHandle(sess *session, jobID int64, startKey kv.Key, endKey kv.Key, physicalTableID int64, element *meta.Element) error { sql := fmt.Sprintf("update mysql.tidb_ddl_reorg set ele_id = %d, ele_type = %s, start_key = %s, end_key = %s, physical_id = %d where job_id = %d", element.ID, wrapKey2String(element.TypeKey), wrapKey2String(startKey), wrapKey2String(endKey), physicalTableID, jobID) @@ -447,28 +564,48 @@ func updateDDLReorgHandle(sess *session, jobID int64, startKey kv.Key, endKey kv } // initDDLReorgHandle initializes the handle for ddl reorg. -func initDDLReorgHandle(sess *session, jobID int64, startKey kv.Key, endKey kv.Key, physicalTableID int64, element *meta.Element) error { - sql := fmt.Sprintf("insert into mysql.tidb_ddl_reorg(job_id, ele_id, ele_type, start_key, end_key, physical_id) values (%d, %d, %s, %s, %s, %d)", +func initDDLReorgHandle(s *session, jobID int64, startKey kv.Key, endKey kv.Key, physicalTableID int64, element *meta.Element) error { + del := fmt.Sprintf("delete from mysql.tidb_ddl_reorg where job_id = %d", jobID) + ins := fmt.Sprintf("insert into mysql.tidb_ddl_reorg(job_id, ele_id, ele_type, start_key, end_key, physical_id) values (%d, %d, %s, %s, %s, %d)", jobID, element.ID, wrapKey2String(element.TypeKey), wrapKey2String(startKey), wrapKey2String(endKey), physicalTableID) - _, err := sess.execute(context.Background(), sql, "update_handle") - return err + return s.runInTxn(func(se *session) error { + _, err := se.execute(context.Background(), del, "init_handle") + if err != nil { + logutil.BgLogger().Info("initDDLReorgHandle failed to delete", zap.Int64("jobID", jobID), zap.Error(err)) + } + _, err = se.execute(context.Background(), ins, "init_handle") + return err + }) } // deleteDDLReorgHandle deletes the handle for ddl reorg. -func removeDDLReorgHandle(sess *session, job *model.Job, elements []*meta.Element) error { +func removeDDLReorgHandle(s *session, job *model.Job, elements []*meta.Element) error { if len(elements) == 0 { return nil } sql := fmt.Sprintf("delete from mysql.tidb_ddl_reorg where job_id = %d", job.ID) - _, err := sess.execute(context.Background(), sql, "remove_handle") - return err + return s.runInTxn(func(se *session) error { + _, err := se.execute(context.Background(), sql, "remove_handle") + return err + }) } // removeReorgElement removes the element from ddl reorg, it is the same with removeDDLReorgHandle, only used in failpoint -func removeReorgElement(sess *session, job *model.Job) error { +func removeReorgElement(s *session, job *model.Job) error { sql := fmt.Sprintf("delete from mysql.tidb_ddl_reorg where job_id = %d", job.ID) - _, err := sess.execute(context.Background(), sql, "remove_handle") - return err + return s.runInTxn(func(se *session) error { + _, err := se.execute(context.Background(), sql, "remove_handle") + return err + }) +} + +// cleanDDLReorgHandles removes handles that are no longer needed. +func cleanDDLReorgHandles(s *session, job *model.Job) error { + sql := "delete from mysql.tidb_ddl_reorg where job_id = " + strconv.FormatInt(job.ID, 10) + return s.runInTxn(func(se *session) error { + _, err := se.execute(context.Background(), sql, "clean_handle") + return err + }) } func wrapKey2String(key []byte) string { @@ -496,134 +633,329 @@ func getJobsBySQL(sess *session, tbl, condition string) ([]*model.Job, error) { return jobs, nil } -// MoveJobFromQueue2Table move existing DDLs in queue to table. -func (d *ddl) MoveJobFromQueue2Table(inBootstrap bool) error { - sess, err := d.sessPool.get() +func syncBackfillHistoryJobs(sess *session, uuid string, backfillJob *BackfillJob) error { + sql := fmt.Sprintf("update mysql.%s set state = '%s' where task_key like \"%d_%s_%d_%%\" and exec_id = '%s' limit 1;", + BackgroundSubtaskHistoryTable, model.JobStateSynced.String(), backfillJob.JobID, hex.EncodeToString(backfillJob.EleKey), backfillJob.EleID, uuid) + _, err := sess.execute(context.Background(), sql, "sync_backfill_history_job") + return err +} + +func generateInsertBackfillJobSQL(tableName string, backfillJobs []*BackfillJob) (string, error) { + sqlBuilder := strings.Builder{} + sqlBuilder.WriteString("insert into mysql.") + sqlBuilder.WriteString(tableName) + sqlBuilder.WriteString("(task_key, ddl_physical_tid, type, exec_id, exec_expired, state, checkpoint, start_time, state_update_time, meta) values") + for i, bj := range backfillJobs { + mateByte, err := bj.Meta.Encode() + if err != nil { + return "", errors.Trace(err) + } + + if i != 0 { + sqlBuilder.WriteString(", ") + } + sqlBuilder.WriteString(fmt.Sprintf("('%d_%s_%d_%d', %d, %d, '%s', '%s', '%s', %s, %d, %d, %s)", + bj.JobID, hex.EncodeToString(bj.EleKey), bj.EleID, bj.ID, bj.PhysicalTableID, bj.Tp, bj.InstanceID, bj.InstanceLease, bj.State.String(), wrapKey2String(bj.Meta.CurrKey), + bj.StartTS, bj.StateUpdateTS, wrapKey2String(mateByte))) + } + return sqlBuilder.String(), nil +} + +// AddBackfillHistoryJob adds the backfill jobs to the tidb_background_subtask_history table. +func AddBackfillHistoryJob(sess *session, backfillJobs []*BackfillJob) error { + label := fmt.Sprintf("add_%s_job", BackgroundSubtaskHistoryTable) + sql, err := generateInsertBackfillJobSQL(BackgroundSubtaskHistoryTable, backfillJobs) if err != nil { return err } - defer d.sessPool.put(sess) - return runInTxn(newSession(sess), func(se *session) error { + _, err = sess.execute(context.Background(), sql, label) + return errors.Trace(err) +} + +// AddBackfillJobs adds the backfill jobs to the tidb_background_subtask table. +func AddBackfillJobs(s *session, backfillJobs []*BackfillJob) error { + label := fmt.Sprintf("add_%s_job", BackgroundSubtaskTable) + // Do runInTxn to get StartTS. + return s.runInTxn(func(se *session) error { txn, err := se.txn() if err != nil { return errors.Trace(err) } - t := meta.NewMeta(txn) - isConcurrentDDL, err := t.IsConcurrentDDL() - if !inBootstrap && (isConcurrentDDL || err != nil) { - return errors.Trace(err) + startTS := txn.StartTS() + for _, bj := range backfillJobs { + bj.StartTS = startTS } - systemDBID, err := t.GetSystemDBID() + + sql, err := generateInsertBackfillJobSQL(BackgroundSubtaskTable, backfillJobs) if err != nil { - return errors.Trace(err) + return err } - for _, tp := range []workerType{addIdxWorker, generalWorker} { - t := newMetaWithQueueTp(txn, tp) - jobs, err := t.GetAllDDLJobsInQueue() - if err != nil { - return errors.Trace(err) - } - for _, job := range jobs { - // In bootstrap, we can ignore the internal DDL. - if inBootstrap && job.SchemaID == systemDBID { - continue - } - err = insertDDLJobs2Table(se, false, job) - if err != nil { - return errors.Trace(err) - } - if tp == generalWorker { - // General job do not have reorg info. - continue - } - element, start, end, pid, err := t.GetDDLReorgHandle(job) - if meta.ErrDDLReorgElementNotExist.Equal(err) { - continue - } + _, err = se.execute(context.Background(), sql, label) + return errors.Trace(err) + }) +} + +// GetBackfillJobForOneEle gets the backfill jobs in the tblName table that contains only one element. +func GetBackfillJobForOneEle(s *session, excludedJobIDs []int64, lease time.Duration) (*BackfillJob, error) { + eJobIDsBuilder := strings.Builder{} + for _, id := range excludedJobIDs { + eJobIDsBuilder.WriteString(fmt.Sprintf(" and task_key not like \"%d_%%\"", id)) + } + + var err error + var bJobs []*BackfillJob + err = s.runInTxn(func(se *session) error { + currTime, err := GetOracleTimeWithStartTS(se) + if err != nil { + return err + } + leaseStr := currTime.Add(-lease).Format(types.TimeFormat) + bJobs, err = GetBackfillJobs(se, BackgroundSubtaskTable, + fmt.Sprintf("(exec_id = '' or exec_expired < '%v') %s order by task_key limit 1", + leaseStr, eJobIDsBuilder.String()), "get_backfill_job") + return err + }) + if err != nil || len(bJobs) == 0 { + return nil, err + } + + return bJobs[0], nil +} + +// GetAndMarkBackfillJobsForOneEle batch gets the backfill jobs in the tblName table that contains only one element, +// and update these jobs with instance ID and lease. +func GetAndMarkBackfillJobsForOneEle(s *session, batch int, jobID int64, uuid string, pTblID int64, lease time.Duration) ([]*BackfillJob, error) { + var validLen int + var bJobs []*BackfillJob + err := s.runInTxn(func(se *session) error { + currTime, err := GetOracleTimeWithStartTS(se) + if err != nil { + return err + } + leaseStr := currTime.Add(-lease).Format(types.TimeFormat) + + getJobsSQL := fmt.Sprintf("(exec_id = '' or exec_expired < '%v') and task_key like \"%d_%%\" order by task_key limit %d", + leaseStr, jobID, batch) + if pTblID != getJobWithoutPartition { + if pTblID == 0 { + rows, err := s.execute(context.Background(), + fmt.Sprintf("select ddl_physical_tid from mysql.%s group by substring_index(task_key,\"_\",3), ddl_physical_tid having max(length(exec_id)) = 0 or max(exec_expired) < '%s' order by substring_index(task_key,\"_\",3), ddl_physical_tid limit 1", + BackgroundSubtaskTable, leaseStr), "get_mark_backfill_job") if err != nil { return errors.Trace(err) } - err = initDDLReorgHandle(se, job.ID, start, end, pid, element) - if err != nil { - return errors.Trace(err) + + if len(rows) == 0 { + return dbterror.ErrDDLJobNotFound.FastGen("get zero backfill job") } + + pTblID = rows[0].GetInt64(0) } + getJobsSQL = fmt.Sprintf("(exec_id = '' or exec_expired < '%s') and task_key like \"%d_%%\" and ddl_physical_tid = %d order by task_key limit %d", + leaseStr, jobID, pTblID, batch) } - if err = t.ClearALLDDLJob(); err != nil { - return errors.Trace(err) + bJobs, err = GetBackfillJobs(se, BackgroundSubtaskTable, getJobsSQL, "get_mark_backfill_job") + if err != nil { + return err } - if err = t.ClearAllDDLReorgHandle(); err != nil { - return errors.Trace(err) + if len(bJobs) == 0 { + return dbterror.ErrDDLJobNotFound.FastGen("get zero backfill job") } - return t.SetConcurrentDDL(true) + + validLen = 0 + firstJobID, firstEleID, firstEleKey := bJobs[0].JobID, bJobs[0].EleID, bJobs[0].EleKey + for i := 0; i < len(bJobs); i++ { + if bJobs[i].JobID != firstJobID || bJobs[i].EleID != firstEleID || !bytes.Equal(bJobs[i].EleKey, firstEleKey) { + break + } + validLen++ + + bJobs[i].InstanceID = uuid + bJobs[i].InstanceLease = GetLeaseGoTime(currTime, lease) + // TODO: batch update + if err = updateBackfillJob(se, BackgroundSubtaskTable, bJobs[i], "get_mark_backfill_job"); err != nil { + return err + } + } + return nil }) + if validLen == 0 { + return nil, err + } + + return bJobs[:validLen], err } -// MoveJobFromTable2Queue move existing DDLs in table to queue. -func (d *ddl) MoveJobFromTable2Queue() error { - sess, err := d.sessPool.get() +// GetInterruptedBackfillJobForOneEle gets an interrupted backfill job that contains only one element. +func GetInterruptedBackfillJobForOneEle(sess *session, jobID, eleID int64, eleKey []byte) ([]*BackfillJob, error) { + bJobs, err := GetBackfillJobs(sess, BackgroundSubtaskHistoryTable, fmt.Sprintf("task_key like \"%d_%s_%d_%%\" and state = \"%s\" limit 1", + jobID, hex.EncodeToString(eleKey), eleID, model.JobStateCancelled.String()), "get_interrupt_backfill_job") + if err != nil || len(bJobs) == 0 { + return nil, err + } + return bJobs, nil +} + +// GetBackfillJobCount gets the number of rows in the tblName table according to condition. +func GetBackfillJobCount(sess *session, tblName, condition string, label string) (int, error) { + rows, err := sess.execute(context.Background(), fmt.Sprintf("select count(1) from mysql.%s where %s", tblName, condition), label) if err != nil { - return err + return 0, errors.Trace(err) } - defer d.sessPool.put(sess) - return runInTxn(newSession(sess), func(se *session) error { - txn, err := se.txn() + if len(rows) == 0 { + return 0, dbterror.ErrDDLJobNotFound.FastGenByArgs(fmt.Sprintf("get wrong result cnt:%d", len(rows))) + } + + return int(rows[0].GetInt64(0)), nil +} + +// GetBackfillMetas gets the backfill metas in the tblName table according to condition. +func GetBackfillMetas(sess *session, tblName, condition string, label string) ([]*model.BackfillMeta, error) { + rows, err := sess.execute(context.Background(), fmt.Sprintf("select meta from mysql.%s where %s", tblName, condition), label) + if err != nil { + return nil, errors.Trace(err) + } + if len(rows) == 0 { + return nil, dbterror.ErrDDLJobNotFound.FastGenByArgs(fmt.Sprintf("get wrong result cnt:%d", len(rows))) + } + + metas := make([]*model.BackfillMeta, 0, len(rows)) + for _, r := range rows { + meta := &model.BackfillMeta{} + err = meta.Decode(r.GetBytes(0)) if err != nil { - return errors.Trace(err) + return nil, errors.Trace(err) } - t := meta.NewMeta(txn) - isConcurrentDDL, err := t.IsConcurrentDDL() - if !isConcurrentDDL || err != nil { - return errors.Trace(err) + metas = append(metas, meta) + } + + return metas, nil +} + +// GetBackfillIDAndMetas gets the backfill IDs and metas in the tblName table according to condition. +func GetBackfillIDAndMetas(sess *session, tblName, condition string, label string) ([]*BackfillJobRangeMeta, error) { + sql := "select tbl.task_key, tbl.meta, tbl.ddl_physical_tid from (select max(task_key) max_id, ddl_physical_tid " + + fmt.Sprintf(" from mysql.%s tbl where %s group by ddl_physical_tid) tmp join mysql.%s tbl", + tblName, condition, tblName) + " on tbl.task_key=tmp.max_id and tbl.ddl_physical_tid=tmp.ddl_physical_tid;" + rows, err := sess.execute(context.Background(), sql, label) + if err != nil { + return nil, errors.Trace(err) + } + if len(rows) == 0 { + return nil, nil + } + + pTblMetas := make([]*BackfillJobRangeMeta, 0, len(rows)) + for _, r := range rows { + key := r.GetString(0) + keySlice := strings.Split(key, "_") + id, err := strconv.ParseInt(keySlice[3], 10, 64) + if err != nil { + return nil, err } - jobs, err := getJobsBySQL(se, "tidb_ddl_job", "1 order by job_id") + meta := &model.BackfillMeta{} + err = meta.Decode(r.GetBytes(1)) if err != nil { - return errors.Trace(err) + return nil, err } - - for _, job := range jobs { - jobListKey := meta.DefaultJobListKey - if job.MayNeedReorg() { - jobListKey = meta.AddIndexJobListKey - } - if err := t.EnQueueDDLJobNoUpdate(job, jobListKey); err != nil { - return errors.Trace(err) - } + pTblMeta := BackfillJobRangeMeta{ + ID: id, + StartKey: meta.StartKey, + EndKey: meta.EndKey, + PhyTblID: r.GetInt64(2), } + pTblMetas = append(pTblMetas, &pTblMeta) + } + return pTblMetas, nil +} + +func getUnsyncedInstanceIDs(sess *session, jobID int64, label string) ([]string, error) { + sql := fmt.Sprintf("select sum((state='%s') + (state='%s')) as tmp, exec_id from mysql.tidb_background_subtask_history where task_key like \"%d_%%\" group by exec_id having tmp = 0;", + model.JobStateSynced.String(), model.JobStateCancelled.String(), jobID) + rows, err := sess.execute(context.Background(), sql, label) + if err != nil { + return nil, errors.Trace(err) + } + InstanceIDs := make([]string, 0, len(rows)) + for _, row := range rows { + InstanceID := row.GetString(1) + InstanceIDs = append(InstanceIDs, InstanceID) + } + return InstanceIDs, nil +} - reorgHandle, err := se.execute(context.Background(), "select job_id, start_key, end_key, physical_id, ele_id, ele_type from mysql.tidb_ddl_reorg", "get_handle") +// GetBackfillJobs gets the backfill jobs in the tblName table according to condition. +func GetBackfillJobs(sess *session, tblName, condition string, label string) ([]*BackfillJob, error) { + rows, err := sess.execute(context.Background(), fmt.Sprintf("select * from mysql.%s where %s", tblName, condition), label) + if err != nil { + return nil, errors.Trace(err) + } + bJobs := make([]*BackfillJob, 0, len(rows)) + for _, row := range rows { + key := row.GetString(2) + keySlice := strings.Split(key, "_") + jobID, err := strconv.ParseInt(keySlice[0], 10, 64) if err != nil { - return errors.Trace(err) + return nil, err } - for _, row := range reorgHandle { - if err := t.UpdateDDLReorgHandle(row.GetInt64(0), row.GetBytes(1), row.GetBytes(2), row.GetInt64(3), &meta.Element{ID: row.GetInt64(4), TypeKey: row.GetBytes(5)}); err != nil { - return errors.Trace(err) - } + eleKey, err := hex.DecodeString(keySlice[1]) + if err != nil { + return nil, err } - - // clean up these 2 tables. - _, err = se.execute(context.Background(), "delete from mysql.tidb_ddl_job", "delete_old_ddl") + eleID, err := strconv.ParseInt(keySlice[2], 10, 64) if err != nil { - return errors.Trace(err) + return nil, err } - _, err = se.execute(context.Background(), "delete from mysql.tidb_ddl_reorg", "delete_old_reorg") + id, err := strconv.ParseInt(keySlice[3], 10, 64) if err != nil { - return errors.Trace(err) + return nil, err + } + bfJob := BackfillJob{ + ID: id, + JobID: jobID, + EleID: eleID, + EleKey: eleKey, + PhysicalTableID: row.GetInt64(3), + Tp: backfillerType(row.GetInt64(4)), + InstanceID: row.GetString(5), + InstanceLease: row.GetTime(6), + State: model.StrToJobState(row.GetString(7)), + StartTS: row.GetUint64(9), + StateUpdateTS: row.GetUint64(10), + } + bfJob.Meta = &model.BackfillMeta{} + err = bfJob.Meta.Decode(row.GetBytes(11)) + if err != nil { + return nil, errors.Trace(err) } - return t.SetConcurrentDDL(false) - }) + bfJob.Meta.CurrKey = row.GetBytes(8) + bJobs = append(bJobs, &bfJob) + } + return bJobs, nil } -func runInTxn(se *session, f func(*session) error) (err error) { - err = se.begin() - if err != nil { - return err +// RemoveBackfillJob removes the backfill jobs from the tidb_background_subtask table. +// If isOneEle is true, removes all jobs with backfillJob's ddl_job_id, ele_id and ele_key. Otherwise, removes the backfillJob. +func RemoveBackfillJob(sess *session, isOneEle bool, backfillJob *BackfillJob) error { + sql := "delete from mysql.tidb_background_subtask" + if !isOneEle { + sql += fmt.Sprintf(" where task_key like \"%d_%s_%d_%d\"", backfillJob.JobID, hex.EncodeToString(backfillJob.EleKey), backfillJob.EleID, backfillJob.ID) + } else { + sql += fmt.Sprintf(" where task_key like \"%d_%s_%d_%%\"", backfillJob.JobID, hex.EncodeToString(backfillJob.EleKey), backfillJob.EleID) } - err = f(se) + _, err := sess.execute(context.Background(), sql, "remove_backfill_job") + return err +} + +func updateBackfillJob(sess *session, tableName string, backfillJob *BackfillJob, label string) error { + mate, err := backfillJob.Meta.Encode() if err != nil { - se.rollback() - return + return err } - return errors.Trace(se.commit()) + sql := fmt.Sprintf("update mysql.%s set exec_id = '%s', exec_expired = '%s', state = '%s', checkpoint = %s, meta = %s where task_key = '%d_%s_%d_%d'", + tableName, backfillJob.InstanceID, backfillJob.InstanceLease, backfillJob.State.String(), wrapKey2String(backfillJob.Meta.CurrKey), + wrapKey2String(mate), backfillJob.JobID, hex.EncodeToString(backfillJob.EleKey), backfillJob.EleID, backfillJob.ID) + _, err = sess.execute(context.Background(), sql, label) + return err } diff --git a/ddl/job_table_test.go b/ddl/job_table_test.go index 8f9e59ae31084..2f7a180f7b9ca 100644 --- a/ddl/job_table_test.go +++ b/ddl/job_table_test.go @@ -15,16 +15,28 @@ package ddl_test import ( + "context" + "encoding/hex" + "fmt" + "strconv" + "strings" "sync" "testing" "time" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" + "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/sessiontxn" "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/dbterror" "github.com/stretchr/testify/require" "golang.org/x/exp/slices" ) @@ -33,9 +45,6 @@ import ( // This test checks the chosen job records to see if there are wrong scheduling, if job A and job B cannot run concurrently, // then the all the record of job A must before or after job B, no cross record between these 2 jobs should be in between. func TestDDLScheduling(t *testing.T) { - if !variable.EnableConcurrentDDL.Load() { - t.Skipf("test requires concurrent ddl") - } store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) @@ -59,7 +68,7 @@ func TestDDLScheduling(t *testing.T) { "ALTER TABLE e EXCHANGE PARTITION p1 WITH TABLE e3;", } - hook := &ddl.TestDDLCallback{} + hook := &callback.TestDDLCallback{} var wg util.WaitGroupWrapper wg.Add(1) var once sync.Once @@ -177,3 +186,640 @@ func check(t *testing.T, record []int64, ids ...int64) { } } } + +func makeAddIdxBackfillJobs(schemaID, tblID, jobID, eleID int64, cnt int, query string) []*ddl.BackfillJob { + bJobs := make([]*ddl.BackfillJob, 0, cnt) + for i := 0; i < cnt; i++ { + sKey := []byte(fmt.Sprintf("%d", i)) + eKey := []byte(fmt.Sprintf("%d", i+1)) + bm := &model.BackfillMeta{ + EndInclude: true, + JobMeta: &model.JobMeta{ + SchemaID: schemaID, + TableID: tblID, + Query: query, + }, + StartKey: sKey, + EndKey: eKey, + } + bj := &ddl.BackfillJob{ + ID: int64(i), + JobID: jobID, + EleID: eleID, + EleKey: meta.IndexElementKey, + State: model.JobStateNone, + PhysicalTableID: 1, + InstanceLease: types.ZeroTimestamp, + Meta: bm, + } + bj.Meta.CurrKey = sKey + bJobs = append(bJobs, bj) + } + return bJobs +} + +func equalBackfillJob(t *testing.T, a, b *ddl.BackfillJob, lessTime types.Time) { + require.Equal(t, a.ID, b.ID) + require.Equal(t, a.JobID, b.JobID) + require.Equal(t, a.EleID, b.EleID) + require.Equal(t, a.EleKey, b.EleKey) + require.Equal(t, a.PhysicalTableID, b.PhysicalTableID) + require.Equal(t, a.InstanceID, b.InstanceID) + require.GreaterOrEqual(t, b.InstanceLease.Compare(lessTime), 0) + require.Equal(t, a.State, b.State) + require.Equal(t, a.Meta, b.Meta) +} + +func getIdxConditionStr(jobID, eleID int64) string { + return fmt.Sprintf("task_key like \"%d_%s_%d_%%\"", + jobID, hex.EncodeToString(meta.IndexElementKey), eleID) +} + +func readInTxn(se sessionctx.Context, f func(sessionctx.Context)) (err error) { + err = sessiontxn.NewTxn(context.Background(), se) + if err != nil { + return err + } + f(se) + se.RollbackTxn(context.Background()) + return nil +} + +func backfillJob2PTblMetaMap(bJob *ddl.BackfillJob) map[int64]*ddl.BackfillJobRangeMeta { + m := &ddl.BackfillJobRangeMeta{ + ID: bJob.ID, + PhyTblID: bJob.PhysicalTableID, + StartKey: bJob.Meta.StartKey, + EndKey: bJob.Meta.EndKey, + } + mMap := make(map[int64]*ddl.BackfillJobRangeMeta) + mMap[m.PhyTblID] = m + return mMap +} + +func TestSimpleExecBackfillJobs(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + d := dom.DDL() + se := ddl.NewSession(tk.Session()) + + jobID1 := int64(1) + jobID2 := int64(2) + eleID1 := int64(11) + eleID2 := int64(22) + eleID3 := int64(33) + noPID := int64(0) + uuid := d.GetID() + eleKey := meta.IndexElementKey + instanceLease := ddl.InstanceLease + + // test no backfill job + bJob, err := ddl.GetBackfillJobForOneEle(se, []int64{jobID1, jobID2}, instanceLease) + require.NoError(t, err) + require.Nil(t, bJob) + bJobs, err := ddl.GetAndMarkBackfillJobsForOneEle(se, 1, jobID1, uuid, noPID, instanceLease) + require.EqualError(t, err, dbterror.ErrDDLJobNotFound.FastGen("get zero backfill job").Error()) + require.Nil(t, bJobs) + allCnt, err := ddl.GetBackfillJobCount(se, ddl.BackgroundSubtaskTable, getIdxConditionStr(jobID1, eleID2), "check_backfill_job_count") + require.NoError(t, err) + require.Equal(t, allCnt, 0) + // Test some backfill jobs, add backfill jobs to the table. + cnt := 2 + bjTestCases := make([]*ddl.BackfillJob, 0, cnt*3) + bJobs1 := makeAddIdxBackfillJobs(1, 2, jobID1, eleID1, cnt, "alter table t add index idx(a)") + bJobs2 := makeAddIdxBackfillJobs(1, 2, jobID2, eleID2, cnt, "alter table t add index idx(b)") + bJobs3 := makeAddIdxBackfillJobs(1, 2, jobID2, eleID3, cnt, "alter table t add index idx(c)") + bjTestCases = append(bjTestCases, bJobs1...) + bjTestCases = append(bjTestCases, bJobs2...) + bjTestCases = append(bjTestCases, bJobs3...) + err = ddl.AddBackfillJobs(se, bjTestCases) + require.Equal(t, err.Error(), "[table:1292]Incorrect timestamp value: '0000-00-00 00:00:00' for column 'exec_expired' at row 1") + tk.Session().GetSessionVars().SQLMode = mysql.ModeNone + err = ddl.AddBackfillJobs(se, bjTestCases) + // ID jobID eleID InstanceID PhysicalTableID + // -------------------------------------------------- + // 0 jobID1 eleID1 uuid 1 + // 1 jobID1 eleID1 "" 1 + // 0 jobID2 eleID2 "" 1 + // 1 jobID2 eleID2 "" 1 + // 0 jobID2 eleID3 "" 1 + // 1 jobID2 eleID3 "" 1 + require.NoError(t, err) + // test get some backfill jobs + bJob, err = ddl.GetBackfillJobForOneEle(se, []int64{jobID2 - 1, jobID2 + 1}, instanceLease) + require.NoError(t, err) + expectJob := bjTestCases[2] + if expectJob.ID != bJob.ID { + expectJob = bjTestCases[3] + } + require.Equal(t, expectJob, bJob) + previousTime, err := ddl.GetOracleTimeWithStartTS(se) + require.EqualError(t, err, "[kv:8024]invalid transaction") + readInTxn(se, func(sessionctx.Context) { + previousTime, err = ddl.GetOracleTimeWithStartTS(se) + require.NoError(t, err) + }) + + bJobs, err = ddl.GetAndMarkBackfillJobsForOneEle(se, 1, jobID2, uuid, noPID, instanceLease) + require.NoError(t, err) + require.Len(t, bJobs, 1) + expectJob = bjTestCases[2] + if expectJob.ID != bJobs[0].ID { + expectJob = bjTestCases[3] + } + expectJob.InstanceID = uuid + equalBackfillJob(t, expectJob, bJobs[0], ddl.GetLeaseGoTime(previousTime, instanceLease)) + var currTime time.Time + readInTxn(se, func(sessionctx.Context) { + currTime, err = ddl.GetOracleTimeWithStartTS(se) + require.NoError(t, err) + }) + currGoTime := ddl.GetLeaseGoTime(currTime, instanceLease) + require.GreaterOrEqual(t, currGoTime.Compare(bJobs[0].InstanceLease), 0) + allCnt, err = ddl.GetBackfillJobCount(se, ddl.BackgroundSubtaskTable, getIdxConditionStr(jobID2, eleID2), "test_get_bj") + require.NoError(t, err) + require.Equal(t, allCnt, cnt) + // test physical table + err = ddl.RemoveBackfillJob(se, true, bJobs1[0]) + require.NoError(t, err) + // ID jobID eleID InstanceID PhysicalTableID + // -------------------------------------------------- + // 0 jobID2 eleID2 "" 1 + // 1 jobID2 eleID2 "" 1 + // 0 jobID2 eleID3 "" 1 + // 1 jobID2 eleID3 "" 1 + bPhyJobs := makeAddIdxBackfillJobs(1, 2, jobID1, eleID1, 10, "alter table t add index idx(a)") + bPhyJobs[1].InstanceID = "uuid_1" + bPhyJobs[2].PhysicalTableID = 2 + bPhyJobs[6].PhysicalTableID = 2 + bPhyJobs[4].PhysicalTableID = 3 + bPhyJobs[5].PhysicalTableID = 3 + bPhyJobs[8].PhysicalTableID = 3 + bPhyJobs[7].PhysicalTableID = 4 + bPhyJobs[9].PhysicalTableID = 4 + // ID jobID eleID InstanceID InstanceLease PhysicalTableID + // ----------------------------------------------------------------------- + // 0 jobID2 eleID2 "" 1 + // 1 jobID2 eleID2 "" 1 + // 0 jobID2 eleID3 "" 1 + // 1 jobID2 eleID3 "" 1 + // 0 jobID1 eleID1 "" 1 + // 1 jobID1 eleID1 "uuid_1" 1 + // 2 jobID1 eleID1 "" 2 + // 3 jobID1 eleID1 "" 1 + // 4 jobID1 eleID1 "" 3 + // 5 jobID1 eleID1 "" 3 + // 6 jobID1 eleID1 "" 2 + // 7 jobID1 eleID1 "" 4 + // 8 jobID1 eleID1 "" 3 + // 9 jobID1 eleID1 "" 4 + simpleCheck := func(batch, jobCnt int, bfJobIDs []int64, pID int64) { + err = ddl.AddBackfillJobs(se, bPhyJobs) + require.NoError(t, err) + bJobs, err = ddl.GetAndMarkBackfillJobsForOneEle(se, batch, jobID1, uuid, pID, instanceLease) + require.NoError(t, err) + require.Len(t, bJobs, jobCnt) + isExist := false + for _, id := range bfJobIDs { + if id == bJobs[0].ID { + isExist = true + } + } + require.True(t, isExist, fmt.Sprintf("expected ids:%v, actual id:%d", bfJobIDs, bJobs[0].ID)) + err = ddl.RemoveBackfillJob(se, true, bJobs1[0]) + require.NoError(t, err) + } + type cntAndID struct { + batch int + bfJobCnt int + bfJobID []int64 + } + checkAndClean := func(expectRet1, expectRet2 cntAndID) { + simpleCheck(expectRet1.batch, expectRet1.bfJobCnt, expectRet1.bfJobID, noPID) + simpleCheck(expectRet2.batch, expectRet2.bfJobCnt, expectRet2.bfJobID, ddl.GetJobWithoutPartition) + } + checkAndClean(cntAndID{3, 3, []int64{0, 1, 3}}, + cntAndID{3, 3, []int64{0, 1, 3}}) + bPhyJobs[1].InstanceLease = types.NewTime(types.FromGoTime(time.Now().Add(-time.Hour).UTC()), 0, 0) + // ID jobID eleID InstanceID InstanceLease PhysicalTableID + // ----------------------------------------------------------------------- + // 0 jobID2 eleID2 "" 1 + // 1 jobID2 eleID2 "" 1 + // 0 jobID2 eleID3 "" 1 + // 1 jobID2 eleID3 "" 1 + // 0 jobID1 eleID1 "" 1 + // 1 jobID1 eleID1 "uuid_1" currentTime-hour 1 + // 2 jobID1 eleID1 "" 2 + // 3 jobID1 eleID1 "" 1 + // 4 jobID1 eleID1 "" 3 + // 5 jobID1 eleID1 "" 3 + // 6 jobID1 eleID1 "" 2 + // 7 jobID1 eleID1 "" 4 + // 8 jobID1 eleID1 "" 3 + // 9 jobID1 eleID1 "" 4 + checkAndClean(cntAndID{3, 3, []int64{0, 1, 3}}, + cntAndID{3, 3, []int64{0, 1, 3}}) + bPhyJobs[3].InstanceLease = types.NewTime(types.FromGoTime(time.Now().UTC()), 0, 0) + // ID jobID eleID InstanceID InstanceLease PhysicalTableID + // ----------------------------------------------------------------------- + // 0 jobID2 eleID2 "" 1 + // 1 jobID2 eleID2 "" 1 + // 0 jobID2 eleID3 "" 1 + // 1 jobID2 eleID3 "" 1 + // 0 jobID1 eleID1 "" 1 + // 1 jobID1 eleID1 "uuid_1" currentTime-hour 1 + // 2 jobID1 eleID1 "" 2 + // 3 jobID1 eleID1 "" currentTime 1 // should not exist + // 4 jobID1 eleID1 "" 3 + // 5 jobID1 eleID1 "" 3 + // 6 jobID1 eleID1 "" 2 + // 7 jobID1 eleID1 "" 4 + // 8 jobID1 eleID1 "" 3 + // 9 jobID1 eleID1 "" 4 + checkAndClean(cntAndID{3, 2, []int64{2, 6}}, + cntAndID{3, 3, []int64{0, 1, 3}}) + bPhyJobs[6].InstanceLease = types.NewTime(types.FromGoTime(time.Now().UTC()), 0, 0) + // ID jobID eleID InstanceID InstanceLease PhysicalTableID + // ----------------------------------------------------------------------- + // 0 jobID2 eleID2 "" 1 + // 1 jobID2 eleID2 "" 1 + // 0 jobID2 eleID3 "" 1 + // 1 jobID2 eleID3 "" 1 + // 0 jobID1 eleID1 "" 1 + // 1 jobID1 eleID1 "uuid_1" currentTime-hour 1 + // 2 jobID1 eleID1 "" 2 + // 3 jobID1 eleID1 "" currentTime 1 // should not exist + // 4 jobID1 eleID1 "" 3 + // 5 jobID1 eleID1 "" 3 + // 6 jobID1 eleID1 "" currentTime 2 // should not exist + // 7 jobID1 eleID1 "" 4 + // 8 jobID1 eleID1 "" 3 + // 9 jobID1 eleID1 "" 4 + checkAndClean(cntAndID{3, 2, []int64{2, 6}}, + cntAndID{10, 10, []int64{0, 1, 3}}) + bPhyJobs[6].InstanceID = "uuid_2" + // ID jobID eleID InstanceID InstanceLease PhysicalTableID + // ----------------------------------------------------------------------- + // 0 jobID2 eleID2 "" 1 + // 1 jobID2 eleID2 "" 1 + // 0 jobID2 eleID3 "" 1 + // 1 jobID2 eleID3 "" 1 + // 0 jobID1 eleID1 "" 1 + // 1 jobID1 eleID1 "uuid_1" currentTime-hour 1 + // 2 jobID1 eleID1 "" 2 + // 3 jobID1 eleID1 "" currentTime 1 // should not exist + // 4 jobID1 eleID1 "" 3 + // 5 jobID1 eleID1 "" 3 + // 6 jobID1 eleID1 "uuid_2" currentTime 2 // should not exist + // 7 jobID1 eleID1 "" 4 + // 8 jobID1 eleID1 "" 3 + // 9 jobID1 eleID1 "" 4 + checkAndClean(cntAndID{3, 3, []int64{4, 5, 8}}, + cntAndID{10, 9, []int64{0, 1, 3}}) + // ID jobID eleID InstanceID InstanceLease PhysicalTableID + // ----------------------------------------------------------------------- + // 0 jobID2 eleID2 "" 1 + // 1 jobID2 eleID2 "" 1 + // 0 jobID2 eleID3 "" 1 + // 1 jobID2 eleID3 "" 1 + + err = ddl.AddBackfillJobs(se, bJobs1) + require.NoError(t, err) + // ID jobID eleID + // ------------------------ + // 0 jobID1 eleID1 + // 1 jobID1 eleID1 + // 0 jobID2 eleID2 + // 1 jobID2 eleID2 + // 0 jobID2 eleID3 + // 1 jobID2 eleID3 + // remove a backfill job + err = ddl.RemoveBackfillJob(se, false, bJobs1[0]) + // ID jobID eleID + // ------------------------ + // 1 jobID1 eleID1 + // 0 jobID2 eleID2 + // 1 jobID2 eleID2 + // 0 jobID2 eleID3 + // 1 jobID2 eleID3 + require.NoError(t, err) + allCnt, err = ddl.GetBackfillJobCount(se, ddl.BackgroundSubtaskTable, getIdxConditionStr(jobID1, eleID1), "test_get_bj") + require.NoError(t, err) + require.Equal(t, allCnt, 1) + allCnt, err = ddl.GetBackfillJobCount(se, ddl.BackgroundSubtaskTable, getIdxConditionStr(jobID2, eleID2), "test_get_bj") + require.NoError(t, err) + require.Equal(t, allCnt, cnt) + // remove all backfill jobs + err = ddl.RemoveBackfillJob(se, true, bJobs2[0]) + // ID jobID eleID + // ------------------------ + // 1 jobID1 eleID1 + // 0 jobID2 eleID3 + // 1 jobID2 eleID3 + require.NoError(t, err) + allCnt, err = ddl.GetBackfillJobCount(se, ddl.BackgroundSubtaskTable, getIdxConditionStr(jobID1, eleID1), "test_get_bj") + require.NoError(t, err) + require.Equal(t, allCnt, 1) + allCnt, err = ddl.GetBackfillJobCount(se, ddl.BackgroundSubtaskTable, getIdxConditionStr(jobID2, eleID2), "test_get_bj") + require.NoError(t, err) + require.Equal(t, allCnt, 0) + // clean backfill job + err = ddl.RemoveBackfillJob(se, true, bJobs1[1]) + require.NoError(t, err) + err = ddl.RemoveBackfillJob(se, true, bJobs3[0]) + require.NoError(t, err) + // ID jobID eleID + // ------------------------ + + // test history backfill jobs + err = ddl.AddBackfillHistoryJob(se, []*ddl.BackfillJob{bJobs2[0]}) + require.NoError(t, err) + // ID jobID eleID + // ------------------------ + // 0 jobID2 eleID2 + readInTxn(se, func(sessionctx.Context) { + currTime, err = ddl.GetOracleTimeWithStartTS(se) + require.NoError(t, err) + }) + condition := fmt.Sprintf("exec_id = '' or exec_expired < '%v' and task_key like \"%d_%%\"", currTime.Add(-instanceLease), jobID2) + bJobs, err = ddl.GetBackfillJobs(se, ddl.BackgroundSubtaskHistoryTable, condition, "test_get_bj") + require.NoError(t, err) + require.Len(t, bJobs, 1) + require.Equal(t, bJobs[0].StateUpdateTS, uint64(0)) + + // test GetMaxBackfillJob + pTblMeta, err := ddl.GetPhysicalTableMetas(se, bJobs3[0].JobID, bJobs3[0].EleID, eleKey) + require.NoError(t, err) + require.Len(t, pTblMeta, 0) + err = ddl.AddBackfillJobs(se, bjTestCases) + require.NoError(t, err) + // ID jobID eleID + // ------------------------ + // 0 jobID1 eleID1 + // 1 jobID1 eleID1 + // 0 jobID2 eleID2 + // 1 jobID2 eleID2 + // 0 jobID2 eleID3 + // 1 jobID2 eleID3 + pTblMeta, err = ddl.GetPhysicalTableMetas(se, jobID2, eleID2, eleKey) + require.NoError(t, err) + require.Equal(t, backfillJob2PTblMetaMap(bJobs2[1]), pTblMeta) + bJobs1[0].State = model.JobStateRollingback + bJobs1[0].ID = 2 + bJobs1[0].InstanceID = uuid + bJobs1[1].State = model.JobStateCancelled + bJobs1[1].ID = 3 + bJobs1[1].Meta.Error = dbterror.ErrCancelledDDLJob + err = ddl.AddBackfillJobs(se, bJobs1) + require.NoError(t, err) + // ID jobID eleID state + // -------------------------------- + // 0 jobID1 eleID1 JobStateNone + // 1 jobID1 eleID1 JobStateNone + // 0 jobID2 eleID2 JobStateNone + // 1 jobID2 eleID2 JobStateNone + // 0 jobID2 eleID3 JobStateNone + // 1 jobID2 eleID3 JobStateNone + // 2 jobID1 eleID1 JobStateRollingback + // 3 jobID1 eleID1 JobStateCancelled + pTblMeta, err = ddl.GetPhysicalTableMetas(se, jobID1, eleID1, eleKey) + require.NoError(t, err) + require.Equal(t, backfillJob2PTblMetaMap(bJobs1[1]), pTblMeta) + // test the BackfillJob's AbbrStr + require.Equal(t, fmt.Sprintf("ID:2, JobID:1, EleID:11, Type:add index, State:rollingback, InstanceID:%s, InstanceLease:0000-00-00 00:00:00", uuid), bJobs1[0].AbbrStr()) + require.Equal(t, "ID:3, JobID:1, EleID:11, Type:add index, State:cancelled, InstanceID:, InstanceLease:0000-00-00 00:00:00", bJobs1[1].AbbrStr()) + require.Equal(t, "ID:0, JobID:2, EleID:33, Type:add index, State:none, InstanceID:, InstanceLease:0000-00-00 00:00:00", bJobs3[0].AbbrStr()) + require.Equal(t, "ID:1, JobID:2, EleID:33, Type:add index, State:none, InstanceID:, InstanceLease:0000-00-00 00:00:00", bJobs3[1].AbbrStr()) + // test select tidb_background_subtask + tk.MustQuery(fmt.Sprintf("select exec_id, exec_expired from mysql.tidb_background_subtask where task_key like \"%%%d\" and %s", bJobs1[0].ID, getIdxConditionStr(jobID1, eleID1))). + Check(testkit.Rows(fmt.Sprintf("%s 0000-00-00 00:00:00", uuid))) + tk.MustQuery(fmt.Sprintf("select exec_id, exec_expired from mysql.tidb_background_subtask where task_key like \"%%%d\" and %s", bJobs1[1].ID, getIdxConditionStr(jobID1, eleID1))). + Check(testkit.Rows(" 0000-00-00 00:00:00")) + // test GetBackfillMetas + bfErr := ddl.GetBackfillErr(se, jobID1, eleID1, eleKey) + require.Error(t, bfErr, dbterror.ErrCancelledDDLJob) + bfErr = ddl.GetBackfillErr(se, jobID2, eleID2, eleKey) + require.NoError(t, bfErr) + + bJobs1[0].State = model.JobStateNone + bJobs1[0].ID = 5 + bJobs1[1].State = model.JobStateNone + bJobs1[1].ID = 4 + err = ddl.AddBackfillHistoryJob(se, bJobs1) + // BackgroundSubtaskTable + // ID jobID eleID state + // -------------------------------- + // 0 jobID1 eleID1 JobStateNone + // 1 jobID1 eleID1 JobStateNone + // 0 jobID2 eleID2 JobStateNone + // 1 jobID2 eleID2 JobStateNone + // 0 jobID2 eleID3 JobStateNone + // 1 jobID2 eleID3 JobStateNone + // 2 jobID1 eleID1 JobStateRollingback + // 3 jobID1 eleID1 JobStateCancelled + // + // BackgroundSubtaskHistoryTable + // ID jobID eleID state + // -------------------------------- + // 5 jobID1 eleID1 JobStateNone + // 4 jobID1 eleID1 JobStateNone + pTblMeta, err = ddl.GetPhysicalTableMetas(se, jobID1, eleID1, eleKey) + require.NoError(t, err) + require.Equal(t, backfillJob2PTblMetaMap(bJobs1[0]), pTblMeta) // ??????????? + bJobs1[0].ID = 6 + bJobs1[1].ID = 7 + err = ddl.AddBackfillJobs(se, bJobs1) + // BackgroundSubtaskTable + // ID jobID eleID state + // -------------------------------- + // 0 jobID1 eleID1 JobStateNone + // 1 jobID1 eleID1 JobStateNone + // 0 jobID2 eleID2 JobStateNone + // 1 jobID2 eleID2 JobStateNone + // 0 jobID2 eleID3 JobStateNone + // 1 jobID2 eleID3 JobStateNone + // 2 jobID1 eleID1 JobStateRollingback + // 3 jobID1 eleID1 JobStateCancelled + // 6 jobID1 eleID1 JobStateNone + // 7 jobID1 eleID1 JobStateNone + // + // BackgroundSubtaskHistoryTable + // ID jobID eleID state + // -------------------------------- + // 5 jobID1 eleID1 JobStateNone + // 4 jobID1 eleID1 JobStateNone + pTblMeta, err = ddl.GetPhysicalTableMetas(se, jobID1, eleID1, eleKey) + require.NoError(t, err) + require.Equal(t, backfillJob2PTblMetaMap(bJobs1[1]), pTblMeta) + + // test MoveBackfillJobsToHistoryTable and GetInterruptedBackfillJobForOneEle + allCnt, err = ddl.GetBackfillJobCount(se, ddl.BackgroundSubtaskTable, getIdxConditionStr(jobID2, eleID3), "test_get_bj") + require.NoError(t, err) + require.Equal(t, allCnt, 2) + err = ddl.MoveBackfillJobsToHistoryTable(se, bJobs3[0]) + require.NoError(t, err) + allCnt, err = ddl.GetBackfillJobCount(se, ddl.BackgroundSubtaskTable, getIdxConditionStr(jobID2, eleID3), "test_get_bj") + require.NoError(t, err) + require.Equal(t, allCnt, 0) + allCnt, err = ddl.GetBackfillJobCount(se, ddl.BackgroundSubtaskHistoryTable, getIdxConditionStr(jobID2, eleID3), "test_get_bj") + require.NoError(t, err) + require.Equal(t, allCnt, 2) + // BackgroundSubtaskTable + // ID jobID eleID state + // -------------------------------- + // 0 jobID1 eleID1 JobStateNone + // 1 jobID1 eleID1 JobStateNone + // 0 jobID2 eleID2 JobStateNone + // 1 jobID2 eleID2 JobStateNone + // 2 jobID1 eleID1 JobStateRollingback + // 3 jobID1 eleID1 JobStateCancelled + // 6 jobID1 eleID1 JobStateNone + // 7 jobID1 eleID1 JobStateNone + // + // BackgroundSubtaskHistoryTable + // ID jobID eleID state + // -------------------------------- + // 5 jobID1 eleID1 JobStateNone + // 4 jobID1 eleID1 JobStateNone + // 0 jobID2 eleID3 JobStateCancelled + // 1 jobID2 eleID3 JobStateCancelled + bJobs, err = ddl.GetInterruptedBackfillJobForOneEle(se, jobID1, eleID1, eleKey) + require.NoError(t, err) + require.Len(t, bJobs, 0) + allCnt, err = ddl.GetBackfillJobCount(se, ddl.BackgroundSubtaskTable, getIdxConditionStr(jobID1, eleID1), "test_get_bj") + require.NoError(t, err) + require.Equal(t, allCnt, 6) + err = ddl.MoveBackfillJobsToHistoryTable(se, bJobs1[0]) + require.NoError(t, err) + allCnt, err = ddl.GetBackfillJobCount(se, ddl.BackgroundSubtaskTable, getIdxConditionStr(jobID1, eleID1), "test_get_bj") + require.NoError(t, err) + require.Equal(t, allCnt, 0) + allCnt, err = ddl.GetBackfillJobCount(se, ddl.BackgroundSubtaskHistoryTable, getIdxConditionStr(jobID1, eleID1), "test_get_bj") + require.NoError(t, err) + require.Equal(t, allCnt, 8) + bJobs, err = ddl.GetInterruptedBackfillJobForOneEle(se, jobID2, eleID3, eleKey) + require.NoError(t, err) + require.Len(t, bJobs, 1) + expectJob = bJobs3[0] + if expectJob.ID != bJob.ID { + expectJob = bJobs3[1] + } + expectJob.State = model.JobStateCancelled + equalBackfillJob(t, bJobs3[0], bJobs[0], types.ZeroTimestamp) + // BackgroundSubtaskTable + // ID jobID eleID state + // -------------------------------- + // 0 jobID2 eleID2 JobStateNone + // 1 jobID2 eleID2 JobStateNone + // + // BackgroundSubtaskHistoryTable + // ID jobID eleID state + // -------------------------------- + // 5 jobID1 eleID1 JobStateNone + // 4 jobID1 eleID1 JobStateNone + // 0 jobID2 eleID3 JobStateCancelled + // 1 jobID2 eleID3 JobStateCancelled + // 0 jobID1 eleID1 JobStateCancelled + // 1 jobID1 eleID1 JobStateCancelled + // 2 jobID1 eleID1 JobStateCancelled + // 3 jobID1 eleID1 JobStateCancelled + // 6 jobID1 eleID1 JobStateCancelled + // 7 jobID1 eleID1 JobStateCancelled +} + +func TestGetTasks(t *testing.T) { + // TODO: update the variable of `enableDistReorg` + isDistReorg := variable.DDLEnableDistributeReorg.Load() + variable.DDLEnableDistributeReorg.Store(false) + defer func() { variable.DDLEnableDistributeReorg.Store(isDistReorg) }() + + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + se := ddl.NewSession(tk.Session()) + se.GetSessionVars().SQLMode = mysql.ModeNone + d := dom.DDL() + + jobID1 := int64(1) + eleID1 := int64(11) + uuid := d.GetID() + cnt := 3 + instanceLease := ddl.InstanceLease + bJobsTestCases := makeAddIdxBackfillJobs(1, 2, jobID1, eleID1, cnt, "alter table t add index idx(a)") + err := ddl.AddBackfillJobs(se, bJobsTestCases) + require.NoError(t, err) + + var wg util.WaitGroupWrapper + // Mock GetAndMarkBackfillJobsForOneEle gets a writing conflict error. + // Step 1: se1 begins txn1. + // Step 2: se2 begins txn2. + // Step 3: execute txn1 and txn2, then txn1 or txn2 returns a writing conflict error. + var err1 error + ch := make(chan struct{}, 1) + wg.Run(func() { + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/NotifyBeginTxnCh", `return(1)`)) + ch <- struct{}{} + var bJobs []*ddl.BackfillJob + bJobs, err = ddl.GetAndMarkBackfillJobsForOneEle(se, 1, jobID1, uuid, 1, instanceLease) + require.Len(t, bJobs, 1) + }) + <-ch + defer func() { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/NotifyBeginTxnCh")) }() + wg.Run(func() { + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + se1 := ddl.NewSession(tk1.Session()) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/NotifyBeginTxnCh", `return(2)`)) + var bJobs1 []*ddl.BackfillJob + bJobs1, err1 = ddl.GetAndMarkBackfillJobsForOneEle(se1, 1, jobID1, uuid, 1, instanceLease) + require.Len(t, bJobs1, 1) + }) + wg.Wait() + if err == nil { + require.NotNil(t, err1) + require.True(t, strings.Contains(err1.Error(), "[kv:9007]Write conflict")) + } else { + require.Nil(t, err1) + require.True(t, strings.Contains(err.Error(), "[kv:9007]Write conflict")) + } + + err = ddl.RemoveBackfillJob(se, true, bJobsTestCases[0]) + require.NoError(t, err) + err = ddl.AddBackfillJobs(se, bJobsTestCases) + require.NoError(t, err) + // get tbl + tk.MustExec("create table t(a int, b int)") + var tableID int64 + rs := tk.MustQuery("select TIDB_TABLE_ID from information_schema.tables where table_name='t' and table_schema='test';") + tableIDi, err := strconv.Atoi(rs.Rows()[0][0].(string)) + require.Nil(t, err) + tableID = int64(tableIDi) + tbl := testGetTable(t, dom, tableID) + pID := int64(0) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/NotifyBeginTxnCh", `return(0)`)) + // Mock GetAndMarkBackfillJobsForOneEle gets a writing conflict error, but getTasks is successful. + // Step 1: se1 begins txn1. + // Step 2: se2 begins txn2. + // Step 3: execute txn1 and txn2, then txn1 or txn2 returns a writing conflict error. + // Step 4: se2 begin txn3. + // Step 5: getTasks(txn3) executes successfully. + wg.Run(func() { + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/NotifyBeginTxnCh", `return(1)`)) + ch <- struct{}{} + bJobs, err := ddl.GetTasks(ddl.GetDDLCtx(d), se, tbl, jobID1, &pID, 1) + require.Nil(t, err) + require.Len(t, bJobs, 1) + }) + <-ch + wg.Run(func() { + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + se1 := ddl.NewSession(tk1.Session()) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/NotifyBeginTxnCh", `return(2)`)) + bJobs1, err1 := ddl.GetTasks(ddl.GetDDLCtx(d), se1, tbl, jobID1, &pID, 1) + require.Nil(t, err1) + require.Len(t, bJobs1, 1) + }) + wg.Wait() +} diff --git a/ddl/main_test.go b/ddl/main_test.go index 3418d16a23ece..b1bbd8516fa94 100644 --- a/ddl/main_test.go +++ b/ddl/main_test.go @@ -25,6 +25,7 @@ import ( "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/domain/infosync" + "github.com/pingcap/tidb/keyspace" "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/testkit/testsetup" "github.com/tikv/client-go/v2/tikv" @@ -40,6 +41,8 @@ func TestMain(m *testing.M) { autoid.SetStep(5000) ddl.ReorgWaitTimeout = 30 * time.Millisecond + ddl.RetrySQLInterval = 30 * time.Millisecond + ddl.CheckBackfillJobFinishInterval = 50 * time.Millisecond ddl.RunInGoTest = true ddl.SetBatchInsertDeleteRangeSize(2) @@ -52,7 +55,7 @@ func TestMain(m *testing.M) { conf.Experimental.AllowsExpressionIndex = true }) - _, err := infosync.GlobalInfoSyncerInit(context.Background(), "t", func() uint64 { return 1 }, nil, true) + _, err := infosync.GlobalInfoSyncerInit(context.Background(), "t", func() uint64 { return 1 }, nil, nil, nil, keyspace.CodecV1, true) if err != nil { _, _ = fmt.Fprintf(os.Stderr, "ddl: infosync.GlobalInfoSyncerInit: %v\n", err) os.Exit(1) @@ -64,6 +67,8 @@ func TestMain(m *testing.M) { goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/txnkv/transaction.keepAlive"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + goleak.IgnoreTopFunction("internal/poll.runtime_pollWait"), + goleak.IgnoreTopFunction("net/http.(*persistConn).writeLoop"), } goleak.VerifyTestMain(m, opts...) diff --git a/ddl/metadatalocktest/BUILD.bazel b/ddl/metadatalocktest/BUILD.bazel index 7f1fc31f9987a..4e36531bd5a6a 100644 --- a/ddl/metadatalocktest/BUILD.bazel +++ b/ddl/metadatalocktest/BUILD.bazel @@ -2,6 +2,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_test") go_test( name = "metadatalocktest_test", + timeout = "short", srcs = [ "main_test.go", "mdl_test.go", diff --git a/ddl/metadatalocktest/mdl_test.go b/ddl/metadatalocktest/mdl_test.go index 6f4a0012cdfff..d7c05fa334508 100644 --- a/ddl/metadatalocktest/mdl_test.go +++ b/ddl/metadatalocktest/mdl_test.go @@ -12,8 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !featuretag - package metadatalocktest import ( @@ -257,6 +255,47 @@ func TestMDLBasicBatchPointGet(t *testing.T) { require.Less(t, ts1, ts2) } +func TestMDLAddForeignKey(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + sv := server.CreateMockServer(t, store) + + sv.SetDomain(dom) + dom.InfoSyncer().SetSessionManager(sv) + defer sv.Close() + + conn1 := server.CreateMockConn(t, sv) + tk := testkit.NewTestKitWithSession(t, store, conn1.Context().Session) + conn2 := server.CreateMockConn(t, sv) + tkDDL := testkit.NewTestKitWithSession(t, store, conn2.Context().Session) + tk.MustExec("use test") + tk.MustExec("set global tidb_enable_metadata_lock=1") + tk.MustExec("create table t1(id int key);") + tk.MustExec("create table t2(id int key);") + + tk.MustExec("begin") + tk.MustExec("insert into t2 values(1);") + + var wg sync.WaitGroup + var ddlErr error + wg.Add(1) + var ts2 time.Time + go func() { + defer wg.Done() + ddlErr = tkDDL.ExecToErr("alter table test.t2 add foreign key (id) references t1(id)") + ts2 = time.Now() + }() + + time.Sleep(2 * time.Second) + + ts1 := time.Now() + tk.MustExec("commit") + + wg.Wait() + require.Error(t, ddlErr) + require.Equal(t, "[ddl:1452]Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `fk_1` FOREIGN KEY (`id`) REFERENCES `t1` (`id`))", ddlErr.Error()) + require.Less(t, ts1, ts2) +} + func TestMDLRRUpdateSchema(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) sv := server.CreateMockServer(t, store) @@ -1105,3 +1144,16 @@ func TestMDLRenameTable(t *testing.T) { tk.MustGetErrCode("select * from test2.t1;", mysql.ErrNoSuchTable) tk.MustExec("commit") } + +func TestMDLPrepareFail(t *testing.T) { + store := testkit.CreateMockStore(t) + + tk := testkit.NewTestKit(t, store) + tk2 := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(a int);") + _, _, _, err := tk.Session().PrepareStmt("select b from t") + require.Error(t, err) + + tk2.MustExec("alter table test.t add column c int") +} diff --git a/ddl/modify_column_test.go b/ddl/modify_column_test.go index 10a9835bc8215..7aa23d526bc65 100644 --- a/ddl/modify_column_test.go +++ b/ddl/modify_column_test.go @@ -17,12 +17,14 @@ package ddl_test import ( "context" "fmt" + "strconv" "sync" "testing" "time" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/parser/ast" @@ -50,6 +52,14 @@ func batchInsert(tk *testkit.TestKit, tbl string, start, end int) { func TestModifyColumnReorgInfo(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) + originalTimeout := ddl.ReorgWaitTimeout + ddl.ReorgWaitTimeout = 10 * time.Millisecond + limit := variable.GetDDLErrorCountLimit() + variable.SetDDLErrorCountLimit(5) + defer func() { + ddl.ReorgWaitTimeout = originalTimeout + variable.SetDDLErrorCountLimit(limit) + }() tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1") @@ -66,7 +76,7 @@ func TestModifyColumnReorgInfo(t *testing.T) { tbl := external.GetTableByName(t, tk, "test", "t1") // Check insert null before job first update. - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} var checkErr error var currJob *model.Job var elements []*meta.Element @@ -112,14 +122,18 @@ func TestModifyColumnReorgInfo(t *testing.T) { require.NoError(t, checkErr) // Check whether the reorg information is cleaned up when executing "modify column" failed. checkReorgHandle := func(gotElements, expectedElements []*meta.Element) { + require.Equal(t, len(expectedElements), len(gotElements)) for i, e := range gotElements { require.Equal(t, expectedElements[i], e) } + // check the consistency of the tables. + currJobID := strconv.FormatInt(currJob.ID, 10) + tk.MustQuery("select job_id, reorg, schema_ids, table_ids, type, processing from mysql.tidb_ddl_job where job_id = " + currJobID).Check(testkit.Rows()) + tk.MustQuery("select job_id from mysql.tidb_ddl_history where job_id = " + currJobID).Check(testkit.Rows(currJobID)) + tk.MustQuery("select job_id, ele_id, ele_type, physical_id from mysql.tidb_ddl_reorg where job_id = " + currJobID).Check(testkit.Rows()) require.NoError(t, sessiontxn.NewTxn(context.Background(), ctx)) - txn, err := ctx.Txn(true) - require.NoError(t, err) - m := meta.NewMeta(txn) - e, start, end, physicalID, err := ddl.NewReorgHandlerForTest(m, testkit.NewTestKit(t, store).Session()).GetDDLReorgHandle(currJob) + e, start, end, physicalID, err := ddl.NewReorgHandlerForTest(testkit.NewTestKit(t, store).Session()).GetDDLReorgHandle(currJob) + require.Error(t, err, "Error not ErrDDLReorgElementNotExists, found orphan row in tidb_ddl_reorg for job.ID %d: e: '%s', physicalID: %d, start: 0x%x end: 0x%x", currJob.ID, e, physicalID, start, end) require.True(t, meta.ErrDDLReorgElementNotExist.Equal(err)) require.Nil(t, e) require.Nil(t, start) @@ -149,10 +163,16 @@ func TestModifyColumnReorgInfo(t *testing.T) { // Test encountering a "notOwnerErr" error which caused the processing backfill job to exit halfway. // During the period, the old TiDB version(do not exist the element information) is upgraded to the new TiDB version. require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/MockGetIndexRecordErr", `return("addIdxNotOwnerErr")`)) - tk.MustExec("alter table t1 add index idx2(c1)") - expectedElements = []*meta.Element{ - {ID: 7, TypeKey: meta.IndexElementKey}} - checkReorgHandle(elements, expectedElements) + // TODO: Remove this check after "err" isn't nil in runReorgJobAndHandleErr. + if variable.DDLEnableDistributeReorg.Load() { + err = tk.ExecToErr("alter table t1 add index idx2(c1)") + require.EqualError(t, err, "[ddl:8201]TiDB server is not a DDL owner") + } else { + tk.MustExec("alter table t1 add index idx2(c1)") + expectedElements = []*meta.Element{ + {ID: 7, TypeKey: meta.IndexElementKey}} + checkReorgHandle(elements, expectedElements) + } tk.MustExec("admin check table t1") require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/MockGetIndexRecordErr")) } @@ -188,7 +208,7 @@ func TestModifyColumnNullToNotNull(t *testing.T) { tbl := external.GetTableByName(t, tk1, "test", "t1") // Check insert null before job first update. - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} tk1.MustExec("delete from t1") once := sync.Once{} var checkErr error @@ -243,7 +263,7 @@ func TestModifyColumnNullToNotNullWithChangingVal(t *testing.T) { tbl := external.GetTableByName(t, tk1, "test", "t1") // Check insert null before job first update. - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} tk1.MustExec("delete from t1") once := sync.Once{} var checkErr error @@ -813,10 +833,7 @@ func TestModifyColumnTypeWithWarnings(t *testing.T) { // 111.22 will be truncated the fraction .22 as .2 with truncated warning for each row. tk.MustExec("alter table t modify column a decimal(4,1)") // there should 4 rows of warnings corresponding to the origin rows. - tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect DECIMAL value: '111.22'", - "Warning 1292 Truncated incorrect DECIMAL value: '111.22'", - "Warning 1292 Truncated incorrect DECIMAL value: '111.22'", - "Warning 1292 Truncated incorrect DECIMAL value: '111.22'")) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 4 warnings with this error code, first warning: Truncated incorrect DECIMAL value: '111.22'")) // Test the strict warnings is treated as errors under the strict mode. tk.MustExec("drop table if exists t") @@ -829,15 +846,13 @@ func TestModifyColumnTypeWithWarnings(t *testing.T) { // Test the strict warnings is treated as warnings under the non-strict mode. tk.MustExec("set @@sql_mode=\"\"") tk.MustExec("alter table t modify column a decimal(3,1)") - tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1690 DECIMAL value is out of range in '(3, 1)'", - "Warning 1690 DECIMAL value is out of range in '(3, 1)'", - "Warning 1690 DECIMAL value is out of range in '(3, 1)'")) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1690 3 warnings with this error code, first warning: DECIMAL value is out of range in '(3, 1)'")) } // TestModifyColumnTypeWhenInterception is to test modifying column type with warnings intercepted by // reorg timeout, not owner error and so on. func TestModifyColumnTypeWhenInterception(t *testing.T) { - store, dom := testkit.CreateMockStoreAndDomain(t) + store, _ := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") @@ -858,42 +873,10 @@ func TestModifyColumnTypeWhenInterception(t *testing.T) { // Make the regions scale like: [1, 1024), [1024, 2048), [2048, 3072), [3072, 4096] tk.MustQuery("split table t between(0) and (4096) regions 4") - d := dom.DDL() - hook := &ddl.TestDDLCallback{} - var checkMiddleWarningCount bool - var checkMiddleAddedCount bool - // Since the `DefTiDBDDLReorgWorkerCount` is 4, every worker will be assigned with one region - // for the first time. Here we mock the insert failure/reorg timeout in region [2048, 3072) - // which will lead next handle be set to 2048 and partial warnings be stored into ddl job. - // Since the existence of reorg batch size, only the last reorg batch [2816, 3072) of kv - // range [2048, 3072) fail to commit, the rest of them all committed successfully. So the - // addedCount and warnings count in the job are all equal to `4096 - reorg batch size`. - // In the next round of this ddl job, the last reorg batch will be finished. - var middleWarningsCount = int64(defaultBatchSize*4 - defaultReorgBatchSize) - onJobUpdatedExportedFunc := func(job *model.Job) { - if job.SchemaState == model.StateWriteReorganization || job.SnapshotVer != 0 { - if len(job.ReorgMeta.WarningsCount) == len(job.ReorgMeta.Warnings) { - for _, v := range job.ReorgMeta.WarningsCount { - if v == middleWarningsCount { - checkMiddleWarningCount = true - } - } - } - if job.RowCount == middleWarningsCount { - checkMiddleAddedCount = true - } - } - } - hook.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) - d.SetHook(hook) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/MockReorgTimeoutInOneRegion", `return(true)`)) defer func() { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/MockReorgTimeoutInOneRegion")) }() tk.MustExec("alter table t modify column b decimal(3,1)") - require.True(t, checkMiddleWarningCount) - require.True(t, checkMiddleAddedCount) - - res := tk.MustQuery("show warnings") - require.Len(t, res.Rows(), count) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 4096 warnings with this error code, first warning: Truncated incorrect DECIMAL value: '11.22'")) } diff --git a/ddl/multi_schema_change.go b/ddl/multi_schema_change.go index ab306fe546932..19c355ebfa8da 100644 --- a/ddl/multi_schema_change.go +++ b/ddl/multi_schema_change.go @@ -190,6 +190,10 @@ func appendToSubJobs(m *model.MultiSchemaInfo, job *model.Job) error { if err != nil { return err } + var reorgTp model.ReorgType + if job.ReorgMeta != nil { + reorgTp = job.ReorgMeta.ReorgTp + } m.SubJobs = append(m.SubJobs, &model.SubJob{ Type: job.Type, Args: job.Args, @@ -198,6 +202,7 @@ func appendToSubJobs(m *model.MultiSchemaInfo, job *model.Job) error { SnapshotVer: job.SnapshotVer, Revertible: true, CtxVars: job.CtxVars, + ReorgTp: reorgTp, }) return nil } @@ -261,7 +266,10 @@ func fillMultiSchemaInfo(info *model.MultiSchemaInfo, job *model.Job) (err error case model.ActionRebaseAutoID, model.ActionModifyTableComment, model.ActionModifyTableCharsetAndCollate: case model.ActionAddForeignKey: fkInfo := job.Args[0].(*model.FKInfo) - info.ForeignKeys = append(info.ForeignKeys, fkInfo.Name) + info.AddForeignKeys = append(info.AddForeignKeys, model.AddForeignKeyInfo{ + Name: fkInfo.Name, + Cols: fkInfo.Cols, + }) default: return dbterror.ErrRunMultiSchemaChanges.FastGenByArgs(job.Type.String()) } @@ -323,6 +331,32 @@ func checkOperateSameColAndIdx(info *model.MultiSchemaInfo) error { return checkIndexes(info.AlterIndexes, true) } +func checkOperateDropIndexUseByForeignKey(info *model.MultiSchemaInfo, t table.Table) error { + var remainIndexes, droppingIndexes []*model.IndexInfo + tbInfo := t.Meta() + for _, idx := range tbInfo.Indices { + dropping := false + for _, name := range info.DropIndexes { + if name.L == idx.Name.L { + dropping = true + break + } + } + if dropping { + droppingIndexes = append(droppingIndexes, idx) + } else { + remainIndexes = append(remainIndexes, idx) + } + } + + for _, fk := range info.AddForeignKeys { + if droppingIdx := model.FindIndexByColumns(tbInfo, droppingIndexes, fk.Cols...); droppingIdx != nil && model.FindIndexByColumns(tbInfo, remainIndexes, fk.Cols...) == nil { + return dbterror.ErrDropIndexNeededInForeignKey.GenWithStackByArgs(droppingIdx.Name) + } + } + return nil +} + func checkMultiSchemaInfo(info *model.MultiSchemaInfo, t table.Table) error { err := checkOperateSameColAndIdx(info) if err != nil { @@ -334,6 +368,11 @@ func checkMultiSchemaInfo(info *model.MultiSchemaInfo, t table.Table) error { return err } + err = checkOperateDropIndexUseByForeignKey(info, t) + if err != nil { + return err + } + return checkAddColumnTooManyColumns(len(t.Cols()) + len(info.AddColumns) - len(info.DropColumns)) } diff --git a/ddl/multi_schema_change_test.go b/ddl/multi_schema_change_test.go index 250fb692f3500..1f6a52bcce244 100644 --- a/ddl/multi_schema_change_test.go +++ b/ddl/multi_schema_change_test.go @@ -20,6 +20,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" @@ -141,6 +142,9 @@ func TestMultiSchemaChangeAddColumnsCancelled(t *testing.T) { tk.MustExec("insert into t values (1);") hook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { // Cancel job when the column 'c' is in write-reorg. + if job.Type != model.ActionMultiSchemaChange { + return false + } assertMultiSchema(t, job, 3) return job.MultiSchemaInfo.SubJobs[1].SchemaState == model.StateWriteReorganization }) @@ -221,6 +225,9 @@ func TestMultiSchemaChangeDropColumnsCancelled(t *testing.T) { tk.MustExec("insert into t values ();") hook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { // Cancel job when the column 'a' is in delete-reorg. + if job.Type != model.ActionMultiSchemaChange { + return false + } assertMultiSchema(t, job, 3) return job.MultiSchemaInfo.SubJobs[1].SchemaState == model.StateDeleteReorganization }) @@ -236,6 +243,9 @@ func TestMultiSchemaChangeDropColumnsCancelled(t *testing.T) { tk.MustExec("insert into t values ();") hook = newCancelJobHook(t, store, dom, func(job *model.Job) bool { // Cancel job when the column 'a' is in public. + if job.Type != model.ActionMultiSchemaChange { + return false + } assertMultiSchema(t, job, 3) return job.MultiSchemaInfo.SubJobs[1].SchemaState == model.StatePublic }) @@ -258,6 +268,9 @@ func TestMultiSchemaChangeDropIndexedColumnsCancelled(t *testing.T) { tk.MustExec("insert into t values ();") hook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { // Cancel job when the column 'a' is in delete-reorg. + if job.Type != model.ActionMultiSchemaChange { + return false + } assertMultiSchema(t, job, 3) return job.MultiSchemaInfo.SubJobs[1].SchemaState == model.StateDeleteReorganization }) @@ -358,6 +371,9 @@ func TestMultiSchemaChangeRenameColumns(t *testing.T) { tk.MustExec("insert into t values ()") hook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { // Cancel job when the column 'c' is in write-reorg. + if job.Type != model.ActionMultiSchemaChange { + return false + } assertMultiSchema(t, job, 2) return job.MultiSchemaInfo.SubJobs[0].SchemaState == model.StateWriteReorganization }) @@ -371,7 +387,7 @@ func TestMultiSchemaChangeRenameColumns(t *testing.T) { tk.MustExec("drop table if exists t") tk.MustExec("create table t (a int default 1, b int default 2)") tk.MustExec("insert into t values ()") - hook1 := &ddl.TestDDLCallback{Do: dom} + hook1 := &callback.TestDDLCallback{Do: dom} hook1.OnJobRunBeforeExported = func(job *model.Job) { assert.Equal(t, model.ActionMultiSchemaChange, job.Type) if job.MultiSchemaInfo.SubJobs[0].SchemaState == model.StateWriteReorganization { @@ -427,6 +443,9 @@ func TestMultiSchemaChangeAlterColumns(t *testing.T) { tk.MustExec("create table t (a int default 1, b int default 2)") hook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { // Cancel job when the column 'a' is in write-reorg. + if job.Type != model.ActionMultiSchemaChange { + return false + } assertMultiSchema(t, job, 2) return job.MultiSchemaInfo.SubJobs[0].SchemaState == model.StateWriteReorganization }) @@ -439,7 +458,7 @@ func TestMultiSchemaChangeAlterColumns(t *testing.T) { // Test dml stmts when do alter tk.MustExec("drop table if exists t") tk.MustExec("create table t (a int default 1, b int default 2)") - hook1 := &ddl.TestDDLCallback{Do: dom} + hook1 := &callback.TestDDLCallback{Do: dom} hook1.OnJobRunBeforeExported = func(job *model.Job) { assert.Equal(t, model.ActionMultiSchemaChange, job.Type) if job.MultiSchemaInfo.SubJobs[0].SchemaState == model.StateWriteOnly { @@ -496,6 +515,9 @@ func TestMultiSchemaChangeChangeColumns(t *testing.T) { tk.MustExec("insert into t values ()") hook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { // Cancel job when the column 'c' is in write-reorg. + if job.Type != model.ActionMultiSchemaChange { + return false + } assertMultiSchema(t, job, 2) return job.MultiSchemaInfo.SubJobs[0].SchemaState == model.StateWriteReorganization }) @@ -555,6 +577,9 @@ func TestMultiSchemaChangeAddIndexesCancelled(t *testing.T) { tk.MustExec("insert into t values (1, 2, 3);") cancelHook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { // Cancel the job when index 't2' is in write-reorg. + if job.Type != model.ActionMultiSchemaChange { + return false + } assertMultiSchema(t, job, 4) return job.MultiSchemaInfo.SubJobs[2].SchemaState == model.StateWriteReorganization }) @@ -574,6 +599,9 @@ func TestMultiSchemaChangeAddIndexesCancelled(t *testing.T) { tk.MustExec("insert into t values (1, 2, 3);") cancelHook = newCancelJobHook(t, store, dom, func(job *model.Job) bool { // Cancel the job when index 't1' is in public. + if job.Type != model.ActionMultiSchemaChange { + return false + } assertMultiSchema(t, job, 4) return job.MultiSchemaInfo.SubJobs[1].SchemaState == model.StatePublic }) @@ -623,6 +651,9 @@ func TestMultiSchemaChangeDropIndexesCancelled(t *testing.T) { // Test for cancelling the job in a middle state. tk.MustExec("create table t (a int, b int, index(a), unique index(b), index idx(a, b));") hook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { + if job.Type != model.ActionMultiSchemaChange { + return false + } assertMultiSchema(t, job, 3) return job.MultiSchemaInfo.SubJobs[1].SchemaState == model.StateDeleteOnly }) @@ -638,6 +669,9 @@ func TestMultiSchemaChangeDropIndexesCancelled(t *testing.T) { tk.MustExec("drop table if exists t;") tk.MustExec("create table t (a int, b int, index(a), unique index(b), index idx(a, b));") hook = newCancelJobHook(t, store, dom, func(job *model.Job) bool { + if job.Type != model.ActionMultiSchemaChange { + return false + } assertMultiSchema(t, job, 3) return job.MultiSchemaInfo.SubJobs[1].SchemaState == model.StatePublic }) @@ -686,8 +720,8 @@ func TestMultiSchemaChangeAddDropIndexes(t *testing.T) { tk.MustExec("drop table if exists t;") tk.MustExec("create table t (a int, b int, c int, index (a), index(b), index(c));") tk.MustExec("insert into t values (1, 2, 3);") - tk.MustExec("alter table t add index aa(a), drop index a, add index cc(c), drop index b, drop index c, add index bb(b);") - tk.MustQuery("select * from t use index(aa, bb, cc);").Check(testkit.Rows("1 2 3")) + tk.MustExec("alter table t add index xa(a), drop index a, add index xc(c), drop index b, drop index c, add index xb(b);") + tk.MustQuery("select * from t use index(xa, xb, xc);").Check(testkit.Rows("1 2 3")) tk.MustGetErrCode("select * from t use index(a);", errno.ErrKeyDoesNotExist) tk.MustGetErrCode("select * from t use index(b);", errno.ErrKeyDoesNotExist) tk.MustGetErrCode("select * from t use index(c);", errno.ErrKeyDoesNotExist) @@ -733,6 +767,9 @@ func TestMultiSchemaChangeRenameIndexes(t *testing.T) { tk.MustExec("insert into t values ()") hook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { // Cancel job when the column 'c' is in write-reorg. + if job.Type != model.ActionMultiSchemaChange { + return false + } assertMultiSchema(t, job, 2) return job.MultiSchemaInfo.SubJobs[0].SchemaState == model.StateWriteReorganization }) @@ -881,6 +918,9 @@ func TestMultiSchemaChangeModifyColumnsCancelled(t *testing.T) { tk.MustExec("create table t (a int, b int, c int, index i1(a), unique index i2(b), index i3(a, b));") tk.MustExec("insert into t values (1, 2, 3);") hook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { + if job.Type != model.ActionMultiSchemaChange { + return false + } assertMultiSchema(t, job, 3) return job.MultiSchemaInfo.SubJobs[2].SchemaState == model.StateWriteReorganization }) @@ -933,7 +973,7 @@ func TestMultiSchemaChangeAlterIndex(t *testing.T) { tk.MustExec("insert into t values (1, 2);") originHook := dom.DDL().GetHook() var checked bool - callback := &ddl.TestDDLCallback{Do: dom} + callback := &callback.TestDDLCallback{Do: dom} onJobUpdatedExportedFunc := func(job *model.Job) { assert.NotNil(t, job.MultiSchemaInfo) // "modify column a tinyint" in write-reorg. @@ -975,6 +1015,7 @@ func TestMultiSchemaChangeMixCancelled(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") + tk.MustExec("set global tidb_ddl_enable_fast_reorg = 0;") tk.MustExec("create table t (a int, b int, c int, index i1(c), index i2(c));") tk.MustExec("insert into t values (1, 2, 3);") @@ -1002,7 +1043,7 @@ func TestMultiSchemaChangeAdminShowDDLJobs(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test") originHook := dom.DDL().GetHook() - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} hook.OnJobRunBeforeExported = func(job *model.Job) { assert.Equal(t, model.ActionMultiSchemaChange, job.Type) if job.MultiSchemaInfo.SubJobs[0].SchemaState == model.StateDeleteOnly { @@ -1012,7 +1053,7 @@ func TestMultiSchemaChangeAdminShowDDLJobs(t *testing.T) { assert.Equal(t, len(rows), 4) assert.Equal(t, rows[1][1], "test") assert.Equal(t, rows[1][2], "t") - assert.Equal(t, rows[1][3], "add index /* subjob */") + assert.Equal(t, rows[1][3], "add index /* subjob */ /* txn-merge */") assert.Equal(t, rows[1][4], "delete only") assert.Equal(t, rows[1][len(rows[1])-1], "running") @@ -1089,7 +1130,7 @@ func TestMultiSchemaChangeWithExpressionIndex(t *testing.T) { tk.MustQuery("select * from t;").Check(testkit.Rows("1 2", "2 1")) originHook := dom.DDL().GetHook() - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} var checkErr error hook.OnJobRunBeforeExported = func(job *model.Job) { if checkErr != nil { @@ -1137,7 +1178,7 @@ func TestMultiSchemaChangeUnsupportedType(t *testing.T) { tk.MustExec("use test;") tk.MustExec("create table t (a int, b int);") - tk.MustGetErrMsg("alter table t add column c int, auto_id_cache = 1;", + tk.MustGetErrMsg("alter table t add column c int, auto_id_cache = 10;", "[ddl:8200]Unsupported multi schema change for modify auto id cache") } @@ -1151,7 +1192,7 @@ func TestMultiSchemaChangeSchemaVersion(t *testing.T) { schemaVerMap := map[int64]struct{}{} originHook := dom.DDL().GetHook() - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} hook.OnJobSchemaStateChanged = func(schemaVer int64) { if schemaVer != 0 { // No same return schemaVer during multi-schema change @@ -1168,6 +1209,17 @@ func TestMultiSchemaChangeSchemaVersion(t *testing.T) { dom.DDL().SetHook(originHook) } +func TestMultiSchemaChangeAddIndexChangeColumn(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + tk.MustExec("CREATE TABLE t (a SMALLINT DEFAULT '30219', b TIME NULL DEFAULT '02:45:06', PRIMARY KEY (a));") + tk.MustExec("ALTER TABLE t ADD unique INDEX idx4 (b), change column a e MEDIUMINT DEFAULT '5280454' FIRST;") + tk.MustExec("insert ignore into t (e) values (5586359),(501788),(-5961048),(220083),(-4917129),(-7267211),(7750448);") + tk.MustQuery("select * from t;").Check(testkit.Rows("5586359 02:45:06")) + tk.MustExec("admin check table t;") +} + func TestMultiSchemaChangeMixedWithUpdate(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) @@ -1180,7 +1232,7 @@ func TestMultiSchemaChangeMixedWithUpdate(t *testing.T) { "'2020-01-01 10:00:00', 'wer', '10:00:00', 2.1, 12, 'qwer', 12, 'asdf');") originHook := dom.DDL().GetHook() - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} var checkErr error hook.OnJobRunBeforeExported = func(job *model.Job) { if checkErr != nil { @@ -1215,7 +1267,7 @@ type cancelOnceHook struct { pred func(job *model.Job) bool s sessionctx.Context - ddl.TestDDLCallback + callback.TestDDLCallback } func (c *cancelOnceHook) OnJobUpdated(job *model.Job) { @@ -1223,7 +1275,7 @@ func (c *cancelOnceHook) OnJobUpdated(job *model.Job) { return } c.triggered = true - errs, err := ddl.CancelJobs(c.s, c.store, []int64{job.ID}) + errs, err := ddl.CancelJobs(c.s, []int64{job.ID}) if errs[0] != nil { c.cancelErr = errs[0] return @@ -1248,7 +1300,7 @@ func newCancelJobHook(t *testing.T, store kv.Storage, dom *domain.Domain, return &cancelOnceHook{ store: store, pred: pred, - TestDDLCallback: ddl.TestDDLCallback{Do: dom}, + TestDDLCallback: callback.TestDDLCallback{Do: dom}, s: tk.Session(), } } @@ -1262,7 +1314,6 @@ func putTheSameDDLJobTwice(t *testing.T, fn func()) { } func assertMultiSchema(t *testing.T, job *model.Job, subJobLen int) { - assert.Equal(t, model.ActionMultiSchemaChange, job.Type, job) assert.NotNil(t, job.MultiSchemaInfo, job) assert.Len(t, job.MultiSchemaInfo.SubJobs, subJobLen, job) } diff --git a/ddl/mv_index_test.go b/ddl/mv_index_test.go new file mode 100644 index 0000000000000..10fbe2971377a --- /dev/null +++ b/ddl/mv_index_test.go @@ -0,0 +1,71 @@ +// Copyright 2023 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 ddl_test + +import ( + "fmt" + "strings" + "testing" + + "github.com/pingcap/tidb/ddl/internal/callback" + "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/testkit" +) + +func TestMultiValuedIndexOnlineDDL(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (pk int primary key, a json) partition by hash(pk) partitions 32;") + var sb strings.Builder + sb.WriteString("insert into t values ") + for i := 0; i < 100; i++ { + sb.WriteString(fmt.Sprintf("(%d, '[%d, %d, %d]')", i, i+1, i+2, i+3)) + if i != 99 { + sb.WriteString(",") + } + } + tk.MustExec(sb.String()) + + internalTK := testkit.NewTestKit(t, store) + internalTK.MustExec("use test") + + hook := &callback.TestDDLCallback{Do: dom} + n := 100 + hook.OnJobRunBeforeExported = func(job *model.Job) { + internalTK.MustExec(fmt.Sprintf("insert into t values (%d, '[%d, %d, %d]')", n, n, n+1, n+2)) + internalTK.MustExec(fmt.Sprintf("delete from t where pk = %d", n-4)) + internalTK.MustExec(fmt.Sprintf("update t set a = '[%d, %d, %d]' where pk = %d", n-3, n-2, n+1000, n-3)) + n++ + } + o := dom.DDL().GetHook() + dom.DDL().SetHook(hook) + + tk.MustExec("alter table t add index idx((cast(a as signed array)))") + tk.MustExec("admin check table t") + dom.DDL().SetHook(o) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (pk int primary key, a json);") + tk.MustExec("insert into t values (1, '[1,2,3]');") + tk.MustExec("insert into t values (2, '[2,3,4]');") + tk.MustExec("insert into t values (3, '[3,4,5]');") + tk.MustExec("insert into t values (4, '[-4,5,6]');") + tk.MustGetErrCode("alter table t add unique index idx((cast(a as signed array)));", errno.ErrDupEntry) + tk.MustGetErrMsg("alter table t add index idx((cast(a as unsigned array)));", "[ddl:8202]Cannot decode index value, because [types:1690]constant -4 overflows bigint") +} diff --git a/ddl/partition.go b/ddl/partition.go index 7bba0b1006332..00a5582be9a54 100644 --- a/ddl/partition.go +++ b/ddl/partition.go @@ -34,6 +34,7 @@ import ( "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/parser" @@ -42,8 +43,10 @@ import ( "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/opcode" + "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" driver "github.com/pingcap/tidb/types/parser_driver" @@ -55,9 +58,11 @@ import ( "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/mathutil" "github.com/pingcap/tidb/util/mock" + decoder "github.com/pingcap/tidb/util/rowDecoder" "github.com/pingcap/tidb/util/slice" "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tidb/util/stringutil" + "github.com/prometheus/client_golang/prometheus" "github.com/tikv/client-go/v2/tikv" "go.uber.org/zap" ) @@ -161,7 +166,7 @@ func (w *worker) onAddTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (v for _, p := range tblInfo.Partition.AddingDefinitions { ids = append(ids, p.ID) } - if err := alterTableLabelRule(job.SchemaName, tblInfo, ids); err != nil { + if _, err := alterTableLabelRule(job.SchemaName, tblInfo, ids); err != nil { job.State = model.JobStateCancelled return ver, err } @@ -170,6 +175,10 @@ func (w *worker) onAddTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (v job.SchemaState = model.StateReplicaOnly case model.StateReplicaOnly: // replica only -> public + failpoint.Inject("sleepBeforeReplicaOnly", func(val failpoint.Value) { + sleepSecond := val.(int) + time.Sleep(time.Duration(sleepSecond) * time.Second) + }) // Here need do some tiflash replica complement check. // TODO: If a table is with no TiFlashReplica or it is not available, the replica-only state can be eliminated. if tblInfo.TiFlashReplica != nil && tblInfo.TiFlashReplica.Available { @@ -177,8 +186,7 @@ func (w *worker) onAddTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (v // be finished. Otherwise the query to this partition will be blocked. needRetry, err := checkPartitionReplica(tblInfo.TiFlashReplica.Count, addingDefinitions, d) if err != nil { - ver, err = convertAddTablePartitionJob2RollbackJob(d, t, job, err, tblInfo) - return ver, err + return convertAddTablePartitionJob2RollbackJob(d, t, job, err, tblInfo) } if needRetry { // The new added partition hasn't been replicated. @@ -193,6 +201,15 @@ func (w *worker) onAddTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (v if tblInfo.TiFlashReplica != nil && tblInfo.TiFlashReplica.Available { for _, d := range partInfo.Definitions { tblInfo.TiFlashReplica.AvailablePartitionIDs = append(tblInfo.TiFlashReplica.AvailablePartitionIDs, d.ID) + err = infosync.UpdateTiFlashProgressCache(d.ID, 1) + if err != nil { + // just print log, progress will be updated in `refreshTiFlashTicker` + logutil.BgLogger().Error("update tiflash sync progress cache failed", + zap.Error(err), + zap.Int64("tableID", tblInfo.ID), + zap.Int64("partitionID", d.ID), + ) + } } } // For normal and replica finished table, move the `addingDefinitions` into `Definitions`. @@ -213,14 +230,16 @@ func (w *worker) onAddTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (v return ver, errors.Trace(err) } -func alterTableLabelRule(schemaName string, meta *model.TableInfo, ids []int64) error { +// alterTableLabelRule updates Label Rules if they exists +// returns true if changed. +func alterTableLabelRule(schemaName string, meta *model.TableInfo, ids []int64) (bool, error) { tableRuleID := fmt.Sprintf(label.TableIDFormat, label.IDPrefix, schemaName, meta.Name.L) oldRule, err := infosync.GetLabelRules(context.TODO(), []string{tableRuleID}) if err != nil { - return errors.Trace(err) + return false, errors.Trace(err) } if len(oldRule) == 0 { - return nil + return false, nil } r, ok := oldRule[tableRuleID] @@ -228,10 +247,11 @@ func alterTableLabelRule(schemaName string, meta *model.TableInfo, ids []int64) rule := r.Reset(schemaName, meta.Name.L, "", ids...) err = infosync.PutLabelRule(context.TODO(), rule) if err != nil { - return errors.Wrapf(err, "failed to notify PD label rule") + return false, errors.Wrapf(err, "failed to notify PD label rule") } + return true, nil } - return nil + return false, nil } func alterTablePartitionBundles(t *meta.Meta, tblInfo *model.TableInfo, addingDefinitions []model.PartitionDefinition) ([]*placement.Bundle, error) { @@ -1294,6 +1314,28 @@ func checkAddPartitionNameUnique(tbInfo *model.TableInfo, pi *model.PartitionInf return nil } +func checkReorgPartitionNames(p *model.PartitionInfo, droppedNames []model.CIStr, pi *model.PartitionInfo) error { + partNames := make(map[string]struct{}) + oldDefs := p.Definitions + for _, oldDef := range oldDefs { + partNames[oldDef.Name.L] = struct{}{} + } + for _, delName := range droppedNames { + if _, ok := partNames[delName.L]; !ok { + return dbterror.ErrSameNamePartition.GenWithStackByArgs(delName) + } + delete(partNames, delName.L) + } + newDefs := pi.Definitions + for _, newDef := range newDefs { + if _, ok := partNames[newDef.Name.L]; ok { + return dbterror.ErrSameNamePartition.GenWithStackByArgs(newDef.Name) + } + partNames[newDef.Name.L] = struct{}{} + } + return nil +} + func checkAndOverridePartitionID(newTableInfo, oldTableInfo *model.TableInfo) error { // If any old partitionInfo has lost, that means the partition ID lost too, so did the data, repair failed. if newTableInfo.Partition == nil { @@ -1362,7 +1404,7 @@ func checkPartitionFuncType(ctx sessionctx.Context, expr ast.ExprNode, tblInfo * return nil } - e, err := expression.RewriteSimpleExprWithTableInfo(ctx, tblInfo, expr) + e, err := expression.RewriteSimpleExprWithTableInfo(ctx, tblInfo, expr, false) if err != nil { return errors.Trace(err) } @@ -1663,7 +1705,7 @@ func (w *worker) onDropTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) ( if err != nil { return ver, errors.Trace(err) } - if job.Type == model.ActionAddTablePartition { + if job.Type == model.ActionAddTablePartition || job.Type == model.ActionReorganizePartition { // It is rollbacked from adding table partition, just remove addingDefinitions from tableInfo. physicalTableIDs, pNames, rollbackBundles := rollbackAddingPartitionInfo(tblInfo) err = infosync.PutRuleBundlesWithDefaultRetry(context.TODO(), rollbackBundles) @@ -1677,7 +1719,7 @@ func (w *worker) onDropTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) ( return ver, errors.Wrapf(err, "failed to notify PD the label rules") } - if err := alterTableLabelRule(job.SchemaName, tblInfo, getIDs([]*model.TableInfo{tblInfo})); err != nil { + if _, err := alterTableLabelRule(job.SchemaName, tblInfo, getIDs([]*model.TableInfo{tblInfo})); err != nil { job.State = model.JobStateCancelled return ver, err } @@ -1710,7 +1752,7 @@ func (w *worker) onDropTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) ( return ver, errors.Wrapf(err, "failed to notify PD the label rules") } - if err := alterTableLabelRule(job.SchemaName, tblInfo, getIDs([]*model.TableInfo{tblInfo})); err != nil { + if _, err := alterTableLabelRule(job.SchemaName, tblInfo, getIDs([]*model.TableInfo{tblInfo})); err != nil { job.State = model.JobStateCancelled return ver, err } @@ -1730,6 +1772,10 @@ func (w *worker) onDropTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) ( if err != nil { return ver, errors.Trace(err) } + dbInfo, err := t.GetDatabase(job.SchemaID) + if err != nil { + return ver, errors.Trace(err) + } // If table has global indexes, we need reorg to clean up them. if pt, ok := tbl.(table.PartitionedTable); ok && hasGlobalIndex(tblInfo) { // Build elements for compatible with modify column type. elements will not be used when reorganizing. @@ -1739,8 +1785,13 @@ func (w *worker) onDropTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) ( elements = append(elements, &meta.Element{ID: idxInfo.ID, TypeKey: meta.IndexElementKey}) } } - rh := newReorgHandler(t, w.sess, w.concurrentDDL) - reorgInfo, err := getReorgInfoFromPartitions(d.jobContext(job), d, rh, job, tbl, physicalTableIDs, elements) + sctx, err1 := w.sessPool.get() + if err1 != nil { + return ver, err1 + } + defer w.sessPool.put(sctx) + rh := newReorgHandler(newSession(sctx)) + reorgInfo, err := getReorgInfoFromPartitions(d.jobContext(job.ID), d, rh, job, dbInfo, pt, physicalTableIDs, elements) if err != nil || reorgInfo.first { // If we run reorg firstly, we should update the job snapshot version @@ -2064,7 +2115,7 @@ func (w *worker) onExchangeTablePartition(d *ddlCtx, t *meta.Meta, job *model.Jo failpoint.Return(ver, err) } sess := newSession(se) - _, err = sess.execute(context.Background(), "insert into test.pt values (40000000)", "exchange_partition_test") + _, err = sess.execute(context.Background(), "insert ignore into test.pt values (40000000)", "exchange_partition_test") if err != nil { failpoint.Return(ver, err) } @@ -2137,6 +2188,665 @@ func (w *worker) onExchangeTablePartition(d *ddlCtx, t *meta.Meta, job *model.Jo return ver, nil } +func checkReorgPartition(t *meta.Meta, job *model.Job) (*model.TableInfo, []model.CIStr, *model.PartitionInfo, []model.PartitionDefinition, []model.PartitionDefinition, error) { + schemaID := job.SchemaID + tblInfo, err := GetTableInfoAndCancelFaultJob(t, job, schemaID) + if err != nil { + return nil, nil, nil, nil, nil, errors.Trace(err) + } + partInfo := &model.PartitionInfo{} + var partNames []model.CIStr + err = job.DecodeArgs(&partNames, &partInfo) + if err != nil { + job.State = model.JobStateCancelled + return nil, nil, nil, nil, nil, errors.Trace(err) + } + addingDefs := tblInfo.Partition.AddingDefinitions + droppingDefs := tblInfo.Partition.DroppingDefinitions + if len(addingDefs) == 0 { + addingDefs = []model.PartitionDefinition{} + } + if len(droppingDefs) == 0 { + droppingDefs = []model.PartitionDefinition{} + } + return tblInfo, partNames, partInfo, droppingDefs, addingDefs, nil +} + +func (w *worker) onReorganizePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) { + // Handle the rolling back job + if job.IsRollingback() { + ver, err := w.onDropTablePartition(d, t, job) + if err != nil { + return ver, errors.Trace(err) + } + return ver, nil + } + + tblInfo, partNamesCIStr, partInfo, _, addingDefinitions, err := checkReorgPartition(t, job) + if err != nil { + return ver, err + } + partNames := make([]string, len(partNamesCIStr)) + for i := range partNamesCIStr { + partNames[i] = partNamesCIStr[i].L + } + + // In order to skip maintaining the state check in partitionDefinition, TiDB use dropping/addingDefinition instead of state field. + // So here using `job.SchemaState` to judge what the stage of this job is. + originalState := job.SchemaState + switch job.SchemaState { + case model.StateNone: + // job.SchemaState == model.StateNone means the job is in the initial state of reorg partition. + // Here should use partInfo from job directly and do some check action. + // In case there was a race for queueing different schema changes on the same + // table and the checks was not done on the current schema version. + // The partInfo may have been checked against an older schema version for example. + // If the check is done here, it does not need to be repeated, since no other + // DDL on the same table can be run concurrently. + err = checkAddPartitionTooManyPartitions(uint64(len(tblInfo.Partition.Definitions) + + len(partInfo.Definitions) - + len(partNames))) + if err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + + err = checkReorgPartitionNames(tblInfo.Partition, partNamesCIStr, partInfo) + if err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + + // Re-check that the dropped/added partitions are compatible with current definition + firstPartIdx, lastPartIdx, idMap, err := getReplacedPartitionIDs(partNamesCIStr, tblInfo.Partition) + if err != nil { + job.State = model.JobStateCancelled + return ver, err + } + sctx := w.sess.Context + if err = checkReorgPartitionDefs(sctx, tblInfo, partInfo, firstPartIdx, lastPartIdx, idMap); err != nil { + job.State = model.JobStateCancelled + return ver, err + } + + // move the adding definition into tableInfo. + updateAddingPartitionInfo(partInfo, tblInfo) + orgDefs := tblInfo.Partition.Definitions + _ = updateDroppingPartitionInfo(tblInfo, partNames) + // Reset original partitions, and keep DroppedDefinitions + tblInfo.Partition.Definitions = orgDefs + + // modify placement settings + for _, def := range tblInfo.Partition.AddingDefinitions { + if _, err = checkPlacementPolicyRefValidAndCanNonValidJob(t, job, def.PlacementPolicyRef); err != nil { + // job.State = model.JobStateCancelled may be set depending on error in function above. + return ver, errors.Trace(err) + } + } + + // From now on we cannot just cancel the DDL, we must roll back if changesMade! + changesMade := false + if tblInfo.TiFlashReplica != nil { + // Must set placement rule, and make sure it succeeds. + if err := infosync.ConfigureTiFlashPDForPartitions(true, &tblInfo.Partition.AddingDefinitions, tblInfo.TiFlashReplica.Count, &tblInfo.TiFlashReplica.LocationLabels, tblInfo.ID); err != nil { + logutil.BgLogger().Error("ConfigureTiFlashPDForPartitions fails", zap.Error(err)) + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + changesMade = true + // In the next step, StateDeleteOnly, wait to verify the TiFlash replicas are OK + } + + bundles, err := alterTablePartitionBundles(t, tblInfo, tblInfo.Partition.AddingDefinitions) + if err != nil { + if !changesMade { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + return convertAddTablePartitionJob2RollbackJob(d, t, job, err, tblInfo) + } + + if len(bundles) > 0 { + if err = infosync.PutRuleBundlesWithDefaultRetry(context.TODO(), bundles); err != nil { + if !changesMade { + job.State = model.JobStateCancelled + return ver, errors.Wrapf(err, "failed to notify PD the placement rules") + } + return convertAddTablePartitionJob2RollbackJob(d, t, job, err, tblInfo) + } + changesMade = true + } + + ids := getIDs([]*model.TableInfo{tblInfo}) + for _, p := range tblInfo.Partition.AddingDefinitions { + ids = append(ids, p.ID) + } + changed, err := alterTableLabelRule(job.SchemaName, tblInfo, ids) + changesMade = changesMade || changed + if err != nil { + if !changesMade { + job.State = model.JobStateCancelled + return ver, err + } + return convertAddTablePartitionJob2RollbackJob(d, t, job, err, tblInfo) + } + + // Doing the preSplitAndScatter here, since all checks are completed, + // and we will soon start writing to the new partitions. + if s, ok := d.store.(kv.SplittableStore); ok && s != nil { + // partInfo only contains the AddingPartitions + splitPartitionTableRegion(w.sess.Context, s, tblInfo, partInfo, true) + } + + // Assume we cannot have more than MaxUint64 rows, set the progress to 1/10 of that. + metrics.GetBackfillProgressByLabel(metrics.LblReorgPartition, job.SchemaName, tblInfo.Name.String()).Set(0.1 / float64(math.MaxUint64)) + job.SchemaState = model.StateDeleteOnly + tblInfo.Partition.DDLState = model.StateDeleteOnly + ver, err = updateVersionAndTableInfoWithCheck(d, t, job, tblInfo, true) + if err != nil { + return ver, errors.Trace(err) + } + + // Is really both StateDeleteOnly AND StateWriteOnly needed? + // If transaction A in WriteOnly inserts row 1 (into both new and old partition set) + // and then transaction B in DeleteOnly deletes that row (in both new and old) + // does really transaction B need to do the delete in the new partition? + // Yes, otherwise it would still be there when the WriteReorg happens, + // and WriteReorg would only copy existing rows to the new table, so unless it is + // deleted it would result in a ghost row! + // What about update then? + // Updates also need to be handled for new partitions in DeleteOnly, + // since it would not be overwritten during Reorganize phase. + // BUT if the update results in adding in one partition and deleting in another, + // THEN only the delete must happen in the new partition set, not the insert! + case model.StateDeleteOnly: + // This state is to confirm all servers can not see the new partitions when reorg is running, + // so that all deletes will be done in both old and new partitions when in either DeleteOnly + // or WriteOnly state. + // Also using the state for checking that the optional TiFlash replica is available, making it + // in a state without (much) data and easy to retry without side effects. + + // Reason for having it here, is to make it easy for retry, and better to make sure it is in-sync + // as early as possible, to avoid a long wait after the data copying. + if tblInfo.TiFlashReplica != nil && tblInfo.TiFlashReplica.Available { + // For available state, the new added partition should wait its replica to + // be finished, otherwise the query to this partition will be blocked. + count := tblInfo.TiFlashReplica.Count + needRetry, err := checkPartitionReplica(count, addingDefinitions, d) + if err != nil { + // need to rollback, since we tried to register the new + // partitions before! + return convertAddTablePartitionJob2RollbackJob(d, t, job, err, tblInfo) + } + if needRetry { + // The new added partition hasn't been replicated. + // Do nothing to the job this time, wait next worker round. + time.Sleep(tiflashCheckTiDBHTTPAPIHalfInterval) + // Set the error here which will lead this job exit when it's retry times beyond the limitation. + return ver, errors.Errorf("[ddl] add partition wait for tiflash replica to complete") + } + + // When TiFlash Replica is ready, we must move them into `AvailablePartitionIDs`. + // Since onUpdateFlashReplicaStatus cannot see the partitions yet (not public) + for _, d := range addingDefinitions { + tblInfo.TiFlashReplica.AvailablePartitionIDs = append(tblInfo.TiFlashReplica.AvailablePartitionIDs, d.ID) + } + } + + job.SchemaState = model.StateWriteOnly + tblInfo.Partition.DDLState = model.StateWriteOnly + metrics.GetBackfillProgressByLabel(metrics.LblReorgPartition, job.SchemaName, tblInfo.Name.String()).Set(0.2 / float64(math.MaxUint64)) + ver, err = updateVersionAndTableInfo(d, t, job, tblInfo, originalState != job.SchemaState) + case model.StateWriteOnly: + // Insert this state to confirm all servers can see the new partitions when reorg is running, + // so that new data will be updated in both old and new partitions when reorganizing. + job.SnapshotVer = 0 + job.SchemaState = model.StateWriteReorganization + tblInfo.Partition.DDLState = model.StateWriteReorganization + metrics.GetBackfillProgressByLabel(metrics.LblReorgPartition, job.SchemaName, tblInfo.Name.String()).Set(0.3 / float64(math.MaxUint64)) + ver, err = updateVersionAndTableInfo(d, t, job, tblInfo, originalState != job.SchemaState) + case model.StateWriteReorganization: + physicalTableIDs := getPartitionIDsFromDefinitions(tblInfo.Partition.DroppingDefinitions) + tbl, err2 := getTable(d.store, job.SchemaID, tblInfo) + if err2 != nil { + return ver, errors.Trace(err2) + } + // TODO: If table has global indexes, we need reorg to clean up them. + // and then add the new partition ids back... + if _, ok := tbl.(table.PartitionedTable); ok && hasGlobalIndex(tblInfo) { + err = errors.Trace(dbterror.ErrCancelledDDLJob.GenWithStack("global indexes is not supported yet for reorganize partition")) + return convertAddTablePartitionJob2RollbackJob(d, t, job, err, tblInfo) + } + var done bool + done, ver, err = doPartitionReorgWork(w, d, t, job, tbl, physicalTableIDs) + + if !done { + return ver, err + } + + firstPartIdx, lastPartIdx, idMap, err2 := getReplacedPartitionIDs(partNamesCIStr, tblInfo.Partition) + failpoint.Inject("reorgPartWriteReorgReplacedPartIDsFail", func(val failpoint.Value) { + if val.(bool) { + err2 = errors.New("Injected error by reorgPartWriteReorgReplacedPartIDsFail") + } + }) + if err2 != nil { + return ver, err2 + } + newDefs := getReorganizedDefinitions(tblInfo.Partition, firstPartIdx, lastPartIdx, idMap) + + // From now on, use the new definitions, but keep the Adding and Dropping for double write + tblInfo.Partition.Definitions = newDefs + tblInfo.Partition.Num = uint64(len(newDefs)) + + // Now all the data copying is done, but we cannot simply remove the droppingDefinitions + // since they are a part of the normal Definitions that other nodes with + // the current schema version. So we need to double write for one more schema version + job.SchemaState = model.StateDeleteReorganization + tblInfo.Partition.DDLState = model.StateDeleteReorganization + ver, err = updateVersionAndTableInfo(d, t, job, tblInfo, originalState != job.SchemaState) + + case model.StateDeleteReorganization: + // Drop the droppingDefinitions and finish the DDL + // This state is needed for the case where client A sees the schema + // with version of StateWriteReorg and would not see updates of + // client B that writes to the new partitions, previously + // addingDefinitions, since it would not double write to + // the droppingDefinitions during this time + // By adding StateDeleteReorg state, client B will write to both + // the new (previously addingDefinitions) AND droppingDefinitions + + // Register the droppingDefinitions ids for rangeDelete + // and the addingDefinitions for handling in the updateSchemaVersion + physicalTableIDs := getPartitionIDsFromDefinitions(tblInfo.Partition.DroppingDefinitions) + newIDs := getPartitionIDsFromDefinitions(partInfo.Definitions) + job.CtxVars = []interface{}{physicalTableIDs, newIDs} + definitionsToDrop := tblInfo.Partition.DroppingDefinitions + tblInfo.Partition.DroppingDefinitions = nil + tblInfo.Partition.AddingDefinitions = nil + ver, err = updateVersionAndTableInfo(d, t, job, tblInfo, true) + failpoint.Inject("reorgPartWriteReorgSchemaVersionUpdateFail", func(val failpoint.Value) { + if val.(bool) { + err = errors.New("Injected error by reorgPartWriteReorgSchemaVersionUpdateFail") + } + }) + if err != nil { + return ver, errors.Trace(err) + } + job.SchemaState = model.StateNone + tblInfo.Partition.DDLState = model.StateNone + job.FinishTableJob(model.JobStateDone, model.StateNone, ver, tblInfo) + // How to handle this? + // Seems to only trigger asynchronous update of statistics. + // Should it actually be synchronous? + asyncNotifyEvent(d, &util.Event{Tp: model.ActionReorganizePartition, TableInfo: tblInfo, PartInfo: &model.PartitionInfo{Definitions: definitionsToDrop}}) + // A background job will be created to delete old partition data. + job.Args = []interface{}{physicalTableIDs} + + default: + err = dbterror.ErrInvalidDDLState.GenWithStackByArgs("partition", job.SchemaState) + } + + return ver, errors.Trace(err) +} + +func doPartitionReorgWork(w *worker, d *ddlCtx, t *meta.Meta, job *model.Job, tbl table.Table, physTblIDs []int64) (done bool, ver int64, err error) { + job.ReorgMeta.ReorgTp = model.ReorgTypeTxn + sctx, err1 := w.sessPool.get() + if err1 != nil { + return done, ver, err1 + } + defer w.sessPool.put(sctx) + rh := newReorgHandler(newSession(sctx)) + elements := BuildElements(tbl.Meta().Columns[0], tbl.Meta().Indices) + partTbl, ok := tbl.(table.PartitionedTable) + if !ok { + return false, ver, dbterror.ErrUnsupportedReorganizePartition.GenWithStackByArgs() + } + dbInfo, err := t.GetDatabase(job.SchemaID) + if err != nil { + return false, ver, errors.Trace(err) + } + reorgInfo, err := getReorgInfoFromPartitions(d.jobContext(job.ID), d, rh, job, dbInfo, partTbl, physTblIDs, elements) + err = w.runReorgJob(rh, reorgInfo, tbl.Meta(), d.lease, func() (reorgErr error) { + defer tidbutil.Recover(metrics.LabelDDL, "doPartitionReorgWork", + func() { + reorgErr = dbterror.ErrCancelledDDLJob.GenWithStack("reorganize partition for table `%v` panic", tbl.Meta().Name) + }, false) + return w.reorgPartitionDataAndIndex(tbl, reorgInfo) + }) + if err != nil { + if dbterror.ErrWaitReorgTimeout.Equal(err) { + // If timeout, we should return, check for the owner and re-wait job done. + return false, ver, nil + } + if kv.IsTxnRetryableError(err) { + return false, ver, errors.Trace(err) + } + if err1 := rh.RemoveDDLReorgHandle(job, reorgInfo.elements); err1 != nil { + logutil.BgLogger().Warn("[ddl] reorg partition job failed, RemoveDDLReorgHandle failed, can't convert job to rollback", + zap.String("job", job.String()), zap.Error(err1)) + } + logutil.BgLogger().Warn("[ddl] reorg partition job failed, convert job to rollback", zap.String("job", job.String()), zap.Error(err)) + ver, err = convertAddTablePartitionJob2RollbackJob(d, t, job, err, tbl.Meta()) + return false, ver, errors.Trace(err) + } + return true, ver, err +} + +type reorgPartitionWorker struct { + *backfillCtx + metricCounter prometheus.Counter + + // Static allocated to limit memory allocations + rowRecords []*rowRecord + rowDecoder *decoder.RowDecoder + rowMap map[int64]types.Datum + writeColOffsetMap map[int64]int + maxOffset int + reorgedTbl table.PartitionedTable + + jobContext *JobContext +} + +func newReorgPartitionWorker(sessCtx sessionctx.Context, i int, t table.PhysicalTable, decodeColMap map[int64]decoder.Column, reorgInfo *reorgInfo, jc *JobContext) (*reorgPartitionWorker, error) { + reorgedTbl, err := tables.GetReorganizedPartitionedTable(t) + if err != nil { + return nil, errors.Trace(err) + } + pt := t.GetPartitionedTable() + if pt == nil { + return nil, dbterror.ErrUnsupportedReorganizePartition.GenWithStackByArgs() + } + partColIDs := pt.GetPartitionColumnIDs() + writeColOffsetMap := make(map[int64]int, len(partColIDs)) + maxOffset := 0 + for _, col := range pt.Cols() { + found := false + for _, id := range partColIDs { + if col.ID == id { + found = true + break + } + } + if !found { + continue + } + writeColOffsetMap[col.ID] = col.Offset + maxOffset = mathutil.Max[int](maxOffset, col.Offset) + } + return &reorgPartitionWorker{ + backfillCtx: newBackfillCtx(reorgInfo.d, i, sessCtx, reorgInfo.ReorgMeta.ReorgTp, reorgInfo.SchemaName, t), + metricCounter: metrics.BackfillTotalCounter.WithLabelValues(metrics.GenerateReorgLabel("reorg_partition_rate", reorgInfo.SchemaName, t.Meta().Name.String())), + rowDecoder: decoder.NewRowDecoder(t, t.WritableCols(), decodeColMap), + rowMap: make(map[int64]types.Datum, len(decodeColMap)), + jobContext: jc, + writeColOffsetMap: writeColOffsetMap, + maxOffset: maxOffset, + reorgedTbl: reorgedTbl, + }, nil +} + +func (w *reorgPartitionWorker) GetTasks() ([]*BackfillJob, error) { + panic("[ddl] reorg partition worker GetTask function doesn't implement") +} + +func (w *reorgPartitionWorker) BackfillDataInTxn(handleRange reorgBackfillTask) (taskCtx backfillTaskContext, errInTxn error) { + oprStartTime := time.Now() + ctx := kv.WithInternalSourceType(context.Background(), w.jobContext.ddlJobSourceType()) + errInTxn = kv.RunInNewTxn(ctx, w.sessCtx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) error { + taskCtx.addedCount = 0 + taskCtx.scanCount = 0 + txn.SetOption(kv.Priority, handleRange.priority) + if tagger := w.GetCtx().getResourceGroupTaggerForTopSQL(handleRange.getJobID()); tagger != nil { + txn.SetOption(kv.ResourceGroupTagger, tagger) + } + + rowRecords, nextKey, taskDone, err := w.fetchRowColVals(txn, handleRange) + if err != nil { + return errors.Trace(err) + } + taskCtx.nextKey = nextKey + taskCtx.done = taskDone + + warningsMap := make(map[errors.ErrorID]*terror.Error) + warningsCountMap := make(map[errors.ErrorID]int64) + for _, prr := range rowRecords { + taskCtx.scanCount++ + + err = txn.Set(prr.key, prr.vals) + if err != nil { + return errors.Trace(err) + } + taskCtx.addedCount++ + if prr.warning != nil { + if _, ok := warningsCountMap[prr.warning.ID()]; ok { + warningsCountMap[prr.warning.ID()]++ + } else { + warningsCountMap[prr.warning.ID()] = 1 + warningsMap[prr.warning.ID()] = prr.warning + } + } + // TODO: Future optimization: also write the indexes here? + // What if the transaction limit is just enough for a single row, without index? + // Hmm, how could that be in the first place? + // For now, implement the batch-txn w.addTableIndex, + // since it already exists and is in use + } + + // Collect the warnings. + taskCtx.warnings, taskCtx.warningsCount = warningsMap, warningsCountMap + + // also add the index entries here? And make sure they are not added somewhere else + + return nil + }) + logSlowOperations(time.Since(oprStartTime), "BackfillDataInTxn", 3000) + + return +} + +func (w *reorgPartitionWorker) fetchRowColVals(txn kv.Transaction, taskRange reorgBackfillTask) ([]*rowRecord, kv.Key, bool, error) { + w.rowRecords = w.rowRecords[:0] + startTime := time.Now() + + // taskDone means that the added handle is out of taskRange.endHandle. + taskDone := false + sysTZ := w.sessCtx.GetSessionVars().StmtCtx.TimeZone + + tmpRow := make([]types.Datum, w.maxOffset+1) + var lastAccessedHandle kv.Key + oprStartTime := startTime + err := iterateSnapshotKeys(w.GetCtx().jobContext(taskRange.getJobID()), w.sessCtx.GetStore(), taskRange.priority, w.table.RecordPrefix(), txn.StartTS(), taskRange.startKey, taskRange.endKey, + func(handle kv.Handle, recordKey kv.Key, rawRow []byte) (bool, error) { + oprEndTime := time.Now() + logSlowOperations(oprEndTime.Sub(oprStartTime), "iterateSnapshotKeys in reorgPartitionWorker fetchRowColVals", 0) + oprStartTime = oprEndTime + + if taskRange.endInclude { + taskDone = recordKey.Cmp(taskRange.endKey) > 0 + } else { + taskDone = recordKey.Cmp(taskRange.endKey) >= 0 + } + + if taskDone || len(w.rowRecords) >= w.batchCnt { + return false, nil + } + + _, err := w.rowDecoder.DecodeTheExistedColumnMap(w.sessCtx, handle, rawRow, sysTZ, w.rowMap) + if err != nil { + return false, errors.Trace(err) + } + + // Set the partitioning columns and calculate which partition to write to + for colID, offset := range w.writeColOffsetMap { + if d, ok := w.rowMap[colID]; ok { + tmpRow[offset] = d + } else { + return false, dbterror.ErrUnsupportedReorganizePartition.GenWithStackByArgs() + } + } + p, err := w.reorgedTbl.GetPartitionByRow(w.sessCtx, tmpRow) + if err != nil { + return false, errors.Trace(err) + } + pid := p.GetPhysicalID() + newKey := tablecodec.EncodeTablePrefix(pid) + newKey = append(newKey, recordKey[len(newKey):]...) + w.rowRecords = append(w.rowRecords, &rowRecord{ + key: newKey, vals: rawRow, + }) + + w.cleanRowMap() + lastAccessedHandle = recordKey + if recordKey.Cmp(taskRange.endKey) == 0 { + taskDone = true + return false, nil + } + return true, nil + }) + + if len(w.rowRecords) == 0 { + taskDone = true + } + + logutil.BgLogger().Debug("[ddl] txn fetches handle info", zap.Uint64("txnStartTS", txn.StartTS()), zap.String("taskRange", taskRange.String()), zap.Duration("takeTime", time.Since(startTime))) + return w.rowRecords, getNextHandleKey(taskRange, taskDone, lastAccessedHandle), taskDone, errors.Trace(err) +} + +func (w *reorgPartitionWorker) cleanRowMap() { + for id := range w.rowMap { + delete(w.rowMap, id) + } +} + +func (w *reorgPartitionWorker) AddMetricInfo(cnt float64) { + w.metricCounter.Add(cnt) +} + +func (w *reorgPartitionWorker) String() string { + return typeReorgPartitionWorker.String() +} + +func (w *reorgPartitionWorker) GetTask() (*BackfillJob, error) { + panic("[ddl] partition reorg worker does not implement GetTask function") +} + +func (w *reorgPartitionWorker) UpdateTask(*BackfillJob) error { + panic("[ddl] partition reorg worker does not implement UpdateTask function") +} + +func (w *reorgPartitionWorker) FinishTask(*BackfillJob) error { + panic("[ddl] partition reorg worker does not implement FinishTask function") +} + +func (w *reorgPartitionWorker) GetCtx() *backfillCtx { + return w.backfillCtx +} + +func (w *worker) reorgPartitionDataAndIndex(t table.Table, reorgInfo *reorgInfo) error { + // First copy all table data to the new partitions + // from each of the DroppingDefinitions partitions. + // Then create all indexes on the AddingDefinitions partitions + // for each new index, one partition at a time. + + // Copy the data from the DroppingDefinitions to the AddingDefinitions + if bytes.Equal(reorgInfo.currElement.TypeKey, meta.ColumnElementKey) { + err := w.updatePhysicalTableRow(t, reorgInfo) + if err != nil { + return errors.Trace(err) + } + } + + failpoint.Inject("reorgPartitionAfterDataCopy", func(val failpoint.Value) { + //nolint:forcetypeassert + if val.(bool) { + panic("panic test in reorgPartitionAfterDataCopy") + } + }) + + // Rewrite this to do all indexes at once in addTableIndex + // instead of calling it once per index (meaning reading the table multiple times) + // But for now, try to understand how it works... + firstNewPartitionID := t.Meta().Partition.AddingDefinitions[0].ID + startElementOffset := 0 + //startElementOffsetToResetHandle := -1 + // This backfill job starts with backfilling index data, whose index ID is currElement.ID. + if !bytes.Equal(reorgInfo.currElement.TypeKey, meta.IndexElementKey) { + // First run, have not yet started backfilling index data + // Restart with the first new partition. + // TODO: handle remove partitioning + reorgInfo.PhysicalTableID = firstNewPartitionID + } else { + // The job was interrupted and has been restarted, + // reset and start from where it was done + for i, element := range reorgInfo.elements[1:] { + if reorgInfo.currElement.ID == element.ID { + startElementOffset = i + //startElementOffsetToResetHandle = i + break + } + } + } + + for i := startElementOffset; i < len(reorgInfo.elements[1:]); i++ { + // Now build the indexes in the new partitions + var physTbl table.PhysicalTable + if tbl, ok := t.(table.PartitionedTable); ok { + physTbl = tbl.GetPartition(reorgInfo.PhysicalTableID) + } else if tbl, ok := t.(table.PhysicalTable); ok { + // This may be used when partitioning a non-partitioned table + physTbl = tbl + } + // Get the original start handle and end handle. + currentVer, err := getValidCurrentVersion(reorgInfo.d.store) + if err != nil { + return errors.Trace(err) + } + // TODO: Can we improve this in case of a crash? + // like where the regInfo PhysicalTableID and element is the same, + // and the tableid in the key-prefix regInfo.StartKey and regInfo.EndKey matches with PhysicalTableID + // do not change the reorgInfo start/end key + startHandle, endHandle, err := getTableRange(reorgInfo.d.jobContext(reorgInfo.Job.ID), reorgInfo.d, physTbl, currentVer.Ver, reorgInfo.Job.Priority) + if err != nil { + return errors.Trace(err) + } + + // Always (re)start with the full PhysicalTable range + reorgInfo.StartKey, reorgInfo.EndKey = startHandle, endHandle + + // Update the element in the reorgCtx to keep the atomic access for daemon-worker. + w.getReorgCtx(reorgInfo.Job.ID).setCurrentElement(reorgInfo.elements[i+1]) + + // Update the element in the reorgInfo for updating the reorg meta below. + reorgInfo.currElement = reorgInfo.elements[i+1] + // Write the reorg info to store so the whole reorganize process can recover from panic. + err = reorgInfo.UpdateReorgMeta(reorgInfo.StartKey, w.sessPool) + logutil.BgLogger().Info("[ddl] update column and indexes", + zap.Int64("jobID", reorgInfo.Job.ID), + zap.ByteString("elementType", reorgInfo.currElement.TypeKey), + zap.Int64("elementID", reorgInfo.currElement.ID), + zap.Int64("partitionTableId", physTbl.GetPhysicalID()), + zap.String("startHandle", hex.EncodeToString(reorgInfo.StartKey)), + zap.String("endHandle", hex.EncodeToString(reorgInfo.EndKey))) + if err != nil { + return errors.Trace(err) + } + err = w.addTableIndex(t, reorgInfo) + if err != nil { + return errors.Trace(err) + } + reorgInfo.PhysicalTableID = firstNewPartitionID + } + failpoint.Inject("reorgPartitionAfterIndex", func(val failpoint.Value) { + //nolint:forcetypeassert + if val.(bool) { + panic("panic test in reorgPartitionAfterIndex") + } + }) + return nil +} + func bundlesForExchangeTablePartition(t *meta.Meta, job *model.Job, pt *model.TableInfo, newPar *model.PartitionDefinition, nt *model.TableInfo) ([]*placement.Bundle, error) { bundles := make([]*placement.Bundle, 0, 3) diff --git a/ddl/placement/bundle.go b/ddl/placement/bundle.go index d8f24f08583f5..62faeb5fe8a3a 100644 --- a/ddl/placement/bundle.go +++ b/ddl/placement/bundle.go @@ -29,6 +29,7 @@ import ( "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/util/codec" "golang.org/x/exp/slices" + "gopkg.in/yaml.v2" ) // Refer to https://github.com/tikv/pd/issues/2701 . @@ -123,7 +124,13 @@ func NewBundleFromConstraintsOptions(options *model.PlacementSettings) (*Bundle, rules = append(rules, rule) } } - + labels, err := newLocationLabelsFromSurvivalPreferences(options.SurvivalPreferences) + if err != nil { + return nil, err + } + for _, rule := range rules { + rule.LocationLabels = labels + } return &Bundle{Rules: rules}, nil } @@ -155,9 +162,17 @@ func NewBundleFromSugarOptions(options *model.PlacementSettings) (*Bundle, error var rules []*Rule + locationLabels, err := newLocationLabelsFromSurvivalPreferences(options.SurvivalPreferences) + if err != nil { + return nil, err + } + // in case empty primaryRegion and regions, just return an empty bundle if primaryRegion == "" && len(regions) == 0 { rules = append(rules, NewRule(Voter, followers+1, NewConstraintsDirect())) + for _, rule := range rules { + rule.LocationLabels = locationLabels + } return &Bundle{Rules: rules}, nil } @@ -195,6 +210,11 @@ func NewBundleFromSugarOptions(options *model.PlacementSettings) (*Bundle, error } } + // set location labels + for _, rule := range rules { + rule.LocationLabels = locationLabels + } + return &Bundle{Rules: rules}, nil } @@ -223,6 +243,19 @@ func newBundleFromOptions(options *model.PlacementSettings) (bundle *Bundle, err return bundle, err } +// newLocationLabelsFromSurvivalPreferences will parse the survival preferences into location labels. +func newLocationLabelsFromSurvivalPreferences(survivalPreferenceStr string) ([]string, error) { + if len(survivalPreferenceStr) > 0 { + labels := []string{} + err := yaml.UnmarshalStrict([]byte(survivalPreferenceStr), &labels) + if err != nil { + return nil, ErrInvalidSurvivalPreferenceFormat + } + return labels, nil + } + return nil, nil +} + // NewBundleFromOptions will transform options into the bundle. func NewBundleFromOptions(options *model.PlacementSettings) (bundle *Bundle, err error) { bundle, err = newBundleFromOptions(options) @@ -257,6 +290,15 @@ func (b *Bundle) String() string { func (b *Bundle) Tidy() error { extraCnt := map[PeerRoleType]int{} newRules := b.Rules[:0] + + // One Bundle is from one PlacementSettings, rule share same location labels, so we can use the first rule's location labels. + var locationLabels []string + for _, rule := range b.Rules { + if len(rule.LocationLabels) > 0 { + locationLabels = rule.LocationLabels + break + } + } for i, rule := range b.Rules { // useless Rule if rule.Count <= 0 { @@ -300,6 +342,8 @@ func (b *Bundle) Tidy() error { Key: EngineLabelKey, Values: []string{EngineLabelTiFlash}, }}, + // the merged rule should have the same location labels with the original rules. + LocationLabels: locationLabels, }) } b.Rules = newRules diff --git a/ddl/placement/bundle_test.go b/ddl/placement/bundle_test.go index a219fc0589789..0dc9032da8562 100644 --- a/ddl/placement/bundle_test.go +++ b/ddl/placement/bundle_test.go @@ -887,6 +887,9 @@ func TestTidy(t *testing.T) { bundle.Rules = append(bundle.Rules, rules3...) bundle.Rules = append(bundle.Rules, rules4...) + for _, r := range bundle.Rules { + r.LocationLabels = []string{"zone", "host"} + } chkfunc := func() { require.NoError(t, err) require.Len(t, bundle.Rules, 3) @@ -901,6 +904,7 @@ func TestTidy(t *testing.T) { Values: []string{EngineLabelTiFlash}, }, }, bundle.Rules[2].Constraints) + require.Equal(t, []string{"zone", "host"}, bundle.Rules[2].LocationLabels) } err = bundle.Tidy() chkfunc() diff --git a/ddl/placement/common.go b/ddl/placement/common.go index cd02622dd0562..7c77ead97e30e 100644 --- a/ddl/placement/common.go +++ b/ddl/placement/common.go @@ -54,4 +54,8 @@ const ( // EngineLabelTiKV is the label value used in some tests. And possibly TiKV will // set the engine label with a value of EngineLabelTiKV. EngineLabelTiKV = "tikv" + + // EngineLabelTiFlashCompute is for disaggregated tiflash mode, + // it's the lable of tiflash_compute nodes. + EngineLabelTiFlashCompute = "tiflash_compute" ) diff --git a/ddl/placement/errors.go b/ddl/placement/errors.go index b609827bd4ce7..a93d0e2bd45b2 100644 --- a/ddl/placement/errors.go +++ b/ddl/placement/errors.go @@ -29,6 +29,8 @@ var ( ErrInvalidConstraintsMapcnt = errors.New("label constraints in map syntax have invalid replicas") // ErrInvalidConstraintsFormat is from rule.go. ErrInvalidConstraintsFormat = errors.New("invalid label constraints format") + // ErrInvalidSurvivalPreferenceFormat is from rule.go. + ErrInvalidSurvivalPreferenceFormat = errors.New("survival preference format should be in format [xxx=yyy, ...]") // ErrInvalidConstraintsRelicas is from rule.go. ErrInvalidConstraintsRelicas = errors.New("label constraints with invalid REPLICAS") // ErrInvalidBundleID is from bundle.go. diff --git a/ddl/placement/rule.go b/ddl/placement/rule.go index 2e91df421dc21..bea4710236338 100644 --- a/ddl/placement/rule.go +++ b/ddl/placement/rule.go @@ -45,15 +45,16 @@ type RuleGroupConfig struct { // Rule is the core placement rule struct. Check https://github.com/tikv/pd/blob/master/server/schedule/placement/rule.go. type Rule struct { - GroupID string `json:"group_id"` - ID string `json:"id"` - Index int `json:"index,omitempty"` - Override bool `json:"override,omitempty"` - StartKeyHex string `json:"start_key"` - EndKeyHex string `json:"end_key"` - Role PeerRoleType `json:"role"` - Count int `json:"count"` - Constraints Constraints `json:"label_constraints,omitempty"` + GroupID string `json:"group_id"` + ID string `json:"id"` + Index int `json:"index,omitempty"` + Override bool `json:"override,omitempty"` + StartKeyHex string `json:"start_key"` + EndKeyHex string `json:"end_key"` + Role PeerRoleType `json:"role"` + Count int `json:"count"` + Constraints Constraints `json:"label_constraints,omitempty"` + LocationLabels []string `json:"location_labels,omitempty"` } // TiFlashRule extends Rule with other necessary fields. diff --git a/ddl/placement_policy_ddl_test.go b/ddl/placement_policy_ddl_test.go index f5d1392018c84..0c0793e711d8e 100644 --- a/ddl/placement_policy_ddl_test.go +++ b/ddl/placement_policy_ddl_test.go @@ -121,6 +121,7 @@ func TestPlacementPolicyInUse(t *testing.T) { builder, err := infoschema.NewBuilder(store, nil).InitWithDBInfos( []*model.DBInfo{db1, db2, dbP}, []*model.PolicyInfo{p1, p2, p3, p4, p5}, + nil, 1, ) require.NoError(t, err) diff --git a/ddl/placement_policy_test.go b/ddl/placement_policy_test.go index 559cc0ff59a46..0b2c3f29b21ca 100644 --- a/ddl/placement_policy_test.go +++ b/ddl/placement_policy_test.go @@ -24,6 +24,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/domain" @@ -135,7 +136,7 @@ func TestPlacementPolicy(t *testing.T) { tk.MustExec("use test") tk.MustExec("drop placement policy if exists x") - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} var policyID int64 onJobUpdatedExportedFunc := func(job *model.Job) { if policyID != 0 { @@ -154,7 +155,8 @@ func TestPlacementPolicy(t *testing.T) { "LEARNERS=1 " + "LEARNER_CONSTRAINTS=\"[+region=cn-west-1]\" " + "FOLLOWERS=3 " + - "FOLLOWER_CONSTRAINTS=\"[+disk=ssd]\"") + "FOLLOWER_CONSTRAINTS=\"[+disk=ssd]\"" + + "SURVIVAL_PREFERENCES=\"[region, zone]\"") checkFunc := func(policyInfo *model.PolicyInfo) { require.Equal(t, true, policyInfo.ID != 0) @@ -167,6 +169,7 @@ func TestPlacementPolicy(t *testing.T) { require.Equal(t, "[+region=cn-west-1]", policyInfo.LearnerConstraints) require.Equal(t, model.StatePublic, policyInfo.State) require.Equal(t, "", policyInfo.Schedule) + require.Equal(t, "[region, zone]", policyInfo.SurvivalPreferences) } // Check the policy is correctly reloaded in the information schema. @@ -589,11 +592,16 @@ func TestCreateTableWithPlacementPolicy(t *testing.T) { tk.MustExec("create placement policy x " + "FOLLOWERS=2 " + "CONSTRAINTS=\"[+disk=ssd]\" ") + tk.MustExec("create placement policy z " + + "FOLLOWERS=1 " + + "SURVIVAL_PREFERENCES=\"[region, zone]\"") tk.MustExec("create placement policy y " + "FOLLOWERS=3 " + "CONSTRAINTS=\"[+region=bj]\" ") tk.MustExec("create table t(a int)" + "PLACEMENT POLICY=\"x\"") + tk.MustExec("create table tt(a int)" + + "PLACEMENT POLICY=\"z\"") tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TIDB_PLACEMENT_POLICY_NAME FROM information_schema.Tables WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 't'").Check(testkit.Rows(`def test t x`)) tk.MustExec("create table t_range_p(id int) placement policy x partition by range(id) (" + "PARTITION p0 VALUES LESS THAN (100)," + @@ -616,7 +624,18 @@ func TestCreateTableWithPlacementPolicy(t *testing.T) { require.Equal(t, "y", policyY.Name.L) require.Equal(t, true, policyY.ID != 0) - tbl := external.GetTableByName(t, tk, "test", "t") + policyZ := testGetPolicyByName(t, tk.Session(), "z", true) + require.Equal(t, "z", policyZ.Name.L) + require.Equal(t, true, policyZ.ID != 0) + require.Equal(t, "[region, zone]", policyZ.SurvivalPreferences) + + tbl := external.GetTableByName(t, tk, "test", "tt") + require.NotNil(t, tbl) + require.NotNil(t, tbl.Meta().PlacementPolicyRef) + require.Equal(t, "z", tbl.Meta().PlacementPolicyRef.Name.L) + require.Equal(t, policyZ.ID, tbl.Meta().PlacementPolicyRef.ID) + + tbl = external.GetTableByName(t, tk, "test", "t") require.NotNil(t, tbl) require.NotNil(t, tbl.Meta().PlacementPolicyRef) require.Equal(t, "x", tbl.Meta().PlacementPolicyRef.Name.L) diff --git a/ddl/placement_sql_test.go b/ddl/placement_sql_test.go index 5daca69feabec..b9af2af16e19d 100644 --- a/ddl/placement_sql_test.go +++ b/ddl/placement_sql_test.go @@ -588,7 +588,7 @@ func checkTiflashReplicaSet(t *testing.T, do *domain.Domain, db, tb string, cnt return } - CheckPlacementRule(infosync.GetMockTiFlash(), *infosync.MakeNewRule(tbl.Meta().ID, 1, nil)) + infosync.GetMockTiFlash().CheckPlacementRule(*infosync.MakeNewRule(tbl.Meta().ID, 1, nil)) require.NotNil(t, tiflashReplica) require.Equal(t, cnt, tiflashReplica.Count) } diff --git a/ddl/reorg.go b/ddl/reorg.go index 2c7508d24b38f..3bde3fdaa844b 100644 --- a/ddl/reorg.go +++ b/ddl/reorg.go @@ -18,6 +18,7 @@ import ( "encoding/hex" "fmt" "strconv" + "strings" "sync" "sync/atomic" "time" @@ -34,7 +35,6 @@ import ( "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" @@ -48,6 +48,7 @@ import ( "github.com/pingcap/tidb/util/ranger" "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tipb/go-tipb" + atomicutil "go.uber.org/atomic" "go.uber.org/zap" ) @@ -77,6 +78,8 @@ type reorgCtx struct { warnings map[errors.ErrorID]*terror.Error warningsCount map[errors.ErrorID]int64 } + + references atomicutil.Int32 } // nullableKey can store kv.Key. @@ -142,11 +145,9 @@ func (rc *reorgCtx) increaseRowCount(count int64) { atomic.AddInt64(&rc.rowCount, count) } -func (rc *reorgCtx) getRowCountAndKey() (int64, kv.Key, *meta.Element) { +func (rc *reorgCtx) getRowCount() int64 { row := atomic.LoadInt64(&rc.rowCount) - h, _ := (rc.doneKey.Load()).(nullableKey) - element, _ := (rc.element.Load()).(*meta.Element) - return row, h.key, element + return row } // runReorgJob is used as a portal to do the reorganization work. @@ -154,6 +155,7 @@ func (rc *reorgCtx) getRowCountAndKey() (int64, kv.Key, *meta.Element) { // 1: add index // 2: alter column type // 3: clean global index +// 4: reorganize partitions /* ddl goroutine >---------+ ^ | @@ -197,7 +199,7 @@ func (w *worker) runReorgJob(rh *reorgHandler, reorgInfo *reorgInfo, tblInfo *mo } } - rc := w.getReorgCtx(job) + rc := w.getReorgCtx(job.ID) if rc == nil { // This job is cancelling, we should return ErrCancelledDDLJob directly. // Q: Is there any possibility that the job is cancelling and has no reorgCtx? @@ -207,7 +209,7 @@ func (w *worker) runReorgJob(rh *reorgHandler, reorgInfo *reorgInfo, tblInfo *mo if job.IsCancelling() { return dbterror.ErrCancelledDDLJob } - rc = w.newReorgCtx(reorgInfo) + rc = w.newReorgCtx(reorgInfo.Job.ID, reorgInfo.StartKey, reorgInfo.currElement, reorgInfo.Job.GetRowCount()) w.wg.Add(1) go func() { defer w.wg.Done() @@ -230,17 +232,22 @@ func (w *worker) runReorgJob(rh *reorgHandler, reorgInfo *reorgInfo, tblInfo *mo case err := <-rc.doneCh: // Since job is cancelled,we don't care about its partial counts. if rc.isReorgCanceled() || terror.ErrorEqual(err, dbterror.ErrCancelledDDLJob) { - d.removeReorgCtx(job) + d.removeReorgCtx(job.ID) return dbterror.ErrCancelledDDLJob } - rowCount, _, _ := rc.getRowCountAndKey() - logutil.BgLogger().Info("[ddl] run reorg job done", zap.Int64("handled rows", rowCount)) + rowCount := rc.getRowCount() + if err != nil { + logutil.BgLogger().Warn("[ddl] run reorg job done", zap.Int64("handled rows", rowCount), zap.Error(err)) + } else { + logutil.BgLogger().Info("[ddl] run reorg job done", zap.Int64("handled rows", rowCount)) + } + job.SetRowCount(rowCount) // Update a job's warnings. w.mergeWarningsIntoJob(job) - d.removeReorgCtx(job) + d.removeReorgCtx(job.ID) // For other errors, even err is not nil here, we still wait the partial counts to be collected. // since in the next round, the startKey is brand new which is stored by last time. if err != nil { @@ -248,17 +255,13 @@ func (w *worker) runReorgJob(rh *reorgHandler, reorgInfo *reorgInfo, tblInfo *mo } updateBackfillProgress(w, reorgInfo, tblInfo, 0) - if err1 := rh.RemoveDDLReorgHandle(job, reorgInfo.elements); err1 != nil { - logutil.BgLogger().Warn("[ddl] run reorg job done, removeDDLReorgHandle failed", zap.Error(err1)) - return errors.Trace(err1) - } case <-w.ctx.Done(): logutil.BgLogger().Info("[ddl] run reorg job quit") - d.removeReorgCtx(job) + d.removeReorgCtx(job.ID) // We return dbterror.ErrWaitReorgTimeout here too, so that outer loop will break. return dbterror.ErrWaitReorgTimeout case <-time.After(waitTimeout): - rowCount, doneKey, currentElement := rc.getRowCountAndKey() + rowCount := rc.getRowCount() job.SetRowCount(rowCount) updateBackfillProgress(w, reorgInfo, tblInfo, rowCount) @@ -267,18 +270,9 @@ func (w *worker) runReorgJob(rh *reorgHandler, reorgInfo *reorgInfo, tblInfo *mo rc.resetWarnings() - // Update a reorgInfo's handle. - // Since daemon-worker is triggered by timer to store the info half-way. - // you should keep these infos is read-only (like job) / atomic (like doneKey & element) / concurrent safe. - err := rh.UpdateDDLReorgStartHandle(job, currentElement, doneKey) - logutil.BgLogger().Info("[ddl] run reorg job wait timeout", - zap.Duration("waitTime", waitTimeout), - zap.ByteString("elementType", currentElement.TypeKey), - zap.Int64("elementID", currentElement.ID), - zap.Int64("totalAddedRowCount", rowCount), - zap.String("doneKey", tryDecodeToHandleString(doneKey)), - zap.Error(err)) + zap.Duration("wait time", waitTimeout), + zap.Int64("total added row count", rowCount)) // If timeout, we will return, check the owner and retry to wait job done again. return dbterror.ErrWaitReorgTimeout } @@ -286,12 +280,14 @@ func (w *worker) runReorgJob(rh *reorgHandler, reorgInfo *reorgInfo, tblInfo *mo } func (w *worker) mergeWarningsIntoJob(job *model.Job) { - rc := w.getReorgCtx(job) + rc := w.getReorgCtx(job.ID) rc.mu.Lock() - defer rc.mu.Unlock() partWarnings := rc.mu.warnings partWarningsCount := rc.mu.warningsCount - job.SetWarnings(mergeWarningsAndWarningsCount(partWarnings, job.ReorgMeta.Warnings, partWarningsCount, job.ReorgMeta.WarningsCount)) + rc.mu.Unlock() + warnings, warningsCount := job.GetWarnings() + warnings, warningsCount = mergeWarningsAndWarningsCount(partWarnings, warnings, partWarningsCount, warningsCount) + job.SetWarnings(warnings, warningsCount) } func updateBackfillProgress(w *worker, reorgInfo *reorgInfo, tblInfo *model.TableInfo, @@ -310,6 +306,10 @@ func updateBackfillProgress(w *worker, reorgInfo *reorgInfo, tblInfo *model.Tabl if progress > 1 { progress = 1 } + logutil.BgLogger().Debug("[ddl] update progress", + zap.Float64("progress", progress), + zap.Int64("addedRowCount", addedRowCount), + zap.Int64("totalCount", totalCount)) } switch reorgInfo.Type { case model.ActionAddIndex, model.ActionAddPrimaryKey: @@ -322,6 +322,8 @@ func updateBackfillProgress(w *worker, reorgInfo *reorgInfo, tblInfo *model.Tabl metrics.GetBackfillProgressByLabel(label, reorgInfo.SchemaName, tblInfo.Name.String()).Set(progress * 100) case model.ActionModifyColumn: metrics.GetBackfillProgressByLabel(metrics.LblModifyColumn, reorgInfo.SchemaName, tblInfo.Name.String()).Set(progress * 100) + case model.ActionReorganizePartition: + metrics.GetBackfillProgressByLabel(metrics.LblReorgPartition, reorgInfo.SchemaName, tblInfo.Name.String()).Set(progress * 100) } } @@ -338,8 +340,20 @@ func getTableTotalCount(w *worker, tblInfo *model.TableInfo) int64 { if !ok { return statistics.PseudoRowCount } - sql := "select table_rows from information_schema.tables where tidb_table_id=%?;" - rows, _, err := executor.ExecRestrictedSQL(w.ctx, nil, sql, tblInfo.ID) + var rows []chunk.Row + if tblInfo.Partition != nil && len(tblInfo.Partition.DroppingDefinitions) > 0 { + // if Reorganize Partition, only select number of rows from the selected partitions! + defs := tblInfo.Partition.DroppingDefinitions + partIDs := make([]string, 0, len(defs)) + for _, def := range defs { + partIDs = append(partIDs, strconv.FormatInt(def.ID, 10)) + } + sql := "select sum(table_rows) from information_schema.partitions where tidb_partition_id in (%?);" + rows, _, err = executor.ExecRestrictedSQL(w.ctx, nil, sql, strings.Join(partIDs, ",")) + } else { + sql := "select table_rows from information_schema.tables where tidb_table_id=%?;" + rows, _, err = executor.ExecRestrictedSQL(w.ctx, nil, sql, tblInfo.ID) + } if err != nil { return statistics.PseudoRowCount } @@ -349,17 +363,21 @@ func getTableTotalCount(w *worker, tblInfo *model.TableInfo) int64 { return rows[0].GetInt64(0) } -func (dc *ddlCtx) isReorgRunnable(job *model.Job) error { +func (dc *ddlCtx) isReorgRunnable(jobID int64, isDistReorg bool) error { if isChanClosed(dc.ctx.Done()) { // Worker is closed. So it can't do the reorganization. return dbterror.ErrInvalidWorker.GenWithStack("worker is closed") } - if dc.getReorgCtx(job).isReorgCanceled() { + if dc.getReorgCtx(jobID).isReorgCanceled() { // Job is cancelled. So it can't be done. return dbterror.ErrCancelledDDLJob } + // If isDistReorg is true, we needn't check if it is owner. + if isDistReorg { + return nil + } if !dc.isOwner() { // If it's not the owner, we will try later, so here just returns an error. logutil.BgLogger().Info("[ddl] DDL is not the DDL owner", zap.String("ID", dc.uuid)) @@ -381,6 +399,7 @@ type reorgInfo struct { // PhysicalTableID is used to trace the current partition we are handling. // If the table is not partitioned, PhysicalTableID would be TableID. PhysicalTableID int64 + dbInfo *model.DBInfo elements []*meta.Element currElement *meta.Element } @@ -559,10 +578,12 @@ func getTableRange(ctx *JobContext, d *ddlCtx, tbl table.PhysicalTable, snapshot endHandleKey = tablecodec.EncodeRecordKey(tbl.RecordPrefix(), maxHandle) } if isEmptyTable || endHandleKey.Cmp(startHandleKey) < 0 { - logutil.BgLogger().Info("[ddl] get table range, endHandle < startHandle", zap.String("table", fmt.Sprintf("%v", tbl.Meta())), + logutil.BgLogger().Info("[ddl] get noop table range", + zap.String("table", fmt.Sprintf("%v", tbl.Meta())), zap.Int64("table/partition ID", tbl.GetPhysicalID()), - zap.String("endHandle", tryDecodeToHandleString(endHandleKey)), - zap.String("startHandle", tryDecodeToHandleString(startHandleKey))) + zap.String("start key", hex.EncodeToString(startHandleKey)), + zap.String("end key", hex.EncodeToString(endHandleKey)), + zap.Bool("is empty table", isEmptyTable)) endHandleKey = startHandleKey } return @@ -578,7 +599,7 @@ func getValidCurrentVersion(store kv.Storage) (ver kv.Version, err error) { return ver, nil } -func getReorgInfo(ctx *JobContext, d *ddlCtx, rh *reorgHandler, job *model.Job, +func getReorgInfo(ctx *JobContext, d *ddlCtx, rh *reorgHandler, job *model.Job, dbInfo *model.DBInfo, tbl table.Table, elements []*meta.Element, mergingTmpIdx bool) (*reorgInfo, error) { var ( element *meta.Element @@ -634,10 +655,6 @@ func getReorgInfo(ctx *JobContext, d *ddlCtx, rh *reorgHandler, job *model.Job, failpoint.Inject("errorUpdateReorgHandle", func() (*reorgInfo, error) { return &info, errors.New("occur an error when update reorg handle") }) - err = rh.RemoveDDLReorgHandle(job, elements) - if err != nil { - return &info, errors.Trace(err) - } err = rh.InitDDLReorgHandle(job, start, end, pid, elements[0]) if err != nil { return &info, errors.Trace(err) @@ -665,7 +682,7 @@ func getReorgInfo(ctx *JobContext, d *ddlCtx, rh *reorgHandler, job *model.Job, // We'll try to remove it in the next major TiDB version. if meta.ErrDDLReorgElementNotExist.Equal(err) { job.SnapshotVer = 0 - logutil.BgLogger().Warn("[ddl] get reorg info, the element does not exist", zap.String("job", job.String()), zap.Bool("enableConcurrentDDL", rh.enableConcurrentDDL)) + logutil.BgLogger().Warn("[ddl] get reorg info, the element does not exist", zap.String("job", job.String())) } return &info, errors.Trace(err) } @@ -678,11 +695,12 @@ func getReorgInfo(ctx *JobContext, d *ddlCtx, rh *reorgHandler, job *model.Job, info.currElement = element info.elements = elements info.mergingTmpIdx = mergingTmpIdx + info.dbInfo = dbInfo return &info, nil } -func getReorgInfoFromPartitions(ctx *JobContext, d *ddlCtx, rh *reorgHandler, job *model.Job, tbl table.Table, partitionIDs []int64, elements []*meta.Element) (*reorgInfo, error) { +func getReorgInfoFromPartitions(ctx *JobContext, d *ddlCtx, rh *reorgHandler, job *model.Job, dbInfo *model.DBInfo, tbl table.PartitionedTable, partitionIDs []int64, elements []*meta.Element) (*reorgInfo, error) { var ( element *meta.Element start kv.Key @@ -700,15 +718,16 @@ func getReorgInfoFromPartitions(ctx *JobContext, d *ddlCtx, rh *reorgHandler, jo return nil, errors.Trace(err) } pid = partitionIDs[0] - tb := tbl.(table.PartitionedTable).GetPartition(pid) - start, end, err = getTableRange(ctx, d, tb, ver.Ver, job.Priority) + physTbl := tbl.GetPartition(pid) + + start, end, err = getTableRange(ctx, d, physTbl, ver.Ver, job.Priority) if err != nil { return nil, errors.Trace(err) } logutil.BgLogger().Info("[ddl] job get table range", - zap.Int64("jobID", job.ID), zap.Int64("physicalTableID", pid), - zap.String("startHandle", tryDecodeToHandleString(start)), - zap.String("endHandle", tryDecodeToHandleString(end))) + zap.Int64("job ID", job.ID), zap.Int64("physical table ID", pid), + zap.String("start key", hex.EncodeToString(start)), + zap.String("end key", hex.EncodeToString(end))) err = rh.InitDDLReorgHandle(job, start, end, pid, elements[0]) if err != nil { @@ -738,32 +757,30 @@ func getReorgInfoFromPartitions(ctx *JobContext, d *ddlCtx, rh *reorgHandler, jo info.PhysicalTableID = pid info.currElement = element info.elements = elements + info.dbInfo = dbInfo return &info, nil } +// UpdateReorgMeta creates a new transaction and updates tidb_ddl_reorg table, +// so the reorg can restart in case of issues. func (r *reorgInfo) UpdateReorgMeta(startKey kv.Key, pool *sessionPool) (err error) { if startKey == nil && r.EndKey == nil { return nil } - se, err := pool.get() + sctx, err := pool.get() if err != nil { return } - defer pool.put(se) + defer pool.put(sctx) - sess := newSession(se) + sess := newSession(sctx) err = sess.begin() if err != nil { return } - txn, err := sess.txn() - if err != nil { - sess.rollback() - return err - } - rh := newReorgHandler(meta.NewMeta(txn), sess, variable.EnableConcurrentDDL.Load()) - err = rh.UpdateDDLReorgHandle(r.Job, startKey, r.EndKey, r.PhysicalTableID, r.currElement) + rh := newReorgHandler(sess) + err = updateDDLReorgHandle(rh.s, r.Job.ID, startKey, r.EndKey, r.PhysicalTableID, r.currElement) err1 := sess.commit() if err == nil { err = err1 @@ -773,65 +790,48 @@ func (r *reorgInfo) UpdateReorgMeta(startKey kv.Key, pool *sessionPool) (err err // reorgHandler is used to handle the reorg information duration reorganization DDL job. type reorgHandler struct { - m *meta.Meta s *session - - enableConcurrentDDL bool } // NewReorgHandlerForTest creates a new reorgHandler, only used in test. -func NewReorgHandlerForTest(t *meta.Meta, sess sessionctx.Context) *reorgHandler { - return newReorgHandler(t, newSession(sess), variable.EnableConcurrentDDL.Load()) -} - -func newReorgHandler(t *meta.Meta, sess *session, enableConcurrentDDL bool) *reorgHandler { - return &reorgHandler{m: t, s: sess, enableConcurrentDDL: enableConcurrentDDL} +func NewReorgHandlerForTest(sess sessionctx.Context) *reorgHandler { + return newReorgHandler(newSession(sess)) } -// UpdateDDLReorgStartHandle saves the job reorganization latest processed element and start handle for later resuming. -func (r *reorgHandler) UpdateDDLReorgStartHandle(job *model.Job, element *meta.Element, startKey kv.Key) error { - if r.enableConcurrentDDL { - return updateDDLReorgStartHandle(r.s, job, element, startKey) - } - return r.m.UpdateDDLReorgStartHandle(job, element, startKey) -} - -// UpdateDDLReorgHandle saves the job reorganization latest processed information for later resuming. -func (r *reorgHandler) UpdateDDLReorgHandle(job *model.Job, startKey, endKey kv.Key, physicalTableID int64, element *meta.Element) error { - if r.enableConcurrentDDL { - return updateDDLReorgHandle(r.s, job.ID, startKey, endKey, physicalTableID, element) - } - return r.m.UpdateDDLReorgHandle(job.ID, startKey, endKey, physicalTableID, element) +func newReorgHandler(sess *session) *reorgHandler { + return &reorgHandler{s: sess} } // InitDDLReorgHandle initializes the job reorganization information. func (r *reorgHandler) InitDDLReorgHandle(job *model.Job, startKey, endKey kv.Key, physicalTableID int64, element *meta.Element) error { - if r.enableConcurrentDDL { - return initDDLReorgHandle(r.s, job.ID, startKey, endKey, physicalTableID, element) - } - return r.m.UpdateDDLReorgHandle(job.ID, startKey, endKey, physicalTableID, element) + return initDDLReorgHandle(r.s, job.ID, startKey, endKey, physicalTableID, element) } // RemoveReorgElementFailPoint removes the element of the reorganization information. func (r *reorgHandler) RemoveReorgElementFailPoint(job *model.Job) error { - if r.enableConcurrentDDL { - return removeReorgElement(r.s, job) - } - return r.m.RemoveReorgElement(job) + return removeReorgElement(r.s, job) } // RemoveDDLReorgHandle removes the job reorganization related handles. func (r *reorgHandler) RemoveDDLReorgHandle(job *model.Job, elements []*meta.Element) error { - if r.enableConcurrentDDL { - return removeDDLReorgHandle(r.s, job, elements) + return removeDDLReorgHandle(r.s, job, elements) +} + +// CleanupDDLReorgHandles removes the job reorganization related handles. +func CleanupDDLReorgHandles(job *model.Job, s *session) { + if job != nil && !job.IsFinished() && !job.IsSynced() { + // Job is given, but it is neither finished nor synced; do nothing + return + } + + err := cleanDDLReorgHandles(s, job) + if err != nil { + // ignore error, cleanup is not that critical + logutil.BgLogger().Warn("Failed removing the DDL reorg entry in tidb_ddl_reorg", zap.String("job", job.String()), zap.Error(err)) } - return r.m.RemoveDDLReorgHandle(job, elements) } // GetDDLReorgHandle gets the latest processed DDL reorganize position. func (r *reorgHandler) GetDDLReorgHandle(job *model.Job) (element *meta.Element, startKey, endKey kv.Key, physicalTableID int64, err error) { - if r.enableConcurrentDDL { - return getDDLReorgHandle(r.s, job) - } - return r.m.GetDDLReorgHandle(job) + return getDDLReorgHandle(r.s, job) } diff --git a/ddl/reorg_partition_test.go b/ddl/reorg_partition_test.go new file mode 100644 index 0000000000000..fb0ae51f29b25 --- /dev/null +++ b/ddl/reorg_partition_test.go @@ -0,0 +1,822 @@ +// Copyright 2023 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 ddl_test + +import ( + "bytes" + "context" + "encoding/hex" + "fmt" + "testing" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/ddl/internal/callback" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessiontxn" + "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/mathutil" + "github.com/stretchr/testify/require" + "go.uber.org/zap" +) + +type allTableData struct { + keys [][]byte + vals [][]byte + tp []string +} + +// TODO: Create a more generic function that gets all accessible table ids +// from all schemas, and checks the full key space so that there are no +// keys for non-existing table IDs. Also figure out how to wait for deleteRange +// Checks that there are no accessible data after an existing table +// assumes that tableIDs are only increasing. +// To be used during failure testing of ALTER, to make sure cleanup is done. +func noNewTablesAfter(t *testing.T, tk *testkit.TestKit, ctx sessionctx.Context, tbl table.Table) { + waitForGC := tk.MustQuery(`select start_key, end_key from mysql.gc_delete_range`).Rows() + require.NoError(t, sessiontxn.NewTxn(context.Background(), ctx)) + txn, err := ctx.Txn(true) + require.NoError(t, err) + defer func() { + err := txn.Rollback() + require.NoError(t, err) + }() + // Get max tableID (if partitioned) + tblID := tbl.Meta().ID + if pt := tbl.GetPartitionedTable(); pt != nil { + defs := pt.Meta().Partition.Definitions + { + for i := range defs { + tblID = mathutil.Max[int64](tblID, defs[i].ID) + } + } + } + prefix := tablecodec.EncodeTablePrefix(tblID + 1) + it, err := txn.Iter(prefix, nil) + require.NoError(t, err) +ROW: + for it.Valid() { + for _, rowGC := range waitForGC { + // OK if queued for range delete / GC + hexString := fmt.Sprintf("%v", rowGC[0]) + start, err := hex.DecodeString(hexString) + require.NoError(t, err) + hexString = fmt.Sprintf("%v", rowGC[1]) + end, err := hex.DecodeString(hexString) + require.NoError(t, err) + if bytes.Compare(start, it.Key()) >= 0 && bytes.Compare(it.Key(), end) < 0 { + it.Close() + it, err = txn.Iter(end, nil) + require.NoError(t, err) + continue ROW + } + } + foundTblID := tablecodec.DecodeTableID(it.Key()) + // There are internal table ids starting from MaxInt48 -1 and allocating decreasing ids + // Allow 0xFF of them, See JobTableID, ReorgTableID, HistoryTableID, MDLTableID + require.False(t, it.Key()[0] == 't' && foundTblID < 0xFFFFFFFFFF00, "Found table data after highest physical Table ID %d < %d", tblID, foundTblID) + break + } +} + +func getAllDataForPhysicalTable(t *testing.T, ctx sessionctx.Context, physTable table.PhysicalTable) allTableData { + require.NoError(t, sessiontxn.NewTxn(context.Background(), ctx)) + txn, err := ctx.Txn(true) + require.NoError(t, err) + defer func() { + err := txn.Rollback() + require.NoError(t, err) + }() + + all := allTableData{ + keys: make([][]byte, 0), + vals: make([][]byte, 0), + tp: make([]string, 0), + } + pid := physTable.GetPhysicalID() + prefix := tablecodec.EncodeTablePrefix(pid) + it, err := txn.Iter(prefix, nil) + require.NoError(t, err) + for it.Valid() { + if !it.Key().HasPrefix(prefix) { + break + } + all.keys = append(all.keys, it.Key()) + all.vals = append(all.vals, it.Value()) + if tablecodec.IsRecordKey(it.Key()) { + all.tp = append(all.tp, "Record") + tblID, kv, _ := tablecodec.DecodeRecordKey(it.Key()) + require.Equal(t, pid, tblID) + vals, _ := tablecodec.DecodeValuesBytesToStrings(it.Value()) + logutil.BgLogger().Info("Record", + zap.Int64("pid", tblID), + zap.Stringer("key", kv), + zap.Strings("values", vals)) + } else if tablecodec.IsIndexKey(it.Key()) { + all.tp = append(all.tp, "Index") + } else { + all.tp = append(all.tp, "Other") + } + err = it.Next() + require.NoError(t, err) + } + return all +} + +func TestReorganizeRangePartition(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("create database ReorgPartition") + tk.MustExec("use ReorgPartition") + tk.MustExec(`create table t (a int unsigned PRIMARY KEY, b varchar(255), c int, key (b), key (c,b)) partition by range (a) ` + + `(partition p0 values less than (10),` + + ` partition p1 values less than (20),` + + ` partition pMax values less than (MAXVALUE))`) + tk.MustExec(`insert into t values (1,"1",1), (12,"12",21),(23,"23",32),(34,"34",43),(45,"45",54),(56,"56",65)`) + tk.MustQuery(`select * from t where c < 40`).Sort().Check(testkit.Rows(""+ + "1 1 1", + "12 12 21", + "23 23 32")) + tk.MustExec(`alter table t reorganize partition pMax into (partition p2 values less than (30), partition pMax values less than (MAXVALUE))`) + tk.MustExec(`admin check table t`) + tk.MustQuery(`show create table t`).Check(testkit.Rows("" + + "t CREATE TABLE `t` (\n" + + " `a` int(10) unsigned NOT NULL,\n" + + " `b` varchar(255) DEFAULT NULL,\n" + + " `c` int(11) DEFAULT NULL,\n" + + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */,\n" + + " KEY `b` (`b`),\n" + + " KEY `c` (`c`,`b`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY RANGE (`a`)\n" + + "(PARTITION `p0` VALUES LESS THAN (10),\n" + + " PARTITION `p1` VALUES LESS THAN (20),\n" + + " PARTITION `p2` VALUES LESS THAN (30),\n" + + " PARTITION `pMax` VALUES LESS THAN (MAXVALUE))")) + tk.MustQuery(`select * from t`).Sort().Check(testkit.Rows(""+ + "1 1 1", + "12 12 21", + "23 23 32", + "34 34 43", + "45 45 54", + "56 56 65")) + tk.MustQuery(`select * from t partition (p0)`).Sort().Check(testkit.Rows("" + + "1 1 1")) + tk.MustQuery(`select * from t partition (p1)`).Sort().Check(testkit.Rows("" + + "12 12 21")) + tk.MustQuery(`select * from t partition (p2)`).Sort().Check(testkit.Rows("" + + "23 23 32")) + tk.MustQuery(`select * from t partition (pMax)`).Sort().Check(testkit.Rows(""+ + "34 34 43", + "45 45 54", + "56 56 65")) + tk.MustQuery(`select * from t where b > "1"`).Sort().Check(testkit.Rows(""+ + "12 12 21", + "23 23 32", + "34 34 43", + "45 45 54", + "56 56 65")) + tk.MustQuery(`select * from t where c < 40`).Sort().Check(testkit.Rows(""+ + "1 1 1", + "12 12 21", + "23 23 32")) + tk.MustExec(`alter table t reorganize partition p2,pMax into (partition p2 values less than (35),partition p3 values less than (47), partition pMax values less than (MAXVALUE))`) + tk.MustExec(`admin check table t`) + tk.MustQuery(`select * from t`).Sort().Check(testkit.Rows(""+ + "1 1 1", + "12 12 21", + "23 23 32", + "34 34 43", + "45 45 54", + "56 56 65")) + tk.MustQuery(`show create table t`).Check(testkit.Rows("" + + "t CREATE TABLE `t` (\n" + + " `a` int(10) unsigned NOT NULL,\n" + + " `b` varchar(255) DEFAULT NULL,\n" + + " `c` int(11) DEFAULT NULL,\n" + + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */,\n" + + " KEY `b` (`b`),\n" + + " KEY `c` (`c`,`b`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY RANGE (`a`)\n" + + "(PARTITION `p0` VALUES LESS THAN (10),\n" + + " PARTITION `p1` VALUES LESS THAN (20),\n" + + " PARTITION `p2` VALUES LESS THAN (35),\n" + + " PARTITION `p3` VALUES LESS THAN (47),\n" + + " PARTITION `pMax` VALUES LESS THAN (MAXVALUE))")) + tk.MustQuery(`select * from t partition (p0)`).Sort().Check(testkit.Rows("" + + "1 1 1")) + tk.MustQuery(`select * from t partition (p1)`).Sort().Check(testkit.Rows("" + + "12 12 21")) + tk.MustQuery(`select * from t partition (p2)`).Sort().Check(testkit.Rows(""+ + "23 23 32", + "34 34 43")) + tk.MustQuery(`select * from t partition (p3)`).Sort().Check(testkit.Rows("" + + "45 45 54")) + tk.MustQuery(`select * from t partition (pMax)`).Sort().Check(testkit.Rows("" + + "56 56 65")) + tk.MustExec(`alter table t reorganize partition p0,p1 into (partition p1 values less than (20))`) + tk.MustExec(`admin check table t`) + tk.MustQuery(`show create table t`).Check(testkit.Rows("" + + "t CREATE TABLE `t` (\n" + + " `a` int(10) unsigned NOT NULL,\n" + + " `b` varchar(255) DEFAULT NULL,\n" + + " `c` int(11) DEFAULT NULL,\n" + + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */,\n" + + " KEY `b` (`b`),\n" + + " KEY `c` (`c`,`b`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY RANGE (`a`)\n" + + "(PARTITION `p1` VALUES LESS THAN (20),\n" + + " PARTITION `p2` VALUES LESS THAN (35),\n" + + " PARTITION `p3` VALUES LESS THAN (47),\n" + + " PARTITION `pMax` VALUES LESS THAN (MAXVALUE))")) + tk.MustQuery(`select * from t`).Sort().Check(testkit.Rows(""+ + "1 1 1", + "12 12 21", + "23 23 32", + "34 34 43", + "45 45 54", + "56 56 65")) + tk.MustExec(`alter table t drop index b`) + tk.MustExec(`alter table t drop index c`) + tk.MustExec(`admin check table t`) + tk.MustQuery(`show create table t`).Check(testkit.Rows("" + + "t CREATE TABLE `t` (\n" + + " `a` int(10) unsigned NOT NULL,\n" + + " `b` varchar(255) DEFAULT NULL,\n" + + " `c` int(11) DEFAULT NULL,\n" + + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY RANGE (`a`)\n" + + "(PARTITION `p1` VALUES LESS THAN (20),\n" + + " PARTITION `p2` VALUES LESS THAN (35),\n" + + " PARTITION `p3` VALUES LESS THAN (47),\n" + + " PARTITION `pMax` VALUES LESS THAN (MAXVALUE))")) + tk.MustExec(`create table t2 (a int unsigned not null, b varchar(255), c int, key (b), key (c,b)) partition by range (a) ` + + "(PARTITION `p1` VALUES LESS THAN (20),\n" + + " PARTITION `p2` VALUES LESS THAN (35),\n" + + " PARTITION `p3` VALUES LESS THAN (47),\n" + + " PARTITION `pMax` VALUES LESS THAN (MAXVALUE))") + tk.MustExec(`insert into t2 select * from t`) + // Not allowed to change the start range! + tk.MustGetErrCode(`alter table t2 reorganize partition p2 into (partition p2a values less than (20), partition p2b values less than (36))`, + errno.ErrRangeNotIncreasing) + // Not allowed to change the end range! + tk.MustGetErrCode(`alter table t2 reorganize partition p2 into (partition p2a values less than (30), partition p2b values less than (36))`, errno.ErrRangeNotIncreasing) + tk.MustGetErrCode(`alter table t2 reorganize partition p2 into (partition p2a values less than (30), partition p2b values less than (34))`, errno.ErrRangeNotIncreasing) + // Also not allowed to change from MAXVALUE to something else IF there are values in the removed range! + tk.MustContainErrMsg(`alter table t2 reorganize partition pMax into (partition p2b values less than (50))`, "[table:1526]Table has no partition for value 56") + tk.MustQuery(`show create table t2`).Check(testkit.Rows("" + + "t2 CREATE TABLE `t2` (\n" + + " `a` int(10) unsigned NOT NULL,\n" + + " `b` varchar(255) DEFAULT NULL,\n" + + " `c` int(11) DEFAULT NULL,\n" + + " KEY `b` (`b`),\n" + + " KEY `c` (`c`,`b`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY RANGE (`a`)\n" + + "(PARTITION `p1` VALUES LESS THAN (20),\n" + + " PARTITION `p2` VALUES LESS THAN (35),\n" + + " PARTITION `p3` VALUES LESS THAN (47),\n" + + " PARTITION `pMax` VALUES LESS THAN (MAXVALUE))")) + // But allowed to change from MAXVALUE if no existing values is outside the new range! + tk.MustExec(`alter table t2 reorganize partition pMax into (partition p4 values less than (90))`) + tk.MustExec(`admin check table t2`) + tk.MustQuery(`show create table t2`).Check(testkit.Rows("" + + "t2 CREATE TABLE `t2` (\n" + + " `a` int(10) unsigned NOT NULL,\n" + + " `b` varchar(255) DEFAULT NULL,\n" + + " `c` int(11) DEFAULT NULL,\n" + + " KEY `b` (`b`),\n" + + " KEY `c` (`c`,`b`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY RANGE (`a`)\n" + + "(PARTITION `p1` VALUES LESS THAN (20),\n" + + " PARTITION `p2` VALUES LESS THAN (35),\n" + + " PARTITION `p3` VALUES LESS THAN (47),\n" + + " PARTITION `p4` VALUES LESS THAN (90))")) +} + +func TestReorganizeListPartition(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("create database ReorgListPartition") + tk.MustExec("use ReorgListPartition") + tk.MustExec(`create table t (a int, b varchar(55), c int) partition by list (a)` + + ` (partition p1 values in (12,23,51,14), partition p2 values in (24,63), partition p3 values in (45))`) + tk.MustExec(`insert into t values (12,"12",21), (24,"24",42),(51,"51",15),(23,"23",32),(63,"63",36),(45,"45",54)`) + tk.MustExec(`alter table t reorganize partition p1 into (partition p0 values in (12,51,13), partition p1 values in (23))`) + tk.MustExec(`admin check table t`) + tk.MustQuery(`show create table t`).Check(testkit.Rows("" + + "t CREATE TABLE `t` (\n" + + " `a` int(11) DEFAULT NULL,\n" + + " `b` varchar(55) DEFAULT NULL,\n" + + " `c` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY LIST (`a`)\n" + + "(PARTITION `p0` VALUES IN (12,51,13),\n" + + " PARTITION `p1` VALUES IN (23),\n" + + " PARTITION `p2` VALUES IN (24,63),\n" + + " PARTITION `p3` VALUES IN (45))")) + tk.MustExec(`alter table t add primary key (a), add key (b), add key (c,b)`) + + // Note: MySQL cannot reorganize two non-consecutive list partitions :) + // ERROR 1519 (HY000): When reorganizing a set of partitions they must be in consecutive order + // https://bugs.mysql.com/bug.php?id=106011 + // https://bugs.mysql.com/bug.php?id=109939 + tk.MustExec(`alter table t reorganize partition p1, p3 into (partition pa values in (45,23,15))`) + tk.MustExec(`admin check table t`) + tk.MustQuery(`show create table t`).Check(testkit.Rows("" + + "t CREATE TABLE `t` (\n" + + " `a` int(11) NOT NULL,\n" + + " `b` varchar(55) DEFAULT NULL,\n" + + " `c` int(11) DEFAULT NULL,\n" + + " PRIMARY KEY (`a`) /*T![clustered_index] NONCLUSTERED */,\n" + + " KEY `b` (`b`),\n" + + " KEY `c` (`c`,`b`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY LIST (`a`)\n" + + "(PARTITION `p0` VALUES IN (12,51,13),\n" + + " PARTITION `pa` VALUES IN (45,23,15),\n" + + " PARTITION `p2` VALUES IN (24,63))")) + tk.MustGetErrCode(`alter table t modify a varchar(20)`, errno.ErrUnsupportedDDLOperation) +} + +type TestReorgDDLCallback struct { + *callback.TestDDLCallback + syncChan chan bool +} + +func (tc *TestReorgDDLCallback) OnChanged(err error) error { + err = tc.TestDDLCallback.OnChanged(err) + <-tc.syncChan + // We want to wait here + <-tc.syncChan + return err +} + +func TestReorgPartitionConcurrent(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + schemaName := "ReorgPartConcurrent" + tk.MustExec("create database " + schemaName) + tk.MustExec("use " + schemaName) + tk.MustExec(`create table t (a int unsigned PRIMARY KEY, b varchar(255), c int, key (b), key (c,b))` + + ` partition by range (a) ` + + `(partition p0 values less than (10),` + + ` partition p1 values less than (20),` + + ` partition pMax values less than (MAXVALUE))`) + tk.MustExec(`insert into t values (1,"1",1), (10,"10",10),(23,"23",32),(34,"34",43),(45,"45",54),(56,"56",65)`) + dom := domain.GetDomain(tk.Session()) + originHook := dom.DDL().GetHook() + defer dom.DDL().SetHook(originHook) + syncOnChanged := make(chan bool) + defer close(syncOnChanged) + hook := &TestReorgDDLCallback{TestDDLCallback: &callback.TestDDLCallback{Do: dom}, syncChan: syncOnChanged} + dom.DDL().SetHook(hook) + + wait := make(chan bool) + defer close(wait) + + currState := model.StateNone + hook.OnJobRunBeforeExported = func(job *model.Job) { + if job.Type == model.ActionReorganizePartition && + (job.SchemaState == model.StateDeleteOnly || + job.SchemaState == model.StateWriteOnly || + job.SchemaState == model.StateWriteReorganization || + job.SchemaState == model.StateDeleteReorganization) && + currState != job.SchemaState { + currState = job.SchemaState + <-wait + <-wait + } + } + alterErr := make(chan error, 1) + go backgroundExec(store, schemaName, "alter table t reorganize partition p1 into (partition p1a values less than (15), partition p1b values less than (20))", alterErr) + + wait <- true + // StateDeleteOnly + deleteOnlyInfoSchema := sessiontxn.GetTxnManager(tk.Session()).GetTxnInfoSchema() + wait <- true + + // StateWriteOnly + wait <- true + tk.MustExec(`insert into t values (11, "11", 11),(12,"12",21)`) + tk.MustExec(`admin check table t`) + writeOnlyInfoSchema := sessiontxn.GetTxnManager(tk.Session()).GetTxnInfoSchema() + require.Equal(t, int64(1), writeOnlyInfoSchema.SchemaMetaVersion()-deleteOnlyInfoSchema.SchemaMetaVersion()) + deleteOnlyTbl, err := deleteOnlyInfoSchema.TableByName(model.NewCIStr(schemaName), model.NewCIStr("t")) + require.NoError(t, err) + writeOnlyTbl, err := writeOnlyInfoSchema.TableByName(model.NewCIStr(schemaName), model.NewCIStr("t")) + require.NoError(t, err) + writeOnlyParts := writeOnlyTbl.Meta().Partition + writeOnlyTbl.Meta().Partition = deleteOnlyTbl.Meta().Partition + // If not DeleteOnly is working, then this would show up when reorg is done + tk.MustExec(`delete from t where a = 11`) + tk.MustExec(`update t set b = "12b", c = 12 where a = 12`) + tk.MustExec(`admin check table t`) + writeOnlyTbl.Meta().Partition = writeOnlyParts + tk.MustExec(`admin check table t`) + wait <- true + + // StateWriteReorganization + wait <- true + tk.MustExec(`insert into t values (14, "14", 14),(15, "15",15)`) + writeReorgInfoSchema := sessiontxn.GetTxnManager(tk.Session()).GetTxnInfoSchema() + tk.MustQuery(`show create table t`).Check(testkit.Rows("" + + "t CREATE TABLE `t` (\n" + + " `a` int(10) unsigned NOT NULL,\n" + + " `b` varchar(255) DEFAULT NULL,\n" + + " `c` int(11) DEFAULT NULL,\n" + + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */,\n" + + " KEY `b` (`b`),\n" + + " KEY `c` (`c`,`b`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY RANGE (`a`)\n" + + "(PARTITION `p0` VALUES LESS THAN (10),\n" + + " PARTITION `p1` VALUES LESS THAN (20),\n" + + " PARTITION `pMax` VALUES LESS THAN (MAXVALUE))")) + wait <- true + + // StateDeleteReorganization + wait <- true + tk.MustQuery(`select * from t where c between 10 and 22`).Sort().Check(testkit.Rows(""+ + "10 10 10", + "12 12b 12", + "14 14 14", + "15 15 15")) + deleteReorgInfoSchema := sessiontxn.GetTxnManager(tk.Session()).GetTxnInfoSchema() + require.Equal(t, int64(1), deleteReorgInfoSchema.SchemaMetaVersion()-writeReorgInfoSchema.SchemaMetaVersion()) + tk.MustExec(`insert into t values (16, "16", 16)`) + oldTbl, err := writeReorgInfoSchema.TableByName(model.NewCIStr(schemaName), model.NewCIStr("t")) + require.NoError(t, err) + partDef := oldTbl.Meta().Partition.Definitions[1] + require.Equal(t, "p1", partDef.Name.O) + rows := getNumRowsFromPartitionDefs(t, tk, oldTbl, oldTbl.Meta().Partition.Definitions[1:2]) + require.Equal(t, 5, rows) + currTbl, err := deleteReorgInfoSchema.TableByName(model.NewCIStr(schemaName), model.NewCIStr("t")) + require.NoError(t, err) + currPart := currTbl.Meta().Partition + currTbl.Meta().Partition = oldTbl.Meta().Partition + tk.MustQuery(`select * from t where b = "16"`).Sort().Check(testkit.Rows("16 16 16")) + tk.MustExec(`admin check table t`) + tk.MustQuery(`show create table t`).Check(testkit.Rows("" + + "t CREATE TABLE `t` (\n" + + " `a` int(10) unsigned NOT NULL,\n" + + " `b` varchar(255) DEFAULT NULL,\n" + + " `c` int(11) DEFAULT NULL,\n" + + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */,\n" + + " KEY `b` (`b`),\n" + + " KEY `c` (`c`,`b`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY RANGE (`a`)\n" + + "(PARTITION `p0` VALUES LESS THAN (10),\n" + + " PARTITION `p1` VALUES LESS THAN (20),\n" + + " PARTITION `pMax` VALUES LESS THAN (MAXVALUE))")) + tk.MustQuery(`select * from t partition (p1)`).Sort().Check(testkit.Rows(""+ + "10 10 10", + "12 12b 12", + "14 14 14", + "15 15 15", + "16 16 16")) + currTbl.Meta().Partition = currPart + wait <- true + syncOnChanged <- true + // This reads the new schema (Schema update completed) + tk.MustQuery(`select * from t where c between 10 and 22`).Sort().Check(testkit.Rows(""+ + "10 10 10", + "12 12b 12", + "14 14 14", + "15 15 15", + "16 16 16")) + tk.MustExec(`admin check table t`) + newInfoSchema := sessiontxn.GetTxnManager(tk.Session()).GetTxnInfoSchema() + require.Equal(t, int64(1), newInfoSchema.SchemaMetaVersion()-deleteReorgInfoSchema.SchemaMetaVersion()) + oldTbl, err = deleteReorgInfoSchema.TableByName(model.NewCIStr(schemaName), model.NewCIStr("t")) + require.NoError(t, err) + partDef = oldTbl.Meta().Partition.Definitions[1] + require.Equal(t, "p1a", partDef.Name.O) + tk.MustQuery(`show create table t`).Check(testkit.Rows("" + + "t CREATE TABLE `t` (\n" + + " `a` int(10) unsigned NOT NULL,\n" + + " `b` varchar(255) DEFAULT NULL,\n" + + " `c` int(11) DEFAULT NULL,\n" + + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */,\n" + + " KEY `b` (`b`),\n" + + " KEY `c` (`c`,`b`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY RANGE (`a`)\n" + + "(PARTITION `p0` VALUES LESS THAN (10),\n" + + " PARTITION `p1a` VALUES LESS THAN (15),\n" + + " PARTITION `p1b` VALUES LESS THAN (20),\n" + + " PARTITION `pMax` VALUES LESS THAN (MAXVALUE))")) + newTbl, err := deleteReorgInfoSchema.TableByName(model.NewCIStr(schemaName), model.NewCIStr("t")) + require.NoError(t, err) + newPart := newTbl.Meta().Partition + newTbl.Meta().Partition = oldTbl.Meta().Partition + tk.MustQuery(`show create table t`).Check(testkit.Rows("" + + "t CREATE TABLE `t` (\n" + + " `a` int(10) unsigned NOT NULL,\n" + + " `b` varchar(255) DEFAULT NULL,\n" + + " `c` int(11) DEFAULT NULL,\n" + + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */,\n" + + " KEY `b` (`b`),\n" + + " KEY `c` (`c`,`b`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY RANGE (`a`)\n" + + "(PARTITION `p0` VALUES LESS THAN (10),\n" + + " PARTITION `p1a` VALUES LESS THAN (15),\n" + + " PARTITION `p1b` VALUES LESS THAN (20),\n" + + " PARTITION `pMax` VALUES LESS THAN (MAXVALUE))")) + tk.MustExec(`admin check table t`) + newTbl.Meta().Partition = newPart + syncOnChanged <- true + require.NoError(t, <-alterErr) +} + +func TestReorgPartitionFailConcurrent(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + schemaName := "ReorgPartFailConcurrent" + tk.MustExec("create database " + schemaName) + tk.MustExec("use " + schemaName) + tk.MustExec(`create table t (a int unsigned PRIMARY KEY, b varchar(255), c int, key (b), key (c,b))` + + ` partition by range (a) ` + + `(partition p0 values less than (10),` + + ` partition p1 values less than (20),` + + ` partition pMax values less than (MAXVALUE))`) + tk.MustExec(`insert into t values (1,"1",1), (12,"12",21),(23,"23",32),(34,"34",43),(45,"45",54),(56,"56",65)`) + dom := domain.GetDomain(tk.Session()) + originHook := dom.DDL().GetHook() + defer dom.DDL().SetHook(originHook) + hook := &callback.TestDDLCallback{Do: dom} + dom.DDL().SetHook(hook) + + wait := make(chan bool) + defer close(wait) + + // Test insert of duplicate key during copy phase + injected := false + hook.OnJobRunBeforeExported = func(job *model.Job) { + if job.Type == model.ActionReorganizePartition && job.SchemaState == model.StateWriteReorganization && !injected { + injected = true + <-wait + <-wait + } + } + alterErr := make(chan error, 1) + go backgroundExec(store, schemaName, "alter table t reorganize partition p1 into (partition p1a values less than (15), partition p1b values less than (20))", alterErr) + wait <- true + tk.MustExec(`insert into t values (14, "14", 14),(15, "15",15)`) + tk.MustGetErrCode(`insert into t values (11, "11", 11),(12,"duplicate PK 💥", 13)`, errno.ErrDupEntry) + tk.MustExec(`admin check table t`) + wait <- true + require.NoError(t, <-alterErr) + tk.MustQuery(`select * from t where c between 10 and 22`).Sort().Check(testkit.Rows(""+ + "12 12 21", + "14 14 14", + "15 15 15")) + tk.MustExec(`admin check table t`) + tk.MustQuery(`show create table t`).Check(testkit.Rows("" + + "t CREATE TABLE `t` (\n" + + " `a` int(10) unsigned NOT NULL,\n" + + " `b` varchar(255) DEFAULT NULL,\n" + + " `c` int(11) DEFAULT NULL,\n" + + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */,\n" + + " KEY `b` (`b`),\n" + + " KEY `c` (`c`,`b`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY RANGE (`a`)\n" + + "(PARTITION `p0` VALUES LESS THAN (10),\n" + + " PARTITION `p1a` VALUES LESS THAN (15),\n" + + " PARTITION `p1b` VALUES LESS THAN (20),\n" + + " PARTITION `pMax` VALUES LESS THAN (MAXVALUE))")) + + // Test reorg of duplicate key + prevState := model.StateNone + hook.OnJobRunBeforeExported = func(job *model.Job) { + if job.Type == model.ActionReorganizePartition && + job.SchemaState == model.StateWriteReorganization && + job.SnapshotVer == 0 && + prevState != job.SchemaState { + prevState = job.SchemaState + <-wait + <-wait + } + if job.Type == model.ActionReorganizePartition && + job.SchemaState == model.StateDeleteReorganization && + prevState != job.SchemaState { + prevState = job.SchemaState + <-wait + <-wait + } + } + go backgroundExec(store, schemaName, "alter table t reorganize partition p1a,p1b into (partition p1a values less than (14), partition p1b values less than (17), partition p1c values less than (20))", alterErr) + wait <- true + infoSchema := sessiontxn.GetTxnManager(tk.Session()).GetTxnInfoSchema() + tbl, err := infoSchema.TableByName(model.NewCIStr(schemaName), model.NewCIStr("t")) + require.NoError(t, err) + require.Equal(t, 0, getNumRowsFromPartitionDefs(t, tk, tbl, tbl.Meta().Partition.AddingDefinitions)) + tk.MustExec(`delete from t where a = 14`) + tk.MustExec(`insert into t values (13, "13", 31),(14,"14b",14),(16, "16",16)`) + tk.MustExec(`admin check table t`) + wait <- true + wait <- true + tbl, err = infoSchema.TableByName(model.NewCIStr(schemaName), model.NewCIStr("t")) + require.NoError(t, err) + require.Equal(t, 5, getNumRowsFromPartitionDefs(t, tk, tbl, tbl.Meta().Partition.AddingDefinitions)) + tk.MustExec(`delete from t where a = 15`) + tk.MustExec(`insert into t values (11, "11", 11),(15,"15b",15),(17, "17",17)`) + tk.MustExec(`admin check table t`) + wait <- true + require.NoError(t, <-alterErr) + + tk.MustExec(`admin check table t`) + tk.MustQuery(`select * from t where a between 10 and 22`).Sort().Check(testkit.Rows(""+ + "11 11 11", + "12 12 21", + "13 13 31", + "14 14b 14", + "15 15b 15", + "16 16 16", + "17 17 17")) + tk.MustQuery(`select * from t where c between 10 and 22`).Sort().Check(testkit.Rows(""+ + "11 11 11", + "12 12 21", + "14 14b 14", + "15 15b 15", + "16 16 16", + "17 17 17")) + tk.MustQuery(`select * from t where b between "10" and "22"`).Sort().Check(testkit.Rows(""+ + "11 11 11", + "12 12 21", + "13 13 31", + "14 14b 14", + "15 15b 15", + "16 16 16", + "17 17 17")) +} + +func getNumRowsFromPartitionDefs(t *testing.T, tk *testkit.TestKit, tbl table.Table, defs []model.PartitionDefinition) int { + ctx := tk.Session() + pt := tbl.GetPartitionedTable() + require.NotNil(t, pt) + cnt := 0 + for _, def := range defs { + data := getAllDataForPhysicalTable(t, ctx, pt.GetPartition(def.ID)) + require.True(t, len(data.keys) == len(data.vals)) + require.True(t, len(data.keys) == len(data.tp)) + for _, s := range data.tp { + if s == "Record" { + cnt++ + } + } + } + return cnt +} + +func TestReorgPartitionFailInject(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + schemaName := "ReorgPartFailInjectConcurrent" + tk.MustExec("create database " + schemaName) + tk.MustExec("use " + schemaName) + tk.MustExec(`create table t (a int unsigned PRIMARY KEY, b varchar(255), c int, key (b), key (c,b))` + + ` partition by range (a) ` + + `(partition p0 values less than (10),` + + ` partition p1 values less than (20),` + + ` partition pMax values less than (MAXVALUE))`) + tk.MustExec(`insert into t values (1,"1",1), (12,"12",21),(23,"23",32),(34,"34",43),(45,"45",54),(56,"56",65)`) + + dom := domain.GetDomain(tk.Session()) + originHook := dom.DDL().GetHook() + defer dom.DDL().SetHook(originHook) + hook := &callback.TestDDLCallback{Do: dom} + dom.DDL().SetHook(hook) + + wait := make(chan bool) + defer close(wait) + + injected := false + hook.OnJobRunBeforeExported = func(job *model.Job) { + if job.Type == model.ActionReorganizePartition && job.SchemaState == model.StateWriteReorganization && !injected { + injected = true + <-wait + <-wait + } + } + alterErr := make(chan error, 1) + go backgroundExec(store, schemaName, "alter table t reorganize partition p1 into (partition p1a values less than (15), partition p1b values less than (20))", alterErr) + wait <- true + tk.MustExec(`insert into t values (14, "14", 14),(15, "15",15)`) + tk.MustGetErrCode(`insert into t values (11, "11", 11),(12,"duplicate PK 💥", 13)`, errno.ErrDupEntry) + tk.MustExec(`admin check table t`) + wait <- true + require.NoError(t, <-alterErr) + tk.MustExec(`admin check table t`) + tk.MustQuery(`select * from t where c between 10 and 22`).Sort().Check(testkit.Rows(""+ + "12 12 21", + "14 14 14", + "15 15 15")) + tk.MustQuery(`show create table t`).Check(testkit.Rows("" + + "t CREATE TABLE `t` (\n" + + " `a` int(10) unsigned NOT NULL,\n" + + " `b` varchar(255) DEFAULT NULL,\n" + + " `c` int(11) DEFAULT NULL,\n" + + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */,\n" + + " KEY `b` (`b`),\n" + + " KEY `c` (`c`,`b`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY RANGE (`a`)\n" + + "(PARTITION `p0` VALUES LESS THAN (10),\n" + + " PARTITION `p1a` VALUES LESS THAN (15),\n" + + " PARTITION `p1b` VALUES LESS THAN (20),\n" + + " PARTITION `pMax` VALUES LESS THAN (MAXVALUE))")) +} + +func TestReorgPartitionRollback(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + schemaName := "ReorgPartRollback" + tk.MustExec("create database " + schemaName) + tk.MustExec("use " + schemaName) + tk.MustExec(`create table t (a int unsigned PRIMARY KEY, b varchar(255), c int, key (b), key (c,b))` + + ` partition by range (a) ` + + `(partition p0 values less than (10),` + + ` partition p1 values less than (20),` + + ` partition pMax values less than (MAXVALUE))`) + tk.MustExec(`insert into t values (1,"1",1), (12,"12",21),(23,"23",32),(34,"34",43),(45,"45",54),(56,"56",65)`) + // TODO: Check that there are no additional placement rules, + // bundles, or ranges with non-completed tableIDs + // (partitions used during reorg, but was dropped) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockUpdateVersionAndTableInfoErr", `return(true)`)) + tk.MustExecToErr("alter table t reorganize partition p1 into (partition p1a values less than (15), partition p1b values less than (20))") + tk.MustExec(`admin check table t`) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockUpdateVersionAndTableInfoErr")) + ctx := tk.Session() + is := domain.GetDomain(ctx).InfoSchema() + tbl, err := is.TableByName(model.NewCIStr(schemaName), model.NewCIStr("t")) + require.NoError(t, err) + noNewTablesAfter(t, tk, ctx, tbl) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/reorgPartitionAfterDataCopy", `return(true)`)) + defer func() { + err := failpoint.Disable("github.com/pingcap/tidb/ddl/reorgPartitionAfterDataCopy") + require.NoError(t, err) + }() + tk.MustExecToErr("alter table t reorganize partition p1 into (partition p1a values less than (15), partition p1b values less than (20))") + tk.MustExec(`admin check table t`) + tk.MustQuery(`show create table t`).Check(testkit.Rows("" + + "t CREATE TABLE `t` (\n" + + " `a` int(10) unsigned NOT NULL,\n" + + " `b` varchar(255) DEFAULT NULL,\n" + + " `c` int(11) DEFAULT NULL,\n" + + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */,\n" + + " KEY `b` (`b`),\n" + + " KEY `c` (`c`,`b`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY RANGE (`a`)\n" + + "(PARTITION `p0` VALUES LESS THAN (10),\n" + + " PARTITION `p1` VALUES LESS THAN (20),\n" + + " PARTITION `pMax` VALUES LESS THAN (MAXVALUE))")) + + tbl, err = is.TableByName(model.NewCIStr(schemaName), model.NewCIStr("t")) + require.NoError(t, err) + noNewTablesAfter(t, tk, ctx, tbl) +} + +func TestReorgPartitionData(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + schemaName := "ReorgPartData" + tk.MustExec("create database " + schemaName) + tk.MustExec("use " + schemaName) + tk.MustExec(`SET @@session.sql_mode = default`) + tk.MustExec(`create table t (a int PRIMARY KEY AUTO_INCREMENT, b varchar(255), c int, d datetime, key (b), key (c,b)) partition by range (a) (partition p1 values less than (0), partition p1M values less than (1000000))`) + tk.MustContainErrMsg(`insert into t values (0, "Zero value!", 0, '2022-02-30')`, "[table:1292]Incorrect datetime value: '2022-02-30' for column 'd' at row 1") + tk.MustExec(`SET @@session.sql_mode = 'ALLOW_INVALID_DATES,NO_AUTO_VALUE_ON_ZERO'`) + tk.MustExec(`insert into t values (0, "Zero value!", 0, '2022-02-30')`) + tk.MustQuery(`show warnings`).Check(testkit.Rows()) + tk.MustQuery(`select * from t`).Sort().Check(testkit.Rows("0 Zero value! 0 2022-02-30 00:00:00")) + tk.MustExec(`SET @@session.sql_mode = default`) + tk.MustExec(`alter table t reorganize partition p1M into (partition p0 values less than (1), partition p2M values less than (2000000))`) + tk.MustQuery(`select * from t`).Sort().Check(testkit.Rows("0 Zero value! 0 2022-02-30 00:00:00")) + tk.MustExec(`admin check table t`) +} diff --git a/ddl/repair_table_test.go b/ddl/repair_table_test.go index 6881c6ce5f019..8b16f9bfbc69d 100644 --- a/ddl/repair_table_test.go +++ b/ddl/repair_table_test.go @@ -20,7 +20,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" @@ -101,7 +101,7 @@ func TestRepairTable(t *testing.T) { // Repaired tableInfo has been filtered by `domain.InfoSchema()`, so get it in repairInfo. originTableInfo, _ := domainutil.RepairInfo.GetRepairedTableInfoByTableName("test", "origin") - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} var repairErr error hook.OnJobRunBeforeExported = func(job *model.Job) { if job.Type != model.ActionRepairTable { diff --git a/ddl/resource_group.go b/ddl/resource_group.go new file mode 100644 index 0000000000000..514e8cf30c2b8 --- /dev/null +++ b/ddl/resource_group.go @@ -0,0 +1,157 @@ +// 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, +// 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 ddl + +import ( + "context" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/ddl/resourcegroup" + "github.com/pingcap/tidb/domain/infosync" + "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/meta" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/util/dbterror" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" +) + +func onCreateResourceGroup(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) { + groupInfo := &model.ResourceGroupInfo{} + if err := job.DecodeArgs(groupInfo); err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + groupInfo.State = model.StateNone + + // check if resource group value is valid and convert to proto format. + protoGroup, err := resourcegroup.NewGroupFromOptions(groupInfo.Name.L, groupInfo.ResourceGroupSettings) + if err != nil { + logutil.BgLogger().Warn("convert to resource group failed", zap.Error(err)) + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + + switch groupInfo.State { + case model.StateNone: + // none -> public + groupInfo.State = model.StatePublic + err := t.AddResourceGroup(groupInfo) + if err != nil { + return ver, errors.Trace(err) + } + err = infosync.AddResourceGroup(context.TODO(), protoGroup) + if err != nil { + logutil.BgLogger().Warn("create resource group failed", zap.Error(err)) + return ver, errors.Trace(err) + } + job.SchemaID = groupInfo.ID + ver, err = updateSchemaVersion(d, t, job) + if err != nil { + return ver, errors.Trace(err) + } + // Finish this job. + job.FinishDBJob(model.JobStateDone, model.StatePublic, ver, nil) + return ver, nil + default: + return ver, dbterror.ErrInvalidDDLState.GenWithStackByArgs("resource_group", groupInfo.State) + } +} + +func onAlterResourceGroup(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) { + alterGroupInfo := &model.ResourceGroupInfo{} + if err := job.DecodeArgs(alterGroupInfo); err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + // check if resource group value is valid and convert to proto format. + protoGroup, err := resourcegroup.NewGroupFromOptions(alterGroupInfo.Name.L, alterGroupInfo.ResourceGroupSettings) + if err != nil { + logutil.BgLogger().Warn("convert to resource group failed", zap.Error(err)) + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + + oldGroup, err := checkResourceGroupExist(t, job, alterGroupInfo.ID) + if err != nil { + return ver, errors.Trace(err) + } + + newGroup := *oldGroup + newGroup.ResourceGroupSettings = alterGroupInfo.ResourceGroupSettings + + // TODO: check the group validation + err = t.UpdateResourceGroup(&newGroup) + if err != nil { + return ver, errors.Trace(err) + } + + err = infosync.ModifyResourceGroup(context.TODO(), protoGroup) + if err != nil { + logutil.BgLogger().Warn("update resource group failed", zap.Error(err)) + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + + ver, err = updateSchemaVersion(d, t, job) + if err != nil { + return ver, errors.Trace(err) + } + // Finish this job. + job.FinishDBJob(model.JobStateDone, model.StatePublic, ver, nil) + return ver, nil +} + +func checkResourceGroupExist(t *meta.Meta, job *model.Job, groupID int64) (*model.ResourceGroupInfo, error) { + groupInfo, err := t.GetResourceGroup(groupID) + if err == nil { + return groupInfo, nil + } + if infoschema.ErrResourceGroupNotExists.Equal(err) { + job.State = model.JobStateCancelled + } + return nil, err +} + +func onDropResourceGroup(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) { + groupInfo, err := checkResourceGroupExist(t, job, job.SchemaID) + if err != nil { + return ver, errors.Trace(err) + } + // TODO: check the resource group not in use. + switch groupInfo.State { + case model.StatePublic: + // public -> none + // resource group not influence the correctness of the data, so we can directly remove it. + groupInfo.State = model.StateNone + err = t.DropResourceGroup(groupInfo.ID) + if err != nil { + return ver, errors.Trace(err) + } + err = infosync.DeleteResourceGroup(context.TODO(), groupInfo.Name.L) + if err != nil { + return ver, errors.Trace(err) + } + ver, err = updateSchemaVersion(d, t, job) + if err != nil { + return ver, errors.Trace(err) + } + // Finish this job. + job.FinishDBJob(model.JobStateDone, model.StateNone, ver, nil) + default: + err = dbterror.ErrInvalidDDLState.GenWithStackByArgs("resource_group", groupInfo.State) + } + return ver, errors.Trace(err) +} diff --git a/ddl/resource_group_test.go b/ddl/resource_group_test.go new file mode 100644 index 0000000000000..162a3ac233a05 --- /dev/null +++ b/ddl/resource_group_test.go @@ -0,0 +1,178 @@ +// 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, +// 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 ddl_test + +import ( + "context" + "testing" + + "github.com/pingcap/tidb/ddl/internal/callback" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/domain/infosync" + mysql "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/require" +) + +func TestResourceGroupBasic(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + re := require.New(t) + + hook := &callback.TestDDLCallback{Do: dom} + var groupID int64 + onJobUpdatedExportedFunc := func(job *model.Job) { + // job.SchemaID will be assigned when the group is created. + if (job.SchemaName == "x" || job.SchemaName == "y") && job.Type == model.ActionCreateResourceGroup && job.SchemaID != 0 { + groupID = job.SchemaID + return + } + } + hook.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) + dom.DDL().SetHook(hook) + + tk.MustExec("set global tidb_enable_resource_control = 'off'") + tk.MustGetErrCode("create user usr1 resource group rg1", mysql.ErrResourceGroupSupportDisabled) + tk.MustExec("create user usr1") + tk.MustGetErrCode("alter user usr1 resource group rg1", mysql.ErrResourceGroupSupportDisabled) + tk.MustGetErrCode("create resource group x RU_PER_SEC=1000 ", mysql.ErrResourceGroupSupportDisabled) + + tk.MustExec("set global tidb_enable_resource_control = 'on'") + + tk.MustExec("create resource group x RU_PER_SEC=1000") + checkFunc := func(groupInfo *model.ResourceGroupInfo) { + require.Equal(t, true, groupInfo.ID != 0) + require.Equal(t, "x", groupInfo.Name.L) + require.Equal(t, groupID, groupInfo.ID) + require.Equal(t, uint64(1000), groupInfo.RURate) + } + // Check the group is correctly reloaded in the information schema. + g := testResourceGroupNameFromIS(t, tk.Session(), "x") + checkFunc(g) + + // test create if not exists + tk.MustExec("create resource group if not exists x RU_PER_SEC=10000") + // Check the resource group is not changed + g = testResourceGroupNameFromIS(t, tk.Session(), "x") + checkFunc(g) + // Check warning message + res := tk.MustQuery("show warnings") + res.Check(testkit.Rows("Note 8248 Resource group 'x' already exists")) + + tk.MustExec("set global tidb_enable_resource_control = DEFAULT") + tk.MustGetErrCode("alter resource group x RU_PER_SEC=2000 ", mysql.ErrResourceGroupSupportDisabled) + tk.MustGetErrCode("drop resource group x ", mysql.ErrResourceGroupSupportDisabled) + + tk.MustExec("set global tidb_enable_resource_control = 'on'") + + tk.MustGetErrCode("create resource group x RU_PER_SEC=1000 ", mysql.ErrResourceGroupExists) + + tk.MustExec("alter resource group x RU_PER_SEC=2000 BURSTABLE") + g = testResourceGroupNameFromIS(t, tk.Session(), "x") + re.Equal(uint64(2000), g.RURate) + re.Equal(int64(-1), g.BurstLimit) + + tk.MustQuery("select * from information_schema.resource_groups where name = 'x'").Check(testkit.Rows("x 2000 YES")) + + tk.MustExec("drop resource group x") + g = testResourceGroupNameFromIS(t, tk.Session(), "x") + re.Nil(g) + + tk.MustExec("alter resource group if exists not_exists RU_PER_SEC=2000") + // Check warning message + res = tk.MustQuery("show warnings") + res.Check(testkit.Rows("Note 8249 Unknown resource group 'not_exists'")) + + tk.MustExec("create resource group y RU_PER_SEC=4000") + checkFunc = func(groupInfo *model.ResourceGroupInfo) { + require.Equal(t, true, groupInfo.ID != 0) + require.Equal(t, "y", groupInfo.Name.L) + require.Equal(t, groupID, groupInfo.ID) + require.Equal(t, uint64(4000), groupInfo.RURate) + require.Equal(t, int64(4000), groupInfo.BurstLimit) + } + g = testResourceGroupNameFromIS(t, tk.Session(), "y") + checkFunc(g) + tk.MustExec("alter resource group y BURSTABLE RU_PER_SEC=5000") + checkFunc = func(groupInfo *model.ResourceGroupInfo) { + require.Equal(t, true, groupInfo.ID != 0) + require.Equal(t, "y", groupInfo.Name.L) + require.Equal(t, groupID, groupInfo.ID) + require.Equal(t, uint64(5000), groupInfo.RURate) + require.Equal(t, int64(-1), groupInfo.BurstLimit) + } + g = testResourceGroupNameFromIS(t, tk.Session(), "y") + checkFunc(g) + tk.MustExec("drop resource group y") + g = testResourceGroupNameFromIS(t, tk.Session(), "y") + re.Nil(g) + + tk.MustGetErrCode("create resource group x ru_per_sec=1000 ru_per_sec=200", mysql.ErrParse) + tk.MustContainErrMsg("create resource group x ru_per_sec=1000 ru_per_sec=200, ru_per_sec=300", "Dupliated options specified") + tk.MustGetErrCode("create resource group x burstable, burstable", mysql.ErrParse) + tk.MustContainErrMsg("create resource group x burstable, burstable", "Dupliated options specified") + tk.MustGetErrCode("create resource group x ru_per_sec=1000, burstable, burstable", mysql.ErrParse) + tk.MustContainErrMsg("create resource group x ru_per_sec=1000, burstable, burstable", "Dupliated options specified") + tk.MustGetErrCode("create resource group x burstable, ru_per_sec=1000, burstable", mysql.ErrParse) + tk.MustContainErrMsg("create resource group x burstable, ru_per_sec=1000, burstable", "Dupliated options specified") + groups, err := infosync.ListResourceGroups(context.TODO()) + require.Equal(t, 0, len(groups)) + require.NoError(t, err) + + // Check information schema table information_schema.resource_groups + tk.MustExec("create resource group x RU_PER_SEC=1000") + tk.MustQuery("select * from information_schema.resource_groups where name = 'x'").Check(testkit.Rows("x 1000 NO")) + tk.MustExec("alter resource group x RU_PER_SEC=2000 BURSTABLE") + tk.MustQuery("select * from information_schema.resource_groups where name = 'x'").Check(testkit.Rows("x 2000 YES")) + tk.MustExec("alter resource group x BURSTABLE RU_PER_SEC=3000") + tk.MustQuery("select * from information_schema.resource_groups where name = 'x'").Check(testkit.Rows("x 3000 YES")) + tk.MustQuery("show create resource group x").Check(testkit.Rows("x CREATE RESOURCE GROUP `x` RU_PER_SEC=3000 BURSTABLE")) + + tk.MustExec("create resource group y BURSTABLE RU_PER_SEC=2000") + tk.MustQuery("select * from information_schema.resource_groups where name = 'y'").Check(testkit.Rows("y 2000 YES")) + tk.MustQuery("show create resource group y").Check(testkit.Rows("y CREATE RESOURCE GROUP `y` RU_PER_SEC=2000 BURSTABLE")) + + tk.MustExec("alter resource group y RU_PER_SEC=4000 BURSTABLE") + tk.MustQuery("select * from information_schema.resource_groups where name = 'y'").Check(testkit.Rows("y 4000 YES")) + tk.MustQuery("show create resource group y").Check(testkit.Rows("y CREATE RESOURCE GROUP `y` RU_PER_SEC=4000 BURSTABLE")) + + tk.MustQuery("select count(*) from information_schema.resource_groups").Check(testkit.Rows("2")) + tk.MustGetErrCode("create user usr_fail resource group nil_group", mysql.ErrResourceGroupNotExists) + tk.MustContainErrMsg("create user usr_fail resource group nil_group", "Unknown resource group 'nil_group'") + tk.MustExec("create user user2") + tk.MustGetErrCode("alter user user2 resource group nil_group", mysql.ErrResourceGroupNotExists) + tk.MustContainErrMsg("alter user user2 resource group nil_group", "Unknown resource group 'nil_group'") + + tk.MustExec("create resource group do_not_delete_rg ru_per_sec=100") + tk.MustExec("create user usr3 resource group do_not_delete_rg") + tk.MustQuery("select user_attributes from mysql.user where user = 'usr3'").Check(testkit.Rows(`{"resource_group": "do_not_delete_rg"}`)) + tk.MustContainErrMsg("drop resource group do_not_delete_rg", "user [usr3] depends on the resource group to drop") + tk.MustExec("alter user usr3 resource group `default`") + tk.MustExec("alter user usr3 resource group ``") + tk.MustExec("alter user usr3 resource group `DeFault`") + tk.MustQuery("select user_attributes from mysql.user where user = 'usr3'").Check(testkit.Rows(`{"resource_group": "default"}`)) +} + +func testResourceGroupNameFromIS(t *testing.T, ctx sessionctx.Context, name string) *model.ResourceGroupInfo { + dom := domain.GetDomain(ctx) + // Make sure the table schema is the new schema. + err := dom.Reload() + require.NoError(t, err) + g, _ := dom.InfoSchema().ResourceGroupByName(model.NewCIStr(name)) + return g +} diff --git a/ddl/resourcegroup/BUILD.bazel b/ddl/resourcegroup/BUILD.bazel new file mode 100644 index 0000000000000..ae19c6f654e86 --- /dev/null +++ b/ddl/resourcegroup/BUILD.bazel @@ -0,0 +1,29 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "resourcegroup", + srcs = [ + "errors.go", + "group.go", + ], + importpath = "github.com/pingcap/tidb/ddl/resourcegroup", + visibility = ["//visibility:public"], + deps = [ + "//parser/model", + "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_kvproto//pkg/resource_manager", + ], +) + +go_test( + name = "resourcegroup_test", + timeout = "short", + srcs = ["group_test.go"], + embed = [":resourcegroup"], + flaky = True, + deps = [ + "//parser/model", + "@com_github_pingcap_kvproto//pkg/resource_manager", + "@com_github_stretchr_testify//require", + ], +) diff --git a/ddl/resourcegroup/errors.go b/ddl/resourcegroup/errors.go new file mode 100644 index 0000000000000..0893f59876f6d --- /dev/null +++ b/ddl/resourcegroup/errors.go @@ -0,0 +1,32 @@ +// 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, +// 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 resourcegroup + +import ( + "github.com/pingcap/errors" +) + +var ( + // ErrInvalidGroupSettings is from group.go. + ErrInvalidGroupSettings = errors.New("invalid group settings") + // ErrTooLongResourceGroupName is from group.go. + ErrTooLongResourceGroupName = errors.New("resource group name too long") + // ErrInvalidResourceGroupFormat is from group.go. + ErrInvalidResourceGroupFormat = errors.New("group settings with invalid format") + // ErrInvalidResourceGroupDuplicatedMode is from group.go. + ErrInvalidResourceGroupDuplicatedMode = errors.New("cannot set RU mode and Raw mode options at the same time") + // ErrUnknownResourceGroupMode is from group.go. + ErrUnknownResourceGroupMode = errors.New("unknown resource group mode") +) diff --git a/ddl/resourcegroup/group.go b/ddl/resourcegroup/group.go new file mode 100644 index 0000000000000..6e371a501d3ab --- /dev/null +++ b/ddl/resourcegroup/group.go @@ -0,0 +1,53 @@ +// 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, +// 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 resourcegroup + +import ( + rmpb "github.com/pingcap/kvproto/pkg/resource_manager" + "github.com/pingcap/tidb/parser/model" +) + +// MaxGroupNameLength is max length of the name of a resource group +const MaxGroupNameLength = 32 + +// NewGroupFromOptions creates a new resource group from the given options. +func NewGroupFromOptions(groupName string, options *model.ResourceGroupSettings) (*rmpb.ResourceGroup, error) { + if options == nil { + return nil, ErrInvalidGroupSettings + } + if len(groupName) > MaxGroupNameLength { + return nil, ErrTooLongResourceGroupName + } + group := &rmpb.ResourceGroup{ + Name: groupName, + } + if options.RURate > 0 { + group.Mode = rmpb.GroupMode_RUMode + group.RUSettings = &rmpb.GroupRequestUnitSettings{ + RU: &rmpb.TokenBucket{ + Settings: &rmpb.TokenLimitSettings{ + FillRate: options.RURate, + BurstLimit: options.BurstLimit, + }, + }, + } + if len(options.CPULimiter) > 0 || len(options.IOReadBandwidth) > 0 || len(options.IOWriteBandwidth) > 0 { + return nil, ErrInvalidResourceGroupDuplicatedMode + } + return group, nil + } + // Only support RU mode now + return nil, ErrUnknownResourceGroupMode +} diff --git a/ddl/resourcegroup/group_test.go b/ddl/resourcegroup/group_test.go new file mode 100644 index 0000000000000..7d79f00aa6184 --- /dev/null +++ b/ddl/resourcegroup/group_test.go @@ -0,0 +1,143 @@ +// 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, +// 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 resourcegroup + +import ( + "fmt" + "testing" + + rmpb "github.com/pingcap/kvproto/pkg/resource_manager" + "github.com/pingcap/tidb/parser/model" + "github.com/stretchr/testify/require" +) + +func TestNewResourceGroupFromOptions(t *testing.T) { + type TestCase struct { + name string + groupName string + input *model.ResourceGroupSettings + output *rmpb.ResourceGroup + err error + } + var tests []TestCase + groupName := "test" + tests = append(tests, TestCase{ + name: "empty 1", + input: &model.ResourceGroupSettings{}, + err: ErrUnknownResourceGroupMode, + }) + + tests = append(tests, TestCase{ + name: "empty 2", + input: nil, + err: ErrInvalidGroupSettings, + }) + + tests = append(tests, TestCase{ + name: "normal case: ru case 1", + input: &model.ResourceGroupSettings{ + RURate: 2000, + }, + output: &rmpb.ResourceGroup{ + Name: groupName, + Mode: rmpb.GroupMode_RUMode, + RUSettings: &rmpb.GroupRequestUnitSettings{ + RU: &rmpb.TokenBucket{Settings: &rmpb.TokenLimitSettings{FillRate: 2000}}, + }, + }, + }) + + tests = append(tests, TestCase{ + name: "normal case: ru case 2", + input: &model.ResourceGroupSettings{ + RURate: 5000, + }, + output: &rmpb.ResourceGroup{ + Name: groupName, + Mode: rmpb.GroupMode_RUMode, + RUSettings: &rmpb.GroupRequestUnitSettings{ + RU: &rmpb.TokenBucket{Settings: &rmpb.TokenLimitSettings{FillRate: 5000}}, + }, + }, + }) + + tests = append(tests, TestCase{ + name: "error case: native case 1", + input: &model.ResourceGroupSettings{ + CPULimiter: "8", + IOReadBandwidth: "3000MB/s", + IOWriteBandwidth: "3000Mi", + }, + err: ErrUnknownResourceGroupMode, + }) + + tests = append(tests, TestCase{ + name: "error case: native case 2", + input: &model.ResourceGroupSettings{ + CPULimiter: "8c", + IOReadBandwidth: "3000Mi", + IOWriteBandwidth: "3000Mi", + }, + err: ErrUnknownResourceGroupMode, + }) + + tests = append(tests, TestCase{ + name: "error case: native case 3", + input: &model.ResourceGroupSettings{ + CPULimiter: "8", + IOReadBandwidth: "3000G", + IOWriteBandwidth: "3000MB", + }, + err: ErrUnknownResourceGroupMode, + }) + + tests = append(tests, TestCase{ + name: "error case: duplicated mode", + input: &model.ResourceGroupSettings{ + CPULimiter: "8", + IOReadBandwidth: "3000Mi", + IOWriteBandwidth: "3000Mi", + RURate: 1000, + }, + err: ErrInvalidResourceGroupDuplicatedMode, + }) + + tests = append(tests, TestCase{ + name: "error case: duplicated mode", + groupName: "test_group_too_looooooooooooooooooooooooooooooooooooooooooooooooong", + input: &model.ResourceGroupSettings{ + CPULimiter: "8", + IOReadBandwidth: "3000Mi", + IOWriteBandwidth: "3000Mi", + RURate: 1000, + }, + err: ErrTooLongResourceGroupName, + }) + + for _, test := range tests { + name := groupName + if len(test.groupName) > 0 { + name = test.groupName + } + group, err := NewGroupFromOptions(name, test.input) + comment := fmt.Sprintf("[%s]\nerr1 %s\nerr2 %s", test.name, err, test.err) + if test.err != nil { + require.ErrorIs(t, err, test.err, comment) + } else { + require.NoError(t, err, comment) + require.Equal(t, test.output, group) + } + } +} diff --git a/ddl/restart_test.go b/ddl/restart_test.go index 450624f7dfe97..fa4e21b5f1c05 100644 --- a/ddl/restart_test.go +++ b/ddl/restart_test.go @@ -141,7 +141,7 @@ func TestStat(t *testing.T) { SchemaID: dbInfo.ID, Type: model.ActionDropSchema, BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{dbInfo.Name}, + Args: []interface{}{true}, } done := make(chan error, 1) diff --git a/ddl/rollingback_test.go b/ddl/rollingback_test.go index f1850eb80dcbc..ee5894441175f 100644 --- a/ddl/rollingback_test.go +++ b/ddl/rollingback_test.go @@ -21,6 +21,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/testkit/external" @@ -50,7 +51,7 @@ func TestCancelAddIndexJobError(t *testing.T) { require.NotNil(t, tbl) d := dom.DDL() - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} var ( checkErr error jobID int64 diff --git a/ddl/sanity_check.go b/ddl/sanity_check.go index e005eee6a9856..63eb94d4592a4 100644 --- a/ddl/sanity_check.go +++ b/ddl/sanity_check.go @@ -16,7 +16,6 @@ package ddl import ( "context" - "flag" "fmt" "strings" @@ -26,6 +25,7 @@ import ( "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/util/intest" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/mathutil" "github.com/pingcap/tidb/util/sqlexec" @@ -98,7 +98,8 @@ func expectedDeleteRangeCnt(ctx delRangeCntCtx, job *model.Job) (int, error) { return 0, errors.Trace(err) } return mathutil.Max(len(physicalTableIDs), 1), nil - case model.ActionDropTablePartition, model.ActionTruncateTablePartition: + case model.ActionDropTablePartition, model.ActionTruncateTablePartition, + model.ActionReorganizePartition: var physicalTableIDs []int64 if err := job.DecodeArgs(&physicalTableIDs); err != nil { return 0, errors.Trace(err) @@ -182,7 +183,7 @@ func (ctx *delRangeCntCtx) deduplicateIdxCnt(indexIDs []int64) int { // It's only check during the test environment, so it would panic directly. // These checks may be controlled by configuration in the future. func (d *ddl) checkHistoryJobInTest(ctx sessionctx.Context, historyJob *model.Job) { - if !(flag.Lookup("test.v") != nil || flag.Lookup("check.v") != nil) { + if !intest.InTest { return } diff --git a/ddl/schema.go b/ddl/schema.go index d9e86c30c5eaf..e9cb1e6579635 100644 --- a/ddl/schema.go +++ b/ddl/schema.go @@ -312,6 +312,10 @@ func (w *worker) onRecoverSchema(d *ddlCtx, t *meta.Meta, job *model.Job) (ver i return ver, errors.Trace(err) } for _, recoverInfo := range recoverSchemaInfo.RecoverTabsInfo { + if recoverInfo.TableInfo.TTLInfo != nil { + // force disable TTL job schedule for recovered table + recoverInfo.TableInfo.TTLInfo.Enable = false + } ver, err = w.recoverTable(t, job, recoverInfo) if err != nil { return ver, errors.Trace(err) diff --git a/ddl/schema_test.go b/ddl/schema_test.go index 70206ed2f179f..3be4fb4e4d278 100644 --- a/ddl/schema_test.go +++ b/ddl/schema_test.go @@ -163,13 +163,13 @@ func testDropSchema(t *testing.T, ctx sessionctx.Context, d ddl.DDL, dbInfo *mod return job, ver } -func isDDLJobDone(test *testing.T, t *meta.Meta) bool { - job, err := t.GetDDLJobByIdx(0) - require.NoError(test, err) - if job == nil { +func isDDLJobDone(test *testing.T, t *meta.Meta, store kv.Storage) bool { + tk := testkit.NewTestKit(test, store) + rows := tk.MustQuery("select * from mysql.tidb_ddl_job").Rows() + + if len(rows) == 0 { return true } - time.Sleep(testLease) return false } @@ -185,7 +185,7 @@ func testCheckSchemaState(test *testing.T, store kv.Storage, dbInfo *model.DBInf require.NoError(test, err) if state == model.StateNone { - isDropped = isDDLJobDone(test, t) + isDropped = isDDLJobDone(test, t, store) if !isDropped { return nil } diff --git a/ddl/schematracker/checker.go b/ddl/schematracker/checker.go index b1533d0246fb1..9477d478388ad 100644 --- a/ddl/schematracker/checker.go +++ b/ddl/schematracker/checker.go @@ -433,6 +433,22 @@ func (d Checker) AlterPlacementPolicy(ctx sessionctx.Context, stmt *ast.AlterPla panic("implement me") } +// AddResourceGroup implements the DDL interface. +// ResourceGroup do not affect the transaction. +func (d Checker) AddResourceGroup(ctx sessionctx.Context, stmt *ast.CreateResourceGroupStmt) error { + return nil +} + +// DropResourceGroup implements the DDL interface. +func (d Checker) DropResourceGroup(ctx sessionctx.Context, stmt *ast.DropResourceGroupStmt) error { + return nil +} + +// AlterResourceGroup implements the DDL interface. +func (d Checker) AlterResourceGroup(ctx sessionctx.Context, stmt *ast.AlterResourceGroupStmt) error { + return nil +} + // CreateSchemaWithInfo implements the DDL interface. func (d Checker) CreateSchemaWithInfo(ctx sessionctx.Context, info *model.DBInfo, onExist ddl.OnExist) error { err := d.realDDL.CreateSchemaWithInfo(ctx, info, onExist) @@ -541,16 +557,6 @@ func (d Checker) DoDDLJob(ctx sessionctx.Context, job *model.Job) error { return d.realDDL.DoDDLJob(ctx, job) } -// MoveJobFromQueue2Table implements the DDL interface. -func (d Checker) MoveJobFromQueue2Table(bool) error { - panic("implement me") -} - -// MoveJobFromTable2Queue implements the DDL interface. -func (d Checker) MoveJobFromTable2Queue() error { - panic("implement me") -} - // StorageDDLInjector wraps kv.Storage to inject checker to domain's DDL in bootstrap time. type StorageDDLInjector struct { kv.Storage diff --git a/ddl/schematracker/dm_tracker.go b/ddl/schematracker/dm_tracker.go index 75f8fa35b429d..323d3b04962f7 100644 --- a/ddl/schematracker/dm_tracker.go +++ b/ddl/schematracker/dm_tracker.go @@ -1173,6 +1173,21 @@ func (SchemaTracker) AlterPlacementPolicy(ctx sessionctx.Context, stmt *ast.Alte return nil } +// AddResourceGroup implements the DDL interface, it's no-op in DM's case. +func (SchemaTracker) AddResourceGroup(_ sessionctx.Context, _ *ast.CreateResourceGroupStmt) error { + return nil +} + +// DropResourceGroup implements the DDL interface, it's no-op in DM's case. +func (SchemaTracker) DropResourceGroup(_ sessionctx.Context, _ *ast.DropResourceGroupStmt) error { + return nil +} + +// AlterResourceGroup implements the DDL interface, it's no-op in DM's case. +func (SchemaTracker) AlterResourceGroup(ctx sessionctx.Context, stmt *ast.AlterResourceGroupStmt) error { + return nil +} + // BatchCreateTableWithInfo implements the DDL interface, it will call CreateTableWithInfo for each table. func (d SchemaTracker) BatchCreateTableWithInfo(ctx sessionctx.Context, schema model.CIStr, info []*model.TableInfo, cs ...ddl.CreateTableWithInfoConfigurier) error { for _, tableInfo := range info { @@ -1256,13 +1271,3 @@ func (SchemaTracker) GetInfoSchemaWithInterceptor(ctx sessionctx.Context) infosc func (SchemaTracker) DoDDLJob(ctx sessionctx.Context, job *model.Job) error { return nil } - -// MoveJobFromQueue2Table implements the DDL interface, it's no-op in DM's case. -func (SchemaTracker) MoveJobFromQueue2Table(b bool) error { - panic("implement me") -} - -// MoveJobFromTable2Queue implements the DDL interface, it's no-op in DM's case. -func (SchemaTracker) MoveJobFromTable2Queue() error { - panic("implement me") -} diff --git a/ddl/sequence_test.go b/ddl/sequence_test.go index df58df12b0ebd..9b798c9f45eea 100644 --- a/ddl/sequence_test.go +++ b/ddl/sequence_test.go @@ -62,8 +62,7 @@ func TestCreateSequence(t *testing.T) { // test unsupported table option in sequence. tk.MustGetErrCode("create sequence seq CHARSET=utf8", mysql.ErrSequenceUnsupportedTableOption) - _, err := tk.Exec("create sequence seq comment=\"test\"") - require.NoError(t, err) + tk.MustExec("create sequence seq comment=\"test\"") sequenceTable := external.GetTableByName(t, tk, "test", "seq") diff --git a/ddl/serial_test.go b/ddl/serial_test.go index d99036ed4dc51..4d11db2b3409c 100644 --- a/ddl/serial_test.go +++ b/ddl/serial_test.go @@ -27,6 +27,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" @@ -101,7 +102,7 @@ func TestChangeMaxIndexLength(t *testing.T) { tk.MustExec("create table t (c1 varchar(3073), index(c1)) charset = ascii") tk.MustExec(fmt.Sprintf("create table t1 (c1 varchar(%d), index(c1)) charset = ascii;", config.DefMaxOfMaxIndexLength)) err := tk.ExecToErr(fmt.Sprintf("create table t2 (c1 varchar(%d), index(c1)) charset = ascii;", config.DefMaxOfMaxIndexLength+1)) - require.EqualError(t, err, "[ddl:1071]Specified key was too long; max key length is 12288 bytes") + require.EqualError(t, err, "[ddl:1071]Specified key was too long (12289 bytes); max key length is 12288 bytes") } func TestCreateTableWithLike(t *testing.T) { @@ -112,6 +113,7 @@ func TestCreateTableWithLike(t *testing.T) { tk.MustExec("use ctwl_db") tk.MustExec("create table tt(id int primary key)") tk.MustExec("create table t (c1 int not null auto_increment, c2 int, constraint cc foreign key (c2) references tt(id), primary key(c1)) auto_increment = 10") + tk.MustExec("set @@foreign_key_checks=0") tk.MustExec("insert into t set c2=1") tk.MustExec("create table t1 like ctwl_db.t") tk.MustExec("insert into t1 set c2=11") @@ -297,7 +299,7 @@ func TestCreateTableWithLikeAtTemporaryMode(t *testing.T) { // Test foreign key. tk.MustExec("drop table if exists test_foreign_key, t1") - tk.MustExec("create table t1 (a int, b int)") + tk.MustExec("create table t1 (a int, b int, index(b))") tk.MustExec("create table test_foreign_key (c int,d int,foreign key (d) references t1 (b))") defer tk.MustExec("drop table if exists test_foreign_key, t1") tk.MustExec("create global temporary table test_foreign_key_temp like test_foreign_key on commit delete rows") @@ -382,7 +384,7 @@ func TestCreateTableWithLikeAtTemporaryMode(t *testing.T) { defer tk.MustExec("drop table if exists partition_table, tmp_partition_table") tk.MustExec("drop table if exists foreign_key_table1, foreign_key_table2, foreign_key_tmp") - tk.MustExec("create table foreign_key_table1 (a int, b int)") + tk.MustExec("create table foreign_key_table1 (a int, b int, index(b))") tk.MustExec("create table foreign_key_table2 (c int,d int,foreign key (d) references foreign_key_table1 (b))") tk.MustExec("create temporary table foreign_key_tmp like foreign_key_table2") is = sessiontxn.GetTxnManager(tk.Session()).GetTxnInfoSchema() @@ -444,7 +446,7 @@ func TestCancelAddIndexPanic(t *testing.T) { oldReorgWaitTimeout := ddl.ReorgWaitTimeout ddl.ReorgWaitTimeout = 50 * time.Millisecond defer func() { ddl.ReorgWaitTimeout = oldReorgWaitTimeout }() - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} hook.OnJobRunBeforeExported = func(job *model.Job) { if job.Type == model.ActionAddIndex && job.State == model.JobStateRunning && job.SchemaState == model.StateWriteReorganization && job.SnapshotVer != 0 { tkCancel.MustQuery(fmt.Sprintf("admin cancel ddl jobs %d", job.ID)) @@ -461,6 +463,70 @@ func TestCancelAddIndexPanic(t *testing.T) { require.Truef(t, strings.HasPrefix(errMsg, "[ddl:8214]Cancelled DDL job"), "%v", errMsg) } +func TestRecoverTableWithTTL(t *testing.T) { + store, _ := createMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("create database if not exists test_recover") + tk.MustExec("use test_recover") + defer func(originGC bool) { + if originGC { + util.EmulatorGCEnable() + } else { + util.EmulatorGCDisable() + } + }(util.IsEmulatorGCEnable()) + + // disable emulator GC. + // Otherwise emulator GC will delete table record as soon as possible after execute drop table ddl. + util.EmulatorGCDisable() + gcTimeFormat := "20060102-15:04:05 -0700 MST" + safePointSQL := `INSERT HIGH_PRIORITY INTO mysql.tidb VALUES ('tikv_gc_safe_point', '%[1]s', '') + ON DUPLICATE KEY + UPDATE variable_value = '%[1]s'` + tk.MustExec(fmt.Sprintf(safePointSQL, time.Now().Add(-time.Hour).Format(gcTimeFormat))) + getDDLJobID := func(table, tp string) int64 { + rs, err := tk.Exec("admin show ddl jobs") + require.NoError(t, err) + rows, err := session.GetRows4Test(context.Background(), tk.Session(), rs) + require.NoError(t, err) + for _, row := range rows { + if row.GetString(2) == table && row.GetString(3) == tp { + return row.GetInt64(0) + } + } + require.FailNowf(t, "can't find %s table of %s", tp, table) + return -1 + } + + // recover table + tk.MustExec("create table t_recover1 (t timestamp) TTL=`t`+INTERVAL 1 DAY") + tk.MustExec("drop table t_recover1") + tk.MustExec("recover table t_recover1") + tk.MustQuery("show create table t_recover1").Check(testkit.Rows("t_recover1 CREATE TABLE `t_recover1` (\n `t` timestamp NULL DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`t` + INTERVAL 1 DAY */ /*T![ttl] TTL_ENABLE='OFF' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */")) + + // recover table with job id + tk.MustExec("create table t_recover2 (t timestamp) TTL=`t`+INTERVAL 1 DAY") + tk.MustExec("drop table t_recover2") + jobID := getDDLJobID("t_recover2", "drop table") + tk.MustExec(fmt.Sprintf("recover table BY JOB %d", jobID)) + tk.MustQuery("show create table t_recover2").Check(testkit.Rows("t_recover2 CREATE TABLE `t_recover2` (\n `t` timestamp NULL DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`t` + INTERVAL 1 DAY */ /*T![ttl] TTL_ENABLE='OFF' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */")) + + // flashback table + tk.MustExec("create table t_recover3 (t timestamp) TTL=`t`+INTERVAL 1 DAY") + tk.MustExec("drop table t_recover3") + tk.MustExec("flashback table t_recover3") + tk.MustQuery("show create table t_recover3").Check(testkit.Rows("t_recover3 CREATE TABLE `t_recover3` (\n `t` timestamp NULL DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`t` + INTERVAL 1 DAY */ /*T![ttl] TTL_ENABLE='OFF' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */")) + + // flashback database + tk.MustExec("create database if not exists test_recover2") + tk.MustExec("create table test_recover2.t1 (t timestamp) TTL=`t`+INTERVAL 1 DAY") + tk.MustExec("create table test_recover2.t2 (t timestamp) TTL=`t`+INTERVAL 1 DAY") + tk.MustExec("drop database test_recover2") + tk.MustExec("flashback database test_recover2") + tk.MustQuery("show create table test_recover2.t1").Check(testkit.Rows("t1 CREATE TABLE `t1` (\n `t` timestamp NULL DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`t` + INTERVAL 1 DAY */ /*T![ttl] TTL_ENABLE='OFF' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */")) + tk.MustQuery("show create table test_recover2.t2").Check(testkit.Rows("t2 CREATE TABLE `t2` (\n `t` timestamp NULL DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`t` + INTERVAL 1 DAY */ /*T![ttl] TTL_ENABLE='OFF' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */")) +} + func TestRecoverTableByJobID(t *testing.T) { store, _ := createMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) @@ -619,7 +685,7 @@ func TestRecoverTableByJobIDFail(t *testing.T) { tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) // set hook - hook := &ddl.TestDDLCallback{} + hook := &callback.TestDDLCallback{} hook.OnJobRunBeforeExported = func(job *model.Job) { if job.Type == model.ActionRecoverTable { require.NoError(t, failpoint.Enable("tikvclient/mockCommitError", `return(true)`)) @@ -678,7 +744,7 @@ func TestRecoverTableByTableNameFail(t *testing.T) { tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) // set hook - hook := &ddl.TestDDLCallback{} + hook := &callback.TestDDLCallback{} hook.OnJobRunBeforeExported = func(job *model.Job) { if job.Type == model.ActionRecoverTable { require.NoError(t, failpoint.Enable("tikvclient/mockCommitError", `return(true)`)) @@ -751,7 +817,7 @@ func TestCanceledJobTakeTime(t *testing.T) { tk.MustExec("use test") tk.MustExec("create table t_cjtt(a int)") - hook := &ddl.TestDDLCallback{} + hook := &callback.TestDDLCallback{} once := sync.Once{} hook.OnJobRunBeforeExported = func(job *model.Job) { once.Do(func() { diff --git a/ddl/split_region.go b/ddl/split_region.go index b201bf65538f3..ffbcb7439292d 100644 --- a/ddl/split_region.go +++ b/ddl/split_region.go @@ -31,7 +31,7 @@ import ( ) func splitPartitionTableRegion(ctx sessionctx.Context, store kv.SplittableStore, tbInfo *model.TableInfo, pi *model.PartitionInfo, scatter bool) { - // Max partition count is 4096, should we sample and just choose some of the partition to split? + // Max partition count is 8192, should we sample and just choose some partitions to split? regionIDs := make([]uint64, 0, len(pi.Definitions)) ctxWithTimeout, cancel := context.WithTimeout(context.Background(), ctx.GetSessionVars().GetSplitRegionTimeout()) defer cancel() diff --git a/ddl/stat.go b/ddl/stat.go index 24462f9bb141a..15be82d6719ae 100644 --- a/ddl/stat.go +++ b/ddl/stat.go @@ -15,6 +15,8 @@ package ddl import ( + "encoding/hex" + "github.com/pingcap/errors" "github.com/pingcap/tidb/sessionctx/variable" ) @@ -79,7 +81,7 @@ func (d *ddl) Stats(vars *variable.SessionVars) (map[string]interface{}, error) m[ddlJobSchemaID] = job.SchemaID m[ddlJobTableID] = job.TableID m[ddlJobSnapshotVer] = job.SnapshotVer - m[ddlJobReorgHandle] = tryDecodeToHandleString(ddlInfo.ReorgHandle) + m[ddlJobReorgHandle] = hex.EncodeToString(ddlInfo.ReorgHandle) m[ddlJobArgs] = job.Args return m, nil } diff --git a/ddl/stat_test.go b/ddl/stat_test.go index 67d64c7c6cfa5..4280c2254c40a 100644 --- a/ddl/stat_test.go +++ b/ddl/stat_test.go @@ -16,6 +16,7 @@ package ddl_test import ( "context" + "encoding/hex" "fmt" "strconv" "testing" @@ -24,15 +25,14 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/sessiontxn" + "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/types" "github.com/stretchr/testify/require" @@ -42,13 +42,14 @@ func TestDDLStatsInfo(t *testing.T) { store, domain := testkit.CreateMockStoreAndDomainWithSchemaLease(t, testLease) d := domain.DDL() + tk := testkit.NewTestKit(t, store) + ctx := tk.Session() dbInfo, err := testSchemaInfo(store, "test_stat") require.NoError(t, err) - testCreateSchema(t, testkit.NewTestKit(t, store).Session(), d, dbInfo) + testCreateSchema(t, ctx, d, dbInfo) tblInfo, err := testTableInfo(store, "t", 2) require.NoError(t, err) - testCreateTable(t, testkit.NewTestKit(t, store).Session(), d, dbInfo, tblInfo) - ctx := testkit.NewTestKit(t, store).Session() + testCreateTable(t, ctx, d, dbInfo, tblInfo) err = sessiontxn.NewTxn(context.Background(), ctx) require.NoError(t, err) @@ -60,7 +61,7 @@ func TestDDLStatsInfo(t *testing.T) { require.NoError(t, err) _, err = m.AddRecord(ctx, types.MakeDatums(3, 3)) require.NoError(t, err) - ctx.StmtCommit() + ctx.StmtCommit(context.Background()) require.NoError(t, ctx.CommitTxn(context.Background())) job := buildCreateIdxJob(dbInfo, tblInfo, true, "idx", "c1") @@ -89,7 +90,11 @@ func TestDDLStatsInfo(t *testing.T) { varMap, err := d.Stats(nil) wg.Done() require.NoError(t, err) - require.Equal(t, "1", varMap[ddlJobReorgHandle]) + key, err := hex.DecodeString(varMap[ddlJobReorgHandle].(string)) + require.NoError(t, err) + _, h, err := tablecodec.DecodeRecordKey(key) + require.NoError(t, err) + require.Equal(t, h.IntValue(), int64(1)) } } } @@ -145,20 +150,13 @@ func TestGetDDLInfo(t *testing.T) { } func addDDLJobs(sess session.Session, txn kv.Transaction, job *model.Job) error { - if variable.EnableConcurrentDDL.Load() { - b, err := job.Encode(true) - if err != nil { - return err - } - _, err = sess.Execute(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), fmt.Sprintf("insert into mysql.tidb_ddl_job(job_id, reorg, schema_ids, table_ids, job_meta, type, processing) values (%d, %t, %s, %s, %s, %d, %t)", - job.ID, job.MayNeedReorg(), strconv.Quote(strconv.FormatInt(job.SchemaID, 10)), strconv.Quote(strconv.FormatInt(job.TableID, 10)), wrapKey2String(b), job.Type, false)) + b, err := job.Encode(true) + if err != nil { return err } - m := meta.NewMeta(txn) - if job.MayNeedReorg() { - return m.EnQueueDDLJob(job, meta.AddIndexJobListKey) - } - return m.EnQueueDDLJob(job) + _, err = sess.Execute(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), fmt.Sprintf("insert into mysql.tidb_ddl_job(job_id, reorg, schema_ids, table_ids, job_meta, type, processing) values (%d, %t, %s, %s, %s, %d, %t)", + job.ID, job.MayNeedReorg(), strconv.Quote(strconv.FormatInt(job.SchemaID, 10)), strconv.Quote(strconv.FormatInt(job.TableID, 10)), wrapKey2String(b), job.Type, false)) + return err } func wrapKey2String(key []byte) string { diff --git a/ddl/syncer/BUILD.bazel b/ddl/syncer/BUILD.bazel index a608822051aaf..7c32da69cd5ce 100644 --- a/ddl/syncer/BUILD.bazel +++ b/ddl/syncer/BUILD.bazel @@ -22,6 +22,7 @@ go_library( go_test( name = "syncer_test", + timeout = "short", srcs = ["syncer_test.go"], flaky = True, deps = [ diff --git a/ddl/syncer/syncer.go b/ddl/syncer/syncer.go index ff7eaaa446893..e28d3d4954ca0 100644 --- a/ddl/syncer/syncer.go +++ b/ddl/syncer/syncer.go @@ -359,12 +359,6 @@ func (s *schemaVersionSyncer) OwnerCheckAllVersions(ctx context.Context, jobID i } if succ { - if variable.EnableMDL.Load() { - _, err = s.etcdCli.Delete(ctx, path, clientv3.WithPrefix()) - if err != nil { - logutil.BgLogger().Warn("[ddl] syncer delete versions failed", zap.Any("job id", jobID), zap.Error(err)) - } - } return nil } time.Sleep(checkVersInterval) diff --git a/ddl/table.go b/ddl/table.go index df329fd973c06..e867bd832c102 100644 --- a/ddl/table.go +++ b/ddl/table.go @@ -301,6 +301,7 @@ func onCreateView(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) if oldTbInfoID > 0 && orReplace { err = t.DropTableOrView(schemaID, oldTbInfoID) if err != nil { + job.State = model.JobStateCancelled return ver, errors.Trace(err) } err = t.GetAutoIDAccessors(schemaID, oldTbInfoID).Del() @@ -404,6 +405,11 @@ func (w *worker) onRecoverTable(d *ddlCtx, t *meta.Meta, job *model.Job) (ver in schemaID := recoverInfo.SchemaID tblInfo := recoverInfo.TableInfo + if tblInfo.TTLInfo != nil { + // force disable TTL job schedule for recovered table + tblInfo.TTLInfo.Enable = false + } + // check GC and safe point gcEnable, err := checkGCEnable(w) if err != nil { @@ -812,8 +818,8 @@ func onTruncateTable(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ erro return ver, nil } -func onRebaseRowIDType(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) { - return onRebaseAutoID(d, d.store, t, job, autoid.RowIDAllocType) +func onRebaseAutoIncrementIDType(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) { + return onRebaseAutoID(d, d.store, t, job, autoid.AutoIncrementType) } func onRebaseAutoRandomType(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) { @@ -862,7 +868,7 @@ func onRebaseAutoID(d *ddlCtx, store kv.Storage, t *meta.Meta, job *model.Job, t newBase = newBaseTemp } - if tp == autoid.RowIDAllocType { + if tp == autoid.AutoIncrementType { tblInfo.AutoIncID = newBase } else { tblInfo.AutoRandID = newBase @@ -1341,6 +1347,7 @@ func onUpdateFlashReplicaStatus(d *ddlCtx, t *meta.Meta, job *model.Job) (ver in newIDs = append(newIDs, tblInfo.TiFlashReplica.AvailablePartitionIDs[i+1:]...) tblInfo.TiFlashReplica.AvailablePartitionIDs = newIDs tblInfo.TiFlashReplica.Available = false + logutil.BgLogger().Info("TiFlash replica become unavailable", zap.Int64("tableID", tblInfo.ID), zap.Int64("partitionID", id)) break } } @@ -1350,6 +1357,9 @@ func onUpdateFlashReplicaStatus(d *ddlCtx, t *meta.Meta, job *model.Job) (ver in return ver, errors.Errorf("unknown physical ID %v in table %v", physicalID, tblInfo.Name.O) } + if tblInfo.TiFlashReplica.Available { + logutil.BgLogger().Info("TiFlash replica available", zap.Int64("tableID", tblInfo.ID)) + } ver, err = updateVersionAndTableInfo(d, t, job, tblInfo, true) if err != nil { return ver, errors.Trace(err) diff --git a/ddl/table_modify_test.go b/ddl/table_modify_test.go index f4b273771fd46..7f0b23e3fd894 100644 --- a/ddl/table_modify_test.go +++ b/ddl/table_modify_test.go @@ -20,6 +20,7 @@ import ( "time" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/infoschema" @@ -117,7 +118,6 @@ func TestLockTableReadOnly(t *testing.T) { tk1 := testkit.NewTestKit(t, store) tk2 := testkit.NewTestKit(t, store) tk1.MustExec("use test") - tk1.MustExec("set global tidb_enable_metadata_lock=0") tk2.MustExec("use test") tk1.MustExec("drop table if exists t1,t2") defer func() { @@ -162,17 +162,6 @@ func TestLockTableReadOnly(t *testing.T) { require.True(t, terror.ErrorEqual(tk2.ExecToErr("lock tables t1 write local"), infoschema.ErrTableLocked)) tk1.MustExec("admin cleanup table lock t1") tk2.MustExec("insert into t1 set a=1, b=2") - - tk1.MustExec("set tidb_enable_amend_pessimistic_txn = 1") - tk1.MustExec("begin pessimistic") - tk1.MustQuery("select * from t1 where a = 1").Check(testkit.Rows("1 2")) - tk2.MustExec("update t1 set b = 3") - tk2.MustExec("alter table t1 read only") - tk2.MustQuery("select * from t1 where a = 1").Check(testkit.Rows("1 3")) - tk1.MustQuery("select * from t1 where a = 1").Check(testkit.Rows("1 2")) - tk1.MustExec("update t1 set b = 4") - require.True(t, terror.ErrorEqual(tk1.ExecToErr("commit"), domain.ErrInfoSchemaChanged)) - tk2.MustExec("alter table t1 read write") } // TestConcurrentLockTables test concurrent lock/unlock tables. @@ -217,7 +206,7 @@ func TestConcurrentLockTables(t *testing.T) { } func testParallelExecSQL(t *testing.T, store kv.Storage, dom *domain.Domain, sql1, sql2 string, se1, se2 session.Session, f func(t *testing.T, err1, err2 error)) { - callback := &ddl.TestDDLCallback{} + callback := &callback.TestDDLCallback{} times := 0 callback.OnJobRunBeforeExported = func(job *model.Job) { if times != 0 { diff --git a/ddl/table_test.go b/ddl/table_test.go index a9320e01cc781..cf7fdbf1cd7af 100644 --- a/ddl/table_test.go +++ b/ddl/table_test.go @@ -24,7 +24,9 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/meta/autoid" + "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessiontxn" "github.com/pingcap/tidb/table" @@ -158,7 +160,7 @@ func testGetTableWithError(store kv.Storage, schemaID, tableID int64) (table.Tab return nil, errors.New("table not found") } alloc := autoid.NewAllocator(store, schemaID, tblInfo.ID, false, autoid.RowIDAllocType) - tbl, err := table.TableFromMeta(autoid.NewAllocators(alloc), tblInfo) + tbl, err := table.TableFromMeta(autoid.NewAllocators(false, alloc), tblInfo) if err != nil { return nil, errors.Trace(err) } @@ -235,6 +237,79 @@ func TestTable(t *testing.T) { testDropSchema(t, testkit.NewTestKit(t, store).Session(), d, dbInfo) } +func TestCreateView(t *testing.T) { + store, domain := testkit.CreateMockStoreAndDomainWithSchemaLease(t, testLease) + + d := domain.DDL() + dbInfo, err := testSchemaInfo(store, "test_table") + require.NoError(t, err) + testCreateSchema(t, testkit.NewTestKit(t, store).Session(), domain.DDL(), dbInfo) + + ctx := testkit.NewTestKit(t, store).Session() + + tblInfo, err := testTableInfo(store, "t", 3) + require.NoError(t, err) + job := testCreateTable(t, ctx, d, dbInfo, tblInfo) + testCheckTableState(t, store, dbInfo, tblInfo, model.StatePublic) + testCheckJobDone(t, store, job.ID, true) + + // Create a view + newTblInfo0, err := testTableInfo(store, "v", 3) + require.NoError(t, err) + job = &model.Job{ + SchemaID: dbInfo.ID, + TableID: tblInfo.ID, + Type: model.ActionCreateView, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{newTblInfo0}, + } + ctx.SetValue(sessionctx.QueryString, "skip") + err = d.DoDDLJob(ctx, job) + require.NoError(t, err) + + v := getSchemaVer(t, ctx) + tblInfo.State = model.StatePublic + checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: newTblInfo0}) + tblInfo.State = model.StateNone + testCheckTableState(t, store, dbInfo, tblInfo, model.StatePublic) + testCheckJobDone(t, store, job.ID, true) + + // Replace a view + newTblInfo1, err := testTableInfo(store, "v", 3) + require.NoError(t, err) + job = &model.Job{ + SchemaID: dbInfo.ID, + TableID: tblInfo.ID, + Type: model.ActionCreateView, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{newTblInfo1, true, newTblInfo0.ID}, + } + ctx.SetValue(sessionctx.QueryString, "skip") + err = d.DoDDLJob(ctx, job) + require.NoError(t, err) + + v = getSchemaVer(t, ctx) + tblInfo.State = model.StatePublic + checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: newTblInfo1}) + tblInfo.State = model.StateNone + testCheckTableState(t, store, dbInfo, tblInfo, model.StatePublic) + testCheckJobDone(t, store, job.ID, true) + + // Replace a view with a non-existing table id + newTblInfo2, err := testTableInfo(store, "v", 3) + require.NoError(t, err) + job = &model.Job{ + SchemaID: dbInfo.ID, + TableID: tblInfo.ID, + Type: model.ActionCreateView, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{newTblInfo2, true, newTblInfo0.ID}, + } + ctx.SetValue(sessionctx.QueryString, "skip") + err = d.DoDDLJob(ctx, job) + require.Error(t, err) +} + func checkTableCacheTest(t *testing.T, store kv.Storage, dbInfo *model.DBInfo, tblInfo *model.TableInfo) { ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL) require.NoError(t, kv.RunInNewTxn(ctx, store, false, func(ctx context.Context, txn kv.Transaction) error { @@ -371,3 +446,82 @@ func TestCreateTables(t *testing.T) { testGetTable(t, domain, genIDs[1]) testGetTable(t, domain, genIDs[2]) } + +func TestAlterTTL(t *testing.T) { + store, domain := testkit.CreateMockStoreAndDomainWithSchemaLease(t, testLease) + + d := domain.DDL() + + dbInfo, err := testSchemaInfo(store, "test_table") + require.NoError(t, err) + testCreateSchema(t, testkit.NewTestKit(t, store).Session(), d, dbInfo) + + ctx := testkit.NewTestKit(t, store).Session() + + // initialize a table with ttlInfo + tableName := "t" + tblInfo, err := testTableInfo(store, tableName, 2) + require.NoError(t, err) + tblInfo.Columns[0].FieldType = *types.NewFieldType(mysql.TypeDatetime) + tblInfo.Columns[1].FieldType = *types.NewFieldType(mysql.TypeDatetime) + tblInfo.TTLInfo = &model.TTLInfo{ + ColumnName: tblInfo.Columns[0].Name, + IntervalExprStr: "5", + IntervalTimeUnit: int(ast.TimeUnitDay), + } + + // create table + job := testCreateTable(t, ctx, d, dbInfo, tblInfo) + testCheckTableState(t, store, dbInfo, tblInfo, model.StatePublic) + testCheckJobDone(t, store, job.ID, true) + + // submit ddl job to modify ttlInfo + tableInfoAfterAlterTTLInfo := tblInfo.Clone() + require.NoError(t, err) + tableInfoAfterAlterTTLInfo.TTLInfo = &model.TTLInfo{ + ColumnName: tblInfo.Columns[1].Name, + IntervalExprStr: "1", + IntervalTimeUnit: int(ast.TimeUnitYear), + } + + job = &model.Job{ + SchemaID: dbInfo.ID, + TableID: tblInfo.ID, + Type: model.ActionAlterTTLInfo, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{&model.TTLInfo{ + ColumnName: tblInfo.Columns[1].Name, + IntervalExprStr: "1", + IntervalTimeUnit: int(ast.TimeUnitYear), + }}, + } + ctx.SetValue(sessionctx.QueryString, "skip") + require.NoError(t, d.DoDDLJob(ctx, job)) + + v := getSchemaVer(t, ctx) + checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: nil}) + + // assert the ddlInfo as expected + historyJob, err := ddl.GetHistoryJobByID(testkit.NewTestKit(t, store).Session(), job.ID) + require.NoError(t, err) + require.Equal(t, tableInfoAfterAlterTTLInfo.TTLInfo, historyJob.BinlogInfo.TableInfo.TTLInfo) + + // submit a ddl job to modify ttlEnabled + job = &model.Job{ + SchemaID: dbInfo.ID, + TableID: tblInfo.ID, + Type: model.ActionAlterTTLRemove, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{true}, + } + ctx.SetValue(sessionctx.QueryString, "skip") + require.NoError(t, d.DoDDLJob(ctx, job)) + + v = getSchemaVer(t, ctx) + checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: nil}) + + // assert the ddlInfo as expected + historyJob, err = ddl.GetHistoryJobByID(testkit.NewTestKit(t, store).Session(), job.ID) + require.NoError(t, err) + require.Empty(t, historyJob.BinlogInfo.TableInfo.TTLInfo) +} diff --git a/ddl/testutil/BUILD.bazel b/ddl/testutil/BUILD.bazel index 3562ca3b34571..052a747f427ba 100644 --- a/ddl/testutil/BUILD.bazel +++ b/ddl/testutil/BUILD.bazel @@ -14,6 +14,8 @@ go_library( "//table", "//table/tables", "//types", + "//util/logutil", "@com_github_pingcap_errors//:errors", + "@org_uber_go_zap//:zap", ], ) diff --git a/ddl/testutil/testutil.go b/ddl/testutil/testutil.go index 642579ba00ea7..52adf6b750f73 100644 --- a/ddl/testutil/testutil.go +++ b/ddl/testutil/testutil.go @@ -26,6 +26,8 @@ import ( "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" ) // SessionExecInGoroutine export for testing. @@ -82,3 +84,13 @@ func ExtractAllTableHandles(se session.Session, dbName, tbName string) ([]int64, }) return allHandles, err } + +// FindIdxInfo is to get IndexInfo by index name. +func FindIdxInfo(dom *domain.Domain, dbName, tbName, idxName string) *model.IndexInfo { + tbl, err := dom.InfoSchema().TableByName(model.NewCIStr(dbName), model.NewCIStr(tbName)) + if err != nil { + logutil.BgLogger().Warn("cannot find table", zap.String("dbName", dbName), zap.String("tbName", tbName)) + return nil + } + return tbl.Meta().FindIndexByName(idxName) +} diff --git a/ddl/tiflash_replica_test.go b/ddl/tiflash_replica_test.go index 874ab05359d3b..abd7275e4669b 100644 --- a/ddl/tiflash_replica_test.go +++ b/ddl/tiflash_replica_test.go @@ -26,7 +26,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" - "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/internal/callback" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" @@ -286,7 +286,7 @@ func TestCreateTableWithLike2(t *testing.T) { tbl1 := external.GetTableByName(t, tk, "test", "t1") doneCh := make(chan error, 2) - hook := &ddl.TestDDLCallback{Do: dom} + hook := &callback.TestDDLCallback{Do: dom} var onceChecker sync.Map hook.OnJobRunBeforeExported = func(job *model.Job) { if job.Type != model.ActionAddColumn && job.Type != model.ActionDropColumn && @@ -303,7 +303,7 @@ func TestCreateTableWithLike2(t *testing.T) { } onceChecker.Store(job.ID, true) - go backgroundExec(store, "create table t2 like t1", doneCh) + go backgroundExec(store, "test", "create table t2 like t1", doneCh) } } originalHook := dom.DDL().GetHook() diff --git a/ddl/tiflashtest/BUILD.bazel b/ddl/tiflashtest/BUILD.bazel new file mode 100644 index 0000000000000..4e24ea074d7f4 --- /dev/null +++ b/ddl/tiflashtest/BUILD.bazel @@ -0,0 +1,38 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_test") + +go_test( + name = "tiflashtest_test", + timeout = "short", + srcs = [ + "ddl_tiflash_test.go", + "main_test.go", + ], + flaky = True, + shard_count = 30, + deps = [ + "//config", + "//ddl", + "//ddl/placement", + "//ddl/util", + "//domain", + "//domain/infosync", + "//kv", + "//parser/model", + "//session", + "//store/gcworker", + "//store/mockstore", + "//store/mockstore/unistore", + "//table", + "//testkit", + "//testkit/testsetup", + "//util", + "//util/logutil", + "@com_github_pingcap_failpoint//:failpoint", + "@com_github_pingcap_kvproto//pkg/metapb", + "@com_github_stretchr_testify//require", + "@com_github_tikv_client_go_v2//oracle", + "@com_github_tikv_client_go_v2//testutils", + "@org_uber_go_goleak//:goleak", + "@org_uber_go_zap//:zap", + ], +) diff --git a/ddl/ddl_tiflash_test.go b/ddl/tiflashtest/ddl_tiflash_test.go similarity index 91% rename from ddl/ddl_tiflash_test.go rename to ddl/tiflashtest/ddl_tiflash_test.go index 27d05112df483..6526dbc01553d 100644 --- a/ddl/ddl_tiflash_test.go +++ b/ddl/tiflashtest/ddl_tiflash_test.go @@ -16,7 +16,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSES/QL-LICENSE file. -package ddl_test +package tiflashtest import ( "context" @@ -45,6 +45,7 @@ import ( "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/logutil" "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/oracle" "github.com/tikv/client-go/v2/testutils" "go.uber.org/zap" ) @@ -126,10 +127,6 @@ func ChangeGCSafePoint(tk *testkit.TestKit, t time.Time, enable string, lifeTime tk.MustExec(s) } -func CheckPlacementRule(tiflash *infosync.MockTiFlash, rule placement.TiFlashRule) bool { - return tiflash.CheckPlacementRule(rule) -} - func (s *tiflashContext) CheckFlashback(tk *testkit.TestKit, t *testing.T) { // If table is dropped after tikv_gc_safe_point, it can be recovered ChangeGCSafePoint(tk, time.Now().Add(-time.Hour), "false", "10m0s") @@ -442,6 +439,41 @@ func TestTiFlashDropPartition(t *testing.T) { CheckTableAvailableWithTableName(s.dom, t, 1, []string{}, "test", "ddltiflash") } +func TestTiFlashFlashbackCluster(t *testing.T) { + s, teardown := createTiFlashContext(t) + defer teardown() + tk := testkit.NewTestKit(t, s.store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int)") + tk.MustExec("insert into t values (1), (2), (3)") + + ts, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) + require.NoError(t, err) + + tk.MustExec("alter table t set tiflash replica 1") + time.Sleep(ddl.PollTiFlashInterval * RoundToBeAvailable) + CheckTableAvailableWithTableName(s.dom, t, 1, []string{}, "test", "t") + + injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(10 * time.Second)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockFlashbackTest", `return(true)`)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", + fmt.Sprintf("return(%v)", injectSafeTS))) + + ChangeGCSafePoint(tk, time.Now().Add(-10*time.Second), "true", "10m0s") + defer func() { + ChangeGCSafePoint(tk, time.Now(), "true", "10m0s") + }() + + errorMsg := fmt.Sprintf("[ddl:-1]Detected unsupported DDL job type(%s) during [%s, now), can't do flashback", + model.ActionSetTiFlashReplica.String(), oracle.GetTimeFromTS(ts).String()) + tk.MustGetErrMsg(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts)), errorMsg) + + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockFlashbackTest")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) +} + func CheckTableAvailableWithTableName(dom *domain.Domain, t *testing.T, count uint64, labels []string, db string, table string) { tb, err := dom.InfoSchema().TableByName(model.NewCIStr(db), model.NewCIStr(table)) require.NoError(t, err) @@ -524,7 +556,7 @@ func TestSetPlacementRuleNormal(t *testing.T) { tb, err := s.dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("ddltiflash")) require.NoError(t, err) expectRule := infosync.MakeNewRule(tb.Meta().ID, 1, []string{"a", "b"}) - res := CheckPlacementRule(s.tiflash, *expectRule) + res := s.tiflash.CheckPlacementRule(*expectRule) require.True(t, res) // Set lastSafePoint to a timepoint in future, so all dropped table can be reckon as gc-ed. @@ -536,7 +568,7 @@ func TestSetPlacementRuleNormal(t *testing.T) { defer fCancelPD() tk.MustExec("drop table ddltiflash") expectRule = infosync.MakeNewRule(tb.Meta().ID, 1, []string{"a", "b"}) - res = CheckPlacementRule(s.tiflash, *expectRule) + res = s.tiflash.CheckPlacementRule(*expectRule) require.True(t, res) } @@ -580,7 +612,7 @@ func TestSetPlacementRuleWithGCWorker(t *testing.T) { require.NoError(t, err) expectRule := infosync.MakeNewRule(tb.Meta().ID, 1, []string{"a", "b"}) - res := CheckPlacementRule(s.tiflash, *expectRule) + res := s.tiflash.CheckPlacementRule(*expectRule) require.True(t, res) ChangeGCSafePoint(tk, time.Now().Add(-time.Hour), "true", "10m0s") @@ -590,7 +622,7 @@ func TestSetPlacementRuleWithGCWorker(t *testing.T) { // Wait GC time.Sleep(ddl.PollTiFlashInterval * RoundToBeAvailable) - res = CheckPlacementRule(s.tiflash, *expectRule) + res = s.tiflash.CheckPlacementRule(*expectRule) require.False(t, res) } @@ -611,7 +643,7 @@ func TestSetPlacementRuleFail(t *testing.T) { require.NoError(t, err) expectRule := infosync.MakeNewRule(tb.Meta().ID, 1, []string{}) - res := CheckPlacementRule(s.tiflash, *expectRule) + res := s.tiflash.CheckPlacementRule(*expectRule) require.False(t, res) } @@ -1264,3 +1296,58 @@ func TestTiFlashPartitionNotAvailable(t *testing.T) { require.NotNil(t, replica) require.True(t, replica.Available) } + +func TestTiFlashAvailableAfterAddPartition(t *testing.T) { + s, teardown := createTiFlashContext(t) + defer teardown() + tk := testkit.NewTestKit(t, s.store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists ddltiflash") + tk.MustExec("create table ddltiflash(z int) PARTITION BY RANGE(z) (PARTITION p0 VALUES LESS THAN (10))") + tk.MustExec("alter table ddltiflash set tiflash replica 1") + time.Sleep(ddl.PollTiFlashInterval * RoundToBeAvailable * 3) + CheckTableAvailable(s.dom, t, 1, []string{}) + + tb, err := s.dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("ddltiflash")) + require.NoError(t, err) + require.NotNil(t, tb) + + // still available after adding partition. + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/sleepBeforeReplicaOnly", `return(2)`)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/waitForAddPartition", `return(3)`)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/PollTiFlashReplicaStatusReplaceCurAvailableValue", `return(false)`)) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/sleepBeforeReplicaOnly")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/waitForAddPartition")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/PollTiFlashReplicaStatusReplaceCurAvailableValue")) + }() + tk.MustExec("ALTER TABLE ddltiflash ADD PARTITION (PARTITION pn VALUES LESS THAN (20))") + time.Sleep(ddl.PollTiFlashInterval * RoundToBeAvailable * 3) + CheckTableAvailable(s.dom, t, 1, []string{}) + tb, err = s.dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("ddltiflash")) + require.NoError(t, err) + pi := tb.Meta().GetPartitionInfo() + require.NotNil(t, pi) + require.Equal(t, len(pi.Definitions), 2) +} + +func TestTiFlashAvailableAfterDownOneStore(t *testing.T) { + s, teardown := createTiFlashContext(t) + defer teardown() + tk := testkit.NewTestKit(t, s.store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists ddltiflash") + tk.MustExec("create table ddltiflash(z int) PARTITION BY RANGE(z) (PARTITION p0 VALUES LESS THAN (10))") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/OneTiFlashStoreDown", `return`)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/domain/infosync/OneTiFlashStoreDown", `return`)) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/OneTiFlashStoreDown")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/domain/infosync/OneTiFlashStoreDown")) + }() + + tk.MustExec("alter table ddltiflash set tiflash replica 1") + time.Sleep(ddl.PollTiFlashInterval * RoundToBeAvailable * 3) + CheckTableAvailable(s.dom, t, 1, []string{}) +} diff --git a/ddl/concurrentddltest/main_test.go b/ddl/tiflashtest/main_test.go similarity index 88% rename from ddl/concurrentddltest/main_test.go rename to ddl/tiflashtest/main_test.go index 4ab7e96eab2ae..68063ce27071b 100644 --- a/ddl/concurrentddltest/main_test.go +++ b/ddl/tiflashtest/main_test.go @@ -12,7 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -package concurrentddltest +// 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. + +package tiflashtest import ( "testing" diff --git a/ddl/ttl.go b/ddl/ttl.go new file mode 100644 index 0000000000000..58011ee9e79f9 --- /dev/null +++ b/ddl/ttl.go @@ -0,0 +1,234 @@ +// 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, +// 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 ddl + +import ( + "fmt" + "strings" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/meta" + "github.com/pingcap/tidb/parser" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/format" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessiontxn" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/dbterror" +) + +func onTTLInfoRemove(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, err error) { + tblInfo, err := GetTableInfoAndCancelFaultJob(t, job, job.SchemaID) + if err != nil { + return ver, errors.Trace(err) + } + + tblInfo.TTLInfo = nil + ver, err = updateVersionAndTableInfo(d, t, job, tblInfo, true) + if err != nil { + return ver, errors.Trace(err) + } + job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tblInfo) + return ver, nil +} + +func onTTLInfoChange(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, err error) { + // at least one for them is not nil + var ttlInfo *model.TTLInfo + var ttlInfoEnable *bool + var ttlInfoJobInterval *string + + if err := job.DecodeArgs(&ttlInfo, &ttlInfoEnable, &ttlInfoJobInterval); err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + + tblInfo, err := GetTableInfoAndCancelFaultJob(t, job, job.SchemaID) + if err != nil { + return ver, errors.Trace(err) + } + + if ttlInfo != nil { + // if the TTL_ENABLE is not set explicitly, use the original value + if ttlInfoEnable == nil && tblInfo.TTLInfo != nil { + ttlInfo.Enable = tblInfo.TTLInfo.Enable + } + if ttlInfoJobInterval == nil && tblInfo.TTLInfo != nil { + ttlInfo.JobInterval = tblInfo.TTLInfo.JobInterval + } + tblInfo.TTLInfo = ttlInfo + } + if ttlInfoEnable != nil { + if tblInfo.TTLInfo == nil { + return ver, errors.Trace(dbterror.ErrSetTTLOptionForNonTTLTable.FastGenByArgs("TTL_ENABLE")) + } + + tblInfo.TTLInfo.Enable = *ttlInfoEnable + } + if ttlInfoJobInterval != nil { + if tblInfo.TTLInfo == nil { + return ver, errors.Trace(dbterror.ErrSetTTLOptionForNonTTLTable.FastGenByArgs("TTL_JOB_INTERVAL")) + } + + tblInfo.TTLInfo.JobInterval = *ttlInfoJobInterval + } + + ver, err = updateVersionAndTableInfo(d, t, job, tblInfo, true) + if err != nil { + return ver, errors.Trace(err) + } + job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tblInfo) + return ver, nil +} + +func checkTTLInfoValid(ctx sessionctx.Context, schema model.CIStr, tblInfo *model.TableInfo) error { + if err := checkTTLIntervalExpr(ctx, tblInfo.TTLInfo); err != nil { + return err + } + + if err := checkTTLTableSuitable(ctx, schema, tblInfo); err != nil { + return err + } + + return checkTTLInfoColumnType(tblInfo) +} + +func checkTTLIntervalExpr(ctx sessionctx.Context, ttlInfo *model.TTLInfo) error { + // FIXME: use a better way to validate the interval expression in ttl + var nowAddIntervalExpr ast.ExprNode + + unit := ast.TimeUnitType(ttlInfo.IntervalTimeUnit) + expr := fmt.Sprintf("select NOW() + INTERVAL %s %s", ttlInfo.IntervalExprStr, unit.String()) + stmts, _, err := parser.New().ParseSQL(expr) + if err != nil { + // FIXME: the error information can be wrong, as it could indicate an unknown position to user. + return errors.Trace(err) + } + nowAddIntervalExpr = stmts[0].(*ast.SelectStmt).Fields.Fields[0].Expr + _, err = expression.EvalAstExpr(ctx, nowAddIntervalExpr) + return err +} + +func checkTTLInfoColumnType(tblInfo *model.TableInfo) error { + colInfo := findColumnByName(tblInfo.TTLInfo.ColumnName.L, tblInfo) + if colInfo == nil { + return dbterror.ErrBadField.GenWithStackByArgs(tblInfo.TTLInfo.ColumnName.O, "TTL config") + } + if !types.IsTypeTime(colInfo.FieldType.GetType()) { + return dbterror.ErrUnsupportedColumnInTTLConfig.GenWithStackByArgs(tblInfo.TTLInfo.ColumnName.O) + } + + return nil +} + +// checkTTLTableSuitable returns whether this table is suitable to be a TTL table +// A temporary table or a parent table referenced by a foreign key cannot be TTL table +func checkTTLTableSuitable(ctx sessionctx.Context, schema model.CIStr, tblInfo *model.TableInfo) error { + if tblInfo.TempTableType != model.TempTableNone { + return dbterror.ErrTempTableNotAllowedWithTTL + } + + if err := checkPrimaryKeyForTTLTable(tblInfo); err != nil { + return err + } + + // checks even when the foreign key check is not enabled, to keep safe + is := sessiontxn.GetTxnManager(ctx).GetTxnInfoSchema() + if referredFK := checkTableHasForeignKeyReferred(is, schema.L, tblInfo.Name.L, nil, true); referredFK != nil { + return dbterror.ErrUnsupportedTTLReferencedByFK + } + + return nil +} + +func checkDropColumnWithTTLConfig(tblInfo *model.TableInfo, colName string) error { + if tblInfo.TTLInfo != nil { + if tblInfo.TTLInfo.ColumnName.L == colName { + return dbterror.ErrTTLColumnCannotDrop.GenWithStackByArgs(colName) + } + } + + return nil +} + +// We should forbid creating a TTL table with clustered primary key that contains a column with type float/double. +// This is because currently we are using SQL to delete expired rows and when the primary key contains float/double column, +// it is hard to use condition `WHERE PK in (...)` to delete specified rows because some precision will be lost when comparing. +func checkPrimaryKeyForTTLTable(tblInfo *model.TableInfo) error { + if !tblInfo.IsCommonHandle { + // only check the primary keys when it is common handle + return nil + } + + pk := tblInfo.GetPrimaryKey() + if pk == nil { + return nil + } + + for _, colDef := range pk.Columns { + col := tblInfo.Columns[colDef.Offset] + switch col.GetType() { + case mysql.TypeFloat, mysql.TypeDouble: + return dbterror.ErrUnsupportedPrimaryKeyTypeWithTTL + } + } + + return nil +} + +// getTTLInfoInOptions returns the aggregated ttlInfo, the ttlEnable, or an error. +// if TTL, TTL_ENABLE or TTL_JOB_INTERVAL is not set in the config, the corresponding return value will be nil. +// if both of TTL and TTL_ENABLE are set, the `ttlInfo.Enable` will be equal with `ttlEnable`. +// if both of TTL and TTL_JOB_INTERVAL are set, the `ttlInfo.JobInterval` will be equal with `ttlCronJobSchedule`. +func getTTLInfoInOptions(options []*ast.TableOption) (ttlInfo *model.TTLInfo, ttlEnable *bool, ttlCronJobSchedule *string, err error) { + for _, op := range options { + switch op.Tp { + case ast.TableOptionTTL: + var sb strings.Builder + restoreFlags := format.RestoreStringSingleQuotes | format.RestoreNameBackQuotes + restoreCtx := format.NewRestoreCtx(restoreFlags, &sb) + err := op.Value.Restore(restoreCtx) + if err != nil { + return nil, nil, nil, err + } + + intervalExpr := sb.String() + ttlInfo = &model.TTLInfo{ + ColumnName: op.ColumnName.Name, + IntervalExprStr: intervalExpr, + IntervalTimeUnit: int(op.TimeUnitValue.Unit), + Enable: true, + JobInterval: "1h", + } + case ast.TableOptionTTLEnable: + ttlEnable = &op.BoolValue + case ast.TableOptionTTLJobInterval: + ttlCronJobSchedule = &op.StrValue + } + } + + if ttlInfo != nil { + if ttlEnable != nil { + ttlInfo.Enable = *ttlEnable + } + if ttlCronJobSchedule != nil { + ttlInfo.JobInterval = *ttlCronJobSchedule + } + } + return ttlInfo, ttlEnable, ttlCronJobSchedule, nil +} diff --git a/ddl/ttl_test.go b/ddl/ttl_test.go new file mode 100644 index 0000000000000..fafc9e240a710 --- /dev/null +++ b/ddl/ttl_test.go @@ -0,0 +1,150 @@ +// 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, +// 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 ddl + +import ( + "testing" + + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/model" + "github.com/stretchr/testify/assert" +) + +func Test_getTTLInfoInOptions(t *testing.T) { + falseValue := false + trueValue := true + twentyFourHours := "24h" + + cases := []struct { + options []*ast.TableOption + ttlInfo *model.TTLInfo + ttlEnable *bool + ttlCronJobSchedule *string + err error + }{ + { + []*ast.TableOption{}, + nil, + nil, + nil, + nil, + }, + { + []*ast.TableOption{ + { + Tp: ast.TableOptionTTL, + ColumnName: &ast.ColumnName{Name: model.NewCIStr("test_column")}, + Value: ast.NewValueExpr(5, "", ""), + TimeUnitValue: &ast.TimeUnitExpr{Unit: ast.TimeUnitYear}, + }, + }, + &model.TTLInfo{ + ColumnName: model.NewCIStr("test_column"), + IntervalExprStr: "5", + IntervalTimeUnit: int(ast.TimeUnitYear), + Enable: true, + JobInterval: "1h", + }, + nil, + nil, + nil, + }, + { + []*ast.TableOption{ + { + Tp: ast.TableOptionTTLEnable, + BoolValue: false, + }, + { + Tp: ast.TableOptionTTL, + ColumnName: &ast.ColumnName{Name: model.NewCIStr("test_column")}, + Value: ast.NewValueExpr(5, "", ""), + TimeUnitValue: &ast.TimeUnitExpr{Unit: ast.TimeUnitYear}, + }, + }, + &model.TTLInfo{ + ColumnName: model.NewCIStr("test_column"), + IntervalExprStr: "5", + IntervalTimeUnit: int(ast.TimeUnitYear), + Enable: false, + JobInterval: "1h", + }, + &falseValue, + nil, + nil, + }, + { + []*ast.TableOption{ + { + Tp: ast.TableOptionTTLEnable, + BoolValue: false, + }, + { + Tp: ast.TableOptionTTL, + ColumnName: &ast.ColumnName{Name: model.NewCIStr("test_column")}, + Value: ast.NewValueExpr(5, "", ""), + TimeUnitValue: &ast.TimeUnitExpr{Unit: ast.TimeUnitYear}, + }, + { + Tp: ast.TableOptionTTLEnable, + BoolValue: true, + }, + }, + &model.TTLInfo{ + ColumnName: model.NewCIStr("test_column"), + IntervalExprStr: "5", + IntervalTimeUnit: int(ast.TimeUnitYear), + Enable: true, + JobInterval: "1h", + }, + &trueValue, + nil, + nil, + }, + { + []*ast.TableOption{ + { + Tp: ast.TableOptionTTL, + ColumnName: &ast.ColumnName{Name: model.NewCIStr("test_column")}, + Value: ast.NewValueExpr(5, "", ""), + TimeUnitValue: &ast.TimeUnitExpr{Unit: ast.TimeUnitYear}, + }, + { + Tp: ast.TableOptionTTLJobInterval, + StrValue: "24h", + }, + }, + &model.TTLInfo{ + ColumnName: model.NewCIStr("test_column"), + IntervalExprStr: "5", + IntervalTimeUnit: int(ast.TimeUnitYear), + Enable: true, + JobInterval: "24h", + }, + nil, + &twentyFourHours, + nil, + }, + } + + for _, c := range cases { + ttlInfo, ttlEnable, ttlCronJobSchedule, err := getTTLInfoInOptions(c.options) + + assert.Equal(t, c.ttlInfo, ttlInfo) + assert.Equal(t, c.ttlEnable, ttlEnable) + assert.Equal(t, c.ttlCronJobSchedule, ttlCronJobSchedule) + assert.Equal(t, c.err, err) + } +} diff --git a/distsql/BUILD.bazel b/distsql/BUILD.bazel index 5839f55fbc52c..cb9bbc63dd524 100644 --- a/distsql/BUILD.bazel +++ b/distsql/BUILD.bazel @@ -34,8 +34,8 @@ go_library( "//util/logutil", "//util/memory", "//util/ranger", + "//util/tracing", "//util/trxevents", - "@com_github_opentracing_opentracing_go//:opentracing-go", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/metapb", @@ -64,6 +64,7 @@ go_test( embed = [":distsql"], flaky = True, race = "on", + shard_count = 2, deps = [ "//kv", "//parser/charset", diff --git a/distsql/distsql.go b/distsql/distsql.go index 1f18d084eb0b2..defbeb85ae74f 100644 --- a/distsql/distsql.go +++ b/distsql/distsql.go @@ -19,7 +19,6 @@ import ( "strconv" "unsafe" - "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" @@ -30,6 +29,8 @@ import ( "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/memory" + "github.com/pingcap/tidb/util/tracing" "github.com/pingcap/tidb/util/trxevents" "github.com/pingcap/tipb/go-tipb" "github.com/tikv/client-go/v2/tikvrpc/interceptor" @@ -38,11 +39,11 @@ import ( ) // DispatchMPPTasks dispatches all tasks and returns an iterator. -func DispatchMPPTasks(ctx context.Context, sctx sessionctx.Context, tasks []*kv.MPPDispatchRequest, fieldTypes []*types.FieldType, planIDs []int, rootID int, startTs uint64) (SelectResult, error) { +func DispatchMPPTasks(ctx context.Context, sctx sessionctx.Context, tasks []*kv.MPPDispatchRequest, fieldTypes []*types.FieldType, planIDs []int, rootID int, startTs uint64, mppQueryID kv.MPPQueryID, memTracker *memory.Tracker) (SelectResult, error) { ctx = WithSQLKvExecCounterInterceptor(ctx, sctx.GetSessionVars().StmtCtx) _, allowTiFlashFallback := sctx.GetSessionVars().AllowFallbackToTiKV[kv.TiFlash] ctx = SetTiFlashMaxThreadsInContext(ctx, sctx) - resp := sctx.GetMPPClient().DispatchMPPTasks(ctx, sctx.GetSessionVars().KVVars, tasks, allowTiFlashFallback, startTs) + resp := sctx.GetMPPClient().DispatchMPPTasks(ctx, sctx.GetSessionVars().KVVars, tasks, allowTiFlashFallback, startTs, mppQueryID, sctx.GetSessionVars().ChooseMppVersion(), memTracker) if resp == nil { return nil, errors.New("client returns nil response") } @@ -63,11 +64,8 @@ func DispatchMPPTasks(ctx context.Context, sctx sessionctx.Context, tasks []*kv. // Select sends a DAG request, returns SelectResult. // In kvReq, KeyRanges is required, Concurrency/KeepOrder/Desc/IsolationLevel/Priority are optional. func Select(ctx context.Context, sctx sessionctx.Context, kvReq *kv.Request, fieldTypes []*types.FieldType, fb *statistics.QueryFeedback) (SelectResult, error) { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("distsql.Select", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } + r, ctx := tracing.StartRegionEx(ctx, "distsql.Select") + defer r.End() // For testing purpose. if hook := ctx.Value("CheckSelectRequestHook"); hook != nil { diff --git a/distsql/distsql_test.go b/distsql/distsql_test.go index 52aa62ba112fa..d7a2447cf35b6 100644 --- a/distsql/distsql_test.go +++ b/distsql/distsql_test.go @@ -107,7 +107,8 @@ func TestSelectWithRuntimeStats(t *testing.T) { } func TestSelectResultRuntimeStats(t *testing.T) { - basic := &execdetails.BasicRuntimeStats{} + stmtStats := execdetails.NewRuntimeStatsColl(nil) + basic := stmtStats.GetBasicRuntimeStats(1) basic.Record(time.Second, 20) s1 := &selectResultRuntimeStats{ copRespTime: []time.Duration{time.Second, time.Millisecond}, @@ -120,12 +121,10 @@ func TestSelectResultRuntimeStats(t *testing.T) { } s2 := *s1 - stmtStats := execdetails.NewRuntimeStatsColl(nil) - stmtStats.RegisterStats(1, basic) stmtStats.RegisterStats(1, s1) stmtStats.RegisterStats(1, &s2) stats := stmtStats.GetRootStats(1) - expect := "time:1s, loops:1, cop_task: {num: 4, max: 1s, min: 1ms, avg: 500.5ms, p95: 1s, max_proc_keys: 200, p95_proc_keys: 200, tot_proc: 2s, tot_wait: 2s, copr_cache_hit_ratio: 0.00, distsql_concurrency: 15}, backoff{RegionMiss: 2ms}" + expect := "time:1s, loops:1, cop_task: {num: 4, max: 1s, min: 1ms, avg: 500.5ms, p95: 1s, max_proc_keys: 200, p95_proc_keys: 200, tot_proc: 2s, tot_wait: 2s, copr_cache_hit_ratio: 0.00, max_distsql_concurrency: 15}, backoff{RegionMiss: 2ms}" require.Equal(t, expect, stats.String()) // Test for idempotence. require.Equal(t, expect, stats.String()) @@ -136,7 +135,7 @@ func TestSelectResultRuntimeStats(t *testing.T) { } stmtStats.RegisterStats(2, s1) stats = stmtStats.GetRootStats(2) - expect = "cop_task: {num: 2, max: 1s, min: 1ms, avg: 500.5ms, p95: 1s, max_proc_keys: 200, p95_proc_keys: 200, tot_proc: 1s, tot_wait: 1s, rpc_num: 1, rpc_time: 1s, copr_cache_hit_ratio: 0.00, distsql_concurrency: 15}, backoff{RegionMiss: 1ms}" + expect = "cop_task: {num: 2, max: 1s, min: 1ms, avg: 500.5ms, p95: 1s, max_proc_keys: 200, p95_proc_keys: 200, tot_proc: 1s, tot_wait: 1s, rpc_num: 1, rpc_time: 1s, copr_cache_hit_ratio: 0.00, max_distsql_concurrency: 15}, backoff{RegionMiss: 1ms}" require.Equal(t, expect, stats.String()) // Test for idempotence. require.Equal(t, expect, stats.String()) diff --git a/distsql/request_builder.go b/distsql/request_builder.go index 4a8b3ddfeab13..8d0fae3a464f1 100644 --- a/distsql/request_builder.go +++ b/distsql/request_builder.go @@ -20,7 +20,6 @@ import ( "sort" "sync/atomic" - "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/tidb/ddl/placement" @@ -71,6 +70,9 @@ func (builder *RequestBuilder) Build() (*kv.Request, error) { if err != nil { builder.err = err } + if builder.Request.KeyRanges == nil { + builder.Request.KeyRanges = kv.NewNonParitionedKeyRanges(nil) + } return &builder.Request, builder.err } @@ -86,7 +88,7 @@ func (builder *RequestBuilder) SetMemTracker(tracker *memory.Tracker) *RequestBu // br refers it, so have to keep it. func (builder *RequestBuilder) SetTableRanges(tid int64, tableRanges []*ranger.Range, fb *statistics.QueryFeedback) *RequestBuilder { if builder.err == nil { - builder.Request.KeyRanges = TableRangesToKVRanges(tid, tableRanges, fb) + builder.Request.KeyRanges = kv.NewNonParitionedKeyRanges(TableRangesToKVRanges(tid, tableRanges, fb)) } return builder } @@ -112,7 +114,9 @@ func (builder *RequestBuilder) SetIndexRangesForTables(sc *stmtctx.StatementCont // SetHandleRanges sets "KeyRanges" for "kv.Request" by converting table handle range // "ranges" to "KeyRanges" firstly. func (builder *RequestBuilder) SetHandleRanges(sc *stmtctx.StatementContext, tid int64, isCommonHandle bool, ranges []*ranger.Range, fb *statistics.QueryFeedback) *RequestBuilder { - return builder.SetHandleRangesForTables(sc, []int64{tid}, isCommonHandle, ranges, fb) + builder = builder.SetHandleRangesForTables(sc, []int64{tid}, isCommonHandle, ranges, fb) + builder.err = builder.Request.KeyRanges.SetToNonPartitioned() + return builder } // SetHandleRangesForTables sets "KeyRanges" for "kv.Request" by converting table handle range @@ -127,14 +131,16 @@ func (builder *RequestBuilder) SetHandleRangesForTables(sc *stmtctx.StatementCon // SetTableHandles sets "KeyRanges" for "kv.Request" by converting table handles // "handles" to "KeyRanges" firstly. func (builder *RequestBuilder) SetTableHandles(tid int64, handles []kv.Handle) *RequestBuilder { - builder.Request.KeyRanges, builder.FixedRowCountHint = TableHandlesToKVRanges(tid, handles) + keyRanges, hints := TableHandlesToKVRanges(tid, handles) + builder.Request.KeyRanges = kv.NewNonParitionedKeyRangesWithHint(keyRanges, hints) return builder } // SetPartitionsAndHandles sets "KeyRanges" for "kv.Request" by converting ParitionHandles to KeyRanges. // handles in slice must be kv.PartitionHandle. func (builder *RequestBuilder) SetPartitionsAndHandles(handles []kv.Handle) *RequestBuilder { - builder.Request.KeyRanges = PartitionHandlesToKVRanges(handles) + keyRanges, hints := PartitionHandlesToKVRanges(handles) + builder.Request.KeyRanges = kv.NewNonParitionedKeyRangesWithHint(keyRanges, hints) return builder } @@ -153,6 +159,7 @@ func (builder *RequestBuilder) SetDAGRequest(dag *tipb.DAGRequest) *RequestBuild if limit != nil && limit.Limit < estimatedRegionRowCount { builder.Request.Concurrency = 1 } + builder.Request.LimitSize = limit.GetLimit() } return builder } @@ -183,10 +190,28 @@ func (builder *RequestBuilder) SetChecksumRequest(checksum *tipb.ChecksumRequest // SetKeyRanges sets "KeyRanges" for "kv.Request". func (builder *RequestBuilder) SetKeyRanges(keyRanges []kv.KeyRange) *RequestBuilder { + builder.Request.KeyRanges = kv.NewNonParitionedKeyRanges(keyRanges) + return builder +} + +// SetKeyRangesWithHints sets "KeyRanges" for "kv.Request" with row count hints. +func (builder *RequestBuilder) SetKeyRangesWithHints(keyRanges []kv.KeyRange, hints []int) *RequestBuilder { + builder.Request.KeyRanges = kv.NewNonParitionedKeyRangesWithHint(keyRanges, hints) + return builder +} + +// SetWrappedKeyRanges sets "KeyRanges" for "kv.Request". +func (builder *RequestBuilder) SetWrappedKeyRanges(keyRanges *kv.KeyRanges) *RequestBuilder { builder.Request.KeyRanges = keyRanges return builder } +// SetPartitionKeyRanges sets the "KeyRanges" for "kv.Request" on partitioned table cases. +func (builder *RequestBuilder) SetPartitionKeyRanges(keyRanges [][]kv.KeyRange) *RequestBuilder { + builder.Request.KeyRanges = kv.NewPartitionedKeyRanges(keyRanges) + return builder +} + // SetStartTS sets "StartTS" for "kv.Request". func (builder *RequestBuilder) SetStartTS(startTS uint64) *RequestBuilder { builder.Request.StartTs = startTS @@ -243,7 +268,8 @@ func (*RequestBuilder) getKVPriority(sv *variable.SessionVars) int { } // SetFromSessionVars sets the following fields for "kv.Request" from session variables: -// "Concurrency", "IsolationLevel", "NotFillCache", "TaskID", "Priority", "ReplicaRead", "ResourceGroupTagger". +// "Concurrency", "IsolationLevel", "NotFillCache", "TaskID", "Priority", "ReplicaRead", +// "ResourceGroupTagger", "ResourceGroupName" func (builder *RequestBuilder) SetFromSessionVars(sv *variable.SessionVars) *RequestBuilder { if builder.Request.Concurrency == 0 { // Concurrency may be set to 1 by SetDAGRequest @@ -270,6 +296,8 @@ func (builder *RequestBuilder) SetFromSessionVars(sv *variable.SessionVars) *Req } builder.RequestSource.RequestSourceInternal = sv.InRestrictedSQL builder.RequestSource.RequestSourceType = sv.RequestSourceType + builder.StoreBatchSize = sv.StoreBatchSize + builder.Request.ResourceGroupName = sv.ResourceGroupName return builder } @@ -312,19 +340,24 @@ func (builder *RequestBuilder) SetResourceGroupTagger(tagger tikvrpc.ResourceGro return builder } +// SetResourceGroupName sets the request resource group name. +func (builder *RequestBuilder) SetResourceGroupName(name string) *RequestBuilder { + builder.Request.ResourceGroupName = name + return builder +} + func (builder *RequestBuilder) verifyTxnScope() error { txnScope := builder.TxnScope if txnScope == "" || txnScope == kv.GlobalReplicaScope || builder.is == nil { return nil } visitPhysicalTableID := make(map[int64]struct{}) - for _, keyRange := range builder.Request.KeyRanges { - tableID := tablecodec.DecodeTableID(keyRange.StartKey) - if tableID > 0 { - visitPhysicalTableID[tableID] = struct{}{} - } else { - return errors.New("requestBuilder can't decode tableID from keyRange") - } + tids, err := tablecodec.VerifyTableIDForRanges(builder.Request.KeyRanges) + if err != nil { + return err + } + for _, tid := range tids { + visitPhysicalTableID[tid] = struct{}{} } for phyTableID := range visitPhysicalTableID { @@ -376,7 +409,7 @@ func (builder *RequestBuilder) SetClosestReplicaReadAdjuster(chkFn kv.CoprReques } // TableHandleRangesToKVRanges convert table handle ranges to "KeyRanges" for multiple tables. -func TableHandleRangesToKVRanges(sc *stmtctx.StatementContext, tid []int64, isCommonHandle bool, ranges []*ranger.Range, fb *statistics.QueryFeedback) ([]kv.KeyRange, error) { +func TableHandleRangesToKVRanges(sc *stmtctx.StatementContext, tid []int64, isCommonHandle bool, ranges []*ranger.Range, fb *statistics.QueryFeedback) (*kv.KeyRanges, error) { if !isCommonHandle { return tablesRangesToKVRanges(tid, ranges, fb), nil } @@ -387,14 +420,18 @@ func TableHandleRangesToKVRanges(sc *stmtctx.StatementContext, tid []int64, isCo // Note this function should not be exported, but currently // br refers to it, so have to keep it. func TableRangesToKVRanges(tid int64, ranges []*ranger.Range, fb *statistics.QueryFeedback) []kv.KeyRange { - return tablesRangesToKVRanges([]int64{tid}, ranges, fb) + if len(ranges) == 0 { + return []kv.KeyRange{} + } + return tablesRangesToKVRanges([]int64{tid}, ranges, fb).FirstPartitionRange() } // tablesRangesToKVRanges converts table ranges to "KeyRange". -func tablesRangesToKVRanges(tids []int64, ranges []*ranger.Range, fb *statistics.QueryFeedback) []kv.KeyRange { +func tablesRangesToKVRanges(tids []int64, ranges []*ranger.Range, fb *statistics.QueryFeedback) *kv.KeyRanges { if fb == nil || fb.Hist == nil { return tableRangesToKVRangesWithoutSplit(tids, ranges) } + // The following codes are deprecated since the feedback is deprecated. krs := make([]kv.KeyRange, 0, len(ranges)) feedbackRanges := make([]*ranger.Range, 0, len(ranges)) for _, ran := range ranges { @@ -420,20 +457,23 @@ func tablesRangesToKVRanges(tids []int64, ranges []*ranger.Range, fb *statistics } } fb.StoreRanges(feedbackRanges) - return krs + return kv.NewNonParitionedKeyRanges(krs) } -func tableRangesToKVRangesWithoutSplit(tids []int64, ranges []*ranger.Range) []kv.KeyRange { - krs := make([]kv.KeyRange, 0, len(ranges)*len(tids)) +func tableRangesToKVRangesWithoutSplit(tids []int64, ranges []*ranger.Range) *kv.KeyRanges { + krs := make([][]kv.KeyRange, len(tids)) + for i := range krs { + krs[i] = make([]kv.KeyRange, 0, len(ranges)) + } for _, ran := range ranges { low, high := encodeHandleKey(ran) - for _, tid := range tids { + for i, tid := range tids { startKey := tablecodec.EncodeRowKey(tid, low) endKey := tablecodec.EncodeRowKey(tid, high) - krs = append(krs, kv.KeyRange{StartKey: startKey, EndKey: endKey}) + krs[i] = append(krs[i], kv.KeyRange{StartKey: startKey, EndKey: endKey}) } } - return krs + return kv.NewPartitionedKeyRanges(krs) } func encodeHandleKey(ran *ranger.Range) ([]byte, []byte) { @@ -517,7 +557,7 @@ func SplitRangesAcrossInt64Boundary(ranges []*ranger.Range, keepOrder bool, desc // For continuous handles, we should merge them to a single key range. func TableHandlesToKVRanges(tid int64, handles []kv.Handle) ([]kv.KeyRange, []int) { krs := make([]kv.KeyRange, 0, len(handles)) - hint := make([]int, 0, len(handles)) + hints := make([]int, 0, len(handles)) i := 0 for i < len(handles) { if commonHandle, ok := handles[i].(*kv.CommonHandle); ok { @@ -526,7 +566,7 @@ func TableHandlesToKVRanges(tid int64, handles []kv.Handle) ([]kv.KeyRange, []in EndKey: tablecodec.EncodeRowKey(tid, kv.Key(commonHandle.Encoded()).Next()), } krs = append(krs, ran) - hint = append(hint, 1) + hints = append(hints, 1) i++ continue } @@ -542,16 +582,17 @@ func TableHandlesToKVRanges(tid int64, handles []kv.Handle) ([]kv.KeyRange, []in startKey := tablecodec.EncodeRowKey(tid, low) endKey := tablecodec.EncodeRowKey(tid, high) krs = append(krs, kv.KeyRange{StartKey: startKey, EndKey: endKey}) - hint = append(hint, j-i) + hints = append(hints, j-i) i = j } - return krs, hint + return krs, hints } // PartitionHandlesToKVRanges convert ParitionHandles to kv ranges. // Handle in slices must be kv.PartitionHandle -func PartitionHandlesToKVRanges(handles []kv.Handle) []kv.KeyRange { +func PartitionHandlesToKVRanges(handles []kv.Handle) ([]kv.KeyRange, []int) { krs := make([]kv.KeyRange, 0, len(handles)) + hints := make([]int, 0, len(handles)) i := 0 for i < len(handles) { ph := handles[i].(kv.PartitionHandle) @@ -563,6 +604,7 @@ func PartitionHandlesToKVRanges(handles []kv.Handle) []kv.KeyRange { EndKey: tablecodec.EncodeRowKey(pid, append(commonHandle.Encoded(), 0)), } krs = append(krs, ran) + hints = append(hints, 1) i++ continue } @@ -581,33 +623,40 @@ func PartitionHandlesToKVRanges(handles []kv.Handle) []kv.KeyRange { startKey := tablecodec.EncodeRowKey(pid, low) endKey := tablecodec.EncodeRowKey(pid, high) krs = append(krs, kv.KeyRange{StartKey: startKey, EndKey: endKey}) + hints = append(hints, j-i) i = j } - return krs + return krs, hints } // IndexRangesToKVRanges converts index ranges to "KeyRange". -func IndexRangesToKVRanges(sc *stmtctx.StatementContext, tid, idxID int64, ranges []*ranger.Range, fb *statistics.QueryFeedback) ([]kv.KeyRange, error) { +func IndexRangesToKVRanges(sc *stmtctx.StatementContext, tid, idxID int64, ranges []*ranger.Range, fb *statistics.QueryFeedback) (*kv.KeyRanges, error) { return IndexRangesToKVRangesWithInterruptSignal(sc, tid, idxID, ranges, fb, nil, nil) } // IndexRangesToKVRangesWithInterruptSignal converts index ranges to "KeyRange". // The process can be interrupted by set `interruptSignal` to true. -func IndexRangesToKVRangesWithInterruptSignal(sc *stmtctx.StatementContext, tid, idxID int64, ranges []*ranger.Range, fb *statistics.QueryFeedback, memTracker *memory.Tracker, interruptSignal *atomic.Value) ([]kv.KeyRange, error) { - return indexRangesToKVRangesForTablesWithInterruptSignal(sc, []int64{tid}, idxID, ranges, fb, memTracker, interruptSignal) +func IndexRangesToKVRangesWithInterruptSignal(sc *stmtctx.StatementContext, tid, idxID int64, ranges []*ranger.Range, fb *statistics.QueryFeedback, memTracker *memory.Tracker, interruptSignal *atomic.Value) (*kv.KeyRanges, error) { + keyRanges, err := indexRangesToKVRangesForTablesWithInterruptSignal(sc, []int64{tid}, idxID, ranges, fb, memTracker, interruptSignal) + if err != nil { + return nil, err + } + err = keyRanges.SetToNonPartitioned() + return keyRanges, err } // IndexRangesToKVRangesForTables converts indexes ranges to "KeyRange". -func IndexRangesToKVRangesForTables(sc *stmtctx.StatementContext, tids []int64, idxID int64, ranges []*ranger.Range, fb *statistics.QueryFeedback) ([]kv.KeyRange, error) { +func IndexRangesToKVRangesForTables(sc *stmtctx.StatementContext, tids []int64, idxID int64, ranges []*ranger.Range, fb *statistics.QueryFeedback) (*kv.KeyRanges, error) { return indexRangesToKVRangesForTablesWithInterruptSignal(sc, tids, idxID, ranges, fb, nil, nil) } // IndexRangesToKVRangesForTablesWithInterruptSignal converts indexes ranges to "KeyRange". // The process can be interrupted by set `interruptSignal` to true. -func indexRangesToKVRangesForTablesWithInterruptSignal(sc *stmtctx.StatementContext, tids []int64, idxID int64, ranges []*ranger.Range, fb *statistics.QueryFeedback, memTracker *memory.Tracker, interruptSignal *atomic.Value) ([]kv.KeyRange, error) { +func indexRangesToKVRangesForTablesWithInterruptSignal(sc *stmtctx.StatementContext, tids []int64, idxID int64, ranges []*ranger.Range, fb *statistics.QueryFeedback, memTracker *memory.Tracker, interruptSignal *atomic.Value) (*kv.KeyRanges, error) { if fb == nil || fb.Hist == nil { return indexRangesToKVWithoutSplit(sc, tids, idxID, ranges, memTracker, interruptSignal) } + // The following code is non maintained since the feedback deprecated. feedbackRanges := make([]*ranger.Range, 0, len(ranges)) for _, ran := range ranges { low, high, err := EncodeIndexKey(sc, ran) @@ -642,11 +691,11 @@ func indexRangesToKVRangesForTablesWithInterruptSignal(sc *stmtctx.StatementCont } } fb.StoreRanges(feedbackRanges) - return krs, nil + return kv.NewNonParitionedKeyRanges(krs), nil } // CommonHandleRangesToKVRanges converts common handle ranges to "KeyRange". -func CommonHandleRangesToKVRanges(sc *stmtctx.StatementContext, tids []int64, ranges []*ranger.Range) ([]kv.KeyRange, error) { +func CommonHandleRangesToKVRanges(sc *stmtctx.StatementContext, tids []int64, ranges []*ranger.Range) (*kv.KeyRanges, error) { rans := make([]*ranger.Range, 0, len(ranges)) for _, ran := range ranges { low, high, err := EncodeIndexKey(sc, ran) @@ -656,20 +705,23 @@ func CommonHandleRangesToKVRanges(sc *stmtctx.StatementContext, tids []int64, ra rans = append(rans, &ranger.Range{LowVal: []types.Datum{types.NewBytesDatum(low)}, HighVal: []types.Datum{types.NewBytesDatum(high)}, LowExclude: false, HighExclude: true, Collators: collate.GetBinaryCollatorSlice(1)}) } - krs := make([]kv.KeyRange, 0, len(rans)) + krs := make([][]kv.KeyRange, len(tids)) + for i := range krs { + krs[i] = make([]kv.KeyRange, 0, len(ranges)) + } for _, ran := range rans { low, high := ran.LowVal[0].GetBytes(), ran.HighVal[0].GetBytes() if ran.LowExclude { low = kv.Key(low).PrefixNext() } ran.LowVal[0].SetBytes(low) - for _, tid := range tids { + for i, tid := range tids { startKey := tablecodec.EncodeRowKey(tid, low) endKey := tablecodec.EncodeRowKey(tid, high) - krs = append(krs, kv.KeyRange{StartKey: startKey, EndKey: endKey}) + krs[i] = append(krs[i], kv.KeyRange{StartKey: startKey, EndKey: endKey}) } } - return krs, nil + return kv.NewPartitionedKeyRanges(krs), nil } // VerifyTxnScope verify whether the txnScope and visited physical table break the leader rule's dcLocation. @@ -691,8 +743,12 @@ func VerifyTxnScope(txnScope string, physicalTableID int64, is infoschema.InfoSc return true } -func indexRangesToKVWithoutSplit(sc *stmtctx.StatementContext, tids []int64, idxID int64, ranges []*ranger.Range, memTracker *memory.Tracker, interruptSignal *atomic.Value) ([]kv.KeyRange, error) { - krs := make([]kv.KeyRange, 0, len(ranges)) +func indexRangesToKVWithoutSplit(sc *stmtctx.StatementContext, tids []int64, idxID int64, ranges []*ranger.Range, memTracker *memory.Tracker, interruptSignal *atomic.Value) (*kv.KeyRanges, error) { + krs := make([][]kv.KeyRange, len(tids)) + for i := range krs { + krs[i] = make([]kv.KeyRange, 0, len(ranges)) + } + const checkSignalStep = 8 var estimatedMemUsage int64 // encodeIndexKey and EncodeIndexSeekKey is time-consuming, thus we need to @@ -705,13 +761,13 @@ func indexRangesToKVWithoutSplit(sc *stmtctx.StatementContext, tids []int64, idx if i == 0 { estimatedMemUsage += int64(cap(low) + cap(high)) } - for _, tid := range tids { + for j, tid := range tids { startKey := tablecodec.EncodeIndexSeekKey(tid, idxID, low) endKey := tablecodec.EncodeIndexSeekKey(tid, idxID, high) if i == 0 { estimatedMemUsage += int64(cap(startKey)) + int64(cap(endKey)) } - krs = append(krs, kv.KeyRange{StartKey: startKey, EndKey: endKey}) + krs[j] = append(krs[j], kv.KeyRange{StartKey: startKey, EndKey: endKey}) } if i%checkSignalStep == 0 { if i == 0 && memTracker != nil { @@ -719,11 +775,11 @@ func indexRangesToKVWithoutSplit(sc *stmtctx.StatementContext, tids []int64, idx memTracker.Consume(estimatedMemUsage) } if interruptSignal != nil && interruptSignal.Load().(bool) { - return nil, nil + return kv.NewPartitionedKeyRanges(nil), nil } } } - return krs, nil + return kv.NewPartitionedKeyRanges(krs), nil } // EncodeIndexKey gets encoded keys containing low and high @@ -743,20 +799,5 @@ func EncodeIndexKey(sc *stmtctx.StatementContext, ran *ranger.Range) ([]byte, [] if !ran.HighExclude { high = kv.Key(high).PrefixNext() } - - var hasNull bool - for _, highVal := range ran.HighVal { - if highVal.IsNull() { - hasNull = true - break - } - } - - // NOTE: this is a hard-code operation to avoid wrong results when accessing unique index with NULL; - // Please see https://github.com/pingcap/tidb/issues/29650 for more details - if hasNull { - // Append 0 to make unique-key range [null, null] to be a scan rather than point-get. - high = kv.Key(high).Next() - } return low, high, nil } diff --git a/distsql/request_builder_test.go b/distsql/request_builder_test.go index 2ffde4a512c0d..1de6b11dd5244 100644 --- a/distsql/request_builder_test.go +++ b/distsql/request_builder_test.go @@ -61,10 +61,11 @@ func TestTableHandlesToKVRanges(t *testing.T) { // Build key ranges. expect := getExpectedRanges(1, hrs) - actual, _ := TableHandlesToKVRanges(1, handles) + actual, hints := TableHandlesToKVRanges(1, handles) // Compare key ranges and expected key ranges. require.Equal(t, len(expect), len(actual)) + require.Equal(t, hints, []int{1, 4, 2, 1, 2}) for i := range actual { require.Equal(t, expect[i].StartKey, actual[i].StartKey) require.Equal(t, expect[i].EndKey, actual[i].EndKey) @@ -192,8 +193,8 @@ func TestIndexRangesToKVRanges(t *testing.T) { actual, err := IndexRangesToKVRanges(new(stmtctx.StatementContext), 12, 15, ranges, nil) require.NoError(t, err) - for i := range actual { - require.Equal(t, expect[i], actual[i]) + for i := range actual.FirstPartitionRange() { + require.Equal(t, expect[i], actual.FirstPartitionRange()[i]) } } @@ -242,7 +243,7 @@ func TestRequestBuilder1(t *testing.T) { Tp: 103, StartTs: 0x0, Data: []uint8{0x18, 0x0, 0x20, 0x0, 0x40, 0x0, 0x5a, 0x0}, - KeyRanges: []kv.KeyRange{ + KeyRanges: kv.NewNonParitionedKeyRanges([]kv.KeyRange{ { StartKey: kv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1}, EndKey: kv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3}, @@ -263,7 +264,7 @@ func TestRequestBuilder1(t *testing.T) { StartKey: kv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23}, EndKey: kv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23}, }, - }, + }), Cacheable: true, KeepOrder: false, Desc: false, @@ -325,7 +326,7 @@ func TestRequestBuilder2(t *testing.T) { Tp: 103, StartTs: 0x0, Data: []uint8{0x18, 0x0, 0x20, 0x0, 0x40, 0x0, 0x5a, 0x0}, - KeyRanges: []kv.KeyRange{ + KeyRanges: kv.NewNonParitionedKeyRanges([]kv.KeyRange{ { StartKey: kv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1}, EndKey: kv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3}, @@ -346,7 +347,7 @@ func TestRequestBuilder2(t *testing.T) { StartKey: kv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23}, EndKey: kv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23}, }, - }, + }), Cacheable: true, KeepOrder: false, Desc: false, @@ -378,7 +379,7 @@ func TestRequestBuilder3(t *testing.T) { Tp: 103, StartTs: 0x0, Data: []uint8{0x18, 0x0, 0x20, 0x0, 0x40, 0x0, 0x5a, 0x0}, - KeyRanges: []kv.KeyRange{ + KeyRanges: kv.NewNonParitionedKeyRangesWithHint([]kv.KeyRange{ { StartKey: kv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, EndKey: kv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1}, @@ -395,17 +396,16 @@ func TestRequestBuilder3(t *testing.T) { StartKey: kv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x64}, EndKey: kv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65}, }, - }, - Cacheable: true, - KeepOrder: false, - Desc: false, - Concurrency: variable.DefDistSQLScanConcurrency, - IsolationLevel: 0, - Priority: 0, - NotFillCache: false, - ReplicaRead: kv.ReplicaReadLeader, - ReadReplicaScope: kv.GlobalReplicaScope, - FixedRowCountHint: []int{1, 4, 2, 1}, + }, []int{1, 4, 2, 1}), + Cacheable: true, + KeepOrder: false, + Desc: false, + Concurrency: variable.DefDistSQLScanConcurrency, + IsolationLevel: 0, + Priority: 0, + NotFillCache: false, + ReplicaRead: kv.ReplicaReadLeader, + ReadReplicaScope: kv.GlobalReplicaScope, } expect.Paging.MinPagingSize = paging.MinPagingSize expect.Paging.MaxPagingSize = paging.MaxPagingSize @@ -444,7 +444,7 @@ func TestRequestBuilder4(t *testing.T) { Tp: 103, StartTs: 0x0, Data: []uint8{0x18, 0x0, 0x20, 0x0, 0x40, 0x0, 0x5a, 0x0}, - KeyRanges: keyRanges, + KeyRanges: kv.NewNonParitionedKeyRanges(keyRanges), Cacheable: true, KeepOrder: false, Desc: false, @@ -491,7 +491,7 @@ func TestRequestBuilder5(t *testing.T) { Tp: 104, StartTs: 0x0, Data: []uint8{0x8, 0x0, 0x18, 0x0, 0x20, 0x0}, - KeyRanges: keyRanges, + KeyRanges: kv.NewNonParitionedKeyRanges(keyRanges), KeepOrder: true, Desc: false, Concurrency: 15, @@ -520,7 +520,7 @@ func TestRequestBuilder6(t *testing.T) { Tp: 105, StartTs: 0x0, Data: []uint8{0x10, 0x0, 0x18, 0x0}, - KeyRanges: keyRanges, + KeyRanges: kv.NewNonParitionedKeyRanges(keyRanges), KeepOrder: false, Desc: false, Concurrency: concurrency, @@ -557,6 +557,7 @@ func TestRequestBuilder7(t *testing.T) { Tp: 0, StartTs: 0x0, KeepOrder: false, + KeyRanges: kv.NewNonParitionedKeyRanges(nil), Desc: false, Concurrency: concurrency, IsolationLevel: 0, @@ -575,20 +576,23 @@ func TestRequestBuilder7(t *testing.T) { func TestRequestBuilder8(t *testing.T) { sv := variable.NewSessionVars(nil) + sv.ResourceGroupName = "test" actual, err := (&RequestBuilder{}). SetFromSessionVars(sv). Build() require.NoError(t, err) expect := &kv.Request{ - Tp: 0, - StartTs: 0x0, - Data: []uint8(nil), - Concurrency: variable.DefDistSQLScanConcurrency, - IsolationLevel: 0, - Priority: 0, - MemTracker: (*memory.Tracker)(nil), - SchemaVar: 0, - ReadReplicaScope: kv.GlobalReplicaScope, + Tp: 0, + StartTs: 0x0, + Data: []uint8(nil), + KeyRanges: kv.NewNonParitionedKeyRanges(nil), + Concurrency: variable.DefDistSQLScanConcurrency, + IsolationLevel: 0, + Priority: 0, + MemTracker: (*memory.Tracker)(nil), + SchemaVar: 0, + ReadReplicaScope: kv.GlobalReplicaScope, + ResourceGroupName: "test", } expect.Paging.MinPagingSize = paging.MinPagingSize expect.Paging.MaxPagingSize = paging.MaxPagingSize @@ -635,8 +639,8 @@ func TestIndexRangesToKVRangesWithFbs(t *testing.T) { EndKey: kv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5}, }, } - for i := 0; i < len(actual); i++ { - require.Equal(t, expect[i], actual[i]) + for i := 0; i < len(actual.FirstPartitionRange()); i++ { + require.Equal(t, expect[i], actual.FirstPartitionRange()[i]) } } @@ -672,6 +676,7 @@ func TestScanLimitConcurrency(t *testing.T) { Build() require.NoError(t, err) require.Equal(t, tt.concurrency, actual.Concurrency) + require.Equal(t, actual.LimitSize, tt.limit) }) } } diff --git a/distsql/select_result.go b/distsql/select_result.go index 0e807b360d0ad..394298e8fa3b0 100644 --- a/distsql/select_result.go +++ b/distsql/select_result.go @@ -53,6 +53,12 @@ var ( errQueryInterrupted = dbterror.ClassExecutor.NewStd(errno.ErrQueryInterrupted) ) +var ( + telemetryBatchedQueryTaskCnt = metrics.TelemetryBatchedQueryTaskCnt + telemetryStoreBatchedCnt = metrics.TelemetryStoreBatchedCnt + telemetryStoreBatchedFallbackCnt = metrics.TelemetryStoreBatchedFallbackCnt +) + var ( _ SelectResult = (*selectResult)(nil) _ SelectResult = (*serialSelectResults)(nil) @@ -157,7 +163,7 @@ func (r *selectResult) fetchResp(ctx context.Context) error { if r.stats != nil { // Ignore internal sql. if !r.ctx.GetSessionVars().InRestrictedSQL && len(r.stats.copRespTime) > 0 { - ratio := float64(r.stats.CoprCacheHitNum) / float64(len(r.stats.copRespTime)) + ratio := r.stats.calcCacheHit() if ratio >= 1 { telemetry.CurrentCoprCacheHitRatioGTE100Count.Inc() } @@ -359,13 +365,16 @@ func (r *selectResult) updateCopRuntimeStats(ctx context.Context, copStats *copr } if r.stats == nil { - id := r.rootPlanID r.stats = &selectResultRuntimeStats{ backoffSleep: make(map[string]time.Duration), rpcStat: tikv.NewRegionRequestRuntimeStats(), distSQLConcurrency: r.distSQLConcurrency, } - r.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(id, r.stats) + if ci, ok := r.resp.(copr.CopInfo); ok { + conc, extraConc := ci.GetConcurrency() + r.stats.distSQLConcurrency = conc + r.stats.extraConcurrency = extraConc + } } r.stats.mergeCopRuntimeStats(copStats, respTime) @@ -456,24 +465,43 @@ func (r *selectResult) Close() error { if respSize > 0 { r.memConsume(-respSize) } + if r.stats != nil { + defer func() { + if ci, ok := r.resp.(copr.CopInfo); ok { + r.stats.buildTaskDuration = ci.GetBuildTaskElapsed() + batched, fallback := ci.GetStoreBatchInfo() + if batched != 0 || fallback != 0 { + r.stats.storeBatchedNum, r.stats.storeBatchedFallbackNum = batched, fallback + telemetryStoreBatchedCnt.Add(float64(r.stats.storeBatchedNum)) + telemetryStoreBatchedFallbackCnt.Add(float64(r.stats.storeBatchedFallbackNum)) + telemetryBatchedQueryTaskCnt.Add(float64(len(r.stats.copRespTime))) + } + } + r.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(r.rootPlanID, r.stats) + }() + } return r.resp.Close() } -// CopRuntimeStats is a interface uses to check whether the result has cop runtime stats. +// CopRuntimeStats is an interface uses to check whether the result has cop runtime stats. type CopRuntimeStats interface { // GetCopRuntimeStats gets the cop runtime stats information. GetCopRuntimeStats() *copr.CopRuntimeStats } type selectResultRuntimeStats struct { - copRespTime []time.Duration - procKeys []int64 - backoffSleep map[string]time.Duration - totalProcessTime time.Duration - totalWaitTime time.Duration - rpcStat tikv.RegionRequestRuntimeStats - distSQLConcurrency int - CoprCacheHitNum int64 + copRespTime []time.Duration + procKeys []int64 + backoffSleep map[string]time.Duration + totalProcessTime time.Duration + totalWaitTime time.Duration + rpcStat tikv.RegionRequestRuntimeStats + distSQLConcurrency int + extraConcurrency int + CoprCacheHitNum int64 + storeBatchedNum uint64 + storeBatchedFallbackNum uint64 + buildTaskDuration time.Duration } func (s *selectResultRuntimeStats) mergeCopRuntimeStats(copStats *copr.CopRuntimeStats, respTime time.Duration) { @@ -494,12 +522,16 @@ func (s *selectResultRuntimeStats) mergeCopRuntimeStats(copStats *copr.CopRuntim func (s *selectResultRuntimeStats) Clone() execdetails.RuntimeStats { newRs := selectResultRuntimeStats{ - copRespTime: make([]time.Duration, 0, len(s.copRespTime)), - procKeys: make([]int64, 0, len(s.procKeys)), - backoffSleep: make(map[string]time.Duration, len(s.backoffSleep)), - rpcStat: tikv.NewRegionRequestRuntimeStats(), - distSQLConcurrency: s.distSQLConcurrency, - CoprCacheHitNum: s.CoprCacheHitNum, + copRespTime: make([]time.Duration, 0, len(s.copRespTime)), + procKeys: make([]int64, 0, len(s.procKeys)), + backoffSleep: make(map[string]time.Duration, len(s.backoffSleep)), + rpcStat: tikv.NewRegionRequestRuntimeStats(), + distSQLConcurrency: s.distSQLConcurrency, + extraConcurrency: s.extraConcurrency, + CoprCacheHitNum: s.CoprCacheHitNum, + storeBatchedNum: s.storeBatchedNum, + storeBatchedFallbackNum: s.storeBatchedFallbackNum, + buildTaskDuration: s.buildTaskDuration, } newRs.copRespTime = append(newRs.copRespTime, s.copRespTime...) newRs.procKeys = append(newRs.procKeys, s.procKeys...) @@ -527,6 +559,15 @@ func (s *selectResultRuntimeStats) Merge(rs execdetails.RuntimeStats) { s.totalWaitTime += other.totalWaitTime s.rpcStat.Merge(other.rpcStat) s.CoprCacheHitNum += other.CoprCacheHitNum + if other.distSQLConcurrency > s.distSQLConcurrency { + s.distSQLConcurrency = other.distSQLConcurrency + } + if other.extraConcurrency > s.extraConcurrency { + s.extraConcurrency = other.extraConcurrency + } + s.storeBatchedNum += other.storeBatchedNum + s.storeBatchedFallbackNum += other.storeBatchedFallbackNum + s.buildTaskDuration += other.buildTaskDuration } func (s *selectResultRuntimeStats) String() string { @@ -578,14 +619,30 @@ func (s *selectResultRuntimeStats) String() string { } if config.GetGlobalConfig().TiKVClient.CoprCache.CapacityMB > 0 { buf.WriteString(fmt.Sprintf(", copr_cache_hit_ratio: %v", - strconv.FormatFloat(float64(s.CoprCacheHitNum)/float64(len(s.copRespTime)), 'f', 2, 64))) + strconv.FormatFloat(s.calcCacheHit(), 'f', 2, 64))) } else { buf.WriteString(", copr_cache: disabled") } + if s.buildTaskDuration > 0 { + buf.WriteString(", build_task_duration: ") + buf.WriteString(execdetails.FormatDuration(s.buildTaskDuration)) + } if s.distSQLConcurrency > 0 { - buf.WriteString(", distsql_concurrency: ") + buf.WriteString(", max_distsql_concurrency: ") buf.WriteString(strconv.FormatInt(int64(s.distSQLConcurrency), 10)) } + if s.extraConcurrency > 0 { + buf.WriteString(", max_extra_concurrency: ") + buf.WriteString(strconv.FormatInt(int64(s.extraConcurrency), 10)) + } + if s.storeBatchedNum > 0 { + buf.WriteString(", store_batch_num: ") + buf.WriteString(strconv.FormatInt(int64(s.storeBatchedNum), 10)) + } + if s.storeBatchedFallbackNum > 0 { + buf.WriteString(", store_batch_fallback_num: ") + buf.WriteString(strconv.FormatInt(int64(s.storeBatchedFallbackNum), 10)) + } buf.WriteString("}") } @@ -614,3 +671,15 @@ func (s *selectResultRuntimeStats) String() string { func (*selectResultRuntimeStats) Tp() int { return execdetails.TpSelectResultRuntimeStats } + +func (s *selectResultRuntimeStats) calcCacheHit() float64 { + hit := s.CoprCacheHitNum + tot := len(s.copRespTime) + if s.storeBatchedNum > 0 { + tot += int(s.storeBatchedNum) + } + if tot == 0 { + return 0 + } + return float64(hit) / float64(tot) +} diff --git a/distsql/select_result_test.go b/distsql/select_result_test.go index c12892083d641..4ec56a286e5ab 100644 --- a/distsql/select_result_test.go +++ b/distsql/select_result_test.go @@ -34,7 +34,7 @@ func TestUpdateCopRuntimeStats(t *testing.T) { require.Nil(t, ctx.GetSessionVars().StmtCtx.RuntimeStatsColl) sr.rootPlanID = 1234 - sr.updateCopRuntimeStats(context.Background(), &copr.CopRuntimeStats{ExecDetails: execdetails.ExecDetails{CalleeAddress: "a"}}, 0) + sr.updateCopRuntimeStats(context.Background(), &copr.CopRuntimeStats{ExecDetails: execdetails.ExecDetails{DetailsNeedP90: execdetails.DetailsNeedP90{CalleeAddress: "a"}}}, 0) ctx.GetSessionVars().StmtCtx.RuntimeStatsColl = execdetails.NewRuntimeStatsColl(nil) i := uint64(1) @@ -46,13 +46,13 @@ func TestUpdateCopRuntimeStats(t *testing.T) { require.NotEqual(t, len(sr.copPlanIDs), len(sr.selectResp.GetExecutionSummaries())) - sr.updateCopRuntimeStats(context.Background(), &copr.CopRuntimeStats{ExecDetails: execdetails.ExecDetails{CalleeAddress: "callee"}}, 0) + sr.updateCopRuntimeStats(context.Background(), &copr.CopRuntimeStats{ExecDetails: execdetails.ExecDetails{DetailsNeedP90: execdetails.DetailsNeedP90{CalleeAddress: "callee"}}}, 0) require.False(t, ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.ExistsCopStats(1234)) sr.copPlanIDs = []int{sr.rootPlanID} require.NotNil(t, ctx.GetSessionVars().StmtCtx.RuntimeStatsColl) require.Equal(t, len(sr.copPlanIDs), len(sr.selectResp.GetExecutionSummaries())) - sr.updateCopRuntimeStats(context.Background(), &copr.CopRuntimeStats{ExecDetails: execdetails.ExecDetails{CalleeAddress: "callee"}}, 0) + sr.updateCopRuntimeStats(context.Background(), &copr.CopRuntimeStats{ExecDetails: execdetails.ExecDetails{DetailsNeedP90: execdetails.DetailsNeedP90{CalleeAddress: "callee"}}}, 0) require.Equal(t, "tikv_task:{time:1ns, loops:1}", ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.GetOrCreateCopStats(1234, "tikv").String()) } diff --git a/docs/design/2019-11-05-index-advisor.md b/docs/design/2019-11-05-index-advisor.md index 53abab5ba0d5a..5606d9bd9a942 100644 --- a/docs/design/2019-11-05-index-advisor.md +++ b/docs/design/2019-11-05-index-advisor.md @@ -57,7 +57,7 @@ for { Note that executing `Swap and Re-evaluate` algorithm is necessary as the `reduced_cost` sometimes is a joint effect of several indexes and it's hard to tell each index's independent contribution to the final `reduced_cost`. For example, assume there is an extremely slow query in input workload and the desired indexes for this query is `a` and `b`. However, the number of allowed recommended indexes for the whole workload is limited and for some reason, `a` ranks top `n` in the final score list while `b` is not. But there are chances that without `b`, `a` can no more optimize that extremely slow query. ---------------------------------------------- -### A quick exmaple for single-column index recommendation +### A quick example for single-column index recommendation **Workload**: diff --git a/docs/design/2020-01-24-collations.md b/docs/design/2020-01-24-collations.md index a222035745b83..d610514ed76d5 100644 --- a/docs/design/2020-01-24-collations.md +++ b/docs/design/2020-01-24-collations.md @@ -105,10 +105,10 @@ The interface is quite similar to the Go [collate package](https://godoc.org/gol ### Row Format -The encoding layout of TiDB has been described in our [previous article](https://pingcap.com/blog/2017-07-11-tidbinternal2/#map). The row format should be changed to make it memory comparable, this is important to the index lookup. Basic principle is that all keys encoded for strings should use the `sortKeys` result from `Key()`/`KeyFromString()` function. However, most of the `sortKeys` calculations are not reversible. +The encoding layout of TiDB has been described in our [previous article](https://docs.pingcap.com/tidb/stable/tidb-computing). The row format should be changed to make it memory comparable, this is important to the index lookup. Basic principle is that all keys encoded for strings should use the `sortKeys` result from `Key()`/`KeyFromString()` function. However, most of the `sortKeys` calculations are not reversible. * For table data, encodings stay unchanged. All strings are compared after decoding with the `Compare()` function. - * For table indices, we replace current `ColumnValue` with `sortKey` and encode the `ColumnValue` to the value,: + * For table indices, we replace current `ColumnValue` with `sortKey` and encode the `ColumnValue` to the value: - For unique indices: ``` Key: tablePrefix{tableID}_indexPrefixSep{indexID}_sortKey @@ -233,7 +233,7 @@ The following features of the general collation algorithm will be supported: * Tertiary Weight i.e. case * PAD / NOPAD -All of them are supported by `text/collate` package of Go, so it is possible to map Go collations to some of UCA-based collations in MySQL like `utf8mb4_unicode_ci`/`utf8mb4_0900_ai_ci`, if we ignore the differences between UCA versions: current `text/collate` uses UCA version `6.2.0` and it is not changable. However, the collations in MySQL are with different UCA versions marked in the names, for example, `utf8mb4_0900_ai_ci` uses version `9.0`. +All of them are supported by `text/collate` package of Go, so it is possible to map Go collations to some of UCA-based collations in MySQL like `utf8mb4_unicode_ci`/`utf8mb4_0900_ai_ci`, if we ignore the differences between UCA versions: current `text/collate` uses UCA version `6.2.0` and it is not changeable. However, the collations in MySQL are with different UCA versions marked in the names, for example, `utf8mb4_0900_ai_ci` uses version `9.0`. For non-standard UCA implementations in MySQL, i.e. the `utf8mb4_general_ci`. The implementation depends on our choice to the [Compatibility with MySQL](#compatibility-with-mysql) chapter, if a 100% compatibility of `utf8mb4_general_ci` is chosen, we need to implement it by our hands. diff --git a/docs/design/2020-06-24-placement-rules-in-sql.md b/docs/design/2020-06-24-placement-rules-in-sql.md index 207e6a8a4a2eb..30191f676badb 100644 --- a/docs/design/2020-06-24-placement-rules-in-sql.md +++ b/docs/design/2020-06-24-placement-rules-in-sql.md @@ -413,6 +413,26 @@ If a table is imported when `tidb_placement_mode='IGNORE'`, and the placement po The default value for `tidb_placement_mode` is `STRICT`. The option is an enum, and in future we may add support for a `WARN` mode. + +#### Survival preference + +Some important data may need to store multiple copies across availability zones, so as to have high disaster recovery survivability, such as region-level survivability, `SURVIVAL_PREFERENCES` can provide survivability preference settings. + +The following example sets a constraint that the data try to satisfy the Survival Preferences setting: + +``` sql +CREATE PLACEMENT POLICY multiregion + follower=4 + PRIMARY_REGION="region1" + SURVIVAL_PREFERENCES="[region, zone]"; +``` + +For tables with this policy set, the data will first meet the survival goal of cross-region data isolation, and then ensure the survival goal of cross-zone data isolation. + +> **Note:** +> +> `SURVIVAL_PREFERENCES` is equivalent to `LOCATION_LABELS` in PD. For more information, please refer to [Replica scheduling by topology label](https://docs.pingcap.com/tidb/dev/schedule-replicas-by-topology-labels#schedule-replicas-by-topology-labels). + #### Ambiguous and edge cases The following two policies are not identical: @@ -491,6 +511,7 @@ In this case the default rules will apply to placement, and the output from `SHO - `FOLLOWER_CONSTRAINTS` - `LEARNER_CONSTRAINTS` - `PLACEMENT POLICY` +- `SURVIVAL_PREFERENCE` For a more complex rule using partitions, consider the following example: diff --git a/docs/design/2020-08-04-global-index.md b/docs/design/2020-08-04-global-index.md index 80078688777b7..f5e2d89f932c4 100644 --- a/docs/design/2020-08-04-global-index.md +++ b/docs/design/2020-08-04-global-index.md @@ -183,7 +183,7 @@ In TiDB, operators in the partitioned table will be translated to UnionAll in th ## Compatibility -MySQL does not support global index, which means this feature may cause some compatibility issues. We add an option `enable_global_index` in `config.Config` to control it. The default value of this option is `false`, so TiDB will keep consistent with MySQL, unless the user open global index feature manually. +MySQL does not support global index, which means this feature may cause some compatibility issues. We add an option `enable-global-index` in `config.Config` to control it. The default value of this option is `false`, so TiDB will keep consistent with MySQL, unless the user open global index feature manually. ## Implementation diff --git a/docs/design/2022-06-06-Adding-Index-Acceleration.md b/docs/design/2022-06-07-adding-index-acceleration.md similarity index 100% rename from docs/design/2022-06-06-Adding-Index-Acceleration.md rename to docs/design/2022-06-07-adding-index-acceleration.md diff --git a/docs/design/2022-06-22-foreign-key.md b/docs/design/2022-06-22-foreign-key.md new file mode 100644 index 0000000000000..5c6b32d9474e0 --- /dev/null +++ b/docs/design/2022-06-22-foreign-key.md @@ -0,0 +1,708 @@ +# Foreign Key Design Doc + +- Author(s): [crazycs520](https://github.com/crazycs520) +- Tracking Issue: https://github.com/pingcap/tidb/issues/18209 + +## Abstract + +This proposes an implementation of supporting foreign key constraints. + +## DDL Technical Design + +### Table Information Changes +The table's foreign key information will be stored in `model.TableInfo`: + +```go +// TableInfo provides meta data describing a DB table. +type TableInfo struct { + ... + ForeignKeys []*FKInfo `json:"fk_info"` + // MaxFKIndexID uses to allocate foreign key ID. + MaxForeignKeyID int64 `json:"max_fk_id"` + ... +} + +// FKInfo provides meta data describing a foreign key constraint. +type FKInfo struct { + ID int64 `json:"id"` + Name CIStr `json:"fk_name"` + RefSchema CIStr `json:"ref_schema"` + RefTable CIStr `json:"ref_table"` + RefCols []CIStr `json:"ref_cols"` + Cols []CIStr `json:"cols"` + OnDelete int `json:"on_delete"` + OnUpdate int `json:"on_update"` + State SchemaState `json:"state"` + Version int `json:"version"` +} +``` + +Struct `FKInfo` uses for the child table to record the referenced parent table. Struct `FKInfo` has existed for a long time, I just added some fields. +- `Version`: uses to distinguish between old and new versions. The new version value is 1, the old version value is 0. + +Why `FKInfo` record the table/schema name instead of table/schema id? Because we may don't know the table/schema id when building `FKInfo`. Here is an example: + +```sql +>set @@foreign_key_checks=0; +Query OK, 0 rows affected +>create table t2 (a int key, foreign key fk(a) references t1(id)); +Query OK, 0 rows affected +>create table t1 (id int key); +Query OK, 0 rows affected +>set @@foreign_key_checks=1; +Query OK, 0 rows affected +>insert into t2 values (1); +(1452, 'Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`id`))') +``` + +As you can see, table `t2` refers to table `t1`, and when creating table `t2`, table `t1` still not be created, so we can't know the id of table `t1`. + +### Create Table with Foreign Key + +#### Build TableInfo + +When building `TableInfo`, an index for the foreign key columns is created automatically if there is no index covering the foreign key columns. Here is an example: + +```sql +mysql> create table t (id int key, a int, foreign key fk(a) references t(id)); +Query OK, 0 rows affected +mysql> show create table t\G +***************************[ 1. row ]*************************** +Table | t +Create Table | CREATE TABLE `t` ( + `id` int NOT NULL, + `a` int DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `fk` (`a`), + CONSTRAINT `t_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +1 row in set +``` + +As you can see, the index `fk` is created automatically for the foreign key. + +#### Validate + +Create a table with foreign key, check the following conditions when a DDL job is built and the DDL owner received a DDL job(aka Double-Check): + +- whether the user has `REFERENCES` privilege to the foreign key references table. +- Corresponding columns in the foreign key and the referenced key must have similar data types. The size and sign of fixed precision types such as INTEGER and DECIMAL must be the same. The length of string types need not be the same. For nonbinary (character) string columns, the character set and collation must be the same. +- Supports foreign key references between one column and another within a table. (A column cannot have a foreign key reference to itself.) +- Indexes on foreign keys and referenced keys are required, because the foreign key check can be fast and do not require a table scan. +- Prefixed indexes on foreign key columns are not supported. Consequently, BLOB and TEXT columns cannot be included in a foreign key because indexes on those columns must always include a prefix length. +- Does not currently support foreign keys for the partition table. This includes both reference and child tables. +- A foreign key constraint cannot reference any virtual generated columns, but the stored generated columns are fine. + +#### Handle In DDL Owner + +When the DDL Owner handle create table job, the DDL owner needs to create a new table. + +At the same point in time, there may be two versions of the schema in the TiDB cluster, so we can't create a new table and +update all reference tables in one schema version, since this may break foreign key constraints, such as delete reference table +without foreign key constraint check in the child table. + +```sql +-- In TiDB-1 and Schema Version is 1 +insert into t_has_foreign_key values (1, 1); + +-- In TiDB-0 and Schema Version is 0 +delete from t_reference where id = 1; --Since doesn't know foreign key information in old version, so doesn't do foreign key constrain check. +``` + +So, when creating a table with foreign key, we need multi-schema version change: + +1. None -> Write Only: Create table with the state is `write-only`. +2. Write Only -> Public: Update the created table state to `public`. + +#### Maintain ReferredFKInfo + +Why need to maintain `ReferredFKInfo` in the reference table? When executing `UPDATE`/`DELETE` in the reference table, we need the `ReferredFKInfo` of the reference table to do a foreign key check/cascade. + +How to maintain `ReferredFKInfo` in the reference table? When we create table with foreign key, we didn't add `ReferredFKInfo` into the reference table, because the reference table may not have been created yet, +when `foreign_key_checks` variable value is `OFF`, the user can create a child table before the reference table. + +We decided to maintain `ReferredFKInfo` while TiDB loading schema. At first, `infoSchema` will record all table's `ReferredFKInfo`: + +```sql +// ReferredFKInfo provides the referred foreign key in the child table. +type ReferredFKInfo struct { + Cols []CIStr `json:"cols"` + ChildSchema CIStr `json:"child_schema"` + ChildTable CIStr `json:"child_table"` + ChildFKName CIStr `json:"child_fk"` +} +``` + +```go +type infoSchema struct { + // referredForeignKeyMap records all table's ReferredFKInfo. + // referredSchemaAndTableName => child SchemaAndTableAndForeignKeyName => *model.ReferredFKInfo + referredForeignKeyMap map[SchemaAndTableName]map[SchemaAndTableAndForeignKeyName]*model.ReferredFKInfo +} +``` + +Function `applyTableUpdate` uses `applyDropTable` to drop the old table, uses `applyCreateTable` to create the new table. + +In the function `applyDropTable`, we will delete the table's foreign key information from `infoSchema.referredForeignKeyMap`. + +In the function `applyCreateTable`, we will add the table's foreign key information into `infoSchema.referredForeignKeyMap` first, +then get the table's `ReferredFKInfo` by schema name and table name, then store the `ReferredFKInfo` into `TableInfo.ReferredForeignKeys`. + +Then `applyTableUpdate` will also need to reload the old/new table's referred table information, also uses `applyDropTable` to drop the old reference table, use `applyCreateTable` to create new reference table. + +That's all. + +### Alter Table Add Foreign Key + +Here is an example: + +```sql +create table t1 (id int key,a int, index(a)); +create table t2 (id int key,a int); +alter table t2 add foreign key fk(a) references t1(id) ON DELETE CASCADE; +``` + +Just like create table, we should validate first, and return an error if the conditions for creating foreign keys are not met, and also need to double-check. + +When building `TableInfo`, we need to auto-create an index for foreign key columns if there are no index cover foreign key columns. +And this divides the problem into two cases: +- Case-1: No need to create an index automatically, and only add the foreign key constraint. +- Case-2: Need auto-create index for foreign key + +#### Case-1: Only add foreign key constrain + +The DDL owner handle adds foreign key constrain step is: + +1. None -> Write Only: add foreign key constraint which state is `write-only` into the table. +2. Write Only -> Write Reorg: check all rows in the table whether has related foreign key exists in the reference table, we can use the following SQL to check: + + ```sql + select 1 from t2 where t2.a is not null and t2.a not in (select id from t1) limit 1; + ``` + The expected result is `empty`, otherwise, an error is returned and cancels the DDL job. + +3. Write Reorg -> Public: update the foreign key constraint state to `public`. + +A problem is, How the DML treat the foreign key on delete/update cascade behaviour in which state is non-public? +Here is an example: + +```sql +create table t1 (id int key,a int, index(a)); +create table t2 (id int key,a int, index(a)); +insert into t1 values (1,1); +insert into t2 values (1,1); +alter table t2 add constraint fk_1 foreign key (a) references t1(id) ON DELETE CASCADE; +``` + +The schema change of foreign key `fk_1` is from `None` -> `Write-Only` -> `Write-Reorg` -> `Public`。 +When the foreign key `fk_1` in `Write-Only` state, a DML request has come to be processed: + +```sql +delete from t1 where id = 1; +``` + +Then, TiDB shouldn't do cascade delete for foreign key `fk_1` in state `Write-Only`, since the `Add Foreign Key` DDL job maybe +failed in `Write-Reorg` state and rollback the DDL job. But it is hard to rollback the cascade deleted executed before. + +So, when executing DML with `non-public` foreign key, TiDB will do foreign key constraint check instead of foreign key cascade behaviour. + +#### Case-2: Auto-create index for foreign key and add foreign key constrain + +As TiDB support multi-schema change now, we create an `ActionMultiSchemaChange` job that contains the following 2 sub-ddl job. +- Add Index DDL job +- Add Foreign Key Constraint DDL job + +When TiDB adds foreign key DDL job meet error, TiDB will rollback the `ActionMultiSchemaChange` job and the 2 sub-ddl job will also be rollback. + +### Drop Table + +If `foreign_key_checks` is `ON`, then drop the table which has foreign key references will be rejected. + +```sql +> drop table t1; +(3730, "Cannot drop table 't1' referenced by a foreign key constraint 't2_ibfk_1' on table 't2'.") +``` + +### Drop Database + +If `foreign_key_checks` is `ON`, then drop the database which has foreign key references by another database will be rejected. + +```sql +> drop database test; +(3730, "Cannot drop table 't1' referenced by a foreign key constraint 't2_ibfk_1' on table 't2'.") +``` + +### Drop Index + +Drop index used by the foreign key will be rejected. + +```sql +> set @@foreign_key_checks=0; -- Even disable foreign_key_checks, you still can't drop the index used for foreign key constrain. +Query OK, 0 rows affected +> alter table t2 drop index fk; +(1553, "Cannot drop index 'fk': needed in a foreign key constraint") +``` + +### Rename Column + +Rename column which has foreign keys or references should also need to update the related child/parent table info. + +```sql +create table t1 (id int key,a int, index(a)); +create table t2 (id int key,a int, foreign key fk(a) references t1(id) ON DELETE CASCADE); +rename table t1 to t11; +alter table t11 change column id id1 int; +show create table t2\G +***************************[ 1. row ]*************************** + Table | t2 +Create Table | CREATE TABLE `t2` ( + `id` int NOT NULL, + `a` int DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `fk` (`a`), + CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t11` (`id1`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +``` + +### Truncate Table + +A truncate table which has foreign keys or references should also need to update the related child/parent table info. + +### Modify Column + +Modify column which used by the foreign key will be rejected. + +```sql +> alter table t1 change column id id1 bigint; +(3780, "Referencing column 'a' and referenced column 'id1' in foreign key constraint 't2_ibfk_1' are incompatible.") +``` + +MySQL modify column problem: https://www.percona.com/blog/2019/06/04/ddl-queries-foreign-key-columns-MySQL-pxc/ + +What if the user really needs to modify column type, such as from `INT` to `BIGINT`. Maybe we can offer a variable such as `alter-foreign-keys-method=auto`, +then when the user modifies the column type, TiDB will auto-modify the related foreign key column's type. For easy implementation and to reduce risk, maybe only support modifying column type which doesn't need to reorg table row data. + +## DML Technical Design + +### DML On Child Table + +On Child Table Insert Or Update, need to Find FK column value that exist in the reference table: + +1. Get reference table info by table name. +2. Get the related fk index of the reference table. +3. tiny optimize, check fk column value exists in reference table cache(map[string(index_key)]struct). +3. Get related row in reference. +- Construct index key and then use snapshot `Iter` and `Seek` API to scan. If the index is unique and only contain + foreign key columns, use the snapshot `Get` API. + - `Iter` default scan batch size is 256, need to set 2 to avoid read unnecessary data. +4. compact column value to make sure exist. +5. If relate row exist in reference table, also need to add lock in the related row. +6. put column value into reference fk column value cache. + +#### Lock + +Let's see an example in MySQL first: + +prepare: +```sql +create table t1 (id int key,a int, b int, unique index(a, b, id)); +create table t2 (id int key,a int, b int, index (a,b,id), foreign key fk(a, b) references t1(a, b)); +insert into t1 values (-1, 1, 1); +``` + +Then, execute the following SQL in 2 sessions: + +| Session 1 | Session 2 | +| -------------------------------- | ------------------------------------------- | +| Begin; | | +| insert into t2 values (1, 1, 1); | | +| | delete from t1; -- Blocked by wait lock | +| Commit | | +| | ERROR: Cannot delete or update a parent row | + +So we need to add lock in the reference table when insert/update child table. + +##### In Pessimistic Transaction + +When TiDB add pessimistic locks, if related row exists in the reference table, also needs to add lock in the related row. + +##### In Optimistic Transaction + +Just like `SELECT FOR UPDATE` statement, need to use `doLockKeys` to lock the related row in the reference table. + +##### Issue + +TiDB currently only support `lock for update`(aka write-lock, such as `select for update`), and doesn't support `lock for share`(aka read-lock, such as `select for share`). + +So far we have to add `lock for update` in the reference table when insert/update child table, then the performance will be poor. After TiDB support `lock for share`, we should use `lock for share` instead. + +#### DML Load data + +Load data should also do foreign key check, but report a warning instead error: + +```sql +create table t1 (id int key,a int, index(a)); +create table t2 (id int key,a int, foreign key fk(a) references t1(id) ON DELETE CASCADE); + +test> load data local infile 'data.csv' into table t2 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'; +Query OK, 0 rows affected +test> show warnings; ++---------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Level | Code | Message | ++---------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Warning | 1452 | Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`id`) ON DELETE CASCADE) | +| Warning | 1452 | Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`id`) ON DELETE CASCADE) | ++---------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +``` + +`data.csv` is: +``` +1,1 +2,2 +``` + +### DML On reference Table + +On reference Table Delete Or Update: + +1. modify related child table row by referential action: +- `CASCADE`: update/delete related child table row. +- `SET NULL`: set related child row's foreign key columns value to NULL. +- `RESTRICT`, `NO ACTION`: If related row exist in child table, reject update/delete the reference table. +- `SET DEFAULT`: just like `RESTRICT`. + +modify related child table rows by the following step: +1. get child table info by name(in reference table info). +2. get the child table fk index's column info. +3. build update executor to update child table rows. + +### Issue need to be discussed + +#### Affect Row + +related article: https://www.percona.com/blog/hidden-cost-of-foreign-key-constraints-in-MySQL/ + +Here is a MySQL example: + +prepare: +```sql +create table t1 (id int key,a int, index(a)); +create table t2 (id int key,a int, foreign key fk(a) references t1(id) ON DELETE CASCADE); +insert into t1 values (1, 1); +insert into t2 values (1, 1); +``` + +Then delete on reference table: +```sql +> delete from t1 where id=1; +Query OK, 1 row affected +``` + +As you can see, in the query result, the affected row is 1, but actually should be 2, since the related row in t2 is also been deleted. + +This is a MySQL behaviour, We can be compatible with it. + +#### DML Execution plan + +Here is a MySQL example: + +prepare: +```sql +create table t1 (id int key,a int, index(a)); +create table t2 (id int key,a int, foreign key fk(a) references t1(id) ON DELETE CASCADE); +insert into t1 values (1, 1); +insert into t2 values (1, 1); +``` + +```sql +> explain delete from t1 where id = 1; ++----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+ +| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | ++----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+ +| 1 | DELETE | t1 | | range | PRIMARY | PRIMARY | 4 | const | 1 | 100.0 | Using where | ++----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+ +``` + +From the plan, you can't see any information about the foreign key constraint which needs to delete the related row in child table `t2`. + +I think this is a MySQL issue, should we make TiDB plan better, at least when we meet some slow query, we can know maybe it is caused by modify related rows in the child table. + +Here is an example plan with foreign key: + +```sql +> explain delete from t1 where id = 1; ++-------------------------+---------+------+---------------+-----------------------------------+ +| id | estRows | task | access object | operator info | ++-------------------------+---------+------+---------------+-----------------------------------+ +| Delete_2 | N/A | root | | N/A | +| ├─Point_Get_1 | 1.00 | root | table:t1 | handle:1 | +| └─Foreign_Key_Cascade_3 | 0.00 | root | table:t2 | foreign_key:fk, on_delete:CASCADE | ++-------------------------+---------+------+---------------+-----------------------------------+ +``` + +And the `explain analyze` will show the foreign key cascade child plan: + +```sql +> explain analyze delete from t1 where id = 1; ++-------------------------+---------+---------+------+---------------+----------------------------------------------------------+-----------------------------------+-----------+------+ +| id | estRows | actRows | task | access object | execution info | operator info | memory | disk | ++-------------------------+---------+---------+------+---------------+----------------------------------------------------------+-----------------------------------+-----------+------+ +| Delete_2 | N/A | 0 | root | | time:109.5µs, loops:1 | N/A | 380 Bytes | N/A | +| ├─Point_Get_1 | 1.00 | 1 | root | table:t1 | time:62.7µs, loops:2, Get:{num_rpc:1, total_time:26.4µs} | handle:1 | N/A | N/A | +| └─Foreign_Key_Cascade_3 | 0.00 | 0 | root | table:t2 | total:322.1µs, foreign_keys:1 | foreign_key:fk, on_delete:CASCADE | N/A | N/A | +| └─Delete_7 | N/A | 0 | root | | time:23.5µs, loops:1 | N/A | 129 Bytes | N/A | +| └─Point_Get_9 | 1.00 | 1 | root | table:t2 | time:12.6µs, loops:2, Get:{num_rpc:1, total_time:4.21µs} | handle:1 | N/A | N/A | ++-------------------------+---------+---------+------+---------------+----------------------------------------------------------+-----------------------------------+-----------+------+ +``` + +##### CockroachDB DML Execution Plan + +```sql +CREATE TABLE customers_2 ( + id INT PRIMARY KEY +); +CREATE TABLE orders_2 ( + id INT PRIMARY KEY, + customer_id INT REFERENCES customers_2(id) ON UPDATE CASCADE ON DELETE CASCADE +); +INSERT INTO customers_2 VALUES (1), (2), (3); +INSERT INTO orders_2 VALUES (100,1), (101,2), (102,3), (103,1); +``` + +```sql +> explain analyze UPDATE customers_2 SET id = 23 WHERE id = 1; + info +-------------------------------------------------- + planning time: 494µs + execution time: 5ms + distribution: local + vectorized: true + rows read from KV: 6 (170 B) + cumulative time spent in KV: 978µs + maximum memory usage: 100 KiB + network usage: 0 B (0 messages) + regions: us-east1 + + • root + │ + ├── • update + │ │ nodes: n1 + │ │ regions: us-east1 + │ │ actual row count: 1 + │ │ table: customers_2 + │ │ set: id + │ │ + │ └── • buffer + │ │ label: buffer 1 + │ │ + │ └── • render + │ │ nodes: n1 + │ │ regions: us-east1 + │ │ actual row count: 1 + │ │ KV rows read: 1 + │ │ KV bytes read: 27 B + │ │ + │ └── • scan + │ nodes: n1 + │ regions: us-east1 + │ actual row count: 1 + │ KV rows read: 1 + │ KV bytes read: 27 B + │ missing stats + │ table: customers_2@primary + │ spans: [/1 - /1] + │ locking strength: for update + │ + └── • fk-cascade + fk: fk_customer_id_ref_customers_2 + input: buffer 1 +``` + +##### PostgreSQL DML Execution Plan + +```sql +postgres=# explain analyze UPDATE customers_2 SET id = 20 WHERE id = 23; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------- + Update on customers_2 (cost=0.15..8.17 rows=1 width=10) (actual time=0.039..0.039 rows=0 loops=1) + -> Index Scan using customers_2_pkey on customers_2 (cost=0.15..8.17 rows=1 width=10) (actual time=0.016..0.016 rows=1 loops=1) + Index Cond: (id = 23) + Planning Time: 0.057 ms + Trigger for constraint orders_2_customer_id_fkey on customers_2: time=0.045 calls=1 + Trigger for constraint orders_2_customer_id_fkey on orders_2: time=0.023 calls=2 + Execution Time: 0.129 ms +``` + +## Compatibility + +Since the old version TiDB already support foreign key syntax, but doesn't support it, after upgrade TiDB to latest version, the foreign key created before won't take effect. Only foreign keys created in the new version actually take effect. + +You can use `SHOW CREATE TABLE` to see whethere a foreign key is take effect, the old version foreign key will have a comment `/* FOREIGN KEY INVALID */` to indicate it is invalid, the new version foreign key doesn't have this comment. + +```sql +> show create table t2\G + ***************************[ 1. row ]*************************** + Table | t2 +Create Table | CREATE TABLE `t2` ( + `id` int(11) NOT NULL, + PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */, + CONSTRAINT `fk` FOREIGN KEY (`id`) REFERENCES `test`.`t1` (`id`) ON DELETE CASCADE ON UPDATE CASCADE /* FOREIGN KEY INVALID */ + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin +``` + +## Impact + +### Impact of data replication + +#### TiCDC + +When syncing table data to downstream TiDB, TiCDC should `set @@foreign_key_checks=0` in downstream TiDB. + +#### DM + +When doing full synchronization, DM should `set @@foreign_key_checks=0` in downstream TiDB. + +When doing incremental synchronization, DM should set `foreign_key_checks` session variable according to MySQL binlog. + +#### BR + +When restore data into TiDB, BR should `set @@foreign_key_checks=0` in TiDB. + +## Test Case + +Cascade modification test case: + +```sql +drop table if exists t3,t2,t1; +create table t1 (id int key,a int, index(a)); +create table t2 (id int key,a int, foreign key fk(a) references t1(id) ON DELETE CASCADE); +create table t3 (id int key,a int, foreign key fk(a) references t2(id) ON DELETE CASCADE); +insert into t1 values (1,1); +insert into t2 values (2,1); +insert into t3 values (3,2); +delete from t1 where id = 1; -- both t1, t2, t3 rows are deleted. +``` + +Following is a MySQL test case about `SET DEFAULT`, as you can see, MySQL actualy doesn't support `SET DEFAULT`, the behaviour is just like `RESTRICT` + +```sql +MySQL>create table t1 (a int,b int, index(a,b)) ; +Query OK, 0 rows affected +Time: 0.022s +MySQL>create table t (a int, b int, foreign key fk_a(a) references test.t1(a) ON DELETE SET DEFAULT); +Query OK, 0 rows affected +Time: 0.019s +MySQL>insert into t1 values (1,1); +Query OK, 1 row affected +Time: 0.003s +MySQL>insert into t values (1,1); +Query OK, 1 row affected +Time: 0.006s +MySQL>delete from t1 where a=1; +(1451, 'Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t`, CONSTRAINT `t_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`a`))') +MySQL>select version(); ++-----------+ +| version() | ++-----------+ +| 8.0.29 | ++-----------+ +``` + +### Self-Referencing Tables + +For example, table `employee` has a column `manager_id` references to `employee.id`. + +```sql +create table employee (id int key,manager_id int, foreign key fk(manager_id) references employee(id) ON DELETE CASCADE); +insert into employee values (1,1); +insert into employee values (2,1); + +test> delete from employee where id=1; +Query OK, 1 row affected +test> select * from employee; ++----+---+ +| id | a | ++----+---+ +0 rows in set +``` + +A case of self-reference and cyclical dependencies: + +```sql +test> create table t (id int key,a int, foreign key fk_a(a) references t(id) ON DELETE CASCADE, foreign key fk_id(id) references t(a) ON DELETE CASCADE); +Query OK, 0 rows affected +Time: 0.045s +test> insert into t values (1,1); +(1452, 'Cannot add or update a child row: a foreign key constraint fails (`test`.`t`, CONSTRAINT `t_ibfk_2` FOREIGN KEY (`id`) REFERENCES `t` (`a`) ON DELETE CASCADE)') +``` + +### Cyclical Dependencies + +```sql +create table t1 (id int key,a int, index(a)); +create table t2 (id int key,a int, foreign key fk(a) references t1(id) ON DELETE CASCADE); +insert into t1 values (1,1); +ALTER TABLE t1 ADD foreign key fk(a) references t2(id) ON DELETE CASCADE; +(1452, 'Cannot add or update a child row: a foreign key constraint fails (`test`.`#sql-298_8`, CONSTRAINT `t1_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t2` (`id`) ON DELETE CASCADE)') +``` + +```sql +set @@foreign_key_checks=0; +create table t1 (id int key,a int, foreign key fk(a) references t2(id) ON DELETE CASCADE); +create table t2 (id int key,a int, foreign key fk(a) references t1(id) ON DELETE CASCADE); +insert into t1 values (1, 2); +insert into t2 values (2, 1); +set @@foreign_key_checks=1; -- add test case without this. +delete from t1 where id=1; +test> select * from t2; ++----+---+ +| id | a | ++----+---+ +0 rows in set +Time: 0.004s +test> select * from t1; ++----+---+ +| id | a | ++----+---+ +0 rows in set +``` + +### Check order + +check order should check unique/primary key constrain first: + +```sql +test> create table t1 (id int key,a int, index(a)); +test> create table t2 (id int key,a int, foreign key fk(a) references t1(id) ON DELETE CASCADE); +test> insert into t1 values (1, 1); +test> insert into t2 values (1, 1); +test> insert into t2 values (1, 2); +(1062, "Duplicate entry '1' for key 't2.PRIMARY'") +test> insert ignore into t2 values (1, 2); +Query OK, 0 rows affected +``` + +### MATCH FULL or MATCH SIMPLE + +This definition is from [CRDB](https://www.cockroachlabs.com/docs/v22.1/foreign-key.html#match-composite-foreign-keys-with-match-simple-and-match-full). MySQL doesn't mention it, here is a MySQL test case: + +Here is an MySQL example: + +```sql +create table t1 (i int, a int,b int, index(a,b)) ; +create table t (a int, b int, foreign key fk_a(a,b) references test.t1(a,b)); + +test> insert into t values (null,1); +Query OK, 1 row affected +test> insert into t values (null,null); +Query OK, 1 row affected +test> insert into t values (1,null); +Query OK, 1 row affected +``` + +## reference + +- [MySQL FOREIGN KEY Constraints Document](https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html#foreign-key-adding) +- [3 Common Foreign Key Mistakes (And How to Avoid Them)](https://www.cockroachlabs.com/blog/common-foreign-key-mistakes/) +- [Hidden Cost of Foreign Key Constraints in MySQL](https://www.percona.com/blog/hidden-cost-of-foreign-key-constraints-in-MySQL/) +- [DDL Queries on Foreign Key Columns in MySQL/PXC](https://www.percona.com/blog/2019/06/04/ddl-queries-foreign-key-columns-mysql-pxc/) diff --git a/docs/design/2022-09-28-flashback-to-timestamp.md b/docs/design/2022-09-28-flashback-to-timestamp.md index 9f3c2e2ef7fab..d71ff39404179 100644 --- a/docs/design/2022-09-28-flashback-to-timestamp.md +++ b/docs/design/2022-09-28-flashback-to-timestamp.md @@ -1,5 +1,6 @@ # Proposal: Flashback To Timestamp -- Author(s): [Defined2014](https://github.com/Defined2014) and [JmPotato](https://github.com/JmPotato) +- Author(s): [Defined2014](https://github.com/Defined2014) and [JmPotato](https://github.com/JmPotato) +- Last updated: 2022-12-19 - Tracking Issues: https://github.com/pingcap/tidb/issues/37197 and https://github.com/tikv/tikv/issues/13303 ## Abstract @@ -61,19 +62,19 @@ Then a `Flashback To Timestamp` DDL job can be simply divided into the following * Pre-checks. After all checks are passed, TiDB will disable GC and closed PD schedule for the cluster. The specific checks are as follows: * The FlashbackTS is after `tikv_gc_safe_point`. - * The FlashbackTS is before the minimal store resolved TS. - * No related DDL history in flashback time range. + * The FlashbackTS is before the minimal store resolved timestamp. + * No DDL job was executing at FlashbackTS. * No running related DDL jobs. * TiDB get flashback key ranges and splits them into separate regions to avoid locking unrelated key ranges. Then TiDB send `PrepareFlashbackToVersion` RPC requests to lock regions in TiKV. Once locked, no more read, write and scheduling operations are allowed for those regions. -* After locked all relevant key ranges, the DDL Owner will update schema version and synchronize it to other TiDBs. When other TiDB applies the `SchemaDiff` of type `Flashback To Timestamp`, it will disconnect all relevant links. +* After locked all relevant key ranges, the DDL owner will update schema version and synchronize it to other TiDBs. When other TiDB applies the `SchemaDiff` of type `Flashback To Timestamp`, it will disconnect all relevant links. * Send `FlashbackToVersion` RPC requests to all relevant key ranges with same `commit_ts`. Each region handles its own flashback progress independently. * Read the old MVCC data and write it again with the given `commit_ts` to pretend it's a new transaction commit. * Release the Raft proposing lock and resume the lease read. -* TiDB checks whether all the requests returned successfully, and retries those that failed with same `commit_ts` until the whole flashback is done. +* TiDB checks whether all the requests returned successfully, and retries those failed requests with the same `commit_ts`. After all requests finished, the DDL owner update the schema version with new type named `ReloadSchemaMap`, so that all TiDB servers regenerate the schema map from TiKV. * After `Flashback To Timestamp` is finished, TiDB will restore all changed global variables and restart PD schedule. At the same time, notify `Stats Handle` to reload statistics from TiKV. @@ -101,17 +102,7 @@ FLASHBACK TABLE [table1], [table2] TO TIMESTAMP '2022-08-10 08:00:00'; ### Limitations and future Work -1. DDL history exists for the flashback time period is not currently supported, the error message is shown below: - -```sql -mysql> ALTER TABLE t ADD INDEX i(a); -Query OK, 0 rows affected (2.99 sec) - -mysql> FLASHBACK CLUSTER TO TIMESTAMP '2022-10-10 11:53:30'; -ERROR 1105 (HY000): Had ddl history during [2022-10-10 11:53:30 +0800 CST, now), can't do flashback -``` - -2. Compare with the other DDL jobs, `Flashback To Timestamp` job cannot be rollbacked after some regions failure and also needs to resend rpc to all regions when ddl owner crashed. In the future, we will improve those two issues with a new TiKV interface and new distributed processing ddl framework. +1. Compare with the other DDL jobs, `Flashback To Timestamp` job cannot be rollbacked after some regions failure and also needs to resend rpc to all regions when ddl owner crashed. In the future, we will improve those two issues with a new TiKV interface and new distributed processing ddl framework. ### Alternative Solutions diff --git a/docs/design/2022-09-29-reorganize-partition.md b/docs/design/2022-09-29-reorganize-partition.md new file mode 100644 index 0000000000000..56e380826efa7 --- /dev/null +++ b/docs/design/2022-09-29-reorganize-partition.md @@ -0,0 +1,180 @@ +# TiDB Design Documents + +- Author(s): [Mattias Jonsson](http://github.com/mjonss) +- Discussion PR: https://github.com/pingcap/tidb/issues/38535 +- Tracking Issue: https://github.com/pingcap/tidb/issues/15000 + +## Table of Contents + +* [Introduction](#introduction) +* [Motivation or Background](#motivation-or-background) +* [Detailed Design](#detailed-design) + * [Schema change states for REORGANIZE PARTITION](#schema-change-states-for-reorganize-partition) + * [Error Handling](#error-handling) + * [Notes](#notes) +* [Test Design](#test-design) + * [Benchmark Tests](#benchmark-tests) +* [Impacts & Risks](#impacts--risks) + +## Introduction + +Support ALTER TABLE t REORGANIZE PARTITION p1,p2 INTO (partition pNew1 values...) + +## Motivation or Background + +TiDB is currently lacking the support of changing the partitions of a partitioned table, it only supports adding and dropping LIST/RANGE partitions. +Supporting REORGANIZE PARTITIONs will allow RANGE partitioned tables to have a MAXVALUE partition to catch all values and split it into new ranges. Similar with LIST partitions where one can split or merge different partitions. + +When this is implemented, it will also allow future PRs transforming a non-partitioned table into a partitioned table as well as remove partitioning and make a partitioned table a normal non-partitioned table, as well as COALESCE PARTITION and ADD PARTITION for HASH partitioned tables, which is different ALTER statements but can use the same implementation as REORGANIZE PARTITION + +The operation should be online, and must handle multiple partitions as well as large data sets. + +Possible usage scenarios: +- Full table copy + - merging all partitions to a single table (ALTER TABLE t REMOVE PARTITIONING) + - splitting data from many to many partitions, like change the number of HASH partitions + - splitting a table to many partitions (ALTER TABLE t PARTITION BY ...) +- Partial table copy (not full table/all partitions) + - split one or more partitions + - merge two or more partitions + +These different use cases can have different optimizations, but the generic form must still be solved: +- N partitions, where each partition has M indexes + +First implementation should be based on the merge-txn (row-by-row batch read, update record key with new Physical Table ID, write) transactional batches and then create the indexes in batches index by index, partition by partition. +Later we can implement the ingest (lightning way) optimization, since DDL module are on the way of evolution to do reorg tasks more efficiency. + +## Detailed Design + +There are two parts of the design: +- Schema change states throughout the operation +- Reorganization implementation, which will be handled in the StateWriteReorganization state. + +Where the schema change states will clarify which different steps that will be done in which schema state transitions. + +### Schema change states for REORGANIZE PARTITION + +Since this operation will: +- create new partitions +- copy data from dropped partitions to new partitions and create their indexes +- change the partition definitions +- drop existing partitions + +It will use all these schema change stages: + + // StateNone means this schema element is absent and can't be used. + StateNone SchemaState = iota + - Check if the table structure after the ALTER is valid + - Use the generate physical table ids to each new partition (that was generated already by the client sending the ALTER command). + - Update the meta data with the new partitions (AddingDefinitions) and which partitions to be dropped (DroppingDefinitions), so that new transactions can double write. + - Set placement rules + - Set TiFlash Replicas + - Set legacy Bundles (non-sql placement) + - Set the state to StateDeleteOnly + + // StateDeleteOnly means we can only delete items for this schema element (the new partition). + StateDeleteOnly + - Set the state to StateWriteOnly + + // StateWriteOnly means we can use any write operation on this schema element, + // but outer can't read the changed data. + StateWriteOnly + - Set the state to StateWriteReorganization + + // StateWriteReorganization means we are re-organizing whole data after write only state. + StateWriteReorganization + - Copy the data from the partitions to be dropped (one at a time) and insert it into the new partitions. This needs a new backfillWorker implementation. + - Recreate the indexes one by one for the new partitions (one partition at a time) (create an element for each index and reuse the addIndexWorker). (Note: this can be optimized in the futute, either with the new fast add index implementation, based on lightning. Or by either writing the index entries at the same time as the records, in the previous step, or if the partitioning columns are included in the index or handle) + - Replace the old partitions with the new partitions in the metadata when the data copying is done + - Set the state to StateDeleteReorganization + + // StateDeleteReorganization means we are re-organizing whole data after delete only state. + StateDeleteReorganization - we are using this state in a slightly different way than the comment above says. + This state is needed since we cannot directly move from StateWriteReorganization to StatePublic. + Imagine that the StateWriteReorganization is complete and we are updating the schema version, then if a transaction seeing the new schema version is writing to the new partitions, then those changes needs to be written to the old partitions as well, so new transactions in other nodes using the older schema version can still see the changes. + - Remove the notion of new partitions (AddingDefinitions) and which partitions to be dropped (DroppingDefinitions) and double writing will stop when it goes to StatePublic. + - Register the range delete of the old partition data (in finishJob / deleteRange). + - Set the state to StatePublic + + // StatePublic means this schema element is ok for all write and read operations. + StatePublic + - Table structure is now complete and the table is ready to use with its new partitioning scheme + - Note that there is a background job for the GCWorker to do in its deleteRange function. + +During the reorganization happens in the background the normal write path needs to check if there are any new partitions in the metadata and also check if the updated/deleted/inserted row would match a new partition, and if so, also do the same operation in the new partition, just like during adding index or modify column operations currently does. (To be implemented in `(*partitionedTable) AddRecord/UpdateRecord/RemoveRecord`) + +Example of why an extra state between StateWriteReorganize and StatePublic is needed: + +```sql +-- table: +CREATE TABLE t (a int) PARTITION BY LIST (a) (PARTITION p0 VALUES IN (1,2,3,4,5), PARTITION p1 VALUES IN (6,7,8,9,10)); +-- during alter operation: +ALTER TABLE t REORGANIZE PARTITION p0 INTO (PARTITION p0a VALUES IN (1,2,3), PARTITION p0b VALUES IN (4,5)); +``` + +Partition within parentheses `(p0a [1] p0b [0])` is hidden or to be deleted by GC/DeleteRange. Values in the brackets after the partition `p0a [2]`. + +If we go directly from StateWriteReorganize to StatePublic, then clients one schema version behind will not see changes to the new partitions: + +| Data (TiKV/Unistore) | TiDB client 1 | TiDB client 2 | +| --------------------------------------- | ------------------------------------ | ------------------------------------------------------------ | +| p0 [] p1 [] StateWriteReorganize | | | +| p0 [] p1 [] (p0a [] p0b []) | | | +| (p0 []) p1 [] p0a [] p0b [] StatePublic | | | +| (p0 []) p1 [] p0a [2] p0b [] | StatePublic INSERT INTO T VALUES (2) | | +| (p0 []) p1 [] p0a [2] p0b [] | | StateWriteReorganize SELECT * FROM t => [] (only sees p0,p1) | + + +But if we add a state between StateWriteReorganize and StatePublic and double write to the old partitions during that state it works: + + +| Data (TiKV/Unistore) | TiDB client 1 | TiDB client 2 | +| ------------------------------------------------- | ---------------------------------------------- | -------------------------------------------------------------------- | +| p0 [] p1 [] (p0a [] p0b []) StateWriteReorganize | | | +| (p0 []) p1 [] p0a [] p0b [] StateDeleteReorganize | | | +| (p0 [2]) p1 [] p0a [2] p0b [] | StateDeleteReorganize INSERT INTO T VALUES (2) | | +| (p0 [2]) p1 [] p0a [2] p0b [] | | StateWriteReorganize SELECT * FROM t => [2] (only sees p0,p1) | +| (p0 [2]) p1 [] p0a [2] p0b [] StatePublic | | | +| (p0 [2]) p1 [] p0a [2] p0b [4] | StatePublic INSERT INTO T VALUES (4) | | +| (p0 [2]) p1 [] p0a [2] p0b [4] | | StateDeleteReorganize SELECT * FROM t => [2,4] (sees p0a,p0b,p1) | + + +### Error handling + +If any non-retryable error occurs, we will call onDropTablePartition and adjust the logic in that function to also handle the roll back of reorganize partition, in a similar way as it does with model.ActionAddTablePartition. + +### Notes + +Note that parser support already exists. +There should be no issues with upgrading, and downgrade will not be supported during the DDL. + +Notes: +- statistics should be removed from the old partitions. +- statistics will not be generated for the new partitions (future optimization possible, to get statistics during the data copying?) +- the global statistics (table level) will remain the same, since the data has not changed. +- this DDL will be online, while MySQL is blocking on MDL. + +## Test Design + +Re-use tests from other DDLs like Modify column, but adjust them for Reorganize partition. +A separate test plan will be created and a test report will be written and signed off when the tests are completed. + +### Benchmark Tests + +Correctness and functionality is higher priority than performance. + +## Impacts & Risks + +Impacts: +- better usability of partitioned tables +- online alter in TiDB, where MySQL is blocking +- all affected data needs to be read (CPU/IO/Network load on TiDB/PD/TiKV), even multiple times in case of indexes. +- all data needs to be writted (duplicated, both row-data and indexes), including transaction logs (more disk space on TiKV, CPU/IO/Network load on TiDB/PD/TiKV and TiFlash if configured on the table). + +Risks: +- introduction of bugs + - in the DDL code + - in the write path (double writing the changes for transactions running during the DDL) +- out of disk space +- out of memory +- general resource usage, resulting in lower performance of the cluster diff --git a/docs/design/2022-11-22-view-hint.md b/docs/design/2022-11-22-view-hint.md new file mode 100644 index 0000000000000..b780208a13f45 --- /dev/null +++ b/docs/design/2022-11-22-view-hint.md @@ -0,0 +1,134 @@ +# View Hint Design Doc +- Author: Reminiscent +- Tracking Issue: https://github.com/pingcap/tidb/issues/37887 + +## Background +Hints that specify a table generally refer to tables in the DELETE, SELECT, or UPDATE query block in which the hint occurs, not to tables inside any views referenced by the statement. So we introduce the view hint to specify the table in view instead of embedding the hint in the view. + +In Oracle, there are three ways to use the global hint. (Node: the `{}` part is only used for explanation) +```SQL +CREATE OR REPLACE VIEW v AS +SELECT {SEL$2} * from e1 join (select {SEL$3} * from e3) e2 on e1.a = e2.a; + +SELECT {SEL$1} * FROM v; + +A. SELECT /*+ INDEX(v.e2.e3 idx) */ * FROM v; // /*+ INDEX(@SEL$1 v.e2.e3 idx) */ + +B. SELECT /*+ INDEX(@SEL$2 e2.e3 idx) */ * FROM v; + +C. SELECT /*+ INDEX(@SEL$3 e3 idx) */ * FROM v; +``` + +Compared with TiDB, Oracle has two differences: +1. Oracle can use `alias.table` to represent in subquery, such as e2.e3. Besides, TiDB can use `db.table` to represent a table. +2. The count for query block number treats view like a subquery, which means the select parts in view are counted. + +Based on the difference, there are some reasons why TiDB can not just use the grammar from Oracle: +1. Compatibility + 1. Grammar. + 1. We can not use the `alias.table` to represent in subquery, such as e2.e3. + 2. We can use `db.table` to represent a table. So if we want to use the `view.table` to represent a table in view, we should change the grammar or it will conflict with db.table. + 2. The count for the query block. + 1. Previously, the query block in view would not be counted. But now, if we take the view into consideration, it will change the origin count. For example, in the following part. The count of the query block for the `select a from t1` will be changed from `@SEL_2` to `@SEL_3`. So if we use the query block related hints for this part, it will be invalid or represent the content in the view. + +```SQL +CREATE OR REPLACE VIEW v AS +SELECT {SEL$2} * FROM t; + +SELECT {SEL$1} * FROM v JOIN (select {SEL$3} a from t1) t2 on v.a = t2.a; +``` + +So based on the above reasons, we should introduce another way to let hint take effect in the view. + +## Detailed Design +### How does origin hint framework work? +1. Parser: parse the sql text and get the basic information about the hint. Handle hint syntax error in this phase. +2. Optimizer: + 1. Divide and mark the query block. Besides, group the hints in the same query blocks. + 2. In the plan builder phase, when we try to build select. We will handle the hints in the current query block. Including doing some simple checks and building the hints structure which can be used by planner. + 3. When we build some logical operators, we will use the hints which belongs to the current query block. And tt will use the table in hint to match the table in the plan node. For example, when we build the `DataSource` operator, it will generate the possible access path based on the index hints. When we build the `Aggregation` operator, it will set the aggregation algorithm based on the agg hints. And for the `Join` operator, it will store the hint in the join node and use the hint information in the physical optimization phase. The warning about which table is not used in the hint will be recorded in this phase. + 4. Use the hint information in the physical optimization phase to determine which physical algorithm should be used. And if the hint can not take effect, it will report warning. For example, if the join can not use the index join, but we set the index join hint in the sql text. It will report related warnings. + +### View Hint Design +Based on the goal and current infrastructure for hint. I extend the current usage of the qb_name hint to a bigger scope to support the view hint. + +An example to show the usage of the current `qb_name` hint. +```SQL +select /*+ stream_agg(@qb) merge_join(t1@qb)*/ * from (select /*+ qb_name(qb) */ count(*) from t1 join t2 on t1.a = t2.a) tt; +``` +1. First, we define the name for some query blocks. +2. Then we can use the query block name to represent the query block. + +Based on the meaning of `qb_name` hint now, we can expand it to support the view. The basic idea is the same here. We define the query block name in the view first. And then we can use the query block name to represent the contents in the view. Now the grammar is expanded from +`qb_name(name)` in the query block which you want to rename +To +`qb_name(name, viewName@queryBlockNum . {viewName}@queryBlockNum . ...)` in the first query block to represent any query block. Besides, we will reset the count for query block in every view. It means, for every view, it always counts from 1 and it will not effect the outer part. +For example: +```SQL +create table t(a int, b int); +create table t1(a int, b int); +create table t2(a int, b int); + +create view v as select {@SEL_1}{5} t.a, t.b from t join (select {@SEL_2}{6} t1.a from t1 join t2 on t1.b=t2.b) tt on t.a = tt.a; + +create view v1 as select {@SEL_1}{3} t.a, t.b from t join (select {@SEL_2}{4} from t1 join v on t1.b=v.b) tt on t.a = tt.a; + +create view v2 as select {@SEL_1}{1} t.a, t.b from t join (select {@SEL_2}{2} t1.a from t1 join v1 join v3 on t1.b=v1.b) tt on t.a = tt.a; + +select {@SEL_1} * from v2; + +/* We can use the following part to represent the {1} - {6} */ +1: qb_name(v2_sel1, v2@sel_1 . @sel_1) +2: qb_name(v2_sel2, v2@sel_1 . @sel_2) +3: qb_name(v1_sel1, v2@sel_1 . v1@sel_2 . @sel_1) +4: qb_name(v1_sel2, v2@sel_1 . v1@sel_2 . @sel_2) +5: qb_name(v_sel1, v2@sel_1 . v1@sel_2 . v@sel_2 . @sel_1) +6: qb_name(v_sel2, v2@sel_1 . v1@sel_2 . v@sel_2 . @sel_2) +``` +Take the previous as example: +```SQL +CREATE OR REPLACE VIEW v AS +SELECT * from e1 join (select count(*) from e3) e2 on e1.a = e2.a; + + +/* In Oracle */ +A1. SELECT /*+ INDEX(v.e2.e3 idx) */ * FROM v; + +A2. SELECT /*+ INDEX(@SEL$1 v.e2.e3 idx) */ * FROM v; + +B. SELECT /*+ INDEX(@SEL$2 e2.e3 idx) */ * FROM v; + +C. SELECT /*+ INDEX(@SEL$3 e3 idx) */ * FROM v; + +/* In TiDB */ +SELECT /*+ qb_name(viewSub, v@sel_1 . @sel_2) use_index(e3@viewSub, idx) hash_agg(viewSub) */ * FROM v; +``` + +### Implementation +Parser part is easy to implement. Just to expand the origin `qb_name` hint grammar. The only problem maybe is how to express the nested view(use dot or blank or something else). + +For the planner part: +1. At the beginning of the optimization, we should handle the query block name hint for view and the other method hints for view. And group these hints based on the query block name. +2. When we try to build the data source from the view, we have to traverse all of the query blocks for views. Check whether the view name in hint can match the data source or not. If there are some hints that can match, we pass it to the `buildDataSourceFromView`. +3. When we try to build the view plan, we first handle the hints which are passed by the caller. Distinguish which hints belong to the current view and which belongs to the nested view. If the hint belongs to the current view, we transform the hint to the normal hint. If the hints belong to the nested view. Then we will do the same thing, like step2. + +Besides the planner part, we need support to show the query block for a sql to increase usability. The user can copy the result and use it in hint directly. + +### Support Scope +1. We can support almost all physical algorithm's hints. Like join hints/ agg hints/ index etc. +2. Do not support the leading hints which may be across the view. But we can support the leading hint in the same view. + +### Pros and Cons +Pros: +1. No compatibility problems. Just expand the usage of the existing hint. +2. It is easier to implement. It can use the origin hints' infrastructure as much as possible. +3. It can support almost all the hints which can take effect in the query block. Oracle can only support the join order, join method and access path hints. + +Cons: +1. It may not be easy to write the query block name hint for a view. +2. The user should define the query block name hint first. + +## Reference +[Oracle Global Hint](https://docs.oracle.com/cd/E18283_01/server.112/e16638/hintsref.htm#i27644) + + diff --git a/docs/logo_with_text.png b/docs/logo_with_text.png deleted file mode 100644 index 722bbf8f8c53a..0000000000000 Binary files a/docs/logo_with_text.png and /dev/null differ diff --git a/docs/tidb-architecture.png b/docs/tidb-architecture.png new file mode 100644 index 0000000000000..e3360c45258dd Binary files /dev/null and b/docs/tidb-architecture.png differ diff --git a/docs/tidb-logo-with-text.png b/docs/tidb-logo-with-text.png new file mode 100644 index 0000000000000..111465b9fc842 Binary files /dev/null and b/docs/tidb-logo-with-text.png differ diff --git a/domain/BUILD.bazel b/domain/BUILD.bazel index f7ef9baba6907..6e1618129990e 100644 --- a/domain/BUILD.bazel +++ b/domain/BUILD.bazel @@ -6,6 +6,7 @@ go_library( "domain.go", "domain_sysvars.go", "domainctx.go", + "historical_stats.go", "optimize_trace.go", "plan_replayer.go", "plan_replayer_dump.go", @@ -31,10 +32,12 @@ go_library( "//errno", "//infoschema", "//infoschema/perfschema", + "//keyspace", "//kv", "//meta", "//metrics", "//owner", + "//parser", "//parser/ast", "//parser/model", "//parser/mysql", @@ -45,25 +48,31 @@ go_library( "//sessionctx/variable", "//statistics/handle", "//telemetry", + "//ttl/ttlworker", "//types", "//util", "//util/chunk", "//util/dbterror", "//util/domainutil", "//util/engine", + "//util/etcd", "//util/execdetails", "//util/expensivequery", + "//util/intest", "//util/logutil", "//util/memory", "//util/memoryusagealarm", "//util/printer", + "//util/replayer", "//util/servermemorylimit", "//util/sqlexec", + "//util/syncutil", "@com_github_burntsushi_toml//:toml", "@com_github_ngaut_pools//:pools", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/metapb", + "@com_github_pingcap_kvproto//pkg/pdpb", "@com_github_pingcap_log//:log", "@com_github_stretchr_testify//require", "@com_github_tikv_client_go_v2//oracle", @@ -105,6 +114,7 @@ go_test( "//ddl", "//domain/infosync", "//errno", + "//keyspace", "//kv", "//metrics", "//parser/ast", @@ -118,6 +128,7 @@ go_test( "//testkit/testsetup", "//util", "//util/mock", + "//util/replayer", "@com_github_ngaut_pools//:pools", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", diff --git a/domain/db_test.go b/domain/db_test.go index ff6e6b625788a..02f716a27b3a8 100644 --- a/domain/db_test.go +++ b/domain/db_test.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/domain/infosync" + "github.com/pingcap/tidb/keyspace" "github.com/pingcap/tidb/server" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store/mockstore" @@ -73,7 +74,7 @@ func TestNormalSessionPool(t *testing.T) { domain, err := session.BootstrapSession(store) require.NoError(t, err) defer domain.Close() - info, err1 := infosync.GlobalInfoSyncerInit(context.Background(), "t", func() uint64 { return 1 }, nil, true) + info, err1 := infosync.GlobalInfoSyncerInit(context.Background(), "t", func() uint64 { return 1 }, nil, nil, nil, keyspace.CodecV1, true) require.NoError(t, err1) conf := config.GetGlobalConfig() conf.Socket = "" @@ -107,7 +108,7 @@ func TestAbnormalSessionPool(t *testing.T) { domain, err := session.BootstrapSession(store) require.NoError(t, err) defer domain.Close() - info, err1 := infosync.GlobalInfoSyncerInit(context.Background(), "t", func() uint64 { return 1 }, nil, true) + info, err1 := infosync.GlobalInfoSyncerInit(context.Background(), "t", func() uint64 { return 1 }, nil, nil, nil, keyspace.CodecV1, true) require.NoError(t, err1) conf := config.GetGlobalConfig() conf.Socket = "" diff --git a/domain/domain.go b/domain/domain.go index 1016d5ba9b5cb..bd5d0f63c5698 100644 --- a/domain/domain.go +++ b/domain/domain.go @@ -17,7 +17,9 @@ package domain import ( "context" "fmt" + "math" "math/rand" + "sort" "strconv" "strings" "sync" @@ -29,6 +31,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/kvproto/pkg/pdpb" "github.com/pingcap/log" "github.com/pingcap/tidb/bindinfo" "github.com/pingcap/tidb/br/pkg/streamhelper" @@ -43,6 +46,7 @@ import ( "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/infoschema/perfschema" + "github.com/pingcap/tidb/keyspace" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/metrics" @@ -57,17 +61,22 @@ import ( "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics/handle" "github.com/pingcap/tidb/telemetry" + "github.com/pingcap/tidb/ttl/ttlworker" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/domainutil" "github.com/pingcap/tidb/util/engine" + "github.com/pingcap/tidb/util/etcd" "github.com/pingcap/tidb/util/expensivequery" + "github.com/pingcap/tidb/util/intest" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/memoryusagealarm" + "github.com/pingcap/tidb/util/replayer" "github.com/pingcap/tidb/util/servermemorylimit" "github.com/pingcap/tidb/util/sqlexec" + "github.com/tikv/client-go/v2/tikv" "github.com/tikv/client-go/v2/txnkv/transaction" pd "github.com/tikv/pd/client" clientv3 "go.etcd.io/etcd/client/v3" @@ -90,33 +99,42 @@ func NewMockDomain() *Domain { // Domain represents a storage space. Different domains can use the same database name. // Multiple domains can be used in parallel without synchronization. type Domain struct { - store kv.Storage - infoCache *infoschema.InfoCache - privHandle *privileges.Handle - bindHandle atomic.Pointer[bindinfo.BindHandle] - statsHandle unsafe.Pointer - statsLease time.Duration - ddl ddl.DDL - info *infosync.InfoSyncer - globalCfgSyncer *globalconfigsync.GlobalConfigSyncer - m sync.Mutex - SchemaValidator SchemaValidator - sysSessionPool *sessionPool - exit chan struct{} - etcdClient *clientv3.Client + store kv.Storage + infoCache *infoschema.InfoCache + privHandle *privileges.Handle + bindHandle atomic.Pointer[bindinfo.BindHandle] + statsHandle unsafe.Pointer + statsLease time.Duration + ddl ddl.DDL + info *infosync.InfoSyncer + globalCfgSyncer *globalconfigsync.GlobalConfigSyncer + m sync.Mutex + SchemaValidator SchemaValidator + sysSessionPool *sessionPool + exit chan struct{} + // `etcdClient` must be used when keyspace is not set, or when the logic to each etcd path needs to be separated by keyspace. + etcdClient *clientv3.Client + // `unprefixedEtcdCli` will never set the etcd namespace prefix by keyspace. + // It is only used in storeMinStartTS and RemoveMinStartTS now. + // It must be used when the etcd path isn't needed to separate by keyspace. + // See keyspace RFC: https://github.com/pingcap/tidb/pull/39685 + unprefixedEtcdCli *clientv3.Client sysVarCache sysVarCache // replaces GlobalVariableCache slowQuery *topNSlowQueries expensiveQueryHandle *expensivequery.Handle memoryUsageAlarmHandle *memoryusagealarm.Handle serverMemoryLimitHandle *servermemorylimit.Handle - wg util.WaitGroupWrapper - statsUpdating atomicutil.Int32 - cancel context.CancelFunc - indexUsageSyncLease time.Duration - dumpFileGcChecker *dumpFileGcChecker - planReplayerHandle *planReplayerHandle - expiredTimeStamp4PC types.Time - logBackupAdvancer *daemon.OwnerDaemon + // TODO: use Run for each process in future pr + wg *util.WaitGroupEnhancedWrapper + statsUpdating atomicutil.Int32 + cancel context.CancelFunc + indexUsageSyncLease time.Duration + dumpFileGcChecker *dumpFileGcChecker + planReplayerHandle *planReplayerHandle + expiredTimeStamp4PC types.Time + logBackupAdvancer *daemon.OwnerDaemon + historicalStatsWorker *HistoricalStatsWorker + ttlJobManager atomic.Pointer[ttlworker.JobManager] serverID uint64 serverIDSession *concurrency.Session @@ -181,6 +199,7 @@ func (do *Domain) loadInfoSchema(startTS uint64) (infoschema.InfoSchema, bool, i // 1. Not first time bootstrap loading, which needs a full load. // 2. It is newer than the current one, so it will be "the current one" after this function call. // 3. There are less 100 diffs. + // 4. No regenrated schema diff. startTime := time.Now() if currentSchemaVersion != 0 && neededSchemaVersion > currentSchemaVersion && neededSchemaVersion-currentSchemaVersion < 100 { is, relatedChanges, err := do.tryLoadSchemaDiffs(m, currentSchemaVersion, neededSchemaVersion) @@ -190,6 +209,7 @@ func (do *Domain) loadInfoSchema(startTS uint64) (infoschema.InfoSchema, bool, i zap.Int64("currentSchemaVersion", currentSchemaVersion), zap.Int64("neededSchemaVersion", neededSchemaVersion), zap.Duration("start time", time.Since(startTime)), + zap.Int64("gotSchemaVersion", is.SchemaMetaVersion()), zap.Int64s("phyTblIDs", relatedChanges.PhyTblIDS), zap.Uint64s("actionTypes", relatedChanges.ActionTypes)) return is, false, currentSchemaVersion, relatedChanges, nil @@ -208,7 +228,12 @@ func (do *Domain) loadInfoSchema(startTS uint64) (infoschema.InfoSchema, bool, i return nil, false, currentSchemaVersion, nil, err } - newISBuilder, err := infoschema.NewBuilder(do.Store(), do.sysFacHack).InitWithDBInfos(schemas, policies, neededSchemaVersion) + resourceGroups, err := do.fetchResourceGroups(m) + if err != nil { + return nil, false, currentSchemaVersion, nil, err + } + + newISBuilder, err := infoschema.NewBuilder(do.Store(), do.sysFacHack).InitWithDBInfos(schemas, policies, resourceGroups, neededSchemaVersion) if err != nil { return nil, false, currentSchemaVersion, nil, err } @@ -240,6 +265,14 @@ func (do *Domain) fetchPolicies(m *meta.Meta) ([]*model.PolicyInfo, error) { return allPolicies, nil } +func (do *Domain) fetchResourceGroups(m *meta.Meta) ([]*model.ResourceGroupInfo, error) { + allResourceGroups, err := m.ListResourceGroups() + if err != nil { + return nil, err + } + return allResourceGroups, nil +} + func (do *Domain) fetchAllSchemasWithTables(m *meta.Meta) ([]*model.DBInfo, error) { allSchemas, err := m.ListDatabases() if err != nil { @@ -340,12 +373,15 @@ func (do *Domain) tryLoadSchemaDiffs(m *meta.Meta, usedVersion, newVersion int64 if err != nil { return nil, nil, err } + if diff.RegenerateSchemaMap { + return nil, nil, errors.Errorf("Meets a schema diff with RegenerateSchemaMap flag") + } if canSkipSchemaCheckerDDL(diff.Type) { continue } phyTblIDs = append(phyTblIDs, IDs...) for i := 0; i < len(IDs); i++ { - actions = append(actions, uint64(1< 0 { - do.wg.Add(1) // Local store needs to get the change information for every DDL state in each session. - go do.loadSchemaInLoop(ctx, ddlLease) - } - do.wg.Run(do.mdlCheckLoop) - do.wg.Add(3) - go do.topNSlowQueryLoop() - go do.infoSyncerKeeper() - go do.globalConfigSyncerKeeper() + do.wg.Run(func() { + do.loadSchemaInLoop(ctx, ddlLease) + }, "loadSchemaInLoop") + } + do.wg.Run(do.mdlCheckLoop, "mdlCheckLoop") + do.wg.Run(do.topNSlowQueryLoop, "topNSlowQueryLoop") + do.wg.Run(do.infoSyncerKeeper, "infoSyncerKeeper") + do.wg.Run(do.globalConfigSyncerKeeper, "globalConfigSyncerKeeper") if !skipRegisterToDashboard { - do.wg.Add(1) - go do.topologySyncerKeeper() + do.wg.Run(do.topologySyncerKeeper, "topologySyncerKeeper") } - if pdClient != nil { - do.wg.Add(1) - go do.closestReplicaReadCheckLoop(ctx, pdClient) + if pdCli != nil { + do.wg.Run(func() { + do.closestReplicaReadCheckLoop(ctx, pdCli) + }, "closestReplicaReadCheckLoop") } - err = do.initLogBackup(ctx, pdClient) + err = do.initLogBackup(ctx, pdCli) if err != nil { return err } @@ -1058,6 +1134,11 @@ func (do *Domain) Init( return nil } +// SetOnClose used to set do.onClose func. +func (do *Domain) SetOnClose(onClose func()) { + do.onClose = onClose +} + func (do *Domain) initLogBackup(ctx context.Context, pdClient pd.Client) error { cfg := config.GetGlobalConfig() if pdClient == nil || do.etcdClient == nil { @@ -1074,7 +1155,7 @@ func (do *Domain) initLogBackup(ctx context.Context, pdClient pd.Client) error { if err != nil { return err } - do.wg.Run(loop) + do.wg.Run(loop, "logBackupAdvancer") return nil } @@ -1091,7 +1172,6 @@ func (do *Domain) closestReplicaReadCheckLoop(ctx context.Context, pdClient pd.C ticker := time.NewTicker(time.Minute) defer func() { ticker.Stop() - do.wg.Done() logutil.BgLogger().Info("closestReplicaReadCheckLoop exited.") }() for { @@ -1106,8 +1186,12 @@ func (do *Domain) closestReplicaReadCheckLoop(ctx context.Context, pdClient pd.C } } +// Periodically check and update the replica-read status when `tidb_replica_read` is set to "closest-adaptive" +// We disable "closest-adaptive" in following conditions to ensure the read traffic is evenly distributed across +// all AZs: +// - There are no TiKV servers in the AZ of this tidb instance +// - The AZ if this tidb contains more tidb than other AZ and this tidb's id is the bigger one. func (do *Domain) checkReplicaRead(ctx context.Context, pdClient pd.Client) error { - // fast path do.sysVarCache.RLock() replicaRead := do.sysVarCache.global[variable.TiDBReplicaRead] do.sysVarCache.RUnlock() @@ -1116,6 +1200,24 @@ func (do *Domain) checkReplicaRead(ctx context.Context, pdClient pd.Client) erro logutil.BgLogger().Debug("closest replica read is not enabled, skip check!", zap.String("mode", replicaRead)) return nil } + + serverInfo, err := infosync.GetServerInfo() + if err != nil { + return err + } + zone := "" + for k, v := range serverInfo.Labels { + if k == placement.DCLabelKey && v != "" { + zone = v + break + } + } + if zone == "" { + logutil.BgLogger().Debug("server contains no 'zone' label, disable closest replica read", zap.Any("labels", serverInfo.Labels)) + variable.SetEnableAdaptiveReplicaRead(false) + return nil + } + stores, err := pdClient.GetAllStores(ctx, pd.WithExcludeTombstone()) if err != nil { return err @@ -1135,32 +1237,48 @@ func (do *Domain) checkReplicaRead(ctx context.Context, pdClient pd.Client) erro } } - enabled := false - // if stores don't have zone labels or are distribued in 1 zone, just disable cloeset replica read. - if len(storeZones) > 1 { - enabled = true - servers, err := infosync.GetAllServerInfo(ctx) - if err != nil { - return err - } - for _, s := range servers { - if v, ok := s.Labels[placement.DCLabelKey]; ok && v != "" { - if _, ok := storeZones[v]; !ok { - enabled = false - break - } + // no stores in this AZ + if _, ok := storeZones[zone]; !ok { + variable.SetEnableAdaptiveReplicaRead(false) + return nil + } + + servers, err := infosync.GetAllServerInfo(ctx) + if err != nil { + return err + } + svrIdsInThisZone := make([]string, 0) + for _, s := range servers { + if v, ok := s.Labels[placement.DCLabelKey]; ok && v != "" { + if _, ok := storeZones[v]; ok { storeZones[v] += 1 - } - } - if enabled { - for _, count := range storeZones { - if count == 0 { - enabled = false - break + if v == zone { + svrIdsInThisZone = append(svrIdsInThisZone, s.ID) } } } } + enabledCount := math.MaxInt + for _, count := range storeZones { + if count < enabledCount { + enabledCount = count + } + } + // sort tidb in the same AZ by ID and disable the tidb with bigger ID + // because ID is unchangeable, so this is a simple and stable algorithm to select + // some instances across all tidb servers. + if enabledCount < len(svrIdsInThisZone) { + sort.Slice(svrIdsInThisZone, func(i, j int) bool { + return strings.Compare(svrIdsInThisZone[i], svrIdsInThisZone[j]) < 0 + }) + } + enabled := true + for _, s := range svrIdsInThisZone[enabledCount:] { + if s == serverInfo.ID { + enabled = false + break + } + } if variable.SetEnableAdaptiveReplicaRead(enabled) { logutil.BgLogger().Info("tidb server adaptive closest replica read is changed", zap.Bool("enable", enabled)) @@ -1253,6 +1371,14 @@ func (do *Domain) GetEtcdClient() *clientv3.Client { return do.etcdClient } +// GetPDClient returns the PD client. +func (do *Domain) GetPDClient() pd.Client { + if store, ok := do.store.(kv.StorageWithPD); ok { + return store.GetPDClient() + } + return nil +} + // LoadPrivilegeLoop create a goroutine loads privilege tables in a loop, it // should be called only once in BootstrapSession. func (do *Domain) LoadPrivilegeLoop(sctx sessionctx.Context) error { @@ -1275,10 +1401,8 @@ func (do *Domain) LoadPrivilegeLoop(sctx sessionctx.Context) error { duration = 10 * time.Minute } - do.wg.Add(1) - go func() { + do.wg.Run(func() { defer func() { - do.wg.Done() logutil.BgLogger().Info("loadPrivilegeInLoop exited.") util.Recover(metrics.LabelDomain, "loadPrivilegeInLoop", nil, false) }() @@ -1308,7 +1432,7 @@ func (do *Domain) LoadPrivilegeLoop(sctx sessionctx.Context) error { logutil.BgLogger().Error("load privilege failed", zap.Error(err)) } } - }() + }, "loadPrivilegeInLoop") return nil } @@ -1325,10 +1449,9 @@ func (do *Domain) LoadSysVarCacheLoop(ctx sessionctx.Context) error { if do.etcdClient != nil { watchCh = do.etcdClient.Watch(context.Background(), sysVarCacheKey) } - do.wg.Add(1) - go func() { + + do.wg.Run(func() { defer func() { - do.wg.Done() logutil.BgLogger().Info("LoadSysVarCacheLoop exited.") util.Recover(metrics.LabelDomain, "LoadSysVarCacheLoop", nil, false) }() @@ -1371,7 +1494,63 @@ func (do *Domain) LoadSysVarCacheLoop(ctx sessionctx.Context) error { logutil.BgLogger().Error("LoadSysVarCacheLoop failed", zap.Error(err)) } } - }() + }, "LoadSysVarCacheLoop") + return nil +} + +// WatchTiFlashComputeNodeChange create a routine to watch if the topology of tiflash_compute node is changed. +// TODO: tiflashComputeNodeKey is not put to etcd yet(finish this when AutoScaler is done) +// +// store cache will only be invalidated every n seconds. +func (do *Domain) WatchTiFlashComputeNodeChange() error { + var watchCh clientv3.WatchChan + if do.etcdClient != nil { + watchCh = do.etcdClient.Watch(context.Background(), tiflashComputeNodeKey) + } + duration := 10 * time.Second + do.wg.Run(func() { + defer func() { + logutil.BgLogger().Info("WatchTiFlashComputeNodeChange exit") + util.Recover(metrics.LabelDomain, "WatchTiFlashComputeNodeChange", nil, false) + }() + + var count int + var logCount int + for { + ok := true + var watched bool + select { + case <-do.exit: + return + case _, ok = <-watchCh: + watched = true + case <-time.After(duration): + } + if !ok { + logutil.BgLogger().Error("WatchTiFlashComputeNodeChange watch channel closed") + watchCh = do.etcdClient.Watch(context.Background(), tiflashComputeNodeKey) + count++ + if count > 10 { + time.Sleep(time.Duration(count) * time.Second) + } + continue + } + count = 0 + switch s := do.store.(type) { + case tikv.Storage: + logCount++ + s.GetRegionCache().InvalidateTiFlashComputeStores() + if logCount == 6 { + // Print log every 6*duration seconds. + logutil.BgLogger().Debug("tiflash_compute store cache invalied, will update next query", zap.Bool("watched", watched)) + logCount = 0 + } + default: + logutil.BgLogger().Debug("No need to watch tiflash_compute store cache for non-tikv store") + return + } + } + }, "WatchTiFlashComputeNodeChange") return nil } @@ -1406,10 +1585,8 @@ func (do *Domain) LoadBindInfoLoop(ctxForHandle sessionctx.Context, ctxForEvolve } func (do *Domain) globalBindHandleWorkerLoop(owner owner.Manager) { - do.wg.Add(1) - go func() { + do.wg.Run(func() { defer func() { - do.wg.Done() logutil.BgLogger().Info("globalBindHandleWorkerLoop exited.") util.Recover(metrics.LabelDomain, "globalBindHandleWorkerLoop", nil, false) }() @@ -1446,14 +1623,12 @@ func (do *Domain) globalBindHandleWorkerLoop(owner owner.Manager) { } } } - }() + }, "globalBindHandleWorkerLoop") } func (do *Domain) handleEvolvePlanTasksLoop(ctx sessionctx.Context, owner owner.Manager) { - do.wg.Add(1) - go func() { + do.wg.Run(func() { defer func() { - do.wg.Done() logutil.BgLogger().Info("handleEvolvePlanTasksLoop exited.") util.Recover(metrics.LabelDomain, "handleEvolvePlanTasksLoop", nil, false) }() @@ -1471,7 +1646,7 @@ func (do *Domain) handleEvolvePlanTasksLoop(ctx sessionctx.Context, owner owner. } } } - }() + }, "handleEvolvePlanTasksLoop") } // TelemetryReportLoop create a goroutine that reports usage data in a loop, it should be called only once @@ -1483,10 +1658,8 @@ func (do *Domain) TelemetryReportLoop(ctx sessionctx.Context) { logutil.BgLogger().Warn("Initial telemetry run failed", zap.Error(err)) } - do.wg.Add(1) - go func() { + do.wg.Run(func() { defer func() { - do.wg.Done() logutil.BgLogger().Info("TelemetryReportLoop exited.") util.Recover(metrics.LabelDomain, "TelemetryReportLoop", nil, false) }() @@ -1507,16 +1680,14 @@ func (do *Domain) TelemetryReportLoop(ctx sessionctx.Context) { } } } - }() + }, "TelemetryReportLoop") } // TelemetryRotateSubWindowLoop create a goroutine that rotates the telemetry window regularly. func (do *Domain) TelemetryRotateSubWindowLoop(ctx sessionctx.Context) { ctx.GetSessionVars().InRestrictedSQL = true - do.wg.Add(1) - go func() { + do.wg.Run(func() { defer func() { - do.wg.Done() logutil.BgLogger().Info("TelemetryRotateSubWindowLoop exited.") util.Recover(metrics.LabelDomain, "TelemetryRotateSubWindowLoop", nil, false) }() @@ -1528,56 +1699,108 @@ func (do *Domain) TelemetryRotateSubWindowLoop(ctx sessionctx.Context) { telemetry.RotateSubWindow() } } - }() + }, "TelemetryRotateSubWindowLoop") } // SetupPlanReplayerHandle setup plan replayer handle -func (do *Domain) SetupPlanReplayerHandle(ctx sessionctx.Context) { - do.planReplayerHandle = &planReplayerHandle{ - planReplayerTaskCollectorHandle: &planReplayerTaskCollectorHandle{ - sctx: ctx, - }, +func (do *Domain) SetupPlanReplayerHandle(collectorSctx sessionctx.Context, workersSctxs []sessionctx.Context) { + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) + do.planReplayerHandle = &planReplayerHandle{} + do.planReplayerHandle.planReplayerTaskCollectorHandle = &planReplayerTaskCollectorHandle{ + ctx: ctx, + sctx: collectorSctx, + } + taskCH := make(chan *PlanReplayerDumpTask, 16) + taskStatus := &planReplayerDumpTaskStatus{} + taskStatus.finishedTaskMu.finishedTask = map[replayer.PlanReplayerTaskKey]struct{}{} + taskStatus.runningTaskMu.runningTasks = map[replayer.PlanReplayerTaskKey]struct{}{} + + do.planReplayerHandle.planReplayerTaskDumpHandle = &planReplayerTaskDumpHandle{ + taskCH: taskCH, + status: taskStatus, + } + do.planReplayerHandle.planReplayerTaskDumpHandle.workers = make([]*planReplayerTaskDumpWorker, 0) + for i := 0; i < len(workersSctxs); i++ { + worker := &planReplayerTaskDumpWorker{ + ctx: ctx, + sctx: workersSctxs[i], + taskCH: taskCH, + status: taskStatus, + } + do.planReplayerHandle.planReplayerTaskDumpHandle.workers = append(do.planReplayerHandle.planReplayerTaskDumpHandle.workers, worker) + } +} + +// SetupHistoricalStatsWorker setups worker +func (do *Domain) SetupHistoricalStatsWorker(ctx sessionctx.Context) { + do.historicalStatsWorker = &HistoricalStatsWorker{ + tblCH: make(chan int64, 16), + sctx: ctx, } } // SetupDumpFileGCChecker setup sctx func (do *Domain) SetupDumpFileGCChecker(ctx sessionctx.Context) { do.dumpFileGcChecker.setupSctx(ctx) + do.dumpFileGcChecker.planReplayerTaskStatus = do.planReplayerHandle.status } -var planReplayerHandleLease = 10 * time.Second +var planReplayerHandleLease atomic.Uint64 + +func init() { + planReplayerHandleLease.Store(uint64(10 * time.Second)) + enableDumpHistoricalStats.Store(true) +} // DisablePlanReplayerBackgroundJob4Test disable plan replayer handle for test func DisablePlanReplayerBackgroundJob4Test() { - planReplayerHandleLease = 0 + planReplayerHandleLease.Store(0) +} + +// DisableDumpHistoricalStats4Test disable historical dump worker for test +func DisableDumpHistoricalStats4Test() { + enableDumpHistoricalStats.Store(false) } // StartPlanReplayerHandle start plan replayer handle job func (do *Domain) StartPlanReplayerHandle() { - if planReplayerHandleLease < 1 { + lease := planReplayerHandleLease.Load() + if lease < 1 { return } - do.wg.Add(1) - go func() { - tikcer := time.NewTicker(planReplayerHandleLease) + do.wg.Run(func() { + logutil.BgLogger().Info("PlanReplayerTaskCollectHandle started") + tikcer := time.NewTicker(time.Duration(lease)) defer func() { tikcer.Stop() - do.wg.Done() - logutil.BgLogger().Info("PlanReplayerHandle exited.") - util.Recover(metrics.LabelDomain, "PlanReplayerHandle", nil, false) + util.Recover(metrics.LabelDomain, "PlanReplayerTaskCollectHandle", nil, false) + logutil.BgLogger().Info("PlanReplayerTaskCollectHandle exited.") }() for { select { case <-do.exit: return case <-tikcer.C: - err := do.planReplayerHandle.CollectPlanReplayerTask(context.Background()) + err := do.planReplayerHandle.CollectPlanReplayerTask() if err != nil { logutil.BgLogger().Warn("plan replayer handle collect tasks failed", zap.Error(err)) } } } - }() + }, "PlanReplayerTaskCollectHandle") + + do.wg.Run(func() { + logutil.BgLogger().Info("PlanReplayerTaskDumpHandle started") + defer func() { + util.Recover(metrics.LabelDomain, "PlanReplayerTaskDumpHandle", nil, false) + logutil.BgLogger().Info("PlanReplayerTaskDumpHandle exited.") + }() + for _, worker := range do.planReplayerHandle.planReplayerTaskDumpHandle.workers { + go worker.run() + } + <-do.exit + do.planReplayerHandle.planReplayerTaskDumpHandle.Close() + }, "PlanReplayerTaskDumpHandle") } // GetPlanReplayerHandle returns plan replayer handle @@ -1587,14 +1810,13 @@ func (do *Domain) GetPlanReplayerHandle() *planReplayerHandle { // DumpFileGcCheckerLoop creates a goroutine that handles `exit` and `gc`. func (do *Domain) DumpFileGcCheckerLoop() { - do.wg.Add(1) - go func() { + do.wg.Run(func() { + logutil.BgLogger().Info("dumpFileGcChecker started") gcTicker := time.NewTicker(do.dumpFileGcChecker.gcLease) defer func() { gcTicker.Stop() - do.wg.Done() - logutil.BgLogger().Info("dumpFileGcChecker exited.") util.Recover(metrics.LabelDomain, "dumpFileGcCheckerLoop", nil, false) + logutil.BgLogger().Info("dumpFileGcChecker exited.") }() for { select { @@ -1604,7 +1826,44 @@ func (do *Domain) DumpFileGcCheckerLoop() { do.dumpFileGcChecker.gcDumpFiles(time.Hour) } } - }() + }, "dumpFileGcChecker") +} + +// GetHistoricalStatsWorker gets historical workers +func (do *Domain) GetHistoricalStatsWorker() *HistoricalStatsWorker { + return do.historicalStatsWorker +} + +// EnableDumpHistoricalStats used to control whether enbale dump stats for unit test +var enableDumpHistoricalStats atomic.Bool + +// StartHistoricalStatsWorker start historical workers running +func (do *Domain) StartHistoricalStatsWorker() { + if !enableDumpHistoricalStats.Load() { + return + } + do.wg.Run(func() { + logutil.BgLogger().Info("HistoricalStatsWorker started") + defer func() { + util.Recover(metrics.LabelDomain, "HistoricalStatsWorkerLoop", nil, false) + logutil.BgLogger().Info("HistoricalStatsWorker exited.") + }() + for { + select { + case <-do.exit: + close(do.historicalStatsWorker.tblCH) + return + case tblID, ok := <-do.historicalStatsWorker.tblCH: + if !ok { + return + } + err := do.historicalStatsWorker.DumpHistoricalStats(tblID, do.StatsHandle()) + if err != nil { + logutil.BgLogger().Warn("dump historical stats failed", zap.Error(err), zap.Int64("tableID", tblID)) + } + } + } + }, "HistoricalStatsWorker") } // StatsHandle returns the statistic handle. @@ -1613,8 +1872,8 @@ func (do *Domain) StatsHandle() *handle.Handle { } // CreateStatsHandle is used only for test. -func (do *Domain) CreateStatsHandle(ctx sessionctx.Context) error { - h, err := handle.NewHandle(ctx, do.statsLease, do.sysSessionPool, &do.sysProcesses, do.ServerID) +func (do *Domain) CreateStatsHandle(ctx, initStatsCtx sessionctx.Context) error { + h, err := handle.NewHandle(ctx, initStatsCtx, do.statsLease, do.sysSessionPool, &do.sysProcesses, do.ServerID) if err != nil { return err } @@ -1677,8 +1936,8 @@ func (do *Domain) SetupAnalyzeExec(ctxs []sessionctx.Context) { } // LoadAndUpdateStatsLoop loads and updates stats info. -func (do *Domain) LoadAndUpdateStatsLoop(ctxs []sessionctx.Context) error { - if err := do.UpdateTableStatsLoop(ctxs[0]); err != nil { +func (do *Domain) LoadAndUpdateStatsLoop(ctxs []sessionctx.Context, initStatsCtx sessionctx.Context) error { + if err := do.UpdateTableStatsLoop(ctxs[0], initStatsCtx); err != nil { return err } do.StartLoadStatsSubWorkers(ctxs[1:]) @@ -1688,9 +1947,9 @@ func (do *Domain) LoadAndUpdateStatsLoop(ctxs []sessionctx.Context) error { // UpdateTableStatsLoop creates a goroutine loads stats info and updates stats info in a loop. // It will also start a goroutine to analyze tables automatically. // It should be called only once in BootstrapSession. -func (do *Domain) UpdateTableStatsLoop(ctx sessionctx.Context) error { +func (do *Domain) UpdateTableStatsLoop(ctx, initStatsCtx sessionctx.Context) error { ctx.GetSessionVars().InRestrictedSQL = true - statsHandle, err := handle.NewHandle(ctx, do.statsLease, do.sysSessionPool, &do.sysProcesses, do.ServerID) + statsHandle, err := handle.NewHandle(ctx, initStatsCtx, do.statsLease, do.sysSessionPool, &do.sysProcesses, do.ServerID) if err != nil { return err } @@ -1698,20 +1957,21 @@ func (do *Domain) UpdateTableStatsLoop(ctx sessionctx.Context) error { do.ddl.RegisterStatsHandle(statsHandle) // Negative stats lease indicates that it is in test, it does not need update. if do.statsLease >= 0 { - do.wg.Run(do.loadStatsWorker) + do.wg.Run(do.loadStatsWorker, "loadStatsWorker") } owner := do.newOwnerManager(handle.StatsPrompt, handle.StatsOwnerKey) if do.indexUsageSyncLease > 0 { - do.wg.Add(1) - go do.syncIndexUsageWorker(owner) + do.wg.Run(func() { + do.syncIndexUsageWorker(owner) + }, "syncIndexUsageWorker") } if do.statsLease <= 0 { return nil } do.SetStatsUpdating(true) - do.wg.Run(func() { do.updateStatsWorker(ctx, owner) }) - do.wg.Run(func() { do.autoAnalyzeWorker(owner) }) - do.wg.Run(func() { do.gcAnalyzeHistory(owner) }) + do.wg.Run(func() { do.updateStatsWorker(ctx, owner) }, "updateStatsWorker") + do.wg.Run(func() { do.autoAnalyzeWorker(owner) }, "autoAnalyzeWorker") + do.wg.Run(func() { do.gcAnalyzeHistory(owner) }, "gcAnalyzeHistory") return nil } @@ -1721,7 +1981,7 @@ func (do *Domain) StartLoadStatsSubWorkers(ctxList []sessionctx.Context) { for i, ctx := range ctxList { statsHandle.StatsLoad.SubCtxs[i] = ctx do.wg.Add(1) - go statsHandle.SubLoadWorker(ctx, do.exit, &do.wg) + go statsHandle.SubLoadWorker(ctx, do.exit, do.wg) } } @@ -1748,15 +2008,17 @@ func (do *Domain) loadStatsWorker() { lease = 3 * time.Second } loadTicker := time.NewTicker(lease) + updStatsHealthyTicker := time.NewTicker(20 * lease) defer func() { loadTicker.Stop() + updStatsHealthyTicker.Stop() logutil.BgLogger().Info("loadStatsWorker exited.") }() statsHandle := do.StatsHandle() t := time.Now() err := statsHandle.InitStats(do.InfoSchema()) if err != nil { - logutil.BgLogger().Debug("init stats info failed", zap.Error(err)) + logutil.BgLogger().Error("init stats info failed", zap.Duration("take time", time.Since(t)), zap.Error(err)) } else { logutil.BgLogger().Info("init stats info time", zap.Duration("take time", time.Since(t))) } @@ -1775,6 +2037,8 @@ func (do *Domain) loadStatsWorker() { if err != nil { logutil.BgLogger().Debug("load histograms failed", zap.Error(err)) } + case <-updStatsHealthyTicker.C: + statsHandle.UpdateStatsHealthyMetrics() case <-do.exit: return } @@ -1788,7 +2052,6 @@ func (do *Domain) syncIndexUsageWorker(owner owner.Manager) { handle := do.StatsHandle() defer func() { idxUsageSyncTicker.Stop() - do.wg.Done() logutil.BgLogger().Info("syncIndexUsageWorker exited.") }() for { @@ -1811,8 +2074,30 @@ func (do *Domain) syncIndexUsageWorker(owner owner.Manager) { } } +func (do *Domain) updateStatsWorkerExitPreprocessing(statsHandle *handle.Handle, owner owner.Manager) { + ch := make(chan struct{}, 1) + timeout, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + go func() { + logutil.BgLogger().Info("updateStatsWorker is going to exit, start to flush stats") + statsHandle.FlushStats() + logutil.BgLogger().Info("updateStatsWorker ready to release owner") + owner.Cancel() + ch <- struct{}{} + }() + select { + case <-ch: + logutil.BgLogger().Info("updateStatsWorker exit preprocessing finished") + return + case <-timeout.Done(): + logutil.BgLogger().Warn("updateStatsWorker exit preprocessing timeout, force exiting") + return + } +} + func (do *Domain) updateStatsWorker(ctx sessionctx.Context, owner owner.Manager) { defer util.Recover(metrics.LabelDomain, "updateStatsWorker", nil, false) + logutil.BgLogger().Info("updateStatsWorker started.") lease := do.statsLease deltaUpdateTicker := time.NewTicker(20 * lease) gcStatsTicker := time.NewTicker(100 * lease) @@ -1830,19 +2115,19 @@ func (do *Domain) updateStatsWorker(ctx sessionctx.Context, owner owner.Manager) deltaUpdateTicker.Stop() readMemTricker.Stop() do.SetStatsUpdating(false) + util.Recover(metrics.LabelDomain, "updateStatsWorker", nil, false) logutil.BgLogger().Info("updateStatsWorker exited.") }() for { select { case <-do.exit: - statsHandle.FlushStats() - owner.Cancel() + do.updateStatsWorkerExitPreprocessing(statsHandle, owner) return // This channel is sent only by ddl owner. case t := <-statsHandle.DDLEventCh(): err := statsHandle.HandleDDLEvent(t) if err != nil { - logutil.BgLogger().Debug("handle ddl event failed", zap.Error(err)) + logutil.BgLogger().Error("handle ddl event failed", zap.String("event", t.String()), zap.Error(err)) } case <-deltaUpdateTicker.C: err := statsHandle.DumpStatsDeltaToKV(handle.DumpDelta) @@ -1951,8 +2236,9 @@ func (do *Domain) ServerMemoryLimitHandle() *servermemorylimit.Handle { } const ( - privilegeKey = "/tidb/privilege" - sysVarCacheKey = "/tidb/sysvars" + privilegeKey = "/tidb/privilege" + sysVarCacheKey = "/tidb/sysvars" + tiflashComputeNodeKey = "/tiflash/new_tiflash_compute_nodes" ) // NotifyUpdatePrivilege updates privilege key in etcd, TiDB client that watches @@ -1989,7 +2275,7 @@ func (do *Domain) NotifyUpdatePrivilege() error { // NotifyUpdateSysVarCache updates the sysvar cache key in etcd, which other TiDB // clients are subscribed to for updates. For the caller, the cache is also built // synchronously so that the effect is immediate. -func (do *Domain) NotifyUpdateSysVarCache() { +func (do *Domain) NotifyUpdateSysVarCache(updateLocal bool) { if do.etcdClient != nil { row := do.etcdClient.KV _, err := row.Put(context.Background(), sysVarCacheKey, "") @@ -1998,8 +2284,10 @@ func (do *Domain) NotifyUpdateSysVarCache() { } } // update locally - if err := do.rebuildSysVarCache(nil); err != nil { - logutil.BgLogger().Error("rebuilding sysvar cache failed", zap.Error(err)) + if updateLocal { + if err := do.rebuildSysVarCache(nil); err != nil { + logutil.BgLogger().Error("rebuilding sysvar cache failed", zap.Error(err)) + } } } @@ -2008,10 +2296,8 @@ func (do *Domain) LoadSigningCertLoop(signingCert, signingKey string) { sessionstates.SetCertPath(signingCert) sessionstates.SetKeyPath(signingKey) - do.wg.Add(1) - go func() { + do.wg.Run(func() { defer func() { - do.wg.Done() logutil.BgLogger().Debug("loadSigningCertLoop exited.") util.Recover(metrics.LabelDomain, "LoadSigningCertLoop", nil, false) }() @@ -2023,7 +2309,7 @@ func (do *Domain) LoadSigningCertLoop(signingCert, signingKey string) { return } } - }() + }, "loadSigningCertLoop") } // ServerID gets serverID. @@ -2259,6 +2545,26 @@ func (do *Domain) serverIDKeeper() { } } +// StartTTLJobManager creates and starts the ttl job manager +func (do *Domain) StartTTLJobManager() { + do.wg.Run(func() { + defer func() { + logutil.BgLogger().Info("ttlJobManager exited.") + }() + + ttlJobManager := ttlworker.NewJobManager(do.ddl.GetID(), do.sysSessionPool, do.store, do.etcdClient) + do.ttlJobManager.Store(ttlJobManager) + ttlJobManager.Start() + + <-do.exit + }, "ttlJobManager") +} + +// TTLJobManager returns the ttl job manager on this domain +func (do *Domain) TTLJobManager() *ttlworker.JobManager { + return do.ttlJobManager.Load() +} + func init() { initByLDFlagsForGlobalKill() telemetry.GetDomainInfoSchema = func(ctx sessionctx.Context) infoschema.InfoSchema { diff --git a/domain/domain_sysvars.go b/domain/domain_sysvars.go index da2b3aeac3fd3..3d102687454d2 100644 --- a/domain/domain_sysvars.go +++ b/domain/domain_sysvars.go @@ -37,6 +37,9 @@ func (do *Domain) initDomainSysVars() { variable.SetExternalTimestamp = do.setExternalTimestamp variable.GetExternalTimestamp = do.getExternalTimestamp + + setGlobalResourceControlFunc := do.setGlobalResourceControl + variable.SetGlobalResourceControl.Store(&setGlobalResourceControlFunc) } // setStatsCacheCapacity sets statsCache cap @@ -67,6 +70,14 @@ func (do *Domain) setPDClientDynamicOption(name, sVal string) { } } +func (do *Domain) setGlobalResourceControl(enable bool) { + if enable { + variable.EnableGlobalResourceControlFunc() + } else { + variable.DisableGlobalResourceControlFunc() + } +} + // updatePDClient is used to set the dynamic option into the PD client. func (do *Domain) updatePDClient(option pd.DynamicOption, val interface{}) error { store, ok := do.store.(interface{ GetPDClient() pd.Client }) diff --git a/domain/domain_test.go b/domain/domain_test.go index 621f0fb2c431f..bd9287fe730ec 100644 --- a/domain/domain_test.go +++ b/domain/domain_test.go @@ -17,6 +17,8 @@ package domain import ( "context" "crypto/tls" + "encoding/json" + "fmt" "net" "runtime" "testing" @@ -66,7 +68,7 @@ func TestInfo(t *testing.T) { Storage: s, pdAddrs: []string{cluster.Members[0].GRPCURL()}} ddlLease := 80 * time.Millisecond - dom := NewDomain(mockStore, ddlLease, 0, 0, 0, mockFactory, nil) + dom := NewDomain(mockStore, ddlLease, 0, 0, 0, mockFactory) defer func() { dom.Close() err := s.Close() @@ -169,7 +171,7 @@ func TestStatWorkRecoverFromPanic(t *testing.T) { require.NoError(t, err) ddlLease := 80 * time.Millisecond - dom := NewDomain(store, ddlLease, 0, 0, 0, mockFactory, nil) + dom := NewDomain(store, ddlLease, 0, 0, 0, mockFactory) metrics.PanicCounter.Reset() // Since the stats lease is 0 now, so create a new ticker will panic. @@ -236,7 +238,7 @@ func TestClosestReplicaReadChecker(t *testing.T) { require.NoError(t, err) ddlLease := 80 * time.Millisecond - dom := NewDomain(store, ddlLease, 0, 0, 0, mockFactory, nil) + dom := NewDomain(store, ddlLease, 0, 0, 0, mockFactory) defer func() { dom.Close() require.Nil(t, store.Close()) @@ -247,7 +249,29 @@ func TestClosestReplicaReadChecker(t *testing.T) { } dom.sysVarCache.Unlock() - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/domain/infosync/mockGetAllServerInfo", `return("")`)) + makeFailpointRes := func(v interface{}) string { + bytes, err := json.Marshal(v) + require.NoError(t, err) + return fmt.Sprintf("return(`%s`)", string(bytes)) + } + + mockedAllServerInfos := map[string]*infosync.ServerInfo{ + "s1": { + ID: "s1", + Labels: map[string]string{ + "zone": "zone1", + }, + }, + "s2": { + ID: "s2", + Labels: map[string]string{ + "zone": "zone2", + }, + }, + } + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/domain/infosync/mockGetAllServerInfo", makeFailpointRes(mockedAllServerInfos))) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/domain/infosync/mockGetServerInfo", makeFailpointRes(mockedAllServerInfos["s2"]))) stores := []*metapb.Store{ { @@ -304,8 +328,77 @@ func TestClosestReplicaReadChecker(t *testing.T) { require.False(t, variable.IsAdaptiveReplicaReadEnabled()) } + // partial matches + mockedAllServerInfos = map[string]*infosync.ServerInfo{ + "s1": { + ID: "s1", + Labels: map[string]string{ + "zone": "zone1", + }, + }, + "s2": { + ID: "s2", + Labels: map[string]string{ + "zone": "zone2", + }, + }, + "s22": { + ID: "s22", + Labels: map[string]string{ + "zone": "zone2", + }, + }, + "s3": { + ID: "s3", + Labels: map[string]string{ + "zone": "zone3", + }, + }, + "s4": { + ID: "s4", + Labels: map[string]string{ + "zone": "zone4", + }, + }, + } + pdClient.stores = stores + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/domain/infosync/mockGetAllServerInfo", makeFailpointRes(mockedAllServerInfos))) + cases := []struct { + id string + matches bool + }{ + { + id: "s1", + matches: true, + }, + { + id: "s2", + matches: true, + }, + { + id: "s22", + matches: false, + }, + { + id: "s3", + matches: true, + }, + { + id: "s4", + matches: false, + }, + } + for _, c := range cases { + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/domain/infosync/mockGetServerInfo", makeFailpointRes(mockedAllServerInfos[c.id]))) + variable.SetEnableAdaptiveReplicaRead(!c.matches) + err = dom.checkReplicaRead(ctx, pdClient) + require.Nil(t, err) + require.Equal(t, c.matches, variable.IsAdaptiveReplicaReadEnabled()) + } + variable.SetEnableAdaptiveReplicaRead(true) require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/domain/infosync/mockGetAllServerInfo")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/domain/infosync/mockGetServerInfo")) } type mockInfoPdClient struct { diff --git a/domain/globalconfigsync/globalconfig.go b/domain/globalconfigsync/globalconfig.go index 5bbb6a260e3c8..35b4447189884 100644 --- a/domain/globalconfigsync/globalconfig.go +++ b/domain/globalconfigsync/globalconfig.go @@ -1,4 +1,4 @@ -// Copyright 2021 PingCAP, Inc. +// Copyright 2023 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -41,7 +41,7 @@ func (s *GlobalConfigSyncer) StoreGlobalConfig(ctx context.Context, item pd.Glob if s.pd == nil { return nil } - err := s.pd.StoreGlobalConfig(ctx, []pd.GlobalConfigItem{item}) + err := s.pd.StoreGlobalConfig(ctx, "", []pd.GlobalConfigItem{item}) if err != nil { return err } diff --git a/domain/globalconfigsync/globalconfig_test.go b/domain/globalconfigsync/globalconfig_test.go index c7dab0064dedb..2d97b7c9e2b9f 100644 --- a/domain/globalconfigsync/globalconfig_test.go +++ b/domain/globalconfigsync/globalconfig_test.go @@ -1,4 +1,4 @@ -// Copyright 2021 PingCAP, Inc. +// Copyright 2023 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -58,11 +58,12 @@ func TestGlobalConfigSyncer(t *testing.T) { syncer.Notify(pd.GlobalConfigItem{Name: "a", Value: "b"}) err = syncer.StoreGlobalConfig(context.Background(), <-syncer.NotifyCh) require.NoError(t, err) - items, err := client.LoadGlobalConfig(context.Background(), []string{"a"}) + items, revision, err := client.LoadGlobalConfig(context.Background(), []string{"a"}, "") require.NoError(t, err) - require.Equal(t, len(items), 1) - require.Equal(t, items[0].Name, "/global/config/a") - require.Equal(t, items[0].Value, "b") + require.Equal(t, 1, len(items)) + require.Equal(t, "/global/config/a", items[0].Name) + require.Equal(t, int64(0), revision) + require.Equal(t, "b", items[0].Value) } func TestStoreGlobalConfig(t *testing.T) { @@ -88,19 +89,23 @@ func TestStoreGlobalConfig(t *testing.T) { _, err = se.Execute(context.Background(), "set @@global.tidb_enable_top_sql=1;") require.NoError(t, err) + _, err = se.Execute(context.Background(), "set @@global.tidb_source_id=2;") + require.NoError(t, err) for i := 0; i < 20; i++ { time.Sleep(100 * time.Millisecond) client := store.(kv.StorageWithPD).GetPDClient() // enable top sql will be translated to enable_resource_metering - items, err := client.LoadGlobalConfig(context.Background(), []string{"enable_resource_metering"}) + items, _, err := client.LoadGlobalConfig(context.Background(), []string{"enable_resource_metering", "source_id"}, "") require.NoError(t, err) - if len(items) == 1 && items[0].Value == "" { + if len(items) == 2 && items[0].Value == "" { continue } - require.Len(t, items, 1) + require.Len(t, items, 2) require.Equal(t, items[0].Name, "/global/config/enable_resource_metering") require.Equal(t, items[0].Value, "true") + require.Equal(t, items[1].Name, "/global/config/source_id") + require.Equal(t, items[1].Value, "2") return } require.Fail(t, "timeout for waiting global config synced") diff --git a/domain/historical_stats.go b/domain/historical_stats.go new file mode 100644 index 0000000000000..6d4125b75f5d7 --- /dev/null +++ b/domain/historical_stats.go @@ -0,0 +1,103 @@ +// 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, +// 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 domain + +import ( + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/statistics/handle" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" +) + +var ( + generateHistoricalStatsSuccessCounter = metrics.HistoricalStatsCounter.WithLabelValues("generate", "success") + generateHistoricalStatsFailedCounter = metrics.HistoricalStatsCounter.WithLabelValues("generate", "fail") +) + +// HistoricalStatsWorker indicates for dump historical stats +type HistoricalStatsWorker struct { + tblCH chan int64 + sctx sessionctx.Context +} + +// SendTblToDumpHistoricalStats send tableID to worker to dump historical stats +func (w *HistoricalStatsWorker) SendTblToDumpHistoricalStats(tableID int64) { + send := enableDumpHistoricalStats.Load() + failpoint.Inject("sendHistoricalStats", func(val failpoint.Value) { + if val.(bool) { + send = true + } + }) + if !send { + return + } + select { + case w.tblCH <- tableID: + return + default: + logutil.BgLogger().Warn("discard dump historical stats task", zap.Int64("table-id", tableID)) + } +} + +// DumpHistoricalStats dump stats by given tableID +func (w *HistoricalStatsWorker) DumpHistoricalStats(tableID int64, statsHandle *handle.Handle) error { + historicalStatsEnabled, err := statsHandle.CheckHistoricalStatsEnable() + if err != nil { + return errors.Errorf("check tidb_enable_historical_stats failed: %v", err) + } + if !historicalStatsEnabled { + return nil + } + sctx := w.sctx + is := GetDomain(sctx).InfoSchema() + isPartition := false + var tblInfo *model.TableInfo + tbl, existed := is.TableByID(tableID) + if !existed { + tbl, db, p := is.FindTableByPartitionID(tableID) + if tbl != nil && db != nil && p != nil { + isPartition = true + tblInfo = tbl.Meta() + } else { + return errors.Errorf("cannot get table by id %d", tableID) + } + } else { + tblInfo = tbl.Meta() + } + dbInfo, existed := is.SchemaByTable(tblInfo) + if !existed { + return errors.Errorf("cannot get DBInfo by TableID %d", tableID) + } + if _, err := statsHandle.RecordHistoricalStatsToStorage(dbInfo.Name.O, tblInfo, tableID, isPartition); err != nil { + generateHistoricalStatsFailedCounter.Inc() + return errors.Errorf("record table %s.%s's historical stats failed, err:%v", dbInfo.Name.O, tblInfo.Name.O, err) + } + generateHistoricalStatsSuccessCounter.Inc() + return nil +} + +// GetOneHistoricalStatsTable gets one tableID from channel, only used for test +func (w *HistoricalStatsWorker) GetOneHistoricalStatsTable() int64 { + select { + case tblID := <-w.tblCH: + return tblID + default: + return -1 + } +} diff --git a/domain/infosync/BUILD.bazel b/domain/infosync/BUILD.bazel index c0936390ff016..f050873ee128f 100644 --- a/domain/infosync/BUILD.bazel +++ b/domain/infosync/BUILD.bazel @@ -8,6 +8,7 @@ go_library( "label_manager.go", "placement_manager.go", "region.go", + "resource_group_manager.go", "schedule_manager.go", "tiflash_manager.go", ], @@ -40,8 +41,12 @@ go_library( "@com_github_gorilla_mux//:mux", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", + "@com_github_pingcap_kvproto//pkg/kvrpcpb", "@com_github_pingcap_kvproto//pkg/metapb", + "@com_github_pingcap_kvproto//pkg/resource_manager", + "@com_github_pingcap_log//:log", "@com_github_tikv_client_go_v2//oracle", + "@com_github_tikv_client_go_v2//tikv", "@com_github_tikv_pd_client//:client", "@io_etcd_go_etcd_client_v3//:client", "@io_etcd_go_etcd_client_v3//concurrency", @@ -59,6 +64,7 @@ go_test( deps = [ "//ddl/placement", "//ddl/util", + "//keyspace", "//parser/model", "//testkit/testsetup", "//util", diff --git a/domain/infosync/info.go b/domain/infosync/info.go index a2af6c5dfa58f..1e82ce308ac9b 100644 --- a/domain/infosync/info.go +++ b/domain/infosync/info.go @@ -33,6 +33,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/metapb" + rmpb "github.com/pingcap/kvproto/pkg/resource_manager" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl/label" "github.com/pingcap/tidb/ddl/placement" @@ -54,6 +55,7 @@ import ( "github.com/pingcap/tidb/util/pdapi" "github.com/pingcap/tidb/util/versioninfo" "github.com/tikv/client-go/v2/oracle" + "github.com/tikv/client-go/v2/tikv" pd "github.com/tikv/pd/client" clientv3 "go.etcd.io/etcd/client/v3" "go.etcd.io/etcd/client/v3/concurrency" @@ -94,12 +96,18 @@ var ErrPrometheusAddrIsNotSet = dbterror.ClassDomain.NewStd(errno.ErrPrometheusA // InfoSyncer stores server info to etcd when the tidb-server starts and delete when tidb-server shuts down. type InfoSyncer struct { - etcdCli *clientv3.Client - info *ServerInfo - serverInfoPath string - minStartTS uint64 - minStartTSPath string - managerMu struct { + // `etcdClient` must be used when keyspace is not set, or when the logic to each etcd path needs to be separated by keyspace. + etcdCli *clientv3.Client + // `unprefixedEtcdCli` will never set the etcd namespace prefix by keyspace. + // It is only used in storeMinStartTS and RemoveMinStartTS now. + // It must be used when the etcd path isn't needed to separate by keyspace. + // See keyspace RFC: https://github.com/pingcap/tidb/pull/39685 + unprefixedEtcdCli *clientv3.Client + info *ServerInfo + serverInfoPath string + minStartTS uint64 + minStartTSPath string + managerMu struct { mu sync.RWMutex util2.SessionManager } @@ -111,6 +119,7 @@ type InfoSyncer struct { placementManager PlacementManager scheduleManager ScheduleManager tiflashReplicaManager TiFlashReplicaManager + resourceGroupManager pd.ResourceManagerClient } // ServerInfo is server static information. @@ -178,12 +187,21 @@ func setGlobalInfoSyncer(is *InfoSyncer) { } // GlobalInfoSyncerInit return a new InfoSyncer. It is exported for testing. -func GlobalInfoSyncerInit(ctx context.Context, id string, serverIDGetter func() uint64, etcdCli *clientv3.Client, skipRegisterToDashBoard bool) (*InfoSyncer, error) { +func GlobalInfoSyncerInit( + ctx context.Context, + id string, + serverIDGetter func() uint64, + etcdCli, unprefixedEtcdCli *clientv3.Client, + pdCli pd.Client, + codec tikv.Codec, + skipRegisterToDashBoard bool, +) (*InfoSyncer, error) { is := &InfoSyncer{ - etcdCli: etcdCli, - info: getServerInfo(id, serverIDGetter), - serverInfoPath: fmt.Sprintf("%s/%s", ServerInformationPath, id), - minStartTSPath: fmt.Sprintf("%s/%s", ServerMinStartTSPath, id), + etcdCli: etcdCli, + unprefixedEtcdCli: unprefixedEtcdCli, + info: getServerInfo(id, serverIDGetter), + serverInfoPath: fmt.Sprintf("%s/%s", ServerInformationPath, id), + minStartTSPath: fmt.Sprintf("%s/%s", ServerMinStartTSPath, id), } err := is.init(ctx, skipRegisterToDashBoard) if err != nil { @@ -192,7 +210,8 @@ func GlobalInfoSyncerInit(ctx context.Context, id string, serverIDGetter func() is.labelRuleManager = initLabelRuleManager(etcdCli) is.placementManager = initPlacementManager(etcdCli) is.scheduleManager = initScheduleManager(etcdCli) - is.tiflashReplicaManager = initTiFlashReplicaManager(etcdCli) + is.tiflashReplicaManager = initTiFlashReplicaManager(etcdCli, codec) + is.resourceGroupManager = initResourceGroupManager(pdCli) setGlobalInfoSyncer(is) return is, nil } @@ -237,13 +256,20 @@ func initPlacementManager(etcdCli *clientv3.Client) PlacementManager { return &PDPlacementManager{etcdCli: etcdCli} } -func initTiFlashReplicaManager(etcdCli *clientv3.Client) TiFlashReplicaManager { +func initResourceGroupManager(pdCli pd.Client) pd.ResourceManagerClient { + if pdCli == nil { + return &mockResourceGroupManager{groups: make(map[string]*rmpb.ResourceGroup)} + } + return pdCli +} + +func initTiFlashReplicaManager(etcdCli *clientv3.Client, codec tikv.Codec) TiFlashReplicaManager { if etcdCli == nil { m := mockTiFlashReplicaManagerCtx{tiflashProgressCache: make(map[int64]float64)} return &m } logutil.BgLogger().Warn("init TiFlashReplicaManager", zap.Strings("pd addrs", etcdCli.Endpoints())) - return &TiFlashReplicaManagerCtx{etcdCli: etcdCli, tiflashProgressCache: make(map[int64]float64)} + return &TiFlashReplicaManagerCtx{etcdCli: etcdCli, tiflashProgressCache: make(map[int64]float64), codec: codec} } func initScheduleManager(etcdCli *clientv3.Client) ScheduleManager { @@ -282,6 +308,11 @@ func SetMockTiFlash(tiflash *MockTiFlash) { // GetServerInfo gets self server static information. func GetServerInfo() (*ServerInfo, error) { + failpoint.Inject("mockGetServerInfo", func(v failpoint.Value) { + var res ServerInfo + err := json.Unmarshal([]byte(v.(string)), &res) + failpoint.Return(&res, err) + }) is, err := getGlobalInfoSyncer() if err != nil { return nil, err @@ -316,20 +347,10 @@ func (is *InfoSyncer) getServerInfoByID(ctx context.Context, id string) (*Server // GetAllServerInfo gets all servers static information from etcd. func GetAllServerInfo(ctx context.Context) (map[string]*ServerInfo, error) { - failpoint.Inject("mockGetAllServerInfo", func() { - res := map[string]*ServerInfo{ - "fa598405-a08e-4e74-83ff-75c30b1daedc": { - Labels: map[string]string{ - "zone": "zone1", - }, - }, - "ad84dbbd-5a50-4742-a73c-4f674d41d4bd": { - Labels: map[string]string{ - "zone": "zone2", - }, - }, - } - failpoint.Return(res, nil) + failpoint.Inject("mockGetAllServerInfo", func(val failpoint.Value) { + res := make(map[string]*ServerInfo) + err := json.Unmarshal([]byte(val.(string)), &res) + failpoint.Return(res, err) }) is, err := getGlobalInfoSyncer() if err != nil { @@ -508,7 +529,7 @@ func doRequestWithFailpoint(req *http.Request) (resp *http.Response, err error) return util2.InternalHTTPClient().Do(req) } -// GetAllRuleBundles is used to get all rule bundles from PD. It is used to load full rules from PD while fullload infoschema. +// GetAllRuleBundles is used to get all rule bundles from PD It is used to load full rules from PD while fullload infoschema. func GetAllRuleBundles(ctx context.Context) ([]*placement.Bundle, error) { is, err := getGlobalInfoSyncer() if err != nil { @@ -568,6 +589,56 @@ func PutRuleBundlesWithRetry(ctx context.Context, bundles []*placement.Bundle, m return } +// GetResourceGroup is used to get one specific resource group from resource manager. +func GetResourceGroup(ctx context.Context, name string) (*rmpb.ResourceGroup, error) { + is, err := getGlobalInfoSyncer() + if err != nil { + return nil, err + } + + return is.resourceGroupManager.GetResourceGroup(ctx, name) +} + +// ListResourceGroups is used to get all resource groups from resource manager. +func ListResourceGroups(ctx context.Context) ([]*rmpb.ResourceGroup, error) { + is, err := getGlobalInfoSyncer() + if err != nil { + return nil, err + } + + return is.resourceGroupManager.ListResourceGroups(ctx) +} + +// AddResourceGroup is used to create one specific resource group to resource manager. +func AddResourceGroup(ctx context.Context, group *rmpb.ResourceGroup) error { + is, err := getGlobalInfoSyncer() + if err != nil { + return err + } + _, err = is.resourceGroupManager.AddResourceGroup(ctx, group) + return err +} + +// ModifyResourceGroup is used to modify one specific resource group to resource manager. +func ModifyResourceGroup(ctx context.Context, group *rmpb.ResourceGroup) error { + is, err := getGlobalInfoSyncer() + if err != nil { + return err + } + _, err = is.resourceGroupManager.ModifyResourceGroup(ctx, group) + return err +} + +// DeleteResourceGroup is used to delete one specific resource group from resource manager. +func DeleteResourceGroup(ctx context.Context, name string) error { + is, err := getGlobalInfoSyncer() + if err != nil { + return err + } + _, err = is.resourceGroupManager.DeleteResourceGroup(ctx, name) + return err +} + // PutRuleBundlesWithDefaultRetry will retry for default times func PutRuleBundlesWithDefaultRetry(ctx context.Context, bundles []*placement.Bundle) (err error) { return PutRuleBundlesWithRetry(ctx, bundles, SyncBundlesMaxRetry, RequestRetryInterval) @@ -669,20 +740,20 @@ func (is *InfoSyncer) GetMinStartTS() uint64 { // storeMinStartTS stores self server min start timestamp to etcd. func (is *InfoSyncer) storeMinStartTS(ctx context.Context) error { - if is.etcdCli == nil { + if is.unprefixedEtcdCli == nil { return nil } - return util.PutKVToEtcd(ctx, is.etcdCli, keyOpDefaultRetryCnt, is.minStartTSPath, + return util.PutKVToEtcd(ctx, is.unprefixedEtcdCli, keyOpDefaultRetryCnt, is.minStartTSPath, strconv.FormatUint(is.minStartTS, 10), clientv3.WithLease(is.session.Lease())) } // RemoveMinStartTS removes self server min start timestamp from etcd. func (is *InfoSyncer) RemoveMinStartTS() { - if is.etcdCli == nil { + if is.unprefixedEtcdCli == nil { return } - err := util.DeleteKeyFromEtcd(is.minStartTSPath, is.etcdCli, keyOpDefaultRetryCnt, keyOpDefaultTimeout) + err := util.DeleteKeyFromEtcd(is.minStartTSPath, is.unprefixedEtcdCli, keyOpDefaultRetryCnt, keyOpDefaultTimeout) if err != nil { logutil.BgLogger().Error("remove minStartTS failed", zap.Error(err)) } @@ -694,8 +765,6 @@ func (is *InfoSyncer) ReportMinStartTS(store kv.Storage) { if sm == nil { return } - pl := sm.ShowProcessList() - innerSessionStartTSList := sm.GetInternalSessionStartTSList() // Calculate the lower limit of the start timestamp to avoid extremely old transaction delaying GC. currentVer, err := store.CurrentVersion(kv.GlobalTxnScope) @@ -709,18 +778,8 @@ func (is *InfoSyncer) ReportMinStartTS(store kv.Storage) { minStartTS := oracle.GoTimeToTS(now) logutil.BgLogger().Debug("ReportMinStartTS", zap.Uint64("initial minStartTS", minStartTS), zap.Uint64("StartTSLowerLimit", startTSLowerLimit)) - for _, info := range pl { - if info.CurTxnStartTS > startTSLowerLimit && info.CurTxnStartTS < minStartTS { - minStartTS = info.CurTxnStartTS - } - } - - for _, innerTS := range innerSessionStartTSList { - logutil.BgLogger().Debug("ReportMinStartTS", zap.Uint64("Internal Session Transaction StartTS", innerTS)) - kv.PrintLongTimeInternalTxn(now, innerTS, false) - if innerTS > startTSLowerLimit && innerTS < minStartTS { - minStartTS = innerTS - } + if ts := sm.GetMinStartTS(startTSLowerLimit); ts > startTSLowerLimit && ts < minStartTS { + minStartTS = ts } is.minStartTS = kv.GetMinInnerTxnStartTS(now, startTSLowerLimit, minStartTS) diff --git a/domain/infosync/info_test.go b/domain/infosync/info_test.go index 90a30d8f1f161..ee97406eef01a 100644 --- a/domain/infosync/info_test.go +++ b/domain/infosync/info_test.go @@ -28,6 +28,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/ddl/util" + "github.com/pingcap/tidb/keyspace" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/testkit/testsetup" util2 "github.com/pingcap/tidb/util" @@ -67,7 +68,7 @@ func TestTopology(t *testing.T) { require.NoError(t, err) }() - info, err := GlobalInfoSyncerInit(ctx, currentID, func() uint64 { return 1 }, client, false) + info, err := GlobalInfoSyncerInit(ctx, currentID, func() uint64 { return 1 }, client, client, nil, keyspace.CodecV1, false) require.NoError(t, err) err = info.newTopologySessionAndStoreServerInfo(ctx, util2.NewSessionDefaultRetryCnt) @@ -152,7 +153,7 @@ func (is *InfoSyncer) ttlKeyExists(ctx context.Context) (bool, error) { } func TestPutBundlesRetry(t *testing.T) { - _, err := GlobalInfoSyncerInit(context.TODO(), "test", func() uint64 { return 1 }, nil, false) + _, err := GlobalInfoSyncerInit(context.TODO(), "test", func() uint64 { return 1 }, nil, nil, nil, keyspace.CodecV1, false) require.NoError(t, err) bundle, err := placement.NewBundleFromOptions(&model.PlacementSettings{PrimaryRegion: "r1", Regions: "r1,r2"}) @@ -216,7 +217,7 @@ func TestPutBundlesRetry(t *testing.T) { func TestTiFlashManager(t *testing.T) { ctx := context.Background() - _, err := GlobalInfoSyncerInit(ctx, "test", func() uint64 { return 1 }, nil, false) + _, err := GlobalInfoSyncerInit(ctx, "test", func() uint64 { return 1 }, nil, nil, nil, keyspace.CodecV1, false) tiflash := NewMockTiFlash() SetMockTiFlash(tiflash) diff --git a/domain/infosync/placement_manager.go b/domain/infosync/placement_manager.go index 5ae047a80cf2c..223dafd0467a3 100644 --- a/domain/infosync/placement_manager.go +++ b/domain/infosync/placement_manager.go @@ -21,9 +21,11 @@ import ( "path" "sync" + "github.com/pingcap/log" "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/util/pdapi" clientv3 "go.etcd.io/etcd/client/v3" + "go.uber.org/zap" ) // PlacementManager manages placement settings @@ -72,6 +74,7 @@ func (m *PDPlacementManager) PutRuleBundles(ctx context.Context, bundles []*plac return err } + log.Debug("Put placement rule bundles", zap.String("rules", string(b))) _, err = doRequest(ctx, "PutPlacementRules", m.etcdCli.Endpoints(), path.Join(pdapi.Config, "placement-rule")+"?partial=true", "POST", bytes.NewReader(b)) return err } diff --git a/domain/infosync/resource_group_manager.go b/domain/infosync/resource_group_manager.go new file mode 100644 index 0000000000000..6b8f876f9bb11 --- /dev/null +++ b/domain/infosync/resource_group_manager.go @@ -0,0 +1,79 @@ +// 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, +// 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 infosync + +import ( + "context" + "sync" + + rmpb "github.com/pingcap/kvproto/pkg/resource_manager" + pd "github.com/tikv/pd/client" +) + +type mockResourceGroupManager struct { + sync.RWMutex + groups map[string]*rmpb.ResourceGroup +} + +var _ pd.ResourceManagerClient = (*mockResourceGroupManager)(nil) + +func (m *mockResourceGroupManager) ListResourceGroups(ctx context.Context) ([]*rmpb.ResourceGroup, error) { + m.RLock() + defer m.RUnlock() + groups := make([]*rmpb.ResourceGroup, 0, len(m.groups)) + for _, group := range m.groups { + groups = append(groups, group) + } + return groups, nil +} + +func (m *mockResourceGroupManager) GetResourceGroup(ctx context.Context, name string) (*rmpb.ResourceGroup, error) { + m.RLock() + defer m.RUnlock() + group, ok := m.groups[name] + if !ok { + return nil, nil + } + return group, nil +} + +func (m *mockResourceGroupManager) AddResourceGroup(ctx context.Context, group *rmpb.ResourceGroup) (string, error) { + m.Lock() + defer m.Unlock() + m.groups[group.Name] = group + return "Success!", nil +} + +func (m *mockResourceGroupManager) ModifyResourceGroup(ctx context.Context, group *rmpb.ResourceGroup) (string, error) { + m.Lock() + defer m.Unlock() + m.groups[group.Name] = group + return "Success!", nil +} + +func (m *mockResourceGroupManager) DeleteResourceGroup(ctx context.Context, name string) (string, error) { + m.Lock() + defer m.Unlock() + delete(m.groups, name) + return "Success!", nil +} + +func (m *mockResourceGroupManager) AcquireTokenBuckets(ctx context.Context, request *rmpb.TokenBucketsRequest) ([]*rmpb.TokenBucketResponse, error) { + return nil, nil +} + +func (m *mockResourceGroupManager) WatchResourceGroup(ctx context.Context, revision int64) (chan []*rmpb.ResourceGroup, error) { + return nil, nil +} diff --git a/domain/infosync/tiflash_manager.go b/domain/infosync/tiflash_manager.go index 4d01c64de002d..6e47d881215d4 100644 --- a/domain/infosync/tiflash_manager.go +++ b/domain/infosync/tiflash_manager.go @@ -31,12 +31,16 @@ import ( "github.com/gorilla/mux" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/store/helper" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/pdapi" + "github.com/tikv/client-go/v2/tikv" clientv3 "go.etcd.io/etcd/client/v3" "go.uber.org/zap" ) @@ -76,6 +80,7 @@ type TiFlashReplicaManagerCtx struct { etcdCli *clientv3.Client sync.RWMutex // protect tiflashProgressCache tiflashProgressCache map[int64]float64 + codec tikv.Codec } // Close is called to close TiFlashReplicaManagerCtx. @@ -89,10 +94,19 @@ func getTiFlashPeerWithoutLagCount(tiFlashStores map[int64]helper.StoreStat, tab for _, store := range tiFlashStores { regionReplica := make(map[int64]int) err := helper.CollectTiFlashStatus(store.Store.StatusAddress, tableID, ®ionReplica) + failpoint.Inject("OneTiFlashStoreDown", func() { + if store.Store.StateName == "Down" { + err = errors.New("mock TiFlasah down") + } + }) if err != nil { logutil.BgLogger().Error("Fail to get peer status from TiFlash.", zap.Int64("tableID", tableID)) - return 0, err + // Just skip down or offline or tomestone stores, because PD will migrate regions from these stores. + if store.Store.StateName == "Up" || store.Store.StateName == "Disconnected" { + return 0, err + } + continue } flashPeerCount += len(regionReplica) } @@ -220,6 +234,11 @@ func (m *TiFlashReplicaManagerCtx) SetTiFlashGroupConfig(ctx context.Context) er // SetPlacementRule is a helper function to set placement rule. func (m *TiFlashReplicaManagerCtx) SetPlacementRule(ctx context.Context, rule placement.TiFlashRule) error { + // TiDB 6.6 doesn't support tiflash multi-tenancy yet. + // TODO(iosmanthus): remove this check after TiDB supports tiflash multi-tenancy. + if m.codec.GetAPIVersion() == kvrpcpb.APIVersion_V2 { + return errors.Trace(dbterror.ErrNotSupportedYet.GenWithStackByArgs("set TiFlash replica count while enabling API V2")) + } if err := m.SetTiFlashGroupConfig(ctx); err != nil { return err } diff --git a/domain/plan_replayer.go b/domain/plan_replayer.go index efc2e8ad21429..bb36048f02b26 100644 --- a/domain/plan_replayer.go +++ b/domain/plan_replayer.go @@ -27,16 +27,18 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/bindinfo" - "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/statistics/handle" + "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/replayer" "github.com/pingcap/tidb/util/sqlexec" "go.uber.org/zap" ) @@ -45,16 +47,10 @@ import ( // For now it is used by `plan replayer` and `trace plan` statement type dumpFileGcChecker struct { sync.Mutex - gcLease time.Duration - paths []string - sctx sessionctx.Context -} - -// GetPlanReplayerDirName returns plan replayer directory path. -// The path is related to the process id. -func GetPlanReplayerDirName() string { - tidbLogDir := filepath.Dir(config.GetGlobalConfig().Log.File.Filename) - return filepath.Join(tidbLogDir, "replayer") + gcLease time.Duration + paths []string + sctx sessionctx.Context + planReplayerTaskStatus *planReplayerDumpTaskStatus } func parseType(s string) string { @@ -105,7 +101,7 @@ func (p *dumpFileGcChecker) gcDumpFilesByPath(path string, t time.Duration) { logutil.BgLogger().Error("[dumpFileGcChecker] parseTime failed", zap.Error(err), zap.String("filename", fileName)) continue } - isPlanReplayer := parseType(fileName) == "replayer" + isPlanReplayer := strings.Contains(fileName, "replayer") if !createTime.After(gcTime) { err := os.Remove(filepath.Join(path, f.Name())) if err != nil { @@ -115,23 +111,12 @@ func (p *dumpFileGcChecker) gcDumpFilesByPath(path string, t time.Duration) { logutil.BgLogger().Info("dumpFileGcChecker successful", zap.String("filename", fileName)) if isPlanReplayer && p.sctx != nil { deletePlanReplayerStatus(context.Background(), p.sctx, fileName) + p.planReplayerTaskStatus.clearFinishedTask() } } } } -type planReplayerHandle struct { - *planReplayerTaskCollectorHandle -} - -type planReplayerTaskCollectorHandle struct { - taskMu struct { - sync.RWMutex - tasks map[PlanReplayerTaskKey]struct{} - } - sctx sessionctx.Context -} - func deletePlanReplayerStatus(ctx context.Context, sctx sessionctx.Context, token string) { ctx1 := kv.WithInternalSourceType(ctx, kv.InternalTxnStats) exec := sctx.(sqlexec.SQLExecutor) @@ -153,62 +138,116 @@ func insertPlanReplayerStatus(ctx context.Context, sctx sessionctx.Context, reco instance = fmt.Sprintf("%s:%d", serverInfo.IP, serverInfo.Port) } for _, record := range records { - if !record.Internal { - if len(record.FailedReason) > 0 { - insertExternalPlanReplayerErrorStatusRecord(ctx1, sctx, instance, record) - } else { - insertExternalPlanReplayerSuccessStatusRecord(ctx1, sctx, instance, record) - } + if len(record.FailedReason) > 0 { + insertPlanReplayerErrorStatusRecord(ctx1, sctx, instance, record) + } else { + insertPlanReplayerSuccessStatusRecord(ctx1, sctx, instance, record) } } } -func insertExternalPlanReplayerErrorStatusRecord(ctx context.Context, sctx sessionctx.Context, instance string, record PlanReplayerStatusRecord) { - exec := sctx.(sqlexec.SQLExecutor) - _, err := exec.ExecuteInternal(ctx, fmt.Sprintf( - "insert into mysql.plan_replayer_status (origin_sql, fail_reason, instance) values ('%s','%s','%s')", - record.OriginSQL, record.FailedReason, instance)) +func insertPlanReplayerErrorStatusRecord(ctx context.Context, sctx sessionctx.Context, instance string, record PlanReplayerStatusRecord) { + exec := sctx.(sqlexec.RestrictedSQLExecutor) + _, _, err := exec.ExecRestrictedSQL(ctx, nil, fmt.Sprintf( + "insert into mysql.plan_replayer_status (sql_digest, plan_digest, origin_sql, fail_reason, instance) values ('%s','%s','%s','%s','%s')", + record.SQLDigest, record.PlanDigest, record.OriginSQL, record.FailedReason, instance)) if err != nil { logutil.BgLogger().Warn("insert mysql.plan_replayer_status record failed", zap.Error(err)) } } -func insertExternalPlanReplayerSuccessStatusRecord(ctx context.Context, sctx sessionctx.Context, instance string, record PlanReplayerStatusRecord) { - exec := sctx.(sqlexec.SQLExecutor) - _, err := exec.ExecuteInternal(ctx, fmt.Sprintf( - "insert into mysql.plan_replayer_status (origin_sql, token, instance) values ('%s','%s','%s')", - record.OriginSQL, record.Token, instance)) +func insertPlanReplayerSuccessStatusRecord(ctx context.Context, sctx sessionctx.Context, instance string, record PlanReplayerStatusRecord) { + exec := sctx.(sqlexec.RestrictedSQLExecutor) + _, _, err := exec.ExecRestrictedSQL(ctx, nil, fmt.Sprintf( + "insert into mysql.plan_replayer_status (sql_digest, plan_digest, origin_sql, token, instance) values ('%s','%s','%s','%s','%s')", + record.SQLDigest, record.PlanDigest, record.OriginSQL, record.Token, instance)) if err != nil { logutil.BgLogger().Warn("insert mysql.plan_replayer_status record failed", + zap.String("sql", record.OriginSQL), zap.Error(err)) + // try insert record without original sql + _, _, err = exec.ExecRestrictedSQL(ctx, nil, fmt.Sprintf( + "insert into mysql.plan_replayer_status (sql_digest, plan_digest, token, instance) values ('%s','%s','%s','%s')", + record.SQLDigest, record.PlanDigest, record.Token, instance)) + if err != nil { + logutil.BgLogger().Warn("insert mysql.plan_replayer_status record failed", + zap.String("sqlDigest", record.SQLDigest), + zap.String("planDigest", record.PlanDigest), + zap.Error(err)) + } + } +} + +var ( + planReplayerCaptureTaskSendCounter = metrics.PlanReplayerTaskCounter.WithLabelValues("capture", "send") + planReplayerCaptureTaskDiscardCounter = metrics.PlanReplayerTaskCounter.WithLabelValues("capture", "discard") + + planReplayerRegisterTaskGauge = metrics.PlanReplayerRegisterTaskGauge +) + +type planReplayerHandle struct { + *planReplayerTaskCollectorHandle + *planReplayerTaskDumpHandle +} + +// SendTask send dumpTask in background task handler +func (h *planReplayerHandle) SendTask(task *PlanReplayerDumpTask) bool { + select { + case h.planReplayerTaskDumpHandle.taskCH <- task: + // we directly remove the task key if we put task in channel successfully, if the task was failed to dump, + // the task handle will re-add the task in next loop + if !task.IsContinuesCapture { + h.planReplayerTaskCollectorHandle.removeTask(task.PlanReplayerTaskKey) + } + planReplayerCaptureTaskSendCounter.Inc() + return true + default: + planReplayerCaptureTaskDiscardCounter.Inc() + // directly discard the task if the task channel is full in order not to block the query process + logutil.BgLogger().Warn("discard one plan replayer dump task", + zap.String("sql-digest", task.SQLDigest), zap.String("plan-digest", task.PlanDigest)) + return false } } +type planReplayerTaskCollectorHandle struct { + taskMu struct { + sync.RWMutex + tasks map[replayer.PlanReplayerTaskKey]struct{} + } + ctx context.Context + sctx sessionctx.Context +} + // CollectPlanReplayerTask collects all unhandled plan replayer task -func (h *planReplayerTaskCollectorHandle) CollectPlanReplayerTask(ctx context.Context) error { - ctx1 := kv.WithInternalSourceType(ctx, kv.InternalTxnStats) - allKeys, err := h.collectAllPlanReplayerTask(ctx1) +func (h *planReplayerTaskCollectorHandle) CollectPlanReplayerTask() error { + allKeys, err := h.collectAllPlanReplayerTask(h.ctx) if err != nil { return err } - tasks := make([]PlanReplayerTaskKey, 0) + tasks := make([]replayer.PlanReplayerTaskKey, 0) for _, key := range allKeys { - unhandled, err := checkUnHandledReplayerTask(ctx1, h.sctx, key) + unhandled, err := checkUnHandledReplayerTask(h.ctx, h.sctx, key) if err != nil { + logutil.BgLogger().Warn("[plan-replayer-task] collect plan replayer task failed", zap.Error(err)) return err } if unhandled { + logutil.BgLogger().Debug("[plan-replayer-task] collect plan replayer task success", + zap.String("sql-digest", key.SQLDigest), + zap.String("plan-digest", key.PlanDigest)) tasks = append(tasks, key) } } h.setupTasks(tasks) + planReplayerRegisterTaskGauge.Set(float64(len(tasks))) return nil } // GetTasks get all tasks -func (h *planReplayerTaskCollectorHandle) GetTasks() []PlanReplayerTaskKey { - tasks := make([]PlanReplayerTaskKey, 0) +func (h *planReplayerTaskCollectorHandle) GetTasks() []replayer.PlanReplayerTaskKey { + tasks := make([]replayer.PlanReplayerTaskKey, 0) h.taskMu.RLock() defer h.taskMu.RUnlock() for taskKey := range h.taskMu.tasks { @@ -217,8 +256,8 @@ func (h *planReplayerTaskCollectorHandle) GetTasks() []PlanReplayerTaskKey { return tasks } -func (h *planReplayerTaskCollectorHandle) setupTasks(tasks []PlanReplayerTaskKey) { - r := make(map[PlanReplayerTaskKey]struct{}) +func (h *planReplayerTaskCollectorHandle) setupTasks(tasks []replayer.PlanReplayerTaskKey) { + r := make(map[replayer.PlanReplayerTaskKey]struct{}) for _, task := range tasks { r[task] = struct{}{} } @@ -227,7 +266,13 @@ func (h *planReplayerTaskCollectorHandle) setupTasks(tasks []PlanReplayerTaskKey h.taskMu.tasks = r } -func (h *planReplayerTaskCollectorHandle) collectAllPlanReplayerTask(ctx context.Context) ([]PlanReplayerTaskKey, error) { +func (h *planReplayerTaskCollectorHandle) removeTask(taskKey replayer.PlanReplayerTaskKey) { + h.taskMu.Lock() + defer h.taskMu.Unlock() + delete(h.taskMu.tasks, taskKey) +} + +func (h *planReplayerTaskCollectorHandle) collectAllPlanReplayerTask(ctx context.Context) ([]replayer.PlanReplayerTaskKey, error) { exec := h.sctx.(sqlexec.SQLExecutor) rs, err := exec.ExecuteInternal(ctx, "select sql_digest, plan_digest from mysql.plan_replayer_task") if err != nil { @@ -241,20 +286,216 @@ func (h *planReplayerTaskCollectorHandle) collectAllPlanReplayerTask(ctx context if rows, err = sqlexec.DrainRecordSet(ctx, rs, 8); err != nil { return nil, errors.Trace(err) } - allKeys := make([]PlanReplayerTaskKey, 0, len(rows)) + allKeys := make([]replayer.PlanReplayerTaskKey, 0, len(rows)) for _, row := range rows { sqlDigest, planDigest := row.GetString(0), row.GetString(1) - allKeys = append(allKeys, PlanReplayerTaskKey{ - sqlDigest: sqlDigest, - planDigest: planDigest, + allKeys = append(allKeys, replayer.PlanReplayerTaskKey{ + SQLDigest: sqlDigest, + PlanDigest: planDigest, }) } return allKeys, nil } -func checkUnHandledReplayerTask(ctx context.Context, sctx sessionctx.Context, task PlanReplayerTaskKey) (bool, error) { +type planReplayerDumpTaskStatus struct { + // running task records the task running by all workers in order to avoid multi workers running the same task key + runningTaskMu struct { + sync.RWMutex + runningTasks map[replayer.PlanReplayerTaskKey]struct{} + } + + // finished task records the finished task in order to avoid running finished task key + finishedTaskMu struct { + sync.RWMutex + finishedTask map[replayer.PlanReplayerTaskKey]struct{} + } +} + +// GetRunningTaskStatusLen used for unit test +func (r *planReplayerDumpTaskStatus) GetRunningTaskStatusLen() int { + r.runningTaskMu.RLock() + defer r.runningTaskMu.RUnlock() + return len(r.runningTaskMu.runningTasks) +} + +// CleanFinishedTaskStatus clean then finished tasks, only used for unit test +func (r *planReplayerDumpTaskStatus) CleanFinishedTaskStatus() { + r.finishedTaskMu.Lock() + defer r.finishedTaskMu.Unlock() + r.finishedTaskMu.finishedTask = map[replayer.PlanReplayerTaskKey]struct{}{} +} + +// GetFinishedTaskStatusLen used for unit test +func (r *planReplayerDumpTaskStatus) GetFinishedTaskStatusLen() int { + r.finishedTaskMu.RLock() + defer r.finishedTaskMu.RUnlock() + return len(r.finishedTaskMu.finishedTask) +} + +func (r *planReplayerDumpTaskStatus) occupyRunningTaskKey(task *PlanReplayerDumpTask) bool { + r.runningTaskMu.Lock() + defer r.runningTaskMu.Unlock() + _, ok := r.runningTaskMu.runningTasks[task.PlanReplayerTaskKey] + if ok { + return false + } + r.runningTaskMu.runningTasks[task.PlanReplayerTaskKey] = struct{}{} + return true +} + +func (r *planReplayerDumpTaskStatus) releaseRunningTaskKey(task *PlanReplayerDumpTask) { + r.runningTaskMu.Lock() + defer r.runningTaskMu.Unlock() + delete(r.runningTaskMu.runningTasks, task.PlanReplayerTaskKey) +} + +func (r *planReplayerDumpTaskStatus) checkTaskKeyFinishedBefore(task *PlanReplayerDumpTask) bool { + r.finishedTaskMu.RLock() + defer r.finishedTaskMu.RUnlock() + _, ok := r.finishedTaskMu.finishedTask[task.PlanReplayerTaskKey] + return ok +} + +func (r *planReplayerDumpTaskStatus) setTaskFinished(task *PlanReplayerDumpTask) { + r.finishedTaskMu.Lock() + defer r.finishedTaskMu.Unlock() + r.finishedTaskMu.finishedTask[task.PlanReplayerTaskKey] = struct{}{} +} + +func (r *planReplayerDumpTaskStatus) clearFinishedTask() { + r.finishedTaskMu.Lock() + defer r.finishedTaskMu.Unlock() + r.finishedTaskMu.finishedTask = map[replayer.PlanReplayerTaskKey]struct{}{} +} + +type planReplayerTaskDumpWorker struct { + ctx context.Context + sctx sessionctx.Context + taskCH <-chan *PlanReplayerDumpTask + status *planReplayerDumpTaskStatus +} + +func (w *planReplayerTaskDumpWorker) run() { + logutil.BgLogger().Info("planReplayerTaskDumpWorker started.") + for task := range w.taskCH { + w.handleTask(task) + } + logutil.BgLogger().Info("planReplayerTaskDumpWorker exited.") +} + +func (w *planReplayerTaskDumpWorker) handleTask(task *PlanReplayerDumpTask) { + sqlDigest := task.SQLDigest + planDigest := task.PlanDigest + check := true + occupy := true + handleTask := true + defer func() { + util.Recover(metrics.LabelDomain, "PlanReplayerTaskDumpWorker", nil, false) + logutil.BgLogger().Debug("[plan-replayer-capture] handle task", + zap.String("sql-digest", sqlDigest), + zap.String("plan-digest", planDigest), + zap.Bool("check", check), + zap.Bool("occupy", occupy), + zap.Bool("handle", handleTask)) + }() + if task.IsContinuesCapture { + if w.status.checkTaskKeyFinishedBefore(task) { + check = false + return + } + } + occupy = w.status.occupyRunningTaskKey(task) + if !occupy { + return + } + handleTask = w.HandleTask(task) + w.status.releaseRunningTaskKey(task) +} + +// HandleTask handled task +func (w *planReplayerTaskDumpWorker) HandleTask(task *PlanReplayerDumpTask) (success bool) { + defer func() { + if success && task.IsContinuesCapture { + w.status.setTaskFinished(task) + } + }() + taskKey := task.PlanReplayerTaskKey + unhandled, err := checkUnHandledReplayerTask(w.ctx, w.sctx, taskKey) + if err != nil { + logutil.BgLogger().Warn("[plan-replayer-capture] check task failed", + zap.String("sqlDigest", taskKey.SQLDigest), + zap.String("planDigest", taskKey.PlanDigest), + zap.Error(err)) + return false + } + // the task is processed, thus we directly skip it. + if !unhandled { + return true + } + + file, fileName, err := replayer.GeneratePlanReplayerFile(task.IsCapture, task.IsContinuesCapture, variable.EnableHistoricalStatsForCapture.Load()) + if err != nil { + logutil.BgLogger().Warn("[plan-replayer-capture] generate task file failed", + zap.String("sqlDigest", taskKey.SQLDigest), + zap.String("planDigest", taskKey.PlanDigest), + zap.Error(err)) + return false + } + task.Zf = file + task.FileName = fileName + if task.InExecute && len(task.NormalizedSQL) > 0 { + p := parser.New() + stmts, _, err := p.ParseSQL(task.NormalizedSQL) + if err != nil { + logutil.BgLogger().Warn("[plan-replayer-capture] parse normalized sql failed", + zap.String("sql", task.NormalizedSQL), + zap.String("sqlDigest", taskKey.SQLDigest), + zap.String("planDigest", taskKey.PlanDigest), + zap.Error(err)) + return false + } + task.ExecStmts = stmts + } + err = DumpPlanReplayerInfo(w.ctx, w.sctx, task) + if err != nil { + logutil.BgLogger().Warn("[plan-replayer-capture] dump task result failed", + zap.String("sqlDigest", taskKey.SQLDigest), + zap.String("planDigest", taskKey.PlanDigest), + zap.Error(err)) + return false + } + return true +} + +type planReplayerTaskDumpHandle struct { + taskCH chan *PlanReplayerDumpTask + status *planReplayerDumpTaskStatus + workers []*planReplayerTaskDumpWorker +} + +// GetTaskStatus used for test +func (h *planReplayerTaskDumpHandle) GetTaskStatus() *planReplayerDumpTaskStatus { + return h.status +} + +// GetWorker used for test +func (h *planReplayerTaskDumpHandle) GetWorker() *planReplayerTaskDumpWorker { + return h.workers[0] +} + +// Close make finished flag ture +func (h *planReplayerTaskDumpHandle) Close() { + close(h.taskCH) +} + +// DrainTask drain a task for unit test +func (h *planReplayerTaskDumpHandle) DrainTask() *PlanReplayerDumpTask { + return <-h.taskCH +} + +func checkUnHandledReplayerTask(ctx context.Context, sctx sessionctx.Context, task replayer.PlanReplayerTaskKey) (bool, error) { exec := sctx.(sqlexec.SQLExecutor) - rs, err := exec.ExecuteInternal(ctx, fmt.Sprintf("select * from mysql.plan_replayer_status where sql_digest = '%v' and plan_digest = '%v' and fail_reason is null", task.sqlDigest, task.planDigest)) + rs, err := exec.ExecuteInternal(ctx, fmt.Sprintf("select * from mysql.plan_replayer_status where sql_digest = '%v' and plan_digest = '%v' and fail_reason is null", task.SQLDigest, task.PlanDigest)) if err != nil { return false, err } @@ -272,28 +513,59 @@ func checkUnHandledReplayerTask(ctx context.Context, sctx sessionctx.Context, ta return true, nil } +// CheckPlanReplayerTaskExists checks whether plan replayer capture task exists already +func CheckPlanReplayerTaskExists(ctx context.Context, sctx sessionctx.Context, sqlDigest, planDigest string) (bool, error) { + exec := sctx.(sqlexec.SQLExecutor) + rs, err := exec.ExecuteInternal(ctx, fmt.Sprintf("select * from mysql.plan_replayer_task where sql_digest = '%v' and plan_digest = '%v'", + sqlDigest, planDigest)) + if err != nil { + return false, err + } + if rs == nil { + return false, nil + } + var rows []chunk.Row + defer terror.Call(rs.Close) + if rows, err = sqlexec.DrainRecordSet(ctx, rs, 8); err != nil { + return false, errors.Trace(err) + } + if len(rows) > 0 { + return true, nil + } + return false, nil +} + // PlanReplayerStatusRecord indicates record in mysql.plan_replayer_status type PlanReplayerStatusRecord struct { - Internal bool + SQLDigest string + PlanDigest string OriginSQL string Token string FailedReason string } -// PlanReplayerTaskKey indicates key of a plan replayer task -type PlanReplayerTaskKey struct { - sqlDigest string - planDigest string -} - // PlanReplayerDumpTask wrap the params for plan replayer dump type PlanReplayerDumpTask struct { + replayer.PlanReplayerTaskKey + + // tmp variables stored during the query + TblStats map[int64]interface{} + InExecute bool + NormalizedSQL string + + // variables used to dump the plan + StartTS uint64 SessionBindings []*bindinfo.BindRecord EncodedPlan string - FileName string - Zf *os.File SessionVars *variable.SessionVars - TblStats map[int64]*handle.JSONTable ExecStmts []ast.StmtNode Analyze bool + + FileName string + Zf *os.File + + // IsCapture indicates whether the task is from capture + IsCapture bool + // IsContinuesCapture indicates whether the task is from continues capture + IsContinuesCapture bool } diff --git a/domain/plan_replayer_dump.go b/domain/plan_replayer_dump.go index 93d0278a4ba3d..c656cb11d56e1 100644 --- a/domain/plan_replayer_dump.go +++ b/domain/plan_replayer_dump.go @@ -28,6 +28,7 @@ import ( "github.com/pingcap/tidb/bindinfo" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx" @@ -41,6 +42,8 @@ import ( ) const ( + // PlanReplayerSQLMetaFile indicates sql meta path for plan replayer + PlanReplayerSQLMetaFile = "sql_meta.toml" // PlanReplayerConfigFile indicates config file path for plan replayer PlanReplayerConfigFile = "config.toml" // PlanReplayerMetaFile meta file path for plan replayer @@ -53,6 +56,23 @@ const ( PlanReplayerSessionBindingFile = "session_bindings.sql" // PlanReplayerGlobalBindingFile indicates global binding file path for plan replayer PlanReplayerGlobalBindingFile = "global_bindings.sql" + // PlanReplayerSchemaMetaFile indicates the schema meta + PlanReplayerSchemaMetaFile = "schema_meta.txt" +) + +const ( + // PlanReplayerSQLMetaStartTS indicates the startTS in plan replayer sql meta + PlanReplayerSQLMetaStartTS = "startTS" + // PlanReplayerTaskMetaIsCapture indicates whether this task is capture task + PlanReplayerTaskMetaIsCapture = "isCapture" + // PlanReplayerTaskMetaIsContinues indicates whether this task is continues task + PlanReplayerTaskMetaIsContinues = "isContinues" + // PlanReplayerTaskMetaSQLDigest indicates the sql digest of this task + PlanReplayerTaskMetaSQLDigest = "sqlDigest" + // PlanReplayerTaskMetaPlanDigest indicates the plan digest of this task + PlanReplayerTaskMetaPlanDigest = "planDigest" + // PlanReplayerTaskEnableHistoricalStats indicates whether the task is using historical stats + PlanReplayerTaskEnableHistoricalStats = "enableHistoricalStats" ) type tableNamePair struct { @@ -88,12 +108,14 @@ func (tne *tableNameExtractor) Leave(in ast.Node) (ast.Node, bool) { tne.err = err return in, true } - tp := tableNamePair{DBName: t.Schema.L, TableName: t.Name.L, IsView: isView} - if tp.DBName == "" { - tp.DBName = tne.curDB.L - } - if _, ok := tne.names[tp]; !ok { - tne.names[tp] = struct{}{} + if t.TableInfo != nil { + tp := tableNamePair{DBName: t.Schema.L, TableName: t.Name.L, IsView: isView} + if tp.DBName == "" { + tp.DBName = tne.curDB.L + } + if _, ok := tne.names[tp]; !ok { + tne.names[tp] = struct{}{} + } } } else if s, ok := in.(*ast.SelectStmt); ok { if s.With != nil && len(s.With.CTEs) > 0 { @@ -128,11 +150,18 @@ func (tne *tableNameExtractor) handleIsView(t *ast.TableName) (bool, error) { return true, nil } +var ( + planReplayerDumpTaskSuccess = metrics.PlanReplayerTaskCounter.WithLabelValues("dump", "success") + planReplayerDumpTaskFailed = metrics.PlanReplayerTaskCounter.WithLabelValues("dump", "fail") +) + // DumpPlanReplayerInfo will dump the information about sqls. // The files will be organized into the following format: /* + |-sql_meta.toml |-meta.txt |-schema + | |-schema_meta.txt | |-db1.table1.schema.txt | |-db2.table2.schema.txt | |-.... @@ -144,6 +173,10 @@ func (tne *tableNameExtractor) handleIsView(t *ast.TableName) (bool, error) { | |-stats1.json | |-stats2.json | |-.... + |-statsMem + | |-stats1.txt + | |-stats2.txt + | |-.... |-config.toml |-table_tiflash_replica.txt |-variables.toml @@ -164,22 +197,62 @@ func DumpPlanReplayerInfo(ctx context.Context, sctx sessionctx.Context, sessionVars := task.SessionVars execStmts := task.ExecStmts zw := zip.NewWriter(zf) - records := generateRecords(task) + var records []PlanReplayerStatusRecord + sqls := make([]string, 0) + for _, execStmt := range task.ExecStmts { + sqls = append(sqls, execStmt.Text()) + } + if task.IsCapture { + logutil.BgLogger().Info("[plan-replayer-dump] start to dump plan replayer result", + zap.String("sql-digest", task.SQLDigest), + zap.String("plan-digest", task.PlanDigest), + zap.Strings("sql", sqls), + zap.Bool("isContinues", task.IsContinuesCapture)) + } else { + logutil.BgLogger().Info("[plan-replayer-dump] start to dump plan replayer result", + zap.Strings("sqls", sqls)) + } defer func() { - err = zw.Close() + errMsg := "" if err != nil { - logutil.BgLogger().Error("Closing zip writer failed", zap.Error(err), zap.String("filename", fileName)) + if task.IsCapture { + logutil.BgLogger().Info("[plan-replayer-dump] dump file failed", + zap.String("sql-digest", task.SQLDigest), + zap.String("plan-digest", task.PlanDigest), + zap.Strings("sql", sqls), + zap.Bool("isContinues", task.IsContinuesCapture)) + } else { + logutil.BgLogger().Info("[plan-replayer-dump] start to dump plan replayer result", + zap.Strings("sqls", sqls)) + } + errMsg = err.Error() + planReplayerDumpTaskFailed.Inc() + } else { + planReplayerDumpTaskSuccess.Inc() } - err = zf.Close() - if err != nil { - logutil.BgLogger().Error("Closing zip file failed", zap.Error(err), zap.String("filename", fileName)) + err1 := zw.Close() + if err1 != nil { + logutil.BgLogger().Error("[plan-replayer-dump] Closing zip writer failed", zap.Error(err), zap.String("filename", fileName)) + errMsg = errMsg + "," + err1.Error() + } + err2 := zf.Close() + if err2 != nil { + logutil.BgLogger().Error("[plan-replayer-dump] Closing zip file failed", zap.Error(err), zap.String("filename", fileName)) + errMsg = errMsg + "," + err2.Error() + } + if len(errMsg) > 0 { for i, record := range records { - record.FailedReason = err.Error() + record.FailedReason = errMsg records[i] = record } } insertPlanReplayerStatus(ctx, sctx, records) }() + // Dump SQLMeta + if err = dumpSQLMeta(zw, task); err != nil { + return err + } + // Dump config if err = dumpConfig(zw); err != nil { return err @@ -209,8 +282,23 @@ func DumpPlanReplayerInfo(ctx context.Context, sctx sessionctx.Context, return err } - // Dump stats - if err = dumpStats(zw, pairs, task.TblStats, do); err != nil { + // For capture task, we dump stats in storage only if EnableHistoricalStatsForCapture is disabled. + // For manual plan replayer dump command, we directly dump stats in storage + if task.IsCapture { + if !task.IsContinuesCapture && variable.EnableHistoricalStatsForCapture.Load() { + // Dump stats + if err = dumpStats(zw, pairs, do); err != nil { + return err + } + } + } else { + // Dump stats + if err = dumpStats(zw, pairs, do); err != nil { + return err + } + } + + if err = dumpStatsMemStatus(zw, pairs, do); err != nil { return err } @@ -241,10 +329,11 @@ func DumpPlanReplayerInfo(ctx context.Context, sctx sessionctx.Context, } if len(task.EncodedPlan) > 0 { + records = generateRecords(task) return dumpEncodedPlan(sctx, zw, task.EncodedPlan) } // Dump explain - return dumpExplain(sctx, zw, execStmts, task.Analyze) + return dumpExplain(sctx, zw, task, &records) } func generateRecords(task *PlanReplayerDumpTask) []PlanReplayerStatusRecord { @@ -252,15 +341,34 @@ func generateRecords(task *PlanReplayerDumpTask) []PlanReplayerStatusRecord { if len(task.ExecStmts) > 0 { for _, execStmt := range task.ExecStmts { records = append(records, PlanReplayerStatusRecord{ - OriginSQL: execStmt.Text(), - Token: task.FileName, - Internal: false, + SQLDigest: task.SQLDigest, + PlanDigest: task.PlanDigest, + OriginSQL: execStmt.Text(), + Token: task.FileName, }) } } return records } +func dumpSQLMeta(zw *zip.Writer, task *PlanReplayerDumpTask) error { + cf, err := zw.Create(PlanReplayerSQLMetaFile) + if err != nil { + return errors.AddStack(err) + } + varMap := make(map[string]string) + varMap[PlanReplayerSQLMetaStartTS] = strconv.FormatUint(task.StartTS, 10) + varMap[PlanReplayerTaskMetaIsCapture] = strconv.FormatBool(task.IsCapture) + varMap[PlanReplayerTaskMetaIsContinues] = strconv.FormatBool(task.IsContinuesCapture) + varMap[PlanReplayerTaskMetaSQLDigest] = task.SQLDigest + varMap[PlanReplayerTaskMetaPlanDigest] = task.PlanDigest + varMap[PlanReplayerTaskEnableHistoricalStats] = strconv.FormatBool(variable.EnableHistoricalStatsForCapture.Load()) + if err := toml.NewEncoder(cf).Encode(varMap); err != nil { + return errors.AddStack(err) + } + return nil +} + func dumpConfig(zw *zip.Writer) error { cf, err := zw.Create(PlanReplayerConfigFile) if err != nil { @@ -310,21 +418,70 @@ func dumpTiFlashReplica(ctx sessionctx.Context, zw *zip.Writer, pairs map[tableN } func dumpSchemas(ctx sessionctx.Context, zw *zip.Writer, pairs map[tableNamePair]struct{}) error { + tables := make(map[tableNamePair]struct{}) for pair := range pairs { err := getShowCreateTable(pair, zw, ctx) if err != nil { return err } + if !pair.IsView { + tables[pair] = struct{}{} + } + } + return dumpSchemaMeta(zw, tables) +} + +func dumpSchemaMeta(zw *zip.Writer, tables map[tableNamePair]struct{}) error { + zf, err := zw.Create(fmt.Sprintf("schema/%v", PlanReplayerSchemaMetaFile)) + if err != nil { + return err + } + for table := range tables { + _, err := fmt.Fprintf(zf, "%s;%s", table.DBName, table.TableName) + if err != nil { + return err + } + } + return nil +} + +func dumpStatsMemStatus(zw *zip.Writer, pairs map[tableNamePair]struct{}, do *Domain) error { + statsHandle := do.StatsHandle() + is := do.InfoSchema() + for pair := range pairs { + if pair.IsView { + continue + } + tbl, err := is.TableByName(model.NewCIStr(pair.DBName), model.NewCIStr(pair.TableName)) + if err != nil { + return err + } + tblStats := statsHandle.GetTableStats(tbl.Meta()) + if tblStats == nil { + continue + } + statsMemFw, err := zw.Create(fmt.Sprintf("statsMem/%v.%v.txt", pair.DBName, pair.TableName)) + if err != nil { + return errors.AddStack(err) + } + fmt.Fprintf(statsMemFw, "[INDEX]\n") + for _, indice := range tblStats.Indices { + fmt.Fprintf(statsMemFw, "%s\n", fmt.Sprintf("%s=%s", indice.Info.Name.String(), indice.StatusToString())) + } + fmt.Fprintf(statsMemFw, "[COLUMN]\n") + for _, col := range tblStats.Columns { + fmt.Fprintf(statsMemFw, "%s\n", fmt.Sprintf("%s=%s", col.Info.Name.String(), col.StatusToString())) + } } return nil } -func dumpStats(zw *zip.Writer, pairs map[tableNamePair]struct{}, tblJSONStats map[int64]*handle.JSONTable, do *Domain) error { +func dumpStats(zw *zip.Writer, pairs map[tableNamePair]struct{}, do *Domain) error { for pair := range pairs { if pair.IsView { continue } - jsonTbl, err := getStatsForTable(do, tblJSONStats, pair) + jsonTbl, err := getStatsForTable(do, pair) if err != nil { return err } @@ -484,12 +641,12 @@ func dumpEncodedPlan(ctx sessionctx.Context, zw *zip.Writer, encodedPlan string) return nil } -func dumpExplain(ctx sessionctx.Context, zw *zip.Writer, execStmts []ast.StmtNode, isAnalyze bool) error { - for i, stmtExec := range execStmts { +func dumpExplain(ctx sessionctx.Context, zw *zip.Writer, task *PlanReplayerDumpTask, records *[]PlanReplayerStatusRecord) error { + for i, stmtExec := range task.ExecStmts { sql := stmtExec.Text() var recordSets []sqlexec.RecordSet var err error - if isAnalyze { + if task.Analyze { // Explain analyze recordSets, err = ctx.(sqlexec.SQLExecutor).Execute(context.Background(), fmt.Sprintf("explain analyze %s", sql)) if err != nil { @@ -518,6 +675,10 @@ func dumpExplain(ctx sessionctx.Context, zw *zip.Writer, execStmts []ast.StmtNod return err } } + *records = append(*records, PlanReplayerStatusRecord{ + OriginSQL: sql, + Token: task.FileName, + }) } return nil } @@ -553,19 +714,14 @@ func extractTableNames(ctx context.Context, sctx sessionctx.Context, return r, nil } -func getStatsForTable(do *Domain, tblJSONStats map[int64]*handle.JSONTable, pair tableNamePair) (*handle.JSONTable, error) { +func getStatsForTable(do *Domain, pair tableNamePair) (*handle.JSONTable, error) { is := do.InfoSchema() h := do.StatsHandle() tbl, err := is.TableByName(model.NewCIStr(pair.DBName), model.NewCIStr(pair.TableName)) if err != nil { return nil, err } - js, ok := tblJSONStats[tbl.Meta().ID] - if ok && js != nil { - return js, nil - } - js, err = h.DumpStatsToJSON(pair.DBName, tbl.Meta(), nil, true) - return js, err + return h.DumpStatsToJSON(pair.DBName, tbl.Meta(), nil, true) } func getShowCreateTable(pair tableNamePair, zw *zip.Writer, ctx sessionctx.Context) error { diff --git a/domain/plan_replayer_handle_test.go b/domain/plan_replayer_handle_test.go index 2c25f56e15045..cb5d0bd5126bb 100644 --- a/domain/plan_replayer_handle_test.go +++ b/domain/plan_replayer_handle_test.go @@ -15,7 +15,7 @@ package domain_test import ( - "context" + "fmt" "testing" "github.com/pingcap/tidb/testkit" @@ -31,14 +31,14 @@ func TestPlanReplayerHandleCollectTask(t *testing.T) { tk.MustExec("delete from mysql.plan_replayer_task") tk.MustExec("delete from mysql.plan_replayer_status") tk.MustExec("insert into mysql.plan_replayer_task (sql_digest, plan_digest) values ('123','123');") - err := prHandle.CollectPlanReplayerTask(context.Background()) + err := prHandle.CollectPlanReplayerTask() require.NoError(t, err) require.Len(t, prHandle.GetTasks(), 1) // assert no task tk.MustExec("delete from mysql.plan_replayer_task") tk.MustExec("delete from mysql.plan_replayer_status") - err = prHandle.CollectPlanReplayerTask(context.Background()) + err = prHandle.CollectPlanReplayerTask() require.NoError(t, err) require.Len(t, prHandle.GetTasks(), 0) @@ -48,7 +48,7 @@ func TestPlanReplayerHandleCollectTask(t *testing.T) { tk.MustExec("insert into mysql.plan_replayer_task (sql_digest, plan_digest) values ('123','123');") tk.MustExec("insert into mysql.plan_replayer_task (sql_digest, plan_digest) values ('345','345');") tk.MustExec("insert into mysql.plan_replayer_status(sql_digest, plan_digest, token, instance) values ('123','123','123','123')") - err = prHandle.CollectPlanReplayerTask(context.Background()) + err = prHandle.CollectPlanReplayerTask() require.NoError(t, err) require.Len(t, prHandle.GetTasks(), 1) @@ -58,7 +58,64 @@ func TestPlanReplayerHandleCollectTask(t *testing.T) { tk.MustExec("insert into mysql.plan_replayer_task (sql_digest, plan_digest) values ('123','123');") tk.MustExec("insert into mysql.plan_replayer_task (sql_digest, plan_digest) values ('345','345');") tk.MustExec("insert into mysql.plan_replayer_status(sql_digest, plan_digest, fail_reason, instance) values ('123','123','123','123')") - err = prHandle.CollectPlanReplayerTask(context.Background()) + err = prHandle.CollectPlanReplayerTask() require.NoError(t, err) require.Len(t, prHandle.GetTasks(), 2) } + +func TestPlanReplayerHandleDumpTask(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + prHandle := dom.GetPlanReplayerHandle() + tk.MustExec("use test") + tk.MustExec("create table t(a int)") + tk.MustQuery("select * from t;") + _, d := tk.Session().GetSessionVars().StmtCtx.SQLDigest() + _, pd := tk.Session().GetSessionVars().StmtCtx.GetPlanDigest() + sqlDigest := d.String() + planDigest := pd.String() + + // register task + tk.MustExec("delete from mysql.plan_replayer_task") + tk.MustExec("delete from mysql.plan_replayer_status") + tk.MustExec(fmt.Sprintf("insert into mysql.plan_replayer_task (sql_digest, plan_digest) values ('%v','%v');", sqlDigest, planDigest)) + err := prHandle.CollectPlanReplayerTask() + require.NoError(t, err) + require.Len(t, prHandle.GetTasks(), 1) + + tk.MustExec("SET @@tidb_enable_plan_replayer_capture = ON;") + + // capture task and dump + tk.MustQuery("select * from t;") + task := prHandle.DrainTask() + require.NotNil(t, task) + worker := prHandle.GetWorker() + success := worker.HandleTask(task) + require.True(t, success) + require.Equal(t, prHandle.GetTaskStatus().GetRunningTaskStatusLen(), 0) + // assert memory task consumed + require.Len(t, prHandle.GetTasks(), 0) + + // assert collect task again and no more memory task + err = prHandle.CollectPlanReplayerTask() + require.NoError(t, err) + require.Len(t, prHandle.GetTasks(), 0) + + // clean the task and register task + prHandle.GetTaskStatus().CleanFinishedTaskStatus() + tk.MustExec("delete from mysql.plan_replayer_task") + tk.MustExec("delete from mysql.plan_replayer_status") + tk.MustExec(fmt.Sprintf("insert into mysql.plan_replayer_task (sql_digest, plan_digest) values ('%v','%v');", sqlDigest, "*")) + err = prHandle.CollectPlanReplayerTask() + require.NoError(t, err) + require.Len(t, prHandle.GetTasks(), 1) + tk.MustQuery("select * from t;") + task = prHandle.DrainTask() + require.NotNil(t, task) + worker = prHandle.GetWorker() + success = worker.HandleTask(task) + require.True(t, success) + require.Equal(t, prHandle.GetTaskStatus().GetRunningTaskStatusLen(), 0) + // assert capture * task still remained + require.Len(t, prHandle.GetTasks(), 1) +} diff --git a/domain/plan_replayer_test.go b/domain/plan_replayer_test.go index 7b44db9b8d239..5e0912b86e66c 100644 --- a/domain/plan_replayer_test.go +++ b/domain/plan_replayer_test.go @@ -21,6 +21,7 @@ import ( "testing" "time" + "github.com/pingcap/tidb/util/replayer" "github.com/stretchr/testify/require" ) @@ -28,15 +29,15 @@ func TestPlanReplayerGC(t *testing.T) { startTime := time.Now() time := startTime.UnixNano() fileName := fmt.Sprintf("replayer_single_xxxxxx_%v.zip", time) - err := os.MkdirAll(GetPlanReplayerDirName(), os.ModePerm) + err := os.MkdirAll(replayer.GetPlanReplayerDirName(), os.ModePerm) require.NoError(t, err) - path := filepath.Join(GetPlanReplayerDirName(), fileName) + path := filepath.Join(replayer.GetPlanReplayerDirName(), fileName) zf, err := os.Create(path) require.NoError(t, err) zf.Close() handler := &dumpFileGcChecker{ - paths: []string{GetPlanReplayerDirName()}, + paths: []string{replayer.GetPlanReplayerDirName()}, } handler.gcDumpFiles(0) diff --git a/domain/schema_validator.go b/domain/schema_validator.go index 6f028fdca2e70..20018e9c82b19 100644 --- a/domain/schema_validator.go +++ b/domain/schema_validator.go @@ -149,12 +149,13 @@ func (s *schemaValidator) Update(leaseGrantTS uint64, oldVer, currVer int64, cha actionTypes = change.ActionTypes } for idx, ac := range actionTypes { - // NOTE: ac is not an action type, it is (1 << action type). - if ac == 1<= 64, the value of left shift equals 0, and it will not impact amend txn + changedTblMap[tblID] |= 1 << item.relatedActions[i] affected = true } } @@ -198,22 +199,15 @@ func (s *schemaValidator) isRelatedTablesChanged(currVer int64, tableIDs []int64 } if len(changedTblMap) > 0 { tblIds := make([]int64, 0, len(changedTblMap)) - actionTypes := make([]uint64, 0, len(changedTblMap)) for id := range changedTblMap { tblIds = append(tblIds, id) } slices.Sort(tblIds) - for _, tblID := range tblIds { - actionTypes = append(actionTypes, changedTblMap[tblID]) - } - res.PhyTblIDS = tblIds - res.ActionTypes = actionTypes - res.Amendable = true logutil.BgLogger().Info("schema of tables in the transaction are changed", zap.Int64s("conflicted table IDs", tblIds), zap.Int64("transaction schema", currVer), zap.Int64s("schema versions that changed the tables", changedSchemaVers)) - return res, true + return true } - return res, false + return false } func (s *schemaValidator) findNewerDeltas(currVer int64) []deltaSchemaInfo { @@ -251,12 +245,8 @@ func (s *schemaValidator) Check(txnTS uint64, schemaVer int64, relatedPhysicalTa // When disabling MDL -> enabling MDL, the old transaction's needCheckSchema is true, we need to check it. // When enabling MDL -> disabling MDL, the old transaction's needCheckSchema is false, so still need to check it, and variable EnableMDL is false now. if needCheckSchema || !variable.EnableMDL.Load() { - relatedChanges, changed := s.isRelatedTablesChanged(schemaVer, relatedPhysicalTableIDs) + changed := s.isRelatedTablesChanged(schemaVer, relatedPhysicalTableIDs) if changed { - if relatedChanges.Amendable { - relatedChanges.LatestInfoSchema = s.latestInfoSchema - return &relatedChanges, ResultFail - } return nil, ResultFail } } diff --git a/domain/schema_validator_test.go b/domain/schema_validator_test.go index a18fbcb4a435a..ddcc57634ab60 100644 --- a/domain/schema_validator_test.go +++ b/domain/schema_validator_test.go @@ -61,7 +61,7 @@ func subTestSchemaValidatorGeneral(t *testing.T) { // Stop the validator, validator's items value is nil. validator.Stop() require.False(t, validator.IsStarted()) - _, isTablesChanged := validator.isRelatedTablesChanged(item.schemaVer, []int64{10}) + isTablesChanged := validator.isRelatedTablesChanged(item.schemaVer, []int64{10}) require.True(t, isTablesChanged) _, valid = validator.Check(item.leaseGrantTS, item.schemaVer, []int64{10}, true) require.Equal(t, ResultUnknown, valid) @@ -91,12 +91,12 @@ func subTestSchemaValidatorGeneral(t *testing.T) { validator.Update(ts, currVer, newItem.schemaVer, &transaction.RelatedSchemaChange{PhyTblIDS: []int64{1, 2, 3}, ActionTypes: []uint64{1, 2, 3}}) // Make sure the updated table IDs don't be covered with the same schema version. validator.Update(ts, newItem.schemaVer, newItem.schemaVer, nil) - _, isTablesChanged = validator.isRelatedTablesChanged(currVer, nil) + isTablesChanged = validator.isRelatedTablesChanged(currVer, nil) require.False(t, isTablesChanged) - _, isTablesChanged = validator.isRelatedTablesChanged(currVer, []int64{2}) + isTablesChanged = validator.isRelatedTablesChanged(currVer, []int64{2}) require.Truef(t, isTablesChanged, "currVer %d, newItem %v", currVer, newItem) // The current schema version is older than the oldest schema version. - _, isTablesChanged = validator.isRelatedTablesChanged(-1, nil) + isTablesChanged = validator.isRelatedTablesChanged(-1, nil) require.Truef(t, isTablesChanged, "currVer %d, newItem %v", currVer, newItem) // All schema versions is expired. @@ -214,10 +214,8 @@ func subTestEnqueueActionType(t *testing.T) { // Check the flag set by schema diff, note tableID = 3 has been set flag 0x3 in schema version 9, and flag 0x4 // in schema version 10, so the resActions for tableID = 3 should be 0x3 & 0x4 = 0x7. - relatedChanges, isTablesChanged := validator.isRelatedTablesChanged(5, []int64{1, 2, 3, 4}) + isTablesChanged := validator.isRelatedTablesChanged(5, []int64{1, 2, 3, 4}) require.True(t, isTablesChanged) - require.Equal(t, []int64{1, 2, 3, 4}, relatedChanges.PhyTblIDS) - require.Equal(t, []uint64{15, 2, 7, 4}, relatedChanges.ActionTypes) } type leaseGrantItem struct { diff --git a/domain/sysvar_cache.go b/domain/sysvar_cache.go index 370260a67c02a..1611231d42ad5 100644 --- a/domain/sysvar_cache.go +++ b/domain/sysvar_cache.go @@ -17,13 +17,13 @@ package domain import ( "context" "fmt" - "sync" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/sqlexec" + "github.com/pingcap/tidb/util/syncutil" "go.uber.org/zap" "golang.org/x/exp/maps" ) @@ -36,10 +36,10 @@ import ( // sysVarCache represents the cache of system variables broken up into session and global scope. type sysVarCache struct { - sync.RWMutex // protects global and session maps - global map[string]string - session map[string]string - rebuildLock sync.Mutex // protects concurrent rebuild + syncutil.RWMutex // protects global and session maps + global map[string]string + session map[string]string + rebuildLock syncutil.Mutex // protects concurrent rebuild } func (do *Domain) rebuildSysVarCacheIfNeeded() (err error) { diff --git a/domain/test_helper.go b/domain/test_helper.go index e63e8dee7389b..e8c106c29d23b 100644 --- a/domain/test_helper.go +++ b/domain/test_helper.go @@ -26,7 +26,7 @@ import ( // MockInfoCacheAndLoadInfoSchema only used in unit tests. func (do *Domain) MockInfoCacheAndLoadInfoSchema(is infoschema.InfoSchema) { - do.infoCache = infoschema.NewCache(16) + do.infoCache.Reset(16) do.infoCache.Insert(is, 0) } diff --git a/dumpling/export/BUILD.bazel b/dumpling/export/BUILD.bazel index 08cc7fe2e664e..f47a49249adee 100644 --- a/dumpling/export/BUILD.bazel +++ b/dumpling/export/BUILD.bazel @@ -103,9 +103,11 @@ go_test( "//util/filter", "//util/promutil", "//util/table-filter", + "@com_github_coreos_go_semver//semver", "@com_github_data_dog_go_sqlmock//:go-sqlmock", "@com_github_go_sql_driver_mysql//:mysql", "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_failpoint//:failpoint", "@com_github_prometheus_client_golang//prometheus/collectors", "@com_github_stretchr_testify//require", "@org_golang_x_sync//errgroup", diff --git a/dumpling/export/config.go b/dumpling/export/config.go index 57504e4e20882..36af37b30e924 100644 --- a/dumpling/export/config.go +++ b/dumpling/export/config.go @@ -4,6 +4,7 @@ package export import ( "context" + "crypto/tls" "encoding/json" "fmt" "net" @@ -15,7 +16,6 @@ import ( "github.com/coreos/go-semver/semver" "github.com/docker/go-units" "github.com/go-sql-driver/mysql" - "github.com/google/uuid" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/br/pkg/storage" @@ -25,6 +25,7 @@ import ( filter "github.com/pingcap/tidb/util/table-filter" "github.com/prometheus/client_golang/prometheus" "github.com/spf13/pflag" + "go.uber.org/atomic" "go.uber.org/zap" ) @@ -103,7 +104,7 @@ type Config struct { User string Password string `json:"-"` Security struct { - DriveTLSName string `json:"-"` + TLS *tls.Config `json:"-"` CAPath string CertPath string KeyPath string @@ -144,6 +145,9 @@ type Config struct { PromFactory promutil.Factory `json:"-"` PromRegistry promutil.Registry `json:"-"` ExtStorage storage.ExternalStorage `json:"-"` + + IOTotalBytes *atomic.Uint64 + Net string } // ServerInfoUnknown is the unknown database type to dumpling @@ -212,6 +216,9 @@ func (conf *Config) GetDriverConfig(db string) *mysql.Config { driverCfg.User = conf.User driverCfg.Passwd = conf.Password driverCfg.Net = "tcp" + if conf.Net != "" { + driverCfg.Net = conf.Net + } driverCfg.Addr = hostPort driverCfg.DBName = db driverCfg.Collation = "utf8mb4_general_ci" @@ -219,8 +226,17 @@ func (conf *Config) GetDriverConfig(db string) *mysql.Config { driverCfg.WriteTimeout = 30 * time.Second driverCfg.InterpolateParams = true driverCfg.MaxAllowedPacket = 0 - if conf.Security.DriveTLSName != "" { - driverCfg.TLSConfig = conf.Security.DriveTLSName + if conf.Security.TLS != nil { + driverCfg.TLS = conf.Security.TLS + } else { + // Use TLS first. + driverCfg.AllowFallbackToPlaintext = true + /* #nosec G402 */ + driverCfg.TLS = &tls.Config{ + InsecureSkipVerify: true, + MinVersion: tls.VersionTLS10, + NextProtos: []string{"h2", "http/1.1"}, // specify `h2` to let Go use HTTP/2. + } } if conf.AllowCleartextPasswords { driverCfg.AllowCleartextPasswords = true @@ -653,7 +669,7 @@ func adjustConfig(conf *Config, fns ...func(*Config) error) error { return nil } -func registerTLSConfig(conf *Config) error { +func buildTLSConfig(conf *Config) error { tlsConfig, err := util.NewTLSConfig( util.WithCAPath(conf.Security.CAPath), util.WithCertAndKeyPath(conf.Security.CertPath, conf.Security.KeyPath), @@ -663,14 +679,8 @@ func registerTLSConfig(conf *Config) error { if err != nil { return errors.Trace(err) } - - if tlsConfig == nil { - return nil - } - - conf.Security.DriveTLSName = "dumpling" + uuid.NewString() - err = mysql.RegisterTLSConfig(conf.Security.DriveTLSName, tlsConfig) - return errors.Trace(err) + conf.Security.TLS = tlsConfig + return nil } func validateSpecifiedSQL(conf *Config) error { diff --git a/dumpling/export/dump.go b/dumpling/export/dump.go index 7e5a81e0f3ce1..82e093a213b6b 100644 --- a/dumpling/export/dump.go +++ b/dumpling/export/dump.go @@ -10,13 +10,16 @@ import ( "encoding/hex" "fmt" "math/big" + "net" "strconv" "strings" "sync/atomic" "time" + "github.com/coreos/go-semver/semver" // import mysql driver "github.com/go-sql-driver/mysql" + "github.com/google/uuid" "github.com/pingcap/errors" "github.com/pingcap/failpoint" pclog "github.com/pingcap/log" @@ -31,8 +34,10 @@ import ( "github.com/pingcap/tidb/parser/format" "github.com/pingcap/tidb/store/helper" "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/codec" pd "github.com/tikv/pd/client" + gatomic "go.uber.org/atomic" "go.uber.org/zap" "golang.org/x/exp/slices" "golang.org/x/sync/errgroup" @@ -42,6 +47,10 @@ var openDBFunc = openDB var errEmptyHandleVals = errors.New("empty handleVals for TiDB table") +// After TiDB v6.2.0 we always enable tidb_enable_paging by default. +// see https://docs.pingcap.com/zh/tidb/dev/system-variables#tidb_enable_paging-%E4%BB%8E-v540-%E7%89%88%E6%9C%AC%E5%BC%80%E5%A7%8B%E5%BC%95%E5%85%A5 +var enablePagingVersion = semver.New("6.2.0") + // Dumper is the dump progress structure type Dumper struct { tctx *tcontext.Context @@ -95,12 +104,23 @@ func NewDumper(ctx context.Context, conf *Config) (*Dumper, error) { }() err = adjustConfig(conf, - registerTLSConfig, + buildTLSConfig, validateSpecifiedSQL, adjustFileFormat) if err != nil { return nil, err } + failpoint.Inject("SetIOTotalBytes", func(_ failpoint.Value) { + d.conf.IOTotalBytes = gatomic.NewUint64(0) + d.conf.Net = uuid.New().String() + go func() { + for { + time.Sleep(10 * time.Millisecond) + d.tctx.L().Logger.Info("IOTotalBytes", zap.Uint64("IOTotalBytes", d.conf.IOTotalBytes.Load())) + } + }() + }) + err = runSteps(d, initLogger, createExternalStore, @@ -1199,9 +1219,7 @@ func dumpTableMeta(tctx *tcontext.Context, conf *Config, conn *BaseConn, db stri selectedField: selectField, selectedLen: selectLen, hasImplicitRowID: hasImplicitRowID, - specCmts: []string{ - "/*!40101 SET NAMES binary*/;", - }, + specCmts: getSpecialComments(conf.ServerInfo.ServerType), } if conf.NoSchemas { @@ -1264,9 +1282,6 @@ func (d *Dumper) Close() error { if d.dbHandle != nil { return d.dbHandle.Close() } - if d.conf.Security.DriveTLSName != "" { - mysql.DeregisterTLSConfig(d.conf.Security.DriveTLSName) - } return nil } @@ -1333,6 +1348,22 @@ func startHTTPService(d *Dumper) error { // openSQLDB is an initialization step of Dumper. func openSQLDB(d *Dumper) error { + if d.conf.IOTotalBytes != nil { + mysql.RegisterDialContext(d.conf.Net, func(ctx context.Context, addr string) (net.Conn, error) { + dial := &net.Dialer{} + conn, err := dial.DialContext(ctx, "tcp", addr) + if err != nil { + return nil, err + } + tcpConn := conn.(*net.TCPConn) + // try https://github.com/go-sql-driver/mysql/blob/bcc459a906419e2890a50fc2c99ea6dd927a88f2/connector.go#L56-L64 + err = tcpConn.SetKeepAlive(true) + if err != nil { + d.tctx.L().Logger.Warn("fail to keep alive", zap.Error(err)) + } + return util.NewTCPConnWithIOCounter(tcpConn, d.conf.IOTotalBytes), nil + }) + } conf := d.conf c, err := mysql.NewConnector(conf.GetDriverConfig("")) if err != nil { @@ -1511,6 +1542,19 @@ func updateServiceSafePoint(tctx *tcontext.Context, pdClient pd.Client, ttl int6 } } +// setDefaultSessionParams is a step to set default params for session params. +func setDefaultSessionParams(si version.ServerInfo, sessionParams map[string]interface{}) { + defaultSessionParams := map[string]interface{}{} + if si.ServerType == version.ServerTypeTiDB && si.HasTiKV && si.ServerVersion.Compare(*enablePagingVersion) >= 0 { + defaultSessionParams["tidb_enable_paging"] = "ON" + } + for k, v := range defaultSessionParams { + if _, ok := sessionParams[k]; !ok { + sessionParams[k] = v + } + } +} + // setSessionParam is an initialization step of Dumper. func setSessionParam(d *Dumper) error { conf, pool := d.conf, d.dbHandle @@ -1531,7 +1575,7 @@ func setSessionParam(d *Dumper) error { d.L().Info("cannot check whether TiDB has TiKV, will apply tidb_snapshot by default. This won't affect dump process", log.ShortError(err)) } if conf.ServerInfo.HasTiKV { - sessionParam["tidb_snapshot"] = snapshot + sessionParam[snapshotVar] = snapshot } } } diff --git a/dumpling/export/dump_test.go b/dumpling/export/dump_test.go index c9a40bba28d6f..f77171b1cfa8c 100644 --- a/dumpling/export/dump_test.go +++ b/dumpling/export/dump_test.go @@ -9,7 +9,10 @@ import ( "time" "github.com/DATA-DOG/go-sqlmock" + "github.com/coreos/go-semver/semver" + "github.com/go-sql-driver/mysql" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/tidb/br/pkg/version" tcontext "github.com/pingcap/tidb/dumpling/context" "github.com/pingcap/tidb/parser" @@ -224,3 +227,128 @@ func TestUnregisterMetrics(t *testing.T) { // should not panic require.Error(t, err) } + +func TestSetDefaultSessionParams(t *testing.T) { + testCases := []struct { + si version.ServerInfo + sessionParams map[string]interface{} + expectedParams map[string]interface{} + }{ + { + si: version.ServerInfo{ + ServerType: version.ServerTypeTiDB, + HasTiKV: true, + ServerVersion: semver.New("6.1.0"), + }, + sessionParams: map[string]interface{}{ + "tidb_snapshot": "2020-01-01 00:00:00", + }, + expectedParams: map[string]interface{}{ + "tidb_snapshot": "2020-01-01 00:00:00", + }, + }, + { + si: version.ServerInfo{ + ServerType: version.ServerTypeTiDB, + HasTiKV: true, + ServerVersion: semver.New("6.2.0"), + }, + sessionParams: map[string]interface{}{ + "tidb_snapshot": "2020-01-01 00:00:00", + }, + expectedParams: map[string]interface{}{ + "tidb_enable_paging": "ON", + "tidb_snapshot": "2020-01-01 00:00:00", + }, + }, + { + si: version.ServerInfo{ + ServerType: version.ServerTypeTiDB, + HasTiKV: true, + ServerVersion: semver.New("6.2.0"), + }, + sessionParams: map[string]interface{}{ + "tidb_enable_paging": "OFF", + "tidb_snapshot": "2020-01-01 00:00:00", + }, + expectedParams: map[string]interface{}{ + "tidb_enable_paging": "OFF", + "tidb_snapshot": "2020-01-01 00:00:00", + }, + }, + { + si: version.ServerInfo{ + ServerType: version.ServerTypeMySQL, + ServerVersion: semver.New("8.0.32"), + }, + sessionParams: map[string]interface{}{}, + expectedParams: map[string]interface{}{}, + }, + } + + for _, testCase := range testCases { + setDefaultSessionParams(testCase.si, testCase.sessionParams) + require.Equal(t, testCase.expectedParams, testCase.sessionParams) + } +} + +func TestSetSessionParams(t *testing.T) { + // case 1: fail to set tidb_snapshot, should return error with hint + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + mock.ExpectQuery("SELECT @@tidb_config"). + WillReturnError(errors.New("mock error")) + mock.ExpectQuery("SELECT COUNT\\(1\\) as c FROM MYSQL.TiDB WHERE VARIABLE_NAME='tikv_gc_safe_point'"). + WillReturnError(errors.New("mock error")) + tikvErr := &mysql.MySQLError{ + Number: 1105, + Message: "can not get 'tikv_gc_safe_point'", + } + mock.ExpectExec("SET SESSION tidb_snapshot"). + WillReturnError(tikvErr) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/dumpling/export/SkipResetDB", "return(true)")) + defer failpoint.Disable("github.com/pingcap/tidb/dumpling/export/SkipResetDB=return(true)") + + tctx, cancel := tcontext.Background().WithLogger(appLogger).WithCancel() + defer cancel() + + conf := DefaultConfig() + conf.ServerInfo = version.ServerInfo{ + ServerType: version.ServerTypeTiDB, + HasTiKV: false, + } + conf.Snapshot = "439153276059648000" + conf.Consistency = ConsistencyTypeSnapshot + d := &Dumper{ + tctx: tctx, + conf: conf, + cancelCtx: cancel, + dbHandle: db, + } + err = setSessionParam(d) + require.ErrorContains(t, err, "consistency=none") + + // case 2: fail to set other + conf.ServerInfo = version.ServerInfo{ + ServerType: version.ServerTypeMySQL, + HasTiKV: false, + } + conf.Snapshot = "" + conf.Consistency = ConsistencyTypeFlush + conf.SessionParams = map[string]interface{}{ + "mock": "UTC", + } + d.dbHandle = db + mock.ExpectExec("SET SESSION mock"). + WillReturnError(errors.New("Unknown system variable mock")) + mock.ExpectClose() + mock.ExpectClose() + + err = setSessionParam(d) + require.NoError(t, err) +} diff --git a/dumpling/export/ir.go b/dumpling/export/ir.go index 4b98019605e9c..aa1b2070591ab 100644 --- a/dumpling/export/ir.go +++ b/dumpling/export/ir.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/pingcap/errors" + "github.com/pingcap/tidb/br/pkg/version" tcontext "github.com/pingcap/tidb/dumpling/context" ) @@ -85,7 +86,7 @@ type MetaIR interface { MetaSQL() string } -func setTableMetaFromRows(rows *sql.Rows) (TableMeta, error) { +func setTableMetaFromRows(serverType version.ServerType, rows *sql.Rows) (TableMeta, error) { tps, err := rows.ColumnTypes() if err != nil { return nil, errors.Trace(err) @@ -101,6 +102,6 @@ func setTableMetaFromRows(rows *sql.Rows) (TableMeta, error) { colTypes: tps, selectedField: strings.Join(nms, ","), selectedLen: len(nms), - specCmts: []string{"/*!40101 SET NAMES binary*/;"}, + specCmts: getSpecialComments(serverType), }, nil } diff --git a/dumpling/export/ir_impl.go b/dumpling/export/ir_impl.go index bca821f612623..d1efa75db3365 100644 --- a/dumpling/export/ir_impl.go +++ b/dumpling/export/ir_impl.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/pingcap/errors" + "github.com/pingcap/tidb/br/pkg/version" tcontext "github.com/pingcap/tidb/dumpling/context" "go.uber.org/zap" ) @@ -370,3 +371,22 @@ func (td *multiQueriesChunk) Close() error { func (*multiQueriesChunk) RawRows() *sql.Rows { return nil } + +var serverSpecialComments = map[version.ServerType][]string{ + version.ServerTypeMySQL: { + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;", + "/*!40101 SET NAMES binary*/;", + }, + version.ServerTypeTiDB: { + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;", + "/*!40101 SET NAMES binary*/;", + }, + version.ServerTypeMariaDB: { + "/*!40101 SET NAMES binary*/;", + "SET FOREIGN_KEY_CHECKS=0;", + }, +} + +func getSpecialComments(serverType version.ServerType) []string { + return serverSpecialComments[serverType] +} diff --git a/dumpling/export/sql.go b/dumpling/export/sql.go index 837bec568b9a7..60d14ac49e14c 100644 --- a/dumpling/export/sql.go +++ b/dumpling/export/sql.go @@ -29,6 +29,7 @@ import ( const ( orderByTiDBRowID = "ORDER BY `_tidb_rowid`" + snapshotVar = "tidb_snapshot" ) type listTableType int @@ -851,7 +852,9 @@ func resetDBWithSessionParams(tctx *tcontext.Context, db *sql.DB, cfg *mysql.Con s := fmt.Sprintf("SET SESSION %s = ?", k) _, err := db.ExecContext(tctx, s, pv) if err != nil { - if isUnknownSystemVariableErr(err) { + if k == snapshotVar { + err = errors.Annotate(err, "fail to set snapshot for tidb, please set --consistency=none/--consistency=lock or fix snapshot problem") + } else if isUnknownSystemVariableErr(err) { tctx.L().Info("session variable is not supported by db", zap.String("variable", k), zap.Reflect("value", v)) continue } @@ -876,6 +879,9 @@ func resetDBWithSessionParams(tctx *tcontext.Context, db *sql.DB, cfg *mysql.Con } cfg.Params[k] = s } + failpoint.Inject("SkipResetDB", func(_ failpoint.Value) { + failpoint.Return(db, nil) + }) db.Close() c, err := mysql.NewConnector(cfg) diff --git a/dumpling/export/sql_test.go b/dumpling/export/sql_test.go index 04615637be8f1..5ae4c7278efa4 100644 --- a/dumpling/export/sql_test.go +++ b/dumpling/export/sql_test.go @@ -1308,6 +1308,8 @@ func buildMockNewRows(mock sqlmock.Sqlmock, columns []string, driverValues [][]d } func readRegionCsvDriverValues(t *testing.T) [][]driver.Value { + t.Helper() + csvFilename := "region_results.csv" file, err := os.Open(csvFilename) require.NoError(t, err) diff --git a/dumpling/export/status_test.go b/dumpling/export/status_test.go index 14c08c7c36ba7..7c340b06dcf83 100644 --- a/dumpling/export/status_test.go +++ b/dumpling/export/status_test.go @@ -48,7 +48,7 @@ func TestSpeedRecorder(t *testing.T) { for _, tc := range testCases { time.Sleep(time.Duration(tc.spentTime) * time.Second) recentSpeed := speedRecorder.GetSpeed(tc.finished) - if math.Abs(tc.expected-recentSpeed) > 1 { + if math.Abs(tc.expected-recentSpeed)/tc.expected > 0.1 { require.FailNow(t, "speed is unexpected", "expected: %5.2f, recent: %5.2f", tc.expected, recentSpeed) } } diff --git a/dumpling/export/writer.go b/dumpling/export/writer.go index e64c067c807b7..ae037041596ae 100644 --- a/dumpling/export/writer.go +++ b/dumpling/export/writer.go @@ -133,7 +133,7 @@ func (w *Writer) WritePolicyMeta(policy, createSQL string) error { if err != nil { return err } - return writeMetaToFile(tctx, "placement-policy", createSQL, w.extStorage, fileName+".sql", conf.CompressType) + return w.writeMetaToFile(tctx, "placement-policy", createSQL, fileName+".sql") } // WriteDatabaseMeta writes database meta to a file @@ -143,7 +143,7 @@ func (w *Writer) WriteDatabaseMeta(db, createSQL string) error { if err != nil { return err } - return writeMetaToFile(tctx, db, createSQL, w.extStorage, fileName+".sql", conf.CompressType) + return w.writeMetaToFile(tctx, db, createSQL, fileName+".sql") } // WriteTableMeta writes table meta to a file @@ -153,7 +153,7 @@ func (w *Writer) WriteTableMeta(db, table, createSQL string) error { if err != nil { return err } - return writeMetaToFile(tctx, db, createSQL, w.extStorage, fileName+".sql", conf.CompressType) + return w.writeMetaToFile(tctx, db, createSQL, fileName+".sql") } // WriteViewMeta writes view meta to a file @@ -167,11 +167,11 @@ func (w *Writer) WriteViewMeta(db, view, createTableSQL, createViewSQL string) e if err != nil { return err } - err = writeMetaToFile(tctx, db, createTableSQL, w.extStorage, fileNameTable+".sql", conf.CompressType) + err = w.writeMetaToFile(tctx, db, createTableSQL, fileNameTable+".sql") if err != nil { return err } - return writeMetaToFile(tctx, db, createViewSQL, w.extStorage, fileNameView+".sql", conf.CompressType) + return w.writeMetaToFile(tctx, db, createViewSQL, fileNameView+".sql") } // WriteSequenceMeta writes sequence meta to a file @@ -181,7 +181,7 @@ func (w *Writer) WriteSequenceMeta(db, sequence, createSQL string) error { if err != nil { return err } - return writeMetaToFile(tctx, db, createSQL, w.extStorage, fileName+".sql", conf.CompressType) + return w.writeMetaToFile(tctx, db, createSQL, fileName+".sql") } // WriteTableData writes table data to a file with retry @@ -213,10 +213,14 @@ func (w *Writer) WriteTableData(meta TableMeta, ir TableDataIR, currentChunk int return } if conf.SQL != "" { - meta, err = setTableMetaFromRows(ir.RawRows()) + rows := ir.RawRows() + meta, err = setTableMetaFromRows(w.conf.ServerInfo.ServerType, rows) if err != nil { return err } + if err = rows.Err(); err != nil { + return errors.Trace(err) + } } defer func() { _ = ir.Close() @@ -270,19 +274,17 @@ func (w *Writer) tryToWriteTableData(tctx *tcontext.Context, meta TableMeta, ir return nil } -func writeMetaToFile(tctx *tcontext.Context, target, metaSQL string, s storage.ExternalStorage, path string, compressType storage.CompressType) error { - fileWriter, tearDown, err := buildFileWriter(tctx, s, path, compressType) +func (w *Writer) writeMetaToFile(tctx *tcontext.Context, target, metaSQL string, path string) error { + fileWriter, tearDown, err := buildFileWriter(tctx, w.extStorage, path, w.conf.CompressType) if err != nil { return errors.Trace(err) } defer tearDown(tctx) return WriteMeta(tctx, &metaData{ - target: target, - metaSQL: metaSQL, - specCmts: []string{ - "/*!40101 SET NAMES binary*/;", - }, + target: target, + metaSQL: metaSQL, + specCmts: getSpecialComments(w.conf.ServerInfo.ServerType), }, fileWriter) } diff --git a/dumpling/export/writer_test.go b/dumpling/export/writer_test.go index b5f54f3debcb9..4f07d25b7b224 100644 --- a/dumpling/export/writer_test.go +++ b/dumpling/export/writer_test.go @@ -5,13 +5,13 @@ package export import ( "context" "database/sql/driver" - "io/ioutil" "os" "path" "sync" "testing" "github.com/DATA-DOG/go-sqlmock" + "github.com/pingcap/tidb/br/pkg/version" tcontext "github.com/pingcap/tidb/dumpling/context" "github.com/pingcap/tidb/util/promutil" "github.com/stretchr/testify/require" @@ -31,9 +31,9 @@ func TestWriteDatabaseMeta(t *testing.T) { _, err = os.Stat(p) require.NoError(t, err) - bytes, err := ioutil.ReadFile(p) + bytes, err := os.ReadFile(p) require.NoError(t, err) - require.Equal(t, "/*!40101 SET NAMES binary*/;\nCREATE DATABASE `test`;\n", string(bytes)) + require.Equal(t, "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;\n/*!40101 SET NAMES binary*/;\nCREATE DATABASE `test`;\n", string(bytes)) } func TestWritePolicyMeta(t *testing.T) { @@ -50,9 +50,9 @@ func TestWritePolicyMeta(t *testing.T) { _, err = os.Stat(p) require.NoError(t, err) - bytes, err := ioutil.ReadFile(p) + bytes, err := os.ReadFile(p) require.NoError(t, err) - require.Equal(t, "/*!40101 SET NAMES binary*/;\ncreate placement policy `y` followers=2;\n", string(bytes)) + require.Equal(t, "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;\n/*!40101 SET NAMES binary*/;\ncreate placement policy `y` followers=2;\n", string(bytes)) } func TestWriteTableMeta(t *testing.T) { @@ -68,9 +68,9 @@ func TestWriteTableMeta(t *testing.T) { p := path.Join(dir, "test.t-schema.sql") _, err = os.Stat(p) require.NoError(t, err) - bytes, err := ioutil.ReadFile(p) + bytes, err := os.ReadFile(p) require.NoError(t, err) - require.Equal(t, "/*!40101 SET NAMES binary*/;\nCREATE TABLE t (a INT);\n", string(bytes)) + require.Equal(t, "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;\n/*!40101 SET NAMES binary*/;\nCREATE TABLE t (a INT);\n", string(bytes)) } func TestWriteViewMeta(t *testing.T) { @@ -80,7 +80,7 @@ func TestWriteViewMeta(t *testing.T) { writer := createTestWriter(config, t) - specCmt := "/*!40101 SET NAMES binary*/;\n" + specCmt := "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;\n/*!40101 SET NAMES binary*/;\n" createTableSQL := "CREATE TABLE `v`(\n`a` int\n)ENGINE=MyISAM;\n" createViewSQL := "DROP TABLE IF EXISTS `v`;\nDROP VIEW IF EXISTS `v`;\nSET @PREV_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT;\nSET @PREV_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS;\nSET @PREV_COLLATION_CONNECTION=@@COLLATION_CONNECTION;\nSET character_set_client = utf8;\nSET character_set_results = utf8;\nSET collation_connection = utf8_general_ci;\nCREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` (`a`) AS SELECT `t`.`a` AS `a` FROM `test`.`t`;\nSET character_set_client = @PREV_CHARACTER_SET_CLIENT;\nSET character_set_results = @PREV_CHARACTER_SET_RESULTS;\nSET collation_connection = @PREV_COLLATION_CONNECTION;\n" err := writer.WriteViewMeta("test", "v", createTableSQL, createViewSQL) @@ -89,14 +89,14 @@ func TestWriteViewMeta(t *testing.T) { p := path.Join(dir, "test.v-schema.sql") _, err = os.Stat(p) require.NoError(t, err) - bytes, err := ioutil.ReadFile(p) + bytes, err := os.ReadFile(p) require.NoError(t, err) require.Equal(t, specCmt+createTableSQL, string(bytes)) p = path.Join(dir, "test.v-schema-view.sql") _, err = os.Stat(p) require.NoError(t, err) - bytes, err = ioutil.ReadFile(p) + bytes, err = os.ReadFile(p) require.NoError(t, err) require.Equal(t, specCmt+createViewSQL, string(bytes)) } @@ -126,7 +126,7 @@ func TestWriteTableData(t *testing.T) { p := path.Join(dir, "test.employee.000000000.sql") _, err = os.Stat(p) require.NoError(t, err) - bytes, err := ioutil.ReadFile(p) + bytes, err := os.ReadFile(p) require.NoError(t, err) expected := "/*!40101 SET NAMES binary*/;\n" + @@ -182,7 +182,7 @@ func TestWriteTableDataWithFileSize(t *testing.T) { p = path.Join(dir, p) _, err := os.Stat(p) require.NoError(t, err) - bytes, err := ioutil.ReadFile(p) + bytes, err := os.ReadFile(p) require.NoError(t, err) require.Equal(t, expected, string(bytes)) } @@ -232,7 +232,7 @@ func TestWriteTableDataWithFileSizeAndRows(t *testing.T) { p = path.Join(dir, p) _, err = os.Stat(p) require.NoError(t, err) - bytes, err := ioutil.ReadFile(p) + bytes, err := os.ReadFile(p) require.NoError(t, err) require.Equal(t, expected, string(bytes)) } @@ -281,7 +281,7 @@ func TestWriteTableDataWithStatementSize(t *testing.T) { p = path.Join(config.OutputDirPath, p) _, err = os.Stat(p) require.NoError(t, err) - bytes, err1 := ioutil.ReadFile(p) + bytes, err1 := os.ReadFile(p) require.NoError(t, err1) require.Equal(t, expected, string(bytes)) } @@ -297,7 +297,7 @@ func TestWriteTableDataWithStatementSize(t *testing.T) { require.NoError(t, err) err = os.RemoveAll(config.OutputDirPath) require.NoError(t, err) - config.OutputDirPath, err = ioutil.TempDir("", "dumpling") + config.OutputDirPath, err = os.MkdirTemp("", "dumpling") writer = createTestWriter(config, t) @@ -322,7 +322,7 @@ func TestWriteTableDataWithStatementSize(t *testing.T) { p = path.Join(config.OutputDirPath, p) _, err = os.Stat(p) require.NoError(t, err) - bytes, err := ioutil.ReadFile(p) + bytes, err := os.ReadFile(p) require.NoError(t, err) require.Equal(t, expected, string(bytes)) } @@ -331,6 +331,9 @@ func TestWriteTableDataWithStatementSize(t *testing.T) { var mu sync.Mutex func createTestWriter(conf *Config, t *testing.T) *Writer { + t.Helper() + conf.ServerInfo.ServerType = version.ServerTypeMySQL + mu.Lock() extStore, err := conf.createExternalStorage(context.Background()) mu.Unlock() diff --git a/dumpling/tests/basic/run.sh b/dumpling/tests/basic/run.sh index 11a738805275b..5b549cf857e79 100644 --- a/dumpling/tests/basic/run.sh +++ b/dumpling/tests/basic/run.sh @@ -114,8 +114,8 @@ echo "expected panic 0, actual ${actual}" [ "$actual" = 0 ] # check stdout, should contain mysql error log -actual=$(grep -w "Error 1064: You have an error in your SQL syntax" ${DUMPLING_OUTPUT_DIR}/dumpling.log|wc -l) -echo "expect contain Error 1064, actual ${actual}" +actual=$(grep -w "You have an error in your SQL syntax" ${DUMPLING_OUTPUT_DIR}/dumpling.log|wc -l) +echo "expect contain error in SQL syntax, actual ${actual}" [ "$actual" -ge 1 ] # Test for consistency lock with empty database. @@ -128,3 +128,14 @@ run_dumpling --consistency lock -B "$DB_NAME" -L ${DUMPLING_OUTPUT_DIR}/dumpling cnt=$(grep -w "$DB_NAME" ${DUMPLING_OUTPUT_DIR}/${DB_NAME}-schema-create.sql|wc -l) echo "records count is ${cnt}" [ "$cnt" = 1 ] + +# Test for recording network usage +run_sql "drop database if exists test_db;" +run_sql "create database test_db;" +run_sql "create table test_db.test_table (a int primary key);" +run_sql "insert into test_db.test_table values (1),(2),(3),(4),(5),(6),(7),(8);" + +export GO_FAILPOINTS="github.com/pingcap/tidb/dumpling/export/SetIOTotalBytes=return(1)" +run_dumpling -B "test_db" -L ${DUMPLING_OUTPUT_DIR}/dumpling.log +cnt=$(grep "IOTotalBytes=" ${DUMPLING_OUTPUT_DIR}/dumpling.log | grep -v "IOTotalBytes=0" | wc -l) +[ "$cnt" -ge 1 ] \ No newline at end of file diff --git a/dumpling/tests/e2e/run.sh b/dumpling/tests/e2e/run.sh index f5da32acc33e0..73b580ca594d9 100644 --- a/dumpling/tests/e2e/run.sh +++ b/dumpling/tests/e2e/run.sh @@ -37,4 +37,24 @@ run_lightning $cur/conf/lightning.toml # check mysql and tidb data check_sync_diff $cur/conf/diff_config.toml +# test e2e with compress option again + +# drop database on tidb +export DUMPLING_TEST_PORT=4000 +run_sql "drop database if exists $DB_NAME;" + +export DUMPLING_TEST_PORT=3306 + +# dumping +export DUMPLING_TEST_DATABASE=$DB_NAME +rm -rf $DUMPLING_OUTPUT_DIR +run_dumpling --compress "snappy" + +cat "$cur/conf/lightning.toml" +# use lightning import data to tidb +run_lightning $cur/conf/lightning.toml + +# check mysql and tidb data +check_sync_diff $cur/conf/diff_config.toml + diff --git a/dumpling/tests/e2e_csv/run.sh b/dumpling/tests/e2e_csv/run.sh index d80e321d9294a..9c5afaca469d7 100644 --- a/dumpling/tests/e2e_csv/run.sh +++ b/dumpling/tests/e2e_csv/run.sh @@ -24,6 +24,7 @@ run_sql_file "$DUMPLING_TEST_DIR/data/e2e_csv.t.sql" run() { echo "*** running subtest case ***" + echo "compress is $compress" echo "escape_backslash is $escape_backslash" echo "csv_delimiter is $csv_delimiter" echo "csv_separator is $csv_separator" @@ -36,7 +37,11 @@ run() { # dumping export DUMPLING_TEST_PORT=3306 export DUMPLING_TEST_DATABASE=$DB_NAME - run_dumpling --filetype="csv" --escape-backslash=$escape_backslash --csv-delimiter="$csv_delimiter" --csv-separator="$csv_separator" + rm -rf "$DUMPLING_OUTPUT_DIR" + if [ $compress = "space" ]; then + compress="" + fi + run_dumpling --filetype="csv" --escape-backslash=$escape_backslash --csv-delimiter="$csv_delimiter" --csv-separator="$csv_separator" --compress="$compress" # construct lightning configuration mkdir -p $DUMPLING_TEST_DIR/conf @@ -67,18 +72,22 @@ run() { escape_backslash_arr="true false" csv_delimiter_arr="\" '" csv_separator_arr=', a aa |*|' +compress_arr='space gzip snappy zstd' -for escape_backslash in $escape_backslash_arr +for compress in $compress_arr do - for csv_separator in $csv_separator_arr + for escape_backslash in $escape_backslash_arr do - for csv_delimiter in $csv_delimiter_arr + for csv_separator in $csv_separator_arr do - run + for csv_delimiter in $csv_delimiter_arr + do + run + done + if [ "$escape_backslash" = "true" ]; then + csv_delimiter="" + run + fi done - if [ "$escape_backslash" = "true" ]; then - csv_delimiter="" - run - fi done done diff --git a/dumpling/tests/e2e_foreign_key/conf/diff_config.toml b/dumpling/tests/e2e_foreign_key/conf/diff_config.toml new file mode 100644 index 0000000000000..634c8416891eb --- /dev/null +++ b/dumpling/tests/e2e_foreign_key/conf/diff_config.toml @@ -0,0 +1,29 @@ +# diff Configuration. + +check-thread-count = 4 + +export-fix-sql = true + +check-struct-only = false + +[task] + output-dir = "./output" + + source-instances = ["mysql1"] + + target-instance = "tidb0" + + target-check-tables = ["e2e_foreign_key.parent", "e2e_foreign_key.child"] + +[data-sources] +[data-sources.mysql1] +host = "127.0.0.1" +port = 3306 +user = "root" +password = "" + +[data-sources.tidb0] +host = "127.0.0.1" +port = 4000 +user = "root" +password = "" diff --git a/dumpling/tests/e2e_foreign_key/conf/lightning.toml b/dumpling/tests/e2e_foreign_key/conf/lightning.toml new file mode 100644 index 0000000000000..e96fdaaf0daeb --- /dev/null +++ b/dumpling/tests/e2e_foreign_key/conf/lightning.toml @@ -0,0 +1,20 @@ +### tidb-lightning config + +[lightning] +server-mode = false +level = "error" +check-requirements = false + +[tikv-importer] +backend = "tidb" +on-duplicate = "error" + +[mydumper] +data-source-dir = "/tmp/dumpling_test_result/sql_res.e2e_foreign_key" + +[tidb] +host = "127.0.0.1" +port = 4000 +user = "root" +password = "" +status-port = 10080 diff --git a/dumpling/tests/e2e_foreign_key/data/e2e_foreign_key.sql b/dumpling/tests/e2e_foreign_key/data/e2e_foreign_key.sql new file mode 100644 index 0000000000000..4b8ff0b1df203 --- /dev/null +++ b/dumpling/tests/e2e_foreign_key/data/e2e_foreign_key.sql @@ -0,0 +1,8 @@ +create database e2e_foreign_key DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; +use e2e_foreign_key; +create table parent (id int key); +create table child (id int key, pid int, constraint fk_1 foreign key (pid) references parent(id)); +insert into parent values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); +insert into child values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10); +set foreign_key_checks=0; +insert into child values (100,100); diff --git a/dumpling/tests/e2e_foreign_key/run.sh b/dumpling/tests/e2e_foreign_key/run.sh new file mode 100644 index 0000000000000..99285d627fdf7 --- /dev/null +++ b/dumpling/tests/e2e_foreign_key/run.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu +cur=$(cd `dirname $0`; pwd) + +DB_NAME="e2e_foreign_key" + +# drop database on tidb +export DUMPLING_TEST_PORT=4000 +run_sql "drop database if exists $DB_NAME;" + +# drop database on mysql +export DUMPLING_TEST_PORT=3306 +run_sql "drop database if exists $DB_NAME;" + +# build data on mysql +run_sql_file "$DUMPLING_BASE_NAME/data/e2e_foreign_key.sql" + +# dumping +export DUMPLING_TEST_DATABASE=$DB_NAME +run_dumpling + +cat "$cur/conf/lightning.toml" +# use lightning import data to tidb +run_lightning $cur/conf/lightning.toml + +# check mysql and tidb data +check_sync_diff $cur/conf/diff_config.toml diff --git a/dumpling/tests/file_size/run.sh b/dumpling/tests/file_size/run.sh index 6b0577dc2e514..174b1e0def008 100644 --- a/dumpling/tests/file_size/run.sh +++ b/dumpling/tests/file_size/run.sh @@ -14,8 +14,8 @@ chars_20="1111_0000_1111_0000_" # insert 100 records, each occupies 20 bytes run_sql "insert into t values $(seq -s, 100 | sed 's/,*$//g' | sed "s/[0-9]*/('$chars_20')/g");" -# dumping with file size = 311 bytes, actually 10 rows -run_dumpling -F 311B +# dumping with file size = 348 bytes, actually 10 rows +run_dumpling -F 348B # the dumping result is expected to be: # 10 files for insertion(each conatins 10 records / 200 bytes) diff --git a/dumpling/tests/naughty_strings/data/naughty_strings.escape.sql b/dumpling/tests/naughty_strings/data/naughty_strings.escape.sql index 1fa1d0d223013..d73ee94aee1a7 100644 --- a/dumpling/tests/naughty_strings/data/naughty_strings.escape.sql +++ b/dumpling/tests/naughty_strings/data/naughty_strings.escape.sql @@ -1,3 +1,4 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; INSERT INTO `escape` VALUES ('''', '"'), diff --git a/dumpling/tests/naughty_strings/data/naughty_strings.t.sql b/dumpling/tests/naughty_strings/data/naughty_strings.t.sql index fa5d74f15f934..88128d75dfd4c 100644 --- a/dumpling/tests/naughty_strings/data/naughty_strings.t.sql +++ b/dumpling/tests/naughty_strings/data/naughty_strings.t.sql @@ -1,3 +1,4 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; INSERT INTO `t` VALUES (''), diff --git a/dumpling/tests/naughty_strings/expect/naughty_strings.escape.sql b/dumpling/tests/naughty_strings/expect/naughty_strings.escape.sql index bc578c659f4c4..607aa53e0acef 100644 --- a/dumpling/tests/naughty_strings/expect/naughty_strings.escape.sql +++ b/dumpling/tests/naughty_strings/expect/naughty_strings.escape.sql @@ -1,3 +1,4 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; INSERT INTO `escape` VALUES ('\'','\"'), diff --git a/dumpling/tests/naughty_strings/expect/naughty_strings.t.sql b/dumpling/tests/naughty_strings/expect/naughty_strings.t.sql index 1dd0c5ae209a3..5f3468aeb108c 100644 --- a/dumpling/tests/naughty_strings/expect/naughty_strings.t.sql +++ b/dumpling/tests/naughty_strings/expect/naughty_strings.t.sql @@ -1,3 +1,4 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; INSERT INTO `t` VALUES (''), diff --git a/dumpling/tests/non_exist_tables/run.sh b/dumpling/tests/non_exist_tables/run.sh index 78003069cce9d..180db04407f3a 100644 --- a/dumpling/tests/non_exist_tables/run.sh +++ b/dumpling/tests/non_exist_tables/run.sh @@ -21,6 +21,6 @@ rm -rf "$DUMPLING_OUTPUT_DIR" run_dumpling --consistency=lock --tables-list "$DB_NAME.$TABLE_NAME2" -L ${DUMPLING_OUTPUT_DIR}/dumpling.log set -e -actual=$(grep -w "Error 1146: Table 'non_exist_tables.t2' doesn't exist" ${DUMPLING_OUTPUT_DIR}/dumpling.log|wc -l) +actual=$(grep -w "Table 'non_exist_tables.t2' doesn't exist" ${DUMPLING_OUTPUT_DIR}/dumpling.log|wc -l) echo "expected 1 return error when specifying --tables-list with non-existing tables, actual ${actual}" [ $actual = 1 ] diff --git a/dumpling/tests/placement_policy/result/x-placement-policy-create.sql b/dumpling/tests/placement_policy/result/x-placement-policy-create.sql index 8a41e6c2a3522..9a7dac22244b0 100644 --- a/dumpling/tests/placement_policy/result/x-placement-policy-create.sql +++ b/dumpling/tests/placement_policy/result/x-placement-policy-create.sql @@ -1,2 +1,3 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; /*T![placement] CREATE PLACEMENT POLICY `x` PRIMARY_REGION="cn-east-1" REGIONS="cn-east-1,cn-east" */; diff --git a/dumpling/tests/placement_policy/result/x1-placement-policy-create.sql b/dumpling/tests/placement_policy/result/x1-placement-policy-create.sql index d5e7f8ad8dda5..ebed679154ef5 100644 --- a/dumpling/tests/placement_policy/result/x1-placement-policy-create.sql +++ b/dumpling/tests/placement_policy/result/x1-placement-policy-create.sql @@ -1,2 +1,3 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; /*T![placement] CREATE PLACEMENT POLICY `x1` FOLLOWERS=4 */; diff --git a/dumpling/tests/primary_key/result/pk_case_0.sql b/dumpling/tests/primary_key/result/pk_case_0.sql index 6c8c7fb9e6538..0168395142ef6 100644 --- a/dumpling/tests/primary_key/result/pk_case_0.sql +++ b/dumpling/tests/primary_key/result/pk_case_0.sql @@ -1,3 +1,4 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; INSERT INTO `pk_case_0` VALUES (0,10), diff --git a/dumpling/tests/primary_key/result/pk_case_1.sql b/dumpling/tests/primary_key/result/pk_case_1.sql index 4a671cc64f247..741c36cd64e4a 100644 --- a/dumpling/tests/primary_key/result/pk_case_1.sql +++ b/dumpling/tests/primary_key/result/pk_case_1.sql @@ -1,3 +1,4 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; INSERT INTO `pk_case_1` VALUES (0,10), diff --git a/dumpling/tests/primary_key/result/pk_case_2.sql b/dumpling/tests/primary_key/result/pk_case_2.sql index af9494d00645d..0605e11e5572c 100644 --- a/dumpling/tests/primary_key/result/pk_case_2.sql +++ b/dumpling/tests/primary_key/result/pk_case_2.sql @@ -1,3 +1,4 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; INSERT INTO `pk_case_2` VALUES (0,10), diff --git a/dumpling/tests/primary_key/result/pk_case_3.sql b/dumpling/tests/primary_key/result/pk_case_3.sql index a29e568dd1340..2da84a1a1b91c 100644 --- a/dumpling/tests/primary_key/result/pk_case_3.sql +++ b/dumpling/tests/primary_key/result/pk_case_3.sql @@ -1,3 +1,4 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; INSERT INTO `pk_case_3` VALUES (6,4,x'000000000101000000000000000000f03f000000000000f03f'), diff --git a/dumpling/tests/quote/data/quote-database-schema-create-mysql57.sql b/dumpling/tests/quote/data/quote-database-schema-create-mysql57.sql index a5df1c26b6c8b..8cc30bc18ca25 100755 --- a/dumpling/tests/quote/data/quote-database-schema-create-mysql57.sql +++ b/dumpling/tests/quote/data/quote-database-schema-create-mysql57.sql @@ -1,2 +1,3 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; CREATE DATABASE `quo``te/database` /*!40100 DEFAULT CHARACTER SET latin1 */; diff --git a/dumpling/tests/quote/data/quote-database-schema-create.sql b/dumpling/tests/quote/data/quote-database-schema-create.sql index d895b4678b912..4a5bfe7c297fc 100755 --- a/dumpling/tests/quote/data/quote-database-schema-create.sql +++ b/dumpling/tests/quote/data/quote-database-schema-create.sql @@ -1,2 +1,3 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; CREATE DATABASE `quo``te/database` /*!40100 DEFAULT CHARACTER SET latin1 */ /*!80016 DEFAULT ENCRYPTION='N' */; diff --git a/dumpling/tests/quote/data/quote-database.quote-table-schema-mysql57.sql b/dumpling/tests/quote/data/quote-database.quote-table-schema-mysql57.sql index b3c55dee26330..4b0c6e85c30eb 100755 --- a/dumpling/tests/quote/data/quote-database.quote-table-schema-mysql57.sql +++ b/dumpling/tests/quote/data/quote-database.quote-table-schema-mysql57.sql @@ -1,3 +1,4 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; CREATE TABLE `quo``te/table` ( `quo``te/col` int(11) NOT NULL, diff --git a/dumpling/tests/quote/data/quote-database.quote-table-schema.sql b/dumpling/tests/quote/data/quote-database.quote-table-schema.sql index 61bfcc50d113f..cf357c7603836 100755 --- a/dumpling/tests/quote/data/quote-database.quote-table-schema.sql +++ b/dumpling/tests/quote/data/quote-database.quote-table-schema.sql @@ -1,3 +1,4 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; CREATE TABLE `quo``te/table` ( `quo``te/col` int NOT NULL, diff --git a/dumpling/tests/quote/data/quote-database.quote-table.000000000-mysql57.sql b/dumpling/tests/quote/data/quote-database.quote-table.000000000-mysql57.sql index 5cee6b7b4a67d..3f36d8fc8a099 100755 --- a/dumpling/tests/quote/data/quote-database.quote-table.000000000-mysql57.sql +++ b/dumpling/tests/quote/data/quote-database.quote-table.000000000-mysql57.sql @@ -1,3 +1,4 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; INSERT INTO `quo``te/table` (`quo``te/col`,`a`) VALUES (0,10), diff --git a/dumpling/tests/quote/data/quote-database.quote-table.000000000.sql b/dumpling/tests/quote/data/quote-database.quote-table.000000000.sql index 5cee6b7b4a67d..3f36d8fc8a099 100755 --- a/dumpling/tests/quote/data/quote-database.quote-table.000000000.sql +++ b/dumpling/tests/quote/data/quote-database.quote-table.000000000.sql @@ -1,3 +1,4 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; INSERT INTO `quo``te/table` (`quo``te/col`,`a`) VALUES (0,10), diff --git a/dumpling/tests/rows/run.sh b/dumpling/tests/rows/run.sh index 84175b025b9b2..41124fd267a0d 100644 --- a/dumpling/tests/rows/run.sh +++ b/dumpling/tests/rows/run.sh @@ -46,7 +46,7 @@ check_sync_diff $cur/conf/diff_config.toml # test dumpling with both rows and filesize rm -rf "$DUMPLING_OUTPUT_DIR" -run_dumpling --rows 10 --filesize 100B --loglevel debug +run_dumpling --rows 10 --filesize 140B --loglevel debug # the dumping result is expected to be: # 50 files for insertion file_num=$(find "$DUMPLING_OUTPUT_DIR" -maxdepth 1 -iname "$DB_NAME.$TABLE_NAME.*.sql" | wc -l) diff --git a/dumpling/tests/sequences/data/sequences.s-schema-sequence-expect.sql b/dumpling/tests/sequences/data/sequences.s-schema-sequence-expect.sql index 0fb6daa6fc5ad..0f33902517ff1 100644 --- a/dumpling/tests/sequences/data/sequences.s-schema-sequence-expect.sql +++ b/dumpling/tests/sequences/data/sequences.s-schema-sequence-expect.sql @@ -1,3 +1,4 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; CREATE SEQUENCE `s` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; SELECT SETVAL(`s`,1001); diff --git a/dumpling/tests/views/data/views-schema-create.sql b/dumpling/tests/views/data/views-schema-create.sql index af5ca6d166d0e..88ce12d5c3ccd 100644 --- a/dumpling/tests/views/data/views-schema-create.sql +++ b/dumpling/tests/views/data/views-schema-create.sql @@ -1,2 +1,3 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; CREATE DATABASE `views` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin */ /*!80016 DEFAULT ENCRYPTION='N' */; diff --git a/dumpling/tests/views/data/views.v-schema-view.sql b/dumpling/tests/views/data/views.v-schema-view.sql index 06d73e73fe664..3063ec02815cd 100644 --- a/dumpling/tests/views/data/views.v-schema-view.sql +++ b/dumpling/tests/views/data/views.v-schema-view.sql @@ -1,3 +1,4 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; DROP TABLE IF EXISTS `v`; DROP VIEW IF EXISTS `v`; diff --git a/dumpling/tests/views/data/views.v-schema.sql b/dumpling/tests/views/data/views.v-schema.sql index 8e6bf5d441640..0d2bddbdffc13 100644 --- a/dumpling/tests/views/data/views.v-schema.sql +++ b/dumpling/tests/views/data/views.v-schema.sql @@ -1,3 +1,4 @@ +/*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; CREATE TABLE `v`( `a` int, diff --git a/errno/errcode.go b/errno/errcode.go index 60257be0b76c9..0501bc0020e07 100644 --- a/errno/errcode.go +++ b/errno/errcode.go @@ -825,6 +825,7 @@ const ( ErrMaxExecTimeExceeded = 1907 ErrForeignKeyCascadeDepthExceeded = 3008 ErrInvalidFieldSize = 3013 + ErrPasswordExpireAnonymousUser = 3016 ErrInvalidArgumentForLogarithm = 3020 ErrAggregateOrderNonAggQuery = 3029 ErrUserLockWrongName = 3057 @@ -892,6 +893,7 @@ const ( ErrIllegalPrivilegeLevel = 3619 ErrCTEMaxRecursionDepth = 3636 ErrNotHintUpdatable = 3637 + ErrExistsInHistoryPassword = 3638 ErrForeignKeyCannotDropParent = 3730 ErrForeignKeyCannotUseVirtualColumn = 3733 ErrForeignKeyNoColumnInParent = 3734 @@ -913,11 +915,14 @@ const ( ErrFunctionalIndexRowValueIsNotAllowed = 3800 ErrDependentByFunctionalIndex = 3837 ErrCannotConvertString = 3854 + ErrDependentByPartitionFunctional = 3855 ErrInvalidJSONValueForFuncIndex = 3903 ErrJSONValueOutOfRangeForFuncIndex = 3904 ErrFunctionalIndexDataIsTooLong = 3907 ErrFunctionalIndexNotApplicable = 3909 ErrDynamicPrivilegeNotRegistered = 3929 + ErUserAccessDeniedForUserAccountBlockedByPasswordLock = 3955 + ErrJSONInBooleanContext = 3986 ErrTableWithoutPrimaryKey = 3750 // MariaDB errors. ErrOnlyOneDefaultPartionAllowed = 4030 @@ -1034,6 +1039,12 @@ const ( ErrGettingNoopVariable = 8145 ErrCannotMigrateSession = 8146 ErrLazyUniquenessCheckFailure = 8147 + ErrUnsupportedColumnInTTLConfig = 8148 + ErrTTLColumnCannotDrop = 8149 + ErrSetTTLOptionForNonTTLTable = 8150 + ErrTempTableNotAllowedWithTTL = 8151 + ErrUnsupportedTTLReferencedByFK = 8152 + ErrUnsupportedPrimaryKeyTypeWithTTL = 8153 // Error codes used by TiDB ddl package ErrUnsupportedDDLOperation = 8200 @@ -1082,6 +1093,10 @@ const ( ErrPartitionColumnStatsMissing = 8244 ErrColumnInChange = 8245 ErrDDLSetting = 8246 + ErrIngestFailed = 8247 + ErrResourceGroupExists = 8248 + ErrResourceGroupNotExists = 8249 + ErrResourceGroupSupportDisabled = 8250 // TiKV/PD/TiFlash errors. ErrPDServerTimeout = 9001 diff --git a/errno/errname.go b/errno/errname.go index 8f5fd8542bd1a..0f6c3db0e1645 100644 --- a/errno/errname.go +++ b/errno/errname.go @@ -92,7 +92,7 @@ var MySQLErrName = map[uint16]*mysql.ErrMessage{ ErrMultiplePriKey: mysql.Message("Multiple primary key defined", nil), ErrTooManyKeys: mysql.Message("Too many keys specified; max %d keys allowed", nil), ErrTooManyKeyParts: mysql.Message("Too many key parts specified; max %d parts allowed", nil), - ErrTooLongKey: mysql.Message("Specified key was too long; max key length is %d bytes", nil), + ErrTooLongKey: mysql.Message("Specified key was too long (%d bytes); max key length is %d bytes", nil), ErrKeyColumnDoesNotExits: mysql.Message("Key column '%-.192s' doesn't exist in table", nil), ErrBlobUsedAsKey: mysql.Message("BLOB column '%-.192s' can't be used in key specification with the used table type", nil), ErrTooBigFieldlength: mysql.Message("Column length too big for column '%-.192s' (max = %d); use BLOB or TEXT instead", nil), @@ -783,7 +783,7 @@ var MySQLErrName = map[uint16]*mysql.ErrMessage{ ErrInnodbIndexCorrupt: mysql.Message("Index corrupt: %s", nil), ErrInvalidYearColumnLength: mysql.Message("Supports only YEAR or YEAR(4) column", nil), ErrNotValidPassword: mysql.Message("Your password does not satisfy the current policy requirements", nil), - ErrMustChangePassword: mysql.Message("You must SET PASSWORD before executing this statement", nil), + ErrMustChangePassword: mysql.Message("You must reset your password using ALTER USER statement before executing this statement", nil), ErrFkNoIndexChild: mysql.Message("Failed to add the foreign key constraint. Missing index for constraint '%s' in the foreign table '%s'", nil), ErrForeignKeyNoIndexInParent: mysql.Message("Failed to add the foreign key constraint. Missing index for constraint '%s' in the referenced table '%s'", nil), ErrFkFailAddSystem: mysql.Message("Failed to add the foreign key constraint '%s' to system tables", nil), @@ -836,10 +836,12 @@ var MySQLErrName = map[uint16]*mysql.ErrMessage{ ErrDependentByGeneratedColumn: mysql.Message("Column '%s' has a generated column dependency.", nil), ErrGeneratedColumnRefAutoInc: mysql.Message("Generated column '%s' cannot refer to auto-increment column.", nil), ErrAccountHasBeenLocked: mysql.Message("Access denied for user '%s'@'%s'. Account is locked.", nil), + ErUserAccessDeniedForUserAccountBlockedByPasswordLock: mysql.Message("Access denied for user '%s'@'%s'. Account is blocked for %s day(s) (%s day(s) remaining) due to %d consecutive failed logins.", nil), ErrWarnConflictingHint: mysql.Message("Hint %s is ignored as conflicting/duplicated.", nil), ErrUnresolvedHintName: mysql.Message("Unresolved name '%s' for %s hint", nil), ErrForeignKeyCascadeDepthExceeded: mysql.Message("Foreign key cascade delete/update exceeds max depth of %v.", nil), ErrInvalidFieldSize: mysql.Message("Invalid size for column '%s'.", nil), + ErrPasswordExpireAnonymousUser: mysql.Message("The password for anonymous user cannot be expired.", nil), ErrInvalidArgumentForLogarithm: mysql.Message("Invalid argument for logarithm", nil), ErrAggregateOrderNonAggQuery: mysql.Message("Expression #%d of ORDER BY contains aggregate function and applies to the result of a non-aggregated query", nil), ErrIncorrectType: mysql.Message("Incorrect type for argument %s in function %s.", nil), @@ -887,6 +889,7 @@ var MySQLErrName = map[uint16]*mysql.ErrMessage{ ErrMaxExecTimeExceeded: mysql.Message("Query execution was interrupted, max_execution_time exceeded.", nil), ErrLockAcquireFailAndNoWaitSet: mysql.Message("Statement aborted because lock(s) could not be acquired immediately and NOWAIT is set.", nil), ErrNotHintUpdatable: mysql.Message("Variable '%s' cannot be set using SET_VAR hint.", nil), + ErrExistsInHistoryPassword: mysql.Message("Cannot use these credentials for '%s@%s' because they contradict the password history policy.", nil), ErrForeignKeyCannotDropParent: mysql.Message("Cannot drop table '%s' referenced by a foreign key constraint '%s' on table '%s'.", nil), ErrForeignKeyCannotUseVirtualColumn: mysql.Message("Foreign key '%s' uses virtual column '%s' which is not supported.", nil), ErrForeignKeyNoColumnInParent: mysql.Message("Failed to add the foreign key constraint. Missing column '%s' for constraint '%s' in the referenced table '%s'", nil), @@ -905,6 +908,7 @@ var MySQLErrName = map[uint16]*mysql.ErrMessage{ ErrFKIncompatibleColumns: mysql.Message("Referencing column '%s' and referenced column '%s' in foreign key constraint '%s' are incompatible.", nil), ErrFunctionalIndexRowValueIsNotAllowed: mysql.Message("Expression of expression index '%s' cannot refer to a row value", nil), ErrDependentByFunctionalIndex: mysql.Message("Column '%s' has an expression index dependency and cannot be dropped or renamed", nil), + ErrDependentByPartitionFunctional: mysql.Message("Column '%s' has a partitioning function dependency and cannot be dropped or renamed", nil), ErrCannotConvertString: mysql.Message("Cannot convert string '%.64s' from %s to %s", nil), ErrInvalidJSONValueForFuncIndex: mysql.Message("Invalid JSON value for CAST for expression index '%s'", nil), ErrJSONValueOutOfRangeForFuncIndex: mysql.Message("Out of range JSON value for CAST for expression index '%s'", nil), @@ -920,6 +924,7 @@ var MySQLErrName = map[uint16]*mysql.ErrMessage{ ErrInvalidRequiresSingleReference: mysql.Message("In recursive query block of Recursive Common Table Expression '%s', the recursive table must be referenced only once, and not in any subquery", nil), ErrCTEMaxRecursionDepth: mysql.Message("Recursive query aborted after %d iterations. Try increasing @@cte_max_recursion_depth to a larger value", nil), ErrTableWithoutPrimaryKey: mysql.Message("Unable to create or change a table without a primary key, when the system variable 'sql_require_primary_key' is set. Add a primary key to the table or unset this variable to avoid this message. Note that tables without a primary key can cause performance problems in row-based replication, so please consult your DBA before changing this setting.", nil), + ErrJSONInBooleanContext: mysql.Message("Evaluating a JSON value in SQL boolean context does an implicit comparison against JSON integer 0; if this is not what you want, consider converting JSON to a SQL numeric type with JSON_VALUE RETURNING", nil), // MariaDB errors. ErrOnlyOneDefaultPartionAllowed: mysql.Message("Only one DEFAULT partition allowed", nil), ErrWrongPartitionTypeExpectedSystemTime: mysql.Message("Wrong partitioning type, expected type: `SYSTEM_TIME`", nil), @@ -933,102 +938,108 @@ var MySQLErrName = map[uint16]*mysql.ErrMessage{ ErrSequenceInvalidTableStructure: mysql.Message("Sequence '%-.64s.%-.64s' table structure is invalid (%s)", nil), // TiDB errors. - ErrMemExceedThreshold: mysql.Message("%s holds %dB memory, exceeds threshold %dB.%s", nil), - ErrForUpdateCantRetry: mysql.Message("[%d] can not retry select for update statement", nil), - ErrAdminCheckTable: mysql.Message("TiDB admin check table failed.", nil), - ErrOptOnTemporaryTable: mysql.Message("`%s` is unsupported on temporary tables.", nil), - ErrDropTableOnTemporaryTable: mysql.Message("`drop global temporary table` can only drop global temporary table", nil), - ErrTxnTooLarge: mysql.Message("Transaction is too large, size: %d", nil), - ErrWriteConflictInTiDB: mysql.Message("Write conflict, txnStartTS %d is stale", nil), - ErrInvalidPluginID: mysql.Message("Wrong plugin id: %s, valid plugin id is [name]-[version], both name and version should not contain '-'", nil), - ErrInvalidPluginManifest: mysql.Message("Cannot read plugin %s's manifest", nil), - ErrInvalidPluginName: mysql.Message("Plugin load with %s but got wrong name %s", nil), - ErrInvalidPluginVersion: mysql.Message("Plugin load with %s but got %s", nil), - ErrDuplicatePlugin: mysql.Message("Plugin [%s] is redeclared", nil), - ErrInvalidPluginSysVarName: mysql.Message("Plugin %s's sysVar %s must start with its plugin name %s", nil), - ErrRequireVersionCheckFail: mysql.Message("Plugin %s require %s be %v but got %v", nil), - ErrUnsupportedReloadPlugin: mysql.Message("Plugin %s isn't loaded so cannot be reloaded", nil), - ErrUnsupportedReloadPluginVar: mysql.Message("Reload plugin with different sysVar is unsupported %v", nil), - ErrTableLocked: mysql.Message("Table '%s' was locked in %s by %v", nil), - ErrNotExist: mysql.Message("Error: key not exist", nil), - ErrTxnRetryable: mysql.Message("Error: KV error safe to retry %s ", []int{0}), - ErrCannotSetNilValue: mysql.Message("can not set nil value", nil), - ErrInvalidTxn: mysql.Message("invalid transaction", nil), - ErrEntryTooLarge: mysql.Message("entry too large, the max entry size is %d, the size of data is %d", nil), - ErrNotImplemented: mysql.Message("not implemented", nil), - ErrInfoSchemaExpired: mysql.Message("Information schema is out of date: schema failed to update in 1 lease, please make sure TiDB can connect to TiKV", nil), - ErrInfoSchemaChanged: mysql.Message("Information schema is changed during the execution of the statement(for example, table definition may be updated by other DDL ran in parallel). If you see this error often, try increasing `tidb_max_delta_schema_count`", nil), - ErrBadNumber: mysql.Message("Bad Number", nil), - ErrCastAsSignedOverflow: mysql.Message("Cast to signed converted positive out-of-range integer to it's negative complement", nil), - ErrCastNegIntAsUnsigned: mysql.Message("Cast to unsigned converted negative integer to it's positive complement", nil), - ErrInvalidYearFormat: mysql.Message("invalid year format", nil), - ErrInvalidYear: mysql.Message("invalid year", nil), - ErrIncorrectDatetimeValue: mysql.Message("Incorrect datetime value: '%s'", []int{0}), - ErrInvalidTimeFormat: mysql.Message("invalid time format: '%v'", []int{0}), - ErrInvalidWeekModeFormat: mysql.Message("invalid week mode format: '%v'", nil), - ErrFieldGetDefaultFailed: mysql.Message("Field '%s' get default value fail", nil), - ErrIndexOutBound: mysql.Message("Index column %s offset out of bound, offset: %d, row: %v", []int{2}), - ErrUnsupportedOp: mysql.Message("operation not supported", nil), - ErrRowNotFound: mysql.Message("can not find the row: %s", []int{0}), - ErrTableStateCantNone: mysql.Message("table %s can't be in none state", nil), - ErrColumnStateCantNone: mysql.Message("column %s can't be in none state", nil), - ErrColumnStateNonPublic: mysql.Message("can not use non-public column", nil), - ErrIndexStateCantNone: mysql.Message("index %s can't be in none state", nil), - ErrInvalidRecordKey: mysql.Message("invalid record key", nil), - ErrUnsupportedValueForVar: mysql.Message("variable '%s' does not yet support value: %s", nil), - ErrUnsupportedIsolationLevel: mysql.Message("The isolation level '%s' is not supported. Set tidb_skip_isolation_level_check=1 to skip this error", nil), - ErrInvalidDDLWorker: mysql.Message("Invalid DDL worker", nil), - ErrUnsupportedDDLOperation: mysql.Message("Unsupported %s", nil), - ErrNotOwner: mysql.Message("TiDB server is not a DDL owner", nil), - ErrCantDecodeRecord: mysql.Message("Cannot decode %s value, because %v", nil), - ErrInvalidDDLJob: mysql.Message("Invalid DDL job", nil), - ErrInvalidDDLJobFlag: mysql.Message("Invalid DDL job flag", nil), - ErrWaitReorgTimeout: mysql.Message("Timeout waiting for data reorganization", nil), - ErrInvalidStoreVersion: mysql.Message("Invalid storage current version: %d", nil), - ErrUnknownTypeLength: mysql.Message("Unknown length for type %d", nil), - ErrUnknownFractionLength: mysql.Message("Unknown length for type %d and fraction %d", nil), - ErrInvalidDDLJobVersion: mysql.Message("Version %d of DDL job is greater than current one: %d", nil), - ErrInvalidSplitRegionRanges: mysql.Message("Failed to split region ranges: %s", nil), - ErrReorgPanic: mysql.Message("Reorg worker panic", nil), - ErrInvalidDDLState: mysql.Message("Invalid %s state: %v", nil), - ErrCancelledDDLJob: mysql.Message("Cancelled DDL job", nil), - ErrRepairTable: mysql.Message("Failed to repair table: %s", nil), - ErrLoadPrivilege: mysql.Message("Load privilege table fail: %s", nil), - ErrInvalidPrivilegeType: mysql.Message("unknown privilege type %s", nil), - ErrUnknownFieldType: mysql.Message("unknown field type", nil), - ErrInvalidSequence: mysql.Message("invalid sequence", nil), - ErrInvalidType: mysql.Message("invalid type", nil), - ErrCantGetValidID: mysql.Message("Cannot get a valid auto-ID when retrying the statement", nil), - ErrCantSetToNull: mysql.Message("cannot set variable to null", nil), - ErrSnapshotTooOld: mysql.Message("snapshot is older than GC safe point %s", nil), - ErrInvalidTableID: mysql.Message("invalid TableID", nil), - ErrInvalidAutoRandom: mysql.Message("Invalid auto random: %s", nil), - ErrInvalidHashKeyFlag: mysql.Message("invalid encoded hash key flag", nil), - ErrInvalidListIndex: mysql.Message("invalid list index", nil), - ErrInvalidListMetaData: mysql.Message("invalid list meta data", nil), - ErrWriteOnSnapshot: mysql.Message("write on snapshot", nil), - ErrInvalidKey: mysql.Message("invalid key", nil), - ErrInvalidIndexKey: mysql.Message("invalid index key", nil), - ErrDataInconsistent: mysql.Message("data inconsistency in table: %s, index: %s, handle: %s, index-values:%#v != record-values:%#v", []int{2, 3, 4}), - ErrDDLReorgElementNotExist: mysql.Message("DDL reorg element does not exist", nil), - ErrDDLJobNotFound: mysql.Message("DDL Job:%v not found", nil), - ErrCancelFinishedDDLJob: mysql.Message("This job:%v is finished, so can't be cancelled", nil), - ErrCannotCancelDDLJob: mysql.Message("This job:%v is almost finished, can't be cancelled now", nil), - ErrUnknownAllocatorType: mysql.Message("Invalid allocator type", nil), - ErrAutoRandReadFailed: mysql.Message("Failed to read auto-random value from storage engine", nil), - ErrInvalidIncrementAndOffset: mysql.Message("Invalid auto_increment settings: auto_increment_increment: %d, auto_increment_offset: %d, both of them must be in range [1..65535]", nil), - ErrDataInconsistentMismatchCount: mysql.Message("data inconsistency in table: %s, index: %s, index-count:%d != record-count:%d", nil), - ErrDataInconsistentMismatchIndex: mysql.Message("data inconsistency in table: %s, index: %s, col: %s, handle: %#v, index-values:%#v != record-values:%#v, compare err:%#v", []int{3, 4, 5, 6}), - ErrInconsistentRowValue: mysql.Message("writing inconsistent data in table: %s, expected-values:{%s} != record-values:{%s}", []int{1, 2}), - ErrInconsistentHandle: mysql.Message("writing inconsistent data in table: %s, index: %s, index-handle:%#v != record-handle:%#v, index: %#v, record: %#v", []int{2, 3, 4, 5}), - ErrInconsistentIndexedValue: mysql.Message("writing inconsistent data in table: %s, index: %s, col: %s, indexed-value:{%s} != record-value:{%s}", []int{3, 4}), - ErrAssertionFailed: mysql.Message("assertion failed: key: %s, assertion: %s, start_ts: %v, existing start ts: %v, existing commit ts: %v", []int{0}), - ErrInstanceScope: mysql.Message("modifying %s will require SET GLOBAL in a future version of TiDB", nil), - ErrNonTransactionalJobFailure: mysql.Message("non-transactional job failed, job id: %d, total jobs: %d. job range: [%s, %s], job sql: %s, err: %v", []int{2, 3, 4}), - ErrSettingNoopVariable: mysql.Message("setting %s has no effect in TiDB", nil), - ErrGettingNoopVariable: mysql.Message("variable %s has no effect in TiDB", nil), - ErrCannotMigrateSession: mysql.Message("cannot migrate the current session: %s", nil), - ErrLazyUniquenessCheckFailure: mysql.Message("transaction aborted because lazy uniqueness check is enabled and an error occurred: %s", nil), + ErrMemExceedThreshold: mysql.Message("%s holds %dB memory, exceeds threshold %dB.%s", nil), + ErrForUpdateCantRetry: mysql.Message("[%d] can not retry select for update statement", nil), + ErrAdminCheckTable: mysql.Message("TiDB admin check table failed.", nil), + ErrOptOnTemporaryTable: mysql.Message("`%s` is unsupported on temporary tables.", nil), + ErrDropTableOnTemporaryTable: mysql.Message("`drop global temporary table` can only drop global temporary table", nil), + ErrTxnTooLarge: mysql.Message("Transaction is too large, size: %d", nil), + ErrWriteConflictInTiDB: mysql.Message("Write conflict, txnStartTS %d is stale", nil), + ErrInvalidPluginID: mysql.Message("Wrong plugin id: %s, valid plugin id is [name]-[version], both name and version should not contain '-'", nil), + ErrInvalidPluginManifest: mysql.Message("Cannot read plugin %s's manifest", nil), + ErrInvalidPluginName: mysql.Message("Plugin load with %s but got wrong name %s", nil), + ErrInvalidPluginVersion: mysql.Message("Plugin load with %s but got %s", nil), + ErrDuplicatePlugin: mysql.Message("Plugin [%s] is redeclared", nil), + ErrInvalidPluginSysVarName: mysql.Message("Plugin %s's sysVar %s must start with its plugin name %s", nil), + ErrRequireVersionCheckFail: mysql.Message("Plugin %s require %s be %v but got %v", nil), + ErrUnsupportedReloadPlugin: mysql.Message("Plugin %s isn't loaded so cannot be reloaded", nil), + ErrUnsupportedReloadPluginVar: mysql.Message("Reload plugin with different sysVar is unsupported %v", nil), + ErrTableLocked: mysql.Message("Table '%s' was locked in %s by %v", nil), + ErrNotExist: mysql.Message("Error: key not exist", nil), + ErrTxnRetryable: mysql.Message("Error: KV error safe to retry %s ", []int{0}), + ErrCannotSetNilValue: mysql.Message("can not set nil value", nil), + ErrInvalidTxn: mysql.Message("invalid transaction", nil), + ErrEntryTooLarge: mysql.Message("entry too large, the max entry size is %d, the size of data is %d", nil), + ErrNotImplemented: mysql.Message("not implemented", nil), + ErrInfoSchemaExpired: mysql.Message("Information schema is out of date: schema failed to update in 1 lease, please make sure TiDB can connect to TiKV", nil), + ErrInfoSchemaChanged: mysql.Message("Information schema is changed during the execution of the statement(for example, table definition may be updated by other DDL ran in parallel). If you see this error often, try increasing `tidb_max_delta_schema_count`", nil), + ErrBadNumber: mysql.Message("Bad Number", nil), + ErrCastAsSignedOverflow: mysql.Message("Cast to signed converted positive out-of-range integer to it's negative complement", nil), + ErrCastNegIntAsUnsigned: mysql.Message("Cast to unsigned converted negative integer to it's positive complement", nil), + ErrInvalidYearFormat: mysql.Message("invalid year format", nil), + ErrInvalidYear: mysql.Message("invalid year", nil), + ErrIncorrectDatetimeValue: mysql.Message("Incorrect datetime value: '%s'", []int{0}), + ErrInvalidTimeFormat: mysql.Message("invalid time format: '%v'", []int{0}), + ErrInvalidWeekModeFormat: mysql.Message("invalid week mode format: '%v'", nil), + ErrFieldGetDefaultFailed: mysql.Message("Field '%s' get default value fail", nil), + ErrIndexOutBound: mysql.Message("Index column %s offset out of bound, offset: %d, row: %v", []int{2}), + ErrUnsupportedOp: mysql.Message("operation not supported", nil), + ErrRowNotFound: mysql.Message("can not find the row: %s", []int{0}), + ErrTableStateCantNone: mysql.Message("table %s can't be in none state", nil), + ErrColumnStateCantNone: mysql.Message("column %s can't be in none state", nil), + ErrColumnStateNonPublic: mysql.Message("can not use non-public column", nil), + ErrIndexStateCantNone: mysql.Message("index %s can't be in none state", nil), + ErrInvalidRecordKey: mysql.Message("invalid record key", nil), + ErrUnsupportedValueForVar: mysql.Message("variable '%s' does not yet support value: %s", nil), + ErrUnsupportedIsolationLevel: mysql.Message("The isolation level '%s' is not supported. Set tidb_skip_isolation_level_check=1 to skip this error", nil), + ErrInvalidDDLWorker: mysql.Message("Invalid DDL worker", nil), + ErrUnsupportedDDLOperation: mysql.Message("Unsupported %s", nil), + ErrNotOwner: mysql.Message("TiDB server is not a DDL owner", nil), + ErrCantDecodeRecord: mysql.Message("Cannot decode %s value, because %v", nil), + ErrInvalidDDLJob: mysql.Message("Invalid DDL job", nil), + ErrInvalidDDLJobFlag: mysql.Message("Invalid DDL job flag", nil), + ErrWaitReorgTimeout: mysql.Message("Timeout waiting for data reorganization", nil), + ErrInvalidStoreVersion: mysql.Message("Invalid storage current version: %d", nil), + ErrUnknownTypeLength: mysql.Message("Unknown length for type %d", nil), + ErrUnknownFractionLength: mysql.Message("Unknown length for type %d and fraction %d", nil), + ErrInvalidDDLJobVersion: mysql.Message("Version %d of DDL job is greater than current one: %d", nil), + ErrInvalidSplitRegionRanges: mysql.Message("Failed to split region ranges: %s", nil), + ErrReorgPanic: mysql.Message("Reorg worker panic", nil), + ErrInvalidDDLState: mysql.Message("Invalid %s state: %v", nil), + ErrCancelledDDLJob: mysql.Message("Cancelled DDL job", nil), + ErrRepairTable: mysql.Message("Failed to repair table: %s", nil), + ErrLoadPrivilege: mysql.Message("Load privilege table fail: %s", nil), + ErrInvalidPrivilegeType: mysql.Message("unknown privilege type %s", nil), + ErrUnknownFieldType: mysql.Message("unknown field type", nil), + ErrInvalidSequence: mysql.Message("invalid sequence", nil), + ErrInvalidType: mysql.Message("invalid type", nil), + ErrCantGetValidID: mysql.Message("Cannot get a valid auto-ID when retrying the statement", nil), + ErrCantSetToNull: mysql.Message("cannot set variable to null", nil), + ErrSnapshotTooOld: mysql.Message("snapshot is older than GC safe point %s", nil), + ErrInvalidTableID: mysql.Message("invalid TableID", nil), + ErrInvalidAutoRandom: mysql.Message("Invalid auto random: %s", nil), + ErrInvalidHashKeyFlag: mysql.Message("invalid encoded hash key flag", nil), + ErrInvalidListIndex: mysql.Message("invalid list index", nil), + ErrInvalidListMetaData: mysql.Message("invalid list meta data", nil), + ErrWriteOnSnapshot: mysql.Message("write on snapshot", nil), + ErrInvalidKey: mysql.Message("invalid key", nil), + ErrInvalidIndexKey: mysql.Message("invalid index key", nil), + ErrDataInconsistent: mysql.Message("data inconsistency in table: %s, index: %s, handle: %s, index-values:%#v != record-values:%#v", []int{2, 3, 4}), + ErrDDLReorgElementNotExist: mysql.Message("DDL reorg element does not exist", nil), + ErrDDLJobNotFound: mysql.Message("DDL Job:%v not found", nil), + ErrCancelFinishedDDLJob: mysql.Message("This job:%v is finished, so can't be cancelled", nil), + ErrCannotCancelDDLJob: mysql.Message("This job:%v is almost finished, can't be cancelled now", nil), + ErrUnknownAllocatorType: mysql.Message("Invalid allocator type", nil), + ErrAutoRandReadFailed: mysql.Message("Failed to read auto-random value from storage engine", nil), + ErrInvalidIncrementAndOffset: mysql.Message("Invalid auto_increment settings: auto_increment_increment: %d, auto_increment_offset: %d, both of them must be in range [1..65535]", nil), + ErrDataInconsistentMismatchCount: mysql.Message("data inconsistency in table: %s, index: %s, index-count:%d != record-count:%d", nil), + ErrDataInconsistentMismatchIndex: mysql.Message("data inconsistency in table: %s, index: %s, col: %s, handle: %#v, index-values:%#v != record-values:%#v, compare err:%#v", []int{3, 4, 5, 6}), + ErrInconsistentRowValue: mysql.Message("writing inconsistent data in table: %s, expected-values:{%s} != record-values:{%s}", []int{1, 2}), + ErrInconsistentHandle: mysql.Message("writing inconsistent data in table: %s, index: %s, index-handle:%#v != record-handle:%#v, index: %#v, record: %#v", []int{2, 3, 4, 5}), + ErrInconsistentIndexedValue: mysql.Message("writing inconsistent data in table: %s, index: %s, col: %s, indexed-value:{%s} != record-value:{%s}", []int{3, 4}), + ErrAssertionFailed: mysql.Message("assertion failed: key: %s, assertion: %s, start_ts: %v, existing start ts: %v, existing commit ts: %v", []int{0}), + ErrInstanceScope: mysql.Message("modifying %s will require SET GLOBAL in a future version of TiDB", nil), + ErrNonTransactionalJobFailure: mysql.Message("non-transactional job failed, job id: %d, total jobs: %d. job range: [%s, %s], job sql: %s, err: %v", []int{2, 3, 4}), + ErrSettingNoopVariable: mysql.Message("setting %s has no effect in TiDB", nil), + ErrGettingNoopVariable: mysql.Message("variable %s has no effect in TiDB", nil), + ErrCannotMigrateSession: mysql.Message("cannot migrate the current session: %s", nil), + ErrLazyUniquenessCheckFailure: mysql.Message("transaction aborted because lazy uniqueness check is enabled and an error occurred: %s", nil), + ErrUnsupportedColumnInTTLConfig: mysql.Message("Field '%-.192s' is of a not supported type for TTL config, expect DATETIME, DATE or TIMESTAMP", nil), + ErrTTLColumnCannotDrop: mysql.Message("Cannot drop column '%-.192s': needed in TTL config", nil), + ErrSetTTLOptionForNonTTLTable: mysql.Message("Cannot set %s on a table without TTL config", nil), + ErrTempTableNotAllowedWithTTL: mysql.Message("Set TTL for temporary table is not allowed", nil), + ErrUnsupportedTTLReferencedByFK: mysql.Message("Set TTL for a table referenced by foreign key is not allowed", nil), + ErrUnsupportedPrimaryKeyTypeWithTTL: mysql.Message("Unsupported clustered primary key type FLOAT/DOUBLE for TTL", nil), ErrWarnOptimizerHintInvalidInteger: mysql.Message("integer value is out of range in '%s'", nil), ErrWarnOptimizerHintUnsupportedHint: mysql.Message("Optimizer hint %s is not supported by TiDB and is ignored", nil), @@ -1072,9 +1083,10 @@ var MySQLErrName = map[uint16]*mysql.ErrMessage{ ErrInvalidTableSample: mysql.Message("Invalid TABLESAMPLE: %s", nil), ErrJSONObjectKeyTooLong: mysql.Message("TiDB does not yet support JSON objects with the key length >= 65536", nil), - ErrPartitionStatsMissing: mysql.Message("Build table: %s global-level stats failed due to missing partition-level stats", nil), - ErrPartitionColumnStatsMissing: mysql.Message("Build table: %s global-level stats failed due to missing partition-level column stats, please run analyze table to refresh columns of all partitions", nil), + ErrPartitionStatsMissing: mysql.Message("Build global-level stats failed due to missing partition-level stats: %s", nil), + ErrPartitionColumnStatsMissing: mysql.Message("Build global-level stats failed due to missing partition-level column stats: %s, please run analyze table to refresh columns of all partitions", nil), ErrDDLSetting: mysql.Message("Error happened when enable/disable DDL: %s", nil), + ErrIngestFailed: mysql.Message("Ingest failed: %s", nil), ErrNotSupportedWithSem: mysql.Message("Feature '%s' is not supported when security enhanced mode is enabled", nil), ErrPlacementPolicyCheck: mysql.Message("Placement policy didn't meet the constraint, reason: %s", nil), @@ -1087,10 +1099,14 @@ var MySQLErrName = map[uint16]*mysql.ErrMessage{ ErrPlacementPolicyWithDirectOption: mysql.Message("Placement policy '%s' can't co-exist with direct placement options", nil), ErrPlacementPolicyInUse: mysql.Message("Placement policy '%-.192s' is still in use", nil), ErrOptOnCacheTable: mysql.Message("'%s' is unsupported on cache tables.", nil), + ErrResourceGroupExists: mysql.Message("Resource group '%-.192s' already exists", nil), + ErrResourceGroupNotExists: mysql.Message("Unknown resource group '%-.192s'", nil), + + ErrColumnInChange: mysql.Message("column %s id %d does not exist, this column may have been updated by other DDL ran in parallel", nil), + ErrResourceGroupSupportDisabled: mysql.Message("Resource control feature is disabled. Run `SET GLOBAL tidb_enable_resource_control='on'` to enable the feature", nil), - ErrColumnInChange: mysql.Message("column %s id %d does not exist, this column may have been updated by other DDL ran in parallel", nil), // TiKV/PD errors. - ErrPDServerTimeout: mysql.Message("PD server timeout", nil), + ErrPDServerTimeout: mysql.Message("PD server timeout: %s", nil), ErrTiKVServerTimeout: mysql.Message("TiKV server timeout", nil), ErrTiKVServerBusy: mysql.Message("TiKV server is busy", nil), ErrTiFlashServerTimeout: mysql.Message("TiFlash server timeout", nil), diff --git a/errors.toml b/errors.toml index 31a56ef6b1d17..9b503c113a836 100644 --- a/errors.toml +++ b/errors.toml @@ -66,6 +66,11 @@ error = ''' restore met a invalid peer ''' +["BR:EBS:ErrRestoreRegionWithoutPeer"] +error = ''' +restore met a region without any peer +''' + ["BR:EBS:ErrRestoreTotalKVMismatch"] error = ''' restore total tikvs mismatch @@ -456,6 +461,11 @@ error = ''' update pd error ''' +["Lightning:PreCheck:ErrCheckCDCPiTR"] +error = ''' +check TiCDC/PiTR task error +''' + ["Lightning:PreCheck:ErrCheckCSVHeader"] error = ''' check csv header error @@ -516,6 +526,11 @@ error = ''' encode kv error in file %s at offset %d ''' +["Lightning:Restore:ErrFoundDuplicateKey"] +error = ''' +found duplicate key '%s', value '%s' +''' + ["Lightning:Restore:ErrInvalidMetaStatus"] error = ''' invalid meta status: '%s' @@ -653,7 +668,7 @@ Too many keys specified; max %d keys allowed ["ddl:1071"] error = ''' -Specified key was too long; max key length is %d bytes +Specified key was too long (%d bytes); max key length is %d bytes ''' ["ddl:1072"] @@ -756,6 +771,11 @@ error = ''' Incorrect usage of %s and %s ''' +["ddl:1235"] +error = ''' +This version of TiDB doesn't yet support '%s' +''' + ["ddl:1246"] error = ''' Converting column '%s' from %s to %s @@ -1161,6 +1181,11 @@ error = ''' Column '%s' has an expression index dependency and cannot be dropped or renamed ''' +["ddl:3855"] +error = ''' +Column '%s' has a partitioning function dependency and cannot be dropped or renamed +''' + ["ddl:4135"] error = ''' Sequence '%-.64s.%-.64s' has run out @@ -1191,6 +1216,36 @@ error = ''' `%s` is unsupported on temporary tables. ''' +["ddl:8148"] +error = ''' +Field '%-.192s' is of a not supported type for TTL config, expect DATETIME, DATE or TIMESTAMP +''' + +["ddl:8149"] +error = ''' +Cannot drop column '%-.192s': needed in TTL config +''' + +["ddl:8150"] +error = ''' +Cannot set %s on a table without TTL config +''' + +["ddl:8151"] +error = ''' +Set TTL for temporary table is not allowed +''' + +["ddl:8152"] +error = ''' +Set TTL for a table referenced by foreign key is not allowed +''' + +["ddl:8153"] +error = ''' +Unsupported clustered primary key type FLOAT/DOUBLE for TTL +''' + ["ddl:8200"] error = ''' Unsupported shard_row_id_bits for table with primary key as row id @@ -1336,6 +1391,11 @@ error = ''' Error happened when enable/disable DDL: %s ''' +["ddl:8247"] +error = ''' +Ingest failed: %s +''' + ["domain:8027"] error = ''' Information schema is out of date: schema failed to update in 1 lease, please make sure TiDB can connect to TiKV @@ -1451,6 +1511,11 @@ error = ''' SET PASSWORD has no significance for user '%-.48s'@'%-.255s' as authentication plugin does not support it. ''' +["executor:1819"] +error = ''' +Your password does not satisfy the current policy requirements +''' + ["executor:1827"] error = ''' The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function. @@ -1461,6 +1526,11 @@ error = ''' Foreign key cascade delete/update exceeds max depth of %v. ''' +["executor:3016"] +error = ''' +The password for anonymous user cannot be expired. +''' + ["executor:3523"] error = ''' Unknown authorization ID %.256s @@ -1476,6 +1546,11 @@ error = ''' Recursive query aborted after %d iterations. Try increasing @@cte_max_recursion_depth to a larger value ''' +["executor:3638"] +error = ''' +Cannot use these credentials for '%s@%s' because they contradict the password history policy. +''' + ["executor:3929"] error = ''' Dynamic privilege '%s' is not registered with the server. @@ -1636,6 +1711,21 @@ error = ''' Invalid data type for JSON data in argument %d to function %s; a JSON string or JSON type is required. ''' +["expression:3752"] +error = ''' +Value is out of range for expression index '%s' at row %d +''' + +["expression:3903"] +error = ''' +Invalid JSON value for CAST for expression index '%s' +''' + +["expression:3907"] +error = ''' +Data too long for expression index '%s' +''' + ["expression:8128"] error = ''' Invalid TABLESAMPLE: %s @@ -1781,6 +1871,16 @@ error = ''' Unknown placement policy '%-.192s' ''' +["meta:8248"] +error = ''' +Resource group '%-.192s' already exists +''' + +["meta:8249"] +error = ''' +Unknown resource group '%-.192s' +''' + ["planner:1044"] error = ''' Access denied for user '%-.48s'@'%-.255s' to database '%-.192s' @@ -2231,6 +2331,11 @@ error = ''' There is no such grant defined for user '%-.48s' on host '%-.255s' ''' +["privilege:1862"] +error = ''' +Your password has expired. To log in you must change it using a client that supports expired passwords. +''' + ["privilege:3530"] error = ''' %s is not granted to %s @@ -2346,6 +2451,11 @@ error = ''' Changing schema from '%-.192s' to '%-.192s' is not allowed. ''' +["schema:1506"] +error = ''' +Foreign key clause is not yet supported in conjunction with partitioning +''' + ["schema:1822"] error = ''' Failed to add the foreign key constraint. Missing index for constraint '%s' in the referenced table '%s' @@ -2416,6 +2526,21 @@ error = ''' Unknown placement policy '%-.192s' ''' +["schema:8248"] +error = ''' +Resource group '%-.192s' already exists +''' + +["schema:8249"] +error = ''' +Unknown resource group '%-.192s' +''' + +["schema:8250"] +error = ''' +Resource control feature is disabled. Run `SET GLOBAL tidb_enable_resource_control='on'` to enable the feature +''' + ["session:8002"] error = ''' [%d] can not retry select for update statement @@ -2588,7 +2713,7 @@ TTL manager has timed out, pessimistic locks may expire, please commit or rollba ["tikv:9001"] error = ''' -PD server timeout +PD server timeout: %s ''' ["tikv:9002"] @@ -2726,6 +2851,11 @@ error = ''' Datetime function: %-.32s field overflow ''' +["types:1525"] +error = ''' +Incorrect %-.32s value: '%-.128s' +''' + ["types:1690"] error = ''' %s value is out of range in '%s' @@ -2773,12 +2903,12 @@ TiDB does not yet support JSON objects with the key length >= 65536 ["types:8131"] error = ''' -Build table: %s global-level stats failed due to missing partition-level stats +Build global-level stats failed due to missing partition-level stats: %s ''' ["types:8244"] error = ''' -Build table: %s global-level stats failed due to missing partition-level column stats, please run analyze table to refresh columns of all partitions +Build global-level stats failed due to missing partition-level column stats: %s, please run analyze table to refresh columns of all partitions ''' ["variable:1193"] diff --git a/executor/BUILD.bazel b/executor/BUILD.bazel index 6a300dbeaf654..aa288e1180843 100644 --- a/executor/BUILD.bazel +++ b/executor/BUILD.bazel @@ -85,6 +85,7 @@ go_library( "slow_query.go", "sort.go", "split.go", + "stmtsummary.go", "table_reader.go", "trace.go", "union_scan.go", @@ -121,9 +122,11 @@ go_library( "//parser/ast", "//parser/auth", "//parser/charset", + "//parser/format", "//parser/model", "//parser/mysql", "//parser/terror", + "//parser/tidb", "//parser/types", "//planner", "//planner/core", @@ -177,10 +180,12 @@ go_library( "//util/mathutil", "//util/memory", "//util/mvmap", + "//util/password-validation", "//util/pdapi", "//util/plancodec", "//util/printer", "//util/ranger", + "//util/replayer", "//util/resourcegrouptag", "//util/rowDecoder", "//util/rowcodec", @@ -190,12 +195,14 @@ go_library( "//util/size", "//util/sqlexec", "//util/stmtsummary", + "//util/stmtsummary/v2:stmtsummary", "//util/stringutil", "//util/table-filter", "//util/timeutil", "//util/tls", "//util/topsql", "//util/topsql/state", + "//util/tracing", "@com_github_burntsushi_toml//:toml", "@com_github_gogo_protobuf//proto", "@com_github_ngaut_pools//:pools", @@ -210,6 +217,7 @@ go_library( "@com_github_pingcap_kvproto//pkg/encryptionpb", "@com_github_pingcap_kvproto//pkg/kvrpcpb", "@com_github_pingcap_kvproto//pkg/metapb", + "@com_github_pingcap_kvproto//pkg/resource_manager", "@com_github_pingcap_kvproto//pkg/tikvpb", "@com_github_pingcap_log//:log", "@com_github_pingcap_sysutil//:sysutil", @@ -234,6 +242,7 @@ go_library( "@org_golang_google_grpc//:grpc", "@org_golang_google_grpc//codes", "@org_golang_google_grpc//credentials", + "@org_golang_google_grpc//credentials/insecure", "@org_golang_google_grpc//status", "@org_golang_x_exp//slices", "@org_golang_x_sync//errgroup", @@ -245,7 +254,7 @@ go_library( go_test( name = "executor_test", - timeout = "moderate", + timeout = "short", srcs = [ "adapter_test.go", "admin_test.go", @@ -267,7 +276,6 @@ go_test( "delete_test.go", "distsql_test.go", "executor_failpoint_test.go", - "executor_issue_test.go", "executor_pkg_test.go", "executor_required_rows_test.go", "executor_test.go", @@ -277,6 +285,7 @@ go_test( "explainfor_test.go", "grant_test.go", "hash_table_test.go", + "historical_stats_test.go", "hot_regions_history_table_test.go", "index_advise_test.go", "index_lookup_join_test.go", @@ -319,6 +328,7 @@ go_test( "split_test.go", "stale_txn_test.go", "statement_context_test.go", + "stmtsummary_test.go", "table_readers_required_rows_test.go", "temporary_table_test.go", "tikv_regions_peers_table_test.go", @@ -328,7 +338,6 @@ go_test( "utils_test.go", "window_test.go", "write_concurrent_test.go", - "write_test.go", ], data = glob(["testdata/**"]), embed = [":executor"], @@ -356,7 +365,6 @@ go_test( "//parser", "//parser/ast", "//parser/auth", - "//parser/charset", "//parser/model", "//parser/mysql", "//parser/terror", @@ -370,6 +378,7 @@ go_test( "//sessionctx/binloginfo", "//sessionctx/stmtctx", "//sessionctx/variable", + "//sessionctx/variable/featuretag/distributereorg", "//sessiontxn", "//sessiontxn/staleread", "//statistics", @@ -409,9 +418,11 @@ go_test( "//util/pdapi", "//util/plancodec", "//util/ranger", + "//util/replayer", "//util/rowcodec", "//util/set", "//util/sqlexec", + "//util/stmtsummary/v2:stmtsummary", "//util/stringutil", "//util/tableutil", "//util/timeutil", diff --git a/executor/adapter.go b/executor/adapter.go index db9fbbaa929e0..7702f2e05875a 100644 --- a/executor/adapter.go +++ b/executor/adapter.go @@ -18,16 +18,17 @@ import ( "bytes" "context" "fmt" + "math" "runtime/trace" "strconv" "strings" "sync/atomic" "time" - "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/log" + "github.com/pingcap/tidb/bindinfo" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/domain" @@ -57,11 +58,14 @@ import ( "github.com/pingcap/tidb/util/mathutil" "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/plancodec" + "github.com/pingcap/tidb/util/replayer" "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tidb/util/stmtsummary" + stmtsummaryv2 "github.com/pingcap/tidb/util/stmtsummary/v2" "github.com/pingcap/tidb/util/stringutil" "github.com/pingcap/tidb/util/topsql" topsqlstate "github.com/pingcap/tidb/util/topsql/state" + "github.com/pingcap/tidb/util/tracing" "github.com/prometheus/client_golang/prometheus" tikverr "github.com/tikv/client-go/v2/error" "github.com/tikv/client-go/v2/oracle" @@ -78,6 +82,22 @@ var ( totalQueryProcHistogramInternal = metrics.TotalQueryProcHistogram.WithLabelValues(metrics.LblInternal) totalCopProcHistogramInternal = metrics.TotalCopProcHistogram.WithLabelValues(metrics.LblInternal) totalCopWaitHistogramInternal = metrics.TotalCopWaitHistogram.WithLabelValues(metrics.LblInternal) + + selectForUpdateFirstAttemptDuration = metrics.PessimisticDMLDurationByAttempt.WithLabelValues("select-for-update", "first-attempt") + selectForUpdateRetryDuration = metrics.PessimisticDMLDurationByAttempt.WithLabelValues("select-for-update", "retry") + dmlFirstAttemptDuration = metrics.PessimisticDMLDurationByAttempt.WithLabelValues("dml", "first-attempt") + dmlRetryDuration = metrics.PessimisticDMLDurationByAttempt.WithLabelValues("dml", "retry") + + // aggressiveLockingTxnUsedCount counts transactions where at least one statement has aggressive locking enabled. + aggressiveLockingTxnUsedCount = metrics.AggressiveLockingUsageCount.WithLabelValues(metrics.LblAggressiveLockingTxnUsed) + // aggressiveLockingStmtUsedCount counts statements that have aggressive locking enabled. + aggressiveLockingStmtUsedCount = metrics.AggressiveLockingUsageCount.WithLabelValues(metrics.LblAggressiveLockingStmtUsed) + // aggressiveLockingTxnUsedCount counts transactions where at least one statement has aggressive locking enabled, + // and it takes effect (which is determined according to whether lock-with-conflict has occurred during execution). + aggressiveLockingTxnEffectiveCount = metrics.AggressiveLockingUsageCount.WithLabelValues(metrics.LblAggressiveLockingTxnEffective) + // aggressiveLockingTxnUsedCount counts statements where at least one statement has aggressive locking enabled, + // and it takes effect (which is determined according to whether lock-with-conflict has occurred during execution). + aggressiveLockingStmtEffectiveCount = metrics.AggressiveLockingUsageCount.WithLabelValues(metrics.LblAggressiveLockingStmtEffective) ) // processinfoSetter is the interface use to set current running process info. @@ -194,10 +214,12 @@ type TelemetryInfo struct { UseNonRecursive bool UseRecursive bool UseMultiSchemaChange bool - UesExchangePartition bool + UseExchangePartition bool UseFlashbackToCluster bool PartitionTelemetry *PartitionTelemetryInfo AccountLockTelemetry *AccountLockTelemetryInfo + UseIndexMerge bool + UseTableLookUp bool } // PartitionTelemetryInfo records table partition telemetry information during execution. @@ -215,6 +237,8 @@ type PartitionTelemetryInfo struct { UseCreateIntervalPartition bool UseAddIntervalPartition bool UseDropIntervalPartition bool + UseCompactTablePartition bool + UseReorganizePartition bool } // AccountLockTelemetryInfo records account lock/unlock information during execution @@ -273,12 +297,12 @@ func (a *ExecStmt) GetStmtNode() ast.StmtNode { // PointGet short path for point exec directly from plan, keep only necessary steps func (a *ExecStmt) PointGet(ctx context.Context) (*recordSet, error) { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("ExecStmt.PointGet", opentracing.ChildOf(span.Context())) - span1.LogKV("sql", a.OriginText()) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) + r, ctx := tracing.StartRegionEx(ctx, "ExecStmt.PointGet") + defer r.End() + if r.Span != nil { + r.Span.LogKV("sql", a.OriginText()) } + failpoint.Inject("assertTxnManagerInShortPointGetPlan", func() { sessiontxn.RecordAssert(a.Ctx, "assertTxnManagerInShortPointGetPlan", true) // stale read should not reach here @@ -293,8 +317,12 @@ func (a *ExecStmt) PointGet(ctx context.Context) (*recordSet, error) { } a.Ctx.GetSessionVars().StmtCtx.Priority = kv.PriorityHigh + var pointExecutor *PointGetExecutor + useMaxTS := startTs == math.MaxUint64 + // try to reuse point get executor - if a.PsStmt.Executor != nil { + // We should only use the cached the executor when the startTS is MaxUint64 + if a.PsStmt.Executor != nil && useMaxTS { exec, ok := a.PsStmt.Executor.(*PointGetExecutor) if !ok { logutil.Logger(ctx).Error("invalid executor type, not PointGetExecutor for point get path") @@ -304,17 +332,21 @@ func (a *ExecStmt) PointGet(ctx context.Context) (*recordSet, error) { pointGetPlan := a.PsStmt.PreparedAst.CachedPlan.(*plannercore.PointGetPlan) exec.Init(pointGetPlan) a.PsStmt.Executor = exec + pointExecutor = exec } } - if a.PsStmt.Executor == nil { + + if pointExecutor == nil { b := newExecutorBuilder(a.Ctx, a.InfoSchema, a.Ti) - newExecutor := b.build(a.Plan) + pointExecutor = b.build(a.Plan).(*PointGetExecutor) if b.err != nil { return nil, b.err } - a.PsStmt.Executor = newExecutor + + if useMaxTS { + a.PsStmt.Executor = pointExecutor + } } - pointExecutor := a.PsStmt.Executor.(*PointGetExecutor) if err = pointExecutor.Open(ctx); err != nil { terror.Call(pointExecutor.Close) @@ -432,6 +464,18 @@ func (a *ExecStmt) Exec(ctx context.Context) (_ sqlexec.RecordSet, err error) { if lockKeysCnt > 0 { metrics.StatementLockKeysCount.Observe(float64(lockKeysCnt)) } + + execDetails := a.Ctx.GetSessionVars().StmtCtx.GetExecDetails() + if err == nil && execDetails.LockKeysDetail != nil && + (execDetails.LockKeysDetail.AggressiveLockNewCount > 0 || execDetails.LockKeysDetail.AggressiveLockDerivedCount > 0) { + a.Ctx.GetSessionVars().TxnCtx.AggressiveLockingUsed = true + // If this statement is finished when some of the keys are locked with conflict in the last retry, or + // some of the keys are derived from the previous retry, we consider the optimization of aggressive locking + // takes effect on this statement. + if execDetails.LockKeysDetail.LockedWithConflictCount > 0 || execDetails.LockKeysDetail.AggressiveLockDerivedCount > 0 { + a.Ctx.GetSessionVars().TxnCtx.AggressiveLockingEffective = true + } + } return } if str, ok := r.(string); !ok || !strings.Contains(str, memory.PanicMemoryExceed) { @@ -467,8 +511,20 @@ func (a *ExecStmt) Exec(ctx context.Context) (_ sqlexec.RecordSet, err error) { if !ok { oriIso = "REPEATABLE-READ" } - terror.Log(sctx.GetSessionVars().SetSystemVar(variable.TiDBBuildStatsConcurrency, "1")) - sctx.GetSessionVars().SetDistSQLScanConcurrency(1) + autoConcurrency, err1 := sctx.GetSessionVars().GetSessionOrGlobalSystemVar(ctx, variable.TiDBAutoBuildStatsConcurrency) + terror.Log(err1) + if err1 == nil { + terror.Log(sctx.GetSessionVars().SetSystemVar(variable.TiDBBuildStatsConcurrency, autoConcurrency)) + } + sVal, err2 := sctx.GetSessionVars().GetSessionOrGlobalSystemVar(ctx, variable.TiDBSysProcScanConcurrency) + terror.Log(err2) + if err2 == nil { + concurrency, err3 := strconv.ParseInt(sVal, 10, 64) + terror.Log(err3) + if err3 == nil { + sctx.GetSessionVars().SetDistSQLScanConcurrency(int(concurrency)) + } + } sctx.GetSessionVars().SetIndexSerialScanConcurrency(1) terror.Log(sctx.GetSessionVars().SetSystemVar(variable.TxnIsolation, ast.ReadCommitted)) defer func() { @@ -568,7 +624,7 @@ func (a *ExecStmt) handleStmtForeignKeyTrigger(ctx context.Context, e Executor) // change first. // Since `UnionScanExec` use `SnapshotIter` and `SnapshotGetter` to read txn mem-buffer, if we don't do `StmtCommit`, // then the fk cascade executor can't read the mem-buffer changed by the ExecStmt. - a.Ctx.StmtCommit() + a.Ctx.StmtCommit(ctx) } err := a.handleForeignKeyTrigger(ctx, e, 1) if err != nil { @@ -591,10 +647,6 @@ func (a *ExecStmt) handleForeignKeyTrigger(ctx context.Context, e Executor, dept if !ok { return nil } - a.Ctx.GetSessionVars().StmtCtx.InHandleForeignKeyTrigger = true - defer func() { - a.Ctx.GetSessionVars().StmtCtx.InHandleForeignKeyTrigger = false - }() fkChecks := exec.GetFKChecks() for _, fkCheck := range fkChecks { err := fkCheck.doCheck(ctx) @@ -624,12 +676,26 @@ func (a *ExecStmt) handleForeignKeyTrigger(ctx context.Context, e Executor, dept // 4. `StmtCommit` to commit the kv change to transaction mem-buffer. // 5. If the foreign key cascade behaviour has more fk value need to be cascaded, go to step 1. func (a *ExecStmt) handleForeignKeyCascade(ctx context.Context, fkc *FKCascadeExec, depth int) error { + if a.Ctx.GetSessionVars().StmtCtx.RuntimeStatsColl != nil { + fkc.stats = &FKCascadeRuntimeStats{} + defer a.Ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(fkc.plan.ID(), fkc.stats) + } if len(fkc.fkValues) == 0 && len(fkc.fkUpdatedValuesMap) == 0 { return nil } if depth > maxForeignKeyCascadeDepth { return ErrForeignKeyCascadeDepthExceeded.GenWithStackByArgs(maxForeignKeyCascadeDepth) } + a.Ctx.GetSessionVars().StmtCtx.InHandleForeignKeyTrigger = true + defer func() { + a.Ctx.GetSessionVars().StmtCtx.InHandleForeignKeyTrigger = false + }() + if fkc.stats != nil { + start := time.Now() + defer func() { + fkc.stats.Total += time.Since(start) + }() + } for { e, err := fkc.buildExecutor(ctx) if err != nil || e == nil { @@ -649,7 +715,7 @@ func (a *ExecStmt) handleForeignKeyCascade(ctx context.Context, fkc *FKCascadeEx } // Call `StmtCommit` uses to flush the fk cascade executor change into txn mem-buffer, // then the later fk cascade executors can see the mem-buffer changes. - a.Ctx.StmtCommit() + a.Ctx.StmtCommit(ctx) err = a.handleForeignKeyTrigger(ctx, e, depth+1) if err != nil { return err @@ -823,8 +889,25 @@ func (a *ExecStmt) handlePessimisticSelectForUpdate(ctx context.Context, e Execu return nil, errors.New("can not execute write statement when 'tidb_snapshot' is set") } + txnManager := sessiontxn.GetTxnManager(a.Ctx) + err := txnManager.OnHandlePessimisticStmtStart(ctx) + if err != nil { + return nil, err + } + + isFirstAttempt := true + for { + startTime := time.Now() rs, err := a.runPessimisticSelectForUpdate(ctx, e) + + if isFirstAttempt { + selectForUpdateFirstAttemptDuration.Observe(time.Since(startTime).Seconds()) + isFirstAttempt = false + } else { + selectForUpdateRetryDuration.Observe(time.Since(startTime).Seconds()) + } + e, err = a.handlePessimisticLockError(ctx, err) if err != nil { return nil, err @@ -832,6 +915,8 @@ func (a *ExecStmt) handlePessimisticSelectForUpdate(ctx context.Context, e Execu if e == nil { return rs, nil } + + failpoint.Inject("pessimisticSelectForUpdateRetry", nil) } } @@ -862,11 +947,8 @@ func (a *ExecStmt) runPessimisticSelectForUpdate(ctx context.Context, e Executor func (a *ExecStmt) handleNoDelayExecutor(ctx context.Context, e Executor) (sqlexec.RecordSet, error) { sctx := a.Ctx - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("executor.handleNoDelayExecutor", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } + r, ctx := tracing.StartRegionEx(ctx, "executor.handleNoDelayExecutor") + defer r.End() var err error defer func() { @@ -927,18 +1009,39 @@ func (a *ExecStmt) handlePessimisticDML(ctx context.Context, e Executor) (err er err = ErrLazyUniquenessCheckFailure.GenWithStackByArgs(err.Error()) } }() + + txnManager := sessiontxn.GetTxnManager(a.Ctx) + err = txnManager.OnHandlePessimisticStmtStart(ctx) + if err != nil { + return err + } + + isFirstAttempt := true + for { - startPointGetLocking := time.Now() + if !isFirstAttempt { + failpoint.Inject("pessimisticDMLRetry", nil) + } + + startTime := time.Now() _, err = a.handleNoDelayExecutor(ctx, e) if !txn.Valid() { return err } + + if isFirstAttempt { + dmlFirstAttemptDuration.Observe(time.Since(startTime).Seconds()) + isFirstAttempt = false + } else { + dmlRetryDuration.Observe(time.Since(startTime).Seconds()) + } + if err != nil { // It is possible the DML has point get plan that locks the key. e, err = a.handlePessimisticLockError(ctx, err) if err != nil { if ErrDeadlock.Equal(err) { - metrics.StatementDeadlockDetectDuration.Observe(time.Since(startPointGetLocking).Seconds()) + metrics.StatementDeadlockDetectDuration.Observe(time.Since(startTime).Seconds()) } return err } @@ -1036,7 +1139,7 @@ func (a *ExecStmt) handlePessimisticLockError(ctx context.Context, lockErr error return nil, err } // Rollback the statement change before retry it. - a.Ctx.StmtRollback() + a.Ctx.StmtRollback(ctx, true) a.Ctx.GetSessionVars().StmtCtx.ResetForRetry() a.Ctx.GetSessionVars().RetryInfo.ResetOffset() @@ -1332,6 +1435,8 @@ func (a *ExecStmt) observePhaseDurations(internal bool, commitDetails *util.Comm // 4. update the `PrevStmt` in session variable. // 5. reset `DurationParse` in session variable. func (a *ExecStmt) FinishExecuteStmt(txnTS uint64, err error, hasMoreResults bool) { + a.checkPlanReplayerCapture(txnTS) + sessVars := a.Ctx.GetSessionVars() execDetail := sessVars.StmtCtx.GetExecDetails() // Attach commit/lockKeys runtime stats to executor runtime stats. @@ -1383,10 +1488,53 @@ func (a *ExecStmt) FinishExecuteStmt(txnTS uint64, err error, hasMoreResults boo sessVars.DurationParse = 0 // Clean the stale read flag when statement execution finish sessVars.StmtCtx.IsStaleness = false + // Clean the MPP query info + sessVars.StmtCtx.MPPQueryInfo.QueryID.Store(0) + sessVars.StmtCtx.MPPQueryInfo.QueryTS.Store(0) + sessVars.StmtCtx.MPPQueryInfo.AllocatedMPPTaskID.Store(0) if sessVars.StmtCtx.ReadFromTableCache { metrics.ReadFromTableCacheCounter.Inc() } + + // Update aggressive locking related counters by stmt + if execDetail.LockKeysDetail != nil { + if execDetail.LockKeysDetail.AggressiveLockNewCount > 0 || execDetail.LockKeysDetail.AggressiveLockDerivedCount > 0 { + aggressiveLockingStmtUsedCount.Inc() + // If this statement is finished when some of the keys are locked with conflict in the last retry, or + // some of the keys are derived from the previous retry, we consider the optimization of aggressive locking + // takes effect on this statement. + if execDetail.LockKeysDetail.LockedWithConflictCount > 0 || execDetail.LockKeysDetail.AggressiveLockDerivedCount > 0 { + aggressiveLockingStmtEffectiveCount.Inc() + } + } + } + // If the transaction is committed, update aggressive locking related counters by txn + if execDetail.CommitDetail != nil { + if sessVars.TxnCtx.AggressiveLockingUsed { + aggressiveLockingTxnUsedCount.Inc() + } + if sessVars.TxnCtx.AggressiveLockingEffective { + aggressiveLockingTxnEffectiveCount.Inc() + } + } +} + +func (a *ExecStmt) checkPlanReplayerCapture(txnTS uint64) { + if kv.GetInternalSourceType(a.GoCtx) == kv.InternalTxnStats { + return + } + se := a.Ctx + if !se.GetSessionVars().InRestrictedSQL && se.GetSessionVars().IsPlanReplayerCaptureEnabled() { + stmtNode := a.GetStmtNode() + if se.GetSessionVars().EnablePlanReplayedContinuesCapture { + if checkPlanReplayerContinuesCaptureValidStmt(stmtNode) { + checkPlanReplayerContinuesCapture(se, stmtNode, txnTS) + } + } else { + checkPlanReplayerCaptureTask(se, stmtNode, txnTS) + } + } } // CloseRecordSet will finish the execution of current statement and do some record work @@ -1503,6 +1651,7 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { IsWriteCacheTable: stmtCtx.WaitLockLeaseTime > 0, StatsLoadStatus: convertStatusIntoString(a.Ctx, stmtCtx.StatsLoadStatus), IsSyncStatsFailed: stmtCtx.IsSyncStatsFailed, + Warnings: collectWarningsForSlowLog(stmtCtx), } failpoint.Inject("assertSyncStatsFailed", func(val failpoint.Value) { if val.(bool) { @@ -1514,7 +1663,7 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { if a.retryCount > 0 { slowItems.ExecRetryTime = costTime - sessVars.DurationParse - sessVars.DurationCompile - time.Since(a.retryStartTime) } - if _, ok := a.StmtNode.(*ast.CommitStmt); ok { + if _, ok := a.StmtNode.(*ast.CommitStmt); ok && sessVars.PrevStmt != nil { slowItems.PrevStmt = sessVars.PrevStmt.String() } slowLog := sessVars.SlowLogFormat(slowItems) @@ -1558,6 +1707,33 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { } } +func extractMsgFromSQLWarn(SQLWarn *stmtctx.SQLWarn) string { + // Currently, this function is only used in collectWarningsForSlowLog. + // collectWarningsForSlowLog can make sure SQLWarn is not nil so no need to add a nil check here. + warn := errors.Cause(SQLWarn.Err) + if x, ok := warn.(*terror.Error); ok && x != nil { + sqlErr := terror.ToSQLError(x) + return sqlErr.Message + } + return warn.Error() +} + +func collectWarningsForSlowLog(stmtCtx *stmtctx.StatementContext) []variable.JSONSQLWarnForSlowLog { + warnings := stmtCtx.GetWarnings() + extraWarnings := stmtCtx.GetExtraWarnings() + res := make([]variable.JSONSQLWarnForSlowLog, len(warnings)+len(extraWarnings)) + for i := range warnings { + res[i].Level = warnings[i].Level + res[i].Message = extractMsgFromSQLWarn(&warnings[i]) + } + for i := range extraWarnings { + res[len(warnings)+i].Level = extraWarnings[i].Level + res[len(warnings)+i].Message = extractMsgFromSQLWarn(&extraWarnings[i]) + res[len(warnings)+i].IsExtra = true + } + return res +} + // GetResultRowsCount gets the count of the statement result rows. func GetResultRowsCount(stmtCtx *stmtctx.StatementContext, p plannercore.Plan) int64 { runtimeStatsColl := stmtCtx.RuntimeStatsColl @@ -1629,6 +1805,11 @@ func getPlanDigest(stmtCtx *stmtctx.StatementContext) (string, *parser.Digest) { return normalized, planDigest } +// GetEncodedPlan returned same as getEncodedPlan +func GetEncodedPlan(stmtCtx *stmtctx.StatementContext, genHint bool) (encodedPlan, hintStr string) { + return getEncodedPlan(stmtCtx, genHint) +} + // getEncodedPlan gets the encoded plan, and generates the hint string if indicated. func getEncodedPlan(stmtCtx *stmtctx.StatementContext, genHint bool) (encodedPlan, hintStr string) { var hintSet bool @@ -1670,7 +1851,7 @@ func (a *ExecStmt) SummaryStmt(succ bool) { } // Internal SQLs must also be recorded to keep the consistency of `PrevStmt` and `PrevStmtDigest`. - if !stmtsummary.StmtSummaryByDigestMap.Enabled() || ((sessVars.InRestrictedSQL || len(userString) == 0) && !stmtsummary.StmtSummaryByDigestMap.EnabledInternal()) { + if !stmtsummaryv2.Enabled() || ((sessVars.InRestrictedSQL || len(userString) == 0) && !stmtsummaryv2.EnabledInternal()) { sessVars.SetPrevStmtDigest("") return } @@ -1787,7 +1968,7 @@ func (a *ExecStmt) SummaryStmt(succ bool) { if a.retryCount > 0 { stmtExecInfo.ExecRetryTime = costTime - sessVars.DurationParse - sessVars.DurationCompile - time.Since(a.retryStartTime) } - stmtsummary.StmtSummaryByDigestMap.AddStatement(stmtExecInfo) + stmtsummaryv2.Add(stmtExecInfo) } // GetTextToLog return the query text to log. @@ -1873,7 +2054,6 @@ func (a *ExecStmt) getSQLPlanDigest() ([]byte, []byte) { } return sqlDigest, planDigest } - func convertStatusIntoString(sctx sessionctx.Context, statsLoadStatus map[model.TableItemID]string) map[string]map[string]string { if len(statsLoadStatus) < 1 { return nil @@ -1911,3 +2091,92 @@ func convertStatusIntoString(sctx sessionctx.Context, statsLoadStatus map[model. } return r } + +// only allow select/delete/update/insert/execute stmt captured by continues capture +func checkPlanReplayerContinuesCaptureValidStmt(stmtNode ast.StmtNode) bool { + switch stmtNode.(type) { + case *ast.SelectStmt, *ast.DeleteStmt, *ast.UpdateStmt, *ast.InsertStmt, *ast.ExecuteStmt: + return true + default: + return false + } +} + +func checkPlanReplayerCaptureTask(sctx sessionctx.Context, stmtNode ast.StmtNode, startTS uint64) { + dom := domain.GetDomain(sctx) + if dom == nil { + return + } + handle := dom.GetPlanReplayerHandle() + if handle == nil { + return + } + tasks := handle.GetTasks() + if len(tasks) == 0 { + return + } + _, sqlDigest := sctx.GetSessionVars().StmtCtx.SQLDigest() + _, planDigest := sctx.GetSessionVars().StmtCtx.GetPlanDigest() + if sqlDigest == nil || planDigest == nil { + return + } + key := replayer.PlanReplayerTaskKey{ + SQLDigest: sqlDigest.String(), + PlanDigest: planDigest.String(), + } + for _, task := range tasks { + if task.SQLDigest == sqlDigest.String() { + if task.PlanDigest == "*" || task.PlanDigest == planDigest.String() { + sendPlanReplayerDumpTask(key, sctx, stmtNode, startTS, false) + return + } + } + } +} + +func checkPlanReplayerContinuesCapture(sctx sessionctx.Context, stmtNode ast.StmtNode, startTS uint64) { + dom := domain.GetDomain(sctx) + if dom == nil { + return + } + handle := dom.GetPlanReplayerHandle() + if handle == nil { + return + } + _, sqlDigest := sctx.GetSessionVars().StmtCtx.SQLDigest() + _, planDigest := sctx.GetSessionVars().StmtCtx.GetPlanDigest() + key := replayer.PlanReplayerTaskKey{ + SQLDigest: sqlDigest.String(), + PlanDigest: planDigest.String(), + } + existed := sctx.GetSessionVars().CheckPlanReplayerFinishedTaskKey(key) + if existed { + return + } + sendPlanReplayerDumpTask(key, sctx, stmtNode, startTS, true) + sctx.GetSessionVars().AddPlanReplayerFinishedTaskKey(key) +} + +func sendPlanReplayerDumpTask(key replayer.PlanReplayerTaskKey, sctx sessionctx.Context, stmtNode ast.StmtNode, + startTS uint64, isContinuesCapture bool) { + stmtCtx := sctx.GetSessionVars().StmtCtx + handle := sctx.Value(bindinfo.SessionBindInfoKeyType).(*bindinfo.SessionHandle) + dumpTask := &domain.PlanReplayerDumpTask{ + PlanReplayerTaskKey: key, + StartTS: startTS, + TblStats: stmtCtx.TableStats, + SessionBindings: handle.GetAllBindRecord(), + SessionVars: sctx.GetSessionVars(), + ExecStmts: []ast.StmtNode{stmtNode}, + Analyze: false, + IsCapture: true, + IsContinuesCapture: isContinuesCapture, + } + dumpTask.EncodedPlan, _ = GetEncodedPlan(stmtCtx, false) + if _, ok := stmtNode.(*ast.ExecuteStmt); ok { + nsql, _ := sctx.GetSessionVars().StmtCtx.SQLDigest() + dumpTask.InExecute = true + dumpTask.NormalizedSQL = nsql + } + domain.GetDomain(sctx).GetPlanReplayerHandle().SendTask(dumpTask) +} diff --git a/executor/admin.go b/executor/admin.go index 1a0f5579281cc..33088c234d7e2 100644 --- a/executor/admin.go +++ b/executor/admin.go @@ -21,6 +21,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/tidb/distsql" + "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/ast" @@ -163,7 +164,7 @@ func (e *CheckIndexRangeExec) constructIndexScanPB() *tipb.Executor { idxExec := &tipb.IndexScan{ TableId: e.table.ID, IndexId: e.index.ID, - Columns: util.ColumnsToProto(e.cols, e.table.PKIsHandle), + Columns: util.ColumnsToProto(e.cols, e.table.PKIsHandle, true), } return &tipb.Executor{Tp: tipb.ExecType_TypeIndexScan, IdxScan: idxExec} } @@ -191,6 +192,9 @@ type RecoverIndexExec struct { srcChunk *chunk.Chunk handleCols plannercore.HandleCols + containsGenedCol bool + cols []*expression.Column + // below buf is used to reduce allocations. recoverRows []recoverRows idxValsBufs [][]types.Datum @@ -265,10 +269,11 @@ func (e *RecoverIndexExec) buildTableScan(ctx context.Context, txn kv.Transactio return nil, err } var builder distsql.RequestBuilder - builder.KeyRanges, err = buildRecoverIndexKeyRanges(e.ctx.GetSessionVars().StmtCtx, e.physicalID, startHandle) + keyRanges, err := buildRecoverIndexKeyRanges(e.ctx.GetSessionVars().StmtCtx, e.physicalID, startHandle) if err != nil { return nil, err } + builder.KeyRanges = kv.NewNonParitionedKeyRanges(keyRanges) kvReq, err := builder. SetDAGRequest(dagPB). SetStartTS(txn.StartTS()). @@ -378,10 +383,13 @@ func (e *RecoverIndexExec) fetchRecoverRows(ctx context.Context, srcResult dists if err != nil { return nil, err } - idxVals := extractIdxVals(row, e.idxValsBufs[result.scanRowCount], e.colFieldTypes, idxValLen) + idxVals, err := e.buildIndexedValues(row, e.idxValsBufs[result.scanRowCount], e.colFieldTypes, idxValLen) + if err != nil { + return nil, err + } e.idxValsBufs[result.scanRowCount] = idxVals rsData := tables.TryGetHandleRestoredDataWrapper(e.table.Meta(), plannercore.GetCommonHandleDatum(e.handleCols, row), nil, e.index.Meta()) - e.recoverRows = append(e.recoverRows, recoverRows{handle: handle, idxVals: idxVals, rsData: rsData, skip: false}) + e.recoverRows = append(e.recoverRows, recoverRows{handle: handle, idxVals: idxVals, rsData: rsData, skip: true}) result.scanRowCount++ result.currentHandle = handle } @@ -390,22 +398,71 @@ func (e *RecoverIndexExec) fetchRecoverRows(ctx context.Context, srcResult dists return e.recoverRows, nil } +func (e *RecoverIndexExec) buildIndexedValues(row chunk.Row, idxVals []types.Datum, fieldTypes []*types.FieldType, idxValLen int) ([]types.Datum, error) { + if !e.containsGenedCol { + return extractIdxVals(row, idxVals, fieldTypes, idxValLen), nil + } + + if e.cols == nil { + columns, _, err := expression.ColumnInfos2ColumnsAndNames(e.ctx, model.NewCIStr("mock"), e.table.Meta().Name, e.table.Meta().Columns, e.table.Meta()) + if err != nil { + return nil, err + } + e.cols = columns + } + + if cap(idxVals) < idxValLen { + idxVals = make([]types.Datum, idxValLen) + } else { + idxVals = idxVals[:idxValLen] + } + + for i, col := range e.index.Meta().Columns { + if e.table.Meta().Columns[col.Offset].IsGenerated() { + val, err := e.cols[col.Offset].EvalVirtualColumn(row) + if err != nil { + return nil, err + } + val.Copy(&idxVals[i]) + } else { + val := row.GetDatum(col.Offset, &(e.table.Meta().Columns[col.Offset].FieldType)) + val.Copy(&idxVals[i]) + } + } + return idxVals, nil +} + func (e *RecoverIndexExec) batchMarkDup(txn kv.Transaction, rows []recoverRows) error { if len(rows) == 0 { return nil } e.batchKeys = e.batchKeys[:0] sc := e.ctx.GetSessionVars().StmtCtx - distinctFlags := make([]bool, len(rows)) + distinctFlags := make([]bool, 0, len(rows)) + rowIdx := make([]int, 0, len(rows)) + cnt := 0 for i, row := range rows { - idxKey, distinct, err := e.index.GenIndexKey(sc, row.idxVals, row.handle, e.idxKeyBufs[i]) - if err != nil { - return err - } - e.idxKeyBufs[i] = idxKey + iter := e.index.GenIndexKVIter(sc, row.idxVals, row.handle, nil) + for iter.Valid() { + var buf []byte + if cnt < len(e.idxKeyBufs) { + buf = e.idxKeyBufs[cnt] + } + key, _, distinct, err := iter.Next(buf) + if err != nil { + return err + } + if cnt < len(e.idxKeyBufs) { + e.idxKeyBufs[cnt] = key + } else { + e.idxKeyBufs = append(e.idxKeyBufs, key) + } - e.batchKeys = append(e.batchKeys, idxKey) - distinctFlags[i] = distinct + cnt++ + e.batchKeys = append(e.batchKeys, key) + distinctFlags = append(distinctFlags, distinct) + rowIdx = append(rowIdx, i) + } } values, err := txn.BatchGet(context.Background(), e.batchKeys) @@ -418,21 +475,22 @@ func (e *RecoverIndexExec) batchMarkDup(txn kv.Transaction, rows []recoverRows) // 3. non-unique-key is duplicate, skip it. isCommonHandle := e.table.Meta().IsCommonHandle for i, key := range e.batchKeys { - if val, found := values[string(key)]; found { + val, found := values[string(key)] + if found { if distinctFlags[i] { handle, err1 := tablecodec.DecodeHandleInUniqueIndexValue(val, isCommonHandle) if err1 != nil { return err1 } - if handle.Compare(rows[i].handle) != 0 { + if handle.Compare(rows[rowIdx[i]].handle) != 0 { logutil.BgLogger().Warn("recover index: the constraint of unique index is broken, handle in index is not equal to handle in table", zap.String("index", e.index.Meta().Name.O), zap.ByteString("indexKey", key), - zap.Stringer("handleInTable", rows[i].handle), zap.Stringer("handleInIndex", handle)) + zap.Stringer("handleInTable", rows[rowIdx[i]].handle), zap.Stringer("handleInIndex", handle)) } } - rows[i].skip = true } + rows[rowIdx[i]].skip = found && rows[rowIdx[i]].skip } return nil } @@ -550,7 +608,7 @@ func (e *CleanupIndexExec) getIdxColTypes() []*types.FieldType { } e.idxColFieldTypes = make([]*types.FieldType, 0, len(e.columns)) for _, col := range e.columns { - e.idxColFieldTypes = append(e.idxColFieldTypes, &col.FieldType) + e.idxColFieldTypes = append(e.idxColFieldTypes, col.FieldType.ArrayType()) } return e.idxColFieldTypes } @@ -737,7 +795,16 @@ func (e *CleanupIndexExec) buildIndexScan(ctx context.Context, txn kv.Transactio sc := e.ctx.GetSessionVars().StmtCtx var builder distsql.RequestBuilder ranges := ranger.FullRange() - kvReq, err := builder.SetIndexRanges(sc, e.physicalID, e.index.Meta().ID, ranges). + keyRanges, err := distsql.IndexRangesToKVRanges(sc, e.physicalID, e.index.Meta().ID, ranges, nil) + if err != nil { + return nil, err + } + err = keyRanges.SetToNonPartitioned() + if err != nil { + return nil, err + } + keyRanges.FirstPartitionRange()[0].StartKey = kv.Key(e.lastIdxKey).PrefixNext() + kvReq, err := builder.SetWrappedKeyRanges(keyRanges). SetDAGRequest(dagPB). SetStartTS(txn.StartTS()). SetKeepOrder(true). @@ -748,7 +815,6 @@ func (e *CleanupIndexExec) buildIndexScan(ctx context.Context, txn kv.Transactio return nil, err } - kvReq.KeyRanges[0].StartKey = kv.Key(e.lastIdxKey).PrefixNext() kvReq.Concurrency = 1 result, err := distsql.Select(ctx, e.ctx, kvReq, e.getIdxColTypes(), statistics.NewQueryFeedback(0, nil, 0, false)) if err != nil { @@ -805,7 +871,7 @@ func (e *CleanupIndexExec) constructIndexScanPB() *tipb.Executor { idxExec := &tipb.IndexScan{ TableId: e.physicalID, IndexId: e.index.Meta().ID, - Columns: util.ColumnsToProto(e.columns, e.table.Meta().PKIsHandle), + Columns: util.ColumnsToProto(e.columns, e.table.Meta().PKIsHandle, true), PrimaryColumnIds: tables.TryGetCommonPkColumnIds(e.table.Meta()), } return &tipb.Executor{Tp: tipb.ExecType_TypeIndexScan, IdxScan: idxExec} diff --git a/executor/admin_test.go b/executor/admin_test.go index 23b57e9c316b6..b60c2d44ca2f1 100644 --- a/executor/admin_test.go +++ b/executor/admin_test.go @@ -133,7 +133,7 @@ func TestAdminCheckIndexInLocalTemporaryMode(t *testing.T) { tk.MustExec("drop table if exists local_temporary_admin_test;") tk.MustExec("create temporary table local_temporary_admin_test (c1 int, c2 int, c3 int default 1, primary key (c1), index (c1), unique key(c2))") tk.MustExec("insert local_temporary_admin_test (c1, c2) values (1,1), (2,2), (3,3);") - _, err := tk.Exec("admin check table local_temporary_admin_test;") + err := tk.ExecToErr("admin check table local_temporary_admin_test;") require.EqualError(t, err, core.ErrOptOnTemporaryTable.GenWithStackByArgs("admin check table").Error()) tk.MustExec("drop table if exists temporary_admin_test;") @@ -302,6 +302,131 @@ func TestAdminRecoverIndex(t *testing.T) { tk.MustExec("admin check index admin_test c2") tk.MustExec("admin check table admin_test") + + tk.MustExec("drop table if exists admin_test") + tk.MustExec("create table admin_test (c1 int, c2 int, c3 int default 1, primary key(c1), unique key i1((c2+1)))") + tk.MustExec("insert admin_test (c1, c2) values (1, 1), (2, 2), (3, 3), (10, 10), (20, 20)") + r = tk.MustQuery("admin recover index admin_test i1") + r.Check(testkit.Rows("0 5")) + tk.MustExec("admin check table admin_test") + ctx = mock.NewContext() + ctx.Store = store + is = domain.InfoSchema() + dbName = model.NewCIStr("test") + tblName = model.NewCIStr("admin_test") + tbl, err = is.TableByName(dbName, tblName) + require.NoError(t, err) + + tblInfo = tbl.Meta() + idxInfo = tblInfo.FindIndexByName("i1") + indexOpr = tables.NewIndex(tblInfo.ID, tblInfo, idxInfo) + sc = ctx.GetSessionVars().StmtCtx + txn, err = store.Begin() + require.NoError(t, err) + err = indexOpr.Delete(sc, txn, types.MakeDatums(2), kv.IntHandle(1)) + require.NoError(t, err) + err = txn.Commit(context.Background()) + require.NoError(t, err) + r = tk.MustQuery("SELECT COUNT(*) FROM admin_test USE INDEX(i1)") + r.Check(testkit.Rows("4")) + err = tk.ExecToErr("admin check table admin_test") + require.Error(t, err) + r = tk.MustQuery("admin recover index admin_test i1") + r.Check(testkit.Rows("1 5")) + tk.MustExec("admin check table admin_test") + + tk.MustExec("drop table if exists admin_test") + tk.MustExec("create table admin_test (c1 int, c2 int, c3 int default 1, primary key(c1), unique key i1(c1, c2));") + tk.MustExec("insert admin_test (c1, c2) values (1, 1), (2, 2), (3, 3), (10, 10), (20, 20);") + tk.MustExec("admin recover index admin_test i1;") +} + +func TestAdminRecoverMVIndex(t *testing.T) { + store, domain := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(pk int primary key, a json, index idx((cast(a as signed array))))") + tk.MustExec("insert into t values (0, '[0,1,2]')") + tk.MustExec("insert into t values (1, '[1,2,3]')") + tk.MustExec("insert into t values (2, '[2,3,4]')") + tk.MustExec("insert into t values (3, '[3,4,5]')") + tk.MustExec("insert into t values (4, '[4,5,6]')") + tk.MustExec("admin check table t") + + ctx := mock.NewContext() + ctx.Store = store + is := domain.InfoSchema() + dbName := model.NewCIStr("test") + tblName := model.NewCIStr("t") + tbl, err := is.TableByName(dbName, tblName) + require.NoError(t, err) + tblInfo := tbl.Meta() + idxInfo := tblInfo.Indices[0] + tk.Session().GetSessionVars().IndexLookupSize = 3 + tk.Session().GetSessionVars().MaxChunkSize = 3 + + cpIdx := idxInfo.Clone() + cpIdx.MVIndex = false + indexOpr := tables.NewIndex(tblInfo.ID, tblInfo, cpIdx) + + txn, err := store.Begin() + require.NoError(t, err) + err = indexOpr.Delete(ctx.GetSessionVars().StmtCtx, txn, types.MakeDatums(2), kv.IntHandle(1)) + require.NoError(t, err) + err = txn.Commit(context.Background()) + require.NoError(t, err) + err = tk.ExecToErr("admin check table t") + require.Error(t, err) + r := tk.MustQuery("admin recover index t idx") + r.Check(testkit.Rows("1 5")) + tk.MustExec("admin check table t") +} + +func TestAdminCleanupMVIndex(t *testing.T) { + store, domain := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(pk int primary key, a json, index idx((cast(a as signed array))))") + tk.MustExec("insert into t values (0, '[0,1,2]')") + tk.MustExec("insert into t values (1, '[1,2,3]')") + tk.MustExec("insert into t values (2, '[2,3,4]')") + tk.MustExec("insert into t values (3, '[3,4,5]')") + tk.MustExec("insert into t values (4, '[4,5,6]')") + tk.MustExec("admin check table t") + + // Make some corrupted index. Build the index information. + ctx := mock.NewContext() + ctx.Store = store + is := domain.InfoSchema() + dbName := model.NewCIStr("test") + tblName := model.NewCIStr("t") + tbl, err := is.TableByName(dbName, tblName) + require.NoError(t, err) + tblInfo := tbl.Meta() + idxInfo := tblInfo.Indices[0] + tk.Session().GetSessionVars().IndexLookupSize = 3 + tk.Session().GetSessionVars().MaxChunkSize = 3 + + cpIdx := idxInfo.Clone() + cpIdx.MVIndex = false + indexOpr := tables.NewIndex(tblInfo.ID, tblInfo, cpIdx) + + txn, err := store.Begin() + require.NoError(t, err) + _, err = indexOpr.Create(ctx, txn, types.MakeDatums(9), kv.IntHandle(9), nil) + require.NoError(t, err) + err = txn.Commit(context.Background()) + require.NoError(t, err) + err = tk.ExecToErr("admin check table t") + require.Error(t, err) + + r := tk.MustQuery("admin cleanup index t idx") + r.Check(testkit.Rows("1")) + tk.MustExec("admin check table t") } func TestClusteredIndexAdminRecoverIndex(t *testing.T) { @@ -843,6 +968,65 @@ func TestClusteredAdminCleanupIndex(t *testing.T) { tk.MustExec("admin check table admin_test") } +func TestAdminCheckTableWithMultiValuedIndex(t *testing.T) { + store, domain := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(pk int primary key, a json, index idx((cast(a as signed array))))") + tk.MustExec("insert into t values (0, '[0,1,2]')") + tk.MustExec("insert into t values (1, '[1,2,3]')") + tk.MustExec("insert into t values (2, '[2,3,4]')") + tk.MustExec("insert into t values (3, '[3,4,5]')") + tk.MustExec("insert into t values (4, '[4,5,6]')") + tk.MustExec("admin check table t") + + // Make some corrupted index. Build the index information. + ctx := mock.NewContext() + ctx.Store = store + is := domain.InfoSchema() + dbName := model.NewCIStr("test") + tblName := model.NewCIStr("t") + tbl, err := is.TableByName(dbName, tblName) + require.NoError(t, err) + tblInfo := tbl.Meta() + idxInfo := tblInfo.Indices[0] + sc := ctx.GetSessionVars().StmtCtx + tk.Session().GetSessionVars().IndexLookupSize = 3 + tk.Session().GetSessionVars().MaxChunkSize = 3 + + cpIdx := idxInfo.Clone() + cpIdx.MVIndex = false + indexOpr := tables.NewIndex(tblInfo.ID, tblInfo, cpIdx) + txn, err := store.Begin() + require.NoError(t, err) + err = indexOpr.Delete(sc, txn, types.MakeDatums(0), kv.IntHandle(0)) + require.NoError(t, err) + err = txn.Commit(context.Background()) + require.NoError(t, err) + err = tk.ExecToErr("admin check table t") + require.Error(t, err) + require.True(t, consistency.ErrAdminCheckInconsistent.Equal(err)) + + txn, err = store.Begin() + require.NoError(t, err) + _, err = indexOpr.Create(ctx, txn, types.MakeDatums(0), kv.IntHandle(0), nil) + require.NoError(t, err) + err = txn.Commit(context.Background()) + require.NoError(t, err) + tk.MustExec("admin check table t") + + txn, err = store.Begin() + require.NoError(t, err) + _, err = indexOpr.Create(ctx, txn, types.MakeDatums(9), kv.IntHandle(9), nil) + require.NoError(t, err) + err = txn.Commit(context.Background()) + require.NoError(t, err) + err = tk.ExecToErr("admin check table t") + require.Error(t, err) +} + func TestAdminCheckPartitionTableFailed(t *testing.T) { store, domain := testkit.CreateMockStoreAndDomain(t) @@ -1095,9 +1279,7 @@ func TestCheckFailReport(t *testing.T) { require.NoError(t, txn.Commit(tk.ctx)) ctx, hook := withLogHook(tk.ctx, t, "inconsistency") - _, err = tk.Exec(ctx, "admin check table admin_test") - require.Error(t, err) - require.Equal(t, "[admin:8223]data inconsistency in table: admin_test, index: uk1, handle: 1, index-values:\"\" != record-values:\"handle: 1, values: [KindInt64 1]\"", err.Error()) + tk.MustGetErrMsg(ctx, "admin check table admin_test", "[admin:8223]data inconsistency in table: admin_test, index: uk1, handle: 1, index-values:\"\" != record-values:\"handle: 1, values: [KindInt64 1]\"") hook.checkLogCount(t, 1) hook.logs[0].checkMsg(t, "admin check found data inconsistency") hook.logs[0].checkField(t, @@ -1119,9 +1301,7 @@ func TestCheckFailReport(t *testing.T) { require.NoError(t, txn.Commit(tk.ctx)) ctx, hook := withLogHook(tk.ctx, t, "inconsistency") - _, err = tk.Exec(ctx, "admin check table admin_test") - require.Error(t, err) - require.Equal(t, "[admin:8223]data inconsistency in table: admin_test, index: k2, handle: 1, index-values:\"\" != record-values:\"handle: 1, values: [KindString 10]\"", err.Error()) + tk.MustGetErrMsg(ctx, "admin check table admin_test", "[admin:8223]data inconsistency in table: admin_test, index: k2, handle: 1, index-values:\"\" != record-values:\"handle: 1, values: [KindString 10]\"") hook.checkLogCount(t, 1) hook.logs[0].checkMsg(t, "admin check found data inconsistency") hook.logs[0].checkField(t, @@ -1143,9 +1323,8 @@ func TestCheckFailReport(t *testing.T) { require.NoError(t, txn.Commit(tk.ctx)) ctx, hook := withLogHook(tk.ctx, t, "inconsistency") - _, err = tk.Exec(ctx, "admin check table admin_test") - require.Error(t, err) - require.Equal(t, "[admin:8223]data inconsistency in table: admin_test, index: k2, handle: 1, index-values:\"handle: 1, values: [KindString 100 KindInt64 1]\" != record-values:\"\"", err.Error()) + tk.MustGetErrMsg(ctx, "admin check table admin_test", + "[admin:8223]data inconsistency in table: admin_test, index: k2, handle: 1, index-values:\"handle: 1, values: [KindString 100 KindInt64 1]\" != record-values:\"\"") hook.checkLogCount(t, 1) logEntry := hook.logs[0] logEntry.checkMsg(t, "admin check found data inconsistency") @@ -1188,9 +1367,8 @@ func TestCheckFailReport(t *testing.T) { require.NoError(t, txn.Commit(tk.ctx)) ctx, hook := withLogHook(tk.ctx, t, "inconsistency") - _, err = tk.Exec(ctx, "admin check table admin_test") - require.Error(t, err) - require.Equal(t, "[admin:8223]data inconsistency in table: admin_test, index: uk1, handle: 1, index-values:\"handle: 1, values: [KindInt64 10 KindInt64 1]\" != record-values:\"\"", err.Error()) + tk.MustGetErrMsg(ctx, "admin check table admin_test", + "[admin:8223]data inconsistency in table: admin_test, index: uk1, handle: 1, index-values:\"handle: 1, values: [KindInt64 10 KindInt64 1]\" != record-values:\"\"") hook.checkLogCount(t, 1) logEntry := hook.logs[0] logEntry.checkMsg(t, "admin check found data inconsistency") @@ -1233,9 +1411,8 @@ func TestCheckFailReport(t *testing.T) { require.NoError(t, err) require.NoError(t, txn.Commit(tk.ctx)) ctx, hook := withLogHook(tk.ctx, t, "inconsistency") - _, err = tk.Exec(ctx, "admin check table admin_test") - require.Error(t, err) - require.Equal(t, "[executor:8134]data inconsistency in table: admin_test, index: uk1, col: c2, handle: \"1\", index-values:\"KindInt64 20\" != record-values:\"KindInt64 10\", compare err:", err.Error()) + tk.MustGetErrMsg(ctx, "admin check table admin_test", + "[executor:8134]data inconsistency in table: admin_test, index: uk1, col: c2, handle: \"1\", index-values:\"KindInt64 20\" != record-values:\"KindInt64 10\", compare err:") hook.checkLogCount(t, 1) logEntry := hook.logs[0] logEntry.checkMsg(t, "admin check found data inconsistency") @@ -1261,9 +1438,8 @@ func TestCheckFailReport(t *testing.T) { require.NoError(t, err) require.NoError(t, txn.Commit(tk.ctx)) ctx, hook := withLogHook(tk.ctx, t, "inconsistency") - _, err = tk.Exec(ctx, "admin check table admin_test") - require.Error(t, err) - require.Equal(t, "[executor:8134]data inconsistency in table: admin_test, index: k2, col: c3, handle: \"1\", index-values:\"KindString 200\" != record-values:\"KindString 100\", compare err:", err.Error()) + tk.MustGetErrMsg(ctx, "admin check table admin_test", + "[executor:8134]data inconsistency in table: admin_test, index: k2, col: c3, handle: \"1\", index-values:\"KindString 200\" != record-values:\"KindString 100\", compare err:") hook.checkLogCount(t, 1) logEntry := hook.logs[0] logEntry.checkMsg(t, "admin check found data inconsistency") @@ -1301,12 +1477,10 @@ func TestCheckFailReport(t *testing.T) { // TODO(tiancaiamao): admin check doesn't support the chunk protocol. // Remove this after https://github.com/pingcap/tidb/issues/35156 - _, err = tk.Exec(ctx, "set @@tidb_enable_chunk_rpc = off") - require.NoError(t, err) + tk.MustExec(ctx, "set @@tidb_enable_chunk_rpc = off") - _, err = tk.Exec(ctx, "admin check table admin_test") - require.Error(t, err) - require.Equal(t, `[admin:8223]data inconsistency in table: admin_test, index: uk1, handle: 282574488403969, index-values:"handle: 282574488403969, values: [KindInt64 282578800083201 KindInt64 282574488403969]" != record-values:""`, err.Error()) + tk.MustGetErrMsg(ctx, "admin check table admin_test", + `[admin:8223]data inconsistency in table: admin_test, index: uk1, handle: 282574488403969, index-values:"handle: 282574488403969, values: [KindInt64 282578800083201 KindInt64 282574488403969]" != record-values:""`) hook.checkLogCount(t, 1) logEntry := hook.logs[0] logEntry.checkMsg(t, "admin check found data inconsistency") diff --git a/executor/aggfuncs/BUILD.bazel b/executor/aggfuncs/BUILD.bazel index 5c01950eef836..ce1aa103869f0 100644 --- a/executor/aggfuncs/BUILD.bazel +++ b/executor/aggfuncs/BUILD.bazel @@ -58,7 +58,7 @@ go_library( go_test( name = "aggfuncs_test", - timeout = "short", + timeout = "moderate", srcs = [ "aggfunc_test.go", "export_test.go", @@ -89,7 +89,7 @@ go_test( embed = [":aggfuncs"], flaky = True, race = "on", - shard_count = 10, + shard_count = 40, deps = [ "//expression", "//expression/aggregation", diff --git a/executor/aggregate.go b/executor/aggregate.go index 771d928c9bbad..30b86164ec371 100644 --- a/executor/aggregate.go +++ b/executor/aggregate.go @@ -244,6 +244,9 @@ func (d *HashAggIntermData) getPartialResultBatch(_ *stmtctx.StatementContext, p // Close implements the Executor Close interface. func (e *HashAggExec) Close() error { + if e.stats != nil { + defer e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) + } if e.isUnparallelExec { var firstErr error e.childResult = nil @@ -1131,7 +1134,6 @@ func (e *HashAggExec) initRuntimeStats() { stats.PartialStats = make([]*AggWorkerStat, 0, stats.PartialConcurrency) stats.FinalStats = make([]*AggWorkerStat, 0, stats.FinalConcurrency) e.stats = stats - e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) } } diff --git a/executor/aggregate_test.go b/executor/aggregate_test.go index 1868802d65d8d..bd6366d6d115d 100644 --- a/executor/aggregate_test.go +++ b/executor/aggregate_test.go @@ -1088,6 +1088,14 @@ func TestIssue10608(t *testing.T) { tk.MustExec("insert into t values(508931), (508932)") tk.MustQuery("select (select /*+ stream_agg() */ group_concat(concat(123,'-')) from t where t.a = s.b group by t.a) as t from s;").Check(testkit.Rows("123-", "123-")) tk.MustQuery("select (select /*+ hash_agg() */ group_concat(concat(123,'-')) from t where t.a = s.b group by t.a) as t from s;").Check(testkit.Rows("123-", "123-")) + + tk.MustExec("CREATE TABLE `t49`(`c0` char(1) DEFAULT '1', `c2` char(1) DEFAULT NULL, UNIQUE KEY `c2` (`c2`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;") + tk.MustExec("INSERT INTO `t49` VALUES ('0','0'),('0','1');") + tk.MustExec("CREATE TABLE `t0` (`c0` blob DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;") + tk.MustExec("INSERT INTO `t0` VALUES (_binary ']'),(_binary '777926278'),(_binary '0.2136404982804636'),(_binary '1901362489'),(_binary '1558203848'),(''),(_binary '1830406335'),(''),(_binary '0'),(NULL),(_binary '601930250'),(_binary '1558203848'),(_binary '-122008948'),(_binary '-2053608489'),(_binary 'hb/vt <7'),(_binary 'RC&2*'),(_binary '1'),(_binary '-1722334316'),(_binary '1830406335'),(_binary '1372126029'),(_binary '882291196'),(NULL),(_binary '-399693596');") + tk.MustExec("CREATE ALGORITHM=TEMPTABLE DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `v0` (`c0`, `c1`, `c2`) AS SELECT NULL AS `NULL`,`t49`.`c2` AS `c2`,(((CASE _UTF8MB4'I되EkfIO퀶' WHEN NULL THEN `t49`.`c0` WHEN `t49`.`c2` THEN `t0`.`c0` ELSE (CASE `t49`.`c0` WHEN _UTF8MB4'%' THEN 1035293362 ELSE _UTF8MB4',' END) END))<<(`t49`.`c0`)) AS `(((CASE 'I되EkfIO퀶' WHEN NULL THEN t49.c0 WHEN t49.c2 THEN t0.c0 ELSE (CASE t49.c0 WHEN '%' THEN 1035293362 ELSE ',' END ) END ))<<(t49.c0))` FROM (`t0`) JOIN `t49` WHERE TRUE;") + tk.MustQuery("SELECT /*+ STREAM_AGG()*/v0.c0 FROM t49, v0 LEFT OUTER JOIN t0 ON ('Iw') GROUP BY true;"). + Check(testkit.Rows("")) } func TestIssue12759HashAggCalledByApply(t *testing.T) { diff --git a/executor/analyze.go b/executor/analyze.go index da74d8248a90c..705e6eed6c590 100644 --- a/executor/analyze.go +++ b/executor/analyze.go @@ -267,20 +267,8 @@ func recordHistoricalStats(sctx sessionctx.Context, tableID int64) error { if !historicalStatsEnabled { return nil } - - is := domain.GetDomain(sctx).InfoSchema() - tbl, existed := is.TableByID(tableID) - if !existed { - return errors.Errorf("cannot get table by id %d", tableID) - } - tblInfo := tbl.Meta() - dbInfo, existed := is.SchemaByTable(tblInfo) - if !existed { - return errors.Errorf("cannot get DBInfo by TableID %d", tableID) - } - if _, err := statsHandle.RecordHistoricalStatsToStorage(dbInfo.Name.O, tblInfo); err != nil { - return errors.Errorf("record table %s.%s's historical stats failed", dbInfo.Name.O, tblInfo.Name.O) - } + historicalStatsWorker := domain.GetDomain(sctx).GetHistoricalStatsWorker() + historicalStatsWorker.SendTblToDumpHistoricalStats(tableID) return nil } @@ -303,6 +291,8 @@ func (e *AnalyzeExec) handleResultsError(ctx context.Context, concurrency int, n } } + tableIDs := map[int64]struct{}{} + // save analyze results in single-thread. statsHandle := domain.GetDomain(e.ctx).StatsHandle() panicCnt := 0 @@ -323,17 +313,15 @@ func (e *AnalyzeExec) handleResultsError(ctx context.Context, concurrency int, n continue } handleGlobalStats(needGlobalStats, globalStatsMap, results) + tableIDs[results.TableID.GetStatisticsID()] = struct{}{} - if err1 := statsHandle.SaveTableStatsToStorage(results, e.ctx.GetSessionVars().EnableAnalyzeSnapshot); err1 != nil { + if err1 := statsHandle.SaveTableStatsToStorage(results, e.ctx.GetSessionVars().EnableAnalyzeSnapshot, handle.StatsMetaHistorySourceAnalyze); err1 != nil { + tableID := results.TableID.TableID err = err1 - logutil.Logger(ctx).Error("save table stats to storage failed", zap.Error(err)) + logutil.Logger(ctx).Error("save table stats to storage failed", zap.Error(err), zap.Int64("tableID", tableID)) finishJobWithLog(e.ctx, results.Job, err) } else { finishJobWithLog(e.ctx, results.Job, nil) - // Dump stats to historical storage. - if err := recordHistoricalStats(e.ctx, results.TableID.TableID); err != nil { - logutil.BgLogger().Error("record historical stats failed", zap.Error(err)) - } } invalidInfoSchemaStatCache(results.TableID.GetStatisticsID()) if atomic.LoadUint32(&e.ctx.GetSessionVars().Killed) == 1 { @@ -341,6 +329,13 @@ func (e *AnalyzeExec) handleResultsError(ctx context.Context, concurrency int, n return errors.Trace(ErrQueryInterrupted) } } + // Dump stats to historical storage. + for tableID := range tableIDs { + if err := recordHistoricalStats(e.ctx, tableID); err != nil { + logutil.BgLogger().Error("record historical stats failed", zap.Error(err)) + } + } + return err } @@ -359,6 +354,7 @@ func (e *AnalyzeExec) handleResultsErrorWithConcurrency(ctx context.Context, sta worker.run(ctx1, e.ctx.GetSessionVars().EnableAnalyzeSnapshot) }) } + tableIDs := map[int64]struct{}{} panicCnt := 0 var err error for panicCnt < statsConcurrency { @@ -381,6 +377,7 @@ func (e *AnalyzeExec) handleResultsErrorWithConcurrency(ctx context.Context, sta continue } handleGlobalStats(needGlobalStats, globalStatsMap, results) + tableIDs[results.TableID.GetStatisticsID()] = struct{}{} saveResultsCh <- results } close(saveResultsCh) @@ -393,6 +390,12 @@ func (e *AnalyzeExec) handleResultsErrorWithConcurrency(ctx context.Context, sta } err = errors.New(strings.Join(errMsg, ",")) } + for tableID := range tableIDs { + // Dump stats to historical storage. + if err := recordHistoricalStats(e.ctx, tableID); err != nil { + logutil.BgLogger().Error("record historical stats failed", zap.Error(err)) + } + } return err } diff --git a/executor/analyze_col.go b/executor/analyze_col.go index a846816b18428..dc5194e9f8fa9 100644 --- a/executor/analyze_col.go +++ b/executor/analyze_col.go @@ -123,6 +123,7 @@ func (e *AnalyzeColumnsExec) buildResp(ranges []*ranger.Range) (distsql.SelectRe SetKeepOrder(true). SetConcurrency(e.concurrency). SetMemTracker(e.memTracker). + SetResourceGroupName(e.ctx.GetSessionVars().ResourceGroupName). Build() if err != nil { return nil, err diff --git a/executor/analyze_col_v2.go b/executor/analyze_col_v2.go index 68a02485c0048..1d9913d5f23e3 100644 --- a/executor/analyze_col_v2.go +++ b/executor/analyze_col_v2.go @@ -32,6 +32,7 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/statistics" + "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" @@ -187,7 +188,7 @@ func (e *AnalyzeColumnsExecV2) decodeSampleDataWithVirtualColumn( } } } - err := FillVirtualColumnValue(fieldTps, virtualColIdx, schema, e.colsInfo, e.ctx, chk) + err := table.FillVirtualColumnValue(fieldTps, virtualColIdx, schema.Columns, e.colsInfo, e.ctx, chk) if err != nil { return err } @@ -199,6 +200,27 @@ func (e *AnalyzeColumnsExecV2) decodeSampleDataWithVirtualColumn( return nil } +func printAnalyzeMergeCollectorLog(oldRootCount, newRootCount, subCount, tableID, partitionID int64, isPartition bool, info string, index int) { + if index < 0 { + logutil.BgLogger().Debug(info, + zap.Int64("tableID", tableID), + zap.Int64("partitionID", partitionID), + zap.Bool("isPartitionTable", isPartition), + zap.Int64("oldRootCount", oldRootCount), + zap.Int64("newRootCount", newRootCount), + zap.Int64("subCount", subCount)) + } else { + logutil.BgLogger().Debug(info, + zap.Int64("tableID", tableID), + zap.Int64("partitionID", partitionID), + zap.Bool("isPartitionTable", isPartition), + zap.Int64("oldRootCount", oldRootCount), + zap.Int64("newRootCount", newRootCount), + zap.Int64("subCount", subCount), + zap.Int("subCollectorIndex", index)) + } +} + func (e *AnalyzeColumnsExecV2) buildSamplingStats( ranges []*ranger.Range, needExtStats bool, @@ -235,7 +257,7 @@ func (e *AnalyzeColumnsExecV2) buildSamplingStats( e.samplingMergeWg = &util.WaitGroupWrapper{} e.samplingMergeWg.Add(statsConcurrency) for i := 0; i < statsConcurrency; i++ { - go e.subMergeWorker(mergeResultCh, mergeTaskCh, l, i == 0) + go e.subMergeWorker(mergeResultCh, mergeTaskCh, l, i) } if err = readDataAndSendTask(e.ctx, e.resultHandler, mergeTaskCh, e.memTracker); err != nil { return 0, nil, nil, nil, nil, getAnalyzePanicErr(err) @@ -255,7 +277,12 @@ func (e *AnalyzeColumnsExecV2) buildSamplingStats( continue } oldRootCollectorSize := rootRowCollector.Base().MemSize + oldRootCollectorCount := rootRowCollector.Base().Count rootRowCollector.MergeCollector(mergeResult.collector) + newRootCollectorCount := rootRowCollector.Base().Count + printAnalyzeMergeCollectorLog(oldRootCollectorCount, newRootCollectorCount, + mergeResult.collector.Base().Count, e.tableID.TableID, e.tableID.PartitionID, e.tableID.IsPartitionTable(), + "merge subMergeWorker in AnalyzeColumnsExecV2", -1) e.memTracker.Consume(rootRowCollector.Base().MemSize - oldRootCollectorSize - mergeResult.collector.Base().MemSize) } defer e.memTracker.Release(rootRowCollector.Base().MemSize) @@ -544,7 +571,8 @@ func (e *AnalyzeColumnsExecV2) buildSubIndexJobForSpecialIndex(indexInfos []*mod return tasks } -func (e *AnalyzeColumnsExecV2) subMergeWorker(resultCh chan<- *samplingMergeResult, taskCh <-chan []byte, l int, isClosedChanThread bool) { +func (e *AnalyzeColumnsExecV2) subMergeWorker(resultCh chan<- *samplingMergeResult, taskCh <-chan []byte, l int, index int) { + isClosedChanThread := index == 0 defer func() { if r := recover(); r != nil { logutil.BgLogger().Error("analyze worker panicked", zap.Any("recover", r), zap.Stack("stack")) @@ -567,6 +595,13 @@ func (e *AnalyzeColumnsExecV2) subMergeWorker(resultCh chan<- *samplingMergeResu failpoint.Inject("mockAnalyzeSamplingMergeWorkerPanic", func() { panic("failpoint triggered") }) + failpoint.Inject("mockAnalyzeMergeWorkerSlowConsume", func(val failpoint.Value) { + times := val.(int) + for i := 0; i < times; i++ { + e.memTracker.Consume(5 << 20) + time.Sleep(100 * time.Millisecond) + } + }) retCollector := statistics.NewRowSampleCollector(int(e.analyzePB.ColReq.SampleSize), e.analyzePB.ColReq.GetSampleRate(), l) for i := 0; i < l; i++ { retCollector.Base().FMSketches = append(retCollector.Base().FMSketches, statistics.NewFMSketch(maxSketchSize)) @@ -589,7 +624,12 @@ func (e *AnalyzeColumnsExecV2) subMergeWorker(resultCh chan<- *samplingMergeResu subCollector.Base().FromProto(colResp.RowCollector, e.memTracker) UpdateAnalyzeJob(e.ctx, e.job, subCollector.Base().Count) oldRetCollectorSize := retCollector.Base().MemSize + oldRetCollectorCount := retCollector.Base().Count retCollector.MergeCollector(subCollector) + newRetCollectorCount := retCollector.Base().Count + printAnalyzeMergeCollectorLog(oldRetCollectorCount, newRetCollectorCount, subCollector.Base().Count, + e.tableID.TableID, e.tableID.PartitionID, e.TableID.IsPartitionTable(), + "merge subCollector in concurrency in AnalyzeColumnsExecV2", index) newRetCollectorSize := retCollector.Base().MemSize subCollectorSize := subCollector.Base().MemSize e.memTracker.Consume(newRetCollectorSize - oldRetCollectorSize - subCollectorSize) diff --git a/executor/analyze_fast.go b/executor/analyze_fast.go index 5917a5b336ae0..b9dcc5d55ee97 100644 --- a/executor/analyze_fast.go +++ b/executor/analyze_fast.go @@ -404,6 +404,7 @@ func (e *AnalyzeFastExec) handleScanTasks(bo *tikv.Backoffer) (keysSize int, err snapshot.SetOption(kv.ReplicaRead, kv.ReplicaReadFollower) } setOptionForTopSQL(e.ctx.GetSessionVars().StmtCtx, snapshot) + snapshot.SetOption(kv.ResourceGroupName, e.ctx.GetSessionVars().ResourceGroupName) for _, t := range e.scanTasks { iter, err := snapshot.Iter(kv.Key(t.StartKey), kv.Key(t.EndKey)) if err != nil { @@ -430,6 +431,7 @@ func (e *AnalyzeFastExec) handleSampTasks(workID int, step uint32, err *error) { } snapshot.SetOption(kv.NotFillCache, true) snapshot.SetOption(kv.Priority, kv.PriorityLow) + snapshot.SetOption(kv.ResourceGroupName, e.ctx.GetSessionVars().ResourceGroupName) setOptionForTopSQL(e.ctx.GetSessionVars().StmtCtx, snapshot) readReplicaType := e.ctx.GetSessionVars().GetReplicaRead() if readReplicaType.IsFollowerRead() { diff --git a/executor/analyze_global_stats.go b/executor/analyze_global_stats.go index 82c2678953285..e8f8d53b8adbf 100644 --- a/executor/analyze_global_stats.go +++ b/executor/analyze_global_stats.go @@ -21,6 +21,7 @@ import ( "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/statistics" + "github.com/pingcap/tidb/statistics/handle" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/logutil" "go.uber.org/zap" @@ -53,7 +54,9 @@ func (e *AnalyzeExec) handleGlobalStats(ctx context.Context, needGlobalStats boo globalStatsTableIDs[globalStatsID.tableID] = struct{}{} } statsHandle := domain.GetDomain(e.ctx).StatsHandle() + tableIDs := map[int64]struct{}{} for tableID := range globalStatsTableIDs { + tableIDs[tableID] = struct{}{} tableAllPartitionStats := make(map[int64]*statistics.Table) for globalStatsID, info := range globalStatsMap { if globalStatsID.tableID != tableID { @@ -73,10 +76,11 @@ func (e *AnalyzeExec) handleGlobalStats(ctx context.Context, needGlobalStats boo globalStatsID.tableID, info.isIndex, info.histIDs, tableAllPartitionStats) if err != nil { + logutil.BgLogger().Error("merge global stats failed", + zap.String("info", job.JobInfo), zap.Error(err), zap.Int64("tableID", tableID)) if types.ErrPartitionStatsMissing.Equal(err) || types.ErrPartitionColumnStatsMissing.Equal(err) { // When we find some partition-level stats are missing, we need to report warning. e.ctx.GetSessionVars().StmtCtx.AppendWarning(err) - return nil } return err } @@ -93,20 +97,24 @@ func (e *AnalyzeExec) handleGlobalStats(ctx context.Context, needGlobalStats boo info.statsVersion, 1, true, + handle.StatsMetaHistorySourceAnalyze, ) if err != nil { - logutil.Logger(ctx).Error("save global-level stats to storage failed", zap.Error(err)) - } - // Dump stats to historical storage. - if err := recordHistoricalStats(e.ctx, globalStatsID.tableID); err != nil { - logutil.BgLogger().Error("record historical stats failed", zap.Error(err)) + logutil.Logger(ctx).Error("save global-level stats to storage failed", zap.String("info", job.JobInfo), + zap.Int64("histID", hg.ID), zap.Error(err), zap.Int64("tableID", tableID)) } } - return nil + return err }() FinishAnalyzeMergeJob(e.ctx, job, mergeStatsErr) } } + for tableID := range tableIDs { + // Dump stats to historical storage. + if err := recordHistoricalStats(e.ctx, tableID); err != nil { + logutil.BgLogger().Error("record historical stats failed", zap.Error(err)) + } + } return nil } diff --git a/executor/analyze_idx.go b/executor/analyze_idx.go index 2ac3bce77c139..f89d804788edd 100644 --- a/executor/analyze_idx.go +++ b/executor/analyze_idx.go @@ -155,6 +155,7 @@ func (e *AnalyzeIndexExec) fetchAnalyzeResult(ranges []*ranger.Range, isNullRang SetStartTS(startTS). SetKeepOrder(true). SetConcurrency(e.concurrency). + SetResourceGroupName(e.ctx.GetSessionVars().ResourceGroupName). Build() if err != nil { return err diff --git a/executor/analyze_test.go b/executor/analyze_test.go index bbe3f5b8d1b1e..a6cdea833df50 100644 --- a/executor/analyze_test.go +++ b/executor/analyze_test.go @@ -417,3 +417,24 @@ func TestAnalyzePartitionTableByConcurrencyInDynamic(t *testing.T) { tk.MustQuery("show stats_topn where partition_name = 'global' and table_name = 't'").CheckAt([]int{5, 6}, expected) } } + +func TestMergeGlobalStatsWithUnAnalyzedPartition(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("set tidb_partition_prune_mode=dynamic;") + tk.MustExec("CREATE TABLE `t` ( `id` int(11) DEFAULT NULL, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, `c` int(11) DEFAULT NULL ) PARTITION BY RANGE (`id`) (PARTITION `p0` VALUES LESS THAN (3), PARTITION `p1` VALUES LESS THAN (7), PARTITION `p2` VALUES LESS THAN (11));") + tk.MustExec("insert into t values (1,1,1,1),(2,2,2,2),(4,4,4,4),(5,5,5,5),(6,6,6,6),(8,8,8,8),(9,9,9,9);") + tk.MustExec("create index idxa on t (a);") + tk.MustExec("create index idxb on t (b);") + tk.MustExec("create index idxc on t (c);") + tk.MustExec("analyze table t partition p0 index idxa;") + tk.MustExec("analyze table t partition p1 index idxb;") + tk.MustExec("analyze table t partition p2 index idxc;") + tk.MustQuery("show warnings").Check(testkit.Rows( + "Warning 1105 The version 2 would collect all statistics not only the selected indexes", + "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t's partition p2")) + tk.MustExec("analyze table t partition p0;") + tk.MustQuery("show warnings").Check(testkit.Rows( + "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t's partition p0")) +} diff --git a/executor/analyze_utils.go b/executor/analyze_utils.go index c6d4886d79b7c..cdf47373d29f0 100644 --- a/executor/analyze_utils.go +++ b/executor/analyze_utils.go @@ -17,6 +17,7 @@ package executor import ( "context" "strconv" + "strings" "sync" "github.com/pingcap/errors" @@ -24,6 +25,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" + "github.com/pingcap/tidb/util/memory" "go.uber.org/atomic" ) @@ -45,8 +47,13 @@ func isAnalyzeWorkerPanic(err error) bool { } func getAnalyzePanicErr(r interface{}) error { - if msg, ok := r.(string); ok && msg == globalPanicAnalyzeMemoryExceed { - return errAnalyzeOOM + if msg, ok := r.(string); ok { + if msg == globalPanicAnalyzeMemoryExceed { + return errAnalyzeOOM + } + if strings.Contains(msg, memory.PanicMemoryExceed) { + return errors.Errorf(msg, errAnalyzeOOM) + } } if err, ok := r.(error); ok { if err.Error() == globalPanicAnalyzeMemoryExceed { diff --git a/executor/analyze_worker.go b/executor/analyze_worker.go index 68c2f6a1f6ec8..688f89f5a120d 100644 --- a/executor/analyze_worker.go +++ b/executor/analyze_worker.go @@ -59,17 +59,13 @@ func (worker *analyzeSaveStatsWorker) run(ctx context.Context, analyzeSnapshot b worker.errCh <- errors.Trace(ErrQueryInterrupted) return } - err := handle.SaveTableStatsToStorage(worker.sctx, results, analyzeSnapshot) + err := handle.SaveTableStatsToStorage(worker.sctx, results, analyzeSnapshot, handle.StatsMetaHistorySourceAnalyze) if err != nil { logutil.Logger(ctx).Error("save table stats to storage failed", zap.Error(err)) finishJobWithLog(worker.sctx, results.Job, err) worker.errCh <- err } else { finishJobWithLog(worker.sctx, results.Job, nil) - // Dump stats to historical storage. - if err := recordHistoricalStats(worker.sctx, results.TableID.TableID); err != nil { - logutil.BgLogger().Error("record historical stats failed", zap.Error(err)) - } } invalidInfoSchemaStatCache(results.TableID.GetStatisticsID()) if err != nil { diff --git a/executor/analyzetest/BUILD.bazel b/executor/analyzetest/BUILD.bazel index 53126213363a5..3112abe57c00f 100644 --- a/executor/analyzetest/BUILD.bazel +++ b/executor/analyzetest/BUILD.bazel @@ -8,7 +8,6 @@ go_test( "main_test.go", ], flaky = True, - race = "on", shard_count = 50, deps = [ "//domain", @@ -30,6 +29,7 @@ go_test( "//tablecodec", "//testkit", "//types", + "//util", "//util/codec", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", diff --git a/executor/analyzetest/analyze_test.go b/executor/analyzetest/analyze_test.go index c5043935e1650..843200fea6cf9 100644 --- a/executor/analyzetest/analyze_test.go +++ b/executor/analyzetest/analyze_test.go @@ -16,8 +16,8 @@ package analyzetest import ( "context" - "encoding/json" "fmt" + "runtime" "strconv" "strings" "testing" @@ -44,6 +44,7 @@ import ( "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/codec" "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/testutils" @@ -2163,102 +2164,6 @@ func TestAnalyzeColumnsErrorAndWarning(t *testing.T) { } } -func TestRecordHistoryStatsAfterAnalyze(t *testing.T) { - store, dom := testkit.CreateMockStoreAndDomain(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@tidb_analyze_version = 2") - tk.MustExec("set global tidb_enable_historical_stats = 0") - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int, b varchar(10))") - - h := dom.StatsHandle() - is := dom.InfoSchema() - tableInfo, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - require.NoError(t, err) - - // 1. switch off the tidb_enable_historical_stats, and there is no records in table `mysql.stats_history` - rows := tk.MustQuery(fmt.Sprintf("select count(*) from mysql.stats_history where table_id = '%d'", tableInfo.Meta().ID)).Rows() - num, _ := strconv.Atoi(rows[0][0].(string)) - require.Equal(t, num, 0) - - tk.MustExec("analyze table t with 2 topn") - rows = tk.MustQuery(fmt.Sprintf("select count(*) from mysql.stats_history where table_id = '%d'", tableInfo.Meta().ID)).Rows() - num, _ = strconv.Atoi(rows[0][0].(string)) - require.Equal(t, num, 0) - - // 2. switch on the tidb_enable_historical_stats and do analyze - tk.MustExec("set global tidb_enable_historical_stats = 1") - defer tk.MustExec("set global tidb_enable_historical_stats = 0") - tk.MustExec("analyze table t with 2 topn") - rows = tk.MustQuery(fmt.Sprintf("select count(*) from mysql.stats_history where table_id = '%d'", tableInfo.Meta().ID)).Rows() - num, _ = strconv.Atoi(rows[0][0].(string)) - require.GreaterOrEqual(t, num, 1) - - // 3. dump current stats json - dumpJSONTable, err := h.DumpStatsToJSON("test", tableInfo.Meta(), nil, true) - require.NoError(t, err) - jsOrigin, _ := json.Marshal(dumpJSONTable) - - // 4. get the historical stats json - rows = tk.MustQuery(fmt.Sprintf("select * from mysql.stats_history where table_id = '%d' and create_time = ("+ - "select create_time from mysql.stats_history where table_id = '%d' order by create_time desc limit 1) "+ - "order by seq_no", tableInfo.Meta().ID, tableInfo.Meta().ID)).Rows() - num = len(rows) - require.GreaterOrEqual(t, num, 1) - data := make([][]byte, num) - for i, row := range rows { - data[i] = []byte(row[1].(string)) - } - jsonTbl, err := handle.BlocksToJSONTable(data) - require.NoError(t, err) - jsCur, err := json.Marshal(jsonTbl) - require.NoError(t, err) - // 5. historical stats must be equal to the current stats - require.JSONEq(t, string(jsOrigin), string(jsCur)) -} - -func TestRecordHistoryStatsMetaAfterAnalyze(t *testing.T) { - store, dom := testkit.CreateMockStoreAndDomain(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@tidb_analyze_version = 2") - tk.MustExec("set global tidb_enable_historical_stats = 0") - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int, b int)") - tk.MustExec("analyze table test.t") - - h := dom.StatsHandle() - is := dom.InfoSchema() - tableInfo, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - require.NoError(t, err) - - // 1. switch off the tidb_enable_historical_stats, and there is no record in table `mysql.stats_meta_history` - tk.MustQuery(fmt.Sprintf("select count(*) from mysql.stats_meta_history where table_id = '%d'", tableInfo.Meta().ID)).Check(testkit.Rows("0")) - // insert demo tuples, and there is no record either. - insertNums := 5 - for i := 0; i < insertNums; i++ { - tk.MustExec("insert into test.t (a,b) values (1,1), (2,2), (3,3)") - err := h.DumpStatsDeltaToKV(handle.DumpDelta) - require.NoError(t, err) - } - tk.MustQuery(fmt.Sprintf("select count(*) from mysql.stats_meta_history where table_id = '%d'", tableInfo.Meta().ID)).Check(testkit.Rows("0")) - - // 2. switch on the tidb_enable_historical_stats and insert tuples to produce count/modifyCount delta change. - tk.MustExec("set global tidb_enable_historical_stats = 1") - defer tk.MustExec("set global tidb_enable_historical_stats = 0") - - for i := 0; i < insertNums; i++ { - tk.MustExec("insert into test.t (a,b) values (1,1), (2,2), (3,3)") - err := h.DumpStatsDeltaToKV(handle.DumpDelta) - require.NoError(t, err) - } - tk.MustQuery(fmt.Sprintf("select modify_count, count from mysql.stats_meta_history where table_id = '%d' order by create_time", tableInfo.Meta().ID)).Sort().Check( - testkit.Rows("18 18", "21 21", "24 24", "27 27", "30 30")) -} - func checkAnalyzeStatus(t *testing.T, tk *testkit.TestKit, jobInfo, status, failReason, comment string, timeLimit int64) { rows := tk.MustQuery("show analyze status where table_schema = 'test' and table_name = 't' and partition_name = ''").Rows() require.Equal(t, 1, len(rows), comment) @@ -2836,8 +2741,8 @@ PARTITION BY RANGE ( a ) ( tk.MustQuery("show warnings").Sort().Check(testkit.Rows( "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t's partition p0", "Warning 1105 Ignore columns and options when analyze partition in dynamic mode", - "Warning 8131 Build table: `t` global-level stats failed due to missing partition-level stats", - "Warning 8131 Build table: `t` index: `idx` global-level stats failed due to missing partition-level stats", + "Warning 8131 Build global-level stats failed due to missing partition-level stats: table `t` partition `p1`", + "Warning 8131 Build global-level stats failed due to missing partition-level stats: table `t` partition `p1`", )) tk.MustQuery("select * from t where a > 1 and b > 1 and c > 1 and d > 1") require.NoError(t, h.LoadNeededHistograms()) @@ -2849,8 +2754,8 @@ PARTITION BY RANGE ( a ) ( tk.MustExec("analyze table t partition p0") tk.MustQuery("show warnings").Sort().Check(testkit.Rows( "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t's partition p0", - "Warning 8131 Build table: `t` global-level stats failed due to missing partition-level stats", - "Warning 8131 Build table: `t` index: `idx` global-level stats failed due to missing partition-level stats", + "Warning 8131 Build global-level stats failed due to missing partition-level stats: table `t` partition `p1`", + "Warning 8131 Build global-level stats failed due to missing partition-level stats: table `t` partition `p1`", )) tbl = h.GetTableStats(tableInfo) require.Equal(t, tbl.Version, lastVersion) // global stats not updated @@ -2904,7 +2809,7 @@ PARTITION BY RANGE ( a ) ( tk.MustExec("analyze table t partition p1 columns a,b,d with 1 topn, 3 buckets") tk.MustQuery("show warnings").Sort().Check(testkit.Rows( "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t's partition p1", - "Warning 8244 Build table: `t` column: `d` global-level stats failed due to missing partition-level column stats, please run analyze table to refresh columns of all partitions", + "Warning 8244 Build global-level stats failed due to missing partition-level column stats: table `t` partition `p0` column `d`, please run analyze table to refresh columns of all partitions", )) // analyze partition with existing table-level options and existing partition stats under dynamic @@ -2914,7 +2819,7 @@ PARTITION BY RANGE ( a ) ( tk.MustQuery("show warnings").Sort().Check(testkit.Rows( "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t's partition p1", "Warning 1105 Ignore columns and options when analyze partition in dynamic mode", - "Warning 8244 Build table: `t` column: `d` global-level stats failed due to missing partition-level column stats, please run analyze table to refresh columns of all partitions", + "Warning 8244 Build global-level stats failed due to missing partition-level column stats: table `t` partition `p0` column `d`, please run analyze table to refresh columns of all partitions", )) // analyze partition with existing table-level & partition-level options and existing partition stats under dynamic @@ -2923,18 +2828,19 @@ PARTITION BY RANGE ( a ) ( tk.MustQuery("show warnings").Sort().Check(testkit.Rows( "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t's partition p1", "Warning 1105 Ignore columns and options when analyze partition in dynamic mode", - "Warning 8244 Build table: `t` column: `d` global-level stats failed due to missing partition-level column stats, please run analyze table to refresh columns of all partitions", + "Warning 8244 Build global-level stats failed due to missing partition-level column stats: table `t` partition `p0` column `d`, please run analyze table to refresh columns of all partitions", )) - tk.MustQuery("select * from t where a > 1 and b > 1 and c > 1 and d > 1") - require.NoError(t, h.LoadNeededHistograms()) - tbl := h.GetTableStats(tableInfo) - require.Equal(t, 4, len(tbl.Columns)) + // flaky test, fix it later + //tk.MustQuery("select * from t where a > 1 and b > 1 and c > 1 and d > 1") + //require.NoError(t, h.LoadNeededHistograms()) + //tbl := h.GetTableStats(tableInfo) + //require.Equal(t, 0, len(tbl.Columns)) // ignore both p0's 3 buckets, persisted-partition-options' 1 bucket, just use table-level 2 buckets tk.MustExec("analyze table t partition p0") tk.MustQuery("select * from t where a > 1 and b > 1 and c > 1 and d > 1") require.NoError(t, h.LoadNeededHistograms()) - tbl = h.GetTableStats(tableInfo) + tbl := h.GetTableStats(tableInfo) require.Equal(t, 2, len(tbl.Columns[tableInfo.Columns[2].ID].Buckets)) } @@ -2974,8 +2880,8 @@ PARTITION BY RANGE ( a ) ( // analyze partition with index and with options are allowed under dynamic V1 tk.MustExec("analyze table t partition p0 with 1 topn, 3 buckets") tk.MustQuery("show warnings").Sort().Check(testkit.Rows( - "Warning 8131 Build table: `t` global-level stats failed due to missing partition-level stats", - "Warning 8131 Build table: `t` index: `idx` global-level stats failed due to missing partition-level stats", + "Warning 8131 Build global-level stats failed due to missing partition-level stats: table `t` partition `p1`", + "Warning 8131 Build global-level stats failed due to missing partition-level stats: table `t` partition `p1`", )) tk.MustExec("analyze table t partition p1 with 1 topn, 3 buckets") tk.MustQuery("show warnings").Sort().Check(testkit.Rows()) @@ -3157,3 +3063,115 @@ func TestAutoAnalyzeAwareGlobalVariableChange(t *testing.T) { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/injectBaseCount")) require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/injectBaseModifyCount")) } + +func TestGlobalMemoryControlForAnalyze(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + + tk0 := testkit.NewTestKit(t, store) + tk0.MustExec("set global tidb_mem_oom_action = 'cancel'") + tk0.MustExec("set global tidb_server_memory_limit = 512MB") + tk0.MustExec("set global tidb_server_memory_limit_sess_min_size = 128") + + sm := &testkit.MockSessionManager{ + PS: []*util.ProcessInfo{tk0.Session().ShowProcess()}, + } + dom.ServerMemoryLimitHandle().SetSessionManager(sm) + go dom.ServerMemoryLimitHandle().Run() + + tk0.MustExec("use test") + tk0.MustExec("create table t(a int)") + tk0.MustExec("insert into t select 1") + for i := 1; i <= 8; i++ { + tk0.MustExec("insert into t select * from t") // 256 Lines + } + sql := "analyze table t with 1.0 samplerate;" // Need about 100MB + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/util/memory/ReadMemStats", `return(536870912)`)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/mockAnalyzeMergeWorkerSlowConsume", `return(100)`)) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/util/memory/ReadMemStats")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/mockAnalyzeMergeWorkerSlowConsume")) + }() + _, err := tk0.Exec(sql) + require.True(t, strings.Contains(err.Error(), "Out Of Memory Quota!")) + runtime.GC() +} + +func TestGlobalMemoryControlForAutoAnalyze(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + originalVal1 := tk.MustQuery("select @@global.tidb_mem_oom_action").Rows()[0][0].(string) + tk.MustExec("set global tidb_mem_oom_action = 'cancel'") + //originalVal2 := tk.MustQuery("select @@global.tidb_server_memory_limit").Rows()[0][0].(string) + tk.MustExec("set global tidb_server_memory_limit = 512MB") + originalVal3 := tk.MustQuery("select @@global.tidb_server_memory_limit_sess_min_size").Rows()[0][0].(string) + tk.MustExec("set global tidb_server_memory_limit_sess_min_size = 128") + defer func() { + tk.MustExec(fmt.Sprintf("set global tidb_mem_oom_action = %v", originalVal1)) + //tk.MustExec(fmt.Sprintf("set global tidb_server_memory_limit = %v", originalVal2)) + tk.MustExec(fmt.Sprintf("set global tidb_server_memory_limit_sess_min_size = %v", originalVal3)) + }() + + // clean child trackers + oldChildTrackers := executor.GlobalAnalyzeMemoryTracker.GetChildrenForTest() + for _, tracker := range oldChildTrackers { + tracker.Detach() + } + defer func() { + for _, tracker := range oldChildTrackers { + tracker.AttachTo(executor.GlobalAnalyzeMemoryTracker) + } + }() + childTrackers := executor.GlobalAnalyzeMemoryTracker.GetChildrenForTest() + require.Len(t, childTrackers, 0) + + tk.MustExec("use test") + tk.MustExec("create table t(a int)") + tk.MustExec("insert into t select 1") + for i := 1; i <= 8; i++ { + tk.MustExec("insert into t select * from t") // 256 Lines + } + _, err0 := tk.Exec("analyze table t with 1.0 samplerate;") + require.NoError(t, err0) + rs0 := tk.MustQuery("select fail_reason from mysql.analyze_jobs where table_name=? and state=? limit 1", "t", "failed") + require.Len(t, rs0.Rows(), 0) + + h := dom.StatsHandle() + originalVal4 := handle.AutoAnalyzeMinCnt + originalVal5 := tk.MustQuery("select @@global.tidb_auto_analyze_ratio").Rows()[0][0].(string) + handle.AutoAnalyzeMinCnt = 0 + tk.MustExec("set global tidb_auto_analyze_ratio = 0.001") + defer func() { + handle.AutoAnalyzeMinCnt = originalVal4 + tk.MustExec(fmt.Sprintf("set global tidb_auto_analyze_ratio = %v", originalVal5)) + }() + + sm := &testkit.MockSessionManager{ + Dom: dom, + PS: []*util.ProcessInfo{tk.Session().ShowProcess()}, + } + dom.ServerMemoryLimitHandle().SetSessionManager(sm) + go dom.ServerMemoryLimitHandle().Run() + + tk.MustExec("insert into t values(4),(5),(6)") + require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + err := h.Update(dom.InfoSchema()) + require.NoError(t, err) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/util/memory/ReadMemStats", `return(536870912)`)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/mockAnalyzeMergeWorkerSlowConsume", `return(100)`)) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/util/memory/ReadMemStats")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/mockAnalyzeMergeWorkerSlowConsume")) + }() + tk.MustQuery("select 1") + childTrackers = executor.GlobalAnalyzeMemoryTracker.GetChildrenForTest() + require.Len(t, childTrackers, 0) + + h.HandleAutoAnalyze(dom.InfoSchema()) + rs := tk.MustQuery("select fail_reason from mysql.analyze_jobs where table_name=? and state=? limit 1", "t", "failed") + failReason := rs.Rows()[0][0].(string) + require.True(t, strings.Contains(failReason, "Out Of Memory Quota!")) + + childTrackers = executor.GlobalAnalyzeMemoryTracker.GetChildrenForTest() + require.Len(t, childTrackers, 0) +} diff --git a/executor/autoidtest/BUILD.bazel b/executor/autoidtest/BUILD.bazel new file mode 100644 index 0000000000000..28aad8e63fa8c --- /dev/null +++ b/executor/autoidtest/BUILD.bazel @@ -0,0 +1,28 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_test") + +go_test( + name = "autoidtest_test", + timeout = "short", + srcs = [ + "autoid_test.go", + "main_test.go", + ], + flaky = True, + race = "on", + shard_count = 5, + deps = [ + "//autoid_service", + "//config", + "//ddl/testutil", + "//meta/autoid", + "//parser/mysql", + "//session", + "//sessionctx/variable", + "//testkit", + "//testkit/testutil", + "@com_github_pingcap_failpoint//:failpoint", + "@com_github_stretchr_testify//require", + "@com_github_tikv_client_go_v2//tikv", + "@org_uber_go_goleak//:goleak", + ], +) diff --git a/executor/autoidtest/autoid_test.go b/executor/autoidtest/autoid_test.go new file mode 100644 index 0000000000000..eb8cc3f874159 --- /dev/null +++ b/executor/autoidtest/autoid_test.go @@ -0,0 +1,769 @@ +// 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, +// 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 autoid_test + +import ( + "context" + "fmt" + "strconv" + "strings" + "testing" + + "github.com/pingcap/failpoint" + _ "github.com/pingcap/tidb/autoid_service" + ddltestutil "github.com/pingcap/tidb/ddl/testutil" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/testkit/testutil" + "github.com/stretchr/testify/require" +) + +// Test filter different kind of allocators. +// In special ddl type, for example: +// 1: ActionRenameTable : it will abandon all the old allocators. +// 2: ActionRebaseAutoID : it will drop row-id-type allocator. +// 3: ActionModifyTableAutoIdCache : it will drop row-id-type allocator. +// 3: ActionRebaseAutoRandomBase : it will drop auto-rand-type allocator. +func TestFilterDifferentAllocators(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists t1") + + for _, str := range []string{"", " AUTO_ID_CACHE 1"} { + tk.MustExec("create table t(a bigint auto_random(5) key, b int auto_increment unique)" + str) + tk.MustExec("insert into t values()") + tk.MustQuery("select b from t").Check(testkit.Rows("1")) + allHandles, err := ddltestutil.ExtractAllTableHandles(tk.Session(), "test", "t") + require.NoError(t, err) + require.Equal(t, 1, len(allHandles)) + orderedHandles := testutil.MaskSortHandles(allHandles, 5, mysql.TypeLonglong) + require.Equal(t, int64(1), orderedHandles[0]) + tk.MustExec("delete from t") + + // Test rebase auto_increment. + tk.MustExec("alter table t auto_increment 3000000") + tk.MustExec("insert into t values()") + tk.MustQuery("select b from t").Check(testkit.Rows("3000000")) + allHandles, err = ddltestutil.ExtractAllTableHandles(tk.Session(), "test", "t") + require.NoError(t, err) + require.Equal(t, 1, len(allHandles)) + orderedHandles = testutil.MaskSortHandles(allHandles, 5, mysql.TypeLonglong) + require.Equal(t, int64(2), orderedHandles[0]) + tk.MustExec("delete from t") + + // Test rebase auto_random. + tk.MustExec("alter table t auto_random_base 3000000") + tk.MustExec("insert into t values()") + tk.MustQuery("select b from t").Check(testkit.Rows("3000001")) + allHandles, err = ddltestutil.ExtractAllTableHandles(tk.Session(), "test", "t") + require.NoError(t, err) + require.Equal(t, 1, len(allHandles)) + orderedHandles = testutil.MaskSortHandles(allHandles, 5, mysql.TypeLonglong) + require.Equal(t, int64(3000000), orderedHandles[0]) + tk.MustExec("delete from t") + + // Test rename table. + tk.MustExec("rename table t to t1") + tk.MustExec("insert into t1 values()") + res := tk.MustQuery("select b from t1") + strInt64, err := strconv.ParseInt(res.Rows()[0][0].(string), 10, 64) + require.NoError(t, err) + require.GreaterOrEqual(t, strInt64, int64(3000002)) + allHandles, err = ddltestutil.ExtractAllTableHandles(tk.Session(), "test", "t1") + require.NoError(t, err) + require.Equal(t, 1, len(allHandles)) + orderedHandles = testutil.MaskSortHandles(allHandles, 5, mysql.TypeLonglong) + require.Greater(t, orderedHandles[0], int64(3000001)) + + tk.MustExec("drop table t1") + } +} + +func TestAutoIncrementInsertMinMax(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + cases := []struct { + t string + s string + vals []int64 + expect [][]interface{} + }{ + {"tinyint", "signed", []int64{-128, 0, 127}, testkit.Rows("-128", "1", "2", "3", "127")}, + {"tinyint", "unsigned", []int64{0, 127, 255}, testkit.Rows("1", "2", "127", "128", "255")}, + {"smallint", "signed", []int64{-32768, 0, 32767}, testkit.Rows("-32768", "1", "2", "3", "32767")}, + {"smallint", "unsigned", []int64{0, 32767, 65535}, testkit.Rows("1", "2", "32767", "32768", "65535")}, + {"mediumint", "signed", []int64{-8388608, 0, 8388607}, testkit.Rows("-8388608", "1", "2", "3", "8388607")}, + {"mediumint", "unsigned", []int64{0, 8388607, 16777215}, testkit.Rows("1", "2", "8388607", "8388608", "16777215")}, + {"integer", "signed", []int64{-2147483648, 0, 2147483647}, testkit.Rows("-2147483648", "1", "2", "3", "2147483647")}, + {"integer", "unsigned", []int64{0, 2147483647, 4294967295}, testkit.Rows("1", "2", "2147483647", "2147483648", "4294967295")}, + {"bigint", "signed", []int64{-9223372036854775808, 0, 9223372036854775807}, testkit.Rows("-9223372036854775808", "1", "2", "3", "9223372036854775807")}, + {"bigint", "unsigned", []int64{0, 9223372036854775807}, testkit.Rows("1", "2", "9223372036854775807", "9223372036854775808")}, + } + + for _, option := range []string{"", "auto_id_cache 1", "auto_id_cache 100"} { + for idx, c := range cases { + sql := fmt.Sprintf("create table t%d (a %s %s key auto_increment) %s", idx, c.t, c.s, option) + tk.MustExec(sql) + + for _, val := range c.vals { + tk.MustExec(fmt.Sprintf("insert into t%d values (%d)", idx, val)) + tk.Exec(fmt.Sprintf("insert into t%d values ()", idx)) // ignore error + } + + tk.MustQuery(fmt.Sprintf("select * from t%d order by a", idx)).Check(c.expect) + + tk.MustExec(fmt.Sprintf("drop table t%d", idx)) + } + } + + tk.MustExec("create table t10 (a integer key auto_increment) auto_id_cache 1") + err := tk.ExecToErr("insert into t10 values (2147483648)") + require.Error(t, err) + err = tk.ExecToErr("insert into t10 values (-2147483649)") + require.Error(t, err) +} + +func TestInsertWithAutoidSchema(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec(`use test`) + tk.MustExec(`create table t1(id int primary key auto_increment, n int);`) + tk.MustExec(`create table t2(id int unsigned primary key auto_increment, n int);`) + tk.MustExec(`create table t3(id tinyint primary key auto_increment, n int);`) + tk.MustExec(`create table t4(id int primary key, n float auto_increment, key I_n(n));`) + tk.MustExec(`create table t5(id int primary key, n float unsigned auto_increment, key I_n(n));`) + tk.MustExec(`create table t6(id int primary key, n double auto_increment, key I_n(n));`) + tk.MustExec(`create table t7(id int primary key, n double unsigned auto_increment, key I_n(n));`) + // test for inserting multiple values + tk.MustExec(`create table t8(id int primary key auto_increment, n int);`) + + testInsertWithAutoidSchema(t, tk) +} + +func TestInsertWithAutoidSchemaCache(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec(`use test`) + tk.MustExec(`create table t1(id int primary key auto_increment, n int) AUTO_ID_CACHE 1;`) + tk.MustExec(`create table t2(id int unsigned primary key auto_increment, n int) AUTO_ID_CACHE 1;`) + tk.MustExec(`create table t3(id tinyint primary key auto_increment, n int) AUTO_ID_CACHE 1;`) + tk.MustExec(`create table t4(id int primary key, n float auto_increment, key I_n(n)) AUTO_ID_CACHE 1;`) + tk.MustExec(`create table t5(id int primary key, n float unsigned auto_increment, key I_n(n)) AUTO_ID_CACHE 1;`) + tk.MustExec(`create table t6(id int primary key, n double auto_increment, key I_n(n)) AUTO_ID_CACHE 1;`) + tk.MustExec(`create table t7(id int primary key, n double unsigned auto_increment, key I_n(n)) AUTO_ID_CACHE 1;`) + // test for inserting multiple values + tk.MustExec(`create table t8(id int primary key auto_increment, n int);`) + + testInsertWithAutoidSchema(t, tk) +} + +func testInsertWithAutoidSchema(t *testing.T, tk *testkit.TestKit) { + tests := []struct { + insert string + query string + result [][]interface{} + }{ + { + `insert into t1(id, n) values(1, 1)`, + `select * from t1 where id = 1`, + testkit.Rows(`1 1`), + }, + { + `insert into t1(n) values(2)`, + `select * from t1 where id = 2`, + testkit.Rows(`2 2`), + }, + { + `insert into t1(n) values(3)`, + `select * from t1 where id = 3`, + testkit.Rows(`3 3`), + }, + { + `insert into t1(id, n) values(-1, 4)`, + `select * from t1 where id = -1`, + testkit.Rows(`-1 4`), + }, + { + `insert into t1(n) values(5)`, + `select * from t1 where id = 4`, + testkit.Rows(`4 5`), + }, + { + `insert into t1(id, n) values('5', 6)`, + `select * from t1 where id = 5`, + testkit.Rows(`5 6`), + }, + { + `insert into t1(n) values(7)`, + `select * from t1 where id = 6`, + testkit.Rows(`6 7`), + }, + { + `insert into t1(id, n) values(7.4, 8)`, + `select * from t1 where id = 7`, + testkit.Rows(`7 8`), + }, + { + `insert into t1(id, n) values(7.5, 9)`, + `select * from t1 where id = 8`, + testkit.Rows(`8 9`), + }, + { + `insert into t1(n) values(9)`, + `select * from t1 where id = 9`, + testkit.Rows(`9 9`), + }, + // test last insert id + { + `insert into t1 values(3000, -1), (null, -2)`, + `select * from t1 where id = 3000`, + testkit.Rows(`3000 -1`), + }, + { + `;`, + `select * from t1 where id = 3001`, + testkit.Rows(`3001 -2`), + }, + { + `;`, + `select last_insert_id()`, + testkit.Rows(`3001`), + }, + { + `insert into t2(id, n) values(1, 1)`, + `select * from t2 where id = 1`, + testkit.Rows(`1 1`), + }, + { + `insert into t2(n) values(2)`, + `select * from t2 where id = 2`, + testkit.Rows(`2 2`), + }, + { + `insert into t2(n) values(3)`, + `select * from t2 where id = 3`, + testkit.Rows(`3 3`), + }, + { + `insert into t3(id, n) values(1, 1)`, + `select * from t3 where id = 1`, + testkit.Rows(`1 1`), + }, + { + `insert into t3(n) values(2)`, + `select * from t3 where id = 2`, + testkit.Rows(`2 2`), + }, + { + `insert into t3(n) values(3)`, + `select * from t3 where id = 3`, + testkit.Rows(`3 3`), + }, + { + `insert into t3(id, n) values(-1, 4)`, + `select * from t3 where id = -1`, + testkit.Rows(`-1 4`), + }, + { + `insert into t3(n) values(5)`, + `select * from t3 where id = 4`, + testkit.Rows(`4 5`), + }, + { + `insert into t4(id, n) values(1, 1)`, + `select * from t4 where id = 1`, + testkit.Rows(`1 1`), + }, + { + `insert into t4(id) values(2)`, + `select * from t4 where id = 2`, + testkit.Rows(`2 2`), + }, + { + `insert into t4(id, n) values(3, -1)`, + `select * from t4 where id = 3`, + testkit.Rows(`3 -1`), + }, + { + `insert into t4(id) values(4)`, + `select * from t4 where id = 4`, + testkit.Rows(`4 3`), + }, + { + `insert into t4(id, n) values(5, 5.5)`, + `select * from t4 where id = 5`, + testkit.Rows(`5 5.5`), + }, + { + `insert into t4(id) values(6)`, + `select * from t4 where id = 6`, + testkit.Rows(`6 7`), + }, + { + `insert into t4(id, n) values(7, '7.7')`, + `select * from t4 where id = 7`, + testkit.Rows(`7 7.7`), + }, + { + `insert into t4(id) values(8)`, + `select * from t4 where id = 8`, + testkit.Rows(`8 9`), + }, + { + `insert into t4(id, n) values(9, 10.4)`, + `select * from t4 where id = 9`, + testkit.Rows(`9 10.4`), + }, + { + `insert into t4(id) values(10)`, + `select * from t4 where id = 10`, + testkit.Rows(`10 11`), + }, + { + `insert into t5(id, n) values(1, 1)`, + `select * from t5 where id = 1`, + testkit.Rows(`1 1`), + }, + { + `insert into t5(id) values(2)`, + `select * from t5 where id = 2`, + testkit.Rows(`2 2`), + }, + { + `insert into t5(id) values(3)`, + `select * from t5 where id = 3`, + testkit.Rows(`3 3`), + }, + { + `insert into t6(id, n) values(1, 1)`, + `select * from t6 where id = 1`, + testkit.Rows(`1 1`), + }, + { + `insert into t6(id) values(2)`, + `select * from t6 where id = 2`, + testkit.Rows(`2 2`), + }, + { + `insert into t6(id, n) values(3, -1)`, + `select * from t6 where id = 3`, + testkit.Rows(`3 -1`), + }, + { + `insert into t6(id) values(4)`, + `select * from t6 where id = 4`, + testkit.Rows(`4 3`), + }, + { + `insert into t6(id, n) values(5, 5.5)`, + `select * from t6 where id = 5`, + testkit.Rows(`5 5.5`), + }, + { + `insert into t6(id) values(6)`, + `select * from t6 where id = 6`, + testkit.Rows(`6 7`), + }, + { + `insert into t6(id, n) values(7, '7.7')`, + `select * from t4 where id = 7`, + testkit.Rows(`7 7.7`), + }, + { + `insert into t6(id) values(8)`, + `select * from t4 where id = 8`, + testkit.Rows(`8 9`), + }, + { + `insert into t6(id, n) values(9, 10.4)`, + `select * from t6 where id = 9`, + testkit.Rows(`9 10.4`), + }, + { + `insert into t6(id) values(10)`, + `select * from t6 where id = 10`, + testkit.Rows(`10 11`), + }, + { + `insert into t7(id, n) values(1, 1)`, + `select * from t7 where id = 1`, + testkit.Rows(`1 1`), + }, + { + `insert into t7(id) values(2)`, + `select * from t7 where id = 2`, + testkit.Rows(`2 2`), + }, + { + `insert into t7(id) values(3)`, + `select * from t7 where id = 3`, + testkit.Rows(`3 3`), + }, + + // the following is test for insert multiple values. + { + `insert into t8(n) values(1),(2)`, + `select * from t8 where id = 1`, + testkit.Rows(`1 1`), + }, + { + `;`, + `select * from t8 where id = 2`, + testkit.Rows(`2 2`), + }, + { + `;`, + `select last_insert_id();`, + testkit.Rows(`1`), + }, + // test user rebase and auto alloc mixture. + { + `insert into t8 values(null, 3),(-1, -1),(null,4),(null, 5)`, + `select * from t8 where id = 3`, + testkit.Rows(`3 3`), + }, + // -1 won't rebase allocator here cause -1 < base. + { + `;`, + `select * from t8 where id = -1`, + testkit.Rows(`-1 -1`), + }, + { + `;`, + `select * from t8 where id = 4`, + testkit.Rows(`4 4`), + }, + { + `;`, + `select * from t8 where id = 5`, + testkit.Rows(`5 5`), + }, + { + `;`, + `select last_insert_id();`, + testkit.Rows(`3`), + }, + { + `insert into t8 values(null, 6),(10, 7),(null, 8)`, + `select * from t8 where id = 6`, + testkit.Rows(`6 6`), + }, + // 10 will rebase allocator here. + { + `;`, + `select * from t8 where id = 10`, + testkit.Rows(`10 7`), + }, + { + `;`, + `select * from t8 where id = 11`, + testkit.Rows(`11 8`), + }, + { + `;`, + `select last_insert_id()`, + testkit.Rows(`6`), + }, + // fix bug for last_insert_id should be first allocated id in insert rows (skip the rebase id). + { + `insert into t8 values(100, 9),(null,10),(null,11)`, + `select * from t8 where id = 100`, + testkit.Rows(`100 9`), + }, + { + `;`, + `select * from t8 where id = 101`, + testkit.Rows(`101 10`), + }, + { + `;`, + `select * from t8 where id = 102`, + testkit.Rows(`102 11`), + }, + { + `;`, + `select last_insert_id()`, + testkit.Rows(`101`), + }, + // test with sql_mode: NO_AUTO_VALUE_ON_ZERO. + { + `;`, + `select @@sql_mode`, + testkit.Rows(`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`), + }, + { + `;`, + "set session sql_mode = `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,NO_AUTO_VALUE_ON_ZERO`", + nil, + }, + { + `insert into t8 values (0, 12), (null, 13)`, + `select * from t8 where id = 0`, + testkit.Rows(`0 12`), + }, + { + `;`, + `select * from t8 where id = 103`, + testkit.Rows(`103 13`), + }, + { + `;`, + `select last_insert_id()`, + testkit.Rows(`103`), + }, + // test without sql_mode: NO_AUTO_VALUE_ON_ZERO. + { + `;`, + "set session sql_mode = `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`", + nil, + }, + // value 0 will be substitute by autoid. + { + `insert into t8 values (0, 14), (null, 15)`, + `select * from t8 where id = 104`, + testkit.Rows(`104 14`), + }, + { + `;`, + `select * from t8 where id = 105`, + testkit.Rows(`105 15`), + }, + { + `;`, + `select last_insert_id()`, + testkit.Rows(`104`), + }, + // last test : auto increment allocation can find in retryInfo. + { + `retry : insert into t8 values (null, 16), (null, 17)`, + `select * from t8 where id = 1000`, + testkit.Rows(`1000 16`), + }, + { + `;`, + `select * from t8 where id = 1001`, + testkit.Rows(`1001 17`), + }, + { + `;`, + `select last_insert_id()`, + // this insert doesn't has the last_insert_id, should be same as the last insert case. + testkit.Rows(`104`), + }, + } + + for _, tt := range tests { + if strings.HasPrefix(tt.insert, "retry : ") { + // it's the last retry insert case, change the sessionVars. + retryInfo := &variable.RetryInfo{Retrying: true} + retryInfo.AddAutoIncrementID(1000) + retryInfo.AddAutoIncrementID(1001) + tk.Session().GetSessionVars().RetryInfo = retryInfo + tk.MustExec(tt.insert[8:]) + tk.Session().GetSessionVars().RetryInfo = &variable.RetryInfo{} + } else { + tk.MustExec(tt.insert) + } + if tt.query == "set session sql_mode = `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,NO_AUTO_VALUE_ON_ZERO`" || + tt.query == "set session sql_mode = `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`" { + tk.MustExec(tt.query) + } else { + tk.MustQuery(tt.query).Check(tt.result) + } + } +} + +// TestAutoIDIncrementAndOffset There is a potential issue in MySQL: when the value of auto_increment_offset is greater +// than that of auto_increment_increment, the value of auto_increment_offset is ignored +// (https://dev.mysql.com/doc/refman/8.0/en/replication-options-master.html#sysvar_auto_increment_increment), +// This issue is a flaw of the implementation of MySQL and it doesn't exist in TiDB. +func TestAutoIDIncrementAndOffset(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec(`use test`) + // Test for offset is larger than increment. + tk.Session().GetSessionVars().AutoIncrementIncrement = 5 + tk.Session().GetSessionVars().AutoIncrementOffset = 10 + + for _, str := range []string{"", " AUTO_ID_CACHE 1"} { + tk.MustExec(`create table io (a int key auto_increment)` + str) + tk.MustExec(`insert into io values (null),(null),(null)`) + tk.MustQuery(`select * from io`).Check(testkit.Rows("10", "15", "20")) + tk.MustExec(`drop table io`) + } + + // Test handle is PK. + for _, str := range []string{"", " AUTO_ID_CACHE 1"} { + tk.MustExec(`create table io (a int key auto_increment)` + str) + tk.Session().GetSessionVars().AutoIncrementOffset = 10 + tk.Session().GetSessionVars().AutoIncrementIncrement = 2 + tk.MustExec(`insert into io values (),(),()`) + tk.MustQuery(`select * from io`).Check(testkit.Rows("10", "12", "14")) + tk.MustExec(`delete from io`) + + // Test reset the increment. + tk.Session().GetSessionVars().AutoIncrementIncrement = 5 + tk.MustExec(`insert into io values (),(),()`) + tk.MustQuery(`select * from io`).Check(testkit.Rows("15", "20", "25")) + tk.MustExec(`delete from io`) + + tk.Session().GetSessionVars().AutoIncrementIncrement = 10 + tk.MustExec(`insert into io values (),(),()`) + tk.MustQuery(`select * from io`).Check(testkit.Rows("30", "40", "50")) + tk.MustExec(`delete from io`) + + tk.Session().GetSessionVars().AutoIncrementIncrement = 5 + tk.MustExec(`insert into io values (),(),()`) + tk.MustQuery(`select * from io`).Check(testkit.Rows("55", "60", "65")) + tk.MustExec(`drop table io`) + } + + // Test handle is not PK. + for _, str := range []string{"", " AUTO_ID_CACHE 1"} { + tk.Session().GetSessionVars().AutoIncrementIncrement = 2 + tk.Session().GetSessionVars().AutoIncrementOffset = 10 + tk.MustExec(`create table io (a int, b int auto_increment, key(b))` + str) + tk.MustExec(`insert into io(b) values (null),(null),(null)`) + // AutoID allocation will take increment and offset into consideration. + tk.MustQuery(`select b from io`).Check(testkit.Rows("10", "12", "14")) + if str == "" { + // HandleID allocation will ignore the increment and offset. + tk.MustQuery(`select _tidb_rowid from io`).Check(testkit.Rows("15", "16", "17")) + } else { + // Separate row id and auto inc id, increment and offset works on auto inc id + tk.MustQuery(`select _tidb_rowid from io`).Check(testkit.Rows("1", "2", "3")) + } + tk.MustExec(`delete from io`) + + tk.Session().GetSessionVars().AutoIncrementIncrement = 10 + tk.MustExec(`insert into io(b) values (null),(null),(null)`) + tk.MustQuery(`select b from io`).Check(testkit.Rows("20", "30", "40")) + if str == "" { + tk.MustQuery(`select _tidb_rowid from io`).Check(testkit.Rows("41", "42", "43")) + } else { + tk.MustQuery(`select _tidb_rowid from io`).Check(testkit.Rows("4", "5", "6")) + } + + // Test invalid value. + tk.Session().GetSessionVars().AutoIncrementIncrement = -1 + tk.Session().GetSessionVars().AutoIncrementOffset = -2 + tk.MustGetErrMsg(`insert into io(b) values (null),(null),(null)`, + "[autoid:8060]Invalid auto_increment settings: auto_increment_increment: -1, auto_increment_offset: -2, both of them must be in range [1..65535]") + tk.MustExec(`delete from io`) + + tk.Session().GetSessionVars().AutoIncrementIncrement = 65536 + tk.Session().GetSessionVars().AutoIncrementOffset = 65536 + tk.MustGetErrMsg(`insert into io(b) values (null),(null),(null)`, + "[autoid:8060]Invalid auto_increment settings: auto_increment_increment: 65536, auto_increment_offset: 65536, both of them must be in range [1..65535]") + + tk.MustExec(`drop table io`) + } +} + +func TestRenameTableForAutoIncrement(t *testing.T) { + store, _ := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("USE test;") + tk.MustExec("drop table if exists t1, t2, t3;") + tk.MustExec("create table t1 (id int key auto_increment);") + tk.MustExec("insert into t1 values ()") + tk.MustExec("rename table t1 to t11") + tk.MustExec("insert into t11 values ()") + // TODO(tiancaiamao): fix bug and uncomment here, rename table should not discard the cached AUTO_ID. + // tk.MustQuery("select * from t11").Check(testkit.Rows("1", "2")) + + // auto_id_cache 1 use another implementation and do not have such bug. + tk.MustExec("create table t2 (id int key auto_increment) auto_id_cache 1;") + tk.MustExec("insert into t2 values ()") + tk.MustExec("rename table t2 to t22") + tk.MustExec("insert into t22 values ()") + tk.MustQuery("select * from t22").Check(testkit.Rows("1", "2")) + + tk.MustExec("create table t3 (id int key auto_increment) auto_id_cache 100;") + tk.MustExec("insert into t3 values ()") + tk.MustExec("rename table t3 to t33") + tk.MustExec("insert into t33 values ()") + // TODO(tiancaiamao): fix bug and uncomment here, rename table should not discard the cached AUTO_ID. + // tk.MustQuery("select * from t33").Check(testkit.Rows("1", "2")) +} + +func TestAlterTableAutoIDCache(t *testing.T) { + store, _ := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("USE test;") + tk.MustExec("drop table if exists t_473;") + tk.MustExec("create table t_473 (id int key auto_increment)") + tk.MustExec("insert into t_473 values ()") + tk.MustQuery("select * from t_473").Check(testkit.Rows("1")) + rs, err := tk.Exec("show table t_473 next_row_id") + require.NoError(t, err) + rows, err1 := session.ResultSetToStringSlice(context.Background(), tk.Session(), rs) + require.NoError(t, err1) + // "test t_473 id 1013608 AUTO_INCREMENT" + val, err2 := strconv.ParseUint(rows[0][3], 10, 64) + require.NoError(t, err2) + + tk.MustExec("alter table t_473 auto_id_cache = 100") + tk.MustQuery("show table t_473 next_row_id").Check(testkit.Rows( + fmt.Sprintf("test t_473 id %d _TIDB_ROWID", val), + "test t_473 id 1 AUTO_INCREMENT", + )) + tk.MustExec("insert into t_473 values ()") + tk.MustQuery("select * from t_473").Check(testkit.Rows("1", fmt.Sprintf("%d", val))) + tk.MustQuery("show table t_473 next_row_id").Check(testkit.Rows( + fmt.Sprintf("test t_473 id %d _TIDB_ROWID", val+100), + "test t_473 id 1 AUTO_INCREMENT", + )) + + // Note that auto_id_cache=1 use a different implementation, switch between them is not allowed. + // TODO: relax this restriction and update the test case. + tk.MustExecToErr("alter table t_473 auto_id_cache = 1") +} + +func TestMockAutoIDServiceError(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("USE test;") + tk.MustExec("create table t_mock_err (id int key auto_increment) auto_id_cache 1") + + failpoint.Enable("github.com/pingcap/tidb/autoid_service/mockErr", `return(true)`) + defer failpoint.Disable("github.com/pingcap/tidb/autoid_service/mockErr") + // Cover a bug that the autoid client retry non-retryable errors forever cause dead loop. + tk.MustExecToErr("insert into t_mock_err values (),()") // mock error, instead of dead loop +} + +func TestIssue39528(t *testing.T) { + // When AUTO_ID_CACHE is 1, it should not affect row id setting when autoid and rowid are separated. + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + tk.MustExec("create table issue39528 (id int unsigned key nonclustered auto_increment) shard_row_id_bits=4 auto_id_cache 1;") + tk.MustExec("insert into issue39528 values ()") + tk.MustExec("insert into issue39528 values ()") + + ctx := context.Background() + var codeRun bool + ctx = context.WithValue(ctx, "testIssue39528", &codeRun) + _, err := tk.ExecWithContext(ctx, "insert into issue39528 values ()") + require.NoError(t, err) + // Make sure the code does not visit tikv on allocate path. + require.False(t, codeRun) +} diff --git a/executor/autoidtest/main_test.go b/executor/autoidtest/main_test.go new file mode 100644 index 0000000000000..f87db4afe1371 --- /dev/null +++ b/executor/autoidtest/main_test.go @@ -0,0 +1,44 @@ +// 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, +// 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 autoid_test + +import ( + "testing" + + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/meta/autoid" + "github.com/tikv/client-go/v2/tikv" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + autoid.SetStep(5000) + config.UpdateGlobal(func(conf *config.Config) { + conf.Log.SlowThreshold = 30000 // 30s + conf.TiKVClient.AsyncCommit.SafeWindow = 0 + conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 + conf.Experimental.AllowsExpressionIndex = true + }) + tikv.EnableFailpoints() + + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), + goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/txnkv/transaction.keepAlive"), + } + goleak.VerifyTestMain(m, opts...) +} diff --git a/executor/batch_checker.go b/executor/batch_checker.go index d3820ecb0d08c..838c6af7bace0 100644 --- a/executor/batch_checker.go +++ b/executor/batch_checker.go @@ -146,8 +146,33 @@ func getKeysNeedCheckOneRow(ctx sessionctx.Context, t table.Table, row []types.D } } - // addChangingColTimes is used to fetch values while processing "modify/change column" operation. - addChangingColTimes := 0 + // extraColumns is used to fetch values while processing "add/drop/modify/change column" operation. + extraColumns := 0 + for _, col := range t.WritableCols() { + // if there is a changing column, append the dependency column for index fetch values + if col.ChangeStateInfo != nil && col.State != model.StatePublic { + value, err := table.CastValue(ctx, row[col.DependencyColumnOffset], col.ColumnInfo, false, false) + if err != nil { + return nil, err + } + row = append(row, value) + extraColumns++ + continue + } + + if col.State != model.StatePublic { + // only append origin default value for index fetch values + if col.Offset >= len(row) { + value, err := table.GetColOriginDefaultValue(ctx, col.ToInfo()) + if err != nil { + return nil, err + } + + row = append(row, value) + extraColumns++ + } + } + } // append unique keys and errors for _, v := range t.Indices() { if !tables.IsIndexWritable(v) { @@ -159,40 +184,38 @@ func getKeysNeedCheckOneRow(ctx sessionctx.Context, t table.Table, row []types.D if t.Meta().IsCommonHandle && v.Meta().Primary { continue } - if len(row) < len(t.WritableCols()) && addChangingColTimes == 0 { - if col := tables.FindChangingCol(t.WritableCols(), v.Meta()); col != nil { - row = append(row, row[col.DependencyColumnOffset]) - addChangingColTimes++ - } - } colVals, err1 := v.FetchValues(row, nil) if err1 != nil { return nil, err1 } // Pass handle = 0 to GenIndexKey, // due to we only care about distinct key. - key, distinct, err1 := v.GenIndexKey(ctx.GetSessionVars().StmtCtx, - colVals, kv.IntHandle(0), nil) - if err1 != nil { - return nil, err1 - } - // Skip the non-distinct keys. - if !distinct { - continue - } - colValStr, err1 := formatDataForDupError(colVals) - if err1 != nil { - return nil, err1 + iter := v.GenIndexKVIter(ctx.GetSessionVars().StmtCtx, colVals, kv.IntHandle(0), nil) + for iter.Valid() { + key, _, distinct, err1 := iter.Next(nil) + if err1 != nil { + return nil, err1 + } + // Skip the non-distinct keys. + if !distinct { + continue + } + // If index is used ingest ways, then we should check key from temp index. + if v.Meta().State != model.StatePublic && v.Meta().BackfillState != model.BackfillStateInapplicable { + _, key, _ = tables.GenTempIdxKeyByState(v.Meta(), key) + } + colValStr, err1 := formatDataForDupError(colVals) + if err1 != nil { + return nil, err1 + } + uniqueKeys = append(uniqueKeys, &keyValueWithDupInfo{ + newKey: key, + dupErr: kv.ErrKeyExists.FastGenByArgs(colValStr, fmt.Sprintf("%s.%s", v.TableMeta().Name.String(), v.Meta().Name.String())), + commonHandle: t.Meta().IsCommonHandle, + }) } - uniqueKeys = append(uniqueKeys, &keyValueWithDupInfo{ - newKey: key, - dupErr: kv.ErrKeyExists.FastGenByArgs(colValStr, fmt.Sprintf("%s.%s", v.TableMeta().Name.String(), v.Meta().Name.String())), - commonHandle: t.Meta().IsCommonHandle, - }) - } - if addChangingColTimes == 1 { - row = row[:len(row)-1] } + row = row[:len(row)-extraColumns] result = append(result, toBeCheckedRow{ row: row, handleKey: handleKey, diff --git a/executor/batch_point_get.go b/executor/batch_point_get.go index 1af256ade8c31..ee9808700aaec 100644 --- a/executor/batch_point_get.go +++ b/executor/batch_point_get.go @@ -29,6 +29,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" driver "github.com/pingcap/tidb/store/driver/txn" + "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" @@ -158,6 +159,9 @@ func MockNewCacheTableSnapShot(snapshot kv.Snapshot, memBuffer kv.MemBuffer) *ca // Close implements the Executor interface. func (e *BatchPointGetExec) Close() error { + if e.runtimeStats != nil { + defer e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) + } if e.runtimeStats != nil && e.snapshot != nil { e.snapshot.SetOption(kv.CollectRuntimeStats, nil) } @@ -190,7 +194,7 @@ func (e *BatchPointGetExec) Next(ctx context.Context, req *chunk.Chunk) error { e.index++ } - err := FillVirtualColumnValue(e.virtualColumnRetFieldTypes, e.virtualColumnIndex, e.schema, e.columns, e.ctx, req) + err := table.FillVirtualColumnValue(e.virtualColumnRetFieldTypes, e.virtualColumnIndex, e.schema.Columns, e.columns, e.ctx, req) if err != nil { return err } diff --git a/executor/benchmark_test.go b/executor/benchmark_test.go index 99bb6ceec9103..3f64164332ce7 100644 --- a/executor/benchmark_test.go +++ b/executor/benchmark_test.go @@ -906,37 +906,44 @@ func prepare4HashJoin(testCase *hashJoinTestCase, innerExec, outerExec Executor) joinSchema.Append(cols1...) } - joinKeys := make([]*expression.Column, 0, len(testCase.keyIdx)) - for _, keyIdx := range testCase.keyIdx { - joinKeys = append(joinKeys, cols0[keyIdx]) - } - probeKeys := make([]*expression.Column, 0, len(testCase.keyIdx)) - for _, keyIdx := range testCase.keyIdx { - probeKeys = append(probeKeys, cols1[keyIdx]) - } + joinKeysColIdx := make([]int, 0, len(testCase.keyIdx)) + joinKeysColIdx = append(joinKeysColIdx, testCase.keyIdx...) + probeKeysColIdx := make([]int, 0, len(testCase.keyIdx)) + probeKeysColIdx = append(probeKeysColIdx, testCase.keyIdx...) e := &HashJoinExec{ baseExecutor: newBaseExecutor(testCase.ctx, joinSchema, 5, innerExec, outerExec), - probeSideTupleFetcher: probeSideTupleFetcher{ + hashJoinCtx: &hashJoinCtx{ + sessCtx: testCase.ctx, + joinType: testCase.joinType, // 0 for InnerJoin, 1 for LeftOutersJoin, 2 for RightOuterJoin + isOuterJoin: false, + useOuterToBuild: testCase.useOuterToBuild, + concurrency: uint(testCase.concurrency), + probeTypes: retTypes(outerExec), + buildTypes: retTypes(innerExec), + }, + probeSideTupleFetcher: &probeSideTupleFetcher{ probeSideExec: outerExec, }, - probeWorkers: make([]probeWorker, testCase.concurrency), - concurrency: uint(testCase.concurrency), - joinType: testCase.joinType, // 0 for InnerJoin, 1 for LeftOutersJoin, 2 for RightOuterJoin - isOuterJoin: false, - buildKeys: joinKeys, - probeKeys: probeKeys, - buildSideExec: innerExec, - buildSideEstCount: float64(testCase.rows), - useOuterToBuild: testCase.useOuterToBuild, + probeWorkers: make([]*probeWorker, testCase.concurrency), + buildWorker: &buildWorker{ + buildKeyColIdx: joinKeysColIdx, + buildSideExec: innerExec, + }, } childrenUsedSchema := markChildrenUsedCols(e.Schema(), e.children[0].Schema(), e.children[1].Schema()) - defaultValues := make([]types.Datum, e.buildSideExec.Schema().Len()) + defaultValues := make([]types.Datum, e.buildWorker.buildSideExec.Schema().Len()) lhsTypes, rhsTypes := retTypes(innerExec), retTypes(outerExec) for i := uint(0); i < e.concurrency; i++ { - e.probeWorkers[i].joiner = newJoiner(testCase.ctx, e.joinType, true, defaultValues, - nil, lhsTypes, rhsTypes, childrenUsedSchema, false) + e.probeWorkers[i] = &probeWorker{ + workerID: i, + hashJoinCtx: e.hashJoinCtx, + joiner: newJoiner(testCase.ctx, e.joinType, true, defaultValues, + nil, lhsTypes, rhsTypes, childrenUsedSchema, false), + probeKeyColIdx: probeKeysColIdx, + } } + e.buildWorker.hashJoinCtx = e.hashJoinCtx memLimit := int64(-1) if testCase.disk { memLimit = 1 @@ -1194,7 +1201,7 @@ func benchmarkBuildHashTable(b *testing.B, casTest *hashJoinTestCase, dataSource close(innerResultCh) b.StartTimer() - if err := exec.buildHashTableForList(innerResultCh); err != nil { + if err := exec.buildWorker.buildHashTableForList(innerResultCh); err != nil { b.Fatal(err) } diff --git a/executor/bind.go b/executor/bind.go index cf337968d4130..90272e6878620 100644 --- a/executor/bind.go +++ b/executor/bind.go @@ -38,6 +38,9 @@ type SQLBindExec struct { isGlobal bool bindAst ast.StmtNode newStatus string + source string // by manual or from history, only in create stmt + sqlDigest string + planDigest string } // Next implements the Executor Next interface. @@ -48,6 +51,8 @@ func (e *SQLBindExec) Next(ctx context.Context, req *chunk.Chunk) error { return e.createSQLBind() case plannercore.OpSQLBindDrop: return e.dropSQLBind() + case plannercore.OpSQLBindDropByDigest: + return e.dropSQLBindByDigest() case plannercore.OpFlushBindings: return e.flushBindings() case plannercore.OpCaptureBindings: @@ -58,6 +63,8 @@ func (e *SQLBindExec) Next(ctx context.Context, req *chunk.Chunk) error { return e.reloadBindings() case plannercore.OpSetBindingStatus: return e.setBindingStatus() + case plannercore.OpSetBindingStatusByDigest: + return e.setBindingStatusByDigest() default: return errors.Errorf("unsupported SQL bind operation: %v", e.sqlBindOp) } @@ -83,6 +90,20 @@ func (e *SQLBindExec) dropSQLBind() error { return err } +func (e *SQLBindExec) dropSQLBindByDigest() error { + if e.sqlDigest == "" { + return errors.New("sql digest is empty") + } + if !e.isGlobal { + handle := e.ctx.Value(bindinfo.SessionBindInfoKeyType).(*bindinfo.SessionHandle) + err := handle.DropBindRecordByDigest(e.sqlDigest) + return err + } + affectedRows, err := domain.GetDomain(e.ctx).BindHandle().DropBindRecordByDigest(e.sqlDigest) + e.ctx.GetSessionVars().StmtCtx.AddAffectedRows(affectedRows) + return err +} + func (e *SQLBindExec) setBindingStatus() error { var bindInfo *bindinfo.Binding if e.bindSQL != "" { @@ -100,6 +121,15 @@ func (e *SQLBindExec) setBindingStatus() error { return err } +func (e *SQLBindExec) setBindingStatusByDigest() error { + ok, err := domain.GetDomain(e.ctx).BindHandle().SetBindRecordStatusByDigest(e.newStatus, e.sqlDigest) + if err == nil && !ok { + warningMess := errors.New("There are no bindings can be set the status. Please check the SQL text") + e.ctx.GetSessionVars().StmtCtx.AppendWarning(warningMess) + } + return err +} + func (e *SQLBindExec) createSQLBind() error { // For audit log, SQLBindExec execute "explain" statement internally, save and recover stmtctx // is necessary to avoid 'create binding' been recorded as 'explain'. @@ -109,11 +139,13 @@ func (e *SQLBindExec) createSQLBind() error { }() bindInfo := bindinfo.Binding{ - BindSQL: e.bindSQL, - Charset: e.charset, - Collation: e.collation, - Status: bindinfo.Enabled, - Source: bindinfo.Manual, + BindSQL: e.bindSQL, + Charset: e.charset, + Collation: e.collation, + Status: bindinfo.Enabled, + Source: e.source, + SQLDigest: e.sqlDigest, + PlanDigest: e.planDigest, } record := &bindinfo.BindRecord{ OriginalSQL: e.normdOrigSQL, diff --git a/executor/brie.go b/executor/brie.go index 608cfd6336b52..b71826ff7df13 100644 --- a/executor/brie.go +++ b/executor/brie.go @@ -199,7 +199,7 @@ func (bq *brieQueue) clearTask(sc *stmtctx.StatementContext) { func (b *executorBuilder) parseTSString(ts string) (uint64, error) { sc := &stmtctx.StatementContext{TimeZone: b.ctx.GetSessionVars().Location()} - t, err := types.ParseTime(sc, ts, mysql.TypeTimestamp, types.MaxFsp) + t, err := types.ParseTime(sc, ts, mysql.TypeTimestamp, types.MaxFsp, nil) if err != nil { return 0, err } @@ -524,6 +524,8 @@ func (gs *tidbGlueSession) CreateTable(ctx context.Context, dbName model.CIStr, return err } gs.se.SetValue(sessionctx.QueryString, result.String()) + // Disable foreign key check when batch create tables. + gs.se.GetSessionVars().ForeignKeyChecks = false // Clone() does not clone partitions yet :( table = table.Clone() diff --git a/executor/builder.go b/executor/builder.go index dfd44d549eff1..132ae66272c69 100644 --- a/executor/builder.go +++ b/executor/builder.go @@ -433,7 +433,8 @@ func buildIndexLookUpChecker(b *executorBuilder, p *plannercore.PhysicalIndexLoo tps := make([]*types.FieldType, 0, fullColLen) for _, col := range is.Columns { - tps = append(tps, &(col.FieldType)) + // tps is used to decode the index, we should use the element type of the array if any. + tps = append(tps, col.FieldType.ArrayType()) } if !e.isCommonHandle() { @@ -480,24 +481,35 @@ func (b *executorBuilder) buildCheckTable(v *plannercore.CheckTable) Executor { return e } -func buildIdxColsConcatHandleCols(tblInfo *model.TableInfo, indexInfo *model.IndexInfo) []*model.ColumnInfo { - handleLen := 1 +func buildIdxColsConcatHandleCols(tblInfo *model.TableInfo, indexInfo *model.IndexInfo, hasGenedCol bool) []*model.ColumnInfo { var pkCols []*model.IndexColumn if tblInfo.IsCommonHandle { pkIdx := tables.FindPrimaryIndex(tblInfo) pkCols = pkIdx.Columns - handleLen = len(pkIdx.Columns) } - columns := make([]*model.ColumnInfo, 0, len(indexInfo.Columns)+handleLen) - for _, idxCol := range indexInfo.Columns { - columns = append(columns, tblInfo.Columns[idxCol.Offset]) + + columns := make([]*model.ColumnInfo, 0, len(indexInfo.Columns)+len(pkCols)) + if hasGenedCol { + columns = tblInfo.Columns + } else { + for _, idxCol := range indexInfo.Columns { + if tblInfo.PKIsHandle && tblInfo.GetPkColInfo().Offset == idxCol.Offset { + continue + } + columns = append(columns, tblInfo.Columns[idxCol.Offset]) + } } + if tblInfo.IsCommonHandle { for _, c := range pkCols { columns = append(columns, tblInfo.Columns[c.Offset]) } return columns } + if tblInfo.PKIsHandle { + columns = append(columns, tblInfo.Columns[tblInfo.GetPkColInfo().Offset]) + return columns + } handleOffset := len(columns) handleColsInfo := &model.ColumnInfo{ ID: model.ExtraHandleID, @@ -522,12 +534,20 @@ func (b *executorBuilder) buildRecoverIndex(v *plannercore.RecoverIndex) Executo b.err = errors.Errorf("secondary index `%v` is not found in table `%v`", v.IndexName, v.Table.Name.O) return nil } + var hasGenedCol bool + for _, iCol := range index.Meta().Columns { + if tblInfo.Columns[iCol.Offset].IsGenerated() { + hasGenedCol = true + } + } + cols := buildIdxColsConcatHandleCols(tblInfo, index.Meta(), hasGenedCol) e := &RecoverIndexExec{ - baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()), - columns: buildIdxColsConcatHandleCols(tblInfo, index.Meta()), - index: index, - table: t, - physicalID: t.Meta().ID, + baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()), + columns: cols, + containsGenedCol: hasGenedCol, + index: index, + table: t, + physicalID: t.Meta().ID, } sessCtx := e.ctx.GetSessionVars().StmtCtx e.handleCols = buildHandleColsForExec(sessCtx, tblInfo, index.Meta(), e.columns) @@ -584,7 +604,7 @@ func (b *executorBuilder) buildCleanupIndex(v *plannercore.CleanupIndex) Executo } e := &CleanupIndexExec{ baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()), - columns: buildIdxColsConcatHandleCols(tblInfo, index.Meta()), + columns: buildIdxColsConcatHandleCols(tblInfo, index.Meta(), false), index: index, table: t, physicalID: t.Meta().ID, @@ -777,6 +797,7 @@ func (b *executorBuilder) buildShow(v *plannercore.PhysicalShow) Executor { Partition: v.Partition, Column: v.Column, IndexName: v.IndexName, + ResourceGroupName: model.NewCIStr(v.ResourceGroupName), Flag: v.Flag, Roles: v.Roles, User: v.User, @@ -935,6 +956,7 @@ func (b *executorBuilder) buildLoadData(v *plannercore.LoadData) Executor { IgnoreLines: v.IgnoreLines, ColumnAssignments: v.ColumnAssignments, ColumnsAndUserVars: v.ColumnsAndUserVars, + OnDuplicate: v.OnDuplicate, Ctx: b.ctx, } columnNames := loadDataInfo.initFieldMappings() @@ -945,7 +967,7 @@ func (b *executorBuilder) buildLoadData(v *plannercore.LoadData) Executor { } loadDataExec := &LoadDataExec{ baseExecutor: newBaseExecutor(b.ctx, nil, v.ID()), - IsLocal: v.IsLocal, + FileLocRef: v.FileLocRef, OnDuplicate: v.OnDuplicate, loadDataInfo: loadDataInfo, } @@ -1003,6 +1025,28 @@ func (b *executorBuilder) buildPlanReplayer(v *plannercore.PlanReplayer) Executo } return e } + if v.Capture { + e := &PlanReplayerExec{ + baseExecutor: newBaseExecutor(b.ctx, nil, v.ID()), + CaptureInfo: &PlanReplayerCaptureInfo{ + SQLDigest: v.SQLDigest, + PlanDigest: v.PlanDigest, + }, + } + return e + } + if v.Remove { + e := &PlanReplayerExec{ + baseExecutor: newBaseExecutor(b.ctx, nil, v.ID()), + CaptureInfo: &PlanReplayerCaptureInfo{ + SQLDigest: v.SQLDigest, + PlanDigest: v.PlanDigest, + Remove: true, + }, + } + return e + } + e := &PlanReplayerExec{ baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()), DumpInfo: &PlanReplayerDumpInfo{ @@ -1075,7 +1119,12 @@ func (b *executorBuilder) setTelemetryInfo(v *plannercore.DDL) { } b.Ti.PartitionTelemetry.UseAddIntervalPartition = true case ast.AlterTableExchangePartition: - b.Ti.UesExchangePartition = true + b.Ti.UseExchangePartition = true + case ast.AlterTableReorganizePartition: + if b.Ti.PartitionTelemetry == nil { + b.Ti.PartitionTelemetry = &PartitionTelemetryInfo{} + } + b.Ti.PartitionTelemetry.UseReorganizePartition = true } } case *ast.CreateTableStmt: @@ -1389,17 +1438,6 @@ func (b *executorBuilder) buildMergeJoin(v *plannercore.PhysicalMergeJoin) Execu return e } -func (b *executorBuilder) buildSideEstCount(v *plannercore.PhysicalHashJoin) float64 { - buildSide := v.Children()[v.InnerChildIdx] - if v.UseOuterToBuild { - buildSide = v.Children()[1-v.InnerChildIdx] - } - if buildSide.Stats().HistColl == nil || buildSide.Stats().HistColl.Pseudo { - return 0.0 - } - return buildSide.StatsCount() -} - func (b *executorBuilder) buildHashJoin(v *plannercore.PhysicalHashJoin) Executor { leftExec := b.build(v.Children()[0]) if b.err != nil { @@ -1412,12 +1450,19 @@ func (b *executorBuilder) buildHashJoin(v *plannercore.PhysicalHashJoin) Executo } e := &HashJoinExec{ - baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID(), leftExec, rightExec), - concurrency: v.Concurrency, - joinType: v.JoinType, - isOuterJoin: v.JoinType.IsOuterJoin(), - useOuterToBuild: v.UseOuterToBuild, + baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID(), leftExec, rightExec), + probeSideTupleFetcher: &probeSideTupleFetcher{}, + probeWorkers: make([]*probeWorker, v.Concurrency), + buildWorker: &buildWorker{}, + hashJoinCtx: &hashJoinCtx{ + sessCtx: b.ctx, + isOuterJoin: v.JoinType.IsOuterJoin(), + useOuterToBuild: v.UseOuterToBuild, + joinType: v.JoinType, + concurrency: v.Concurrency, + }, } + e.hashJoinCtx.allocPool = e.AllocPool defaultValues := v.DefaultValues lhsTypes, rhsTypes := retTypes(leftExec), retTypes(rightExec) if v.InnerChildIdx == 1 { @@ -1435,15 +1480,17 @@ func (b *executorBuilder) buildHashJoin(v *plannercore.PhysicalHashJoin) Executo leftIsBuildSide := true e.isNullEQ = v.IsNullEQ + var probeKeys, probeNAKeys, buildKeys, buildNAKeys []*expression.Column + var buildSideExec Executor if v.UseOuterToBuild { // update the buildSideEstCount due to changing the build side if v.InnerChildIdx == 1 { - e.buildSideExec, e.buildKeys, e.buildNAKeys = leftExec, v.LeftJoinKeys, v.LeftNAJoinKeys - e.probeSideTupleFetcher.probeSideExec, e.probeKeys, e.probeNAKeys = rightExec, v.RightJoinKeys, v.RightNAJoinKeys + buildSideExec, buildKeys, buildNAKeys = leftExec, v.LeftJoinKeys, v.LeftNAJoinKeys + e.probeSideTupleFetcher.probeSideExec, probeKeys, probeNAKeys = rightExec, v.RightJoinKeys, v.RightNAJoinKeys e.outerFilter = v.LeftConditions } else { - e.buildSideExec, e.buildKeys, e.buildNAKeys = rightExec, v.RightJoinKeys, v.RightNAJoinKeys - e.probeSideTupleFetcher.probeSideExec, e.probeKeys, e.probeNAKeys = leftExec, v.LeftJoinKeys, v.LeftNAJoinKeys + buildSideExec, buildKeys, buildNAKeys = rightExec, v.RightJoinKeys, v.RightNAJoinKeys + e.probeSideTupleFetcher.probeSideExec, probeKeys, probeNAKeys = leftExec, v.LeftJoinKeys, v.LeftNAJoinKeys e.outerFilter = v.RightConditions leftIsBuildSide = false } @@ -1452,27 +1499,48 @@ func (b *executorBuilder) buildHashJoin(v *plannercore.PhysicalHashJoin) Executo } } else { if v.InnerChildIdx == 0 { - e.buildSideExec, e.buildKeys, e.buildNAKeys = leftExec, v.LeftJoinKeys, v.LeftNAJoinKeys - e.probeSideTupleFetcher.probeSideExec, e.probeKeys, e.probeNAKeys = rightExec, v.RightJoinKeys, v.RightNAJoinKeys + buildSideExec, buildKeys, buildNAKeys = leftExec, v.LeftJoinKeys, v.LeftNAJoinKeys + e.probeSideTupleFetcher.probeSideExec, probeKeys, probeNAKeys = rightExec, v.RightJoinKeys, v.RightNAJoinKeys e.outerFilter = v.RightConditions } else { - e.buildSideExec, e.buildKeys, e.buildNAKeys = rightExec, v.RightJoinKeys, v.RightNAJoinKeys - e.probeSideTupleFetcher.probeSideExec, e.probeKeys, e.probeNAKeys = leftExec, v.LeftJoinKeys, v.LeftNAJoinKeys + buildSideExec, buildKeys, buildNAKeys = rightExec, v.RightJoinKeys, v.RightNAJoinKeys + e.probeSideTupleFetcher.probeSideExec, probeKeys, probeNAKeys = leftExec, v.LeftJoinKeys, v.LeftNAJoinKeys e.outerFilter = v.LeftConditions leftIsBuildSide = false } if defaultValues == nil { - defaultValues = make([]types.Datum, e.buildSideExec.Schema().Len()) + defaultValues = make([]types.Datum, buildSideExec.Schema().Len()) } } + probeKeyColIdx := make([]int, len(probeKeys)) + probeNAKeColIdx := make([]int, len(probeNAKeys)) + buildKeyColIdx := make([]int, len(buildKeys)) + buildNAKeyColIdx := make([]int, len(buildNAKeys)) + for i := range buildKeys { + buildKeyColIdx[i] = buildKeys[i].Index + } + for i := range buildNAKeys { + buildNAKeyColIdx[i] = buildNAKeys[i].Index + } + for i := range probeKeys { + probeKeyColIdx[i] = probeKeys[i].Index + } + for i := range probeNAKeys { + probeNAKeColIdx[i] = probeNAKeys[i].Index + } isNAJoin := len(v.LeftNAJoinKeys) > 0 - e.buildSideEstCount = b.buildSideEstCount(v) childrenUsedSchema := markChildrenUsedCols(v.Schema(), v.Children()[0].Schema(), v.Children()[1].Schema()) - e.probeWorkers = make([]probeWorker, e.concurrency) for i := uint(0); i < e.concurrency; i++ { - e.probeWorkers[i].joiner = newJoiner(b.ctx, v.JoinType, v.InnerChildIdx == 0, defaultValues, - v.OtherConditions, lhsTypes, rhsTypes, childrenUsedSchema, isNAJoin) + e.probeWorkers[i] = &probeWorker{ + hashJoinCtx: e.hashJoinCtx, + workerID: i, + joiner: newJoiner(b.ctx, v.JoinType, v.InnerChildIdx == 0, defaultValues, v.OtherConditions, lhsTypes, rhsTypes, childrenUsedSchema, isNAJoin), + probeKeyColIdx: probeKeyColIdx, + probeNAKeyColIdx: probeNAKeColIdx, + } } + e.buildWorker.buildKeyColIdx, e.buildWorker.buildNAKeyColIdx, e.buildWorker.buildSideExec, e.buildWorker.hashJoinCtx = buildKeyColIdx, buildNAKeyColIdx, buildSideExec, e.hashJoinCtx + e.hashJoinCtx.isNullAware = isNAJoin executorCountHashJoinExec.Inc() // We should use JoinKey to construct the type information using by hashing, instead of using the child's schema directly. @@ -1694,7 +1762,7 @@ func (b *executorBuilder) buildTableDual(v *plannercore.PhysicalTableDual) Execu // `getSnapshotTS` returns for-update-ts if in insert/update/delete/lock statement otherwise the isolation read ts // Please notice that in RC isolation, the above two ts are the same -func (b *executorBuilder) getSnapshotTS() (uint64, error) { +func (b *executorBuilder) getSnapshotTS() (ts uint64, err error) { if b.forDataReaderBuilder { return b.dataReaderTS, nil } @@ -1885,8 +1953,6 @@ func (b *executorBuilder) buildMemTable(v *plannercore.PhysicalMemTable) Executo strings.ToLower(infoschema.TableTiFlashReplica), strings.ToLower(infoschema.TableTiDBServersInfo), strings.ToLower(infoschema.TableTiKVStoreStatus), - strings.ToLower(infoschema.TableStatementsSummaryEvicted), - strings.ToLower(infoschema.ClusterTableStatementsSummaryEvicted), strings.ToLower(infoschema.TableClientErrorsSummaryGlobal), strings.ToLower(infoschema.TableClientErrorsSummaryByUser), strings.ToLower(infoschema.TableClientErrorsSummaryByHost), @@ -1899,7 +1965,8 @@ func (b *executorBuilder) buildMemTable(v *plannercore.PhysicalMemTable) Executo strings.ToLower(infoschema.TableMemoryUsage), strings.ToLower(infoschema.TableMemoryUsageOpsHistory), strings.ToLower(infoschema.ClusterTableMemoryUsage), - strings.ToLower(infoschema.ClusterTableMemoryUsageOpsHistory): + strings.ToLower(infoschema.ClusterTableMemoryUsageOpsHistory), + strings.ToLower(infoschema.TableResourceGroups): return &MemTableReaderExec{ baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()), table: v.Table, @@ -1940,16 +2007,18 @@ func (b *executorBuilder) buildMemTable(v *plannercore.PhysicalMemTable) Executo } case strings.ToLower(infoschema.TableStatementsSummary), strings.ToLower(infoschema.TableStatementsSummaryHistory), + strings.ToLower(infoschema.TableStatementsSummaryEvicted), + strings.ToLower(infoschema.ClusterTableStatementsSummary), strings.ToLower(infoschema.ClusterTableStatementsSummaryHistory), - strings.ToLower(infoschema.ClusterTableStatementsSummary): + strings.ToLower(infoschema.ClusterTableStatementsSummaryEvicted): + var extractor *plannercore.StatementsSummaryExtractor + if v.Extractor != nil { + extractor = v.Extractor.(*plannercore.StatementsSummaryExtractor) + } return &MemTableReaderExec{ baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()), table: v.Table, - retriever: &stmtSummaryTableRetriever{ - table: v.Table, - columns: v.Columns, - extractor: v.Extractor.(*plannercore.StatementsSummaryExtractor), - }, + retriever: buildStmtSummaryRetriever(b.ctx, v.Table, v.Columns, extractor), } case strings.ToLower(infoschema.TableColumns): return &MemTableReaderExec{ @@ -1963,7 +2032,6 @@ func (b *executorBuilder) buildMemTable(v *plannercore.PhysicalMemTable) Executo viewOutputNamesMap: make(map[int64]types.NameSlice), }, } - case strings.ToLower(infoschema.TableSlowQuery), strings.ToLower(infoschema.ClusterTableSlowLog): memTracker := memory.NewTracker(v.ID(), -1) memTracker.AttachTo(b.ctx.GetSessionVars().StmtCtx.MemTracker) @@ -2550,7 +2618,7 @@ func (b *executorBuilder) buildAnalyzeSamplingPushdown(task plannercore.AnalyzeC SampleSize: int64(opts[ast.AnalyzeOptNumSamples]), SampleRate: sampleRate, SketchSize: maxSketchSize, - ColumnsInfo: util.ColumnsToProto(task.ColsInfo, task.TblInfo.PKIsHandle), + ColumnsInfo: util.ColumnsToProto(task.ColsInfo, task.TblInfo.PKIsHandle, false), ColumnGroups: colGroups, } if task.TblInfo != nil { @@ -2711,7 +2779,7 @@ func (b *executorBuilder) buildAnalyzeColumnsPushdown(task plannercore.AnalyzeCo BucketSize: int64(opts[ast.AnalyzeOptNumBuckets]), SampleSize: MaxRegionSampleSize, SketchSize: maxSketchSize, - ColumnsInfo: util.ColumnsToProto(cols, task.HandleCols != nil && task.HandleCols.IsInt()), + ColumnsInfo: util.ColumnsToProto(cols, task.HandleCols != nil && task.HandleCols.IsInt(), false), CmsketchDepth: &depth, CmsketchWidth: &width, } @@ -3255,7 +3323,11 @@ func (b *executorBuilder) buildIndexLookUpMergeJoin(v *plannercore.PhysicalIndex } func (b *executorBuilder) buildIndexNestedLoopHashJoin(v *plannercore.PhysicalIndexHashJoin) Executor { - e := b.buildIndexLookUpJoin(&(v.PhysicalIndexJoin)).(*IndexLookUpJoin) + join := b.buildIndexLookUpJoin(&(v.PhysicalIndexJoin)) + if b.err != nil { + return nil + } + e := join.(*IndexLookUpJoin) idxHash := &IndexNestedLoopHashJoin{ IndexLookUpJoin: *e, keepOuterOrder: v.KeepOuterOrder, @@ -3363,22 +3435,22 @@ func (b *executorBuilder) buildMPPGather(v *plannercore.PhysicalTableReader) Exe b.err = err return nil } + gather := &MPPGather{ baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()), is: b.is, originalPlan: v.GetTablePlan(), startTS: startTs, + mppQueryID: kv.MPPQueryID{QueryTs: getMPPQueryTS(b.ctx), LocalQueryID: getMPPQueryID(b.ctx), ServerID: domain.GetDomain(b.ctx).ServerID()}, + memTracker: memory.NewTracker(v.ID(), -1), } + gather.memTracker.AttachTo(b.ctx.GetSessionVars().StmtCtx.MemTracker) return gather } // buildTableReader builds a table reader executor. It first build a no range table reader, // and then update it ranges from table scan plan. func (b *executorBuilder) buildTableReader(v *plannercore.PhysicalTableReader) Executor { - if v.StoreType != kv.TiKV && b.isStaleness { - b.err = errors.New("stale requests require tikv backend") - return nil - } failpoint.Inject("checkUseMPP", func(val failpoint.Value) { if !b.ctx.GetSessionVars().InRestrictedSQL && val.(bool) != useMPPExecution(b.ctx, v) { if val.(bool) { @@ -3477,17 +3549,43 @@ func buildIndexRangeForEachPartition(ctx sessionctx.Context, usedPartitions []ta return nextRange, nil } -func keyColumnsIncludeAllPartitionColumns(keyColumns []int, pe *tables.PartitionExpr) bool { - tmp := make(map[int]struct{}, len(keyColumns)) - for _, offset := range keyColumns { - tmp[offset] = struct{}{} +func getPartitionKeyColOffsets(keyColIDs []int64, pt table.PartitionedTable) []int { + keyColOffsets := make([]int, len(keyColIDs)) + for i, colID := range keyColIDs { + offset := -1 + for j, col := range pt.Cols() { + if colID == col.ID { + offset = j + break + } + } + if offset == -1 { + return nil + } + keyColOffsets[i] = offset + } + + t, ok := pt.(interface { + PartitionExpr() *tables.PartitionExpr + }) + if !ok { + return nil + } + pe := t.PartitionExpr() + if pe == nil { + return nil + } + + offsetMap := make(map[int]struct{}) + for _, offset := range keyColOffsets { + offsetMap[offset] = struct{}{} } for _, offset := range pe.ColumnOffset { - if _, ok := tmp[offset]; !ok { - return false + if _, ok := offsetMap[offset]; !ok { + return nil } } - return true + return keyColOffsets } func (builder *dataReaderBuilder) prunePartitionForInnerExecutor(tbl table.Table, schema *expression.Schema, partitionInfo *plannercore.PartitionInfo, @@ -3502,15 +3600,6 @@ func (builder *dataReaderBuilder) prunePartitionForInnerExecutor(tbl table.Table return nil, false, nil, err } - // check whether can runtime prune. - type partitionExpr interface { - PartitionExpr() (*tables.PartitionExpr, error) - } - pe, err := tbl.(partitionExpr).PartitionExpr() - if err != nil { - return nil, false, nil, err - } - // recalculate key column offsets if len(lookUpContent) == 0 { return nil, false, nil, nil @@ -3518,37 +3607,17 @@ func (builder *dataReaderBuilder) prunePartitionForInnerExecutor(tbl table.Table if lookUpContent[0].keyColIDs == nil { return nil, false, nil, plannercore.ErrInternal.GenWithStack("cannot get column IDs when dynamic pruning") } - keyColOffsets := make([]int, len(lookUpContent[0].keyColIDs)) - for i, colID := range lookUpContent[0].keyColIDs { - offset := -1 - for j, col := range partitionTbl.Cols() { - if colID == col.ID { - offset = j - break - } - } - if offset == -1 { - return nil, false, nil, plannercore.ErrInternal.GenWithStack("invalid column offset when dynamic pruning") - } - keyColOffsets[i] = offset - } - - offsetMap := make(map[int]bool) - for _, offset := range keyColOffsets { - offsetMap[offset] = true - } - for _, offset := range pe.ColumnOffset { - if _, ok := offsetMap[offset]; !ok { - return condPruneResult, false, nil, nil - } + keyColOffsets := getPartitionKeyColOffsets(lookUpContent[0].keyColIDs, partitionTbl) + if len(keyColOffsets) == 0 { + return condPruneResult, false, nil, nil } locateKey := make([]types.Datum, len(partitionTbl.Cols())) partitions := make(map[int64]table.PhysicalTable) contentPos = make([]int64, len(lookUpContent)) for idx, content := range lookUpContent { - for i, date := range content.keys { - locateKey[keyColOffsets[i]] = date + for i, data := range content.keys { + locateKey[keyColOffsets[i]] = data } p, err := partitionTbl.GetPartitionByRow(builder.ctx, locateKey) if err != nil { @@ -3813,6 +3882,9 @@ func buildNoRangeIndexLookUpReader(b *executorBuilder, v *plannercore.PhysicalIn } func (b *executorBuilder) buildIndexLookUpReader(v *plannercore.PhysicalIndexLookUpReader) Executor { + if b.Ti != nil { + b.Ti.UseTableLookUp = true + } is := v.IndexPlans[0].(*plannercore.PhysicalIndexScan) if err := b.validCanReadTemporaryOrCacheTable(is.Table); err != nil { b.err = err @@ -3940,6 +4012,7 @@ func buildNoRangeIndexMergeReader(b *executorBuilder, v *plannercore.PhysicalInd isCorColInPartialFilters: isCorColInPartialFilters, isCorColInTableFilter: isCorColInTableFilter, isCorColInPartialAccess: isCorColInPartialAccess, + isIntersection: v.IsIntersectionType, } collectTable := false e.tableRequest.CollectRangeCounts = &collectTable @@ -3947,6 +4020,10 @@ func buildNoRangeIndexMergeReader(b *executorBuilder, v *plannercore.PhysicalInd } func (b *executorBuilder) buildIndexMergeReader(v *plannercore.PhysicalIndexMergeReader) Executor { + if b.Ti != nil { + b.Ti.UseIndexMerge = true + b.Ti.UseTableLookUp = true + } ts := v.TablePlans[0].(*plannercore.PhysicalTableScan) if err := b.validCanReadTemporaryOrCacheTable(ts.Table); err != nil { b.err = err @@ -4111,12 +4188,6 @@ func (builder *dataReaderBuilder) buildTableReaderForIndexJoin(ctx context.Conte } tbl, _ := builder.is.TableByID(tbInfo.ID) pt := tbl.(table.PartitionedTable) - pe, err := tbl.(interface { - PartitionExpr() (*tables.PartitionExpr, error) - }).PartitionExpr() - if err != nil { - return nil, err - } partitionInfo := &v.PartitionInfo usedPartitionList, err := builder.partitionPruning(pt, partitionInfo.PruningConds, partitionInfo.PartitionNames, partitionInfo.Columns, partitionInfo.ColumnNames) if err != nil { @@ -4127,15 +4198,19 @@ func (builder *dataReaderBuilder) buildTableReaderForIndexJoin(ctx context.Conte usedPartitions[p.GetPhysicalID()] = p } var kvRanges []kv.KeyRange + var keyColOffsets []int + if len(lookUpContents) > 0 { + keyColOffsets = getPartitionKeyColOffsets(lookUpContents[0].keyColIDs, pt) + } if v.IsCommonHandle { - if len(lookUpContents) > 0 && keyColumnsIncludeAllPartitionColumns(lookUpContents[0].keyCols, pe) { - locateKey := make([]types.Datum, e.Schema().Len()) + if len(keyColOffsets) > 0 { + locateKey := make([]types.Datum, len(pt.Cols())) kvRanges = make([]kv.KeyRange, 0, len(lookUpContents)) // lookUpContentsByPID groups lookUpContents by pid(partition) so that kv ranges for same partition can be merged. lookUpContentsByPID := make(map[int64][]*indexJoinLookUpContent) for _, content := range lookUpContents { - for i, date := range content.keys { - locateKey[content.keyCols[i]] = date + for i, data := range content.keys { + locateKey[keyColOffsets[i]] = data } p, err := pt.GetPartitionByRow(e.ctx, locateKey) if err != nil { @@ -4174,12 +4249,12 @@ func (builder *dataReaderBuilder) buildTableReaderForIndexJoin(ctx context.Conte handles, lookUpContents := dedupHandles(lookUpContents) - if len(lookUpContents) > 0 && keyColumnsIncludeAllPartitionColumns(lookUpContents[0].keyCols, pe) { - locateKey := make([]types.Datum, e.Schema().Len()) + if len(keyColOffsets) > 0 { + locateKey := make([]types.Datum, len(pt.Cols())) kvRanges = make([]kv.KeyRange, 0, len(lookUpContents)) for _, content := range lookUpContents { - for i, date := range content.keys { - locateKey[content.keyCols[i]] = date + for i, data := range content.keys { + locateKey[keyColOffsets[i]] = data } p, err := pt.GetPartitionByRow(e.ctx, locateKey) if err != nil { @@ -4190,13 +4265,13 @@ func (builder *dataReaderBuilder) buildTableReaderForIndexJoin(ctx context.Conte continue } handle := kv.IntHandle(content.keys[0].GetInt64()) - tmp, _ := distsql.TableHandlesToKVRanges(pid, []kv.Handle{handle}) - kvRanges = append(kvRanges, tmp...) + ranges, _ := distsql.TableHandlesToKVRanges(pid, []kv.Handle{handle}) + kvRanges = append(kvRanges, ranges...) } } else { for _, p := range usedPartitionList { - tmp, _ := distsql.TableHandlesToKVRanges(p.GetPhysicalID(), handles) - kvRanges = append(kvRanges, tmp...) + ranges, _ := distsql.TableHandlesToKVRanges(p.GetPhysicalID(), handles) + kvRanges = append(kvRanges, ranges...) } } @@ -4233,32 +4308,37 @@ type kvRangeBuilderFromRangeAndPartition struct { } func (h kvRangeBuilderFromRangeAndPartition) buildKeyRangeSeparately(ranges []*ranger.Range) ([]int64, [][]kv.KeyRange, error) { - ret := make([][]kv.KeyRange, 0, len(h.partitions)) + ret := make([][]kv.KeyRange, len(h.partitions)) pids := make([]int64, 0, len(h.partitions)) - for _, p := range h.partitions { + for i, p := range h.partitions { pid := p.GetPhysicalID() + pids = append(pids, pid) meta := p.Meta() + if len(ranges) == 0 { + continue + } kvRange, err := distsql.TableHandleRangesToKVRanges(h.sctx.GetSessionVars().StmtCtx, []int64{pid}, meta != nil && meta.IsCommonHandle, ranges, nil) if err != nil { return nil, nil, err } - pids = append(pids, pid) - ret = append(ret, kvRange) + ret[i] = kvRange.AppendSelfTo(ret[i]) } return pids, ret, nil } -func (h kvRangeBuilderFromRangeAndPartition) buildKeyRange(ranges []*ranger.Range) ([]kv.KeyRange, error) { - //nolint: prealloc - var ret []kv.KeyRange - for _, p := range h.partitions { +func (h kvRangeBuilderFromRangeAndPartition) buildKeyRange(ranges []*ranger.Range) ([][]kv.KeyRange, error) { + ret := make([][]kv.KeyRange, len(h.partitions)) + if len(ranges) == 0 { + return ret, nil + } + for i, p := range h.partitions { pid := p.GetPhysicalID() meta := p.Meta() kvRange, err := distsql.TableHandleRangesToKVRanges(h.sctx.GetSessionVars().StmtCtx, []int64{pid}, meta != nil && meta.IsCommonHandle, ranges, nil) if err != nil { return nil, err } - ret = append(ret, kvRange...) + ret[i] = kvRange.AppendSelfTo(ret[i]) } return ret, nil } @@ -4305,7 +4385,7 @@ func (builder *dataReaderBuilder) buildTableReaderBase(ctx context.Context, e *T if err != nil { return nil, err } - e.kvRanges = append(e.kvRanges, kvReq.KeyRanges...) + e.kvRanges = kvReq.KeyRanges.AppendSelfTo(e.kvRanges) e.resultHandler = &tableResultHandler{} result, err := builder.SelectResult(ctx, builder.ctx, kvReq, retTypes(e), e.feedback, getPhysicalPlanIDs(e.plans), e.id) if err != nil { @@ -4328,6 +4408,8 @@ func (builder *dataReaderBuilder) buildTableReaderFromHandles(ctx context.Contex } else { b.SetTableHandles(getPhysicalTableID(e.table), handles) } + } else { + b.SetKeyRanges(nil) } return builder.buildTableReaderBase(ctx, e, b) } @@ -4386,6 +4468,9 @@ func (builder *dataReaderBuilder) buildIndexReaderForIndexJoin(ctx context.Conte func (builder *dataReaderBuilder) buildIndexLookUpReaderForIndexJoin(ctx context.Context, v *plannercore.PhysicalIndexLookUpReader, lookUpContents []*indexJoinLookUpContent, indexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager, memTracker *memory.Tracker, interruptSignal *atomic.Value) (Executor, error) { + if builder.Ti != nil { + builder.Ti.UseTableLookUp = true + } e, err := buildNoRangeIndexLookUpReader(builder.executorBuilder, v) if err != nil { return nil, err @@ -4516,6 +4601,9 @@ func buildRangesForIndexJoin(ctx sessionctx.Context, lookUpContents []*indexJoin func buildKvRangesForIndexJoin(ctx sessionctx.Context, tableID, indexID int64, lookUpContents []*indexJoinLookUpContent, ranges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager, memTracker *memory.Tracker, interruptSignal *atomic.Value) (_ []kv.KeyRange, err error) { kvRanges := make([]kv.KeyRange, 0, len(ranges)*len(lookUpContents)) + if len(ranges) == 0 { + return []kv.KeyRange{}, nil + } lastPos := len(ranges[0].LowVal) - 1 sc := ctx.GetSessionVars().StmtCtx tmpDatumRanges := make([]*ranger.Range, 0, len(lookUpContents)) @@ -4528,7 +4616,7 @@ func buildKvRangesForIndexJoin(ctx sessionctx.Context, tableID, indexID int64, l } if cwc == nil { // Index id is -1 means it's a common handle. - var tmpKvRanges []kv.KeyRange + var tmpKvRanges *kv.KeyRanges var err error if indexID == -1 { tmpKvRanges, err = distsql.CommonHandleRangesToKVRanges(sc, []int64{tableID}, ranges) @@ -4538,7 +4626,7 @@ func buildKvRangesForIndexJoin(ctx sessionctx.Context, tableID, indexID int64, l if err != nil { return nil, err } - kvRanges = append(kvRanges, tmpKvRanges...) + kvRanges = tmpKvRanges.AppendSelfTo(kvRanges) continue } nextColRanges, err := cwc.BuildRangesByRow(ctx, content.row) @@ -4575,9 +4663,11 @@ func buildKvRangesForIndexJoin(ctx sessionctx.Context, tableID, indexID int64, l } // Index id is -1 means it's a common handle. if indexID == -1 { - return distsql.CommonHandleRangesToKVRanges(ctx.GetSessionVars().StmtCtx, []int64{tableID}, tmpDatumRanges) + tmpKeyRanges, err := distsql.CommonHandleRangesToKVRanges(ctx.GetSessionVars().StmtCtx, []int64{tableID}, tmpDatumRanges) + return tmpKeyRanges.FirstPartitionRange(), err } - return distsql.IndexRangesToKVRangesWithInterruptSignal(ctx.GetSessionVars().StmtCtx, tableID, indexID, tmpDatumRanges, nil, memTracker, interruptSignal) + tmpKeyRanges, err := distsql.IndexRangesToKVRangesWithInterruptSignal(ctx.GetSessionVars().StmtCtx, tableID, indexID, tmpDatumRanges, nil, memTracker, interruptSignal) + return tmpKeyRanges.FirstPartitionRange(), err } func (b *executorBuilder) buildWindow(v *plannercore.PhysicalWindow) Executor { @@ -4770,6 +4860,9 @@ func (b *executorBuilder) buildSQLBindExec(v *plannercore.SQLBindPlan) Executor isGlobal: v.IsGlobal, bindAst: v.BindStmt, newStatus: v.NewStatus, + source: v.Source, + sqlDigest: v.SQLDigest, + planDigest: v.PlanDigest, } return e } @@ -4859,13 +4952,13 @@ func (b *executorBuilder) buildBatchPointGet(plan *plannercore.BatchPointGetPlan if e.ctx.GetSessionVars().IsReplicaReadClosestAdaptive() { e.snapshot.SetOption(kv.ReplicaReadAdjuster, newReplicaReadAdjuster(e.ctx, plan.GetAvgRowSize())) } + e.snapshot.SetOption(kv.ResourceGroupName, b.ctx.GetSessionVars().ResourceGroupName) if e.runtimeStats != nil { snapshotStats := &txnsnapshot.SnapshotRuntimeStats{} e.stats = &runtimeStatsWithSnapshot{ SnapshotRuntimeStats: snapshotStats, } e.snapshot.SetOption(kv.CollectRuntimeStats, snapshotStats) - b.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) } if plan.IndexInfo != nil { @@ -5261,6 +5354,10 @@ func (b *executorBuilder) buildCompactTable(v *plannercore.CompactTable) Executo } partitionIDs = append(partitionIDs, partitionID) } + if b.Ti.PartitionTelemetry == nil { + b.Ti.PartitionTelemetry = &PartitionTelemetryInfo{} + } + b.Ti.PartitionTelemetry.UseCompactTablePartition = true } return &CompactTableTiFlashExec{ diff --git a/executor/checksum.go b/executor/checksum.go index fa2d02338ec3f..845c1b85d4c66 100644 --- a/executor/checksum.go +++ b/executor/checksum.go @@ -246,6 +246,7 @@ func (c *checksumContext) buildTableRequest(ctx sessionctx.Context, tableID int6 SetChecksumRequest(checksum). SetStartTS(c.StartTs). SetConcurrency(ctx.GetSessionVars().DistSQLScanConcurrency()). + SetResourceGroupName(ctx.GetSessionVars().ResourceGroupName). Build() } @@ -263,6 +264,7 @@ func (c *checksumContext) buildIndexRequest(ctx sessionctx.Context, tableID int6 SetChecksumRequest(checksum). SetStartTS(c.StartTs). SetConcurrency(ctx.GetSessionVars().DistSQLScanConcurrency()). + SetResourceGroupName(ctx.GetSessionVars().ResourceGroupName). Build() } diff --git a/executor/compiler.go b/executor/compiler.go index 241b15874e1e2..29c024a9991e6 100644 --- a/executor/compiler.go +++ b/executor/compiler.go @@ -18,7 +18,6 @@ import ( "context" "strings" - "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" @@ -32,6 +31,7 @@ import ( "github.com/pingcap/tidb/sessiontxn/staleread" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/memory" + "github.com/pingcap/tidb/util/tracing" "go.uber.org/zap" ) @@ -56,11 +56,9 @@ type Compiler struct { // Compile compiles an ast.StmtNode to a physical plan. func (c *Compiler) Compile(ctx context.Context, stmtNode ast.StmtNode) (_ *ExecStmt, err error) { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("executor.Compile", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } + r, ctx := tracing.StartRegionEx(ctx, "executor.Compile") + defer r.End() + defer func() { r := recover() if r == nil { @@ -154,6 +152,9 @@ func (c *Compiler) Compile(ctx context.Context, stmtNode ast.StmtNode) (_ *ExecS } } } + if err = sessiontxn.OptimizeWithPlanAndThenWarmUp(c.Ctx, stmt.Plan); err != nil { + return nil, err + } return stmt, nil } diff --git a/executor/ddl.go b/executor/ddl.go index 85918bb7d4f54..28365e2495a74 100644 --- a/executor/ddl.go +++ b/executor/ddl.go @@ -204,6 +204,12 @@ func (e *DDLExec) Next(ctx context.Context, req *chunk.Chunk) (err error) { err = e.executeDropPlacementPolicy(x) case *ast.AlterPlacementPolicyStmt: err = e.executeAlterPlacementPolicy(x) + case *ast.CreateResourceGroupStmt: + err = e.executeCreateResourceGroup(x) + case *ast.DropResourceGroupStmt: + err = e.executeDropResourceGroup(x) + case *ast.AlterResourceGroupStmt: + err = e.executeAlterResourceGroup(x) } if err != nil { // If the owner return ErrTableNotExists error when running this DDL, it may be caused by schema changed, @@ -735,3 +741,24 @@ func (e *DDLExec) executeDropPlacementPolicy(s *ast.DropPlacementPolicyStmt) err func (e *DDLExec) executeAlterPlacementPolicy(s *ast.AlterPlacementPolicyStmt) error { return domain.GetDomain(e.ctx).DDL().AlterPlacementPolicy(e.ctx, s) } + +func (e *DDLExec) executeCreateResourceGroup(s *ast.CreateResourceGroupStmt) error { + if !variable.EnableResourceControl.Load() { + return infoschema.ErrResourceGroupSupportDisabled + } + return domain.GetDomain(e.ctx).DDL().AddResourceGroup(e.ctx, s) +} + +func (e *DDLExec) executeAlterResourceGroup(s *ast.AlterResourceGroupStmt) error { + if !variable.EnableResourceControl.Load() { + return infoschema.ErrResourceGroupSupportDisabled + } + return domain.GetDomain(e.ctx).DDL().AlterResourceGroup(e.ctx, s) +} + +func (e *DDLExec) executeDropResourceGroup(s *ast.DropResourceGroupStmt) error { + if !variable.EnableResourceControl.Load() { + return infoschema.ErrResourceGroupSupportDisabled + } + return domain.GetDomain(e.ctx).DDL().DropResourceGroup(e.ctx, s) +} diff --git a/executor/ddl_test.go b/executor/ddl_test.go index d4d0d59d4ab5b..9c19483f0d94c 100644 --- a/executor/ddl_test.go +++ b/executor/ddl_test.go @@ -39,6 +39,7 @@ import ( "github.com/pingcap/tidb/parser/terror" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/sessionctx/variable/featuretag/distributereorg" "github.com/pingcap/tidb/sessiontxn" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/table" @@ -79,10 +80,8 @@ func TestInTxnExecDDLFail(t *testing.T) { tk.MustExec("insert into t values (1);") tk.MustExec("begin;") tk.MustExec("insert into t values (1);") - _, err := tk.Exec("truncate table t;") - require.EqualError(t, err, "[kv:1062]Duplicate entry '1' for key 't.PRIMARY'") - result := tk.MustQuery("select count(*) from t") - result.Check(testkit.Rows("1")) + tk.MustGetErrMsg("truncate table t;", "[kv:1062]Duplicate entry '1' for key 't.PRIMARY'") + tk.MustQuery("select count(*) from t").Check(testkit.Rows("1")) } func TestInTxnExecDDLInvalid(t *testing.T) { @@ -212,11 +211,9 @@ func TestCreateView(t *testing.T) { // test create a exist view tk.MustExec("CREATE VIEW view_t AS select id , name from source_table") defer tk.MustExec("DROP VIEW IF EXISTS view_t") - _, err := tk.Exec("CREATE VIEW view_t AS select id , name from source_table") - require.EqualError(t, err, "[schema:1050]Table 'test.view_t' already exists") + tk.MustGetErrMsg("CREATE VIEW view_t AS select id , name from source_table", "[schema:1050]Table 'test.view_t' already exists") // create view on nonexistent table - _, err = tk.Exec("create view v1 (c,d) as select a,b from t1") - require.EqualError(t, err, "[schema:1146]Table 'test.t1' doesn't exist") + tk.MustGetErrMsg("create view v1 (c,d) as select a,b from t1", "[schema:1146]Table 'test.t1' doesn't exist") // simple view tk.MustExec("create table t1 (a int ,b int)") tk.MustExec("insert into t1 values (1,2), (1,3), (2,4), (2,5), (3,10)") @@ -231,26 +228,22 @@ func TestCreateView(t *testing.T) { // view with select wild card tk.MustExec("create view v5 as select * from t1") tk.MustExec("create view v6 (c,d) as select * from t1") - _, err = tk.Exec("create view v7 (c,d,e) as select * from t1") - require.Equal(t, dbterror.ErrViewWrongList.Error(), err.Error()) + tk.MustGetErrCode("create view v7 (c,d,e) as select * from t1", errno.ErrViewWrongList) // drop multiple views in a statement tk.MustExec("drop view v1,v2,v3,v4,v5,v6") // view with variable tk.MustExec("create view v1 (c,d) as select a,b+@@global.max_user_connections from t1") - _, err = tk.Exec("create view v1 (c,d) as select a,b from t1 where a = @@global.max_user_connections") - require.EqualError(t, err, "[schema:1050]Table 'test.v1' already exists") + tk.MustGetErrMsg("create view v1 (c,d) as select a,b from t1 where a = @@global.max_user_connections", "[schema:1050]Table 'test.v1' already exists") tk.MustExec("drop view v1") // view with different col counts - _, err = tk.Exec("create view v1 (c,d,e) as select a,b from t1 ") - require.Equal(t, dbterror.ErrViewWrongList.Error(), err.Error()) - _, err = tk.Exec("create view v1 (c) as select a,b from t1 ") - require.Equal(t, dbterror.ErrViewWrongList.Error(), err.Error()) + tk.MustGetErrCode("create view v1 (c,d,e) as select a,b from t1 ", errno.ErrViewWrongList) + tk.MustGetErrCode("create view v1 (c) as select a,b from t1 ", errno.ErrViewWrongList) // view with or_replace flag tk.MustExec("drop view if exists v1") tk.MustExec("create view v1 (c,d) as select a,b from t1") tk.MustExec("create or replace view v1 (c,d) as select a,b from t1 ") tk.MustExec("create table if not exists t1 (a int ,b int)") - _, err = tk.Exec("create or replace view t1 as select * from t1") + err := tk.ExecToErr("create or replace view t1 as select * from t1") require.Equal(t, dbterror.ErrWrongObject.GenWithStackByArgs("test", "t1", "VIEW").Error(), err.Error()) // create view using prepare tk.MustExec(`prepare stmt from "create view v10 (x) as select 1";`) @@ -259,8 +252,7 @@ func TestCreateView(t *testing.T) { // create view on union tk.MustExec("drop table if exists t1, t2") tk.MustExec("drop view if exists v") - _, err = tk.Exec("create view v as select * from t1 union select * from t2") - require.True(t, terror.ErrorEqual(err, infoschema.ErrTableNotExists)) + tk.MustGetDBError("create view v as select * from t1 union select * from t2", infoschema.ErrTableNotExists) tk.MustExec("create table t1(a int, b int)") tk.MustExec("create table t2(a int, b int)") tk.MustExec("insert into t1 values(1,2), (1,1), (1,2)") @@ -268,14 +260,12 @@ func TestCreateView(t *testing.T) { tk.MustExec("create definer='root'@'localhost' view v as select * from t1 union select * from t2") tk.MustQuery("select * from v").Sort().Check(testkit.Rows("1 1", "1 2", "1 3")) tk.MustExec("alter table t1 drop column a") - _, err = tk.Exec("select * from v") - require.True(t, terror.ErrorEqual(err, plannercore.ErrViewInvalid)) + tk.MustGetDBError("select * from v", plannercore.ErrViewInvalid) tk.MustExec("alter table t1 add column a int") tk.MustQuery("select * from v").Sort().Check(testkit.Rows("1 1", "1 3", " 1", " 2")) tk.MustExec("alter table t1 drop column a") tk.MustExec("alter table t2 drop column b") - _, err = tk.Exec("select * from v") - require.True(t, terror.ErrorEqual(err, plannercore.ErrViewInvalid)) + tk.MustGetDBError("select * from v", plannercore.ErrViewInvalid) tk.MustExec("drop view v") tk.MustExec("create view v as (select * from t1)") @@ -294,8 +284,7 @@ func TestCreateView(t *testing.T) { tk.MustExec("create table test_v_nested(a int)") tk.MustExec("create definer='root'@'localhost' view v_nested as select * from test_v_nested") tk.MustExec("create definer='root'@'localhost' view v_nested2 as select * from v_nested") - _, err = tk.Exec("create or replace definer='root'@'localhost' view v_nested as select * from v_nested2") - require.True(t, terror.ErrorEqual(err, plannercore.ErrNoSuchTable)) + tk.MustGetDBError("create or replace definer='root'@'localhost' view v_nested as select * from v_nested2", plannercore.ErrNoSuchTable) tk.MustExec("drop table test_v_nested") tk.MustExec("drop view v_nested, v_nested2") @@ -322,8 +311,7 @@ func TestViewRecursion(t *testing.T) { tk.MustExec("create definer='root'@'localhost' view recursive_view2 as select * from recursive_view1") tk.MustExec("drop table t") tk.MustExec("rename table recursive_view2 to t") - _, err := tk.Exec("select * from recursive_view1") - require.True(t, terror.ErrorEqual(err, plannercore.ErrViewRecursive)) + tk.MustGetDBError("select * from recursive_view1", plannercore.ErrViewRecursive) tk.MustExec("drop view recursive_view1, t") } @@ -333,8 +321,8 @@ func TestIssue16250(t *testing.T) { tk.MustExec("use test") tk.MustExec("create table if not exists t(a int)") tk.MustExec("create view view_issue16250 as select * from t") - _, err := tk.Exec("truncate table view_issue16250") - require.EqualError(t, err, "[schema:1146]Table 'test.view_issue16250' doesn't exist") + tk.MustGetErrMsg("truncate table view_issue16250", + "[schema:1146]Table 'test.view_issue16250' doesn't exist") } func TestIssue24771(t *testing.T) { @@ -564,12 +552,23 @@ func TestAlterTableAddColumn(t *testing.T) { tk.MustExec("alter table alter_test add column c3 varchar(50) default 'CURRENT_TIMESTAMP'") tk.MustQuery("select c3 from alter_test").Check(testkit.Rows("CURRENT_TIMESTAMP")) tk.MustExec("create or replace view alter_view as select c1,c2 from alter_test") - _, err = tk.Exec("alter table alter_view add column c4 varchar(50)") + err = tk.ExecToErr("alter table alter_view add column c4 varchar(50)") require.Equal(t, dbterror.ErrWrongObject.GenWithStackByArgs("test", "alter_view", "BASE TABLE").Error(), err.Error()) tk.MustExec("drop view alter_view") tk.MustExec("create sequence alter_seq") - _, err = tk.Exec("alter table alter_seq add column c int") + err = tk.ExecToErr("alter table alter_seq add column c int") require.Equal(t, dbterror.ErrWrongObject.GenWithStackByArgs("test", "alter_seq", "BASE TABLE").Error(), err.Error()) + tk.MustExec("alter table alter_test add column c4 date default current_date") + now = time.Now().Format(types.DateFormat) + r, err = tk.Exec("select c4 from alter_test") + require.NoError(t, err) + req = r.NewChunk(nil) + err = r.Next(context.Background(), req) + require.NoError(t, err) + row = req.GetRow(0) + require.Equal(t, 1, row.Len()) + require.GreaterOrEqual(t, now, row.GetTime(0).String()) + require.Nil(t, r.Close()) tk.MustExec("drop sequence alter_seq") } @@ -591,11 +590,11 @@ func TestAlterTableAddColumns(t *testing.T) { require.Nil(t, r.Close()) tk.MustQuery("select c3 from alter_test").Check(testkit.Rows("CURRENT_TIMESTAMP")) tk.MustExec("create or replace view alter_view as select c1,c2 from alter_test") - _, err = tk.Exec("alter table alter_view add column (c4 varchar(50), c5 varchar(50))") + err = tk.ExecToErr("alter table alter_view add column (c4 varchar(50), c5 varchar(50))") require.Equal(t, dbterror.ErrWrongObject.GenWithStackByArgs("test", "alter_view", "BASE TABLE").Error(), err.Error()) tk.MustExec("drop view alter_view") tk.MustExec("create sequence alter_seq") - _, err = tk.Exec("alter table alter_seq add column (c1 int, c2 varchar(10))") + err = tk.ExecToErr("alter table alter_seq add column (c1 int, c2 varchar(10))") require.Equal(t, dbterror.ErrWrongObject.GenWithStackByArgs("test", "alter_seq", "BASE TABLE").Error(), err.Error()) tk.MustExec("drop sequence alter_seq") } @@ -662,8 +661,7 @@ func TestAlterTableModifyColumn(t *testing.T) { tk.MustExec("drop table if exists modify_column_multiple_collate;") tk.MustExec("create table modify_column_multiple_collate (a char(1) collate utf8_bin collate utf8_general_ci) charset utf8mb4 collate utf8mb4_bin") - _, err = tk.Exec("alter table modify_column_multiple_collate modify column a char(1) charset utf8mb4 collate utf8mb4_bin;") - require.NoError(t, err) + tk.MustExec("alter table modify_column_multiple_collate modify column a char(1) charset utf8mb4 collate utf8mb4_bin;") tt, err = domain.GetDomain(tk.Session()).InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("modify_column_multiple_collate")) require.NoError(t, err) require.Equal(t, "utf8mb4", tt.Cols()[0].GetCharset()) @@ -919,10 +917,8 @@ func TestShardRowIDBits(t *testing.T) { tk.MustExec("insert into t1 values(1)") // continue inserting will fail. - _, err = tk.Exec("insert into t1 values(2)") - require.Truef(t, autoid.ErrAutoincReadFailed.Equal(err), "err:%v", err) - _, err = tk.Exec("insert into t1 values(3)") - require.Truef(t, autoid.ErrAutoincReadFailed.Equal(err), "err:%v", err) + tk.MustGetDBError("insert into t1 values(2)", autoid.ErrAutoincReadFailed) + tk.MustGetDBError("insert into t1 values(3)", autoid.ErrAutoincReadFailed) } func TestAutoRandomBitsData(t *testing.T) { @@ -1131,65 +1127,6 @@ func TestAutoRandomClusteredPrimaryKey(t *testing.T) { tk.MustQuery("select a from t;").Check(testkit.Rows("1")) } -// Test filter different kind of allocators. -// In special ddl type, for example: -// 1: ActionRenameTable : it will abandon all the old allocators. -// 2: ActionRebaseAutoID : it will drop row-id-type allocator. -// 3: ActionModifyTableAutoIdCache : it will drop row-id-type allocator. -// 3: ActionRebaseAutoRandomBase : it will drop auto-rand-type allocator. -func TestFilterDifferentAllocators(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("drop table if exists t1") - - tk.MustExec("create table t(a bigint auto_random(5) key, b int auto_increment unique)") - tk.MustExec("insert into t values()") - tk.MustQuery("select b from t").Check(testkit.Rows("1")) - allHandles, err := ddltestutil.ExtractAllTableHandles(tk.Session(), "test", "t") - require.NoError(t, err) - require.Equal(t, 1, len(allHandles)) - orderedHandles := testutil.MaskSortHandles(allHandles, 5, mysql.TypeLonglong) - require.Equal(t, int64(1), orderedHandles[0]) - tk.MustExec("delete from t") - - // Test rebase auto_increment. - tk.MustExec("alter table t auto_increment 3000000") - tk.MustExec("insert into t values()") - tk.MustQuery("select b from t").Check(testkit.Rows("3000000")) - allHandles, err = ddltestutil.ExtractAllTableHandles(tk.Session(), "test", "t") - require.NoError(t, err) - require.Equal(t, 1, len(allHandles)) - orderedHandles = testutil.MaskSortHandles(allHandles, 5, mysql.TypeLonglong) - require.Equal(t, int64(2), orderedHandles[0]) - tk.MustExec("delete from t") - - // Test rebase auto_random. - tk.MustExec("alter table t auto_random_base 3000000") - tk.MustExec("insert into t values()") - tk.MustQuery("select b from t").Check(testkit.Rows("3000001")) - allHandles, err = ddltestutil.ExtractAllTableHandles(tk.Session(), "test", "t") - require.NoError(t, err) - require.Equal(t, 1, len(allHandles)) - orderedHandles = testutil.MaskSortHandles(allHandles, 5, mysql.TypeLonglong) - require.Equal(t, int64(3000000), orderedHandles[0]) - tk.MustExec("delete from t") - - // Test rename table. - tk.MustExec("rename table t to t1") - tk.MustExec("insert into t1 values()") - res := tk.MustQuery("select b from t1") - strInt64, err := strconv.ParseInt(res.Rows()[0][0].(string), 10, 64) - require.NoError(t, err) - require.Greater(t, strInt64, int64(3000002)) - allHandles, err = ddltestutil.ExtractAllTableHandles(tk.Session(), "test", "t1") - require.NoError(t, err) - require.Equal(t, 1, len(allHandles)) - orderedHandles = testutil.MaskSortHandles(allHandles, 5, mysql.TypeLonglong) - require.Greater(t, orderedHandles[0], int64(3000001)) -} - func TestMaxHandleAddIndex(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -1223,8 +1160,7 @@ func TestSetDDLReorgWorkerCnt(t *testing.T) { err = ddlutil.LoadDDLReorgVars(context.Background(), tk.Session()) require.NoError(t, err) require.Equal(t, int32(100), variable.GetDDLReorgWorkerCounter()) - _, err = tk.Exec("set @@global.tidb_ddl_reorg_worker_cnt = invalid_val") - require.Truef(t, terror.ErrorEqual(err, variable.ErrWrongTypeForVar), "err %v", err) + tk.MustGetDBError("set @@global.tidb_ddl_reorg_worker_cnt = invalid_val", variable.ErrWrongTypeForVar) tk.MustExec("set @@global.tidb_ddl_reorg_worker_cnt = 100") err = ddlutil.LoadDDLReorgVars(context.Background(), tk.Session()) require.NoError(t, err) @@ -1266,8 +1202,7 @@ func TestSetDDLReorgBatchSize(t *testing.T) { err = ddlutil.LoadDDLReorgVars(context.Background(), tk.Session()) require.NoError(t, err) require.Equal(t, variable.MaxDDLReorgBatchSize, variable.GetDDLReorgBatchSize()) - _, err = tk.Exec("set @@global.tidb_ddl_reorg_batch_size = invalid_val") - require.True(t, terror.ErrorEqual(err, variable.ErrWrongTypeForVar), "err %v", err) + tk.MustGetDBError("set @@global.tidb_ddl_reorg_batch_size = invalid_val", variable.ErrWrongTypeForVar) tk.MustExec("set @@global.tidb_ddl_reorg_batch_size = 100") err = ddlutil.LoadDDLReorgVars(context.Background(), tk.Session()) require.NoError(t, err) @@ -1374,8 +1309,7 @@ func TestSetDDLErrorCountLimit(t *testing.T) { err = ddlutil.LoadDDLVars(tk.Session()) require.NoError(t, err) require.Equal(t, int64(math.MaxInt64), variable.GetDDLErrorCountLimit()) - _, err = tk.Exec("set @@global.tidb_ddl_error_count_limit = invalid_val") - require.True(t, terror.ErrorEqual(err, variable.ErrWrongTypeForVar), "err %v", err) + tk.MustGetDBError("set @@global.tidb_ddl_error_count_limit = invalid_val", variable.ErrWrongTypeForVar) tk.MustExec("set @@global.tidb_ddl_error_count_limit = 100") err = ddlutil.LoadDDLVars(tk.Session()) require.NoError(t, err) @@ -1384,6 +1318,20 @@ func TestSetDDLErrorCountLimit(t *testing.T) { res.Check(testkit.Rows("100")) } +func TestLoadDDLDistributeVars(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + require.Equal(t, variable.DefTiDBDDLEnableDistributeReorg, distributereorg.TiDBEnableDistributeReorg) + + tk.MustGetDBError("set @@global.tidb_ddl_distribute_reorg = invalid_val", variable.ErrWrongValueForVar) + require.Equal(t, distributereorg.TiDBEnableDistributeReorg, variable.DDLEnableDistributeReorg.Load()) + tk.MustExec("set @@global.tidb_ddl_distribute_reorg = 'on'") + require.Equal(t, true, variable.DDLEnableDistributeReorg.Load()) + tk.MustExec(fmt.Sprintf("set @@global.tidb_ddl_distribute_reorg = %v", distributereorg.TiDBEnableDistributeReorg)) + require.Equal(t, distributereorg.TiDBEnableDistributeReorg, variable.DDLEnableDistributeReorg.Load()) +} + // Test issue #9205, fix the precision problem for time type default values // See https://github.com/pingcap/tidb/issues/9205 for details func TestIssue9205(t *testing.T) { @@ -1432,39 +1380,21 @@ func TestCheckDefaultFsp(t *testing.T) { tk.MustExec("use test") tk.MustExec(`drop table if exists t;`) - _, err := tk.Exec("create table t ( tt timestamp default now(1));") - require.EqualError(t, err, "[ddl:1067]Invalid default value for 'tt'") - - _, err = tk.Exec("create table t ( tt timestamp(1) default current_timestamp);") - require.EqualError(t, err, "[ddl:1067]Invalid default value for 'tt'") - - _, err = tk.Exec("create table t ( tt timestamp(1) default now(2));") - require.EqualError(t, err, "[ddl:1067]Invalid default value for 'tt'") + tk.MustGetErrMsg("create table t ( tt timestamp default now(1));", "[ddl:1067]Invalid default value for 'tt'") + tk.MustGetErrMsg("create table t ( tt timestamp(1) default current_timestamp);", "[ddl:1067]Invalid default value for 'tt'") + tk.MustGetErrMsg("create table t ( tt timestamp(1) default now(2));", "[ddl:1067]Invalid default value for 'tt'") tk.MustExec("create table t ( tt timestamp(1) default now(1));") tk.MustExec("create table t2 ( tt timestamp default current_timestamp());") tk.MustExec("create table t3 ( tt timestamp default current_timestamp(0));") - _, err = tk.Exec("alter table t add column ttt timestamp default now(2);") - require.EqualError(t, err, "[ddl:1067]Invalid default value for 'ttt'") - - _, err = tk.Exec("alter table t add column ttt timestamp(5) default current_timestamp;") - require.EqualError(t, err, "[ddl:1067]Invalid default value for 'ttt'") - - _, err = tk.Exec("alter table t add column ttt timestamp(5) default now(2);") - require.EqualError(t, err, "[ddl:1067]Invalid default value for 'ttt'") - - _, err = tk.Exec("alter table t modify column tt timestamp(1) default now();") - require.EqualError(t, err, "[ddl:1067]Invalid default value for 'tt'") - - _, err = tk.Exec("alter table t modify column tt timestamp(4) default now(5);") - require.EqualError(t, err, "[ddl:1067]Invalid default value for 'tt'") - - _, err = tk.Exec("alter table t change column tt tttt timestamp(4) default now(5);") - require.EqualError(t, err, "[ddl:1067]Invalid default value for 'tttt'") - - _, err = tk.Exec("alter table t change column tt tttt timestamp(1) default now();") - require.EqualError(t, err, "[ddl:1067]Invalid default value for 'tttt'") + tk.MustGetErrMsg("alter table t add column ttt timestamp default now(2);", "[ddl:1067]Invalid default value for 'ttt'") + tk.MustGetErrMsg("alter table t add column ttt timestamp(5) default current_timestamp;", "[ddl:1067]Invalid default value for 'ttt'") + tk.MustGetErrMsg("alter table t add column ttt timestamp(5) default now(2);", "[ddl:1067]Invalid default value for 'ttt'") + tk.MustGetErrMsg("alter table t modify column tt timestamp(1) default now();", "[ddl:1067]Invalid default value for 'tt'") + tk.MustGetErrMsg("alter table t modify column tt timestamp(4) default now(5);", "[ddl:1067]Invalid default value for 'tt'") + tk.MustGetErrMsg("alter table t change column tt tttt timestamp(4) default now(5);", "[ddl:1067]Invalid default value for 'tttt'") + tk.MustGetErrMsg("alter table t change column tt tttt timestamp(1) default now();", "[ddl:1067]Invalid default value for 'tttt'") } func TestTimestampMinDefaultValue(t *testing.T) { @@ -1618,3 +1548,138 @@ func TestRenameMultiTables(t *testing.T) { tk.MustExec("drop database rename2") tk.MustExec("drop database rename3") } + +func TestCreateTableWithTTL(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustExec("CREATE TABLE t (created_at datetime) TTL = `created_at` + INTERVAL 5 DAY") + tk.MustQuery("SHOW CREATE TABLE t").Check(testkit.Rows("t CREATE TABLE `t` (\n `created_at` datetime DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`created_at` + INTERVAL 5 DAY */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */")) + tk.MustExec("DROP TABLE t") + + tk.MustGetErrMsg("CREATE TABLE t (id int) TTL = `id` + INTERVAL 5 DAY", "[ddl:8148]Field 'id' is of a not supported type for TTL config, expect DATETIME, DATE or TIMESTAMP") + + tk.MustGetErrMsg("CREATE TABLE t (id int) TTL_ENABLE = 'ON'", "[ddl:8150]Cannot set TTL_ENABLE on a table without TTL config") + + tk.MustGetErrMsg("CREATE TABLE t (id int) TTL_JOB_INTERVAL = '1h'", "[ddl:8150]Cannot set TTL_JOB_INTERVAL on a table without TTL config") + + tk.MustExec("CREATE TABLE t (created_at datetime) TTL_ENABLE = 'ON' TTL = `created_at` + INTERVAL 1 DAY TTL_ENABLE = 'OFF' TTL_JOB_INTERVAL = '1d'") + tk.MustQuery("SHOW CREATE TABLE t").Check(testkit.Rows("t CREATE TABLE `t` (\n `created_at` datetime DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`created_at` + INTERVAL 1 DAY */ /*T![ttl] TTL_ENABLE='OFF' */ /*T![ttl] TTL_JOB_INTERVAL='1d' */")) + tk.MustExec("DROP TABLE t") + + // when multiple ttl and ttl_enable configs are submitted, only the last one will be handled + tk.MustExec("CREATE TABLE t (created_at datetime) TTL_ENABLE = 'ON' TTL = `created_at` + INTERVAL 1 DAY TTL = `created_at` + INTERVAL 2 DAY TTL = `created_at` + INTERVAL 3 DAY TTL_ENABLE = 'OFF'") + tk.MustQuery("SHOW CREATE TABLE t").Check(testkit.Rows("t CREATE TABLE `t` (\n `created_at` datetime DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`created_at` + INTERVAL 3 DAY */ /*T![ttl] TTL_ENABLE='OFF' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */")) + tk.MustExec("DROP TABLE t") +} + +func TestAlterTTLInfo(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustExec("CREATE TABLE t (created_at datetime, updated_at datetime, wrong_type int) TTL = `created_at` + INTERVAL 5 DAY") + tk.MustExec("ALTER TABLE t TTL = `updated_at` + INTERVAL 2 YEAR") + tk.MustQuery("SHOW CREATE TABLE t").Check(testkit.Rows("t CREATE TABLE `t` (\n `created_at` datetime DEFAULT NULL,\n `updated_at` datetime DEFAULT NULL,\n `wrong_type` int(11) DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`updated_at` + INTERVAL 2 YEAR */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */")) + + tk.MustExec("ALTER TABLE t TTL_ENABLE = 'OFF'") + tk.MustQuery("SHOW CREATE TABLE t").Check(testkit.Rows("t CREATE TABLE `t` (\n `created_at` datetime DEFAULT NULL,\n `updated_at` datetime DEFAULT NULL,\n `wrong_type` int(11) DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`updated_at` + INTERVAL 2 YEAR */ /*T![ttl] TTL_ENABLE='OFF' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */")) + + tk.MustExec("ALTER TABLE t TTL_JOB_INTERVAL = '1d'") + tk.MustQuery("SHOW CREATE TABLE t").Check(testkit.Rows("t CREATE TABLE `t` (\n `created_at` datetime DEFAULT NULL,\n `updated_at` datetime DEFAULT NULL,\n `wrong_type` int(11) DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`updated_at` + INTERVAL 2 YEAR */ /*T![ttl] TTL_ENABLE='OFF' */ /*T![ttl] TTL_JOB_INTERVAL='1d' */")) + + tk.MustGetErrMsg("ALTER TABLE t TTL = `not_exist` + INTERVAL 2 YEAR", "[ddl:1054]Unknown column 'not_exist' in 'TTL config'") + + tk.MustGetErrMsg("ALTER TABLE t TTL = `wrong_type` + INTERVAL 2 YEAR", "[ddl:8148]Field 'wrong_type' is of a not supported type for TTL config, expect DATETIME, DATE or TIMESTAMP") + + tk.MustGetErrMsg("ALTER TABLE t DROP COLUMN updated_at", "[ddl:8149]Cannot drop column 'updated_at': needed in TTL config") + tk.MustGetErrMsg("ALTER TABLE t CHANGE updated_at updated_at_new INT", "[ddl:8148]Field 'updated_at_new' is of a not supported type for TTL config, expect DATETIME, DATE or TIMESTAMP") + + tk.MustExec("ALTER TABLE t RENAME COLUMN `updated_at` TO `updated_at_2`") + tk.MustQuery("SHOW CREATE TABLE t").Check(testkit.Rows("t CREATE TABLE `t` (\n `created_at` datetime DEFAULT NULL,\n `updated_at_2` datetime DEFAULT NULL,\n `wrong_type` int(11) DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`updated_at_2` + INTERVAL 2 YEAR */ /*T![ttl] TTL_ENABLE='OFF' */ /*T![ttl] TTL_JOB_INTERVAL='1d' */")) + + tk.MustExec("ALTER TABLE t CHANGE `updated_at_2` `updated_at_3` date") + tk.MustQuery("SHOW CREATE TABLE t").Check(testkit.Rows("t CREATE TABLE `t` (\n `created_at` datetime DEFAULT NULL,\n `updated_at_3` date DEFAULT NULL,\n `wrong_type` int(11) DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`updated_at_3` + INTERVAL 2 YEAR */ /*T![ttl] TTL_ENABLE='OFF' */ /*T![ttl] TTL_JOB_INTERVAL='1d' */")) + + tk.MustExec("ALTER TABLE t TTL = `updated_at_3` + INTERVAL 3 YEAR") + tk.MustQuery("SHOW CREATE TABLE t").Check(testkit.Rows("t CREATE TABLE `t` (\n `created_at` datetime DEFAULT NULL,\n `updated_at_3` date DEFAULT NULL,\n `wrong_type` int(11) DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`updated_at_3` + INTERVAL 3 YEAR */ /*T![ttl] TTL_ENABLE='OFF' */ /*T![ttl] TTL_JOB_INTERVAL='1d' */")) + + tk.MustGetErrMsg("ALTER TABLE t TTL_ENABLE = 'OFF' REMOVE TTL", "[ddl:8200]Unsupported multi schema change for alter table ttl") + + tk.MustExec("ALTER TABLE t REMOVE TTL") + tk.MustQuery("SHOW CREATE TABLE t").Check(testkit.Rows("t CREATE TABLE `t` (\n `created_at` datetime DEFAULT NULL,\n `updated_at_3` date DEFAULT NULL,\n `wrong_type` int(11) DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + + tk.MustGetErrMsg("ALTER TABLE t TTL_ENABLE = 'OFF'", "[ddl:8150]Cannot set TTL_ENABLE on a table without TTL config") + + tk.MustGetErrMsg("ALTER TABLE t TTL_JOB_INTERVAL = '1h'", "[ddl:8150]Cannot set TTL_JOB_INTERVAL on a table without TTL config") +} + +func TestDisableTTLForTempTable(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustGetDBError("CREATE TEMPORARY TABLE t (created_at datetime) TTL = `created_at` + INTERVAL 5 DAY", dbterror.ErrTempTableNotAllowedWithTTL) +} + +func TestDisableTTLForFKParentTable(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + // alter ttl for a FK parent table is not allowed + tk.MustExec("set global tidb_enable_foreign_key='ON'") + tk.MustExec("CREATE TABLE t (id int primary key, created_at datetime)") + tk.MustExec("CREATE TABLE t_1 (t_id int, foreign key fk_t_id(t_id) references t(id))") + tk.MustGetDBError("ALTER TABLE t TTL = created_at + INTERVAL 5 YEAR", dbterror.ErrUnsupportedTTLReferencedByFK) + tk.MustExec("drop table t,t_1") + + // refuse to reference TTL key when create table + tk.MustExec("CREATE TABLE t (id int primary key, created_at datetime) TTL = created_at + INTERVAL 5 YEAR") + tk.MustGetDBError("CREATE TABLE t_1 (t_id int, foreign key fk_t_id(t_id) references t(id))", dbterror.ErrUnsupportedTTLReferencedByFK) + tk.MustExec("drop table t") + + // refuse to add foreign key reference TTL table + tk.MustExec("CREATE TABLE t (id int primary key, created_at datetime) TTL = created_at + INTERVAL 5 YEAR") + tk.MustExec("CREATE TABLE t_1 (t_id int)") + tk.MustGetDBError("ALTER TABLE t_1 ADD FOREIGN KEY fk_t_id(t_id) references t(id)", dbterror.ErrUnsupportedTTLReferencedByFK) + tk.MustExec("drop table t,t_1") +} + +func TestCheckPrimaryKeyForTTLTable(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + // create table should fail when pk contains double/float + tk.MustGetDBError("create table t1(id float primary key, t timestamp) TTL=`t`+INTERVAL 1 DAY", dbterror.ErrUnsupportedPrimaryKeyTypeWithTTL) + tk.MustGetDBError("create table t1(id float(10,2) primary key, t timestamp) TTL=`t`+INTERVAL 1 DAY", dbterror.ErrUnsupportedPrimaryKeyTypeWithTTL) + tk.MustGetDBError("create table t1(id double primary key, t timestamp) TTL=`t`+INTERVAL 1 DAY", dbterror.ErrUnsupportedPrimaryKeyTypeWithTTL) + tk.MustGetDBError("create table t1(id float(10,2) primary key, t timestamp) TTL=`t`+INTERVAL 1 DAY", dbterror.ErrUnsupportedPrimaryKeyTypeWithTTL) + tk.MustGetDBError("create table t1(id1 int, id2 float, t timestamp, primary key(id1, id2)) TTL=`t`+INTERVAL 1 DAY", dbterror.ErrUnsupportedPrimaryKeyTypeWithTTL) + tk.MustGetDBError("create table t1(id1 int, id2 double, t timestamp, primary key(id1, id2)) TTL=`t`+INTERVAL 1 DAY", dbterror.ErrUnsupportedPrimaryKeyTypeWithTTL) + + // alter table should fail when pk contains double/float + tk.MustExec("create table t1(id float primary key, t timestamp)") + tk.MustExec("create table t2(id double primary key, t timestamp)") + tk.MustExec("create table t3(id1 int, id2 float, primary key(id1, id2), t timestamp)") + tk.MustExec("create table t4(id1 int, id2 double, primary key(id1, id2), t timestamp)") + tk.MustGetDBError("alter table t1 TTL=`t`+INTERVAL 1 DAY", dbterror.ErrUnsupportedPrimaryKeyTypeWithTTL) + tk.MustGetDBError("alter table t2 TTL=`t`+INTERVAL 1 DAY", dbterror.ErrUnsupportedPrimaryKeyTypeWithTTL) + tk.MustGetDBError("alter table t3 TTL=`t`+INTERVAL 1 DAY", dbterror.ErrUnsupportedPrimaryKeyTypeWithTTL) + tk.MustGetDBError("alter table t4 TTL=`t`+INTERVAL 1 DAY", dbterror.ErrUnsupportedPrimaryKeyTypeWithTTL) + + // create table should not fail when the pk is not clustered + tk.MustExec("create table t11(id float primary key nonclustered, t timestamp) TTL=`t`+INTERVAL 1 DAY") + tk.MustExec("create table t12(id double primary key nonclustered, t timestamp) TTL=`t`+INTERVAL 1 DAY") + tk.MustExec("create table t13(id1 int, id2 float, t timestamp, primary key(id1, id2) nonclustered) TTL=`t`+INTERVAL 1 DAY") + + // alter table should not fail when the pk is not clustered + tk.MustExec("create table t21(id float primary key nonclustered, t timestamp)") + tk.MustExec("create table t22(id double primary key nonclustered, t timestamp)") + tk.MustExec("create table t23(id1 int, id2 float, t timestamp, primary key(id1, id2) nonclustered)") + tk.MustExec("alter table t21 TTL=`t`+INTERVAL 1 DAY") + tk.MustExec("alter table t22 TTL=`t`+INTERVAL 1 DAY") + tk.MustExec("alter table t23 TTL=`t`+INTERVAL 1 DAY") +} diff --git a/executor/delete.go b/executor/delete.go index 979db825dfb66..3fedb55806364 100644 --- a/executor/delete.go +++ b/executor/delete.go @@ -153,7 +153,7 @@ func (e *DeleteExec) doBatchDelete(ctx context.Context) error { return ErrBatchInsertFail.GenWithStack("BatchDelete failed with error: %v", err) } e.memTracker.Consume(-int64(txn.Size())) - e.ctx.StmtCommit() + e.ctx.StmtCommit(ctx) if err := sessiontxn.NewTxnInStmt(ctx, e.ctx); err != nil { // We should return a special error for batch insert. return ErrBatchInsertFail.GenWithStack("BatchDelete failed with error: %v", err) @@ -175,8 +175,14 @@ func (e *DeleteExec) composeTblRowMap(tblRowMap tableRowMapType, colPosInfos []p return err } // tblRowMap[info.TblID][handle] hold the row datas binding to this table and this handle. - _, exist := tblRowMap[info.TblID].Get(handle) - memDelta := tblRowMap[info.TblID].Set(handle, joinedRow[info.Start:info.End]) + row, exist := tblRowMap[info.TblID].Get(handle) + if !exist { + row = make([]types.Datum, info.End-info.Start) + } + for i, d := range joinedRow[info.Start:info.End] { + d.Copy(&row[i]) + } + memDelta := tblRowMap[info.TblID].Set(handle, row) if !exist { memDelta += types.EstimatedMemUsage(joinedRow, 1) memDelta += int64(handle.ExtraMemSize()) @@ -192,6 +198,7 @@ func (e *DeleteExec) deleteMultiTablesByChunk(ctx context.Context) error { fields := retTypes(e.children[0]) chk := tryNewCacheChunk(e.children[0]) memUsageOfChk := int64(0) + joinedDatumRowBuffer := make([]types.Datum, len(fields)) for { e.memTracker.Consume(-memUsageOfChk) iter := chunk.NewIterator4Chunk(chk) @@ -206,13 +213,13 @@ func (e *DeleteExec) deleteMultiTablesByChunk(ctx context.Context) error { e.memTracker.Consume(memUsageOfChk) for joinedChunkRow := iter.Begin(); joinedChunkRow != iter.End(); joinedChunkRow = iter.Next() { - joinedDatumRow := joinedChunkRow.GetDatumRow(fields) - err := e.composeTblRowMap(tblRowMap, colPosInfos, joinedDatumRow) + joinedDatumRowBuffer = joinedChunkRow.GetDatumRowWithBuffer(fields, joinedDatumRowBuffer) + err := e.composeTblRowMap(tblRowMap, colPosInfos, joinedDatumRowBuffer) if err != nil { return err } } - chk = chunk.Renew(chk, e.maxChunkSize) + chk = tryNewCacheChunk(e.children[0]) } return e.removeRowsInTblRowMap(tblRowMap) @@ -234,26 +241,20 @@ func (e *DeleteExec) removeRowsInTblRowMap(tblRowMap tableRowMapType) error { } func (e *DeleteExec) removeRow(ctx sessionctx.Context, t table.Table, h kv.Handle, data []types.Datum) error { - txnState, err := e.ctx.Txn(false) - if err != nil { - return err - } - memUsageOfTxnState := txnState.Size() - err = t.RemoveRecord(ctx, h, data) + err := t.RemoveRecord(ctx, h, data) if err != nil { return err } - err = e.onRemoveRowForFK(ctx, t, data) + tid := t.Meta().ID + err = onRemoveRowForFK(ctx, data, e.fkChecks[tid], e.fkCascades[tid]) if err != nil { return err } - e.memTracker.Consume(int64(txnState.Size() - memUsageOfTxnState)) ctx.GetSessionVars().StmtCtx.AddAffectedRows(1) return nil } -func (e *DeleteExec) onRemoveRowForFK(ctx sessionctx.Context, t table.Table, data []types.Datum) error { - fkChecks := e.fkChecks[t.Meta().ID] +func onRemoveRowForFK(ctx sessionctx.Context, data []types.Datum, fkChecks []*FKCheckExec, fkCascades []*FKCascadeExec) error { sc := ctx.GetSessionVars().StmtCtx for _, fkc := range fkChecks { err := fkc.deleteRowNeedToCheck(sc, data) @@ -261,7 +262,6 @@ func (e *DeleteExec) onRemoveRowForFK(ctx sessionctx.Context, t table.Table, dat return err } } - fkCascades := e.fkCascades[t.Meta().ID] for _, fkc := range fkCascades { err := fkc.onDeleteRow(sc, data) if err != nil { diff --git a/executor/distsql.go b/executor/distsql.go index 0cef7e66d441e..a96954b9fba6f 100644 --- a/executor/distsql.go +++ b/executor/distsql.go @@ -39,6 +39,7 @@ import ( "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" @@ -75,7 +76,9 @@ type lookupTableTask struct { idxRows *chunk.Chunk cursor int - doneCh chan error + // after the cop task is built, buildDone will be set to the current instant, for Next wait duration statistic. + buildDoneTime time.Time + doneCh chan error // indexOrder map is used to save the original index order for the handles. // Without this map, the original index order might be lost. @@ -243,11 +246,18 @@ func (e *IndexReaderExecutor) Next(ctx context.Context, req *chunk.Chunk) error return err } +// TODO: cleanup this method. func (e *IndexReaderExecutor) buildKeyRanges(sc *stmtctx.StatementContext, ranges []*ranger.Range, physicalID int64) ([]kv.KeyRange, error) { + var ( + rRanges *kv.KeyRanges + err error + ) if e.index.ID == -1 { - return distsql.CommonHandleRangesToKVRanges(sc, []int64{physicalID}, ranges) + rRanges, err = distsql.CommonHandleRangesToKVRanges(sc, []int64{physicalID}, ranges) + } else { + rRanges, err = distsql.IndexRangesToKVRanges(sc, physicalID, e.index.ID, ranges, e.feedback) } - return distsql.IndexRangesToKVRanges(sc, physicalID, e.index.ID, ranges, e.feedback) + return rRanges.FirstPartitionRange(), err } // Open implements the Executor Open interface. @@ -458,9 +468,6 @@ func (e *IndexLookUpExecutor) Open(ctx context.Context) error { func (e *IndexLookUpExecutor) buildTableKeyRanges() (err error) { sc := e.ctx.GetSessionVars().StmtCtx if e.partitionTableMode { - if e.keepOrder { // this case should be prevented by the optimizer - return errors.New("invalid execution plan: cannot keep order when accessing a partition table by IndexLookUpReader") - } e.feedback.Invalidate() // feedback for partition tables is not ready e.partitionKVRanges = make([][]kv.KeyRange, 0, len(e.prunedPartitions)) for _, p := range e.prunedPartitions { @@ -472,7 +479,7 @@ func (e *IndexLookUpExecutor) buildTableKeyRanges() (err error) { if e.partitionRangeMap != nil && e.partitionRangeMap[physicalID] != nil { ranges = e.partitionRangeMap[physicalID] } - var kvRange []kv.KeyRange + var kvRange *kv.KeyRanges if e.index.ID == -1 { kvRange, err = distsql.CommonHandleRangesToKVRanges(sc, []int64{physicalID}, ranges) } else { @@ -481,15 +488,17 @@ func (e *IndexLookUpExecutor) buildTableKeyRanges() (err error) { if err != nil { return err } - e.partitionKVRanges = append(e.partitionKVRanges, kvRange) + e.partitionKVRanges = append(e.partitionKVRanges, kvRange.FirstPartitionRange()) } } else { physicalID := getPhysicalTableID(e.table) + var kvRanges *kv.KeyRanges if e.index.ID == -1 { - e.kvRanges, err = distsql.CommonHandleRangesToKVRanges(sc, []int64{physicalID}, e.ranges) + kvRanges, err = distsql.CommonHandleRangesToKVRanges(sc, []int64{physicalID}, e.ranges) } else { - e.kvRanges, err = distsql.IndexRangesToKVRanges(sc, physicalID, e.index.ID, e.ranges, e.feedback) + kvRanges, err = distsql.IndexRangesToKVRanges(sc, physicalID, e.index.ID, e.ranges, e.feedback) } + e.kvRanges = kvRanges.FirstPartitionRange() } return err } @@ -718,6 +727,9 @@ func (e *IndexLookUpExecutor) buildTableReader(ctx context.Context, task *lookup // Close implements Exec Close interface. func (e *IndexLookUpExecutor) Close() error { + if e.stats != nil { + defer e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) + } e.kvRanges = e.kvRanges[:0] if e.dummy { return nil @@ -780,13 +792,32 @@ func (e *IndexLookUpExecutor) getResultTask() (*lookupTableTask, error) { if e.resultCurr != nil && e.resultCurr.cursor < len(e.resultCurr.rows) { return e.resultCurr, nil } + var ( + enableStats = e.stats != nil + start time.Time + indexFetchedInstant time.Time + ) + if enableStats { + start = time.Now() + } task, ok := <-e.resultCh if !ok { return nil, nil } + if enableStats { + indexFetchedInstant = time.Now() + } if err := <-task.doneCh; err != nil { return nil, err } + if enableStats { + e.stats.NextWaitIndexScan += indexFetchedInstant.Sub(start) + if task.buildDoneTime.After(indexFetchedInstant) { + e.stats.NextWaitTableLookUpBuild += task.buildDoneTime.Sub(indexFetchedInstant) + indexFetchedInstant = task.buildDoneTime + } + e.stats.NextWaitTableLookUpResp += time.Since(indexFetchedInstant) + } // Release the memory usage of last task before we handle a new task. if e.resultCurr != nil { @@ -802,7 +833,6 @@ func (e *IndexLookUpExecutor) initRuntimeStats() { indexScanBasicStats: &execdetails.BasicRuntimeStats{}, Concurrency: e.ctx.GetSessionVars().IndexLookupConcurrency(), } - e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) } } @@ -870,7 +900,7 @@ func (w *indexWorker) fetchHandles(ctx context.Context, result distsql.SelectRes idxID := w.idxLookup.getIndexPlanRootID() if w.idxLookup.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl != nil { if idxID != w.idxLookup.id && w.idxLookup.stats != nil { - w.idxLookup.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(idxID, w.idxLookup.stats.indexScanBasicStats) + w.idxLookup.stats.indexScanBasicStats = w.idxLookup.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.GetBasicRuntimeStats(idxID) } } for { @@ -1110,6 +1140,10 @@ type IndexLookUpRunTimeStats struct { TableRowScan int64 TableTaskNum int64 Concurrency int + // Record the `Next` call affected wait duration details. + NextWaitIndexScan time.Duration + NextWaitTableLookUpBuild time.Duration + NextWaitTableLookUpResp time.Duration } func (e *IndexLookUpRunTimeStats) String() string { @@ -1133,6 +1167,15 @@ func (e *IndexLookUpRunTimeStats) String() string { } buf.WriteString(fmt.Sprintf(" table_task: {total_time: %v, num: %d, concurrency: %d}", execdetails.FormatDuration(time.Duration(tableScan)), tableTaskNum, concurrency)) } + if e.NextWaitIndexScan > 0 || e.NextWaitTableLookUpBuild > 0 || e.NextWaitTableLookUpResp > 0 { + if buf.Len() > 0 { + buf.WriteByte(',') + fmt.Fprintf(&buf, " next: {wait_index: %s, wait_table_lookup_build: %s, wait_table_lookup_resp: %s}", + execdetails.FormatDuration(e.NextWaitIndexScan), + execdetails.FormatDuration(e.NextWaitTableLookUpBuild), + execdetails.FormatDuration(e.NextWaitTableLookUpResp)) + } + } return buf.String() } @@ -1153,6 +1196,9 @@ func (e *IndexLookUpRunTimeStats) Merge(other execdetails.RuntimeStats) { e.TaskWait += tmp.TaskWait e.TableRowScan += tmp.TableRowScan e.TableTaskNum += tmp.TableTaskNum + e.NextWaitIndexScan += tmp.NextWaitIndexScan + e.NextWaitTableLookUpBuild += tmp.NextWaitTableLookUpBuild + e.NextWaitTableLookUpResp += tmp.NextWaitTableLookUpResp } // Tp implements the RuntimeStats interface. @@ -1246,36 +1292,27 @@ func (w *tableWorker) compareData(ctx context.Context, task *lookupTableTask, ta sctx := w.idxLookup.ctx.GetSessionVars().StmtCtx for i := range vals { col := w.idxTblCols[i] - tp := &col.FieldType - idxVal := idxRow.GetDatum(i, tp) + idxVal := idxRow.GetDatum(i, w.idxColTps[i]) tablecodec.TruncateIndexValue(&idxVal, w.idxLookup.index.Columns[i], col.ColumnInfo) - cmpRes, err := idxVal.Compare(sctx, &vals[i], collators[i]) + cmpRes, err := tables.CompareIndexAndVal(sctx, vals[i], idxVal, collators[i], col.FieldType.IsArray() && vals[i].Kind() == types.KindMysqlJSON) if err != nil { - fts := make([]*types.FieldType, 0, len(w.idxTblCols)) - for _, c := range w.idxTblCols { - fts = append(fts, &c.FieldType) - } return ir().ReportAdminCheckInconsistentWithColInfo(ctx, handle, col.Name.O, - idxRow.GetDatum(i, tp), + idxVal, vals[i], err, - &consistency.RecordData{Handle: handle, Values: getDatumRow(&idxRow, fts)}, + &consistency.RecordData{Handle: handle, Values: getDatumRow(&idxRow, w.idxColTps)}, ) } if cmpRes != 0 { - fts := make([]*types.FieldType, 0, len(w.idxTblCols)) - for _, c := range w.idxTblCols { - fts = append(fts, &c.FieldType) - } return ir().ReportAdminCheckInconsistentWithColInfo(ctx, handle, col.Name.O, - idxRow.GetDatum(i, tp), + idxRow.GetDatum(i, w.idxColTps[i]), vals[i], err, - &consistency.RecordData{Handle: handle, Values: getDatumRow(&idxRow, fts)}, + &consistency.RecordData{Handle: handle, Values: getDatumRow(&idxRow, w.idxColTps)}, ) } } @@ -1300,6 +1337,7 @@ func getDatumRow(r *chunk.Row, fields []*types.FieldType) []types.Datum { // Then we hold the returning rows and finish this task. func (w *tableWorker) executeTask(ctx context.Context, task *lookupTableTask) error { tableReader, err := w.idxLookup.buildTableReader(ctx, task) + task.buildDoneTime = time.Now() if err != nil { logutil.Logger(ctx).Error("build table reader failed", zap.Error(err)) return err diff --git a/executor/distsql_test.go b/executor/distsql_test.go index 59b3aecc2bb6a..50c4a311a1eb9 100644 --- a/executor/distsql_test.go +++ b/executor/distsql_test.go @@ -316,9 +316,8 @@ func TestPartitionTableIndexLookUpReader(t *testing.T) { tk.MustQuery("select * from t where a>=1 and a<15 order by a").Check(testkit.Rows("1 1", "2 2", "11 11", "12 12")) tk.MustQuery("select * from t where a>=1 and a<15 order by a limit 1").Check(testkit.Rows("1 1")) tk.MustQuery("select * from t where a>=1 and a<15 order by a limit 3").Check(testkit.Rows("1 1", "2 2", "11 11")) - tk.MustQuery("select * from t where a>=1 and a<15 limit 3").Check(testkit.Rows("1 1", "2 2", "11 11")) - tk.MustQuery("select * from t where a between 1 and 15 limit 3").Check(testkit.Rows("1 1", "2 2", "11 11")) - tk.MustQuery("select * from t where a between 1 and 15 limit 3 offset 1").Check(testkit.Rows("2 2", "11 11", "12 12")) + tk.MustQuery("select * from t where a between 1 and 15 order by a limit 3").Check(testkit.Rows("1 1", "2 2", "11 11")) + tk.MustQuery("select * from t where a between 1 and 15 order by a limit 3 offset 1").Check(testkit.Rows("2 2", "11 11", "12 12")) } func TestPartitionTableRandomlyIndexLookUpReader(t *testing.T) { @@ -359,17 +358,24 @@ func TestPartitionTableRandomlyIndexLookUpReader(t *testing.T) { func TestIndexLookUpStats(t *testing.T) { stats := &executor.IndexLookUpRunTimeStats{ - FetchHandleTotal: int64(5 * time.Second), - FetchHandle: int64(2 * time.Second), - TaskWait: int64(2 * time.Second), - TableRowScan: int64(2 * time.Second), - TableTaskNum: 2, - Concurrency: 1, + FetchHandleTotal: int64(5 * time.Second), + FetchHandle: int64(2 * time.Second), + TaskWait: int64(2 * time.Second), + TableRowScan: int64(2 * time.Second), + TableTaskNum: 2, + Concurrency: 1, + NextWaitIndexScan: time.Second, + NextWaitTableLookUpBuild: 2 * time.Second, + NextWaitTableLookUpResp: 3 * time.Second, } - require.Equal(t, "index_task: {total_time: 5s, fetch_handle: 2s, build: 1s, wait: 2s}, table_task: {total_time: 2s, num: 2, concurrency: 1}", stats.String()) + require.Equal(t, "index_task: {total_time: 5s, fetch_handle: 2s, build: 1s, wait: 2s}"+ + ", table_task: {total_time: 2s, num: 2, concurrency: 1}"+ + ", next: {wait_index: 1s, wait_table_lookup_build: 2s, wait_table_lookup_resp: 3s}", stats.String()) require.Equal(t, stats.Clone().String(), stats.String()) stats.Merge(stats.Clone()) - require.Equal(t, "index_task: {total_time: 10s, fetch_handle: 4s, build: 2s, wait: 4s}, table_task: {total_time: 4s, num: 4, concurrency: 1}", stats.String()) + require.Equal(t, "index_task: {total_time: 10s, fetch_handle: 4s, build: 2s, wait: 4s}"+ + ", table_task: {total_time: 4s, num: 4, concurrency: 1}"+ + ", next: {wait_index: 2s, wait_table_lookup_build: 4s, wait_table_lookup_resp: 6s}", stats.String()) } func TestIndexLookUpGetResultChunk(t *testing.T) { @@ -634,3 +640,61 @@ func TestCoprocessorPagingReqKeyRangeSorted(t *testing.T) { tk.MustExec(`set @a=0x61219F79C90D3541F70E, @b=5501707547099269248, @c=0xEC43EFD30131DEA2CB8B, @d="呣丼蒢咿卻鹻铴础湜僂頃dž縍套衞陀碵碼幓9", @e="鹹楞睕堚尛鉌翡佾搁紟精廬姆燵藝潐楻翇慸嵊";`) tk.MustExec(`execute stmt using @a,@b,@c,@d,@e;`) } + +func TestCoprocessorBatchByStore(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t, t1") + tk.MustExec("create table t(id int primary key, c1 int, c2 int, key i(c1))") + tk.MustExec(`create table t1(id int primary key, c1 int, c2 int, key i(c1)) partition by range(id) ( + partition p0 values less than(10000), + partition p1 values less than (50000), + partition p2 values less than (100000))`) + for i := 0; i < 10; i++ { + tk.MustExec("insert into t values(?, ?, ?)", i*10000, i*10000, i%2) + tk.MustExec("insert into t1 values(?, ?, ?)", i*10000, i*10000, i%2) + } + tk.MustQuery("split table t between (0) and (100000) regions 20").Check(testkit.Rows("20 1")) + tk.MustQuery("split table t1 between (0) and (100000) regions 20").Check(testkit.Rows("60 1")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/store/copr/setRangesPerTask", "return(1)")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/store/copr/setRangesPerTask")) + }() + ranges := []string{ + "(c1 >= 0 and c1 < 5000)", + "(c1 >= 10000 and c1 < 15000)", + "(c1 >= 20000 and c1 < 25000)", + "(c1 >= 30000 and c1 < 35000)", + "(c1 >= 40000 and c1 < 45000)", + "(c1 >= 50000 and c1 < 55000)", + "(c1 >= 60000 and c1 < 65000)", + "(c1 >= 70000 and c1 < 75000)", + "(c1 >= 80000 and c1 < 85000)", + "(c1 >= 90000 and c1 < 95000)", + } + evenRows := testkit.Rows("0 0 0", "20000 20000 0", "40000 40000 0", "60000 60000 0", "80000 80000 0") + oddRows := testkit.Rows("10000 10000 1", "30000 30000 1", "50000 50000 1", "70000 70000 1", "90000 90000 1") + reverseOddRows := testkit.Rows("90000 90000 1", "70000 70000 1", "50000 50000 1", "30000 30000 1", "10000 10000 1") + for _, table := range []string{"t", "t1"} { + baseSQL := fmt.Sprintf("select * from %s force index(i) where id < 100000 and (%s)", table, strings.Join(ranges, " or ")) + for _, paging := range []string{"on", "off"} { + tk.MustExec("set session tidb_enable_paging=?", paging) + for size := 0; size < 10; size++ { + tk.MustExec("set session tidb_store_batch_size=?", size) + tk.MustQuery(baseSQL + " and c2 = 0").Sort().Check(evenRows) + tk.MustQuery(baseSQL + " and c2 = 1").Sort().Check(oddRows) + tk.MustQuery(baseSQL + " and c2 = 0 order by c1 asc").Check(evenRows) + tk.MustQuery(baseSQL + " and c2 = 1 order by c1 desc").Check(reverseOddRows) + // every batched task will get region error and fallback. + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/store/copr/batchCopRegionError", "return")) + tk.MustQuery(baseSQL + " and c2 = 0").Sort().Check(evenRows) + tk.MustQuery(baseSQL + " and c2 = 1").Sort().Check(oddRows) + tk.MustQuery(baseSQL + " and c2 = 0 order by c1 asc").Check(evenRows) + tk.MustQuery(baseSQL + " and c2 = 1 order by c1 desc").Check(reverseOddRows) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/store/copr/batchCopRegionError")) + } + } + } +} diff --git a/executor/errors.go b/executor/errors.go index 4a0c7f9215875..565a712d1c7d9 100644 --- a/executor/errors.go +++ b/executor/errors.go @@ -69,8 +69,11 @@ var ( ErrFuncNotEnabled = dbterror.ClassExecutor.NewStdErr(mysql.ErrNotSupportedYet, parser_mysql.Message("%-.32s is not supported. To enable this experimental feature, set '%-.32s' in the configuration file.", nil)) errSavepointNotExists = dbterror.ClassExecutor.NewStd(mysql.ErrSpDoesNotExist) ErrForeignKeyCascadeDepthExceeded = dbterror.ClassExecutor.NewStd(mysql.ErrForeignKeyCascadeDepthExceeded) + ErrPasswordExpireAnonymousUser = dbterror.ClassExecutor.NewStd(mysql.ErrPasswordExpireAnonymousUser) + errMustChangePassword = dbterror.ClassExecutor.NewStd(mysql.ErrMustChangePassword) ErrWrongStringLength = dbterror.ClassDDL.NewStd(mysql.ErrWrongStringLength) errUnsupportedFlashbackTmpTable = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("Recover/flashback table is not supported on temporary tables", nil)) errTruncateWrongInsertValue = dbterror.ClassTable.NewStdErr(mysql.ErrTruncatedWrongValue, parser_mysql.Message("Incorrect %-.32s value: '%-.128s' for column '%.192s' at row %d", nil)) + ErrExistsInHistoryPassword = dbterror.ClassExecutor.NewStd(mysql.ErrExistsInHistoryPassword) ) diff --git a/executor/executor.go b/executor/executor.go index 6401d41e7e77e..e02abeed16d75 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -19,7 +19,6 @@ import ( "fmt" "math" "runtime/pprof" - "runtime/trace" "strconv" "strings" "sync" @@ -68,6 +67,7 @@ import ( "github.com/pingcap/tidb/util/resourcegrouptag" "github.com/pingcap/tidb/util/topsql" topsqlstate "github.com/pingcap/tidb/util/topsql/state" + "github.com/pingcap/tidb/util/tracing" tikverr "github.com/tikv/client-go/v2/error" tikvstore "github.com/tikv/client-go/v2/kv" tikvutil "github.com/tikv/client-go/v2/util" @@ -272,8 +272,7 @@ func newBaseExecutor(ctx sessionctx.Context, schema *expression.Schema, id int, } if ctx.GetSessionVars().StmtCtx.RuntimeStatsColl != nil { if e.id > 0 { - e.runtimeStats = &execdetails.BasicRuntimeStats{} - e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(id, e.runtimeStats) + e.runtimeStats = e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.GetBasicRuntimeStats(id) } } if schema != nil { @@ -315,15 +314,11 @@ func Next(ctx context.Context, e Executor, req *chunk.Chunk) error { if atomic.LoadUint32(&sessVars.Killed) == 1 { return ErrQueryInterrupted } - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan(fmt.Sprintf("%T.Next", e), opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } - if trace.IsEnabled() { - defer trace.StartRegion(ctx, fmt.Sprintf("%T.Next", e)).End() - } - if topsqlstate.TopSQLEnabled() && sessVars.StmtCtx.IsSQLAndPlanRegistered.CAS(false, true) { + + r, ctx := tracing.StartRegionEx(ctx, fmt.Sprintf("%T.Next", e)) + defer r.End() + + if topsqlstate.TopSQLEnabled() && sessVars.StmtCtx.IsSQLAndPlanRegistered.CompareAndSwap(false, true) { registerSQLAndPlanInExecForTopSQL(sessVars) } err := e.Next(ctx, req) @@ -354,7 +349,7 @@ func (e *CancelDDLJobsExec) Open(ctx context.Context) error { if err != nil { return err } - e.errs, err = ddl.CancelJobs(newSess, e.ctx.GetStore(), e.jobIDs) + e.errs, err = ddl.CancelJobs(newSess, e.jobIDs) e.releaseSysSession(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), newSess) return err } @@ -399,7 +394,7 @@ func (e *ShowNextRowIDExec) Next(ctx context.Context, req *chunk.Chunk) error { tblMeta := tbl.Meta() allocators := tbl.Allocators(e.ctx) - for _, alloc := range allocators { + for _, alloc := range allocators.Allocs { nextGlobalID, err := alloc.NextGlobalAutoID() if err != nil { return err @@ -407,7 +402,16 @@ func (e *ShowNextRowIDExec) Next(ctx context.Context, req *chunk.Chunk) error { var colName, idType string switch alloc.GetType() { - case autoid.RowIDAllocType, autoid.AutoIncrementType: + case autoid.RowIDAllocType: + idType = "_TIDB_ROWID" + if tblMeta.PKIsHandle { + if col := tblMeta.GetAutoIncrementColInfo(); col != nil { + colName = col.Name.O + } + } else { + colName = model.ExtraHandleName.O + } + case autoid.AutoIncrementType: idType = "AUTO_INCREMENT" if tblMeta.PKIsHandle { if col := tblMeta.GetAutoIncrementColInfo(); col != nil { @@ -587,7 +591,7 @@ func (e *DDLJobRetriever) appendJobToChunk(req *chunk.Chunk, job *model.Job, che req.AppendInt64(0, job.ID) req.AppendString(1, schemaName) req.AppendString(2, tableName) - req.AppendString(3, subJob.Type.String()+" /* subjob */") + req.AppendString(3, subJob.Type.String()+" /* subjob */"+showAddIdxReorgTpInSubJob(subJob)) req.AppendString(4, subJob.SchemaState.String()) req.AppendInt64(5, job.SchemaID) req.AppendInt64(6, job.TableID) @@ -612,6 +616,16 @@ func showAddIdxReorgTp(job *model.Job) string { return "" } +func showAddIdxReorgTpInSubJob(subJob *model.SubJob) string { + if subJob.Type == model.ActionAddIndex || subJob.Type == model.ActionAddPrimaryKey { + tp := subJob.ReorgTp.String() + if len(tp) > 0 { + return " /* " + tp + " */" + } + } + return "" +} + func ts2Time(timestamp uint64, loc *time.Location) types.Time { duration := time.Duration(math.Pow10(9-types.DefaultFsp)) * time.Nanosecond t := model.TSConvert2Time(timestamp) @@ -666,8 +680,21 @@ func (e *ShowDDLJobQueriesExec) Open(ctx context.Context) error { return err } - e.jobs = append(e.jobs, jobs...) - e.jobs = append(e.jobs, historyJobs...) + appendedJobID := make(map[int64]struct{}) + // deduplicate job results + // for situations when this operation happens at the same time with new DDLs being executed + for _, job := range jobs { + if _, ok := appendedJobID[job.ID]; !ok { + appendedJobID[job.ID] = struct{}{} + e.jobs = append(e.jobs, job) + } + } + for _, historyJob := range historyJobs { + if _, ok := appendedJobID[historyJob.ID]; !ok { + appendedJobID[historyJob.ID] = struct{}{} + e.jobs = append(e.jobs, historyJob) + } + } return nil } @@ -741,8 +768,25 @@ func (e *ShowDDLJobQueriesWithRangeExec) Open(ctx context.Context) error { return err } - e.jobs = append(e.jobs, jobs...) - e.jobs = append(e.jobs, historyJobs...) + appendedJobID := make(map[int64]struct{}) + // deduplicate job results + // for situations when this operation happens at the same time with new DDLs being executed + for _, job := range jobs { + if _, ok := appendedJobID[job.ID]; !ok { + appendedJobID[job.ID] = struct{}{} + e.jobs = append(e.jobs, job) + } + } + for _, historyJob := range historyJobs { + if _, ok := appendedJobID[historyJob.ID]; !ok { + appendedJobID[historyJob.ID] = struct{}{} + e.jobs = append(e.jobs, historyJob) + } + } + + if e.cursor < int(e.offset) { + e.cursor = int(e.offset) + } return nil } @@ -758,9 +802,12 @@ func (e *ShowDDLJobQueriesWithRangeExec) Next(ctx context.Context, req *chunk.Ch } numCurBatch := mathutil.Min(req.Capacity(), len(e.jobs)-e.cursor) for i := e.cursor; i < e.cursor+numCurBatch; i++ { - if i >= int(e.offset) && i < int(e.offset+e.limit) { + // i is make true to be >= int(e.offset) + if i < int(e.offset+e.limit) { req.AppendString(0, strconv.FormatInt(e.jobs[i].ID, 10)) req.AppendString(1, e.jobs[i].Query) + } else { + break } } e.cursor += numCurBatch @@ -951,6 +998,9 @@ func (e *CheckTableExec) Next(ctx context.Context, req *chunk.Chunk) error { idxNames := make([]string, 0, len(e.indexInfos)) for _, idx := range e.indexInfos { + if idx.MVIndex { + continue + } idxNames = append(idxNames, idx.Name.O) } greater, idxOffset, err := admin.CheckIndicesCount(e.ctx, e.dbName, e.table.Meta().Name.O, idxNames) @@ -970,7 +1020,13 @@ func (e *CheckTableExec) Next(ctx context.Context, req *chunk.Chunk) error { // The number of table rows is equal to the number of index rows. // TODO: Make the value of concurrency adjustable. And we can consider the number of records. if len(e.srcs) == 1 { - return e.checkIndexHandle(ctx, e.srcs[0]) + err = e.checkIndexHandle(ctx, e.srcs[0]) + if err == nil && e.srcs[0].index.MVIndex { + err = e.checkTableRecord(ctx, 0) + } + if err != nil { + return err + } } taskCh := make(chan *IndexLookUpExecutor, len(e.srcs)) failure := atomicutil.NewBool(false) @@ -989,6 +1045,14 @@ func (e *CheckTableExec) Next(ctx context.Context, req *chunk.Chunk) error { select { case src := <-taskCh: err1 := e.checkIndexHandle(ctx, src) + if err1 == nil && src.index.MVIndex { + for offset, idx := range e.indexInfos { + if idx.ID == src.index.ID { + err1 = e.checkTableRecord(ctx, offset) + break + } + } + } if err1 != nil { failure.Store(true) logutil.Logger(ctx).Info("check index handle failed", zap.Error(err1)) @@ -1325,6 +1389,9 @@ type LimitExec struct { // columnIdxsUsedByChild keep column indexes of child executor used for inline projection columnIdxsUsedByChild []int + + // Log the close time when opentracing is enabled. + span opentracing.Span } // Next implements the Executor Next interface. @@ -1402,13 +1469,29 @@ func (e *LimitExec) Open(ctx context.Context) error { e.childResult = tryNewCacheChunk(e.children[0]) e.cursor = 0 e.meetFirstBatch = e.begin == 0 + if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { + e.span = span + } return nil } // Close implements the Executor Close interface. func (e *LimitExec) Close() error { + start := time.Now() + e.childResult = nil - return e.baseExecutor.Close() + err := e.baseExecutor.Close() + + elapsed := time.Since(start) + if elapsed > time.Millisecond { + logutil.BgLogger().Info("limit executor close takes a long time", + zap.Duration("elapsed", elapsed)) + if e.span != nil { + span1 := e.span.Tracer().StartSpan("limitExec.Close", opentracing.ChildOf(e.span.Context()), opentracing.StartTime(start)) + defer span1.Finish() + } + } + return err } func (e *LimitExec) adjustRequiredRows(chk *chunk.Chunk) *chunk.Chunk { @@ -1440,11 +1523,8 @@ func init() { s.RewritePhaseInfo.DurationPreprocessSubQuery += time.Since(begin) }(time.Now()) - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("executor.EvalSubQuery", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } + r, ctx := tracing.StartRegionEx(ctx, "executor.EvalSubQuery") + defer r.End() e := newExecutorBuilder(sctx, is, nil) exec := e.build(p) @@ -1925,7 +2005,7 @@ func (e *UnionExec) Close() error { func ResetContextOfStmt(ctx sessionctx.Context, s ast.StmtNode) (err error) { vars := ctx.GetSessionVars() var sc *stmtctx.StatementContext - if vars.TxnCtx.CouldRetry { + if vars.TxnCtx.CouldRetry || mysql.HasCursorExistsFlag(vars.Status) { // Must construct new statement context object, the retry history need context for every statement. // TODO: Maybe one day we can get rid of transaction retry, then this logic can be deleted. sc = &stmtctx.StatementContext{} @@ -1951,8 +2031,13 @@ func ResetContextOfStmt(ctx sessionctx.Context, s ast.StmtNode) (err error) { sc.UseDynamicPruneMode = false } + sc.StatsLoad.Timeout = 0 + sc.StatsLoad.NeededItems = nil + sc.StatsLoad.ResultCh = nil + sc.SysdateIsNow = ctx.GetSessionVars().SysdateIsNow + vars.MemTracker.Detach() vars.MemTracker.UnbindActions() vars.MemTracker.SetBytesLimit(vars.MemQuotaQuery) vars.MemTracker.ResetMaxConsumed() @@ -1963,21 +2048,22 @@ func ResetContextOfStmt(ctx sessionctx.Context, s ast.StmtNode) (err error) { if _, ok := s.(*ast.AnalyzeTableStmt); ok { sc.InitMemTracker(memory.LabelForAnalyzeMemory, -1) vars.MemTracker.SetBytesLimit(-1) + vars.MemTracker.AttachTo(GlobalAnalyzeMemoryTracker) } else { sc.InitMemTracker(memory.LabelForSQLText, -1) - logOnQueryExceedMemQuota := domain.GetDomain(ctx).ExpensiveQueryHandle().LogOnQueryExceedMemQuota - switch variable.OOMAction.Load() { - case variable.OOMActionCancel: - action := &memory.PanicOnExceed{ConnID: vars.ConnectionID} - action.SetLogHook(logOnQueryExceedMemQuota) - vars.MemTracker.SetActionOnExceed(action) - case variable.OOMActionLog: - fallthrough - default: - action := &memory.LogOnExceed{ConnID: vars.ConnectionID} - action.SetLogHook(logOnQueryExceedMemQuota) - vars.MemTracker.SetActionOnExceed(action) - } + } + logOnQueryExceedMemQuota := domain.GetDomain(ctx).ExpensiveQueryHandle().LogOnQueryExceedMemQuota + switch variable.OOMAction.Load() { + case variable.OOMActionCancel: + action := &memory.PanicOnExceed{ConnID: vars.ConnectionID} + action.SetLogHook(logOnQueryExceedMemQuota) + vars.MemTracker.SetActionOnExceed(action) + case variable.OOMActionLog: + fallthrough + default: + action := &memory.LogOnExceed{ConnID: vars.ConnectionID} + action.SetLogHook(logOnQueryExceedMemQuota) + vars.MemTracker.SetActionOnExceed(action) } sc.MemTracker.SessionID = vars.ConnectionID sc.MemTracker.AttachTo(vars.MemTracker) @@ -2154,6 +2240,9 @@ func ResetContextOfStmt(ctx sessionctx.Context, s ast.StmtNode) (err error) { vars.ClearStmtVars() vars.PrevFoundInBinding = vars.FoundInBinding vars.FoundInBinding = false + vars.DurationWaitTS = 0 + vars.CurrInsertBatchExtraCols = nil + vars.CurrInsertValues = chunk.Row{} return } @@ -2182,39 +2271,6 @@ func ResetUpdateStmtCtx(sc *stmtctx.StatementContext, stmt *ast.UpdateStmt, vars sc.IgnoreNoPartition = stmt.IgnoreErr } -// FillVirtualColumnValue will calculate the virtual column value by evaluating generated -// expression using rows from a chunk, and then fill this value into the chunk -func FillVirtualColumnValue(virtualRetTypes []*types.FieldType, virtualColumnIndex []int, - schema *expression.Schema, columns []*model.ColumnInfo, sctx sessionctx.Context, req *chunk.Chunk) error { - if len(virtualColumnIndex) == 0 { - return nil - } - - virCols := chunk.NewChunkWithCapacity(virtualRetTypes, req.Capacity()) - iter := chunk.NewIterator4Chunk(req) - for i, idx := range virtualColumnIndex { - for row := iter.Begin(); row != iter.End(); row = iter.Next() { - datum, err := schema.Columns[idx].EvalVirtualColumn(row) - if err != nil { - return err - } - // Because the expression might return different type from - // the generated column, we should wrap a CAST on the result. - castDatum, err := table.CastValue(sctx, datum, columns[idx], false, true) - if err != nil { - return err - } - // Handle the bad null error. - if (mysql.HasNotNullFlag(columns[idx].GetFlag()) || mysql.HasPreventNullInsertFlag(columns[idx].GetFlag())) && castDatum.IsNull() { - castDatum = table.GetZeroValue(columns[idx]) - } - virCols.AppendDatum(i, &castDatum) - } - req.SetCol(idx, virCols.Column(i)) - } - return nil -} - func setOptionForTopSQL(sc *stmtctx.StatementContext, snapshot kv.Snapshot) { if snapshot == nil { return diff --git a/executor/executor_required_rows_test.go b/executor/executor_required_rows_test.go index cbca9914b5bc2..c3ac762050d24 100644 --- a/executor/executor_required_rows_test.go +++ b/executor/executor_required_rows_test.go @@ -22,6 +22,7 @@ import ( "testing" "time" + "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" "github.com/pingcap/tidb/parser/ast" @@ -211,6 +212,7 @@ func defaultCtx() sessionctx.Context { ctx.GetSessionVars().StmtCtx.MemTracker = memory.NewTracker(-1, ctx.GetSessionVars().MemQuotaQuery) ctx.GetSessionVars().StmtCtx.DiskTracker = disk.NewTracker(-1, -1) ctx.GetSessionVars().SnapshotTS = uint64(1) + domain.BindDomain(ctx, domain.NewMockDomain()) return ctx } diff --git a/executor/executor_test.go b/executor/executor_test.go index 641f56817cd60..5e170213c4461 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -66,6 +66,7 @@ import ( "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/mock" + "github.com/pingcap/tidb/util/replayer" "github.com/pingcap/tidb/util/rowcodec" "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tidb/util/timeutil" @@ -81,12 +82,15 @@ func checkFileName(s string) bool { "meta.txt", "stats/test.t_dump_single.json", "schema/test.t_dump_single.schema.txt", + "schema/schema_meta.txt", "table_tiflash_replica.txt", "variables.toml", "session_bindings.sql", "global_bindings.sql", "sql/sql0.sql", "explain/sql0.txt", + "statsMem/test.t_dump_single.txt", + "sql_meta.toml", } for _, f := range files { if strings.Compare(f, s) == 0 { @@ -174,6 +178,70 @@ func TestPlanReplayer(t *testing.T) { require.Len(t, rows, 1) } +func TestPlanReplayerCaptureSEM(t *testing.T) { + originSEM := config.GetGlobalConfig().Security.EnableSEM + defer func() { + config.GetGlobalConfig().Security.EnableSEM = originSEM + }() + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("plan replayer capture '123' '123';") + tk.MustExec("create table t(id int)") + tk.MustQuery("plan replayer dump explain select * from t") + tk.MustQuery("select count(*) from mysql.plan_replayer_status").Check(testkit.Rows("1")) +} + +func TestPlanReplayerCapture(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("plan replayer capture '123' '123';") + tk.MustQuery("select sql_digest, plan_digest from mysql.plan_replayer_task;").Check(testkit.Rows("123 123")) + tk.MustGetErrMsg("plan replayer capture '123' '123';", "plan replayer capture task already exists") + tk.MustExec("plan replayer capture remove '123' '123'") + tk.MustQuery("select count(*) from mysql.plan_replayer_task;").Check(testkit.Rows("0")) + tk.MustExec("create table t(id int)") + tk.MustExec("prepare stmt from 'update t set id = ? where id = ? + 1';") + tk.MustExec("SET @number = 5;") + tk.MustExec("execute stmt using @number,@number") + _, sqlDigest := tk.Session().GetSessionVars().StmtCtx.SQLDigest() + _, planDigest := tk.Session().GetSessionVars().StmtCtx.GetPlanDigest() + tk.MustExec("SET @@tidb_enable_plan_replayer_capture = ON;") + tk.MustExec(fmt.Sprintf("plan replayer capture '%v' '%v'", sqlDigest.String(), planDigest.String())) + err := dom.GetPlanReplayerHandle().CollectPlanReplayerTask() + require.NoError(t, err) + tk.MustExec("execute stmt using @number,@number") + task := dom.GetPlanReplayerHandle().DrainTask() + require.NotNil(t, task) +} + +func TestPlanReplayerContinuesCapture(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("set @@global.tidb_enable_historical_stats='OFF'") + _, err := tk.Exec("set @@global.tidb_enable_plan_replayer_continues_capture='ON'") + require.Error(t, err) + require.Equal(t, err.Error(), "tidb_enable_historical_stats should be enabled before enabling tidb_enable_plan_replayer_continues_capture") + + tk.MustExec("set @@global.tidb_enable_historical_stats='ON'") + tk.MustExec("set @@global.tidb_enable_plan_replayer_continues_capture='ON'") + + prHandle := dom.GetPlanReplayerHandle() + tk.MustExec("delete from mysql.plan_replayer_status;") + tk.MustExec("use test") + tk.MustExec("create table t(id int);") + tk.MustExec("set @@tidb_enable_plan_replayer_continues_capture = 'ON'") + tk.MustQuery("select * from t;") + task := prHandle.DrainTask() + require.NotNil(t, task) + worker := prHandle.GetWorker() + success := worker.HandleTask(task) + require.True(t, success) + tk.MustQuery("select count(*) from mysql.plan_replayer_status").Check(testkit.Rows("1")) +} + func TestShow(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -190,13 +258,16 @@ func TestShow(t *testing.T) { tk.MustQuery("show create database test_show").Check(testkit.Rows("test_show CREATE DATABASE `test_show` /*!40100 DEFAULT CHARACTER SET utf8mb4 */")) tk.MustQuery("show privileges").Check(testkit.Rows("Alter Tables To alter the table", "Alter routine Functions,Procedures To alter or drop stored functions/procedures", + "Config Server Admin To use SHOW CONFIG and SET CONFIG statements", "Create Databases,Tables,Indexes To create new databases and tables", "Create routine Databases To use CREATE FUNCTION/PROCEDURE", + "Create role Server Admin To create new roles", "Create temporary tables Databases To use CREATE TEMPORARY TABLE", "Create view Tables To create new views", "Create user Server Admin To create new users", "Delete Tables To delete existing rows", "Drop Databases,Tables To drop databases, tables, and views", + "Drop role Server Admin To drop roles", "Event Server Admin To create, alter, drop and execute events", "Execute Functions,Procedures To execute stored routines", "File File access on server To read and write files on the server", @@ -233,6 +304,7 @@ func TestShow(t *testing.T) { "RESTRICTED_USER_ADMIN Server Admin ", "RESTRICTED_CONNECTION_ADMIN Server Admin ", "RESTRICTED_REPLICA_WRITER_ADMIN Server Admin ", + "RESOURCE_GROUP_ADMIN Server Admin ", )) require.Len(t, tk.MustQuery("show table status").Rows(), 1) } @@ -1477,6 +1549,21 @@ func TestSetOperation(t *testing.T) { tk.MustQuery("explain " + tt).Check(testkit.Rows(output[i].Plan...)) tk.MustQuery(tt).Sort().Check(testkit.Rows(output[i].Res...)) } + + // from https://github.com/pingcap/tidb/issues/40279 + tk.MustExec("CREATE TABLE `issue40279` (`a` char(155) NOT NULL DEFAULT 'on1unvbxp5sko6mbetn3ku26tuiyju7w3wc0olzto9ew7gsrx',`b` mediumint(9) NOT NULL DEFAULT '2525518',PRIMARY KEY (`b`,`a`) /*T![clustered_index] CLUSTERED */);") + tk.MustExec("insert into `issue40279` values ();") + tk.MustQuery("( select `issue40279`.`b` as r0 , from_base64( `issue40279`.`a` ) as r1 from `issue40279` ) " + + "except ( " + + "select `issue40279`.`a` as r0 , elt(2, `issue40279`.`a` , `issue40279`.`a` ) as r1 from `issue40279`);"). + Check(testkit.Rows("2525518 ")) + tk.MustExec("drop table if exists t2") + + tk.MustExec("CREATE TABLE `t2` ( `a` varchar(20) CHARACTER SET gbk COLLATE gbk_chinese_ci DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") + tk.MustExec("insert into t2 values(0xCED2)") + result := tk.MustQuery("(select elt(2,t2.a,t2.a) from t2) except (select 0xCED2 from t2)") + rows := result.Rows() + require.Len(t, rows, 0) } func TestSetOperationOnDiffColType(t *testing.T) { @@ -1560,7 +1647,7 @@ func TestPlanReplayerDumpSingle(t *testing.T) { res := tk.MustQuery("plan replayer dump explain select * from t_dump_single") path := testdata.ConvertRowsToStrings(res.Rows()) - reader, err := zip.OpenReader(filepath.Join(domain.GetPlanReplayerDirName(), path[0])) + reader, err := zip.OpenReader(filepath.Join(replayer.GetPlanReplayerDirName(), path[0])) require.NoError(t, err) defer func() { require.NoError(t, reader.Close()) }() for _, file := range reader.File { @@ -1913,7 +2000,7 @@ func TestCheckIndex(t *testing.T) { tbInfo := tbl.Meta() alloc := autoid.NewAllocator(store, dbInfo.ID, tbInfo.ID, false, autoid.RowIDAllocType) - tb, err := tables.TableFromMeta(autoid.NewAllocators(alloc), tbInfo) + tb, err := tables.TableFromMeta(autoid.NewAllocators(false, alloc), tbInfo) require.NoError(t, err) _, err = se.Execute(context.Background(), "admin check index t c") @@ -2042,6 +2129,8 @@ func TestIncorrectLimitArg(t *testing.T) { tk.MustGetErrMsg(`execute stmt1 using @a;`, `[planner:1210]Incorrect arguments to LIMIT`) tk.MustGetErrMsg(`execute stmt2 using @b, @a;`, `[planner:1210]Incorrect arguments to LIMIT`) + tk.MustGetErrMsg(`execute stmt2 using @a, @b;`, `[planner:1210]Incorrect arguments to LIMIT`) + tk.MustGetErrMsg(`execute stmt2 using @a, @a;`, `[planner:1210]Incorrect arguments to LIMIT`) } func TestExecutorLimit(t *testing.T) { @@ -2415,7 +2504,7 @@ func TestTimestampDefaultValueTimeZone(t *testing.T) { tk.MustExec(`set time_zone = '+00:00'`) timeIn0 := tk.MustQuery("select b from t").Rows()[0][0] require.NotEqual(t, timeIn8, timeIn0) - datumTimeIn8, err := expression.GetTimeValue(tk.Session(), timeIn8, mysql.TypeTimestamp, 0) + datumTimeIn8, err := expression.GetTimeValue(tk.Session(), timeIn8, mysql.TypeTimestamp, 0, nil) require.NoError(t, err) tIn8To0 := datumTimeIn8.GetMysqlTime() timeZoneIn8, err := time.LoadLocation("Asia/Shanghai") @@ -3578,10 +3667,10 @@ func TestPointGetPreparedPlan(t *testing.T) { pspk1Id, _, _, err := tk.Session().PrepareStmt("select * from t where a = ?") require.NoError(t, err) - tk.Session().GetSessionVars().PreparedStmts[pspk1Id].(*plannercore.PlanCacheStmt).PreparedAst.UseCache = false + tk.Session().GetSessionVars().PreparedStmts[pspk1Id].(*plannercore.PlanCacheStmt).StmtCacheable = false pspk2Id, _, _, err := tk.Session().PrepareStmt("select * from t where ? = a ") require.NoError(t, err) - tk.Session().GetSessionVars().PreparedStmts[pspk2Id].(*plannercore.PlanCacheStmt).PreparedAst.UseCache = false + tk.Session().GetSessionVars().PreparedStmts[pspk2Id].(*plannercore.PlanCacheStmt).StmtCacheable = false ctx := context.Background() // first time plan generated @@ -3621,7 +3710,7 @@ func TestPointGetPreparedPlan(t *testing.T) { // unique index psuk1Id, _, _, err := tk.Session().PrepareStmt("select * from t where b = ? ") require.NoError(t, err) - tk.Session().GetSessionVars().PreparedStmts[psuk1Id].(*plannercore.PlanCacheStmt).PreparedAst.UseCache = false + tk.Session().GetSessionVars().PreparedStmts[psuk1Id].(*plannercore.PlanCacheStmt).StmtCacheable = false rs, err = tk.Session().ExecutePreparedStmt(ctx, psuk1Id, expression.Args2Expressions4Test(1)) require.NoError(t, err) @@ -3739,7 +3828,7 @@ func TestPointGetPreparedPlanWithCommitMode(t *testing.T) { pspk1Id, _, _, err := tk1.Session().PrepareStmt("select * from t where a = ?") require.NoError(t, err) - tk1.Session().GetSessionVars().PreparedStmts[pspk1Id].(*plannercore.PlanCacheStmt).PreparedAst.UseCache = false + tk1.Session().GetSessionVars().PreparedStmts[pspk1Id].(*plannercore.PlanCacheStmt).StmtCacheable = false ctx := context.Background() // first time plan generated @@ -3805,11 +3894,11 @@ func TestPointUpdatePreparedPlan(t *testing.T) { updateID1, pc, _, err := tk.Session().PrepareStmt(`update t set c = c + 1 where a = ?`) require.NoError(t, err) - tk.Session().GetSessionVars().PreparedStmts[updateID1].(*plannercore.PlanCacheStmt).PreparedAst.UseCache = false + tk.Session().GetSessionVars().PreparedStmts[updateID1].(*plannercore.PlanCacheStmt).StmtCacheable = false require.Equal(t, 1, pc) updateID2, pc, _, err := tk.Session().PrepareStmt(`update t set c = c + 2 where ? = a`) require.NoError(t, err) - tk.Session().GetSessionVars().PreparedStmts[updateID2].(*plannercore.PlanCacheStmt).PreparedAst.UseCache = false + tk.Session().GetSessionVars().PreparedStmts[updateID2].(*plannercore.PlanCacheStmt).StmtCacheable = false require.Equal(t, 1, pc) ctx := context.Background() @@ -3844,7 +3933,7 @@ func TestPointUpdatePreparedPlan(t *testing.T) { // unique index updUkID1, _, _, err := tk.Session().PrepareStmt(`update t set c = c + 10 where b = ?`) require.NoError(t, err) - tk.Session().GetSessionVars().PreparedStmts[updUkID1].(*plannercore.PlanCacheStmt).PreparedAst.UseCache = false + tk.Session().GetSessionVars().PreparedStmts[updUkID1].(*plannercore.PlanCacheStmt).StmtCacheable = false rs, err = tk.Session().ExecutePreparedStmt(ctx, updUkID1, expression.Args2Expressions4Test(3)) require.Nil(t, rs) require.NoError(t, err) @@ -3913,7 +4002,7 @@ func TestPointUpdatePreparedPlanWithCommitMode(t *testing.T) { ctx := context.Background() updateID1, _, _, err := tk1.Session().PrepareStmt(`update t set c = c + 1 where a = ?`) - tk1.Session().GetSessionVars().PreparedStmts[updateID1].(*plannercore.PlanCacheStmt).PreparedAst.UseCache = false + tk1.Session().GetSessionVars().PreparedStmts[updateID1].(*plannercore.PlanCacheStmt).StmtCacheable = false require.NoError(t, err) // first time plan generated @@ -4320,7 +4409,7 @@ func TestAdminShowDDLJobs(t *testing.T) { require.NoError(t, err) err = meta.NewMeta(txn).AddHistoryDDLJob(job, true) require.NoError(t, err) - tk.Session().StmtCommit() + tk.Session().StmtCommit(context.Background()) re = tk.MustQuery("admin show ddl jobs 1") row = re.Rows()[0] @@ -4594,13 +4683,10 @@ func TestUnion2(t *testing.T) { terr = errors.Cause(err).(*terror.Error) require.Equal(t, errors.ErrCode(mysql.ErrWrongUsage), terr.Code()) - _, err = tk.Exec("(select a from t order by a) union all select a from t limit 1 union all select a from t limit 1") - require.Truef(t, terror.ErrorEqual(err, plannercore.ErrWrongUsage), "err %v", err) + tk.MustGetDBError("(select a from t order by a) union all select a from t limit 1 union all select a from t limit 1", plannercore.ErrWrongUsage) - _, err = tk.Exec("(select a from t limit 1) union all select a from t limit 1") - require.NoError(t, err) - _, err = tk.Exec("(select a from t order by a) union all select a from t order by a") - require.NoError(t, err) + tk.MustExec("(select a from t limit 1) union all select a from t limit 1") + tk.MustExec("(select a from t order by a) union all select a from t order by a") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int)") @@ -4671,8 +4757,8 @@ func TestUnion2(t *testing.T) { tk.MustExec("insert into t2 values(3,'c'),(4,'d'),(5,'f'),(6,'e')") tk.MustExec("analyze table t1") tk.MustExec("analyze table t2") - _, err = tk.Exec("(select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by t1.b") - require.Equal(t, "[planner:1250]Table 't1' from one of the SELECTs cannot be used in global ORDER clause", err.Error()) + tk.MustGetErrMsg("(select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by t1.b", + "[planner:1250]Table 't1' from one of the SELECTs cannot be used in global ORDER clause") // #issue 9900 tk.MustExec("drop table if exists t") @@ -4826,15 +4912,11 @@ func TestSQLMode(t *testing.T) { tk.MustExec("drop table if exists t") tk.MustExec("create table t (a tinyint not null)") tk.MustExec("set sql_mode = 'STRICT_TRANS_TABLES'") - _, err := tk.Exec("insert t values ()") - require.Error(t, err) - - _, err = tk.Exec("insert t values ('1000')") - require.Error(t, err) + tk.ExecToErr("insert t values ()") + tk.ExecToErr("insert t values ('1000')") tk.MustExec("create table if not exists tdouble (a double(3,2))") - _, err = tk.Exec("insert tdouble values (10.23)") - require.Error(t, err) + tk.ExecToErr("insert tdouble values (10.23)") tk.MustExec("set sql_mode = ''") tk.MustExec("insert t values ()") @@ -4862,8 +4944,7 @@ func TestSQLMode(t *testing.T) { tk2.MustQuery("select * from t2").Check(testkit.Rows("abc")) // session1 is still in strict mode. - _, err = tk.Exec("insert t2 values ('abcd')") - require.Error(t, err) + tk.ExecToErr("insert t2 values ('abcd')") // Restore original global strict mode. tk.MustExec("set @@global.sql_mode = 'STRICT_TRANS_TABLES'") } @@ -5502,6 +5583,8 @@ func TestAdmin(t *testing.T) { })) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") tk.MustExec("drop table if exists admin_test") tk.MustExec("create table admin_test (c1 int, c2 int, c3 int default 1, index (c1))") tk.MustExec("insert admin_test (c1) values (1),(2),(NULL)") @@ -5611,6 +5694,68 @@ func TestAdmin(t *testing.T) { result.Check(testkit.Rows(fmt.Sprintf("%d %s", historyJobs[2].ID, historyJobs[2].Query), fmt.Sprintf("%d %s", historyJobs[3].ID, historyJobs[3].Query), fmt.Sprintf("%d %s", historyJobs[4].ID, historyJobs[4].Query))) require.NoError(t, err) + // check situations when `admin show ddl job 20` happens at the same time with new DDLs being executed + var wg sync.WaitGroup + wg.Add(2) + flag := true + go func() { + defer wg.Done() + for i := 0; i < 10; i++ { + tk.MustExec("drop table if exists admin_test9") + tk.MustExec("create table admin_test9 (c1 int, c2 int, c3 int default 1, index (c1))") + } + }() + go func() { + // check that the result set has no duplication + defer wg.Done() + for i := 0; i < 10; i++ { + result := tk2.MustQuery(`admin show ddl job queries 20`) + rows := result.Rows() + rowIDs := make(map[string]struct{}) + for _, row := range rows { + rowID := fmt.Sprintf("%v", row[0]) + if _, ok := rowIDs[rowID]; ok { + flag = false + return + } + rowIDs[rowID] = struct{}{} + } + } + }() + wg.Wait() + require.True(t, flag) + + // check situations when `admin show ddl job queries limit 3 offset 2` happens at the same time with new DDLs being executed + var wg2 sync.WaitGroup + wg2.Add(2) + flag = true + go func() { + defer wg2.Done() + for i := 0; i < 10; i++ { + tk.MustExec("drop table if exists admin_test9") + tk.MustExec("create table admin_test9 (c1 int, c2 int, c3 int default 1, index (c1))") + } + }() + go func() { + // check that the result set has no duplication + defer wg2.Done() + for i := 0; i < 10; i++ { + result := tk2.MustQuery(`admin show ddl job queries limit 3 offset 2`) + rows := result.Rows() + rowIDs := make(map[string]struct{}) + for _, row := range rows { + rowID := fmt.Sprintf("%v", row[0]) + if _, ok := rowIDs[rowID]; ok { + flag = false + return + } + rowIDs[rowID] = struct{}{} + } + } + }() + wg2.Wait() + require.True(t, flag) + // check table test tk.MustExec("create table admin_test1 (c1 int, c2 int default 1, index (c1))") tk.MustExec("insert admin_test1 (c1) values (21),(22)") @@ -5947,6 +6092,8 @@ func TestSummaryFailedUpdate(t *testing.T) { tk.Session().SetSessionManager(sm) dom.ExpensiveQueryHandle().SetSessionManager(sm) defer tk.MustExec("SET GLOBAL tidb_mem_oom_action = DEFAULT") + tk.MustQuery("select variable_value from mysql.GLOBAL_VARIABLES where variable_name = 'tidb_mem_oom_action'").Check(testkit.Rows("LOG")) + tk.MustExec("SET GLOBAL tidb_mem_oom_action='CANCEL'") require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) tk.MustExec("set @@tidb_mem_quota_query=1") @@ -6226,8 +6373,7 @@ func TestSessionRootTrackerDetach(t *testing.T) { tk.MustExec("create table t(a int, b int, index idx(a))") tk.MustExec("create table t1(a int, c int, index idx(a))") tk.MustExec("set tidb_mem_quota_query=10") - err := tk.ExecToErr("select /*+hash_join(t1)*/ t.a, t1.a from t use index(idx), t1 use index(idx) where t.a = t1.a") - require.Contains(t, err.Error(), "Out Of Memory Quota!") + tk.MustContainErrMsg("select /*+hash_join(t1)*/ t.a, t1.a from t use index(idx), t1 use index(idx) where t.a = t1.a", "Out Of Memory Quota!") tk.MustExec("set tidb_mem_quota_query=1000") rs, err := tk.Exec("select /*+hash_join(t1)*/ t.a, t1.a from t use index(idx), t1 use index(idx) where t.a = t1.a") require.NoError(t, err) @@ -6236,3 +6382,165 @@ func TestSessionRootTrackerDetach(t *testing.T) { require.NoError(t, err) require.Nil(t, tk.Session().GetSessionVars().MemTracker.GetFallbackForTest(false)) } + +func TestIssue39211(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("drop table if exists s;") + + tk.MustExec("CREATE TABLE `t` ( `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL);") + tk.MustExec("CREATE TABLE `s` ( `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL);") + tk.MustExec("insert into t values(1,1),(2,2);") + tk.MustExec("insert into t select * from t;") + tk.MustExec("insert into t select * from t;") + tk.MustExec("insert into t select * from t;") + tk.MustExec("insert into t select * from t;") + tk.MustExec("insert into t select * from t;") + tk.MustExec("insert into t select * from t;") + tk.MustExec("insert into t select * from t;") + tk.MustExec("insert into t select * from t;") + + tk.MustExec("insert into s values(3,3),(4,4),(1,null),(2,null),(null,null);") + tk.MustExec("insert into s select * from s;") + tk.MustExec("insert into s select * from s;") + tk.MustExec("insert into s select * from s;") + tk.MustExec("insert into s select * from s;") + tk.MustExec("insert into s select * from s;") + + tk.MustExec("set @@tidb_max_chunk_size=32;") + tk.MustExec("set @@tidb_enable_null_aware_anti_join=true;") + tk.MustQuery("select * from t where (a,b) not in (select a, b from s);").Check(testkit.Rows()) +} + +func TestPlanReplayerDumpTPCDS(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(`create table catalog_sales +( + cs_sold_date_sk int , + cs_sold_time_sk int , + cs_ship_date_sk int , + cs_bill_customer_sk int , + cs_bill_cdemo_sk int , + cs_bill_hdemo_sk int , + cs_bill_addr_sk int , + cs_ship_customer_sk int , + cs_ship_cdemo_sk int , + cs_ship_hdemo_sk int , + cs_ship_addr_sk int , + cs_call_center_sk int , + cs_catalog_page_sk int , + cs_ship_mode_sk int , + cs_warehouse_sk int , + cs_item_sk int not null, + cs_promo_sk int , + cs_order_number int not null, + cs_quantity int , + cs_wholesale_cost decimal(7,2) , + cs_list_price decimal(7,2) , + cs_sales_price decimal(7,2) , + cs_ext_discount_amt decimal(7,2) , + cs_ext_sales_price decimal(7,2) , + cs_ext_wholesale_cost decimal(7,2) , + cs_ext_list_price decimal(7,2) , + cs_ext_tax decimal(7,2) , + cs_coupon_amt decimal(7,2) , + cs_ext_ship_cost decimal(7,2) , + cs_net_paid decimal(7,2) , + cs_net_paid_inc_tax decimal(7,2) , + cs_net_paid_inc_ship decimal(7,2) , + cs_net_paid_inc_ship_tax decimal(7,2) , + cs_net_profit decimal(7,2) , + primary key (cs_item_sk, cs_order_number) +);`) + tk.MustExec(`create table store_sales +( + ss_sold_date_sk int , + ss_sold_time_sk int , + ss_item_sk int not null, + ss_customer_sk int , + ss_cdemo_sk int , + ss_hdemo_sk int , + ss_addr_sk int , + ss_store_sk int , + ss_promo_sk int , + ss_ticket_number int not null, + ss_quantity int , + ss_wholesale_cost decimal(7,2) , + ss_list_price decimal(7,2) , + ss_sales_price decimal(7,2) , + ss_ext_discount_amt decimal(7,2) , + ss_ext_sales_price decimal(7,2) , + ss_ext_wholesale_cost decimal(7,2) , + ss_ext_list_price decimal(7,2) , + ss_ext_tax decimal(7,2) , + ss_coupon_amt decimal(7,2) , + ss_net_paid decimal(7,2) , + ss_net_paid_inc_tax decimal(7,2) , + ss_net_profit decimal(7,2) , + primary key (ss_item_sk, ss_ticket_number) +);`) + tk.MustExec(`create table date_dim +( + d_date_sk int not null, + d_date_id char(16) not null, + d_date date , + d_month_seq int , + d_week_seq int , + d_quarter_seq int , + d_year int , + d_dow int , + d_moy int , + d_dom int , + d_qoy int , + d_fy_year int , + d_fy_quarter_seq int , + d_fy_week_seq int , + d_day_name char(9) , + d_quarter_name char(6) , + d_holiday char(1) , + d_weekend char(1) , + d_following_holiday char(1) , + d_first_dom int , + d_last_dom int , + d_same_day_ly int , + d_same_day_lq int , + d_current_day char(1) , + d_current_week char(1) , + d_current_month char(1) , + d_current_quarter char(1) , + d_current_year char(1) , + primary key (d_date_sk) +);`) + tk.MustQuery(`plan replayer dump explain with ssci as ( +select ss_customer_sk customer_sk + ,ss_item_sk item_sk +from store_sales,date_dim +where ss_sold_date_sk = d_date_sk + and d_month_seq between 1212 and 1212 + 11 +group by ss_customer_sk + ,ss_item_sk), +csci as( + select cs_bill_customer_sk customer_sk + ,cs_item_sk item_sk +from catalog_sales,date_dim +where cs_sold_date_sk = d_date_sk + and d_month_seq between 1212 and 1212 + 11 +group by cs_bill_customer_sk + ,cs_item_sk) + select sum(case when ssci.customer_sk is not null and csci.customer_sk is null then 1 else 0 end) store_only + ,sum(case when ssci.customer_sk is null and csci.customer_sk is not null then 1 else 0 end) catalog_only + ,sum(case when ssci.customer_sk is not null and csci.customer_sk is not null then 1 else 0 end) store_and_catalog +from ssci left join csci on (ssci.customer_sk=csci.customer_sk + and ssci.item_sk = csci.item_sk) +UNION + select sum(case when ssci.customer_sk is not null and csci.customer_sk is null then 1 else 0 end) store_only + ,sum(case when ssci.customer_sk is null and csci.customer_sk is not null then 1 else 0 end) catalog_only + ,sum(case when ssci.customer_sk is not null and csci.customer_sk is not null then 1 else 0 end) store_and_catalog +from ssci right join csci on (ssci.customer_sk=csci.customer_sk + and ssci.item_sk = csci.item_sk) +limit 100;`) +} diff --git a/executor/explain_test.go b/executor/explain_test.go index c67c61a67a909..28dbbbe12fcf6 100644 --- a/executor/explain_test.go +++ b/executor/explain_test.go @@ -16,6 +16,7 @@ package executor_test import ( "bytes" + "encoding/json" "fmt" "regexp" "strconv" @@ -246,6 +247,7 @@ func TestExplainAnalyzeExecutionInfo(t *testing.T) { checkExecutionInfo(t, tk, "explain analyze select * from t use index(k)") checkExecutionInfo(t, tk, "explain analyze with recursive cte(a) as (select 1 union select a + 1 from cte where a < 1000) select * from cte;") + tk.MustExec("set @@foreign_key_checks=0") tk.MustExec("CREATE TABLE IF NOT EXISTS nation ( N_NATIONKEY BIGINT NOT NULL,N_NAME CHAR(25) NOT NULL,N_REGIONKEY BIGINT NOT NULL,N_COMMENT VARCHAR(152),PRIMARY KEY (N_NATIONKEY));") tk.MustExec("CREATE TABLE IF NOT EXISTS part ( P_PARTKEY BIGINT NOT NULL,P_NAME VARCHAR(55) NOT NULL,P_MFGR CHAR(25) NOT NULL,P_BRAND CHAR(10) NOT NULL,P_TYPE VARCHAR(25) NOT NULL,P_SIZE BIGINT NOT NULL,P_CONTAINER CHAR(10) NOT NULL,P_RETAILPRICE DECIMAL(15,2) NOT NULL,P_COMMENT VARCHAR(23) NOT NULL,PRIMARY KEY (P_PARTKEY));") tk.MustExec("CREATE TABLE IF NOT EXISTS supplier ( S_SUPPKEY BIGINT NOT NULL,S_NAME CHAR(25) NOT NULL,S_ADDRESS VARCHAR(40) NOT NULL,S_NATIONKEY BIGINT NOT NULL,S_PHONE CHAR(15) NOT NULL,S_ACCTBAL DECIMAL(15,2) NOT NULL,S_COMMENT VARCHAR(101) NOT NULL,PRIMARY KEY (S_SUPPKEY),CONSTRAINT FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) references nation(N_NATIONKEY));") @@ -364,7 +366,7 @@ func TestCheckActRowsWithUnistore(t *testing.T) { }, { sql: "select count(*) from t_unistore_act_rows group by b", - expected: []string{"2", "2", "2", "4"}, + expected: []string{"2", "4", "4"}, }, { sql: "with cte(a) as (select a from t_unistore_act_rows) select (select 1 from cte limit 1) from cte;", @@ -515,3 +517,96 @@ func TestIssue35105(t *testing.T) { require.Error(t, tk.ExecToErr("explain analyze insert into t values (1), (2), (3)")) tk.MustQuery("select * from t").Check(testkit.Rows("2")) } + +func flatJSONPlan(j *plannercore.ExplainInfoForEncode) (res []*plannercore.ExplainInfoForEncode) { + if j == nil { + return + } + res = append(res, j) + for _, child := range j.SubOperators { + res = append(res, flatJSONPlan(child)...) + } + return +} + +func TestExplainJSON(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(id int, key(id))") + tk.MustExec("create table t2(id int, key(id))") + cases := []string{ + "select * from t1", + "select count(*) from t2", + "select * from t1, t2 where t1.id = t2.id", + "select /*+ merge_join(t1, t2)*/ * from t1, t2 where t1.id = t2.id", + "with top10 as ( select * from t1 order by id desc limit 10 ) select * from top10 where id in (1,2)", + "insert into t1 values(1)", + "delete from t2 where t2.id > 10", + "update t2 set id = 1 where id =2", + "select * from t1 where t1.id < (select sum(t2.id) from t2 where t2.id = t1.id)", + } + // test syntax + tk.MustExec("explain format = 'tidb_json' select * from t1") + tk.MustExec("explain format = tidb_json select * from t1") + tk.MustExec("explain format = 'TIDB_JSON' select * from t1") + tk.MustExec("explain format = TIDB_JSON select * from t1") + tk.MustExec("explain analyze format = 'tidb_json' select * from t1") + tk.MustExec("explain analyze format = tidb_json select * from t1") + tk.MustExec("explain analyze format = 'TIDB_JSON' select * from t1") + tk.MustExec("explain analyze format = TIDB_JSON select * from t1") + + // explain + for _, sql := range cases { + jsonForamt := "explain format = tidb_json " + sql + rowForamt := "explain format = row " + sql + resJSON := tk.MustQuery(jsonForamt).Rows() + resRow := tk.MustQuery(rowForamt).Rows() + + j := new([]*plannercore.ExplainInfoForEncode) + require.NoError(t, json.Unmarshal([]byte(resJSON[0][0].(string)), j)) + var flatJSONRows []*plannercore.ExplainInfoForEncode + for _, row := range *j { + flatJSONRows = append(flatJSONRows, flatJSONPlan(row)...) + } + require.Equal(t, len(flatJSONRows), len(resRow)) + + for i, row := range resRow { + require.Contains(t, row[0], flatJSONRows[i].ID) + require.Equal(t, flatJSONRows[i].EstRows, row[1]) + require.Equal(t, flatJSONRows[i].TaskType, row[2]) + require.Equal(t, flatJSONRows[i].AccessObject, row[3]) + require.Equal(t, flatJSONRows[i].OperatorInfo, row[4]) + } + } + + // explain analyze + for _, sql := range cases { + jsonForamt := "explain analyze format = tidb_json " + sql + rowForamt := "explain analyze format = row " + sql + resJSON := tk.MustQuery(jsonForamt).Rows() + resRow := tk.MustQuery(rowForamt).Rows() + + j := new([]*plannercore.ExplainInfoForEncode) + require.NoError(t, json.Unmarshal([]byte(resJSON[0][0].(string)), j)) + var flatJSONRows []*plannercore.ExplainInfoForEncode + for _, row := range *j { + flatJSONRows = append(flatJSONRows, flatJSONPlan(row)...) + } + require.Equal(t, len(flatJSONRows), len(resRow)) + + for i, row := range resRow { + require.Contains(t, row[0], flatJSONRows[i].ID) + require.Equal(t, flatJSONRows[i].EstRows, row[1]) + require.Equal(t, flatJSONRows[i].ActRows, row[2]) + require.Equal(t, flatJSONRows[i].TaskType, row[3]) + require.Equal(t, flatJSONRows[i].AccessObject, row[4]) + require.Equal(t, flatJSONRows[i].OperatorInfo, row[6]) + // executeInfo, memory, disk maybe vary in multi execution + require.NotEqual(t, flatJSONRows[i].ExecuteInfo, "") + require.NotEqual(t, flatJSONRows[i].MemoryInfo, "") + require.NotEqual(t, flatJSONRows[i].DiskInfo, "") + } + } +} diff --git a/executor/explainfor_test.go b/executor/explainfor_test.go index 85652a5f04ddb..ddb0578338c6f 100644 --- a/executor/explainfor_test.go +++ b/executor/explainfor_test.go @@ -16,6 +16,7 @@ package executor_test import ( "bytes" + "encoding/json" "fmt" "strconv" "testing" @@ -550,9 +551,9 @@ func TestIssue28259(t *testing.T) { ps = []*util.ProcessInfo{tkProcess} tk.Session().SetSessionManager(&testkit.MockSessionManager{PS: ps}) res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) - require.Len(t, res.Rows(), 4) - require.Regexp(t, ".*Selection.*", res.Rows()[0][0]) - require.Regexp(t, ".*IndexFullScan.*", res.Rows()[3][0]) + require.Len(t, res.Rows(), 3) + require.Regexp(t, ".*Selection.*", res.Rows()[1][0]) + require.Regexp(t, ".*IndexFullScan.*", res.Rows()[2][0]) res = tk.MustQuery("explain format = 'brief' select col1 from UK_GCOL_VIRTUAL_18588 use index(UK_COL1) " + "where col1 between -1696020282760139948 and -2619168038882941276 or col1 < -4004648990067362699;") @@ -588,11 +589,9 @@ func TestIssue28259(t *testing.T) { ps = []*util.ProcessInfo{tkProcess} tk.Session().SetSessionManager(&testkit.MockSessionManager{PS: ps}) res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) - require.Len(t, res.Rows(), 5) - require.Regexp(t, ".*Selection.*", res.Rows()[1][0]) - require.Equal(t, "lt(test.t.b, 1), or(and(ge(test.t.a, 2), le(test.t.a, 1)), lt(test.t.a, 1))", res.Rows()[1][4]) - require.Regexp(t, ".*IndexReader.*", res.Rows()[2][0]) - require.Regexp(t, ".*IndexRangeScan.*", res.Rows()[4][0]) + require.Len(t, res.Rows(), 4) + require.Regexp(t, ".*Selection.*", res.Rows()[2][0]) + require.Regexp(t, ".*IndexRangeScan.*", res.Rows()[3][0]) res = tk.MustQuery("explain format = 'brief' select a from t use index(idx) " + "where (a between 0 and 2 or a < 2) and b < 1;") @@ -635,12 +634,11 @@ func TestIssue28259(t *testing.T) { ps = []*util.ProcessInfo{tkProcess} tk.Session().SetSessionManager(&testkit.MockSessionManager{PS: ps}) res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) - require.Len(t, res.Rows(), 6) - require.Regexp(t, ".*Selection.*", res.Rows()[1][0]) - require.Regexp(t, ".*IndexLookUp.*", res.Rows()[2][0]) - require.Regexp(t, ".*IndexRangeScan.*", res.Rows()[3][0]) - require.Regexp(t, ".*Selection.*", res.Rows()[4][0]) - require.Regexp(t, ".*TableRowIDScan.*", res.Rows()[5][0]) + require.Len(t, res.Rows(), 5) + require.Regexp(t, ".*IndexLookUp.*", res.Rows()[1][0]) + require.Regexp(t, ".*IndexRangeScan.*", res.Rows()[2][0]) + require.Regexp(t, ".*Selection.*", res.Rows()[3][0]) + require.Regexp(t, ".*TableRowIDScan.*", res.Rows()[4][0]) res = tk.MustQuery("explain format = 'brief' select /*+ USE_INDEX(t, idx) */ a from t use index(idx) " + "where (a between 0 and 2 or a < 2) and b < 1;") @@ -859,7 +857,7 @@ func TestIndexMerge4PlanCache(t *testing.T) { tk.MustExec("prepare stmt from 'select /*+ use_index_merge(t1) */ * from t1 where c=? or (b=? and (a >= ? and a <= ?));';") tk.MustQuery("execute stmt using @a, @a, @b, @a").Check(testkit.Rows("10 10 10")) tk.MustQuery("execute stmt using @b, @b, @b, @b").Check(testkit.Rows("11 11 11")) - tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) tk.MustExec("prepare stmt from 'select /*+ use_index_merge(t1) */ * from t1 where c=10 or (a >=? and a <= ?);';") tk.MustExec("set @a=9, @b=10, @c=11;") @@ -1395,3 +1393,74 @@ func TestIssue28792(t *testing.T) { r2 := tk.MustQuery("EXPLAIN SELECT t12.a, t12.b FROM t12 LEFT JOIN t97 use index () on t12.b = t97.b;").Rows() require.Equal(t, r2, r1) } + +func TestExplainForJSON(t *testing.T) { + store := testkit.CreateMockStore(t) + tk1 := testkit.NewTestKit(t, store) + tk2 := testkit.NewTestKit(t, store) + + tk1.MustExec("use test") + tk1.MustExec("set @@tidb_enable_collect_execution_info=0;") + tk1.MustExec("drop table if exists t1") + tk1.MustExec("create table t1(id int);") + tk1.MustQuery("select * from t1;") + tk1RootProcess := tk1.Session().ShowProcess() + ps := []*util.ProcessInfo{tk1RootProcess} + tk1.Session().SetSessionManager(&testkit.MockSessionManager{PS: ps}) + tk2.Session().SetSessionManager(&testkit.MockSessionManager{PS: ps}) + resRow := tk2.MustQuery(fmt.Sprintf("explain format = 'row' for connection %d", tk1RootProcess.ID)).Rows() + resJSON := tk2.MustQuery(fmt.Sprintf("explain format = 'tidb_json' for connection %d", tk1RootProcess.ID)).Rows() + + j := new([]*core.ExplainInfoForEncode) + require.NoError(t, json.Unmarshal([]byte(resJSON[0][0].(string)), j)) + flatJSONRows := make([]*core.ExplainInfoForEncode, 0) + for _, row := range *j { + flatJSONRows = append(flatJSONRows, flatJSONPlan(row)...) + } + require.Equal(t, len(flatJSONRows), len(resRow)) + + for i, row := range resRow { + require.Contains(t, row[0], flatJSONRows[i].ID) + require.Equal(t, flatJSONRows[i].EstRows, row[1]) + require.Equal(t, flatJSONRows[i].TaskType, row[2]) + require.Equal(t, flatJSONRows[i].AccessObject, row[3]) + require.Equal(t, flatJSONRows[i].OperatorInfo, row[4]) + } + + tk1.MustExec("set @@tidb_enable_collect_execution_info=1;") + tk1.MustExec("drop table if exists t2") + tk1.MustExec("create table t2(id int);") + tk1.MustQuery("select * from t2;") + tk1RootProcess = tk1.Session().ShowProcess() + ps = []*util.ProcessInfo{tk1RootProcess} + tk1.Session().SetSessionManager(&testkit.MockSessionManager{PS: ps}) + tk2.Session().SetSessionManager(&testkit.MockSessionManager{PS: ps}) + resRow = tk2.MustQuery(fmt.Sprintf("explain format = 'row' for connection %d", tk1RootProcess.ID)).Rows() + resJSON = tk2.MustQuery(fmt.Sprintf("explain format = 'tidb_json' for connection %d", tk1RootProcess.ID)).Rows() + + j = new([]*core.ExplainInfoForEncode) + require.NoError(t, json.Unmarshal([]byte(resJSON[0][0].(string)), j)) + flatJSONRows = []*core.ExplainInfoForEncode{} + for _, row := range *j { + flatJSONRows = append(flatJSONRows, flatJSONPlan(row)...) + } + require.Equal(t, len(flatJSONRows), len(resRow)) + + for i, row := range resRow { + require.Contains(t, row[0], flatJSONRows[i].ID) + require.Equal(t, flatJSONRows[i].EstRows, row[1]) + require.Equal(t, flatJSONRows[i].ActRows, row[2]) + require.Equal(t, flatJSONRows[i].TaskType, row[3]) + require.Equal(t, flatJSONRows[i].AccessObject, row[4]) + require.Equal(t, flatJSONRows[i].OperatorInfo, row[6]) + // executeInfo, memory, disk maybe vary in multi execution + require.NotEqual(t, flatJSONRows[i].ExecuteInfo, "") + require.NotEqual(t, flatJSONRows[i].MemoryInfo, "") + require.NotEqual(t, flatJSONRows[i].DiskInfo, "") + } + // test syntax + tk2.MustExec(fmt.Sprintf("explain format = 'tidb_json' for connection %d", tk1RootProcess.ID)) + tk2.MustExec(fmt.Sprintf("explain format = tidb_json for connection %d", tk1RootProcess.ID)) + tk2.MustExec(fmt.Sprintf("explain format = 'TIDB_JSON' for connection %d", tk1RootProcess.ID)) + tk2.MustExec(fmt.Sprintf("explain format = TIDB_JSON for connection %d", tk1RootProcess.ID)) +} diff --git a/executor/fktest/BUILD.bazel b/executor/fktest/BUILD.bazel index dbdae1843edaf..2c9f00dfa0624 100644 --- a/executor/fktest/BUILD.bazel +++ b/executor/fktest/BUILD.bazel @@ -8,12 +8,16 @@ go_test( "main_test.go", ], flaky = True, + shard_count = 20, deps = [ "//config", "//executor", + "//infoschema", "//kv", "//meta/autoid", + "//parser", "//parser/ast", + "//parser/auth", "//parser/format", "//parser/model", "//parser/mysql", diff --git a/executor/fktest/foreign_key_test.go b/executor/fktest/foreign_key_test.go index 558c033b89621..6e2e1d83662f1 100644 --- a/executor/fktest/foreign_key_test.go +++ b/executor/fktest/foreign_key_test.go @@ -21,12 +21,17 @@ import ( "strconv" "strings" "sync" + "sync/atomic" "testing" "time" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/executor" + "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/format" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" @@ -545,7 +550,7 @@ func TestForeignKeyOnInsertOnDuplicateParentTableCheck(t *testing.T) { tk.MustQuery("select id, a, b, name from t2 order by id").Check(testkit.Rows("1 11 21 a")) tk.MustExec("insert into t1 (id, a, b) values (1, 11, 21) on duplicate key update id=11") - tk.MustGetDBError("insert into t1 (id, a, b) values (1, 11, 21) on duplicate key update a=a+10, b=b+20", plannercore.ErrRowIsReferenced2) + tk.MustGetDBError("insert into t1 (id, a, b) values (11, 11, 21) on duplicate key update a=a+10, b=b+20", plannercore.ErrRowIsReferenced2) tk.MustQuery("select id, a, b from t1 order by id").Check(testkit.Rows("2 1112 2222", "3 1013 2023", "4 14 24", "11 11 21")) tk.MustQuery("select id, a, b, name from t2 order by id").Check(testkit.Rows("1 11 21 a")) } @@ -567,6 +572,15 @@ func TestForeignKeyOnInsertOnDuplicateParentTableCheck(t *testing.T) { tk.MustGetDBError("insert into t1 (id, a, b) values (1, 0, 0) on duplicate key update id=100+id", plannercore.ErrRowIsReferenced2) tk.MustQuery("select id, a, b from t1 order by id").Check(testkit.Rows("1 111 21", "4 14 24", "102 12 22", "103 13 23")) tk.MustQuery("select id, a, b, name from t2 order by id").Check(testkit.Rows("11 1 21 a")) + + // Case-10: Test insert into parent table failed cause by foreign key check, see https://github.com/pingcap/tidb/issues/39200. + tk.MustExec("drop table if exists t1,t2;") + tk.MustExec("create table t1 (id int key);") + tk.MustExec("create table t2 (id int, foreign key fk(id) references t1(id));") + tk.MustExec("set @@foreign_key_checks=0") + tk.MustExec("insert into t2 values (1)") + tk.MustExec("set @@foreign_key_checks=1") + tk.MustExec("insert into t1 values (1) on duplicate key update id=2") } func TestForeignKey(t *testing.T) { @@ -1957,6 +1971,7 @@ func TestShowCreateTableWithForeignKey(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set @@global.tidb_enable_foreign_key=0") tk.MustExec("create table t1 (id int key, leader int, leader2 int, index(leader), index(leader2), constraint fk foreign key (leader) references t1(id) ON DELETE CASCADE ON UPDATE SET NULL);") tk.MustQuery("show create table t1").Check(testkit.Rows("t1 CREATE TABLE `t1` (\n" + " `id` int(11) NOT NULL,\n" + @@ -1997,18 +2012,19 @@ func TestDMLExplainAnalyzeFKInfo(t *testing.T) { tk.MustExec("insert into t1 values (1), (2)") tk.MustExec("insert into t2 values (1)") res := tk.MustQuery("explain analyze insert ignore into t3 values (1, 1, 1), (2, 1, 1), (3, 2, 1), (4, 1, 1), (5, 2, 1), (6, 2, 1)") - getExplainResultFn := func(res *testkit.Result) string { - resBuff := bytes.NewBufferString("") - for _, row := range res.Rows() { - _, _ = fmt.Fprintf(resBuff, "%s\t", row) - } - return resBuff.String() - } - explain := getExplainResultFn(res) - require.Regexpf(t, "time:.* loops:.* prepare:.* check_insert: {total_time:.* mem_insert_time:.* prefetch:.* fk_check:.* fk_num: 3.*", explain, "") + explain := getExplainResult(res) + require.Regexpf(t, "time:.* loops:.* prepare:.* check_insert: {total_time:.* mem_insert_time:.* prefetch:.* fk_check:.*", explain, "") res = tk.MustQuery("explain analyze insert ignore into t3 values (7, null, null), (8, null, null)") - explain = getExplainResultFn(res) - require.NotContains(t, explain, "fk_check", explain, "") + explain = getExplainResult(res) + require.Regexpf(t, "time:.* loops:.* prepare:.* check_insert: {total_time:.* mem_insert_time:.* prefetch:.* fk_check:.*", explain, "") +} + +func getExplainResult(res *testkit.Result) string { + resBuff := bytes.NewBufferString("") + for _, row := range res.Rows() { + _, _ = fmt.Fprintf(resBuff, "%s\t", row) + } + return resBuff.String() } func TestForeignKeyCascadeOnDiffColumnType(t *testing.T) { @@ -2072,3 +2088,770 @@ func TestForeignKeyOnInsertOnDuplicateUpdate(t *testing.T) { tk.MustQuery("select * from t2").Check(testkit.Rows("1")) tk.MustQuery("select * from t3").Check(testkit.Rows("1")) } + +func TestForeignKeyIssue39419(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("set @@foreign_key_checks=1") + tk.MustExec("use test") + tk.MustExec("create table t1 (id int key);") + tk.MustExec("create table t2 (id int key, a int, b int, " + + "foreign key fk_1 (a) references t1(id) ON DELETE SET NULL ON UPDATE SET NULL, " + + "foreign key fk_2 (b) references t1(id) ON DELETE CASCADE ON UPDATE CASCADE);") + tk.MustExec("insert into t1 values (1), (2), (3);") + tk.MustExec("insert into t2 values (1, 1, 1), (2, 2, 2), (3, 3, 3);") + tk.MustExec("update t1 set id=id+10 where id in (1, 3);") + tk.MustQuery("select * from t1 order by id").Check(testkit.Rows("2", "11", "13")) + tk.MustQuery("select * from t2 order by id").Check(testkit.Rows("1 11", "2 2 2", "3 13")) + tk.MustExec("delete from t1 where id = 2;") + tk.MustQuery("select * from t1 order by id").Check(testkit.Rows("11", "13")) + tk.MustQuery("select * from t2 order by id").Check(testkit.Rows("1 11", "3 13")) + + tk.MustExec("drop table t1,t2") + tk.MustExec("create table t1 (id int, b int, index(id), foreign key fk_2 (b) references t1(id) ON UPDATE CASCADE);") + tk.MustExec("insert into t1 values (1, 1), (2, 2), (3, 3);") + tk.MustExec("update t1 set id=id+10 where id > 1") + tk.MustQuery("select * from t1 order by id").Check(testkit.Rows("1 1", "12 12", "13 13")) +} + +func TestExplainAnalyzeDMLWithFKInfo(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("set @@foreign_key_checks=1") + tk.MustExec("use test") + tk.MustExec("create table t1 (id int key);") + tk.MustExec("create table t2 (id int key, foreign key fk(id) references t1(id) ON UPDATE CASCADE ON DELETE CASCADE);") + tk.MustExec("create table t3 (id int, unique index idx(id));") + tk.MustExec("create table t4 (id int, index idx_id(id),foreign key fk(id) references t3(id));") + tk.MustExec("create table t5 (id int key, id2 int, id3 int, unique index idx2(id2), index idx3(id3));") + tk.MustExec("create table t6 (id int, id2 int, id3 int, index idx_id(id), index idx_id2(id2), " + + "foreign key fk_1 (id) references t5(id) ON UPDATE CASCADE ON DELETE SET NULL, " + + "foreign key fk_2 (id2) references t5(id2) ON UPDATE CASCADE, " + + "foreign key fk_3 (id3) references t5(id3) ON DELETE CASCADE);") + tk.MustExec("create table t7(id int primary key, pid int, index(pid), foreign key(pid) references t7(id) on delete cascade);") + + cases := []struct { + prepare []string + sql string + plan string + }{ + // Test foreign key use primary key. + { + prepare: []string{ + "insert into t1 values (1),(2),(3),(4),(5)", + }, + sql: "explain analyze insert into t2 values (1),(2),(3);", + plan: "Insert_. N/A 0 root time:.*, loops:1, prepare:.*, insert:.*" + + "└─Foreign_Key_Check_. 0.00 0 root table:t1 total:.*, check:.*, lock:.*, foreign_keys:3 foreign_key:fk, check_exist N/A N/A", + }, + { + sql: "explain analyze insert ignore into t2 values (10),(11),(12);", + plan: "Insert_.* fk_check.*" + + "└─Foreign_Key_Check_.* 0 root table:t1 total:0s, foreign_keys:3 foreign_key:fk, check_exist N/A N/A", + }, + { + sql: "explain analyze update t2 set id=id+2 where id >1", + plan: "Update_.* 0 root time:.*, loops:1.*" + + "├─TableReader_.*" + + "│ └─TableRangeScan.*" + + "└─Foreign_Key_Check_.* 0 root table:t1 total:.*, check:.*, lock:.*, foreign_keys:2 foreign_key:fk, check_exist N/A N/A", + }, + { + sql: "explain analyze delete from t1 where id>1", + plan: "Delete_.*" + + "├─TableReader_.*" + + "│ └─TableRangeScan_.*" + + "└─Foreign_Key_Cascade_.* 0 root table:t2 total:.*, foreign_keys:4 foreign_key:fk, on_delete:CASCADE N/A N/A.*" + + " └─Delete_.*" + + " └─Batch_Point_Get_.*", + }, + { + sql: "explain analyze update t1 set id=id+1 where id = 1", + plan: "Update_.*" + + "├─Point_Get_.*" + + "└─Foreign_Key_Cascade_.* 0 root table:t2 total:.*, foreign_keys:1 foreign_key:fk, on_update:CASCADE N/A N/A.*" + + " └─Update_.*" + + " ├─Point_Get_.*" + + " └─Foreign_Key_Check_.*", + }, + { + sql: "explain analyze insert into t1 values (1) on duplicate key update id = 100", + plan: "Insert_.*" + + "└─Foreign_Key_Cascade_.* 0 root table:t2 total:0s foreign_key:fk, on_update:CASCADE N/A N/A", + }, + { + sql: "explain analyze insert into t1 values (2) on duplicate key update id = 100", + plan: "Insert_.*" + + "└─Foreign_Key_Cascade_.* 0 root table:t2 total:.*, foreign_keys:1 foreign_key:fk, on_update:CASCADE N/A N/A.*" + + " └─Update_.*" + + " ├─Point_Get_.*" + + " └─Foreign_Key_Check_.* 0 root table:t1 total:.*, check:.*, lock:.*, foreign_keys:1 foreign_key:fk, check_exist N/A N/A", + }, + // Test foreign key use index. + { + prepare: []string{ + "insert into t3 values (1),(2),(3),(4),(5)", + }, + sql: "explain analyze insert into t4 values (1),(2),(3);", + plan: "Insert_.*" + + "└─Foreign_Key_Check_.* 0 root table:t3, index:idx total:.*, check:.*, lock:.*, foreign_keys:3 foreign_key:fk, check_exist N/A N/A", + }, + { + sql: "explain analyze update t4 set id=id+2 where id >1", + plan: "Update_.*" + + "├─IndexReader_.*" + + "│ └─IndexRangeScan_.*" + + "└─Foreign_Key_Check_.* 0 root table:t3, index:idx total:.*, check:.*, lock:.*, foreign_keys:2 foreign_key:fk, check_exist N/A N/A", + }, + { + sql: "explain analyze delete from t3 where id in (2,3)", + plan: "Delete_.*" + + "├─Batch_Point_Get_.*" + + "└─Foreign_Key_Check_.* 0 root table:t4, index:idx_id total:.*, check:.*, foreign_keys:2 foreign_key:fk, check_not_exist N/A N/A", + }, + { + prepare: []string{ + "insert into t3 values (2)", + }, + sql: "explain analyze update t3 set id=id+1 where id = 2", + plan: "Update_.*" + + "├─Point_Get_.*" + + "└─Foreign_Key_Check_.* 0 root table:t4, index:idx_id total:.*, check:.*, foreign_keys:1 foreign_key:fk, check_not_exist N/A N/A", + }, + + { + sql: "explain analyze insert into t3 values (2) on duplicate key update id = 100", + plan: "Insert_.*" + + "└─Foreign_Key_Check_.* 0 root table:t4, index:idx_id total:0s foreign_key:fk, check_not_exist N/A N/A", + }, + { + sql: "explain analyze insert into t3 values (3) on duplicate key update id = 100", + plan: "Insert_.*" + + "└─Foreign_Key_Check_.* 0 root table:t4, index:idx_id total:.*, check:.*, foreign_keys:1 foreign_key:fk, check_not_exist N/A N/A", + }, + // Test multi-foreign keys in on table. + { + prepare: []string{ + "insert into t5 values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5)", + }, + sql: "explain analyze insert into t6 values (1,1,1)", + plan: "Insert_.*" + + "├─Foreign_Key_Check_.* 0 root table:t5 total:.*, check:.*, lock:.*, foreign_keys:1 foreign_key:fk_1, check_exist N/A N/A.*" + + "├─Foreign_Key_Check_.* 0 root table:t5, index:idx2 total:.*, check:.*, lock:.*, foreign_keys:1 foreign_key:fk_2, check_exist N/A N/A.*" + + "└─Foreign_Key_Check_.* 0 root table:t5, index:idx3 total:.*, check:.*, lock:.*, foreign_keys:1 foreign_key:fk_3, check_exist N/A N/A", + }, + { + sql: "explain analyze insert ignore into t6 values (1,1,10)", + plan: "Insert_.* root time:.* loops:.* prepare:.* check_insert.* fk_check:.*" + + "├─Foreign_Key_Check.* 0 root table:t5 total:0s, foreign_keys:1 foreign_key:fk_1, check_exist N/A N/A.*" + + "├─Foreign_Key_Check.* 0 root table:t5, index:idx2 total:0s, foreign_keys:1 foreign_key:fk_2, check_exist N/A N/A.*" + + "└─Foreign_Key_Check.* 0 root table:t5, index:idx3 total:0s, foreign_keys:1 foreign_key:fk_3, check_exist N/A N/A", + }, + { + sql: "explain analyze update t6 set id=id+1, id3=id2+1 where id = 1", + plan: "Update_.*" + + "├─IndexLookUp_.*" + + "│ ├─IndexRangeScan_.*" + + "│ └─TableRowIDScan_.*" + + "├─Foreign_Key_Check_.* 0 root table:t5 total:.*, check:.*, lock:.*, foreign_keys:1 foreign_key:fk_1, check_exist N/A N/A.*" + + "└─Foreign_Key_Check_.* 0 root table:t5, index:idx3 total:.*, check:.*, lock:.*, foreign_keys:1 foreign_key:fk_3, check_exist N/A N/A", + }, + { + sql: "explain analyze delete from t5 where id in (4,5)", + plan: "Delete_.*" + + "├─Batch_Point_Get_.*" + + "├─Foreign_Key_Check_.* 0 root table:t6, index:idx_id2 total:.*, check:.*, foreign_keys:2 foreign_key:fk_2, check_not_exist N/A N/A.*" + + "├─Foreign_Key_Cascade_.* 0 root table:t6, index:idx_id total:.*, foreign_keys:2 foreign_key:fk_1, on_delete:SET NULL N/A N/A.*" + + "│ └─Update_.*" + + "│ │ ├─IndexRangeScan_.*" + + "│ │ └─TableRowIDScan_.*" + + "│ └─Foreign_Key_Check_.* 0 root table:t5 total:0s foreign_key:fk_1, check_exist N/A N/A.*" + + "└─Foreign_Key_Cascade_.* 0 root table:t6, index:fk_3 total:.*, foreign_keys:2 foreign_key:fk_3, on_delete:CASCADE N/A N/A.*" + + " └─Delete_.*" + + " └─IndexLookUp_.*" + + " ├─IndexRangeScan_.*" + + " └─TableRowIDScan_.*", + }, + { + sql: "explain analyze update t5 set id=id+1, id2=id2+1 where id = 3", + plan: "Update_.*" + + "├─Point_Get_.*" + + "├─Foreign_Key_Cascade_.* 0 root table:t6, index:idx_id total:.*, foreign_keys:1 foreign_key:fk_1, on_update:CASCADE N/A N/A.*" + + "│ └─Update_.*" + + "│ ├─IndexLookUp_.*" + + "│ │ ├─IndexRangeScan_.*" + + "│ │ └─TableRowIDScan_.*" + + "│ └─Foreign_Key_Check_.* 0 root table:t5 total:0s foreign_key:fk_1, check_exist N/A N/A.*" + + "└─Foreign_Key_Cascade_.* 0 root table:t6, index:idx_id2 total:.*, foreign_keys:1 foreign_key:fk_2, on_update:CASCADE N/A N/A.*" + + " └─Update_.*" + + " ├─IndexLookUp_.*" + + " │ ├─IndexRangeScan_.*" + + " │ └─TableRowIDScan_.*" + + " └─Foreign_Key_Check_.* 0 root table:t5, index:idx2 total:0s foreign_key:fk_2, check_exist N/A N/A", + }, + { + prepare: []string{ + "insert into t5 values (10,10,10)", + }, + sql: "explain analyze update t5 set id=id+1, id2=id2+1, id3=id3+1 where id = 10", + plan: "Update_.*" + + "├─Point_Get_.*" + + "├─Foreign_Key_Check_.* 0 root table:t6, index:fk_3 total:.*, check:.*, foreign_keys:1 foreign_key:.*, check_not_exist N/A N/A.*" + + "├─Foreign_Key_Cascade_.* 0 root table:t6, index:idx_id total:.*, foreign_keys:1 foreign_key:fk_1, on_update:CASCADE N/A N/A.*" + + "│ └─Update_.*" + + "│ ├─IndexLookUp_.*" + + "│ │ ├─IndexRangeScan_.*" + + "│ │ └─TableRowIDScan_.*" + + "│ └─Foreign_Key_Check_.*" + + "└─Foreign_Key_Cascade_.* 0 root table:t6, index:idx_id2 total:.*, foreign_keys:1 foreign_key:fk_2, on_update:CASCADE N/A N/A.*" + + " └─Update_.*" + + " ├─IndexLookUp_.*" + + " │ ├─IndexRangeScan_.*" + + " │ └─TableRowIDScan_.*" + + " └─Foreign_Key_Check_.* 0 root table:t5, index:idx2 total:0s foreign_key:fk_2, check_exist N/A N/A", + }, + { + sql: "explain analyze insert into t5 values (1,1,1) on duplicate key update id = 100, id3=100", + plan: "Insert_.*" + + "├─Foreign_Key_Check_.* 0 root table:t6, index:fk_3 total:.*, check:.*, foreign_keys:1 foreign_key:fk_3, check_not_exist N/A N/A.*" + + "└─Foreign_Key_Cascade_.* 0 root table:t6, index:idx_id total:.*, foreign_keys:1 foreign_key:fk_1, on_update:CASCADE N/A N/A.*" + + " └─Update_.*" + + " ├─IndexLookUp_.*" + + " │ ├─IndexRangeScan_.*" + + " │ └─TableRowIDScan_.*" + + " └─Foreign_Key_Check_.* 0 root table:t5 total:0s foreign_key:fk_1, check_exist N/A N/A", + }, + { + prepare: []string{ + "insert into t7 values(0,0),(1,0),(2,1),(3,2),(4,3),(5,4),(6,5),(7,6),(8,7),(9,8),(10,9),(11,10),(12,11),(13,12),(14,13);", + }, + sql: "explain analyze delete from t7 where id = 0;", + plan: "Delete_.*" + + "├─Point_Get_.*" + + "└─Foreign_Key_Cascade_.* 0 root table:t7, index:pid total:.* foreign_keys:1 foreign_key:fk_1, on_delete:CASCADE.*" + + " └─Delete_.*" + + " ├─UnionScan_.*" + + " │ └─IndexReader_.*" + + " │ └─IndexRangeScan_.*" + + " └─Foreign_Key_Cascade_.* 0 root table:t7, index:pid total:.* foreign_keys:2 foreign_key:fk_1, on_delete:CASCADE.*" + + " └─Delete_.*" + + " ├─UnionScan_.*" + + " │ └─IndexReader_.*" + + " │ └─IndexRangeScan_.*" + + " └─Foreign_Key_Cascade_.* 0 root table:t7, index:pid total:.*, foreign_keys:1 foreign_key:fk_1, on_delete:CASCADE.*" + + " └─Delete_.*" + + " ├─UnionScan_.*" + + " │ └─IndexReader_.*" + + " │ └─IndexRangeScan_.*" + + " └─Foreign_Key_Cascade_.* 0 root table:t7, index:pid total:.*, foreign_keys:1 foreign_key:fk_1, on_delete:CASCADE.*" + + " └─Delete_.*" + + " ├─UnionScan_.*" + + " │ └─IndexReader_.*" + + " │ └─IndexRangeScan_.*" + + " └─Foreign_Key_Cascade_.* 0 root table:t7, index:pid total:.*, foreign_keys:1 foreign_key:fk_1, on_delete:CASCADE.*" + + " └─Delete_.*" + + " ├─UnionScan_.*" + + " │ └─IndexReader_.*" + + " │ └─IndexRangeScan_.*" + + " └─Foreign_Key_Cascade_.* 0 root table:t7, index:pid total:.*, foreign_keys:1 foreign_key:fk_1, on_delete:CASCADE.*" + + " └─Delete_.*" + + " ├─UnionScan_.*" + + " │ └─IndexReader_.*" + + " │ └─IndexRangeScan_.*" + + " └─Foreign_Key_Cascade_.* 0 root table:t7, index:pid total:.*, foreign_keys:1 foreign_key:fk_1, on_delete:CASCADE.*" + + " └─Delete_.*" + + " ├─UnionScan_.*" + + " │ └─IndexReader_.*" + + " │ └─IndexRangeScan_.*" + + " └─Foreign_Key_Cascade_.* 0 root table:t7, index:pid total:.*, foreign_keys:1 foreign_key:fk_1, on_delete:CASCADE.*" + + " └─Delete_.*" + + " ├─UnionScan_.*" + + " │ └─IndexReader_.*" + + " │ └─IndexRangeScan_.*" + + " └─Foreign_Key_Cascade_.* 0 root table:t7, index:pid total:.*, foreign_keys:1 foreign_key:fk_1, on_delete:CASCADE.*" + + " └─Delete_.*" + + " ├─UnionScan_.*" + + " │ └─IndexReader_.*" + + " │ └─IndexRangeScan_.*" + + " └─Foreign_Key_Cascade_.* 0 root table:t7, index:pid total:.*, foreign_keys:1 foreign_key:fk_1, on_delete:CASCADE.*" + + " └─Delete_.*" + + " ├─UnionScan_.*" + + " │ └─IndexReader_.*" + + " │ └─IndexRangeScan_.*" + + " └─Foreign_Key_Cascade_.* 0 root table:t7, index:pid total:.*, foreign_keys:1 foreign_key:fk_1, on_delete:CASCADE.*" + + " └─Delete_.*" + + " ├─UnionScan_.*" + + " │ └─IndexReader_.*" + + " │ └─IndexRangeScan_.*" + + " └─Foreign_Key_Cascade_.* 0 root table:t7, index:pid total:.*, foreign_keys:1 foreign_key:fk_1, on_delete:CASCADE.*" + + " └─Delete_.*" + + " ├─UnionScan_.*" + + " │ └─IndexReader_.*" + + " │ └─IndexRangeScan_.*" + + " └─Foreign_Key_Cascade_.* 0 root table:t7, index:pid total:.*, foreign_keys:1 foreign_key:fk_1, on_delete:CASCADE.*" + + " └─Delete_.*" + + " ├─UnionScan_.*" + + " │ └─IndexReader_.*" + + " │ └─IndexRangeScan_.*" + + " └─Foreign_Key_Cascade_.* 0 root table:t7, index:pid total:.*, foreign_keys:1 foreign_key:fk_1, on_delete:CASCADE.*" + + " └─Delete_.*" + + " ├─UnionScan_.*" + + " │ └─IndexReader_.*" + + " │ └─IndexRangeScan_.*" + + " └─Foreign_Key_Cascade_.* 0 root table:t7, index:pid total:.*, foreign_keys:1 foreign_key:fk_1, on_delete:CASCADE.*" + + " └─Delete_.*" + + " ├─UnionScan_.*" + + " │ └─IndexReader_.*" + + " │ └─IndexRangeScan_.*" + + " └─Foreign_Key_Cascade_.* 0 root table:t7, index:pid total:0s foreign_key:fk_1, on_delete:CASCADE.*", + }, + } + for _, ca := range cases { + for _, sql := range ca.prepare { + tk.MustExec(sql) + } + res := tk.MustQuery(ca.sql) + explain := getExplainResult(res) + require.Regexp(t, ca.plan, explain) + } +} + +func TestForeignKeyRuntimeStats(t *testing.T) { + checkStats := executor.FKCheckRuntimeStats{ + Total: time.Second * 3, + Check: time.Second * 2, + Lock: time.Second, + Keys: 10, + } + require.Equal(t, "total:3s, check:2s, lock:1s, foreign_keys:10", checkStats.String()) + checkStats.Merge(checkStats.Clone()) + require.Equal(t, "total:6s, check:4s, lock:2s, foreign_keys:20", checkStats.String()) + cascadeStats := executor.FKCascadeRuntimeStats{ + Total: time.Second, + Keys: 10, + } + require.Equal(t, "total:1s, foreign_keys:10", cascadeStats.String()) + cascadeStats.Merge(cascadeStats.Clone()) + require.Equal(t, "total:2s, foreign_keys:20", cascadeStats.String()) +} + +func TestPrivilegeCheckInForeignKeyCascade(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("set @@foreign_key_checks=1") + tk.MustExec("use test") + tk.MustExec("create table t1 (id int key);") + tk.MustExec("create table t2 (id int key, foreign key fk (id) references t1(id) ON DELETE CASCADE ON UPDATE CASCADE);") + tk.MustExec("insert into t1 values (1), (2), (3);") + cases := []struct { + prepares []string + sql string + err error + t1Rows []string + t2Rows []string + }{ + { + prepares: []string{"grant insert on test.t2 to 'u1'@'%';"}, + sql: "insert into t2 values (1), (2), (3);", + t1Rows: []string{"1", "2", "3"}, + t2Rows: []string{"1", "2", "3"}, + }, + { + prepares: []string{"grant select, delete on test.t1 to 'u1'@'%';"}, + sql: "delete from t1 where id=1;", + t1Rows: []string{"2", "3"}, + t2Rows: []string{"2", "3"}, + }, + { + prepares: []string{"grant select, update on test.t1 to 'u1'@'%';"}, + sql: "update t1 set id=id+10 where id=2;", + t1Rows: []string{"3", "12"}, + t2Rows: []string{"3", "12"}, + }, + } + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + tk2.MustExec("set @@foreign_key_checks=1") + for _, ca := range cases { + tk.MustExec("drop user if exists 'u1'@'%'") + tk.MustExec("create user 'u1'@'%' identified by '';") + for _, sql := range ca.prepares { + tk.MustExec(sql) + } + err := tk2.Session().Auth(&auth.UserIdentity{Username: "u1", Hostname: "localhost", CurrentUser: true, AuthUsername: "u1", AuthHostname: "%"}, nil, []byte("012345678901234567890")) + require.NoError(t, err) + if ca.err == nil { + tk2.MustExec(ca.sql) + } else { + err = tk2.ExecToErr(ca.sql) + require.Error(t, err) + } + tk.MustQuery("select * from t1 order by id").Check(testkit.Rows(ca.t1Rows...)) + tk.MustQuery("select * from t2 order by id").Check(testkit.Rows(ca.t2Rows...)) + } +} + +func TestTableLockInForeignKeyCascade(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("set @@foreign_key_checks=1") + tk.MustExec("use test") + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + tk2.MustExec("set @@foreign_key_checks=1") + // enable table lock + config.UpdateGlobal(func(conf *config.Config) { + conf.EnableTableLock = true + }) + defer func() { + config.UpdateGlobal(func(conf *config.Config) { + conf.EnableTableLock = false + }) + }() + tk.MustExec("create table t1 (id int key);") + tk.MustExec("create table t2 (id int key, foreign key fk (id) references t1(id) ON DELETE CASCADE ON UPDATE CASCADE);") + tk.MustExec("insert into t1 values (1), (2), (3);") + tk.MustExec("insert into t2 values (1), (2), (3);") + tk.MustExec("lock table t2 read;") + tk2.MustGetDBError("delete from t1 where id = 1", infoschema.ErrTableLocked) + tk.MustExec("unlock tables;") + tk2.MustExec("delete from t1 where id = 1") + tk.MustQuery("select * from t1 order by id").Check(testkit.Rows("2", "3")) + tk.MustQuery("select * from t2 order by id").Check(testkit.Rows("2", "3")) +} + +func TestForeignKeyIssue39732(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_stmt_summary=1") + tk.MustExec("set @@foreign_key_checks=1") + tk.MustExec("use test") + tk.MustExec("create user 'u1'@'%' identified by '';") + tk.MustExec("GRANT ALL PRIVILEGES ON *.* TO 'u1'@'%'") + err := tk.Session().Auth(&auth.UserIdentity{Username: "u1", Hostname: "localhost", CurrentUser: true, AuthUsername: "u1", AuthHostname: "%"}, nil, []byte("012345678901234567890")) + require.NoError(t, err) + tk.MustExec("create table t1 (id int key, leader int, index(leader), foreign key (leader) references t1(id) ON DELETE CASCADE);") + tk.MustExec("insert into t1 values (1, null), (10, 1), (11, 1), (20, 10)") + tk.MustExec(`prepare stmt1 from 'delete from t1 where id = ?';`) + tk.MustExec(`set @a = 1;`) + tk.MustExec("execute stmt1 using @a;") + tk.MustQuery("select * from t1 order by id").Check(testkit.Rows()) +} + +func TestForeignKeyOnReplaceIntoChildTable(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("set @@foreign_key_checks=1") + tk.MustExec("use test") + tk.MustExec("create table t_data (id int, a int, b int)") + tk.MustExec("insert into t_data (id, a, b) values (1, 1, 1), (2, 2, 2);") + for _, ca := range foreignKeyTestCase1 { + tk.MustExec("drop table if exists t2;") + tk.MustExec("drop table if exists t1;") + for _, sql := range ca.prepareSQLs { + tk.MustExec(sql) + } + tk.MustExec("replace into t1 (id, a, b) values (1, 1, 1);") + tk.MustExec("replace into t2 (id, a, b) values (1, 1, 1)") + tk.MustGetDBError("replace into t1 (id, a, b) values (1, 2, 3);", plannercore.ErrRowIsReferenced2) + if !ca.notNull { + tk.MustExec("replace into t2 (id, a, b) values (2, null, 1)") + tk.MustExec("replace into t2 (id, a, b) values (3, 1, null)") + tk.MustExec("replace into t2 (id, a, b) values (4, null, null)") + } + tk.MustGetDBError("replace into t2 (id, a, b) values (5, 1, 0);", plannercore.ErrNoReferencedRow2) + tk.MustGetDBError("replace into t2 (id, a, b) values (6, 0, 1);", plannercore.ErrNoReferencedRow2) + tk.MustGetDBError("replace into t2 (id, a, b) values (7, 2, 2);", plannercore.ErrNoReferencedRow2) + // Test replace into from select. + tk.MustExec("delete from t2") + tk.MustExec("replace into t2 (id, a, b) select id, a, b from t_data where t_data.id=1") + tk.MustGetDBError("replace into t2 (id, a, b) select id, a, b from t_data where t_data.id=2", plannercore.ErrNoReferencedRow2) + + // Test in txn + tk.MustExec("delete from t2") + tk.MustExec("begin") + tk.MustExec("delete from t1 where a=1") + tk.MustGetDBError("replace into t2 (id, a, b) values (1, 1, 1)", plannercore.ErrNoReferencedRow2) + tk.MustExec("replace into t1 (id, a, b) values (2, 2, 2)") + tk.MustExec("replace into t2 (id, a, b) values (2, 2, 2)") + tk.MustGetDBError("replace into t1 (id, a, b) values (2, 2, 3);", plannercore.ErrRowIsReferenced2) + tk.MustExec("rollback") + tk.MustQuery("select id, a, b from t1 order by id").Check(testkit.Rows("1 1 1")) + tk.MustQuery("select id, a, b from t2 order by id").Check(testkit.Rows()) + } + + // Case-10: test primary key is handle and contain foreign key column, and foreign key column has default value. + tk.MustExec("drop table if exists t2;") + tk.MustExec("drop table if exists t1;") + tk.MustExec("set @@tidb_enable_clustered_index=0;") + tk.MustExec("create table t1 (id int,a int, primary key(id));") + tk.MustExec("create table t2 (id int key,a int not null default 0, index (a), foreign key fk(a) references t1(id));") + tk.MustExec("replace into t1 values (1, 1);") + tk.MustExec("replace into t2 values (1, 1);") + tk.MustGetDBError("replace into t2 (id) values (10);", plannercore.ErrNoReferencedRow2) + tk.MustGetDBError("replace into t2 values (3, 2);", plannercore.ErrNoReferencedRow2) + + // Case-11: test primary key is handle and contain foreign key column, and foreign key column doesn't have default value. + tk.MustExec("drop table if exists t2;") + tk.MustExec("create table t2 (id int key,a int, index (a), foreign key fk(a) references t1(id));") + tk.MustExec("replace into t2 values (1, 1);") + tk.MustExec("replace into t2 (id) values (10);") + tk.MustGetDBError("replace into t2 values (3, 2);", plannercore.ErrNoReferencedRow2) +} + +func TestForeignKeyOnReplaceInto(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@foreign_key_checks=1") + tk.MustExec("use test") + tk.MustExec("create table t1 (id int key, a int, index (a));") + tk.MustExec("create table t2 (id int key, a int, index (a), constraint fk_1 foreign key (a) references t1(a));") + tk.MustExec("replace into t1 values (1, 1);") + tk.MustExec("replace into t2 values (1, 1);") + tk.MustExec("replace into t2 (id) values (2);") + tk.MustGetDBError("replace into t2 values (1, 2);", plannercore.ErrNoReferencedRow2) + // Test fk check on replace into parent table. + tk.MustGetDBError("replace into t1 values (1, 2);", plannercore.ErrRowIsReferenced2) + // Test fk cascade delete on replace into parent table. + tk.MustExec("alter table t2 drop foreign key fk_1") + tk.MustExec("alter table t2 add constraint fk_1 foreign key (a) references t1(a) on delete cascade") + tk.MustExec("replace into t1 values (1, 2);") + tk.MustQuery("select id, a from t1").Check(testkit.Rows("1 2")) + tk.MustQuery("select * from t2").Check(testkit.Rows("2 ")) + // Test fk cascade delete on replace into parent table. + tk.MustExec("alter table t2 drop foreign key fk_1") + tk.MustExec("alter table t2 add constraint fk_1 foreign key (a) references t1(a) on delete set null") + tk.MustExec("delete from t2") + tk.MustExec("delete from t1") + tk.MustExec("replace into t1 values (1, 1);") + tk.MustExec("replace into t2 values (1, 1);") + tk.MustExec("replace into t1 values (1, 2);") + tk.MustQuery("select id, a from t1").Check(testkit.Rows("1 2")) + tk.MustQuery("select id, a from t2").Check(testkit.Rows("1 ")) + + // Test cascade delete in self table by replace into statement. + tk.MustExec("drop table t1,t2") + tk.MustExec("create table t1 (id int key, name varchar(10), leader int, index(leader), foreign key (leader) references t1(id) ON DELETE CASCADE);") + tk.MustExec("replace into t1 values (1, 'boss', null), (10, 'l1_a', 1), (11, 'l1_b', 1), (12, 'l1_c', 1)") + tk.MustExec("replace into t1 values (100, 'l2_a1', 10), (101, 'l2_a2', 10), (102, 'l2_a3', 10)") + tk.MustExec("replace into t1 values (110, 'l2_b1', 11), (111, 'l2_b2', 11), (112, 'l2_b3', 11)") + tk.MustExec("replace into t1 values (120, 'l2_c1', 12), (121, 'l2_c2', 12), (122, 'l2_c3', 12)") + tk.MustExec("replace into t1 values (1000,'l3_a1', 100)") + tk.MustExec("replace into t1 values (1, 'new-boss', null)") + tk.MustQuery("select id from t1 order by id").Check(testkit.Rows("1")) +} + +func TestForeignKeyLargeTxnErr(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@foreign_key_checks=1") + tk.MustExec("use test") + tk.MustExec("create table t1 (id int auto_increment key, pid int, name varchar(200), index(pid));") + tk.MustExec("insert into t1 (name) values ('abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890');") + for i := 0; i < 8; i++ { + tk.MustExec("insert into t1 (name) select name from t1;") + } + tk.MustQuery("select count(*) from t1").Check(testkit.Rows("256")) + tk.MustExec("update t1 set pid=1 where id>1") + tk.MustExec("alter table t1 add foreign key (pid) references t1 (id) on update cascade") + originLimit := atomic.LoadUint64(&kv.TxnTotalSizeLimit) + defer func() { + atomic.StoreUint64(&kv.TxnTotalSizeLimit, originLimit) + }() + // Set the limitation to a small value, make it easier to reach the limitation. + atomic.StoreUint64(&kv.TxnTotalSizeLimit, 10240) + tk.MustQuery("select sum(id) from t1").Check(testkit.Rows("32896")) + // foreign key cascade behaviour will cause ErrTxnTooLarge. + tk.MustGetDBError("update t1 set id=id+100000 where id=1", kv.ErrTxnTooLarge) + tk.MustQuery("select sum(id) from t1").Check(testkit.Rows("32896")) + tk.MustGetDBError("update t1 set id=id+100000 where id=1", kv.ErrTxnTooLarge) + tk.MustQuery("select id,pid from t1 where id<3 order by id").Check(testkit.Rows("1 ", "2 1")) + tk.MustExec("set @@foreign_key_checks=0") + tk.MustExec("update t1 set id=id+100000 where id=1") + tk.MustQuery("select id,pid from t1 where id<3 or pid is null order by id").Check(testkit.Rows("2 1", "100001 ")) +} + +func TestForeignKeyAndLockView(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t1 (id int key)") + tk.MustExec("create table t2 (id int key, foreign key (id) references t1(id) ON DELETE CASCADE ON UPDATE CASCADE)") + tk.MustExec("insert into t1 values (1)") + tk.MustExec("insert into t2 values (1)") + tk.MustExec("begin pessimistic") + tk.MustExec("set @@foreign_key_checks=0") + tk.MustExec("update t2 set id=2") + + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("set @@foreign_key_checks=1") + tk2.MustExec("use test") + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + tk2.MustExec("begin pessimistic") + tk2.MustExec("update t1 set id=2 where id=1") + tk2.MustExec("commit") + }() + time.Sleep(time.Millisecond * 200) + _, digest := parser.NormalizeDigest("update t1 set id=2 where id=1") + tk.MustQuery("select CURRENT_SQL_DIGEST from information_schema.tidb_trx where state='LockWaiting' and db='test'").Check(testkit.Rows(digest.String())) + tk.MustGetErrMsg("update t1 set id=2", "[executor:1213]Deadlock found when trying to get lock; try restarting transaction") + wg.Wait() +} + +func TestForeignKeyAndMemoryTracker(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@foreign_key_checks=1") + tk.MustExec("use test") + tk.MustExec("create table t1 (id int auto_increment key, pid int, name varchar(200), index(pid));") + tk.MustExec("insert into t1 (name) values ('abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz');") + for i := 0; i < 8; i++ { + tk.MustExec("insert into t1 (name) select name from t1;") + } + tk.MustQuery("select count(*) from t1").Check(testkit.Rows("256")) + tk.MustExec("update t1 set pid=1 where id>1") + tk.MustExec("alter table t1 add foreign key (pid) references t1 (id) on update cascade") + tk.MustQuery("select sum(id) from t1").Check(testkit.Rows("32896")) + defer tk.MustExec("SET GLOBAL tidb_mem_oom_action = DEFAULT") + tk.MustExec("SET GLOBAL tidb_mem_oom_action='CANCEL'") + tk.MustExec("set @@tidb_mem_quota_query=40960;") + // foreign key cascade behaviour will exceed memory quota. + err := tk.ExecToErr("update t1 set id=id+100000 where id=1") + require.Error(t, err) + require.Contains(t, err.Error(), "Out Of Memory Quota!") + tk.MustQuery("select id,pid from t1 where id = 1").Check(testkit.Rows("1 ")) + tk.MustExec("set @@foreign_key_checks=0") + // After disable foreign_key_checks, following DML will execute successful. + tk.MustExec("update t1 set id=id+100000 where id=1") + tk.MustQuery("select id,pid from t1 where id<3 or pid is null order by id").Check(testkit.Rows("2 1", "100001 ")) +} + +func TestForeignKeyMetaInKeyColumnUsage(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@foreign_key_checks=1") + tk.MustExec("use test") + tk.MustExec("create table t1 (a int, b int, index(a, b));") + tk.MustExec("create table t2 (a int, b int, index(a, b), constraint fk foreign key(a, b) references t1(a, b));") + tk.MustQuery("select CONSTRAINT_NAME, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_SCHEMA, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME from " + + "INFORMATION_SCHEMA.KEY_COLUMN_USAGE where CONSTRAINT_SCHEMA='test' and TABLE_NAME='t2' and REFERENCED_TABLE_SCHEMA is not null and REFERENCED_COLUMN_NAME is not null;"). + Check(testkit.Rows("fk test t2 a test t1 a", "fk test t2 b test t1 b")) +} + +func TestForeignKeyAndGeneratedColumn(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@foreign_key_checks=1") + tk.MustExec("use test") + // Test foreign key with parent column is virtual generated column. + tk.MustExec("create table t1 (a int, b int as (a+1) virtual, index(b));") + tk.MustGetErrMsg("create table t2 (a int, b int, constraint fk foreign key(b) references t1(b));", "[schema:3733]Foreign key 'fk' uses virtual column 'b' which is not supported.") + // Test foreign key with child column is virtual generated column. + tk.MustExec("drop table t1") + tk.MustExec("create table t1 (a int key);") + tk.MustGetErrMsg("create table t2 (a int, c int as (a+1) virtual, constraint fk foreign key(c) references t1(a));", "[schema:3733]Foreign key 'fk' uses virtual column 'c' which is not supported.") + // Test foreign key with parent column is stored generated column. + tk.MustExec("drop table if exists t1,t2") + tk.MustExec("create table t1 (a int, b int as (a) stored, index(b));") + tk.MustExec("create table t2 (a int, b int, constraint fk foreign key(b) references t1(b) on delete cascade on update cascade);") + tk.MustExec("insert into t1 (a) values (1),(2)") + tk.MustExec("insert into t2 (a) values (1),(2)") + tk.MustExec("update t2 set b=a") + tk.MustExec("insert into t2 values (1,1),(2,2)") + tk.MustGetDBError("insert into t2 values (3,3)", plannercore.ErrNoReferencedRow2) + tk.MustQuery("select * from t2 order by a").Check(testkit.Rows("1 1", "1 1", "2 2", "2 2")) + tk.MustExec("update t1 set a=a+10 where a=1") + tk.MustQuery("select * from t1 order by a").Check(testkit.Rows("2 2", "11 11")) + tk.MustQuery("select * from t2 order by a").Check(testkit.Rows("1 11", "1 11", "2 2", "2 2")) + tk.MustExec("delete from t1 where a=2") + tk.MustQuery("select * from t1 order by a").Check(testkit.Rows("11 11")) + tk.MustQuery("select * from t2 order by a").Check(testkit.Rows("1 11", "1 11")) + // Test foreign key with parent and child column is stored generated column. + tk.MustExec("drop table if exists t1,t2") + tk.MustExec("create table t1 (a int, b int as (a) stored, index(b));") + tk.MustGetErrMsg("create table t2 (a int, b int as (a) stored, constraint fk foreign key(b) references t1(b) on update cascade);", "[ddl:3104]Cannot define foreign key with ON UPDATE CASCADE clause on a generated column.") + tk.MustGetErrMsg("create table t2 (a int, b int as (a) stored, constraint fk foreign key(b) references t1(b) on delete set null);", "[ddl:3104]Cannot define foreign key with ON DELETE SET NULL clause on a generated column.") + tk.MustExec("create table t2 (a int, b int as (a) stored, constraint fk foreign key(b) references t1(b));") + tk.MustExec("insert into t1 (a) values (1),(2)") + tk.MustExec("insert into t2 (a) values (1),(2)") + tk.MustGetDBError("insert into t2 (a) values (3)", plannercore.ErrNoReferencedRow2) + tk.MustQuery("select * from t2 order by a").Check(testkit.Rows("1 1", "2 2")) + tk.MustGetDBError("delete from t1 where b=1", plannercore.ErrRowIsReferenced2) + tk.MustGetDBError("update t1 set a=a+10 where a=1", plannercore.ErrRowIsReferenced2) + tk.MustExec("alter table t2 drop foreign key fk") + tk.MustExec("alter table t2 add foreign key fk (b) references t1(b) on delete cascade") + tk.MustExec("delete from t1 where a=1") + tk.MustQuery("select * from t1 order by a").Check(testkit.Rows("2 2")) + tk.MustQuery("select * from t2 order by a").Check(testkit.Rows("2 2")) +} + +func TestForeignKeyAndExpressionIndex(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@foreign_key_checks=1") + tk.MustExec("use test") + tk.MustExec("create table t1 (a int, b int, index idx1 (b), index idx2 ((b*2)));") + tk.MustExec("create table t2 (a int, b int, index((b*2)), constraint fk foreign key(b) references t1(b));") + tk.MustExec("insert into t1 values (1,1),(2,2)") + tk.MustExec("insert into t2 values (1,1),(2,2)") + tk.MustGetDBError("insert into t2 values (3,3)", plannercore.ErrNoReferencedRow2) + tk.MustGetDBError("update t1 set b=b+10 where b=1", plannercore.ErrRowIsReferenced2) + tk.MustGetDBError("delete from t1 where b=1", plannercore.ErrRowIsReferenced2) + tk.MustGetErrMsg("alter table t1 drop index idx1", "[ddl:1553]Cannot drop index 'idx1': needed in a foreign key constraint") + tk.MustGetErrMsg("alter table t2 drop index fk", "[ddl:1553]Cannot drop index 'fk': needed in a foreign key constraint") + tk.MustExec("alter table t2 drop foreign key fk") + tk.MustExec("alter table t2 add foreign key fk (b) references t1(b) on delete set null on update cascade") + tk.MustExec("update t1 set b=b+10 where b=1") + tk.MustExec("delete from t1 where b=2") + tk.MustQuery("select * from t1 order by a").Check(testkit.Rows("1 11")) + tk.MustQuery("select * from t2 order by a").Check(testkit.Rows("1 11", "2 ")) + tk.MustExec("admin check table t1") + tk.MustExec("admin check table t2") +} + +func TestForeignKeyAndMultiValuedIndex(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@foreign_key_checks=1") + tk.MustExec("use test") + tk.MustExec("create table t1 (id int primary key, a json, b int generated always as (a->'$.id') stored, index idx1(b), index idx2((cast(a ->'$.data' as signed array))))") + tk.MustExec("create table t2 (id int, b int, constraint fk foreign key(b) references t1(b));") + tk.MustExec(`insert into t1 (id, a) values (1, '{"id": "1", "data": [1,11,111]}')`) + tk.MustExec(`insert into t1 (id, a) values (2, '{"id": "2", "data": [2,22,222]}')`) + tk.MustExec("insert into t2 values (1,1),(2,2)") + tk.MustGetDBError("insert into t2 values (3,3)", plannercore.ErrNoReferencedRow2) + tk.MustGetDBError(`update t1 set a='{"id": "10", "data": [1,11,111]}' where id=1`, plannercore.ErrRowIsReferenced2) + tk.MustGetDBError(`delete from t1 where id=1`, plannercore.ErrRowIsReferenced2) + tk.MustExec("alter table t2 drop foreign key fk") + tk.MustExec("alter table t2 add foreign key fk (b) references t1(b) on delete set null on update cascade") + tk.MustExec(`update t1 set a='{"id": "10", "data": [1,11,111]}' where id=1`) + tk.MustExec(`delete from t1 where id=2`) + tk.MustQuery("select id,b from t1 order by id").Check(testkit.Rows("1 10")) + tk.MustQuery("select id,b from t2 order by id").Check(testkit.Rows("1 10", "2 ")) + tk.MustExec("admin check table t1") + tk.MustExec("admin check table t2") +} + +func TestForeignKeyAndSessionVariable(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@foreign_key_checks=1") + tk.MustExec("use test") + tk.MustExec("create table t1 (t timestamp, index(t));") + tk.MustExec("create table t2 (t timestamp, foreign key (t) references t1(t) on delete cascade);") + tk.MustExec("set @@time_zone='+8:00';") + tk.MustExec("insert into t1 values ('2023-01-28 10:29:16');") + tk.MustExec("insert into t2 values ('2023-01-28 10:29:16');") + tk.MustExec("set @@time_zone='+6:00';") + tk.MustExec("delete from t1;") + tk.MustQuery("select * from t1").Check(testkit.Rows()) + tk.MustQuery("select * from t2").Check(testkit.Rows()) +} diff --git a/executor/foreign_key.go b/executor/foreign_key.go index 62dbb400537e2..9908a72fd4b04 100644 --- a/executor/foreign_key.go +++ b/executor/foreign_key.go @@ -15,8 +15,11 @@ package executor import ( + "bytes" "context" + "strconv" "sync/atomic" + "time" "github.com/pingcap/errors" "github.com/pingcap/tidb/kv" @@ -31,6 +34,7 @@ import ( "github.com/pingcap/tidb/types" driver "github.com/pingcap/tidb/types/parser_driver" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/set" "github.com/tikv/client-go/v2/txnkv/txnsnapshot" ) @@ -60,12 +64,16 @@ type FKCheckExec struct { // FKCheckRuntimeStats contains the FKCheckExec runtime stats. type FKCheckRuntimeStats struct { - Keys int + Total time.Duration + Check time.Duration + Lock time.Duration + Keys int } // FKCascadeExec uses to execute foreign key cascade behaviour. type FKCascadeExec struct { *fkValueHelper + plan *plannercore.FKCascade b *executorBuilder tp plannercore.FKCascadeType referredFK *model.ReferredFKInfo @@ -78,6 +86,8 @@ type FKCascadeExec struct { fkValues [][]types.Datum // new-value-key => UpdatedValuesCouple fkUpdatedValuesMap map[string]*UpdatedValuesCouple + + stats *FKCascadeRuntimeStats } // UpdatedValuesCouple contains the updated new row the old rows, exporting for test. @@ -86,6 +96,12 @@ type UpdatedValuesCouple struct { OldValuesList [][]types.Datum } +// FKCascadeRuntimeStats contains the FKCascadeExec runtime stats. +type FKCascadeRuntimeStats struct { + Total time.Duration + Keys int +} + func buildTblID2FKCheckExecs(sctx sessionctx.Context, tblID2Table map[int64]table.Table, tblID2FKChecks map[int64][]*plannercore.FKCheck) (map[int64][]*FKCheckExec, error) { fkChecksMap := make(map[int64][]*FKCheckExec) for tid, tbl := range tblID2Table { @@ -137,6 +153,10 @@ func buildFKCheckExec(sctx sessionctx.Context, tbl table.Table, fkCheck *planner } func (fkc *FKCheckExec) insertRowNeedToCheck(sc *stmtctx.StatementContext, row []types.Datum) error { + if fkc.ReferredFK != nil { + // Insert into parent table doesn't need to do foreign key check. + return nil + } return fkc.addRowNeedToCheck(sc, row) } @@ -171,6 +191,20 @@ func (fkc *FKCheckExec) addRowNeedToCheck(sc *stmtctx.StatementContext, row []ty } func (fkc *FKCheckExec) doCheck(ctx context.Context) error { + if fkc.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl != nil { + fkc.stats = &FKCheckRuntimeStats{} + defer fkc.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(fkc.ID(), fkc.stats) + } + if len(fkc.toBeCheckedKeys) == 0 && len(fkc.toBeCheckedPrefixKeys) == 0 { + return nil + } + start := time.Now() + if fkc.stats != nil { + defer func() { + fkc.stats.Keys = len(fkc.toBeCheckedKeys) + len(fkc.toBeCheckedPrefixKeys) + fkc.stats.Total = time.Since(start) + }() + } txn, err := fkc.ctx.Txn(false) if err != nil { return err @@ -183,6 +217,9 @@ func (fkc *FKCheckExec) doCheck(ctx context.Context) error { if err != nil { return err } + if fkc.stats != nil { + fkc.stats.Check = time.Since(start) + } if len(fkc.toBeLockedKeys) == 0 { return nil } @@ -198,6 +235,9 @@ func (fkc *FKCheckExec) doCheck(ctx context.Context) error { // doLockKeys may set TxnCtx.ForUpdate to 1, then if the lock meet write conflict, TiDB can't retry for update. // So reset TxnCtx.ForUpdate to 0 then can be retry if meet write conflict. atomic.StoreUint32(&sessVars.TxnCtx.ForUpdate, forUpdate) + if fkc.stats != nil { + fkc.stats.Lock = time.Since(start) - fkc.stats.Check + } return err } @@ -473,6 +513,10 @@ type fkCheckKey struct { } func (fkc FKCheckExec) checkRows(ctx context.Context, sc *stmtctx.StatementContext, txn kv.Transaction, rows []toBeCheckedRow) error { + if fkc.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl != nil { + fkc.stats = &FKCheckRuntimeStats{} + defer fkc.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(fkc.ID(), fkc.stats) + } if len(rows) == 0 { return nil } @@ -585,6 +629,7 @@ func (b *executorBuilder) buildFKCascadeExec(tbl table.Table, fkCascade *planner return &FKCascadeExec{ b: b, fkValueHelper: helper, + plan: fkCascade, tp: fkCascade.Tp, referredFK: fkCascade.ReferredFK, childTable: fkCascade.ChildTable.Meta(), @@ -637,6 +682,7 @@ func (fkc *FKCascadeExec) buildExecutor(ctx context.Context) (Executor, error) { if err != nil || p == nil { return nil, err } + fkc.plan.CascadePlans = append(fkc.plan.CascadePlans, p) e := fkc.b.build(p) return e, fkc.b.err } @@ -668,6 +714,9 @@ func (fkc *FKCascadeExec) buildFKCascadePlan(ctx context.Context) (plannercore.P case model.ReferOptionCascade: couple := fkc.fetchUpdatedValuesCouple() if couple != nil && len(couple.NewValues) != 0 { + if fkc.stats != nil { + fkc.stats.Keys += len(couple.OldValuesList) + } stmtNode = GenCascadeUpdateAST(fkc.referredFK.ChildSchema, fkc.childTable.Name, indexName, fkc.fkCols, couple) } case model.ReferOptionSetNull: @@ -683,7 +732,7 @@ func (fkc *FKCascadeExec) buildFKCascadePlan(ctx context.Context) (plannercore.P if err != nil { return nil, err } - finalPlan, _, err := planner.Optimize(ctx, sctx, stmtNode, fkc.b.is) + finalPlan, err := planner.OptimizeForForeignKeyCascade(ctx, sctx, stmtNode, fkc.b.is) if err != nil { return nil, err } @@ -699,6 +748,9 @@ func (fkc *FKCascadeExec) fetchOnDeleteOrUpdateFKValues() [][]types.Datum { fkValues = fkc.fkValues[:maxHandleFKValueInOneCascade] fkc.fkValues = fkc.fkValues[maxHandleFKValueInOneCascade:] } + if fkc.stats != nil { + fkc.stats.Keys += len(fkValues) + } return fkValues } @@ -811,3 +863,87 @@ func genWhereConditionAstForMultiColumn(cols []*model.ColumnInfo, fkValues [][]t List: valueList, } } + +// String implements the RuntimeStats interface. +func (s *FKCheckRuntimeStats) String() string { + buf := bytes.NewBuffer(make([]byte, 0, 32)) + buf.WriteString("total:") + buf.WriteString(execdetails.FormatDuration(s.Total)) + if s.Check > 0 { + buf.WriteString(", check:") + buf.WriteString(execdetails.FormatDuration(s.Check)) + } + if s.Lock > 0 { + buf.WriteString(", lock:") + buf.WriteString(execdetails.FormatDuration(s.Lock)) + } + if s.Keys > 0 { + buf.WriteString(", foreign_keys:") + buf.WriteString(strconv.Itoa(s.Keys)) + } + return buf.String() +} + +// Clone implements the RuntimeStats interface. +func (s *FKCheckRuntimeStats) Clone() execdetails.RuntimeStats { + newRs := &FKCheckRuntimeStats{ + Total: s.Total, + Check: s.Check, + Lock: s.Lock, + Keys: s.Keys, + } + return newRs +} + +// Merge implements the RuntimeStats interface. +func (s *FKCheckRuntimeStats) Merge(other execdetails.RuntimeStats) { + tmp, ok := other.(*FKCheckRuntimeStats) + if !ok { + return + } + s.Total += tmp.Total + s.Check += tmp.Check + s.Lock += tmp.Lock + s.Keys += tmp.Keys +} + +// Tp implements the RuntimeStats interface. +func (s *FKCheckRuntimeStats) Tp() int { + return execdetails.TpFKCheckRuntimeStats +} + +// String implements the RuntimeStats interface. +func (s *FKCascadeRuntimeStats) String() string { + buf := bytes.NewBuffer(make([]byte, 0, 32)) + buf.WriteString("total:") + buf.WriteString(execdetails.FormatDuration(s.Total)) + if s.Keys > 0 { + buf.WriteString(", foreign_keys:") + buf.WriteString(strconv.Itoa(s.Keys)) + } + return buf.String() +} + +// Clone implements the RuntimeStats interface. +func (s *FKCascadeRuntimeStats) Clone() execdetails.RuntimeStats { + newRs := &FKCascadeRuntimeStats{ + Total: s.Total, + Keys: s.Keys, + } + return newRs +} + +// Merge implements the RuntimeStats interface. +func (s *FKCascadeRuntimeStats) Merge(other execdetails.RuntimeStats) { + tmp, ok := other.(*FKCascadeRuntimeStats) + if !ok { + return + } + s.Total += tmp.Total + s.Keys += tmp.Keys +} + +// Tp implements the RuntimeStats interface. +func (s *FKCascadeRuntimeStats) Tp() int { + return execdetails.TpFKCascadeRuntimeStats +} diff --git a/executor/grant_test.go b/executor/grant_test.go index 4c9cb867f792f..3a7720d620673 100644 --- a/executor/grant_test.go +++ b/executor/grant_test.go @@ -99,10 +99,10 @@ func TestGrantDBScope(t *testing.T) { } // Grant in wrong scope. - _, err := tk.Exec(` grant create user on test.* to 'testDB1'@'localhost';`) + err := tk.ExecToErr(` grant create user on test.* to 'testDB1'@'localhost';`) require.True(t, terror.ErrorEqual(err, executor.ErrWrongUsage.GenWithStackByArgs("DB GRANT", "GLOBAL PRIVILEGES"))) - _, err = tk.Exec("GRANT SUPER ON test.* TO 'testDB1'@'localhost';") + err = tk.ExecToErr("GRANT SUPER ON test.* TO 'testDB1'@'localhost';") require.True(t, terror.ErrorEqual(err, executor.ErrWrongUsage.GenWithStackByArgs("DB GRANT", "NON-DB PRIVILEGES"))) } @@ -168,8 +168,8 @@ func TestGrantTableScope(t *testing.T) { require.Greater(t, strings.Index(p, mysql.Priv2SetStr[v]), -1) } - _, err := tk.Exec("GRANT SUPER ON test2 TO 'testTbl1'@'localhost';") - require.EqualError(t, err, "[executor:1144]Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used") + tk.MustGetErrMsg("GRANT SUPER ON test2 TO 'testTbl1'@'localhost';", + "[executor:1144]Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used") } func TestGrantColumnScope(t *testing.T) { @@ -213,8 +213,8 @@ func TestGrantColumnScope(t *testing.T) { require.Greater(t, strings.Index(p, mysql.Priv2SetStr[v]), -1) } - _, err := tk.Exec("GRANT SUPER(c2) ON test3 TO 'testCol1'@'localhost';") - require.EqualError(t, err, "[executor:1221]Incorrect usage of COLUMN GRANT and NON-COLUMN PRIVILEGES") + tk.MustGetErrMsg("GRANT SUPER(c2) ON test3 TO 'testCol1'@'localhost';", + "[executor:1221]Incorrect usage of COLUMN GRANT and NON-COLUMN PRIVILEGES") } func TestIssue2456(t *testing.T) { @@ -394,7 +394,7 @@ func TestMaintainRequire(t *testing.T) { // test show create user tk.MustExec(`CREATE USER 'u3'@'%' require issuer '/CN=TiDB admin/OU=TiDB/O=PingCAP/L=San Francisco/ST=California/C=US' subject '/CN=tester1/OU=TiDB/O=PingCAP.Inc/L=Haidian/ST=Beijing/C=ZH' cipher 'AES128-GCM-SHA256'`) - tk.MustQuery("show create user 'u3'").Check(testkit.Rows("CREATE USER 'u3'@'%' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE CIPHER 'AES128-GCM-SHA256' ISSUER '/CN=TiDB admin/OU=TiDB/O=PingCAP/L=San Francisco/ST=California/C=US' SUBJECT '/CN=tester1/OU=TiDB/O=PingCAP.Inc/L=Haidian/ST=Beijing/C=ZH' PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK")) + tk.MustQuery("show create user 'u3'").Check(testkit.Rows("CREATE USER 'u3'@'%' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE CIPHER 'AES128-GCM-SHA256' ISSUER '/CN=TiDB admin/OU=TiDB/O=PingCAP/L=San Francisco/ST=California/C=US' SUBJECT '/CN=tester1/OU=TiDB/O=PingCAP.Inc/L=Haidian/ST=Beijing/C=ZH' PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT")) // check issuer/subject/cipher value err := tk.ExecToErr(`CREATE USER 'u4'@'%' require issuer 'CN=TiDB,OU=PingCAP'`) diff --git a/executor/hash_table.go b/executor/hash_table.go index d2b294f52d9ad..50acc4447f4df 100644 --- a/executor/hash_table.go +++ b/executor/hash_table.go @@ -92,6 +92,10 @@ func (s *hashStatistic) String() string { return fmt.Sprintf("probe_collision:%v, build:%v", s.probeCollision, execdetails.FormatDuration(s.buildTableElapse)) } +type hashNANullBucket struct { + entries []*naEntry +} + // hashRowContainer handles the rows and the hash map of a table. // NOTE: a hashRowContainer may be shallow copied by the invoker, define all the // member attributes as pointer type to avoid unexpected problems. @@ -104,16 +108,17 @@ type hashRowContainer struct { hashTable baseHashTable // hashNANullBucket stores the rows with any null value in NAAJ join key columns. // After build process, NANUllBucket is read only here for multi probe worker. - hashNANullBucket []*naEntry + hashNANullBucket *hashNANullBucket rowContainer *chunk.RowContainer memTracker *memory.Tracker // chkBuf buffer the data reads from the disk if rowContainer is spilled. - chkBuf *chunk.Chunk + chkBuf *chunk.Chunk + chkBufSizeForOneProbe int64 } -func newHashRowContainer(sCtx sessionctx.Context, estCount int, hCtx *hashContext, allTypes []*types.FieldType) *hashRowContainer { +func newHashRowContainer(sCtx sessionctx.Context, hCtx *hashContext, allTypes []*types.FieldType) *hashRowContainer { maxChunkSize := sCtx.GetSessionVars().MaxChunkSize rc := chunk.NewRowContainer(allTypes, maxChunkSize) c := &hashRowContainer{ @@ -124,6 +129,9 @@ func newHashRowContainer(sCtx sessionctx.Context, estCount int, hCtx *hashContex rowContainer: rc, memTracker: memory.NewTracker(memory.LabelForRowContainer, -1), } + if isNAAJ := len(hCtx.naKeyColIdx) > 0; isNAAJ { + c.hashNANullBucket = &hashNANullBucket{} + } rc.GetMemTracker().AttachTo(c.GetMemTracker()) return c } @@ -206,6 +214,15 @@ func (c *hashRowContainer) GetAllMatchedRows(probeHCtx *hashContext, probeSideRo return matched, nil } +// signalCheckpointForJoinMask indicates the times of row probe that a signal detection will be triggered. +const signalCheckpointForJoinMask int = 1<<14 - 1 + +// rowSize is the size of Row. +const rowSize = int64(unsafe.Sizeof(chunk.Row{})) + +// rowPtrSize is the size of RowPtr. +const rowPtrSize = int64(unsafe.Sizeof(chunk.RowPtr{})) + // GetMatchedRowsAndPtrs get matched rows and Ptrs from probeRow. It can be called // in multiple goroutines while each goroutine should keep its own // h and buf. @@ -218,7 +235,23 @@ func (c *hashRowContainer) GetMatchedRowsAndPtrs(probeKey uint64, probeRow chunk matched = matched[:0] var matchedRow chunk.Row matchedPtrs = matchedPtrs[:0] - for _, ptr := range innerPtrs { + + // Some variables used for memTracker. + var ( + matchedDataSize = int64(cap(matched))*rowSize + int64(cap(matchedPtrs))*rowPtrSize + lastChunkBufPointer *chunk.Chunk = nil + memDelta int64 = 0 + needTrackMemUsage = cap(innerPtrs) > signalCheckpointForJoinMask + ) + c.chkBuf = nil + c.memTracker.Consume(-c.chkBufSizeForOneProbe) + if needTrackMemUsage { + c.memTracker.Consume(int64(cap(innerPtrs)) * rowPtrSize) + defer c.memTracker.Consume(-int64(cap(innerPtrs))*rowPtrSize + memDelta) + } + c.chkBufSizeForOneProbe = 0 + + for i, ptr := range innerPtrs { matchedRow, c.chkBuf, err = c.rowContainer.GetRowAndAppendToChunk(ptr, c.chkBuf) if err != nil { return nil, nil, err @@ -228,6 +261,19 @@ func (c *hashRowContainer) GetMatchedRowsAndPtrs(probeKey uint64, probeRow chunk if err != nil { return nil, nil, err } + if needTrackMemUsage && c.chkBuf != lastChunkBufPointer && lastChunkBufPointer != nil { + lastChunkSize := lastChunkBufPointer.MemoryUsage() + c.chkBufSizeForOneProbe += lastChunkSize + memDelta += lastChunkSize + } + lastChunkBufPointer = c.chkBuf + if needTrackMemUsage && (i&signalCheckpointForJoinMask == signalCheckpointForJoinMask) { + // Trigger Consume for checking the OOM Action signal + memDelta += int64(cap(matched))*rowSize + int64(cap(matchedPtrs))*rowPtrSize - matchedDataSize + matchedDataSize = int64(cap(matched))*rowSize + int64(cap(matchedPtrs))*rowPtrSize + c.memTracker.Consume(memDelta + 1) + memDelta = 0 + } if !ok { atomic.AddInt64(&c.stat.probeCollision, 1) continue @@ -248,7 +294,7 @@ func (c *hashRowContainer) GetNullBucketRows(probeHCtx *hashContext, probeSideRo mayMatchedRow chunk.Row ) matched = matched[:0] - for _, nullEntry := range c.hashNANullBucket { + for _, nullEntry := range c.hashNANullBucket.entries { mayMatchedRow, c.chkBuf, err = c.rowContainer.GetRowAndAppendToChunk(nullEntry.ptr, c.chkBuf) if err != nil { return nil, err @@ -394,7 +440,7 @@ func (c *hashRowContainer) PutChunkSelected(chk *chunk.Chunk, selected, ignoreNu // collect the null rows to slice. rowPtr := chunk.RowPtr{ChkIdx: chkIdx, RowIdx: uint32(i)} // do not directly ref the null bits map here, because the bit map will be reset and reused in next batch of chunk data. - c.hashNANullBucket = append(c.hashNANullBucket, &naEntry{rowPtr, c.hCtx.naColNullBitMap[i].Clone()}) + c.hashNANullBucket.entries = append(c.hashNANullBucket.entries, &naEntry{rowPtr, c.hCtx.naColNullBitMap[i].Clone()}) } else { // insert the not-null rows to hash table. key := c.hCtx.hashVals[i].Sum64() diff --git a/executor/hash_table_test.go b/executor/hash_table_test.go index 3b4a4acee5284..0a387e0e7e5b6 100644 --- a/executor/hash_table_test.go +++ b/executor/hash_table_test.go @@ -127,7 +127,7 @@ func testHashRowContainer(t *testing.T, hashFunc func() hash.Hash64, spill bool) for i := 0; i < numRows; i++ { hCtx.hashVals = append(hCtx.hashVals, hashFunc()) } - rowContainer := newHashRowContainer(sctx, 0, hCtx, colTypes) + rowContainer := newHashRowContainer(sctx, hCtx, colTypes) copiedRC = rowContainer.ShallowCopy() tracker := rowContainer.GetMemTracker() tracker.SetLabel(memory.LabelForBuildSideResult) diff --git a/executor/historical_stats_test.go b/executor/historical_stats_test.go new file mode 100644 index 0000000000000..9ddd34655369f --- /dev/null +++ b/executor/historical_stats_test.go @@ -0,0 +1,397 @@ +// 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, +// 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 executor_test + +import ( + "encoding/json" + "fmt" + "strconv" + "testing" + "time" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/statistics/handle" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/oracle" +) + +func TestRecordHistoryStatsAfterAnalyze(t *testing.T) { + failpoint.Enable("github.com/pingcap/tidb/domain/sendHistoricalStats", "return(true)") + defer failpoint.Disable("github.com/pingcap/tidb/domain/sendHistoricalStats") + store, dom := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@tidb_analyze_version = 2") + tk.MustExec("set global tidb_enable_historical_stats = 0") + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b varchar(10))") + + h := dom.StatsHandle() + is := dom.InfoSchema() + tableInfo, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + + // 1. switch off the tidb_enable_historical_stats, and there is no records in table `mysql.stats_history` + rows := tk.MustQuery(fmt.Sprintf("select count(*) from mysql.stats_history where table_id = '%d'", tableInfo.Meta().ID)).Rows() + num, _ := strconv.Atoi(rows[0][0].(string)) + require.Equal(t, num, 0) + + tk.MustExec("analyze table t with 2 topn") + rows = tk.MustQuery(fmt.Sprintf("select count(*) from mysql.stats_history where table_id = '%d'", tableInfo.Meta().ID)).Rows() + num, _ = strconv.Atoi(rows[0][0].(string)) + require.Equal(t, num, 0) + + // 2. switch on the tidb_enable_historical_stats and do analyze + tk.MustExec("set global tidb_enable_historical_stats = 1") + defer tk.MustExec("set global tidb_enable_historical_stats = 0") + tk.MustExec("analyze table t with 2 topn") + // dump historical stats + hsWorker := dom.GetHistoricalStatsWorker() + tblID := hsWorker.GetOneHistoricalStatsTable() + err = hsWorker.DumpHistoricalStats(tblID, h) + require.Nil(t, err) + rows = tk.MustQuery(fmt.Sprintf("select count(*) from mysql.stats_history where table_id = '%d'", tableInfo.Meta().ID)).Rows() + num, _ = strconv.Atoi(rows[0][0].(string)) + require.GreaterOrEqual(t, num, 1) + + // 3. dump current stats json + dumpJSONTable, err := h.DumpStatsToJSON("test", tableInfo.Meta(), nil, true) + require.NoError(t, err) + jsOrigin, _ := json.Marshal(dumpJSONTable) + + // 4. get the historical stats json + rows = tk.MustQuery(fmt.Sprintf("select * from mysql.stats_history where table_id = '%d' and create_time = ("+ + "select create_time from mysql.stats_history where table_id = '%d' order by create_time desc limit 1) "+ + "order by seq_no", tableInfo.Meta().ID, tableInfo.Meta().ID)).Rows() + num = len(rows) + require.GreaterOrEqual(t, num, 1) + data := make([][]byte, num) + for i, row := range rows { + data[i] = []byte(row[1].(string)) + } + jsonTbl, err := handle.BlocksToJSONTable(data) + require.NoError(t, err) + jsCur, err := json.Marshal(jsonTbl) + require.NoError(t, err) + // 5. historical stats must be equal to the current stats + require.JSONEq(t, string(jsOrigin), string(jsCur)) +} + +func TestRecordHistoryStatsMetaAfterAnalyze(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@tidb_analyze_version = 2") + tk.MustExec("set global tidb_enable_historical_stats = 0") + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int)") + tk.MustExec("analyze table test.t") + + h := dom.StatsHandle() + is := dom.InfoSchema() + tableInfo, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + + // 1. switch off the tidb_enable_historical_stats, and there is no record in table `mysql.stats_meta_history` + tk.MustQuery(fmt.Sprintf("select count(*) from mysql.stats_meta_history where table_id = '%d'", tableInfo.Meta().ID)).Check(testkit.Rows("0")) + // insert demo tuples, and there is no record either. + insertNums := 5 + for i := 0; i < insertNums; i++ { + tk.MustExec("insert into test.t (a,b) values (1,1), (2,2), (3,3)") + err := h.DumpStatsDeltaToKV(handle.DumpDelta) + require.NoError(t, err) + } + tk.MustQuery(fmt.Sprintf("select count(*) from mysql.stats_meta_history where table_id = '%d'", tableInfo.Meta().ID)).Check(testkit.Rows("0")) + + // 2. switch on the tidb_enable_historical_stats and insert tuples to produce count/modifyCount delta change. + tk.MustExec("set global tidb_enable_historical_stats = 1") + defer tk.MustExec("set global tidb_enable_historical_stats = 0") + + for i := 0; i < insertNums; i++ { + tk.MustExec("insert into test.t (a,b) values (1,1), (2,2), (3,3)") + err := h.DumpStatsDeltaToKV(handle.DumpDelta) + require.NoError(t, err) + } + tk.MustQuery(fmt.Sprintf("select modify_count, count from mysql.stats_meta_history where table_id = '%d' order by create_time", tableInfo.Meta().ID)).Sort().Check( + testkit.Rows("18 18", "21 21", "24 24", "27 27", "30 30")) + tk.MustQuery(fmt.Sprintf("select distinct source from mysql.stats_meta_history where table_id = '%d'", tableInfo.Meta().ID)).Sort().Check(testkit.Rows("flush stats")) + + // assert delete + tk.MustExec("delete from test.t where test.t.a = 1") + err = h.DumpStatsDeltaToKV(handle.DumpAll) + require.NoError(t, err) + tk.MustQuery(fmt.Sprintf("select modify_count, count from mysql.stats_meta where table_id = '%d' order by create_time desc", tableInfo.Meta().ID)).Sort().Check( + testkit.Rows("40 20")) + tk.MustQuery(fmt.Sprintf("select modify_count, count from mysql.stats_meta_history where table_id = '%d' order by create_time desc limit 1", tableInfo.Meta().ID)).Sort().Check( + testkit.Rows("40 20")) + + // assert update + tk.MustExec("update test.t set test.t.b = 4 where test.t.a = 2") + err = h.DumpStatsDeltaToKV(handle.DumpAll) + require.NoError(t, err) + tk.MustQuery(fmt.Sprintf("select modify_count, count from mysql.stats_meta where table_id = '%d' order by create_time desc", tableInfo.Meta().ID)).Sort().Check( + testkit.Rows("50 20")) + tk.MustQuery(fmt.Sprintf("select modify_count, count from mysql.stats_meta_history where table_id = '%d' order by create_time desc limit 1", tableInfo.Meta().ID)).Sort().Check( + testkit.Rows("50 20")) +} + +func TestGCHistoryStatsAfterDropTable(t *testing.T) { + failpoint.Enable("github.com/pingcap/tidb/domain/sendHistoricalStats", "return(true)") + defer failpoint.Disable("github.com/pingcap/tidb/domain/sendHistoricalStats") + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set global tidb_enable_historical_stats = 1") + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b varchar(10))") + tk.MustExec("analyze table test.t") + is := dom.InfoSchema() + tableInfo, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + // dump historical stats + h := dom.StatsHandle() + hsWorker := dom.GetHistoricalStatsWorker() + tblID := hsWorker.GetOneHistoricalStatsTable() + err = hsWorker.DumpHistoricalStats(tblID, h) + require.Nil(t, err) + + // assert the records of history stats table + tk.MustQuery(fmt.Sprintf("select count(*) from mysql.stats_meta_history where table_id = '%d' order by create_time", + tableInfo.Meta().ID)).Check(testkit.Rows("1")) + tk.MustQuery(fmt.Sprintf("select count(*) from mysql.stats_history where table_id = '%d'", + tableInfo.Meta().ID)).Check(testkit.Rows("1")) + // drop the table and gc stats + tk.MustExec("drop table t") + is = dom.InfoSchema() + h.GCStats(is, 0) + + // assert stats_history tables delete the record of dropped table + tk.MustQuery(fmt.Sprintf("select count(*) from mysql.stats_meta_history where table_id = '%d' order by create_time", + tableInfo.Meta().ID)).Check(testkit.Rows("0")) + tk.MustQuery(fmt.Sprintf("select count(*) from mysql.stats_history where table_id = '%d'", + tableInfo.Meta().ID)).Check(testkit.Rows("0")) +} + +func TestAssertHistoricalStatsAfterAlterTable(t *testing.T) { + failpoint.Enable("github.com/pingcap/tidb/domain/sendHistoricalStats", "return(true)") + defer failpoint.Disable("github.com/pingcap/tidb/domain/sendHistoricalStats") + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set global tidb_enable_historical_stats = 1") + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b varchar(10),c int, KEY `idx` (`c`))") + tk.MustExec("analyze table test.t") + is := dom.InfoSchema() + tableInfo, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + // dump historical stats + h := dom.StatsHandle() + hsWorker := dom.GetHistoricalStatsWorker() + tblID := hsWorker.GetOneHistoricalStatsTable() + err = hsWorker.DumpHistoricalStats(tblID, h) + require.Nil(t, err) + + time.Sleep(1 * time.Second) + snapshot := oracle.GoTimeToTS(time.Now()) + jsTable, err := h.DumpHistoricalStatsBySnapshot("test", tableInfo.Meta(), snapshot) + require.NoError(t, err) + require.NotNil(t, jsTable) + require.NotEqual(t, jsTable.Version, uint64(0)) + originVersion := jsTable.Version + + // assert historical stats non-change after drop column + tk.MustExec("alter table t drop column b") + h.GCStats(is, 0) + snapshot = oracle.GoTimeToTS(time.Now()) + jsTable, err = h.DumpHistoricalStatsBySnapshot("test", tableInfo.Meta(), snapshot) + require.NoError(t, err) + require.NotNil(t, jsTable) + require.Equal(t, jsTable.Version, originVersion) + + // assert historical stats non-change after drop index + tk.MustExec("alter table t drop index idx") + h.GCStats(is, 0) + snapshot = oracle.GoTimeToTS(time.Now()) + jsTable, err = h.DumpHistoricalStatsBySnapshot("test", tableInfo.Meta(), snapshot) + require.NoError(t, err) + require.NotNil(t, jsTable) + require.Equal(t, jsTable.Version, originVersion) +} + +func TestGCOutdatedHistoryStats(t *testing.T) { + failpoint.Enable("github.com/pingcap/tidb/domain/sendHistoricalStats", "return(true)") + defer failpoint.Disable("github.com/pingcap/tidb/domain/sendHistoricalStats") + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set global tidb_enable_historical_stats = 1") + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b varchar(10))") + tk.MustExec("analyze table test.t") + is := dom.InfoSchema() + tableInfo, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + // dump historical stats + h := dom.StatsHandle() + hsWorker := dom.GetHistoricalStatsWorker() + tblID := hsWorker.GetOneHistoricalStatsTable() + err = hsWorker.DumpHistoricalStats(tblID, h) + require.Nil(t, err) + + // assert the records of history stats table + tk.MustQuery(fmt.Sprintf("select count(*) from mysql.stats_meta_history where table_id = '%d' order by create_time", + tableInfo.Meta().ID)).Check(testkit.Rows("1")) + tk.MustQuery(fmt.Sprintf("select count(*) from mysql.stats_history where table_id = '%d'", + tableInfo.Meta().ID)).Check(testkit.Rows("1")) + + variable.HistoricalStatsDuration.Store(1 * time.Second) + time.Sleep(2 * time.Second) + err = dom.StatsHandle().ClearOutdatedHistoryStats() + require.NoError(t, err) + // assert the records of history stats table + tk.MustQuery(fmt.Sprintf("select count(*) from mysql.stats_meta_history where table_id = '%d' order by create_time", + tableInfo.Meta().ID)).Check(testkit.Rows("0")) + tk.MustQuery(fmt.Sprintf("select count(*) from mysql.stats_history where table_id = '%d'", + tableInfo.Meta().ID)).Check(testkit.Rows("0")) +} + +func TestPartitionTableHistoricalStats(t *testing.T) { + failpoint.Enable("github.com/pingcap/tidb/domain/sendHistoricalStats", "return(true)") + defer failpoint.Disable("github.com/pingcap/tidb/domain/sendHistoricalStats") + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set global tidb_enable_historical_stats = 1") + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec(`CREATE TABLE t (a int, b int, index idx(b)) +PARTITION BY RANGE ( a ) ( +PARTITION p0 VALUES LESS THAN (6) +)`) + tk.MustExec("delete from mysql.stats_history") + + tk.MustExec("analyze table test.t") + // dump historical stats + h := dom.StatsHandle() + hsWorker := dom.GetHistoricalStatsWorker() + + // assert global table and partition table be dumped + tblID := hsWorker.GetOneHistoricalStatsTable() + err := hsWorker.DumpHistoricalStats(tblID, h) + require.NoError(t, err) + tblID = hsWorker.GetOneHistoricalStatsTable() + err = hsWorker.DumpHistoricalStats(tblID, h) + require.NoError(t, err) + tk.MustQuery("select count(*) from mysql.stats_history").Check(testkit.Rows("2")) +} + +func TestDumpHistoricalStatsByTable(t *testing.T) { + failpoint.Enable("github.com/pingcap/tidb/domain/sendHistoricalStats", "return(true)") + defer failpoint.Disable("github.com/pingcap/tidb/domain/sendHistoricalStats") + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set global tidb_enable_historical_stats = 1") + tk.MustExec("set @@tidb_partition_prune_mode='static'") + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec(`CREATE TABLE t (a int, b int, index idx(b)) +PARTITION BY RANGE ( a ) ( +PARTITION p0 VALUES LESS THAN (6) +)`) + // dump historical stats + h := dom.StatsHandle() + + tk.MustExec("analyze table t") + is := dom.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + require.NotNil(t, tbl) + + // dump historical stats + hsWorker := dom.GetHistoricalStatsWorker() + // only partition p0 stats will be dumped in static mode + tblID := hsWorker.GetOneHistoricalStatsTable() + require.NotEqual(t, tblID, -1) + err = hsWorker.DumpHistoricalStats(tblID, h) + require.NoError(t, err) + tblID = hsWorker.GetOneHistoricalStatsTable() + require.Equal(t, tblID, int64(-1)) + + time.Sleep(1 * time.Second) + snapshot := oracle.GoTimeToTS(time.Now()) + jsTable, err := h.DumpHistoricalStatsBySnapshot("test", tbl.Meta(), snapshot) + require.NoError(t, err) + require.NotNil(t, jsTable) + // only has p0 stats + require.NotNil(t, jsTable.Partitions["p0"]) + require.Nil(t, jsTable.Partitions["global"]) + + // change static to dynamic then assert + tk.MustExec("set @@tidb_partition_prune_mode='dynamic'") + tk.MustExec("analyze table t") + require.NoError(t, err) + // global and p0's stats will be dumped + tblID = hsWorker.GetOneHistoricalStatsTable() + require.NotEqual(t, tblID, -1) + err = hsWorker.DumpHistoricalStats(tblID, h) + require.NoError(t, err) + tblID = hsWorker.GetOneHistoricalStatsTable() + require.NotEqual(t, tblID, -1) + err = hsWorker.DumpHistoricalStats(tblID, h) + require.NoError(t, err) + time.Sleep(1 * time.Second) + snapshot = oracle.GoTimeToTS(time.Now()) + jsTable, err = h.DumpHistoricalStatsBySnapshot("test", tbl.Meta(), snapshot) + require.NoError(t, err) + require.NotNil(t, jsTable) + // has both global and p0 stats + require.NotNil(t, jsTable.Partitions["p0"]) + require.NotNil(t, jsTable.Partitions["global"]) +} + +func TestDumpHistoricalStatsFallback(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set global tidb_enable_historical_stats = 0") + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec(`CREATE TABLE t (a int, b int, index idx(b)) +PARTITION BY RANGE ( a ) ( +PARTITION p0 VALUES LESS THAN (6) +)`) + // dump historical stats + tk.MustExec("analyze table t") + is := dom.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + require.NotNil(t, tbl) + + // dump historical stats + hsWorker := dom.GetHistoricalStatsWorker() + tblID := hsWorker.GetOneHistoricalStatsTable() + // assert no historical stats task generated + require.Equal(t, tblID, int64(-1)) + tk.MustExec("set global tidb_enable_historical_stats = 1") + h := dom.StatsHandle() + jt, err := h.DumpHistoricalStatsBySnapshot("test", tbl.Meta(), oracle.GoTimeToTS(time.Now())) + require.NoError(t, err) + require.NotNil(t, jt) + require.False(t, jt.IsHistoricalStats) +} diff --git a/executor/index_advise_test.go b/executor/index_advise_test.go index 3415ffe83537b..2e133d25502ff 100644 --- a/executor/index_advise_test.go +++ b/executor/index_advise_test.go @@ -65,3 +65,134 @@ func TestIndexAdvise(t *testing.T) { require.Equal(t, uint64(4), ia.MaxIndexNum.PerTable) require.Equal(t, uint64(5), ia.MaxIndexNum.PerDB) } + +func TestIndexJoinProjPattern(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(`create table t1( +pnbrn_cnaps varchar(5) not null, +new_accno varchar(18) not null, +primary key(pnbrn_cnaps,new_accno) nonclustered +);`) + tk.MustExec(`create table t2( +pnbrn_cnaps varchar(5) not null, +txn_accno varchar(18) not null, +txn_dt date not null, +yn_frz varchar(1) default null +);`) + tk.MustExec(`insert into t1(pnbrn_cnaps,new_accno) values ("40001","123")`) + tk.MustExec(`insert into t2(pnbrn_cnaps, txn_accno, txn_dt, yn_frz) values ("40001","123","20221201","0");`) + + sql := `update +/*+ inl_join(a) */ +t2 b, +( +select t1.pnbrn_cnaps, +t1.new_accno +from t1 +where t1.pnbrn_cnaps = '40001' +) a +set b.yn_frz = '1' +where b.txn_dt = str_to_date('20221201', '%Y%m%d') +and b.pnbrn_cnaps = a.pnbrn_cnaps +and b.txn_accno = a.new_accno;` + rows := [][]interface{}{ + {"Update_8"}, + {"└─IndexJoin_14"}, + {" ├─TableReader_25(Build)"}, + {" │ └─Selection_24"}, + {" │ └─TableFullScan_23"}, + {" └─IndexReader_12(Probe)"}, + {" └─Selection_11"}, + {" └─IndexRangeScan_10"}, + } + tk.MustExec("set @@session.tidb_enable_inl_join_inner_multi_pattern='ON'") + tk.MustQuery("explain "+sql).CheckAt([]int{0}, rows) + rows = [][]interface{}{ + {"Update_8"}, + {"└─HashJoin_10"}, + {" ├─IndexReader_17(Build)"}, + {" │ └─IndexRangeScan_16"}, + {" └─TableReader_14(Probe)"}, + {" └─Selection_13"}, + {" └─TableFullScan_12"}, + } + tk.MustExec("set @@session.tidb_enable_inl_join_inner_multi_pattern='OFF'") + tk.MustQuery("explain "+sql).CheckAt([]int{0}, rows) + + tk.MustExec("set @@session.tidb_enable_inl_join_inner_multi_pattern='ON'") + tk.MustExec(sql) + tk.MustQuery("select yn_frz from t2").Check(testkit.Rows("1")) +} + +func TestIndexJoinSelPattern(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(` create table tbl_miss( +id bigint(20) unsigned not null +,txn_dt date default null +,perip_sys_uuid varchar(32) not null +,rvrs_idr varchar(1) not null +,primary key(id) clustered +,key idx1 (txn_dt, perip_sys_uuid, rvrs_idr) +); +`) + tk.MustExec(`insert into tbl_miss (id,txn_dt,perip_sys_uuid,rvrs_idr) values (1,"20221201","123","1");`) + tk.MustExec(`create table tbl_src( +txn_dt date default null +,uuid varchar(32) not null +,rvrs_idr char(1) +,expd_inf varchar(5000) +,primary key(uuid,rvrs_idr) nonclustered +); +`) + tk.MustExec(`insert into tbl_src (txn_dt,uuid,rvrs_idr) values ("20221201","123","1");`) + sql := `select /*+ use_index(mis,) inl_join(src) */ + * + from tbl_miss mis + ,tbl_src src + where src.txn_dt >= str_to_date('20221201', '%Y%m%d') + and mis.id between 1 and 10000 + and mis.perip_sys_uuid = src.uuid + and mis.rvrs_idr = src.rvrs_idr + and mis.txn_dt = src.txn_dt + and ( + case when isnull(src.expd_inf) = 1 then '' + else + substr(concat_ws('',src.expd_inf,'~~'), + instr(concat_ws('',src.expd_inf,'~~'),'~~a4') + 4, + instr(substr(concat_ws('',src.expd_inf,'~~'), + instr(concat_ws('',src.expd_inf,'~~'),'~~a4') + 4, length(concat_ws('',src.expd_inf,'~~'))),'~~') -1) + end + ) != '01';` + rows := [][]interface{}{ + {"HashJoin_9"}, + {"├─TableReader_12(Build)"}, + {"│ └─Selection_11"}, + {"│ └─TableRangeScan_10"}, + {"└─Selection_13(Probe)"}, + {" └─TableReader_16"}, + {" └─Selection_15"}, + {" └─TableFullScan_14"}, + } + tk.MustExec("set @@session.tidb_enable_inl_join_inner_multi_pattern='OFF'") + tk.MustQuery("explain "+sql).CheckAt([]int{0}, rows) + rows = [][]interface{}{ + {"IndexJoin_13"}, + {"├─TableReader_25(Build)"}, + {"│ └─Selection_24"}, + {"│ └─TableRangeScan_23"}, + {"└─Selection_12(Probe)"}, + {" └─IndexLookUp_11"}, + {" ├─IndexRangeScan_8(Build)"}, + {" └─Selection_10(Probe)"}, + {" └─TableRowIDScan_9"}, + } + tk.MustExec("set @@session.tidb_enable_inl_join_inner_multi_pattern='ON'") + tk.MustQuery("explain "+sql).CheckAt([]int{0}, rows) + tk.MustQuery(sql).Check(testkit.Rows("1 2022-12-01 123 1 2022-12-01 123 1 ")) + tk.MustExec("set @@session.tidb_enable_inl_join_inner_multi_pattern='OFF'") + tk.MustQuery(sql).Check(testkit.Rows("1 2022-12-01 123 1 2022-12-01 123 1 ")) +} diff --git a/executor/index_lookup_hash_join.go b/executor/index_lookup_hash_join.go index c54b60749601d..58bd84ff6e4d6 100644 --- a/executor/index_lookup_hash_join.go +++ b/executor/index_lookup_hash_join.go @@ -134,7 +134,6 @@ func (e *IndexNestedLoopHashJoin) Open(ctx context.Context) error { e.innerPtrBytes = make([][]byte, 0, 8) if e.runtimeStats != nil { e.stats = &indexLookUpJoinRuntimeStats{} - e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) } e.finished.Store(false) return nil @@ -288,6 +287,9 @@ func (e *IndexNestedLoopHashJoin) isDryUpTasks(ctx context.Context) bool { // Close implements the IndexNestedLoopHashJoin Executor interface. func (e *IndexNestedLoopHashJoin) Close() error { + if e.stats != nil { + defer e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) + } if e.cancelFunc != nil { e.cancelFunc() } diff --git a/executor/index_lookup_join.go b/executor/index_lookup_join.go index 05cc337d3d7ee..187e83cc0f763 100644 --- a/executor/index_lookup_join.go +++ b/executor/index_lookup_join.go @@ -171,7 +171,6 @@ func (e *IndexLookUpJoin) Open(ctx context.Context) error { e.finished.Store(false) if e.runtimeStats != nil { e.stats = &indexLookUpJoinRuntimeStats{} - e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) } e.cancelFunc = nil return nil @@ -765,6 +764,9 @@ func (iw *innerWorker) hasNullInJoinKey(row chunk.Row) bool { // Close implements the Executor interface. func (e *IndexLookUpJoin) Close() error { + if e.stats != nil { + defer e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) + } if e.cancelFunc != nil { e.cancelFunc() } diff --git a/executor/index_lookup_join_test.go b/executor/index_lookup_join_test.go index 2f251761b71c2..600f052b1225e 100644 --- a/executor/index_lookup_join_test.go +++ b/executor/index_lookup_join_test.go @@ -401,6 +401,7 @@ func TestIssue27138(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set tidb_cost_model_version=1") tk.MustExec("drop table if exists t1,t2") tk.MustExec("set @old_tidb_partition_prune_mode=@@tidb_partition_prune_mode") @@ -427,17 +428,19 @@ PARTITIONS 1`) // Why does the t2.prefiller need be at least 2^32 ? If smaller the bug will not appear!?! tk.MustExec("insert into t2 values ( pow(2,32), 1, 1), ( pow(2,32)+1, 2, 0)") + tk.MustExec(`analyze table t1`) + tk.MustExec(`analyze table t2`) // Why must it be = 1 and not 2? - tk.MustQuery("explain select /* +INL_JOIN(t1,t2) */ t1.id, t1.pc from t1 where id in ( select prefiller from t2 where t2.postfiller = 1 )").Check(testkit.Rows("" + - "IndexJoin_15 10.00 root inner join, inner:TableReader_14, outer key:test.t2.prefiller, inner key:test.t1.id, equal cond:eq(test.t2.prefiller, test.t1.id)]\n" + - "[├─HashAgg_25(Build) 8.00 root group by:test.t2.prefiller, funcs:firstrow(test.t2.prefiller)->test.t2.prefiller]\n" + - "[│ └─TableReader_26 8.00 root data:HashAgg_20]\n" + - "[│ └─HashAgg_20 8.00 cop[tikv] group by:test.t2.prefiller, ]\n" + - "[│ └─Selection_24 10.00 cop[tikv] eq(test.t2.postfiller, 1)]\n" + - "[│ └─TableFullScan_23 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo]\n" + - "[└─TableReader_14(Probe) 8.00 root partition:all data:TableRangeScan_13]\n" + - "[ └─TableRangeScan_13 8.00 cop[tikv] table:t1 range: decided by [eq(test.t1.id, test.t2.prefiller)], keep order:false, stats:pseudo")) + tk.MustQuery("explain format='brief' select /* +INL_JOIN(t1,t2) */ t1.id, t1.pc from t1 where id in ( select prefiller from t2 where t2.postfiller = 1 )").Check(testkit.Rows(""+ + `IndexJoin 1.25 root inner join, inner:TableReader, outer key:test.t2.prefiller, inner key:test.t1.id, equal cond:eq(test.t2.prefiller, test.t1.id)`, + `├─HashAgg(Build) 1.00 root group by:test.t2.prefiller, funcs:firstrow(test.t2.prefiller)->test.t2.prefiller`, + `│ └─TableReader 1.00 root data:HashAgg`, + `│ └─HashAgg 1.00 cop[tikv] group by:test.t2.prefiller, `, + `│ └─Selection 1.00 cop[tikv] eq(test.t2.postfiller, 1)`, + `│ └─TableFullScan 2.00 cop[tikv] table:t2 keep order:false`, + `└─TableReader(Probe) 1.00 root partition:all data:TableRangeScan`, + ` └─TableRangeScan 1.00 cop[tikv] table:t1 range: decided by [eq(test.t1.id, test.t2.prefiller)], keep order:false, stats:pseudo`)) tk.MustQuery("show warnings").Check(testkit.Rows()) // without fix it fails with: "runtime error: index out of range [0] with length 0" tk.MustQuery("select /* +INL_JOIN(t1,t2) */ t1.id, t1.pc from t1 where id in ( select prefiller from t2 where t2.postfiller = 1 )").Check(testkit.Rows()) diff --git a/executor/index_lookup_merge_join.go b/executor/index_lookup_merge_join.go index 8bd379944c825..e0fb176fff589 100644 --- a/executor/index_lookup_merge_join.go +++ b/executor/index_lookup_merge_join.go @@ -715,6 +715,9 @@ func (imw *innerMergeWorker) fetchNextInnerResult(ctx context.Context, task *loo // Close implements the Executor interface. func (e *IndexLookUpMergeJoin) Close() error { + if e.runtimeStats != nil { + defer e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.runtimeStats) + } if e.cancelFunc != nil { e.cancelFunc() e.cancelFunc = nil diff --git a/executor/index_merge_reader.go b/executor/index_merge_reader.go index 0e7eb394710fd..c4da6edc9f5cb 100644 --- a/executor/index_merge_reader.go +++ b/executor/index_merge_reader.go @@ -50,6 +50,14 @@ var ( _ Executor = &IndexMergeReaderExecutor{} ) +const ( + partialIndexWorkerType = "IndexMergePartialIndexWorker" + partialTableWorkerType = "IndexMergePartialTableWorker" + processWorkerType = "IndexMergeProcessWorker" + partTblIntersectionWorkerType = "IndexMergePartTblIntersectionWorker" + tableScanWorkerType = "IndexMergeTableScanWorker" +) + // IndexMergeReaderExecutor accesses a table with multiple index/table scan. // There are three types of workers: // 1. partialTableWorker/partialIndexWorker, which are used to fetch the handles @@ -86,16 +94,16 @@ type IndexMergeReaderExecutor struct { // All fields above are immutable. - tblWorkerWg sync.WaitGroup - idxWorkerWg sync.WaitGroup - processWokerWg sync.WaitGroup - finished chan struct{} + tblWorkerWg sync.WaitGroup + idxWorkerWg sync.WaitGroup + processWorkerWg sync.WaitGroup + finished chan struct{} workerStarted bool keyRanges [][]kv.KeyRange - resultCh chan *lookupTableTask - resultCurr *lookupTableTask + resultCh chan *indexMergeTableTask + resultCurr *indexMergeTableTask feedbacks []*statistics.QueryFeedback // memTracker is used to track the memory usage of this executor. @@ -118,6 +126,16 @@ type IndexMergeReaderExecutor struct { isCorColInPartialFilters []bool isCorColInTableFilter bool isCorColInPartialAccess []bool + + // Whether it's intersection or union. + isIntersection bool +} + +type indexMergeTableTask struct { + lookupTableTask + + // parTblIdx are only used in indexMergeProcessWorker.fetchLoopIntersection. + parTblIdx int } // Table implements the dataSourceExecutor interface. @@ -129,7 +147,12 @@ func (e *IndexMergeReaderExecutor) Table() table.Table { func (e *IndexMergeReaderExecutor) Open(ctx context.Context) (err error) { e.keyRanges = make([][]kv.KeyRange, 0, len(e.partialPlans)) e.initRuntimeStats() - + if e.isCorColInTableFilter { + e.tableRequest.Executors, err = constructDistExec(e.ctx, e.tblPlans) + if err != nil { + return err + } + } if err = e.rebuildRangeForCorCol(); err != nil { return err } @@ -150,7 +173,7 @@ func (e *IndexMergeReaderExecutor) Open(ctx context.Context) (err error) { } } e.finished = make(chan struct{}) - e.resultCh = make(chan *lookupTableTask, atomic.LoadInt32(&LookupTableTaskChannelSize)) + e.resultCh = make(chan *indexMergeTableTask, atomic.LoadInt32(&LookupTableTaskChannelSize)) e.memTracker = memory.NewTracker(e.id, -1) e.memTracker.AttachTo(e.ctx.GetSessionVars().StmtCtx.MemTracker) return nil @@ -194,7 +217,7 @@ func (e *IndexMergeReaderExecutor) buildKeyRangesForTable(tbl table.Table) (rang if err != nil { return nil, err } - keyRanges := append(firstKeyRanges, secondKeyRanges...) + keyRanges := append(firstKeyRanges.FirstPartitionRange(), secondKeyRanges.FirstPartitionRange()...) ranges = append(ranges, keyRanges) continue } @@ -202,15 +225,15 @@ func (e *IndexMergeReaderExecutor) buildKeyRangesForTable(tbl table.Table) (rang if err != nil { return nil, err } - ranges = append(ranges, keyRange) + ranges = append(ranges, keyRange.FirstPartitionRange()) } return ranges, nil } func (e *IndexMergeReaderExecutor) startWorkers(ctx context.Context) error { exitCh := make(chan struct{}) - workCh := make(chan *lookupTableTask, 1) - fetchCh := make(chan *lookupTableTask, len(e.keyRanges)) + workCh := make(chan *indexMergeTableTask, 1) + fetchCh := make(chan *indexMergeTableTask, len(e.keyRanges)) e.startIndexMergeProcessWorker(ctx, workCh, fetchCh) @@ -237,30 +260,40 @@ func (e *IndexMergeReaderExecutor) startWorkers(ctx context.Context) error { return nil } -func (e *IndexMergeReaderExecutor) waitPartialWorkersAndCloseFetchChan(fetchCh chan *lookupTableTask) { +func (e *IndexMergeReaderExecutor) waitPartialWorkersAndCloseFetchChan(fetchCh chan *indexMergeTableTask) { e.idxWorkerWg.Wait() close(fetchCh) } -func (e *IndexMergeReaderExecutor) startIndexMergeProcessWorker(ctx context.Context, workCh chan<- *lookupTableTask, fetch <-chan *lookupTableTask) { +func (e *IndexMergeReaderExecutor) startIndexMergeProcessWorker(ctx context.Context, workCh chan<- *indexMergeTableTask, fetch <-chan *indexMergeTableTask) { idxMergeProcessWorker := &indexMergeProcessWorker{ indexMerge: e, stats: e.stats, } - e.processWokerWg.Add(1) + e.processWorkerWg.Add(1) go func() { defer trace.StartRegion(ctx, "IndexMergeProcessWorker").End() util.WithRecovery( func() { - idxMergeProcessWorker.fetchLoop(ctx, fetch, workCh, e.resultCh, e.finished) + if e.isIntersection { + idxMergeProcessWorker.fetchLoopIntersection(ctx, fetch, workCh, e.resultCh, e.finished) + } else { + idxMergeProcessWorker.fetchLoopUnion(ctx, fetch, workCh, e.resultCh, e.finished) + } }, - idxMergeProcessWorker.handleLoopFetcherPanic(ctx, e.resultCh), + handleWorkerPanic(ctx, e.finished, e.resultCh, nil, processWorkerType), ) - e.processWokerWg.Done() + e.processWorkerWg.Done() }() } -func (e *IndexMergeReaderExecutor) startPartialIndexWorker(ctx context.Context, exitCh <-chan struct{}, fetchCh chan<- *lookupTableTask, workID int) error { +func (e *IndexMergeReaderExecutor) startPartialIndexWorker(ctx context.Context, exitCh <-chan struct{}, fetchCh chan<- *indexMergeTableTask, workID int) error { + failpoint.Inject("testIndexMergeResultChCloseEarly", func(_ failpoint.Value) { + // Wait for processWorker to close resultCh. + time.Sleep(2) + // Should use fetchCh instead of resultCh to send error. + syncErr(ctx, e.finished, fetchCh, errors.New("testIndexMergeResultChCloseEarly")) + }) if e.runtimeStats != nil { collExec := true e.dagPBs[workID].CollectExecutionSummaries = &collExec @@ -284,6 +317,17 @@ func (e *IndexMergeReaderExecutor) startPartialIndexWorker(ctx context.Context, defer e.idxWorkerWg.Done() util.WithRecovery( func() { + failpoint.Inject("testIndexMergePanicPartialIndexWorker", nil) + failpoint.Inject("mockSleepBeforeStartTableReader", func(_ failpoint.Value) { + select { + case <-ctx.Done(): + failpoint.Return() + case <-e.finished: + failpoint.Return() + case <-exitCh: + failpoint.Return() + } + }) worker := &partialIndexWorker{ stats: e.stats, idxID: e.getPartitalPlanID(workID), @@ -291,13 +335,14 @@ func (e *IndexMergeReaderExecutor) startPartialIndexWorker(ctx context.Context, batchSize: e.maxChunkSize, maxBatchSize: e.ctx.GetSessionVars().IndexLookupSize, maxChunkSize: e.maxChunkSize, + memTracker: e.memTracker, } if e.isCorColInPartialFilters[workID] { // We got correlated column, so need to refresh Selection operator. var err error if e.dagPBs[workID].Executors, err = constructDistExec(e.ctx, e.partialPlans[workID]); err != nil { - worker.syncErr(e.resultCh, err) + syncErr(ctx, e.finished, fetchCh, err) return } } @@ -331,12 +376,12 @@ func (e *IndexMergeReaderExecutor) startPartialIndexWorker(ctx context.Context, }) kvReq, err := builder.SetKeyRanges(keyRange).Build() if err != nil { - worker.syncErr(e.resultCh, err) + syncErr(ctx, e.finished, fetchCh, err) return } result, err := distsql.SelectWithRuntimeStats(ctx, e.ctx, kvReq, e.handleCols.GetFieldsTypes(), e.feedbacks[workID], getPhysicalPlanIDs(e.partialPlans[workID]), e.getPartitalPlanID(workID)) if err != nil { - worker.syncErr(e.resultCh, err) + syncErr(ctx, e.finished, fetchCh, err) return } worker.batchSize = e.maxChunkSize @@ -349,7 +394,7 @@ func (e *IndexMergeReaderExecutor) startPartialIndexWorker(ctx context.Context, // fetch all data from this partition ctx1, cancel := context.WithCancel(ctx) - _, fetchErr := worker.fetchHandles(ctx1, result, exitCh, fetchCh, e.resultCh, e.finished, e.handleCols) + _, fetchErr := worker.fetchHandles(ctx1, result, exitCh, fetchCh, e.finished, e.handleCols, parTblIdx) if fetchErr != nil { // this error is synced in fetchHandles(), don't sync it again e.feedbacks[workID].Invalidate() } @@ -363,14 +408,14 @@ func (e *IndexMergeReaderExecutor) startPartialIndexWorker(ctx context.Context, } } }, - e.handleHandlesFetcherPanic(ctx, e.resultCh, "partialIndexWorker"), + handleWorkerPanic(ctx, e.finished, fetchCh, nil, partialIndexWorkerType), ) }() return nil } -func (e *IndexMergeReaderExecutor) startPartialTableWorker(ctx context.Context, exitCh <-chan struct{}, fetchCh chan<- *lookupTableTask, workID int) error { +func (e *IndexMergeReaderExecutor) startPartialTableWorker(ctx context.Context, exitCh <-chan struct{}, fetchCh chan<- *indexMergeTableTask, workID int) error { ts := e.partialPlans[workID][0].(*plannercore.PhysicalTableScan) tbls := make([]table.Table, 0, 1) @@ -387,6 +432,17 @@ func (e *IndexMergeReaderExecutor) startPartialTableWorker(ctx context.Context, defer e.idxWorkerWg.Done() util.WithRecovery( func() { + failpoint.Inject("testIndexMergePanicPartialTableWorker", nil) + failpoint.Inject("mockSleepBeforeStartTableReader", func(_ failpoint.Value) { + select { + case <-ctx.Done(): + failpoint.Return() + case <-e.finished: + failpoint.Return() + case <-exitCh: + failpoint.Return() + } + }) var err error partialTableReader := &TableReaderExecutor{ baseExecutor: newBaseExecutor(e.ctx, ts.Schema(), e.getPartitalPlanID(workID)), @@ -408,17 +464,18 @@ func (e *IndexMergeReaderExecutor) startPartialTableWorker(ctx context.Context, maxBatchSize: e.ctx.GetSessionVars().IndexLookupSize, maxChunkSize: e.maxChunkSize, tableReader: partialTableReader, + memTracker: e.memTracker, } if e.isCorColInPartialFilters[workID] { if e.dagPBs[workID].Executors, err = constructDistExec(e.ctx, e.partialPlans[workID]); err != nil { - worker.syncErr(e.resultCh, err) + syncErr(ctx, e.finished, fetchCh, err) return } partialTableReader.dagPB = e.dagPBs[workID] } - for _, tbl := range tbls { + for parTblIdx, tbl := range tbls { // check if this executor is closed select { case <-e.finished: @@ -430,7 +487,7 @@ func (e *IndexMergeReaderExecutor) startPartialTableWorker(ctx context.Context, partialTableReader.table = tbl if err = partialTableReader.Open(ctx); err != nil { logutil.Logger(ctx).Error("open Select result failed:", zap.Error(err)) - worker.syncErr(e.resultCh, err) + syncErr(ctx, e.finished, fetchCh, err) break } worker.batchSize = e.maxChunkSize @@ -443,7 +500,7 @@ func (e *IndexMergeReaderExecutor) startPartialTableWorker(ctx context.Context, // fetch all handles from this table ctx1, cancel := context.WithCancel(ctx) - _, fetchErr := worker.fetchHandles(ctx1, exitCh, fetchCh, e.resultCh, e.finished, e.handleCols) + _, fetchErr := worker.fetchHandles(ctx1, exitCh, fetchCh, e.finished, e.handleCols, parTblIdx) if fetchErr != nil { // this error is synced in fetchHandles, so don't sync it again e.feedbacks[workID].Invalidate() } @@ -459,7 +516,7 @@ func (e *IndexMergeReaderExecutor) startPartialTableWorker(ctx context.Context, } } }, - e.handleHandlesFetcherPanic(ctx, e.resultCh, "partialTableWorker"), + handleWorkerPanic(ctx, e.finished, fetchCh, nil, partialTableWorkerType), ) }() return nil @@ -470,7 +527,6 @@ func (e *IndexMergeReaderExecutor) initRuntimeStats() { e.stats = &IndexMergeRuntimeStat{ Concurrency: e.ctx.GetSessionVars().IndexLookupConcurrency(), } - e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) } } @@ -496,18 +552,11 @@ type partialTableWorker struct { maxChunkSize int tableReader Executor partition table.PhysicalTable // it indicates if this worker is accessing a particular partition table + memTracker *memory.Tracker } -func (w *partialTableWorker) syncErr(resultCh chan<- *lookupTableTask, err error) { - doneCh := make(chan error, 1) - doneCh <- err - resultCh <- &lookupTableTask{ - doneCh: doneCh, - } -} - -func (w *partialTableWorker) fetchHandles(ctx context.Context, exitCh <-chan struct{}, fetchCh chan<- *lookupTableTask, resultCh chan<- *lookupTableTask, - finished <-chan struct{}, handleCols plannercore.HandleCols) (count int64, err error) { +func (w *partialTableWorker) fetchHandles(ctx context.Context, exitCh <-chan struct{}, fetchCh chan<- *indexMergeTableTask, + finished <-chan struct{}, handleCols plannercore.HandleCols, parTblIdx int) (count int64, err error) { chk := w.sc.GetSessionVars().GetNewChunkWithCapacity(retTypes(w.tableReader), w.maxChunkSize, w.maxChunkSize, w.tableReader.base().AllocPool) var basic *execdetails.BasicRuntimeStats if be := w.tableReader.base(); be != nil && be.runtimeStats != nil { @@ -517,14 +566,14 @@ func (w *partialTableWorker) fetchHandles(ctx context.Context, exitCh <-chan str start := time.Now() handles, retChunk, err := w.extractTaskHandles(ctx, chk, handleCols) if err != nil { - w.syncErr(resultCh, err) + syncErr(ctx, finished, fetchCh, err) return count, err } if len(handles) == 0 { return count, nil } count += int64(len(handles)) - task := w.buildTableTask(handles, retChunk) + task := w.buildTableTask(handles, retChunk, parTblIdx) if w.stats != nil { atomic.AddInt64(&w.stats.FetchIdxTime, int64(time.Since(start))) } @@ -546,6 +595,8 @@ func (w *partialTableWorker) fetchHandles(ctx context.Context, exitCh <-chan str func (w *partialTableWorker) extractTaskHandles(ctx context.Context, chk *chunk.Chunk, handleCols plannercore.HandleCols) ( handles []kv.Handle, retChk *chunk.Chunk, err error) { handles = make([]kv.Handle, 0, w.batchSize) + var memUsage int64 + defer w.memTracker.Consume(-memUsage) for len(handles) < w.batchSize { chk.SetRequiredRows(w.batchSize-len(handles), w.maxChunkSize) err = errors.Trace(w.tableReader.Next(ctx, chk)) @@ -553,8 +604,14 @@ func (w *partialTableWorker) extractTaskHandles(ctx context.Context, chk *chunk. return handles, nil, err } if chk.NumRows() == 0 { + failpoint.Inject("testIndexMergeErrorPartialTableWorker", func(v failpoint.Value) { + failpoint.Return(handles, nil, errors.New(v.(string))) + }) return handles, retChk, nil } + memDelta := chk.MemoryUsage() + memUsage += memDelta + w.memTracker.Consume(memDelta) for i := 0; i < chk.NumRows(); i++ { handle, err := handleCols.BuildHandle(chk.GetRow(i)) if err != nil { @@ -570,19 +627,22 @@ func (w *partialTableWorker) extractTaskHandles(ctx context.Context, chk *chunk. return handles, retChk, nil } -func (w *partialTableWorker) buildTableTask(handles []kv.Handle, retChk *chunk.Chunk) *lookupTableTask { - task := &lookupTableTask{ - handles: handles, - idxRows: retChk, +func (w *partialTableWorker) buildTableTask(handles []kv.Handle, retChk *chunk.Chunk, parTblIdx int) *indexMergeTableTask { + task := &indexMergeTableTask{ + lookupTableTask: lookupTableTask{ + handles: handles, + idxRows: retChk, - partitionTable: w.partition, + partitionTable: w.partition, + }, + parTblIdx: parTblIdx, } task.doneCh = make(chan error, 1) return task } -func (e *IndexMergeReaderExecutor) startIndexMergeTableScanWorker(ctx context.Context, workCh <-chan *lookupTableTask) { +func (e *IndexMergeReaderExecutor) startIndexMergeTableScanWorker(ctx context.Context, workCh <-chan *indexMergeTableTask) { lookupConcurrencyLimit := e.ctx.GetSessionVars().IndexLookupConcurrency() e.tblWorkerWg.Add(lookupConcurrencyLimit) for i := 0; i < lookupConcurrencyLimit; i++ { @@ -597,10 +657,15 @@ func (e *IndexMergeReaderExecutor) startIndexMergeTableScanWorker(ctx context.Co ctx1, cancel := context.WithCancel(ctx) go func() { defer trace.StartRegion(ctx, "IndexMergeTableScanWorker").End() - var task *lookupTableTask + var task *indexMergeTableTask util.WithRecovery( - func() { task = worker.pickAndExecTask(ctx1) }, - worker.handlePickAndExecTaskPanic(ctx1, task), + // Note we use the address of `task` as the argument of both `pickAndExecTask` and `handleTableScanWorkerPanic` + // because `task` is expected to be assigned in `pickAndExecTask`, and this assignment should also be visible + // in `handleTableScanWorkerPanic` since it will get `doneCh` from `task`. Golang always pass argument by value, + // so if we don't use the address of `task` as the argument, the assignment to `task` in `pickAndExecTask` is + // not visible in `handleTableScanWorkerPanic` + func() { worker.pickAndExecTask(ctx1, &task) }, + worker.handleTableScanWorkerPanic(ctx1, e.finished, &task, tableScanWorkerType), ) cancel() e.tblWorkerWg.Done() @@ -622,11 +687,6 @@ func (e *IndexMergeReaderExecutor) buildFinalTableReader(ctx context.Context, tb plans: e.tblPlans, netDataSize: e.dataAvgRowSize * float64(len(handles)), } - if e.isCorColInTableFilter { - if tableReaderExec.dagPB.Executors, err = constructDistExec(e.ctx, e.tblPlans); err != nil { - return nil, err - } - } tableReaderExec.buildVirtualColumnInfo() // Reorder handles because SplitKeyRangesByLocations() requires startKey of kvRanges is ordered. // Also it's good for performance. @@ -666,7 +726,7 @@ func (e *IndexMergeReaderExecutor) Next(ctx context.Context, req *chunk.Chunk) e } } -func (e *IndexMergeReaderExecutor) getResultTask() (*lookupTableTask, error) { +func (e *IndexMergeReaderExecutor) getResultTask() (*indexMergeTableTask, error) { if e.resultCurr != nil && e.resultCurr.cursor < len(e.resultCurr.rows) { return e.resultCurr, nil } @@ -686,31 +746,53 @@ func (e *IndexMergeReaderExecutor) getResultTask() (*lookupTableTask, error) { return e.resultCurr, nil } -func (e *IndexMergeReaderExecutor) handleHandlesFetcherPanic(ctx context.Context, resultCh chan<- *lookupTableTask, worker string) func(r interface{}) { +func handleWorkerPanic(ctx context.Context, finished <-chan struct{}, ch chan<- *indexMergeTableTask, extraNotifyCh chan bool, worker string) func(r interface{}) { return func(r interface{}) { + if worker == processWorkerType { + // There is only one processWorker, so it's safe to close here. + // No need to worry about "close on closed channel" error. + defer close(ch) + } if r == nil { return } - err4Panic := errors.Errorf("panic in IndexMergeReaderExecutor %s: %v", worker, r) + if extraNotifyCh != nil { + extraNotifyCh <- true + } + + err4Panic := errors.Errorf("%s: %v", worker, r) logutil.Logger(ctx).Error(err4Panic.Error()) doneCh := make(chan error, 1) doneCh <- err4Panic - resultCh <- &lookupTableTask{ - doneCh: doneCh, + task := &indexMergeTableTask{ + lookupTableTask: lookupTableTask{ + doneCh: doneCh, + }, + } + select { + case <-ctx.Done(): + return + case <-finished: + return + case ch <- task: + return } } } // Close implements Exec Close interface. func (e *IndexMergeReaderExecutor) Close() error { + if e.stats != nil { + defer e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) + } if e.finished == nil { return nil } close(e.finished) - e.processWokerWg.Wait() e.tblWorkerWg.Wait() e.idxWorkerWg.Wait() + e.processWorkerWg.Wait() e.finished = nil e.workerStarted = false // TODO: how to store e.feedbacks @@ -722,19 +804,34 @@ type indexMergeProcessWorker struct { stats *IndexMergeRuntimeStat } -func (w *indexMergeProcessWorker) fetchLoop(ctx context.Context, fetchCh <-chan *lookupTableTask, - workCh chan<- *lookupTableTask, resultCh chan<- *lookupTableTask, finished <-chan struct{}) { - defer func() { - close(workCh) - close(resultCh) - }() +func (w *indexMergeProcessWorker) fetchLoopUnion(ctx context.Context, fetchCh <-chan *indexMergeTableTask, + workCh chan<- *indexMergeTableTask, resultCh chan<- *indexMergeTableTask, finished <-chan struct{}) { + failpoint.Inject("testIndexMergeResultChCloseEarly", func(_ failpoint.Value) { + failpoint.Return() + }) + memTracker := memory.NewTracker(w.indexMerge.id, -1) + memTracker.AttachTo(w.indexMerge.memTracker) + defer memTracker.Detach() + defer close(workCh) + failpoint.Inject("testIndexMergePanicProcessWorkerUnion", nil) distinctHandles := make(map[int64]*kv.HandleMap) for task := range fetchCh { + select { + case err := <-task.doneCh: + // If got error from partialIndexWorker/partialTableWorker, stop processing. + if err != nil { + syncErr(ctx, finished, resultCh, err) + return + } + default: + } start := time.Now() handles := task.handles fhs := make([]kv.Handle, 0, 8) + memTracker.Consume(int64(cap(task.handles) * 8)) + var tblID int64 if w.indexMerge.partitionTableMode { tblID = getPhysicalTableID(task.partitionTable) @@ -755,11 +852,13 @@ func (w *indexMergeProcessWorker) fetchLoop(ctx context.Context, fetchCh <-chan if len(fhs) == 0 { continue } - task := &lookupTableTask{ - handles: fhs, - doneCh: make(chan error, 1), + task := &indexMergeTableTask{ + lookupTableTask: lookupTableTask{ + handles: fhs, + doneCh: make(chan error, 1), - partitionTable: task.partitionTable, + partitionTable: task.partitionTable, + }, } if w.stats != nil { w.stats.IndexMergeProcess += time.Since(start) @@ -775,20 +874,189 @@ func (w *indexMergeProcessWorker) fetchLoop(ctx context.Context, fetchCh <-chan } } -func (w *indexMergeProcessWorker) handleLoopFetcherPanic(ctx context.Context, resultCh chan<- *lookupTableTask) func(r interface{}) { - return func(r interface{}) { - if r == nil { +type intersectionProcessWorker struct { + // key: parTblIdx, val: HandleMap + // Value of MemAwareHandleMap is *int to avoid extra Get(). + handleMapsPerWorker map[int]*kv.MemAwareHandleMap[*int] + workerID int + workerCh chan *indexMergeTableTask + indexMerge *IndexMergeReaderExecutor + memTracker *memory.Tracker + batchSize int + + // When rowDelta == memConsumeBatchSize, Consume(memUsage) + rowDelta int64 + mapUsageDelta int64 +} + +func (w *intersectionProcessWorker) consumeMemDelta() { + w.memTracker.Consume(w.mapUsageDelta + w.rowDelta*int64(unsafe.Sizeof(int(0)))) + w.mapUsageDelta = 0 + w.rowDelta = 0 +} + +func (w *intersectionProcessWorker) doIntersectionPerPartition(ctx context.Context, workCh chan<- *indexMergeTableTask, resultCh chan<- *indexMergeTableTask, finished <-chan struct{}) { + failpoint.Inject("testIndexMergePanicPartitionTableIntersectionWorker", nil) + defer w.memTracker.Detach() + + for task := range w.workerCh { + var ok bool + var hMap *kv.MemAwareHandleMap[*int] + if hMap, ok = w.handleMapsPerWorker[task.parTblIdx]; !ok { + hMap = kv.NewMemAwareHandleMap[*int]() + w.handleMapsPerWorker[task.parTblIdx] = hMap + } + var mapDelta int64 + var rowDelta int64 + for _, h := range task.handles { + // Use *int to avoid Get() again. + if cntPtr, ok := hMap.Get(h); ok { + (*cntPtr)++ + } else { + cnt := 1 + mapDelta += hMap.Set(h, &cnt) + int64(h.ExtraMemSize()) + rowDelta += 1 + } + } + + logutil.BgLogger().Debug("intersectionProcessWorker handle tasks", zap.Int("workerID", w.workerID), + zap.Int("task.handles", len(task.handles)), zap.Int64("rowDelta", rowDelta)) + + w.mapUsageDelta += mapDelta + w.rowDelta += rowDelta + if w.rowDelta >= int64(w.batchSize) { + w.consumeMemDelta() + } + failpoint.Inject("testIndexMergeIntersectionWorkerPanic", nil) + } + if w.rowDelta > 0 { + w.consumeMemDelta() + } + + // We assume the result of intersection is small, so no need to track memory. + intersectedMap := make(map[int][]kv.Handle, len(w.handleMapsPerWorker)) + for parTblIdx, hMap := range w.handleMapsPerWorker { + hMap.Range(func(h kv.Handle, val interface{}) bool { + if *(val.(*int)) == len(w.indexMerge.partialPlans) { + // Means all partial paths have this handle. + intersectedMap[parTblIdx] = append(intersectedMap[parTblIdx], h) + } + return true + }) + } + + tasks := make([]*indexMergeTableTask, 0, len(w.handleMapsPerWorker)) + for parTblIdx, intersected := range intersectedMap { + // Split intersected[parTblIdx] to avoid task is too large. + for len(intersected) > 0 { + length := w.batchSize + if length > len(intersected) { + length = len(intersected) + } + task := &indexMergeTableTask{ + lookupTableTask: lookupTableTask{ + handles: intersected[:length], + doneCh: make(chan error, 1), + }, + } + intersected = intersected[length:] + if w.indexMerge.partitionTableMode { + task.partitionTable = w.indexMerge.prunedPartitions[parTblIdx] + } + tasks = append(tasks, task) + logutil.BgLogger().Debug("intersectionProcessWorker build tasks", + zap.Int("parTblIdx", parTblIdx), zap.Int("task.handles", len(task.handles))) + } + } + for _, task := range tasks { + select { + case <-ctx.Done(): return + case <-finished: + return + case workCh <- task: + resultCh <- task } + } +} - err4Panic := errors.Errorf("panic in IndexMergeReaderExecutor indexMergeTableWorker: %v", r) - logutil.Logger(ctx).Error(err4Panic.Error()) - doneCh := make(chan error, 1) - doneCh <- err4Panic - resultCh <- &lookupTableTask{ - doneCh: doneCh, +// For each partition(dynamic mode), a map is used to do intersection. Key of the map is handle, and value is the number of times it occurs. +// If the value of handle equals the number of partial paths, it should be sent to final_table_scan_worker. +// To avoid too many goroutines, each intersectionProcessWorker can handle multiple partitions. +func (w *indexMergeProcessWorker) fetchLoopIntersection(ctx context.Context, fetchCh <-chan *indexMergeTableTask, + workCh chan<- *indexMergeTableTask, resultCh chan<- *indexMergeTableTask, finished <-chan struct{}) { + defer close(workCh) + + if w.stats != nil { + start := time.Now() + defer func() { + w.stats.IndexMergeProcess += time.Since(start) + }() + } + + failpoint.Inject("testIndexMergePanicProcessWorkerIntersection", nil) + + // One goroutine may handle one or multiple partitions. + // Max number of partition number is 8192, we use ExecutorConcurrency to avoid too many goroutines. + maxWorkerCnt := w.indexMerge.ctx.GetSessionVars().IndexMergeIntersectionConcurrency() + maxChannelSize := atomic.LoadInt32(&LookupTableTaskChannelSize) + batchSize := w.indexMerge.ctx.GetSessionVars().IndexLookupSize + + partCnt := 1 + if w.indexMerge.partitionTableMode { + partCnt = len(w.indexMerge.prunedPartitions) + } + workerCnt := mathutil.Min(partCnt, maxWorkerCnt) + failpoint.Inject("testIndexMergeIntersectionConcurrency", func(val failpoint.Value) { + con := val.(int) + if con != workerCnt { + panic(fmt.Sprintf("unexpected workerCnt, expect %d, got %d", con, workerCnt)) + } + }) + + workers := make([]*intersectionProcessWorker, 0, workerCnt) + wg := util.WaitGroupWrapper{} + errCh := make(chan bool, workerCnt) + for i := 0; i < workerCnt; i++ { + tracker := memory.NewTracker(w.indexMerge.id, -1) + tracker.AttachTo(w.indexMerge.memTracker) + worker := &intersectionProcessWorker{ + workerID: i, + handleMapsPerWorker: make(map[int]*kv.MemAwareHandleMap[*int]), + workerCh: make(chan *indexMergeTableTask, maxChannelSize), + indexMerge: w.indexMerge, + memTracker: tracker, + batchSize: batchSize, + } + wg.RunWithRecover(func() { + defer trace.StartRegion(ctx, "IndexMergeIntersectionProcessWorker").End() + worker.doIntersectionPerPartition(ctx, workCh, resultCh, finished) + }, handleWorkerPanic(ctx, finished, resultCh, errCh, partTblIntersectionWorkerType)) + workers = append(workers, worker) + } +loop: + for task := range fetchCh { + select { + case err := <-task.doneCh: + // If got error from partialIndexWorker/partialTableWorker, stop processing. + if err != nil { + syncErr(ctx, finished, resultCh, err) + break loop + } + default: + } + + select { + case workers[task.parTblIdx%workerCnt].workerCh <- task: + case <-errCh: + // If got error from intersectionProcessWorker, stop processing. + break loop } } + for _, processWorker := range workers { + close(processWorker.workerCh) + } + wg.Wait() } type partialIndexWorker struct { @@ -799,13 +1067,27 @@ type partialIndexWorker struct { maxBatchSize int maxChunkSize int partition table.PhysicalTable // it indicates if this worker is accessing a particular partition table + memTracker *memory.Tracker } -func (w *partialIndexWorker) syncErr(resultCh chan<- *lookupTableTask, err error) { +func syncErr(ctx context.Context, finished <-chan struct{}, errCh chan<- *indexMergeTableTask, err error) { + logutil.BgLogger().Error("IndexMergeReaderExecutor.syncErr", zap.Error(err)) doneCh := make(chan error, 1) doneCh <- err - resultCh <- &lookupTableTask{ - doneCh: doneCh, + task := &indexMergeTableTask{ + lookupTableTask: lookupTableTask{ + doneCh: doneCh, + }, + } + + // ctx.Done and finished is to avoid write channel is stuck. + select { + case <-ctx.Done(): + return + case <-finished: + return + case errCh <- task: + return } } @@ -813,23 +1095,22 @@ func (w *partialIndexWorker) fetchHandles( ctx context.Context, result distsql.SelectResult, exitCh <-chan struct{}, - fetchCh chan<- *lookupTableTask, - resultCh chan<- *lookupTableTask, + fetchCh chan<- *indexMergeTableTask, finished <-chan struct{}, - handleCols plannercore.HandleCols) (count int64, err error) { + handleCols plannercore.HandleCols, + parTblIdx int) (count int64, err error) { chk := chunk.NewChunkWithCapacity(handleCols.GetFieldsTypes(), w.maxChunkSize) var basicStats *execdetails.BasicRuntimeStats if w.stats != nil { if w.idxID != 0 { - basicStats = &execdetails.BasicRuntimeStats{} - w.sc.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(w.idxID, basicStats) + basicStats = w.sc.GetSessionVars().StmtCtx.RuntimeStatsColl.GetBasicRuntimeStats(w.idxID) } } for { start := time.Now() handles, retChunk, err := w.extractTaskHandles(ctx, chk, result, handleCols) if err != nil { - w.syncErr(resultCh, err) + syncErr(ctx, finished, fetchCh, err) return count, err } if len(handles) == 0 { @@ -839,7 +1120,7 @@ func (w *partialIndexWorker) fetchHandles( return count, nil } count += int64(len(handles)) - task := w.buildTableTask(handles, retChunk) + task := w.buildTableTask(handles, retChunk, parTblIdx) if w.stats != nil { atomic.AddInt64(&w.stats.FetchIdxTime, int64(time.Since(start))) } @@ -861,6 +1142,8 @@ func (w *partialIndexWorker) fetchHandles( func (w *partialIndexWorker) extractTaskHandles(ctx context.Context, chk *chunk.Chunk, idxResult distsql.SelectResult, handleCols plannercore.HandleCols) ( handles []kv.Handle, retChk *chunk.Chunk, err error) { handles = make([]kv.Handle, 0, w.batchSize) + var memUsage int64 + defer w.memTracker.Consume(-memUsage) for len(handles) < w.batchSize { chk.SetRequiredRows(w.batchSize-len(handles), w.maxChunkSize) err = errors.Trace(idxResult.Next(ctx, chk)) @@ -868,8 +1151,14 @@ func (w *partialIndexWorker) extractTaskHandles(ctx context.Context, chk *chunk. return handles, nil, err } if chk.NumRows() == 0 { + failpoint.Inject("testIndexMergeErrorPartialIndexWorker", func(v failpoint.Value) { + failpoint.Return(handles, nil, errors.New(v.(string))) + }) return handles, retChk, nil } + memDelta := chk.MemoryUsage() + memUsage += memDelta + w.memTracker.Consume(memDelta) for i := 0; i < chk.NumRows(); i++ { handle, err := handleCols.BuildHandleFromIndexRow(chk.GetRow(i)) if err != nil { @@ -885,12 +1174,15 @@ func (w *partialIndexWorker) extractTaskHandles(ctx context.Context, chk *chunk. return handles, retChk, nil } -func (w *partialIndexWorker) buildTableTask(handles []kv.Handle, retChk *chunk.Chunk) *lookupTableTask { - task := &lookupTableTask{ - handles: handles, - idxRows: retChk, +func (w *partialIndexWorker) buildTableTask(handles []kv.Handle, retChk *chunk.Chunk, parTblIdx int) *indexMergeTableTask { + task := &indexMergeTableTask{ + lookupTableTask: lookupTableTask{ + handles: handles, + idxRows: retChk, - partitionTable: w.partition, + partitionTable: w.partition, + }, + parTblIdx: parTblIdx, } task.doneCh = make(chan error, 1) @@ -899,7 +1191,7 @@ func (w *partialIndexWorker) buildTableTask(handles []kv.Handle, retChk *chunk.C type indexMergeTableScanWorker struct { stats *IndexMergeRuntimeStat - workCh <-chan *lookupTableTask + workCh <-chan *indexMergeTableTask finished <-chan struct{} indexMergeExec *IndexMergeReaderExecutor tblPlans []plannercore.PhysicalPlan @@ -908,42 +1200,63 @@ type indexMergeTableScanWorker struct { memTracker *memory.Tracker } -func (w *indexMergeTableScanWorker) pickAndExecTask(ctx context.Context) (task *lookupTableTask) { +func (w *indexMergeTableScanWorker) pickAndExecTask(ctx context.Context, task **indexMergeTableTask) { var ok bool for { waitStart := time.Now() select { - case task, ok = <-w.workCh: + case *task, ok = <-w.workCh: if !ok { return } case <-w.finished: return } + // Make sure panic failpoint is after fetch task from workCh. + // Otherwise cannot send error to task.doneCh. + failpoint.Inject("testIndexMergePanicTableScanWorker", nil) + failpoint.Inject("mockSleepBeforeStartTableReader", func(_ failpoint.Value) { + select { + case <-ctx.Done(): + failpoint.Return() + case <-w.finished: + failpoint.Return() + } + }) execStart := time.Now() - err := w.executeTask(ctx, task) + err := w.executeTask(ctx, *task) if w.stats != nil { atomic.AddInt64(&w.stats.WaitTime, int64(execStart.Sub(waitStart))) atomic.AddInt64(&w.stats.FetchRow, int64(time.Since(execStart))) atomic.AddInt64(&w.stats.TableTaskNum, 1) } - task.doneCh <- err + failpoint.Inject("testIndexMergePickAndExecTaskPanic", nil) + (*task).doneCh <- err } } -func (w *indexMergeTableScanWorker) handlePickAndExecTaskPanic(ctx context.Context, task *lookupTableTask) func(r interface{}) { +func (w *indexMergeTableScanWorker) handleTableScanWorkerPanic(ctx context.Context, finished <-chan struct{}, task **indexMergeTableTask, worker string) func(r interface{}) { return func(r interface{}) { if r == nil { return } - err4Panic := errors.Errorf("panic in IndexMergeReaderExecutor indexMergeTableWorker: %v", r) + err4Panic := errors.Errorf("%s: %v", worker, r) logutil.Logger(ctx).Error(err4Panic.Error()) - task.doneCh <- err4Panic + if *task != nil { + select { + case <-ctx.Done(): + return + case <-finished: + return + case (*task).doneCh <- err4Panic: + return + } + } } } -func (w *indexMergeTableScanWorker) executeTask(ctx context.Context, task *lookupTableTask) error { +func (w *indexMergeTableScanWorker) executeTask(ctx context.Context, task *indexMergeTableTask) error { tbl := w.indexMergeExec.table if w.indexMergeExec.partitionTableMode { tbl = task.partitionTable diff --git a/executor/index_merge_reader_test.go b/executor/index_merge_reader_test.go index 58dfa71814f28..be1ff66a163ab 100644 --- a/executor/index_merge_reader_test.go +++ b/executor/index_merge_reader_test.go @@ -23,7 +23,9 @@ import ( "testing" "time" + "github.com/pingcap/failpoint" "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/testkit/testutil" "github.com/pingcap/tidb/util" "github.com/stretchr/testify/require" ) @@ -49,6 +51,25 @@ func TestSingleTableRead(t *testing.T) { tk.MustQuery("select /*+ use_index_merge(t1, t1a, t1b) */ sum(a) from t1 where a < 2 or b > 4").Check(testkit.Rows("6")) } +func TestIndexMergePickAndExecTaskPanic(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(id int primary key, a int, b int, c int, d int)") + tk.MustExec("create index t1a on t1(a)") + tk.MustExec("create index t1b on t1(b)") + tk.MustExec("insert into t1 values(1,1,1,1,1),(2,2,2,2,2),(3,3,3,3,3),(4,4,4,4,4),(5,5,5,5,5)") + tk.MustQuery("select /*+ use_index_merge(t1, primary, t1a) */ * from t1 where id < 2 or a > 4 order by id").Check(testkit.Rows("1 1 1 1 1", + "5 5 5 5 5")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/testIndexMergePickAndExecTaskPanic", "panic(\"pickAndExecTaskPanic\")")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/testIndexMergePickAndExecTaskPanic")) + }() + err := tk.QueryToErr("select /*+ use_index_merge(t1, primary, t1a) */ * from t1 where id < 2 or a > 4 order by id") + require.Contains(t, err.Error(), "pickAndExecTaskPanic") +} + func TestJoin(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -86,7 +107,7 @@ func TestIndexMergeReaderIssue25045(t *testing.T) { tk.MustExec("create table t1(a int primary key, b int, c int, key(b), key(c));") tk.MustExec("INSERT INTO t1 VALUES (10, 10, 10), (11, 11, 11)") tk.MustQuery("explain format='brief' select /*+ use_index_merge(t1) */ * from t1 where c=10 or (b=10 and a=10);").Check(testkit.Rows( - "IndexMerge 0.01 root ", + "IndexMerge 0.01 root type: union", "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, index:c(c) range:[10,10], keep order:false, stats:pseudo", "├─TableRangeScan(Build) 1.00 cop[tikv] table:t1 range:[10,10], keep order:false, stats:pseudo", "└─Selection(Probe) 0.01 cop[tikv] or(eq(test.t1.c, 10), and(eq(test.t1.b, 10), eq(test.t1.a, 10)))", @@ -230,44 +251,64 @@ func TestIndexMergeInTransaction(t *testing.T) { tk.MustExec("begin;") // Expect two IndexScan(c1, c2). tk.MustQuery("explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and c3 < 10;").Check(testkit.Rows( - "IndexMerge_9 1841.86 root ", + "IndexMerge_9 1841.86 root type: union", "├─IndexRangeScan_5(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo", "├─IndexRangeScan_6(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo", "└─Selection_8(Probe) 1841.86 cop[tikv] lt(test.t1.c3, 10)", " └─TableRowIDScan_7 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo")) // Expect one IndexScan(c2) and one TableScan(pk). tk.MustQuery("explain select /*+ use_index_merge(t1) */ * from t1 where (pk < 10 or c2 < 10) and c3 < 10;").Check(testkit.Rows( - "IndexMerge_9 1106.67 root ", + "IndexMerge_9 1106.67 root type: union", "├─TableRangeScan_5(Build) 3333.33 cop[tikv] table:t1 range:[-inf,10), keep order:false, stats:pseudo", "├─IndexRangeScan_6(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo", "└─Selection_8(Probe) 1106.67 cop[tikv] lt(test.t1.c3, 10)", " └─TableRowIDScan_7 3330.01 cop[tikv] table:t1 keep order:false, stats:pseudo")) + tk.MustQuery("explain select /*+ use_index_merge(t1, c1, c2, c3) */ * from t1 where c1 < 10 and c2 < 10 and c3 < 10;").Check(testkit.Rows( + "IndexMerge_9 367.05 root type: intersection", + "├─IndexRangeScan_5(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo", + "├─IndexRangeScan_6(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo", + "├─IndexRangeScan_7(Build) 3323.33 cop[tikv] table:t1, index:c3(c3) range:[-inf,10), keep order:false, stats:pseudo", + "└─TableRowIDScan_8(Probe) 367.05 cop[tikv] table:t1 keep order:false, stats:pseudo")) // Test with normal key. tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < -1) and c3 < 10;").Check(testkit.Rows()) tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < -1 or c2 < 10) and c3 < 10;").Check(testkit.Rows()) + tk.MustQuery("select /*+ use_index_merge(t1, c1, c2, c3) */ * from t1 where (c1 < 10 and c2 < -1) and c3 < 10;").Check(testkit.Rows()) + tk.MustQuery("select /*+ use_index_merge(t1, c1, c2, c3) */ * from t1 where (c1 < -1 and c2 < 10) and c3 < 10;").Check(testkit.Rows()) + tk.MustExec("insert into t1 values(1, 1, 1, 1);") tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < -1) and c3 < 10;").Check(testkit.Rows("1 1 1 1")) tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < -1 or c2 < 10) and c3 < 10;").Check(testkit.Rows("1 1 1 1")) + tk.MustQuery("select /*+ use_index_merge(t1, c1, c2, c3) */ * from t1 where (c1 < 10 and c2 < 10) and c3 < 10;").Check(testkit.Rows("1 1 1 1")) + tk.MustQuery("select /*+ use_index_merge(t1, c1, c2, c3) */ * from t1 where (c1 < 10 and c2 < 10) and c3 > 10;").Check(testkit.Rows()) + tk.MustExec("update t1 set c3 = 100 where c3 = 1;") tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < -1) and c3 < 10;").Check(testkit.Rows()) tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < -1 or c2 < 10) and c3 < 10;").Check(testkit.Rows()) + tk.MustQuery("select /*+ use_index_merge(t1, c1, c2, c3) */ * from t1 where (c1 < 10 and c2 < 10) and c3 > 10;").Check(testkit.Rows("1 1 100 1")) + tk.MustExec("delete from t1;") tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < -1) and c3 < 10;").Check(testkit.Rows()) tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < -1 or c2 < 10) and c3 < 10;").Check(testkit.Rows()) + tk.MustQuery("select /*+ use_index_merge(t1, c1, c2, c3) */ * from t1 where (c1 < 10 and c2 < 10) and c3 > 10;").Check(testkit.Rows()) // Test with primary key, so the partialPlan is TableScan. tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (pk < -1 or c2 < 10) and c3 < 10;").Check(testkit.Rows()) tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (pk < 10 or c2 < -1) and c3 < 10;").Check(testkit.Rows()) + tk.MustQuery("select /*+ use_index_merge(t1, c2, c3, primary) */ * from t1 where (pk < -1 and c2 < 10) and c3 < 10;").Check(testkit.Rows()) + tk.MustQuery("select /*+ use_index_merge(t1, c2, c3, primary) */ * from t1 where (pk < 10 and c2 < -1) and c3 < 10;").Check(testkit.Rows()) tk.MustExec("insert into t1 values(1, 1, 1, 1);") tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (pk < -1 or c2 < 10) and c3 < 10;").Check(testkit.Rows("1 1 1 1")) tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (pk < 10 or c2 < -1) and c3 < 10;").Check(testkit.Rows("1 1 1 1")) + tk.MustQuery("select /*+ use_index_merge(t1, c2, c3, primary) */ * from t1 where (pk < 10 and c2 < 10) and c3 < 10;").Check(testkit.Rows("1 1 1 1")) tk.MustExec("update t1 set c3 = 100 where c3 = 1;") tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (pk < -1 or c2 < 10) and c3 < 10;").Check(testkit.Rows()) tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (pk < 10 or c2 < -1) and c3 < 10;").Check(testkit.Rows()) + tk.MustQuery("select /*+ use_index_merge(t1, c2, c3, primary) */ * from t1 where (pk < 10 and c2 < 10) and c3 > 10;").Check(testkit.Rows("1 1 100 1")) tk.MustExec("delete from t1;") tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (pk < -1 or c2 < 10) and c3 < 10;").Check(testkit.Rows()) tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (pk < 10 or c2 < -1) and c3 < 10;").Check(testkit.Rows()) + tk.MustQuery("select /*+ use_index_merge(t1, c2, c3, primary) */ * from t1 where (pk < 10 and c2 < 10) and c3 > 10;").Check(testkit.Rows()) tk.MustExec("commit;") if i == 1 { @@ -281,14 +322,14 @@ func TestIndexMergeInTransaction(t *testing.T) { tk.MustExec("begin;") tk.MustQuery("explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and c3 < 10 for update;").Check(testkit.Rows( "SelectLock_6 1841.86 root for update 0", - "└─IndexMerge_11 1841.86 root ", + "└─IndexMerge_11 1841.86 root type: union", " ├─IndexRangeScan_7(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo", " ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo", " └─Selection_10(Probe) 1841.86 cop[tikv] lt(test.t1.c3, 10)", " └─TableRowIDScan_9 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo")) tk.MustQuery("explain select /*+ use_index_merge(t1) */ * from t1 where (pk < 10 or c2 < 10) and c3 < 10 for update;").Check(testkit.Rows( "SelectLock_6 1106.67 root for update 0", - "└─IndexMerge_11 1106.67 root ", + "└─IndexMerge_11 1106.67 root type: union", " ├─TableRangeScan_7(Build) 3333.33 cop[tikv] table:t1 range:[-inf,10), keep order:false, stats:pseudo", " ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo", " └─Selection_10(Probe) 1106.67 cop[tikv] lt(test.t1.c3, 10)", @@ -403,7 +444,7 @@ func TestIndexMergeReaderInTransIssue30685(t *testing.T) { tk.MustExec("insert into t1 values(1, 1, 1, 1);") tk.MustQuery("explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < -1 or c3 < 10) and c4 < 10;").Check(testkit.Rows( "UnionScan_6 1841.86 root lt(test.t1.c4, 10), or(lt(test.t1.c1, -1), lt(test.t1.c3, 10))", - "└─IndexMerge_11 1841.86 root ", + "└─IndexMerge_11 1841.86 root type: union", " ├─TableRangeScan_7(Build) 3323.33 cop[tikv] table:t1 range:[-inf,-1), keep order:false, stats:pseudo", " ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c3(c3) range:[-inf,10), keep order:false, stats:pseudo", " └─Selection_10(Probe) 1841.86 cop[tikv] lt(test.t1.c4, 10)", @@ -422,7 +463,7 @@ func TestIndexMergeReaderInTransIssue30685(t *testing.T) { tk.MustExec("insert into t1 values('b', 1, 1, 1);") tk.MustQuery("explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 'a' or c3 < 10) and c4 < 10;").Check(testkit.Rows( "UnionScan_6 1841.86 root lt(test.t1.c4, 10), or(lt(test.t1.c1, \"a\"), lt(test.t1.c3, 10))", - "└─IndexMerge_11 1841.86 root ", + "└─IndexMerge_11 1841.86 root type: union", " ├─TableRangeScan_7(Build) 3323.33 cop[tikv] table:t1 range:[-inf,\"a\"), keep order:false, stats:pseudo", " ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c3(c3) range:[-inf,10), keep order:false, stats:pseudo", " └─Selection_10(Probe) 1841.86 cop[tikv] lt(test.t1.c4, 10)", @@ -524,19 +565,19 @@ func TestPessimisticLockOnPartitionForIndexMerge(t *testing.T) { " ├─IndexReader(Build) 3.00 root index:IndexFullScan", " │ └─IndexFullScan 3.00 cop[tikv] table:t2, index:c_datetime(c_datetime) keep order:false", " └─PartitionUnion(Probe) 5545.21 root ", - " ├─IndexMerge 5542.21 root ", + " ├─IndexMerge 5542.21 root type: union", " │ ├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t1, partition:p0, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo", " │ ├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t1, partition:p0, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo", " │ └─TableRowIDScan(Probe) 5542.21 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", - " ├─IndexMerge 1.00 root ", + " ├─IndexMerge 1.00 root type: union", " │ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:c1(c1) range:[-inf,10), keep order:false", " │ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:c2(c2) range:[-inf,10), keep order:false", " │ └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t1, partition:p1 keep order:false", - " ├─IndexMerge 1.00 root ", + " ├─IndexMerge 1.00 root type: union", " │ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p2, index:c1(c1) range:[-inf,10), keep order:false", " │ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p2, index:c2(c2) range:[-inf,10), keep order:false", " │ └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t1, partition:p2 keep order:false", - " └─IndexMerge 1.00 root ", + " └─IndexMerge 1.00 root type: union", " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p3, index:c1(c1) range:[-inf,10), keep order:false", " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p3, index:c2(c2) range:[-inf,10), keep order:false", " └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t1, partition:p3 keep order:false", @@ -566,3 +607,277 @@ func TestPessimisticLockOnPartitionForIndexMerge(t *testing.T) { // TODO: add support for index merge reader in dynamic tidb_partition_prune_mode } + +func TestIndexMergeIntersectionConcurrency(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(c1 int, c2 bigint, c3 bigint, primary key(c1), key(c2), key(c3)) partition by hash(c1) partitions 10;") + tk.MustExec("insert into t1 values(1, 1, 3000), (2, 1, 1)") + tk.MustExec("analyze table t1;") + tk.MustExec("set tidb_partition_prune_mode = 'dynamic'") + res := tk.MustQuery("explain select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c2 < 1024 and c3 > 1024").Rows() + require.Contains(t, res[1][0], "IndexMerge") + + // Default is tidb_executor_concurrency. + res = tk.MustQuery("select @@tidb_executor_concurrency;").Sort().Rows() + defExecCon := res[0][0].(string) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/testIndexMergeIntersectionConcurrency", fmt.Sprintf("return(%s)", defExecCon))) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/testIndexMergeIntersectionConcurrency")) + }() + tk.MustQuery("select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c2 < 1024 and c3 > 1024").Check(testkit.Rows("1")) + + tk.MustExec("set tidb_executor_concurrency = 10") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/testIndexMergeIntersectionConcurrency", "return(10)")) + tk.MustQuery("select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c2 < 1024 and c3 > 1024").Check(testkit.Rows("1")) + // workerCnt = min(part_num, concurrency) + tk.MustExec("set tidb_executor_concurrency = 20") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/testIndexMergeIntersectionConcurrency", "return(10)")) + tk.MustQuery("select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c2 < 1024 and c3 > 1024").Check(testkit.Rows("1")) + tk.MustExec("set tidb_executor_concurrency = 2") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/testIndexMergeIntersectionConcurrency", "return(2)")) + tk.MustQuery("select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c2 < 1024 and c3 > 1024").Check(testkit.Rows("1")) + + tk.MustExec("set tidb_index_merge_intersection_concurrency = 9") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/testIndexMergeIntersectionConcurrency", "return(9)")) + tk.MustQuery("select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c2 < 1024 and c3 > 1024").Check(testkit.Rows("1")) + tk.MustExec("set tidb_index_merge_intersection_concurrency = 21") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/testIndexMergeIntersectionConcurrency", "return(10)")) + tk.MustQuery("select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c2 < 1024 and c3 > 1024").Check(testkit.Rows("1")) + tk.MustExec("set tidb_index_merge_intersection_concurrency = 3") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/testIndexMergeIntersectionConcurrency", "return(3)")) + tk.MustQuery("select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c2 < 1024 and c3 > 1024").Check(testkit.Rows("1")) + + // Concurrency only works for dynamic pruning partition table, so real concurrency is 1. + tk.MustExec("set tidb_partition_prune_mode = 'static'") + tk.MustExec("set tidb_index_merge_intersection_concurrency = 9") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/testIndexMergeIntersectionConcurrency", "return(1)")) + tk.MustQuery("select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c2 < 1024 and c3 > 1024").Check(testkit.Rows("1")) + + // Concurrency only works for dynamic pruning partition table. so real concurrency is 1. + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(c1 int, c2 bigint, c3 bigint, primary key(c1), key(c2), key(c3));") + tk.MustExec("insert into t1 values(1, 1, 3000), (2, 1, 1)") + tk.MustExec("set tidb_index_merge_intersection_concurrency = 9") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/testIndexMergeIntersectionConcurrency", "return(1)")) + tk.MustQuery("select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c2 < 1024 and c3 > 1024").Check(testkit.Rows("1")) +} + +func TestIntersectionWithDifferentConcurrency(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + var execCon []int + tblSchemas := []string{ + // partition table + "create table t1(c1 int, c2 bigint, c3 bigint, primary key(c1), key(c2), key(c3)) partition by hash(c1) partitions 10;", + // non-partition table + "create table t1(c1 int, c2 bigint, c3 bigint, primary key(c1), key(c2), key(c3));", + } + + for tblIdx, tblSchema := range tblSchemas { + if tblIdx == 0 { + // Test different intersectionProcessWorker with partition table(10 partitions). + execCon = []int{1, 3, 10, 11, 20} + } else { + // Default concurrency. + execCon = []int{5} + } + tk.MustExec("use test") + tk.MustExec("drop table if exists t1;") + tk.MustExec(tblSchema) + + const queryCnt int = 10 + const rowCnt int = 1000 + curRowCnt := 0 + insertStr := "insert into t1 values" + for i := 0; i < rowCnt; i++ { + if i != 0 { + insertStr += ", " + } + insertStr += fmt.Sprintf("(%d, %d, %d)", i, rand.Int(), rand.Int()) + curRowCnt++ + } + tk.MustExec(insertStr) + tk.MustExec("analyze table t1") + + for _, concurrency := range execCon { + tk.MustExec(fmt.Sprintf("set tidb_executor_concurrency = %d", concurrency)) + for i := 0; i < 2; i++ { + if i == 0 { + // Dynamic mode. + tk.MustExec("set tidb_partition_prune_mode = 'dynamic'") + res := tk.MustQuery("explain select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c2 < 1024 and c3 > 1024") + require.Contains(t, res.Rows()[1][0], "IndexMerge") + } else { + tk.MustExec("set tidb_partition_prune_mode = 'static'") + res := tk.MustQuery("explain select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c2 < 1024 and c3 > 1024") + if tblIdx == 0 { + // partition table + require.Contains(t, res.Rows()[1][0], "PartitionUnion") + require.Contains(t, res.Rows()[2][0], "IndexMerge") + } else { + require.Contains(t, res.Rows()[1][0], "IndexMerge") + } + } + for i := 0; i < queryCnt; i++ { + c3 := rand.Intn(1024) + res := tk.MustQuery(fmt.Sprintf("select /*+ no_index_merge() */ c1 from t1 where c2 < 1024 and c3 > %d", c3)).Sort().Rows() + tk.MustQuery(fmt.Sprintf("select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c2 < 1024 and c3 > %d", c3)).Sort().Check(res) + } + + // In tranaction + for i := 0; i < queryCnt; i++ { + tk.MustExec("begin;") + r := rand.Intn(3) + if r == 0 { + tk.MustExec(fmt.Sprintf("update t1 set c3 = %d where c1 = %d", rand.Int(), rand.Intn(rowCnt))) + } else if r == 1 { + tk.MustExec(fmt.Sprintf("delete from t1 where c1 = %d", rand.Intn(rowCnt))) + } else if r == 2 { + tk.MustExec(fmt.Sprintf("insert into t1 values(%d, %d, %d)", curRowCnt, rand.Int(), rand.Int())) + curRowCnt++ + } + c3 := rand.Intn(1024) + res := tk.MustQuery(fmt.Sprintf("select /*+ no_index_merge() */ c1 from t1 where c2 < 1024 and c3 > %d", c3)).Sort().Rows() + tk.MustQuery(fmt.Sprintf("select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c2 < 1024 and c3 > %d", c3)).Sort().Check(res) + tk.MustExec("commit;") + } + } + } + tk.MustExec("drop table t1") + } +} + +func TestIntersectionWorkerPanic(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(c1 int, c2 bigint, c3 bigint, primary key(c1), key(c2), key(c3)) partition by hash(c1) partitions 10;") + tk.MustExec("insert into t1 values(1, 1, 3000), (2, 1, 1)") + tk.MustExec("analyze table t1;") + tk.MustExec("set tidb_partition_prune_mode = 'dynamic'") + res := tk.MustQuery("explain select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c2 < 1024 and c3 > 1024").Rows() + require.Contains(t, res[1][0], "IndexMerge") + + // Test panic in intersection. + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/testIndexMergeIntersectionWorkerPanic", `panic("testIndexMergeIntersectionWorkerPanic")`)) + err := tk.QueryToErr("select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c2 < 1024 and c3 > 1024") + require.Contains(t, err.Error(), "testIndexMergeIntersectionWorkerPanic") + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/testIndexMergeIntersectionWorkerPanic")) +} + +func TestIntersectionMemQuota(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(pk varchar(100) primary key, c1 int, c2 int, index idx1(c1), index idx2(c2))") + + insertStr := "insert into t1 values" + for i := 0; i < 20; i++ { + if i != 0 { + insertStr += ", " + } + insertStr += fmt.Sprintf("('%s', %d, %d)", testutil.RandStringRunes(100), 1, 1) + } + tk.MustExec(insertStr) + res := tk.MustQuery("explain select /*+ use_index_merge(t1, primary, idx1, idx2) */ c1 from t1 where c1 < 1024 and c2 < 1024").Rows() + require.Contains(t, res[1][0], "IndexMerge") + + tk.MustExec("set global tidb_mem_oom_action='CANCEL'") + defer tk.MustExec("set global tidb_mem_oom_action = DEFAULT") + tk.MustExec("set @@tidb_mem_quota_query = 4000") + err := tk.QueryToErr("select /*+ use_index_merge(t1, primary, idx1, idx2) */ c1 from t1 where c1 < 1024 and c2 < 1024") + require.Contains(t, err.Error(), "Out Of Memory Quota!") +} + +func TestIndexMergePanic(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(c1 int, c2 bigint, c3 bigint, primary key(c1), key(c2), key(c3));") + tk.MustExec("insert into t1 values(1, 1, 1), (100, 100, 100)") + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/testIndexMergeResultChCloseEarly", "return(true)")) + tk.MustExec("select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c1 < 100 or c2 < 100") + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/testIndexMergeResultChCloseEarly")) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(c1 int, c2 bigint, c3 bigint, primary key(c1), key(c2), key(c3)) partition by hash(c1) partitions 10;") + insertStr := "insert into t1 values(0, 0, 0)" + for i := 1; i < 1000; i++ { + insertStr += fmt.Sprintf(", (%d, %d, %d)", i, i, i) + } + tk.MustExec(insertStr) + tk.MustExec("analyze table t1;") + tk.MustExec("set tidb_partition_prune_mode = 'dynamic'") + + minV := 200 + maxV := 1000 + runSQL := func(fp string) { + var sql string + v1 := rand.Intn(maxV-minV) + minV + v2 := rand.Intn(maxV-minV) + minV + if !strings.Contains(fp, "Intersection") { + sql = fmt.Sprintf("select /*+ use_index_merge(t1) */ c1 from t1 where c1 < %d or c2 < %d;", v1, v2) + } else { + sql = fmt.Sprintf("select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c3 < %d and c2 < %d", v1, v2) + } + res := tk.MustQuery("explain " + sql).Rows() + require.Contains(t, res[1][0], "IndexMerge") + err := tk.QueryToErr(sql) + require.Contains(t, err.Error(), fp) + } + + packagePath := "github.com/pingcap/tidb/executor/" + panicFPPaths := []string{ + packagePath + "testIndexMergePanicPartialIndexWorker", + packagePath + "testIndexMergePanicPartialTableWorker", + + packagePath + "testIndexMergePanicProcessWorkerUnion", + packagePath + "testIndexMergePanicProcessWorkerIntersection", + packagePath + "testIndexMergePanicPartitionTableIntersectionWorker", + + packagePath + "testIndexMergePanicTableScanWorker", + } + for _, fp := range panicFPPaths { + fmt.Println("handling failpoint: ", fp) + if !strings.Contains(fp, "testIndexMergePanicTableScanWorker") { + // When mockSleepBeforeStartTableReader is enabled, will not read real data. This is to avoid leaking goroutines in coprocessor. + // But should disable mockSleepBeforeStartTableReader for testIndexMergePanicTableScanWorker. + // Because finalTableScanWorker need task.doneCh to pass error, so need partialIndexWorker/partialTableWorker runs normally. + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/mockSleepBeforeStartTableReader", "return(1000)")) + } + for i := 0; i < 1000; i++ { + require.NoError(t, failpoint.Enable(fp, fmt.Sprintf(`panic("%s")`, fp))) + runSQL(fp) + require.NoError(t, failpoint.Disable(fp)) + } + if !strings.Contains(fp, "testIndexMergePanicTableScanWorker") { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/mockSleepBeforeStartTableReader")) + } + } + + errFPPaths := []string{ + packagePath + "testIndexMergeErrorPartialIndexWorker", + packagePath + "testIndexMergeErrorPartialTableWorker", + } + for _, fp := range errFPPaths { + fmt.Println("handling failpoint: ", fp) + require.NoError(t, failpoint.Enable(fp, fmt.Sprintf(`return("%s")`, fp))) + for i := 0; i < 100; i++ { + runSQL(fp) + } + require.NoError(t, failpoint.Disable(fp)) + } +} diff --git a/executor/infoschema_cluster_table_test.go b/executor/infoschema_cluster_table_test.go index 012cd98178443..b1a6d4c57f4f8 100644 --- a/executor/infoschema_cluster_table_test.go +++ b/executor/infoschema_cluster_table_test.go @@ -290,7 +290,7 @@ func TestTableStorageStats(t *testing.T) { "test 2", )) rows := tk.MustQuery("select TABLE_NAME from information_schema.TABLE_STORAGE_STATS where TABLE_SCHEMA = 'mysql';").Rows() - result := 40 + result := 46 require.Len(t, rows, result) // More tests about the privileges. diff --git a/executor/infoschema_reader.go b/executor/infoschema_reader.go index b3b881c1f65fa..44e36d2a26ae1 100644 --- a/executor/infoschema_reader.go +++ b/executor/infoschema_reader.go @@ -30,6 +30,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/deadlock" + rmpb "github.com/pingcap/kvproto/pkg/resource_manager" "github.com/pingcap/tidb/ddl/label" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/domain/infosync" @@ -69,7 +70,6 @@ import ( "github.com/pingcap/tidb/util/servermemorylimit" "github.com/pingcap/tidb/util/set" "github.com/pingcap/tidb/util/sqlexec" - "github.com/pingcap/tidb/util/stmtsummary" "github.com/pingcap/tidb/util/stringutil" "github.com/tikv/client-go/v2/txnkv/txnlock" "go.uber.org/zap" @@ -157,9 +157,6 @@ func (e *memtableRetriever) retrieve(ctx context.Context, sctx sessionctx.Contex e.dataForTableTiFlashReplica(sctx, dbs) case infoschema.TableTiKVStoreStatus: err = e.dataForTiKVStoreStatus(sctx) - case infoschema.TableStatementsSummaryEvicted, - infoschema.ClusterTableStatementsSummaryEvicted: - err = e.setDataForStatementsSummaryEvicted(sctx) case infoschema.TableClientErrorsSummaryGlobal, infoschema.TableClientErrorsSummaryByUser, infoschema.TableClientErrorsSummaryByHost: @@ -184,6 +181,8 @@ func (e *memtableRetriever) retrieve(ctx context.Context, sctx sessionctx.Contex err = e.setDataForMemoryUsageOpsHistory(sctx) case infoschema.ClusterTableMemoryUsageOpsHistory: err = e.setDataForClusterMemoryUsageOpsHistory(sctx) + case infoschema.TableResourceGroups: + err = e.setDataFromResourceGroups() } if err != nil { return nil, err @@ -386,7 +385,7 @@ func getAutoIncrementID(ctx sessionctx.Context, schema *model.DBInfo, tblInfo *m if err != nil { return 0, err } - return tbl.Allocators(ctx).Get(autoid.RowIDAllocType).Base() + 1, nil + return tbl.Allocators(ctx).Get(autoid.AutoIncrementType).Base() + 1, nil } func hasPriv(ctx sessionctx.Context, priv mysql.PrivilegeType) bool { @@ -1121,17 +1120,23 @@ func (e *memtableRetriever) setDataFromPartitions(ctx context.Context, sctx sess partitionMethod := table.Partition.Type.String() partitionExpr := table.Partition.Expr - if table.Partition.Type == model.PartitionTypeRange && len(table.Partition.Columns) > 0 { - partitionMethod = "RANGE COLUMNS" - partitionExpr = table.Partition.Columns[0].String() - } else if table.Partition.Type == model.PartitionTypeList && len(table.Partition.Columns) > 0 { - partitionMethod = "LIST COLUMNS" + if len(table.Partition.Columns) > 0 { + switch table.Partition.Type { + case model.PartitionTypeRange: + partitionMethod = "RANGE COLUMNS" + case model.PartitionTypeList: + partitionMethod = "LIST COLUMNS" + default: + return fmt.Errorf("Inconsistent partition type, have type %v, but with COLUMNS > 0 (%d)", table.Partition.Type, len(table.Partition.Columns)) + } buf := bytes.NewBuffer(nil) for i, col := range table.Partition.Columns { if i > 0 { buf.WriteString(",") } + buf.WriteString("`") buf.WriteString(col.String()) + buf.WriteString("`") } partitionExpr = buf.String() } @@ -1677,11 +1682,11 @@ func keyColumnUsageInTable(schema *model.DBInfo, table *model.TableInfo) [][]typ } } for _, fk := range table.ForeignKeys { - fkRefCol := "" - if len(fk.RefCols) > 0 { - fkRefCol = fk.RefCols[0].O - } for i, key := range fk.Cols { + fkRefCol := "" + if len(fk.RefCols) > i { + fkRefCol = fk.RefCols[i].O + } col := nameToCol[key.L] record := types.MakeDatums( infoschema.CatalogVal, // CONSTRAINT_CATALOG @@ -2303,22 +2308,6 @@ func (e *memtableRetriever) dataForTableTiFlashReplica(ctx sessionctx.Context, s e.rows = rows } -func (e *memtableRetriever) setDataForStatementsSummaryEvicted(ctx sessionctx.Context) error { - if !hasPriv(ctx, mysql.ProcessPriv) { - return plannercore.ErrSpecificAccessDenied.GenWithStackByArgs("PROCESS") - } - e.rows = stmtsummary.StmtSummaryByDigestMap.ToEvictedCountDatum() - switch e.table.Name.O { - case infoschema.ClusterTableStatementsSummaryEvicted: - rows, err := infoschema.AppendHostInfoToRows(ctx, e.rows) - if err != nil { - return err - } - e.rows = rows - } - return nil -} - func (e *memtableRetriever) setDataForClientErrorsSummary(ctx sessionctx.Context, tableName string) error { // Seeing client errors should require the PROCESS privilege, with the exception of errors for your own user. // This is similar to information_schema.processlist, which is the closest comparison. @@ -2473,50 +2462,6 @@ func (e *memtableRetriever) setDataForClusterMemoryUsageOpsHistory(ctx sessionct return nil } -type stmtSummaryTableRetriever struct { - dummyCloser - table *model.TableInfo - columns []*model.ColumnInfo - retrieved bool - extractor *plannercore.StatementsSummaryExtractor -} - -// retrieve implements the infoschemaRetriever interface -func (e *stmtSummaryTableRetriever) retrieve(ctx context.Context, sctx sessionctx.Context) ([][]types.Datum, error) { - if e.extractor.SkipRequest || e.retrieved { - return nil, nil - } - e.retrieved = true - - var err error - var instanceAddr string - switch e.table.Name.O { - case infoschema.ClusterTableStatementsSummary, - infoschema.ClusterTableStatementsSummaryHistory: - instanceAddr, err = infoschema.GetInstanceAddr(sctx) - if err != nil { - return nil, err - } - } - user := sctx.GetSessionVars().User - reader := stmtsummary.NewStmtSummaryReader(user, hasPriv(sctx, mysql.ProcessPriv), e.columns, instanceAddr, sctx.GetSessionVars().StmtCtx.TimeZone) - if e.extractor.Enable { - checker := stmtsummary.NewStmtSummaryChecker(e.extractor.Digests) - reader.SetChecker(checker) - } - var rows [][]types.Datum - switch e.table.Name.O { - case infoschema.TableStatementsSummary, - infoschema.ClusterTableStatementsSummary: - rows = reader.GetStmtSummaryCurrentRows() - case infoschema.TableStatementsSummaryHistory, - infoschema.ClusterTableStatementsSummaryHistory: - rows = reader.GetStmtSummaryHistoryRows() - } - - return rows, nil -} - // tidbTrxTableRetriever is the memtable retriever for the TIDB_TRX and CLUSTER_TIDB_TRX table. type tidbTrxTableRetriever struct { dummyCloser @@ -2607,7 +2552,17 @@ func (e *tidbTrxTableRetriever) retrieve(ctx context.Context, sctx sessionctx.Co row = append(row, types.NewDatum(nil)) } } else { - row = append(row, e.txnInfo[i].ToDatum(c.Name.O)) + switch c.Name.O { + case txninfo.MemBufferBytesStr: + memDBFootprint := sctx.GetSessionVars().MemDBFootprint + var bytesConsumed int64 + if memDBFootprint != nil { + bytesConsumed = memDBFootprint.BytesConsumed() + } + row = append(row, types.NewDatum(bytesConsumed)) + default: + row = append(row, e.txnInfo[i].ToDatum(c.Name.O)) + } } } res = append(res, row) @@ -3005,9 +2960,6 @@ func (e *hugeMemTableRetriever) retrieve(ctx context.Context, sctx sessionctx.Co } func adjustColumns(input [][]types.Datum, outColumns []*model.ColumnInfo, table *model.TableInfo) [][]types.Datum { - if table.Name.O == infoschema.TableStatementsSummary { - return input - } if len(outColumns) == len(table.Columns) { return input } @@ -3376,6 +3328,40 @@ func (e *memtableRetriever) setDataFromPlacementPolicies(sctx sessionctx.Context return nil } +func (e *memtableRetriever) setDataFromResourceGroups() error { + resourceGroups, err := infosync.ListResourceGroups(context.TODO()) + if err != nil { + return errors.Errorf("failed to access resource group manager, error message is %s", err.Error()) + } + rows := make([][]types.Datum, 0, len(resourceGroups)) + for _, group := range resourceGroups { + //mode := "" + burstable := "NO" + switch group.Mode { + case rmpb.GroupMode_RUMode: + if group.RUSettings.RU.Settings.BurstLimit < 0 { + burstable = "YES" + } + row := types.MakeDatums( + group.Name, + group.RUSettings.RU.Settings.FillRate, + burstable, + ) + rows = append(rows, row) + default: + //mode = "UNKNOWN_MODE" + row := types.MakeDatums( + group.Name, + nil, + nil, + ) + rows = append(rows, row) + } + } + e.rows = rows + return nil +} + func checkRule(rule *label.Rule) (dbName, tableName string, partitionName string, err error) { s := strings.Split(rule.ID, "/") if len(s) < 3 { diff --git a/executor/infoschema_reader_test.go b/executor/infoschema_reader_test.go index ed6eed4fb4607..ae625e7af0f60 100644 --- a/executor/infoschema_reader_test.go +++ b/executor/infoschema_reader_test.go @@ -254,7 +254,7 @@ func TestDDLJobs(t *testing.T) { tk.MustExec("create table tt (a int);") tk.MustExec("alter table tt add index t(a), add column b int") tk.MustQuery("select db_name, table_name, job_type from information_schema.DDL_JOBS limit 3").Check( - testkit.Rows("test_ddl_jobs tt alter table multi-schema change", "test_ddl_jobs tt add index /* subjob */", "test_ddl_jobs tt add column /* subjob */")) + testkit.Rows("test_ddl_jobs tt alter table multi-schema change", "test_ddl_jobs tt add index /* subjob */ /* txn-merge */", "test_ddl_jobs tt add column /* subjob */")) } func TestKeyColumnUsage(t *testing.T) { @@ -471,10 +471,21 @@ func TestPartitionsTable(t *testing.T) { tk.MustExec("DROP TABLE IF EXISTS `test_partitions`;") tk.MustExec(`CREATE TABLE test_partitions1 (id int, b int, c varchar(5), primary key(id), index idx(c)) PARTITION BY RANGE COLUMNS(id) (PARTITION p0 VALUES LESS THAN (6), PARTITION p1 VALUES LESS THAN (11), PARTITION p2 VALUES LESS THAN (16));`) - tk.MustQuery("select PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION from information_schema.partitions where table_name = 'test_partitions1';").Check(testkit.Rows("p0 RANGE COLUMNS id", "p1 RANGE COLUMNS id", "p2 RANGE COLUMNS id")) + tk.MustQuery("select PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION from information_schema.partitions where table_name = 'test_partitions1';").Check(testkit.Rows("p0 RANGE COLUMNS `id`", "p1 RANGE COLUMNS `id`", "p2 RANGE COLUMNS `id`")) tk.MustExec("DROP TABLE test_partitions1") - tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec(`CREATE TABLE test_partitions (id int, b int, c varchar(5), primary key(id,b), index idx(c)) PARTITION BY RANGE COLUMNS(id,b) (PARTITION p0 VALUES LESS THAN (6,1), PARTITION p1 VALUES LESS THAN (11,9), PARTITION p2 VALUES LESS THAN (16,MAXVALUE))`) + tk.MustQuery("select PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION from information_schema.partitions where table_name = 'test_partitions';").Check(testkit.Rows("p0 RANGE COLUMNS `id`,`b`", "p1 RANGE COLUMNS `id`,`b`", "p2 RANGE COLUMNS `id`,`b`")) + tk.MustExec("DROP TABLE test_partitions") + + tk.MustExec(`create table test_partitions (a varchar(255), b int, c datetime) partition by list columns (b,a) (partition p0 values in ((1,"1"), (3,"3")), partition p1 values in ((2, "2")))`) + tk.MustQuery("select PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION from information_schema.partitions where table_name = 'test_partitions'").Check(testkit.Rows("p0 LIST COLUMNS `b`,`a`", "p1 LIST COLUMNS `b`,`a`")) + tk.MustExec("drop table test_partitions") + + tk.MustExec("create table test_partitions (a varchar(3)) partition by list columns (a) (partition p0 values in ('1'), partition p1 values in ('2'))") + tk.MustQuery("select PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION from information_schema.partitions where table_name = 'test_partitions'").Check(testkit.Rows("p0 LIST COLUMNS `a`", "p1 LIST COLUMNS `a`")) + tk.MustExec("drop table test_partitions") + tk.MustExec("create table test_partitions (a int) partition by list (a) (partition p0 values in (1), partition p1 values in (2));") tk.MustQuery("select PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION from information_schema.partitions where table_name = 'test_partitions';").Check(testkit.Rows("p0 LIST `a`", "p1 LIST `a`")) tk.MustExec("drop table test_partitions") @@ -484,7 +495,7 @@ func TestPartitionsTable(t *testing.T) { tk.MustExec("drop table test_partitions") tk.MustExec("create table test_partitions (a bigint, b date) partition by list columns (a,b) (partition p0 values in ((1,'2020-09-28'),(1,'2020-09-29')));") - tk.MustQuery("select PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION from information_schema.partitions where table_name = 'test_partitions';").Check(testkit.Rows("p0 LIST COLUMNS a,b")) + tk.MustQuery("select PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION from information_schema.partitions where table_name = 'test_partitions';").Check(testkit.Rows("p0 LIST COLUMNS `a`,`b`")) pid, err := strconv.Atoi(tk.MustQuery("select TIDB_PARTITION_ID from information_schema.partitions where table_name = 'test_partitions';").Rows()[0][0].(string)) require.NoError(t, err) require.Greater(t, pid, 0) diff --git a/executor/insert.go b/executor/insert.go index 9b286297351b9..2b6e45fb018d7 100644 --- a/executor/insert.go +++ b/executor/insert.go @@ -21,7 +21,6 @@ import ( "runtime/trace" "time" - "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/expression" @@ -31,12 +30,14 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/stringutil" + "github.com/pingcap/tidb/util/tracing" "go.uber.org/zap" ) @@ -70,7 +71,6 @@ func (e *InsertExec) exec(ctx context.Context, rows [][]types.Datum) error { return err } setOptionForTopSQL(sessVars.StmtCtx, txn) - txnSize := txn.Size() sessVars.StmtCtx.AddRecordRows(uint64(len(rows))) // If you use the IGNORE keyword, duplicate-key error that occurs while executing the INSERT statement are ignored. // For example, without IGNORE, a row that duplicates an existing UNIQUE index or PRIMARY KEY value in @@ -113,16 +113,12 @@ func (e *InsertExec) exec(ctx context.Context, rows [][]types.Datum) error { e.stats.CheckInsertTime += time.Since(start) } } - e.memTracker.Consume(int64(txn.Size() - txnSize)) return nil } func prefetchUniqueIndices(ctx context.Context, txn kv.Transaction, rows []toBeCheckedRow) (map[string][]byte, error) { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("prefetchUniqueIndices", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } + r, ctx := tracing.StartRegionEx(ctx, "prefetchUniqueIndices") + defer r.End() nKeys := 0 for _, r := range rows { @@ -150,16 +146,19 @@ func prefetchUniqueIndices(ctx context.Context, txn kv.Transaction, rows []toBeC } func prefetchConflictedOldRows(ctx context.Context, txn kv.Transaction, rows []toBeCheckedRow, values map[string][]byte) error { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("prefetchConflictedOldRows", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } + r, ctx := tracing.StartRegionEx(ctx, "prefetchConflictedOldRows") + defer r.End() batchKeys := make([]kv.Key, 0, len(rows)) for _, r := range rows { for _, uk := range r.uniqueKeys { if val, found := values[string(uk.newKey)]; found { + if isTemp, _ := tablecodec.CheckTempIndexKey(uk.newKey); isTemp { + // If it is a temp index, the value cannot be decoded by DecodeHandleInUniqueIndexValue. + // Since this function is an optimization, we can skip prefetching the rows referenced by + // temp indexes. + continue + } handle, err := tablecodec.DecodeHandleInUniqueIndexValue(val, uk.commonHandle) if err != nil { return err @@ -178,11 +177,7 @@ func (e *InsertValues) prefetchDataCache(ctx context.Context, txn kv.Transaction return nil } - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("prefetchDataCache", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } + defer tracing.StartRegion(ctx, "prefetchDataCache").End() values, err := prefetchUniqueIndices(ctx, txn, rows) if err != nil { return err @@ -257,18 +252,13 @@ func (e *InsertExec) batchUpdateDupRows(ctx context.Context, newRows [][]types.D } for _, uk := range r.uniqueKeys { - val, err := txn.Get(ctx, uk.newKey) + _, handle, err := tables.FetchDuplicatedHandle(ctx, uk.newKey, true, txn, e.Table.Meta().ID, uk.commonHandle) if err != nil { - if kv.IsErrNotFound(err) { - continue - } return err } - handle, err := tablecodec.DecodeHandleInUniqueIndexValue(val, uk.commonHandle) - if err != nil { - return err + if handle == nil { + continue } - err = e.updateDupRow(ctx, i, txn, r, handle, e.OnDuplicate) if err != nil { if kv.IsErrNotFound(err) { @@ -329,9 +319,10 @@ func (e *InsertExec) Next(ctx context.Context, req *chunk.Chunk) error { // Close implements the Executor Close interface. func (e *InsertExec) Close() error { + if e.runtimeStats != nil && e.stats != nil { + defer e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) + } defer e.memTracker.ReplaceBytesUsed(0) - e.ctx.GetSessionVars().CurrInsertValues = chunk.Row{} - e.ctx.GetSessionVars().CurrInsertBatchExtraCols = e.ctx.GetSessionVars().CurrInsertBatchExtraCols[0:0:0] e.setMessage() if e.SelectExec != nil { return e.SelectExec.Close() diff --git a/executor/insert_common.go b/executor/insert_common.go index 5bb7feb2441da..87938ff9af27b 100644 --- a/executor/insert_common.go +++ b/executor/insert_common.go @@ -22,7 +22,6 @@ import ( "sync" "time" - "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/expression" @@ -32,6 +31,7 @@ import ( "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/sessiontxn" @@ -45,6 +45,7 @@ import ( "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/memory" + "github.com/pingcap/tidb/util/tracing" "github.com/tikv/client-go/v2/txnkv/txnsnapshot" "go.uber.org/zap" ) @@ -388,7 +389,7 @@ func (e *InsertValues) evalRow(ctx context.Context, list []expression.Expression e.evalBuffer.SetDatum(offset, val1) } // Row may lack of generated column, autoIncrement column, empty column here. - return e.fillRow(ctx, row, hasValue) + return e.fillRow(ctx, row, hasValue, rowIdx) } var emptyRow chunk.Row @@ -422,7 +423,7 @@ func (e *InsertValues) fastEvalRow(ctx context.Context, list []expression.Expres offset := e.insertColumns[i].Offset row[offset], hasValue[offset] = val1, true } - return e.fillRow(ctx, row, hasValue) + return e.fillRow(ctx, row, hasValue, rowIdx) } // setValueForRefColumn set some default values for the row to eval the row value with other columns, @@ -537,7 +538,7 @@ func (e *InsertValues) doBatchInsert(ctx context.Context) error { return ErrBatchInsertFail.GenWithStack("BatchInsert failed with error: %v", err) } e.memTracker.Consume(-int64(txn.Size())) - e.ctx.StmtCommit() + e.ctx.StmtCommit(ctx) if err := sessiontxn.NewTxnInStmt(ctx, e.ctx); err != nil { // We should return a special error for batch insert. return ErrBatchInsertFail.GenWithStack("BatchInsert failed with error: %v", err) @@ -562,7 +563,7 @@ func (e *InsertValues) getRow(ctx context.Context, vals []types.Datum) ([]types. hasValue[offset] = true } - return e.fillRow(ctx, row, hasValue) + return e.fillRow(ctx, row, hasValue, 0) } // getColDefaultValue gets the column default value. @@ -647,7 +648,7 @@ func (e *InsertValues) fillColValue(ctx context.Context, datum types.Datum, idx // `insert|replace values` can guarantee consecutive autoID in a batch. // Other statements like `insert select from` don't guarantee consecutive autoID. // https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html -func (e *InsertValues) fillRow(ctx context.Context, row []types.Datum, hasValue []bool) ([]types.Datum, error) { +func (e *InsertValues) fillRow(ctx context.Context, row []types.Datum, hasValue []bool, rowIdx int) ([]types.Datum, error) { gCols := make([]*table.Column, 0) tCols := e.Table.Cols() if e.hasExtraHandle { @@ -693,6 +694,9 @@ func (e *InsertValues) fillRow(ctx context.Context, row []types.Datum, hasValue for i, gCol := range gCols { colIdx := gCol.ColumnInfo.Offset val, err := e.GenExprs[i].Eval(chunk.MutRowFromDatums(row).ToRow()) + if err != nil && gCol.FieldType.IsArray() { + return nil, completeError(tbl, gCol.Offset, rowIdx, err) + } if e.ctx.GetSessionVars().StmtCtx.HandleTruncate(err) != nil { return nil, err } @@ -708,6 +712,29 @@ func (e *InsertValues) fillRow(ctx context.Context, row []types.Datum, hasValue return row, nil } +func completeError(tbl *model.TableInfo, offset int, rowIdx int, err error) error { + name := "expression_index" + for _, idx := range tbl.Indices { + for _, column := range idx.Columns { + if column.Offset == offset { + name = idx.Name.O + break + } + } + } + + if expression.ErrInvalidJSONForFuncIndex.Equal(err) { + return expression.ErrInvalidJSONForFuncIndex.GenWithStackByArgs(name) + } + if types.ErrOverflow.Equal(err) { + return expression.ErrDataOutOfRangeFuncIndex.GenWithStackByArgs(name, rowIdx+1) + } + if types.ErrDataTooLong.Equal(err) { + return expression.ErrFuncIndexDataIsTooLong.GenWithStackByArgs(name) + } + return err +} + // isAutoNull can help judge whether a datum is AutoIncrement Null quickly. // This used to help lazyFillAutoIncrement to find consecutive N datum backwards for batch autoID alloc. func (e *InsertValues) isAutoNull(ctx context.Context, d types.Datum, col *table.Column) bool { @@ -745,7 +772,16 @@ func setDatumAutoIDAndCast(ctx sessionctx.Context, d *types.Datum, id int64, col var err error *d, err = table.CastValue(ctx, *d, col.ToInfo(), false, false) if err == nil && d.GetInt64() < id { - // Auto ID is out of range, the truncated ID is possible to duplicate with an existing ID. + // Auto ID is out of range. + sc := ctx.GetSessionVars().StmtCtx + insertPlan, ok := sc.GetPlan().(*core.Insert) + if ok && sc.TruncateAsWarning && len(insertPlan.OnDuplicate) > 0 { + // Fix issue #38950: AUTO_INCREMENT is incompatible with mysql + // An auto id out of range error occurs in `insert ignore into ... on duplicate ...`. + // We should allow the SQL to be executed successfully. + return nil + } + // The truncated ID is possible to duplicate with an existing ID. // To prevent updating unrelated rows in the REPLACE statement, it is better to throw an error. return autoid.ErrAutoincReadFailed } @@ -778,7 +814,8 @@ func (e *InsertValues) lazyAdjustAutoIncrementDatum(ctx context.Context, rows [] } // Use the value if it's not null and not 0. if recordID != 0 { - err = e.Table.Allocators(e.ctx).Get(autoid.RowIDAllocType).Rebase(ctx, recordID, true) + alloc := e.Table.Allocators(e.ctx).Get(autoid.AutoIncrementType) + err = alloc.Rebase(ctx, recordID, true) if err != nil { return nil, err } @@ -871,7 +908,7 @@ func (e *InsertValues) adjustAutoIncrementDatum(ctx context.Context, d types.Dat } // Use the value if it's not null and not 0. if recordID != 0 { - err = e.Table.Allocators(e.ctx).Get(autoid.RowIDAllocType).Rebase(ctx, recordID, true) + err = e.Table.Allocators(e.ctx).Get(autoid.AutoIncrementType).Rebase(ctx, recordID, true) if err != nil { return types.Datum{}, err } @@ -1007,7 +1044,7 @@ func (e *InsertValues) allocAutoRandomID(ctx context.Context, fieldType *types.F if err != nil { return 0, err } - currentShard := e.ctx.GetSessionVars().TxnCtx.GetCurrentShard(1) + currentShard := e.ctx.GetSessionVars().GetCurrentShard(1) return shardFmt.Compose(currentShard, autoRandomID), nil } @@ -1091,12 +1128,7 @@ func (e *InsertValues) collectRuntimeStatsEnabled() bool { BasicRuntimeStats: e.runtimeStats, SnapshotRuntimeStats: snapshotStats, AllocatorRuntimeStats: autoid.NewAllocatorRuntimeStats(), - FKCheckStats: &FKCheckRuntimeStats{}, - } - for _, fkc := range e.fkChecks { - fkc.stats = e.stats.FKCheckStats } - e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) } return true } @@ -1110,11 +1142,7 @@ func (e *InsertValues) batchCheckAndInsert(ctx context.Context, rows [][]types.D replace bool) error { // all the rows will be checked, so it is safe to set BatchCheck = true e.ctx.GetSessionVars().StmtCtx.BatchCheck = true - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("InsertValues.batchCheckAndInsert", opentracing.ChildOf(span.Context())) - defer span1.Finish() - opentracing.ContextWithSpan(ctx, span1) - } + defer tracing.StartRegion(ctx, "InsertValues.batchCheckAndInsert").End() start := time.Now() // Get keys need to be checked. toBeCheckedRows, err := getKeysNeedCheck(ctx, e.ctx, e.Table, rows) @@ -1299,7 +1327,6 @@ type InsertRuntimeStat struct { CheckInsertTime time.Duration Prefetch time.Duration FKCheckTime time.Duration - FKCheckStats *FKCheckRuntimeStats } func (e *InsertRuntimeStat) String() string { @@ -1341,10 +1368,8 @@ func (e *InsertRuntimeStat) String() string { execdetails.FormatDuration(e.CheckInsertTime), execdetails.FormatDuration(e.CheckInsertTime-e.Prefetch), execdetails.FormatDuration(e.Prefetch))) - if e.FKCheckStats != nil && e.FKCheckStats.Keys > 0 { - buf.WriteString(fmt.Sprintf(", fk_check: %v, fk_num: %v", - execdetails.FormatDuration(e.FKCheckTime), - e.FKCheckStats.Keys)) + if e.FKCheckTime > 0 { + buf.WriteString(fmt.Sprintf(", fk_check: %v", execdetails.FormatDuration(e.FKCheckTime))) } if e.SnapshotRuntimeStats != nil { if rpc := e.SnapshotRuntimeStats.String(); len(rpc) > 0 { @@ -1376,10 +1401,6 @@ func (e *InsertRuntimeStat) Clone() execdetails.RuntimeStats { if e.AllocatorRuntimeStats != nil { newRs.AllocatorRuntimeStats = e.AllocatorRuntimeStats.Clone() } - if e.FKCheckStats != nil { - fkCheckStats := *e.FKCheckStats - newRs.FKCheckStats = &fkCheckStats - } return newRs } diff --git a/executor/insert_test.go b/executor/insert_test.go index 53d0c62cc9776..acd8d6736b219 100644 --- a/executor/insert_test.go +++ b/executor/insert_test.go @@ -419,6 +419,34 @@ func TestInsertValueForCastDecimalField(t *testing.T) { tk.MustQuery(`select cast(a as decimal) from t1;`).Check(testkit.Rows(`9999999999`)) } +func TestInsertForMultiValuedIndex(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(`drop table if exists t1;`) + tk.MustExec(`create table t1(a json, b int, unique index idx((cast(a as signed array))));`) + tk.MustExec(`insert into t1 values ('[1,11]', 1);`) + tk.MustExec(`insert into t1 values ('[2, 22]', 2);`) + tk.MustQuery(`select * from t1;`).Check(testkit.Rows(`[1, 11] 1`, `[2, 22] 2`)) + tk.MustGetErrMsg(`insert into t1 values ('[2, 222]', 2);`, "[kv:1062]Duplicate entry '2' for key 't1.idx'") + tk.MustExec(`replace into t1 values ('[1, 10]', 10)`) + tk.MustQuery(`select * from t1;`).Check(testkit.Rows(`[2, 22] 2`, `[1, 10] 10`)) + tk.MustExec(`replace into t1 values ('[1, 2]', 1)`) + tk.MustQuery(`select * from t1;`).Check(testkit.Rows(`[1, 2] 1`)) + tk.MustExec(`replace into t1 values ('[1, 11]', 1)`) + tk.MustExec(`insert into t1 values ('[2, 22]', 2);`) + tk.MustQuery(`select * from t1;`).Check(testkit.Rows(`[1, 11] 1`, `[2, 22] 2`)) + tk.MustExec(`insert ignore into t1 values ('[1]', 2);`) + tk.MustQuery(`select * from t1;`).Check(testkit.Rows(`[1, 11] 1`, `[2, 22] 2`)) + tk.MustExec(`insert ignore into t1 values ('[1, 2]', 2);`) + tk.MustQuery(`select * from t1;`).Check(testkit.Rows(`[1, 11] 1`, `[2, 22] 2`)) + tk.MustExec(`insert into t1 values ('[2]', 2) on duplicate key update b = 10;`) + tk.MustQuery(`select * from t1;`).Check(testkit.Rows(`[1, 11] 1`, `[2, 22] 10`)) + tk.MustGetErrMsg(`insert into t1 values ('[2, 1]', 2) on duplicate key update a = '[1,2]';`, "[kv:1062]Duplicate entry '[1, 2]' for key 't1.idx'") + tk.MustGetErrMsg(`insert into t1 values ('[1,2]', 2) on duplicate key update a = '[1,2]';`, "[kv:1062]Duplicate entry '[1, 2]' for key 't1.idx'") + tk.MustGetErrMsg(`insert into t1 values ('[11, 22]', 2) on duplicate key update a = '[1,2]';`, "[kv:1062]Duplicate entry '[1, 2]' for key 't1.idx'") +} + func TestInsertDateTimeWithTimeZone(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -589,435 +617,6 @@ func TestAllowInvalidDates(t *testing.T) { runWithMode("ALLOW_INVALID_DATES") } -func TestInsertWithAutoidSchema(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec(`use test`) - tk.MustExec(`create table t1(id int primary key auto_increment, n int);`) - tk.MustExec(`create table t2(id int unsigned primary key auto_increment, n int);`) - tk.MustExec(`create table t3(id tinyint primary key auto_increment, n int);`) - tk.MustExec(`create table t4(id int primary key, n float auto_increment, key I_n(n));`) - tk.MustExec(`create table t5(id int primary key, n float unsigned auto_increment, key I_n(n));`) - tk.MustExec(`create table t6(id int primary key, n double auto_increment, key I_n(n));`) - tk.MustExec(`create table t7(id int primary key, n double unsigned auto_increment, key I_n(n));`) - // test for inserting multiple values - tk.MustExec(`create table t8(id int primary key auto_increment, n int);`) - - tests := []struct { - insert string - query string - result [][]interface{} - }{ - { - `insert into t1(id, n) values(1, 1)`, - `select * from t1 where id = 1`, - testkit.Rows(`1 1`), - }, - { - `insert into t1(n) values(2)`, - `select * from t1 where id = 2`, - testkit.Rows(`2 2`), - }, - { - `insert into t1(n) values(3)`, - `select * from t1 where id = 3`, - testkit.Rows(`3 3`), - }, - { - `insert into t1(id, n) values(-1, 4)`, - `select * from t1 where id = -1`, - testkit.Rows(`-1 4`), - }, - { - `insert into t1(n) values(5)`, - `select * from t1 where id = 4`, - testkit.Rows(`4 5`), - }, - { - `insert into t1(id, n) values('5', 6)`, - `select * from t1 where id = 5`, - testkit.Rows(`5 6`), - }, - { - `insert into t1(n) values(7)`, - `select * from t1 where id = 6`, - testkit.Rows(`6 7`), - }, - { - `insert into t1(id, n) values(7.4, 8)`, - `select * from t1 where id = 7`, - testkit.Rows(`7 8`), - }, - { - `insert into t1(id, n) values(7.5, 9)`, - `select * from t1 where id = 8`, - testkit.Rows(`8 9`), - }, - { - `insert into t1(n) values(9)`, - `select * from t1 where id = 9`, - testkit.Rows(`9 9`), - }, - // test last insert id - { - `insert into t1 values(3000, -1), (null, -2)`, - `select * from t1 where id = 3000`, - testkit.Rows(`3000 -1`), - }, - { - `;`, - `select * from t1 where id = 3001`, - testkit.Rows(`3001 -2`), - }, - { - `;`, - `select last_insert_id()`, - testkit.Rows(`3001`), - }, - { - `insert into t2(id, n) values(1, 1)`, - `select * from t2 where id = 1`, - testkit.Rows(`1 1`), - }, - { - `insert into t2(n) values(2)`, - `select * from t2 where id = 2`, - testkit.Rows(`2 2`), - }, - { - `insert into t2(n) values(3)`, - `select * from t2 where id = 3`, - testkit.Rows(`3 3`), - }, - { - `insert into t3(id, n) values(1, 1)`, - `select * from t3 where id = 1`, - testkit.Rows(`1 1`), - }, - { - `insert into t3(n) values(2)`, - `select * from t3 where id = 2`, - testkit.Rows(`2 2`), - }, - { - `insert into t3(n) values(3)`, - `select * from t3 where id = 3`, - testkit.Rows(`3 3`), - }, - { - `insert into t3(id, n) values(-1, 4)`, - `select * from t3 where id = -1`, - testkit.Rows(`-1 4`), - }, - { - `insert into t3(n) values(5)`, - `select * from t3 where id = 4`, - testkit.Rows(`4 5`), - }, - { - `insert into t4(id, n) values(1, 1)`, - `select * from t4 where id = 1`, - testkit.Rows(`1 1`), - }, - { - `insert into t4(id) values(2)`, - `select * from t4 where id = 2`, - testkit.Rows(`2 2`), - }, - { - `insert into t4(id, n) values(3, -1)`, - `select * from t4 where id = 3`, - testkit.Rows(`3 -1`), - }, - { - `insert into t4(id) values(4)`, - `select * from t4 where id = 4`, - testkit.Rows(`4 3`), - }, - { - `insert into t4(id, n) values(5, 5.5)`, - `select * from t4 where id = 5`, - testkit.Rows(`5 5.5`), - }, - { - `insert into t4(id) values(6)`, - `select * from t4 where id = 6`, - testkit.Rows(`6 7`), - }, - { - `insert into t4(id, n) values(7, '7.7')`, - `select * from t4 where id = 7`, - testkit.Rows(`7 7.7`), - }, - { - `insert into t4(id) values(8)`, - `select * from t4 where id = 8`, - testkit.Rows(`8 9`), - }, - { - `insert into t4(id, n) values(9, 10.4)`, - `select * from t4 where id = 9`, - testkit.Rows(`9 10.4`), - }, - { - `insert into t4(id) values(10)`, - `select * from t4 where id = 10`, - testkit.Rows(`10 11`), - }, - { - `insert into t5(id, n) values(1, 1)`, - `select * from t5 where id = 1`, - testkit.Rows(`1 1`), - }, - { - `insert into t5(id) values(2)`, - `select * from t5 where id = 2`, - testkit.Rows(`2 2`), - }, - { - `insert into t5(id) values(3)`, - `select * from t5 where id = 3`, - testkit.Rows(`3 3`), - }, - { - `insert into t6(id, n) values(1, 1)`, - `select * from t6 where id = 1`, - testkit.Rows(`1 1`), - }, - { - `insert into t6(id) values(2)`, - `select * from t6 where id = 2`, - testkit.Rows(`2 2`), - }, - { - `insert into t6(id, n) values(3, -1)`, - `select * from t6 where id = 3`, - testkit.Rows(`3 -1`), - }, - { - `insert into t6(id) values(4)`, - `select * from t6 where id = 4`, - testkit.Rows(`4 3`), - }, - { - `insert into t6(id, n) values(5, 5.5)`, - `select * from t6 where id = 5`, - testkit.Rows(`5 5.5`), - }, - { - `insert into t6(id) values(6)`, - `select * from t6 where id = 6`, - testkit.Rows(`6 7`), - }, - { - `insert into t6(id, n) values(7, '7.7')`, - `select * from t4 where id = 7`, - testkit.Rows(`7 7.7`), - }, - { - `insert into t6(id) values(8)`, - `select * from t4 where id = 8`, - testkit.Rows(`8 9`), - }, - { - `insert into t6(id, n) values(9, 10.4)`, - `select * from t6 where id = 9`, - testkit.Rows(`9 10.4`), - }, - { - `insert into t6(id) values(10)`, - `select * from t6 where id = 10`, - testkit.Rows(`10 11`), - }, - { - `insert into t7(id, n) values(1, 1)`, - `select * from t7 where id = 1`, - testkit.Rows(`1 1`), - }, - { - `insert into t7(id) values(2)`, - `select * from t7 where id = 2`, - testkit.Rows(`2 2`), - }, - { - `insert into t7(id) values(3)`, - `select * from t7 where id = 3`, - testkit.Rows(`3 3`), - }, - - // the following is test for insert multiple values. - { - `insert into t8(n) values(1),(2)`, - `select * from t8 where id = 1`, - testkit.Rows(`1 1`), - }, - { - `;`, - `select * from t8 where id = 2`, - testkit.Rows(`2 2`), - }, - { - `;`, - `select last_insert_id();`, - testkit.Rows(`1`), - }, - // test user rebase and auto alloc mixture. - { - `insert into t8 values(null, 3),(-1, -1),(null,4),(null, 5)`, - `select * from t8 where id = 3`, - testkit.Rows(`3 3`), - }, - // -1 won't rebase allocator here cause -1 < base. - { - `;`, - `select * from t8 where id = -1`, - testkit.Rows(`-1 -1`), - }, - { - `;`, - `select * from t8 where id = 4`, - testkit.Rows(`4 4`), - }, - { - `;`, - `select * from t8 where id = 5`, - testkit.Rows(`5 5`), - }, - { - `;`, - `select last_insert_id();`, - testkit.Rows(`3`), - }, - { - `insert into t8 values(null, 6),(10, 7),(null, 8)`, - `select * from t8 where id = 6`, - testkit.Rows(`6 6`), - }, - // 10 will rebase allocator here. - { - `;`, - `select * from t8 where id = 10`, - testkit.Rows(`10 7`), - }, - { - `;`, - `select * from t8 where id = 11`, - testkit.Rows(`11 8`), - }, - { - `;`, - `select last_insert_id()`, - testkit.Rows(`6`), - }, - // fix bug for last_insert_id should be first allocated id in insert rows (skip the rebase id). - { - `insert into t8 values(100, 9),(null,10),(null,11)`, - `select * from t8 where id = 100`, - testkit.Rows(`100 9`), - }, - { - `;`, - `select * from t8 where id = 101`, - testkit.Rows(`101 10`), - }, - { - `;`, - `select * from t8 where id = 102`, - testkit.Rows(`102 11`), - }, - { - `;`, - `select last_insert_id()`, - testkit.Rows(`101`), - }, - // test with sql_mode: NO_AUTO_VALUE_ON_ZERO. - { - `;`, - `select @@sql_mode`, - testkit.Rows(`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`), - }, - { - `;`, - "set session sql_mode = `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,NO_AUTO_VALUE_ON_ZERO`", - nil, - }, - { - `insert into t8 values (0, 12), (null, 13)`, - `select * from t8 where id = 0`, - testkit.Rows(`0 12`), - }, - { - `;`, - `select * from t8 where id = 103`, - testkit.Rows(`103 13`), - }, - { - `;`, - `select last_insert_id()`, - testkit.Rows(`103`), - }, - // test without sql_mode: NO_AUTO_VALUE_ON_ZERO. - { - `;`, - "set session sql_mode = `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`", - nil, - }, - // value 0 will be substitute by autoid. - { - `insert into t8 values (0, 14), (null, 15)`, - `select * from t8 where id = 104`, - testkit.Rows(`104 14`), - }, - { - `;`, - `select * from t8 where id = 105`, - testkit.Rows(`105 15`), - }, - { - `;`, - `select last_insert_id()`, - testkit.Rows(`104`), - }, - // last test : auto increment allocation can find in retryInfo. - { - `retry : insert into t8 values (null, 16), (null, 17)`, - `select * from t8 where id = 1000`, - testkit.Rows(`1000 16`), - }, - { - `;`, - `select * from t8 where id = 1001`, - testkit.Rows(`1001 17`), - }, - { - `;`, - `select last_insert_id()`, - // this insert doesn't has the last_insert_id, should be same as the last insert case. - testkit.Rows(`104`), - }, - } - - for _, tt := range tests { - if strings.HasPrefix(tt.insert, "retry : ") { - // it's the last retry insert case, change the sessionVars. - retryInfo := &variable.RetryInfo{Retrying: true} - retryInfo.AddAutoIncrementID(1000) - retryInfo.AddAutoIncrementID(1001) - tk.Session().GetSessionVars().RetryInfo = retryInfo - tk.MustExec(tt.insert[8:]) - tk.Session().GetSessionVars().RetryInfo = &variable.RetryInfo{} - } else { - tk.MustExec(tt.insert) - } - if tt.query == "set session sql_mode = `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,NO_AUTO_VALUE_ON_ZERO`" || - tt.query == "set session sql_mode = `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`" { - tk.MustExec(tt.query) - } else { - tk.MustQuery(tt.query).Check(tt.result) - } - } -} - func TestPartitionInsertOnDuplicate(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -1139,75 +738,6 @@ func TestInsertFloatOverflow(t *testing.T) { tk.MustExec("drop table if exists t,t1") } -// TestAutoIDIncrementAndOffset There is a potential issue in MySQL: when the value of auto_increment_offset is greater -// than that of auto_increment_increment, the value of auto_increment_offset is ignored -// (https://dev.mysql.com/doc/refman/8.0/en/replication-options-master.html#sysvar_auto_increment_increment), -// This issue is a flaw of the implementation of MySQL and it doesn't exist in TiDB. -func TestAutoIDIncrementAndOffset(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec(`use test`) - // Test for offset is larger than increment. - tk.Session().GetSessionVars().AutoIncrementIncrement = 5 - tk.Session().GetSessionVars().AutoIncrementOffset = 10 - tk.MustExec(`create table io (a int key auto_increment)`) - tk.MustExec(`insert into io values (null),(null),(null)`) - tk.MustQuery(`select * from io`).Check(testkit.Rows("10", "15", "20")) - tk.MustExec(`drop table io`) - - // Test handle is PK. - tk.MustExec(`create table io (a int key auto_increment)`) - tk.Session().GetSessionVars().AutoIncrementOffset = 10 - tk.Session().GetSessionVars().AutoIncrementIncrement = 2 - tk.MustExec(`insert into io values (),(),()`) - tk.MustQuery(`select * from io`).Check(testkit.Rows("10", "12", "14")) - tk.MustExec(`delete from io`) - - // Test reset the increment. - tk.Session().GetSessionVars().AutoIncrementIncrement = 5 - tk.MustExec(`insert into io values (),(),()`) - tk.MustQuery(`select * from io`).Check(testkit.Rows("15", "20", "25")) - tk.MustExec(`delete from io`) - - tk.Session().GetSessionVars().AutoIncrementIncrement = 10 - tk.MustExec(`insert into io values (),(),()`) - tk.MustQuery(`select * from io`).Check(testkit.Rows("30", "40", "50")) - tk.MustExec(`delete from io`) - - tk.Session().GetSessionVars().AutoIncrementIncrement = 5 - tk.MustExec(`insert into io values (),(),()`) - tk.MustQuery(`select * from io`).Check(testkit.Rows("55", "60", "65")) - tk.MustExec(`drop table io`) - - // Test handle is not PK. - tk.Session().GetSessionVars().AutoIncrementIncrement = 2 - tk.Session().GetSessionVars().AutoIncrementOffset = 10 - tk.MustExec(`create table io (a int, b int auto_increment, key(b))`) - tk.MustExec(`insert into io(b) values (null),(null),(null)`) - // AutoID allocation will take increment and offset into consideration. - tk.MustQuery(`select b from io`).Check(testkit.Rows("10", "12", "14")) - // HandleID allocation will ignore the increment and offset. - tk.MustQuery(`select _tidb_rowid from io`).Check(testkit.Rows("15", "16", "17")) - tk.MustExec(`delete from io`) - - tk.Session().GetSessionVars().AutoIncrementIncrement = 10 - tk.MustExec(`insert into io(b) values (null),(null),(null)`) - tk.MustQuery(`select b from io`).Check(testkit.Rows("20", "30", "40")) - tk.MustQuery(`select _tidb_rowid from io`).Check(testkit.Rows("41", "42", "43")) - - // Test invalid value. - tk.Session().GetSessionVars().AutoIncrementIncrement = -1 - tk.Session().GetSessionVars().AutoIncrementOffset = -2 - tk.MustGetErrMsg(`insert into io(b) values (null),(null),(null)`, - "[autoid:8060]Invalid auto_increment settings: auto_increment_increment: -1, auto_increment_offset: -2, both of them must be in range [1..65535]") - tk.MustExec(`delete from io`) - - tk.Session().GetSessionVars().AutoIncrementIncrement = 65536 - tk.Session().GetSessionVars().AutoIncrementOffset = 65536 - tk.MustGetErrMsg(`insert into io(b) values (null),(null),(null)`, - "[autoid:8060]Invalid auto_increment settings: auto_increment_increment: 65536, auto_increment_offset: 65536, both of them must be in range [1..65535]") -} - // Fix https://github.com/pingcap/tidb/issues/32601. func TestTextTooLongError(t *testing.T) { store := testkit.CreateMockStore(t) @@ -1393,6 +923,22 @@ func TestInsertErrorMsg(t *testing.T) { tk.MustExec(`create table t (a int primary key, b datetime, d date)`) tk.MustContainErrMsg(`insert into t values (1, '2019-02-11 30:00:00', '2019-01-31')`, "Incorrect datetime value: '2019-02-11 30:00:00' for column 'b' at row 1") + + // test for Issue #35289 + tk.MustExec("CREATE TABLE t1 (a BINARY(16) PRIMARY KEY);") + tk.MustExec(`INSERT INTO t1 VALUES (AES_ENCRYPT('a','a'));`) + err := tk.ExecToErr(`INSERT INTO t1 VALUES (AES_ENCRYPT('a','a'));`) + require.Error(t, err, `ERROR 1062 (23000): Duplicate entry '{ W]\xA1\x06u\x9D\xBD\xB1\xA3.\xE2\xD9\xA7t' for key 't1.PRIMARY'`) + + tk.MustExec(`INSERT INTO t1 VALUES (AES_ENCRYPT('b','b'));`) + err = tk.ExecToErr(`INSERT INTO t1 VALUES (AES_ENCRYPT('b','b'));`) + require.Error(t, err, "ERROR 1062 (23000): Duplicate entry '\\x0C\\x1E\\x8DG`\\xEB\\x93 F&BC\\xF0\\xB5\\xF4\\xB7' for key 't1.PRIMARY'") + + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1 (a bit primary key) engine=innodb;") + tk.MustExec("insert into t1 values (b'0');") + err = tk.ExecToErr(`insert into t1 values (b'0');`) + require.Error(t, err, `ERROR 1062 (23000): Duplicate entry '\x00' for key 't1.PRIMARY'`) } func TestIssue16366(t *testing.T) { @@ -1554,8 +1100,7 @@ func TestInsertRuntimeStat(t *testing.T) { stats.Merge(stats.Clone()) require.Equal(t, "prepare: 6s, check_insert: {total_time: 4s, mem_insert_time: 2s, prefetch: 2s}", stats.String()) stats.FKCheckTime = time.Second - stats.FKCheckStats = &executor.FKCheckRuntimeStats{Keys: 20} - require.Equal(t, "prepare: 6s, check_insert: {total_time: 4s, mem_insert_time: 2s, prefetch: 2s, fk_check: 1s, fk_num: 20}", stats.String()) + require.Equal(t, "prepare: 6s, check_insert: {total_time: 4s, mem_insert_time: 2s, prefetch: 2s, fk_check: 1s}", stats.String()) } func TestDuplicateEntryMessage(t *testing.T) { diff --git a/executor/inspection_result_test.go b/executor/inspection_result_test.go index 67e5d98216b1b..4d5da7ba287cc 100644 --- a/executor/inspection_result_test.go +++ b/executor/inspection_result_test.go @@ -179,7 +179,7 @@ func TestInspectionResult(t *testing.T) { } func parseTime(t *testing.T, se session.Session, str string) types.Time { - time, err := types.ParseTime(se.GetSessionVars().StmtCtx, str, mysql.TypeDatetime, types.MaxFsp) + time, err := types.ParseTime(se.GetSessionVars().StmtCtx, str, mysql.TypeDatetime, types.MaxFsp, nil) require.NoError(t, err) return time } @@ -338,7 +338,7 @@ func TestThresholdCheckInspection2(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test") datetime := func(s string) types.Time { - time, err := types.ParseTime(tk.Session().GetSessionVars().StmtCtx, s, mysql.TypeDatetime, types.MaxFsp) + time, err := types.ParseTime(tk.Session().GetSessionVars().StmtCtx, s, mysql.TypeDatetime, types.MaxFsp, nil) require.NoError(t, err) return time } @@ -421,7 +421,7 @@ func TestThresholdCheckInspection3(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test") datetime := func(s string) types.Time { - time, err := types.ParseTime(tk.Session().GetSessionVars().StmtCtx, s, mysql.TypeDatetime, types.MaxFsp) + time, err := types.ParseTime(tk.Session().GetSessionVars().StmtCtx, s, mysql.TypeDatetime, types.MaxFsp, nil) require.NoError(t, err) return time } @@ -628,7 +628,7 @@ func TestNodeLoadInspection(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test") datetime := func(s string) types.Time { - time, err := types.ParseTime(tk.Session().GetSessionVars().StmtCtx, s, mysql.TypeDatetime, types.MaxFsp) + time, err := types.ParseTime(tk.Session().GetSessionVars().StmtCtx, s, mysql.TypeDatetime, types.MaxFsp, nil) require.NoError(t, err) return time } @@ -704,7 +704,7 @@ func TestConfigCheckOfStorageBlockCacheSize(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test") datetime := func(s string) types.Time { - time, err := types.ParseTime(tk.Session().GetSessionVars().StmtCtx, s, mysql.TypeDatetime, types.MaxFsp) + time, err := types.ParseTime(tk.Session().GetSessionVars().StmtCtx, s, mysql.TypeDatetime, types.MaxFsp, nil) require.NoError(t, err) return time } diff --git a/executor/inspection_summary_test.go b/executor/inspection_summary_test.go index 5a28bbde464b0..bad9cfe1b21ba 100644 --- a/executor/inspection_summary_test.go +++ b/executor/inspection_summary_test.go @@ -51,7 +51,7 @@ func TestInspectionSummary(t *testing.T) { defer func() { require.NoError(t, failpoint.Disable(fpName)) }() datetime := func(s string) types.Time { - time, err := types.ParseTime(tk.Session().GetSessionVars().StmtCtx, s, mysql.TypeDatetime, types.MaxFsp) + time, err := types.ParseTime(tk.Session().GetSessionVars().StmtCtx, s, mysql.TypeDatetime, types.MaxFsp, nil) require.NoError(t, err) return time } diff --git a/executor/issuetest/BUILD.bazel b/executor/issuetest/BUILD.bazel new file mode 100644 index 0000000000000..12282131b98e0 --- /dev/null +++ b/executor/issuetest/BUILD.bazel @@ -0,0 +1,29 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_test") + +go_test( + name = "issuetest_test", + timeout = "short", + srcs = [ + "executor_issue_test.go", + "main_test.go", + ], + flaky = True, + shard_count = 50, + deps = [ + "//autoid_service", + "//config", + "//kv", + "//meta/autoid", + "//parser/auth", + "//parser/charset", + "//parser/mysql", + "//sessionctx/variable", + "//statistics", + "//testkit", + "//util", + "@com_github_pingcap_failpoint//:failpoint", + "@com_github_stretchr_testify//require", + "@com_github_tikv_client_go_v2//tikv", + "@org_uber_go_goleak//:goleak", + ], +) diff --git a/executor/executor_issue_test.go b/executor/issuetest/executor_issue_test.go similarity index 86% rename from executor/executor_issue_test.go rename to executor/issuetest/executor_issue_test.go index 5d2912f78f449..b97df5a5c11c1 100644 --- a/executor/executor_issue_test.go +++ b/executor/issuetest/executor_issue_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package executor_test +package issuetest_test import ( "context" @@ -22,6 +22,7 @@ import ( "testing" "github.com/pingcap/failpoint" + _ "github.com/pingcap/tidb/autoid_service" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/auth" @@ -532,6 +533,7 @@ func TestFix31537(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set @@foreign_key_checks=0") tk.MustExec(`CREATE TABLE trade ( t_id bigint(16) NOT NULL AUTO_INCREMENT, t_dts datetime NOT NULL, @@ -684,6 +686,9 @@ func TestIssue22231(t *testing.T) { tk.MustQuery("select cast('2020-05-28 23:59:59 00:00:00' as datetime)").Check(testkit.Rows("2020-05-28 23:59:59")) tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '2020-05-28 23:59:59 00:00:00'")) tk.MustExec("drop table if exists t_issue_22231") + + tk.MustQuery("SELECT CAST(\"1111111111-\" AS DATE);") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect datetime value: '1111111111-'")) } // TestIssue2612 is related with https://github.com/pingcap/tidb/issues/2612 @@ -1237,3 +1242,148 @@ func TestIssue33214(t *testing.T) { } } } + +func TestIssue982(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (c int auto_increment, key(c)) auto_id_cache 1;") + tk.MustExec("insert into t values();") + tk.MustExec("insert into t values();") + tk.MustQuery("select * from t;").Check(testkit.Rows("1", "2")) +} + +func TestIssue24627(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + for _, sql := range []string{ + "create table test(id float primary key clustered AUTO_INCREMENT, col1 int);", + "create table test(id float primary key nonclustered AUTO_INCREMENT, col1 int) AUTO_ID_CACHE 1;", + } { + tk.MustExec("drop table if exists test;") + tk.MustExec(sql) + tk.MustExec("replace into test(col1) values(1);") + tk.MustExec("replace into test(col1) values(2);") + tk.MustQuery("select * from test;").Check(testkit.Rows("1 1", "2 2")) + tk.MustExec("drop table test") + } + + for _, sql := range []string{ + "create table test2(id double primary key clustered AUTO_INCREMENT, col1 int);", + "create table test2(id double primary key nonclustered AUTO_INCREMENT, col1 int) AUTO_ID_CACHE 1;", + } { + tk.MustExec(sql) + tk.MustExec("replace into test2(col1) values(1);") + tk.MustExec("insert into test2(col1) values(1);") + tk.MustExec("replace into test2(col1) values(1);") + tk.MustExec("insert into test2(col1) values(1);") + tk.MustExec("replace into test2(col1) values(1);") + tk.MustExec("replace into test2(col1) values(1);") + tk.MustQuery("select * from test2").Check(testkit.Rows("1 1", "2 1", "3 1", "4 1", "5 1", "6 1")) + tk.MustExec("drop table test2") + } +} + +func TestIssue39618(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1;") + tk.MustExec(`CREATE TABLE t1 ( + c_int int(11) NOT NULL, + c_str varbinary(40) NOT NULL, + c_datetime datetime DEFAULT NULL, + c_timestamp timestamp NULL DEFAULT NULL, + c_double double DEFAULT NULL, + c_decimal decimal(12,6) DEFAULT NULL, + c_enum enum('blue','green','red','yellow','white','orange','purple') DEFAULT NULL, + PRIMARY KEY (c_int,c_str) /*T![clustered_index] CLUSTERED */, + KEY c_int_2 (c_int), + KEY c_decimal (c_decimal), + KEY c_datetime (c_datetime) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin +PARTITION BY LIST COLUMNS(c_int) +(PARTITION p0 VALUES IN (1,5,9,13,17,21,25,29,33,37), + PARTITION p1 VALUES IN (2,6,10,14,18,22,26,30,34,38), + PARTITION p2 VALUES IN (3,7,11,15,19,23,27,31,35,39), + PARTITION p3 VALUES IN (4,8,12,16,20,24,28,32,36,40));`) + tk.MustExec("INSERT INTO t1 VALUES (3,'bold goldberg','2020-01-07 12:08:19','2020-06-19 08:13:35',0.941002,5.303000,'yellow'),(1,'crazy wescoff','2020-03-24 21:51:02','2020-06-19 08:13:35',47.565275,6.313000,'orange'),(5,'relaxed gagarin','2020-05-20 11:36:26','2020-06-19 08:13:35',38.948617,3.143000,'green'),(9,'gifted vaughan','2020-04-09 16:19:45','2020-06-19 08:13:35',95.922976,8.708000,'yellow'),(2,'focused taussig','2020-05-17 17:58:34','2020-06-19 08:13:35',4.137803,4.902000,'white'),(6,'fervent yonath','2020-05-26 03:55:25','2020-06-19 08:13:35',72.394272,6.491000,'white'),(18,'mystifying bhaskara','2020-02-19 10:41:48','2020-06-19 08:13:35',10.832397,9.707000,'red'),(4,'goofy saha','2020-03-11 13:24:31','2020-06-19 08:13:35',39.007216,2.446000,'blue'),(20,'mystifying bhaskara','2020-04-03 11:33:27','2020-06-19 08:13:35',85.190386,6.787000,'blue');") + + tk.MustExec("DROP TABLE IF EXISTS t2;") + tk.MustExec(`CREATE TABLE t2 ( + c_int int(11) NOT NULL, + c_str varbinary(40) NOT NULL, + c_datetime datetime DEFAULT NULL, + c_timestamp timestamp NULL DEFAULT NULL, + c_double double DEFAULT NULL, + c_decimal decimal(12,6) DEFAULT NULL, + c_enum enum('blue','green','red','yellow','white','orange','purple') DEFAULT NULL, + PRIMARY KEY (c_int,c_str) /*T![clustered_index] CLUSTERED */, + KEY c_int_2 (c_int), + KEY c_decimal (c_decimal), + KEY c_datetime (c_datetime) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin +PARTITION BY LIST COLUMNS(c_int) +(PARTITION p0 VALUES IN (1,5,9,13,17,21,25,29,33,37), + PARTITION p1 VALUES IN (2,6,10,14,18,22,26,30,34,38), + PARTITION p2 VALUES IN (3,7,11,15,19,23,27,31,35,39), + PARTITION p3 VALUES IN (4,8,12,16,20,24,28,32,36,40)); +`) + + tk.MustExec("INSERT INTO t2 VALUES (1,'crazy wescoff','2020-03-24 21:51:02','2020-04-01 12:11:56',47.565275,6.313000,'orange'),(1,'unruffled johnson','2020-06-30 03:42:58','2020-06-14 00:16:50',35.444084,1.090000,'red'),(5,'relaxed gagarin','2020-05-20 11:36:26','2020-02-19 12:25:48',38.948617,3.143000,'green'),(9,'eloquent archimedes','2020-02-16 04:20:21','2020-05-23 15:42:33',32.310878,5.855000,'orange'),(9,'gifted vaughan','2020-04-09 16:19:45','2020-05-15 01:42:16',95.922976,8.708000,'yellow'),(13,'dreamy benz','2020-04-27 17:43:44','2020-03-27 06:33:03',39.539233,4.823000,'red'),(3,'bold goldberg','2020-01-07 12:08:19','2020-03-10 18:37:09',0.941002,5.303000,'yellow'),(3,'youthful yonath','2020-01-12 17:10:39','2020-06-10 15:13:44',66.288511,6.046000,'white'),(7,'upbeat bhabha','2020-04-29 01:17:05','2020-03-11 22:58:43',23.316987,9.026000,'yellow'),(11,'quizzical ritchie','2020-05-16 08:21:36','2020-03-05 19:23:25',75.019379,0.260000,'purple'),(2,'dazzling kepler','2020-04-11 04:38:59','2020-05-06 04:42:32',78.798503,2.274000,'purple'),(2,'focused taussig','2020-05-17 17:58:34','2020-02-25 09:11:03',4.137803,4.902000,'white'),(2,'sharp ptolemy',NULL,'2020-05-17 18:04:19',NULL,5.573000,'purple'),(6,'fervent yonath','2020-05-26 03:55:25','2020-05-06 14:23:44',72.394272,6.491000,'white'),(10,'musing wu','2020-04-03 11:33:27','2020-05-24 06:11:56',85.190386,6.787000,'blue'),(8,'hopeful keller','2020-02-19 10:41:48','2020-04-19 17:10:36',10.832397,9.707000,'red'),(12,'exciting boyd',NULL,'2020-03-28 18:27:23',NULL,9.249000,'blue');") + + tk.MustExec("set tidb_txn_assertion_level=strict;") + tk.MustExec("begin") + tk.MustExec("delete t1, t2 from t1, t2 where t1.c_enum in ('blue');") + tk.MustExec("commit") +} + +func TestIssue40158(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1 (_id int PRIMARY KEY, c1 char, index (c1));") + tk.MustExec("insert into t1 values (1, null);") + tk.MustQuery("select * from t1 where c1 is null and _id < 1;").Check(testkit.Rows()) +} + +func TestIssue40596(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec(`CREATE TABLE t1 ( + c1 double DEFAULT '1.335088259490289', + c2 set('mj','4s7ht','z','3i','b26','9','cg11','uvzcp','c','ns','fl9') NOT NULL DEFAULT 'mj,z,3i,9,cg11,c', + PRIMARY KEY (c2) /*T![clustered_index] CLUSTERED */, + KEY i1 (c1), + KEY i2 (c1), + KEY i3 (c1) +) ENGINE=InnoDB DEFAULT CHARSET=gbk COLLATE=gbk_chinese_ci;`) + tk.MustExec("INSERT INTO t1 VALUES (634.2783557491367,''),(2000.5041449792013,'4s7ht'),(634.2783557491367,'3i'),(634.2783557491367,'9'),(7803.173688589342,'uvzcp'),(634.2783557491367,'ns'),(634.2783557491367,'fl9');") + tk.MustExec(`CREATE TABLE t2 ( + c3 decimal(56,16) DEFAULT '931359772706767457132645278260455518957.9866038319986886', + c4 set('3bqx','g','6op3','2g','jf','arkd3','y0b','jdy','1g','ff5z','224b') DEFAULT '3bqx,2g,ff5z,224b', + c5 smallint(6) NOT NULL DEFAULT '-25973', + c6 year(4) DEFAULT '2122', + c7 text DEFAULT NULL, + PRIMARY KEY (c5) /*T![clustered_index] CLUSTERED */, + KEY i4 (c6), + KEY i5 (c5) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='' +PARTITION BY HASH (c5) PARTITIONS 4;`) + tk.MustExec("INSERT INTO t2 VALUES (465.0000000000000000,'jdy',-8542,2008,'FgZXe');") + tk.MustExec("set @@sql_mode='';") + tk.MustExec("set tidb_partition_prune_mode=dynamic;") + tk.MustExec("analyze table t1;") + tk.MustExec("analyze table t2;") + + // No nil pointer panic + tk.MustQuery("select /*+ inl_join( t1 , t2 ) */ avg( t2.c5 ) as r0 , repeat( t2.c7 , t2.c5 ) as r1 , locate( t2.c7 , t2.c7 ) as r2 , unhex( t1.c1 ) as r3 from t1 right join t2 on t1.c2 = t2.c5 where not( t2.c5 in ( -7860 ,-13384 ,-12940 ) ) and not( t1.c2 between '4s7ht' and 'mj' );").Check(testkit.Rows(" ")) + // Again, a simpler reproduce. + tk.MustQuery("select /*+ inl_join (t1, t2) */ t2.c5 from t1 right join t2 on t1.c2 = t2.c5 where not( t1.c2 between '4s7ht' and 'mj' );").Check(testkit.Rows()) +} diff --git a/executor/issuetest/main_test.go b/executor/issuetest/main_test.go new file mode 100644 index 0000000000000..daecbf2f06859 --- /dev/null +++ b/executor/issuetest/main_test.go @@ -0,0 +1,45 @@ +// 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, +// 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 issuetest + +import ( + "testing" + + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/meta/autoid" + "github.com/tikv/client-go/v2/tikv" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + autoid.SetStep(5000) + config.UpdateGlobal(func(conf *config.Config) { + conf.Instance.SlowThreshold = 30000 // 30s + conf.TiKVClient.AsyncCommit.SafeWindow = 0 + conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 + conf.Experimental.AllowsExpressionIndex = true + }) + tikv.EnableFailpoints() + + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/txnkv/transaction.keepAlive"), + } + goleak.VerifyTestMain(m, opts...) +} diff --git a/executor/join.go b/executor/join.go index 95ecee42c02d4..91533be2259cf 100644 --- a/executor/join.go +++ b/executor/join.go @@ -46,8 +46,35 @@ var ( _ Executor = &NestedLoopApplyExec{} ) +type hashJoinCtx struct { + sessCtx sessionctx.Context + allocPool chunk.Allocator + // concurrency is the number of partition, build and join workers. + concurrency uint + joinResultCh chan *hashjoinWorkerResult + // closeCh add a lock for closing executor. + closeCh chan struct{} + finished atomic.Bool + useOuterToBuild bool + isOuterJoin bool + isNullEQ []bool + buildFinished chan error + rowContainer *hashRowContainer + joinType plannercore.JoinType + outerMatchedStatus []*bitmap.ConcurrentBitmap + stats *hashJoinRuntimeStats + probeTypes []*types.FieldType + buildTypes []*types.FieldType + outerFilter expression.CNFExprs + isNullAware bool + memTracker *memory.Tracker // track memory usage. + diskTracker *disk.Tracker // track disk usage. +} + // probeSideTupleFetcher reads tuples from probeSideExec and send them to probeWorkers. type probeSideTupleFetcher struct { + *hashJoinCtx + probeSideExec Executor probeChkResourceCh chan *probeChkResource probeResultChs []chan *chunk.Chunk @@ -55,6 +82,11 @@ type probeSideTupleFetcher struct { } type probeWorker struct { + hashJoinCtx *hashJoinCtx + workerID uint + + probeKeyColIdx []int + probeNAKeyColIdx []int // We pre-alloc and reuse the Rows and RowPtrs for each probe goroutine, to avoid allocation frequently buildSideRows []chunk.Row buildSideRowPtrs []chunk.RowPtr @@ -67,51 +99,31 @@ type probeWorker struct { // for every naaj probe worker, pre-allocate the int slice for store the join column index to check. needCheckBuildRowPos []int needCheckProbeRowPos []int + probeChkResourceCh chan *probeChkResource + joinChkResourceCh chan *chunk.Chunk + probeResultCh chan *chunk.Chunk +} + +type buildWorker struct { + hashJoinCtx *hashJoinCtx + buildSideExec Executor + buildKeyColIdx []int + buildNAKeyColIdx []int } // HashJoinExec implements the hash join algorithm. type HashJoinExec struct { baseExecutor + *hashJoinCtx - probeSideTupleFetcher - probeWorkers []probeWorker - buildSideExec Executor - buildSideEstCount float64 - outerFilter expression.CNFExprs - probeKeys []*expression.Column - probeNAKeys []*expression.Column - buildKeys []*expression.Column - buildNAKeys []*expression.Column - isNullEQ []bool - probeTypes []*types.FieldType - buildTypes []*types.FieldType + probeSideTupleFetcher *probeSideTupleFetcher + probeWorkers []*probeWorker + buildWorker *buildWorker - // concurrency is the number of partition, build and join workers. - concurrency uint - rowContainer *hashRowContainer - buildFinished chan error - - // closeCh add a lock for closing executor. - closeCh chan struct{} - worker util.WaitGroupWrapper - waiter util.WaitGroupWrapper - joinType plannercore.JoinType + workerWg util.WaitGroupWrapper + waiterWg util.WaitGroupWrapper - joinChkResourceCh []chan *chunk.Chunk - joinResultCh chan *hashjoinWorkerResult - - memTracker *memory.Tracker // track memory usage. - diskTracker *disk.Tracker // track disk usage. - - outerMatchedStatus []*bitmap.ConcurrentBitmap - useOuterToBuild bool - - prepared bool - isOuterJoin bool - - finished atomic.Bool - - stats *hashJoinRuntimeStats + prepared bool } // probeChkResource stores the result of the join probe side fetch worker, @@ -152,14 +164,13 @@ func (e *HashJoinExec) Close() error { for i := range e.probeSideTupleFetcher.probeResultChs { channel.Clear(e.probeSideTupleFetcher.probeResultChs[i]) } - for i := range e.joinChkResourceCh { - close(e.joinChkResourceCh[i]) - channel.Clear(e.joinChkResourceCh[i]) + for i := range e.probeWorkers { + close(e.probeWorkers[i].joinChkResourceCh) + channel.Clear(e.probeWorkers[i].joinChkResourceCh) } e.probeSideTupleFetcher.probeChkResourceCh = nil - e.joinChkResourceCh = nil terror.Call(e.rowContainer.Close) - e.waiter.Wait() + e.waiterWg.Wait() } e.outerMatchedStatus = e.outerMatchedStatus[:0] for _, w := range e.probeWorkers { @@ -167,11 +178,15 @@ func (e *HashJoinExec) Close() error { w.buildSideRowPtrs = nil w.needCheckBuildRowPos = nil w.needCheckProbeRowPos = nil + w.joinChkResourceCh = nil } if e.stats != nil && e.rowContainer != nil { e.stats.hashStat = *e.rowContainer.stat } + if e.stats != nil { + defer e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) + } err := e.baseExecutor.Close() return err } @@ -184,60 +199,53 @@ func (e *HashJoinExec) Open(ctx context.Context) error { return err } e.prepared = false - e.memTracker = memory.NewTracker(e.id, -1) - e.memTracker.AttachTo(e.ctx.GetSessionVars().StmtCtx.MemTracker) + e.hashJoinCtx.memTracker = memory.NewTracker(e.id, -1) + e.hashJoinCtx.memTracker.AttachTo(e.ctx.GetSessionVars().StmtCtx.MemTracker) e.diskTracker = disk.NewTracker(e.id, -1) e.diskTracker.AttachTo(e.ctx.GetSessionVars().StmtCtx.DiskTracker) - e.worker = util.WaitGroupWrapper{} - e.waiter = util.WaitGroupWrapper{} + e.workerWg = util.WaitGroupWrapper{} + e.waiterWg = util.WaitGroupWrapper{} e.closeCh = make(chan struct{}) e.finished.Store(false) - if e.probeTypes == nil { - e.probeTypes = retTypes(e.probeSideTupleFetcher.probeSideExec) - } - if e.buildTypes == nil { - e.buildTypes = retTypes(e.buildSideExec) - } if e.runtimeStats != nil { e.stats = &hashJoinRuntimeStats{ concurrent: int(e.concurrency), } - e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) } return nil } // fetchProbeSideChunks get chunks from fetches chunks from the big table in a background goroutine // and sends the chunks to multiple channels which will be read by multiple join workers. -func (e *HashJoinExec) fetchProbeSideChunks(ctx context.Context) { +func (fetcher *probeSideTupleFetcher) fetchProbeSideChunks(ctx context.Context, maxChunkSize int) { hasWaitedForBuild := false for { - if e.finished.Load() { + if fetcher.finished.Load() { return } var probeSideResource *probeChkResource var ok bool select { - case <-e.closeCh: + case <-fetcher.closeCh: return - case probeSideResource, ok = <-e.probeSideTupleFetcher.probeChkResourceCh: + case probeSideResource, ok = <-fetcher.probeChkResourceCh: if !ok { return } } probeSideResult := probeSideResource.chk - if e.isOuterJoin { - required := int(atomic.LoadInt64(&e.probeSideTupleFetcher.requiredRows)) - probeSideResult.SetRequiredRows(required, e.maxChunkSize) + if fetcher.isOuterJoin { + required := int(atomic.LoadInt64(&fetcher.requiredRows)) + probeSideResult.SetRequiredRows(required, maxChunkSize) } - err := Next(ctx, e.probeSideTupleFetcher.probeSideExec, probeSideResult) + err := Next(ctx, fetcher.probeSideExec, probeSideResult) failpoint.Inject("ConsumeRandomPanic", nil) if err != nil { - e.joinResultCh <- &hashjoinWorkerResult{ + fetcher.joinResultCh <- &hashjoinWorkerResult{ err: err, } return @@ -248,23 +256,18 @@ func (e *HashJoinExec) fetchProbeSideChunks(ctx context.Context) { probeSideResult.Reset() } }) - if probeSideResult.NumRows() == 0 && !e.useOuterToBuild { - e.finished.Store(true) + if probeSideResult.NumRows() == 0 && !fetcher.useOuterToBuild { + fetcher.finished.Store(true) } - emptyBuild, buildErr := e.wait4BuildSide() + emptyBuild, buildErr := fetcher.wait4BuildSide() if buildErr != nil { - e.joinResultCh <- &hashjoinWorkerResult{ + fetcher.joinResultCh <- &hashjoinWorkerResult{ err: buildErr, } return } else if emptyBuild { return } - // after building is finished. the hash null bucket slice is allocated and determined. - // copy it for multi probe worker. - for _, w := range e.probeWorkers { - w.rowContainerForProbe.hashNANullBucket = e.rowContainer.hashNANullBucket - } hasWaitedForBuild = true } @@ -276,16 +279,16 @@ func (e *HashJoinExec) fetchProbeSideChunks(ctx context.Context) { } } -func (e *HashJoinExec) wait4BuildSide() (emptyBuild bool, err error) { +func (fetcher *probeSideTupleFetcher) wait4BuildSide() (emptyBuild bool, err error) { select { - case <-e.closeCh: + case <-fetcher.closeCh: return true, nil - case err := <-e.buildFinished: + case err := <-fetcher.buildFinished: if err != nil { return false, err } } - if e.rowContainer.Len() == uint64(0) && (e.joinType == plannercore.InnerJoin || e.joinType == plannercore.SemiJoin) { + if fetcher.rowContainer.Len() == uint64(0) && (fetcher.joinType == plannercore.InnerJoin || fetcher.joinType == plannercore.SemiJoin) { return true, nil } return false, nil @@ -293,7 +296,7 @@ func (e *HashJoinExec) wait4BuildSide() (emptyBuild bool, err error) { // fetchBuildSideRows fetches all rows from build side executor, and append them // to e.buildSideResult. -func (e *HashJoinExec) fetchBuildSideRows(ctx context.Context, chkCh chan<- *chunk.Chunk, errCh chan<- error, doneCh <-chan struct{}) { +func (w *buildWorker) fetchBuildSideRows(ctx context.Context, chkCh chan<- *chunk.Chunk, errCh chan<- error, doneCh <-chan struct{}) { defer close(chkCh) var err error failpoint.Inject("issue30289", func(val failpoint.Value) { @@ -303,12 +306,13 @@ func (e *HashJoinExec) fetchBuildSideRows(ctx context.Context, chkCh chan<- *chu return } }) + sessVars := w.hashJoinCtx.sessCtx.GetSessionVars() for { - if e.finished.Load() { + if w.hashJoinCtx.finished.Load() { return } - chk := e.ctx.GetSessionVars().GetNewChunkWithCapacity(e.buildSideExec.base().retFieldTypes, e.ctx.GetSessionVars().MaxChunkSize, e.ctx.GetSessionVars().MaxChunkSize, e.AllocPool) - err = Next(ctx, e.buildSideExec, chk) + chk := sessVars.GetNewChunkWithCapacity(w.buildSideExec.base().retFieldTypes, sessVars.MaxChunkSize, sessVars.MaxChunkSize, w.hashJoinCtx.allocPool) + err = Next(ctx, w.buildSideExec, chk) if err != nil { errCh <- errors.Trace(err) return @@ -321,7 +325,7 @@ func (e *HashJoinExec) fetchBuildSideRows(ctx context.Context, chkCh chan<- *chu select { case <-doneCh: return - case <-e.closeCh: + case <-w.hashJoinCtx.closeCh: return case chkCh <- chk: } @@ -329,12 +333,18 @@ func (e *HashJoinExec) fetchBuildSideRows(ctx context.Context, chkCh chan<- *chu } func (e *HashJoinExec) initializeForProbe() { + // e.joinResultCh is for transmitting the join result chunks to the main + // thread. + e.joinResultCh = make(chan *hashjoinWorkerResult, e.concurrency+1) + + e.probeSideTupleFetcher.hashJoinCtx = e.hashJoinCtx // e.probeSideTupleFetcher.probeResultChs is for transmitting the chunks which store the data of // probeSideExec, it'll be written by probe side worker goroutine, and read by join // workers. e.probeSideTupleFetcher.probeResultChs = make([]chan *chunk.Chunk, e.concurrency) for i := uint(0); i < e.concurrency; i++ { e.probeSideTupleFetcher.probeResultChs[i] = make(chan *chunk.Chunk, 1) + e.probeWorkers[i].probeResultCh = e.probeSideTupleFetcher.probeResultChs[i] } // e.probeChkResourceCh is for transmitting the used probeSideExec chunks from @@ -347,51 +357,44 @@ func (e *HashJoinExec) initializeForProbe() { } } - // e.joinChkResourceCh is for transmitting the reused join result chunks - // from the main thread to join worker goroutines. - e.joinChkResourceCh = make([]chan *chunk.Chunk, e.concurrency) + // e.probeWorker.joinChkResourceCh is for transmitting the reused join result chunks + // from the main thread to probe worker goroutines. for i := uint(0); i < e.concurrency; i++ { - e.joinChkResourceCh[i] = make(chan *chunk.Chunk, 1) - e.joinChkResourceCh[i] <- newFirstChunk(e) + e.probeWorkers[i].joinChkResourceCh = make(chan *chunk.Chunk, 1) + e.probeWorkers[i].joinChkResourceCh <- newFirstChunk(e) + e.probeWorkers[i].probeChkResourceCh = e.probeSideTupleFetcher.probeChkResourceCh } - - // e.joinResultCh is for transmitting the join result chunks to the main - // thread. - e.joinResultCh = make(chan *hashjoinWorkerResult, e.concurrency+1) } func (e *HashJoinExec) fetchAndProbeHashTable(ctx context.Context) { e.initializeForProbe() - e.worker.RunWithRecover(func() { + e.workerWg.RunWithRecover(func() { defer trace.StartRegion(ctx, "HashJoinProbeSideFetcher").End() - e.fetchProbeSideChunks(ctx) - }, e.handleProbeSideFetcherPanic) - - probeKeyColIdx := make([]int, len(e.probeKeys)) - probeNAKeColIdx := make([]int, len(e.probeNAKeys)) - for i := range e.probeKeys { - probeKeyColIdx[i] = e.probeKeys[i].Index - } - for i := range e.probeNAKeys { - probeNAKeColIdx[i] = e.probeNAKeys[i].Index - } + e.probeSideTupleFetcher.fetchProbeSideChunks(ctx, e.maxChunkSize) + }, e.probeSideTupleFetcher.handleProbeSideFetcherPanic) for i := uint(0); i < e.concurrency; i++ { - workID := i - e.worker.RunWithRecover(func() { + workerID := i + e.workerWg.RunWithRecover(func() { defer trace.StartRegion(ctx, "HashJoinWorker").End() - e.runJoinWorker(workID, probeKeyColIdx, probeNAKeColIdx) - }, e.handleJoinWorkerPanic) + e.probeWorkers[workerID].runJoinWorker() + }, e.probeWorkers[workerID].handleProbeWorkerPanic) } - e.waiter.RunWithRecover(e.waitJoinWorkersAndCloseResultChan, nil) + e.waiterWg.RunWithRecover(e.waitJoinWorkersAndCloseResultChan, nil) } -func (e *HashJoinExec) handleProbeSideFetcherPanic(r interface{}) { - for i := range e.probeSideTupleFetcher.probeResultChs { - close(e.probeSideTupleFetcher.probeResultChs[i]) +func (fetcher *probeSideTupleFetcher) handleProbeSideFetcherPanic(r interface{}) { + for i := range fetcher.probeResultChs { + close(fetcher.probeResultChs[i]) } if r != nil { - e.joinResultCh <- &hashjoinWorkerResult{err: errors.Errorf("%v", r)} + fetcher.joinResultCh <- &hashjoinWorkerResult{err: errors.Errorf("%v", r)} + } +} + +func (w *probeWorker) handleProbeWorkerPanic(r interface{}) { + if r != nil { + w.hashJoinCtx.joinResultCh <- &hashjoinWorkerResult{err: errors.Errorf("probeWorker[%d] meets error: %v", w.workerID, r)} } } @@ -402,27 +405,27 @@ func (e *HashJoinExec) handleJoinWorkerPanic(r interface{}) { } // Concurrently handling unmatched rows from the hash table -func (e *HashJoinExec) handleUnmatchedRowsFromHashTable(workerID uint) { - ok, joinResult := e.getNewJoinResult(workerID) +func (w *probeWorker) handleUnmatchedRowsFromHashTable() { + ok, joinResult := w.getNewJoinResult() if !ok { return } - numChks := e.rowContainer.NumChunks() - for i := int(workerID); i < numChks; i += int(e.concurrency) { - chk, err := e.rowContainer.GetChunk(i) + numChks := w.rowContainerForProbe.NumChunks() + for i := int(w.workerID); i < numChks; i += int(w.hashJoinCtx.concurrency) { + chk, err := w.rowContainerForProbe.GetChunk(i) if err != nil { // Catching the error and send it joinResult.err = err - e.joinResultCh <- joinResult + w.hashJoinCtx.joinResultCh <- joinResult return } for j := 0; j < chk.NumRows(); j++ { - if !e.outerMatchedStatus[i].UnsafeIsSet(j) { // process unmatched outer rows - e.probeWorkers[workerID].joiner.onMissMatch(false, chk.GetRow(j), joinResult.chk) + if !w.hashJoinCtx.outerMatchedStatus[i].UnsafeIsSet(j) { // process unmatched outer rows + w.joiner.onMissMatch(false, chk.GetRow(j), joinResult.chk) } if joinResult.chk.IsFull() { - e.joinResultCh <- joinResult - ok, joinResult = e.getNewJoinResult(workerID) + w.hashJoinCtx.joinResultCh <- joinResult + ok, joinResult = w.getNewJoinResult() if !ok { return } @@ -433,32 +436,32 @@ func (e *HashJoinExec) handleUnmatchedRowsFromHashTable(workerID uint) { if joinResult == nil { return } else if joinResult.err != nil || (joinResult.chk != nil && joinResult.chk.NumRows() > 0) { - e.joinResultCh <- joinResult + w.hashJoinCtx.joinResultCh <- joinResult } } func (e *HashJoinExec) waitJoinWorkersAndCloseResultChan() { - e.worker.Wait() + e.workerWg.Wait() if e.useOuterToBuild { // Concurrently handling unmatched rows from the hash table at the tail for i := uint(0); i < e.concurrency; i++ { var workerID = i - e.worker.RunWithRecover(func() { e.handleUnmatchedRowsFromHashTable(workerID) }, e.handleJoinWorkerPanic) + e.workerWg.RunWithRecover(func() { e.probeWorkers[workerID].handleUnmatchedRowsFromHashTable() }, e.handleJoinWorkerPanic) } - e.worker.Wait() + e.workerWg.Wait() } close(e.joinResultCh) } -func (e *HashJoinExec) runJoinWorker(workerID uint, probeKeyColIdx, probeNAKeyColIdx []int) { +func (w *probeWorker) runJoinWorker() { probeTime := int64(0) - if e.stats != nil { + if w.hashJoinCtx.stats != nil { start := time.Now() defer func() { t := time.Since(start) - atomic.AddInt64(&e.stats.probe, probeTime) - atomic.AddInt64(&e.stats.fetchAndProbe, int64(t)) - e.stats.setMaxFetchAndProbeTime(int64(t)) + atomic.AddInt64(&w.hashJoinCtx.stats.probe, probeTime) + atomic.AddInt64(&w.hashJoinCtx.stats.fetchAndProbe, int64(t)) + w.hashJoinCtx.stats.setMaxFetchAndProbeTime(int64(t)) }() } @@ -466,38 +469,38 @@ func (e *HashJoinExec) runJoinWorker(workerID uint, probeKeyColIdx, probeNAKeyCo probeSideResult *chunk.Chunk selected = make([]bool, 0, chunk.InitialCapacity) ) - ok, joinResult := e.getNewJoinResult(workerID) + ok, joinResult := w.getNewJoinResult() if !ok { return } // Read and filter probeSideResult, and join the probeSideResult with the build side rows. emptyProbeSideResult := &probeChkResource{ - dest: e.probeSideTupleFetcher.probeResultChs[workerID], + dest: w.probeResultCh, } hCtx := &hashContext{ - allTypes: e.probeTypes, - keyColIdx: probeKeyColIdx, - naKeyColIdx: probeNAKeyColIdx, + allTypes: w.hashJoinCtx.probeTypes, + keyColIdx: w.probeKeyColIdx, + naKeyColIdx: w.probeNAKeyColIdx, } for ok := true; ok; { - if e.finished.Load() { + if w.hashJoinCtx.finished.Load() { break } select { - case <-e.closeCh: + case <-w.hashJoinCtx.closeCh: return - case probeSideResult, ok = <-e.probeSideTupleFetcher.probeResultChs[workerID]: + case probeSideResult, ok = <-w.probeResultCh: } failpoint.Inject("ConsumeRandomPanic", nil) if !ok { break } start := time.Now() - if e.useOuterToBuild { - ok, joinResult = e.join2ChunkForOuterHashJoin(workerID, probeSideResult, hCtx, e.probeWorkers[workerID].rowContainerForProbe, joinResult) + if w.hashJoinCtx.useOuterToBuild { + ok, joinResult = w.join2ChunkForOuterHashJoin(probeSideResult, hCtx, joinResult) } else { - ok, joinResult = e.join2Chunk(workerID, probeSideResult, hCtx, e.probeWorkers[workerID].rowContainerForProbe, joinResult, selected) + ok, joinResult = w.join2Chunk(probeSideResult, hCtx, joinResult, selected) } probeTime += int64(time.Since(start)) if !ok { @@ -505,22 +508,22 @@ func (e *HashJoinExec) runJoinWorker(workerID uint, probeKeyColIdx, probeNAKeyCo } probeSideResult.Reset() emptyProbeSideResult.chk = probeSideResult - e.probeSideTupleFetcher.probeChkResourceCh <- emptyProbeSideResult + w.probeChkResourceCh <- emptyProbeSideResult } // note joinResult.chk may be nil when getNewJoinResult fails in loops if joinResult == nil { return } else if joinResult.err != nil || (joinResult.chk != nil && joinResult.chk.NumRows() > 0) { - e.joinResultCh <- joinResult + w.hashJoinCtx.joinResultCh <- joinResult } else if joinResult.chk != nil && joinResult.chk.NumRows() == 0 { - e.joinChkResourceCh[workerID] <- joinResult.chk + w.joinChkResourceCh <- joinResult.chk } } -func (e *HashJoinExec) joinMatchedProbeSideRow2ChunkForOuterHashJoin(workerID uint, probeKey uint64, probeSideRow chunk.Row, hCtx *hashContext, rowContainer *hashRowContainer, joinResult *hashjoinWorkerResult) (bool, *hashjoinWorkerResult) { +func (w *probeWorker) joinMatchedProbeSideRow2ChunkForOuterHashJoin(probeKey uint64, probeSideRow chunk.Row, hCtx *hashContext, joinResult *hashjoinWorkerResult) (bool, *hashjoinWorkerResult) { var err error - e.probeWorkers[workerID].buildSideRows, e.probeWorkers[workerID].buildSideRowPtrs, err = rowContainer.GetMatchedRowsAndPtrs(probeKey, probeSideRow, hCtx, e.probeWorkers[workerID].buildSideRows, e.probeWorkers[workerID].buildSideRowPtrs, true) - buildSideRows, rowsPtrs := e.probeWorkers[workerID].buildSideRows, e.probeWorkers[workerID].buildSideRowPtrs + w.buildSideRows, w.buildSideRowPtrs, err = w.rowContainerForProbe.GetMatchedRowsAndPtrs(probeKey, probeSideRow, hCtx, w.buildSideRows, w.buildSideRowPtrs, true) + buildSideRows, rowsPtrs := w.buildSideRows, w.buildSideRowPtrs if err != nil { joinResult.err = err return false, joinResult @@ -529,25 +532,25 @@ func (e *HashJoinExec) joinMatchedProbeSideRow2ChunkForOuterHashJoin(workerID ui return true, joinResult } - iter := e.probeWorkers[workerID].rowIters + iter := w.rowIters iter.Reset(buildSideRows) var outerMatchStatus []outerRowStatusFlag rowIdx, ok := 0, false for iter.Begin(); iter.Current() != iter.End(); { - outerMatchStatus, err = e.probeWorkers[workerID].joiner.tryToMatchOuters(iter, probeSideRow, joinResult.chk, outerMatchStatus) + outerMatchStatus, err = w.joiner.tryToMatchOuters(iter, probeSideRow, joinResult.chk, outerMatchStatus) if err != nil { joinResult.err = err return false, joinResult } for i := range outerMatchStatus { if outerMatchStatus[i] == outerRowMatched { - e.outerMatchedStatus[rowsPtrs[rowIdx+i].ChkIdx].Set(int(rowsPtrs[rowIdx+i].RowIdx)) + w.hashJoinCtx.outerMatchedStatus[rowsPtrs[rowIdx+i].ChkIdx].Set(int(rowsPtrs[rowIdx+i].RowIdx)) } } rowIdx += len(outerMatchStatus) if joinResult.chk.IsFull() { - e.joinResultCh <- joinResult - ok, joinResult = e.getNewJoinResult(workerID) + w.hashJoinCtx.joinResultCh <- joinResult + ok, joinResult = w.getNewJoinResult() if !ok { return false, joinResult } @@ -557,8 +560,7 @@ func (e *HashJoinExec) joinMatchedProbeSideRow2ChunkForOuterHashJoin(workerID ui } // joinNAALOSJMatchProbeSideRow2Chunk implement the matching logic for NA-AntiLeftOuterSemiJoin -func (e *HashJoinExec) joinNAALOSJMatchProbeSideRow2Chunk(workerID uint, probeKey uint64, probeKeyNullBits *bitmap.ConcurrentBitmap, probeSideRow chunk.Row, hCtx *hashContext, - rowContainer *hashRowContainer, joinResult *hashjoinWorkerResult) (bool, *hashjoinWorkerResult) { +func (w *probeWorker) joinNAALOSJMatchProbeSideRow2Chunk(probeKey uint64, probeKeyNullBits *bitmap.ConcurrentBitmap, probeSideRow chunk.Row, hCtx *hashContext, joinResult *hashjoinWorkerResult) (bool, *hashjoinWorkerResult) { var ( err error ok bool @@ -568,17 +570,17 @@ func (e *HashJoinExec) joinNAALOSJMatchProbeSideRow2Chunk(workerID uint, probeKe // because AntiLeftOuterSemiJoin cares about the scalar value. If we both have a match from null // bucket and same key bucket, we should return the result as from same-key bucket // rather than from null bucket. - e.probeWorkers[workerID].buildSideRows, err = rowContainer.GetMatchedRows(probeKey, probeSideRow, hCtx, e.probeWorkers[workerID].buildSideRows) - buildSideRows := e.probeWorkers[workerID].buildSideRows + w.buildSideRows, err = w.rowContainerForProbe.GetMatchedRows(probeKey, probeSideRow, hCtx, w.buildSideRows) + buildSideRows := w.buildSideRows if err != nil { joinResult.err = err return false, joinResult } if len(buildSideRows) != 0 { - iter1 := e.probeWorkers[workerID].rowIters + iter1 := w.rowIters iter1.Reset(buildSideRows) for iter1.Begin(); iter1.Current() != iter1.End(); { - matched, _, err := e.probeWorkers[workerID].joiner.tryToMatchInners(probeSideRow, iter1, joinResult.chk, LeftNotNullRightNotNull) + matched, _, err := w.joiner.tryToMatchInners(probeSideRow, iter1, joinResult.chk, LeftNotNullRightNotNull) if err != nil { joinResult.err = err return false, joinResult @@ -589,8 +591,8 @@ func (e *HashJoinExec) joinNAALOSJMatchProbeSideRow2Chunk(workerID uint, probeKe return true, joinResult } if joinResult.chk.IsFull() { - e.joinResultCh <- joinResult - ok, joinResult = e.getNewJoinResult(workerID) + w.hashJoinCtx.joinResultCh <- joinResult + ok, joinResult = w.getNewJoinResult() if !ok { return false, joinResult } @@ -598,8 +600,8 @@ func (e *HashJoinExec) joinNAALOSJMatchProbeSideRow2Chunk(workerID uint, probeKe } } // step2: match the null bucket secondly. - e.probeWorkers[workerID].buildSideRows, err = rowContainer.GetNullBucketRows(hCtx, probeSideRow, probeKeyNullBits, e.probeWorkers[workerID].buildSideRows, e.probeWorkers[workerID].needCheckBuildRowPos, e.probeWorkers[workerID].needCheckProbeRowPos) - buildSideRows = e.probeWorkers[workerID].buildSideRows + w.buildSideRows, err = w.rowContainerForProbe.GetNullBucketRows(hCtx, probeSideRow, probeKeyNullBits, w.buildSideRows, w.needCheckBuildRowPos, w.needCheckProbeRowPos) + buildSideRows = w.buildSideRows if err != nil { joinResult.err = err return false, joinResult @@ -607,13 +609,13 @@ func (e *HashJoinExec) joinNAALOSJMatchProbeSideRow2Chunk(workerID uint, probeKe if len(buildSideRows) == 0 { // when reach here, it means we couldn't find a valid same key match from same-key bucket yet // and the null bucket is empty. so the result should be . - e.probeWorkers[workerID].joiner.onMissMatch(false, probeSideRow, joinResult.chk) + w.joiner.onMissMatch(false, probeSideRow, joinResult.chk) return true, joinResult } - iter2 := e.probeWorkers[workerID].rowIters + iter2 := w.rowIters iter2.Reset(buildSideRows) for iter2.Begin(); iter2.Current() != iter2.End(); { - matched, _, err := e.probeWorkers[workerID].joiner.tryToMatchInners(probeSideRow, iter2, joinResult.chk, LeftNotNullRightHasNull) + matched, _, err := w.joiner.tryToMatchInners(probeSideRow, iter2, joinResult.chk, LeftNotNullRightHasNull) if err != nil { joinResult.err = err return false, joinResult @@ -624,8 +626,8 @@ func (e *HashJoinExec) joinNAALOSJMatchProbeSideRow2Chunk(workerID uint, probeKe return true, joinResult } if joinResult.chk.IsFull() { - e.joinResultCh <- joinResult - ok, joinResult = e.getNewJoinResult(workerID) + w.hashJoinCtx.joinResultCh <- joinResult + ok, joinResult = w.getNewJoinResult() if !ok { return false, joinResult } @@ -635,7 +637,7 @@ func (e *HashJoinExec) joinNAALOSJMatchProbeSideRow2Chunk(workerID uint, probeKe // case1: x NOT IN (empty set): if other key bucket don't have the valid rows yet. // case2: x NOT IN (l,m,n...): if other key bucket do have the valid rows. // both cases mean the result should be - e.probeWorkers[workerID].joiner.onMissMatch(false, probeSideRow, joinResult.chk) + w.joiner.onMissMatch(false, probeSideRow, joinResult.chk) return true, joinResult } // when left side has null values, all we want is to find a valid build side rows (past other condition) @@ -643,17 +645,17 @@ func (e *HashJoinExec) joinNAALOSJMatchProbeSideRow2Chunk(workerID uint, probeKe // case1: NOT IN (empty set): ----------------------> result is . // case2: NOT IN (at least a valid inner row) ------------------> result is . // Step1: match null bucket (assumption that null bucket is quite smaller than all hash table bucket rows) - e.probeWorkers[workerID].buildSideRows, err = rowContainer.GetNullBucketRows(hCtx, probeSideRow, probeKeyNullBits, e.probeWorkers[workerID].buildSideRows, e.probeWorkers[workerID].needCheckBuildRowPos, e.probeWorkers[workerID].needCheckProbeRowPos) - buildSideRows := e.probeWorkers[workerID].buildSideRows + w.buildSideRows, err = w.rowContainerForProbe.GetNullBucketRows(hCtx, probeSideRow, probeKeyNullBits, w.buildSideRows, w.needCheckBuildRowPos, w.needCheckProbeRowPos) + buildSideRows := w.buildSideRows if err != nil { joinResult.err = err return false, joinResult } if len(buildSideRows) != 0 { - iter1 := e.probeWorkers[workerID].rowIters + iter1 := w.rowIters iter1.Reset(buildSideRows) for iter1.Begin(); iter1.Current() != iter1.End(); { - matched, _, err := e.probeWorkers[workerID].joiner.tryToMatchInners(probeSideRow, iter1, joinResult.chk, LeftHasNullRightHasNull) + matched, _, err := w.joiner.tryToMatchInners(probeSideRow, iter1, joinResult.chk, LeftHasNullRightHasNull) if err != nil { joinResult.err = err return false, joinResult @@ -664,8 +666,8 @@ func (e *HashJoinExec) joinNAALOSJMatchProbeSideRow2Chunk(workerID uint, probeKe return true, joinResult } if joinResult.chk.IsFull() { - e.joinResultCh <- joinResult - ok, joinResult = e.getNewJoinResult(workerID) + w.hashJoinCtx.joinResultCh <- joinResult + ok, joinResult = w.getNewJoinResult() if !ok { return false, joinResult } @@ -673,8 +675,8 @@ func (e *HashJoinExec) joinNAALOSJMatchProbeSideRow2Chunk(workerID uint, probeKe } } // Step2: match all hash table bucket build rows (use probeKeyNullBits to filter if any). - e.probeWorkers[workerID].buildSideRows, err = rowContainer.GetAllMatchedRows(hCtx, probeSideRow, probeKeyNullBits, e.probeWorkers[workerID].buildSideRows, e.probeWorkers[workerID].needCheckBuildRowPos, e.probeWorkers[workerID].needCheckProbeRowPos) - buildSideRows = e.probeWorkers[workerID].buildSideRows + w.buildSideRows, err = w.rowContainerForProbe.GetAllMatchedRows(hCtx, probeSideRow, probeKeyNullBits, w.buildSideRows, w.needCheckBuildRowPos, w.needCheckProbeRowPos) + buildSideRows = w.buildSideRows if err != nil { joinResult.err = err return false, joinResult @@ -682,13 +684,13 @@ func (e *HashJoinExec) joinNAALOSJMatchProbeSideRow2Chunk(workerID uint, probeKe if len(buildSideRows) == 0 { // when reach here, it means we couldn't return it quickly in null bucket, and same-bucket is empty, // which means x NOT IN (empty set) or x NOT IN (l,m,n), the result should be - e.probeWorkers[workerID].joiner.onMissMatch(false, probeSideRow, joinResult.chk) + w.joiner.onMissMatch(false, probeSideRow, joinResult.chk) return true, joinResult } - iter2 := e.probeWorkers[workerID].rowIters + iter2 := w.rowIters iter2.Reset(buildSideRows) for iter2.Begin(); iter2.Current() != iter2.End(); { - matched, _, err := e.probeWorkers[workerID].joiner.tryToMatchInners(probeSideRow, iter2, joinResult.chk, LeftHasNullRightNotNull) + matched, _, err := w.joiner.tryToMatchInners(probeSideRow, iter2, joinResult.chk, LeftHasNullRightNotNull) if err != nil { joinResult.err = err return false, joinResult @@ -699,8 +701,8 @@ func (e *HashJoinExec) joinNAALOSJMatchProbeSideRow2Chunk(workerID uint, probeKe return true, joinResult } if joinResult.chk.IsFull() { - e.joinResultCh <- joinResult - ok, joinResult = e.getNewJoinResult(workerID) + w.hashJoinCtx.joinResultCh <- joinResult + ok, joinResult = w.getNewJoinResult() if !ok { return false, joinResult } @@ -709,13 +711,12 @@ func (e *HashJoinExec) joinNAALOSJMatchProbeSideRow2Chunk(workerID uint, probeKe // step3: if we couldn't return it quickly in null bucket and all hash bucket, here means only one cases: // case1: NOT IN (empty set): // empty set comes from no rows from all bucket can pass other condition. the result should be - e.probeWorkers[workerID].joiner.onMissMatch(false, probeSideRow, joinResult.chk) + w.joiner.onMissMatch(false, probeSideRow, joinResult.chk) return true, joinResult } // joinNAASJMatchProbeSideRow2Chunk implement the matching logic for NA-AntiSemiJoin -func (e *HashJoinExec) joinNAASJMatchProbeSideRow2Chunk(workerID uint, probeKey uint64, probeKeyNullBits *bitmap.ConcurrentBitmap, probeSideRow chunk.Row, hCtx *hashContext, - rowContainer *hashRowContainer, joinResult *hashjoinWorkerResult) (bool, *hashjoinWorkerResult) { +func (w *probeWorker) joinNAASJMatchProbeSideRow2Chunk(probeKey uint64, probeKeyNullBits *bitmap.ConcurrentBitmap, probeSideRow chunk.Row, hCtx *hashContext, joinResult *hashjoinWorkerResult) (bool, *hashjoinWorkerResult) { var ( err error ok bool @@ -723,17 +724,17 @@ func (e *HashJoinExec) joinNAASJMatchProbeSideRow2Chunk(workerID uint, probeKey if probeKeyNullBits == nil { // step1: match null bucket first. // need fetch the "valid" rows every time. (nullBits map check is necessary) - e.probeWorkers[workerID].buildSideRows, err = rowContainer.GetNullBucketRows(hCtx, probeSideRow, probeKeyNullBits, e.probeWorkers[workerID].buildSideRows, e.probeWorkers[workerID].needCheckBuildRowPos, e.probeWorkers[workerID].needCheckProbeRowPos) - buildSideRows := e.probeWorkers[workerID].buildSideRows + w.buildSideRows, err = w.rowContainerForProbe.GetNullBucketRows(hCtx, probeSideRow, probeKeyNullBits, w.buildSideRows, w.needCheckBuildRowPos, w.needCheckProbeRowPos) + buildSideRows := w.buildSideRows if err != nil { joinResult.err = err return false, joinResult } if len(buildSideRows) != 0 { - iter1 := e.probeWorkers[workerID].rowIters + iter1 := w.rowIters iter1.Reset(buildSideRows) for iter1.Begin(); iter1.Current() != iter1.End(); { - matched, _, err := e.probeWorkers[workerID].joiner.tryToMatchInners(probeSideRow, iter1, joinResult.chk) + matched, _, err := w.joiner.tryToMatchInners(probeSideRow, iter1, joinResult.chk) if err != nil { joinResult.err = err return false, joinResult @@ -744,8 +745,8 @@ func (e *HashJoinExec) joinNAASJMatchProbeSideRow2Chunk(workerID uint, probeKey return true, joinResult } if joinResult.chk.IsFull() { - e.joinResultCh <- joinResult - ok, joinResult = e.getNewJoinResult(workerID) + w.hashJoinCtx.joinResultCh <- joinResult + ok, joinResult = w.getNewJoinResult() if !ok { return false, joinResult } @@ -753,8 +754,8 @@ func (e *HashJoinExec) joinNAASJMatchProbeSideRow2Chunk(workerID uint, probeKey } } // step2: then same key bucket. - e.probeWorkers[workerID].buildSideRows, err = rowContainer.GetMatchedRows(probeKey, probeSideRow, hCtx, e.probeWorkers[workerID].buildSideRows) - buildSideRows = e.probeWorkers[workerID].buildSideRows + w.buildSideRows, err = w.rowContainerForProbe.GetMatchedRows(probeKey, probeSideRow, hCtx, w.buildSideRows) + buildSideRows = w.buildSideRows if err != nil { joinResult.err = err return false, joinResult @@ -762,13 +763,13 @@ func (e *HashJoinExec) joinNAASJMatchProbeSideRow2Chunk(workerID uint, probeKey if len(buildSideRows) == 0 { // when reach here, it means we couldn't return it quickly in null bucket, and same-bucket is empty, // which means x NOT IN (empty set), accept the rhs row. - e.probeWorkers[workerID].joiner.onMissMatch(false, probeSideRow, joinResult.chk) + w.joiner.onMissMatch(false, probeSideRow, joinResult.chk) return true, joinResult } - iter2 := e.probeWorkers[workerID].rowIters + iter2 := w.rowIters iter2.Reset(buildSideRows) for iter2.Begin(); iter2.Current() != iter2.End(); { - matched, _, err := e.probeWorkers[workerID].joiner.tryToMatchInners(probeSideRow, iter2, joinResult.chk) + matched, _, err := w.joiner.tryToMatchInners(probeSideRow, iter2, joinResult.chk) if err != nil { joinResult.err = err return false, joinResult @@ -779,8 +780,8 @@ func (e *HashJoinExec) joinNAASJMatchProbeSideRow2Chunk(workerID uint, probeKey return true, joinResult } if joinResult.chk.IsFull() { - e.joinResultCh <- joinResult - ok, joinResult = e.getNewJoinResult(workerID) + w.hashJoinCtx.joinResultCh <- joinResult + ok, joinResult = w.getNewJoinResult() if !ok { return false, joinResult } @@ -790,7 +791,7 @@ func (e *HashJoinExec) joinNAASJMatchProbeSideRow2Chunk(workerID uint, probeKey // case1: x NOT IN (empty set): if other key bucket don't have the valid rows yet. // case2: x NOT IN (l,m,n...): if other key bucket do have the valid rows. // both cases should accept the rhs row. - e.probeWorkers[workerID].joiner.onMissMatch(false, probeSideRow, joinResult.chk) + w.joiner.onMissMatch(false, probeSideRow, joinResult.chk) return true, joinResult } // when left side has null values, all we want is to find a valid build side rows (passed from other condition) @@ -798,17 +799,17 @@ func (e *HashJoinExec) joinNAASJMatchProbeSideRow2Chunk(workerID uint, probeKey // case1: NOT IN (empty set): ----------------------> accept rhs row. // case2: NOT IN (at least a valid inner row) ------------------> unknown result, refuse rhs row. // Step1: match null bucket (assumption that null bucket is quite smaller than all hash table bucket rows) - e.probeWorkers[workerID].buildSideRows, err = rowContainer.GetNullBucketRows(hCtx, probeSideRow, probeKeyNullBits, e.probeWorkers[workerID].buildSideRows, e.probeWorkers[workerID].needCheckBuildRowPos, e.probeWorkers[workerID].needCheckProbeRowPos) - buildSideRows := e.probeWorkers[workerID].buildSideRows + w.buildSideRows, err = w.rowContainerForProbe.GetNullBucketRows(hCtx, probeSideRow, probeKeyNullBits, w.buildSideRows, w.needCheckBuildRowPos, w.needCheckProbeRowPos) + buildSideRows := w.buildSideRows if err != nil { joinResult.err = err return false, joinResult } if len(buildSideRows) != 0 { - iter1 := e.probeWorkers[workerID].rowIters + iter1 := w.rowIters iter1.Reset(buildSideRows) for iter1.Begin(); iter1.Current() != iter1.End(); { - matched, _, err := e.probeWorkers[workerID].joiner.tryToMatchInners(probeSideRow, iter1, joinResult.chk) + matched, _, err := w.joiner.tryToMatchInners(probeSideRow, iter1, joinResult.chk) if err != nil { joinResult.err = err return false, joinResult @@ -819,8 +820,8 @@ func (e *HashJoinExec) joinNAASJMatchProbeSideRow2Chunk(workerID uint, probeKey return true, joinResult } if joinResult.chk.IsFull() { - e.joinResultCh <- joinResult - ok, joinResult = e.getNewJoinResult(workerID) + w.hashJoinCtx.joinResultCh <- joinResult + ok, joinResult = w.getNewJoinResult() if !ok { return false, joinResult } @@ -828,8 +829,8 @@ func (e *HashJoinExec) joinNAASJMatchProbeSideRow2Chunk(workerID uint, probeKey } } // Step2: match all hash table bucket build rows. - e.probeWorkers[workerID].buildSideRows, err = rowContainer.GetAllMatchedRows(hCtx, probeSideRow, probeKeyNullBits, e.probeWorkers[workerID].buildSideRows, e.probeWorkers[workerID].needCheckBuildRowPos, e.probeWorkers[workerID].needCheckProbeRowPos) - buildSideRows = e.probeWorkers[workerID].buildSideRows + w.buildSideRows, err = w.rowContainerForProbe.GetAllMatchedRows(hCtx, probeSideRow, probeKeyNullBits, w.buildSideRows, w.needCheckBuildRowPos, w.needCheckProbeRowPos) + buildSideRows = w.buildSideRows if err != nil { joinResult.err = err return false, joinResult @@ -837,13 +838,13 @@ func (e *HashJoinExec) joinNAASJMatchProbeSideRow2Chunk(workerID uint, probeKey if len(buildSideRows) == 0 { // when reach here, it means we couldn't return it quickly in null bucket, and same-bucket is empty, // which means NOT IN (empty set) or NOT IN (no valid rows) accept the rhs row. - e.probeWorkers[workerID].joiner.onMissMatch(false, probeSideRow, joinResult.chk) + w.joiner.onMissMatch(false, probeSideRow, joinResult.chk) return true, joinResult } - iter2 := e.probeWorkers[workerID].rowIters + iter2 := w.rowIters iter2.Reset(buildSideRows) for iter2.Begin(); iter2.Current() != iter2.End(); { - matched, _, err := e.probeWorkers[workerID].joiner.tryToMatchInners(probeSideRow, iter2, joinResult.chk) + matched, _, err := w.joiner.tryToMatchInners(probeSideRow, iter2, joinResult.chk) if err != nil { joinResult.err = err return false, joinResult @@ -854,8 +855,8 @@ func (e *HashJoinExec) joinNAASJMatchProbeSideRow2Chunk(workerID uint, probeKey return true, joinResult } if joinResult.chk.IsFull() { - e.joinResultCh <- joinResult - ok, joinResult = e.getNewJoinResult(workerID) + w.hashJoinCtx.joinResultCh <- joinResult + ok, joinResult = w.getNewJoinResult() if !ok { return false, joinResult } @@ -864,7 +865,7 @@ func (e *HashJoinExec) joinNAASJMatchProbeSideRow2Chunk(workerID uint, probeKey // step3: if we couldn't return it quickly in null bucket and all hash bucket, here means only one cases: // case1: NOT IN (empty set): // empty set comes from no rows from all bucket can pass other condition. we should accept the rhs row. - e.probeWorkers[workerID].joiner.onMissMatch(false, probeSideRow, joinResult.chk) + w.joiner.onMissMatch(false, probeSideRow, joinResult.chk) return true, joinResult } @@ -887,38 +888,37 @@ func (e *HashJoinExec) joinNAASJMatchProbeSideRow2Chunk(workerID uint, probeKey // // For NA-AntiLeftOuterSemiJoin, we couldn't match null-bucket first, because once y set has a same key x and null // key, we should return the result as left side row appended with a scalar value 0 which is from same key matching failure. -func (e *HashJoinExec) joinNAAJMatchProbeSideRow2Chunk(workerID uint, probeKey uint64, probeKeyNullBits *bitmap.ConcurrentBitmap, probeSideRow chunk.Row, hCtx *hashContext, - rowContainer *hashRowContainer, joinResult *hashjoinWorkerResult) (bool, *hashjoinWorkerResult) { - NAAntiSemiJoin := e.joinType == plannercore.AntiSemiJoin && len(e.buildNAKeys) > 0 - NAAntiLeftOuterSemiJoin := e.joinType == plannercore.AntiLeftOuterSemiJoin && len(e.buildNAKeys) > 0 +func (w *probeWorker) joinNAAJMatchProbeSideRow2Chunk(probeKey uint64, probeKeyNullBits *bitmap.ConcurrentBitmap, probeSideRow chunk.Row, hCtx *hashContext, joinResult *hashjoinWorkerResult) (bool, *hashjoinWorkerResult) { + NAAntiSemiJoin := w.hashJoinCtx.joinType == plannercore.AntiSemiJoin && w.hashJoinCtx.isNullAware + NAAntiLeftOuterSemiJoin := w.hashJoinCtx.joinType == plannercore.AntiLeftOuterSemiJoin && w.hashJoinCtx.isNullAware if NAAntiSemiJoin { - return e.joinNAASJMatchProbeSideRow2Chunk(workerID, probeKey, probeKeyNullBits, probeSideRow, hCtx, rowContainer, joinResult) + return w.joinNAASJMatchProbeSideRow2Chunk(probeKey, probeKeyNullBits, probeSideRow, hCtx, joinResult) } if NAAntiLeftOuterSemiJoin { - return e.joinNAALOSJMatchProbeSideRow2Chunk(workerID, probeKey, probeKeyNullBits, probeSideRow, hCtx, rowContainer, joinResult) + return w.joinNAALOSJMatchProbeSideRow2Chunk(probeKey, probeKeyNullBits, probeSideRow, hCtx, joinResult) } // shouldn't be here, not a valid NAAJ. return false, joinResult } -func (e *HashJoinExec) joinMatchedProbeSideRow2Chunk(workerID uint, probeKey uint64, probeSideRow chunk.Row, hCtx *hashContext, - rowContainer *hashRowContainer, joinResult *hashjoinWorkerResult) (bool, *hashjoinWorkerResult) { +func (w *probeWorker) joinMatchedProbeSideRow2Chunk(probeKey uint64, probeSideRow chunk.Row, hCtx *hashContext, + joinResult *hashjoinWorkerResult) (bool, *hashjoinWorkerResult) { var err error - e.probeWorkers[workerID].buildSideRows, err = rowContainer.GetMatchedRows(probeKey, probeSideRow, hCtx, e.probeWorkers[workerID].buildSideRows) - buildSideRows := e.probeWorkers[workerID].buildSideRows + w.buildSideRows, err = w.rowContainerForProbe.GetMatchedRows(probeKey, probeSideRow, hCtx, w.buildSideRows) + buildSideRows := w.buildSideRows if err != nil { joinResult.err = err return false, joinResult } if len(buildSideRows) == 0 { - e.probeWorkers[workerID].joiner.onMissMatch(false, probeSideRow, joinResult.chk) + w.joiner.onMissMatch(false, probeSideRow, joinResult.chk) return true, joinResult } - iter := e.probeWorkers[workerID].rowIters + iter := w.rowIters iter.Reset(buildSideRows) hasMatch, hasNull, ok := false, false, false for iter.Begin(); iter.Current() != iter.End(); { - matched, isNull, err := e.probeWorkers[workerID].joiner.tryToMatchInners(probeSideRow, iter, joinResult.chk) + matched, isNull, err := w.joiner.tryToMatchInners(probeSideRow, iter, joinResult.chk) if err != nil { joinResult.err = err return false, joinResult @@ -927,36 +927,36 @@ func (e *HashJoinExec) joinMatchedProbeSideRow2Chunk(workerID uint, probeKey uin hasNull = hasNull || isNull if joinResult.chk.IsFull() { - e.joinResultCh <- joinResult - ok, joinResult = e.getNewJoinResult(workerID) + w.hashJoinCtx.joinResultCh <- joinResult + ok, joinResult = w.getNewJoinResult() if !ok { return false, joinResult } } } if !hasMatch { - e.probeWorkers[workerID].joiner.onMissMatch(hasNull, probeSideRow, joinResult.chk) + w.joiner.onMissMatch(hasNull, probeSideRow, joinResult.chk) } return true, joinResult } -func (e *HashJoinExec) getNewJoinResult(workerID uint) (bool, *hashjoinWorkerResult) { +func (w *probeWorker) getNewJoinResult() (bool, *hashjoinWorkerResult) { joinResult := &hashjoinWorkerResult{ - src: e.joinChkResourceCh[workerID], + src: w.joinChkResourceCh, } ok := true select { - case <-e.closeCh: + case <-w.hashJoinCtx.closeCh: ok = false - case joinResult.chk, ok = <-e.joinChkResourceCh[workerID]: + case joinResult.chk, ok = <-w.joinChkResourceCh: } return ok, joinResult } -func (e *HashJoinExec) join2Chunk(workerID uint, probeSideChk *chunk.Chunk, hCtx *hashContext, rowContainer *hashRowContainer, joinResult *hashjoinWorkerResult, +func (w *probeWorker) join2Chunk(probeSideChk *chunk.Chunk, hCtx *hashContext, joinResult *hashjoinWorkerResult, selected []bool) (ok bool, _ *hashjoinWorkerResult) { var err error - selected, err = expression.VectorizedFilter(e.ctx, e.outerFilter, chunk.NewIterator4Chunk(probeSideChk), selected) + selected, err = expression.VectorizedFilter(w.hashJoinCtx.sessCtx, w.hashJoinCtx.outerFilter, chunk.NewIterator4Chunk(probeSideChk), selected) if err != nil { joinResult.err = err return false, joinResult @@ -967,8 +967,8 @@ func (e *HashJoinExec) join2Chunk(workerID uint, probeSideChk *chunk.Chunk, hCtx // By now, path 1 and 2 won't be conducted at the same time. // 1: write the row data of join key to hashVals. (normal EQ key should ignore the null values.) null-EQ for Except statement is an exception. for keyIdx, i := range hCtx.keyColIdx { - ignoreNull := len(e.isNullEQ) > keyIdx && e.isNullEQ[keyIdx] - err = codec.HashChunkSelected(rowContainer.sc, hCtx.hashVals, probeSideChk, hCtx.allTypes[keyIdx], i, hCtx.buf, hCtx.hasNull, selected, ignoreNull) + ignoreNull := len(w.hashJoinCtx.isNullEQ) > keyIdx && w.hashJoinCtx.isNullEQ[keyIdx] + err = codec.HashChunkSelected(w.rowContainerForProbe.sc, hCtx.hashVals, probeSideChk, hCtx.allTypes[keyIdx], i, hCtx.buf, hCtx.hasNull, selected, ignoreNull) if err != nil { joinResult.err = err return false, joinResult @@ -978,7 +978,7 @@ func (e *HashJoinExec) join2Chunk(workerID uint, probeSideChk *chunk.Chunk, hCtx isNAAJ := len(hCtx.naKeyColIdx) > 0 for keyIdx, i := range hCtx.naKeyColIdx { // NAAJ won't ignore any null values, but collect them up to probe. - err = codec.HashChunkSelected(rowContainer.sc, hCtx.hashVals, probeSideChk, hCtx.allTypes[keyIdx], i, hCtx.buf, hCtx.hasNull, selected, false) + err = codec.HashChunkSelected(w.rowContainerForProbe.sc, hCtx.hashVals, probeSideChk, hCtx.allTypes[keyIdx], i, hCtx.buf, hCtx.hasNull, selected, false) if err != nil { joinResult.err = err return false, joinResult @@ -996,7 +996,7 @@ func (e *HashJoinExec) join2Chunk(workerID uint, probeSideChk *chunk.Chunk, hCtx } for i := range selected { - killed := atomic.LoadUint32(&e.ctx.GetSessionVars().Killed) == 1 + killed := atomic.LoadUint32(&w.hashJoinCtx.sessCtx.GetSessionVars().Killed) == 1 failpoint.Inject("killedInJoin2Chunk", func(val failpoint.Value) { if val.(bool) { killed = true @@ -1009,13 +1009,13 @@ func (e *HashJoinExec) join2Chunk(workerID uint, probeSideChk *chunk.Chunk, hCtx if isNAAJ { if !selected[i] { // since this is the case of using inner to build, so for an outer row unselected, we should fill the result when it's outer join. - e.probeWorkers[workerID].joiner.onMissMatch(false, probeSideChk.GetRow(i), joinResult.chk) + w.joiner.onMissMatch(false, probeSideChk.GetRow(i), joinResult.chk) } if hCtx.naHasNull[i] { // here means the probe join connecting column has null value in it and this is special for matching all the hash buckets // for it. (probeKey is not necessary here) probeRow := probeSideChk.GetRow(i) - ok, joinResult = e.joinNAAJMatchProbeSideRow2Chunk(workerID, 0, hCtx.naColNullBitMap[i].Clone(), probeRow, hCtx, rowContainer, joinResult) + ok, joinResult = w.joinNAAJMatchProbeSideRow2Chunk(0, hCtx.naColNullBitMap[i].Clone(), probeRow, hCtx, joinResult) if !ok { return false, joinResult } @@ -1023,7 +1023,7 @@ func (e *HashJoinExec) join2Chunk(workerID uint, probeSideChk *chunk.Chunk, hCtx // here means the probe join connecting column without null values, where we should match same key bucket and null bucket for it at its order. // step1: process same key matched probe side rows probeKey, probeRow := hCtx.hashVals[i].Sum64(), probeSideChk.GetRow(i) - ok, joinResult = e.joinNAAJMatchProbeSideRow2Chunk(workerID, probeKey, nil, probeRow, hCtx, rowContainer, joinResult) + ok, joinResult = w.joinNAAJMatchProbeSideRow2Chunk(probeKey, nil, probeRow, hCtx, joinResult) if !ok { return false, joinResult } @@ -1031,18 +1031,18 @@ func (e *HashJoinExec) join2Chunk(workerID uint, probeSideChk *chunk.Chunk, hCtx } else { // since this is the case of using inner to build, so for an outer row unselected, we should fill the result when it's outer join. if !selected[i] || hCtx.hasNull[i] { // process unmatched probe side rows - e.probeWorkers[workerID].joiner.onMissMatch(false, probeSideChk.GetRow(i), joinResult.chk) + w.joiner.onMissMatch(false, probeSideChk.GetRow(i), joinResult.chk) } else { // process matched probe side rows probeKey, probeRow := hCtx.hashVals[i].Sum64(), probeSideChk.GetRow(i) - ok, joinResult = e.joinMatchedProbeSideRow2Chunk(workerID, probeKey, probeRow, hCtx, rowContainer, joinResult) + ok, joinResult = w.joinMatchedProbeSideRow2Chunk(probeKey, probeRow, hCtx, joinResult) if !ok { return false, joinResult } } } if joinResult.chk.IsFull() { - e.joinResultCh <- joinResult - ok, joinResult = e.getNewJoinResult(workerID) + w.hashJoinCtx.joinResultCh <- joinResult + ok, joinResult = w.getNewJoinResult() if !ok { return false, joinResult } @@ -1052,17 +1052,17 @@ func (e *HashJoinExec) join2Chunk(workerID uint, probeSideChk *chunk.Chunk, hCtx } // join2ChunkForOuterHashJoin joins chunks when using the outer to build a hash table (refer to outer hash join) -func (e *HashJoinExec) join2ChunkForOuterHashJoin(workerID uint, probeSideChk *chunk.Chunk, hCtx *hashContext, rowContainer *hashRowContainer, joinResult *hashjoinWorkerResult) (ok bool, _ *hashjoinWorkerResult) { +func (w *probeWorker) join2ChunkForOuterHashJoin(probeSideChk *chunk.Chunk, hCtx *hashContext, joinResult *hashjoinWorkerResult) (ok bool, _ *hashjoinWorkerResult) { hCtx.initHash(probeSideChk.NumRows()) for keyIdx, i := range hCtx.keyColIdx { - err := codec.HashChunkColumns(rowContainer.sc, hCtx.hashVals, probeSideChk, hCtx.allTypes[keyIdx], i, hCtx.buf, hCtx.hasNull) + err := codec.HashChunkColumns(w.rowContainerForProbe.sc, hCtx.hashVals, probeSideChk, hCtx.allTypes[keyIdx], i, hCtx.buf, hCtx.hasNull) if err != nil { joinResult.err = err return false, joinResult } } for i := 0; i < probeSideChk.NumRows(); i++ { - killed := atomic.LoadUint32(&e.ctx.GetSessionVars().Killed) == 1 + killed := atomic.LoadUint32(&w.hashJoinCtx.sessCtx.GetSessionVars().Killed) == 1 failpoint.Inject("killedInJoin2ChunkForOuterHashJoin", func(val failpoint.Value) { if val.(bool) { killed = true @@ -1073,13 +1073,13 @@ func (e *HashJoinExec) join2ChunkForOuterHashJoin(workerID uint, probeSideChk *c return false, joinResult } probeKey, probeRow := hCtx.hashVals[i].Sum64(), probeSideChk.GetRow(i) - ok, joinResult = e.joinMatchedProbeSideRow2ChunkForOuterHashJoin(workerID, probeKey, probeRow, hCtx, rowContainer, joinResult) + ok, joinResult = w.joinMatchedProbeSideRow2ChunkForOuterHashJoin(probeKey, probeRow, hCtx, joinResult) if !ok { return false, joinResult } if joinResult.chk.IsFull() { - e.joinResultCh <- joinResult - ok, joinResult = e.getNewJoinResult(workerID) + w.hashJoinCtx.joinResultCh <- joinResult + ok, joinResult = w.getNewJoinResult() if !ok { return false, joinResult } @@ -1095,20 +1095,12 @@ func (e *HashJoinExec) join2ChunkForOuterHashJoin(workerID uint, probeSideChk *c func (e *HashJoinExec) Next(ctx context.Context, req *chunk.Chunk) (err error) { if !e.prepared { e.buildFinished = make(chan error, 1) - buildKeyColIdx := make([]int, len(e.buildKeys)) - for i := range e.buildKeys { - buildKeyColIdx[i] = e.buildKeys[i].Index - } - buildNAKeyColIdx := make([]int, len(e.buildNAKeys)) - for i := range e.buildNAKeys { - buildNAKeyColIdx[i] = e.buildNAKeys[i].Index - } hCtx := &hashContext{ allTypes: e.buildTypes, - keyColIdx: buildKeyColIdx, - naKeyColIdx: buildNAKeyColIdx, + keyColIdx: e.buildWorker.buildKeyColIdx, + naKeyColIdx: e.buildWorker.buildNAKeyColIdx, } - e.rowContainer = newHashRowContainer(e.ctx, int(e.buildSideEstCount), hCtx, retTypes(e.buildSideExec)) + e.rowContainer = newHashRowContainer(e.ctx, hCtx, retTypes(e.buildWorker.buildSideExec)) // we shallow copies rowContainer for each probe worker to avoid lock contention for i := uint(0); i < e.concurrency; i++ { if i == 0 { @@ -1120,7 +1112,7 @@ func (e *HashJoinExec) Next(ctx context.Context, req *chunk.Chunk) (err error) { for i := uint(0); i < e.concurrency; i++ { e.probeWorkers[i].rowIters = chunk.NewIterator4Slice([]chunk.Row{}).(*chunk.Iterator4Slice) } - e.worker.RunWithRecover(func() { + e.workerWg.RunWithRecover(func() { defer trace.StartRegion(ctx, "HashJoinHashTableBuilder").End() e.fetchAndBuildHashTable(ctx) }, e.handleFetchAndBuildHashTablePanic) @@ -1163,10 +1155,10 @@ func (e *HashJoinExec) fetchAndBuildHashTable(ctx context.Context) { buildSideResultCh := make(chan *chunk.Chunk, 1) doneCh := make(chan struct{}) fetchBuildSideRowsOk := make(chan error, 1) - e.worker.RunWithRecover( + e.workerWg.RunWithRecover( func() { defer trace.StartRegion(ctx, "HashJoinBuildSideFetcher").End() - e.fetchBuildSideRows(ctx, buildSideResultCh, fetchBuildSideRowsOk, doneCh) + e.buildWorker.fetchBuildSideRows(ctx, buildSideResultCh, fetchBuildSideRowsOk, doneCh) }, func(r interface{}) { if r != nil { @@ -1177,7 +1169,7 @@ func (e *HashJoinExec) fetchAndBuildHashTable(ctx context.Context) { ) // TODO: Parallel build hash table. Currently not support because `unsafeHashTable` is not thread-safe. - err := e.buildHashTableForList(buildSideResultCh) + err := e.buildWorker.buildHashTableForList(buildSideResultCh) if err != nil { e.buildFinished <- errors.Trace(err) close(doneCh) @@ -1195,41 +1187,42 @@ func (e *HashJoinExec) fetchAndBuildHashTable(ctx context.Context) { } // buildHashTableForList builds hash table from `list`. -func (e *HashJoinExec) buildHashTableForList(buildSideResultCh <-chan *chunk.Chunk) error { +func (w *buildWorker) buildHashTableForList(buildSideResultCh <-chan *chunk.Chunk) error { var err error var selected []bool - e.rowContainer.GetMemTracker().AttachTo(e.memTracker) - e.rowContainer.GetMemTracker().SetLabel(memory.LabelForBuildSideResult) - e.rowContainer.GetDiskTracker().AttachTo(e.diskTracker) - e.rowContainer.GetDiskTracker().SetLabel(memory.LabelForBuildSideResult) + rowContainer := w.hashJoinCtx.rowContainer + rowContainer.GetMemTracker().AttachTo(w.hashJoinCtx.memTracker) + rowContainer.GetMemTracker().SetLabel(memory.LabelForBuildSideResult) + rowContainer.GetDiskTracker().AttachTo(w.hashJoinCtx.diskTracker) + rowContainer.GetDiskTracker().SetLabel(memory.LabelForBuildSideResult) if variable.EnableTmpStorageOnOOM.Load() { - actionSpill := e.rowContainer.ActionSpill() + actionSpill := rowContainer.ActionSpill() failpoint.Inject("testRowContainerSpill", func(val failpoint.Value) { if val.(bool) { - actionSpill = e.rowContainer.rowContainer.ActionSpillForTest() + actionSpill = rowContainer.rowContainer.ActionSpillForTest() defer actionSpill.(*chunk.SpillDiskAction).WaitForTest() } }) - e.ctx.GetSessionVars().MemTracker.FallbackOldAndSetNewAction(actionSpill) + w.hashJoinCtx.sessCtx.GetSessionVars().MemTracker.FallbackOldAndSetNewAction(actionSpill) } for chk := range buildSideResultCh { - if e.finished.Load() { + if w.hashJoinCtx.finished.Load() { return nil } - if !e.useOuterToBuild { - err = e.rowContainer.PutChunk(chk, e.isNullEQ) + if !w.hashJoinCtx.useOuterToBuild { + err = rowContainer.PutChunk(chk, w.hashJoinCtx.isNullEQ) } else { var bitMap = bitmap.NewConcurrentBitmap(chk.NumRows()) - e.outerMatchedStatus = append(e.outerMatchedStatus, bitMap) - e.memTracker.Consume(bitMap.BytesConsumed()) - if len(e.outerFilter) == 0 { - err = e.rowContainer.PutChunk(chk, e.isNullEQ) + w.hashJoinCtx.outerMatchedStatus = append(w.hashJoinCtx.outerMatchedStatus, bitMap) + w.hashJoinCtx.memTracker.Consume(bitMap.BytesConsumed()) + if len(w.hashJoinCtx.outerFilter) == 0 { + err = w.hashJoinCtx.rowContainer.PutChunk(chk, w.hashJoinCtx.isNullEQ) } else { - selected, err = expression.VectorizedFilter(e.ctx, e.outerFilter, chunk.NewIterator4Chunk(chk), selected) + selected, err = expression.VectorizedFilter(w.hashJoinCtx.sessCtx, w.hashJoinCtx.outerFilter, chunk.NewIterator4Chunk(chk), selected) if err != nil { return err } - err = e.rowContainer.PutChunkSelected(chk, selected, e.isNullEQ) + err = rowContainer.PutChunkSelected(chk, selected, w.hashJoinCtx.isNullEQ) } } failpoint.Inject("ConsumeRandomPanic", nil) @@ -1283,7 +1276,6 @@ func (e *NestedLoopApplyExec) Close() error { e.memTracker = nil if e.runtimeStats != nil { runtimeStats := newJoinRuntimeStats() - e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, runtimeStats) if e.canUseCache { var hitRatio float64 if e.cacheAccessCounter > 0 { @@ -1294,6 +1286,7 @@ func (e *NestedLoopApplyExec) Close() error { runtimeStats.setCacheInfo(false, 0) } runtimeStats.SetConcurrencyInfo(execdetails.NewConcurrencyInfo("Concurrency", 0)) + defer e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, runtimeStats) } return e.outerExec.Close() } @@ -1551,6 +1544,17 @@ func (e *joinRuntimeStats) Tp() int { return execdetails.TpJoinRuntimeStats } +func (e *joinRuntimeStats) Clone() execdetails.RuntimeStats { + newJRS := &joinRuntimeStats{ + RuntimeStatsWithConcurrencyInfo: e.RuntimeStatsWithConcurrencyInfo, + applyCache: e.applyCache, + cache: e.cache, + hasHashStat: e.hasHashStat, + hashStat: e.hashStat, + } + return newJRS +} + type hashJoinRuntimeStats struct { fetchAndBuildHashTable time.Duration hashStat hashStatistic diff --git a/executor/join_test.go b/executor/join_test.go index be006d7dc0063..6f56d0a18dc8e 100644 --- a/executor/join_test.go +++ b/executor/join_test.go @@ -1479,7 +1479,7 @@ func TestIndexNestedLoopHashJoin(t *testing.T) { " └─TableRowIDScan 27.00 cop[tikv] table:l2 keep order:false")) tk.MustQuery("select * from t l1 where exists ( select * from t l2 where l2.l_orderkey = l1.l_orderkey and l2.l_suppkey <> l1.l_suppkey )order by `l_orderkey`,`l_linenumber`;").Check(testkit.Rows("0 0 0 0", "0 1 0 1", "0 2 0 0", "1 0 1 0", "1 1 1 1", "1 2 1 0", "2 0 0 0", "2 1 0 1", "2 2 0 0")) tk.MustQuery("desc format = 'brief' select count(*) from t l1 where exists ( select * from t l2 where l2.l_orderkey = l1.l_orderkey and l2.l_suppkey <> l1.l_suppkey );").Check(testkit.Rows( - "HashAgg 1.00 root funcs:count(1)->Column#11", + "StreamAgg 1.00 root funcs:count(1)->Column#11", "└─IndexHashJoin 7.20 root semi join, inner:IndexLookUp, outer key:test.t.l_orderkey, inner key:test.t.l_orderkey, equal cond:eq(test.t.l_orderkey, test.t.l_orderkey), other cond:ne(test.t.l_suppkey, test.t.l_suppkey)", " ├─TableReader(Build) 9.00 root data:Selection", " │ └─Selection 9.00 cop[tikv] not(isnull(test.t.l_suppkey))", @@ -2307,16 +2307,14 @@ func TestIssue18070(t *testing.T) { tk.MustExec("insert into t1 values(1),(2)") tk.MustExec("insert into t2 values(1),(1),(2),(2)") tk.MustExec("set @@tidb_mem_quota_query=1000") - err := tk.QueryToErr("select /*+ inl_hash_join(t1)*/ * from t1 join t2 on t1.a = t2.a;") - require.True(t, strings.Contains(err.Error(), "Out Of Memory Quota!")) + tk.MustContainErrMsg("select /*+ inl_hash_join(t1)*/ * from t1 join t2 on t1.a = t2.a;", "Out Of Memory Quota!") fpName := "github.com/pingcap/tidb/executor/mockIndexMergeJoinOOMPanic" require.NoError(t, failpoint.Enable(fpName, `panic("ERROR 1105 (HY000): Out Of Memory Quota![conn_id=1]")`)) defer func() { require.NoError(t, failpoint.Disable(fpName)) }() - err = tk.QueryToErr("select /*+ inl_merge_join(t1)*/ * from t1 join t2 on t1.a = t2.a;") - require.True(t, strings.Contains(err.Error(), "Out Of Memory Quota!")) + tk.MustContainErrMsg("select /*+ inl_merge_join(t1)*/ * from t1 join t2 on t1.a = t2.a;", "Out Of Memory Quota!") } func TestIssue18564(t *testing.T) { @@ -2894,3 +2892,20 @@ func TestOuterJoin(t *testing.T) { ), ) } + +func TestCartesianJoinPanic(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(a int)") + tk.MustExec("insert into t values(1)") + tk.MustExec("set tidb_mem_quota_query = 1 << 30") + tk.MustExec("set global tidb_mem_oom_action = 'CANCEL'") + tk.MustExec("set global tidb_enable_tmp_storage_on_oom = off;") + for i := 0; i < 14; i++ { + tk.MustExec("insert into t select * from t") + } + err := tk.QueryToErr("desc analyze select * from t t1, t t2, t t3, t t4, t t5, t t6;") + require.NotNil(t, err) + require.True(t, strings.Contains(err.Error(), "Out Of Memory Quota!")) +} diff --git a/executor/load_data.go b/executor/load_data.go index e11137c3916ae..85e04aaad3144 100644 --- a/executor/load_data.go +++ b/executor/load_data.go @@ -15,20 +15,28 @@ package executor import ( + "bufio" "bytes" "context" "fmt" + "io" + "path/filepath" "strings" + "sync" "sync/atomic" "time" "github.com/pingcap/errors" "github.com/pingcap/failpoint" + backup "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessiontxn" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -40,13 +48,15 @@ import ( var ( null = []byte("NULL") taskQueueSize = 16 // the maximum number of pending tasks to commit in queue + // InTest is a flag that bypass gcs authentication in unit tests. + InTest bool ) // LoadDataExec represents a load data executor. type LoadDataExec struct { baseExecutor - IsLocal bool + FileLocRef ast.FileLocRefTp OnDuplicate ast.OnDuplicateKeyHandlingType loadDataInfo *LoadDataInfo } @@ -54,32 +64,76 @@ type LoadDataExec struct { // Next implements the Executor Next interface. func (e *LoadDataExec) Next(ctx context.Context, req *chunk.Chunk) error { req.GrowAndReset(e.maxChunkSize) - // TODO: support load data without local field. - if !e.IsLocal { - return errors.New("Load Data: don't support load data without local field") - } - e.loadDataInfo.OnDuplicate = e.OnDuplicate // TODO: support lines terminated is "". if len(e.loadDataInfo.LinesInfo.Terminated) == 0 { return errors.New("Load Data: don't support load data terminated is nil") } - - sctx := e.loadDataInfo.ctx - val := sctx.Value(LoadDataVarKey) - if val != nil { - sctx.SetValue(LoadDataVarKey, nil) - return errors.New("Load Data: previous load data option isn't closed normal") - } if e.loadDataInfo.Path == "" { return errors.New("Load Data: infile path is empty") } - sctx.SetValue(LoadDataVarKey, e.loadDataInfo) + if !e.loadDataInfo.Table.Meta().IsBaseTable() { + return errors.New("can only load data into base tables") + } + switch e.FileLocRef { + case ast.FileLocServerOrRemote: + u, err := storage.ParseRawURL(e.loadDataInfo.Path) + if err != nil { + return err + } + var filename string + u.Path, filename = filepath.Split(u.Path) + b, err := storage.ParseBackendFromURL(u, nil) + if err != nil { + return err + } + if b.GetLocal() != nil { + return errors.Errorf("Load Data: don't support load data from tidb-server's disk") + } + return e.loadFromRemote(ctx, b, filename) + case ast.FileLocClient: + // let caller use handleQuerySpecial to read data in this connection + sctx := e.loadDataInfo.ctx + val := sctx.Value(LoadDataVarKey) + if val != nil { + sctx.SetValue(LoadDataVarKey, nil) + return errors.New("Load Data: previous load data option wasn't closed normally") + } + sctx.SetValue(LoadDataVarKey, e.loadDataInfo) + } return nil } +func (e *LoadDataExec) loadFromRemote( + ctx context.Context, + b *backup.StorageBackend, + filename string, +) error { + opt := &storage.ExternalStorageOptions{} + if InTest { + opt.NoCredentials = true + } + s, err := storage.New(ctx, b, opt) + if err != nil { + return err + } + fileReader, err := s.Open(ctx, filename) + if err != nil { + return err + } + defer fileReader.Close() + reader := bufio.NewReader(fileReader) + + return e.loadDataInfo.Load(ctx, func() ([]byte, error) { + return reader.ReadBytes('\n') + }) +} + // Close implements the Executor Close interface. func (e *LoadDataExec) Close() error { + if e.runtimeStats != nil && e.loadDataInfo != nil && e.loadDataInfo.stats != nil { + defer e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.loadDataInfo.stats) + } return nil } @@ -100,6 +154,7 @@ type CommitTask struct { } // LoadDataInfo saves the information of loading data operation. +// TODO: rename it and remove unnecessary public methods. type LoadDataInfo struct { *InsertValues @@ -129,6 +184,111 @@ type FieldMapping struct { UserVar *ast.VariableExpr } +// Load reads from readerFn and do load data job. +func (e *LoadDataInfo) Load(ctx context.Context, readerFn func() ([]byte, error)) error { + e.InitQueues() + e.SetMaxRowsInBatch(uint64(e.Ctx.GetSessionVars().DMLBatchSize)) + e.StartStopWatcher() + // let stop watcher goroutine quit + defer e.ForceQuit() + err := sessiontxn.NewTxn(ctx, e.Ctx) + if err != nil { + return err + } + // processStream process input data, enqueue commit task + wg := new(sync.WaitGroup) + wg.Add(1) + go processStream(ctx, readerFn, e, wg) + err = e.CommitWork(ctx) + wg.Wait() + return err +} + +// processStream process input stream from network +func processStream(ctx context.Context, readerFn func() ([]byte, error), loadDataInfo *LoadDataInfo, wg *sync.WaitGroup) { + var err error + var shouldBreak bool + var prevData, curData []byte + defer func() { + r := recover() + if r != nil { + logutil.Logger(ctx).Error("process routine panicked", + zap.Reflect("r", r), + zap.Stack("stack")) + } + if err != nil || r != nil { + loadDataInfo.ForceQuit() + } else { + loadDataInfo.CloseTaskQueue() + } + wg.Done() + }() + for { + curData, err = readerFn() + if err != nil { + if terror.ErrorNotEqual(err, io.EOF) { + logutil.Logger(ctx).Error("read data for LOAD DATA failed", zap.Error(err)) + break + } + err = nil + } + if len(curData) == 0 { + loadDataInfo.Drained = true + shouldBreak = true + if len(prevData) == 0 { + break + } + } + select { + case <-loadDataInfo.QuitCh: + err = errors.New("processStream forced to quit") + default: + } + if err != nil { + break + } + // prepare batch and enqueue task + prevData, err = insertDataWithCommit(ctx, prevData, curData, loadDataInfo) + if err != nil { + break + } + if shouldBreak { + break + } + } + if err != nil { + logutil.Logger(ctx).Error("load data process stream error", zap.Error(err)) + return + } + if err = loadDataInfo.EnqOneTask(ctx); err != nil { + logutil.Logger(ctx).Error("load data process stream error", zap.Error(err)) + return + } +} + +func insertDataWithCommit(ctx context.Context, prevData, + curData []byte, loadDataInfo *LoadDataInfo) ([]byte, error) { + var err error + var reachLimit bool + for { + prevData, reachLimit, err = loadDataInfo.InsertData(ctx, prevData, curData) + if err != nil { + return nil, err + } + if !reachLimit { + break + } + // push into commit task queue + err = loadDataInfo.EnqOneTask(ctx) + if err != nil { + return prevData, err + } + curData = prevData + prevData = nil + } + return prevData, nil +} + // reorderColumns reorder the e.insertColumns according to the order of columnNames // Note: We must ensure there must be one-to-one mapping between e.insertColumns and columnNames in terms of column name. func (e *LoadDataInfo) reorderColumns(columnNames []string) error { @@ -313,7 +473,7 @@ func (e *LoadDataInfo) CommitOneTask(ctx context.Context, task CommitTask) error var err error defer func() { if err != nil { - e.Ctx.StmtRollback() + e.Ctx.StmtRollback(ctx, false) } }() err = e.CheckAndInsertOneBatch(ctx, task.rows, task.cnt) @@ -324,7 +484,7 @@ func (e *LoadDataInfo) CommitOneTask(ctx context.Context, task CommitTask) error failpoint.Inject("commitOneTaskErr", func() error { return errors.New("mock commit one task error") }) - e.Ctx.StmtCommit() + e.Ctx.StmtCommit(ctx) // Make sure process stream routine never use invalid txn e.txnInUse.Lock() defer e.txnInUse.Unlock() @@ -350,7 +510,7 @@ func (e *LoadDataInfo) CommitWork(ctx context.Context) error { e.ForceQuit() } if err != nil { - e.ctx.StmtRollback() + e.ctx.StmtRollback(ctx, false) } }() var tasks uint64 diff --git a/executor/load_stats.go b/executor/load_stats.go index d59651e29200a..e292eb817519d 100644 --- a/executor/load_stats.go +++ b/executor/load_stats.go @@ -52,7 +52,7 @@ func (k loadStatsVarKeyType) String() string { const LoadStatsVarKey loadStatsVarKeyType = 0 // Next implements the Executor Next interface. -func (e *LoadStatsExec) Next(ctx context.Context, req *chunk.Chunk) error { +func (e *LoadStatsExec) Next(_ context.Context, req *chunk.Chunk) error { req.GrowAndReset(e.maxChunkSize) if len(e.info.Path) == 0 { return errors.New("Load Stats: file path is empty") @@ -72,7 +72,7 @@ func (e *LoadStatsExec) Close() error { } // Open implements the Executor Open interface. -func (e *LoadStatsExec) Open(ctx context.Context) error { +func (e *LoadStatsExec) Open(_ context.Context) error { return nil } diff --git a/executor/loadremotetest/BUILD.bazel b/executor/loadremotetest/BUILD.bazel new file mode 100644 index 0000000000000..5db2476b844c2 --- /dev/null +++ b/executor/loadremotetest/BUILD.bazel @@ -0,0 +1,20 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_test") + +go_test( + name = "loadremotetest_test", + timeout = "short", + srcs = [ + "main_test.go", + "one_csv_test.go", + "util_test.go", + ], + flaky = True, + deps = [ + "//executor", + "//kv", + "//testkit", + "@com_github_fsouza_fake_gcs_server//fakestorage", + "@com_github_stretchr_testify//suite", + "@org_uber_go_goleak//:goleak", + ], +) diff --git a/executor/loadremotetest/main_test.go b/executor/loadremotetest/main_test.go new file mode 100644 index 0000000000000..82f95ed8dd112 --- /dev/null +++ b/executor/loadremotetest/main_test.go @@ -0,0 +1,33 @@ +// Copyright 2023 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 loadremotetest + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/txnkv/transaction.keepAlive"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + goleak.IgnoreTopFunction("internal/poll.runtime_pollWait"), + goleak.IgnoreTopFunction("net.(*netFD).connect.func2"), + } + goleak.VerifyTestMain(m, opts...) +} diff --git a/executor/loadremotetest/one_csv_test.go b/executor/loadremotetest/one_csv_test.go new file mode 100644 index 0000000000000..db1709f23fc0f --- /dev/null +++ b/executor/loadremotetest/one_csv_test.go @@ -0,0 +1,57 @@ +// Copyright 2023 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 loadremotetest + +import ( + "fmt" + + "github.com/pingcap/tidb/testkit" +) + +func (s *mockGCSSuite) TestLoadCSV() { + s.tk.MustExec("DROP DATABASE IF EXISTS load_csv;") + s.tk.MustExec("CREATE DATABASE load_csv;") + s.tk.MustExec("CREATE TABLE load_csv.t (i INT, s varchar(32));") + + // no-new-line-at-end + sql := fmt.Sprintf(`LOAD DATA INFILE 'gcs://test-bucket/no-new-line-at-end.csv?endpoint=%s' INTO TABLE load_csv.t + FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' + LINES TERMINATED BY '\n' IGNORE 1 LINES;`, gcsEndpoint) + s.tk.MustExec(sql) + s.tk.MustQuery("SELECT * FROM load_csv.t;").Check(testkit.Rows( + "100 test100", + "101 \"", + "102 😄😄😄😄😄", + "104 ", + )) + s.tk.MustExec("TRUNCATE TABLE load_csv.t;") + + // new-line-at-end + sql = fmt.Sprintf(`LOAD DATA INFILE 'gcs://test-bucket/new-line-at-end.csv?endpoint=%s' INTO TABLE load_csv.t + FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' + LINES TERMINATED BY '\n' IGNORE 1 LINES;`, gcsEndpoint) + s.tk.MustExec(sql) + s.tk.MustQuery("SELECT * FROM load_csv.t;").Check(testkit.Rows( + "100 test100", + "101 \"", + "102 😄😄😄😄😄", + "104 ", + )) + s.tk.MustExec("TRUNCATE TABLE load_csv.t;") + + // can't read file at tidb-server + sql = "LOAD DATA INFILE '/etc/passwd' INTO TABLE load_csv.t;" + s.tk.MustContainErrMsg(sql, "don't support load data from tidb-server") +} diff --git a/executor/loadremotetest/util_test.go b/executor/loadremotetest/util_test.go new file mode 100644 index 0000000000000..713a3883fa616 --- /dev/null +++ b/executor/loadremotetest/util_test.go @@ -0,0 +1,87 @@ +// Copyright 2023 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 loadremotetest + +import ( + "fmt" + "testing" + + "github.com/fsouza/fake-gcs-server/fakestorage" + "github.com/pingcap/tidb/executor" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/suite" +) + +type mockGCSSuite struct { + suite.Suite + + server *fakestorage.Server + store kv.Storage + tk *testkit.TestKit +} + +var ( + gcsHost = "127.0.0.1" + gcsPort = uint16(4443) + gcsEndpoint = fmt.Sprintf("http://%s:%d", gcsHost, gcsPort) +) + +func TestLoadRemote(t *testing.T) { + suite.Run(t, &mockGCSSuite{}) +} + +func (s *mockGCSSuite) SetupSuite() { + objects := []fakestorage.Object{ + { + BucketName: "test-bucket", + Name: "no-new-line-at-end.csv", + Content: []byte(`i,s +100,"test100" +101,"\"" +102,"😄😄😄😄😄" +104,""`), + }, + { + BucketName: "test-bucket", + Name: "new-line-at-end.csv", + Content: []byte(`i,s +100,"test100" +101,"\"" +102,"😄😄😄😄😄" +104,"" +`), + }, + } + + var err error + opt := fakestorage.Options{ + InitialObjects: objects, + Scheme: "http", + Host: gcsHost, + Port: gcsPort, + PublicHost: gcsHost, + } + s.server, err = fakestorage.NewServerWithOptions(opt) + s.Require().NoError(err) + s.store = testkit.CreateMockStore(s.T()) + s.tk = testkit.NewTestKit(s.T(), s.store) + executor.InTest = true +} + +func (s *mockGCSSuite) TearDownSuite() { + s.server.Stop() + executor.InTest = false +} diff --git a/executor/lock_stats.go b/executor/lock_stats.go index 540670e8119fc..ccf6df123db07 100644 --- a/executor/lock_stats.go +++ b/executor/lock_stats.go @@ -44,7 +44,7 @@ func (k lockStatsVarKeyType) String() string { const LockStatsVarKey lockStatsVarKeyType = 0 // Next implements the Executor Next interface. -func (e *LockStatsExec) Next(ctx context.Context, req *chunk.Chunk) error { +func (e *LockStatsExec) Next(_ context.Context, _ *chunk.Chunk) error { do := domain.GetDomain(e.ctx) is := do.InfoSchema() h := do.StatsHandle() @@ -87,7 +87,7 @@ func (e *LockStatsExec) Close() error { } // Open implements the Executor Open interface. -func (e *LockStatsExec) Open(ctx context.Context) error { +func (e *LockStatsExec) Open(_ context.Context) error { return nil } @@ -109,7 +109,7 @@ func (k unlockStatsVarKeyType) String() string { const UnlockStatsVarKey unlockStatsVarKeyType = 0 // Next implements the Executor Next interface. -func (e *UnlockStatsExec) Next(ctx context.Context, req *chunk.Chunk) error { +func (e *UnlockStatsExec) Next(_ context.Context, _ *chunk.Chunk) error { do := domain.GetDomain(e.ctx) is := do.InfoSchema() h := do.StatsHandle() @@ -152,6 +152,6 @@ func (e *UnlockStatsExec) Close() error { } // Open implements the Executor Open interface. -func (e *UnlockStatsExec) Open(ctx context.Context) error { +func (e *UnlockStatsExec) Open(_ context.Context) error { return nil } diff --git a/executor/main_test.go b/executor/main_test.go index 512eced5b50fa..4bf8cfb8f1bac 100644 --- a/executor/main_test.go +++ b/executor/main_test.go @@ -33,6 +33,7 @@ var prepareMergeSuiteData testdata.TestData var aggMergeSuiteData testdata.TestData var executorSuiteData testdata.TestData var pointGetSuiteData testdata.TestData +var slowQuerySuiteData testdata.TestData func TestMain(m *testing.M) { testsetup.SetupForCommonTest() @@ -40,10 +41,12 @@ func TestMain(m *testing.M) { testDataMap.LoadTestSuiteData("testdata", "executor_suite") testDataMap.LoadTestSuiteData("testdata", "prepare_suite") testDataMap.LoadTestSuiteData("testdata", "point_get_suite") + testDataMap.LoadTestSuiteData("testdata", "slow_query_suite") aggMergeSuiteData = testDataMap["agg_suite"] executorSuiteData = testDataMap["executor_suite"] prepareMergeSuiteData = testDataMap["prepare_suite"] pointGetSuiteData = testDataMap["point_get_suite"] + slowQuerySuiteData = testDataMap["slow_query_suite"] autoid.SetStep(5000) config.UpdateGlobal(func(conf *config.Config) { diff --git a/executor/mem_reader.go b/executor/mem_reader.go index 3790a5d862539..91bc6140b1295 100644 --- a/executor/mem_reader.go +++ b/executor/mem_reader.go @@ -17,7 +17,6 @@ package executor import ( "context" - "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/expression" @@ -34,6 +33,7 @@ import ( "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/rowcodec" + "github.com/pingcap/tidb/util/tracing" ) type memReader interface { @@ -65,11 +65,7 @@ type memIndexReader struct { } func buildMemIndexReader(ctx context.Context, us *UnionScanExec, idxReader *IndexReaderExecutor) *memIndexReader { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("buildMemIndexReader", opentracing.ChildOf(span.Context())) - defer span1.Finish() - opentracing.ContextWithSpan(ctx, span1) - } + defer tracing.StartRegion(ctx, "buildMemIndexReader").End() kvRanges := idxReader.kvRanges outputOffset := make([]int, 0, len(us.columns)) for _, col := range idxReader.outputColumns { @@ -90,11 +86,7 @@ func buildMemIndexReader(ctx context.Context, us *UnionScanExec, idxReader *Inde } func (m *memIndexReader) getMemRows(ctx context.Context) ([][]types.Datum, error) { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("memIndexReader.getMemRows", opentracing.ChildOf(span.Context())) - defer span1.Finish() - opentracing.ContextWithSpan(ctx, span1) - } + defer tracing.StartRegion(ctx, "memIndexReader.getMemRows").End() tps := make([]*types.FieldType, 0, len(m.index.Columns)+1) cols := m.table.Columns for _, col := range m.index.Columns { @@ -190,11 +182,7 @@ type allocBuf struct { } func buildMemTableReader(ctx context.Context, us *UnionScanExec, tblReader *TableReaderExecutor) *memTableReader { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("buildMemTableReader", opentracing.ChildOf(span.Context())) - defer span1.Finish() - opentracing.ContextWithSpan(ctx, span1) - } + defer tracing.StartRegion(ctx, "buildMemTableReader").End() colIDs := make(map[int64]int, len(us.columns)) for i, col := range us.columns { colIDs[col.ID] = i @@ -235,11 +223,7 @@ func buildMemTableReader(ctx context.Context, us *UnionScanExec, tblReader *Tabl // TODO: Try to make memXXXReader lazy, There is no need to decode many rows when parent operator only need 1 row. func (m *memTableReader) getMemRows(ctx context.Context) ([][]types.Datum, error) { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("memTableReader.getMemRows", opentracing.ChildOf(span.Context())) - defer span1.Finish() - opentracing.ContextWithSpan(ctx, span1) - } + defer tracing.StartRegion(ctx, "memTableReader.getMemRows").End() mutableRow := chunk.MutRowFromTypes(m.retFieldTypes) resultRows := make([]types.Datum, len(m.columns)) m.offsets = make([]int, len(m.columns)) @@ -490,11 +474,8 @@ type memIndexLookUpReader struct { } func buildMemIndexLookUpReader(ctx context.Context, us *UnionScanExec, idxLookUpReader *IndexLookUpExecutor) *memIndexLookUpReader { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("buildMemIndexLookUpReader", opentracing.ChildOf(span.Context())) - defer span1.Finish() - opentracing.ContextWithSpan(ctx, span1) - } + defer tracing.StartRegion(ctx, "buildMemIndexLookUpReader").End() + kvRanges := idxLookUpReader.kvRanges outputOffset := []int{len(idxLookUpReader.index.Columns)} memIdxReader := &memIndexReader{ @@ -527,11 +508,9 @@ func buildMemIndexLookUpReader(ctx context.Context, us *UnionScanExec, idxLookUp } func (m *memIndexLookUpReader) getMemRows(ctx context.Context) ([][]types.Datum, error) { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("memIndexLookUpReader.getMemRows", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } + r, ctx := tracing.StartRegionEx(ctx, "memIndexLookUpReader.getMemRows") + defer r.End() + kvRanges := [][]kv.KeyRange{m.idxReader.kvRanges} tbls := []table.Table{m.table} if m.partitionMode { @@ -595,6 +574,7 @@ type memIndexMergeReader struct { retFieldTypes []*types.FieldType indexMergeReader *IndexMergeReaderExecutor memReaders []memReader + isIntersection bool // partition mode partitionMode bool // if it is accessing a partition table @@ -603,11 +583,7 @@ type memIndexMergeReader struct { } func buildMemIndexMergeReader(ctx context.Context, us *UnionScanExec, indexMergeReader *IndexMergeReaderExecutor) *memIndexMergeReader { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("buildMemIndexMergeReader", opentracing.ChildOf(span.Context())) - defer span1.Finish() - opentracing.ContextWithSpan(ctx, span1) - } + defer tracing.StartRegion(ctx, "buildMemIndexMergeReader").End() indexCount := len(indexMergeReader.indexes) memReaders := make([]memReader, 0, indexCount) for i := 0; i < indexCount; i++ { @@ -651,6 +627,7 @@ func buildMemIndexMergeReader(ctx context.Context, us *UnionScanExec, indexMerge retFieldTypes: retTypes(us), indexMergeReader: indexMergeReader, memReaders: memReaders, + isIntersection: indexMergeReader.isIntersection, partitionMode: indexMergeReader.partitionTableMode, partitionTables: indexMergeReader.prunedPartitions, @@ -659,11 +636,8 @@ func buildMemIndexMergeReader(ctx context.Context, us *UnionScanExec, indexMerge } func (m *memIndexMergeReader) getMemRows(ctx context.Context) ([][]types.Datum, error) { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("memIndexMergeReader.getMemRows", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } + r, ctx := tracing.StartRegionEx(ctx, "memIndexMergeReader.getMemRows") + defer r.End() tbls := []table.Table{m.table} // [partNum][indexNum][rangeNum] var kvRanges [][][]kv.KeyRange @@ -676,11 +650,20 @@ func (m *memIndexMergeReader) getMemRows(ctx context.Context) ([][]types.Datum, } else { kvRanges = append(kvRanges, m.indexMergeReader.keyRanges) } + if len(kvRanges) != len(tbls) { + return nil, errors.Errorf("length of tbls(size: %d) should be equals to length of kvRanges(size: %d)", len(tbls), len(kvRanges)) + } tblKVRanges := make([]kv.KeyRange, 0, 16) numHandles := 0 + var handles []kv.Handle + var err error for i, tbl := range tbls { - handles, err := m.unionHandles(kvRanges[i]) + if m.isIntersection { + handles, err = m.intersectionHandles(kvRanges[i]) + } else { + handles, err = m.unionHandles(kvRanges[i]) + } if err != nil { return nil, err } @@ -716,7 +699,7 @@ func (m *memIndexMergeReader) getMemRows(ctx context.Context) ([][]types.Datum, return memTblReader.getMemRows(ctx) } -// Union all handles of different Indexes. +// Union all handles of all partial paths. func (m *memIndexMergeReader) unionHandles(kvRanges [][]kv.KeyRange) (finalHandles []kv.Handle, err error) { if len(m.memReaders) != len(kvRanges) { return nil, errors.Errorf("len(kvRanges) should be equal to len(memReaders)") @@ -747,6 +730,44 @@ func (m *memIndexMergeReader) unionHandles(kvRanges [][]kv.KeyRange) (finalHandl return finalHandles, nil } +// Intersect handles of each partial paths. +func (m *memIndexMergeReader) intersectionHandles(kvRanges [][]kv.KeyRange) (finalHandles []kv.Handle, err error) { + if len(m.memReaders) != len(kvRanges) { + return nil, errors.Errorf("len(kvRanges) should be equal to len(memReaders)") + } + + hMap := kv.NewHandleMap() + var handles []kv.Handle + for i, reader := range m.memReaders { + switch r := reader.(type) { + case *memTableReader: + r.kvRanges = kvRanges[i] + case *memIndexReader: + r.kvRanges = kvRanges[i] + default: + return nil, errors.New("memReader have to be memTableReader or memIndexReader") + } + if handles, err = reader.getMemRowsHandle(); err != nil { + return nil, err + } + for _, h := range handles { + if cntPtr, ok := hMap.Get(h); !ok { + cnt := 1 + hMap.Set(h, &cnt) + } else { + *(cntPtr.(*int)) += 1 + } + } + } + hMap.Range(func(h kv.Handle, val interface{}) bool { + if *(val.(*int)) == len(m.memReaders) { + finalHandles = append(finalHandles, h) + } + return true + }) + return finalHandles, nil +} + func (m *memIndexMergeReader) getMemRowsHandle() ([]kv.Handle, error) { return nil, errors.New("getMemRowsHandle has not been implemented for memIndexMergeReader") } diff --git a/executor/memtable_reader.go b/executor/memtable_reader.go index dc215e71fe3bb..a299438da0777 100644 --- a/executor/memtable_reader.go +++ b/executor/memtable_reader.go @@ -29,7 +29,6 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/diagnosticspb" - "github.com/pingcap/log" "github.com/pingcap/sysutil" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/infoschema" @@ -47,10 +46,10 @@ import ( "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/pdapi" "github.com/pingcap/tidb/util/set" - "go.uber.org/zap" "golang.org/x/exp/slices" "google.golang.org/grpc" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" ) const clusterLogBatchSize = 256 @@ -138,7 +137,7 @@ func (e *MemTableReaderExec) Next(ctx context.Context, req *chunk.Chunk) error { // Close implements the Executor Close interface. func (e *MemTableReaderExec) Close() error { if stats := e.retriever.getRuntimeStats(); stats != nil && e.runtimeStats != nil { - e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, stats) + defer e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, stats) } return e.retriever.close() } @@ -177,7 +176,7 @@ func fetchClusterConfig(sctx sessionctx.Context, nodeTypes, nodeAddrs set.String if err != nil { return nil, err } - serversInfo = filterClusterServerInfo(serversInfo, nodeTypes, nodeAddrs) + serversInfo = infoschema.FilterClusterServerInfo(serversInfo, nodeTypes, nodeAddrs) //nolint: prealloc var finalRows [][]types.Datum wg := sync.WaitGroup{} @@ -310,108 +309,12 @@ func (e *clusterServerInfoRetriever) retrieve(ctx context.Context, sctx sessionc return nil, nil } e.retrieved = true - serversInfo, err := infoschema.GetClusterServerInfo(sctx) if err != nil { return nil, err } - serversInfo = filterClusterServerInfo(serversInfo, e.extractor.NodeTypes, e.extractor.Instances) - - type result struct { - idx int - rows [][]types.Datum - err error - } - wg := sync.WaitGroup{} - ch := make(chan result, len(serversInfo)) - infoTp := e.serverInfoType - finalRows := make([][]types.Datum, 0, len(serversInfo)*10) - for i, srv := range serversInfo { - address := srv.Address - remote := address - if srv.ServerType == "tidb" { - remote = srv.StatusAddr - } - wg.Add(1) - go func(index int, remote, address, serverTP string) { - util.WithRecovery(func() { - defer wg.Done() - items, err := getServerInfoByGRPC(ctx, remote, infoTp) - if err != nil { - ch <- result{idx: index, err: err} - return - } - partRows := serverInfoItemToRows(items, serverTP, address) - ch <- result{idx: index, rows: partRows} - }, nil) - }(i, remote, address, srv.ServerType) - } - wg.Wait() - close(ch) - // Keep the original order to make the result more stable - var results []result //nolint: prealloc - for result := range ch { - if result.err != nil { - sctx.GetSessionVars().StmtCtx.AppendWarning(result.err) - continue - } - results = append(results, result) - } - slices.SortFunc(results, func(i, j result) bool { return i.idx < j.idx }) - for _, result := range results { - finalRows = append(finalRows, result.rows...) - } - return finalRows, nil -} - -func serverInfoItemToRows(items []*diagnosticspb.ServerInfoItem, tp, addr string) [][]types.Datum { - rows := make([][]types.Datum, 0, len(items)) - for _, v := range items { - for _, item := range v.Pairs { - row := types.MakeDatums( - tp, - addr, - v.Tp, - v.Name, - item.Key, - item.Value, - ) - rows = append(rows, row) - } - } - return rows -} - -func getServerInfoByGRPC(ctx context.Context, address string, tp diagnosticspb.ServerInfoType) ([]*diagnosticspb.ServerInfoItem, error) { - opt := grpc.WithInsecure() - security := config.GetGlobalConfig().Security - if len(security.ClusterSSLCA) != 0 { - clusterSecurity := security.ClusterSecurity() - tlsConfig, err := clusterSecurity.ToTLSConfig() - if err != nil { - return nil, errors.Trace(err) - } - opt = grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig)) - } - conn, err := grpc.Dial(address, opt) - if err != nil { - return nil, err - } - defer func() { - err := conn.Close() - if err != nil { - log.Error("close grpc connection error", zap.Error(err)) - } - }() - - cli := diagnosticspb.NewDiagnosticsClient(conn) - ctx, cancel := context.WithTimeout(ctx, time.Second*10) - defer cancel() - r, err := cli.ServerInfo(ctx, &diagnosticspb.ServerInfoRequest{Tp: tp}) - if err != nil { - return nil, err - } - return r.Items, nil + serversInfo = infoschema.FilterClusterServerInfo(serversInfo, e.extractor.NodeTypes, e.extractor.Instances) + return infoschema.FetchClusterServerInfoWithoutPrivilegeCheck(ctx, sctx, serversInfo, e.serverInfoType, true) } func parseFailpointServerInfo(s string) []infoschema.ServerInfo { @@ -428,28 +331,6 @@ func parseFailpointServerInfo(s string) []infoschema.ServerInfo { return serversInfo } -func filterClusterServerInfo(serversInfo []infoschema.ServerInfo, nodeTypes, addresses set.StringSet) []infoschema.ServerInfo { - if len(nodeTypes) == 0 && len(addresses) == 0 { - return serversInfo - } - - filterServers := make([]infoschema.ServerInfo, 0, len(serversInfo)) - for _, srv := range serversInfo { - // Skip some node type which has been filtered in WHERE clause - // e.g: SELECT * FROM cluster_config WHERE type='tikv' - if len(nodeTypes) > 0 && !nodeTypes.Exist(srv.ServerType) { - continue - } - // Skip some node address which has been filtered in WHERE clause - // e.g: SELECT * FROM cluster_config WHERE address='192.16.8.12:2379' - if len(addresses) > 0 && !addresses.Exist(srv.Address) { - continue - } - filterServers = append(filterServers, srv) - } - return filterServers -} - type clusterLogRetriever struct { isDrained bool retrieving bool @@ -515,7 +396,7 @@ func (e *clusterLogRetriever) initialize(ctx context.Context, sctx sessionctx.Co instances := e.extractor.Instances nodeTypes := e.extractor.NodeTypes - serversInfo = filterClusterServerInfo(serversInfo, nodeTypes, instances) + serversInfo = infoschema.FilterClusterServerInfo(serversInfo, nodeTypes, instances) var levels = make([]diagnosticspb.LogLevel, 0, len(e.extractor.LogLevels)) for l := range e.extractor.LogLevels { @@ -551,7 +432,7 @@ func (e *clusterLogRetriever) startRetrieving( serversInfo []infoschema.ServerInfo, req *diagnosticspb.SearchLogRequest) ([]chan logStreamResult, error) { // gRPC options - opt := grpc.WithInsecure() + opt := grpc.WithTransportCredentials(insecure.NewCredentials()) security := config.GetGlobalConfig().Security if len(security.ClusterSSLCA) != 0 { clusterSecurity := security.ClusterSecurity() diff --git a/executor/memtable_reader_test.go b/executor/memtable_reader_test.go index 870a4193fb3b2..f6d98d4ec24fc 100644 --- a/executor/memtable_reader_test.go +++ b/executor/memtable_reader_test.go @@ -29,6 +29,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/fn" "github.com/pingcap/sysutil" + "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/util/pdapi" pmodel "github.com/prometheus/common/model" @@ -56,7 +57,7 @@ func TestMetricTableData(t *testing.T) { } matrix = append(matrix, &pmodel.SampleStream{Metric: metric, Values: []pmodel.SamplePair{v1}}) - ctx := context.WithValue(context.Background(), "__mockMetricsPromData", matrix) + ctx := context.WithValue(context.Background(), executor.MockMetricsPromDataKey{}, matrix) ctx = failpoint.WithHook(ctx, func(ctx context.Context, fpname string) bool { return fpname == fpName }) diff --git a/executor/metrics_reader.go b/executor/metrics_reader.go index 314616785d60f..d9e0bd39f1128 100644 --- a/executor/metrics_reader.go +++ b/executor/metrics_reader.go @@ -89,9 +89,12 @@ func (e *MetricRetriever) retrieve(ctx context.Context, sctx sessionctx.Context) return totalRows, nil } +// MockMetricsPromDataKey is for test +type MockMetricsPromDataKey struct{} + func (e *MetricRetriever) queryMetric(ctx context.Context, sctx sessionctx.Context, queryRange promv1.Range, quantile float64) (result pmodel.Value, err error) { failpoint.InjectContext(ctx, "mockMetricsPromData", func() { - failpoint.Return(ctx.Value("__mockMetricsPromData").(pmodel.Matrix), nil) + failpoint.Return(ctx.Value(MockMetricsPromDataKey{}).(pmodel.Matrix), nil) }) // Add retry to avoid network error. diff --git a/executor/mpp_gather.go b/executor/mpp_gather.go index 42526774dbdd5..6460e7e3de267 100644 --- a/executor/mpp_gather.go +++ b/executor/mpp_gather.go @@ -16,6 +16,7 @@ package executor import ( "context" + "time" "github.com/pingcap/errors" "github.com/pingcap/failpoint" @@ -26,6 +27,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tipb/go-tipb" "go.uber.org/zap" ) @@ -38,6 +40,18 @@ func useMPPExecution(ctx sessionctx.Context, tr *plannercore.PhysicalTableReader return ok } +func getMPPQueryID(ctx sessionctx.Context) uint64 { + mppQueryInfo := &ctx.GetSessionVars().StmtCtx.MPPQueryInfo + mppQueryInfo.QueryID.CompareAndSwap(0, plannercore.AllocMPPQueryID()) + return mppQueryInfo.QueryID.Load() +} + +func getMPPQueryTS(ctx sessionctx.Context) uint64 { + mppQueryInfo := &ctx.GetSessionVars().StmtCtx.MPPQueryInfo + mppQueryInfo.QueryTS.CompareAndSwap(0, uint64(time.Now().UnixNano())) + return mppQueryInfo.QueryTS.Load() +} + // MPPGather dispatch MPP tasks and read data from root tasks. type MPPGather struct { // following fields are construct needed @@ -45,10 +59,13 @@ type MPPGather struct { is infoschema.InfoSchema originalPlan plannercore.PhysicalPlan startTS uint64 + mppQueryID kv.MPPQueryID mppReqs []*kv.MPPDispatchRequest respIter distsql.SelectResult + + memTracker *memory.Tracker } func (e *MPPGather) appendMPPDispatchReq(pf *plannercore.Fragment) error { @@ -67,7 +84,9 @@ func (e *MPPGather) appendMPPDispatchReq(pf *plannercore.Fragment) error { for _, mppTask := range pf.ExchangeSender.Tasks { if mppTask.PartitionTableIDs != nil { err = updateExecutorTableID(context.Background(), dagReq.RootExecutor, true, mppTask.PartitionTableIDs) - } else { + } else if !mppTask.IsDisaggregatedTiFlashStaticPrune { + // If isDisaggregatedTiFlashStaticPrune is true, it means this TableScan is under PartitionUnoin, + // tableID in TableScan is already the physical table id of this partition, no need to update again. err = updateExecutorTableID(context.Background(), dagReq.RootExecutor, true, []int64{mppTask.TableID}) } if err != nil { @@ -77,18 +96,24 @@ func (e *MPPGather) appendMPPDispatchReq(pf *plannercore.Fragment) error { if err != nil { return errors.Trace(err) } + logutil.BgLogger().Info("Dispatch mpp task", zap.Uint64("timestamp", mppTask.StartTs), - zap.Int64("ID", mppTask.ID), zap.String("address", mppTask.Meta.GetAddress()), - zap.String("plan", plannercore.ToString(pf.ExchangeSender))) + zap.Int64("ID", mppTask.ID), zap.Uint64("QueryTs", mppTask.MppQueryID.QueryTs), zap.Uint64("LocalQueryId", mppTask.MppQueryID.LocalQueryID), + zap.Uint64("ServerID", mppTask.MppQueryID.ServerID), zap.String("address", mppTask.Meta.GetAddress()), + zap.String("plan", plannercore.ToString(pf.ExchangeSender)), + zap.Int64("mpp-version", mppTask.MppVersion.ToInt64()), + zap.String("exchange-compression-mode", pf.ExchangeSender.CompressionMode.Name()), + ) req := &kv.MPPDispatchRequest{ - Data: pbData, - Meta: mppTask.Meta, - ID: mppTask.ID, - IsRoot: pf.IsRoot, - Timeout: 10, - SchemaVar: e.is.SchemaMetaVersion(), - StartTs: e.startTS, - State: kv.MppTaskReady, + Data: pbData, + Meta: mppTask.Meta, + ID: mppTask.ID, + IsRoot: pf.IsRoot, + Timeout: 10, + SchemaVar: e.is.SchemaMetaVersion(), + StartTs: e.startTS, + MppQueryID: mppTask.MppQueryID, + State: kv.MppTaskReady, } e.mppReqs = append(e.mppReqs, req) } @@ -109,7 +134,7 @@ func (e *MPPGather) Open(ctx context.Context) (err error) { // TODO: Move the construct tasks logic to planner, so we can see the explain results. sender := e.originalPlan.(*plannercore.PhysicalExchangeSender) planIDs := collectPlanIDS(e.originalPlan, nil) - frags, err := plannercore.GenerateRootMPPTasks(e.ctx, e.startTS, sender, e.is) + frags, err := plannercore.GenerateRootMPPTasks(e.ctx, e.startTS, e.mppQueryID, sender, e.is) if err != nil { return errors.Trace(err) } @@ -124,7 +149,7 @@ func (e *MPPGather) Open(ctx context.Context) (err error) { failpoint.Return(errors.Errorf("The number of tasks is not right, expect %d tasks but actually there are %d tasks", val.(int), len(e.mppReqs))) } }) - e.respIter, err = distsql.DispatchMPPTasks(ctx, e.ctx, e.mppReqs, e.retFieldTypes, planIDs, e.id, e.startTS) + e.respIter, err = distsql.DispatchMPPTasks(ctx, e.ctx, e.mppReqs, e.retFieldTypes, planIDs, e.id, e.startTS, e.mppQueryID, e.memTracker) if err != nil { return errors.Trace(err) } diff --git a/executor/oomtest/BUILD.bazel b/executor/oomtest/BUILD.bazel index 2fd8fe00f7d23..d6d7915a0b634 100644 --- a/executor/oomtest/BUILD.bazel +++ b/executor/oomtest/BUILD.bazel @@ -2,7 +2,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_test") go_test( name = "oomtest_test", - timeout = "short", + timeout = "moderate", srcs = ["oom_test.go"], flaky = True, race = "on", diff --git a/executor/oomtest/oom_test.go b/executor/oomtest/oom_test.go index 8a9f2c0263d76..fc95bb47ceab8 100644 --- a/executor/oomtest/oom_test.go +++ b/executor/oomtest/oom_test.go @@ -222,6 +222,11 @@ func (h *oomCapture) Write(entry zapcore.Entry, fields []zapcore.Field) error { h.tracker = str[begin+len("8001]") : end] return nil } + // They are just common background task and not related to the oom. + if entry.Message == "SetTiFlashGroupConfig" || + entry.Message == "record table item load status failed due to not finding item" { + return nil + } h.mu.Lock() h.tracker = entry.Message diff --git a/executor/parallel_apply.go b/executor/parallel_apply.go index 2c4499b14818c..a0d418cc0e441 100644 --- a/executor/parallel_apply.go +++ b/executor/parallel_apply.go @@ -176,7 +176,6 @@ func (e *ParallelNestedLoopApplyExec) Close() error { if e.runtimeStats != nil { runtimeStats := newJoinRuntimeStats() - e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, runtimeStats) if e.useCache { var hitRatio float64 if e.cacheAccessCounter > 0 { @@ -187,6 +186,7 @@ func (e *ParallelNestedLoopApplyExec) Close() error { runtimeStats.setCacheInfo(false, 0) } runtimeStats.SetConcurrencyInfo(execdetails.NewConcurrencyInfo("Concurrency", e.concurrency)) + defer e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, runtimeStats) } return err } diff --git a/executor/partition_table_test.go b/executor/partition_table_test.go index 50bb68a7b5235..85b096c28ff0d 100644 --- a/executor/partition_table_test.go +++ b/executor/partition_table_test.go @@ -17,6 +17,7 @@ package executor_test import ( "fmt" "math/rand" + "strconv" "strings" "testing" "time" @@ -84,7 +85,7 @@ partition p2 values less than (10))`) // Table reader: one partition tk.MustQuery("select * from pt where c > 8").Check(testkit.Rows("9 9")) // Table reader: more than one partition - tk.MustQuery("select * from pt where c < 2 or c >= 9").Check(testkit.Rows("0 0", "9 9")) + tk.MustQuery("select * from pt where c < 2 or c >= 9").Sort().Check(testkit.Rows("0 0", "9 9")) // Index reader tk.MustQuery("select c from pt").Sort().Check(testkit.Rows("0", "2", "4", "6", "7", "9", "")) @@ -96,7 +97,7 @@ partition p2 values less than (10))`) tk.MustQuery("select /*+ use_index(pt, i_id) */ * from pt").Sort().Check(testkit.Rows("0 0", "2 2", "4 4", "6 6", "7 7", "9 9", " ")) tk.MustQuery("select /*+ use_index(pt, i_id) */ * from pt where id < 4 and c > 10").Check(testkit.Rows()) tk.MustQuery("select /*+ use_index(pt, i_id) */ * from pt where id < 10 and c > 8").Check(testkit.Rows("9 9")) - tk.MustQuery("select /*+ use_index(pt, i_id) */ * from pt where id < 10 and c < 2 or c >= 9").Check(testkit.Rows("0 0", "9 9")) + tk.MustQuery("select /*+ use_index(pt, i_id) */ * from pt where id < 10 and c < 2 or c >= 9").Sort().Check(testkit.Rows("0 0", "9 9")) // Index Merge tk.MustExec("set @@tidb_enable_index_merge = 1") @@ -356,7 +357,7 @@ func TestPartitionInfoDisable(t *testing.T) { tk.MustQuery("select * from t_info_null where (date = '2020-10-02' or date = '2020-10-06') and app = 'xxx' and media = '19003006'").Check(testkit.Rows()) } -func TestOrderByandLimit(t *testing.T) { +func TestOrderByAndLimit(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -377,14 +378,148 @@ func TestOrderByandLimit(t *testing.T) { // regular table tk.MustExec("create table tregular(a int, b int, index idx_a(a))") + // range partition table with int pk + tk.MustExec(`create table trange_intpk(a int primary key, b int) partition by range(a) ( + partition p0 values less than(300), + partition p1 values less than (500), + partition p2 values less than(1100));`) + + // hash partition table with int pk + tk.MustExec("create table thash_intpk(a int primary key, b int) partition by hash(a) partitions 4;") + + // regular table with int pk + tk.MustExec("create table tregular_intpk(a int primary key, b int)") + + // range partition table with clustered index + tk.MustExec(`create table trange_clustered(a int, b int, primary key(a, b) clustered) partition by range(a) ( + partition p0 values less than(300), + partition p1 values less than (500), + partition p2 values less than(1100));`) + + // hash partition table with clustered index + tk.MustExec("create table thash_clustered(a int, b int, primary key(a, b) clustered) partition by hash(a) partitions 4;") + + // regular table with clustered index + tk.MustExec("create table tregular_clustered(a int, b int, primary key(a, b) clustered)") + + listVals := make([]int, 0, 2000) + + for i := 0; i < 2000; i++ { + listVals = append(listVals, i) + } + rand.Shuffle(len(listVals), func(i, j int) { + listVals[i], listVals[j] = listVals[j], listVals[i] + }) + + var listVals1, listVals2, listVals3 string + + for i := 0; i <= 600; i++ { + listVals1 += strconv.Itoa(listVals[i]) + if i != 600 { + listVals1 += "," + } + } + for i := 601; i <= 1200; i++ { + listVals2 += strconv.Itoa(listVals[i]) + if i != 1200 { + listVals2 += "," + } + } + for i := 1201; i <= 1999; i++ { + listVals3 += strconv.Itoa(listVals[i]) + if i != 1999 { + listVals3 += "," + } + } + + tk.MustExec(fmt.Sprintf(`create table tlist_intpk(a int primary key, b int) partition by list(a)( + partition p1 values in (%s), + partition p2 values in (%s), + partition p3 values in (%s) + )`, listVals1, listVals2, listVals3)) + tk.MustExec(fmt.Sprintf(`create table tlist(a int, b int, index idx_a(a)) partition by list(a)( + partition p1 values in (%s), + partition p2 values in (%s), + partition p3 values in (%s) + )`, listVals1, listVals2, listVals3)) + tk.MustExec(fmt.Sprintf(`create table tlist_clustered(a int, b int, primary key(a, b)) partition by list(a)( + partition p1 values in (%s), + partition p2 values in (%s), + partition p3 values in (%s) + )`, listVals1, listVals2, listVals3)) + // generate some random data to be inserted vals := make([]string, 0, 2000) for i := 0; i < 2000; i++ { vals = append(vals, fmt.Sprintf("(%v, %v)", rand.Intn(1100), rand.Intn(2000))) } - tk.MustExec("insert into trange values " + strings.Join(vals, ",")) - tk.MustExec("insert into thash values " + strings.Join(vals, ",")) - tk.MustExec("insert into tregular values " + strings.Join(vals, ",")) + + dedupValsA := make([]string, 0, 2000) + dedupMapA := make(map[int]struct{}, 2000) + for i := 0; i < 2000; i++ { + valA := rand.Intn(1100) + if _, ok := dedupMapA[valA]; ok { + continue + } + dedupValsA = append(dedupValsA, fmt.Sprintf("(%v, %v)", valA, rand.Intn(2000))) + dedupMapA[valA] = struct{}{} + } + + dedupValsAB := make([]string, 0, 2000) + dedupMapAB := make(map[string]struct{}, 2000) + for i := 0; i < 2000; i++ { + val := fmt.Sprintf("(%v, %v)", rand.Intn(1100), rand.Intn(2000)) + if _, ok := dedupMapAB[val]; ok { + continue + } + dedupValsAB = append(dedupValsAB, val) + dedupMapAB[val] = struct{}{} + } + + valInserted := strings.Join(vals, ",") + valDedupAInserted := strings.Join(dedupValsA, ",") + valDedupABInserted := strings.Join(dedupValsAB, ",") + + tk.MustExec("insert into trange values " + valInserted) + tk.MustExec("insert into thash values " + valInserted) + tk.MustExec("insert into tlist values" + valInserted) + tk.MustExec("insert into tregular values " + valInserted) + tk.MustExec("insert into trange_intpk values " + valDedupAInserted) + tk.MustExec("insert into thash_intpk values " + valDedupAInserted) + tk.MustExec("insert into tlist_intpk values " + valDedupAInserted) + tk.MustExec("insert into tregular_intpk values " + valDedupAInserted) + tk.MustExec("insert into trange_clustered values " + valDedupABInserted) + tk.MustExec("insert into thash_clustered values " + valDedupABInserted) + tk.MustExec("insert into tlist_clustered values " + valDedupABInserted) + tk.MustExec("insert into tregular_clustered values " + valDedupABInserted) + + tk.MustExec("analyze table trange") + tk.MustExec("analyze table trange_intpk") + tk.MustExec("analyze table trange_clustered") + tk.MustExec("analyze table thash") + tk.MustExec("analyze table thash_intpk") + tk.MustExec("analyze table thash_clustered") + tk.MustExec("analyze table tregular") + tk.MustExec("analyze table tregular_intpk") + tk.MustExec("analyze table tregular_clustered") + tk.MustExec("analyze table tlist") + tk.MustExec("analyze table tlist_intpk") + tk.MustExec("analyze table tlist_clustered") + + // Create virtual tiflash replica info. + dom := domain.GetDomain(tk.Session()) + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test_orderby_limit")) + require.True(t, exists) + for _, tblInfo := range db.Tables { + if strings.HasPrefix(tblInfo.Name.L, "tr") || strings.HasPrefix(tblInfo.Name.L, "thash") || strings.HasPrefix(tblInfo.Name.L, "tlist") { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + tk.MustExec("set @@session.tidb_isolation_read_engines=\"tikv\"") // test indexLookUp for i := 0; i < 100; i++ { @@ -398,6 +533,34 @@ func TestOrderByandLimit(t *testing.T) { tk.MustQuery(queryPartition).Sort().Check(tk.MustQuery(queryRegular).Sort().Rows()) } + // test indexLookUp with order property pushed down. + for i := 0; i < 100; i++ { + // explain select * from t where a > {y} use index(idx_a) order by a limit {x}; // check if IndexLookUp is used + // select * from t where a > {y} use index(idx_a) order by a limit {x}; // it can return the correct result + x := rand.Intn(1099) + y := rand.Intn(2000) + 1 + // Since we only use order by a not order by a, b, the result is not stable when we read both a and b. + // We cut the max element so that the result can be stable. + maxEle := tk.MustQuery(fmt.Sprintf("select ifnull(max(a), 1100) from (select * from tregular use index(idx_a) where a > %v order by a limit %v) t", x, y)).Rows()[0][0] + queryRangePartitionWithLimitHint := fmt.Sprintf("select /*+ LIMIT_TO_COP() */ * from trange use index(idx_a) where a > %v and a < greatest(%v+1, %v) order by a limit %v", x, x+1, maxEle, y) + queryHashPartitionWithLimitHint := fmt.Sprintf("select /*+ LIMIT_TO_COP() */ * from thash use index(idx_a) where a > %v and a < greatest(%v+1, %v) order by a limit %v", x, x+1, maxEle, y) + queryListPartitionWithLimitHint := fmt.Sprintf("select /*+ LIMIT_TO_COP() */ * from thash use index(idx_a) where a > %v and a < greatest(%v+1, %v) order by a limit %v", x, x+1, maxEle, y) + queryRegular := fmt.Sprintf("select * from tregular use index(idx_a) where a > %v and a < greatest(%v+1, %v) order by a limit %v;", x, x+1, maxEle, y) + require.True(t, tk.HasPlan(queryRangePartitionWithLimitHint, "Limit")) + require.True(t, tk.HasPlan(queryRangePartitionWithLimitHint, "IndexLookUp")) + require.True(t, tk.HasPlan(queryHashPartitionWithLimitHint, "Limit")) + require.True(t, tk.HasPlan(queryHashPartitionWithLimitHint, "IndexLookUp")) + require.True(t, tk.HasPlan(queryListPartitionWithLimitHint, "Limit")) + require.True(t, tk.HasPlan(queryListPartitionWithLimitHint, "IndexLookUp")) + require.True(t, tk.HasPlan(queryRangePartitionWithLimitHint, "TopN")) // but not fully pushed + require.True(t, tk.HasPlan(queryHashPartitionWithLimitHint, "TopN")) + require.True(t, tk.HasPlan(queryListPartitionWithLimitHint, "TopN")) + regularResult := tk.MustQuery(queryRegular).Sort().Rows() + tk.MustQuery(queryRangePartitionWithLimitHint).Sort().Check(regularResult) + tk.MustQuery(queryHashPartitionWithLimitHint).Sort().Check(regularResult) + tk.MustQuery(queryListPartitionWithLimitHint).Sort().Check(regularResult) + } + // test tableReader for i := 0; i < 100; i++ { // explain select * from t where a > {y} ignore index(idx_a) order by a limit {x}; // check if IndexLookUp is used @@ -410,6 +573,119 @@ func TestOrderByandLimit(t *testing.T) { tk.MustQuery(queryPartition).Sort().Check(tk.MustQuery(queryRegular).Sort().Rows()) } + // test tableReader with order property pushed down. + for i := 0; i < 100; i++ { + // explain select * from t where a > {y} ignore index(idx_a) order by a limit {x}; // check if IndexLookUp is used + // select * from t where a > {y} ignore index(idx_a) order by a limit {x}; // it can return the correct result + x := rand.Intn(1099) + y := rand.Intn(2000) + 1 + queryRangePartition := fmt.Sprintf("select /*+ LIMIT_TO_COP() */ * from trange ignore index(idx_a) where a > %v order by a, b limit %v;", x, y) + queryHashPartition := fmt.Sprintf("select /*+ LIMIT_TO_COP() */ * from thash ignore index(idx_a) where a > %v order by a, b limit %v;", x, y) + queryListPartition := fmt.Sprintf("select /*+ LIMIT_TO_COP() */ * from tlist ignore index(idx_a) where a > %v order by a, b limit %v;", x, y) + queryRegular := fmt.Sprintf("select * from tregular ignore index(idx_a) where a > %v order by a, b limit %v;", x, y) + require.True(t, tk.HasPlan(queryRangePartition, "TableReader")) // check if tableReader is used + require.True(t, tk.HasPlan(queryHashPartition, "TableReader")) + require.True(t, tk.HasPlan(queryListPartition, "TableReader")) + require.False(t, tk.HasPlan(queryRangePartition, "Limit")) // check if order property is not pushed + require.False(t, tk.HasPlan(queryHashPartition, "Limit")) + require.False(t, tk.HasPlan(queryListPartition, "Limit")) + regularResult := tk.MustQuery(queryRegular).Sort().Rows() + tk.MustQuery(queryRangePartition).Sort().Check(regularResult) + tk.MustQuery(queryHashPartition).Sort().Check(regularResult) + tk.MustQuery(queryListPartition).Sort().Check(regularResult) + + // test int pk + // To be simplified, we only read column a. + queryRangePartition = fmt.Sprintf("select /*+ LIMIT_TO_COP() */ a from trange_intpk use index(primary) where a > %v order by a limit %v", x, y) + queryHashPartition = fmt.Sprintf("select /*+ LIMIT_TO_COP() */ a from thash_intpk use index(primary) where a > %v order by a limit %v", x, y) + queryListPartition = fmt.Sprintf("select /*+ LIMIT_TO_COP() */ a from tlist_intpk use index(primary) where a > %v order by a limit %v", x, y) + queryRegular = fmt.Sprintf("select a from tregular_intpk where a > %v order by a limit %v", x, y) + require.True(t, tk.HasPlan(queryRangePartition, "TableReader")) + require.True(t, tk.HasPlan(queryHashPartition, "TableReader")) + require.True(t, tk.HasPlan(queryListPartition, "TableReader")) + require.True(t, tk.HasPlan(queryRangePartition, "Limit")) // check if order property is not pushed + require.True(t, tk.HasPlan(queryHashPartition, "Limit")) + require.True(t, tk.HasPlan(queryListPartition, "Limit")) + regularResult = tk.MustQuery(queryRegular).Rows() + tk.MustQuery(queryRangePartition).Check(regularResult) + tk.MustQuery(queryHashPartition).Check(regularResult) + tk.MustQuery(queryListPartition).Check(regularResult) + + // test clustered index + queryRangePartition = fmt.Sprintf("select /*+ LIMIT_TO_COP() */ * from trange_clustered use index(primary) where a > %v order by a, b limit %v;", x, y) + queryHashPartition = fmt.Sprintf("select /*+ LIMIT_TO_COP() */ * from thash_clustered use index(primary) where a > %v order by a, b limit %v;", x, y) + queryListPartition = fmt.Sprintf("select /*+ LIMIT_TO_COP() */ * from tlist_clustered use index(primary) where a > %v order by a, b limit %v;", x, y) + queryRegular = fmt.Sprintf("select * from tregular_clustered where a > %v order by a, b limit %v;", x, y) + require.True(t, tk.HasPlan(queryRangePartition, "TableReader")) // check if tableReader is used + require.True(t, tk.HasPlan(queryHashPartition, "TableReader")) + require.True(t, tk.HasPlan(queryListPartition, "TableReader")) + require.True(t, tk.HasPlan(queryRangePartition, "Limit")) // check if order property is pushed + require.True(t, tk.HasPlan(queryHashPartition, "Limit")) + require.True(t, tk.HasPlan(queryListPartition, "Limit")) + require.True(t, tk.HasPlan(queryRangePartition, "TopN")) // but not fully pushed + require.True(t, tk.HasPlan(queryHashPartition, "TopN")) + require.True(t, tk.HasPlan(queryListPartition, "TopN")) + regularResult = tk.MustQuery(queryRegular).Rows() + tk.MustQuery(queryRangePartition).Check(regularResult) + tk.MustQuery(queryHashPartition).Check(regularResult) + tk.MustQuery(queryListPartition).Check(regularResult) + + tk.MustExec(" set @@tidb_allow_mpp=1;") + tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash,tikv\"") + queryPartitionWithTiFlash := fmt.Sprintf("select /*+ read_from_storage(tiflash[trange_intpk]) */ * from trange_intpk where a > %v order by a limit %v", x, y) + // check if tiflash is used + require.True(t, tk.HasTiFlashPlan(queryPartitionWithTiFlash), fmt.Sprintf("%v", tk.MustQuery("explain "+queryPartitionWithTiFlash).Rows())) + // but order is not pushed + require.False(t, tk.HasPlan(queryPartitionWithTiFlash, "Limit"), fmt.Sprintf("%v", tk.MustQuery("explain "+queryPartitionWithTiFlash).Rows())) + queryPartitionWithTiFlash = fmt.Sprintf("select /*+ read_from_storage(tiflash[trange_intpk]) */ /*+ LIMIT_TO_COP() */ * from trange_intpk where a > %v order by a limit %v", x, y) + // check if tiflash is used + require.True(t, tk.HasTiFlashPlan(queryPartitionWithTiFlash), fmt.Sprintf("%v", tk.MustQuery("explain "+queryPartitionWithTiFlash).Rows())) + // but order is not pushed + require.False(t, tk.HasPlan(queryPartitionWithTiFlash, "Limit"), fmt.Sprintf("%v", tk.MustQuery("explain "+queryPartitionWithTiFlash).Rows())) + queryPartitionWithTiFlash = fmt.Sprintf("select /*+ read_from_storage(tiflash[trange_clustered]) */ * from trange_clustered where a > %v order by a limit %v", x, y) + // check if tiflash is used + require.True(t, tk.HasTiFlashPlan(queryPartitionWithTiFlash), fmt.Sprintf("%v", tk.MustQuery("explain "+queryPartitionWithTiFlash).Rows())) + queryPartitionWithTiFlash = fmt.Sprintf("select /*+ read_from_storage(tiflash[trange_clustered]) */ /*+ LIMIT_TO_COP() */ * from trange_clustered where a > %v order by a limit %v", x, y) + // check if tiflash is used + require.True(t, tk.HasTiFlashPlan(queryPartitionWithTiFlash)) + // but order is not pushed + require.False(t, tk.HasPlan(queryPartitionWithTiFlash, "Limit"), fmt.Sprintf("%v", tk.MustQuery("explain "+queryPartitionWithTiFlash).Rows())) + queryPartitionWithTiFlash = fmt.Sprintf("select /*+ read_from_storage(tiflash[thash_intpk]) */ * from thash_intpk where a > %v order by a limit %v", x, y) + // check if tiflash is used + require.True(t, tk.HasTiFlashPlan(queryPartitionWithTiFlash), fmt.Sprintf("%v", tk.MustQuery("explain "+queryPartitionWithTiFlash).Rows())) + queryPartitionWithTiFlash = fmt.Sprintf("select /*+ read_from_storage(tiflash[thash_intpk]) */ /*+ LIMIT_TO_COP() */ * from thash_intpk where a > %v order by a limit %v", x, y) + // check if tiflash is used + require.True(t, tk.HasTiFlashPlan(queryPartitionWithTiFlash)) + // but order is not pushed + require.False(t, tk.HasPlan(queryPartitionWithTiFlash, "Limit"), fmt.Sprintf("%v", tk.MustQuery("explain "+queryPartitionWithTiFlash).Rows())) + queryPartitionWithTiFlash = fmt.Sprintf("select /*+ read_from_storage(tiflash[thash_clustered]) */ * from thash_clustered where a > %v order by a limit %v", x, y) + // check if tiflash is used + require.True(t, tk.HasTiFlashPlan(queryPartitionWithTiFlash), fmt.Sprintf("%v", tk.MustQuery("explain "+queryPartitionWithTiFlash).Rows())) + queryPartitionWithTiFlash = fmt.Sprintf("select /*+ read_from_storage(tiflash[thash_clustered]) */ /*+ LIMIT_TO_COP() */ * from thash_clustered where a > %v order by a limit %v", x, y) + // check if tiflash is used + require.True(t, tk.HasTiFlashPlan(queryPartitionWithTiFlash)) + // but order is not pushed + require.False(t, tk.HasPlan(queryPartitionWithTiFlash, "Limit"), fmt.Sprintf("%v", tk.MustQuery("explain "+queryPartitionWithTiFlash).Rows())) + queryPartitionWithTiFlash = fmt.Sprintf("select /*+ read_from_storage(tiflash[tlist_intpk]) */ * from tlist_intpk where a > %v order by a limit %v", x, y) + // check if tiflash is used + require.True(t, tk.HasTiFlashPlan(queryPartitionWithTiFlash), fmt.Sprintf("%v", tk.MustQuery("explain "+queryPartitionWithTiFlash).Rows())) + queryPartitionWithTiFlash = fmt.Sprintf("select /*+ read_from_storage(tiflash[tlist_intpk]) */ /*+ LIMIT_TO_COP() */ * from tlist_intpk where a > %v order by a limit %v", x, y) + // check if tiflash is used + require.True(t, tk.HasTiFlashPlan(queryPartitionWithTiFlash)) + // but order is not pushed + require.False(t, tk.HasPlan(queryPartitionWithTiFlash, "Limit"), fmt.Sprintf("%v", tk.MustQuery("explain "+queryPartitionWithTiFlash).Rows())) + queryPartitionWithTiFlash = fmt.Sprintf("select /*+ read_from_storage(tiflash[tlist_clustered]) */ * from tlist_clustered where a > %v order by a limit %v", x, y) + // check if tiflash is used + require.True(t, tk.HasTiFlashPlan(queryPartitionWithTiFlash), fmt.Sprintf("%v", tk.MustQuery("explain "+queryPartitionWithTiFlash).Rows())) + queryPartitionWithTiFlash = fmt.Sprintf("select /*+ read_from_storage(tiflash[tlist_clustered]) */ /*+ LIMIT_TO_COP() */ * from tlist_clustered where a > %v order by a limit %v", x, y) + // check if tiflash is used + require.True(t, tk.HasTiFlashPlan(queryPartitionWithTiFlash)) + // but order is not pushed + require.False(t, tk.HasPlan(queryPartitionWithTiFlash, "Limit"), fmt.Sprintf("%v", tk.MustQuery("explain "+queryPartitionWithTiFlash).Rows())) + tk.MustExec(" set @@tidb_allow_mpp=0;") + tk.MustExec("set @@session.tidb_isolation_read_engines=\"tikv\"") + } + // test indexReader for i := 0; i < 100; i++ { // explain select a from t where a > {y} use index(idx_a) order by a limit {x}; // check if IndexLookUp is used @@ -422,6 +698,24 @@ func TestOrderByandLimit(t *testing.T) { tk.MustQuery(queryPartition).Sort().Check(tk.MustQuery(queryRegular).Sort().Rows()) } + // test indexReader with order property pushed down. + for i := 0; i < 100; i++ { + // explain select a from t where a > {y} use index(idx_a) order by a limit {x}; // check if IndexLookUp is used + // select a from t where a > {y} use index(idx_a) order by a limit {x}; // it can return the correct result + x := rand.Intn(1099) + y := rand.Intn(2000) + 1 + queryRangePartition := fmt.Sprintf("select /*+ LIMIT_TO_COP() */ a from trange use index(idx_a) where a > %v order by a limit %v;", x, y) + queryHashPartition := fmt.Sprintf("select /*+ LIMIT_TO_COP() */ a from trange use index(idx_a) where a > %v order by a limit %v;", x, y) + queryRegular := fmt.Sprintf("select a from tregular use index(idx_a) where a > %v order by a limit %v;", x, y) + require.True(t, tk.HasPlan(queryRangePartition, "IndexReader")) // check if indexReader is used + require.True(t, tk.HasPlan(queryHashPartition, "IndexReader")) + require.True(t, tk.HasPlan(queryRangePartition, "Limit")) // check if order property is pushed + require.True(t, tk.HasPlan(queryHashPartition, "Limit")) + regularResult := tk.MustQuery(queryRegular).Sort().Rows() + tk.MustQuery(queryRangePartition).Sort().Check(regularResult) + tk.MustQuery(queryHashPartition).Sort().Check(regularResult) + } + // test indexMerge for i := 0; i < 100; i++ { // explain select /*+ use_index_merge(t) */ * from t where a > 2 or b < 5 order by a limit {x}; // check if IndexMerge is used @@ -434,6 +728,17 @@ func TestOrderByandLimit(t *testing.T) { } } +func TestOrderByOnUnsignedPk(t *testing.T) { + store := testkit.CreateMockStore(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table tunsigned_hash(a bigint unsigned primary key) partition by hash(a) partitions 6") + tk.MustExec("insert into tunsigned_hash values(25), (9279808998424041135)") + tk.MustQuery("select min(a) from tunsigned_hash").Check(testkit.Rows("25")) + tk.MustQuery("select max(a) from tunsigned_hash").Check(testkit.Rows("9279808998424041135")) +} + func TestBatchGetandPointGetwithHashPartition(t *testing.T) { store := testkit.CreateMockStore(t) @@ -2834,7 +3139,7 @@ partition p1 values less than (7), partition p2 values less than (10))`) tk.MustExec("alter table p add unique idx(id)") tk.MustExec("insert into p values (1,3), (3,4), (5,6), (7,9)") - tk.MustQuery("select id from p use index (idx)").Check(testkit.Rows("1", "3", "5", "7")) + tk.MustQuery("select id from p use index (idx) order by id").Check(testkit.Rows("1", "3", "5", "7")) } func TestGlobalIndexDoubleRead(t *testing.T) { @@ -3531,11 +3836,11 @@ func TestPartitionTableExplain(t *testing.T) { " └─IndexFullScan 1.00 cop[tikv] table:t, partition:p1, index:b(b) keep order:false")) tk.MustQuery(`explain format = 'brief' select * from t,t2 where t2.a = 1 and t2.b = t.b and t.a = 1`).Check(testkit.Rows( "HashJoin 1.00 root inner join, equal:[eq(testpartitiontableexplain.t.b, testpartitiontableexplain.t2.b)]", - "├─TableReader(Build) 1.00 root data:Selection", - "│ └─Selection 1.00 cop[tikv] eq(testpartitiontableexplain.t2.a, 1), not(isnull(testpartitiontableexplain.t2.b))", - "│ └─TableFullScan 3.00 cop[tikv] table:t2 keep order:false", - "└─Selection(Probe) 1.00 root not(isnull(testpartitiontableexplain.t.b))", - " └─Point_Get 1.00 root table:t, partition:p1 handle:1")) + `├─Selection(Build) 1.00 root not(isnull(testpartitiontableexplain.t.b))`, + `│ └─Point_Get 1.00 root table:t, partition:p1 handle:1`, + `└─TableReader(Probe) 1.00 root data:Selection`, + ` └─Selection 1.00 cop[tikv] eq(testpartitiontableexplain.t2.a, 1), not(isnull(testpartitiontableexplain.t2.b))`, + ` └─TableFullScan 3.00 cop[tikv] table:t2 keep order:false`)) tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic'") tk.MustExec(`analyze table t`) @@ -3628,3 +3933,72 @@ func TestIssue21732(t *testing.T) { }) } } + +func TestIssue39999(t *testing.T) { + store := testkit.CreateMockStore(t) + + tk := testkit.NewTestKit(t, store) + + tk.MustExec(`create schema test39999`) + tk.MustExec(`use test39999`) + tk.MustExec(`drop table if exists c, t`) + tk.MustExec("CREATE TABLE `c` (" + + "`serial_id` varchar(24)," + + "`occur_trade_date` date," + + "`txt_account_id` varchar(24)," + + "`capital_sub_class` varchar(10)," + + "`occur_amount` decimal(16,2)," + + "`broker` varchar(10)," + + "PRIMARY KEY (`txt_account_id`,`occur_trade_date`,`serial_id`) /*T![clustered_index] CLUSTERED */," + + "KEY `idx_serial_id` (`serial_id`)" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci " + + "PARTITION BY RANGE COLUMNS(`serial_id`) (" + + "PARTITION `p202209` VALUES LESS THAN ('20221001')," + + "PARTITION `p202210` VALUES LESS THAN ('20221101')," + + "PARTITION `p202211` VALUES LESS THAN ('20221201')" + + ")") + + tk.MustExec("CREATE TABLE `t` ( " + + "`txn_account_id` varchar(24), " + + "`account_id` varchar(32), " + + "`broker` varchar(10), " + + "PRIMARY KEY (`txn_account_id`) /*T![clustered_index] CLUSTERED */ " + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci") + + tk.MustExec("INSERT INTO `c` (serial_id, txt_account_id, capital_sub_class, occur_trade_date, occur_amount, broker) VALUES ('2022111700196920','04482786','CUST','2022-11-17',-2.01,'0009')") + tk.MustExec("INSERT INTO `t` VALUES ('04482786','1142927','0009')") + + tk.MustExec(`set tidb_partition_prune_mode='dynamic'`) + tk.MustExec(`analyze table c`) + tk.MustExec(`analyze table t`) + query := `select + /*+ inl_join(c) */ + c.occur_amount +from + c + join t on c.txt_account_id = t.txn_account_id + and t.broker = '0009' + and c.occur_trade_date = '2022-11-17'` + tk.MustQuery("explain " + query).Check(testkit.Rows(""+ + "IndexJoin_22 1.00 root inner join, inner:TableReader_21, outer key:test39999.t.txn_account_id, inner key:test39999.c.txt_account_id, equal cond:eq(test39999.t.txn_account_id, test39999.c.txt_account_id)", + "├─TableReader_27(Build) 1.00 root data:Selection_26", + "│ └─Selection_26 1.00 cop[tikv] eq(test39999.t.broker, \"0009\")", + "│ └─TableFullScan_25 1.00 cop[tikv] table:t keep order:false", + "└─TableReader_21(Probe) 1.00 root partition:all data:Selection_20", + " └─Selection_20 1.00 cop[tikv] eq(test39999.c.occur_trade_date, 2022-11-17 00:00:00.000000)", + " └─TableRangeScan_19 1.00 cop[tikv] table:c range: decided by [eq(test39999.c.txt_account_id, test39999.t.txn_account_id) eq(test39999.c.occur_trade_date, 2022-11-17 00:00:00.000000)], keep order:false")) + tk.MustQuery(query).Check(testkit.Rows("-2.01")) + + // Add the missing partition key part. + tk.MustExec(`alter table t add column serial_id varchar(24) default '2022111700196920'`) + query += ` and c.serial_id = t.serial_id` + tk.MustQuery(query).Check(testkit.Rows("-2.01")) + tk.MustQuery("explain " + query).Check(testkit.Rows(""+ + `IndexJoin_20 0.80 root inner join, inner:TableReader_19, outer key:test39999.t.txn_account_id, test39999.t.serial_id, inner key:test39999.c.txt_account_id, test39999.c.serial_id, equal cond:eq(test39999.t.serial_id, test39999.c.serial_id), eq(test39999.t.txn_account_id, test39999.c.txt_account_id)`, + `├─TableReader_25(Build) 0.80 root data:Selection_24`, + `│ └─Selection_24 0.80 cop[tikv] eq(test39999.t.broker, "0009"), not(isnull(test39999.t.serial_id))`, + `│ └─TableFullScan_23 1.00 cop[tikv] table:t keep order:false`, + `└─TableReader_19(Probe) 0.80 root partition:all data:Selection_18`, + ` └─Selection_18 0.80 cop[tikv] eq(test39999.c.occur_trade_date, 2022-11-17 00:00:00.000000)`, + ` └─TableRangeScan_17 0.80 cop[tikv] table:c range: decided by [eq(test39999.c.txt_account_id, test39999.t.txn_account_id) eq(test39999.c.serial_id, test39999.t.serial_id) eq(test39999.c.occur_trade_date, 2022-11-17 00:00:00.000000)], keep order:false`)) +} diff --git a/executor/plan_replayer.go b/executor/plan_replayer.go index fec3de1867933..f8a7ffe90fcca 100644 --- a/executor/plan_replayer.go +++ b/executor/plan_replayer.go @@ -18,25 +18,24 @@ import ( "archive/zip" "bytes" "context" - "crypto/rand" - "encoding/base64" "encoding/json" "fmt" "os" - "path/filepath" "strings" - "time" "github.com/BurntSushi/toml" "github.com/pingcap/errors" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/sessiontxn" "github.com/pingcap/tidb/statistics/handle" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/replayer" "github.com/pingcap/tidb/util/sqlexec" "go.uber.org/zap" ) @@ -47,8 +46,16 @@ var _ Executor = &PlanReplayerLoadExec{} // PlanReplayerExec represents a plan replayer executor. type PlanReplayerExec struct { baseExecutor - DumpInfo *PlanReplayerDumpInfo - endFlag bool + CaptureInfo *PlanReplayerCaptureInfo + DumpInfo *PlanReplayerDumpInfo + endFlag bool +} + +// PlanReplayerCaptureInfo indicates capture info +type PlanReplayerCaptureInfo struct { + SQLDigest string + PlanDigest string + Remove bool } // PlanReplayerDumpInfo indicates dump info @@ -67,6 +74,12 @@ func (e *PlanReplayerExec) Next(ctx context.Context, req *chunk.Chunk) error { if e.endFlag { return nil } + if e.CaptureInfo != nil { + if e.CaptureInfo.Remove { + return e.removeCaptureTask(ctx) + } + return e.registerCaptureTask(ctx) + } err := e.createFile() if err != nil { return err @@ -93,50 +106,69 @@ func (e *PlanReplayerExec) Next(ctx context.Context, req *chunk.Chunk) error { return nil } -func (e *PlanReplayerExec) createFile() error { - var err error - e.DumpInfo.File, e.DumpInfo.FileName, err = GeneratePlanReplayerFile() +func (e *PlanReplayerExec) removeCaptureTask(ctx context.Context) error { + ctx1 := kv.WithInternalSourceType(ctx, kv.InternalTxnStats) + exec := e.ctx.(sqlexec.RestrictedSQLExecutor) + _, _, err := exec.ExecRestrictedSQL(ctx1, nil, fmt.Sprintf("delete from mysql.plan_replayer_task where sql_digest = '%s' and plan_digest = '%s'", + e.CaptureInfo.SQLDigest, e.CaptureInfo.PlanDigest)) if err != nil { + logutil.BgLogger().Warn("remove mysql.plan_replayer_status record failed", + zap.Error(err)) return err } + err = domain.GetDomain(e.ctx).GetPlanReplayerHandle().CollectPlanReplayerTask() + if err != nil { + logutil.BgLogger().Warn("collect task failed", zap.Error(err)) + } + logutil.BgLogger().Info("collect plan replayer task success") + e.endFlag = true return nil } -// GeneratePlanReplayerFile generates plan replayer file -func GeneratePlanReplayerFile() (*os.File, string, error) { - path := domain.GetPlanReplayerDirName() - err := os.MkdirAll(path, os.ModePerm) +func (e *PlanReplayerExec) registerCaptureTask(ctx context.Context) error { + ctx1 := kv.WithInternalSourceType(ctx, kv.InternalTxnStats) + exists, err := domain.CheckPlanReplayerTaskExists(ctx1, e.ctx, e.CaptureInfo.SQLDigest, e.CaptureInfo.PlanDigest) if err != nil { - return nil, "", errors.AddStack(err) + return err + } + if exists { + return errors.New("plan replayer capture task already exists") } - fileName, err := generatePlanReplayerFileName() + exec := e.ctx.(sqlexec.RestrictedSQLExecutor) + _, _, err = exec.ExecRestrictedSQL(ctx1, nil, fmt.Sprintf("insert into mysql.plan_replayer_task (sql_digest, plan_digest) values ('%s','%s')", + e.CaptureInfo.SQLDigest, e.CaptureInfo.PlanDigest)) if err != nil { - return nil, "", errors.AddStack(err) + logutil.BgLogger().Warn("insert mysql.plan_replayer_status record failed", + zap.Error(err)) + return err } - zf, err := os.Create(filepath.Join(path, fileName)) + err = domain.GetDomain(e.ctx).GetPlanReplayerHandle().CollectPlanReplayerTask() if err != nil { - return nil, "", errors.AddStack(err) + logutil.BgLogger().Warn("collect task failed", zap.Error(err)) } - return zf, fileName, err + logutil.BgLogger().Info("collect plan replayer task success") + e.endFlag = true + return nil } -func generatePlanReplayerFileName() (string, error) { - // Generate key and create zip file - time := time.Now().UnixNano() - b := make([]byte, 16) - //nolint: gosec - _, err := rand.Read(b) +func (e *PlanReplayerExec) createFile() error { + var err error + e.DumpInfo.File, e.DumpInfo.FileName, err = replayer.GeneratePlanReplayerFile(false, false, false) if err != nil { - return "", err + return err } - key := base64.URLEncoding.EncodeToString(b) - return fmt.Sprintf("replayer_%v_%v.zip", key, time), nil + return nil } func (e *PlanReplayerDumpInfo) dump(ctx context.Context) (err error) { fileName := e.FileName zf := e.File + startTS, err := sessiontxn.GetTxnManager(e.ctx).GetStmtReadTS() + if err != nil { + return err + } task := &domain.PlanReplayerDumpTask{ + StartTS: startTS, FileName: fileName, Zf: zf, SessionVars: e.ctx.GetSessionVars(), @@ -378,21 +410,23 @@ func createSchemaAndItems(ctx sessionctx.Context, f *zip.File) error { if err != nil { return errors.AddStack(err) } - sqls := strings.Split(buf.String(), ";") - if len(sqls) != 3 { - return errors.New("plan replayer: create schema and tables failed") - } + originText := buf.String() + index1 := strings.Index(originText, ";") + createDatabaseSQL := originText[:index1+1] + index2 := strings.Index(originText[index1+1:], ";") + useDatabaseSQL := originText[index1+1:][:index2+1] + createTableSQL := originText[index1+1:][index2+1:] c := context.Background() // create database if not exists - _, err = ctx.(sqlexec.SQLExecutor).Execute(c, sqls[0]) + _, err = ctx.(sqlexec.SQLExecutor).Execute(c, createDatabaseSQL) logutil.BgLogger().Debug("plan replayer: skip error", zap.Error(err)) // use database - _, err = ctx.(sqlexec.SQLExecutor).Execute(c, sqls[1]) + _, err = ctx.(sqlexec.SQLExecutor).Execute(c, useDatabaseSQL) if err != nil { return err } // create table or view - _, err = ctx.(sqlexec.SQLExecutor).Execute(c, sqls[2]) + _, err = ctx.(sqlexec.SQLExecutor).Execute(c, createTableSQL) if err != nil { return err } @@ -439,6 +473,9 @@ func (e *PlanReplayerLoadInfo) Update(data []byte) error { // build schema and table first for _, zipFile := range z.File { + if zipFile.Name == fmt.Sprintf("schema/%v", domain.PlanReplayerSchemaMetaFile) { + continue + } path := strings.Split(zipFile.Name, "/") if len(path) == 2 && strings.Compare(path[0], "schema") == 0 { err = createSchemaAndItems(e.Ctx, zipFile) diff --git a/executor/point_get.go b/executor/point_get.go index f65c52c06cb1b..8efda04a970e5 100644 --- a/executor/point_get.go +++ b/executor/point_get.go @@ -74,13 +74,13 @@ func (b *executorBuilder) buildPointGet(p *plannercore.PointGetPlan) Executor { if b.ctx.GetSessionVars().IsReplicaReadClosestAdaptive() { e.snapshot.SetOption(kv.ReplicaReadAdjuster, newReplicaReadAdjuster(e.ctx, p.GetAvgRowSize())) } + e.snapshot.SetOption(kv.ResourceGroupName, b.ctx.GetSessionVars().ResourceGroupName) if e.runtimeStats != nil { snapshotStats := &txnsnapshot.SnapshotRuntimeStats{} e.stats = &runtimeStatsWithSnapshot{ SnapshotRuntimeStats: snapshotStats, } e.snapshot.SetOption(kv.CollectRuntimeStats, snapshotStats) - b.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) } if p.IndexInfo != nil { @@ -194,6 +194,9 @@ func (e *PointGetExecutor) Open(context.Context) error { // Close implements the Executor interface. func (e *PointGetExecutor) Close() error { + if e.stats != nil { + defer e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) + } if e.runtimeStats != nil && e.snapshot != nil { e.snapshot.SetOption(kv.CollectRuntimeStats, nil) } @@ -347,8 +350,8 @@ func (e *PointGetExecutor) Next(ctx context.Context, req *chunk.Chunk) error { return err } - err = FillVirtualColumnValue(e.virtualColumnRetFieldTypes, e.virtualColumnIndex, - e.schema, e.columns, e.ctx, req) + err = table.FillVirtualColumnValue(e.virtualColumnRetFieldTypes, e.virtualColumnIndex, + e.schema.Columns, e.columns, e.ctx, req) if err != nil { return err } diff --git a/executor/point_get_test.go b/executor/point_get_test.go index c615c3a75cb1a..8f13675457481 100644 --- a/executor/point_get_test.go +++ b/executor/point_get_test.go @@ -825,3 +825,20 @@ func TestPointGetIssue25167(t *testing.T) { tk.MustExec("insert into t values (1)") tk.MustQuery("select * from t as of timestamp @a where a = 1").Check(testkit.Rows()) } + +func TestPointGetIssue40194(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t1(id int primary key, v int)") + tk.MustExec("insert into t1 values(1, 10)") + tk.MustExec("prepare s from 'select * from t1 where id=1'") + tk.MustExec("set @@tidb_enable_plan_replayer_capture=1") + tk.MustQuery("execute s").Check(testkit.Rows("1 10")) + tk.MustQuery("execute s").Check(testkit.Rows("1 10")) + + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + tk2.MustExec("update t1 set v=v+1") + tk.MustQuery("execute s").Check(testkit.Rows("1 11")) +} diff --git a/executor/prepared.go b/executor/prepared.go index ae742a30d8bb5..6a5025e0d539b 100644 --- a/executor/prepared.go +++ b/executor/prepared.go @@ -53,8 +53,6 @@ type PrepareExec struct { Fields []*ast.ResultField Stmt interface{} - IsGeneralStmt bool - // If it's generated from executing "prepare stmt from '...'", the process is parse -> plan -> executor // If it's generated from the prepare protocol, the process is session.PrepareStmt -> NewPrepareExec // They both generate a PrepareExec struct, but the second case needs to reset the statement context while the first already do that. @@ -117,7 +115,7 @@ func (e *PrepareExec) Next(ctx context.Context, req *chunk.Chunk) error { return err } } - stmt, p, paramCnt, err := plannercore.GeneratePlanCacheStmtWithAST(ctx, e.ctx, stmt0) + stmt, p, paramCnt, err := plannercore.GeneratePlanCacheStmtWithAST(ctx, e.ctx, stmt0.Text(), stmt0) if err != nil { return err } @@ -135,19 +133,15 @@ func (e *PrepareExec) Next(ctx context.Context, req *chunk.Chunk) error { if !isNoResultPlan(p) { e.Fields = colNames2ResultFields(p.Schema(), p.OutputNames(), vars.CurrentDB) } - if e.ID == 0 && !e.IsGeneralStmt { + if e.ID == 0 { e.ID = vars.GetNextPreparedStmtID() } - if e.name != "" && !e.IsGeneralStmt { + if e.name != "" { vars.PreparedStmtNameToID[e.name] = e.ID } e.ParamCount = paramCnt e.Stmt = stmt - if e.IsGeneralStmt { - vars.AddGeneralPlanCacheStmt(e.sqlText, stmt) - return nil - } return vars.AddPreparedStmt(e.ID, stmt) } diff --git a/executor/prepared_test.go b/executor/prepared_test.go index 8ee6a0aa867c4..739ba1c0cd659 100644 --- a/executor/prepared_test.go +++ b/executor/prepared_test.go @@ -18,11 +18,13 @@ import ( "fmt" "strconv" "strings" + "sync/atomic" "testing" "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/parser/terror" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/server" "github.com/pingcap/tidb/sessionctx/variable" @@ -1255,3 +1257,18 @@ func TestIssue31141(t *testing.T) { tk.MustExec("set @@tidb_txn_mode = 'optimistic'") tk.MustExec("prepare stmt1 from 'do 1'") } + +func TestMaxPreparedStmtCount(t *testing.T) { + oldVal := atomic.LoadInt64(&variable.PreparedStmtCount) + atomic.StoreInt64(&variable.PreparedStmtCount, 0) + defer func() { + atomic.StoreInt64(&variable.PreparedStmtCount, oldVal) + }() + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.max_prepared_stmt_count = 2") + tk.MustExec("prepare stmt1 from 'select ? as num from dual'") + tk.MustExec("prepare stmt2 from 'select ? as num from dual'") + err := tk.ExecToErr("prepare stmt3 from 'select ? as num from dual'") + require.True(t, terror.ErrorEqual(err, variable.ErrMaxPreparedStmtCountReached)) +} diff --git a/executor/projection.go b/executor/projection.go index 27ce1bafc0b8a..c6c33d02651ff 100644 --- a/executor/projection.go +++ b/executor/projection.go @@ -94,7 +94,7 @@ func (e *ProjectionExec) Open(ctx context.Context) error { return e.open(ctx) } -func (e *ProjectionExec) open(ctx context.Context) error { +func (e *ProjectionExec) open(_ context.Context) error { e.prepared = false e.parentReqRows = int64(e.maxChunkSize) @@ -364,14 +364,14 @@ func (f *projectionInputFetcher) run(ctx context.Context) { }() for { - input := readProjectionInput(f.inputCh, f.globalFinishCh) - if input == nil { + input, isNil := readProjection[*projectionInput](f.inputCh, f.globalFinishCh) + if isNil { return } targetWorker := input.targetWorker - output = readProjectionOutput(f.outputCh, f.globalFinishCh) - if output == nil { + output, isNil = readProjection[*projectionOutput](f.outputCh, f.globalFinishCh) + if isNil { f.proj.memTracker.Consume(-input.chk.MemoryUsage()) return } @@ -431,13 +431,13 @@ func (w *projectionWorker) run(ctx context.Context) { w.proj.wg.Done() }() for { - input := readProjectionInput(w.inputCh, w.globalFinishCh) - if input == nil { + input, isNil := readProjection[*projectionInput](w.inputCh, w.globalFinishCh) + if isNil { return } - output = readProjectionOutput(w.outputCh, w.globalFinishCh) - if output == nil { + output, isNil = readProjection[*projectionOutput](w.outputCh, w.globalFinishCh) + if isNil { return } @@ -462,26 +462,14 @@ func recoveryProjection(output *projectionOutput, r interface{}) { logutil.BgLogger().Error("projection executor panicked", zap.String("error", fmt.Sprintf("%v", r)), zap.Stack("stack")) } -func readProjectionInput(inputCh <-chan *projectionInput, finishCh <-chan struct{}) *projectionInput { +func readProjection[T any](ch <-chan T, finishCh <-chan struct{}) (t T, isNil bool) { select { case <-finishCh: - return nil - case input, ok := <-inputCh: - if !ok { - return nil - } - return input - } -} - -func readProjectionOutput(outputCh <-chan *projectionOutput, finishCh <-chan struct{}) *projectionOutput { - select { - case <-finishCh: - return nil - case output, ok := <-outputCh: + return t, true + case t, ok := <-ch: if !ok { - return nil + return t, true } - return output + return t, false } } diff --git a/executor/recover_test.go b/executor/recover_test.go index aad1c93d9fb87..92aa83ec99d3e 100644 --- a/executor/recover_test.go +++ b/executor/recover_test.go @@ -296,6 +296,43 @@ func TestRecoverTableMeetError(t *testing.T) { tk.MustContainErrMsg("select * from t_recover", "Table 'test_recover.t_recover' doesn't exist") } +func TestRecoverTablePrivilege(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk) + defer resetGC() + + // Set GC safe point + tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t_recover") + tk.MustExec("create table t_recover (a int);") + tk.MustExec("drop table t_recover") + + // Recover without drop/create privilege. + tk.MustExec("CREATE USER 'testrecovertable'@'localhost';") + newTk := testkit.NewTestKit(t, store) + require.NoError(t, newTk.Session().Auth(&auth.UserIdentity{Username: "testrecovertable", Hostname: "localhost"}, nil, nil)) + newTk.MustGetErrCode("recover table t_recover", errno.ErrTableaccessDenied) + newTk.MustGetErrCode("flashback table t_recover", errno.ErrTableaccessDenied) + + // Got drop privilege, still failed. + tk.MustExec("grant drop on *.* to 'testrecovertable'@'localhost';") + newTk.MustGetErrCode("recover table t_recover", errno.ErrTableaccessDenied) + newTk.MustGetErrCode("flashback table t_recover", errno.ErrTableaccessDenied) + + // Got select, create and drop privilege, execute success. + tk.MustExec("grant select,create on *.* to 'testrecovertable'@'localhost';") + newTk.MustExec("use test") + newTk.MustExec("recover table t_recover") + newTk.MustExec("drop table t_recover") + newTk.MustExec("flashback table t_recover") + + tk.MustExec("drop user 'testrecovertable'@'localhost';") +} + func TestRecoverClusterMeetError(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -307,9 +344,7 @@ func TestRecoverClusterMeetError(t *testing.T) { injectSafeTS := oracle.GoTimeToTS(flashbackTs.Add(10 * time.Second)) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockFlashbackTest", `return(true)`)) - require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS", - fmt.Sprintf("return(%v)", injectSafeTS))) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS", + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", fmt.Sprintf("return(%v)", injectSafeTS))) // Get GC safe point error. @@ -332,13 +367,21 @@ func TestRecoverClusterMeetError(t *testing.T) { newTk.MustGetErrCode(fmt.Sprintf("flashback cluster to timestamp '%s'", time.Now().Add(0-30*time.Second)), errno.ErrPrivilegeCheckFail) tk.MustExec("drop user 'testflashback'@'localhost';") - // Flashback failed because of ddl history. - tk.MustExec("use test;") - tk.MustExec("create table t(a int);") - tk.MustMatchErrMsg(fmt.Sprintf("flashback cluster to timestamp '%s'", flashbackTs), "Detected schema change due to another DDL job during \\[.*, now\\), can't do flashback") + // detect modify system table + nowTS, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) + require.NoError(t, err) + tk.MustExec("truncate table mysql.stats_meta") + errorMsg := fmt.Sprintf("[ddl:-1]Detected modified system table during [%s, now), can't do flashback", oracle.GetTimeFromTS(nowTS).String()) + tk.MustGetErrMsg(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(nowTS)), errorMsg) + + // update tidb_server_version + nowTS, err = tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) + require.NoError(t, err) + tk.MustExec("update mysql.tidb set VARIABLE_VALUE=VARIABLE_VALUE+1 where VARIABLE_NAME='tidb_server_version'") + errorMsg = fmt.Sprintf("[ddl:-1]Detected TiDB upgrade during [%s, now), can't do flashback", oracle.GetTimeFromTS(nowTS).String()) + tk.MustGetErrMsg(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(nowTS)), errorMsg) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS")) - require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockFlashbackTest")) } @@ -347,6 +390,7 @@ func TestFlashbackWithSafeTs(t *testing.T) { tk := testkit.NewTestKit(t, store) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockFlashbackTest", `return(true)`)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/changeFlashbackGetMinSafeTimeTimeout", `return(0)`)) timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk) defer resetGC() @@ -371,9 +415,8 @@ func TestFlashbackWithSafeTs(t *testing.T) { compareWithSafeTS: 0, }, { - name: "10 seconds ago to now, safeTS 5 secs ago", - // Add flashbackTs.Add(-500*time.Millisecond) to avoid flashback time range overlapped. - sql: fmt.Sprintf("flashback cluster to timestamp '%s'", flashbackTs.Add(-500*time.Millisecond)), + name: "10 seconds ago to now, safeTS 5 secs ago", + sql: fmt.Sprintf("flashback cluster to timestamp '%s'", flashbackTs), injectSafeTS: oracle.GoTimeToTS(flashbackTs.Add(10 * time.Second)), compareWithSafeTS: -1, }, @@ -386,19 +429,55 @@ func TestFlashbackWithSafeTs(t *testing.T) { } for _, testcase := range testcases { t.Log(testcase.name) - require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS", - fmt.Sprintf("return(%v)", testcase.injectSafeTS))) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS", + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", fmt.Sprintf("return(%v)", testcase.injectSafeTS))) if testcase.compareWithSafeTS == 1 { + start := time.Now() tk.MustContainErrMsg(testcase.sql, - "cannot set flashback timestamp to too close to present time") + "cannot set flashback timestamp after min-resolved-ts") + // When set `flashbackGetMinSafeTimeTimeout` = 0, no retry for `getStoreGlobalMinSafeTS`. + require.Less(t, time.Since(start), time.Second) } else { tk.MustExec(testcase.sql) } } - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS")) - require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockFlashbackTest")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/changeFlashbackGetMinSafeTimeTimeout")) +} + +func TestFlashbackRetryGetMinSafeTime(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockFlashbackTest", `return(true)`)) + + timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk) + defer resetGC() + + // Set GC safe point. + tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) + + time.Sleep(time.Second) + ts, _ := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) + flashbackTs := oracle.GetTimeFromTS(ts) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", + fmt.Sprintf("return(%v)", oracle.GoTimeToTS(flashbackTs.Add(-10*time.Minute))))) + + go func() { + time.Sleep(2 * time.Second) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", + fmt.Sprintf("return(%v)", oracle.GoTimeToTS(flashbackTs.Add(10*time.Minute))))) + }() + + start := time.Now() + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", flashbackTs)) + duration := time.Since(start) + require.Greater(t, duration, 2*time.Second) + require.Less(t, duration, 5*time.Second) + + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockFlashbackTest")) } @@ -457,6 +536,26 @@ func TestFlashbackSchema(t *testing.T) { tk.MustExec("use test2") tk.MustQuery("select a from t order by a").Check(testkit.Rows("1", "2", "3")) tk.MustQuery("select a from t1 order by a").Check(testkit.Rows("4", "5", "6")) + + tk.MustExec("drop database if exists t_recover") + tk.MustExec("create database t_recover") + tk.MustExec("drop database t_recover") + + // Recover without drop/create privilege. + tk.MustExec("CREATE USER 'testflashbackschema'@'localhost';") + newTk := testkit.NewTestKit(t, store) + require.NoError(t, newTk.Session().Auth(&auth.UserIdentity{Username: "testflashbackschema", Hostname: "localhost"}, nil, nil)) + newTk.MustGetErrCode("flashback database t_recover", errno.ErrDBaccessDenied) + + // Got drop privilege, still failed. + tk.MustExec("grant drop on *.* to 'testflashbackschema'@'localhost';") + newTk.MustGetErrCode("flashback database t_recover", errno.ErrDBaccessDenied) + + // Got create and drop privilege, execute success. + tk.MustExec("grant create on *.* to 'testflashbackschema'@'localhost';") + newTk.MustExec("flashback schema t_recover") + + tk.MustExec("drop user 'testflashbackschema'@'localhost';") } // MockGC is used to make GC work in the test environment. diff --git a/executor/replace.go b/executor/replace.go index 221cbf87b2504..801ff40ebd252 100644 --- a/executor/replace.go +++ b/executor/replace.go @@ -25,6 +25,7 @@ import ( "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -43,6 +44,9 @@ type ReplaceExec struct { // Close implements the Executor Close interface. func (e *ReplaceExec) Close() error { e.setMessage() + if e.runtimeStats != nil && e.stats != nil { + defer e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) + } if e.SelectExec != nil { return e.SelectExec.Close() } @@ -89,6 +93,10 @@ func (e *ReplaceExec) removeRow(ctx context.Context, txn kv.Transaction, handle if err != nil { return false, err } + err = onRemoveRowForFK(e.ctx, oldRow, e.fkChecks, e.fkCascades) + if err != nil { + return false, err + } e.ctx.GetSessionVars().StmtCtx.AddAffectedRows(1) return false, nil } @@ -169,16 +177,12 @@ func (e *ReplaceExec) replaceRow(ctx context.Context, r toBeCheckedRow) error { // 3. error: the error. func (e *ReplaceExec) removeIndexRow(ctx context.Context, txn kv.Transaction, r toBeCheckedRow) (bool, bool, error) { for _, uk := range r.uniqueKeys { - val, err := txn.Get(ctx, uk.newKey) + _, handle, err := tables.FetchDuplicatedHandle(ctx, uk.newKey, true, txn, e.Table.Meta().ID, uk.commonHandle) if err != nil { - if kv.IsErrNotFound(err) { - continue - } return false, false, err } - handle, err := tablecodec.DecodeHandleInUniqueIndexValue(val, uk.commonHandle) - if err != nil { - return false, true, err + if handle == nil { + continue } rowUnchanged, err := e.removeRow(ctx, txn, handle, r) if err != nil { @@ -268,3 +272,18 @@ func (e *ReplaceExec) setMessage() { stmtCtx.SetMessage(msg) } } + +// GetFKChecks implements WithForeignKeyTrigger interface. +func (e *ReplaceExec) GetFKChecks() []*FKCheckExec { + return e.fkChecks +} + +// GetFKCascades implements WithForeignKeyTrigger interface. +func (e *ReplaceExec) GetFKCascades() []*FKCascadeExec { + return e.fkCascades +} + +// HasFKCascades implements WithForeignKeyTrigger interface. +func (e *ReplaceExec) HasFKCascades() bool { + return len(e.fkCascades) > 0 +} diff --git a/executor/sample.go b/executor/sample.go index e7eb9bd223639..7f64c365d599e 100644 --- a/executor/sample.go +++ b/executor/sample.go @@ -17,7 +17,6 @@ package executor import ( "context" - "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" @@ -28,6 +27,7 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" decoder "github.com/pingcap/tidb/util/rowDecoder" + "github.com/pingcap/tidb/util/tracing" "github.com/tikv/client-go/v2/tikv" "golang.org/x/exp/slices" ) @@ -47,10 +47,7 @@ type TableSampleExecutor struct { // Open initializes necessary variables for using this executor. func (e *TableSampleExecutor) Open(ctx context.Context) error { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("TableSampleExecutor.Open", opentracing.ChildOf(span.Context())) - defer span1.Finish() - } + defer tracing.StartRegion(ctx, "TableSampleExecutor.Open").End() return nil } diff --git a/executor/seqtest/BUILD.bazel b/executor/seqtest/BUILD.bazel index 64046c0852123..6d582ded16630 100644 --- a/executor/seqtest/BUILD.bazel +++ b/executor/seqtest/BUILD.bazel @@ -2,7 +2,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_test") go_test( name = "seqtest_test", - timeout = "moderate", + timeout = "short", srcs = [ "main_test.go", "prepared_test.go", diff --git a/executor/seqtest/main_test.go b/executor/seqtest/main_test.go index 299cc69a8a26f..067680fb23365 100644 --- a/executor/seqtest/main_test.go +++ b/executor/seqtest/main_test.go @@ -31,7 +31,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), - goleak.IgnoreTopFunction("github.com/pingcap/tidb/executor.readProjectionInput"), + goleak.IgnoreTopFunction("github.com/pingcap/tidb/executor.readProjection[...]"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), } diff --git a/executor/seqtest/prepared_test.go b/executor/seqtest/prepared_test.go index 11dae5e570767..3c0f180e54f22 100644 --- a/executor/seqtest/prepared_test.go +++ b/executor/seqtest/prepared_test.go @@ -280,11 +280,11 @@ func TestPreparedLimitOffset(t *testing.T) { r.Check(testkit.Rows("2")) tk.MustExec(`set @a=1.1`) - r = tk.MustQuery(`execute stmt_test_1 using @a, @b;`) - r.Check(testkit.Rows("2")) + _, err := tk.Exec(`execute stmt_test_1 using @a, @b;`) + require.True(t, plannercore.ErrWrongArguments.Equal(err)) tk.MustExec(`set @c="-1"`) - _, err := tk.Exec("execute stmt_test_1 using @c, @c") + _, err = tk.Exec("execute stmt_test_1 using @c, @c") require.True(t, plannercore.ErrWrongArguments.Equal(err)) stmtID, _, _, err := tk.Session().PrepareStmt("select id from prepare_test limit ?") @@ -334,7 +334,7 @@ func TestPrepareWithAggregation(t *testing.T) { tk.MustExec(fmt.Sprintf(`set @@tidb_enable_prepared_plan_cache=%v`, flag)) se, err := session.CreateSession4TestWithOpt(store, &session.Opt{ - PreparedPlanCache: plannercore.NewLRUPlanCache(100, 0.1, math.MaxUint64, plannercore.PickPlanFromBucket, tk.Session()), + PreparedPlanCache: plannercore.NewLRUPlanCache(100, 0.1, math.MaxUint64, tk.Session()), }) require.NoError(t, err) tk.SetSession(se) @@ -420,14 +420,14 @@ func TestPreparedInsert(t *testing.T) { err = counter.Write(pb) require.NoError(t, err) hit := pb.GetCounter().GetValue() - require.Equal(t, float64(1), hit) + require.Equal(t, float64(0), hit) // insert-values-stmt cannot use the plan cache } tk.MustExec(`set @a=3,@b=3; execute stmt_insert using @a, @b;`) if flag { err = counter.Write(pb) require.NoError(t, err) hit := pb.GetCounter().GetValue() - require.Equal(t, float64(2), hit) + require.Equal(t, float64(0), hit) } result := tk.MustQuery("select id, c1 from prepare_test where id = ?", 1) @@ -443,21 +443,21 @@ func TestPreparedInsert(t *testing.T) { err = counter.Write(pb) require.NoError(t, err) hit := pb.GetCounter().GetValue() - require.Equal(t, float64(2), hit) + require.Equal(t, float64(0), hit) } tk.MustExec(`set @a=2; execute stmt_insert_select using @a;`) if flag { err = counter.Write(pb) require.NoError(t, err) hit := pb.GetCounter().GetValue() - require.Equal(t, float64(3), hit) + require.Equal(t, float64(1), hit) } tk.MustExec(`set @a=3; execute stmt_insert_select using @a;`) if flag { err = counter.Write(pb) require.NoError(t, err) hit := pb.GetCounter().GetValue() - require.Equal(t, float64(4), hit) + require.Equal(t, float64(2), hit) } result = tk.MustQuery("select id, c1 from prepare_test where id = ?", 101) @@ -599,7 +599,7 @@ func TestPrepareDealloc(t *testing.T) { tk.MustExec(`set @@tidb_enable_prepared_plan_cache=true`) se, err := session.CreateSession4TestWithOpt(store, &session.Opt{ - PreparedPlanCache: plannercore.NewLRUPlanCache(3, 0.1, math.MaxUint64, plannercore.PickPlanFromBucket, tk.Session()), + PreparedPlanCache: plannercore.NewLRUPlanCache(3, 0.1, math.MaxUint64, tk.Session()), }) require.NoError(t, err) tk.SetSession(se) @@ -767,3 +767,108 @@ func TestPreparedIssue17419(t *testing.T) { // _, ok := tk1.Session().ShowProcess().Plan.(*plannercore.Execute) // require.True(t, ok) } + +func TestLimitUnsupportedCase(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, key(a))") + tk.MustExec("prepare stmt from 'select * from t limit ?'") + + tk.MustExec("set @a = 1.2") + tk.MustGetErrMsg("execute stmt using @a", "[planner:1210]Incorrect arguments to LIMIT") + tk.MustExec("set @a = 1.") + tk.MustGetErrMsg("execute stmt using @a", "[planner:1210]Incorrect arguments to LIMIT") + tk.MustExec("set @a = '0'") + tk.MustGetErrMsg("execute stmt using @a", "[planner:1210]Incorrect arguments to LIMIT") + tk.MustExec("set @a = '1'") + tk.MustGetErrMsg("execute stmt using @a", "[planner:1210]Incorrect arguments to LIMIT") + tk.MustExec("set @a = 1_2") + tk.MustGetErrMsg("execute stmt using @a", "[planner:1210]Incorrect arguments to LIMIT") +} + +func TestIssue38323(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(id int, k int);") + + tk.MustExec("prepare stmt from 'explain select * from t where id = ? and k = ? group by id, k';") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 skip plan-cache: not a SELECT/UPDATE/INSERT/DELETE/SET statement")) + tk.MustExec("set @a = 1;") + tk.MustExec("execute stmt using @a, @a") + tk.MustQuery("execute stmt using @a, @a").Check(tk.MustQuery("explain select * from t where id = 1 and k = 1 group by id, k").Rows()) + + tk.MustExec("prepare stmt from 'explain select * from t where ? = id and ? = k group by id, k';") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 skip plan-cache: not a SELECT/UPDATE/INSERT/DELETE/SET statement")) + tk.MustExec("set @a = 1;") + tk.MustQuery("execute stmt using @a, @a").Check(tk.MustQuery("explain select * from t where 1 = id and 1 = k group by id, k").Rows()) +} + +func TestSetPlanCacheLimitSwitch(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustQuery("select @@session.tidb_enable_plan_cache_for_param_limit").Check(testkit.Rows("1")) + tk.MustQuery("select @@global.tidb_enable_plan_cache_for_param_limit").Check(testkit.Rows("1")) + + tk.MustExec("set @@session.tidb_enable_plan_cache_for_param_limit = OFF;") + tk.MustQuery("select @@session.tidb_enable_plan_cache_for_param_limit").Check(testkit.Rows("0")) + + tk.MustExec("set @@session.tidb_enable_plan_cache_for_param_limit = 1;") + tk.MustQuery("select @@session.tidb_enable_plan_cache_for_param_limit").Check(testkit.Rows("1")) + + tk.MustExec("set @@global.tidb_enable_plan_cache_for_param_limit = off;") + tk.MustQuery("select @@global.tidb_enable_plan_cache_for_param_limit").Check(testkit.Rows("0")) + + tk.MustExec("set @@global.tidb_enable_plan_cache_for_param_limit = ON;") + tk.MustQuery("select @@global.tidb_enable_plan_cache_for_param_limit").Check(testkit.Rows("1")) + + tk.MustGetErrMsg("set @@global.tidb_enable_plan_cache_for_param_limit = '';", "[variable:1231]Variable 'tidb_enable_plan_cache_for_param_limit' can't be set to the value of ''") + tk.MustGetErrMsg("set @@global.tidb_enable_plan_cache_for_param_limit = 11;", "[variable:1231]Variable 'tidb_enable_plan_cache_for_param_limit' can't be set to the value of '11'") + tk.MustGetErrMsg("set @@global.tidb_enable_plan_cache_for_param_limit = enabled;", "[variable:1231]Variable 'tidb_enable_plan_cache_for_param_limit' can't be set to the value of 'enabled'") + tk.MustGetErrMsg("set @@global.tidb_enable_plan_cache_for_param_limit = disabled;", "[variable:1231]Variable 'tidb_enable_plan_cache_for_param_limit' can't be set to the value of 'disabled'") + tk.MustGetErrMsg("set @@global.tidb_enable_plan_cache_for_param_limit = open;", "[variable:1231]Variable 'tidb_enable_plan_cache_for_param_limit' can't be set to the value of 'open'") +} + +func TestPlanCacheLimitSwitchEffective(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, key(a))") + + checkIfCached := func(res string) { + tk.MustExec("set @a = 1") + tk.MustExec("execute stmt using @a") + tk.MustExec("execute stmt using @a") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows(res)) + } + + // before prepare + tk.MustExec("set @@session.tidb_enable_plan_cache_for_param_limit = OFF") + tk.MustExec("prepare stmt from 'select * from t limit ?'") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 skip plan-cache: query has 'limit ?' is un-cacheable")) + checkIfCached("0") + tk.MustExec("deallocate prepare stmt") + + // after prepare + tk.MustExec("set @@session.tidb_enable_plan_cache_for_param_limit = ON") + tk.MustExec("prepare stmt from 'select * from t limit ?'") + tk.MustExec("set @@session.tidb_enable_plan_cache_for_param_limit = OFF") + checkIfCached("0") + tk.MustExec("execute stmt using @a") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 skip plan-cache: the switch 'tidb_enable_plan_cache_for_param_limit' is off")) + tk.MustExec("deallocate prepare stmt") + + // after execute + tk.MustExec("set @@session.tidb_enable_plan_cache_for_param_limit = ON") + tk.MustExec("prepare stmt from 'select * from t limit ?'") + checkIfCached("1") + tk.MustExec("set @@session.tidb_enable_plan_cache_for_param_limit = OFF") + checkIfCached("0") + tk.MustExec("deallocate prepare stmt") +} diff --git a/executor/seqtest/seq_executor_test.go b/executor/seqtest/seq_executor_test.go index 7f16fd68da5e7..3e692a39a19df 100644 --- a/executor/seqtest/seq_executor_test.go +++ b/executor/seqtest/seq_executor_test.go @@ -624,7 +624,7 @@ func TestShowStatsHealthy(t *testing.T) { require.NoError(t, err) err = do.StatsHandle().Update(do.InfoSchema()) require.NoError(t, err) - tk.MustQuery("show stats_healthy").Check(testkit.Rows("test t 19")) + tk.MustQuery("show stats_healthy").Check(testkit.Rows("test t 0")) tk.MustExec("analyze table t") tk.MustQuery("show stats_healthy").Check(testkit.Rows("test t 100")) tk.MustExec("delete from t") @@ -773,43 +773,45 @@ func HelperTestAdminShowNextID(t *testing.T, store kv.Storage, str string) { tk.MustExec("create table t(id int, c int)") // Start handle is 1. r := tk.MustQuery(str + " t next_row_id") - r.Check(testkit.Rows("test t _tidb_rowid 1 AUTO_INCREMENT")) + r.Check(testkit.Rows("test t _tidb_rowid 1 _TIDB_ROWID")) // Row ID is step + 1. tk.MustExec("insert into t values(1, 1)") r = tk.MustQuery(str + " t next_row_id") - r.Check(testkit.Rows("test t _tidb_rowid 11 AUTO_INCREMENT")) + r.Check(testkit.Rows("test t _tidb_rowid 11 _TIDB_ROWID")) // Row ID is original + step. for i := 0; i < int(step); i++ { tk.MustExec("insert into t values(10000, 1)") } r = tk.MustQuery(str + " t next_row_id") - r.Check(testkit.Rows("test t _tidb_rowid 21 AUTO_INCREMENT")) + r.Check(testkit.Rows("test t _tidb_rowid 21 _TIDB_ROWID")) tk.MustExec("drop table t") // test for a table with the primary key tk.MustExec("create table tt(id int primary key auto_increment, c int)") // Start handle is 1. r = tk.MustQuery(str + " tt next_row_id") - r.Check(testkit.Rows("test tt id 1 AUTO_INCREMENT")) + r.Check(testkit.Rows("test tt id 1 _TIDB_ROWID", "test tt id 1 AUTO_INCREMENT")) // After rebasing auto ID, row ID is 20 + step + 1. tk.MustExec("insert into tt values(20, 1)") r = tk.MustQuery(str + " tt next_row_id") - r.Check(testkit.Rows("test tt id 31 AUTO_INCREMENT")) + r.Check(testkit.Rows("test tt id 31 _TIDB_ROWID", "test tt id 1 AUTO_INCREMENT")) // test for renaming the table tk.MustExec("drop database if exists test1") tk.MustExec("create database test1") tk.MustExec("rename table test.tt to test1.tt") tk.MustExec("use test1") r = tk.MustQuery(str + " tt next_row_id") - r.Check(testkit.Rows("test1 tt id 31 AUTO_INCREMENT")) + r.Check(testkit.Rows("test1 tt id 31 _TIDB_ROWID", "test1 tt id 1 AUTO_INCREMENT")) tk.MustExec("insert test1.tt values ()") r = tk.MustQuery(str + " tt next_row_id") - r.Check(testkit.Rows("test1 tt id 41 AUTO_INCREMENT")) + r.Check(testkit.Rows("test1 tt id 41 _TIDB_ROWID", "test1 tt id 1 AUTO_INCREMENT")) tk.MustExec("drop table tt") tk.MustExec("drop table if exists t;") tk.MustExec("create table t (a int auto_increment primary key nonclustered, b int);") - tk.MustQuery("show table t next_row_id;").Check(testkit.Rows("test1 t _tidb_rowid 1 AUTO_INCREMENT")) + tk.MustQuery("show table t next_row_id;").Check(testkit.Rows( + "test1 t _tidb_rowid 1 _TIDB_ROWID", + "test1 t _tidb_rowid 1 AUTO_INCREMENT")) tk.MustExec("set @@allow_auto_random_explicit_insert = true") @@ -830,19 +832,19 @@ func HelperTestAdminShowNextID(t *testing.T, store kv.Storage, str string) { // Test for a sequence. tk.MustExec("create sequence seq1 start 15 cache 57") r = tk.MustQuery(str + " seq1 next_row_id") - r.Check(testkit.Rows("test1 seq1 _tidb_rowid 1 AUTO_INCREMENT", "test1 seq1 15 SEQUENCE")) + r.Check(testkit.Rows("test1 seq1 _tidb_rowid 1 _TIDB_ROWID", "test1 seq1 15 SEQUENCE")) r = tk.MustQuery("select nextval(seq1)") r.Check(testkit.Rows("15")) r = tk.MustQuery(str + " seq1 next_row_id") - r.Check(testkit.Rows("test1 seq1 _tidb_rowid 1 AUTO_INCREMENT", "test1 seq1 72 SEQUENCE")) + r.Check(testkit.Rows("test1 seq1 _tidb_rowid 1 _TIDB_ROWID", "test1 seq1 72 SEQUENCE")) r = tk.MustQuery("select nextval(seq1)") r.Check(testkit.Rows("16")) r = tk.MustQuery(str + " seq1 next_row_id") - r.Check(testkit.Rows("test1 seq1 _tidb_rowid 1 AUTO_INCREMENT", "test1 seq1 72 SEQUENCE")) + r.Check(testkit.Rows("test1 seq1 _tidb_rowid 1 _TIDB_ROWID", "test1 seq1 72 SEQUENCE")) r = tk.MustQuery("select setval(seq1, 96)") r.Check(testkit.Rows("96")) r = tk.MustQuery(str + " seq1 next_row_id") - r.Check(testkit.Rows("test1 seq1 _tidb_rowid 1 AUTO_INCREMENT", "test1 seq1 97 SEQUENCE")) + r.Check(testkit.Rows("test1 seq1 _tidb_rowid 1 _TIDB_ROWID", "test1 seq1 97 SEQUENCE")) } func TestNoHistoryWhenDisableRetry(t *testing.T) { @@ -898,7 +900,7 @@ func TestPrepareMaxParamCountCheck(t *testing.T) { require.NoError(t, err) bigSQL, bigParams := generateBatchSQL(math.MaxUint16 + 2) - _, err = tk.Exec(bigSQL, bigParams...) + err = tk.ExecToErr(bigSQL, bigParams...) require.Error(t, err) require.EqualError(t, err, "[executor:1390]Prepared statement contains too many placeholders") } @@ -938,7 +940,7 @@ func TestBatchInsertDelete(t *testing.T) { atomic.StoreUint64(&kv.TxnTotalSizeLimit, originLimit) }() // Set the limitation to a small value, make it easier to reach the limitation. - atomic.StoreUint64(&kv.TxnTotalSizeLimit, 5800) + atomic.StoreUint64(&kv.TxnTotalSizeLimit, 5900) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") @@ -985,16 +987,12 @@ func TestBatchInsertDelete(t *testing.T) { // Test tidb_batch_insert could not work if enable-batch-dml is disabled. tk.MustExec("set @@session.tidb_batch_insert=1;") - _, err = tk.Exec("insert into batch_insert (c) select * from batch_insert;") - require.Error(t, err) - require.True(t, kv.ErrTxnTooLarge.Equal(err)) + tk.MustGetErrCode("insert into batch_insert (c) select * from batch_insert;", errno.ErrTxnTooLarge) tk.MustExec("set @@session.tidb_batch_insert=0;") // for on duplicate key - _, err = tk.Exec(`insert into batch_insert_on_duplicate select * from batch_insert_on_duplicate as tt - on duplicate key update batch_insert_on_duplicate.id=batch_insert_on_duplicate.id+1000;`) - require.Error(t, err) - require.Truef(t, kv.ErrTxnTooLarge.Equal(err), "%v", err) + tk.MustGetErrCode(`insert into batch_insert_on_duplicate select * from batch_insert_on_duplicate as tt + on duplicate key update batch_insert_on_duplicate.id=batch_insert_on_duplicate.id+1000;`, errno.ErrTxnTooLarge) r = tk.MustQuery("select count(*) from batch_insert;") r.Check(testkit.Rows("320")) @@ -1020,17 +1018,14 @@ func TestBatchInsertDelete(t *testing.T) { tk.MustExec("set @@session.tidb_dml_batch_size=50;") // for on duplicate key - _, err = tk.Exec(`insert into batch_insert_on_duplicate select * from batch_insert_on_duplicate as tt + tk.MustExec(`insert into batch_insert_on_duplicate select * from batch_insert_on_duplicate as tt on duplicate key update batch_insert_on_duplicate.id=batch_insert_on_duplicate.id+1000;`) - require.NoError(t, err) r = tk.MustQuery("select count(*) from batch_insert_on_duplicate;") r.Check(testkit.Rows("320")) // Disable BachInsert mode in transition. tk.MustExec("begin;") - _, err = tk.Exec("insert into batch_insert (c) select * from batch_insert;") - require.Error(t, err) - require.True(t, kv.ErrTxnTooLarge.Equal(err)) + tk.MustGetErrCode("insert into batch_insert (c) select * from batch_insert;", errno.ErrTxnTooLarge) tk.MustExec("rollback;") r = tk.MustQuery("select count(*) from batch_insert;") r.Check(testkit.Rows("640")) diff --git a/executor/set.go b/executor/set.go index 2396356c1245b..a7b5ff19da91c 100644 --- a/executor/set.go +++ b/executor/set.go @@ -284,7 +284,16 @@ func (e *SetExecutor) getVarValue(ctx context.Context, v *expression.VarAssignme if err != nil || nativeVal.IsNull() { return "", err } - return nativeVal.ToString() + + value, err = nativeVal.ToString() + if err != nil { + return "", err + } + + // We need to clone the string because the value is constructed by `hack.String` in Datum which reuses the under layer `[]byte` + // instead of allocating some new spaces. The `[]byte` in Datum will be reused in `chunk.Chunk` by different statements in session. + // If we do not clone the value, the system variable will have a risk to be modified by other statements. + return strings.Clone(value), nil } func (e *SetExecutor) loadSnapshotInfoSchemaIfNeeded(name string, snapshotTS uint64) error { diff --git a/executor/set_config.go b/executor/set_config.go index 531a61acdc4a0..b508b55eb2fc7 100644 --- a/executor/set_config.go +++ b/executor/set_config.go @@ -102,7 +102,7 @@ func (s *SetConfigExec) Next(ctx context.Context, req *chunk.Chunk) error { if s.p.Instance != "" { nodeAddrs.Insert(s.p.Instance) } - serversInfo = filterClusterServerInfo(serversInfo, nodeTypes, nodeAddrs) + serversInfo = infoschema.FilterClusterServerInfo(serversInfo, nodeTypes, nodeAddrs) if s.p.Instance != "" && len(serversInfo) == 0 { return errors.Errorf("instance %v is not found in this cluster", s.p.Instance) } diff --git a/executor/set_test.go b/executor/set_test.go index 697209d64836a..c50105cf6fd63 100644 --- a/executor/set_test.go +++ b/executor/set_test.go @@ -20,7 +20,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "net/http" "strconv" "testing" @@ -646,7 +645,7 @@ func TestSetVar(t *testing.T) { tk.MustQuery("select @@tidb_enable_tso_follower_proxy").Check(testkit.Rows("0")) require.Error(t, tk.ExecToErr("set tidb_enable_tso_follower_proxy = 1")) - tk.MustQuery("select @@tidb_enable_historical_stats").Check(testkit.Rows("0")) + tk.MustQuery("select @@tidb_enable_historical_stats").Check(testkit.Rows("1")) tk.MustExec("set global tidb_enable_historical_stats = 1") tk.MustQuery("select @@tidb_enable_historical_stats").Check(testkit.Rows("1")) tk.MustExec("set global tidb_enable_historical_stats = 0") @@ -767,51 +766,51 @@ func TestSetVar(t *testing.T) { tk.MustGetErrCode("set global init_connect = 'invalidstring'", mysql.ErrWrongTypeForVar) tk.MustExec("set global init_connect = 'select now(); select timestamp()'") - // test variable 'tidb_enable_general_plan_cache' + // test variable 'tidb_enable_non_prepared_plan_cache' // global scope - tk.MustQuery("select @@global.tidb_enable_general_plan_cache").Check(testkit.Rows("0")) // default value - tk.MustExec("set global tidb_enable_general_plan_cache = 1") - tk.MustQuery("select @@global.tidb_enable_general_plan_cache").Check(testkit.Rows("1")) - tk.MustExec("set global tidb_enable_general_plan_cache = 0") - tk.MustQuery("select @@global.tidb_enable_general_plan_cache").Check(testkit.Rows("0")) + tk.MustQuery("select @@global.tidb_enable_non_prepared_plan_cache").Check(testkit.Rows("0")) // default value + tk.MustExec("set global tidb_enable_non_prepared_plan_cache = 1") + tk.MustQuery("select @@global.tidb_enable_non_prepared_plan_cache").Check(testkit.Rows("1")) + tk.MustExec("set global tidb_enable_non_prepared_plan_cache = 0") + tk.MustQuery("select @@global.tidb_enable_non_prepared_plan_cache").Check(testkit.Rows("0")) // session scope - tk.MustQuery("select @@session.tidb_enable_general_plan_cache").Check(testkit.Rows("0")) // default value - tk.MustExec("set session tidb_enable_general_plan_cache = 1") - tk.MustQuery("select @@session.tidb_enable_general_plan_cache").Check(testkit.Rows("1")) - tk.MustExec("set session tidb_enable_general_plan_cache = 0") - tk.MustQuery("select @@session.tidb_enable_general_plan_cache").Check(testkit.Rows("0")) + tk.MustQuery("select @@session.tidb_enable_non_prepared_plan_cache").Check(testkit.Rows("0")) // default value + tk.MustExec("set session tidb_enable_non_prepared_plan_cache = 1") + tk.MustQuery("select @@session.tidb_enable_non_prepared_plan_cache").Check(testkit.Rows("1")) + tk.MustExec("set session tidb_enable_non_prepared_plan_cache = 0") + tk.MustQuery("select @@session.tidb_enable_non_prepared_plan_cache").Check(testkit.Rows("0")) - // test variable 'tidb_general_plan_cache-size' + // test variable 'tidb_non_prepared_plan_cache-size' // global scope - tk.MustQuery("select @@global.tidb_general_plan_cache_size").Check(testkit.Rows("100")) // default value - tk.MustExec("set global tidb_general_plan_cache_size = 200") - tk.MustQuery("select @@global.tidb_general_plan_cache_size").Check(testkit.Rows("200")) - tk.MustExec("set global tidb_general_plan_cache_size = 200000000") // overflow - tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect tidb_general_plan_cache_size value: '200000000'")) - tk.MustQuery("select @@global.tidb_general_plan_cache_size").Check(testkit.Rows("100000")) + tk.MustQuery("select @@global.tidb_non_prepared_plan_cache_size").Check(testkit.Rows("100")) // default value + tk.MustExec("set global tidb_non_prepared_plan_cache_size = 200") + tk.MustQuery("select @@global.tidb_non_prepared_plan_cache_size").Check(testkit.Rows("200")) + tk.MustExec("set global tidb_non_prepared_plan_cache_size = 200000000") // overflow + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect tidb_non_prepared_plan_cache_size value: '200000000'")) + tk.MustQuery("select @@global.tidb_non_prepared_plan_cache_size").Check(testkit.Rows("100000")) // session scope - tk.MustQuery("select @@session.tidb_general_plan_cache_size").Check(testkit.Rows("100")) // default value - tk.MustExec("set session tidb_general_plan_cache_size = 300") - tk.MustQuery("select @@session.tidb_general_plan_cache_size").Check(testkit.Rows("300")) - tk.MustExec("set session tidb_general_plan_cache_size = -1") // underflow - tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect tidb_general_plan_cache_size value: '-1'")) - tk.MustQuery("select @@session.tidb_general_plan_cache_size").Check(testkit.Rows("1")) + tk.MustQuery("select @@session.tidb_non_prepared_plan_cache_size").Check(testkit.Rows("100")) // default value + tk.MustExec("set session tidb_non_prepared_plan_cache_size = 300") + tk.MustQuery("select @@session.tidb_non_prepared_plan_cache_size").Check(testkit.Rows("300")) + tk.MustExec("set session tidb_non_prepared_plan_cache_size = -1") // underflow + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect tidb_non_prepared_plan_cache_size value: '-1'")) + tk.MustQuery("select @@session.tidb_non_prepared_plan_cache_size").Check(testkit.Rows("1")) // test variable 'foreign_key_checks' // global scope - tk.MustQuery("select @@global.foreign_key_checks").Check(testkit.Rows("0")) // default value - tk.MustExec("set global foreign_key_checks = 1") - tk.MustQuery("select @@global.foreign_key_checks").Check(testkit.Rows("1")) + tk.MustQuery("select @@global.foreign_key_checks").Check(testkit.Rows("1")) // default value + tk.MustExec("set global foreign_key_checks = 0") + tk.MustQuery("select @@global.foreign_key_checks").Check(testkit.Rows("0")) // session scope - tk.MustQuery("select @@session.foreign_key_checks").Check(testkit.Rows("0")) // default value - tk.MustExec("set session foreign_key_checks = 1") - tk.MustQuery("select @@session.foreign_key_checks").Check(testkit.Rows("1")) + tk.MustQuery("select @@session.foreign_key_checks").Check(testkit.Rows("1")) // default value + tk.MustExec("set session foreign_key_checks = 0") + tk.MustQuery("select @@session.foreign_key_checks").Check(testkit.Rows("0")) - // test variable 'foreign_key_checks' + // test variable 'tidb_enable_foreign_key' // global scope - tk.MustQuery("select @@global.tidb_enable_foreign_key").Check(testkit.Rows("0")) // default value - tk.MustExec("set global tidb_enable_foreign_key = 1") - tk.MustQuery("select @@global.tidb_enable_foreign_key").Check(testkit.Rows("1")) + tk.MustQuery("select @@global.tidb_enable_foreign_key").Check(testkit.Rows("1")) // default value + tk.MustExec("set global tidb_enable_foreign_key = 0") + tk.MustQuery("select @@global.tidb_enable_foreign_key").Check(testkit.Rows("0")) // test variable 'tidb_opt_force_inline_cte' tk.MustQuery("select @@session.tidb_opt_force_inline_cte").Check(testkit.Rows("0")) // default value is 0 @@ -853,6 +852,23 @@ func TestSetVar(t *testing.T) { tk.MustQuery("select @@global.tidb_opt_range_max_size").Check(testkit.Rows("1048576")) tk.MustExec("set session tidb_opt_range_max_size = 2097152") tk.MustQuery("select @@session.tidb_opt_range_max_size").Check(testkit.Rows("2097152")) + + // test for password validation + tk.MustQuery("SELECT @@GLOBAL.validate_password.enable").Check(testkit.Rows("0")) + tk.MustQuery("SELECT @@GLOBAL.validate_password.length").Check(testkit.Rows("8")) + tk.MustExec("SET GLOBAL validate_password.length = 3") + tk.MustQuery("SELECT @@GLOBAL.validate_password.length").Check(testkit.Rows("4")) + tk.MustExec("SET GLOBAL validate_password.mixed_case_count = 2") + tk.MustQuery("SELECT @@GLOBAL.validate_password.length").Check(testkit.Rows("6")) + + // test tidb_cdc_write_source + require.Equal(t, uint64(0), tk.Session().GetSessionVars().CDCWriteSource) + tk.MustQuery("select @@tidb_cdc_write_source").Check(testkit.Rows("0")) + tk.MustExec("set @@session.tidb_cdc_write_source = 2") + tk.MustQuery("select @@tidb_cdc_write_source").Check(testkit.Rows("2")) + require.Equal(t, uint64(2), tk.Session().GetSessionVars().CDCWriteSource) + tk.MustExec("set @@session.tidb_cdc_write_source = 0") + require.Equal(t, uint64(0), tk.Session().GetSessionVars().CDCWriteSource) } func TestGetSetNoopVars(t *testing.T) { @@ -1407,14 +1423,11 @@ func TestValidateSetVar(t *testing.T) { tk.MustExec("set @@innodb_lock_wait_timeout = 1073741825") tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", "Warning|1292|Truncated incorrect innodb_lock_wait_timeout value: '1073741825'")) - tk.MustExec("set @@global.validate_password_number_count=-1") - tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", "Warning|1292|Truncated incorrect validate_password_number_count value: '-1'")) - - tk.MustExec("set @@global.validate_password_length=-1") - tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", "Warning|1292|Truncated incorrect validate_password_length value: '-1'")) + tk.MustExec("set @@global.validate_password.number_count=-1") + tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", "Warning|1292|Truncated incorrect validate_password.number_count value: '-1'")) - tk.MustExec("set @@global.validate_password_length=8") - tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustExec("set @@global.validate_password.length=-1") + tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", "Warning|1292|Truncated incorrect validate_password.length value: '-1'")) err = tk.ExecToErr("set @@tx_isolation=''") require.True(t, terror.ErrorEqual(err, variable.ErrWrongValueForVar), fmt.Sprintf("err %v", err)) @@ -1788,7 +1801,7 @@ func TestSetClusterConfig(t *testing.T) { httpCnt = 0 tk.Session().SetValue(executor.TestSetConfigHTTPHandlerKey, func(req *http.Request) (*http.Response, error) { httpCnt++ - body, err := ioutil.ReadAll(req.Body) + body, err := io.ReadAll(req.Body) require.NoError(t, err) // The `raftstore.` prefix is stripped. require.JSONEq(t, `{"server.snap-max-write-bytes-per-sec":"500MB"}`, string(body)) @@ -2058,3 +2071,59 @@ func TestSetChunkReuseVariable(t *testing.T) { // error value tk.MustGetErrCode("set @@tidb_enable_reuse_chunk=s;", errno.ErrWrongValueForVar) } + +func TestSetMppVersionVariable(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustQuery("select @@session.mpp_version").Check(testkit.Rows("UNSPECIFIED")) + tk.MustExec("SET SESSION mpp_version = -1") + tk.MustQuery("select @@session.mpp_version").Check(testkit.Rows("-1")) + tk.MustExec("SET SESSION mpp_version = 0") + tk.MustQuery("select @@session.mpp_version").Check(testkit.Rows("0")) + tk.MustExec("SET SESSION mpp_version = 1") + tk.MustQuery("select @@session.mpp_version").Check(testkit.Rows("1")) + tk.MustExec("SET SESSION mpp_version = unspecified") + tk.MustQuery("select @@session.mpp_version").Check(testkit.Rows("unspecified")) + { + tk.MustGetErrMsg("SET SESSION mpp_version = 2", "incorrect value: 2. mpp_version options: -1 (unspecified), 0, 1") + } + { + tk.MustExec("SET GLOBAL mpp_version = 1") + tk.MustQuery("select @@global.mpp_version").Check(testkit.Rows("1")) + tk.MustExec("SET GLOBAL mpp_version = -1") + tk.MustQuery("select @@global.mpp_version").Check(testkit.Rows("-1")) + } +} + +func TestSetMppExchangeCompressionModeVariable(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustGetErrMsg( + "SET SESSION mpp_exchange_compression_mode = 123", + "incorrect value: `123`. mpp_exchange_compression_mode options: NONE, FAST, HIGH_COMPRESSION, UNSPECIFIED") + tk.MustQuery("select @@session.mpp_exchange_compression_mode").Check(testkit.Rows("UNSPECIFIED")) + + tk.MustExec("SET SESSION mpp_exchange_compression_mode = none") + tk.MustQuery("select @@session.mpp_exchange_compression_mode").Check(testkit.Rows("none")) + tk.MustExec("SET SESSION mpp_exchange_compression_mode = fast") + tk.MustQuery("select @@session.mpp_exchange_compression_mode").Check(testkit.Rows("fast")) + tk.MustExec("SET SESSION mpp_exchange_compression_mode = HIGH_COMPRESSION") + tk.MustQuery("select @@session.mpp_exchange_compression_mode").Check(testkit.Rows("HIGH_COMPRESSION")) + + { + tk.MustExec("SET GLOBAL mpp_exchange_compression_mode = none") + tk.MustQuery("select @@global.mpp_exchange_compression_mode").Check(testkit.Rows("none")) + } + { + tk.MustExec("SET mpp_version = 0") + tk.MustExec("SET mpp_exchange_compression_mode = unspecified") + require.Equal(t, len(tk.Session().GetSessionVars().StmtCtx.GetWarnings()), 0) + } + { + tk.MustExec("SET mpp_version = 0") + tk.MustExec("SET mpp_exchange_compression_mode = HIGH_COMPRESSION") + warnings := tk.Session().GetSessionVars().StmtCtx.GetWarnings() + require.Equal(t, len(warnings), 1) + require.Equal(t, warnings[0].Err.Error(), "mpp exchange compression won't work under current mpp version 0") + } +} diff --git a/executor/show.go b/executor/show.go index 72bd63a785623..130f743d914bb 100644 --- a/executor/show.go +++ b/executor/show.go @@ -39,9 +39,11 @@ import ( "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/charset" + parserformat "github.com/pingcap/tidb/parser/format" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/parser/tidb" field_types "github.com/pingcap/tidb/parser/types" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/plugin" @@ -78,16 +80,17 @@ var etcdDialTimeout = 5 * time.Second type ShowExec struct { baseExecutor - Tp ast.ShowStmtType // Databases/Tables/Columns/.... - DBName model.CIStr - Table *ast.TableName // Used for showing columns. - Partition model.CIStr // Used for showing partition - Column *ast.ColumnName // Used for `desc table column`. - IndexName model.CIStr // Used for show table regions. - Flag int // Some flag parsed from sql, such as FULL. - Roles []*auth.RoleIdentity // Used for show grants. - User *auth.UserIdentity // Used by show grants, show create user. - Extractor plannercore.ShowPredicateExtractor + Tp ast.ShowStmtType // Databases/Tables/Columns/.... + DBName model.CIStr + Table *ast.TableName // Used for showing columns. + Partition model.CIStr // Used for showing partition + Column *ast.ColumnName // Used for `desc table column`. + IndexName model.CIStr // Used for show table regions. + ResourceGroupName model.CIStr // Used for showing resource group + Flag int // Some flag parsed from sql, such as FULL. + Roles []*auth.RoleIdentity // Used for show grants. + User *auth.UserIdentity // Used by show grants, show create user. + Extractor plannercore.ShowPredicateExtractor is infoschema.InfoSchema @@ -179,6 +182,8 @@ func (e *ShowExec) fetchAll(ctx context.Context) error { return e.fetchShowCreateDatabase() case ast.ShowCreatePlacementPolicy: return e.fetchShowCreatePlacementPolicy() + case ast.ShowCreateResourceGroup: + return e.fetchShowCreateResourceGroup() case ast.ShowDatabases: return e.fetchShowDatabases() case ast.ShowDrainerStatus: @@ -304,12 +309,16 @@ func (v *visibleChecker) Leave(in ast.Node) (out ast.Node, ok bool) { } func (e *ShowExec) fetchShowBind() error { - var bindRecords []*bindinfo.BindRecord + var tmp []*bindinfo.BindRecord if !e.GlobalScope { handle := e.ctx.Value(bindinfo.SessionBindInfoKeyType).(*bindinfo.SessionHandle) - bindRecords = handle.GetAllBindRecord() + tmp = handle.GetAllBindRecord() } else { - bindRecords = domain.GetDomain(e.ctx).BindHandle().GetAllBindRecord() + tmp = domain.GetDomain(e.ctx).BindHandle().GetAllBindRecord() + } + bindRecords := make([]*bindinfo.BindRecord, 0) + for _, bindRecord := range tmp { + bindRecords = append(bindRecords, bindRecord.Copy()) } // Remove the invalid bindRecord. ind := 0 @@ -368,6 +377,8 @@ func (e *ShowExec) fetchShowBind() error { hint.Charset, hint.Collation, hint.Source, + hint.SQLDigest, + hint.PlanDigest, }) } } @@ -1006,8 +1017,9 @@ func ConstructResultOfShowCreateTable(ctx sessionctx.Context, tableInfo *model.T } buf.WriteString(" DEFAULT NULL") } - case "CURRENT_TIMESTAMP": - buf.WriteString(" DEFAULT CURRENT_TIMESTAMP") + case "CURRENT_TIMESTAMP", "CURRENT_DATE": + buf.WriteString(" DEFAULT ") + buf.WriteString(defaultValue.(string)) if col.GetDecimal() > 0 { buf.WriteString(fmt.Sprintf("(%d)", col.GetDecimal())) } @@ -1222,6 +1234,54 @@ func ConstructResultOfShowCreateTable(ctx sessionctx.Context, tableInfo *model.T // add partition info here. ddl.AppendPartitionInfo(tableInfo.Partition, buf, sqlMode) + + if tableInfo.TTLInfo != nil { + restoreFlags := parserformat.RestoreStringSingleQuotes | parserformat.RestoreNameBackQuotes | parserformat.RestoreTiDBSpecialComment + restoreCtx := parserformat.NewRestoreCtx(restoreFlags, buf) + + restoreCtx.WritePlain(" ") + err = restoreCtx.WriteWithSpecialComments(tidb.FeatureIDTTL, func() error { + columnName := ast.ColumnName{Name: tableInfo.TTLInfo.ColumnName} + timeUnit := ast.TimeUnitExpr{Unit: ast.TimeUnitType(tableInfo.TTLInfo.IntervalTimeUnit)} + restoreCtx.WriteKeyWord("TTL") + restoreCtx.WritePlain("=") + restoreCtx.WriteName(columnName.String()) + restoreCtx.WritePlainf(" + INTERVAL %s ", tableInfo.TTLInfo.IntervalExprStr) + return timeUnit.Restore(restoreCtx) + }) + + if err != nil { + return err + } + + restoreCtx.WritePlain(" ") + err = restoreCtx.WriteWithSpecialComments(tidb.FeatureIDTTL, func() error { + restoreCtx.WriteKeyWord("TTL_ENABLE") + restoreCtx.WritePlain("=") + if tableInfo.TTLInfo.Enable { + restoreCtx.WriteString("ON") + } else { + restoreCtx.WriteString("OFF") + } + return nil + }) + + if err != nil { + return err + } + + restoreCtx.WritePlain(" ") + err = restoreCtx.WriteWithSpecialComments(tidb.FeatureIDTTL, func() error { + restoreCtx.WriteKeyWord("TTL_JOB_INTERVAL") + restoreCtx.WritePlain("=") + restoreCtx.WriteString(tableInfo.TTLInfo.JobInterval) + return nil + }) + + if err != nil { + return err + } + } return nil } @@ -1397,6 +1457,11 @@ func ConstructResultOfShowCreatePlacementPolicy(policyInfo *model.PolicyInfo) st return fmt.Sprintf("CREATE PLACEMENT POLICY `%s` %s", policyInfo.Name.O, policyInfo.PlacementSettings.String()) } +// constructResultOfShowCreateResourceGroup constructs the result for show create resource group. +func constructResultOfShowCreateResourceGroup(resourceGroup *model.ResourceGroupInfo) string { + return fmt.Sprintf("CREATE RESOURCE GROUP `%s` %s", resourceGroup.Name.O, resourceGroup.ResourceGroupSettings.String()) +} + // fetchShowCreateDatabase composes show create database result. func (e *ShowExec) fetchShowCreateDatabase() error { checker := privilege.GetPrivilegeManager(e.ctx) @@ -1430,6 +1495,17 @@ func (e *ShowExec) fetchShowCreatePlacementPolicy() error { return nil } +// fetchShowCreateResourceGroup composes show create resource group result. +func (e *ShowExec) fetchShowCreateResourceGroup() error { + group, found := e.is.ResourceGroupByName(e.ResourceGroupName) + if !found { + return infoschema.ErrResourceGroupNotExists.GenWithStackByArgs(e.ResourceGroupName.O) + } + showCreate := constructResultOfShowCreateResourceGroup(group) + e.appendRow([]interface{}{e.ResourceGroupName.O, showCreate}) + return nil +} + func (e *ShowExec) fetchShowCollation() error { var ( fieldPatternsLike collate.WildcardPattern @@ -1487,7 +1563,11 @@ func (e *ShowExec) fetchShowCreateUser(ctx context.Context) error { exec := e.ctx.(sqlexec.RestrictedSQLExecutor) - rows, _, err := exec.ExecRestrictedSQL(ctx, nil, `SELECT plugin, Account_locked, JSON_UNQUOTE(JSON_EXTRACT(user_attributes, '$.metadata')), Token_issuer + rows, _, err := exec.ExecRestrictedSQL(ctx, nil, + `SELECT plugin, Account_locked, user_attributes->>'$.metadata', Token_issuer, + Password_reuse_history, Password_reuse_time, Password_expired, Password_lifetime, + user_attributes->>'$.Password_locking.failed_login_attempts', + user_attributes->>'$.Password_locking.password_lock_time_days' FROM %n.%n WHERE User=%? AND Host=%?`, mysql.SystemDB, mysql.UserTable, userName, strings.ToLower(hostName)) if err != nil { @@ -1513,7 +1593,7 @@ func (e *ShowExec) fetchShowCreateUser(ctx context.Context) error { userAttributes := rows[0].GetString(2) if len(userAttributes) > 0 { - userAttributes = " ATTRIBUTE " + userAttributes + userAttributes = fmt.Sprintf(" ATTRIBUTE '%s'", userAttributes) } tokenIssuer := rows[0].GetString(3) @@ -1521,6 +1601,47 @@ func (e *ShowExec) fetchShowCreateUser(ctx context.Context) error { tokenIssuer = " token_issuer " + tokenIssuer } + var passwordHistory string + if rows[0].IsNull(4) { + passwordHistory = "DEFAULT" + } else { + passwordHistory = strconv.FormatUint(rows[0].GetUint64(4), 10) + } + + var passwordReuseInterval string + if rows[0].IsNull(5) { + passwordReuseInterval = "DEFAULT" + } else { + passwordReuseInterval = strconv.FormatUint(rows[0].GetUint64(5), 10) + " DAY" + } + + passwordExpired := rows[0].GetEnum(6).String() + passwordLifetime := int64(-1) + if !rows[0].IsNull(7) { + passwordLifetime = rows[0].GetInt64(7) + } + passwordExpiredStr := "PASSWORD EXPIRE DEFAULT" + if passwordExpired == "Y" { + passwordExpiredStr = "PASSWORD EXPIRE" + } else if passwordLifetime == 0 { + passwordExpiredStr = "PASSWORD EXPIRE NEVER" + } else if passwordLifetime > 0 { + passwordExpiredStr = fmt.Sprintf("PASSWORD EXPIRE INTERVAL %d DAY", passwordLifetime) + } + + failedLoginAttempts := rows[0].GetString(8) + if len(failedLoginAttempts) > 0 { + failedLoginAttempts = " FAILED_LOGIN_ATTEMPTS " + failedLoginAttempts + } + + passwordLockTimeDays := rows[0].GetString(9) + if len(passwordLockTimeDays) > 0 { + if passwordLockTimeDays == "-1" { + passwordLockTimeDays = " PASSWORD_LOCK_TIME UNBOUNDED" + } else { + passwordLockTimeDays = " PASSWORD_LOCK_TIME " + passwordLockTimeDays + } + } rows, _, err = exec.ExecRestrictedSQL(ctx, nil, `SELECT Priv FROM %n.%n WHERE User=%? AND Host=%?`, mysql.SystemDB, mysql.GlobalPrivTable, userName, hostName) if err != nil { return errors.Trace(err) @@ -1544,8 +1665,8 @@ func (e *ShowExec) fetchShowCreateUser(ctx context.Context) error { } // FIXME: the returned string is not escaped safely - showStr := fmt.Sprintf("CREATE USER '%s'@'%s' IDENTIFIED WITH '%s'%s REQUIRE %s%s PASSWORD EXPIRE DEFAULT ACCOUNT %s%s", - e.User.Username, e.User.Hostname, authplugin, authStr, require, tokenIssuer, accountLocked, userAttributes) + showStr := fmt.Sprintf("CREATE USER '%s'@'%s' IDENTIFIED WITH '%s'%s REQUIRE %s%s %s ACCOUNT %s PASSWORD HISTORY %s PASSWORD REUSE INTERVAL %s%s%s%s", + e.User.Username, e.User.Hostname, authplugin, authStr, require, tokenIssuer, passwordExpiredStr, accountLocked, passwordHistory, passwordReuseInterval, failedLoginAttempts, passwordLockTimeDays, userAttributes) e.appendRow([]interface{}{showStr}) return nil } @@ -1596,13 +1717,16 @@ func (e *ShowExec) fetchShowGrants() error { func (e *ShowExec) fetchShowPrivileges() error { e.appendRow([]interface{}{"Alter", "Tables", "To alter the table"}) e.appendRow([]interface{}{"Alter routine", "Functions,Procedures", "To alter or drop stored functions/procedures"}) + e.appendRow([]interface{}{"Config", "Server Admin", "To use SHOW CONFIG and SET CONFIG statements"}) e.appendRow([]interface{}{"Create", "Databases,Tables,Indexes", "To create new databases and tables"}) e.appendRow([]interface{}{"Create routine", "Databases", "To use CREATE FUNCTION/PROCEDURE"}) + e.appendRow([]interface{}{"Create role", "Server Admin", "To create new roles"}) e.appendRow([]interface{}{"Create temporary tables", "Databases", "To use CREATE TEMPORARY TABLE"}) e.appendRow([]interface{}{"Create view", "Tables", "To create new views"}) e.appendRow([]interface{}{"Create user", "Server Admin", "To create new users"}) e.appendRow([]interface{}{"Delete", "Tables", "To delete existing rows"}) e.appendRow([]interface{}{"Drop", "Databases,Tables", "To drop databases, tables, and views"}) + e.appendRow([]interface{}{"Drop role", "Server Admin", "To drop roles"}) e.appendRow([]interface{}{"Event", "Server Admin", "To create, alter, drop and execute events"}) e.appendRow([]interface{}{"Execute", "Functions,Procedures", "To execute stored routines"}) e.appendRow([]interface{}{"File", "File access on server", "To read and write files on the server"}) diff --git a/executor/showtest/BUILD.bazel b/executor/showtest/BUILD.bazel index 807e00c8e88ec..1882c92e0627d 100644 --- a/executor/showtest/BUILD.bazel +++ b/executor/showtest/BUILD.bazel @@ -11,6 +11,7 @@ go_test( race = "on", shard_count = 45, deps = [ + "//autoid_service", "//config", "//executor", "//infoschema", diff --git a/executor/showtest/show_test.go b/executor/showtest/show_test.go index 3566b1589a271..6ff3db919ee9f 100644 --- a/executor/showtest/show_test.go +++ b/executor/showtest/show_test.go @@ -21,6 +21,7 @@ import ( "testing" "github.com/pingcap/failpoint" + _ "github.com/pingcap/tidb/autoid_service" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser/auth" @@ -142,7 +143,8 @@ func TestShowCreateTable(t *testing.T) { "`d` datetime(4) default current_timestamp(4),\n" + "`e` varchar(20) default 'cUrrent_tImestamp',\n" + "`f` datetime(2) default current_timestamp(2) on update current_timestamp(2),\n" + - "`g` timestamp(2) default current_timestamp(2) on update current_timestamp(2))") + "`g` timestamp(2) default current_timestamp(2) on update current_timestamp(2),\n" + + "`h` date default current_date )") tk.MustQuery("show create table `t`").Check(testkit.RowsWithSep("|", ""+ "t CREATE TABLE `t` (\n"+ @@ -152,7 +154,8 @@ func TestShowCreateTable(t *testing.T) { " `d` datetime(4) DEFAULT CURRENT_TIMESTAMP(4),\n"+ " `e` varchar(20) DEFAULT 'cUrrent_tImestamp',\n"+ " `f` datetime(2) DEFAULT CURRENT_TIMESTAMP(2) ON UPDATE CURRENT_TIMESTAMP(2),\n"+ - " `g` timestamp(2) DEFAULT CURRENT_TIMESTAMP(2) ON UPDATE CURRENT_TIMESTAMP(2)\n"+ + " `g` timestamp(2) DEFAULT CURRENT_TIMESTAMP(2) ON UPDATE CURRENT_TIMESTAMP(2),\n"+ + " `h` date DEFAULT CURRENT_DATE\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", )) tk.MustExec("drop table t") @@ -317,9 +320,10 @@ func TestShowCreateTable(t *testing.T) { ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", )) - // TiDB defaults (and only supports) foreign_key_checks=0 + // set @@foreign_key_checks=0, // This means that the child table can be created before the parent table. // This behavior is required for mysqldump restores. + tk.MustExec("set @@foreign_key_checks=0") tk.MustExec(`DROP TABLE IF EXISTS parent, child`) tk.MustExec(`CREATE TABLE child (id INT NOT NULL PRIMARY KEY auto_increment, parent_id INT NOT NULL, INDEX par_ind (parent_id), CONSTRAINT child_ibfk_1 FOREIGN KEY (parent_id) REFERENCES parent(id))`) tk.MustExec(`CREATE TABLE parent ( id INT NOT NULL PRIMARY KEY auto_increment )`) @@ -330,7 +334,7 @@ func TestShowCreateTable(t *testing.T) { " `parent_id` int(11) NOT NULL,\n"+ " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,\n"+ " KEY `par_ind` (`parent_id`),\n"+ - " CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `test`.`parent` (`id`) /* FOREIGN KEY INVALID */\n"+ + " CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `test`.`parent` (`id`)\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", )) @@ -344,7 +348,7 @@ func TestShowCreateTable(t *testing.T) { " `parent_id` int(11) NOT NULL,\n"+ " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,\n"+ " KEY `par_ind` (`parent_id`),\n"+ - " CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `test`.`parent` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE /* FOREIGN KEY INVALID */\n"+ + " CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `test`.`parent` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", )) @@ -357,7 +361,8 @@ func TestShowCreateTable(t *testing.T) { " `id` int(11) NOT NULL,\n" + " `b` int(11) DEFAULT NULL,\n" + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,\n" + - " CONSTRAINT `fk` FOREIGN KEY (`b`) REFERENCES `test1`.`t1` (`id`) /* FOREIGN KEY INVALID */\n" + + " KEY `fk` (`b`),\n" + + " CONSTRAINT `fk` FOREIGN KEY (`b`) REFERENCES `test1`.`t1` (`id`)\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) // Test issue #20327 @@ -963,6 +968,8 @@ func TestShow2(t *testing.T) { c_timestamp_default timestamp default current_timestamp, c_timestamp_default_3 timestamp(3) default current_timestamp(3), c_timestamp_default_4 timestamp(3) default current_timestamp(3) on update current_timestamp(3), + c_date_default date default current_date, + c_date_default_2 date default (curdate()), c_blob blob, c_tinyblob tinyblob, c_mediumblob mediumblob, @@ -999,6 +1006,8 @@ func TestShow2(t *testing.T) { "[c_timestamp_default timestamp YES CURRENT_TIMESTAMP select,insert,update,references ]\n" + "[c_timestamp_default_3 timestamp(3) YES CURRENT_TIMESTAMP(3) select,insert,update,references ]\n" + "[c_timestamp_default_4 timestamp(3) YES CURRENT_TIMESTAMP(3) DEFAULT_GENERATED on update CURRENT_TIMESTAMP(3) select,insert,update,references ]\n" + + "[c_date_default date YES CURRENT_DATE select,insert,update,references ]\n" + + "[c_date_default_2 date YES CURRENT_DATE select,insert,update,references ]\n" + "[c_blob blob YES select,insert,update,references ]\n" + "[c_tinyblob tinyblob YES select,insert,update,references ]\n" + "[c_mediumblob mediumblob YES select,insert,update,references ]\n" + @@ -1057,11 +1066,11 @@ func TestShowCreateUser(t *testing.T) { // Create a new user. tk.MustExec(`CREATE USER 'test_show_create_user'@'%' IDENTIFIED BY 'root';`) tk.MustQuery("show create user 'test_show_create_user'@'%'"). - Check(testkit.Rows(`CREATE USER 'test_show_create_user'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK`)) + Check(testkit.Rows(`CREATE USER 'test_show_create_user'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT`)) tk.MustExec(`CREATE USER 'test_show_create_user'@'localhost' IDENTIFIED BY 'test';`) tk.MustQuery("show create user 'test_show_create_user'@'localhost';"). - Check(testkit.Rows(`CREATE USER 'test_show_create_user'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK`)) + Check(testkit.Rows(`CREATE USER 'test_show_create_user'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT`)) // Case: the user exists but the host portion doesn't match err := tk.QueryToErr("show create user 'test_show_create_user'@'asdf';") @@ -1073,10 +1082,10 @@ func TestShowCreateUser(t *testing.T) { tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "127.0.0.1", AuthUsername: "root", AuthHostname: "%"}, nil, nil) tk.MustQuery("show create user current_user"). - Check(testkit.Rows("CREATE USER 'root'@'127.0.0.1' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK")) + Check(testkit.Rows("CREATE USER 'root'@'127.0.0.1' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT")) tk.MustQuery("show create user current_user()"). - Check(testkit.Rows("CREATE USER 'root'@'127.0.0.1' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK")) + Check(testkit.Rows("CREATE USER 'root'@'127.0.0.1' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT")) tk.MustExec("create user 'check_priv'") @@ -1089,9 +1098,9 @@ func TestShowCreateUser(t *testing.T) { // "show create user" for current user doesn't check privileges. tk1.MustQuery("show create user current_user"). - Check(testkit.Rows("CREATE USER 'check_priv'@'127.0.0.1' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK")) + Check(testkit.Rows("CREATE USER 'check_priv'@'127.0.0.1' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT")) - // Creating users with `IDENTIFIED WITH 'caching_sha2_password'` + // Creating users with `IDENTIFIED WITH 'caching_sha2_password'`. tk.MustExec("CREATE USER 'sha_test'@'%' IDENTIFIED WITH 'caching_sha2_password' BY 'temp_passwd'") // Compare only the start of the output as the salt changes every time. @@ -1102,29 +1111,57 @@ func TestShowCreateUser(t *testing.T) { // Compare only the start of the output as the salt changes every time. rows = tk.MustQuery("SHOW CREATE USER 'sock'@'%'") - require.Equal(t, "CREATE USER 'sock'@'%' IDENTIFIED WITH 'auth_socket' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK", rows.Rows()[0][0].(string)) + require.Equal(t, "CREATE USER 'sock'@'%' IDENTIFIED WITH 'auth_socket' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT", rows.Rows()[0][0].(string)) tk.MustExec("CREATE USER 'sock2'@'%' IDENTIFIED WITH 'auth_socket' AS 'sock3'") // Compare only the start of the output as the salt changes every time. rows = tk.MustQuery("SHOW CREATE USER 'sock2'@'%'") - require.Equal(t, "CREATE USER 'sock2'@'%' IDENTIFIED WITH 'auth_socket' AS 'sock3' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK", rows.Rows()[0][0].(string)) + require.Equal(t, "CREATE USER 'sock2'@'%' IDENTIFIED WITH 'auth_socket' AS 'sock3' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT", rows.Rows()[0][0].(string)) - // Test ACCOUNT LOCK/UNLOCK + // Test ACCOUNT LOCK/UNLOCK. tk.MustExec("CREATE USER 'lockness'@'%' IDENTIFIED BY 'monster' ACCOUNT LOCK") rows = tk.MustQuery("SHOW CREATE USER 'lockness'@'%'") - require.Equal(t, "CREATE USER 'lockness'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*BC05309E7FE12AFD4EBB9FFE7E488A6320F12FF3' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT LOCK", rows.Rows()[0][0].(string)) + require.Equal(t, "CREATE USER 'lockness'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*BC05309E7FE12AFD4EBB9FFE7E488A6320F12FF3' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT LOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT", rows.Rows()[0][0].(string)) - // Test COMMENT and ATTRIBUTE + // Test COMMENT and ATTRIBUTE. tk.MustExec("CREATE USER commentUser COMMENT '1234'") - tk.MustQuery("SHOW CREATE USER commentUser").Check(testkit.Rows(`CREATE USER 'commentUser'@'%' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK ATTRIBUTE {"comment": "1234"}`)) + tk.MustQuery("SHOW CREATE USER commentUser").Check(testkit.Rows(`CREATE USER 'commentUser'@'%' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT ATTRIBUTE '{"comment": "1234"}'`)) tk.MustExec(`CREATE USER attributeUser attribute '{"name": "Tom", "age": 19}'`) - tk.MustQuery("SHOW CREATE USER attributeUser").Check(testkit.Rows(`CREATE USER 'attributeUser'@'%' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK ATTRIBUTE {"age": 19, "name": "Tom"}`)) + tk.MustQuery("SHOW CREATE USER attributeUser").Check(testkit.Rows(`CREATE USER 'attributeUser'@'%' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT ATTRIBUTE '{"age": 19, "name": "Tom"}'`)) - // Creating users with 'IDENTIFIED WITH 'tidb_auth_token'' + // Creating users with IDENTIFIED WITH 'tidb_auth_token'. tk.MustExec(`CREATE USER 'token_user'@'%' IDENTIFIED WITH 'tidb_auth_token' ATTRIBUTE '{"email": "user@pingcap.com"}'`) - tk.MustQuery("SHOW CREATE USER token_user").Check(testkit.Rows(`CREATE USER 'token_user'@'%' IDENTIFIED WITH 'tidb_auth_token' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK ATTRIBUTE {"email": "user@pingcap.com"}`)) + tk.MustQuery("SHOW CREATE USER token_user").Check(testkit.Rows(`CREATE USER 'token_user'@'%' IDENTIFIED WITH 'tidb_auth_token' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT ATTRIBUTE '{"email": "user@pingcap.com"}'`)) tk.MustExec(`ALTER USER 'token_user'@'%' REQUIRE token_issuer 'issuer-ABC'`) - tk.MustQuery("SHOW CREATE USER token_user").Check(testkit.Rows(`CREATE USER 'token_user'@'%' IDENTIFIED WITH 'tidb_auth_token' AS '' REQUIRE NONE token_issuer issuer-ABC PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK ATTRIBUTE {"email": "user@pingcap.com"}`)) + tk.MustQuery("SHOW CREATE USER token_user").Check(testkit.Rows(`CREATE USER 'token_user'@'%' IDENTIFIED WITH 'tidb_auth_token' AS '' REQUIRE NONE token_issuer issuer-ABC PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT ATTRIBUTE '{"email": "user@pingcap.com"}'`)) + + // create users with password reuse. + tk.MustExec(`CREATE USER 'reuse_user'@'%' IDENTIFIED WITH 'tidb_auth_token' PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 3 DAY`) + tk.MustQuery("SHOW CREATE USER reuse_user").Check(testkit.Rows(`CREATE USER 'reuse_user'@'%' IDENTIFIED WITH 'tidb_auth_token' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 3 DAY`)) + tk.MustExec(`ALTER USER 'reuse_user'@'%' PASSWORD HISTORY 50`) + tk.MustQuery("SHOW CREATE USER reuse_user").Check(testkit.Rows(`CREATE USER 'reuse_user'@'%' IDENTIFIED WITH 'tidb_auth_token' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY 50 PASSWORD REUSE INTERVAL 3 DAY`)) + tk.MustExec(`ALTER USER 'reuse_user'@'%' PASSWORD REUSE INTERVAL 31 DAY`) + tk.MustQuery("SHOW CREATE USER reuse_user").Check(testkit.Rows(`CREATE USER 'reuse_user'@'%' IDENTIFIED WITH 'tidb_auth_token' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY 50 PASSWORD REUSE INTERVAL 31 DAY`)) + + tk.MustExec("CREATE USER 'jeffrey1'@'localhost' PASSWORD EXPIRE") + tk.MustQuery("SHOW CREATE USER 'jeffrey1'@'localhost'").Check(testkit.Rows(`CREATE USER 'jeffrey1'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT`)) + tk.MustExec("CREATE USER 'jeffrey2'@'localhost' PASSWORD EXPIRE DEFAULT") + tk.MustQuery("SHOW CREATE USER 'jeffrey2'@'localhost'").Check(testkit.Rows(`CREATE USER 'jeffrey2'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT`)) + tk.MustExec("CREATE USER 'jeffrey3'@'localhost' PASSWORD EXPIRE NEVER") + tk.MustQuery("SHOW CREATE USER 'jeffrey3'@'localhost'").Check(testkit.Rows(`CREATE USER 'jeffrey3'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE NEVER ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT`)) + tk.MustExec("CREATE USER 'jeffrey4'@'localhost' PASSWORD EXPIRE INTERVAL 180 DAY") + tk.MustQuery("SHOW CREATE USER 'jeffrey4'@'localhost'").Check(testkit.Rows(`CREATE USER 'jeffrey4'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE INTERVAL 180 DAY ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT`)) + + tk.MustExec("CREATE USER failed_login_user") + tk.MustQuery("SHOW CREATE USER failed_login_user").Check(testkit.Rows(`CREATE USER 'failed_login_user'@'%' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT`)) + tk.MustExec("ALTER USER failed_login_user FAILED_LOGIN_ATTEMPTS 1 PASSWORD_LOCK_TIME 2") + tk.MustQuery("SHOW CREATE USER failed_login_user").Check(testkit.Rows(`CREATE USER 'failed_login_user'@'%' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT FAILED_LOGIN_ATTEMPTS 1 PASSWORD_LOCK_TIME 2`)) + tk.MustExec("ALTER USER failed_login_user PASSWORD_LOCK_TIME UNBOUNDED") + tk.MustQuery("SHOW CREATE USER failed_login_user").Check(testkit.Rows(`CREATE USER 'failed_login_user'@'%' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT FAILED_LOGIN_ATTEMPTS 1 PASSWORD_LOCK_TIME UNBOUNDED`)) + tk.MustExec("ALTER USER failed_login_user comment 'testcomment'") + tk.MustQuery("SHOW CREATE USER failed_login_user").Check(testkit.Rows(`CREATE USER 'failed_login_user'@'%' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT FAILED_LOGIN_ATTEMPTS 1 PASSWORD_LOCK_TIME UNBOUNDED ATTRIBUTE '{"comment": "testcomment"}'`)) + tk.MustExec("ALTER USER failed_login_user ATTRIBUTE '{\"attribute\": \"testattribute\"}'") + tk.MustQuery("SHOW CREATE USER failed_login_user").Check(testkit.Rows(`CREATE USER 'failed_login_user'@'%' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT FAILED_LOGIN_ATTEMPTS 1 PASSWORD_LOCK_TIME UNBOUNDED ATTRIBUTE '{"attribute": "testattribute", "comment": "testcomment"}'`)) } func TestUnprivilegedShow(t *testing.T) { @@ -1485,7 +1522,7 @@ func TestShowBuiltin(t *testing.T) { res := tk.MustQuery("show builtins;") require.NotNil(t, res) rows := res.Rows() - const builtinFuncNum = 283 + const builtinFuncNum = 285 require.Equal(t, builtinFuncNum, len(rows)) require.Equal(t, rows[0][0].(string), "abs") require.Equal(t, rows[builtinFuncNum-1][0].(string), "yearweek") @@ -1989,3 +2026,55 @@ func TestShowLimitReturnRow(t *testing.T) { rows = result.Rows() require.Equal(t, rows[0][2], "idx_b") } + +func TestShowTTLOption(t *testing.T) { + store := testkit.CreateMockStore(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(created_at datetime) ttl = `created_at` + INTERVAL 100 YEAR") + tk.MustQuery("show create table t").Check(testkit.Rows("t CREATE TABLE `t` (\n `created_at` datetime DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`created_at` + INTERVAL 100 YEAR */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */")) + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(created_at datetime) ttl = `created_at` + INTERVAL 100 YEAR ttl_enable = 'OFF'") + tk.MustQuery("show create table t").Check(testkit.Rows("t CREATE TABLE `t` (\n `created_at` datetime DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`created_at` + INTERVAL 100 YEAR */ /*T![ttl] TTL_ENABLE='OFF' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (created_at datetime) TTL = created_at + INTERVAL 3.14159 HOUR_MINUTE") + tk.MustQuery("show create table t").Check(testkit.Rows("t CREATE TABLE `t` (\n `created_at` datetime DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`created_at` + INTERVAL 3.14159 HOUR_MINUTE */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (created_at datetime) TTL = created_at + INTERVAL \"15:20\" HOUR_MINUTE") + tk.MustQuery("show create table t").Check(testkit.Rows("t CREATE TABLE `t` (\n `created_at` datetime DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`created_at` + INTERVAL _utf8mb4'15:20' HOUR_MINUTE */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (created_at datetime) TTL = created_at + INTERVAL 100 YEAR TTL_JOB_INTERVAL = '1d'") + tk.MustQuery("show create table t").Check(testkit.Rows("t CREATE TABLE `t` (\n `created_at` datetime DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`created_at` + INTERVAL 100 YEAR */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1d' */")) +} + +func TestShowBindingDigestField(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(id int, key(id))") + tk.MustExec("create table t2(id int, key(id))") + tk.MustExec("create binding for select * from t1, t2 where t1.id = t2.id using select /*+ merge_join(t1, t2)*/ * from t1, t2 where t1.id = t2.id") + result := tk.MustQuery("show bindings;") + rows := result.Rows()[0] + require.Equal(t, len(rows), 11) + require.Equal(t, rows[9], "ac1ceb4eb5c01f7c03e29b7d0d6ab567e563f4c93164184cde218f20d07fd77c") + tk.MustExec("drop binding for select * from t1, t2 where t1.id = t2.id") + result = tk.MustQuery("show bindings;") + require.Equal(t, len(result.Rows()), 0) + + tk.MustExec("create global binding for select * from t1, t2 where t1.id = t2.id using select /*+ merge_join(t1, t2)*/ * from t1, t2 where t1.id = t2.id") + result = tk.MustQuery("show global bindings;") + rows = result.Rows()[0] + require.Equal(t, len(rows), 11) + require.Equal(t, rows[9], "ac1ceb4eb5c01f7c03e29b7d0d6ab567e563f4c93164184cde218f20d07fd77c") + tk.MustExec("drop global binding for select * from t1, t2 where t1.id = t2.id") + result = tk.MustQuery("show global bindings;") + require.Equal(t, len(result.Rows()), 0) +} diff --git a/executor/simple.go b/executor/simple.go index 2ab99b101dde1..dad3a6e63781e 100644 --- a/executor/simple.go +++ b/executor/simple.go @@ -19,7 +19,9 @@ import ( "context" "encoding/json" "fmt" + "math" "os" + "strconv" "strings" "syscall" "time" @@ -51,18 +53,23 @@ import ( "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/mathutil" + pwdValidator "github.com/pingcap/tidb/util/password-validation" "github.com/pingcap/tidb/util/sem" "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tidb/util/timeutil" "github.com/pingcap/tidb/util/tls" "github.com/pingcap/tipb/go-tipb" - tikvutil "github.com/tikv/client-go/v2/util" "go.uber.org/zap" ) +const notSpecified = -1 + var ( - transactionDurationPessimisticRollback = metrics.TransactionDuration.WithLabelValues(metrics.LblPessimistic, metrics.LblRollback) - transactionDurationOptimisticRollback = metrics.TransactionDuration.WithLabelValues(metrics.LblOptimistic, metrics.LblRollback) + transactionDurationPessimisticRollbackInternal = metrics.TransactionDuration.WithLabelValues(metrics.LblPessimistic, metrics.LblRollback, metrics.LblInternal) + transactionDurationPessimisticRollbackGeneral = metrics.TransactionDuration.WithLabelValues(metrics.LblPessimistic, metrics.LblRollback, metrics.LblGeneral) + transactionDurationOptimisticRollbackInternal = metrics.TransactionDuration.WithLabelValues(metrics.LblOptimistic, metrics.LblRollback, metrics.LblInternal) + transactionDurationOptimisticRollbackGeneral = metrics.TransactionDuration.WithLabelValues(metrics.LblOptimistic, metrics.LblRollback, metrics.LblGeneral) ) // SimpleExec represents simple statement executor. @@ -85,6 +92,33 @@ type SimpleExec struct { staleTxnStartTS uint64 } +type passwordOrLockOptionsInfo struct { + lockAccount string + passwordExpired string + passwordLifetime any + passwordHistory int64 + passwordHistoryChange bool + passwordReuseInterval int64 + passwordReuseIntervalChange bool + failedLoginAttempts int64 + passwordLockTime int64 + failedLoginAttemptsChange bool + passwordLockTimeChange bool +} + +type passwordReuseInfo struct { + passwordHistory int64 + passwordReuseInterval int64 +} + +type userInfo struct { + host string + user string + pLI *passwordOrLockOptionsInfo + pwd string + authString string +} + func (e *baseExecutor) getSysSession() (sessionctx.Context, error) { dom := domain.GetDomain(e.ctx) sysSessionPool := dom.SysSessionPool() @@ -110,6 +144,16 @@ func (e *baseExecutor) releaseSysSession(ctx context.Context, sctx sessionctx.Co sysSessionPool.Put(sctx.(pools.Resource)) } +// clearSysSession close the session does not return the session. +// Since the environment variables in the session are changed, the session object is not returned. +func clearSysSession(ctx context.Context, sctx sessionctx.Context) { + if sctx == nil { + return + } + _, _ = sctx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, "rollback") + sctx.(pools.Resource).Close() +} + // Next implements the Executor Next interface. func (e *SimpleExec) Next(ctx context.Context, req *chunk.Chunk) (err error) { if e.done { @@ -772,10 +816,18 @@ func (e *SimpleExec) executeRollback(s *ast.RollbackStmt) error { sessVars.SetInTxn(false) if txn.Valid() { duration := time.Since(sessVars.TxnCtx.CreateTime).Seconds() - if sessVars.TxnCtx.IsPessimistic { - transactionDurationPessimisticRollback.Observe(duration) - } else { - transactionDurationOptimisticRollback.Observe(duration) + isInternal := false + if internal := txn.GetOption(kv.RequestSourceInternal); internal != nil && internal.(bool) { + isInternal = true + } + if isInternal && sessVars.TxnCtx.IsPessimistic { + transactionDurationPessimisticRollbackInternal.Observe(duration) + } else if isInternal && !sessVars.TxnCtx.IsPessimistic { + transactionDurationOptimisticRollbackInternal.Observe(duration) + } else if !isInternal && sessVars.TxnCtx.IsPessimistic { + transactionDurationPessimisticRollbackGeneral.Observe(duration) + } else if !isInternal && !sessVars.TxnCtx.IsPessimistic { + transactionDurationOptimisticRollbackGeneral.Observe(duration) } sessVars.TxnCtx.ClearDelta() return txn.Rollback() @@ -783,6 +835,215 @@ func (e *SimpleExec) executeRollback(s *ast.RollbackStmt) error { return nil } +func whetherSavePasswordHistory(plOptions *passwordOrLockOptionsInfo) bool { + var passwdSaveNum, passwdSaveTime int64 + // If the user specifies a default, read the global variable. + if plOptions.passwordHistoryChange && plOptions.passwordHistory != notSpecified { + passwdSaveNum = plOptions.passwordHistory + } else { + passwdSaveNum = variable.PasswordHistory.Load() + } + if plOptions.passwordReuseIntervalChange && plOptions.passwordReuseInterval != notSpecified { + passwdSaveTime = plOptions.passwordReuseInterval + } else { + passwdSaveTime = variable.PasswordReuseInterval.Load() + } + return passwdSaveTime > 0 || passwdSaveNum > 0 +} + +type alterUserPasswordLocking struct { + failedLoginAttempts int64 + passwordLockTime int64 + failedLoginAttemptsNotFound bool + passwordLockTimeChangeNotFound bool + // containsNoOthers indicates whether User_attributes only contains one "Password_locking" element. + containsNoOthers bool +} + +func (info *passwordOrLockOptionsInfo) loadOptions(plOption []*ast.PasswordOrLockOption) error { + if length := len(plOption); length > 0 { + // If "PASSWORD EXPIRE ..." appears many times, + // only the last declaration takes effect. + Loop: + for i := length - 1; i >= 0; i-- { + switch plOption[i].Type { + case ast.PasswordExpire: + info.passwordExpired = "Y" + break Loop + case ast.PasswordExpireDefault: + info.passwordLifetime = nil + break Loop + case ast.PasswordExpireNever: + info.passwordLifetime = 0 + break Loop + case ast.PasswordExpireInterval: + if plOption[i].Count == 0 || plOption[i].Count > math.MaxUint16 { + return types.ErrWrongValue2.GenWithStackByArgs("DAY", fmt.Sprintf("%v", plOption[i].Count)) + } + info.passwordLifetime = plOption[i].Count + break Loop + } + } + } + // only the last declaration takes effect. + for _, option := range plOption { + switch option.Type { + case ast.Lock: + info.lockAccount = "Y" + case ast.Unlock: + info.lockAccount = "N" + case ast.FailedLoginAttempts: + info.failedLoginAttempts = mathutil.Min(option.Count, math.MaxInt16) + info.failedLoginAttemptsChange = true + case ast.PasswordLockTime: + info.passwordLockTime = mathutil.Min(option.Count, math.MaxInt16) + info.passwordLockTimeChange = true + case ast.PasswordLockTimeUnbounded: + info.passwordLockTime = -1 + info.passwordLockTimeChange = true + case ast.PasswordHistory: + info.passwordHistory = mathutil.Min(option.Count, math.MaxUint16) + info.passwordHistoryChange = true + case ast.PasswordHistoryDefault: + info.passwordHistory = notSpecified + info.passwordHistoryChange = true + case ast.PasswordReuseInterval: + info.passwordReuseInterval = mathutil.Min(option.Count, math.MaxUint16) + info.passwordReuseIntervalChange = true + case ast.PasswordReuseDefault: + info.passwordReuseInterval = notSpecified + info.passwordReuseIntervalChange = true + } + } + return nil +} + +func createUserFailedLoginJSON(info *passwordOrLockOptionsInfo) string { + // Record only when either failedLoginAttempts and passwordLockTime is not 0 + if (info.failedLoginAttemptsChange && info.failedLoginAttempts != 0) || (info.passwordLockTimeChange && info.passwordLockTime != 0) { + return fmt.Sprintf("\"Password_locking\": {\"failed_login_attempts\": %d,\"password_lock_time_days\": %d}", + info.failedLoginAttempts, info.passwordLockTime) + } + return "" +} + +func alterUserFailedLoginJSON(info *alterUserPasswordLocking, lockAccount string) string { + // alterUserPasswordLocking is the user's actual configuration. + var passwordLockingArray []string + if info.failedLoginAttempts != 0 || info.passwordLockTime != 0 { + if lockAccount == "N" { + passwordLockingArray = append(passwordLockingArray, + fmt.Sprintf("\"auto_account_locked\": \"%s\"", lockAccount), + fmt.Sprintf("\"auto_locked_last_changed\": \"%s\"", time.Now().Format(time.UnixDate)), + fmt.Sprintf("\"failed_login_count\": %d", 0)) + } + passwordLockingArray = append(passwordLockingArray, + fmt.Sprintf("\"failed_login_attempts\": %d", info.failedLoginAttempts), + fmt.Sprintf("\"password_lock_time_days\": %d", info.passwordLockTime)) + } + if len(passwordLockingArray) > 0 { + return fmt.Sprintf("\"Password_locking\": {%s}", strings.Join(passwordLockingArray, ",")) + } + return "" +} + +func readPasswordLockingInfo(ctx context.Context, sqlExecutor sqlexec.SQLExecutor, name string, host string, pLO *passwordOrLockOptionsInfo) (aUPL *alterUserPasswordLocking, err error) { + alterUserInfo := &alterUserPasswordLocking{ + failedLoginAttempts: 0, + passwordLockTime: 0, + failedLoginAttemptsNotFound: false, + passwordLockTimeChangeNotFound: false, + containsNoOthers: false, + } + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, `SELECT JSON_UNQUOTE(JSON_EXTRACT(user_attributes, '$.Password_locking.failed_login_attempts')), + JSON_UNQUOTE(JSON_EXTRACT(user_attributes, '$.Password_locking.password_lock_time_days')), + JSON_LENGTH(JSON_REMOVE(user_attributes, '$.Password_locking')) FROM %n.%n WHERE User=%? AND Host=%?;`, + mysql.SystemDB, mysql.UserTable, name, strings.ToLower(host)) + recordSet, err := sqlExecutor.ExecuteInternal(ctx, sql.String()) + if err != nil { + return nil, err + } + defer func() { + if closeErr := recordSet.Close(); closeErr != nil { + err = closeErr + } + }() + rows, err := sqlexec.DrainRecordSet(ctx, recordSet, 3) + if err != nil { + return nil, err + } + + // Configuration priority is User Changes > User History + if pLO.failedLoginAttemptsChange { + alterUserInfo.failedLoginAttempts = pLO.failedLoginAttempts + } else if !rows[0].IsNull(0) { + str := rows[0].GetString(0) + alterUserInfo.failedLoginAttempts, err = strconv.ParseInt(str, 10, 64) + if err != nil { + return nil, err + } + alterUserInfo.failedLoginAttempts = mathutil.Max(alterUserInfo.failedLoginAttempts, 0) + alterUserInfo.failedLoginAttempts = mathutil.Min(alterUserInfo.failedLoginAttempts, math.MaxInt16) + } else { + alterUserInfo.failedLoginAttemptsNotFound = true + } + + if pLO.passwordLockTimeChange { + alterUserInfo.passwordLockTime = pLO.passwordLockTime + } else if !rows[0].IsNull(1) { + str := rows[0].GetString(1) + alterUserInfo.passwordLockTime, err = strconv.ParseInt(str, 10, 64) + if err != nil { + return nil, err + } + alterUserInfo.passwordLockTime = mathutil.Max(alterUserInfo.passwordLockTime, -1) + alterUserInfo.passwordLockTime = mathutil.Min(alterUserInfo.passwordLockTime, math.MaxInt16) + } else { + alterUserInfo.passwordLockTimeChangeNotFound = true + } + + alterUserInfo.containsNoOthers = rows[0].IsNull(2) || rows[0].GetInt64(2) == 0 + return alterUserInfo, nil +} + +// deletePasswordLockingAttribute deletes "$.Password_locking" in "User_attributes" when failedLoginAttempts and passwordLockTime both 0. +func deletePasswordLockingAttribute(ctx context.Context, sqlExecutor sqlexec.SQLExecutor, name string, host string, alterUser *alterUserPasswordLocking) error { + // No password_locking information. + if alterUser.failedLoginAttemptsNotFound && alterUser.passwordLockTimeChangeNotFound { + return nil + } + // Password_locking information is still in used. + if alterUser.failedLoginAttempts != 0 || alterUser.passwordLockTime != 0 { + return nil + } + sql := new(strings.Builder) + if alterUser.containsNoOthers { + // If we use JSON_REMOVE(user_attributes, '$.Password_locking') directly here, the result is not compatible with MySQL. + sqlexec.MustFormatSQL(sql, `UPDATE %n.%n SET user_attributes=NULL`, mysql.SystemDB, mysql.UserTable) + } else { + sqlexec.MustFormatSQL(sql, `UPDATE %n.%n SET user_attributes=JSON_REMOVE(user_attributes, '$.Password_locking') `, mysql.SystemDB, mysql.UserTable) + } + sqlexec.MustFormatSQL(sql, " WHERE Host=%? and User=%?;", host, name) + _, err := sqlExecutor.ExecuteInternal(ctx, sql.String()) + return err +} + +func (e *SimpleExec) authUsingCleartextPwd(authOpt *ast.AuthOption, authPlugin string) bool { + if authOpt == nil || !authOpt.ByAuthString { + return false + } + return mysql.IsAuthPluginClearText(authPlugin) +} + +func (e *SimpleExec) isValidatePasswordEnabled() bool { + validatePwdEnable, err := e.ctx.GetSessionVars().GlobalVarsAccessor.GetGlobalSysVar(variable.ValidatePasswordEnable) + if err != nil { + return false + } + return variable.TiDBOptOn(validatePwdEnable) +} + func (e *SimpleExec) executeCreateUser(ctx context.Context, s *ast.CreateUserStmt) error { internalCtx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnPrivilege) // Check `CREATE USER` privilege. @@ -810,32 +1071,59 @@ func (e *SimpleExec) executeCreateUser(ctx context.Context, s *ast.CreateUserStm return err } - lockAccount := "N" - if length := len(s.PasswordOrLockOptions); length > 0 { - // If "ACCOUNT LOCK" or "ACCOUNT UNLOCK" appears many times, - // the last declaration takes effect. - for i := length - 1; i >= 0; i-- { - if s.PasswordOrLockOptions[i].Type == ast.Lock { - lockAccount = "Y" - break - } else if s.PasswordOrLockOptions[i].Type == ast.Unlock { - break - } - } + plOptions := &passwordOrLockOptionsInfo{ + lockAccount: "N", + passwordExpired: "N", + passwordLifetime: nil, + passwordHistory: notSpecified, + passwordReuseInterval: notSpecified, + failedLoginAttemptsChange: false, + passwordLockTimeChange: false, + passwordHistoryChange: false, + passwordReuseIntervalChange: false, } + err = plOptions.loadOptions(s.PasswordOrLockOptions) + if err != nil { + return err + } + PasswordLocking := createUserFailedLoginJSON(plOptions) if s.IsCreateRole { - lockAccount = "Y" + plOptions.lockAccount = "Y" + plOptions.passwordExpired = "Y" } - var userAttributes any = nil + var userAttributes []string if s.CommentOrAttributeOption != nil { if s.CommentOrAttributeOption.Type == ast.UserCommentType { - userAttributes = fmt.Sprintf("{\"metadata\": {\"comment\": \"%s\"}}", s.CommentOrAttributeOption.Value) + userAttributes = append(userAttributes, fmt.Sprintf("\"metadata\": {\"comment\": \"%s\"}", s.CommentOrAttributeOption.Value)) } else if s.CommentOrAttributeOption.Type == ast.UserAttributeType { - userAttributes = fmt.Sprintf("{\"metadata\": %s}", s.CommentOrAttributeOption.Value) + userAttributes = append(userAttributes, fmt.Sprintf("\"metadata\": %s", s.CommentOrAttributeOption.Value)) } } + if s.ResourceGroupNameOption != nil { + if !variable.EnableResourceControl.Load() { + return infoschema.ErrResourceGroupSupportDisabled + } + + resourceGroupName := strings.ToLower(s.ResourceGroupNameOption.Value) + + // check if specified resource group exists + if resourceGroupName != "default" && resourceGroupName != "" { + _, exists := e.is.ResourceGroupByName(model.NewCIStr(resourceGroupName)) + if !exists { + return infoschema.ErrResourceGroupNotExists.GenWithStackByArgs(resourceGroupName) + } + } + userAttributes = append(userAttributes, fmt.Sprintf("\"resource_group\": \"%s\"", resourceGroupName)) + } + // If FAILED_LOGIN_ATTEMPTS and PASSWORD_LOCK_TIME are both specified to 0, a string of 0 length is generated. + // When inserting the attempts into json, an error occurs. This requires special handling. + if PasswordLocking != "" { + userAttributes = append(userAttributes, PasswordLocking) + } + userAttributesStr := fmt.Sprintf("{%s}", strings.Join(userAttributes, ",")) + tokenIssuer := "" for _, authTokenOption := range s.AuthTokenOrTLSOptions { switch authTokenOption.Type { @@ -845,13 +1133,26 @@ func (e *SimpleExec) executeCreateUser(ctx context.Context, s *ast.CreateUserStm } sql := new(strings.Builder) - sqlexec.MustFormatSQL(sql, `INSERT INTO %n.%n (Host, User, authentication_string, plugin, user_attributes, Account_locked, Token_issuer) VALUES `, mysql.SystemDB, mysql.UserTable) + sqlPasswordHistory := new(strings.Builder) + passwordInit := true + // Get changed user password reuse info. + savePasswdHistory := whetherSavePasswordHistory(plOptions) + sqlTemplate := "INSERT INTO %n.%n (Host, User, authentication_string, plugin, user_attributes, Account_locked, Token_issuer, Password_expired, Password_lifetime, Password_reuse_time, Password_reuse_history) VALUES " + valueTemplate := "(%?, %?, %?, %?, %?, %?, %?, %?, %?" + + sqlexec.MustFormatSQL(sql, sqlTemplate, mysql.SystemDB, mysql.UserTable) + if savePasswdHistory { + sqlexec.MustFormatSQL(sqlPasswordHistory, `INSERT INTO %n.%n (Host, User, Password) VALUES `, mysql.SystemDB, mysql.PasswordHistoryTable) + } users := make([]*auth.UserIdentity, 0, len(s.Specs)) for _, spec := range s.Specs { if len(spec.User.Username) > auth.UserNameMaxLength { return ErrWrongStringLength.GenWithStackByArgs(spec.User.Username, "user name", auth.UserNameMaxLength) } + if len(spec.User.Username) == 0 && plOptions.passwordExpired == "Y" { + return ErrPasswordExpireAnonymousUser.GenWithStackByArgs() + } if len(spec.User.Hostname) > auth.HostNameMaxLength { return ErrWrongStringLength.GenWithStackByArgs(spec.User.Hostname, "host name", auth.HostNameMaxLength) } @@ -874,15 +1175,25 @@ func (e *SimpleExec) executeCreateUser(ctx context.Context, s *ast.CreateUserStm e.ctx.GetSessionVars().StmtCtx.AppendNote(err) continue } + authPlugin := mysql.AuthNativePassword + if spec.AuthOpt != nil && spec.AuthOpt.AuthPlugin != "" { + authPlugin = spec.AuthOpt.AuthPlugin + } + if e.isValidatePasswordEnabled() && !s.IsCreateRole { + if spec.AuthOpt == nil || !spec.AuthOpt.ByAuthString && spec.AuthOpt.HashString == "" { + return variable.ErrNotValidPassword.GenWithStackByArgs() + } + if e.authUsingCleartextPwd(spec.AuthOpt, authPlugin) { + if err := pwdValidator.ValidatePassword(e.ctx.GetSessionVars(), spec.AuthOpt.AuthString); err != nil { + return err + } + } + } pwd, ok := spec.EncodedPassword() if !ok { return errors.Trace(ErrPasswordFormat) } - authPlugin := mysql.AuthNativePassword - if spec.AuthOpt != nil && spec.AuthOpt.AuthPlugin != "" { - authPlugin = spec.AuthOpt.AuthPlugin - } switch authPlugin { case mysql.AuthNativePassword, mysql.AuthCachingSha2Password, mysql.AuthTiDBSM3Password, mysql.AuthSocket, mysql.AuthTiDBAuthToken: @@ -901,7 +1212,31 @@ func (e *SimpleExec) executeCreateUser(ctx context.Context, s *ast.CreateUserStm } hostName := strings.ToLower(spec.User.Hostname) - sqlexec.MustFormatSQL(sql, `(%?, %?, %?, %?, %?, %?, %?)`, hostName, spec.User.Username, pwd, authPlugin, userAttributes, lockAccount, recordTokenIssuer) + sqlexec.MustFormatSQL(sql, valueTemplate, hostName, spec.User.Username, pwd, authPlugin, userAttributesStr, plOptions.lockAccount, recordTokenIssuer, plOptions.passwordExpired, plOptions.passwordLifetime) + // add Password_reuse_time value. + if plOptions.passwordReuseIntervalChange && (plOptions.passwordReuseInterval != notSpecified) { + sqlexec.MustFormatSQL(sql, `, %?`, plOptions.passwordReuseInterval) + } else { + sqlexec.MustFormatSQL(sql, `, %?`, nil) + } + // add Password_reuse_history value. + if plOptions.passwordHistoryChange && (plOptions.passwordHistory != notSpecified) { + sqlexec.MustFormatSQL(sql, `, %?`, plOptions.passwordHistory) + } else { + sqlexec.MustFormatSQL(sql, `, %?`, nil) + } + sqlexec.MustFormatSQL(sql, `)`) + // The empty password does not count in the password history and is subject to reuse at any time. + // AuthTiDBAuthToken is the token login method on the cloud, + // and the Password Reuse Policy does not take effect. + if savePasswdHistory && len(pwd) != 0 && !strings.EqualFold(authPlugin, mysql.AuthTiDBAuthToken) { + if !passwordInit { + sqlexec.MustFormatSQL(sqlPasswordHistory, ",") + } else { + passwordInit = false + } + sqlexec.MustFormatSQL(sqlPasswordHistory, `( %?, %?, %?)`, hostName, spec.User.Username, pwd) + } users = append(users, spec.User) } if len(users) == 0 { @@ -920,11 +1255,23 @@ func (e *SimpleExec) executeCreateUser(ctx context.Context, s *ast.CreateUserStm } _, err = sqlExecutor.ExecuteInternal(internalCtx, sql.String()) if err != nil { + logutil.BgLogger().Warn("Fail to create user", zap.String("sql", sql.String())) if _, rollbackErr := sqlExecutor.ExecuteInternal(internalCtx, "rollback"); rollbackErr != nil { return rollbackErr } return err } + + if savePasswdHistory && !passwordInit { + _, err = sqlExecutor.ExecuteInternal(internalCtx, sqlPasswordHistory.String()) + if err != nil { + if _, rollbackErr := sqlExecutor.ExecuteInternal(internalCtx, "rollback"); rollbackErr != nil { + return errors.Trace(rollbackErr) + } + return errors.Trace(err) + } + } + if len(privData) != 0 { sql.Reset() sqlexec.MustFormatSQL(sql, "INSERT IGNORE INTO %n.%n (Host, User, Priv) VALUES ", mysql.SystemDB, mysql.GlobalPrivTable) @@ -948,7 +1295,377 @@ func (e *SimpleExec) executeCreateUser(ctx context.Context, s *ast.CreateUserStm return domain.GetDomain(e.ctx).NotifyUpdatePrivilege() } +func getUserPasswordLimit(ctx context.Context, sqlExecutor sqlexec.SQLExecutor, name string, host string, plOptions *passwordOrLockOptionsInfo) (pRI *passwordReuseInfo, err error) { + res := &passwordReuseInfo{notSpecified, notSpecified} + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, `SELECT Password_reuse_history,Password_reuse_time FROM %n.%n WHERE User=%? AND Host=%?;`, + mysql.SystemDB, mysql.UserTable, name, strings.ToLower(host)) + // Query the specified user password reuse rules. + recordSet, err := sqlExecutor.ExecuteInternal(ctx, sql.String()) + if err != nil { + return nil, err + } + defer func() { + if closeErr := recordSet.Close(); closeErr != nil { + err = closeErr + } + }() + rows, err := sqlexec.DrainRecordSet(ctx, recordSet, 3) + if err != nil { + return nil, err + } + for _, row := range rows { + if !row.IsNull(0) { + res.passwordHistory = int64(row.GetUint64(0)) + } else { + res.passwordHistory = variable.PasswordHistory.Load() + } + if !row.IsNull(1) { + res.passwordReuseInterval = int64(row.GetUint64(1)) + } else { + res.passwordReuseInterval = variable.PasswordReuseInterval.Load() + } + } + if plOptions.passwordHistoryChange { + // If the user specifies a default, the global variable needs to be re-read. + if plOptions.passwordHistory != notSpecified { + res.passwordHistory = plOptions.passwordHistory + } else { + res.passwordHistory = variable.PasswordHistory.Load() + } + } + if plOptions.passwordReuseIntervalChange { + // If the user specifies a default, the global variable needs to be re-read. + if plOptions.passwordReuseInterval != notSpecified { + res.passwordReuseInterval = plOptions.passwordReuseInterval + } else { + res.passwordReuseInterval = variable.PasswordReuseInterval.Load() + } + } + return res, nil +} + +// getValidTime get the boundary of password valid time. +func getValidTime(sctx sessionctx.Context, passwordReuse *passwordReuseInfo) string { + nowTime := time.Now().In(sctx.GetSessionVars().TimeZone) + nowTimeS := nowTime.Unix() + beforeTimeS := nowTimeS - passwordReuse.passwordReuseInterval*24*int64(time.Hour/time.Second) + if beforeTimeS < 0 { + beforeTimeS = 0 + } + return time.Unix(beforeTimeS, 0).Format("2006-01-02 15:04:05.999999999") +} + +// deleteHistoricalData delete useless password history. +// The deleted password must meet the following conditions at the same time. +// 1. Exceeded the maximum number of saves. +// 2. The password has exceeded the prohibition time. +func deleteHistoricalData(ctx context.Context, sqlExecutor sqlexec.SQLExecutor, userDetail *userInfo, maxDelRows int64, passwordReuse *passwordReuseInfo, sctx sessionctx.Context) error { + //never times out or no row need delete. + if (passwordReuse.passwordReuseInterval > math.MaxInt32) || maxDelRows == 0 { + return nil + } + sql := new(strings.Builder) + // no prohibition time. + if passwordReuse.passwordReuseInterval == 0 { + deleteTemplate := `DELETE from %n.%n WHERE User= %? AND Host= %? order by Password_timestamp ASC LIMIT ` + deleteTemplate = deleteTemplate + strconv.FormatInt(maxDelRows, 10) + sqlexec.MustFormatSQL(sql, deleteTemplate, mysql.SystemDB, mysql.PasswordHistoryTable, + userDetail.user, strings.ToLower(userDetail.host)) + _, err := sqlExecutor.ExecuteInternal(ctx, sql.String()) + if err != nil { + return err + } + } else { + beforeDate := getValidTime(sctx, passwordReuse) + // Deletion must satisfy 1. Exceed the prohibition time 2. Exceed the maximum number of saved records. + deleteTemplate := `DELETE from %n.%n WHERE User= %? AND Host= %? AND Password_timestamp < %? order by Password_timestamp ASC LIMIT ` + deleteTemplate = deleteTemplate + strconv.FormatInt(maxDelRows, 10) + sql.Reset() + sqlexec.MustFormatSQL(sql, deleteTemplate, mysql.SystemDB, mysql.PasswordHistoryTable, + userDetail.user, strings.ToLower(userDetail.host), beforeDate) + _, err := sqlExecutor.ExecuteInternal(ctx, sql.String()) + if err != nil { + return err + } + } + return nil +} + +func addHistoricalData(ctx context.Context, sqlExecutor sqlexec.SQLExecutor, userDetail *userInfo, passwordReuse *passwordReuseInfo) error { + if passwordReuse.passwordHistory <= 0 && passwordReuse.passwordReuseInterval <= 0 { + return nil + } + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, `INSERT INTO %n.%n (Host, User, Password) VALUES (%?, %?, %?) `, mysql.SystemDB, mysql.PasswordHistoryTable, strings.ToLower(userDetail.host), userDetail.user, userDetail.pwd) + _, err := sqlExecutor.ExecuteInternal(ctx, sql.String()) + if err != nil { + return errors.Trace(err) + } + return nil +} + +// checkPasswordsMatch used to compare whether the password encrypted with mysql.AuthCachingSha2Password or mysql.AuthTiDBSM3Password is repeated. +func checkPasswordsMatch(rows []chunk.Row, oldPwd, authPlugin string) (bool, error) { + for _, row := range rows { + if !row.IsNull(0) { + pwd := row.GetString(0) + authok, err := auth.CheckHashingPassword([]byte(pwd), oldPwd, authPlugin) + if err != nil { + logutil.BgLogger().Error("Failed to check caching_sha2_password", zap.Error(err)) + return false, err + } + if authok { + return false, nil + } + } + } + return true, nil +} + +func getUserPasswordNum(ctx context.Context, sqlExecutor sqlexec.SQLExecutor, userDetail *userInfo) (deleteNum int64, err error) { + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, `SELECT count(*) FROM %n.%n WHERE User=%? AND Host=%?;`, mysql.SystemDB, mysql.PasswordHistoryTable, userDetail.user, strings.ToLower(userDetail.host)) + recordSet, err := sqlExecutor.ExecuteInternal(ctx, sql.String()) + if err != nil { + return 0, err + } + defer func() { + if closeErr := recordSet.Close(); closeErr != nil { + err = closeErr + } + }() + rows, err := sqlexec.DrainRecordSet(ctx, recordSet, 3) + if err != nil { + return 0, err + } + if len(rows) != 1 { + err := fmt.Errorf("`%s`@`%s` is not unique, please confirm the mysql.password_history table structure", userDetail.user, strings.ToLower(userDetail.host)) + return 0, err + } + + return rows[0].GetInt64(0), nil +} + +func fullRecordCheck(ctx context.Context, sqlExecutor sqlexec.SQLExecutor, userDetail *userInfo, authPlugin string) (canUse bool, err error) { + switch authPlugin { + case mysql.AuthNativePassword, "": + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, `SELECT count(*) FROM %n.%n WHERE User= %? AND Host= %? AND Password = %?;`, mysql.SystemDB, mysql.PasswordHistoryTable, userDetail.user, strings.ToLower(userDetail.host), userDetail.pwd) + recordSet, err := sqlExecutor.ExecuteInternal(ctx, sql.String()) + if err != nil { + return false, err + } + defer func() { + if closeErr := recordSet.Close(); closeErr != nil { + err = closeErr + } + }() + rows, err := sqlexec.DrainRecordSet(ctx, recordSet, 3) + if err != nil { + return false, err + } + if rows[0].GetInt64(0) == 0 { + return true, nil + } + return false, nil + case mysql.AuthCachingSha2Password, mysql.AuthTiDBSM3Password: + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, `SELECT Password FROM %n.%n WHERE User= %? AND Host= %? ;`, mysql.SystemDB, mysql.PasswordHistoryTable, userDetail.user, strings.ToLower(userDetail.host)) + recordSet, err := sqlExecutor.ExecuteInternal(ctx, sql.String()) + if err != nil { + return false, err + } + defer func() { + if closeErr := recordSet.Close(); closeErr != nil { + err = closeErr + } + }() + rows, err := sqlexec.DrainRecordSet(ctx, recordSet, variable.DefMaxChunkSize) + if err != nil { + return false, err + } + return checkPasswordsMatch(rows, userDetail.authString, authPlugin) + default: + return false, ErrPluginIsNotLoaded.GenWithStackByArgs(authPlugin) + } +} + +func checkPasswordHistoryRule(ctx context.Context, sqlExecutor sqlexec.SQLExecutor, userDetail *userInfo, passwordReuse *passwordReuseInfo, authPlugin string) (canUse bool, err error) { + switch authPlugin { + case mysql.AuthNativePassword, "": + sql := new(strings.Builder) + // Exceeded the maximum number of saved items, only check the ones within the limit. + checkRows := `SELECT count(*) FROM (SELECT Password FROM %n.%n WHERE User=%? AND Host=%? ORDER BY Password_timestamp DESC LIMIT ` + checkRows = checkRows + strconv.FormatInt(passwordReuse.passwordHistory, 10) + checkRows = checkRows + ` ) as t where t.Password = %? ` + sqlexec.MustFormatSQL(sql, checkRows, mysql.SystemDB, mysql.PasswordHistoryTable, userDetail.user, strings.ToLower(userDetail.host), userDetail.pwd) + recordSet, err := sqlExecutor.ExecuteInternal(ctx, sql.String()) + if err != nil { + return false, err + } + defer func() { + if closeErr := recordSet.Close(); closeErr != nil { + err = closeErr + } + }() + rows, err := sqlexec.DrainRecordSet(ctx, recordSet, 3) + if err != nil { + return false, err + } + if rows[0].GetInt64(0) != 0 { + return false, nil + } + return true, nil + case mysql.AuthCachingSha2Password, mysql.AuthTiDBSM3Password: + sql := new(strings.Builder) + checkRows := `SELECT Password FROM %n.%n WHERE User=%? AND Host=%? ORDER BY Password_timestamp DESC LIMIT ` + checkRows = checkRows + strconv.FormatInt(passwordReuse.passwordHistory, 10) + sqlexec.MustFormatSQL(sql, checkRows, mysql.SystemDB, mysql.PasswordHistoryTable, userDetail.user, strings.ToLower(userDetail.host)) + recordSet, err := sqlExecutor.ExecuteInternal(ctx, sql.String()) + if err != nil { + return false, err + } + defer func() { + if closeErr := recordSet.Close(); closeErr != nil { + err = closeErr + } + }() + rows, err := sqlexec.DrainRecordSet(ctx, recordSet, variable.DefMaxChunkSize) + if err != nil { + return false, err + } + return checkPasswordsMatch(rows, userDetail.authString, authPlugin) + default: + return false, ErrPluginIsNotLoaded.GenWithStackByArgs(authPlugin) + } +} + +func checkPasswordTimeRule(ctx context.Context, sqlExecutor sqlexec.SQLExecutor, userDetail *userInfo, passwordReuse *passwordReuseInfo, + sctx sessionctx.Context, authPlugin string) (canUse bool, err error) { + beforeDate := getValidTime(sctx, passwordReuse) + switch authPlugin { + case mysql.AuthNativePassword, "": + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, `SELECT count(*) FROM %n.%n WHERE User=%? AND Host=%? AND Password = %? AND Password_timestamp >= %?;`, + mysql.SystemDB, mysql.PasswordHistoryTable, userDetail.user, strings.ToLower(userDetail.host), userDetail.pwd, beforeDate) + recordSet, err := sqlExecutor.ExecuteInternal(ctx, sql.String()) + if err != nil { + return false, err + } + defer func() { + if closeErr := recordSet.Close(); closeErr != nil { + err = closeErr + } + }() + rows, err := sqlexec.DrainRecordSet(ctx, recordSet, 3) + if err != nil { + return false, err + } + if rows[0].GetInt64(0) == 0 { + return true, nil + } + case mysql.AuthCachingSha2Password, mysql.AuthTiDBSM3Password: + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, `SELECT Password FROM %n.%n WHERE User=%? AND Host=%? AND Password_timestamp >= %?;`, mysql.SystemDB, mysql.PasswordHistoryTable, userDetail.user, strings.ToLower(userDetail.host), beforeDate) + recordSet, err := sqlExecutor.ExecuteInternal(ctx, sql.String()) + if err != nil { + return false, err + } + defer func() { + if closeErr := recordSet.Close(); closeErr != nil { + err = closeErr + } + }() + rows, err := sqlexec.DrainRecordSet(ctx, recordSet, variable.DefMaxChunkSize) + if err != nil { + return false, err + } + return checkPasswordsMatch(rows, userDetail.authString, authPlugin) + default: + return false, ErrPluginIsNotLoaded.GenWithStackByArgs(authPlugin) + } + return false, nil +} + +func passwordVerification(ctx context.Context, sqlExecutor sqlexec.SQLExecutor, userDetail *userInfo, passwordReuse *passwordReuseInfo, sctx sessionctx.Context, authPlugin string) (bool, int64, error) { + passwordNum, err := getUserPasswordNum(ctx, sqlExecutor, userDetail) + if err != nil { + return false, 0, err + } + + // the maximum number of records that can be deleted. + canDeleteNum := passwordNum - passwordReuse.passwordHistory + 1 + if canDeleteNum < 0 { + canDeleteNum = 0 + } + + if passwordReuse.passwordHistory <= 0 && passwordReuse.passwordReuseInterval <= 0 { + return true, canDeleteNum, nil + } + + // The maximum number of saves has not been exceeded. + // There are too many retention days, and it is impossible to time out in one's lifetime. + if (passwordNum <= passwordReuse.passwordHistory) || (passwordReuse.passwordReuseInterval > math.MaxInt32) { + passChecking, err := fullRecordCheck(ctx, sqlExecutor, userDetail, authPlugin) + return passChecking, canDeleteNum, err + } + + if passwordReuse.passwordHistory > 0 { + passChecking, err := checkPasswordHistoryRule(ctx, sqlExecutor, userDetail, passwordReuse, authPlugin) + if err != nil || !passChecking { + return false, 0, err + } + } + if passwordReuse.passwordReuseInterval > 0 { + passChecking, err := checkPasswordTimeRule(ctx, sqlExecutor, userDetail, passwordReuse, sctx, authPlugin) + if err != nil || !passChecking { + return false, 0, err + } + } + return true, canDeleteNum, nil +} + +func checkPasswordReusePolicy(ctx context.Context, sqlExecutor sqlexec.SQLExecutor, userDetail *userInfo, sctx sessionctx.Context, authPlugin string) error { + if strings.EqualFold(authPlugin, mysql.AuthTiDBAuthToken) { + // AuthTiDBAuthToken is the token login method on the cloud, + // and the Password Reuse Policy does not take effect. + return nil + } + // read password reuse info from mysql.user and global variables. + passwdReuseInfo, err := getUserPasswordLimit(ctx, sqlExecutor, userDetail.user, userDetail.host, userDetail.pLI) + if err != nil { + return err + } + // check whether password can be used. + res, maxDelNum, err := passwordVerification(ctx, sqlExecutor, userDetail, passwdReuseInfo, sctx, authPlugin) + if err != nil { + return err + } + if !res { + return ErrExistsInHistoryPassword.GenWithStackByArgs(userDetail.user, userDetail.host) + } + err = deleteHistoricalData(ctx, sqlExecutor, userDetail, maxDelNum, passwdReuseInfo, sctx) + if err != nil { + return err + } + // insert password history. + err = addHistoricalData(ctx, sqlExecutor, userDetail, passwdReuseInfo) + if err != nil { + return err + } + return nil +} + func (e *SimpleExec) executeAlterUser(ctx context.Context, s *ast.AlterUserStmt) error { + disableSandBoxMode := false + var err error + if e.ctx.InSandBoxMode() { + if err = e.checkSandboxMode(s.Specs); err != nil { + return err + } + disableSandBoxMode = true + } ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnPrivilege) if s.CurrentAuth != nil { user := e.ctx.GetSessionVars().User @@ -965,19 +1682,20 @@ func (e *SimpleExec) executeAlterUser(ctx context.Context, s *ast.AlterUserStmt) s.Specs = []*ast.UserSpec{spec} } - lockAccount := "" - if len(s.PasswordOrLockOptions) > 0 { - // If "ACCOUNT LOCK" or "ACCOUNT UNLOCK" appears many times, - // the last declaration takes effect. - for i := len(s.PasswordOrLockOptions) - 1; i >= 0; i-- { - if s.PasswordOrLockOptions[i].Type == ast.Lock { - lockAccount = "Y" - break - } else if s.PasswordOrLockOptions[i].Type == ast.Unlock { - lockAccount = "N" - break - } - } + plOptions := passwordOrLockOptionsInfo{ + lockAccount: "", + passwordExpired: "", + passwordLifetime: notSpecified, + passwordHistory: notSpecified, + passwordReuseInterval: notSpecified, + failedLoginAttemptsChange: false, + passwordLockTimeChange: false, + passwordHistoryChange: false, + passwordReuseIntervalChange: false, + } + err = plOptions.loadOptions(s.PasswordOrLockOptions) + if err != nil { + return err } privData, err := tlsOption2GlobalPriv(s.AuthTokenOrTLSOptions) @@ -986,6 +1704,7 @@ func (e *SimpleExec) executeAlterUser(ctx context.Context, s *ast.AlterUserStmt) } failedUsers := make([]string, 0, len(s.Specs)) + needRollback := false checker := privilege.GetPrivilegeManager(e.ctx) if checker == nil { return errors.New("could not load privilege checker") @@ -1003,6 +1722,24 @@ func (e *SimpleExec) executeAlterUser(ctx context.Context, s *ast.AlterUserStmt) } } + sysSession, err := e.getSysSession() + defer clearSysSession(ctx, sysSession) + if err != nil { + return err + } + sqlExecutor := sysSession.(sqlexec.SQLExecutor) + // session isolation level changed to READ-COMMITTED. + // When tidb is at the RR isolation level, executing `begin` will obtain a consistent state. + // When operating the same user concurrently, it may happen that historical versions are read. + // In order to avoid this risk, change the isolation level to RC. + _, err = sqlExecutor.ExecuteInternal(ctx, "set tx_isolation = 'READ-COMMITTED'") + if err != nil { + return err + } + if _, err := sqlExecutor.ExecuteInternal(ctx, "BEGIN PESSIMISTIC"); err != nil { + return err + } + for _, spec := range s.Specs { user := e.ctx.GetSessionVars().User if spec.User.CurrentUser || ((user != nil) && (user.Username == spec.User.Username) && (user.AuthHostname == spec.User.Hostname)) { @@ -1036,7 +1773,7 @@ func (e *SimpleExec) executeAlterUser(ctx context.Context, s *ast.AlterUserStmt) } } - exists, err := userExists(ctx, e.ctx, spec.User.Username, spec.User.Hostname) + exists, err := userExistsInternal(ctx, sqlExecutor, spec.User.Username, spec.User.Hostname) if err != nil { return err } @@ -1057,25 +1794,23 @@ func (e *SimpleExec) executeAlterUser(ctx context.Context, s *ast.AlterUserStmt) RequireAuthTokenOptions ) authTokenOptionHandler := NoNeedAuthTokenOptions - if currentAuthPlugin, err := e.userAuthPlugin(spec.User.Username, spec.User.Hostname); err != nil { + currentAuthPlugin, err := privilege.GetPrivilegeManager(e.ctx).GetAuthPlugin(spec.User.Username, spec.User.Hostname) + if err != nil { return err - } else if currentAuthPlugin == mysql.AuthTiDBAuthToken { + } + if currentAuthPlugin == mysql.AuthTiDBAuthToken { authTokenOptionHandler = OptionalAuthTokenOptions } - exec := e.ctx.(sqlexec.RestrictedSQLExecutor) type alterField struct { expr string - value string + value any } var fields []alterField if spec.AuthOpt != nil { + fields = append(fields, alterField{"password_last_changed=current_timestamp()", nil}) if spec.AuthOpt.AuthPlugin == "" { - authplugin, err := e.userAuthPlugin(spec.User.Username, spec.User.Hostname) - if err != nil { - return err - } - spec.AuthOpt.AuthPlugin = authplugin + spec.AuthOpt.AuthPlugin = currentAuthPlugin } switch spec.AuthOpt.AuthPlugin { case mysql.AuthNativePassword, mysql.AuthCachingSha2Password, mysql.AuthTiDBSM3Password, mysql.AuthSocket, "": @@ -1087,28 +1822,122 @@ func (e *SimpleExec) executeAlterUser(ctx context.Context, s *ast.AlterUserStmt) default: return ErrPluginIsNotLoaded.GenWithStackByArgs(spec.AuthOpt.AuthPlugin) } + // changing the auth method prunes history. + if spec.AuthOpt.AuthPlugin != currentAuthPlugin { + // delete password history from mysql.password_history. + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, `DELETE FROM %n.%n WHERE Host = %? and User = %?;`, mysql.SystemDB, mysql.PasswordHistoryTable, spec.User.Hostname, spec.User.Username) + if _, err := sqlExecutor.ExecuteInternal(ctx, sql.String()); err != nil { + failedUsers = append(failedUsers, spec.User.String()) + needRollback = true + break + } + } + if e.isValidatePasswordEnabled() && e.authUsingCleartextPwd(spec.AuthOpt, spec.AuthOpt.AuthPlugin) { + if err := pwdValidator.ValidatePassword(e.ctx.GetSessionVars(), spec.AuthOpt.AuthString); err != nil { + return err + } + } pwd, ok := spec.EncodedPassword() if !ok { return errors.Trace(ErrPasswordFormat) } - fields = append(fields, - alterField{"authentication_string=%?", pwd}, - alterField{"plugin=%?", spec.AuthOpt.AuthPlugin}, - ) + // for Support Password Reuse Policy. + // The empty password does not count in the password history and is subject to reuse at any time. + // https://dev.mysql.com/doc/refman/8.0/en/password-management.html#password-reuse-policy + if len(pwd) != 0 { + userDetail := &userInfo{ + host: spec.User.Hostname, + user: spec.User.Username, + pLI: &plOptions, + pwd: pwd, + authString: spec.AuthOpt.AuthString, + } + err := checkPasswordReusePolicy(ctx, sqlExecutor, userDetail, e.ctx, spec.AuthOpt.AuthPlugin) + if err != nil { + return err + } + } + fields = append(fields, alterField{"authentication_string=%?", pwd}) + if spec.AuthOpt.AuthPlugin != "" { + fields = append(fields, alterField{"plugin=%?", spec.AuthOpt.AuthPlugin}) + } + if spec.AuthOpt.ByAuthString || spec.AuthOpt.ByHashString { + if plOptions.passwordExpired == "" { + plOptions.passwordExpired = "N" + } + } + } + + if len(plOptions.lockAccount) != 0 { + fields = append(fields, alterField{"account_locked=%?", plOptions.lockAccount}) + } + + // support alter Password_reuse_history and Password_reuse_time. + if plOptions.passwordHistoryChange { + if plOptions.passwordHistory == notSpecified { + fields = append(fields, alterField{"Password_reuse_history = NULL ", ""}) + } else { + fields = append(fields, alterField{"Password_reuse_history = %? ", strconv.FormatInt(plOptions.passwordHistory, 10)}) + } + } + if plOptions.passwordReuseIntervalChange { + if plOptions.passwordReuseInterval == notSpecified { + fields = append(fields, alterField{"Password_reuse_time = NULL ", ""}) + } else { + fields = append(fields, alterField{"Password_reuse_time = %? ", strconv.FormatInt(plOptions.passwordReuseInterval, 10)}) + } } - if len(lockAccount) != 0 { - fields = append(fields, alterField{"account_locked=%?", lockAccount}) + passwordLockingInfo, err := readPasswordLockingInfo(ctx, sqlExecutor, spec.User.Username, spec.User.Hostname, &plOptions) + if err != nil { + return err } + passwordLockingStr := alterUserFailedLoginJSON(passwordLockingInfo, plOptions.lockAccount) + if len(plOptions.passwordExpired) != 0 { + if len(spec.User.Username) == 0 && plOptions.passwordExpired == "Y" { + return ErrPasswordExpireAnonymousUser.GenWithStackByArgs() + } + fields = append(fields, alterField{"password_expired=%?", plOptions.passwordExpired}) + } + if plOptions.passwordLifetime != notSpecified { + fields = append(fields, alterField{"password_lifetime=%?", plOptions.passwordLifetime}) + } + + var newAttributes []string if s.CommentOrAttributeOption != nil { - newAttributesStr := "" if s.CommentOrAttributeOption.Type == ast.UserCommentType { - newAttributesStr = fmt.Sprintf(`{"metadata": {"comment": "%s"}}`, s.CommentOrAttributeOption.Value) + newAttributes = append(newAttributes, fmt.Sprintf(`"metadata": {"comment": "%s"}`, s.CommentOrAttributeOption.Value)) } else { - newAttributesStr = fmt.Sprintf(`{"metadata": %s}`, s.CommentOrAttributeOption.Value) + newAttributes = append(newAttributes, fmt.Sprintf(`"metadata": %s`, s.CommentOrAttributeOption.Value)) } - fields = append(fields, alterField{"user_attributes=json_merge_patch(user_attributes, %?)", newAttributesStr}) + } + if s.ResourceGroupNameOption != nil { + if !variable.EnableResourceControl.Load() { + return infoschema.ErrResourceGroupSupportDisabled + } + + // check if specified resource group exists + resourceGroupName := strings.ToLower(s.ResourceGroupNameOption.Value) + if resourceGroupName != "default" && s.ResourceGroupNameOption.Value != "" { + _, exists := e.is.ResourceGroupByName(model.NewCIStr(resourceGroupName)) + if !exists { + return infoschema.ErrResourceGroupNotExists.GenWithStackByArgs(resourceGroupName) + } + } + + newAttributes = append(newAttributes, fmt.Sprintf(`"resource_group": "%s"`, resourceGroupName)) + } + if passwordLockingStr != "" { + newAttributes = append(newAttributes, passwordLockingStr) + } + if length := len(newAttributes); length > 0 { + if length > 1 || passwordLockingStr == "" { + passwordLockingInfo.containsNoOthers = false + } + newAttributesStr := fmt.Sprintf("{%s}", strings.Join(newAttributes, ",")) + fields = append(fields, alterField{"user_attributes=json_merge_patch(coalesce(user_attributes, '{}'), %?)", newAttributesStr}) } switch authTokenOptionHandler { @@ -1144,31 +1973,35 @@ func (e *SimpleExec) executeAlterUser(ctx context.Context, s *ast.AlterUserStmt) } } sqlexec.MustFormatSQL(sql, " WHERE Host=%? and User=%?;", spec.User.Hostname, spec.User.Username) - _, _, err := exec.ExecRestrictedSQL(ctx, nil, sql.String()) + _, err := sqlExecutor.ExecuteInternal(ctx, sql.String()) if err != nil { failedUsers = append(failedUsers, spec.User.String()) + needRollback = true continue } } + // Remove useless Password_locking from User_attributes. + err = deletePasswordLockingAttribute(ctx, sqlExecutor, spec.User.Username, spec.User.Hostname, passwordLockingInfo) + if err != nil { + failedUsers = append(failedUsers, spec.User.String()) + needRollback = true + continue + } + if len(privData) > 0 { - _, _, err := exec.ExecRestrictedSQL(ctx, nil, "INSERT INTO %n.%n (Host, User, Priv) VALUES (%?,%?,%?) ON DUPLICATE KEY UPDATE Priv = values(Priv)", mysql.SystemDB, mysql.GlobalPrivTable, spec.User.Hostname, spec.User.Username, string(hack.String(privData))) + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, "INSERT INTO %n.%n (Host, User, Priv) VALUES (%?,%?,%?) ON DUPLICATE KEY UPDATE Priv = values(Priv)", mysql.SystemDB, mysql.GlobalPrivTable, spec.User.Hostname, spec.User.Username, string(hack.String(privData))) + _, err := sqlExecutor.ExecuteInternal(ctx, sql.String()) if err != nil { failedUsers = append(failedUsers, spec.User.String()) + needRollback = true } } } if len(failedUsers) > 0 { - // Commit the transaction even if we returns error - txn, err := e.ctx.Txn(true) - if err != nil { - return err - } - err = txn.Commit(tikvutil.SetSessionID(context.TODO(), e.ctx.GetSessionVars().ConnectionID)) - if err != nil { - return err - } - if !s.IfExists { + // Compatible with MySQL 8.0, `ALTER USER` realizes atomic operation. + if !s.IfExists || needRollback { return ErrCannotUser.GenWithStackByArgs("ALTER USER", strings.Join(failedUsers, ",")) } for _, user := range failedUsers { @@ -1176,7 +2009,30 @@ func (e *SimpleExec) executeAlterUser(ctx context.Context, s *ast.AlterUserStmt) e.ctx.GetSessionVars().StmtCtx.AppendNote(err) } } - return domain.GetDomain(e.ctx).NotifyUpdatePrivilege() + if _, err := sqlExecutor.ExecuteInternal(ctx, "commit"); err != nil { + return err + } + if err = domain.GetDomain(e.ctx).NotifyUpdatePrivilege(); err != nil { + return err + } + if disableSandBoxMode { + e.ctx.DisableSandBoxMode() + } + return nil +} + +func (e *SimpleExec) checkSandboxMode(specs []*ast.UserSpec) error { + for _, spec := range specs { + if spec.AuthOpt == nil { + continue + } + if spec.AuthOpt.ByAuthString || spec.AuthOpt.ByHashString { + if spec.User.CurrentUser || e.ctx.GetSessionVars().User.Username == spec.User.Username { + return nil + } + } + } + return errMustChangePassword.GenWithStackByArgs() } func (e *SimpleExec) executeGrantRole(ctx context.Context, s *ast.GrantRoleStmt) error { @@ -1246,10 +2102,9 @@ func (e *SimpleExec) executeRenameUser(s *ast.RenameUserStmt) error { } sqlExecutor := sysSession.(sqlexec.SQLExecutor) - if _, err := sqlExecutor.ExecuteInternal(ctx, "begin"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(ctx, "BEGIN PESSIMISTIC"); err != nil { return err } - for _, userToUser := range s.UserToUsers { oldUser, newUser := userToUser.OldUser, userToUser.NewUser if len(newUser.Username) > auth.UserNameMaxLength { @@ -1322,6 +2177,12 @@ func (e *SimpleExec) executeRenameUser(s *ast.RenameUserStmt) error { break } + // rename passwordhistory from PasswordHistoryTable. + if err = renameUserHostInSystemTable(sqlExecutor, mysql.PasswordHistoryTable, "USER", "HOST", userToUser); err != nil { + failedUser = oldUser.String() + " TO " + newUser.String() + " " + mysql.PasswordHistoryTable + " error" + break + } + // rename relationship from mysql.global_grants // TODO: add global_grants into the parser // TODO: need update columns_priv once we implement columns_priv functionality. @@ -1426,6 +2287,14 @@ func (e *SimpleExec) executeDropUser(ctx context.Context, s *ast.DropUserStmt) e break } + // delete password history from mysql.password_history. + sql.Reset() + sqlexec.MustFormatSQL(sql, `DELETE FROM %n.%n WHERE Host = %? and User = %?;`, mysql.SystemDB, mysql.PasswordHistoryTable, strings.ToLower(user.Hostname), user.Username) + if _, err = sqlExecutor.ExecuteInternal(internalCtx, sql.String()); err != nil { + failedUsers = append(failedUsers, user.String()) + break + } + // delete privileges from mysql.global_priv sql.Reset() sqlexec.MustFormatSQL(sql, `DELETE FROM %n.%n WHERE Host = %? and User = %?;`, mysql.SystemDB, mysql.GlobalPrivTable, user.Hostname, user.Username) @@ -1546,7 +2415,7 @@ func userExists(ctx context.Context, sctx sessionctx.Context, name string, host // use the same internal executor to read within the same transaction, otherwise same as userExists func userExistsInternal(ctx context.Context, sqlExecutor sqlexec.SQLExecutor, name string, host string) (bool, error) { sql := new(strings.Builder) - sqlexec.MustFormatSQL(sql, `SELECT * FROM %n.%n WHERE User=%? AND Host=%?;`, mysql.SystemDB, mysql.UserTable, name, strings.ToLower(host)) + sqlexec.MustFormatSQL(sql, `SELECT * FROM %n.%n WHERE User=%? AND Host=%? FOR UPDATE;`, mysql.SystemDB, mysql.UserTable, name, strings.ToLower(host)) recordSet, err := sqlExecutor.ExecuteInternal(ctx, sql.String()) if err != nil { return false, err @@ -1564,18 +2433,29 @@ func userExistsInternal(ctx context.Context, sqlExecutor sqlexec.SQLExecutor, na return rows > 0, err } -func (e *SimpleExec) userAuthPlugin(name string, host string) (string, error) { - pm := privilege.GetPrivilegeManager(e.ctx) - authplugin, err := pm.GetAuthPlugin(name, host) +func (e *SimpleExec) executeSetPwd(ctx context.Context, s *ast.SetPwdStmt) error { + ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnPrivilege) + sysSession, err := e.getSysSession() + defer clearSysSession(ctx, sysSession) if err != nil { - return "", err + return err + } + + sqlExecutor := sysSession.(sqlexec.SQLExecutor) + // session isolation level changed to READ-COMMITTED. + // When tidb is at the RR isolation level, executing `begin` will obtain a consistent state. + // When operating the same user concurrently, it may happen that historical versions are read. + // In order to avoid this risk, change the isolation level to RC. + _, err = sqlExecutor.ExecuteInternal(ctx, "set tx_isolation = 'READ-COMMITTED'") + if err != nil { + return err + } + if _, err := sqlExecutor.ExecuteInternal(ctx, "BEGIN PESSIMISTIC"); err != nil { + return err } - return authplugin, nil -} -func (e *SimpleExec) executeSetPwd(ctx context.Context, s *ast.SetPwdStmt) error { - ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnPrivilege) var u, h string + disableSandboxMode := false if s.User == nil || s.User.CurrentUser { if e.ctx.GetSessionVars().User == nil { return errors.New("Session error is empty") @@ -1591,18 +2471,31 @@ func (e *SimpleExec) executeSetPwd(ctx context.Context, s *ast.SetPwdStmt) error u = s.User.Username h = s.User.Hostname } - exists, err := userExists(ctx, e.ctx, u, h) + exists, err := userExistsInternal(ctx, sqlExecutor, u, h) if err != nil { return err } if !exists { return errors.Trace(ErrPasswordNoMatch) } + if e.ctx.InSandBoxMode() { + if s.User == nil || s.User.CurrentUser || + e.ctx.GetSessionVars().User.AuthUsername == u && e.ctx.GetSessionVars().User.AuthHostname == strings.ToLower(h) { + disableSandboxMode = true + } else { + return errMustChangePassword.GenWithStackByArgs() + } + } - authplugin, err := e.userAuthPlugin(u, h) + authplugin, err := privilege.GetPrivilegeManager(e.ctx).GetAuthPlugin(u, h) if err != nil { return err } + if e.isValidatePasswordEnabled() { + if err := pwdValidator.ValidatePassword(e.ctx.GetSessionVars(), s.Password); err != nil { + return err + } + } var pwd string switch authplugin { case mysql.AuthCachingSha2Password, mysql.AuthTiDBSM3Password: @@ -1614,13 +2507,47 @@ func (e *SimpleExec) executeSetPwd(ctx context.Context, s *ast.SetPwdStmt) error pwd = auth.EncodePassword(s.Password) } + // for Support Password Reuse Policy. + plOptions := &passwordOrLockOptionsInfo{ + lockAccount: "", + passwordHistory: notSpecified, + passwordReuseInterval: notSpecified, + passwordHistoryChange: false, + passwordReuseIntervalChange: false, + } + // The empty password does not count in the password history and is subject to reuse at any time. + // https://dev.mysql.com/doc/refman/8.0/en/password-management.html#password-reuse-policy + if len(pwd) != 0 { + userDetail := &userInfo{ + host: h, + user: u, + pLI: plOptions, + pwd: pwd, + authString: s.Password, + } + err := checkPasswordReusePolicy(ctx, sqlExecutor, userDetail, e.ctx, authplugin) + if err != nil { + return err + } + } // update mysql.user - exec := e.ctx.(sqlexec.RestrictedSQLExecutor) - _, _, err = exec.ExecRestrictedSQL(ctx, nil, `UPDATE %n.%n SET authentication_string=%? WHERE User=%? AND Host=%?;`, mysql.SystemDB, mysql.UserTable, pwd, u, strings.ToLower(h)) + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, `UPDATE %n.%n SET authentication_string=%?,password_expired='N',password_last_changed=current_timestamp() WHERE User=%? AND Host=%?;`, mysql.SystemDB, mysql.UserTable, pwd, u, strings.ToLower(h)) + _, err = sqlExecutor.ExecuteInternal(ctx, sql.String()) if err != nil { return err } - return domain.GetDomain(e.ctx).NotifyUpdatePrivilege() + if _, err := sqlExecutor.ExecuteInternal(ctx, "commit"); err != nil { + return err + } + err = domain.GetDomain(e.ctx).NotifyUpdatePrivilege() + if err != nil { + return err + } + if disableSandboxMode { + e.ctx.DisableSandBoxMode() + } + return nil } func (e *SimpleExec) executeKillStmt(ctx context.Context, s *ast.KillStmt) error { diff --git a/executor/simple_test.go b/executor/simple_test.go index 8b284fb9b42e5..0ededa68e2253 100644 --- a/executor/simple_test.go +++ b/executor/simple_test.go @@ -21,13 +21,13 @@ import ( "testing" "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/server" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/util" "github.com/stretchr/testify/require" - tikvutil "github.com/tikv/client-go/v2/util" ) func TestKillStmt(t *testing.T) { @@ -86,7 +86,7 @@ func TestKillStmt(t *testing.T) { func TestUserAttributes(t *testing.T) { store, _ := testkit.CreateMockStoreAndDomain(t) rootTK := testkit.NewTestKit(t, store) - ctx := context.WithValue(context.Background(), tikvutil.RequestSourceKey, tikvutil.RequestSource{RequestSourceInternal: true}) + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnPrivilege) // https://dev.mysql.com/doc/refman/8.0/en/create-user.html#create-user-comments-attributes rootTK.MustExec(`CREATE USER testuser COMMENT '1234'`) @@ -96,7 +96,7 @@ func TestUserAttributes(t *testing.T) { require.Error(t, err) rootTK.MustQuery(`SELECT user_attributes FROM mysql.user WHERE user = 'testuser'`).Check(testkit.Rows(`{"metadata": {"comment": "1234"}}`)) rootTK.MustQuery(`SELECT user_attributes FROM mysql.user WHERE user = 'testuser1'`).Check(testkit.Rows(`{"metadata": {"age": 19, "name": "Tom"}}`)) - rootTK.MustQuery(`SELECT user_attributes FROM mysql.user WHERE user = 'testuser2'`).Check(testkit.Rows(``)) + rootTK.MustQuery(`SELECT user_attributes FROM mysql.user WHERE user = 'testuser2'`).Check(testkit.Rows(`{}`)) rootTK.MustQueryWithContext(ctx, `SELECT attribute FROM information_schema.user_attributes WHERE user = 'testuser'`).Check(testkit.Rows(`{"comment": "1234"}`)) rootTK.MustQueryWithContext(ctx, `SELECT attribute FROM information_schema.user_attributes WHERE user = 'testuser1'`).Check(testkit.Rows(`{"age": 19, "name": "Tom"}`)) rootTK.MustQueryWithContext(ctx, `SELECT attribute->>"$.age" AS age, attribute->>"$.name" AS name FROM information_schema.user_attributes WHERE user = 'testuser1'`).Check(testkit.Rows(`19 Tom`)) @@ -105,7 +105,9 @@ func TestUserAttributes(t *testing.T) { // https://dev.mysql.com/doc/refman/8.0/en/alter-user.html#alter-user-comments-attributes rootTK.MustExec(`ALTER USER testuser1 ATTRIBUTE '{"age": 20, "sex": "male"}'`) rootTK.MustQueryWithContext(ctx, `SELECT attribute FROM information_schema.user_attributes WHERE user = 'testuser1'`).Check(testkit.Rows(`{"age": 20, "name": "Tom", "sex": "male"}`)) - rootTK.MustExec(`ALTER USER testuser1 ATTRIBUTE '{"sex": null}'`) + rootTK.MustExec(`ALTER USER testuser1 ATTRIBUTE '{"hobby": "soccer"}'`) + rootTK.MustQueryWithContext(ctx, `SELECT attribute FROM information_schema.user_attributes WHERE user = 'testuser1'`).Check(testkit.Rows(`{"age": 20, "hobby": "soccer", "name": "Tom", "sex": "male"}`)) + rootTK.MustExec(`ALTER USER testuser1 ATTRIBUTE '{"sex": null, "hobby": null}'`) rootTK.MustQueryWithContext(ctx, `SELECT attribute FROM information_schema.user_attributes WHERE user = 'testuser1'`).Check(testkit.Rows(`{"age": 20, "name": "Tom"}`)) rootTK.MustExec(`ALTER USER testuser1 COMMENT '5678'`) rootTK.MustQueryWithContext(ctx, `SELECT attribute FROM information_schema.user_attributes WHERE user = 'testuser1'`).Check(testkit.Rows(`{"age": 20, "comment": "5678", "name": "Tom"}`)) @@ -121,4 +123,13 @@ func TestUserAttributes(t *testing.T) { tk.MustQueryWithContext(ctx, `SELECT user, host, attribute FROM information_schema.user_attributes ORDER BY user`).Check( testkit.Rows("root % ", "testuser % {\"comment\": \"1234\"}", "testuser1 % {\"age\": 20, \"name\": \"Tom\"}", "testuser2 % ")) tk.MustGetErrCode(`SELECT user, host, user_attributes FROM mysql.user ORDER BY user`, mysql.ErrTableaccessDenied) + + // https://github.com/pingcap/tidb/issues/39207 + rootTK.MustExec("create user usr1@'%' identified by 'passord'") + rootTK.MustExec("alter user usr1 comment 'comment1'") + rootTK.MustQuery("select user_attributes from mysql.user where user = 'usr1'").Check(testkit.Rows(`{"metadata": {"comment": "comment1"}}`)) + rootTK.MustExec("set global tidb_enable_resource_control = 'on'") + rootTK.MustExec("CREATE RESOURCE GROUP rg1 ru_per_sec = 100") + rootTK.MustExec("alter user usr1 resource group rg1") + rootTK.MustQuery("select user_attributes from mysql.user where user = 'usr1'").Check(testkit.Rows(`{"metadata": {"comment": "comment1"}, "resource_group": "rg1"}`)) } diff --git a/executor/simpletest/BUILD.bazel b/executor/simpletest/BUILD.bazel index 0f8c010c0bc99..2da6aa029e3cd 100644 --- a/executor/simpletest/BUILD.bazel +++ b/executor/simpletest/BUILD.bazel @@ -5,6 +5,7 @@ go_test( timeout = "short", srcs = [ "main_test.go", + "password_management_test.go", "simple_test.go", ], flaky = True, @@ -12,17 +13,23 @@ go_test( shard_count = 30, deps = [ "//config", + "//domain", + "//errno", "//executor", + "//kv", "//parser/auth", "//parser/model", "//parser/mysql", "//parser/terror", "//planner/core", + "//privilege/privileges", "//session", "//sessionctx", + "//sessionctx/variable", "//statistics/handle", "//store/mockstore", "//testkit", + "//util/sqlexec", "@com_github_pingcap_errors//:errors", "@com_github_stretchr_testify//require", "@io_opencensus_go//stats/view", diff --git a/executor/simpletest/password_management_test.go b/executor/simpletest/password_management_test.go new file mode 100644 index 0000000000000..1e79662b5d5a3 --- /dev/null +++ b/executor/simpletest/password_management_test.go @@ -0,0 +1,1363 @@ +// 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, +// 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 simpletest + +import ( + "bytes" + "crypto/sha1" + "encoding/json" + "fmt" + "strconv" + "strings" + "testing" + "time" + + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/auth" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/privilege/privileges" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/util/sqlexec" + "github.com/stretchr/testify/require" +) + +func TestValidatePassword(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + subtk := testkit.NewTestKit(t, store) + err := tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil) + require.NoError(t, err) + tk.MustExec("CREATE USER ''@'localhost'") + tk.MustExec("GRANT ALL PRIVILEGES ON mysql.* TO ''@'localhost';") + err = subtk.Session().Auth(&auth.UserIdentity{Hostname: "localhost"}, nil, nil) + require.NoError(t, err) + + authPlugins := []string{mysql.AuthNativePassword, mysql.AuthCachingSha2Password, mysql.AuthTiDBSM3Password} + tk.MustQuery("SELECT @@global.validate_password.enable").Check(testkit.Rows("0")) + tk.MustExec("SET GLOBAL validate_password.enable = 1") + tk.MustQuery("SELECT @@global.validate_password.enable").Check(testkit.Rows("1")) + + for _, authPlugin := range authPlugins { + tk.MustExec("DROP USER IF EXISTS testuser") + tk.MustExec(fmt.Sprintf("CREATE USER testuser IDENTIFIED WITH %s BY '!Abc12345678'", authPlugin)) + + tk.MustExec("SET GLOBAL validate_password.policy = 'LOW'") + // check user name + tk.MustQuery("SELECT @@global.validate_password.check_user_name").Check(testkit.Rows("1")) + tk.MustContainErrMsg("ALTER USER testuser IDENTIFIED BY '!Abcdroot1234'", "Password Contains User Name") + tk.MustContainErrMsg("ALTER USER testuser IDENTIFIED BY '!Abcdtoor1234'", "Password Contains Reversed User Name") + tk.MustExec("SET PASSWORD FOR 'testuser' = 'testuser'") // password the same as the user name, but run by root + tk.MustExec("ALTER USER testuser IDENTIFIED BY 'testuser'") + tk.MustExec("SET GLOBAL validate_password.check_user_name = 0") + tk.MustExec("ALTER USER testuser IDENTIFIED BY '!Abcdroot1234'") + tk.MustExec("ALTER USER testuser IDENTIFIED BY '!Abcdtoor1234'") + tk.MustExec("SET GLOBAL validate_password.check_user_name = 1") + + // LOW: Length + tk.MustExec("SET GLOBAL validate_password.length = 8") + tk.MustQuery("SELECT @@global.validate_password.length").Check(testkit.Rows("8")) + tk.MustContainErrMsg("ALTER USER testuser IDENTIFIED BY '1234567'", "Require Password Length: 8") + tk.MustExec("SET GLOBAL validate_password.length = 12") + tk.MustContainErrMsg("ALTER USER testuser IDENTIFIED BY '!Abcdefg123'", "Require Password Length: 12") + tk.MustExec("ALTER USER testuser IDENTIFIED BY '!Abcdefg1234'") + tk.MustExec("SET GLOBAL validate_password.length = 8") + + // MEDIUM: Length; numeric, lowercase/uppercase, and special characters + tk.MustExec("SET GLOBAL validate_password.policy = 'MEDIUM'") + tk.MustExec("ALTER USER testuser IDENTIFIED BY '!Abc1234567'") + tk.MustContainErrMsg("ALTER USER testuser IDENTIFIED BY '!ABC1234567'", "Require Password Lowercase Count: 1") + tk.MustContainErrMsg("ALTER USER testuser IDENTIFIED BY '!abc1234567'", "Require Password Uppercase Count: 1") + tk.MustContainErrMsg("ALTER USER testuser IDENTIFIED BY '!ABCDabcd'", "Require Password Digit Count: 1") + tk.MustContainErrMsg("ALTER USER testuser IDENTIFIED BY 'Abc1234567'", "Require Password Non-alphanumeric Count: 1") + tk.MustExec("SET GLOBAL validate_password.special_char_count = 0") + tk.MustExec("ALTER USER testuser IDENTIFIED BY 'Abc1234567'") + tk.MustExec("SET GLOBAL validate_password.special_char_count = 1") + tk.MustExec("SET GLOBAL validate_password.length = 3") + tk.MustQuery("SELECT @@GLOBAL.validate_password.length").Check(testkit.Rows("4")) + + // STRONG: Length; numeric, lowercase/uppercase, and special characters; dictionary file + tk.MustExec("SET GLOBAL validate_password.policy = 'STRONG'") + tk.MustExec("ALTER USER testuser IDENTIFIED BY '!Abc1234567'") + tk.MustExec(fmt.Sprintf("SET GLOBAL validate_password.dictionary = '%s'", "1234;5678")) + tk.MustExec("ALTER USER testuser IDENTIFIED BY '!Abc123567'") + tk.MustExec("ALTER USER testuser IDENTIFIED BY '!Abc43218765'") + tk.MustContainErrMsg("ALTER USER testuser IDENTIFIED BY '!Abc1234567'", "Password contains word in the dictionary") + tk.MustExec("SET GLOBAL validate_password.dictionary = ''") + tk.MustExec("ALTER USER testuser IDENTIFIED BY '!Abc1234567'") + + // "IDENTIFIED AS 'xxx'" is not affected by validation + tk.MustExec(fmt.Sprintf("ALTER USER testuser IDENTIFIED WITH '%s' AS ''", authPlugin)) + } + tk.MustContainErrMsg("CREATE USER 'testuser1'@'localhost'", "Your password does not satisfy the current policy requirements") + tk.MustContainErrMsg("CREATE USER 'testuser1'@'localhost' IDENTIFIED WITH 'caching_sha2_password'", "Your password does not satisfy the current policy requirements") + tk.MustContainErrMsg("CREATE USER 'testuser1'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS ''", "Your password does not satisfy the current policy requirements") + + // if the username is '', all password can pass the check_user_name + subtk.MustQuery("SELECT user(), current_user()").Check(testkit.Rows("@localhost @localhost")) + subtk.MustQuery("SELECT @@global.validate_password.check_user_name").Check(testkit.Rows("1")) + subtk.MustQuery("SELECT @@global.validate_password.enable").Check(testkit.Rows("1")) + tk.MustExec("SET GLOBAL validate_password.number_count = 0") + tk.MustExec("SET GLOBAL validate_password.special_char_count = 0") + tk.MustExec("SET GLOBAL validate_password.mixed_case_count = 0") + tk.MustExec("SET GLOBAL validate_password.length = 0") + subtk.MustExec("ALTER USER ''@'localhost' IDENTIFIED BY ''") + subtk.MustExec("ALTER USER ''@'localhost' IDENTIFIED BY 'abcd'") + + // CREATE ROLE is not affected by password validation + tk.MustExec("SET GLOBAL validate_password.enable = 1") + tk.MustExec("SET GLOBAL validate_password.number_count = default") + tk.MustExec("SET GLOBAL validate_password.special_char_count = default") + tk.MustExec("SET GLOBAL validate_password.mixed_case_count = default") + tk.MustExec("SET GLOBAL validate_password.length = default") + tk.MustExec("CREATE ROLE role1") +} + +func expectedPasswordExpiration(t *testing.T, tk *testkit.TestKit, testuser, expired string, lifetime string) { + res := tk.MustQuery(fmt.Sprintf("SELECT password_expired, password_last_changed, password_lifetime FROM mysql.user WHERE user = '%s'", testuser)) + rows := res.Rows() + require.NotEmpty(t, rows) + row := rows[0] + require.Equal(t, 3, len(row)) + require.Equal(t, expired, row[0].(string), testuser) + require.True(t, len(row[1].(string)) > 0, testuser) + require.Equal(t, lifetime, row[2].(string), testuser) +} + +func TestPasswordExpiration(t *testing.T) { + store, _ := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + + // CREATE USER + tk.MustExec(`CREATE USER testuser`) + expectedPasswordExpiration(t, tk, "testuser", "N", "") + tk.MustExec(`CREATE USER testuser1 PASSWORD EXPIRE`) + expectedPasswordExpiration(t, tk, "testuser1", "Y", "") + tk.MustExec(`CREATE USER testuser2 PASSWORD EXPIRE DEFAULT`) + expectedPasswordExpiration(t, tk, "testuser2", "N", "") + tk.MustExec(`CREATE USER testuser3 PASSWORD EXPIRE NEVER`) + expectedPasswordExpiration(t, tk, "testuser3", "N", "0") + tk.MustExec(`CREATE USER testuser4 PASSWORD EXPIRE INTERVAL 3 DAY`) + expectedPasswordExpiration(t, tk, "testuser4", "N", "3") + tk.MustExec(`CREATE ROLE role1`) + expectedPasswordExpiration(t, tk, "role1", "Y", "") + + // ALTER USER + testcases := []struct { + user string + expired string + }{ + {"testuser", "N"}, + {"testuser1", "Y"}, + {"testuser2", "N"}, + {"testuser3", "N"}, + {"testuser4", "N"}, + {"role1", "Y"}, + } + for _, testcase := range testcases { + tk.MustExec(fmt.Sprintf("ALTER USER %s PASSWORD EXPIRE NEVER", testcase.user)) + expectedPasswordExpiration(t, tk, testcase.user, testcase.expired, "0") + tk.MustExec(fmt.Sprintf("ALTER USER %s PASSWORD EXPIRE DEFAULT", testcase.user)) + expectedPasswordExpiration(t, tk, testcase.user, testcase.expired, "") + tk.MustExec(fmt.Sprintf("ALTER USER %s PASSWORD EXPIRE INTERVAL 3 DAY", testcase.user)) + expectedPasswordExpiration(t, tk, testcase.user, testcase.expired, "3") + tk.MustExec(fmt.Sprintf("ALTER USER %s PASSWORD EXPIRE", testcase.user)) + expectedPasswordExpiration(t, tk, testcase.user, "Y", "3") + tk.MustExec(fmt.Sprintf("ALTER USER %s IDENTIFIED BY '' PASSWORD EXPIRE", testcase.user)) + expectedPasswordExpiration(t, tk, testcase.user, "Y", "3") + tk.MustExec(fmt.Sprintf("ALTER USER %s IDENTIFIED WITH 'mysql_native_password' AS ''", testcase.user)) + expectedPasswordExpiration(t, tk, testcase.user, "N", "3") + tk.MustExec(fmt.Sprintf("ALTER USER %s IDENTIFIED BY ''", testcase.user)) + expectedPasswordExpiration(t, tk, testcase.user, "N", "3") + } + + // SET PASSWORD + tk.MustExec("ALTER USER testuser PASSWORD EXPIRE") + expectedPasswordExpiration(t, tk, "testuser", "Y", "3") + tk.MustExec("SET PASSWORD FOR testuser = '1234'") + expectedPasswordExpiration(t, tk, "testuser", "N", "3") + + tk.MustGetErrCode(`CREATE USER ''@localhost IDENTIFIED BY 'pass' PASSWORD EXPIRE`, mysql.ErrPasswordExpireAnonymousUser) + tk.MustExec(`CREATE USER ''@localhost IDENTIFIED BY 'pass'`) + tk.MustGetErrCode(`ALTER USER ''@localhost PASSWORD EXPIRE`, mysql.ErrPasswordExpireAnonymousUser) + + // different cleartext authentication plugin + for _, authplugin := range []string{mysql.AuthNativePassword, mysql.AuthCachingSha2Password, mysql.AuthTiDBSM3Password} { + tk.MustExec("DROP USER IF EXISTS 'u1'@'localhost'") + tk.MustExec(fmt.Sprintf("CREATE USER 'u1'@'localhost' IDENTIFIED WITH '%s'", authplugin)) + tk.MustExec("ALTER USER 'u1'@'localhost' IDENTIFIED BY 'pass'") + tk.MustExec("ALTER USER 'u1'@'localhost' PASSWORD EXPIRE") + tk.MustQuery("SELECT password_expired FROM mysql.user WHERE user = 'u1'").Check(testkit.Rows("Y")) + } +} + +// Test cases that related to PASSWORD VALIDATION, PASSWORD EXPIRATION, PASSWORD REUSE POLICY, and PASSWORD FAILED-LOGIN TRACK. +func TestPasswordManagement(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("SET GLOBAL validate_password.enable = 1") + + // PASSWORD VALIDATION can work with user-specified PASSWORD REUSE POLICY. + tk.MustExec("CREATE USER u1 IDENTIFIED BY '!Abc1234' password history 1") + tk.MustGetErrCode("ALTER USER u1 IDENTIFIED BY '!Abc1234'", errno.ErrExistsInHistoryPassword) + tk.MustGetErrCode("ALTER USER u1 IDENTIFIED BY '!abc1234'", errno.ErrNotValidPassword) + + // PASSWORD VALIDATION can work with global PASSWORD REUSE POLICY. + tk.MustExec("SET GLOBAL password_history = 1") + tk.MustExec("DROP USER u1") + tk.MustExec("CREATE USER u1 IDENTIFIED BY '!Abc1234'") + tk.MustGetErrCode("ALTER USER u1 IDENTIFIED BY '!Abc1234'", errno.ErrExistsInHistoryPassword) + tk.MustGetErrCode("ALTER USER u1 IDENTIFIED BY '!abc1234'", errno.ErrNotValidPassword) + + // PASSWORD EXPIRATION can work with ACCOUNT LOCK. + // PASSWORD EXPIRE NEVER and ACCOUNT UNLOCK take effect. + tk.MustExec(`ALTER USER u1 ACCOUNT LOCK PASSWORD EXPIRE NEVER PASSWORD EXPIRE NEVER ACCOUNT UNLOCK ACCOUNT LOCK ACCOUNT LOCK ACCOUNT UNLOCK;`) + tk.MustQuery(`SELECT password_expired, password_lifetime, account_locked FROM mysql.user WHERE USER='u1';`).Check( + testkit.Rows("N 0 N")) + + // PASSWORD EXPIRATION can work with PASSWORD REUSE POLICY + tk.MustExec(`create user u2 identified by '!Abc1234' password expire password reuse interval default password expire never password + reuse interval 3 day password history 5 password history default password expire default`) + tk.MustQuery(`select password_expired, password_lifetime, password_reuse_history, password_reuse_time from mysql.user where user = 'u2'`).Check( + testkit.Rows("N 3")) + tk.MustExec(`alter user u2 password expire default password reuse interval 3 day password history default + password expire never password expire interval 5 day password reuse interval default password expire password history 5`) + tk.MustQuery(`select password_expired, password_lifetime, password_reuse_history, password_reuse_time from mysql.user where user = 'u2'`).Check( + testkit.Rows("Y 5 ")) + tk.MustExec(`alter user u2 identified by '!Abc12345'`) + tk.MustQuery(`select password_expired, password_lifetime, password_reuse_history, password_reuse_time from mysql.user where user = 'u2'`).Check( + testkit.Rows("N 5 ")) + + // PASSWORD FAILED-LOGIN TRACK can work with USER COMMENT and USER ATTRIBUTE + tk.MustExec(`CREATE USER u3 IDENTIFIED BY '!Abc12345' FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 3 COMMENT 'Some statements to test create user'`) + tk.MustQuery(`select user_attributes->>"$.metadata" from mysql.user where user = 'u3'`).Check(testkit.Rows(`{"comment": "Some statements to test create user"}`)) + tk.MustQuery(`select user_attributes->>"$.Password_locking" from mysql.user where user = 'u3'`).Check(testkit.Rows(`{"failed_login_attempts": 4, "password_lock_time_days": 3}`)) + tk.MustExec(`ALTER USER u3 FAILED_LOGIN_ATTEMPTS 1 PASSWORD_LOCK_TIME unbounded FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 5 ATTRIBUTE '{"name": "John", "age": 19}'`) + tk.MustQuery(`select user_attributes->>"$.metadata" from mysql.user where user = 'u3'`).Check(testkit.Rows(`{"age": 19, "comment": "Some statements to test create user", "name": "John"}`)) + tk.MustQuery(`select user_attributes->>"$.Password_locking" from mysql.user where user = 'u3'`).Check(testkit.Rows(`{"failed_login_attempts": 5, "password_lock_time_days": 5}`)) + + tk.MustExec("SET GLOBAL validate_password.enable = 0") + + rootTK := testkit.NewTestKit(t, store) + // Password Strength Check. + rootTK.MustExec(`set global validate_password.enable = ON`) + rootTK.MustExec(`drop user u2`) + rootTK.MustGetErrCode(`create user u2 identified by 'u2' PASSWORD EXPIRE INTERVAL 2 DAY password history 2 + password reuse interval 2 day FAILED_LOGIN_ATTEMPTS 1 PASSWORD_LOCK_TIME 1`, 1819) + rootTK.MustGetErrCode(`create user u2`, 1819) + rootTK.MustGetErrCode(`create user u2 identified by 'u2222222' PASSWORD EXPIRE INTERVAL 2 DAY password history 2 + password reuse interval 2 day FAILED_LOGIN_ATTEMPTS 1 PASSWORD_LOCK_TIME 1`, 1819) + rootTK.MustGetErrCode(`create user u2 identified by 'Uu2222222' PASSWORD EXPIRE INTERVAL 2 DAY password history 2 + password reuse interval 2 day FAILED_LOGIN_ATTEMPTS 1 PASSWORD_LOCK_TIME 1`, 1819) + rootTK.MustGetErrCode(`create user u2 identified by 'Uu3222222' PASSWORD EXPIRE INTERVAL 2 DAY password history 2 + password reuse interval 2 day FAILED_LOGIN_ATTEMPTS 1 PASSWORD_LOCK_TIME 1`, 1819) + rootTK.MustExec(`create user u2 identified by 'Uu3@22222' PASSWORD EXPIRE INTERVAL 2 DAY password history 2 + password reuse interval 2 day FAILED_LOGIN_ATTEMPTS 1 PASSWORD_LOCK_TIME 1`) + rootTK.MustQuery(`Select count(*) from mysql.password_history where user = 'u2' and host = '%'`).Check(testkit.Rows("1")) + result := rootTK.MustQuery(`Select authentication_string from mysql.user where user = 'u2' and host = '%'`) + result.Check(testkit.Rows(auth.EncodePassword("Uu3@22222"))) + // Disable password reuse. + rootTK.MustGetErrCode(`Alter user u2 identified by 'Uu3@22222'`, 3638) + rootTK.MustGetErrCode(`Set password for 'u2' = 'Uu3@22222'`, 3638) + // Password Strength Check. + rootTK.MustGetErrCode(`Alter user u2 identified by 'U2'`, 1819) + rootTK.MustGetErrCode(`Set password for 'u2' = 'U2'`, 1819) + // Did not modify successfully. + result = rootTK.MustQuery(`Select authentication_string from mysql.user where user = 'u2' and host = '%'`) + result.Check(testkit.Rows(auth.EncodePassword("Uu3@22222"))) + // Auto-lock in effect. + err := tk.Session().Auth(&auth.UserIdentity{Username: "u2", Hostname: "%"}, sha1Password(""), nil) + require.ErrorContains(t, err, "Account is blocked for 1 day(s) (1 day(s) remaining) due to 1 consecutive failed logins.") + result = rootTK.MustQuery(`SELECT + JSON_UNQUOTE(JSON_EXTRACT(user_attributes, '$.Password_locking.failed_login_count')), + JSON_UNQUOTE(JSON_EXTRACT(user_attributes, '$.Password_locking.auto_account_locked')) from mysql.user where user = 'u2' and host = '%'`) + result.Check(testkit.Rows(`1 Y`)) + rootTK.MustExec(`ALTER user u2 account unlock`) + + // Unlock in effect. + result = rootTK.MustQuery(`SELECT + JSON_UNQUOTE(JSON_EXTRACT(user_attributes, '$.Password_locking.failed_login_count')), + JSON_UNQUOTE(JSON_EXTRACT(user_attributes, '$.Password_locking.auto_account_locked')) from mysql.user where user = 'u2' and host = '%'`) + result.Check(testkit.Rows(`0 N`)) + + rootTK.MustExec(`set global validate_password.enable = OFF`) + rootTK.MustExec(`update mysql.user set Password_last_changed = date_sub(Password_last_changed,interval '3 0:0:1' DAY_SECOND) where user = 'u2' and host = '%'`) + err = domain.GetDomain(rootTK.Session()).NotifyUpdatePrivilege() + require.NoError(t, err) + // Password expires and takes effect. + err = tk.Session().Auth(&auth.UserIdentity{Username: "u2", Hostname: "%"}, sha1Password("Uu3@22222"), nil) + require.ErrorContains(t, err, "Your password has expired.") + variable.IsSandBoxModeEnabled.Store(true) + err = tk.Session().Auth(&auth.UserIdentity{Username: "u2", Hostname: "%"}, sha1Password("Uu3@22222"), nil) + require.NoError(t, err) + require.True(t, tk.Session().InSandBoxMode()) + + rootTK.MustExec(`set global validate_password.enable = ON`) + // Forbid other users to change password. + tk.MustGetErrCode(`Alter user root identified by 'Uu3@22222'`, 1820) + // Disable password reuse. + tk.MustGetErrCode(`Alter user u2 identified by 'Uu3@22222'`, 3638) + tk.MustGetErrCode(`set password = 'Uu3@22222'`, 3638) + // Password Strength Check. + tk.MustGetErrCode(`Alter user u2 identified by 'U2'`, 1819) + tk.MustGetErrCode(`set password = 'U2'`, 1819) + tk.MustExec(`Set password = 'Uu3@22223'`) + require.False(t, tk.Session().InSandBoxMode()) + rootTK.MustQuery(`Select count(*) from mysql.password_history where user = 'u2' and host = '%'`).Check(testkit.Rows("2")) + result = rootTK.MustQuery(`Select authentication_string from mysql.user where user = 'u2' and host = '%'`) + result.Check(testkit.Rows(auth.EncodePassword("Uu3@22223"))) + tk = testkit.NewTestKit(t, store) + err = tk.Session().Auth(&auth.UserIdentity{Username: "u2", Hostname: "%"}, sha1Password("Uu3@22223"), nil) + require.NoError(t, err) +} + +// Test basic CREATE/ALTER USER with failed-login track. +func TestFailedLoginTrackingBasic(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + createUserTestCases := []struct { + sql string + rsJSON string + user string + }{ + {"CREATE USER 'u1'@'localhost' IDENTIFIED BY 'password' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 3;", + "{\"failed_login_attempts\": 3, \"password_lock_time_days\": 3}", "u1"}, + {"CREATE USER 'u2'@'localhost' IDENTIFIED BY 'password' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME UNBOUNDED;", + "{\"failed_login_attempts\": 3, \"password_lock_time_days\": -1}", "u2"}, + {"CREATE USER 'u3'@'localhost' IDENTIFIED BY 'password' FAILED_LOGIN_ATTEMPTS 3;", + "{\"failed_login_attempts\": 3, \"password_lock_time_days\": 0}", "u3"}, + {"CREATE USER 'u4'@'localhost' IDENTIFIED BY 'password' PASSWORD_LOCK_TIME 3;", + "{\"failed_login_attempts\": 0, \"password_lock_time_days\": 3}", "u4"}, + {"CREATE USER 'u5'@'localhost' IDENTIFIED BY 'password' PASSWORD_LOCK_TIME UNBOUNDED;", + "{\"failed_login_attempts\": 0, \"password_lock_time_days\": -1}", "u5"}, + } + for _, tc := range createUserTestCases { + tk.MustExec(tc.sql) + sql := fmt.Sprintf("SELECT user_attributes->>\"$.Password_locking\" from mysql.user WHERE USER = '%s' AND HOST = 'localhost' for update", tc.user) + tk.MustQuery(sql).Check(testkit.Rows(tc.rsJSON)) + } + + alterUserTestCases := []struct { + sql string + user string + failedLoginAttempts int64 + passwordLockTimeDays int64 + failedLoginCount int64 + comment string + }{ + {"ALTER USER 'u1'@'localhost' FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 6;", "u1", + 4, 6, 0, ""}, + {"ALTER USER 'u2'@'localhost' FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME UNBOUNDED;", + "u2", 4, -1, 0, ""}, + {"ALTER USER 'u3'@'localhost' PASSWORD_LOCK_TIME 6;", + "u3", 3, 6, 0, ""}, + {"ALTER USER 'u4'@'localhost' FAILED_LOGIN_ATTEMPTS 4;", + "u4", 4, 3, 0, ""}, + {"ALTER USER 'u4'@'localhost' PASSWORD_LOCK_TIME UNBOUNDED;", + "u4", 4, -1, 0, ""}, + {"ALTER USER 'u5'@'localhost' ACCOUNT UNLOCK FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 6;", + "u5", 3, 6, 0, ""}, + {"ALTER USER 'u5'@'localhost' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 6 COMMENT 'Something';", + "u5", 3, 6, 0, "Something"}, + } + for _, tc := range alterUserTestCases { + tk.MustExec(tc.sql) + sql := fmt.Sprintf("SELECT user_attributes from mysql.user WHERE USER = '%s' AND HOST = 'localhost' for update", tc.user) + rs := tk.MustQuery(sql) + buf := bytes.NewBufferString("") + for _, row := range rs.Rows() { + _, err := fmt.Fprintf(buf, "%s\n", row) + require.NoError(t, err) + } + str := buf.String() + var ua []userAttributes + err := json.Unmarshal([]byte(str), &ua) + require.NoError(t, err) + require.Equal(t, tc.failedLoginAttempts, ua[0].PasswordLocking.FailedLoginAttempts, tc.sql, str) + require.Equal(t, tc.passwordLockTimeDays, ua[0].PasswordLocking.PasswordLockTimeDays, tc.sql, str) + require.Equal(t, tc.failedLoginCount, ua[0].PasswordLocking.FailedLoginCount, tc.sql, str) + require.Equal(t, tc.comment, ua[0].Metadata.Comment, tc.sql, str) + } + + tk.MustExec("CREATE USER 'u6'@'localhost' IDENTIFIED BY 'password' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 3;") + tk.MustQuery(" SHOW CREATE USER 'u6'@'localhost';").Check( + testkit.Rows("CREATE USER 'u6'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 3")) + + tk.MustExec("CREATE USER 'u7'@'localhost' IDENTIFIED BY 'password';") + tk.MustQuery(" SHOW CREATE USER 'u7'@'localhost';").Check( + testkit.Rows("CREATE USER 'u7'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT")) + + tk.MustExec("CREATE USER 'u8'@'localhost' IDENTIFIED BY 'password' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME UNBOUNDED;") + tk.MustQuery(" SHOW CREATE USER 'u8'@'localhost';").Check( + testkit.Rows("CREATE USER 'u8'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME UNBOUNDED")) + + tk.MustExec("ALTER USER 'u4'@'localhost' PASSWORD_LOCK_TIME 0 FAILED_LOGIN_ATTEMPTS 0") + tk.MustQuery("select user_attributes from mysql.user where user = 'u4' and host = 'localhost'").Check(testkit.Rows(``)) + tk.MustExec("ALTER USER 'u4'@'localhost' account unlock") + tk.MustQuery("select user_attributes from mysql.user where user = 'u4' and host = 'localhost'").Check(testkit.Rows(``)) + tk.MustExec("ALTER USER 'u4'@'localhost' PASSWORD_LOCK_TIME 6") + tk.MustQuery("select user_attributes from mysql.user where user = 'u4' and host = 'localhost'").Check(testkit.Rows(`{"Password_locking": {"failed_login_attempts": 0, "password_lock_time_days": 6}}`)) +} + +func TestUserReuseControl(t *testing.T) { + store := testkit.CreateMockStore(t) + rootTK := testkit.NewTestKit(t, store) + rootTK.MustQuery(`show variables like "password_history"`).Check(testkit.Rows("password_history 0")) + rootTK.MustQuery(`show variables like "password_reuse_interval"`).Check(testkit.Rows("password_reuse_interval 0")) + rootTK.MustExec(`set global password_history = -1`) + rootTK.MustExec(`set global password_reuse_interval = -1`) + rootTK.MustQuery(`show variables like "password_history"`).Check(testkit.Rows("password_history 0")) + rootTK.MustQuery(`show variables like "password_reuse_interval"`).Check(testkit.Rows("password_reuse_interval 0")) + rootTK.MustExec(`set global password_history = 4294967295`) + rootTK.MustExec(`set global password_reuse_interval = 4294967295`) + rootTK.MustQuery(`show variables like "password_history"`).Check(testkit.Rows("password_history 4294967295")) + rootTK.MustQuery(`show variables like "password_reuse_interval"`).Check(testkit.Rows("password_reuse_interval 4294967295")) + rootTK.MustExec(`set global password_history = 4294967296`) + rootTK.MustExec(`set global password_reuse_interval = 4294967296`) + rootTK.MustQuery(`show variables like "password_history"`).Check(testkit.Rows("password_history 4294967295")) + rootTK.MustQuery(`show variables like "password_reuse_interval"`).Check(testkit.Rows("password_reuse_interval 4294967295")) + rootTK.MustGetErrCode(`set session password_history = 42949`, 1229) + rootTK.MustGetErrCode(`set session password_reuse_interval = 42949`, 1229) +} + +func TestUserReuseInfo(t *testing.T) { + store := testkit.CreateMockStore(t) + rootTK := testkit.NewTestKit(t, store) + rootTK.MustExec(`CREATE USER testReuse`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(` `)) + rootTK.MustExec(`ALTER USER testReuse PASSWORD HISTORY 5`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(`5 `)) + rootTK.MustExec(`ALTER USER testReuse PASSWORD HISTORY 0`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(`0 `)) + rootTK.MustExec(`ALTER USER testReuse PASSWORD HISTORY DEFAULT`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(` `)) + rootTK.MustExec(`ALTER USER testReuse PASSWORD HISTORY 65536`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(`65535 `)) + rootTK.MustExec(`ALTER USER testReuse PASSWORD REUSE INTERVAL 5 DAY`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(`65535 5`)) + rootTK.MustExec(`ALTER USER testReuse PASSWORD REUSE INTERVAL 0 DAY`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(`65535 0`)) + rootTK.MustExec(`ALTER USER testReuse PASSWORD REUSE INTERVAL DEFAULT`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(`65535 `)) + rootTK.MustExec(`ALTER USER testReuse PASSWORD REUSE INTERVAL 65536 DAY`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(`65535 65535`)) + rootTK.MustExec(`ALTER USER testReuse PASSWORD HISTORY 6 PASSWORD REUSE INTERVAL 6 DAY`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(`6 6`)) + rootTK.MustExec(`ALTER USER testReuse PASSWORD HISTORY 6 PASSWORD HISTORY 7 `) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(`7 6`)) + + rootTK.MustExec(`drop USER testReuse`) + rootTK.MustExec(`CREATE USER testReuse PASSWORD HISTORY 5`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(`5 `)) + rootTK.MustExec(`drop USER testReuse`) + rootTK.MustExec(`CREATE USER testReuse PASSWORD REUSE INTERVAL 5 DAY`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(` 5`)) + rootTK.MustExec(`drop USER testReuse`) + rootTK.MustExec(`CREATE USER testReuse PASSWORD REUSE INTERVAL 5 DAY PASSWORD REUSE INTERVAL 6 DAY`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(` 6`)) + rootTK.MustExec(`drop USER testReuse`) + rootTK.MustExec(`CREATE USER testReuse PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 6 DAY`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(`5 6`)) + rootTK.MustExec(`drop USER testReuse`) + rootTK.MustExec(`CREATE USER testReuse PASSWORD REUSE INTERVAL 6 DAY PASSWORD HISTORY 5`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(`5 6`)) + + rootTK.MustExec(`drop USER testReuse`) + rootTK.MustGetErrCode(`CREATE USER testReuse PASSWORD HISTORY -5`, 1064) + rootTK.MustGetErrCode(`CREATE USER testReuse PASSWORD REUSE INTERVAL -6 DAY`, 1064) + rootTK.MustExec(`CREATE USER testReuse PASSWORD HISTORY 65535 PASSWORD REUSE INTERVAL 65535 DAY`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(`65535 65535`)) + rootTK.MustExec(`drop USER testReuse`) + rootTK.MustExec(`CREATE USER testReuse PASSWORD HISTORY 65536 PASSWORD REUSE INTERVAL 65536 DAY`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(`65535 65535`)) + rootTK.MustExec(`drop USER testReuse`) + rootTK.MustExec(`CREATE USER testReuse PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(` `)) + rootTK.MustExec(`drop USER testReuse`) + rootTK.MustExec(`CREATE USER testReuse PASSWORD HISTORY 0 PASSWORD REUSE INTERVAL 0 DAY`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows(`0 0`)) +} + +func TestUserReuseFunction(t *testing.T) { + store := testkit.CreateMockStore(t) + rootTK := testkit.NewTestKit(t, store) + rootTK.MustExec(`CREATE USER testReuse identified by 'test'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`0`)) + rootTK.MustExec(`set global password_history = 1;`) + rootTK.MustExec(`alter USER testReuse identified by 'test'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`1`)) + rootTK.MustGetErrCode(`alter USER testReuse identified by 'test'`, 3638) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`1`)) + rootTK.MustExec(`alter USER testReuse identified by 'test1'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`1`)) + rootTK.MustExec(`DROP USER testReuse`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`0`)) + + rootTK.MustExec(`set global password_history = 0;`) + rootTK.MustExec(`set global password_reuse_interval = 1;`) + rootTK.MustExec(`CREATE USER testReuse identified by 'test'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`1`)) + rootTK.MustGetErrCode(`alter USER testReuse identified by 'test'`, 3638) + rootTK.MustExec(`alter USER testReuse identified by 'test1'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`2`)) + rootTK.MustExec(`alter USER testReuse identified by 'test2'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`3`)) + rootTK.MustExec(`alter USER testReuse identified by 'test3'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`4`)) + rootTK.MustExec(`update mysql.password_history set Password_timestamp = date_sub(Password_timestamp,interval '1 0:0:1' DAY_SECOND)`) + rootTK.MustExec(`alter USER testReuse identified by 'test'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`1`)) + rootTK.MustExec(`drop USER testReuse `) + + rootTK.MustExec(`set global password_reuse_interval = 0;`) + //password nil is not stored + rootTK.MustExec(`CREATE USER testReuse PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 6 DAY`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`0`)) + rootTK.MustExec(`drop USER testReuse `) + + rootTK.MustExec(`CREATE USER testReuse identified by 'test' PASSWORD HISTORY 5`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`1`)) + rootTK.MustExec(`alter USER testReuse identified by 'test1'`) + rootTK.MustExec(`alter USER testReuse identified by 'test2'`) + rootTK.MustExec(`alter USER testReuse identified by 'test3'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`4`)) + rootTK.MustGetErrCode(`alter USER testReuse identified by 'test'`, 3638) + rootTK.MustExec(`alter USER testReuse identified by 'test4'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`5`)) + rootTK.MustExec(`alter USER testReuse identified by 'test5'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`5`)) + rootTK.MustGetErrCode(`alter USER testReuse identified by 'test1'`, 3638) + rootTK.MustExec(`alter USER testReuse identified by 'test'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`5`)) + rootTK.MustExec(`drop USER testReuse`) + + rootTK.MustExec(`CREATE USER testReuse identified by 'test' PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 3 DAY`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`1`)) + rootTK.MustExec(`alter USER testReuse identified by 'test1'`) + rootTK.MustExec(`alter USER testReuse identified by 'test2'`) + rootTK.MustExec(`alter USER testReuse identified by 'test3'`) + rootTK.MustExec(`alter USER testReuse identified by 'test4'`) + rootTK.MustExec(`alter USER testReuse identified by 'test5'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`6`)) + rootTK.MustGetErrCode(`alter USER testReuse identified by 'test'`, 3638) + rootTK.MustExec(`update mysql.password_history set Password_timestamp = date_sub(Password_timestamp,interval '3 0:0:1' DAY_SECOND) where user = 'testReuse' order by Password_timestamp asc limit 1`) + rootTK.MustExec(`alter USER testReuse identified by 'test'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`6`)) + rootTK.MustExec(`drop USER testReuse`) + + rootTK.MustExec(`CREATE USER testReuse identified by 'test' PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 3 DAY`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`1`)) + rootTK.MustExec(`alter USER testReuse identified by 'test1'`) + rootTK.MustExec(`alter USER testReuse identified by 'test2'`) + rootTK.MustExec(`alter USER testReuse identified by 'test3'`) + rootTK.MustExec(`update mysql.password_history set Password_timestamp = date_sub(Password_timestamp,interval '3 0:0:1' DAY_SECOND) where user = 'testReuse' order by Password_timestamp asc limit 1`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`4`)) + rootTK.MustGetErrCode(`alter USER testReuse identified by 'test'`, 3638) + rootTK.MustExec(`ALTER USER testReuse PASSWORD HISTORY 3`) + rootTK.MustExec(`alter USER testReuse identified by 'test'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`4`)) + rootTK.MustExec(`drop USER testReuse`) + + rootTK.MustExec(`set global password_history = 1;`) + rootTK.MustExec(`set global password_reuse_interval = 1;`) + rootTK.MustExec(`CREATE USER testReuse identified by 'test' PASSWORD HISTORY 0 PASSWORD REUSE INTERVAL 0 DAY`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`0`)) + rootTK.MustExec(`alter USER testReuse identified by 'test'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`0`)) + rootTK.MustExec(`drop USER testReuse`) + + rootTK.MustExec(`set global password_history = 0;`) + rootTK.MustExec(`set global password_reuse_interval = 360000000;`) + rootTK.MustExec(`CREATE USER testReuse identified by 'test'`) + rootTK.MustExec(`alter USER testReuse identified by 'test1'`) + rootTK.MustGetErrCode(`alter USER testReuse identified by 'test'`, 3638) + rootTK.MustGetErrCode(`set PASSWORD FOR testReuse = 'test'`, 3638) + rootTK.MustExec(`alter USER testReuse identified by ''`) + rootTK.MustExec(`alter USER testReuse identified by ''`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`2`)) + rootTK.MustExec(`alter USER testReuse identified by 'test2'`) + rootTK.MustExec(`set global password_reuse_interval = 4294967295;`) + rootTK.MustExec(`alter USER testReuse identified by 'test3'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`4`)) + rootTK.MustExec(`set PASSWORD FOR testReuse = 'test4'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`5`)) + rootTK.MustExec(`drop USER testReuse`) + + rootTK.MustExec(`set global password_reuse_interval = 0;`) + rootTK.MustExec(`CREATE USER testReuse identified by 'test' PASSWORD HISTORY 5`) + rootTK.MustExec(`alter USER testReuse identified by 'test1'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`2`)) + rootTK.MustExec(`alter USER testReuse identified by 'test1' PASSWORD HISTORY 0`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`0`)) + rootTK.MustExec(`alter USER testReuse identified by 'test1' PASSWORD HISTORY 2 PASSWORD REUSE INTERVAL 1 DAY`) + rootTK.MustExec(`alter USER testReuse identified by 'test2'`) + rootTK.MustExec(`alter USER testReuse identified by 'test3'`) + rootTK.MustExec(`alter USER testReuse identified by 'test1' PASSWORD HISTORY 2 PASSWORD REUSE INTERVAL 0 DAY`) + + // Support password and default value modification at the same time. + rootTK.MustExec(`drop USER testReuse`) + rootTK.MustExec(`set global password_history = 1`) + rootTK.MustExec(`CREATE USER testReuse identified by 'test' PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`1`)) + rootTK.MustGetErrCode(`ALTER USER testReuse identified by 'test' PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT`, 3638) + rootTK.MustExec(`ALTER USER testReuse identified by 'test1' PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`1`)) +} + +func TestUserReuseDifferentAuth(t *testing.T) { + store := testkit.CreateMockStore(t) + rootTK := testkit.NewTestKit(t, store) + // test caching_sha2_password. + rootTK.MustExec(`CREATE USER testReuse identified with 'caching_sha2_password' by 'test' PASSWORD HISTORY 1 `) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`1`)) + rootTK.MustGetErrCode(`alter USER testReuse identified by 'test'`, 3638) + rootTK.MustGetErrCode(`set password for testReuse = 'test'`, 3638) + rootTK.MustExec(`alter USER testReuse identified by 'test1'`) + rootTK.MustExec(`alter USER testReuse identified with 'tidb_sm3_password'`) + // changing the auth method prunes history. + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`0`)) + + rootTK.MustExec(`drop USER testReuse`) + rootTK.MustExec(`CREATE USER testReuse identified with 'tidb_sm3_password' by 'test' PASSWORD HISTORY 1 `) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`1`)) + rootTK.MustGetErrCode(`alter USER testReuse identified by 'test'`, 3638) + rootTK.MustGetErrCode(`set password for testReuse = 'test'`, 3638) + rootTK.MustExec(`alter USER testReuse identified by 'test1'`) + rootTK.MustExec(`alter USER testReuse identified with 'caching_sha2_password'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`0`)) + + rootTK.MustExec(`drop USER testReuse`) + rootTK.MustExec(`CREATE USER testReuse identified with 'caching_sha2_password' by 'test' PASSWORD REUSE INTERVAL 1 DAY`) + rootTK.MustGetErrCode(`alter USER testReuse identified by 'test'`, 3638) + rootTK.MustGetErrCode(`set password for testReuse = 'test'`, 3638) + rootTK.MustExec(`alter USER testReuse identified by 'test1'`) + rootTK.MustExec(`alter USER testReuse identified by 'test2'`) + rootTK.MustExec(`alter USER testReuse identified by 'test3'`) + rootTK.MustGetErrCode(`alter USER testReuse identified by 'test'`, 3638) + rootTK.MustExec(`update mysql.password_history set Password_timestamp = date_sub(Password_timestamp,interval '1 0:0:1' DAY_SECOND) where user = 'testReuse' order by Password_timestamp asc limit 1`) + rootTK.MustExec(`alter USER testReuse identified by 'test'`) + + rootTK.MustExec(`drop USER testReuse`) + rootTK.MustGetErrCode(`CREATE USER testReuse identified with 'mysql_clear_password' by 'test' PASSWORD REUSE INTERVAL 1 DAY`, 1524) + rootTK.MustGetErrCode(`CREATE USER testReuse identified with 'tidb_session_token' by 'test' PASSWORD REUSE INTERVAL 1 DAY`, 1524) + // no password. + rootTK.MustExec(`CREATE USER testReuse identified with 'auth_socket' by 'test' PASSWORD REUSE INTERVAL 1 DAY`) + rootTK.MustExec(`ALTER USER testReuse identified by 'test' `) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`0`)) + rootTK.MustQuery(`SELECT authentication_string FROM mysql.user WHERE user = 'testReuse'`).Check(testkit.Rows("")) + rootTK.MustExec(`ALTER USER testReuse identified with 'caching_sha2_password' by 'test' `) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`1`)) + // AuthTiDBAuthToken is the token login method on the cloud, + // and the Password Reuse Policy does not take effect. + rootTK.MustExec(`drop USER testReuse`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`0`)) + rootTK.MustExec(`CREATE USER testReuse identified with 'tidb_auth_token' by 'test' PASSWORD REUSE INTERVAL 1 DAY`) + rootTK.MustExec(`ALTER USER testReuse identified by 'test' `) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`0`)) + rootTK.MustExec(`set password for testReuse = 'test'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`0`)) + rootTK.MustExec(`ALTER USER testReuse identified with 'caching_sha2_password' by 'test' `) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`1`)) + rootTK.MustGetErrCode(`alter USER testReuse identified by 'test'`, 3638) + rootTK.MustGetErrCode(`set password for testReuse = 'test'`, 3638) + rootTK.MustExec(`drop USER testReuse`) +} + +func TestUserReuseMultiuser(t *testing.T) { + store := testkit.CreateMockStore(t) + rootTK := testkit.NewTestKit(t, store) + //alter multi user success + rootTK.MustExec(`CREATE USER testReuse identified by 'test', testReuse1 identified by 'test', testReuse2 identified by 'test' PASSWORD HISTORY 65535 PASSWORD REUSE INTERVAL 65535 DAY`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user like 'testReuse%'`).Check(testkit.Rows(`65535 65535`, `65535 65535`, `65535 65535`)) + rootTK.MustExec(`ALTER USER testReuse identified by 'test1', testReuse1 identified by 'test1', testReuse2 identified by 'test1' PASSWORD HISTORY 3 PASSWORD REUSE INTERVAL 3 DAY`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user like 'testReuse%'`).Check(testkit.Rows(`3 3`, `3 3`, `3 3`)) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user like 'testReuse%' group by user`).Check(testkit.Rows(`2`, `2`, `2`)) + //alter multi user fail + rootTK.MustExec(`CREATE USER testReuse3 identified by 'test'`) + rootTK.MustQuery(`SELECT Password_reuse_history,Password_reuse_time FROM mysql.user WHERE user like 'testReuse%'`).Check(testkit.Rows(`3 3`, `3 3`, `3 3`, ` `)) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user like 'testReuse%' group by user`).Check(testkit.Rows(`2`, `2`, `2`)) + rootTK.MustGetErrCode(`ALTER USER testReuse identified by 'test1', testReuse3 identified by 'test1'`, 3638) + //drop user + rootTK.MustExec(`drop User testReuse, testReuse1, testReuse2, testReuse3`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user like 'testReuse%' `).Check(testkit.Rows(`0`)) +} + +func TestUserReuseRename(t *testing.T) { + store := testkit.CreateMockStore(t) + rootTK := testkit.NewTestKit(t, store) + rootTK.MustExec(`CREATE USER testReuse identified by 'test' PASSWORD HISTORY 5`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`1`)) + rootTK.MustExec(`alter USER testReuse identified by 'test1'`) + rootTK.MustExec(`alter USER testReuse identified by 'test2'`) + rootTK.MustExec(`alter USER testReuse identified by 'test3'`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`4`)) + rootTK.MustExec(`rename USER testReuse to testReuse1`) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse'`).Check(testkit.Rows(`0`)) + rootTK.MustQuery(`SELECT count(*) FROM mysql.password_history WHERE user = 'testReuse1'`).Check(testkit.Rows(`4`)) +} + +func TestUserAlterUser(t *testing.T) { + store := testkit.CreateMockStore(t) + rootTK := testkit.NewTestKit(t, store) + rootTK.MustExec(`CREATE USER test1 IDENTIFIED WITH 'mysql_native_password' BY '1234'`) + alterUserSQL := `ALTER USER 'test1' IDENTIFIED BY '222', 'test_not_exist'@'localhost' IDENTIFIED BY '111';` + rootTK.MustGetErrCode(alterUserSQL, mysql.ErrCannotUser) + result := rootTK.MustQuery(`SELECT authentication_string FROM mysql.User WHERE User="test1" and Host="%"`) + result.Check(testkit.Rows(auth.EncodePassword("1234"))) + alterUserSQL = `ALTER USER IF EXISTS 'test1' IDENTIFIED BY '222', 'test_not_exist'@'localhost' IDENTIFIED BY '111';` + rootTK.MustExec(alterUserSQL) + rootTK.MustQuery("show warnings").Check(testkit.RowsWithSep("|", "Note|3162|User 'test_not_exist'@'localhost' does not exist.")) + result = rootTK.MustQuery(`SELECT authentication_string FROM mysql.User WHERE User="test1" and Host="%"`) + result.Check(testkit.Rows(auth.EncodePassword("222"))) +} + +func sha1Password(s string) []byte { + crypt := sha1.New() + crypt.Write([]byte(s)) + hashStage1 := crypt.Sum(nil) + crypt.Reset() + crypt.Write(hashStage1) + hashStage2 := crypt.Sum(nil) + crypt.Reset() + crypt.Write(hashStage2) + hashStage3 := crypt.Sum(nil) + for i := range hashStage3 { + hashStage3[i] ^= hashStage1[i] + } + return hashStage3 +} + +func TestFailedLoginTracking(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + // Set FAILED_LOGIN_ATTEMPTS to 1, and check error messages after login failure once. + createAndCheck(tk, "CREATE USER 'testu1'@'localhost' IDENTIFIED BY 'testu1' FAILED_LOGIN_ATTEMPTS 1 PASSWORD_LOCK_TIME 1", + "{\"Password_locking\": {\"failed_login_attempts\": 1, \"password_lock_time_days\": 1}}", "testu1") + err := tk.Session().Auth(&auth.UserIdentity{Username: "testu1", Hostname: "localhost"}, sha1Password("password"), nil) + lds := strconv.FormatInt(1, 10) + errTarget := privileges.GenerateAccountAutoLockErr(1, "testu1", "localhost", lds, lds) + require.Equal(t, err.Error(), errTarget.Error()) + checkAuthUser(t, tk, "testu1", 1, "Y") + + // Check the login error message after the account is locked. + err = tk.Session().Auth(&auth.UserIdentity{Username: "testu1", Hostname: "localhost"}, sha1Password("password"), nil) + require.Equal(t, err.Error(), errTarget.Error()) + checkAuthUser(t, tk, "testu1", 1, "Y") + + // Set FAILED_LOGIN_ATTEMPTS to 1 and PASSWORD_LOCK_TIME to UNBOUNDED. Check error messages after failed login once. + createAndCheck(tk, "CREATE USER 'testu2'@'localhost' IDENTIFIED BY 'testu2' FAILED_LOGIN_ATTEMPTS 1 PASSWORD_LOCK_TIME UNBOUNDED", + "{\"Password_locking\": {\"failed_login_attempts\": 1, \"password_lock_time_days\": -1}}", "testu2") + err = tk.Session().Auth(&auth.UserIdentity{Username: "testu2", Hostname: "localhost"}, sha1Password("password"), nil) + errTarget = privileges.GenerateAccountAutoLockErr(1, "testu2", "localhost", "unlimited", "unlimited") + require.Equal(t, err.Error(), errTarget.Error()) + checkAuthUser(t, tk, "testu2", 1, "Y") + + // Check the login error message after the account is locked. + err = tk.Session().Auth(&auth.UserIdentity{Username: "testu2", Hostname: "localhost"}, sha1Password("password"), nil) + require.Equal(t, err.Error(), errTarget.Error()) + checkAuthUser(t, tk, "testu2", 1, "Y") + + // Set FAILED_LOGIN_ATTEMPTS to 0 or PASSWORD_LOCK_TIME to 0. Check error messages after failed login once. + createAndCheck(tk, "CREATE USER 'testu3'@'localhost' IDENTIFIED BY 'testu3' FAILED_LOGIN_ATTEMPTS 0 PASSWORD_LOCK_TIME UNBOUNDED", + "{\"Password_locking\": {\"failed_login_attempts\": 0, \"password_lock_time_days\": -1}}", "testu3") + err = tk.Session().Auth(&auth.UserIdentity{Username: "testu3", Hostname: "localhost"}, sha1Password("password"), nil) + require.ErrorContains(t, err, "Access denied for user 'testu3'@'localhost' (using password: YES)") + checkAuthUser(t, tk, "testu3", 0, "") + createAndCheck(tk, "CREATE USER 'testu4'@'localhost' IDENTIFIED BY 'testu4' FAILED_LOGIN_ATTEMPTS 1 PASSWORD_LOCK_TIME 0", + "{\"Password_locking\": {\"failed_login_attempts\": 1, \"password_lock_time_days\": 0}}", "testu4") + err = tk.Session().Auth(&auth.UserIdentity{Username: "testu4", Hostname: "localhost"}, sha1Password("password"), nil) + require.ErrorContains(t, err, "Access denied for user 'testu4'@'localhost' (using password: YES)") + checkAuthUser(t, tk, "testu4", 0, "") + tk.MustExec("CREATE USER 'testu5'@'localhost' IDENTIFIED BY 'testu5' FAILED_LOGIN_ATTEMPTS 0 PASSWORD_LOCK_TIME 0") + err = tk.Session().Auth(&auth.UserIdentity{Username: "testu5", Hostname: "localhost"}, sha1Password("password"), nil) + require.ErrorContains(t, err, "Access denied for user 'testu5'@'localhost' (using password: YES)") + tk.MustQuery("select user_attributes from mysql.user where user= 'testu5' and host = 'localhost'").Check(testkit.Rows("{}")) + + tk.MustExec("DROP USER 'testu1'@'localhost', 'testu2'@'localhost', 'testu3'@'localhost', 'testu4'@'localhost', 'testu5'@'localhost'") + + // Create user specifying only comment. + tk.MustExec("CREATE USER 'testu1'@'localhost' IDENTIFIED BY 'testu1' comment 'testcomment' ") + tk.MustQuery("select user_attributes from mysql.user where user= 'testu1' and host = 'localhost'"). + Check(testkit.Rows("{\"metadata\": {\"comment\": \"testcomment\"}}")) + + // Create user specifying only attribute. + tk.MustExec("create user testu2@'localhost' identified by 'testu2' ATTRIBUTE '{\"attribute\":\"testattribute\"}'") + tk.MustQuery("select user_attributes from mysql.user where user= 'testu2' and host = 'localhost'"). + Check(testkit.Rows("{\"metadata\": {\"attribute\": \"testattribute\"}}")) + + // Create user specified comment and FAILED_LOGIN_ATTEMPTS and PASSWORD_LOCK_TIME. + tk.MustExec("create user testu3@'localhost' identified by 'testu3' FAILED_LOGIN_ATTEMPTS 1 " + + "PASSWORD_LOCK_TIME 1 comment 'testcomment'") + checkUserUserAttributes(tk, "testu3", "localhost", "1 1 {\"comment\": \"testcomment\"}") + + // Create user specified attribute and FAILED_LOGIN_ATTEMPTS and PASSWORD_LOCK_TIME. + tk.MustExec("create user testu4@'localhost' identified by 'testu4' FAILED_LOGIN_ATTEMPTS 1 " + + "PASSWORD_LOCK_TIME 1 ATTRIBUTE '{\"attribute\":\"testattribute\"}'") + checkUserUserAttributes(tk, "testu4", "localhost", "1 1 {\"attribute\": \"testattribute\"}") + + // Create user specified comment, FAILED_LOGIN_ATTEMPTS, and PASSWORD_LOCK_TIME, + // and confirm the user_attributes column value after login fails. + tk.MustExec("create user testu5@'localhost' identified by 'testu5' FAILED_LOGIN_ATTEMPTS 2 " + + "PASSWORD_LOCK_TIME 1 comment 'testcomment'") + checkUserUserAttributes(tk, "testu5", "localhost", "2 1 {\"comment\": \"testcomment\"}") + + // Confirm the user_attributes value after login failure once. + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "testu5", Hostname: "localhost"}, + sha1Password("password"), nil)) + checkUserUserAttributes(tk, "testu5", "localhost", "2 \"N\" 1 1 {\"comment\": \"testcomment\"}") + + // After the number of failed login attempts reaches FAILED_LOGIN_ATTEMPTS, check the account lock status. + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "testu5", Hostname: "localhost"}, + sha1Password("password"), nil)) + checkUserUserAttributes(tk, "testu5", "localhost", "2 \"Y\" 2 1 {\"comment\": \"testcomment\"}") + // After the account is locked, manually unlock the account and check the user_attributes value. + tk.MustExec("alter user testu5@'localhost' account unlock") + checkUserUserAttributes(tk, "testu5", "localhost", "2 \"N\" 0 1 {\"comment\": \"testcomment\"}") + + // Create user specified comment, FAILED_LOGIN_ATTEMPTS, and PASSWORD_LOCK_TIME, + // and confirm the user_attributes column value after login fails. + tk.MustExec("create user testu6@'localhost' identified by '' FAILED_LOGIN_ATTEMPTS 2 PASSWORD_LOCK_TIME 1 " + + "comment 'testcomment'") + // Confirm the user_attributes value after login failure once. + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "testu6", Hostname: "localhost"}, + sha1Password("password"), nil)) + checkUserUserAttributes(tk, "testu6", "localhost", "2 \"N\" 1 1 {\"comment\": \"testcomment\"}") + + // After the number of failed login attempts reaches FAILED_LOGIN_ATTEMPTS, check the account lock status. + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "testu6", Hostname: "localhost"}, + sha1Password("password"), nil)) + checkUserUserAttributes(tk, "testu6", "localhost", "2 \"Y\" 2 1 {\"comment\": \"testcomment\"}") + + // After the account is automatically locked, change the lock time and check + // the user_attributes value after logging in successfully. + changeAutoLockedLastChanged(tk, "-72h1s", "testu6") + sk1 := testkit.NewTestKit(t, store) + require.NoError(t, sk1.Session().Auth(&auth.UserIdentity{Username: "testu6", Hostname: "localhost"}, nil, nil)) + checkUserUserAttributes(tk, "testu6", "localhost", "3 \"N\" 0 3 {\"comment\": \"testcomment\"}") + + // Create user specified attributes, FAILED_LOGIN_ATTEMPTS, and PASSWORD_LOCK_TIME, + // and confirm the user_attributes column value after login fails. + tk.MustExec("create user testu7@'localhost' identified by 'testu7' FAILED_LOGIN_ATTEMPTS 2 PASSWORD_LOCK_TIME 1 " + + "ATTRIBUTE '{\"attribute\":\"testattribute\"}'") + checkUserUserAttributes(tk, "testu7", "localhost", "2 1 {\"attribute\": \"testattribute\"}") + + // Confirm the user_attributes value after login failure once. + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "testu7", Hostname: "localhost"}, + sha1Password("password"), nil)) + checkUserUserAttributes(tk, "testu7", "localhost", "2 \"N\" 1 1 {\"attribute\": \"testattribute\"}") + + // After the number of failed login attempts reaches FAILED_LOGIN_ATTEMPTS, check the account lock status. + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "testu7", Hostname: "localhost"}, + sha1Password("password"), nil)) + checkUserUserAttributes(tk, "testu7", "localhost", "2 \"Y\" 2 1 {\"attribute\": \"testattribute\"}") + + // After the account is locked, manually unlock the account and check the user_attributes value. + tk.MustExec("alter user testu7@'localhost' account unlock") + checkUserUserAttributes(tk, "testu7", "localhost", "2 \"N\" 0 1 {\"attribute\": \"testattribute\"}") + + tk.MustExec("create user testu8@'localhost' identified by '' FAILED_LOGIN_ATTEMPTS 2 PASSWORD_LOCK_TIME 1" + + " ATTRIBUTE '{\"attribute\":\"testattribute\"}'") + // Confirm the user_attributes value after login failure once. + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "testu8", Hostname: "localhost"}, + sha1Password("password"), nil)) + checkUserUserAttributes(tk, "testu8", "localhost", "2 \"N\" 1 1 {\"attribute\": \"testattribute\"}") + + // After the number of failed login attempts reaches FAILED_LOGIN_ATTEMPTS, check the account lock status. + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "testu8", Hostname: "localhost"}, + sha1Password("password"), nil)) + checkUserUserAttributes(tk, "testu8", "localhost", "2 \"Y\" 2 1 {\"attribute\": \"testattribute\"}") + + // After the account is automatically locked, change the lock time and check + // the user_attributes value after logging in successfully. + changeAutoLockedLastChanged(tk, "-72h1s", "testu8") + sk2 := testkit.NewTestKit(t, store) + require.NoError(t, sk2.Session().Auth(&auth.UserIdentity{Username: "testu8", Hostname: "localhost"}, nil, nil)) + checkUserUserAttributes(tk, "testu8", "localhost", "3 \"N\" 0 3 {\"attribute\": \"testattribute\"}") + + // FAILED_LOGIN_ATTEMPTS is set to 2 . check user_attributes value after + // the user login fails once ,and login success at second time. + tk.MustExec("create user testu9@'localhost' identified by '' FAILED_LOGIN_ATTEMPTS 2 PASSWORD_LOCK_TIME 1" + + " comment 'testcomment'") + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "testu9", Hostname: "localhost"}, + sha1Password("password"), nil)) + checkUserUserAttributes(tk, "testu9", "localhost", "2 \"N\" 1 1 {\"comment\": \"testcomment\"}") + sk3 := testkit.NewTestKit(t, store) + require.NoError(t, sk3.Session().Auth(&auth.UserIdentity{Username: "testu9", Hostname: "localhost"}, + nil, nil)) + checkUserUserAttributes(tk, "testu9", "localhost", "2 \"N\" 0 1 {\"comment\": \"testcomment\"}") + + // FAILED_LOGIN_ATTEMPTS or PASSWORD_LOCK_TIME is set to 0. Check user_attributes value after login fail. + tk.MustExec("create user testu10@'localhost' identified by '' FAILED_LOGIN_ATTEMPTS 2 PASSWORD_LOCK_TIME 0 " + + "comment 'testcomment'") + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "testu10", Hostname: "localhost"}, + sha1Password("password"), nil)) + checkUserUserAttributes(tk, "testu10", "localhost", "2 0 {\"comment\": \"testcomment\"}") + + tk.MustExec("create user testu11@'localhost' identified by '' FAILED_LOGIN_ATTEMPTS 0 PASSWORD_LOCK_TIME 2 " + + "comment 'testcomment'") + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "testu11", Hostname: "localhost"}, + sha1Password("password"), nil)) + checkUserUserAttributes(tk, "testu11", "localhost", "0 2 {\"comment\": \"testcomment\"}") + + // The account is automatically locked after the user specifies FAILED_LOGIN_ATTEMPTS and PASSWORD_LOCK_TIME. + // Change FAILED_LOGIN_ATTEMPTS or PASSWORD_LOCK_TIME to 0, and check whether the user can login. + tk.MustExec("create user testu12@'localhost' identified by '' FAILED_LOGIN_ATTEMPTS 2 PASSWORD_LOCK_TIME 1 " + + "comment 'testcomment'") + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "testu12", Hostname: "localhost"}, + sha1Password("password"), nil)) + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "testu12", Hostname: "localhost"}, + sha1Password("password"), nil)) + checkUserUserAttributes(tk, "testu12", "localhost", "2 \"Y\" 2 1 {\"comment\": \"testcomment\"}") + tk.MustExec("alter user testu12@'localhost' FAILED_LOGIN_ATTEMPTS 0") + checkUserUserAttributes(tk, "testu12", "localhost", "0 \"Y\" 2 1 {\"comment\": \"testcomment\"}") + sk4 := testkit.NewTestKit(t, store) + require.NoError(t, sk4.Session().Auth(&auth.UserIdentity{Username: "testu12", Hostname: "localhost"}, + nil, nil)) + + rootk := testkit.NewTestKit(t, store) + createAndCheck(tk, "CREATE USER 'u6'@'localhost' IDENTIFIED BY '' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 3", + "{\"Password_locking\": {\"failed_login_attempts\": 3, \"password_lock_time_days\": 3}}", "u6") + createAndCheck(tk, "CREATE USER 'u5'@'localhost' IDENTIFIED BY '' FAILED_LOGIN_ATTEMPTS 60 PASSWORD_LOCK_TIME 3", + "{\"Password_locking\": {\"failed_login_attempts\": 60, \"password_lock_time_days\": 3}}", "u5") + + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "u6", Hostname: "localhost"}, sha1Password("password"), nil)) + checkAuthUser(t, rootk, "u6", 1, "N") + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "u6", Hostname: "localhost"}, nil, nil)) + checkAuthUser(t, rootk, "u6", 0, "N") + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost"}, nil, nil)) + + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "u6", Hostname: "localhost"}, sha1Password("password"), nil)) + checkAuthUser(t, rootk, "u6", 1, "N") + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "u6", Hostname: "localhost"}, sha1Password("password"), nil)) + checkAuthUser(t, rootk, "u6", 2, "N") + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "u6", Hostname: "localhost"}, sha1Password("password"), nil)) + checkAuthUser(t, rootk, "u6", 3, "Y") + + changeAutoLockedLastChanged(rootk, "-72h1s", "u6") + loadUser(t, tk, 1, rootk) + checkAuthUser(t, rootk, "u6", 3, "Y") + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "u6", Hostname: "localhost"}, nil, nil)) + checkAuthUser(t, rootk, "u6", 0, "N") + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost"}, nil, nil)) + + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "u6", Hostname: "localhost"}, sha1Password("password"), nil)) + checkAuthUser(t, rootk, "u6", 1, "N") + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "u6", Hostname: "localhost"}, sha1Password("password"), nil)) + checkAuthUser(t, rootk, "u6", 2, "N") + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "u6", Hostname: "localhost"}, sha1Password("password"), nil)) + checkAuthUser(t, rootk, "u6", 3, "Y") + alterAndCheck(t, rootk, "ALTER USER 'u6'@'localhost' ACCOUNT UNLOCK;", "u6", 3, 3, 0) + loadUser(t, tk, 2, rootk) + checkAuthUser(t, rootk, "u6", 0, "N") + + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "u6", Hostname: "localhost"}, sha1Password("password"), nil)) + checkAuthUser(t, rootk, "u6", 1, "N") + alterAndCheck(t, rootk, "ALTER USER 'u6'@'localhost' ACCOUNT UNLOCK;", "u6", 3, 3, 0) + checkAuthUser(t, rootk, "u6", 0, "N") + + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "u6", Hostname: "localhost"}, sha1Password("password"), nil)) + checkAuthUser(t, rootk, "u6", 1, "N") + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "u6", Hostname: "localhost"}, sha1Password("password"), nil)) + checkAuthUser(t, rootk, "u6", 2, "N") + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "u6", Hostname: "localhost"}, sha1Password("password"), nil)) + checkAuthUser(t, rootk, "u6", 3, "Y") + changeAutoLockedLastChanged(rootk, "-72h1s", "u6") + loadUser(t, tk, 3, rootk) + checkAuthUser(t, rootk, "u6", 3, "Y") + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "u6", Hostname: "localhost"}, sha1Password("password"), nil)) + checkAuthUser(t, rootk, "u6", 1, "N") + + createAndCheck(rootk, "CREATE USER 'u1'@'localhost' IDENTIFIED BY '' FAILED_LOGIN_ATTEMPTS 3", + "{\"Password_locking\": {\"failed_login_attempts\": 3, \"password_lock_time_days\": 0}}", "u1") + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "u6", Hostname: "localhost"}, sha1Password("password"), nil)) + checkAuthUser(t, rootk, "u1", 0, "") + alterAndCheck(t, rootk, "ALTER USER 'u1'@'localhost' PASSWORD_LOCK_TIME 6;", "u1", 3, 6, 0) + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "u1", Hostname: "localhost"}, sha1Password("password"), nil)) + checkAuthUser(t, rootk, "u1", 1, "N") +} + +func TestFailedLoginTrackingAlterUser(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + // Create user specifying only comment. + tk.MustExec("CREATE USER 'testu1'@'localhost' IDENTIFIED BY 'testu1' comment 'testcomment' ") + tk.MustQuery("select user_attributes from mysql.user where user= 'testu1' and host = 'localhost'"). + Check(testkit.Rows("{\"metadata\": {\"comment\": \"testcomment\"}}")) + tk.MustExec("Alter USER 'testu1'@'localhost' comment ''") + tk.MustQuery("select user_attributes from mysql.user where user= 'testu1' and host = 'localhost'"). + Check(testkit.Rows("{\"metadata\": {\"comment\": \"\"}}")) + + // Create user specifying only attribute. + tk.MustExec("CREATE USER 'testu2'@'localhost' IDENTIFIED BY 'testu2' ATTRIBUTE '{\"attribute\":\"testattribute\"}'") + tk.MustQuery("select user_attributes from mysql.user where user= 'testu2' and host = 'localhost'"). + Check(testkit.Rows("{\"metadata\": {\"attribute\": \"testattribute\"}}")) + tk.MustExec("Alter USER 'testu2'@'localhost' ATTRIBUTE '{\"attribute\":\"test\"}'") + tk.MustQuery("select user_attributes from mysql.user where user= 'testu2' and host = 'localhost'"). + Check(testkit.Rows("{\"metadata\": {\"attribute\": \"test\"}}")) + + // Create a user and specify FAILED_LOGIN_ATTEMPTS, PASSWORD_LOCK_TIME, and COMMENT. + // Check the user_attributes value after alter user. + tk.MustExec("CREATE USER 'testu3'@'localhost' IDENTIFIED BY 'testu3' FAILED_LOGIN_ATTEMPTS 1 " + + "PASSWORD_LOCK_TIME 1 comment 'testcomment'") + checkUserUserAttributes(tk, "testu3", "localhost", "1 1 {\"comment\": \"testcomment\"}") + tk.MustExec("alter user 'testu3'@'localhost' FAILED_LOGIN_ATTEMPTS 0") + checkUserUserAttributes(tk, "testu3", "localhost", "0 1 {\"comment\": \"testcomment\"}") + tk.MustExec("alter user 'testu3'@'localhost' PASSWORD_LOCK_TIME 0") + tk.MustQuery("select JSON_EXTRACT(user_attributes, '$.Password_locking')," + + "JSON_EXTRACT(user_attributes, '$.metadata')from mysql.user where user= 'testu3' and host = 'localhost'"). + Check(testkit.Rows(" {\"comment\": \"testcomment\"}")) + + // Create a user and specify FAILED_LOGIN_ATTEMPTS, PASSWORD_LOCK_TIME, and ATTRIBUTE. + // Check the user_attributes value after alter user. + tk.MustExec("CREATE USER 'testu4'@'localhost' IDENTIFIED BY 'testu4' FAILED_LOGIN_ATTEMPTS 1 " + + "PASSWORD_LOCK_TIME 1 ATTRIBUTE '{\"attribute\":\"testattribute\"}'") + checkUserUserAttributes(tk, "testu4", "localhost", "1 1 {\"attribute\": \"testattribute\"}") + tk.MustExec("alter user 'testu4'@'localhost' FAILED_LOGIN_ATTEMPTS 0") + checkUserUserAttributes(tk, "testu4", "localhost", "0 1 {\"attribute\": \"testattribute\"}") + tk.MustExec("alter user 'testu4'@'localhost' PASSWORD_LOCK_TIME 0") + tk.MustQuery("select JSON_EXTRACT(user_attributes, '$.Password_locking')," + + "JSON_EXTRACT(user_attributes, '$.metadata')from mysql.user where user= 'testu4' and host = 'localhost'"). + Check(testkit.Rows(" {\"attribute\": \"testattribute\"}")) + + // Create a user and specify FAILED_LOGIN_ATTEMPTS, PASSWORD_LOCK_TIME, and ATTRIBUTE. + // Check the user_attributes value after alter user. + tk.MustExec("CREATE USER 'testu5'@'localhost' IDENTIFIED BY 'testu5' FAILED_LOGIN_ATTEMPTS 1 " + + "PASSWORD_LOCK_TIME 1 ATTRIBUTE '{\"attribute\":\"testattribute\"}'") + checkUserUserAttributes(tk, "testu5", "localhost", "1 1 {\"attribute\": \"testattribute\"}") + tk.MustExec("alter user 'testu5'@'localhost' FAILED_LOGIN_ATTEMPTS 0 PASSWORD_LOCK_TIME 0 ATTRIBUTE '{\"attribute\":\"test\"}'") + tk.MustQuery("select JSON_EXTRACT(user_attributes, '$.Password_locking')," + + "JSON_EXTRACT(user_attributes, '$.metadata')from mysql.user where user= 'testu5' and host = 'localhost'"). + Check(testkit.Rows(" {\"attribute\": \"test\"}")) + + // Create a user to specify a comment, modify the user to add an ATTRIBUTE, + // modify the user to delete a comment, and check the user_attributes value. + tk.MustExec("CREATE USER 'testu6'@'localhost' IDENTIFIED BY 'testu6' FAILED_LOGIN_ATTEMPTS 1 " + + "PASSWORD_LOCK_TIME 1 comment 'testcomment'") + checkUserUserAttributes(tk, "testu6", "localhost", "1 1 {\"comment\": \"testcomment\"}") + tk.MustExec("alter user 'testu6'@'localhost' ATTRIBUTE '{\"attribute\": \"testattribute\"}'") + checkUserUserAttributes(tk, "testu6", "localhost", "1 1 {\"attribute\": \"testattribute\", \"comment\": \"testcomment\"}") + tk.MustExec("alter user 'testu6'@'localhost' ATTRIBUTE '{\"comment\": null}'") + checkUserUserAttributes(tk, "testu6", "localhost", "1 1 {\"attribute\": \"testattribute\"}") + + // After consecutive login failures and the account is locked, + // change the values of FAILED_LOGIN_ATTEMPTS and PASSWORD_LOCK_TIME to 0 and check the user_attributes value + tk.MustExec("CREATE USER 'testu7'@'localhost' IDENTIFIED BY 'testu7' FAILED_LOGIN_ATTEMPTS 1 " + + "PASSWORD_LOCK_TIME 1 comment 'testcomment'") + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "testu7", Hostname: "localhost"}, + sha1Password("password"), nil)) + checkUserUserAttributes(tk, "testu7", "localhost", "1 \"Y\" 1 1 {\"comment\": \"testcomment\"}") + tk.MustExec("alter user 'testu7'@'localhost' FAILED_LOGIN_ATTEMPTS 0 PASSWORD_LOCK_TIME 0") + tk.MustQuery("select JSON_EXTRACT(user_attributes, '$.Password_locking'),JSON_EXTRACT(user_attributes,'$.metadata') " + + "from mysql.user where user='testu7' and host ='localhost'").Check(testkit.Rows(" {\"comment\": \"testcomment\"}")) + + // Create a user and specify FAILED_LOGIN_ATTEMPTS, PASSWORD_LOCK_TIME. + // Check the user_attributes value after alter user. + tk.MustExec("CREATE USER 'testu8'@'localhost' IDENTIFIED BY 'testu5' FAILED_LOGIN_ATTEMPTS 1 " + + "PASSWORD_LOCK_TIME 1") + checkUserUserAttributes(tk, "testu8", "localhost", "1 1 ") + tk.MustExec("alter user 'testu8'@'localhost' FAILED_LOGIN_ATTEMPTS 0 PASSWORD_LOCK_TIME 0") + tk.MustQuery("select user_attributes from mysql.user where user= 'testu8' and host = 'localhost'"). + Check(testkit.Rows("")) + + // Specify only FAILED_LOGIN_ATTEMPTS one attribute when creating user. + // Change the value to 0 and check the user_attributes value. + tk.MustExec("CREATE USER 'testu9'@'localhost' IDENTIFIED BY 'testu9' FAILED_LOGIN_ATTEMPTS 1 ") + tk.MustQuery("select JSON_EXTRACT(user_attributes, '$.Password_locking.failed_login_attempts') " + + "from mysql.user where user='testu9' and host ='localhost'").Check(testkit.Rows("1")) + tk.MustExec("ALTER USER 'testu9'@'localhost' FAILED_LOGIN_ATTEMPTS 0") + tk.MustQuery("select user_attributes from mysql.user where user='testu9' and host ='localhost'").Check(testkit.Rows("")) + + // Specify only PASSWORD_LOCK_TIME one attribute when creating user. + // Change the value to 0 and check the user_attributes value. + tk.MustExec("CREATE USER 'testu10'@'localhost' IDENTIFIED BY 'testu10' PASSWORD_LOCK_TIME 1 ") + tk.MustQuery("select JSON_EXTRACT(user_attributes, '$.Password_locking.password_lock_time_days') " + + "from mysql.user where user='testu10' and host ='localhost'").Check(testkit.Rows("1")) + tk.MustExec("ALTER USER 'testu10'@'localhost' PASSWORD_LOCK_TIME 0") + tk.MustQuery("select user_attributes from mysql.user where user='testu10' and host ='localhost'").Check(testkit.Rows("")) + + // Specify FAILED_LOGIN_ATTEMPTS and PASSWORD_LOCK_TIME attributes when creating user , + // change the values of the two attributes to 0, and check the value of user_attributes. + tk.MustExec("CREATE USER 'testu11'@'localhost' IDENTIFIED BY 'testu11' FAILED_LOGIN_ATTEMPTS 1 PASSWORD_LOCK_TIME 1 ") + tk.MustQuery("select JSON_EXTRACT(user_attributes, '$.Password_locking.failed_login_attempts')," + + "JSON_EXTRACT(user_attributes, '$.Password_locking.password_lock_time_days') " + + "from mysql.user where user='testu11' and host ='localhost'").Check(testkit.Rows("1 1")) + tk.MustExec("ALTER USER 'testu11'@'localhost' PASSWORD_LOCK_TIME 0") + tk.MustQuery("select JSON_EXTRACT(user_attributes, '$.Password_locking.failed_login_attempts')," + + "JSON_EXTRACT(user_attributes, '$.Password_locking.password_lock_time_days') " + + "from mysql.user where user='testu11' and host ='localhost'").Check(testkit.Rows("1 0")) + tk.MustExec("ALTER USER 'testu11'@'localhost' FAILED_LOGIN_ATTEMPTS 0") + tk.MustQuery("select user_attributes " + + "from mysql.user where user='testu11' and host ='localhost'").Check(testkit.Rows("")) + + rootTK := testkit.NewTestKit(t, store) + sql := new(strings.Builder) + checkUserAttributes := "select JSON_EXTRACT(user_attributes, '$.Password_locking.failed_login_attempts')," + + "JSON_EXTRACT(user_attributes, '$.Password_locking.auto_account_locked')," + + "JSON_EXTRACT(user_attributes, '$.Password_locking.failed_login_count')," + + "JSON_EXTRACT(user_attributes, '$.Password_locking.password_lock_time_days')," + + "JSON_EXTRACT(user_attributes, '$.metadata')from mysql.user where user= %? and host = %?" + err := domain.GetDomain(rootTK.Session()).NotifyUpdatePrivilege() + require.NoError(t, err) + rootTK.MustExec(`CREATE USER test1 IDENTIFIED BY '1234' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 3 COMMENT 'test'`) + err = tk.Session().Auth(&auth.UserIdentity{Username: "test1", Hostname: "%"}, sha1Password("1234"), nil) + require.NoError(t, err) + sqlexec.MustFormatSQL(sql, checkUserAttributes, "test1", "%") + rootTK.MustQuery(sql.String()).Check(testkit.Rows(`3 3 {"comment": "test"}`)) + tk = testkit.NewTestKit(t, store) + err = tk.Session().Auth(&auth.UserIdentity{Username: "test1", Hostname: "%"}, sha1Password(""), nil) + require.Error(t, err) + + rootTK.MustQuery(sql.String()).Check(testkit.Rows(`3 "N" 1 3 {"comment": "test"}`)) + rootTK.MustExec(`Alter user test1 FAILED_LOGIN_ATTEMPTS 4 `) + rootTK.MustQuery(sql.String()).Check(testkit.Rows(`4 "N" 1 3 {"comment": "test"}`)) + rootTK.MustExec(`Alter user test1 PASSWORD_LOCK_TIME 4 `) + rootTK.MustQuery(sql.String()).Check(testkit.Rows(`4 "N" 1 4 {"comment": "test"}`)) + rootTK.MustExec(`Alter user test1 COMMENT 'test1' `) + rootTK.MustQuery(sql.String()).Check(testkit.Rows(`4 "N" 1 4 {"comment": "test1"}`)) + rootTK.MustExec(`Alter user test1 FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 3 COMMENT 'test'`) + rootTK.MustQuery(sql.String()).Check(testkit.Rows(`3 "N" 1 3 {"comment": "test"}`)) + + err = tk.Session().Auth(&auth.UserIdentity{Username: "test1", Hostname: "%"}, sha1Password(""), nil) + require.Error(t, err) + err = tk.Session().Auth(&auth.UserIdentity{Username: "test1", Hostname: "%"}, sha1Password(""), nil) + require.Error(t, err) + rootTK.MustQuery(sql.String()).Check(testkit.Rows(`3 "Y" 3 3 {"comment": "test"}`)) + rootTK.MustExec(`Alter user test1 FAILED_LOGIN_ATTEMPTS 4 `) + rootTK.MustQuery(sql.String()).Check(testkit.Rows(`4 "Y" 3 3 {"comment": "test"}`)) + rootTK.MustExec(`Alter user test1 PASSWORD_LOCK_TIME 4 `) + rootTK.MustQuery(sql.String()).Check(testkit.Rows(`4 "Y" 3 4 {"comment": "test"}`)) + rootTK.MustExec(`Alter user test1 COMMENT 'test2' `) + rootTK.MustQuery(sql.String()).Check(testkit.Rows(`4 "Y" 3 4 {"comment": "test2"}`)) + rootTK.MustExec(`Alter user test1 account unlock `) + rootTK.MustQuery(sql.String()).Check(testkit.Rows(`4 "N" 0 4 {"comment": "test2"}`)) + + rootTK.MustExec(`Alter user test1 FAILED_LOGIN_ATTEMPTS 0 `) + rootTK.MustQuery(sql.String()).Check(testkit.Rows(`0 "N" 0 4 {"comment": "test2"}`)) + rootTK.MustExec(`Alter user test1 PASSWORD_LOCK_TIME 0 `) + rootTK.MustQuery(sql.String()).Check(testkit.Rows(` {"comment": "test2"}`)) + + rootTK.MustExec(`Alter user test1 account unlock `) + rootTK.MustQuery(sql.String()).Check(testkit.Rows(` {"comment": "test2"}`)) + rootTK.MustExec(`Alter user test1 FAILED_LOGIN_ATTEMPTS 4 `) + rootTK.MustQuery(sql.String()).Check(testkit.Rows(`4 0 {"comment": "test2"}`)) + rootTK.MustExec(`Alter user test1 account unlock `) + rootTK.MustQuery(sql.String()).Check(testkit.Rows(`4 "N" 0 0 {"comment": "test2"}`)) +} + +func TestFailedLoginTrackingCheckPrivilges(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + createAndCheck(tk, "CREATE USER 'testu1'@'localhost' IDENTIFIED BY '' FAILED_LOGIN_ATTEMPTS 1 PASSWORD_LOCK_TIME 1", + "{\"Password_locking\": {\"failed_login_attempts\": 1, \"password_lock_time_days\": 1}}", "testu1") + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "testu1", Hostname: "localhost"}, nil, nil)) + // Specify FAILED_LOGIN_ATTEMPTS and PASSWORD_LOCK_TIME attributes when creating user , + // Check user privileges after successful login. + tk.MustQuery(`show grants`).Check(testkit.Rows("GRANT USAGE ON *.* TO 'testu1'@'localhost'")) + tk.MustQuery(`select user()`).Check(testkit.Rows("testu1@localhost")) +} + +func TestUserPassword(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec(`set global validate_password.enable = ON`) + + testcases := []struct { + errSQL string + sucSQL string + user string + host string + rsJSON string + simplePassword string + strongPassword string + }{ + { + "CREATE USER 'u1'@'localhost' IDENTIFIED BY 'qwe123' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 4;", + "CREATE USER 'u1'@'localhost' IDENTIFIED BY '!@#HASHhs123' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 4;", + "u1", + "localhost", + "{\"Password_locking\": {\"failed_login_attempts\": 3, \"password_lock_time_days\": 4}}", + "qwe123", + "!@#HASHhs123", + }, + { + `CREATE USER 'u2'@'localhost' IDENTIFIED BY 'qwe123' FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 3 COMMENT 'Some statements to test create user'`, + `CREATE USER 'u2'@'localhost' IDENTIFIED BY '!@#HASHhs123' FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 3 COMMENT 'Some statements to test create user'`, + "u2", + "localhost", + "{\"Password_locking\": {\"failed_login_attempts\": 4, \"password_lock_time_days\": 3}, \"metadata\": {\"comment\": \"Some statements to test create user\"}}", + "qwe123", + "!@#HASHhs123", + }, + } + for _, tc := range testcases { + tk := testkit.NewTestKit(t, store) + rootk := testkit.NewTestKit(t, store) + createAndCheckToErr(t, rootk, tc.errSQL, tc.user) + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: tc.user, Hostname: tc.host}, sha1Password(tc.simplePassword), nil)) + createAndCheck(rootk, tc.sucSQL, tc.rsJSON, tc.user) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: tc.user, Hostname: tc.host}, sha1Password(tc.strongPassword), nil)) + } +} + +func TestPasswordExpiredAndTacking(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + user := "u3" + host := "localhost" + tk.MustExec(`set global validate_password.enable = ON`) + tk = testkit.NewTestKit(t, store) + createAndCheckToErr(t, tk, `CREATE USER 'u3'@'localhost' IDENTIFIED BY 'qwe123' PASSWORD EXPIRE INTERVAL 3 DAY FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 3 COMMENT 'Some statements to test create user'`, user) + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: user, Hostname: host}, sha1Password("qwe123"), nil)) + tk = testkit.NewTestKit(t, store) + createAndCheck(tk, `CREATE USER 'u3'@'localhost' IDENTIFIED BY '!@#HASHhs123' PASSWORD EXPIRE INTERVAL 3 DAY FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 3 COMMENT 'Some statements to test create user'`, + "{\"Password_locking\": {\"failed_login_attempts\": 4, \"password_lock_time_days\": 3}, \"metadata\": {\"comment\": \"Some statements to test create user\"}}", user) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: user, Hostname: host}, sha1Password("!@#HASHhs123"), nil)) + + tk = testkit.NewTestKit(t, store) + tk.MustExec(fmt.Sprintf("ALTER USER '%s'@'%s' PASSWORD EXPIRE NEVER", user, host)) + tk = testkit.NewTestKit(t, store) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: user, Hostname: host}, sha1Password("!@#HASHhs123"), nil)) + + loginFailedAncCheck(t, store, user, host, "password", 1, "N") + loginSucAncCheck(t, store, user, host, "!@#HASHhs123", 0, "N") + loginFailedAncCheck(t, store, user, host, "password", 1, "N") + loginFailedAncCheck(t, store, user, host, "password", 2, "N") + loginFailedAncCheck(t, store, user, host, "password", 3, "N") + loginFailedAncCheck(t, store, user, host, "password", 4, "Y") + + tk = testkit.NewTestKit(t, store) + tk.MustExec(fmt.Sprintf("ALTER USER '%s'@'%s' PASSWORD EXPIRE", user, host)) + tk = testkit.NewTestKit(t, store) + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: user, Hostname: host}, sha1Password("!@#HASHhs123"), nil)) +} + +func loginFailedAncCheck(t *testing.T, store kv.Storage, user, host, password string, failedLoginCount int64, autoAccountLocked string) { + tk := testkit.NewTestKit(t, store) + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: user, Hostname: host}, sha1Password(password), nil)) + checkAuthUser(t, tk, user, failedLoginCount, autoAccountLocked) +} + +func loginSucAncCheck(t *testing.T, store kv.Storage, user, host, password string, failedLoginCount int64, autoAccountLocked string) { + tk := testkit.NewTestKit(t, store) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: user, Hostname: host}, sha1Password(password), nil)) + tk = testkit.NewTestKit(t, store) + checkAuthUser(t, tk, user, failedLoginCount, autoAccountLocked) +} + +func loadUser(t *testing.T, tk *testkit.TestKit, useCount int64, rootk *testkit.TestKit) { + require.Error(t, tk.Session().Auth(&auth.UserIdentity{Username: "u5", Hostname: "localhost"}, sha1Password("password"), nil)) + checkAuthUser(t, rootk, "u5", useCount, "N") +} + +func changeAutoLockedLastChanged(tk *testkit.TestKit, ds, user string) { + SQL := "UPDATE `mysql`.`User` SET user_attributes=json_merge_patch(user_attributes, '{\"Password_locking\": {\"failed_login_attempts\": 3," + + "\"password_lock_time_days\": 3,\"auto_account_locked\": \"Y\",\"failed_login_count\": 3,\"auto_locked_last_changed\": \"%s\"}}') " + + "WHERE Host='localhost' and User='%s'" + d, _ := time.ParseDuration(ds) + changeTime := time.Now().Add(d).Format(time.UnixDate) + SQL = fmt.Sprintf(SQL, changeTime, user) + tk.MustExec(SQL) + domain.GetDomain(tk.Session()).NotifyUpdatePrivilege() +} + +func checkUserUserAttributes(tk *testkit.TestKit, user, host, row string) { + sqlTemplate := "select JSON_EXTRACT(user_attributes, '$.Password_locking.failed_login_attempts')," + + "JSON_EXTRACT(user_attributes, '$.Password_locking.auto_account_locked')," + + "JSON_EXTRACT(user_attributes, '$.Password_locking.failed_login_count')," + + "JSON_EXTRACT(user_attributes, '$.Password_locking.password_lock_time_days')," + + "JSON_EXTRACT(user_attributes, '$.metadata')from mysql.user where user= %? and host = %?" + userAttributesSQL := new(strings.Builder) + sqlexec.MustFormatSQL(userAttributesSQL, sqlTemplate, user, host) + tk.MustQuery(userAttributesSQL.String()).Check(testkit.Rows(row)) +} + +func alterAndCheck(t *testing.T, tk *testkit.TestKit, sql string, user string, failedLoginAttempts, passwordLockTimeDays, failedLoginCount int64) { + tk.MustExec(sql) + userAttributesSQL := selectSQL(user) + resBuff := bytes.NewBufferString("") + rs := tk.MustQuery(userAttributesSQL) + for _, row := range rs.Rows() { + _, err := fmt.Fprintf(resBuff, "%s\n", row) + require.NoError(t, err) + } + err := checkUser(t, resBuff.String(), failedLoginAttempts, passwordLockTimeDays, failedLoginCount) + require.NoError(t, err) +} + +func checkUser(t *testing.T, rs string, failedLoginAttempts, passwordLockTimeDays, failedLoginCount int64) error { + var ua []userAttributes + if err := json.Unmarshal([]byte(rs), &ua); err != nil { + return err + } + require.Equal(t, failedLoginAttempts, ua[0].PasswordLocking.FailedLoginAttempts) + require.Equal(t, passwordLockTimeDays, ua[0].PasswordLocking.PasswordLockTimeDays) + require.Equal(t, failedLoginCount, ua[0].PasswordLocking.FailedLoginCount) + return nil +} + +func createAndCheck(tk *testkit.TestKit, sql, rsJSON, user string) { + tk.MustExec(sql) + sql = selectSQL(user) + tk.MustQuery(sql).Check(testkit.Rows(rsJSON)) +} + +func createAndCheckToErr(t *testing.T, tk *testkit.TestKit, sql, user string) { + tk.MustExecToErr(sql) + sql = selectSQL(user) + require.Equal(t, 0, len(tk.MustQuery(sql).Rows())) +} + +func checkAuthUser(t *testing.T, tk *testkit.TestKit, user string, failedLoginCount int64, autoAccountLocked string) { + userAttributesSQL := selectSQL(user) + resBuff := bytes.NewBufferString("") + rs := tk.MustQuery(userAttributesSQL) + for _, row := range rs.Rows() { + _, err := fmt.Fprintf(resBuff, "%s\n", row) + require.NoError(t, err) + } + var ua []userAttributes + err := json.Unmarshal(resBuff.Bytes(), &ua) + require.NoError(t, err) + require.Equal(t, failedLoginCount, ua[0].PasswordLocking.FailedLoginCount) + require.Equal(t, autoAccountLocked, ua[0].PasswordLocking.AutoAccountLocked) +} + +func selectSQL(user string) string { + userAttributesSQL := new(strings.Builder) + sqlexec.MustFormatSQL(userAttributesSQL, "SELECT user_attributes from mysql.user WHERE USER = %? AND HOST = 'localhost' for update", user) + return userAttributesSQL.String() +} + +type passwordLocking struct { + FailedLoginAttempts int64 `json:"failed_login_attempts"` + PasswordLockTimeDays int64 `json:"password_lock_time_days"` + AutoAccountLocked string `json:"auto_account_locked"` + FailedLoginCount int64 `json:"failed_login_count"` + AutoLockedLastChanged string `json:"auto_locked_last_changed"` +} + +type metadata struct { + Comment string `json:"comment"` +} + +type userAttributes struct { + PasswordLocking passwordLocking `json:"Password_locking"` + Metadata metadata `json:"metadata"` +} diff --git a/executor/simpletest/simple_test.go b/executor/simpletest/simple_test.go index 738a5808be6fa..06f7e72c030d5 100644 --- a/executor/simpletest/simple_test.go +++ b/executor/simpletest/simple_test.go @@ -747,7 +747,7 @@ func TestUser(t *testing.T) { alterUserSQL = `ALTER USER 'test1'@'localhost' IDENTIFIED BY '222', 'test_not_exist'@'localhost' IDENTIFIED BY '111';` tk.MustGetErrCode(alterUserSQL, mysql.ErrCannotUser) result = tk.MustQuery(`SELECT authentication_string FROM mysql.User WHERE User="test1" and Host="localhost"`) - result.Check(testkit.Rows(auth.EncodePassword("222"))) + result.Check(testkit.Rows(auth.EncodePassword("111"))) alterUserSQL = `ALTER USER 'test4'@'localhost' IDENTIFIED WITH 'auth_socket';` tk.MustExec(alterUserSQL) result = tk.MustQuery(`SELECT plugin FROM mysql.User WHERE User="test4" and Host="localhost"`) diff --git a/executor/slow_query.go b/executor/slow_query.go index 395d8f4eba8ac..f7878839ae24b 100644 --- a/executor/slow_query.go +++ b/executor/slow_query.go @@ -52,6 +52,8 @@ import ( "golang.org/x/exp/slices" ) +type signalsKey struct{} + // ParseSlowLogBatchSize is the batch size of slow-log lines for a worker to parse, exported for testing. var ParseSlowLogBatchSize = 64 @@ -273,33 +275,7 @@ func (sc *slowLogChecker) isTimeValid(t types.Time) bool { } func getOneLine(reader *bufio.Reader) ([]byte, error) { - var resByte []byte - lineByte, isPrefix, err := reader.ReadLine() - if isPrefix { - // Need to read more data. - resByte = make([]byte, len(lineByte), len(lineByte)*2) - } else { - resByte = make([]byte, len(lineByte)) - } - // Use copy here to avoid shallow copy problem. - copy(resByte, lineByte) - if err != nil { - return resByte, err - } - - var tempLine []byte - for isPrefix { - tempLine, isPrefix, err = reader.ReadLine() - resByte = append(resByte, tempLine...) // nozero - // Use the max value of max_allowed_packet to check the single line length. - if len(resByte) > int(variable.MaxOfMaxAllowedPacket) { - return resByte, errors.Errorf("single line length exceeds limit: %v", variable.MaxOfMaxAllowedPacket) - } - if err != nil { - return resByte, err - } - } - return resByte, err + return util.ReadLine(reader, int(variable.MaxOfMaxAllowedPacket)) } type offset struct { @@ -474,7 +450,7 @@ func (e *slowQueryRetriever) parseSlowLog(ctx context.Context, sctx sessionctx.C } failpoint.Inject("mockReadSlowLogSlow", func(val failpoint.Value) { if val.(bool) { - signals := ctx.Value("signals").([]chan int) + signals := ctx.Value(signalsKey{}).([]chan int) signals[0] <- 1 <-signals[1] } @@ -622,6 +598,9 @@ func (e *slowQueryRetriever) parseLog(ctx context.Context, sctx sessionctx.Conte valid = e.setColumnValue(sctx, row, tz, variable.SlowLogHostStr, host, e.checker, fileLine) } else if strings.HasPrefix(line, variable.SlowLogCopBackoffPrefix) { valid = e.setColumnValue(sctx, row, tz, variable.SlowLogBackoffDetail, line, e.checker, fileLine) + } else if strings.HasPrefix(line, variable.SlowLogWarnings) { + line = line[len(variable.SlowLogWarnings+variable.SlowLogSpaceMarkStr):] + valid = e.setColumnValue(sctx, row, tz, variable.SlowLogWarnings, line, e.checker, fileLine) } else { fields, values := splitByColon(line) for i := 0; i < len(fields); i++ { @@ -781,7 +760,7 @@ func getColumnValueFactoryByName(sctx sessionctx.Context, colName string, column }, nil case variable.SlowLogUserStr, variable.SlowLogHostStr, execdetails.BackoffTypesStr, variable.SlowLogDBStr, variable.SlowLogIndexNamesStr, variable.SlowLogDigestStr, variable.SlowLogStatsInfoStr, variable.SlowLogCopProcAddr, variable.SlowLogCopWaitAddr, variable.SlowLogPlanDigest, - variable.SlowLogPrevStmt, variable.SlowLogQuerySQLStr: + variable.SlowLogPrevStmt, variable.SlowLogQuerySQLStr, variable.SlowLogWarnings: return func(row []types.Datum, value string, tz *time.Location, checker *slowLogChecker) (valid bool, err error) { row[columnIdx] = types.NewStringDatum(value) return true, nil diff --git a/executor/slow_query_sql_test.go b/executor/slow_query_sql_test.go index a77e32e3bfb16..cdf13f2a9ccf9 100644 --- a/executor/slow_query_sql_test.go +++ b/executor/slow_query_sql_test.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/parser/auth" + "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/testkit/testdata" "github.com/pingcap/tidb/util/logutil" @@ -46,8 +47,6 @@ func TestSlowQueryWithoutSlowLog(t *testing.T) { } func TestSlowQuerySensitiveQuery(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) originCfg := config.GetGlobalConfig() newCfg := *originCfg @@ -57,11 +56,15 @@ func TestSlowQuerySensitiveQuery(t *testing.T) { newCfg.Log.SlowQueryFile = f.Name() config.StoreGlobalConfig(&newCfg) defer func() { - tk.MustExec("set tidb_slow_log_threshold=300;") config.StoreGlobalConfig(originCfg) require.NoError(t, os.Remove(newCfg.Log.SlowQueryFile)) }() require.NoError(t, logutil.InitLogger(newCfg.Log.ToLogConfig())) + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + defer func() { + tk.MustExec("set tidb_slow_log_threshold=300;") + }() tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) tk.MustExec("set tidb_slow_log_threshold=0;") @@ -80,8 +83,6 @@ func TestSlowQuerySensitiveQuery(t *testing.T) { } func TestSlowQueryPrepared(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) originCfg := config.GetGlobalConfig() newCfg := *originCfg @@ -91,12 +92,16 @@ func TestSlowQueryPrepared(t *testing.T) { newCfg.Log.SlowQueryFile = f.Name() config.StoreGlobalConfig(&newCfg) defer func() { - tk.MustExec("set tidb_slow_log_threshold=300;") - tk.MustExec("set tidb_redact_log=0;") config.StoreGlobalConfig(originCfg) require.NoError(t, os.Remove(newCfg.Log.SlowQueryFile)) }() require.NoError(t, logutil.InitLogger(newCfg.Log.ToLogConfig())) + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + defer func() { + tk.MustExec("set tidb_slow_log_threshold=300;") + tk.MustExec("set tidb_redact_log=0;") + }() tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) tk.MustExec("set tidb_slow_log_threshold=0;") @@ -116,8 +121,6 @@ func TestSlowQueryPrepared(t *testing.T) { } func TestLogSlowLogIndex(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) f, err := os.CreateTemp("", "tidb-slow-*.log") require.NoError(t, err) require.NoError(t, f.Close()) @@ -127,6 +130,8 @@ func TestLogSlowLogIndex(t *testing.T) { conf.Log.SlowQueryFile = f.Name() }) require.NoError(t, logutil.InitLogger(config.GetGlobalConfig().Log.ToLogConfig())) + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) tk.MustExec("use test") @@ -140,9 +145,6 @@ func TestLogSlowLogIndex(t *testing.T) { } func TestSlowQuery(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - f, err := os.CreateTemp("", "tidb-slow-*.log") require.NoError(t, err) _, err = f.WriteString(` @@ -197,6 +199,8 @@ SELECT original_sql, bind_sql, default_db, status, create_time, update_time, cha require.NoError(t, os.Remove(newCfg.Log.SlowQueryFile)) }() require.NoError(t, logutil.InitLogger(newCfg.Log.ToLogConfig())) + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) tk.MustQuery("select count(*) from `information_schema`.`slow_query` where time > '2020-10-16 20:08:13' and time < '2020-10-16 21:08:13'").Check(testkit.Rows("1")) @@ -208,10 +212,6 @@ SELECT original_sql, bind_sql, default_db, status, create_time, update_time, cha } func TestIssue37066(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) - originCfg := config.GetGlobalConfig() newCfg := *originCfg f, err := os.CreateTemp("", "tidb-slow-*.log") @@ -224,6 +224,9 @@ func TestIssue37066(t *testing.T) { require.NoError(t, os.Remove(newCfg.Log.SlowQueryFile)) }() require.NoError(t, logutil.InitLogger(newCfg.Log.ToLogConfig())) + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) tk.MustExec("set tidb_slow_log_threshold=0;") defer func() { @@ -281,3 +284,61 @@ func TestIssue37066(t *testing.T) { } } } + +func TestWarningsInSlowQuery(t *testing.T) { + // Prepare the slow log + originCfg := config.GetGlobalConfig() + newCfg := *originCfg + f, err := os.CreateTemp("", "tidb-slow-*.log") + require.NoError(t, err) + newCfg.Log.SlowQueryFile = f.Name() + config.StoreGlobalConfig(&newCfg) + defer func() { + config.StoreGlobalConfig(originCfg) + require.NoError(t, f.Close()) + require.NoError(t, os.Remove(newCfg.Log.SlowQueryFile)) + }() + require.NoError(t, logutil.InitLogger(newCfg.Log.ToLogConfig())) + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) + tk.MustExec("set tidb_slow_log_threshold=0;") + defer func() { + tk.MustExec("set tidb_slow_log_threshold=300;") + }() + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, c int, d int, e int, f int, g int, h set('11', '22', '33')," + + "primary key (a), unique key c_d_e (c, d, e), unique key f (f), unique key f_g (f, g), key g (g))") + tbl, err := dom.InfoSchema().TableByName(model.CIStr{O: "test", L: "test"}, model.CIStr{O: "t", L: "t"}) + require.NoError(t, err) + tbl.Meta().TiFlashReplica = &model.TiFlashReplicaInfo{Count: 1, Available: true} + + var input []string + var output []struct { + SQL string + Result string + } + slowQuerySuiteData.LoadTestCases(t, &input, &output) + for i, test := range input { + comment := fmt.Sprintf("case:%v sql:%s", i, test) + if len(test) < 6 || test[:6] != "select" { + tk.MustExec(test) + } else { + tk.MustQuery(test) + } + res := testdata.ConvertRowsToStrings( + tk.MustQuery("select warnings from information_schema.slow_query " + + `where query = "` + test + `;" ` + + "order by time desc limit 1").Rows(), + ) + require.Lenf(t, res, 1, comment) + + testdata.OnRecord(func() { + output[i].SQL = test + output[i].Result = res[0] + }) + require.Equal(t, output[i].Result, res[0]) + } +} diff --git a/executor/slow_query_test.go b/executor/slow_query_test.go index 32412d2f1ac70..fe2a5b68a329a 100644 --- a/executor/slow_query_test.go +++ b/executor/slow_query_test.go @@ -55,7 +55,7 @@ func parseLog(retriever *slowQueryRetriever, sctx sessionctx.Context, reader *bu } func newSlowQueryRetriever() (*slowQueryRetriever, error) { - newISBuilder, err := infoschema.NewBuilder(nil, nil).InitWithDBInfos(nil, nil, 0) + newISBuilder, err := infoschema.NewBuilder(nil, nil).InitWithDBInfos(nil, nil, nil, 0) if err != nil { return nil, err } @@ -160,7 +160,7 @@ select * from t;` expectRecordString := `2019-04-28 15:24:04.309074,` + `405888132465033227,root,localhost,0,57,0.12,0.216905,` + `0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0.38,0.021,0,0,0,1,637,0,10,10,10,10,100,,,1,42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772,t1:1,t2:2,` + - `0.1,0.2,0.03,127.0.0.1:20160,0.05,0.6,0.8,0.0.0.0:20160,70724,65536,0,0,0,0,0,` + + `0.1,0.2,0.03,127.0.0.1:20160,0.05,0.6,0.8,0.0.0.0:20160,70724,65536,0,0,0,0,0,,` + `Cop_backoff_regionMiss_total_times: 200 Cop_backoff_regionMiss_total_time: 0.2 Cop_backoff_regionMiss_max_time: 0.2 Cop_backoff_regionMiss_max_addr: 127.0.0.1 Cop_backoff_regionMiss_avg_time: 0.2 Cop_backoff_regionMiss_p90_time: 0.2 Cop_backoff_rpcPD_total_times: 200 Cop_backoff_rpcPD_total_time: 0.2 Cop_backoff_rpcPD_max_time: 0.2 Cop_backoff_rpcPD_max_addr: 127.0.0.1 Cop_backoff_rpcPD_avg_time: 0.2 Cop_backoff_rpcPD_p90_time: 0.2 Cop_backoff_rpcTiKV_total_times: 200 Cop_backoff_rpcTiKV_total_time: 0.2 Cop_backoff_rpcTiKV_max_time: 0.2 Cop_backoff_rpcTiKV_max_addr: 127.0.0.1 Cop_backoff_rpcTiKV_avg_time: 0.2 Cop_backoff_rpcTiKV_p90_time: 0.2,` + `0,0,1,0,1,1,0,,60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4,` + `,update t set i = 1;,select * from t;` @@ -183,7 +183,7 @@ select * from t;` expectRecordString = `2019-04-28 15:24:04.309074,` + `405888132465033227,root,localhost,0,57,0.12,0.216905,` + `0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0.38,0.021,0,0,0,1,637,0,10,10,10,10,100,,,1,42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772,t1:1,t2:2,` + - `0.1,0.2,0.03,127.0.0.1:20160,0.05,0.6,0.8,0.0.0.0:20160,70724,65536,0,0,0,0,0,` + + `0.1,0.2,0.03,127.0.0.1:20160,0.05,0.6,0.8,0.0.0.0:20160,70724,65536,0,0,0,0,0,,` + `Cop_backoff_regionMiss_total_times: 200 Cop_backoff_regionMiss_total_time: 0.2 Cop_backoff_regionMiss_max_time: 0.2 Cop_backoff_regionMiss_max_addr: 127.0.0.1 Cop_backoff_regionMiss_avg_time: 0.2 Cop_backoff_regionMiss_p90_time: 0.2 Cop_backoff_rpcPD_total_times: 200 Cop_backoff_rpcPD_total_time: 0.2 Cop_backoff_rpcPD_max_time: 0.2 Cop_backoff_rpcPD_max_addr: 127.0.0.1 Cop_backoff_rpcPD_avg_time: 0.2 Cop_backoff_rpcPD_p90_time: 0.2 Cop_backoff_rpcTiKV_total_times: 200 Cop_backoff_rpcTiKV_total_time: 0.2 Cop_backoff_rpcTiKV_max_time: 0.2 Cop_backoff_rpcTiKV_max_addr: 127.0.0.1 Cop_backoff_rpcTiKV_avg_time: 0.2 Cop_backoff_rpcTiKV_p90_time: 0.2,` + `0,0,1,0,1,1,0,,60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4,` + `,update t set i = 1;,select * from t;` @@ -666,7 +666,7 @@ select * from t;` retriever, err := newSlowQueryRetriever() require.NoError(t, err) var signal1, signal2 = make(chan int, 1), make(chan int, 1) - ctx := context.WithValue(context.Background(), "signals", []chan int{signal1, signal2}) + ctx := context.WithValue(context.Background(), signalsKey{}, []chan int{signal1, signal2}) ctx, cancel := context.WithCancel(ctx) err = failpoint.Enable("github.com/pingcap/tidb/executor/mockReadSlowLogSlow", "return(true)") require.NoError(t, err) diff --git a/executor/stmtsummary.go b/executor/stmtsummary.go new file mode 100644 index 0000000000000..de7cbef6e1aa6 --- /dev/null +++ b/executor/stmtsummary.go @@ -0,0 +1,408 @@ +// Copyright 2023 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 executor + +import ( + "context" + + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + plannercore "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/execdetails" + "github.com/pingcap/tidb/util/set" + "github.com/pingcap/tidb/util/stmtsummary" + stmtsummaryv2 "github.com/pingcap/tidb/util/stmtsummary/v2" +) + +const ( + defaultRetrieveCount = 1024 +) + +func buildStmtSummaryRetriever( + ctx sessionctx.Context, + table *model.TableInfo, + columns []*model.ColumnInfo, + extractor *plannercore.StatementsSummaryExtractor, +) memTableRetriever { + if extractor == nil { + extractor = &plannercore.StatementsSummaryExtractor{} + } + if extractor.Digests.Empty() { + extractor.Digests = nil + } + + var retriever memTableRetriever + if extractor.SkipRequest { + retriever = &dummyRetriever{} + } else if config.GetGlobalConfig().Instance.StmtSummaryEnablePersistent { + retriever = &stmtSummaryRetrieverV2{ + stmtSummary: stmtsummaryv2.GlobalStmtSummary, + table: table, + columns: columns, + digests: extractor.Digests, + timeRanges: buildTimeRanges(extractor.CoarseTimeRange), + } + } else { + retriever = &stmtSummaryRetriever{ + table: table, + columns: columns, + digests: extractor.Digests, + } + } + + return retriever +} + +type dummyRetriever struct { + dummyCloser +} + +func (e *dummyRetriever) retrieve(_ context.Context, _ sessionctx.Context) ([][]types.Datum, error) { + return nil, nil +} + +// stmtSummaryRetriever is used to retrieve statements summary. +type stmtSummaryRetriever struct { + table *model.TableInfo + columns []*model.ColumnInfo + digests set.StringSet + + // lazily initialized + rowsReader *rowsReader +} + +func (e *stmtSummaryRetriever) retrieve(ctx context.Context, sctx sessionctx.Context) ([][]types.Datum, error) { + if err := e.ensureRowsReader(sctx); err != nil { + return nil, err + } + return e.rowsReader.read(defaultRetrieveCount) +} + +func (e *stmtSummaryRetriever) close() error { + if e.rowsReader != nil { + return e.rowsReader.close() + } + return nil +} + +func (e *stmtSummaryRetriever) getRuntimeStats() execdetails.RuntimeStats { + return nil +} + +func (e *stmtSummaryRetriever) ensureRowsReader(sctx sessionctx.Context) error { + if e.rowsReader != nil { + return nil + } + + var err error + if isEvictedTable(e.table.Name.O) { + e.rowsReader, err = e.initEvictedRowsReader(sctx) + } else { + e.rowsReader, err = e.initSummaryRowsReader(sctx) + } + + return err +} + +func (e *stmtSummaryRetriever) initEvictedRowsReader(sctx sessionctx.Context) (*rowsReader, error) { + if err := checkPrivilege(sctx); err != nil { + return nil, err + } + + rows := stmtsummary.StmtSummaryByDigestMap.ToEvictedCountDatum() + if !isClusterTable(e.table.Name.O) { + // rows are full-columned, so we need to adjust them to the required columns. + return newSimpleRowsReader(adjustColumns(rows, e.columns, e.table)), nil + } + + // Additional column `INSTANCE` for cluster table + rows, err := infoschema.AppendHostInfoToRows(sctx, rows) + if err != nil { + return nil, err + } + // rows are full-columned, so we need to adjust them to the required columns. + return newSimpleRowsReader(adjustColumns(rows, e.columns, e.table)), nil +} + +func (e *stmtSummaryRetriever) initSummaryRowsReader(sctx sessionctx.Context) (*rowsReader, error) { + vars := sctx.GetSessionVars() + user := vars.User + tz := vars.StmtCtx.TimeZone + columns := e.columns + priv := hasPriv(sctx, mysql.ProcessPriv) + instanceAddr, err := clusterTableInstanceAddr(sctx, e.table.Name.O) + if err != nil { + return nil, err + } + + reader := stmtsummary.NewStmtSummaryReader(user, priv, columns, instanceAddr, tz) + if e.digests != nil { + // set checker to filter out statements not matching the given digests + checker := stmtsummary.NewStmtSummaryChecker(e.digests) + reader.SetChecker(checker) + } + + var rows [][]types.Datum + if isCurrentTable(e.table.Name.O) { + rows = reader.GetStmtSummaryCurrentRows() + } + if isHistoryTable(e.table.Name.O) { + rows = reader.GetStmtSummaryHistoryRows() + } + return newSimpleRowsReader(rows), nil +} + +// stmtSummaryRetriever is used to retrieve statements summary when +// config.GetGlobalConfig().Instance.StmtSummaryEnablePersistent is true +type stmtSummaryRetrieverV2 struct { + stmtSummary *stmtsummaryv2.StmtSummary + table *model.TableInfo + columns []*model.ColumnInfo + digests set.StringSet + timeRanges []*stmtsummaryv2.StmtTimeRange + + // lazily initialized + rowsReader *rowsReader +} + +func (r *stmtSummaryRetrieverV2) retrieve(ctx context.Context, sctx sessionctx.Context) ([][]types.Datum, error) { + if err := r.ensureRowsReader(ctx, sctx); err != nil { + return nil, err + } + return r.rowsReader.read(defaultRetrieveCount) +} + +func (r *stmtSummaryRetrieverV2) close() error { + if r.rowsReader != nil { + return r.rowsReader.close() + } + return nil +} + +func (r *stmtSummaryRetrieverV2) getRuntimeStats() execdetails.RuntimeStats { + return nil +} + +func (r *stmtSummaryRetrieverV2) ensureRowsReader(ctx context.Context, sctx sessionctx.Context) error { + if r.rowsReader != nil { + return nil + } + + var err error + if isEvictedTable(r.table.Name.O) { + r.rowsReader, err = r.initEvictedRowsReader(sctx) + } else { + r.rowsReader, err = r.initSummaryRowsReader(ctx, sctx) + } + + return err +} + +func (r *stmtSummaryRetrieverV2) initEvictedRowsReader(sctx sessionctx.Context) (*rowsReader, error) { + if err := checkPrivilege(sctx); err != nil { + return nil, err + } + + var rows [][]types.Datum + + row := r.stmtSummary.Evicted() + if row != nil { + rows = append(rows, row) + } + if !isClusterTable(r.table.Name.O) { + // rows are full-columned, so we need to adjust them to the required columns. + return newSimpleRowsReader(adjustColumns(rows, r.columns, r.table)), nil + } + + // Additional column `INSTANCE` for cluster table + rows, err := infoschema.AppendHostInfoToRows(sctx, rows) + if err != nil { + return nil, err + } + // rows are full-columned, so we need to adjust them to the required columns. + return newSimpleRowsReader(adjustColumns(rows, r.columns, r.table)), nil +} + +func (r *stmtSummaryRetrieverV2) initSummaryRowsReader(ctx context.Context, sctx sessionctx.Context) (*rowsReader, error) { + vars := sctx.GetSessionVars() + user := vars.User + tz := vars.StmtCtx.TimeZone + stmtSummary := r.stmtSummary + columns := r.columns + timeRanges := r.timeRanges + digests := r.digests + priv := hasPriv(sctx, mysql.ProcessPriv) + instanceAddr, err := clusterTableInstanceAddr(sctx, r.table.Name.O) + if err != nil { + return nil, err + } + + mem := stmtsummaryv2.NewMemReader(stmtSummary, columns, instanceAddr, tz, user, priv, digests, timeRanges) + memRows := mem.Rows() + + var rowsReader *rowsReader + if isCurrentTable(r.table.Name.O) { + rowsReader = newSimpleRowsReader(memRows) + } + if isHistoryTable(r.table.Name.O) { + // history table should return all rows including mem and disk + concurrent := sctx.GetSessionVars().Concurrency.DistSQLScanConcurrency() + history, err := stmtsummaryv2.NewHistoryReader(ctx, columns, instanceAddr, tz, user, priv, digests, timeRanges, concurrent) + if err != nil { + return nil, err + } + rowsReader = newRowsReader(memRows, history) + } + + return rowsReader, nil +} + +type rowsPuller interface { + Closeable + Rows() ([][]types.Datum, error) +} + +type rowsReader struct { + puller rowsPuller + rows [][]types.Datum +} + +func newSimpleRowsReader(rows [][]types.Datum) *rowsReader { + return &rowsReader{rows: rows} +} + +func newRowsReader(rows [][]types.Datum, puller rowsPuller) *rowsReader { + return &rowsReader{puller: puller, rows: rows} +} + +func (r *rowsReader) read(maxCount int) ([][]types.Datum, error) { + if err := r.pull(); err != nil { + return nil, err + } + + if maxCount >= len(r.rows) { + ret := r.rows + r.rows = nil + return ret, nil + } + ret := r.rows[:maxCount] + r.rows = r.rows[maxCount:] + return ret, nil +} + +func (r *rowsReader) pull() error { + if r.puller == nil { + return nil + } + // there are remaining rows + if len(r.rows) > 0 { + return nil + } + + rows, err := r.puller.Rows() + if err != nil { + return err + } + // pulled new rows from the puller + if len(rows) != 0 { + r.rows = rows + return nil + } + + // reach the end of the puller + err = r.puller.Close() + if err != nil { + return err + } + r.puller = nil + return nil +} + +func (r *rowsReader) close() error { + if r.puller != nil { + return r.puller.Close() + } + return nil +} + +func isClusterTable(originalTableName string) bool { + switch originalTableName { + case infoschema.ClusterTableStatementsSummary, + infoschema.ClusterTableStatementsSummaryHistory, + infoschema.ClusterTableStatementsSummaryEvicted: + return true + } + + return false +} + +func isCurrentTable(originalTableName string) bool { + switch originalTableName { + case infoschema.TableStatementsSummary, + infoschema.ClusterTableStatementsSummary: + return true + } + + return false +} + +func isHistoryTable(originalTableName string) bool { + switch originalTableName { + case infoschema.TableStatementsSummaryHistory, + infoschema.ClusterTableStatementsSummaryHistory: + return true + } + + return false +} + +func isEvictedTable(originalTableName string) bool { + switch originalTableName { + case infoschema.TableStatementsSummaryEvicted, + infoschema.ClusterTableStatementsSummaryEvicted: + return true + } + + return false +} + +func checkPrivilege(sctx sessionctx.Context) error { + if !hasPriv(sctx, mysql.ProcessPriv) { + return plannercore.ErrSpecificAccessDenied.GenWithStackByArgs("PROCESS") + } + return nil +} + +func clusterTableInstanceAddr(sctx sessionctx.Context, originalTableName string) (string, error) { + if isClusterTable(originalTableName) { + return infoschema.GetInstanceAddr(sctx) + } + return "", nil +} + +func buildTimeRanges(tr *plannercore.TimeRange) []*stmtsummaryv2.StmtTimeRange { + if tr == nil { + return nil + } + + return []*stmtsummaryv2.StmtTimeRange{{ + Begin: tr.StartTime.Unix(), + End: tr.EndTime.Unix(), + }} +} diff --git a/executor/stmtsummary_test.go b/executor/stmtsummary_test.go new file mode 100644 index 0000000000000..a09966c5f3d59 --- /dev/null +++ b/executor/stmtsummary_test.go @@ -0,0 +1,182 @@ +// 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, +// 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 executor + +import ( + "context" + "os" + "testing" + "time" + + "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/mock" + stmtsummaryv2 "github.com/pingcap/tidb/util/stmtsummary/v2" + "github.com/stretchr/testify/require" +) + +func TestStmtSummaryRetriverV2_TableStatementsSummary(t *testing.T) { + infoSchemaBuilder, err := infoschema.NewBuilder(nil, nil).InitWithDBInfos(nil, nil, nil, 0) + require.NoError(t, err) + infoSchema := infoSchemaBuilder.Build() + table, err := infoSchema.TableByName(util.InformationSchemaName, model.NewCIStr(infoschema.TableStatementsSummary)) + require.NoError(t, err) + columns := table.Meta().Columns + + stmtSummary := stmtsummaryv2.NewStmtSummary4Test(1000) + defer stmtSummary.Close() + stmtSummary.Add(stmtsummaryv2.GenerateStmtExecInfo4Test("digest1")) + stmtSummary.Add(stmtsummaryv2.GenerateStmtExecInfo4Test("digest1")) + stmtSummary.Add(stmtsummaryv2.GenerateStmtExecInfo4Test("digest2")) + stmtSummary.Add(stmtsummaryv2.GenerateStmtExecInfo4Test("digest2")) + stmtSummary.Add(stmtsummaryv2.GenerateStmtExecInfo4Test("digest3")) + stmtSummary.Add(stmtsummaryv2.GenerateStmtExecInfo4Test("digest3")) + + retriever := stmtSummaryRetrieverV2{ + stmtSummary: stmtSummary, + table: table.Meta(), + columns: columns, + } + defer func() { + require.NoError(t, retriever.close()) + }() + + ctx := context.Background() + sctx := mock.NewContext() + sctx.GetSessionVars().TimeZone, _ = time.LoadLocation("Asia/Shanghai") + + var results [][]types.Datum + for { + rows, err := retriever.retrieve(ctx, sctx) + require.NoError(t, err) + if len(rows) == 0 { + break + } + results = append(results, rows...) + } + require.Len(t, results, 3) +} + +func TestStmtSummaryRetriverV2_TableStatementsSummaryEvicted(t *testing.T) { + infoSchemaBuilder, err := infoschema.NewBuilder(nil, nil).InitWithDBInfos(nil, nil, nil, 0) + require.NoError(t, err) + infoSchema := infoSchemaBuilder.Build() + table, err := infoSchema.TableByName(util.InformationSchemaName, model.NewCIStr(infoschema.TableStatementsSummaryEvicted)) + require.NoError(t, err) + columns := table.Meta().Columns + + stmtSummary := stmtsummaryv2.NewStmtSummary4Test(1) + defer stmtSummary.Close() + stmtSummary.Add(stmtsummaryv2.GenerateStmtExecInfo4Test("digest1")) + stmtSummary.Add(stmtsummaryv2.GenerateStmtExecInfo4Test("digest1")) + stmtSummary.Add(stmtsummaryv2.GenerateStmtExecInfo4Test("digest2")) + stmtSummary.Add(stmtsummaryv2.GenerateStmtExecInfo4Test("digest2")) + stmtSummary.Add(stmtsummaryv2.GenerateStmtExecInfo4Test("digest3")) + stmtSummary.Add(stmtsummaryv2.GenerateStmtExecInfo4Test("digest3")) + + retriever := stmtSummaryRetrieverV2{ + stmtSummary: stmtSummary, + table: table.Meta(), + columns: columns, + } + defer func() { + require.NoError(t, retriever.close()) + }() + + ctx := context.Background() + sctx := mock.NewContext() + sctx.GetSessionVars().TimeZone, _ = time.LoadLocation("Asia/Shanghai") + + var results [][]types.Datum + for { + rows, err := retriever.retrieve(ctx, sctx) + require.NoError(t, err) + if len(rows) == 0 { + break + } + results = append(results, rows...) + } + require.Len(t, results, 1) + require.Equal(t, int64(2), results[0][2].GetInt64()) +} + +func TestStmtSummaryRetriverV2_TableStatementsSummaryHistory(t *testing.T) { + filename1 := "tidb-statements-2022-12-27T16-21-20.245.log" + filename2 := "tidb-statements.log" + + file, err := os.Create(filename1) + require.NoError(t, err) + defer func() { + require.NoError(t, os.Remove(filename1)) + }() + _, err = file.WriteString("{\"begin\":1672128520,\"end\":1672128530,\"digest\":\"digest1\",\"exec_count\":1}\n") + require.NoError(t, err) + _, err = file.WriteString("{\"begin\":1672129270,\"end\":1672129280,\"digest\":\"digest2\",\"exec_count\":2}\n") + require.NoError(t, err) + require.NoError(t, file.Close()) + + file, err = os.Create(filename2) + require.NoError(t, err) + defer func() { + require.NoError(t, os.Remove(filename2)) + }() + _, err = file.WriteString("{\"begin\":1672129270,\"end\":1672129280,\"digest\":\"digest3\",\"exec_count\":3}\n") + require.NoError(t, err) + _, err = file.WriteString("{\"begin\":1672129380,\"end\":1672129390,\"digest\":\"digest4\",\"exec_count\":4}\n") + require.NoError(t, err) + require.NoError(t, file.Close()) + + stmtSummary := stmtsummaryv2.NewStmtSummary4Test(2) + defer stmtSummary.Close() + stmtSummary.Add(stmtsummaryv2.GenerateStmtExecInfo4Test("digest1")) + stmtSummary.Add(stmtsummaryv2.GenerateStmtExecInfo4Test("digest1")) + stmtSummary.Add(stmtsummaryv2.GenerateStmtExecInfo4Test("digest2")) + stmtSummary.Add(stmtsummaryv2.GenerateStmtExecInfo4Test("digest2")) + stmtSummary.Add(stmtsummaryv2.GenerateStmtExecInfo4Test("digest3")) + stmtSummary.Add(stmtsummaryv2.GenerateStmtExecInfo4Test("digest3")) + + infoSchemaBuilder, err := infoschema.NewBuilder(nil, nil).InitWithDBInfos(nil, nil, nil, 0) + require.NoError(t, err) + infoSchema := infoSchemaBuilder.Build() + table, err := infoSchema.TableByName(util.InformationSchemaName, model.NewCIStr(infoschema.TableStatementsSummaryHistory)) + require.NoError(t, err) + columns := table.Meta().Columns + + retriever := stmtSummaryRetrieverV2{ + stmtSummary: stmtSummary, + table: table.Meta(), + columns: columns, + } + defer func() { + require.NoError(t, retriever.close()) + }() + + ctx := context.Background() + sctx := mock.NewContext() + sctx.GetSessionVars().TimeZone, _ = time.LoadLocation("Asia/Shanghai") + + var results [][]types.Datum + for { + rows, err := retriever.retrieve(ctx, sctx) + require.NoError(t, err) + if len(rows) == 0 { + break + } + results = append(results, rows...) + } + require.Len(t, results, 7) +} diff --git a/executor/table_reader.go b/executor/table_reader.go index 500b3ba3ab771..3e29dfe27b053 100644 --- a/executor/table_reader.go +++ b/executor/table_reader.go @@ -19,7 +19,6 @@ import ( "context" "time" - "github.com/opentracing/opentracing-go" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/domain" @@ -39,6 +38,7 @@ import ( "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/ranger" "github.com/pingcap/tidb/util/stringutil" + "github.com/pingcap/tidb/util/tracing" "github.com/pingcap/tipb/go-tipb" "golang.org/x/exp/slices" ) @@ -61,7 +61,7 @@ func (sr selectResultHook) SelectResult(ctx context.Context, sctx sessionctx.Con } type kvRangeBuilder interface { - buildKeyRange(ranges []*ranger.Range) ([]kv.KeyRange, error) + buildKeyRange(ranges []*ranger.Range) ([][]kv.KeyRange, error) buildKeyRangeSeparately(ranges []*ranger.Range) ([]int64, [][]kv.KeyRange, error) } @@ -135,11 +135,8 @@ func (e *TableReaderExecutor) setDummy() { // Open initializes necessary variables for using this executor. func (e *TableReaderExecutor) Open(ctx context.Context) error { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("TableReaderExecutor.Open", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } + r, ctx := tracing.StartRegionEx(ctx, "TableReaderExecutor.Open") + defer r.End() failpoint.Inject("mockSleepInTableReaderNext", func(v failpoint.Value) { ms := v.(int) time.Sleep(time.Millisecond * time.Duration(ms)) @@ -205,13 +202,13 @@ func (e *TableReaderExecutor) Open(ctx context.Context) error { if err != nil { return err } - e.kvRanges = append(e.kvRanges, kvReq.KeyRanges...) + e.kvRanges = kvReq.KeyRanges.AppendSelfTo(e.kvRanges) if len(secondPartRanges) != 0 { kvReq, err = e.buildKVReq(ctx, secondPartRanges) if err != nil { return err } - e.kvRanges = append(e.kvRanges, kvReq.KeyRanges...) + e.kvRanges = kvReq.KeyRanges.AppendSelfTo(e.kvRanges) } return nil } @@ -256,7 +253,7 @@ func (e *TableReaderExecutor) Next(ctx context.Context, req *chunk.Chunk) error return err } - err := FillVirtualColumnValue(e.virtualColumnRetFieldTypes, e.virtualColumnIndex, e.schema, e.columns, e.ctx, req) + err := table.FillVirtualColumnValue(e.virtualColumnRetFieldTypes, e.virtualColumnIndex, e.schema.Columns, e.columns, e.ctx, req) if err != nil { return err } @@ -314,10 +311,10 @@ func (e *TableReaderExecutor) buildResp(ctx context.Context, ranges []*ranger.Ra if err != nil { return nil, err } - slices.SortFunc(kvReq.KeyRanges, func(i, j kv.KeyRange) bool { + kvReq.KeyRanges.SortByFunc(func(i, j kv.KeyRange) bool { return bytes.Compare(i.StartKey, j.StartKey) < 0 }) - e.kvRanges = append(e.kvRanges, kvReq.KeyRanges...) + e.kvRanges = kvReq.KeyRanges.AppendSelfTo(e.kvRanges) result, err := e.SelectResult(ctx, e.ctx, kvReq, retTypes(e), e.feedback, getPhysicalPlanIDs(e.plans), e.id) if err != nil { @@ -409,7 +406,7 @@ func (e *TableReaderExecutor) buildKVReq(ctx context.Context, ranges []*ranger.R if err != nil { return nil, err } - reqBuilder = builder.SetKeyRanges(kvRange) + reqBuilder = builder.SetPartitionKeyRanges(kvRange) } else { reqBuilder = builder.SetHandleRanges(e.ctx.GetSessionVars().StmtCtx, getPhysicalTableID(e.table), e.table.Meta() != nil && e.table.Meta().IsCommonHandle, ranges, e.feedback) } diff --git a/executor/testdata/executor_suite_out.json b/executor/testdata/executor_suite_out.json index c06ee935e8b37..e0fbfecb07095 100644 --- a/executor/testdata/executor_suite_out.json +++ b/executor/testdata/executor_suite_out.json @@ -674,7 +674,7 @@ { "SQL": "select count(*) from t as t1 inner join t as t2 on t1.c1 = t2.c1 where t1.c1 != NULL", "Plan": [ - "HashAgg 1.00 root funcs:count(1)->Column#7", + "StreamAgg 1.00 root funcs:count(1)->Column#7", "└─MergeJoin 0.00 root inner join, left key:test.t.c1, right key:test.t.c1", " ├─TableDual(Build) 0.00 root rows:0", " └─TableDual(Probe) 0.00 root rows:0" @@ -704,7 +704,7 @@ { "SQL": "select count(*) from t as t1 left join t as t2 on t1.c1 = t2.c1 where t1.c1 != NULL", "Plan": [ - "HashAgg 1.00 root funcs:count(1)->Column#7", + "StreamAgg 1.00 root funcs:count(1)->Column#7", "└─MergeJoin 0.00 root left outer join, left key:test.t.c1, right key:test.t.c1", " ├─TableDual(Build) 0.00 root rows:0", " └─TableDual(Probe) 0.00 root rows:0" diff --git a/executor/testdata/slow_query_suite_in.json b/executor/testdata/slow_query_suite_in.json new file mode 100644 index 0000000000000..4b2c95b6aa378 --- /dev/null +++ b/executor/testdata/slow_query_suite_in.json @@ -0,0 +1,19 @@ +[ + { + "name": "TestWarningsInSlowQuery", + "cases": [ + "insert into t(a) value (1)", + "select /*+ READ_FROM_STORAGE(TIKV[t]) */ a/0 from t", + "create binding for select * from t where c = 10 using select * from t use index (c_d_e) where c = 10", + "select * from t where c = 10", + "select /*+ READ_FROM_STORAGE(TIKV[t]) */ * from t where a > 1 order by f", + "select /*+ READ_FROM_STORAGE(TIKV[t]) */ * from t where f > 1", + "select /*+ READ_FROM_STORAGE(TIKV[t]) */ f from t where f > 1", + "select /*+ READ_FROM_STORAGE(TIKV[t]) */ * from t where f > 3 and g = 5", + "select /*+ READ_FROM_STORAGE(TIKV[t]) */ * from t where g = 5 order by f", + "select /*+ READ_FROM_STORAGE(TIKV[t]) */ * from t where d = 3 order by c, e", + "select /*+ READ_FROM_STORAGE(TIKV[t]) */ * from t where h = '11,22'", + "select /*+ READ_FROM_STORAGE(TIKV[t]) */ * from t where a > rand()*100" + ] + } +] diff --git a/executor/testdata/slow_query_suite_out.json b/executor/testdata/slow_query_suite_out.json new file mode 100644 index 0000000000000..adf6606709859 --- /dev/null +++ b/executor/testdata/slow_query_suite_out.json @@ -0,0 +1,55 @@ +[ + { + "Name": "TestWarningsInSlowQuery", + "Cases": [ + { + "SQL": "insert into t(a) value (1)", + "Result": "" + }, + { + "SQL": "select /*+ READ_FROM_STORAGE(TIKV[t]) */ a/0 from t", + "Result": "[{\"Level\":\"Warning\",\"Message\":\"Division by 0\"}]" + }, + { + "SQL": "create binding for select * from t where c = 10 using select * from t use index (c_d_e) where c = 10", + "Result": "" + }, + { + "SQL": "select * from t where c = 10", + "Result": "[{\"Level\":\"Note\",\"Message\":\"Using the bindSQL: SELECT * FROM `test`.`t` USE INDEX (`c_d_e`) WHERE `c` = 10\",\"IsExtra\":true}]" + }, + { + "SQL": "select /*+ READ_FROM_STORAGE(TIKV[t]) */ * from t where a > 1 order by f", + "Result": "[{\"Level\":\"Warning\",\"Message\":\"Expression about 'test.t.h' can not be pushed to TiFlash because it contains unsupported calculation of type 'set'.\",\"IsExtra\":true},{\"Level\":\"Note\",\"Message\":\"[t,t(tiflash)] remain after pruning paths for t given Prop{SortItems: [], TaskTp: rootTask}\",\"IsExtra\":true},{\"Level\":\"Warning\",\"Message\":\"Expression about 'test.t.h' can not be pushed to TiFlash because it contains unsupported calculation of type 'set'.\",\"IsExtra\":true},{\"Level\":\"Note\",\"Message\":\"[t,t(tiflash),f,f_g] remain after pruning paths for t given Prop{SortItems: [{test.t.f asc}], TaskTp: rootTask}\",\"IsExtra\":true}]" + }, + { + "SQL": "select /*+ READ_FROM_STORAGE(TIKV[t]) */ * from t where f > 1", + "Result": "[{\"Level\":\"Warning\",\"Message\":\"Expression about 'test.t.h' can not be pushed to TiFlash because it contains unsupported calculation of type 'set'.\",\"IsExtra\":true},{\"Level\":\"Note\",\"Message\":\"[t,t(tiflash),f,f_g] remain after pruning paths for t given Prop{SortItems: [], TaskTp: rootTask}\",\"IsExtra\":true}]" + }, + { + "SQL": "select /*+ READ_FROM_STORAGE(TIKV[t]) */ f from t where f > 1", + "Result": "[{\"Level\":\"Note\",\"Message\":\"[t(tiflash),f,f_g] remain after pruning paths for t given Prop{SortItems: [], TaskTp: rootTask}\",\"IsExtra\":true}]" + }, + { + "SQL": "select /*+ READ_FROM_STORAGE(TIKV[t]) */ * from t where f > 3 and g = 5", + "Result": "[{\"Level\":\"Warning\",\"Message\":\"Expression about 'test.t.h' can not be pushed to TiFlash because it contains unsupported calculation of type 'set'.\",\"IsExtra\":true},{\"Level\":\"Note\",\"Message\":\"[t,t(tiflash),f_g,g] remain after pruning paths for t given Prop{SortItems: [], TaskTp: rootTask}\",\"IsExtra\":true}]" + }, + { + "SQL": "select /*+ READ_FROM_STORAGE(TIKV[t]) */ * from t where g = 5 order by f", + "Result": "[{\"Level\":\"Warning\",\"Message\":\"Expression about 'test.t.h' can not be pushed to TiFlash because it contains unsupported calculation of type 'set'.\",\"IsExtra\":true},{\"Level\":\"Note\",\"Message\":\"[t,t(tiflash),g] remain after pruning paths for t given Prop{SortItems: [], TaskTp: rootTask}\",\"IsExtra\":true},{\"Level\":\"Warning\",\"Message\":\"Expression about 'test.t.h' can not be pushed to TiFlash because it contains unsupported calculation of type 'set'.\",\"IsExtra\":true},{\"Level\":\"Note\",\"Message\":\"[t,t(tiflash),f_g,g] remain after pruning paths for t given Prop{SortItems: [{test.t.f asc}], TaskTp: rootTask}\",\"IsExtra\":true}]" + }, + { + "SQL": "select /*+ READ_FROM_STORAGE(TIKV[t]) */ * from t where d = 3 order by c, e", + "Result": "[{\"Level\":\"Warning\",\"Message\":\"Expression about 'test.t.h' can not be pushed to TiFlash because it contains unsupported calculation of type 'set'.\",\"IsExtra\":true},{\"Level\":\"Note\",\"Message\":\"[t,t(tiflash)] remain after pruning paths for t given Prop{SortItems: [], TaskTp: rootTask}\",\"IsExtra\":true},{\"Level\":\"Warning\",\"Message\":\"Expression about 'test.t.h' can not be pushed to TiFlash because it contains unsupported calculation of type 'set'.\",\"IsExtra\":true},{\"Level\":\"Note\",\"Message\":\"[t,t(tiflash),c_d_e] remain after pruning paths for t given Prop{SortItems: [{test.t.c asc} {test.t.e asc}], TaskTp: rootTask}\",\"IsExtra\":true}]" + }, + { + "SQL": "select /*+ READ_FROM_STORAGE(TIKV[t]) */ * from t where h = '11,22'", + "Result": "[{\"Level\":\"Warning\",\"Message\":\"Expression about 'test.t.h' can not be pushed to TiFlash because it contains unsupported calculation of type 'set'.\",\"IsExtra\":true},{\"Level\":\"Warning\",\"Message\":\"Expression about 'test.t.h' can not be pushed to TiFlash because it contains unsupported calculation of type 'set'.\",\"IsExtra\":true},{\"Level\":\"Note\",\"Message\":\"[t,t(tiflash)] remain after pruning paths for t given Prop{SortItems: [], TaskTp: rootTask}\",\"IsExtra\":true}]" + }, + { + "SQL": "select /*+ READ_FROM_STORAGE(TIKV[t]) */ * from t where a > rand()*100", + "Result": "[{\"Level\":\"Warning\",\"Message\":\"Scalar function 'rand'(signature: Rand, return type: double) is not supported to push down to storage layer now.\",\"IsExtra\":true},{\"Level\":\"Warning\",\"Message\":\"Expression about 'test.t.h' can not be pushed to TiFlash because it contains unsupported calculation of type 'set'.\",\"IsExtra\":true},{\"Level\":\"Warning\",\"Message\":\"Scalar function 'rand'(signature: Rand, return type: double) is not supported to push down to tiflash now.\",\"IsExtra\":true},{\"Level\":\"Note\",\"Message\":\"[t,t(tiflash)] remain after pruning paths for t given Prop{SortItems: [], TaskTp: rootTask}\",\"IsExtra\":true}]" + } + ] + } +] diff --git a/executor/tiflashtest/BUILD.bazel b/executor/tiflashtest/BUILD.bazel index 5223fa79cc2d9..0e6244f1b2f90 100644 --- a/executor/tiflashtest/BUILD.bazel +++ b/executor/tiflashtest/BUILD.bazel @@ -14,13 +14,16 @@ go_test( "//config", "//domain", "//executor", + "//kv", "//meta/autoid", "//parser/terror", + "//planner/core", "//store/mockstore", "//store/mockstore/unistore", "//testkit", "//testkit/external", "//util/israce", + "//util/tiflashcompute", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/metapb", diff --git a/executor/tiflashtest/tiflash_test.go b/executor/tiflashtest/tiflash_test.go index becdb2ec1956c..e703d66ed33cc 100644 --- a/executor/tiflashtest/tiflash_test.go +++ b/executor/tiflashtest/tiflash_test.go @@ -27,14 +27,18 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/terror" + plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/store/mockstore/unistore" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/testkit/external" "github.com/pingcap/tidb/util/israce" + "github.com/pingcap/tidb/util/tiflashcompute" "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/testutils" ) @@ -266,14 +270,9 @@ func TestMppExecution(t *testing.T) { tk.MustExec("begin") tk.MustQuery("select count(*) from ( select * from t2 group by a, b) A group by A.b").Check(testkit.Rows("3")) tk.MustQuery("select count(*) from t1 where t1.a+100 > ( select count(*) from t2 where t1.a=t2.a and t1.b=t2.b) group by t1.b").Check(testkit.Rows("4")) - txn, err := tk.Session().Txn(true) - require.NoError(t, err) - ts := txn.StartTS() - taskID := tk.Session().GetSessionVars().AllocMPPTaskID(ts) - require.Equal(t, int64(6), taskID) - tk.MustExec("commit") - taskID = tk.Session().GetSessionVars().AllocMPPTaskID(ts + 1) + taskID := plannercore.AllocMPPTaskID(tk.Session()) require.Equal(t, int64(1), taskID) + tk.MustExec("commit") failpoint.Enable("github.com/pingcap/tidb/executor/checkTotalMPPTasks", `return(3)`) // all the data is related to one store, so there are three tasks. @@ -462,6 +461,7 @@ func TestPartitionTable(t *testing.T) { store := testkit.CreateMockStore(t, withMockTiFlash(2)) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set tidb_cost_model_version=1") tk.MustExec("drop table if exists t") tk.MustExec("drop table if exists t1") tk.MustExec("drop table if exists t2") @@ -630,10 +630,41 @@ func TestDispatchTaskRetry(t *testing.T) { require.NoError(t, err) tk.MustExec("set @@session.tidb_enforce_mpp=ON") require.Nil(t, failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/mppDispatchTimeout", "3*return(true)")) - tk.MustQuery("select count(*) from t").Check(testkit.Rows("4")) + tk.MustQuery("select count(*) from t group by b").Check(testkit.Rows("4")) require.Nil(t, failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/mppDispatchTimeout")) } +func TestMppVersionError(t *testing.T) { + store := testkit.CreateMockStore(t, withMockTiFlash(2)) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int not null primary key, b int not null)") + tk.MustExec("alter table t set tiflash replica 1") + tk.MustExec("insert into t values(1,0),(2,0),(3,0),(4,0)") + tb := external.GetTableByName(t, tk, "test", "t") + err := domain.GetDomain(tk.Session()).DDL().UpdateTableReplicaInfo(tk.Session(), tb.Meta().ID, true) + require.NoError(t, err) + tk.MustExec("set @@session.tidb_enforce_mpp=ON") + { + item := fmt.Sprintf("return(%d)", kv.GetNewestMppVersion()+1) + require.Nil(t, failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/MppVersionError", item)) + } + { + err := tk.QueryToErr("select count(*) from t group by b") + require.Error(t, err) + } + require.Nil(t, failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/MppVersionError")) + { + item := fmt.Sprintf("return(%d)", kv.GetNewestMppVersion()) + require.Nil(t, failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/MppVersionError", item)) + } + { + tk.MustQuery("select count(*) from t group by b").Check(testkit.Rows("4")) + } + require.Nil(t, failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/MppVersionError")) +} + func TestCancelMppTasks(t *testing.T) { var hang = "github.com/pingcap/tidb/store/mockstore/unistore/mppRecvHang" store := testkit.CreateMockStore(t, withMockTiFlash(2)) @@ -1041,7 +1072,7 @@ func TestTiFlashPartitionTableBroadcastJoin(t *testing.T) { } } -func TestForbidTiflashDuringStaleRead(t *testing.T) { +func TestTiflashSupportStaleRead(t *testing.T) { store := testkit.CreateMockStore(t, withMockTiFlash(2)) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") @@ -1073,8 +1104,8 @@ func TestForbidTiflashDuringStaleRead(t *testing.T) { fmt.Fprintf(resBuff, "%s\n", row) } res = resBuff.String() - require.NotContains(t, res, "tiflash") - require.Contains(t, res, "tikv") + require.Contains(t, res, "tiflash") + require.NotContains(t, res, "tikv") } func TestForbidTiFlashIfExtraPhysTableIDIsNeeded(t *testing.T) { @@ -1206,6 +1237,62 @@ func TestAggPushDownCountStar(t *testing.T) { tk.MustQuery("select count(*) from c, o where c.c_id=o.c_id").Check(testkit.Rows("5")) } +func TestGroupStreamAggOnTiFlash(t *testing.T) { + store := testkit.CreateMockStore(t, withMockTiFlash(2)) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists foo") + tk.MustExec("create table foo(a int, b int, c int, d int, primary key(a,b,c,d))") + tk.MustExec("alter table foo set tiflash replica 1") + tk.MustExec("insert into foo values(1,2,3,1),(1,2,3,6),(1,2,3,5)," + + "(1,2,3,2),(1,2,3,4),(1,2,3,7),(1,2,3,3),(1,2,3,0)") + tb := external.GetTableByName(t, tk, "test", "foo") + err := domain.GetDomain(tk.Session()).DDL().UpdateTableReplicaInfo(tk.Session(), tb.Meta().ID, true) + require.NoError(t, err) + tk.MustExec("set @@tidb_allow_mpp=0") + sql := "select a,b,c,count(*) from foo group by a,b,c order by a,b,c" + tk.MustQuery(sql).Check(testkit.Rows("1 2 3 8")) + rows := tk.MustQuery("explain " + sql).Rows() + + for _, row := range rows { + resBuff := bytes.NewBufferString("") + fmt.Fprintf(resBuff, "%s\n", row) + res := resBuff.String() + // StreamAgg with group keys on TiFlash is not supported + if strings.Contains(res, "tiflash") { + require.NotContains(t, res, "StreamAgg") + } + } +} + +// TestIssue41014 test issue that can't find proper physical plan +func TestIssue41014(t *testing.T) { + store := testkit.CreateMockStore(t, withMockTiFlash(2)) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + tk.MustExec("CREATE TABLE `tai1` (\n `aid` int(11) DEFAULT NULL,\n `rid` int(11) DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") + tk.MustExec("CREATE TABLE `tai2` (\n `rid` int(11) DEFAULT NULL,\n `prilan` varchar(20) DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") + tk.MustExec("alter table tai1 set tiflash replica 1") + tk.MustExec("alter table tai2 set tiflash replica 1") + tk.MustExec("alter table tai2 add index idx((lower(prilan)));") + tk.MustExec("set @@tidb_opt_distinct_agg_push_down = 1;") + + tk.MustQuery("explain select count(distinct tai1.aid) as cb from tai1 inner join tai2 on tai1.rid = tai2.rid where lower(prilan) LIKE LOWER('%python%');").Check( + testkit.Rows("HashAgg_11 1.00 root funcs:count(distinct test.tai1.aid)->Column#8", + "└─HashJoin_15 9990.00 root inner join, equal:[eq(test.tai2.rid, test.tai1.rid)]", + " ├─Selection_20(Build) 8000.00 root like(lower(test.tai2.prilan), \"%python%\", 92)", + " │ └─Projection_19 10000.00 root test.tai2.rid, lower(test.tai2.prilan)", + " │ └─TableReader_18 9990.00 root data:Selection_17", + " │ └─Selection_17 9990.00 cop[tikv] not(isnull(test.tai2.rid))", + " │ └─TableFullScan_16 10000.00 cop[tikv] table:tai2 keep order:false, stats:pseudo", + " └─TableReader_23(Probe) 9990.00 root data:Selection_22", + " └─Selection_22 9990.00 cop[tikv] not(isnull(test.tai1.rid))", + " └─TableFullScan_21 10000.00 cop[tikv] table:tai1 keep order:false, stats:pseudo")) + tk.MustQuery("select count(distinct tai1.aid) as cb from tai1 inner join tai2 on tai1.rid = tai2.rid where lower(prilan) LIKE LOWER('%python%');").Check( + testkit.Rows("0")) +} + func TestTiflashEmptyDynamicPruneResult(t *testing.T) { store := testkit.CreateMockStore(t, withMockTiFlash(2)) tk := testkit.NewTestKit(t, store) @@ -1226,3 +1313,142 @@ func TestTiflashEmptyDynamicPruneResult(t *testing.T) { tk.MustQuery("select /*+ read_from_storage(tiflash[t2]) */ * from IDT_RP24833 partition(p2) t2 where t2. col1 <= -8448770111093677011;").Check(testkit.Rows()) tk.MustQuery("select /*+ read_from_storage(tiflash[t1, t2]) */ * from IDT_RP24833 partition(p3, p4) t1 join IDT_RP24833 partition(p2) t2 on t1.col1 = t2.col1 where t1. col1 between -8448770111093677011 and -8448770111093677011 and t2. col1 <= -8448770111093677011;").Check(testkit.Rows()) } + +func TestDisaggregatedTiFlash(t *testing.T) { + config.UpdateGlobal(func(conf *config.Config) { + conf.DisaggregatedTiFlash = true + }) + defer config.UpdateGlobal(func(conf *config.Config) { + conf.DisaggregatedTiFlash = false + }) + err := tiflashcompute.InitGlobalTopoFetcher(tiflashcompute.TestASStr, "", "", false) + require.NoError(t, err) + + store := testkit.CreateMockStore(t, withMockTiFlash(2)) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(c1 int)") + tk.MustExec("alter table t set tiflash replica 1") + tb := external.GetTableByName(t, tk, "test", "t") + err = domain.GetDomain(tk.Session()).DDL().UpdateTableReplicaInfo(tk.Session(), tb.Meta().ID, true) + require.NoError(t, err) + tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash\"") + + err = tk.ExecToErr("select * from t;") + // Expect error, because TestAutoScaler return empty topo. + require.Contains(t, err.Error(), "Cannot find proper topo from AutoScaler") + + err = tiflashcompute.InitGlobalTopoFetcher(tiflashcompute.AWSASStr, "", "", false) + require.NoError(t, err) + err = tk.ExecToErr("select * from t;") + // Expect error, because AWSAutoScaler is not setup, so http request will fail. + require.Contains(t, err.Error(), "[util:1815]Internal : get tiflash_compute topology failed") +} + +// todo: remove this after AutoScaler is stable. +func TestDisaggregatedTiFlashNonAutoScaler(t *testing.T) { + config.UpdateGlobal(func(conf *config.Config) { + conf.DisaggregatedTiFlash = true + conf.UseAutoScaler = false + }) + defer config.UpdateGlobal(func(conf *config.Config) { + conf.DisaggregatedTiFlash = false + conf.UseAutoScaler = true + }) + + // Setting globalTopoFetcher to nil to can make sure cannot fetch topo from AutoScaler. + err := tiflashcompute.InitGlobalTopoFetcher(tiflashcompute.InvalidASStr, "", "", false) + require.Contains(t, err.Error(), "unexpected topo fetch type. expect: mock or aws or gcp, got invalid") + + store := testkit.CreateMockStore(t, withMockTiFlash(2)) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(c1 int)") + tk.MustExec("alter table t set tiflash replica 1") + tb := external.GetTableByName(t, tk, "test", "t") + err = domain.GetDomain(tk.Session()).DDL().UpdateTableReplicaInfo(tk.Session(), tb.Meta().ID, true) + require.NoError(t, err) + tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash\"") + + err = tk.ExecToErr("select * from t;") + // This error message means we use PD instead of AutoScaler. + require.Contains(t, err.Error(), "tiflash_compute node is unavailable") +} + +func TestDisaggregatedTiFlashQuery(t *testing.T) { + config.UpdateGlobal(func(conf *config.Config) { + conf.DisaggregatedTiFlash = true + }) + defer config.UpdateGlobal(func(conf *config.Config) { + conf.DisaggregatedTiFlash = false + }) + + store := testkit.CreateMockStore(t, withMockTiFlash(2)) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists tbl_1") + tk.MustExec(`create table tbl_1 ( col_1 bigint not null default -1443635317331776148, + col_2 text ( 176 ) collate utf8mb4_bin not null, + col_3 decimal ( 8, 3 ), + col_4 varchar ( 128 ) collate utf8mb4_bin not null, + col_5 varchar ( 377 ) collate utf8mb4_bin, + col_6 double, + col_7 varchar ( 459 ) collate utf8mb4_bin, + col_8 tinyint default -88 ) charset utf8mb4 collate utf8mb4_bin ;`) + tk.MustExec("alter table tbl_1 set tiflash replica 1") + tb := external.GetTableByName(t, tk, "test", "tbl_1") + err := domain.GetDomain(tk.Session()).DDL().UpdateTableReplicaInfo(tk.Session(), tb.Meta().ID, true) + require.NoError(t, err) + tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash\"") + + tk.MustExec("explain select max( tbl_1.col_1 ) as r0 , sum( tbl_1.col_1 ) as r1 , sum( tbl_1.col_8 ) as r2 from tbl_1 where tbl_1.col_8 != 68 or tbl_1.col_3 between null and 939 order by r0,r1,r2;") + + tk.MustExec("set @@tidb_partition_prune_mode = 'static';") + tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash\"") + tk.MustExec("create table t1(c1 int, c2 int) partition by hash(c1) partitions 3") + tk.MustExec("insert into t1 values(1, 1), (2, 2), (3, 3)") + tk.MustExec("alter table t1 set tiflash replica 1") + tb = external.GetTableByName(t, tk, "test", "t1") + err = domain.GetDomain(tk.Session()).DDL().UpdateTableReplicaInfo(tk.Session(), tb.Meta().ID, true) + require.NoError(t, err) + tk.MustQuery("explain select * from t1 where c1 < 2").Check(testkit.Rows( + "PartitionUnion_10 9970.00 root ", + "├─TableReader_15 3323.33 root MppVersion: 1, data:ExchangeSender_14", + "│ └─ExchangeSender_14 3323.33 mpp[tiflash] ExchangeType: PassThrough", + "│ └─Selection_13 3323.33 mpp[tiflash] lt(test.t1.c1, 2)", + "│ └─TableFullScan_12 10000.00 mpp[tiflash] table:t1, partition:p0 keep order:false, stats:pseudo", + "├─TableReader_19 3323.33 root MppVersion: 1, data:ExchangeSender_18", + "│ └─ExchangeSender_18 3323.33 mpp[tiflash] ExchangeType: PassThrough", + "│ └─Selection_17 3323.33 mpp[tiflash] lt(test.t1.c1, 2)", + "│ └─TableFullScan_16 10000.00 mpp[tiflash] table:t1, partition:p1 keep order:false, stats:pseudo", + "└─TableReader_23 3323.33 root MppVersion: 1, data:ExchangeSender_22", + " └─ExchangeSender_22 3323.33 mpp[tiflash] ExchangeType: PassThrough", + " └─Selection_21 3323.33 mpp[tiflash] lt(test.t1.c1, 2)", + " └─TableFullScan_20 10000.00 mpp[tiflash] table:t1, partition:p2 keep order:false, stats:pseudo")) + // tk.MustQuery("select * from t1 where c1 < 2").Check(testkit.Rows("1 1")) +} + +func TestMPPMemoryTracker(t *testing.T) { + store := testkit.CreateMockStore(t, withMockTiFlash(2)) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set tidb_mem_quota_query = 1 << 30") + tk.MustExec("set global tidb_mem_oom_action = 'CANCEL'") + tk.MustExec("use test") + tk.MustExec("create table t(a int);") + tk.MustExec("insert into t values (1);") + tk.MustExec("alter table t set tiflash replica 1") + tb := external.GetTableByName(t, tk, "test", "t") + err := domain.GetDomain(tk.Session()).DDL().UpdateTableReplicaInfo(tk.Session(), tb.Meta().ID, true) + require.NoError(t, err) + tk.MustExec("set tidb_enforce_mpp = on;") + tk.MustQuery("select * from t").Check(testkit.Rows("1")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/store/copr/testMPPOOMPanic", `return(true)`)) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/store/copr/testMPPOOMPanic")) + }() + err = tk.QueryToErr("select * from t") + require.NotNil(t, err) + require.True(t, strings.Contains(err.Error(), "Out Of Memory Quota!")) +} diff --git a/executor/union_scan.go b/executor/union_scan.go index a23cd8b8c7873..f3a2b82c70812 100644 --- a/executor/union_scan.go +++ b/executor/union_scan.go @@ -19,7 +19,6 @@ import ( "fmt" "runtime/trace" - "github.com/opentracing/opentracing-go" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/model" @@ -30,6 +29,7 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/tracing" ) // UnionScanExec merges the rows from dirty table and the rows from distsql request. @@ -71,11 +71,9 @@ type UnionScanExec struct { // Open implements the Executor Open interface. func (us *UnionScanExec) Open(ctx context.Context) error { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("UnionScanExec.Open", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } + r, ctx := tracing.StartRegionEx(ctx, "UnionScanExec.Open") + defer r.End() + if err := us.baseExecutor.Open(ctx); err != nil { return err } diff --git a/executor/update.go b/executor/update.go index cf0a6ae2e33f4..0068392653cdd 100644 --- a/executor/update.go +++ b/executor/update.go @@ -434,6 +434,7 @@ func (e *UpdateExec) Close() error { if err == nil && txn.Valid() && txn.GetSnapshot() != nil { txn.GetSnapshot().SetOption(kv.CollectRuntimeStats, nil) } + defer e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) } return e.children[0].Close() } @@ -463,7 +464,6 @@ func (e *UpdateExec) collectRuntimeStatsEnabled() bool { SnapshotRuntimeStats: &txnsnapshot.SnapshotRuntimeStats{}, AllocatorRuntimeStats: autoid.NewAllocatorRuntimeStats(), } - e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) } return true } diff --git a/executor/write.go b/executor/write.go index 01359b56a2571..0a3fbfda4795e 100644 --- a/executor/write.go +++ b/executor/write.go @@ -18,7 +18,6 @@ import ( "context" "strings" - "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/expression" @@ -34,6 +33,7 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/memory" + "github.com/pingcap/tidb/util/tracing" ) var ( @@ -52,17 +52,9 @@ var ( // 2. err (error) : error in the update. func updateRecord(ctx context.Context, sctx sessionctx.Context, h kv.Handle, oldData, newData []types.Datum, modified []bool, t table.Table, onDup bool, memTracker *memory.Tracker, fkChecks []*FKCheckExec, fkCascades []*FKCascadeExec) (bool, error) { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("executor.updateRecord", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } - txn, err := sctx.Txn(false) - if err != nil { - return false, err - } - memUsageOfTxnState := txn.Size() - defer memTracker.Consume(int64(txn.Size() - memUsageOfTxnState)) + r, ctx := tracing.StartRegionEx(ctx, "executor.updateRecord") + defer r.End() + sc := sctx.GetSessionVars().StmtCtx changed, handleChanged := false, false // onUpdateSpecified is for "UPDATE SET ts_field = old_value", the @@ -115,7 +107,7 @@ func updateRecord(ctx context.Context, sctx sessionctx.Context, h kv.Handle, old if err != nil { return false, err } - if err = t.Allocators(sctx).Get(autoid.RowIDAllocType).Rebase(ctx, recordID, true); err != nil { + if err = t.Allocators(sctx).Get(autoid.AutoIncrementType).Rebase(ctx, recordID, true); err != nil { return false, err } } @@ -166,7 +158,7 @@ func updateRecord(ctx context.Context, sctx sessionctx.Context, h kv.Handle, old // Fill values into on-update-now fields, only if they are really changed. for i, col := range t.Cols() { if mysql.HasOnUpdateNowFlag(col.GetFlag()) && !modified[i] && !onUpdateSpecified[i] { - if v, err := expression.GetTimeValue(sctx, strings.ToUpper(ast.CurrentTimestamp), col.GetType(), col.GetDecimal()); err == nil { + if v, err := expression.GetTimeValue(sctx, strings.ToUpper(ast.CurrentTimestamp), col.GetType(), col.GetDecimal(), nil); err == nil { newData[i] = v modified[i] = true } else { @@ -207,7 +199,7 @@ func updateRecord(ctx context.Context, sctx sessionctx.Context, h kv.Handle, old } } else { // Update record to new value and update index. - if err = t.UpdateRecord(ctx, sctx, h, oldData, newData, modified); err != nil { + if err := t.UpdateRecord(ctx, sctx, h, oldData, newData, modified); err != nil { if terr, ok := errors.Cause(err).(*terror.Error); sctx.GetSessionVars().StmtCtx.IgnoreNoPartition && ok && terr.Code() == errno.ErrNoPartitionForGivenValue { return false, nil } diff --git a/executor/writetest/BUILD.bazel b/executor/writetest/BUILD.bazel new file mode 100644 index 0000000000000..5ef1885be7ec6 --- /dev/null +++ b/executor/writetest/BUILD.bazel @@ -0,0 +1,39 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_test") + +go_test( + name = "writetest_test", + timeout = "short", + srcs = [ + "main_test.go", + "write_test.go", + ], + flaky = True, + race = "on", + shard_count = 50, + deps = [ + "//config", + "//executor", + "//kv", + "//meta/autoid", + "//parser/model", + "//parser/mysql", + "//planner/core", + "//session", + "//sessionctx", + "//sessionctx/stmtctx", + "//sessionctx/variable", + "//sessiontxn", + "//store/mockstore", + "//table", + "//table/tables", + "//testkit", + "//types", + "//util", + "//util/mock", + "@com_github_pingcap_failpoint//:failpoint", + "@com_github_stretchr_testify//require", + "@com_github_tikv_client_go_v2//tikv", + "@io_opencensus_go//stats/view", + "@org_uber_go_goleak//:goleak", + ], +) diff --git a/executor/writetest/main_test.go b/executor/writetest/main_test.go new file mode 100644 index 0000000000000..075e1f91b488a --- /dev/null +++ b/executor/writetest/main_test.go @@ -0,0 +1,60 @@ +// 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, +// 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 writetest + +import ( + "fmt" + "testing" + + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/meta/autoid" + "github.com/pingcap/tidb/testkit" + "github.com/tikv/client-go/v2/tikv" + "go.opencensus.io/stats/view" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + autoid.SetStep(5000) + config.UpdateGlobal(func(conf *config.Config) { + conf.Log.SlowThreshold = 30000 // 30s + conf.TiKVClient.AsyncCommit.SafeWindow = 0 + conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 + conf.Experimental.AllowsExpressionIndex = true + }) + tikv.EnableFailpoints() + + opts := []goleak.Option{ + goleak.Cleanup(func(_ int) { + view.Stop() + }), + goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), + goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/txnkv/transaction.keepAlive"), + } + + goleak.VerifyTestMain(m, opts...) +} + +func fillData(tk *testkit.TestKit, table string) { + tk.MustExec("use test") + tk.MustExec(fmt.Sprintf("create table %s(id int not null default 1, name varchar(255), PRIMARY KEY(id));", table)) + + // insert data + tk.MustExec(fmt.Sprintf("insert INTO %s VALUES (1, \"hello\");", table)) + tk.MustExec(fmt.Sprintf("insert into %s values (2, \"hello\");", table)) +} diff --git a/executor/write_test.go b/executor/writetest/write_test.go similarity index 98% rename from executor/write_test.go rename to executor/writetest/write_test.go index 32aa261c5518d..9aca357032b68 100644 --- a/executor/write_test.go +++ b/executor/writetest/write_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package executor_test +package writetest import ( "context" @@ -592,6 +592,25 @@ commit;` tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1526 Table has no partition for value 3")) } +func TestIssue38950(t *testing.T) { + store := testkit.CreateMockStore(t) + var cfg kv.InjectionConfig + tk := testkit.NewTestKit(t, kv.NewInjectedStore(store, &cfg)) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t; create table t (id smallint auto_increment primary key);") + tk.MustExec("alter table t add column c1 int default 1;") + tk.MustExec("insert ignore into t(id) values (194626268);") + require.Empty(t, tk.Session().LastMessage()) + + tk.MustQuery("select * from t").Check(testkit.Rows("32767 1")) + + tk.MustExec("insert ignore into t(id) values ('*') on duplicate key update c1 = 2;") + require.Equal(t, int64(2), int64(tk.Session().AffectedRows())) + require.Empty(t, tk.Session().LastMessage()) + + tk.MustQuery("select * from t").Check(testkit.Rows("32767 2")) +} + func TestInsertOnDup(t *testing.T) { store := testkit.CreateMockStore(t) var cfg kv.InjectionConfig @@ -1877,7 +1896,7 @@ func checkCases(tests []testCase, ld *executor.LoadDataInfo, t *testing.T, tk *t } ld.SetMessage() require.Equal(t, tt.expectedMsg, tk.Session().LastMessage()) - ctx.StmtCommit() + ctx.StmtCommit(context.Background()) txn, err := ctx.Txn(true) require.NoError(t, err) err = txn.Commit(context.Background()) @@ -2334,7 +2353,7 @@ func TestLoadDataIntoPartitionedTable(t *testing.T) { require.NoError(t, err) ld.SetMaxRowsInBatch(20000) ld.SetMessage() - ctx.StmtCommit() + ctx.StmtCommit(context.Background()) txn, err := ctx.Txn(true) require.NoError(t, err) err = txn.Commit(context.Background()) @@ -4299,3 +4318,23 @@ func TestIssueInsertPrefixIndexForNonUTF8Collation(t *testing.T) { tk.MustExec("insert into t3 select 'abc '") tk.MustGetErrCode("insert into t3 select 'abc d'", 1062) } + +func TestMutipleReplaceAndInsertInOneSession(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t_securities(id bigint not null auto_increment primary key, security_id varchar(8), market_id smallint, security_type int, unique key uu(security_id, market_id))") + tk.MustExec(`insert into t_securities (security_id, market_id, security_type) values ("1", 2, 7), ("7", 1, 7) ON DUPLICATE KEY UPDATE security_type = VALUES(security_type)`) + tk.MustExec(`replace into t_securities (security_id, market_id, security_type) select security_id+1, 1, security_type from t_securities where security_id="7";`) + tk.MustExec(`INSERT INTO t_securities (security_id, market_id, security_type) values ("1", 2, 7), ("7", 1, 7) ON DUPLICATE KEY UPDATE security_type = VALUES(security_type)`) + + tk.MustQuery("select * from t_securities").Sort().Check(testkit.Rows("1 1 2 7", "2 7 1 7", "3 8 1 7")) + + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + tk2.MustExec(`insert into t_securities (security_id, market_id, security_type) values ("1", 2, 7), ("7", 1, 7) ON DUPLICATE KEY UPDATE security_type = VALUES(security_type)`) + tk2.MustExec(`insert into t_securities (security_id, market_id, security_type) select security_id+2, 1, security_type from t_securities where security_id="7";`) + tk2.MustExec(`INSERT INTO t_securities (security_id, market_id, security_type) values ("1", 2, 7), ("7", 1, 7) ON DUPLICATE KEY UPDATE security_type = VALUES(security_type)`) + + tk2.MustQuery("select * from t_securities").Sort().Check(testkit.Rows("1 1 2 7", "2 7 1 7", "3 8 1 7", "8 9 1 7")) +} diff --git a/expression/BUILD.bazel b/expression/BUILD.bazel index 032c44054dba2..17436f517a673 100644 --- a/expression/BUILD.bazel +++ b/expression/BUILD.bazel @@ -97,6 +97,7 @@ go_library( "//util/mathutil", "//util/mock", "//util/parser", + "//util/password-validation", "//util/plancodec", "//util/printer", "//util/sem", @@ -110,6 +111,7 @@ go_library( "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_tipb//go-tipb", + "@com_github_pkg_errors//:errors", "@com_github_tikv_client_go_v2//oracle", "@org_golang_x_exp//slices", "@org_golang_x_tools//container/intsets", @@ -120,7 +122,7 @@ go_library( go_test( name = "expression_test", - timeout = "short", + timeout = "moderate", srcs = [ "bench_test.go", "builtin_arithmetic_test.go", @@ -175,6 +177,7 @@ go_test( "integration_serial_test.go", "integration_test.go", "main_test.go", + "multi_valued_index_test.go", "scalar_function_test.go", "schema_test.go", "typeinfer_test.go", diff --git a/expression/builtin.go b/expression/builtin.go index f10cf9aa3dfa9..66abac551a3e6 100644 --- a/expression/builtin.go +++ b/expression/builtin.go @@ -873,7 +873,9 @@ var funcs = map[string]functionClass{ ast.JSONMerge: &jsonMergeFunctionClass{baseFunctionClass{ast.JSONMerge, 2, -1}}, ast.JSONObject: &jsonObjectFunctionClass{baseFunctionClass{ast.JSONObject, 0, -1}}, ast.JSONArray: &jsonArrayFunctionClass{baseFunctionClass{ast.JSONArray, 0, -1}}, + ast.JSONMemberOf: &jsonMemberOfFunctionClass{baseFunctionClass{ast.JSONMemberOf, 2, 2}}, ast.JSONContains: &jsonContainsFunctionClass{baseFunctionClass{ast.JSONContains, 2, 3}}, + ast.JSONOverlaps: &jsonOverlapsFunctionClass{baseFunctionClass{ast.JSONOverlaps, 2, 2}}, ast.JSONContainsPath: &jsonContainsPathFunctionClass{baseFunctionClass{ast.JSONContainsPath, 3, -1}}, ast.JSONValid: &jsonValidFunctionClass{baseFunctionClass{ast.JSONValid, 1, 1}}, ast.JSONArrayAppend: &jsonArrayAppendFunctionClass{baseFunctionClass{ast.JSONArrayAppend, 3, -1}}, diff --git a/expression/builtin_cast.go b/expression/builtin_cast.go index 0dd7e20cce24e..c2d57fdeab9cc 100644 --- a/expression/builtin_cast.go +++ b/expression/builtin_cast.go @@ -23,6 +23,7 @@ package expression import ( + "fmt" "math" "strconv" "strings" @@ -35,6 +36,7 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -407,6 +409,149 @@ func (c *castAsDurationFunctionClass) getFunction(ctx sessionctx.Context, args [ return sig, nil } +type castAsArrayFunctionClass struct { + baseFunctionClass + + tp *types.FieldType +} + +func (c *castAsArrayFunctionClass) verifyArgs(args []Expression) error { + if err := c.baseFunctionClass.verifyArgs(args); err != nil { + return err + } + + if args[0].GetType().EvalType() != types.ETJson { + return ErrInvalidTypeForJSON.GenWithStackByArgs(1, "cast_as_array") + } + + return nil +} + +func (c *castAsArrayFunctionClass) getFunction(ctx sessionctx.Context, args []Expression) (sig builtinFunc, err error) { + if err := c.verifyArgs(args); err != nil { + return nil, err + } + arrayType := c.tp.ArrayType() + switch arrayType.GetType() { + case mysql.TypeYear, mysql.TypeJSON, mysql.TypeDouble, mysql.TypeFloat, mysql.TypeNewDecimal: + return nil, ErrNotSupportedYet.GenWithStackByArgs(fmt.Sprintf("CAST-ing data to array of %s", arrayType.String())) + } + if arrayType.EvalType() == types.ETString && arrayType.GetCharset() != charset.CharsetUTF8MB4 && arrayType.GetCharset() != charset.CharsetBin { + return nil, ErrNotSupportedYet.GenWithStackByArgs("specifying charset for multi-valued index") + } + if arrayType.EvalType() == types.ETString && arrayType.GetFlen() == types.UnspecifiedLength { + return nil, ErrNotSupportedYet.GenWithStackByArgs("CAST-ing data to array of char/binary BLOBs") + } + + bf, err := newBaseBuiltinFunc(ctx, c.funcName, args, c.tp) + if err != nil { + return nil, err + } + sig = &castJSONAsArrayFunctionSig{bf} + return sig, nil +} + +type castJSONAsArrayFunctionSig struct { + baseBuiltinFunc +} + +func (b *castJSONAsArrayFunctionSig) Clone() builtinFunc { + newSig := &castJSONAsArrayFunctionSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +// fakeSctx is used to ignore the sql mode, `cast as array` should always return error if any. +var fakeSctx = &stmtctx.StatementContext{InInsertStmt: true} + +func (b *castJSONAsArrayFunctionSig) evalJSON(row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { + val, isNull, err := b.args[0].EvalJSON(b.ctx, row) + if isNull || err != nil { + return res, isNull, err + } + + if val.TypeCode == types.JSONTypeCodeObject { + return types.BinaryJSON{}, false, ErrNotSupportedYet.GenWithStackByArgs("CAST-ing JSON OBJECT type to array") + } + + arrayVals := make([]any, 0, 8) + ft := b.tp.ArrayType() + f := convertJSON2Tp(ft.EvalType()) + if f == nil { + return types.BinaryJSON{}, false, ErrNotSupportedYet.GenWithStackByArgs(fmt.Sprintf("CAS-ing data to array of %s", ft.String())) + } + if val.TypeCode != types.JSONTypeCodeArray { + item, err := f(fakeSctx, val, ft) + if err != nil { + return types.BinaryJSON{}, false, err + } + arrayVals = append(arrayVals, item) + } else { + for i := 0; i < val.GetElemCount(); i++ { + item, err := f(fakeSctx, val.ArrayGetElem(i), ft) + if err != nil { + return types.BinaryJSON{}, false, err + } + arrayVals = append(arrayVals, item) + } + } + return types.CreateBinaryJSON(arrayVals), false, nil +} + +// ConvertJSON2Tp returns a function that can convert JSON to the specified type. +func ConvertJSON2Tp(v types.BinaryJSON, targetType *types.FieldType) (any, error) { + convertFunc := convertJSON2Tp(targetType.EvalType()) + if convertFunc == nil { + return nil, ErrInvalidJSONForFuncIndex + } + return convertFunc(fakeSctx, v, targetType) +} + +func convertJSON2Tp(evalType types.EvalType) func(*stmtctx.StatementContext, types.BinaryJSON, *types.FieldType) (any, error) { + switch evalType { + case types.ETString: + return func(sc *stmtctx.StatementContext, item types.BinaryJSON, tp *types.FieldType) (any, error) { + if item.TypeCode != types.JSONTypeCodeString { + return nil, ErrInvalidJSONForFuncIndex + } + return types.ProduceStrWithSpecifiedTp(string(item.GetString()), tp, sc, false) + } + case types.ETInt: + return func(sc *stmtctx.StatementContext, item types.BinaryJSON, tp *types.FieldType) (any, error) { + if item.TypeCode != types.JSONTypeCodeInt64 && item.TypeCode != types.JSONTypeCodeUint64 { + return nil, ErrInvalidJSONForFuncIndex + } + jsonToInt, err := types.ConvertJSONToInt(sc, item, mysql.HasUnsignedFlag(tp.GetFlag()), tp.GetType()) + if mysql.HasUnsignedFlag(tp.GetFlag()) { + return uint64(jsonToInt), err + } + return jsonToInt, err + } + case types.ETDatetime: + return func(sc *stmtctx.StatementContext, item types.BinaryJSON, tp *types.FieldType) (any, error) { + if (tp.GetType() == mysql.TypeDatetime && item.TypeCode != types.JSONTypeCodeDatetime) || (tp.GetType() == mysql.TypeDate && item.TypeCode != types.JSONTypeCodeDate) { + return nil, ErrInvalidJSONForFuncIndex + } + res := item.GetTime() + res.SetType(tp.GetType()) + if tp.GetType() == mysql.TypeDate { + // Truncate hh:mm:ss part if the type is Date. + res.SetCoreTime(types.FromDate(res.Year(), res.Month(), res.Day(), 0, 0, 0, 0)) + } + return res, nil + } + case types.ETDuration: + return func(sc *stmtctx.StatementContext, item types.BinaryJSON, tp *types.FieldType) (any, error) { + if item.TypeCode != types.JSONTypeCodeDuration { + return nil, ErrInvalidJSONForFuncIndex + } + return item.GetDuration(), nil + } + default: + return nil + } +} + type castAsJSONFunctionClass struct { baseFunctionClass @@ -1299,7 +1444,7 @@ func (b *builtinCastStringAsTimeSig) evalTime(row chunk.Row) (res types.Time, is return res, isNull, err } sc := b.ctx.GetSessionVars().StmtCtx - res, err = types.ParseTime(sc, val, b.tp.GetType(), b.tp.GetDecimal()) + res, err = types.ParseTime(sc, val, b.tp.GetType(), b.tp.GetDecimal(), nil) if err != nil { return types.ZeroTime, true, handleInvalidTimeError(b.ctx, err) } @@ -1722,7 +1867,11 @@ func (b *builtinCastJSONAsStringSig) evalString(row chunk.Row) (res string, isNu if isNull || err != nil { return res, isNull, err } - return val.String(), false, nil + s, err := types.ProduceStrWithSpecifiedTp(val.String(), b.tp, b.ctx.GetSessionVars().StmtCtx, false) + if err != nil { + return res, false, err + } + return s, false, nil } type builtinCastJSONAsTimeSig struct { @@ -1770,7 +1919,7 @@ func (b *builtinCastJSONAsTimeSig) evalTime(row chunk.Row) (res types.Time, isNu return res, false, err } sc := b.ctx.GetSessionVars().StmtCtx - res, err = types.ParseTime(sc, s, b.tp.GetType(), b.tp.GetDecimal()) + res, err = types.ParseTime(sc, s, b.tp.GetType(), b.tp.GetDecimal(), nil) if err != nil { return types.ZeroTime, true, handleInvalidTimeError(b.ctx, err) } @@ -1910,6 +2059,13 @@ func BuildCastCollationFunction(ctx sessionctx.Context, expr Expression, ec *Exp // BuildCastFunction builds a CAST ScalarFunction from the Expression. func BuildCastFunction(ctx sessionctx.Context, expr Expression, tp *types.FieldType) (res Expression) { + res, err := BuildCastFunctionWithCheck(ctx, expr, tp) + terror.Log(err) + return +} + +// BuildCastFunctionWithCheck builds a CAST ScalarFunction from the Expression and return error if any. +func BuildCastFunctionWithCheck(ctx sessionctx.Context, expr Expression, tp *types.FieldType) (res Expression, err error) { argType := expr.GetType() // If source argument's nullable, then target type should be nullable if !mysql.HasNotNullFlag(argType.GetFlag()) { @@ -1929,7 +2085,11 @@ func BuildCastFunction(ctx sessionctx.Context, expr Expression, tp *types.FieldT case types.ETDuration: fc = &castAsDurationFunctionClass{baseFunctionClass{ast.Cast, 1, 1}, tp} case types.ETJson: - fc = &castAsJSONFunctionClass{baseFunctionClass{ast.Cast, 1, 1}, tp} + if tp.IsArray() { + fc = &castAsArrayFunctionClass{baseFunctionClass{ast.Cast, 1, 1}, tp} + } else { + fc = &castAsJSONFunctionClass{baseFunctionClass{ast.Cast, 1, 1}, tp} + } case types.ETString: fc = &castAsStringFunctionClass{baseFunctionClass{ast.Cast, 1, 1}, tp} if expr.GetType().GetType() == mysql.TypeBit { @@ -1937,7 +2097,6 @@ func BuildCastFunction(ctx sessionctx.Context, expr Expression, tp *types.FieldT } } f, err := fc.getFunction(ctx, []Expression{expr}) - terror.Log(err) res = &ScalarFunction{ FuncName: model.NewCIStr(ast.Cast), RetType: tp, @@ -1946,10 +2105,10 @@ func BuildCastFunction(ctx sessionctx.Context, expr Expression, tp *types.FieldT // We do not fold CAST if the eval type of this scalar function is ETJson // since we may reset the flag of the field type of CastAsJson later which // would affect the evaluation of it. - if tp.EvalType() != types.ETJson { + if tp.EvalType() != types.ETJson && err == nil { res = FoldConstant(res) } - return res + return res, err } // WrapWithCastAsInt wraps `expr` with `cast` if the return type of expr is not diff --git a/expression/builtin_cast_test.go b/expression/builtin_cast_test.go index f8e789a527620..b33c70e19d60f 100644 --- a/expression/builtin_cast_test.go +++ b/expression/builtin_cast_test.go @@ -719,6 +719,13 @@ func TestCastFuncSig(t *testing.T) { 3, chunk.MutRowFromDatums([]types.Datum{types.NewStringDatum("你好world")}), }, + // cast json as string + { + &Column{RetType: types.NewFieldType(mysql.TypeJSON), Index: 0}, + fmt.Sprintf(`"%s`, curTimeString[:2]), + 3, + chunk.MutRowFromDatums([]types.Datum{jsonTime}), + }, } for i, c := range castToStringCases2 { args := []Expression{c.before} @@ -741,6 +748,8 @@ func TestCastFuncSig(t *testing.T) { case 5: stringFunc.tp.SetCharset(charset.CharsetUTF8) sig = &builtinCastStringAsStringSig{stringFunc} + case 6: + sig = &builtinCastJSONAsStringSig{stringFunc} } res, isNull, err := sig.evalString(c.row.ToRow()) require.False(t, isNull) @@ -1610,3 +1619,59 @@ func TestCastBinaryStringAsJSONSig(t *testing.T) { require.Equal(t, tt.resultStr, res.String()) } } + +func TestCastArrayFunc(t *testing.T) { + ctx := createContext(t) + tbl := []struct { + input interface{} + expected interface{} + tp *types.FieldType + success bool + buildFuncSuccess bool + }{ + { + []interface{}{int64(-1), int64(2), int64(3)}, + []interface{}{int64(-1), int64(2), int64(3)}, + types.NewFieldTypeBuilder().SetType(mysql.TypeLonglong).SetCharset(charset.CharsetBin).SetCollate(charset.CollationBin).SetArray(true).BuildP(), + true, + true, + }, + { + []interface{}{int64(-1), int64(2), int64(3)}, + nil, + types.NewFieldTypeBuilder().SetType(mysql.TypeString).SetCharset(charset.CharsetUTF8MB4).SetCollate(charset.CollationUTF8MB4).SetArray(true).BuildP(), + false, + true, + }, + { + []interface{}{"1"}, + nil, + types.NewFieldTypeBuilder().SetType(mysql.TypeLonglong).SetCharset(charset.CharsetBin).SetCollate(charset.CharsetBin).SetArray(true).BuildP(), + false, + true, + }, + } + for _, tt := range tbl { + f, err := BuildCastFunctionWithCheck(ctx, datumsToConstants(types.MakeDatums(types.CreateBinaryJSON(tt.input)))[0], tt.tp) + if tt.buildFuncSuccess { + require.NoError(t, err, tt.input) + } else { + require.Error(t, err, tt.input) + continue + } + + val, isNull, err := f.EvalJSON(ctx, chunk.Row{}) + if tt.success { + require.NoError(t, err, tt.input) + if tt.expected == nil { + require.True(t, isNull, tt.input) + } else { + j1 := types.CreateBinaryJSON(tt.expected) + cmp := types.CompareBinaryJSON(j1, val) + require.Equal(t, 0, cmp, tt.input) + } + } else { + require.Error(t, err, tt.input) + } + } +} diff --git a/expression/builtin_cast_vec.go b/expression/builtin_cast_vec.go index 8b82d86b776e5..f6b4266e8e534 100644 --- a/expression/builtin_cast_vec.go +++ b/expression/builtin_cast_vec.go @@ -529,7 +529,7 @@ func (b *builtinCastJSONAsTimeSig) vecEvalTime(input *chunk.Chunk, result *chunk if err != nil { return err } - tm, err := types.ParseTime(stmtCtx, s, b.tp.GetType(), fsp) + tm, err := types.ParseTime(stmtCtx, s, b.tp.GetType(), fsp, nil) if err != nil { if err = handleInvalidTimeError(b.ctx, err); err != nil { return err @@ -1186,7 +1186,11 @@ func (b *builtinCastJSONAsStringSig) vecEvalString(input *chunk.Chunk, result *c result.AppendNull() continue } - result.AppendString(buf.GetJSON(i).String()) + s, err := types.ProduceStrWithSpecifiedTp(buf.GetJSON(i).String(), b.tp, b.ctx.GetSessionVars().StmtCtx, false) + if err != nil { + return err + } + result.AppendString(s) } return nil } @@ -1762,7 +1766,7 @@ func (b *builtinCastStringAsTimeSig) vecEvalTime(input *chunk.Chunk, result *chu if result.IsNull(i) { continue } - tm, err := types.ParseTime(stmtCtx, buf.GetString(i), b.tp.GetType(), fsp) + tm, err := types.ParseTime(stmtCtx, buf.GetString(i), b.tp.GetType(), fsp, nil) if err != nil { if err = handleInvalidTimeError(b.ctx, err); err != nil { return err diff --git a/expression/builtin_compare.go b/expression/builtin_compare.go index 3baa86b635ba6..bed48c0e59096 100644 --- a/expression/builtin_compare.go +++ b/expression/builtin_compare.go @@ -28,6 +28,7 @@ import ( "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tipb/go-tipb" + "github.com/pkg/errors" ) var ( @@ -1555,6 +1556,37 @@ func RefineComparedConstant(ctx sessionctx.Context, targetFieldType types.FieldT return con, false } +// Since the argument refining of cmp functions can bring some risks to the plan-cache, the optimizer +// needs to decide to whether to skip the refining or skip plan-cache for safety. +// For example, `unsigned_int_col > ?(-1)` can be refined to `True`, but the validation of this result +// can be broken if the parameter changes to 1 after. +func allowCmpArgsRefining4PlanCache(ctx sessionctx.Context, args []Expression) (allowRefining bool) { + if !MaybeOverOptimized4PlanCache(ctx, args) { + return true // plan-cache disabled or no parameter in these args + } + + // For these 2 cases below which may affect the index selection a lot, skip plan-cache, + // and for all other cases, skip the refining. + // 1. int-expr string-const + // 2. int-expr float/double/decimal-const + for conIdx := 0; conIdx < 2; conIdx++ { + if args[1-conIdx].GetType().EvalType() != types.ETInt { + continue // not a int-expr + } + if _, isCon := args[conIdx].(*Constant); !isCon { + continue // not a constant + } + conType := args[conIdx].GetType().EvalType() + if conType == types.ETString || conType == types.ETReal || conType == types.ETDecimal { + reason := errors.Errorf("skip plan-cache: '%v' may be converted to INT", args[conIdx].String()) + ctx.GetSessionVars().StmtCtx.SetSkipPlanCache(reason) + return true + } + } + + return false +} + // refineArgs will rewrite the arguments if the compare expression is `int column non-int constant` or // `non-int constant int column`. E.g., `a < 1.1` will be rewritten to `a < 2`. It also handles comparing year type // with int constant if the int constant falls into a sensible year representation. @@ -1564,25 +1596,17 @@ func (c *compareFunctionClass) refineArgs(ctx sessionctx.Context, args []Express arg0Type, arg1Type := args[0].GetType(), args[1].GetType() arg0IsInt := arg0Type.EvalType() == types.ETInt arg1IsInt := arg1Type.EvalType() == types.ETInt - arg0IsString := arg0Type.EvalType() == types.ETString - arg1IsString := arg1Type.EvalType() == types.ETString arg0, arg0IsCon := args[0].(*Constant) arg1, arg1IsCon := args[1].(*Constant) isExceptional, finalArg0, finalArg1 := false, args[0], args[1] isPositiveInfinite, isNegativeInfinite := false, false - if MaybeOverOptimized4PlanCache(ctx, args) { - // To keep the result be compatible with MySQL, refine `int non-constant str constant` - // here and skip this refine operation in all other cases for safety. - if (arg0IsInt && !arg0IsCon && arg1IsString && arg1IsCon) || (arg1IsInt && !arg1IsCon && arg0IsString && arg0IsCon) { - ctx.GetSessionVars().StmtCtx.SkipPlanCache = true - RemoveMutableConst(ctx, args) - } else { - return args - } - } else if ctx.GetSessionVars().StmtCtx.SkipPlanCache { - // We should remove the mutable constant for correctness, because its value may be changed. - RemoveMutableConst(ctx, args) + + if !allowCmpArgsRefining4PlanCache(ctx, args) { + return args } + // We should remove the mutable constant for correctness, because its value may be changed. + RemoveMutableConst(ctx, args) + // int non-constant [cmp] non-int constant if arg0IsInt && !arg0IsCon && !arg1IsInt && arg1IsCon { arg1, isExceptional = RefineComparedConstant(ctx, *arg0Type, arg1, c.op) diff --git a/expression/builtin_compare_test.go b/expression/builtin_compare_test.go index 78229b77b1f60..849142308ec93 100644 --- a/expression/builtin_compare_test.go +++ b/expression/builtin_compare_test.go @@ -406,3 +406,17 @@ func TestGreatestLeastFunc(t *testing.T) { _, err = funcs[ast.Least].getFunction(ctx, []Expression{NewZero(), NewOne()}) require.NoError(t, err) } + +func TestRefineArgsWithCastEnum(t *testing.T) { + ctx := createContext(t) + zeroUintConst := primitiveValsToConstants(ctx, []interface{}{uint64(0)})[0] + enumType := types.NewFieldTypeBuilder().SetType(mysql.TypeEnum).SetElems([]string{"1", "2", "3"}).AddFlag(mysql.EnumSetAsIntFlag).Build() + enumCol := &Column{RetType: &enumType} + + f := funcs[ast.EQ].(*compareFunctionClass) + require.NotNil(t, f) + + args := f.refineArgsByUnsignedFlag(ctx, []Expression{zeroUintConst, enumCol}) + require.Equal(t, zeroUintConst, args[0]) + require.Equal(t, enumCol, args[1]) +} diff --git a/expression/builtin_encryption.go b/expression/builtin_encryption.go index a206a9d4970bb..fb451f9714cd4 100644 --- a/expression/builtin_encryption.go +++ b/expression/builtin_encryption.go @@ -37,6 +37,7 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/encrypt" + pwdValidator "github.com/pingcap/tidb/util/password-validation" "github.com/pingcap/tipb/go-tipb" ) @@ -73,6 +74,7 @@ var ( _ builtinFunc = &builtinSHA2Sig{} _ builtinFunc = &builtinUncompressSig{} _ builtinFunc = &builtinUncompressedLengthSig{} + _ builtinFunc = &builtinValidatePasswordStrengthSig{} ) // aesModeAttr indicates that the key length and iv attribute for specific block_encryption_mode. @@ -728,7 +730,6 @@ func (c *sm3FunctionClass) getFunction(ctx sessionctx.Context, args []Expression bf.tp.SetCollate(collate) bf.tp.SetFlen(40) sig := &builtinSM3Sig{bf} - //sig.setPbCode(tipb.ScalarFuncSig_SM3) // TODO return sig, nil } @@ -1010,5 +1011,66 @@ type validatePasswordStrengthFunctionClass struct { } func (c *validatePasswordStrengthFunctionClass) getFunction(ctx sessionctx.Context, args []Expression) (builtinFunc, error) { - return nil, errFunctionNotExists.GenWithStackByArgs("FUNCTION", "VALIDATE_PASSWORD_STRENGTH") + if err := c.verifyArgs(args); err != nil { + return nil, err + } + bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETInt, types.ETString) + if err != nil { + return nil, err + } + bf.tp.SetFlen(21) + sig := &builtinValidatePasswordStrengthSig{bf} + return sig, nil +} + +type builtinValidatePasswordStrengthSig struct { + baseBuiltinFunc +} + +func (b *builtinValidatePasswordStrengthSig) Clone() builtinFunc { + newSig := &builtinValidatePasswordStrengthSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +// evalInt evals VALIDATE_PASSWORD_STRENGTH(str). +// See https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_validate-password-strength +func (b *builtinValidatePasswordStrengthSig) evalInt(row chunk.Row) (int64, bool, error) { + globalVars := b.ctx.GetSessionVars().GlobalVarsAccessor + str, isNull, err := b.args[0].EvalString(b.ctx, row) + if err != nil || isNull { + return 0, true, err + } else if len([]rune(str)) < 4 { + return 0, false, nil + } + if validation, err := globalVars.GetGlobalSysVar(variable.ValidatePasswordEnable); err != nil { + return 0, true, err + } else if !variable.TiDBOptOn(validation) { + return 0, false, nil + } + return b.validateStr(str, &globalVars) +} + +func (b *builtinValidatePasswordStrengthSig) validateStr(str string, globalVars *variable.GlobalVarAccessor) (int64, bool, error) { + if warn, err := pwdValidator.ValidateUserNameInPassword(str, b.ctx.GetSessionVars()); err != nil { + return 0, true, err + } else if len(warn) > 0 { + return 0, false, nil + } + if warn, err := pwdValidator.ValidatePasswordLowPolicy(str, globalVars); err != nil { + return 0, true, err + } else if len(warn) > 0 { + return 25, false, nil + } + if warn, err := pwdValidator.ValidatePasswordMediumPolicy(str, globalVars); err != nil { + return 0, true, err + } else if len(warn) > 0 { + return 50, false, nil + } + if ok, err := pwdValidator.ValidateDictionaryPassword(str, globalVars); err != nil { + return 0, true, err + } else if !ok { + return 75, false, nil + } + return 100, false, nil } diff --git a/expression/builtin_encryption_test.go b/expression/builtin_encryption_test.go index 0f74ab611aa48..087fb3f35e466 100644 --- a/expression/builtin_encryption_test.go +++ b/expression/builtin_encryption_test.go @@ -15,12 +15,14 @@ package expression import ( + "context" "encoding/hex" "fmt" "strings" "testing" "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" @@ -631,6 +633,55 @@ func TestUncompressLength(t *testing.T) { } } +func TestValidatePasswordStrength(t *testing.T) { + ctx := createContext(t) + ctx.GetSessionVars().User = &auth.UserIdentity{Username: "testuser"} + globalVarsAccessor := variable.NewMockGlobalAccessor4Tests() + ctx.GetSessionVars().GlobalVarsAccessor = globalVarsAccessor + err := globalVarsAccessor.SetGlobalSysVar(context.Background(), variable.ValidatePasswordDictionary, "1234") + require.NoError(t, err) + + tests := []struct { + in interface{} + expect interface{} + }{ + {nil, nil}, + {"123", 0}, + {"testuser123", 0}, + {"resutset123", 0}, + {"12345", 25}, + {"12345678", 50}, + {"!Abc12345678", 75}, + {"!Abc87654321", 100}, + } + + fc := funcs[ast.ValidatePasswordStrength] + // disable password validation + for _, test := range tests { + arg := types.NewDatum(test.in) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{arg})) + require.NoErrorf(t, err, "%v", test) + out, err := evalBuiltinFunc(f, chunk.Row{}) + require.NoErrorf(t, err, "%v", test) + if test.expect == nil { + require.Equal(t, types.NewDatum(nil), out) + } else { + require.Equalf(t, types.NewDatum(0), out, "%v", test) + } + } + // enable password validation + err = globalVarsAccessor.SetGlobalSysVar(context.Background(), variable.ValidatePasswordEnable, "ON") + require.NoError(t, err) + for _, test := range tests { + arg := types.NewDatum(test.in) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{arg})) + require.NoErrorf(t, err, "%v", test) + out, err := evalBuiltinFunc(f, chunk.Row{}) + require.NoErrorf(t, err, "%v", test) + require.Equalf(t, types.NewDatum(test.expect), out, "%v", test) + } +} + func TestPassword(t *testing.T) { ctx := createContext(t) cases := []struct { diff --git a/expression/builtin_encryption_vec.go b/expression/builtin_encryption_vec.go index e9a1d45ae67be..ff71913f8d70b 100644 --- a/expression/builtin_encryption_vec.go +++ b/expression/builtin_encryption_vec.go @@ -30,6 +30,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/parser/auth" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/encrypt" @@ -863,3 +864,45 @@ func (b *builtinUncompressedLengthSig) vecEvalInt(input *chunk.Chunk, result *ch } return nil } + +func (b *builtinValidatePasswordStrengthSig) vectorized() bool { + return true +} + +func (b *builtinValidatePasswordStrengthSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) error { + n := input.NumRows() + buf, err := b.bufAllocator.get() + if err != nil { + return err + } + defer b.bufAllocator.put(buf) + if err := b.args[0].VecEvalString(b.ctx, input, buf); err != nil { + return err + } + + result.ResizeInt64(n, false) + result.MergeNulls(buf) + i64s := result.Int64s() + globalVars := b.ctx.GetSessionVars().GlobalVarsAccessor + enableValidation := false + validation, err := globalVars.GetGlobalSysVar(variable.ValidatePasswordEnable) + if err != nil { + return err + } + enableValidation = variable.TiDBOptOn(validation) + for i := 0; i < n; i++ { + if result.IsNull(i) { + continue + } + if !enableValidation { + i64s[i] = 0 + } else if score, isNull, err := b.validateStr(buf.GetString(i), &globalVars); err != nil { + return err + } else if !isNull { + i64s[i] = score + } else { + result.SetNull(i, true) + } + } + return nil +} diff --git a/expression/builtin_encryption_vec_test.go b/expression/builtin_encryption_vec_test.go index c6caa1eb60d51..46395e51bcb6b 100644 --- a/expression/builtin_encryption_vec_test.go +++ b/expression/builtin_encryption_vec_test.go @@ -75,6 +75,9 @@ var vecBuiltinEncryptionCases = map[string][]vecExprBenchCase{ ast.Decode: { {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString, types.ETString}, geners: []dataGenerator{newRandLenStrGener(10, 20)}}, }, + ast.ValidatePasswordStrength: { + {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETString}}, + }, } func TestVectorizedBuiltinEncryptionFunc(t *testing.T) { diff --git a/expression/builtin_json.go b/expression/builtin_json.go index e317fa88e952a..e9f803dcc86df 100644 --- a/expression/builtin_json.go +++ b/expression/builtin_json.go @@ -43,7 +43,9 @@ var ( _ functionClass = &jsonMergeFunctionClass{} _ functionClass = &jsonObjectFunctionClass{} _ functionClass = &jsonArrayFunctionClass{} + _ functionClass = &jsonMemberOfFunctionClass{} _ functionClass = &jsonContainsFunctionClass{} + _ functionClass = &jsonOverlapsFunctionClass{} _ functionClass = &jsonContainsPathFunctionClass{} _ functionClass = &jsonValidFunctionClass{} _ functionClass = &jsonArrayAppendFunctionClass{} @@ -71,7 +73,9 @@ var ( _ builtinFunc = &builtinJSONReplaceSig{} _ builtinFunc = &builtinJSONRemoveSig{} _ builtinFunc = &builtinJSONMergeSig{} + _ builtinFunc = &builtinJSONMemberOfSig{} _ builtinFunc = &builtinJSONContainsSig{} + _ builtinFunc = &builtinJSONOverlapsSig{} _ builtinFunc = &builtinJSONStorageSizeSig{} _ builtinFunc = &builtinJSONDepthSig{} _ builtinFunc = &builtinJSONSearchSig{} @@ -740,6 +744,68 @@ func jsonModify(ctx sessionctx.Context, args []Expression, row chunk.Row, mt typ return res, false, nil } +type jsonMemberOfFunctionClass struct { + baseFunctionClass +} + +type builtinJSONMemberOfSig struct { + baseBuiltinFunc +} + +func (b *builtinJSONMemberOfSig) Clone() builtinFunc { + newSig := &builtinJSONMemberOfSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +func (c *jsonMemberOfFunctionClass) verifyArgs(args []Expression) error { + if err := c.baseFunctionClass.verifyArgs(args); err != nil { + return err + } + if evalType := args[1].GetType().EvalType(); evalType != types.ETJson && evalType != types.ETString { + return types.ErrInvalidJSONData.GenWithStackByArgs(2, "member of") + } + return nil +} + +func (c *jsonMemberOfFunctionClass) getFunction(ctx sessionctx.Context, args []Expression) (builtinFunc, error) { + if err := c.verifyArgs(args); err != nil { + return nil, err + } + argTps := []types.EvalType{types.ETJson, types.ETJson} + bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETInt, argTps...) + if err != nil { + return nil, err + } + DisableParseJSONFlag4Expr(args[0]) + sig := &builtinJSONMemberOfSig{bf} + return sig, nil +} + +func (b *builtinJSONMemberOfSig) evalInt(row chunk.Row) (res int64, isNull bool, err error) { + target, isNull, err := b.args[0].EvalJSON(b.ctx, row) + if isNull || err != nil { + return res, isNull, err + } + obj, isNull, err := b.args[1].EvalJSON(b.ctx, row) + if isNull || err != nil { + return res, isNull, err + } + + if obj.TypeCode != types.JSONTypeCodeArray { + return boolToInt64(types.CompareBinaryJSON(obj, target) == 0), false, nil + } + + elemCount := obj.GetElemCount() + for i := 0; i < elemCount; i++ { + if types.CompareBinaryJSON(obj.ArrayGetElem(i), target) == 0 { + return 1, false, nil + } + } + + return 0, false, nil +} + type jsonContainsFunctionClass struct { baseFunctionClass } @@ -820,6 +886,62 @@ func (b *builtinJSONContainsSig) evalInt(row chunk.Row) (res int64, isNull bool, return 0, false, nil } +type jsonOverlapsFunctionClass struct { + baseFunctionClass +} + +type builtinJSONOverlapsSig struct { + baseBuiltinFunc +} + +func (b *builtinJSONOverlapsSig) Clone() builtinFunc { + newSig := &builtinJSONOverlapsSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +func (c *jsonOverlapsFunctionClass) verifyArgs(args []Expression) error { + if err := c.baseFunctionClass.verifyArgs(args); err != nil { + return err + } + if evalType := args[0].GetType().EvalType(); evalType != types.ETJson && evalType != types.ETString { + return types.ErrInvalidJSONData.GenWithStackByArgs(1, "json_overlaps") + } + if evalType := args[1].GetType().EvalType(); evalType != types.ETJson && evalType != types.ETString { + return types.ErrInvalidJSONData.GenWithStackByArgs(2, "json_overlaps") + } + return nil +} + +func (c *jsonOverlapsFunctionClass) getFunction(ctx sessionctx.Context, args []Expression) (builtinFunc, error) { + if err := c.verifyArgs(args); err != nil { + return nil, err + } + + argTps := []types.EvalType{types.ETJson, types.ETJson} + bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETInt, argTps...) + if err != nil { + return nil, err + } + sig := &builtinJSONOverlapsSig{bf} + return sig, nil +} + +func (b *builtinJSONOverlapsSig) evalInt(row chunk.Row) (res int64, isNull bool, err error) { + obj, isNull, err := b.args[0].EvalJSON(b.ctx, row) + if isNull || err != nil { + return res, isNull, err + } + target, isNull, err := b.args[1].EvalJSON(b.ctx, row) + if isNull || err != nil { + return res, isNull, err + } + if types.OverlapsBinaryJSON(obj, target) { + return 1, false, nil + } + return 0, false, nil +} + type jsonValidFunctionClass struct { baseFunctionClass } diff --git a/expression/builtin_json_test.go b/expression/builtin_json_test.go index 3e142860fdd27..23da60f380652 100644 --- a/expression/builtin_json_test.go +++ b/expression/builtin_json_test.go @@ -386,6 +386,47 @@ func TestJSONRemove(t *testing.T) { } } +func TestJSONMemberOf(t *testing.T) { + ctx := createContext(t) + fc := funcs[ast.JSONMemberOf] + tbl := []struct { + input []interface{} + expected interface{} + err error + }{ + {[]interface{}{`1`, `a:1`}, 1, types.ErrInvalidJSONText}, + + {[]interface{}{1, `[1, 2]`}, 1, nil}, + {[]interface{}{1, `[1]`}, 1, nil}, + {[]interface{}{1, `[0]`}, 0, nil}, + {[]interface{}{1, `[1]`}, 1, nil}, + {[]interface{}{1, `[[1]]`}, 0, nil}, + {[]interface{}{"1", `[1]`}, 0, nil}, + {[]interface{}{"1", `["1"]`}, 1, nil}, + {[]interface{}{`{"a":1}`, `{"a":1}`}, 0, nil}, + {[]interface{}{`{"a":1}`, `[{"a":1}]`}, 0, nil}, + {[]interface{}{`{"a":1}`, `[{"a":1}, 1]`}, 0, nil}, + {[]interface{}{`{"a":1}`, `["{\"a\":1}"]`}, 1, nil}, + {[]interface{}{`{"a":1}`, `["{\"a\":1}", 1]`}, 1, nil}, + } + for _, tt := range tbl { + args := types.MakeDatums(tt.input...) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err, tt.input) + d, err := evalBuiltinFunc(f, chunk.Row{}) + if tt.err == nil { + require.NoError(t, err, tt.input) + if tt.expected == nil { + require.True(t, d.IsNull(), tt.input) + } else { + require.Equal(t, int64(tt.expected.(int)), d.GetInt64(), tt.input) + } + } else { + require.True(t, tt.err.(*terror.Error).Equal(err), tt.input) + } + } +} + func TestJSONContains(t *testing.T) { ctx := createContext(t) fc := funcs[ast.JSONContains] @@ -466,6 +507,71 @@ func TestJSONContains(t *testing.T) { } } +func TestJSONOverlaps(t *testing.T) { + ctx := createContext(t) + fc := funcs[ast.JSONOverlaps] + tbl := []struct { + input []any + expected any + err error + }{ + {[]any{`[1,2,[1,3]]`, `a:1`}, 1, types.ErrInvalidJSONText}, + {[]any{`a:1`, `1`}, 1, types.ErrInvalidJSONText}, + {[]any{nil, `1`}, nil, nil}, + {[]any{`1`, nil}, nil, nil}, + + {[]any{`[1, 2]`, `[2,3]`}, 1, nil}, + {[]any{`[1, 2]`, `[2]`}, 1, nil}, + {[]any{`[1, 2]`, `2`}, 1, nil}, + {[]any{`[{"a":1}]`, `{"a":1}`}, 1, nil}, + {[]any{`[{"a":1}]`, `{"a":1,"b":2}`}, 0, nil}, + {[]any{`[{"a":1}]`, `{"a":2}`}, 0, nil}, + {[]any{`{"a":[1,2]}`, `{"a":[1]}`}, 0, nil}, + {[]any{`{"a":[1,2]}`, `{"a":[2,1]}`}, 0, nil}, + {[]any{`[1,1,1]`, `1`}, 1, nil}, + {[]any{`1`, `1`}, 1, nil}, + {[]any{`0`, `1`}, 0, nil}, + {[]any{`[[1,2], 3]`, `[1,[2,3]]`}, 0, nil}, + {[]any{`[[1,2], 3]`, `[1,3]`}, 1, nil}, + {[]any{`{"a":1,"b":10,"d":10}`, `{"a":5,"e":10,"f":1,"d":20}`}, 0, nil}, + {[]any{`[4,5,"6",7]`, `6`}, 0, nil}, + {[]any{`[4,5,6,7]`, `"6"`}, 0, nil}, + + {[]any{`[2,3]`, `[1, 2]`}, 1, nil}, + {[]any{`[2]`, `[1, 2]`}, 1, nil}, + {[]any{`2`, `[1, 2]`}, 1, nil}, + {[]any{`{"a":1}`, `[{"a":1}]`}, 1, nil}, + {[]any{`{"a":1,"b":2}`, `[{"a":1}]`}, 0, nil}, + {[]any{`{"a":2}`, `[{"a":1}]`}, 0, nil}, + {[]any{`{"a":[1]}`, `{"a":[1,2]}`}, 0, nil}, + {[]any{`{"a":[2,1]}`, `{"a":[1,2]}`}, 0, nil}, + {[]any{`1`, `[1,1,1]`}, 1, nil}, + {[]any{`1`, `1`}, 1, nil}, + {[]any{`1`, `0`}, 0, nil}, + {[]any{`[1,[2,3]]`, `[[1,2], 3]`}, 0, nil}, + {[]any{`[1,3]`, `[[1,2], 3]`}, 1, nil}, + {[]any{`{"a":5,"e":10,"f":1,"d":20}`, `{"a":1,"b":10,"d":10}`}, 0, nil}, + {[]any{`6`, `[4,5,"6",7]`}, 0, nil}, + {[]any{`"6"`, `[4,5,6,7]`}, 0, nil}, + } + for _, tt := range tbl { + args := types.MakeDatums(tt.input...) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err, tt.input) + d, err := evalBuiltinFunc(f, chunk.Row{}) + if tt.err == nil { + require.NoError(t, err, tt.input) + if tt.expected == nil { + require.True(t, d.IsNull(), tt.input) + } else { + require.Equal(t, int64(tt.expected.(int)), d.GetInt64(), tt.input) + } + } else { + require.True(t, tt.err.(*terror.Error).Equal(err), tt.input) + } + } +} + func TestJSONContainsPath(t *testing.T) { ctx := createContext(t) fc := funcs[ast.JSONContainsPath] diff --git a/expression/builtin_json_vec.go b/expression/builtin_json_vec.go index fb24808ff2c73..0610a1f6ea3ca 100644 --- a/expression/builtin_json_vec.go +++ b/expression/builtin_json_vec.go @@ -274,6 +274,59 @@ func (b *builtinJSONArraySig) vecEvalJSON(input *chunk.Chunk, result *chunk.Colu return nil } +func (b *builtinJSONMemberOfSig) vectorized() bool { + return true +} + +func (b *builtinJSONMemberOfSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) error { + nr := input.NumRows() + + targetCol, err := b.bufAllocator.get() + if err != nil { + return err + } + defer b.bufAllocator.put(targetCol) + + if err := b.args[0].VecEvalJSON(b.ctx, input, targetCol); err != nil { + return err + } + + objCol, err := b.bufAllocator.get() + if err != nil { + return err + } + defer b.bufAllocator.put(objCol) + + if err := b.args[1].VecEvalJSON(b.ctx, input, objCol); err != nil { + return err + } + + result.ResizeInt64(nr, false) + resI64s := result.Int64s() + + result.MergeNulls(targetCol, objCol) + for i := 0; i < nr; i++ { + if result.IsNull(i) { + continue + } + obj := objCol.GetJSON(i) + target := targetCol.GetJSON(i) + if obj.TypeCode != types.JSONTypeCodeArray { + resI64s[i] = boolToInt64(types.CompareBinaryJSON(obj, target) == 0) + } else { + elemCount := obj.GetElemCount() + for j := 0; j < elemCount; j++ { + if types.CompareBinaryJSON(obj.ArrayGetElem(j), target) == 0 { + resI64s[i] = 1 + break + } + } + } + } + + return nil +} + func (b *builtinJSONContainsSig) vectorized() bool { return true } @@ -359,6 +412,51 @@ func (b *builtinJSONContainsSig) vecEvalInt(input *chunk.Chunk, result *chunk.Co return nil } +func (b *builtinJSONOverlapsSig) vectorized() bool { + return true +} + +func (b *builtinJSONOverlapsSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) error { + nr := input.NumRows() + + objCol, err := b.bufAllocator.get() + if err != nil { + return err + } + defer b.bufAllocator.put(objCol) + + if err := b.args[0].VecEvalJSON(b.ctx, input, objCol); err != nil { + return err + } + + targetCol, err := b.bufAllocator.get() + if err != nil { + return err + } + defer b.bufAllocator.put(targetCol) + + if err := b.args[1].VecEvalJSON(b.ctx, input, targetCol); err != nil { + return err + } + + result.ResizeInt64(nr, false) + resI64s := result.Int64s() + + result.MergeNulls(objCol, targetCol) + for i := 0; i < nr; i++ { + if result.IsNull(i) { + continue + } + if types.OverlapsBinaryJSON(objCol.GetJSON(i), targetCol.GetJSON(i)) { + resI64s[i] = 1 + } else { + resI64s[i] = 0 + } + } + + return nil +} + func (b *builtinJSONQuoteSig) vectorized() bool { return true } diff --git a/expression/builtin_op.go b/expression/builtin_op.go index cbb2afcc9377a..e15d1730c8cd9 100644 --- a/expression/builtin_op.go +++ b/expression/builtin_op.go @@ -718,7 +718,7 @@ func (c *unaryNotFunctionClass) getFunction(ctx sessionctx.Context, args []Expre argTp := args[0].GetType().EvalType() if argTp == types.ETTimestamp || argTp == types.ETDatetime || argTp == types.ETDuration { argTp = types.ETInt - } else if argTp == types.ETJson || argTp == types.ETString { + } else if argTp == types.ETString { argTp = types.ETReal } @@ -739,6 +739,10 @@ func (c *unaryNotFunctionClass) getFunction(ctx sessionctx.Context, args []Expre case types.ETInt: sig = &builtinUnaryNotIntSig{bf} sig.setPbCode(tipb.ScalarFuncSig_UnaryNotInt) + case types.ETJson: + ctx.GetSessionVars().StmtCtx.AppendWarning(errJSONInBooleanContext) + sig = &builtinUnaryNotJSONSig{bf} + sig.setPbCode(tipb.ScalarFuncSig_UnaryNotJSON) default: return nil, errors.Errorf("unexpected types.EvalType %v", argTp) } @@ -808,6 +812,28 @@ func (b *builtinUnaryNotIntSig) evalInt(row chunk.Row) (int64, bool, error) { return 0, false, nil } +type builtinUnaryNotJSONSig struct { + baseBuiltinFunc +} + +func (b *builtinUnaryNotJSONSig) Clone() builtinFunc { + newSig := &builtinUnaryNotJSONSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +func (b *builtinUnaryNotJSONSig) evalInt(row chunk.Row) (int64, bool, error) { + arg, isNull, err := b.args[0].EvalJSON(b.ctx, row) + if isNull || err != nil { + return 0, true, err + } + + if types.CompareBinaryJSON(arg, types.CreateBinaryJSON(int64(0))) == 0 { + return 1, false, nil + } + return 0, false, nil +} + type unaryMinusFunctionClass struct { baseFunctionClass } diff --git a/expression/builtin_op_test.go b/expression/builtin_op_test.go index 04024c90cb70f..c771b95da89d3 100644 --- a/expression/builtin_op_test.go +++ b/expression/builtin_op_test.go @@ -462,6 +462,8 @@ func TestUnaryNot(t *testing.T) { {[]interface{}{"0.3"}, 0, false, false}, {[]interface{}{types.NewDecFromFloatForTest(0.3)}, 0, false, false}, {[]interface{}{nil}, 0, true, false}, + {[]interface{}{types.CreateBinaryJSON(int64(0))}, 1, false, false}, + {[]interface{}{types.CreateBinaryJSON(map[string]interface{}{"test": "test"})}, 0, false, false}, {[]interface{}{errors.New("must error")}, 0, false, true}, } diff --git a/expression/builtin_other.go b/expression/builtin_other.go index 0f4bd85d45b43..c5bd6738aa9df 100644 --- a/expression/builtin_other.go +++ b/expression/builtin_other.go @@ -165,7 +165,7 @@ func (c *inFunctionClass) verifyArgs(ctx sessionctx.Context, args []Expression) case columnType.GetType() == mysql.TypeBit && constant.Value.Kind() == types.KindInt64: if constant.Value.GetInt64() < 0 { if MaybeOverOptimized4PlanCache(ctx, args) { - ctx.GetSessionVars().StmtCtx.SkipPlanCache = true + ctx.GetSessionVars().StmtCtx.SetSkipPlanCache(errors.Errorf("skip plan-cache: Bit Column in (%v)", constant.Value.GetInt64())) } continue } diff --git a/expression/builtin_time.go b/expression/builtin_time.go index 83f18d1c1653a..4349129e2dba6 100644 --- a/expression/builtin_time.go +++ b/expression/builtin_time.go @@ -2774,7 +2774,7 @@ func (du *baseDateArithmetical) getDateFromString(ctx sessionctx.Context, args [ } sc := ctx.GetSessionVars().StmtCtx - date, err := types.ParseTime(sc, dateStr, dateTp, types.MaxFsp) + date, err := types.ParseTime(sc, dateStr, dateTp, types.MaxFsp, nil) if err != nil { err = handleInvalidTimeError(ctx, err) if err != nil { @@ -3184,7 +3184,7 @@ func (du *baseDateArithmetical) vecGetDateFromString(b *baseBuiltinFunc, input * dateTp = mysql.TypeDatetime } - date, err := types.ParseTime(sc, dateStr, dateTp, types.MaxFsp) + date, err := types.ParseTime(sc, dateStr, dateTp, types.MaxFsp, nil) if err != nil { err = handleInvalidTimeError(b.ctx, err) if err != nil { @@ -4348,7 +4348,7 @@ func (b *builtinTimestamp1ArgSig) evalTime(row chunk.Row) (types.Time, bool, err if b.isFloat { tm, err = types.ParseTimeFromFloatString(sc, s, mysql.TypeDatetime, types.GetFsp(s)) } else { - tm, err = types.ParseTime(sc, s, mysql.TypeDatetime, types.GetFsp(s)) + tm, err = types.ParseTime(sc, s, mysql.TypeDatetime, types.GetFsp(s), nil) } if err != nil { return types.ZeroTime, true, handleInvalidTimeError(b.ctx, err) @@ -4380,7 +4380,7 @@ func (b *builtinTimestamp2ArgsSig) evalTime(row chunk.Row) (types.Time, bool, er if b.isFloat { tm, err = types.ParseTimeFromFloatString(sc, arg0, mysql.TypeDatetime, types.GetFsp(arg0)) } else { - tm, err = types.ParseTime(sc, arg0, mysql.TypeDatetime, types.GetFsp(arg0)) + tm, err = types.ParseTime(sc, arg0, mysql.TypeDatetime, types.GetFsp(arg0), nil) } if err != nil { return types.ZeroTime, true, handleInvalidTimeError(b.ctx, err) @@ -4431,7 +4431,7 @@ func (c *timestampLiteralFunctionClass) getFunction(ctx sessionctx.Context, args if !timestampPattern.MatchString(str) { return nil, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, str) } - tm, err := types.ParseTime(ctx.GetSessionVars().StmtCtx, str, mysql.TypeDatetime, types.GetFsp(str)) + tm, err := types.ParseTime(ctx.GetSessionVars().StmtCtx, str, mysql.TypeDatetime, types.GetFsp(str), nil) if err != nil { return nil, err } @@ -4539,7 +4539,7 @@ func isDuration(str string) bool { // strDatetimeAddDuration adds duration to datetime string, returns a string value. func strDatetimeAddDuration(sc *stmtctx.StatementContext, d string, arg1 types.Duration) (result string, isNull bool, err error) { - arg0, err := types.ParseTime(sc, d, mysql.TypeDatetime, types.MaxFsp) + arg0, err := types.ParseTime(sc, d, mysql.TypeDatetime, types.MaxFsp, nil) if err != nil { // Return a warning regardless of the sql_mode, this is compatible with MySQL. sc.AppendWarning(err) @@ -4576,7 +4576,7 @@ func strDurationAddDuration(sc *stmtctx.StatementContext, d string, arg1 types.D // strDatetimeSubDuration subtracts duration from datetime string, returns a string value. func strDatetimeSubDuration(sc *stmtctx.StatementContext, d string, arg1 types.Duration) (result string, isNull bool, err error) { - arg0, err := types.ParseTime(sc, d, mysql.TypeDatetime, types.MaxFsp) + arg0, err := types.ParseTime(sc, d, mysql.TypeDatetime, types.MaxFsp, nil) if err != nil { // Return a warning regardless of the sql_mode, this is compatible with MySQL. sc.AppendWarning(err) @@ -6087,7 +6087,7 @@ func (c *timestampAddFunctionClass) getFunction(ctx sessionctx.Context, args []E if err := c.verifyArgs(args); err != nil { return nil, err } - bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETString, types.ETString, types.ETInt, types.ETDatetime) + bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETString, types.ETString, types.ETReal, types.ETDatetime) if err != nil { return nil, err } @@ -6120,6 +6120,82 @@ func (b *builtinTimestampAddSig) Clone() builtinFunc { return newSig } +var ( + minDatetimeInGoTime, _ = types.MinDatetime.GoTime(time.Local) + minDatetimeNanos = float64(minDatetimeInGoTime.Unix())*1e9 + float64(minDatetimeInGoTime.Nanosecond()) + maxDatetimeInGoTime, _ = types.MaxDatetime.GoTime(time.Local) + maxDatetimeNanos = float64(maxDatetimeInGoTime.Unix())*1e9 + float64(maxDatetimeInGoTime.Nanosecond()) + minDatetimeMonths = float64(types.MinDatetime.Year()*12 + types.MinDatetime.Month() - 1) // 0001-01-01 00:00:00 + maxDatetimeMonths = float64(types.MaxDatetime.Year()*12 + types.MaxDatetime.Month() - 1) // 9999-12-31 00:00:00 +) + +func validAddTime(nano1 float64, nano2 float64) bool { + return nano1+nano2 >= minDatetimeNanos && nano1+nano2 <= maxDatetimeNanos +} + +func validAddMonth(month1 float64, year, month int) bool { + tmp := month1 + float64(year)*12 + float64(month-1) + return tmp >= minDatetimeMonths && tmp <= maxDatetimeMonths +} + +func addUnitToTime(unit string, t time.Time, v float64) (time.Time, bool, error) { + s := math.Trunc(v * 1000000) + // round to the nearest int + v = math.Round(v) + var tb time.Time + nano := float64(t.Unix())*1e9 + float64(t.Nanosecond()) + switch unit { + case "MICROSECOND": + if !validAddTime(v*float64(time.Microsecond), nano) { + return tb, true, nil + } + tb = t.Add(time.Duration(v) * time.Microsecond) + case "SECOND": + if !validAddTime(s*float64(time.Microsecond), nano) { + return tb, true, nil + } + tb = t.Add(time.Duration(s) * time.Microsecond) + case "MINUTE": + if !validAddTime(v*float64(time.Minute), nano) { + return tb, true, nil + } + tb = t.Add(time.Duration(v) * time.Minute) + case "HOUR": + if !validAddTime(v*float64(time.Hour), nano) { + return tb, true, nil + } + tb = t.Add(time.Duration(v) * time.Hour) + case "DAY": + if !validAddTime(v*24*float64(time.Hour), nano) { + return tb, true, nil + } + tb = t.AddDate(0, 0, int(v)) + case "WEEK": + if !validAddTime(v*24*7*float64(time.Hour), nano) { + return tb, true, nil + } + tb = t.AddDate(0, 0, 7*int(v)) + case "MONTH": + if !validAddMonth(v, t.Year(), int(t.Month())) { + return tb, true, nil + } + tb = t.AddDate(0, int(v), 0) + case "QUARTER": + if !validAddMonth(v*3, t.Year(), int(t.Month())) { + return tb, true, nil + } + tb = t.AddDate(0, 3*int(v), 0) + case "YEAR": + if !validAddMonth(v*12, t.Year(), int(t.Month())) { + return tb, true, nil + } + tb = t.AddDate(int(v), 0, 0) + default: + return tb, false, types.ErrWrongValue.GenWithStackByArgs(types.TimeStr, unit) + } + return tb, false, nil +} + // evalString evals a builtinTimestampAddSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timestampadd func (b *builtinTimestampAddSig) evalString(row chunk.Row) (string, bool, error) { @@ -6127,7 +6203,7 @@ func (b *builtinTimestampAddSig) evalString(row chunk.Row) (string, bool, error) if isNull || err != nil { return "", isNull, err } - v, isNull, err := b.args[1].EvalInt(b.ctx, row) + v, isNull, err := b.args[1].EvalReal(b.ctx, row) if isNull || err != nil { return "", isNull, err } @@ -6140,30 +6216,17 @@ func (b *builtinTimestampAddSig) evalString(row chunk.Row) (string, bool, error) b.ctx.GetSessionVars().StmtCtx.AppendWarning(err) return "", true, nil } - var tb time.Time + tb, overflow, err := addUnitToTime(unit, tm1, v) + if err != nil { + return "", true, err + } + if overflow { + return "", true, handleInvalidTimeError(b.ctx, types.ErrDatetimeFunctionOverflow.GenWithStackByArgs("datetime")) + } fsp := types.DefaultFsp - switch unit { - case "MICROSECOND": - tb = tm1.Add(time.Duration(v) * time.Microsecond) + // use MaxFsp when microsecond is not zero + if tb.Nanosecond()/1000 != 0 { fsp = types.MaxFsp - case "SECOND": - tb = tm1.Add(time.Duration(v) * time.Second) - case "MINUTE": - tb = tm1.Add(time.Duration(v) * time.Minute) - case "HOUR": - tb = tm1.Add(time.Duration(v) * time.Hour) - case "DAY": - tb = tm1.AddDate(0, 0, int(v)) - case "WEEK": - tb = tm1.AddDate(0, 0, 7*int(v)) - case "MONTH": - tb = tm1.AddDate(0, int(v), 0) - case "QUARTER": - tb = tm1.AddDate(0, 3*int(v), 0) - case "YEAR": - tb = tm1.AddDate(int(v), 0, 0) - default: - return "", true, types.ErrWrongValue.GenWithStackByArgs(types.TimeStr, unit) } r := types.NewTime(types.FromGoTime(tb), b.resolveType(arg.Type(), unit), fsp) if err = r.Check(b.ctx.GetSessionVars().StmtCtx); err != nil { diff --git a/expression/builtin_time_test.go b/expression/builtin_time_test.go index 55973f9dab5f8..2010bf0a225b5 100644 --- a/expression/builtin_time_test.go +++ b/expression/builtin_time_test.go @@ -2506,7 +2506,7 @@ func TestTimestampAdd(t *testing.T) { ctx := createContext(t) tests := []struct { unit string - interval int64 + interval float64 date interface{} expect string }{ @@ -2514,11 +2514,22 @@ func TestTimestampAdd(t *testing.T) { {"WEEK", 1, "2003-01-02 23:59:59", "2003-01-09 23:59:59"}, {"MICROSECOND", 1, 950501, "1995-05-01 00:00:00.000001"}, {"DAY", 28768, 0, ""}, + {"QUARTER", 3, "1995-05-01", "1996-02-01 00:00:00"}, + {"SECOND", 1.1, "1995-05-01", "1995-05-01 00:00:01.100000"}, + {"SECOND", -1, "1995-05-01", "1995-04-30 23:59:59"}, + {"SECOND", -1.1, "1995-05-01", "1995-04-30 23:59:58.900000"}, + {"SECOND", 9.9999e-6, "1995-05-01", "1995-05-01 00:00:00.000009"}, + {"SECOND", 9.9999e-7, "1995-05-01", "1995-05-01 00:00:00"}, + {"SECOND", -9.9999e-6, "1995-05-01", "1995-04-30 23:59:59.999991"}, + {"SECOND", -9.9999e-7, "1995-05-01", "1995-05-01 00:00:00"}, + {"MINUTE", 1.5, "1995-05-01 00:00:00", "1995-05-01 00:02:00"}, + {"MINUTE", 1.5, "1995-05-01 00:00:00.000000", "1995-05-01 00:02:00"}, + {"MICROSECOND", -100, "1995-05-01 00:00:00.0001", "1995-05-01 00:00:00"}, } fc := funcs[ast.TimestampAdd] for _, test := range tests { - dat := []types.Datum{types.NewStringDatum(test.unit), types.NewIntDatum(test.interval), types.NewDatum(test.date)} + dat := []types.Datum{types.NewStringDatum(test.unit), types.NewFloat64Datum(test.interval), types.NewDatum(test.date)} f, err := fc.getFunction(ctx, datumsToConstants(dat)) require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) diff --git a/expression/builtin_time_vec.go b/expression/builtin_time_vec.go index 0d6b4321095f5..34f3fb87f14c0 100644 --- a/expression/builtin_time_vec.go +++ b/expression/builtin_time_vec.go @@ -1133,7 +1133,6 @@ func (b *builtinStrToDateDurationSig) vecEvalDuration(input *chunk.Chunk, result result.MergeNulls(bufStrings, bufFormats) d64s := result.GoDurations() sc := b.ctx.GetSessionVars().StmtCtx - hasNoZeroDateMode := b.ctx.GetSessionVars().SQLMode.HasNoZeroDateMode() for i := 0; i < n; i++ { if result.IsNull(i) { continue @@ -1147,13 +1146,6 @@ func (b *builtinStrToDateDurationSig) vecEvalDuration(input *chunk.Chunk, result result.SetNull(i, true) continue } - if hasNoZeroDateMode && (t.Year() == 0 || t.Month() == 0 || t.Day() == 0) { - if err := handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, t.String())); err != nil { - return err - } - result.SetNull(i, true) - continue - } t.SetFsp(b.tp.GetDecimal()) dur, err := t.ConvertToDuration() if err != nil { @@ -1703,7 +1695,7 @@ func (b *builtinTimestampAddSig) vecEvalString(input *chunk.Chunk, result *chunk return err } defer b.bufAllocator.put(buf1) - if err := b.args[1].VecEvalInt(b.ctx, input, buf1); err != nil { + if err := b.args[1].VecEvalReal(b.ctx, input, buf1); err != nil { return err } @@ -1717,7 +1709,7 @@ func (b *builtinTimestampAddSig) vecEvalString(input *chunk.Chunk, result *chunk } result.ReserveString(n) - nums := buf1.Int64s() + nums := buf1.Float64s() ds := buf2.Times() for i := 0; i < n; i++ { if buf.IsNull(i) || buf1.IsNull(i) || buf2.IsNull(i) { @@ -1735,30 +1727,21 @@ func (b *builtinTimestampAddSig) vecEvalString(input *chunk.Chunk, result *chunk result.AppendNull() continue } - var tb time.Time + tb, overflow, err := addUnitToTime(unit, tm1, v) + if err != nil { + return err + } + if overflow { + if err = handleInvalidTimeError(b.ctx, types.ErrDatetimeFunctionOverflow.GenWithStackByArgs("datetime")); err != nil { + return err + } + result.AppendNull() + continue + } fsp := types.DefaultFsp - switch unit { - case "MICROSECOND": - tb = tm1.Add(time.Duration(v) * time.Microsecond) + // use MaxFsp when microsecond is not zero + if tb.Nanosecond()/1000 != 0 { fsp = types.MaxFsp - case "SECOND": - tb = tm1.Add(time.Duration(v) * time.Second) - case "MINUTE": - tb = tm1.Add(time.Duration(v) * time.Minute) - case "HOUR": - tb = tm1.Add(time.Duration(v) * time.Hour) - case "DAY": - tb = tm1.AddDate(0, 0, int(v)) - case "WEEK": - tb = tm1.AddDate(0, 0, 7*int(v)) - case "MONTH": - tb = tm1.AddDate(0, int(v), 0) - case "QUARTER": - tb = tm1.AddDate(0, 3*int(v), 0) - case "YEAR": - tb = tm1.AddDate(int(v), 0, 0) - default: - return types.ErrWrongValue.GenWithStackByArgs(types.TimeStr, unit) } r := types.NewTime(types.FromGoTime(tb), b.resolveType(arg.Type(), unit), fsp) if err = r.Check(b.ctx.GetSessionVars().StmtCtx); err != nil { @@ -2677,7 +2660,7 @@ func (b *builtinTimestamp1ArgSig) vecEvalTime(input *chunk.Chunk, result *chunk. if b.isFloat { tm, err = types.ParseTimeFromFloatString(sc, s, mysql.TypeDatetime, types.GetFsp(s)) } else { - tm, err = types.ParseTime(sc, s, mysql.TypeDatetime, types.GetFsp(s)) + tm, err = types.ParseTime(sc, s, mysql.TypeDatetime, types.GetFsp(s), nil) } if err != nil { if err = handleInvalidTimeError(b.ctx, err); err != nil { @@ -2730,7 +2713,7 @@ func (b *builtinTimestamp2ArgsSig) vecEvalTime(input *chunk.Chunk, result *chunk if b.isFloat { tm, err = types.ParseTimeFromFloatString(sc, arg0, mysql.TypeDatetime, types.GetFsp(arg0)) } else { - tm, err = types.ParseTime(sc, arg0, mysql.TypeDatetime, types.GetFsp(arg0)) + tm, err = types.ParseTime(sc, arg0, mysql.TypeDatetime, types.GetFsp(arg0), nil) } if err != nil { if err = handleInvalidTimeError(b.ctx, err); err != nil { diff --git a/expression/collation.go b/expression/collation.go index eebab0aa5bc1f..8b11d3198a40e 100644 --- a/expression/collation.go +++ b/expression/collation.go @@ -299,14 +299,6 @@ func deriveCollation(ctx sessionctx.Context, funcName string, args []Expression, return ec, nil } -// DeriveCollationFromExprs derives collation information from these expressions. -// Deprecated, use CheckAndDeriveCollationFromExprs instead. -// TODO: remove this function after the all usage is replaced by CheckAndDeriveCollationFromExprs -func DeriveCollationFromExprs(ctx sessionctx.Context, exprs ...Expression) (dstCharset, dstCollation string) { - collation := inferCollation(exprs...) - return collation.Charset, collation.Collation -} - // CheckAndDeriveCollationFromExprs derives collation information from these expressions, return error if derives collation error. func CheckAndDeriveCollationFromExprs(ctx sessionctx.Context, funcName string, evalType types.EvalType, args ...Expression) (et *ExprCollation, err error) { ec := inferCollation(args...) diff --git a/expression/constant_fold.go b/expression/constant_fold.go index f43cb75a1ff3c..0d73757b3161b 100644 --- a/expression/constant_fold.go +++ b/expression/constant_fold.go @@ -178,7 +178,12 @@ func foldConstant(expr Expression) (Expression, bool) { } } if !allConstArg { - if !hasNullArg || !sc.InNullRejectCheck || x.FuncName.L == ast.NullEQ { + // try to optimize on the situation when not all arguments are const + // for most functions, if one of the arguments are NULL, the result can be a constant (NULL or something else) + // + // NullEQ and ConcatWS are excluded, because they could have different value when the non-constant value is + // 1 or NULL. For example, concat_ws(NULL, NULL) gives NULL, but concat_ws(1, NULL) gives '' + if !hasNullArg || !sc.InNullRejectCheck || x.FuncName.L == ast.NullEQ || x.FuncName.L == ast.ConcatWS { return expr, isDeferredConst } constArgs := make([]Expression, len(args)) diff --git a/expression/constant_test.go b/expression/constant_test.go index 82c3d8e489fdf..2c2e226eabb5c 100644 --- a/expression/constant_test.go +++ b/expression/constant_test.go @@ -217,6 +217,15 @@ func TestConstantFolding(t *testing.T) { condition: newFunction(ast.LT, newColumn(0), newFunction(ast.Plus, newColumn(1), newFunction(ast.Plus, newLonglong(2), newLonglong(1)))), result: "lt(Column#0, plus(Column#1, 3))", }, + { + condition: func() Expression { + expr := newFunction(ast.ConcatWS, newColumn(0), NewNull()) + function := expr.(*ScalarFunction) + function.GetCtx().GetSessionVars().StmtCtx.InNullRejectCheck = true + return function + }(), + result: "concat_ws(cast(Column#0, var_string(20)), )", + }, } for _, tt := range tests { newConds := FoldConstant(tt.condition) diff --git a/expression/errors.go b/expression/errors.go index 0db38645f78d4..536ef065d7664 100644 --- a/expression/errors.go +++ b/expression/errors.go @@ -37,6 +37,10 @@ var ( ErrInvalidTableSample = dbterror.ClassExpression.NewStd(mysql.ErrInvalidTableSample) ErrInternal = dbterror.ClassOptimizer.NewStd(mysql.ErrInternal) ErrNoDB = dbterror.ClassOptimizer.NewStd(mysql.ErrNoDB) + ErrNotSupportedYet = dbterror.ClassExpression.NewStd(mysql.ErrNotSupportedYet) + ErrInvalidJSONForFuncIndex = dbterror.ClassExpression.NewStd(mysql.ErrInvalidJSONValueForFuncIndex) + ErrDataOutOfRangeFuncIndex = dbterror.ClassExpression.NewStd(mysql.ErrDataOutOfRangeFunctionalIndex) + ErrFuncIndexDataIsTooLong = dbterror.ClassExpression.NewStd(mysql.ErrFunctionalIndexDataIsTooLong) // All the un-exported errors are defined here: errFunctionNotExists = dbterror.ClassExpression.NewStd(mysql.ErrSpDoesNotExist) @@ -56,6 +60,7 @@ var ( errSpecificAccessDenied = dbterror.ClassExpression.NewStd(mysql.ErrSpecificAccessDenied) errUserLockDeadlock = dbterror.ClassExpression.NewStd(mysql.ErrUserLockDeadlock) errUserLockWrongName = dbterror.ClassExpression.NewStd(mysql.ErrUserLockWrongName) + errJSONInBooleanContext = dbterror.ClassExpression.NewStd(mysql.ErrJSONInBooleanContext) // Sequence usage privilege check. errSequenceAccessDenied = dbterror.ClassExpression.NewStd(mysql.ErrTableaccessDenied) diff --git a/expression/expr_to_pb_test.go b/expression/expr_to_pb_test.go index 802d559eb3c80..6756601be0e04 100644 --- a/expression/expr_to_pb_test.go +++ b/expression/expr_to_pb_test.go @@ -528,6 +528,18 @@ func TestExprPushDownToFlash(t *testing.T) { require.NoError(t, err) exprs = append(exprs, function) + // json_extract + function, err = NewFunction(mock.NewContext(), ast.JSONExtract, types.NewFieldType(mysql.TypeJSON), jsonColumn, stringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + + // json_unquote argument is cast(json as string) + subFunc, subErr := NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeString), jsonColumn) + require.NoError(t, subErr) + function, err = NewFunction(mock.NewContext(), ast.JSONUnquote, types.NewFieldType(mysql.TypeString), subFunc) + require.NoError(t, err) + exprs = append(exprs, function) + // lpad function, err = NewFunction(mock.NewContext(), ast.Lpad, types.NewFieldType(mysql.TypeString), stringColumn, int32Column, stringColumn) require.NoError(t, err) @@ -558,6 +570,14 @@ func TestExprPushDownToFlash(t *testing.T) { require.NoError(t, err) exprs = append(exprs, function) + // ExtractDuration + extractDurationUnitCol := new(Constant) + extractDurationUnitCol.Value = types.NewStringDatum("microsecond") + extractDurationUnitCol.RetType = types.NewFieldType(mysql.TypeString) + function, err = NewFunction(mock.NewContext(), ast.Extract, types.NewFieldType(mysql.TypeLonglong), extractDurationUnitCol, durationColumn) + require.NoError(t, err) + exprs = append(exprs, function) + // CastIntAsInt function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeLonglong), intColumn) require.NoError(t, err) @@ -631,6 +651,11 @@ func TestExprPushDownToFlash(t *testing.T) { require.NoError(t, err) exprs = append(exprs, function) + // CastJsonAsString + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeString), jsonColumn) + require.NoError(t, err) + exprs = append(exprs, function) + // CastIntAsTime function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeDatetime), intColumn) require.NoError(t, err) @@ -950,6 +975,11 @@ func TestExprPushDownToFlash(t *testing.T) { exprs = exprs[:0] + // json_unquote's argument is not cast(json as string) + function, err = NewFunction(mock.NewContext(), ast.JSONUnquote, types.NewFieldType(mysql.TypeString), stringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + // Substring2Args: can not be pushed function, err = NewFunction(mock.NewContext(), ast.Substr, types.NewFieldType(mysql.TypeString), binaryStringColumn, intColumn) require.NoError(t, err) @@ -1065,6 +1095,26 @@ func TestExprPushDownToFlash(t *testing.T) { require.NoError(t, err) exprs = append(exprs, function) + // regexp_like: supported + function, err = NewFunction(mock.NewContext(), ast.RegexpLike, types.NewFieldType(mysql.TypeLonglong), binaryStringColumn, binaryStringColumn, binaryStringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + + // regexp_instr: supported + function, err = NewFunction(mock.NewContext(), ast.RegexpInStr, types.NewFieldType(mysql.TypeLonglong), stringColumn, stringColumn, intColumn, intColumn, intColumn, stringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + + // regexp_substr: supported + function, err = NewFunction(mock.NewContext(), ast.RegexpSubstr, types.NewFieldType(mysql.TypeString), stringColumn, stringColumn, intColumn, intColumn, stringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + + // regexp_replace: supported + function, err = NewFunction(mock.NewContext(), ast.RegexpReplace, types.NewFieldType(mysql.TypeString), stringColumn, stringColumn, stringColumn, intColumn, intColumn, stringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + // greatest function, err = NewFunction(mock.NewContext(), ast.Greatest, types.NewFieldType(mysql.TypeLonglong), int32Column, intColumn) require.NoError(t, err) @@ -1074,6 +1124,10 @@ func TestExprPushDownToFlash(t *testing.T) { require.NoError(t, err) exprs = append(exprs, function) + function, err = NewFunction(mock.NewContext(), ast.Greatest, types.NewFieldType(mysql.TypeString), stringColumn, stringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + // least function, err = NewFunction(mock.NewContext(), ast.Least, types.NewFieldType(mysql.TypeLonglong), int32Column, intColumn) require.NoError(t, err) @@ -1082,6 +1136,11 @@ func TestExprPushDownToFlash(t *testing.T) { function, err = NewFunction(mock.NewContext(), ast.Least, types.NewFieldType(mysql.TypeDouble), float32Column, intColumn) require.NoError(t, err) exprs = append(exprs, function) + + function, err = NewFunction(mock.NewContext(), ast.Least, types.NewFieldType(mysql.TypeString), stringColumn, stringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + // is true function, err = NewFunction(mock.NewContext(), ast.IsTruthWithoutNull, types.NewFieldType(mysql.TypeLonglong), int32Column) require.NoError(t, err) @@ -1194,6 +1253,11 @@ func TestExprPushDownToFlash(t *testing.T) { require.Equal(t, tipb.ScalarFuncSig_CastTimeAsDuration, function.(*ScalarFunction).Function.PbCode()) exprs = append(exprs, function) + // Unhex + function, err = NewFunction(mock.NewContext(), ast.Unhex, types.NewFieldType(mysql.TypeString), stringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + pushed, remained = PushDownExprs(sc, exprs, client, kv.TiFlash) require.Len(t, pushed, len(exprs)) require.Len(t, remained, 0) diff --git a/expression/expression.go b/expression/expression.go index fefa1c403c959..e3ab332f8a00b 100644 --- a/expression/expression.go +++ b/expression/expression.go @@ -59,7 +59,7 @@ var EvalAstExpr func(sctx sessionctx.Context, expr ast.ExprNode) (types.Datum, e // RewriteAstExpr rewrites ast expression directly. // Note: initialized in planner/core // import expression and planner/core together to use EvalAstExpr -var RewriteAstExpr func(sctx sessionctx.Context, expr ast.ExprNode, schema *Schema, names types.NameSlice) (Expression, error) +var RewriteAstExpr func(sctx sessionctx.Context, expr ast.ExprNode, schema *Schema, names types.NameSlice, allowCastArray bool) (Expression, error) // VecExpr contains all vectorized evaluation methods. type VecExpr interface { @@ -816,7 +816,7 @@ func SplitDNFItems(onExpr Expression) []Expression { // If the Expression is a non-constant value, it means the result is unknown. func EvaluateExprWithNull(ctx sessionctx.Context, schema *Schema, expr Expression) Expression { if MaybeOverOptimized4PlanCache(ctx, []Expression{expr}) { - return expr + ctx.GetSessionVars().StmtCtx.SetSkipPlanCache(errors.New("skip plan-cache: %v affects null check")) } if ctx.GetSessionVars().StmtCtx.InNullRejectCheck { expr, _ = evaluateExprWithNullInNullRejectCheck(ctx, schema, expr) @@ -998,7 +998,7 @@ func ColumnInfos2ColumnsAndNames(ctx sessionctx.Context, dbName, tblName model.C if err != nil { return nil, nil, errors.Trace(err) } - e, err := RewriteAstExpr(ctx, expr, mockSchema, names) + e, err := RewriteAstExpr(ctx, expr, mockSchema, names, true) if err != nil { return nil, nil, errors.Trace(err) } @@ -1071,8 +1071,7 @@ func scalarExprSupportedByTiKV(sf *ScalarFunction) bool { // json functions. ast.JSONType, ast.JSONExtract, ast.JSONObject, ast.JSONArray, ast.JSONMerge, ast.JSONSet, ast.JSONInsert /*ast.JSONReplace,*/, ast.JSONRemove, ast.JSONLength, - // FIXME: JSONUnquote is incompatible with Coprocessor - ast.JSONUnquote, ast.JSONContains, + ast.JSONUnquote, ast.JSONContains, ast.JSONValid, // date functions. ast.Date, ast.Week /* ast.YearWeek, ast.ToSeconds */, ast.DateDiff, @@ -1151,10 +1150,10 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { ast.Sqrt, ast.Log, ast.Log2, ast.Log10, ast.Ln, ast.Exp, ast.Pow, ast.Sign, ast.Radians, ast.Degrees, ast.Conv, ast.CRC32, - ast.JSONLength, ast.Repeat, + ast.JSONLength, ast.JSONExtract, ast.JSONUnquote, ast.Repeat, ast.InetNtoa, ast.InetAton, ast.Inet6Ntoa, ast.Inet6Aton, ast.Coalesce, ast.ASCII, ast.Length, ast.Trim, ast.Position, ast.Format, ast.Elt, - ast.LTrim, ast.RTrim, ast.Lpad, ast.Rpad, ast.Regexp, + ast.LTrim, ast.RTrim, ast.Lpad, ast.Rpad, ast.Hour, ast.Minute, ast.Second, ast.MicroSecond, ast.TimeToSec: switch function.Function.PbCode() { @@ -1164,6 +1163,18 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { tipb.ScalarFuncSig_IfDuration, tipb.ScalarFuncSig_CaseWhenDuration: return false + case tipb.ScalarFuncSig_JsonUnquoteSig: + // TiFlash json_unquote now only supports json string generated by cast(json as string) + if childFunc, ok := function.GetArgs()[0].(*ScalarFunction); ok { + return childFunc.Function.PbCode() == tipb.ScalarFuncSig_CastJsonAsString + } + return false + } + return true + case ast.Regexp, ast.RegexpLike, ast.RegexpInStr, ast.RegexpSubstr, ast.RegexpReplace: + funcCharset, funcCollation := function.Function.CharsetAndCollation() + if funcCharset == charset.CharsetBin && funcCollation == charset.CollationBin { + return false } return true case ast.Substr, ast.Substring, ast.Left, ast.Right, ast.CharLength, ast.SubstringIndex, ast.Reverse: @@ -1195,7 +1206,7 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { tipb.ScalarFuncSig_CastStringAsDecimal /*, tipb.ScalarFuncSig_CastDurationAsDecimal, tipb.ScalarFuncSig_CastJsonAsDecimal*/ : return function.RetType.IsDecimalValid() case tipb.ScalarFuncSig_CastDecimalAsString, tipb.ScalarFuncSig_CastIntAsString, tipb.ScalarFuncSig_CastRealAsString, tipb.ScalarFuncSig_CastTimeAsString, - tipb.ScalarFuncSig_CastStringAsString /*, tipb.ScalarFuncSig_CastDurationAsString, tipb.ScalarFuncSig_CastJsonAsString*/ : + tipb.ScalarFuncSig_CastStringAsString, tipb.ScalarFuncSig_CastJsonAsString /*, tipb.ScalarFuncSig_CastDurationAsString*/ : return true case tipb.ScalarFuncSig_CastDecimalAsTime, tipb.ScalarFuncSig_CastIntAsTime, tipb.ScalarFuncSig_CastRealAsTime, tipb.ScalarFuncSig_CastTimeAsTime, tipb.ScalarFuncSig_CastStringAsTime /*, tipb.ScalarFuncSig_CastDurationAsTime, tipb.ScalarFuncSig_CastJsonAsTime*/ : @@ -1227,7 +1238,7 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { } case ast.Extract: switch function.Function.PbCode() { - case tipb.ScalarFuncSig_ExtractDatetime: + case tipb.ScalarFuncSig_ExtractDatetime, tipb.ScalarFuncSig_ExtractDuration: return true } case ast.Replace: @@ -1251,12 +1262,12 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { case ast.Least, ast.Greatest: switch function.Function.PbCode() { case tipb.ScalarFuncSig_GreatestInt, tipb.ScalarFuncSig_GreatestReal, - tipb.ScalarFuncSig_LeastInt, tipb.ScalarFuncSig_LeastReal: + tipb.ScalarFuncSig_LeastInt, tipb.ScalarFuncSig_LeastReal, tipb.ScalarFuncSig_LeastString, tipb.ScalarFuncSig_GreatestString: return true } case ast.IsTruthWithNull, ast.IsTruthWithoutNull, ast.IsFalsity: return true - case ast.Hex, ast.Bin: + case ast.Hex, ast.Unhex, ast.Bin: return true case ast.GetFormat: return true @@ -1347,12 +1358,15 @@ func canScalarFuncPushDown(scalarFunc *ScalarFunction, pc PbConverter, storeType panic(errors.Errorf("unspecified PbCode: %T", scalarFunc.Function)) }) } + storageName := storeType.Name() + if storeType == kv.UnSpecified { + storageName = "storage layer" + } + warnErr := errors.New("Scalar function '" + scalarFunc.FuncName.L + "'(signature: " + scalarFunc.Function.PbCode().String() + ", return type: " + scalarFunc.RetType.CompactStr() + ") is not supported to push down to " + storageName + " now.") if pc.sc.InExplainStmt { - storageName := storeType.Name() - if storeType == kv.UnSpecified { - storageName = "storage layer" - } - pc.sc.AppendWarning(errors.New("Scalar function '" + scalarFunc.FuncName.L + "'(signature: " + scalarFunc.Function.PbCode().String() + ", return type: " + scalarFunc.RetType.CompactStr() + ") is not supported to push down to " + storageName + " now.")) + pc.sc.AppendWarning(warnErr) + } else { + pc.sc.AppendExtraWarning(warnErr) } return false } @@ -1382,14 +1396,20 @@ func canExprPushDown(expr Expression, pc PbConverter, storeType kv.StoreType, ca if expr.GetType().GetType() == mysql.TypeEnum && canEnumPush { break } + warnErr := errors.New("Expression about '" + expr.String() + "' can not be pushed to TiFlash because it contains unsupported calculation of type '" + types.TypeStr(expr.GetType().GetType()) + "'.") if pc.sc.InExplainStmt { - pc.sc.AppendWarning(errors.New("Expression about '" + expr.String() + "' can not be pushed to TiFlash because it contains unsupported calculation of type '" + types.TypeStr(expr.GetType().GetType()) + "'.")) + pc.sc.AppendWarning(warnErr) + } else { + pc.sc.AppendExtraWarning(warnErr) } return false case mysql.TypeNewDecimal: if !expr.GetType().IsDecimalValid() { + warnErr := errors.New("Expression about '" + expr.String() + "' can not be pushed to TiFlash because it contains invalid decimal('" + strconv.Itoa(expr.GetType().GetFlen()) + "','" + strconv.Itoa(expr.GetType().GetDecimal()) + "').") if pc.sc.InExplainStmt { - pc.sc.AppendWarning(errors.New("Expression about '" + expr.String() + "' can not be pushed to TiFlash because it contains invalid decimal('" + strconv.Itoa(expr.GetType().GetFlen()) + "','" + strconv.Itoa(expr.GetType().GetDecimal()) + "').")) + pc.sc.AppendWarning(warnErr) + } else { + pc.sc.AppendExtraWarning(warnErr) } return false } @@ -1554,6 +1574,10 @@ func Args2Expressions4Test(args ...interface{}) []Expression { ft = types.NewFieldType(mysql.TypeDouble) case types.KindString: ft = types.NewFieldType(mysql.TypeVarString) + case types.KindMysqlTime: + ft = types.NewFieldType(mysql.TypeTimestamp) + case types.KindBytes: + ft = types.NewFieldType(mysql.TypeBlob) default: exprs[i] = nil continue diff --git a/expression/expression_test.go b/expression/expression_test.go index 79ee1970ba800..4a24cb5eef759 100644 --- a/expression/expression_test.go +++ b/expression/expression_test.go @@ -75,8 +75,9 @@ func TestEvaluateExprWithNullAndParameters(t *testing.T) { ltWithParam, err := newFunctionForTest(ctx, ast.LT, col0, param) require.NoError(t, err) res = EvaluateExprWithNull(ctx, schema, ltWithParam) - _, isScalarFunc := res.(*ScalarFunction) - require.True(t, isScalarFunc) // the expression with parameters is not evaluated + _, isConst := res.(*Constant) + require.True(t, isConst) // this expression is evaluated and skip-plan cache flag is set. + require.True(t, !ctx.GetSessionVars().StmtCtx.UseCache) } func TestEvaluateExprWithNullNoChangeRetType(t *testing.T) { diff --git a/expression/function_traits.go b/expression/function_traits.go index aba61d9b2d92a..4d6fa98da6a99 100644 --- a/expression/function_traits.go +++ b/expression/function_traits.go @@ -19,8 +19,8 @@ import ( "github.com/pingcap/tidb/parser/opcode" ) -// GeneralPlanCacheableOp stores function which can be cached to general plan cache. -var GeneralPlanCacheableOp = map[string]struct{}{ +// NonPreparedPlanCacheableOp stores function which can be cached to non-prepared plan cache. +var NonPreparedPlanCacheableOp = map[string]struct{}{ ast.LogicAnd: {}, ast.LogicOr: {}, ast.GE: {}, diff --git a/expression/helper.go b/expression/helper.go index c9534be9493ff..f286ee644209a 100644 --- a/expression/helper.go +++ b/expression/helper.go @@ -74,7 +74,7 @@ func getTimeCurrentTimeStamp(ctx sessionctx.Context, tp byte, fsp int) (t types. return value, err } value.SetCoreTime(types.FromGoTime(defaultTime.Truncate(time.Duration(math.Pow10(9-fsp)) * time.Nanosecond))) - if tp == mysql.TypeTimestamp || tp == mysql.TypeDatetime { + if tp == mysql.TypeTimestamp || tp == mysql.TypeDatetime || tp == mysql.TypeDate { err = value.ConvertTimeZone(time.Local, ctx.GetSessionVars().Location()) if err != nil { return value, err @@ -84,22 +84,22 @@ func getTimeCurrentTimeStamp(ctx sessionctx.Context, tp byte, fsp int) (t types. } // GetTimeValue gets the time value with type tp. -func GetTimeValue(ctx sessionctx.Context, v interface{}, tp byte, fsp int) (d types.Datum, err error) { +func GetTimeValue(ctx sessionctx.Context, v interface{}, tp byte, fsp int, explicitTz *time.Location) (d types.Datum, err error) { var value types.Time sc := ctx.GetSessionVars().StmtCtx switch x := v.(type) { case string: - upperX := strings.ToUpper(x) - if upperX == strings.ToUpper(ast.CurrentTimestamp) { + lowerX := strings.ToLower(x) + if lowerX == ast.CurrentTimestamp || lowerX == ast.CurrentDate { if value, err = getTimeCurrentTimeStamp(ctx, tp, fsp); err != nil { return d, err } - } else if upperX == types.ZeroDatetimeStr { + } else if lowerX == types.ZeroDatetimeStr { value, err = types.ParseTimeFromNum(sc, 0, tp, fsp) terror.Log(err) } else { - value, err = types.ParseTime(sc, x, tp, fsp) + value, err = types.ParseTime(sc, x, tp, fsp, explicitTz) if err != nil { return d, err } @@ -107,7 +107,7 @@ func GetTimeValue(ctx sessionctx.Context, v interface{}, tp byte, fsp int) (d ty case *driver.ValueExpr: switch x.Kind() { case types.KindString: - value, err = types.ParseTime(sc, x.GetString(), tp, fsp) + value, err = types.ParseTime(sc, x.GetString(), tp, fsp, nil) if err != nil { return d, err } @@ -122,8 +122,8 @@ func GetTimeValue(ctx sessionctx.Context, v interface{}, tp byte, fsp int) (d ty return d, errDefaultValue } case *ast.FuncCallExpr: - if x.FnName.L == ast.CurrentTimestamp { - d.SetString(strings.ToUpper(ast.CurrentTimestamp), mysql.DefaultCollationName) + if x.FnName.L == ast.CurrentTimestamp || x.FnName.L == ast.CurrentDate { + d.SetString(strings.ToUpper(x.FnName.L), mysql.DefaultCollationName) return d, nil } return d, errDefaultValue diff --git a/expression/helper_test.go b/expression/helper_test.go index 3f58f115c998a..4c9a5e3eda3b5 100644 --- a/expression/helper_test.go +++ b/expression/helper_test.go @@ -32,7 +32,7 @@ import ( func TestGetTimeValue(t *testing.T) { ctx := mock.NewContext() - v, err := GetTimeValue(ctx, "2012-12-12 00:00:00", mysql.TypeTimestamp, types.MinFsp) + v, err := GetTimeValue(ctx, "2012-12-12 00:00:00", mysql.TypeTimestamp, types.MinFsp, nil) require.NoError(t, err) require.Equal(t, types.KindMysqlTime, v.Kind()) @@ -42,7 +42,7 @@ func TestGetTimeValue(t *testing.T) { sessionVars := ctx.GetSessionVars() err = sessionVars.SetSystemVar("timestamp", "0") require.NoError(t, err) - v, err = GetTimeValue(ctx, "2012-12-12 00:00:00", mysql.TypeTimestamp, types.MinFsp) + v, err = GetTimeValue(ctx, "2012-12-12 00:00:00", mysql.TypeTimestamp, types.MinFsp, nil) require.NoError(t, err) require.Equal(t, types.KindMysqlTime, v.Kind()) @@ -51,7 +51,7 @@ func TestGetTimeValue(t *testing.T) { err = sessionVars.SetSystemVar("timestamp", "0") require.NoError(t, err) - v, err = GetTimeValue(ctx, "2012-12-12 00:00:00", mysql.TypeTimestamp, types.MinFsp) + v, err = GetTimeValue(ctx, "2012-12-12 00:00:00", mysql.TypeTimestamp, types.MinFsp, nil) require.NoError(t, err) require.Equal(t, types.KindMysqlTime, v.Kind()) @@ -60,7 +60,7 @@ func TestGetTimeValue(t *testing.T) { err = sessionVars.SetSystemVar("timestamp", "") require.Error(t, err, "Incorrect argument type to variable 'timestamp'") - v, err = GetTimeValue(ctx, "2012-12-12 00:00:00", mysql.TypeTimestamp, types.MinFsp) + v, err = GetTimeValue(ctx, "2012-12-12 00:00:00", mysql.TypeTimestamp, types.MinFsp, nil) require.NoError(t, err) require.Equal(t, types.KindMysqlTime, v.Kind()) @@ -98,7 +98,7 @@ func TestGetTimeValue(t *testing.T) { for i, tbl := range tbls { comment := fmt.Sprintf("expr: %d", i) - v, err := GetTimeValue(ctx, tbl.Expr, mysql.TypeTimestamp, types.MinFsp) + v, err := GetTimeValue(ctx, tbl.Expr, mysql.TypeTimestamp, types.MinFsp, nil) require.NoError(t, err) switch v.Kind() { @@ -120,7 +120,7 @@ func TestGetTimeValue(t *testing.T) { } for _, tbl := range errTbl { - _, err := GetTimeValue(ctx, tbl.Expr, mysql.TypeTimestamp, types.MinFsp) + _, err := GetTimeValue(ctx, tbl.Expr, mysql.TypeTimestamp, types.MinFsp, nil) require.Error(t, err) } } @@ -163,7 +163,7 @@ func TestCurrentTimestampTimeZone(t *testing.T) { require.NoError(t, err) err = sessionVars.SetSystemVar("time_zone", "+00:00") require.NoError(t, err) - v, err := GetTimeValue(ctx, ast.CurrentTimestamp, mysql.TypeTimestamp, types.MinFsp) + v, err := GetTimeValue(ctx, ast.CurrentTimestamp, mysql.TypeTimestamp, types.MinFsp, nil) require.NoError(t, err) require.EqualValues(t, types.NewTime( types.FromDate(1970, 1, 1, 0, 20, 34, 0), @@ -174,7 +174,7 @@ func TestCurrentTimestampTimeZone(t *testing.T) { // would get different value. err = sessionVars.SetSystemVar("time_zone", "+08:00") require.NoError(t, err) - v, err = GetTimeValue(ctx, ast.CurrentTimestamp, mysql.TypeTimestamp, types.MinFsp) + v, err = GetTimeValue(ctx, ast.CurrentTimestamp, mysql.TypeTimestamp, types.MinFsp, nil) require.NoError(t, err) require.EqualValues(t, types.NewTime( types.FromDate(1970, 1, 1, 8, 20, 34, 0), diff --git a/expression/integration_serial_test.go b/expression/integration_serial_test.go index a497d9ef54600..c50aa687659a9 100644 --- a/expression/integration_serial_test.go +++ b/expression/integration_serial_test.go @@ -3762,15 +3762,6 @@ func TestSetVariables(t *testing.T) { _, err = tk.Exec("set @@global.max_prepared_stmt_count='';") require.Error(t, err) require.Error(t, err, variable.ErrWrongTypeForVar.GenWithStackByArgs("max_prepared_stmt_count").Error()) - - tk.MustExec("set @@global.tidb_enable_concurrent_ddl=1") - tk.MustQuery("select @@global.tidb_enable_concurrent_ddl").Check(testkit.Rows("1")) - require.True(t, variable.EnableConcurrentDDL.Load()) - tk.MustExec("set @@global.tidb_enable_concurrent_ddl=0") - tk.MustQuery("select @@global.tidb_enable_concurrent_ddl").Check(testkit.Rows("0")) - require.False(t, variable.EnableConcurrentDDL.Load()) - testkit.NewTestKit(t, store).MustQuery("select @@global.tidb_enable_concurrent_ddl").Check(testkit.Rows("0")) - tk.MustExec("set @@global.tidb_enable_concurrent_ddl=1") } func TestPreparePlanCache(t *testing.T) { @@ -3799,7 +3790,7 @@ func TestPreparePlanCacheOnCachedTable(t *testing.T) { var err error se, err := session.CreateSession4TestWithOpt(store, &session.Opt{ - PreparedPlanCache: plannercore.NewLRUPlanCache(100, 0.1, math.MaxUint64, plannercore.PickPlanFromBucket, tk.Session()), + PreparedPlanCache: plannercore.NewLRUPlanCache(100, 0.1, math.MaxUint64, tk.Session()), }) require.NoError(t, err) tk.SetSession(se) diff --git a/expression/integration_test.go b/expression/integration_test.go index d3b307fb9653b..bb8a0d622bf66 100644 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -968,6 +968,7 @@ func TestEncryptionBuiltin(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.Session().GetSessionVars().User = &auth.UserIdentity{Username: "root"} ctx := context.Background() // for password @@ -1143,6 +1144,25 @@ func TestEncryptionBuiltin(t *testing.T) { tk.MustQuery("SELECT RANDOM_BYTES(1024);") result = tk.MustQuery("SELECT RANDOM_BYTES(NULL);") result.Check(testkit.Rows("")) + + // for VALIDATE_PASSWORD_STRENGTH + tk.MustExec(fmt.Sprintf("SET GLOBAL validate_password.dictionary='%s'", "password")) + tk.MustExec("SET GLOBAL validate_password.enable = 1") + tk.MustQuery("SELECT validate_password_strength('root')").Check(testkit.Rows("0")) + tk.MustQuery("SELECT validate_password_strength('toor')").Check(testkit.Rows("0")) + tk.MustQuery("SELECT validate_password_strength('ROOT')").Check(testkit.Rows("25")) + tk.MustQuery("SELECT validate_password_strength('TOOR')").Check(testkit.Rows("25")) + tk.MustQuery("SELECT validate_password_strength('fooHoHo%1')").Check(testkit.Rows("100")) + tk.MustQuery("SELECT validate_password_strength('pass')").Check(testkit.Rows("25")) + tk.MustQuery("SELECT validate_password_strength('password')").Check(testkit.Rows("50")) + tk.MustQuery("SELECT validate_password_strength('password0000')").Check(testkit.Rows("50")) + tk.MustQuery("SELECT validate_password_strength('password1A#')").Check(testkit.Rows("75")) + tk.MustQuery("SELECT validate_password_strength('PA12wrd!#')").Check(testkit.Rows("100")) + tk.MustQuery("SELECT VALIDATE_PASSWORD_STRENGTH(REPEAT(\"aA1#\", 26))").Check(testkit.Rows("100")) + tk.MustQuery("SELECT validate_password_strength(null)").Check(testkit.Rows("")) + tk.MustQuery("SELECT validate_password_strength('null')").Check(testkit.Rows("25")) + tk.MustQuery("SELECT VALIDATE_PASSWORD_STRENGTH( 0x6E616E646F73617135234552 )").Check(testkit.Rows("100")) + tk.MustQuery("SELECT VALIDATE_PASSWORD_STRENGTH(CAST(0xd2 AS BINARY(10)))").Check(testkit.Rows("50")) } func TestOpBuiltin(t *testing.T) { @@ -1208,8 +1228,7 @@ func TestDatetimeOverflow(t *testing.T) { } for _, sql := range overflowSQLs { - _, err := tk.Exec(sql) - require.Error(t, err, "[types:1441]Datetime function: datetime field overflow") + tk.MustGetErrMsg(sql, "[types:1441]Datetime function: datetime field overflow") } tk.MustExec("set sql_mode=''") @@ -1696,8 +1715,7 @@ func TestArithmeticBuiltin(t *testing.T) { tk.MustQuery("select v from t;").Check(testkit.Rows("")) tk.MustQuery("select 0.000 % 0.11234500000000000000;").Check(testkit.Rows("0.00000000000000000000")) - _, err = tk.Exec("INSERT INTO t VALUE(12 MOD 0);") - require.True(t, terror.ErrorEqual(err, expression.ErrDivisionByZero)) + tk.MustGetDBError("INSERT INTO t VALUE(12 MOD 0);", expression.ErrDivisionByZero) tk.MustQuery("select sum(1.2e2) * 0.1").Check(testkit.Rows("12")) tk.MustExec("drop table if exists t") @@ -1940,8 +1958,7 @@ func TestCompareBuiltin(t *testing.T) { tk.MustQuery("select * from t").Check(testkit.Rows("1991-05-06 13:59:28")) // insert an nonexistent time tk.MustExec("set time_zone = 'America/Los_Angeles'") - _, err := tk.Exec("insert into t value('2011-03-13 02:00:00')") - require.Error(t, err) + tk.MustExecToErr("insert into t value('2011-03-13 02:00:00')") // reset timezone to a +8 offset tk.MustExec("set time_zone = '+08:00'") tk.MustQuery("select * from t").Check(testkit.Rows("1991-05-06 12:59:28")) @@ -2105,11 +2122,9 @@ func TestAggregationBuiltinGroupConcat(t *testing.T) { result.Check(testkit.Rows("hello,h")) tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", "Warning 1260 Some rows were cut by GROUPCONCAT(test.t.a)")) - _, err := tk.Exec("insert into d select group_concat(a) from t") - require.Equal(t, errors.ErrCode(mysql.ErrCutValueGroupConcat), errors.Cause(err).(*terror.Error).Code()) + tk.MustGetErrCode("insert into d select group_concat(a) from t", mysql.ErrCutValueGroupConcat) - _, err = tk.Exec("set sql_mode=''") - require.NoError(t, err) + tk.MustExec("set sql_mode=''") tk.MustExec("insert into d select group_concat(a) from t") tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", "Warning 1260 Some rows were cut by GROUPCONCAT(test.t.a)")) tk.MustQuery("select * from d").Check(testkit.Rows("hello,h")) @@ -2193,6 +2208,22 @@ func TestAggregationBuiltinJSONObjectAgg(t *testing.T) { result.Check(testkit.Rows(`{"first": "json_objectagg_test"}`)) result = tk.MustQuery("select json_objectagg(a, null) from t group by a order by a;") result.Check(testkit.Rows(`{"1": null}`)) + + // For issue: https://github.com/pingcap/tidb/issues/39806 + // Optimization shouldn't rewrite the flag of `castStringAsJson`. + tk.MustQuery(` + select a from ( + select JSON_OBJECT('number', number, 'name', name) 'a' from + ( + select 1 as number, 'name-1' as name union + (select 2, 'name-2' ) union + (select 3, 'name-3' ) union + (select 4, 'name-4' ) union + (select 5, 'name-5' ) union + (select 6, 'name-2' ) + ) temp1 + ) temp + where a ->> '$.number' = 1`).Check(testkit.Rows(`{"name": "name-1", "number": 1}`)) } func TestOtherBuiltin(t *testing.T) { @@ -2354,23 +2385,18 @@ func TestDateBuiltin(t *testing.T) { r = tk.MustQuery("select date'731124', date '011124'") r.Check(testkit.Rows("1973-11-24 2001-11-24")) - _, err = tk.Exec("select date '0000-00-00 00:00:00';") + err = tk.ExecToErr("select date '0000-00-00 00:00:00';") require.Error(t, err) require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateStr, "0000-00-00 00:00:00"))) - _, err = tk.Exec("select date '2017-99-99';") - require.Error(t, err) - require.True(t, terror.ErrorEqual(err, types.ErrWrongValue), "err: %v", err) - - _, err = tk.Exec("select date '2017-2-31';") - require.Error(t, err) - require.True(t, terror.ErrorEqual(err, types.ErrWrongValue), "err: %v", err) + tk.MustGetDBError("select date '2017-99-99';", types.ErrWrongValue) + tk.MustGetDBError("select date '2017-2-31';", types.ErrWrongValue) - _, err = tk.Exec("select date '201712-31';") + err = tk.ExecToErr("select date '201712-31';") require.Error(t, err) require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateStr, "201712-31")), "err: %v", err) - _, err = tk.Exec("select date 'abcdefg';") + err = tk.ExecToErr("select date 'abcdefg';") require.Error(t, err) require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateStr, "abcdefg")), "err: %v", err) } @@ -2382,8 +2408,7 @@ func TestJSONBuiltin(t *testing.T) { tk.MustExec("USE test;") tk.MustExec("DROP TABLE IF EXISTS t;") tk.MustExec("CREATE TABLE `my_collection` ( `doc` json DEFAULT NULL, `_id` varchar(32) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc,'$._id'))) STORED NOT NULL, PRIMARY KEY (`_id`))") - _, err := tk.Exec("UPDATE `test`.`my_collection` SET doc=JSON_SET(doc) WHERE (JSON_EXTRACT(doc,'$.name') = 'clare');") - require.Error(t, err) + tk.MustExecToErr("UPDATE `test`.`my_collection` SET doc=JSON_SET(doc) WHERE (JSON_EXTRACT(doc,'$.name') = 'clare');") r := tk.MustQuery("select json_valid(null);") r.Check(testkit.Rows("")) @@ -2459,20 +2484,19 @@ func TestTimeLiteral(t *testing.T) { r = tk.MustQuery("select time '20 20:20';") r.Check(testkit.Rows("500:20:00")) - _, err := tk.Exec("select time '2017-01-01 00:00:00';") + err := tk.ExecToErr("select time '2017-01-01 00:00:00';") require.Error(t, err) require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.TimeStr, "2017-01-01 00:00:00"))) - _, err = tk.Exec("select time '071231235959.999999';") + err = tk.ExecToErr("select time '071231235959.999999';") require.Error(t, err) require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.TimeStr, "071231235959.999999"))) - _, err = tk.Exec("select time '20171231235959.999999';") + err = tk.ExecToErr("select time '20171231235959.999999';") require.Error(t, err) require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.TimeStr, "20171231235959.999999"))) - _, err = tk.Exec("select ADDDATE('2008-01-34', -1);") - require.NoError(t, err) + tk.MustExec("select ADDDATE('2008-01-34', -1);") tk.MustQuery("Show warnings;").Check(testkit.RowsWithSep("|", "Warning|1292|Incorrect datetime value: '2008-01-34'")) } @@ -2502,15 +2526,15 @@ func TestTimestampLiteral(t *testing.T) { r = tk.MustQuery("select timestamp '2017@01@0001 00~00~00.333';") r.Check(testkit.Rows("2017-01-01 00:00:00.333")) - _, err := tk.Exec("select timestamp '00:00:00';") + err := tk.ExecToErr("select timestamp '00:00:00';") require.Error(t, err) require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, "00:00:00"))) - _, err = tk.Exec("select timestamp '1992-01-03';") + err = tk.ExecToErr("select timestamp '1992-01-03';") require.Error(t, err) require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, "1992-01-03"))) - _, err = tk.Exec("select timestamp '20171231235959.999999';") + err = tk.ExecToErr("select timestamp '20171231235959.999999';") require.Error(t, err) require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, "20171231235959.999999"))) } @@ -2701,12 +2725,36 @@ func TestFuncJSON(t *testing.T) { // #16267 tk.MustQuery(`select json_array(922337203685477580) = json_array(922337203685477581);`).Check(testkit.Rows("0")) + tk.MustQuery("select json_overlaps('[[1,2], 3]', '[1, 3]');").Check(testkit.Rows("1")) + tk.MustQuery("select json_overlaps('[{\"a\":1}]', '{\"a\":1}');").Check(testkit.Rows("1")) + tk.MustQuery("select json_overlaps('{\"a\":1}', '[{\"a\":1}]');").Check(testkit.Rows("1")) + tk.MustQuery("select json_overlaps('[1,[2,3]]', '[[1,2], 3]');").Check(testkit.Rows("0")) + tk.MustQuery("select json_overlaps('{\"a\":[1,2]}', '{\"a\":[2,1]}');").Check(testkit.Rows("0")) + tk.MustQuery("select json_overlaps('{\"a\":[1,2]}', '{\"a\":[2,1]}');").Check(testkit.Rows("0")) + // #10461 tk.MustExec("drop table if exists tx1") tk.MustExec("create table tx1(id int key, a double, b double, c double, d double)") tk.MustExec("insert into tx1 values (1, 0.1, 0.2, 0.3, 0.0)") tk.MustQuery("select a+b, c from tx1").Check(testkit.Rows("0.30000000000000004 0.3")) tk.MustQuery("select json_array(a+b) = json_array(c) from tx1").Check(testkit.Rows("0")) + + tk.MustQuery("SELECT '{\"a\":1}' MEMBER OF('{\"a\":1}');").Check(testkit.Rows("0")) + tk.MustQuery("SELECT '{\"a\":1}' MEMBER OF('[{\"a\":1}]');").Check(testkit.Rows("0")) + tk.MustQuery("SELECT 1 MEMBER OF('1');").Check(testkit.Rows("1")) + tk.MustQuery("SELECT '{\"a\":1}' MEMBER OF('{\"a\":1}');").Check(testkit.Rows("0")) + tk.MustQuery("SELECT '[4,5]' MEMBER OF('[[3,4],[4,5]]');").Check(testkit.Rows("0")) + tk.MustQuery("SELECT '[4,5]' MEMBER OF('[[3,4],\"[4,5]\"]');").Check(testkit.Rows("1")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a enum('a', 'b'), b time, c binary(10))") + tk.MustExec("insert into t values ('a', '11:00:00', 'a')") + tk.MustQuery("select a member of ('\"a\"') from t").Check(testkit.Rows(`1`)) + tk.MustQuery("select b member of (json_array(cast('11:00:00' as time))) from t;").Check(testkit.Rows(`1`)) + tk.MustQuery("select b member of ('\"11:00:00\"') from t").Check(testkit.Rows(`0`)) + tk.MustQuery("select c member of ('\"a\"') from t").Check(testkit.Rows(`0`)) + err = tk.QueryToErr("select 'a' member of ('a')") + require.Error(t, err, "ERROR 3140 (22032): Invalid JSON text: The document root must not be followed by other values.") } func TestColumnInfoModified(t *testing.T) { @@ -3050,6 +3098,30 @@ func TestTiDBDecodeKeyFunc(t *testing.T) { sql = fmt.Sprintf("select tidb_decode_key( '%s' )", hexKey) rs = fmt.Sprintf(`{"%s":%d,"table_id":"%d"}`, tbl.Meta().GetPkName().String(), rowID, tbl.Meta().ID) tk.MustQuery(sql).Check(testkit.Rows(rs)) + + // Test partition table. + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int primary key clustered, b int, key bk (b)) PARTITION BY RANGE (a) (PARTITION p0 VALUES LESS THAN (1), PARTITION p1 VALUES LESS THAN (2));") + dom = domain.GetDomain(tk.Session()) + is = dom.InfoSchema() + tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + require.NotNil(t, tbl.Meta().Partition) + hexKey = buildTableRowKey(tbl.Meta().Partition.Definitions[0].ID, rowID) + sql = fmt.Sprintf("select tidb_decode_key( '%s' )", hexKey) + rs = fmt.Sprintf(`{"%s":%d,"partition_id":%d,"table_id":"%d"}`, tbl.Meta().GetPkName().String(), rowID, tbl.Meta().Partition.Definitions[0].ID, tbl.Meta().ID) + tk.MustQuery(sql).Check(testkit.Rows(rs)) + + hexKey = tablecodec.EncodeTablePrefix(tbl.Meta().Partition.Definitions[0].ID).String() + sql = fmt.Sprintf("select tidb_decode_key( '%s' )", hexKey) + rs = fmt.Sprintf(`{"partition_id":%d,"table_id":%d}`, tbl.Meta().Partition.Definitions[0].ID, tbl.Meta().ID) + tk.MustQuery(sql).Check(testkit.Rows(rs)) + + data = []types.Datum{types.NewIntDatum(100)} + hexKey = buildIndexKeyFromData(tbl.Meta().Partition.Definitions[0].ID, tbl.Indices()[0].Meta().ID, data) + sql = fmt.Sprintf("select tidb_decode_key( '%s' )", hexKey) + rs = fmt.Sprintf(`{"index_id":1,"index_vals":{"b":"100"},"partition_id":%d,"table_id":%d}`, tbl.Meta().Partition.Definitions[0].ID, tbl.Meta().ID) + tk.MustQuery(sql).Check(testkit.Rows(rs)) } func TestTwoDecimalTruncate(t *testing.T) { @@ -3699,18 +3771,23 @@ func TestShardIndexOnTiFlash(t *testing.T) { } } } + tk.MustExec("set @@session.tidb_isolation_read_engines = 'tiflash'") tk.MustExec("set @@session.tidb_enforce_mpp = 1") rows := tk.MustQuery("explain select max(b) from t").Rows() for _, row := range rows { line := fmt.Sprintf("%v", row) - require.NotContains(t, line, "tiflash") + if strings.Contains(line, "TableFullScan") { + require.Contains(t, line, "tiflash") + } } tk.MustExec("set @@session.tidb_enforce_mpp = 0") tk.MustExec("set @@session.tidb_allow_mpp = 0") rows = tk.MustQuery("explain select max(b) from t").Rows() for _, row := range rows { line := fmt.Sprintf("%v", row) - require.NotContains(t, line, "tiflash") + if strings.Contains(line, "TableFullScan") { + require.NotContains(t, line, "mpp[tiflash]") + } } } @@ -3718,8 +3795,6 @@ func TestExprPushdownBlacklist(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) - tk.MustQuery(`select * from mysql.expr_pushdown_blacklist`).Check(testkit.Rows( - "date_add tiflash DST(daylight saving time) does not take effect in TiFlash date_add")) tk.MustExec("use test") tk.MustExec("drop table if exists t") @@ -3791,7 +3866,7 @@ func TestInvalidEndingStatement(t *testing.T) { errMsgLen := len(parseErrMsg) assertParseErr := func(sql string) { - _, err := tk.Exec(sql) + err := tk.ExecToErr(sql) require.Error(t, err) require.Equal(t, err.Error()[:errMsgLen], parseErrMsg) } @@ -4110,23 +4185,17 @@ func TestNotExistFunc(t *testing.T) { tk := testkit.NewTestKit(t, store) // current db is empty - _, err := tk.Exec("SELECT xxx(1)") - require.Error(t, err, "[planner:1046]No database selected") + tk.MustGetErrMsg("SELECT xxx(1)", "[planner:1046]No database selected") - _, err = tk.Exec("SELECT yyy()") - require.Error(t, err, "[planner:1046]No database selected") + tk.MustGetErrMsg("SELECT yyy()", "[planner:1046]No database selected") // current db is not empty tk.MustExec("use test") - _, err = tk.Exec("SELECT xxx(1)") - require.Error(t, err, "[expression:1305]FUNCTION test.xxx does not exist") - - _, err = tk.Exec("SELECT yyy()") - require.Error(t, err, "[expression:1305]FUNCTION test.yyy does not exist") + tk.MustGetErrMsg("SELECT xxx(1)", "[expression:1305]FUNCTION test.xxx does not exist") + tk.MustGetErrMsg("SELECT yyy()", "[expression:1305]FUNCTION test.yyy does not exist") tk.MustExec("use test") - _, err = tk.Exec("SELECT timestampliteral(rand())") - require.Error(t, err, "[expression:1305]FUNCTION test.timestampliteral does not exist") + tk.MustGetErrMsg("SELECT timestampliteral(rand())", "[expression:1305]FUNCTION test.timestampliteral does not exist") } func TestDecodetoChunkReuse(t *testing.T) { @@ -4925,24 +4994,6 @@ func TestIssue18525(t *testing.T) { tk.MustQuery("select INTERVAL( ( CONVERT( -11752 USING utf8 ) ), 6558853612195285496, `col1`) from t1").Check(testkit.Rows("0", "0", "0")) } -func TestSchemaDMLNotChange(t *testing.T) { - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - tk2 := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set global tidb_enable_metadata_lock=0") - tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") - tk2.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (id int primary key, c_json json);") - tk.MustExec("insert into t values (1, '{\"k\": 1}');") - tk.MustExec("begin") - tk.MustExec("update t set c_json = '{\"k\": 2}' where id = 1;") - tk2.MustExec("alter table t rename column c_json to cc_json;") - tk.MustExec("commit") -} - func TestIssue18850(t *testing.T) { store := testkit.CreateMockStore(t) @@ -5908,8 +5959,7 @@ func TestSecurityEnhancedMode(t *testing.T) { // When SEM is enabled these features are restricted to all users // regardless of what privileges they have available. - _, err := tk.Exec("SELECT 1 INTO OUTFILE '/tmp/aaaa'") - require.Error(t, err, "[planner:8132]Feature 'SELECT INTO' is not supported when security enhanced mode is enabled") + tk.MustGetErrMsg("SELECT 1 INTO OUTFILE '/tmp/aaaa'", "[planner:8132]Feature 'SELECT INTO' is not supported when security enhanced mode is enabled") } func TestIssue23925(t *testing.T) { @@ -7102,29 +7152,25 @@ func TestIssue29708(t *testing.T) { tk.MustExec("use test;") tk.MustExec("drop table if exists t1;") tk.MustExec("CREATE TABLE t1 (a text)character set utf8 ;") - _, err := tk.Exec("INSERT INTO t1 VALUES (REPEAT(0125,200000000));") - require.NotNil(t, err) + tk.MustExecToErr("INSERT INTO t1 VALUES (REPEAT(0125,200000000));") tk.MustQuery("select * from t1").Check(nil) // test vectorized build-in function tk.MustExec("insert into t1 (a) values ('a'),('b');") - _, err = tk.Exec("insert into t1 select REPEAT(a,200000000) from t1;") - require.NotNil(t, err) + tk.MustExecToErr("insert into t1 select REPEAT(a,200000000) from t1;") tk.MustQuery("select a from t1 order by a;").Check([][]interface{}{ {"a"}, {"b"}, }) // test cast - _, err = tk.Exec(`insert into t1 values (cast("a" as binary(4294967295)));`) - require.NotNil(t, err) + tk.MustExecToErr(`insert into t1 values (cast("a" as binary(4294967295)));`) tk.MustQuery("select a from t1 order by a;").Check([][]interface{}{ {"a"}, {"b"}, }) - _, err = tk.Exec("INSERT IGNORE INTO t1 VALUES (REPEAT(0125,200000000));") - require.NoError(t, err) + tk.MustExec("INSERT IGNORE INTO t1 VALUES (REPEAT(0125,200000000));") tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1301 Result of repeat() was larger than max_allowed_packet (67108864) - truncated")) tk.MustQuery("select a from t1 order by a;").Check([][]interface{}{ {nil}, @@ -7390,6 +7436,29 @@ func TestIssue31569(t *testing.T) { tk.MustExec("drop table t") } +func TestTimestampAddWithFractionalSecond(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a date)") + tk.MustExec("insert into t values ('2021-08-20');") + tk.MustQuery("select timestampadd(microsecond, 1, a) from t").Check(testkit.Rows("2021-08-20 00:00:00.000001")) + tk.MustQuery("select timestampadd(second, 6/4, a) from t").Check(testkit.Rows("2021-08-20 00:00:01.500000")) + tk.MustQuery("select timestampadd(second, 9.9999e2, a) from t").Check(testkit.Rows("2021-08-20 00:16:39.990000")) + tk.MustQuery("select timestampadd(second, 1, '2021-08-20 00:00:01.0001')").Check(testkit.Rows("2021-08-20 00:00:02.000100")) + tk.MustQuery("select timestampadd(minute, 1.5, '2021-08-20 00:00:00')").Check(testkit.Rows("2021-08-20 00:02:00")) + tk.MustQuery("select timestampadd(minute, 1.5, '2021-08-20 00:00:00.0001')").Check(testkit.Rows("2021-08-20 00:02:00.000100")) + // overflow + tk.MustQuery("SELECT timestampadd(year,1.212208e+308,'1995-01-05 06:32:20.859724') as result").Check(testkit.Rows("")) + warnings := tk.Session().GetSessionVars().StmtCtx.GetWarnings() + require.Len(t, warnings, 1) + for _, warning := range warnings { + require.EqualError(t, warning.Err, "[types:1441]Datetime function: datetime field overflow") + } +} + func TestDateAddForNonExistingTimestamp(t *testing.T) { store := testkit.CreateMockStore(t) @@ -7816,3 +7885,25 @@ func TestIfNullParamMarker(t *testing.T) { // Should not report 'Data too long for column' error. tk.MustExec(`execute pr1 using @a,@b;`) } + +func TestIssue39146(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("CREATE TABLE `sun` ( `dest` varchar(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;") + tk.MustExec("insert into sun values('20231020');") + tk.MustExec("set @@sql_mode = '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';") + tk.MustExec("set @@tidb_enable_vectorized_expression = on;") + tk.MustQuery(`select str_to_date(substr(dest,1,6),'%H%i%s') from sun;`).Check(testkit.Rows("20:23:10")) + tk.MustExec("set @@tidb_enable_vectorized_expression = off;") + tk.MustQuery(`select str_to_date(substr(dest,1,6),'%H%i%s') from sun;`).Check(testkit.Rows("20:23:10")) +} + +func TestIssue40536(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("CREATE TABLE `6bf9e76d-ab44-4031-8a07-418b10741580` (\n `e0b5f703-6cfe-49b4-bc21-16a6455e43a7` set('7','va','ung60','ow','1g','gxwz5','uhnh','k','5la1','q8d9c','1f') NOT NULL DEFAULT '7,1g,uhnh,5la1,q8d9c',\n `fbc3527f-9617-4b9d-a5dc-4be31c00d8a5` datetime DEFAULT '6449-09-28 14:39:04',\n PRIMARY KEY (`e0b5f703-6cfe-49b4-bc21-16a6455e43a7`) /*T![clustered_index] CLUSTERED */\n) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin;") + tk.MustExec("CREATE TABLE `8919f3f4-25be-4a1a-904a-bb5e863d8fc8` (\n `9804d5f2-cbc7-43b7-b241-ea2656dc941a` enum('s951','36d','ua65','49yru','6l2em','4ea','jf2d2','vprsc','3yl7n','hz','ov') DEFAULT '4ea',\n `323cdbcb-0c14-4362-90ab-ea42caaed6a5` year(4) NOT NULL DEFAULT '1983',\n `b9b70f39-1a02-4114-9d7d-fa6259c1b691` time DEFAULT '20:18:04',\n PRIMARY KEY (`323cdbcb-0c14-4362-90ab-ea42caaed6a5`) /*T![clustered_index] CLUSTERED */,\n KEY `a704d6bb-772b-44ea-8cb0-6f7491c1aaa6` (`323cdbcb-0c14-4362-90ab-ea42caaed6a5`,`9804d5f2-cbc7-43b7-b241-ea2656dc941a`)\n) ENGINE=InnoDB DEFAULT CHARSET=ascii COLLATE=ascii_bin;") + tk.MustExec("delete from `6bf9e76d-ab44-4031-8a07-418b10741580` where not( `6bf9e76d-ab44-4031-8a07-418b10741580`.`e0b5f703-6cfe-49b4-bc21-16a6455e43a7` in ( select `9804d5f2-cbc7-43b7-b241-ea2656dc941a` from `8919f3f4-25be-4a1a-904a-bb5e863d8fc8` where `6bf9e76d-ab44-4031-8a07-418b10741580`.`e0b5f703-6cfe-49b4-bc21-16a6455e43a7` in ( '1f' ) and `6bf9e76d-ab44-4031-8a07-418b10741580`.`e0b5f703-6cfe-49b4-bc21-16a6455e43a7` in ( '1g' ,'va' ,'uhnh' ) ) ) and not( IsNull( `6bf9e76d-ab44-4031-8a07-418b10741580`.`e0b5f703-6cfe-49b4-bc21-16a6455e43a7` ) );\n") +} diff --git a/expression/multi_valued_index_test.go b/expression/multi_valued_index_test.go new file mode 100644 index 0000000000000..b749b4c94d9ba --- /dev/null +++ b/expression/multi_valued_index_test.go @@ -0,0 +1,508 @@ +// 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, +// 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 expression_test + +import ( + "context" + "fmt" + "testing" + + "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/sessiontxn" + "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/codec" + "github.com/stretchr/testify/require" +) + +func TestMultiValuedIndexDDL(t *testing.T) { + store := testkit.CreateMockStore(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("USE test;") + + tk.MustExec("create table t(a json);") + tk.MustGetErrCode("select cast(a as signed array) from t", errno.ErrNotSupportedYet) + tk.MustGetErrCode("select json_extract(cast(a as signed array), '$[0]') from t", errno.ErrNotSupportedYet) + tk.MustGetErrCode("select * from t where cast(a as signed array)", errno.ErrNotSupportedYet) + tk.MustGetErrCode("select cast('[1,2,3]' as unsigned array);", errno.ErrNotSupportedYet) + + tk.MustExec("drop table t") + tk.MustGetErrCode("CREATE TABLE t(x INT, KEY k ((1 AND CAST(JSON_ARRAY(x) AS UNSIGNED ARRAY))));", errno.ErrNotSupportedYet) + tk.MustGetErrCode("CREATE TABLE t1 (f1 json, key mvi((cast(cast(f1 as unsigned array) as unsigned array))));", errno.ErrNotSupportedYet) + tk.MustGetErrCode("CREATE TABLE t1 (f1 json, primary key mvi((cast(cast(f1 as unsigned array) as unsigned array))));", errno.ErrNotSupportedYet) + tk.MustGetErrCode("CREATE TABLE t1 (f1 json, key mvi((cast(f1->>'$[*]' as unsigned array))));", errno.ErrInvalidTypeForJSON) + tk.MustGetErrCode("CREATE TABLE t1 (f1 json, key mvi((cast(f1->'$[*]' as year array))));", errno.ErrNotSupportedYet) + tk.MustGetErrCode("CREATE TABLE t1 (f1 json, key mvi((cast(f1->'$[*]' as json array))));", errno.ErrNotSupportedYet) + tk.MustGetErrCode("CREATE TABLE t1 (f1 json, key mvi((cast(f1->'$[*]' as char(10) charset gbk array))));", errno.ErrNotSupportedYet) + tk.MustGetErrCode("create table t(j json, gc json as ((concat(cast(j->'$[*]' as unsigned array),\"x\"))));", errno.ErrNotSupportedYet) + tk.MustGetErrCode("create table t(j json, gc json as (cast(j->'$[*]' as unsigned array)));", errno.ErrNotSupportedYet) + tk.MustGetErrCode(`create table t1(j json, key i1((cast(j->"$" as char array))));`, errno.ErrNotSupportedYet) + tk.MustGetErrCode(`create table t1(j json, key i1((cast(j->"$" as binary array))));`, errno.ErrNotSupportedYet) + tk.MustGetErrCode(`create table t1(j json, key i1((cast(j->"$" as float array))));`, errno.ErrNotSupportedYet) + tk.MustGetErrCode(`create table t1(j json, key i1((cast(j->"$" as double array))));`, errno.ErrNotSupportedYet) + tk.MustGetErrCode(`create table t1(j json, key i1((cast(j->"$" as decimal(4,2) array))));`, errno.ErrNotSupportedYet) + tk.MustGetErrCode("create view v as select cast('[1,2,3]' as unsigned array);", errno.ErrNotSupportedYet) + tk.MustExec("create table t(a json, index idx((cast(a as signed array))));") + tk.MustExec("drop table t;") + tk.MustExec("create table t(a json, index idx(((cast(a as signed array)))))") + + tk.MustExec("drop table t") + tk.MustGetErrCode("create table t(a json, b int, index idx(b, (cast(a as signed array)), (cast(a as signed array))));", errno.ErrNotSupportedYet) + tk.MustExec("create table t(a json, b int);") + tk.MustGetErrCode("create index idx on t (b, (cast(a as signed array)), (cast(a as signed array)))", errno.ErrNotSupportedYet) + tk.MustGetErrCode("alter table t add index idx(b, (cast(a as signed array)), (cast(a as signed array)))", errno.ErrNotSupportedYet) + tk.MustExec("create index idx1 on t (b, (cast(a as signed array)))") + tk.MustExec("alter table t add index idx2(b, (cast(a as signed array)))") + + tk.MustExec("drop table t") + tk.MustExec("create table t(a json, b int, index idx3(b, (cast(a as signed array))));") + tk.MustExec("drop table t") + tk.MustExec("set names gbk") + tk.MustExec("create table t(a json, b int, index idx3(b, (cast(a as char(10) array))));") + + tk.MustExec("CREATE TABLE users (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, doc JSON);") + tk.MustExecToErr("CREATE TABLE t (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, doc JSON, FOREIGN KEY fk_user_id ((cast(doc->'$[*]' as signed array))) REFERENCES users(id));") +} + +func TestMultiValuedIndexDML(t *testing.T) { + store := testkit.CreateMockStore(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("USE test;") + + mode := []string{`''`, `default`} + + for _, m := range mode { + tk.MustExec(fmt.Sprintf("set @@sql_mode=%s", m)) + + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t(a json, index idx((cast(a as unsigned array))));`) + tk.MustExec(`insert into t values ('[1,2,3]');`) + tk.MustGetErrCode(`insert into t values ('[-1]');`, errno.ErrDataOutOfRangeFunctionalIndex) + tk.MustGetErrCode(`insert into t values ('["1"]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('["a"]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('["汉字"]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[1.2]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[1.0]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("11:00:00" as time)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("2022-02-02" as date)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("2022-02-02 11:00:00" as datetime)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast('{"a":1}' as json)));`, errno.ErrInvalidJSONValueForFuncIndex) + + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t(a json, index idx((cast(a as signed array))));`) + tk.MustExec(`insert into t values ('[1,2,3]');`) + tk.MustExec(`insert into t values ('[-1]');`) + tk.MustGetErrCode(`insert into t values ('["1"]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('["a"]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('["汉字"]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[1.2]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[1.0]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("11:00:00" as time)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("2022-02-02" as date)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("2022-02-02 11:00:00" as datetime)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast('{"a":1}' as json)));`, errno.ErrInvalidJSONValueForFuncIndex) + + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t(a json, index idx((cast(a as char(1) array))));`) + tk.MustGetErrCode(`insert into t values ('[1,2,3]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[-1]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustExec(`insert into t values ('["1"]');`) + tk.MustExec(`insert into t values ('["a"]');`) + tk.MustGetErrCode(`insert into t values ('["汉字"]');`, errno.ErrFunctionalIndexDataIsTooLong) + tk.MustGetErrCode(`insert into t values ('[1.2]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[1.0]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("11:00:00" as time)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("2022-02-02" as date)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("2022-02-02 11:00:00" as datetime)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast('{"a":1}' as json)));`, errno.ErrInvalidJSONValueForFuncIndex) + + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t(a json, index idx((cast(a as char(2) array))));`) + tk.MustGetErrCode(`insert into t values ('[1,2,3]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[-1]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustExec(`insert into t values ('["1"]');`) + tk.MustExec(`insert into t values ('["a"]');`) + tk.MustExec(`insert into t values ('["汉字"]');`) + tk.MustGetErrCode(`insert into t values ('[1.2]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[1.0]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("11:00:00" as time)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("2022-02-02" as date)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("2022-02-02 11:00:00" as datetime)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast('{"a":1}' as json)));`, errno.ErrInvalidJSONValueForFuncIndex) + + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t(a json, index idx((cast(a as binary(1) array))));`) + tk.MustGetErrCode(`insert into t values ('[1,2,3]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[-1]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustExec(`insert into t values ('["1"]');`) + tk.MustExec(`insert into t values ('["a"]');`) + tk.MustGetErrCode(`insert into t values ('["汉字"]');`, errno.ErrFunctionalIndexDataIsTooLong) + tk.MustGetErrCode(`insert into t values ('[1.2]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[1.0]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("11:00:00" as time)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("2022-02-02" as date)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("2022-02-02 11:00:00" as datetime)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast('{"a":1}' as json)));`, errno.ErrInvalidJSONValueForFuncIndex) + + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t(a json, index idx((cast(a as binary(2) array))));`) + tk.MustGetErrCode(`insert into t values ('[1,2,3]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[-1]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustExec(`insert into t values ('["1"]');`) + tk.MustExec(`insert into t values ('["a"]');`) + tk.MustGetErrCode(`insert into t values ('["汉字"]');`, errno.ErrFunctionalIndexDataIsTooLong) + tk.MustGetErrCode(`insert into t values ('[1.2]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[1.0]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("11:00:00" as time)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("2022-02-02" as date)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("2022-02-02 11:00:00" as datetime)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast('{"a":1}' as json)));`, errno.ErrInvalidJSONValueForFuncIndex) + + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t(a json, index idx((cast(a as date array))));`) + tk.MustGetErrCode(`insert into t values ('[1,2,3]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[-1]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('["1"]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('["a"]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('["汉字"]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[1.2]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[1.0]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("11:00:00" as time)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustExec(`insert into t values (json_array(cast("2022-02-02" as date)));`) + tk.MustGetErrCode(`insert into t values (json_array(cast("2022-02-02 11:00:00" as datetime)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast('{"a":1}' as json)));`, errno.ErrInvalidJSONValueForFuncIndex) + + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t(a json, index idx((cast(a as time array))));`) + tk.MustGetErrCode(`insert into t values ('[1,2,3]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[-1]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('["1"]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('["a"]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('["汉字"]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[1.2]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[1.0]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustExec(`insert into t values (json_array(cast("11:00:00" as time)));`) + tk.MustGetErrCode(`insert into t values (json_array(cast("2022-02-02" as date)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("2022-02-02 11:00:00" as datetime)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast('{"a":1}' as json)));`, errno.ErrInvalidJSONValueForFuncIndex) + + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t(a json, index idx((cast(a as datetime array))));`) + tk.MustGetErrCode(`insert into t values ('[1,2,3]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[-1]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('["1"]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('["a"]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('["汉字"]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[1.2]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values ('[1.0]');`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("11:00:00" as time)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustGetErrCode(`insert into t values (json_array(cast("2022-02-02" as date)));`, errno.ErrInvalidJSONValueForFuncIndex) + tk.MustExec(`insert into t values (json_array(cast("2022-02-02 11:00:00" as datetime)));`) + tk.MustGetErrCode(`insert into t values (json_array(cast('{"a":1}' as json)));`, errno.ErrInvalidJSONValueForFuncIndex) + } +} + +func TestWriteMultiValuedIndex(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t1(pk int primary key, a json, index idx((cast(a as signed array))))") + tk.MustExec("insert into t1 values (1, '[1,2,2,3]')") + tk.MustExec("insert into t1 values (2, '[1,2,3]')") + tk.MustExec("insert into t1 values (3, '[]')") + tk.MustExec("insert into t1 values (4, '[2,3,4]')") + tk.MustExec("insert into t1 values (5, null)") + tk.MustExec("insert into t1 values (6, '1')") + + t1, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + require.NoError(t, err) + for _, index := range t1.Indices() { + if index.Meta().MVIndex { + checkCount(t, t1.IndexPrefix(), index, store, 11) + checkKey(t, t1.IndexPrefix(), index, store, [][]types.Datum{ + {types.NewDatum(nil), types.NewIntDatum(5)}, + {types.NewIntDatum(1), types.NewIntDatum(1)}, + {types.NewIntDatum(1), types.NewIntDatum(2)}, + {types.NewIntDatum(1), types.NewIntDatum(6)}, + {types.NewIntDatum(2), types.NewIntDatum(1)}, + {types.NewIntDatum(2), types.NewIntDatum(2)}, + {types.NewIntDatum(2), types.NewIntDatum(4)}, + {types.NewIntDatum(3), types.NewIntDatum(1)}, + {types.NewIntDatum(3), types.NewIntDatum(2)}, + {types.NewIntDatum(3), types.NewIntDatum(4)}, + {types.NewIntDatum(4), types.NewIntDatum(4)}, + }) + } + } + tk.MustExec("delete from t1") + for _, index := range t1.Indices() { + if index.Meta().MVIndex { + checkCount(t, t1.IndexPrefix(), index, store, 0) + } + } + + tk.MustExec("drop table t1") + tk.MustExec("create table t1(pk int primary key, a json, index idx((cast(a as char(5) array))))") + tk.MustExec("insert into t1 values (1, '[\"abc\", \"abc \"]')") + tk.MustExec("insert into t1 values (2, '[\"b\"]')") + tk.MustExec("insert into t1 values (3, '[\"b \"]')") + tk.MustQuery("select pk from t1 where 'b ' member of (a)").Check(testkit.Rows("3")) + + t1, err = dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + require.NoError(t, err) + for _, index := range t1.Indices() { + if index.Meta().MVIndex { + checkCount(t, t1.IndexPrefix(), index, store, 4) + checkKey(t, t1.IndexPrefix(), index, store, [][]types.Datum{ + {types.NewBytesDatum([]byte("abc")), types.NewIntDatum(1)}, + {types.NewBytesDatum([]byte("abc ")), types.NewIntDatum(1)}, + {types.NewBytesDatum([]byte("b")), types.NewIntDatum(2)}, + {types.NewBytesDatum([]byte("b ")), types.NewIntDatum(3)}, + }) + } + } + + tk.MustExec("update t1 set a = json_array_append(a, '$', 'bcd') where pk = 1") + tk.MustExec("update t1 set a = '[]' where pk = 2") + tk.MustExec("update t1 set a = '[\"abc\"]' where pk = 3") + + for _, index := range t1.Indices() { + if index.Meta().MVIndex { + checkCount(t, t1.IndexPrefix(), index, store, 4) + checkKey(t, t1.IndexPrefix(), index, store, [][]types.Datum{ + {types.NewBytesDatum([]byte("abc")), types.NewIntDatum(1)}, + {types.NewBytesDatum([]byte("abc")), types.NewIntDatum(3)}, + {types.NewBytesDatum([]byte("abc ")), types.NewIntDatum(1)}, + {types.NewBytesDatum([]byte("bcd")), types.NewIntDatum(1)}, + }) + } + } + + tk.MustExec("delete from t1") + for _, index := range t1.Indices() { + if index.Meta().MVIndex { + checkCount(t, t1.IndexPrefix(), index, store, 0) + } + } + + tk.MustExec("drop table t1") + tk.MustExec("create table t1(pk int primary key, a json, index idx((cast(a as unsigned array))))") + tk.MustExec("insert into t1 values (1, '[1,2,2,3]')") + tk.MustExec("insert into t1 values (2, '[1,2,3]')") + tk.MustExec("insert into t1 values (3, '[]')") + tk.MustExec("insert into t1 values (4, '[2,3,4]')") + tk.MustExec("insert into t1 values (5, null)") + tk.MustExec("insert into t1 values (6, '1')") + + t1, err = dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + require.NoError(t, err) + for _, index := range t1.Indices() { + if index.Meta().MVIndex { + checkCount(t, t1.IndexPrefix(), index, store, 11) + checkKey(t, t1.IndexPrefix(), index, store, [][]types.Datum{ + {types.NewDatum(nil), types.NewIntDatum(5)}, + {types.NewUintDatum(1), types.NewIntDatum(1)}, + {types.NewUintDatum(1), types.NewIntDatum(2)}, + {types.NewUintDatum(1), types.NewIntDatum(6)}, + {types.NewUintDatum(2), types.NewIntDatum(1)}, + {types.NewUintDatum(2), types.NewIntDatum(2)}, + {types.NewUintDatum(2), types.NewIntDatum(4)}, + {types.NewUintDatum(3), types.NewIntDatum(1)}, + {types.NewUintDatum(3), types.NewIntDatum(2)}, + {types.NewUintDatum(3), types.NewIntDatum(4)}, + {types.NewUintDatum(4), types.NewIntDatum(4)}, + }) + } + } + tk.MustExec("delete from t1") + for _, index := range t1.Indices() { + if index.Meta().MVIndex { + checkCount(t, t1.IndexPrefix(), index, store, 0) + } + } +} + +func TestWriteMultiValuedIndexPartitionTable(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(`create table t1 +( + pk int primary key, + a json, + index idx ((cast(a as signed array))) +) partition by range columns (pk) (partition p0 values less than (10), partition p1 values less than (20));`) + tk.MustExec("insert into t1 values (1, '[1,2,2,3]')") + tk.MustExec("insert into t1 values (11, '[1,2,3]')") + tk.MustExec("insert into t1 values (2, '[]')") + tk.MustExec("insert into t1 values (12, '[2,3,4]')") + tk.MustExec("insert into t1 values (3, null)") + tk.MustExec("insert into t1 values (13, null)") + + t1, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + require.NoError(t, err) + + expect := map[string]struct { + count int + vals [][]types.Datum + }{ + "p0": {4, [][]types.Datum{ + {types.NewDatum(nil), types.NewIntDatum(3)}, + {types.NewIntDatum(1), types.NewIntDatum(1)}, + {types.NewIntDatum(2), types.NewIntDatum(1)}, + {types.NewIntDatum(3), types.NewIntDatum(1)}, + }}, + "p1": {7, [][]types.Datum{ + {types.NewDatum(nil), types.NewIntDatum(13)}, + {types.NewIntDatum(1), types.NewIntDatum(11)}, + {types.NewIntDatum(2), types.NewIntDatum(11)}, + {types.NewIntDatum(2), types.NewIntDatum(12)}, + {types.NewIntDatum(3), types.NewIntDatum(11)}, + {types.NewIntDatum(3), types.NewIntDatum(12)}, + {types.NewIntDatum(4), types.NewIntDatum(12)}, + }}, + } + + for _, def := range t1.Meta().GetPartitionInfo().Definitions { + partition := t1.(table.PartitionedTable).GetPartition(def.ID) + for _, index := range partition.Indices() { + if index.Meta().MVIndex { + checkCount(t, partition.IndexPrefix(), index, store, expect[def.Name.L].count) + checkKey(t, partition.IndexPrefix(), index, store, expect[def.Name.L].vals) + } + } + } + + tk.MustExec("delete from t1") + for _, def := range t1.Meta().GetPartitionInfo().Definitions { + partition := t1.(table.PartitionedTable).GetPartition(def.ID) + for _, index := range partition.Indices() { + if index.Meta().MVIndex { + checkCount(t, partition.IndexPrefix(), index, store, 0) + } + } + } +} + +func TestWriteMultiValuedIndexUnique(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t1(pk int primary key, a json, unique index idx((cast(a as signed array))))") + tk.MustExec("insert into t1 values (1, '[1,2,2]')") + tk.MustGetErrCode("insert into t1 values (2, '[1]')", errno.ErrDupEntry) + tk.MustExec("insert into t1 values (3, '[3,3,4]')") + + t1, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + require.NoError(t, err) + for _, index := range t1.Indices() { + if index.Meta().MVIndex { + checkCount(t, t1.IndexPrefix(), index, store, 4) + checkKey(t, t1.IndexPrefix(), index, store, [][]types.Datum{ + {types.NewIntDatum(1)}, + {types.NewIntDatum(2)}, + {types.NewIntDatum(3)}, + {types.NewIntDatum(4)}, + }) + } + } +} + +func TestWriteMultiValuedIndexComposite(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t1(pk int primary key, a json, c int, d int, index idx(c, (cast(a as signed array)), d))") + tk.MustExec("insert into t1 values (1, '[1,2,2]', 1, 1)") + tk.MustExec("insert into t1 values (2, '[2,2,2]', 2, 2)") + tk.MustExec("insert into t1 values (3, '[3,3,4]', 3, 3)") + tk.MustExec("insert into t1 values (4, null, 4, 4)") + tk.MustExec("insert into t1 values (5, '[]', 5, 5)") + + t1, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + require.NoError(t, err) + for _, index := range t1.Indices() { + if index.Meta().MVIndex { + checkCount(t, t1.IndexPrefix(), index, store, 6) + checkKey(t, t1.IndexPrefix(), index, store, [][]types.Datum{ + {types.NewIntDatum(1), types.NewIntDatum(1), types.NewIntDatum(1), types.NewIntDatum(1)}, + {types.NewIntDatum(1), types.NewIntDatum(2), types.NewIntDatum(1), types.NewIntDatum(1)}, + {types.NewIntDatum(2), types.NewIntDatum(2), types.NewIntDatum(2), types.NewIntDatum(2)}, + {types.NewIntDatum(3), types.NewIntDatum(3), types.NewIntDatum(3), types.NewIntDatum(3)}, + {types.NewIntDatum(3), types.NewIntDatum(4), types.NewIntDatum(3), types.NewIntDatum(3)}, + {types.NewIntDatum(4), types.NewDatum(nil), types.NewIntDatum(4), types.NewIntDatum(4)}, + }) + } + } +} + +func checkCount(t *testing.T, prefix kv.Key, index table.Index, store kv.Storage, except int) { + c := 0 + checkIndex(t, prefix, index, store, func(it kv.Iterator) { + c++ + }) + require.Equal(t, except, c) +} + +func checkKey(t *testing.T, prefix kv.Key, index table.Index, store kv.Storage, except [][]types.Datum) { + idx := 0 + checkIndex(t, prefix, index, store, func(it kv.Iterator) { + indexKey := decodeIndexKey(t, it.Key()) + require.Equal(t, except[idx], indexKey) + idx++ + }) +} + +func checkIndex(t *testing.T, prefix kv.Key, index table.Index, store kv.Storage, fn func(kv.Iterator)) { + startKey := codec.EncodeInt(prefix, index.Meta().ID) + prefix.Next() + se := testkit.NewTestKit(t, store).Session() + err := sessiontxn.NewTxn(context.Background(), se) + require.NoError(t, err) + txn, err := se.Txn(true) + require.NoError(t, err) + it, err := txn.Iter(startKey, prefix.PrefixNext()) + require.NoError(t, err) + for it.Valid() && it.Key().HasPrefix(prefix) { + fn(it) + err = it.Next() + require.NoError(t, err) + } + it.Close() + se.Close() +} + +func decodeIndexKey(t *testing.T, key kv.Key) []types.Datum { + var idLen = 8 + var prefixLen = 1 + idLen /*tableID*/ + 2 + _, _, isRecord, err := tablecodec.DecodeKeyHead(key) + require.NoError(t, err) + require.False(t, isRecord) + indexKey := key[prefixLen+idLen:] + var datumValues []types.Datum + for len(indexKey) > 0 { + remain, d, err := codec.DecodeOne(indexKey) + require.NoError(t, err) + datumValues = append(datumValues, d) + indexKey = remain + } + return datumValues +} diff --git a/expression/simple_rewriter.go b/expression/simple_rewriter.go index 808db9f69b4cf..3343a0cbaa169 100644 --- a/expression/simple_rewriter.go +++ b/expression/simple_rewriter.go @@ -48,7 +48,7 @@ func ParseSimpleExprWithTableInfo(ctx sessionctx.Context, exprStr string, tableI return nil, errors.Trace(err) } expr := stmts[0].(*ast.SelectStmt).Fields.Fields[0].Expr - return RewriteSimpleExprWithTableInfo(ctx, tableInfo, expr) + return RewriteSimpleExprWithTableInfo(ctx, tableInfo, expr, false) } // ParseSimpleExprCastWithTableInfo parses simple expression string to Expression. @@ -63,13 +63,13 @@ func ParseSimpleExprCastWithTableInfo(ctx sessionctx.Context, exprStr string, ta } // RewriteSimpleExprWithTableInfo rewrites simple ast.ExprNode to expression.Expression. -func RewriteSimpleExprWithTableInfo(ctx sessionctx.Context, tbl *model.TableInfo, expr ast.ExprNode) (Expression, error) { +func RewriteSimpleExprWithTableInfo(ctx sessionctx.Context, tbl *model.TableInfo, expr ast.ExprNode, allowCastArray bool) (Expression, error) { dbName := model.NewCIStr(ctx.GetSessionVars().CurrentDB) columns, names, err := ColumnInfos2ColumnsAndNames(ctx, dbName, tbl.Name, tbl.Cols(), tbl) if err != nil { return nil, err } - e, err := RewriteAstExpr(ctx, expr, NewSchema(columns...), names) + e, err := RewriteAstExpr(ctx, expr, NewSchema(columns...), names, allowCastArray) if err != nil { return nil, err } @@ -111,7 +111,7 @@ func ParseSimpleExprsWithNames(ctx sessionctx.Context, exprStr string, schema *S // RewriteSimpleExprWithNames rewrites simple ast.ExprNode to expression.Expression. func RewriteSimpleExprWithNames(ctx sessionctx.Context, expr ast.ExprNode, schema *Schema, names []*types.FieldName) (Expression, error) { - e, err := RewriteAstExpr(ctx, expr, schema, names) + e, err := RewriteAstExpr(ctx, expr, schema, names, false) if err != nil { return nil, err } diff --git a/expression/util.go b/expression/util.go index 22637d1b8617f..20de76cda383d 100644 --- a/expression/util.go +++ b/expression/util.go @@ -177,6 +177,31 @@ func ExtractEquivalenceColumns(result [][]Expression, exprs []Expression) [][]Ex return result } +// FindUpperBound looks for column < constant or column <= constant and returns both the column +// and constant. It return nil, 0 if the expression is not of this form. +// It is used by derived Top N pattern and it is put here since it looks like +// a general purpose routine. Similar routines can be added to find lower bound as well. +func FindUpperBound(expr Expression) (*Column, int64) { + scalarFunction, scalarFunctionOk := expr.(*ScalarFunction) + if scalarFunctionOk { + args := scalarFunction.GetArgs() + if len(args) == 2 { + col, colOk := args[0].(*Column) + constant, constantOk := args[1].(*Constant) + if colOk && constantOk && (scalarFunction.FuncName.L == ast.LT || scalarFunction.FuncName.L == ast.LE) { + value, valueOk := constant.Value.GetValue().(int64) + if valueOk { + if scalarFunction.FuncName.L == ast.LT { + return col, value - 1 + } + return col, value + } + } + } + } + return nil, 0 +} + func extractEquivalenceColumns(result [][]Expression, expr Expression) [][]Expression { switch v := expr.(type) { case *ScalarFunction: @@ -415,7 +440,6 @@ func ColumnSubstituteImpl(expr Expression, schema *Schema, newExprs []Expression if v.InOperand { newExpr = SetExprColumnInOperand(newExpr) } - newExpr.SetCoercibility(v.Coercibility()) return true, false, newExpr case *ScalarFunction: substituted := false @@ -427,8 +451,10 @@ func ColumnSubstituteImpl(expr Expression, schema *Schema, newExprs []Expression return substituted, hasFail, v } if substituted { + flag := v.RetType.GetFlag() e := BuildCastFunction(v.GetCtx(), newArg, v.RetType) e.SetCoercibility(v.Coercibility()) + e.GetType().SetFlag(flag) return true, false, e } return false, false, v @@ -436,7 +462,11 @@ func ColumnSubstituteImpl(expr Expression, schema *Schema, newExprs []Expression // cowExprRef is a copy-on-write util, args array allocation happens only // when expr in args is changed refExprArr := cowExprRef{v.GetArgs(), nil} - _, coll := DeriveCollationFromExprs(v.GetCtx(), v.GetArgs()...) + oldCollEt, err := CheckAndDeriveCollationFromExprs(v.GetCtx(), v.FuncName.L, v.RetType.EvalType(), v.GetArgs()...) + if err != nil { + logutil.BgLogger().Error("Unexpected error happened during ColumnSubstitution", zap.Stack("stack")) + return false, false, v + } var tmpArgForCollCheck []Expression if collate.NewCollationEnabled() { tmpArgForCollCheck = make([]Expression, len(v.GetArgs())) @@ -452,9 +482,18 @@ func ColumnSubstituteImpl(expr Expression, schema *Schema, newExprs []Expression changed = false copy(tmpArgForCollCheck, refExprArr.Result()) tmpArgForCollCheck[idx] = newFuncExpr - _, newColl := DeriveCollationFromExprs(v.GetCtx(), tmpArgForCollCheck...) - if coll == newColl { - changed = checkCollationStrictness(coll, newFuncExpr.GetType().GetCollate()) + newCollEt, err := CheckAndDeriveCollationFromExprs(v.GetCtx(), v.FuncName.L, v.RetType.EvalType(), tmpArgForCollCheck...) + if err != nil { + logutil.BgLogger().Error("Unexpected error happened during ColumnSubstitution", zap.Stack("stack")) + return false, failed, v + } + if oldCollEt.Collation == newCollEt.Collation { + if newFuncExpr.GetType().GetCollate() == arg.GetType().GetCollate() && newFuncExpr.Coercibility() == arg.Coercibility() { + // It's safe to use the new expression, otherwise some cases in projection push-down will be wrong. + changed = true + } else { + changed = checkCollationStrictness(oldCollEt.Collation, newFuncExpr.GetType().GetCollate()) + } } } hasFail = hasFail || failed || oldChanged != changed @@ -1143,6 +1182,33 @@ func IsMutableEffectsExpr(expr Expression) bool { return false } +// IsInmutableExpr checks whether this expression only consists of foldable functions and inmutable constants. +// This expression can be evaluated by using `expr.Eval(chunk.Row{})` directly if it's inmutable. +func IsInmutableExpr(expr Expression) bool { + switch x := expr.(type) { + case *ScalarFunction: + if _, ok := unFoldableFunctions[x.FuncName.L]; ok { + return false + } + if _, ok := mutableEffectsFunctions[x.FuncName.L]; ok { + return false + } + for _, arg := range x.GetArgs() { + if !IsInmutableExpr(arg) { + return false + } + } + return true + case *Constant: + if x.DeferredExpr != nil || x.ParamMarker != nil { + return false + } + return true + default: + return false + } +} + // RemoveDupExprs removes identical exprs. Not that if expr contains functions which // are mutable or have side effects, we cannot remove it even if it has duplicates; // if the plan is going to be cached, we cannot remove expressions containing `?` neither. @@ -1239,7 +1305,7 @@ func ContainCorrelatedColumn(exprs []Expression) bool { // TODO: Do more careful check here. func MaybeOverOptimized4PlanCache(ctx sessionctx.Context, exprs []Expression) bool { // If we do not enable plan cache, all the optimization can work correctly. - if !ctx.GetSessionVars().StmtCtx.UseCache || ctx.GetSessionVars().StmtCtx.SkipPlanCache { + if !ctx.GetSessionVars().StmtCtx.UseCache { return false } return containMutableConst(ctx, exprs) diff --git a/extension/BUILD.bazel b/extension/BUILD.bazel index 12ca672b3c86f..f180dcf7a9955 100644 --- a/extension/BUILD.bazel +++ b/extension/BUILD.bazel @@ -29,6 +29,7 @@ go_library( go_test( name = "extension_test", + timeout = "short", srcs = [ "bootstrap_test.go", "event_listener_test.go", @@ -37,6 +38,7 @@ go_test( "registry_test.go", ], embed = [":extension"], + flaky = True, deps = [ "//expression", "//parser/ast", diff --git a/go.mod b/go.mod index 01400b701b85b..09687001e28f1 100644 --- a/go.mod +++ b/go.mod @@ -3,15 +3,17 @@ module github.com/pingcap/tidb go 1.19 require ( - cloud.google.com/go/storage v1.21.0 + cloud.google.com/go/storage v1.27.0 + github.com/Azure/azure-sdk-for-go/sdk/azcore v0.20.0 github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.12.0 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.2.0 - github.com/BurntSushi/toml v1.2.0 + github.com/BurntSushi/toml v1.2.1 github.com/DATA-DOG/go-sqlmock v1.5.0 github.com/Jeffail/gabs/v2 v2.5.1 github.com/Masterminds/semver v1.5.0 github.com/Shopify/sarama v1.29.0 github.com/aliyun/alibaba-cloud-sdk-go v1.61.1581 + github.com/apache/skywalking-eyes v0.4.0 github.com/ashanbrown/makezero v1.1.1 github.com/aws/aws-sdk-go v1.44.48 github.com/blacktear23/go-proxyprotocol v1.0.2 @@ -19,28 +21,29 @@ require ( github.com/charithe/durationcheck v0.0.9 github.com/cheggaaa/pb/v3 v3.0.8 github.com/cheynewallace/tabby v1.1.1 + github.com/cloudfoundry/gosigar v1.3.6 github.com/cockroachdb/errors v1.8.1 github.com/cockroachdb/pebble v0.0.0-20210719141320-8c3bd06debb5 github.com/coocood/freecache v1.2.1 github.com/coreos/go-semver v0.3.0 - github.com/daixiang0/gci v0.6.3 + github.com/daixiang0/gci v0.9.0 github.com/danjacques/gofslock v0.0.0-20191023191349-0a45f885bc37 - github.com/dgraph-io/ristretto v0.1.1-0.20220403145359-8e850b710d6d + github.com/dgraph-io/ristretto v0.1.1 github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 github.com/docker/go-units v0.4.0 github.com/emirpasic/gods v1.18.1 github.com/fatanugraha/noloopclosure v0.1.1 - github.com/fatih/color v1.13.0 + github.com/fatih/color v1.14.1 github.com/fsouza/fake-gcs-server v1.19.0 - github.com/go-sql-driver/mysql v1.6.0 + github.com/go-sql-driver/mysql v1.7.0 github.com/gogo/protobuf v1.3.2 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.2 github.com/golang/snappy v0.0.4 - github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a - github.com/golangci/golangci-lint v1.49.0 + github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 + github.com/golangci/golangci-lint v1.51.0 github.com/golangci/gosec v0.0.0-20180901114220-8afd9cbb6cfb - github.com/golangci/misspell v0.3.5 + github.com/golangci/misspell v0.4.0 github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 github.com/google/btree v1.1.2 github.com/google/pprof v0.0.0-20211122183932-1daafda22083 @@ -54,41 +57,44 @@ require ( github.com/jedib0t/go-pretty/v6 v6.2.2 github.com/jingyugao/rowserrcheck v1.1.1 github.com/joho/sqltocsv v0.0.0-20210428211105-a6d6801d59df - github.com/kisielk/errcheck v1.6.2 - github.com/klauspost/compress v1.15.1 - github.com/kyoh86/exportloopref v0.1.8 + github.com/kisielk/errcheck v1.6.3 + github.com/klauspost/compress v1.15.13 + github.com/kyoh86/exportloopref v0.1.11 github.com/lestrrat-go/jwx/v2 v2.0.6 - github.com/mgechev/revive v1.2.4 + github.com/mgechev/revive v1.2.5 github.com/ngaut/pools v0.0.0-20180318154953-b7bc8c42aac7 github.com/nishanths/predeclared v0.2.2 github.com/opentracing/basictracer-go v1.0.0 github.com/opentracing/opentracing-go v1.2.0 github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 - github.com/pingcap/badger v1.5.1-0.20220314162537-ab58fbf40580 - github.com/pingcap/errors v0.11.5-0.20220729040631-518f63d66278 - github.com/pingcap/failpoint v0.0.0-20220423142525-ae43b7f4e5c3 + github.com/pingcap/badger v1.5.1-0.20230103063557-828f39b09b6d + github.com/pingcap/errors v0.11.5-0.20221009092201-b66cddb77c32 + github.com/pingcap/failpoint v0.0.0-20220801062533-2eaa32854a6c github.com/pingcap/fn v0.0.0-20200306044125-d5540d389059 - github.com/pingcap/kvproto v0.0.0-20221103025916-e7e21f0e9cd9 - github.com/pingcap/log v1.1.1-0.20221110065318-21a4942860b3 + github.com/pingcap/kvproto v0.0.0-20230206112125-0561adc37543 + github.com/pingcap/log v1.1.1-0.20221116035753-734d527bc87c github.com/pingcap/sysutil v0.0.0-20220114020952-ea68d2dbf5b4 github.com/pingcap/tidb/parser v0.0.0-20211011031125-9b13dc409c5e - github.com/pingcap/tipb v0.0.0-20221020071514-cd933387bcb5 + github.com/pingcap/tipb v0.0.0-20230119054146-c6b7a5a1623b github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.13.0 - github.com/prometheus/client_model v0.2.0 - github.com/prometheus/common v0.37.0 + github.com/prometheus/client_golang v1.14.0 + github.com/prometheus/client_model v0.3.0 + github.com/prometheus/common v0.39.0 github.com/prometheus/prometheus v0.0.0-20190525122359-d20e84d0fb64 - github.com/shirou/gopsutil/v3 v3.22.7 + github.com/sasha-s/go-deadlock v0.2.0 + github.com/shirou/gopsutil/v3 v3.22.12 github.com/shurcooL/httpgzip v0.0.0-20190720172056-320755c1c1b0 github.com/soheilhy/cmux v0.1.5 - github.com/spf13/cobra v1.5.0 + github.com/spf13/cobra v1.6.1 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.8.0 + github.com/spkg/bom v1.0.0 + github.com/stathat/consistent v1.0.0 + github.com/stretchr/testify v1.8.1 github.com/tdakkota/asciicheck v0.1.1 github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2 - github.com/tikv/client-go/v2 v2.0.3-0.20221108030801-9c0835c80eba - github.com/tikv/pd/client v0.0.0-20221031025758-80f0d8ca4d07 - github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144 + github.com/tikv/client-go/v2 v2.0.6-0.20230209044022-95ebf6a86301 + github.com/tikv/pd/client v0.0.0-20230209034200-6d23a31c24be + github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e github.com/twmb/murmur3 v1.1.3 github.com/uber/jaeger-client-go v2.22.1+incompatible github.com/vbauerster/mpb/v7 v7.5.3 @@ -100,46 +106,50 @@ require ( go.etcd.io/etcd/client/v3 v3.5.2 go.etcd.io/etcd/server/v3 v3.5.2 go.etcd.io/etcd/tests/v3 v3.5.2 - go.opencensus.io v0.23.0 + go.opencensus.io v0.24.0 go.uber.org/atomic v1.10.0 go.uber.org/automaxprocs v1.4.0 go.uber.org/goleak v1.2.0 - go.uber.org/multierr v1.8.0 - go.uber.org/zap v1.23.0 - golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e - golang.org/x/net v0.1.0 - golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 - golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 - golang.org/x/sys v0.1.0 - golang.org/x/term v0.1.0 - golang.org/x/text v0.4.0 - golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 - golang.org/x/tools v0.1.12 - google.golang.org/api v0.74.0 - google.golang.org/grpc v1.45.0 + go.uber.org/multierr v1.9.0 + go.uber.org/zap v1.24.0 + golang.org/x/exp v0.0.0-20221023144134-a1e5550cf13e + golang.org/x/net v0.6.0 + golang.org/x/oauth2 v0.5.0 + golang.org/x/sync v0.1.0 + golang.org/x/sys v0.5.0 + golang.org/x/term v0.5.0 + golang.org/x/text v0.7.0 + golang.org/x/time v0.3.0 + golang.org/x/tools v0.5.0 + google.golang.org/api v0.103.0 + google.golang.org/grpc v1.52.3 gopkg.in/yaml.v2 v2.4.0 - honnef.co/go/tools v0.3.3 + honnef.co/go/tools v0.4.0 sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67 ) require ( - cloud.google.com/go v0.100.2 // indirect - cloud.google.com/go/compute v1.5.0 // indirect - cloud.google.com/go/iam v0.1.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v0.20.0 // indirect + cloud.google.com/go v0.105.0 // indirect + cloud.google.com/go/compute v1.13.0 // indirect + cloud.google.com/go/compute/metadata v0.2.1 // indirect + cloud.google.com/go/iam v0.8.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.1 // indirect github.com/DataDog/zstd v1.4.5 // indirect github.com/HdrHistogram/hdrhistogram-go v1.1.2 // indirect + github.com/Masterminds/goutils v1.1.1 // indirect + github.com/Masterminds/semver/v3 v3.1.1 // indirect + github.com/Masterminds/sprig/v3 v3.2.2 // indirect github.com/VividCortex/ewma v1.2.0 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect github.com/apache/thrift v0.13.1-0.20201008052519-daf620915714 // indirect github.com/benbjohnson/clock v1.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bmatcuk/doublestar/v2 v2.0.4 // indirect github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/chavacava/garif v0.0.0-20220630083739-93517212f375 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/chavacava/garif v0.0.0-20221024190013-b3ef35877348 // indirect github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f // indirect github.com/cockroachdb/redact v1.0.8 // indirect github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 // indirect @@ -162,8 +172,10 @@ require ( github.com/goccy/go-json v0.9.11 // indirect github.com/golang/glog v1.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/google/go-cmp v0.5.8 // indirect - github.com/googleapis/gax-go/v2 v2.2.0 // indirect + github.com/google/go-cmp v0.5.9 // indirect + github.com/google/licensecheck v0.3.1 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect + github.com/googleapis/gax-go/v2 v2.7.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/gorilla/websocket v1.4.2 // indirect github.com/gostaticanalysis/analysisutil v0.7.1 // indirect @@ -172,7 +184,9 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/hashicorp/go-uuid v1.0.2 // indirect github.com/hexops/gotextdiff v1.0.3 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/huandu/xstrings v1.3.1 // indirect + github.com/imdario/mergo v0.3.11 // indirect + github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect github.com/jcmturner/gofork v1.0.0 // indirect @@ -191,9 +205,11 @@ require ( github.com/lestrrat-go/option v1.0.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mitchellh/copystructure v1.0.0 // indirect + github.com/mitchellh/reflectwalk v1.0.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 // indirect @@ -201,23 +217,29 @@ require ( github.com/ngaut/sync2 v0.0.0-20141008032647-7a24ed77b2ef // indirect github.com/oklog/ulid v1.3.1 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/onsi/gomega v1.23.0 // indirect + github.com/petermattis/goid v0.0.0-20211229010228-4d14c490ee36 // indirect github.com/pierrec/lz4 v2.6.1+incompatible // indirect + github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712 // indirect github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989 // indirect github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/procfs v0.8.0 // indirect + github.com/prometheus/procfs v0.9.0 // indirect github.com/prometheus/tsdb v0.8.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect - github.com/rivo/uniseg v0.4.2 // indirect + github.com/rivo/uniseg v0.4.3 // indirect github.com/rogpeppe/go-internal v1.6.1 // indirect + github.com/shopspring/decimal v1.2.0 // indirect github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 // indirect github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd // indirect github.com/sirupsen/logrus v1.9.0 // indirect - github.com/stathat/consistent v1.0.0 // indirect - github.com/tklauser/go-sysconf v0.3.10 // indirect - github.com/tklauser/numcpus v0.4.0 // indirect + github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/tiancaiamao/gp v0.0.0-20221230034425-4025bc8a4d4a // indirect + github.com/tklauser/go-sysconf v0.3.11 // indirect + github.com/tklauser/numcpus v0.6.0 // indirect github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect @@ -236,16 +258,16 @@ require ( go.opentelemetry.io/otel/sdk/metric v0.20.0 // indirect go.opentelemetry.io/otel/trace v0.20.0 // indirect go.opentelemetry.io/proto/otlp v0.7.0 // indirect - golang.org/x/crypto v0.1.0 // indirect - golang.org/x/exp/typeparams v0.0.0-20220613132600-b0d781184e0d // indirect - golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f // indirect + golang.org/x/crypto v0.5.0 // indirect + golang.org/x/exp/typeparams v0.0.0-20221208152030-732eee02a75a // indirect + golang.org/x/mod v0.7.0 // indirect + golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb // indirect + google.golang.org/genproto v0.0.0-20230202175211-008b39050e57 // indirect google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - sigs.k8s.io/yaml v1.2.0 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect ) replace ( diff --git a/go.sum b/go.sum index 0730b5193bd55..02b512ade19d3 100644 --- a/go.sum +++ b/go.sum @@ -13,38 +13,24 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2 h1:t9Iw5QH5v4XtlEQaCtUY7x6sCABps8sW0acw7e2WQ6Y= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.105.0 h1:DNtEKRBAAzeS4KyIory52wWHuClNaXJ5x1F7xa4q+5Y= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0 h1:b1zWmYuuHz7gO9kDcM/EpHGr06UgsYNRpNJzI2kFiLM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.13.0 h1:AYrLkB8NPdDRslNp4Jxmzrhdr03fUAIDbiGFjLWowoU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/iam v0.1.1 h1:4CapQyNFjiksks1/x7jsvsygFPhihslYk5GptIrlX68= -cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= +cloud.google.com/go/iam v0.8.0 h1:E2osAkZzxI/+8pZcxVLcDtAQx/u+hZXVryUaYQ5O0Kk= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/longrunning v0.3.0 h1:NjljC+FYPV3uh5/OwWT6pVU+doBqMg2x/rZlE+CamDs= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -54,8 +40,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.21.0 h1:HwnT2u2D309SFDHQII6m18HlrCi3jAXhUMTLOWXYH14= -cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= +cloud.google.com/go/storage v1.27.0 h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= contrib.go.opencensus.io/exporter/ocagent v0.4.12/go.mod h1:450APlNTSR6FrvC3CTRqYosuDstRB9un7SOx2k/9ckA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= @@ -70,8 +56,8 @@ github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.2.0 h1:62Ew5xXg5UCGIXDOM github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.2.0/go.mod h1:eHWhQKXc1Gv1DvWH//UzgWjWFEo0Pp4pH2vBzjBw8Fc= github.com/Azure/go-autorest v11.2.8+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0= -github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= +github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= @@ -85,8 +71,14 @@ github.com/Jeffail/gabs/v2 v2.5.1 h1:ANfZYjpMlfTTKebycu4X1AgkVWumFVDYQl7JwOr4mDk github.com/Jeffail/gabs/v2 v2.5.1/go.mod h1:xCn81vdHKxFUuWWAaD5jCTQDNPBMh5pPs9IJ+NcziBI= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= +github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= +github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.5 h1:zl/OfRA6nftbBK9qTohYBJ5xvw6C/oNKizR7cZGl3cI= github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= @@ -111,8 +103,9 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2c github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/aliyun/alibaba-cloud-sdk-go v1.61.1581 h1:Q/yk4z/cHUVZfgTqtD09qeYBxHwshQAjVRX73qs8UH0= github.com/aliyun/alibaba-cloud-sdk-go v1.61.1581/go.mod h1:RcDobYh8k5VP6TNybz9m++gL3ijVI5wueVr0EM10VsU= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/skywalking-eyes v0.4.0 h1:O13kdRU6FCEZevfD01mdhTgCZLLfPZIQ0GXZrLl7FpQ= +github.com/apache/skywalking-eyes v0.4.0/go.mod h1:WblDbBgOLsLN0FJEBa9xj6PhuUA/J6spKYVTG4/F8Ls= github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.1-0.20201008052519-daf620915714 h1:Jz3KVLYY5+JO7rDiX0sAuRGtuv2vG01r17Y9nLMWNUw= github.com/apache/thrift v0.13.1-0.20201008052519-daf620915714/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -140,6 +133,8 @@ github.com/biogo/store v0.0.0-20160505134755-913427a1d5e8/go.mod h1:Iev9Q3MErcn+ github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blacktear23/go-proxyprotocol v1.0.2 h1:zR7PZeoU0wAkElcIXenFiy3R56WB6A+UEVi4c6RH8wo= github.com/blacktear23/go-proxyprotocol v1.0.2/go.mod h1:FSCbgnRZrQXazBLL5snfBbrcFSMtcmUDhSRb9OfFA1o= +github.com/bmatcuk/doublestar/v2 v2.0.4 h1:6I6oUiT/sU27eE2OFcWqBhL1SwjyvQuOssxT4a1yidI= +github.com/bmatcuk/doublestar/v2 v2.0.4/go.mod h1:QMmcs3H2AUQICWhfzLXz+IYln8lRQmTZRptLie8RgRw= github.com/carlmjohnson/flagext v0.21.0 h1:/c4uK3ie786Z7caXLcIMvePNSSiH3bQVGDvmGLMme60= github.com/carlmjohnson/flagext v0.21.0/go.mod h1:Eenv0epIUAr4NuedNmkzI8WmBmjIxZC239XcKxYS2ac= github.com/cenk/backoff v2.0.0+incompatible/go.mod h1:7FtoeaSnHoZnmZzz47cM35Y9nSW7tNyaidugnHTaFDE= @@ -151,12 +146,13 @@ github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6 github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charithe/durationcheck v0.0.9 h1:mPP4ucLrf/rKZiIG/a9IPXHGlh8p4CzgpyTy6EEutYk= github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= -github.com/chavacava/garif v0.0.0-20220630083739-93517212f375 h1:E7LT642ysztPWE0dfz43cWOvMiF42DyTRC+eZIaO4yI= -github.com/chavacava/garif v0.0.0-20220630083739-93517212f375/go.mod h1:4m1Rv7xfuwWPNKXlThldNuJvutYM6J95wNuuVmn55To= +github.com/chavacava/garif v0.0.0-20221024190013-b3ef35877348 h1:cy5GCEZLUCshCGCRRUjxHrDUqkB4l5cuUt3ShEckQEo= +github.com/chavacava/garif v0.0.0-20221024190013-b3ef35877348/go.mod h1:f/miWtG3SSuTxKsNK3o58H1xl+XV6ZIfbC6p7lPPB8U= github.com/cheggaaa/pb/v3 v3.0.8 h1:bC8oemdChbke2FHIIGy9mn4DPJ2caZYQnfbRqwmdCoA= github.com/cheggaaa/pb/v3 v3.0.8/go.mod h1:UICbiLec/XO6Hw6k+BHEtHeQFzzBH4i2/qk/ow1EJTA= github.com/cheynewallace/tabby v1.1.1 h1:JvUR8waht4Y0S3JF17G6Vhyt+FRhnqVCkk8l4YrOU54= @@ -165,14 +161,10 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudfoundry/gosigar v1.3.6 h1:gIc08FbB3QPb+nAQhINIK/qhf5REKkY0FTGgRGXkcVc= +github.com/cloudfoundry/gosigar v1.3.6/go.mod h1:lNWstu5g5gw59O09Y+wsMNFzBSnU8a0u+Sfx4dq360E= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/cmux v0.0.0-20170110192607-30d10be49292/go.mod h1:qRiX68mZX1lGBkTWyp3CLcenw9I94W2dLeRvMzcn9N4= github.com/cockroachdb/cockroach v0.0.0-20170608034007-84bc9597164f/go.mod h1:xeT/CQ0qZHangbYbWShlCGAx31aV4AjGswDUjhKS6HQ= @@ -215,13 +207,14 @@ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 h1:iwZdTE0PVqJCos1vaoKsclOGD3ADKpshg3SRtYBbwso= github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= -github.com/daixiang0/gci v0.6.3 h1:wUAqXChk8HbwXn8AfxD9DYSCp9Bpz1L3e6Q4Roe+q9E= -github.com/daixiang0/gci v0.6.3/go.mod h1:EpVfrztufwVgQRXjnX4zuNinEpLj5OmMjtu/+MB0V0c= +github.com/daixiang0/gci v0.9.0 h1:t8XZ0vK6l0pwPoOmoGyqW2NwQlvbpAQNVvu/GRBgykM= +github.com/daixiang0/gci v0.9.0/go.mod h1:EpVfrztufwVgQRXjnX4zuNinEpLj5OmMjtu/+MB0V0c= github.com/danjacques/gofslock v0.0.0-20191023191349-0a45f885bc37 h1:X6mKGhCFOxrKeeHAjv/3UvT6e5RRxW6wRdlqlV6/H4w= github.com/danjacques/gofslock v0.0.0-20191023191349-0a45f885bc37/go.mod h1:DC3JtzuG7kxMvJ6dZmf2ymjNyoXwgtklr7FN+Um2B0U= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -231,8 +224,8 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgraph-io/ristretto v0.1.1-0.20220403145359-8e850b710d6d h1:Wrc3UKTS+cffkOx0xRGFC+ZesNuTfn0ThvEC72N0krk= -github.com/dgraph-io/ristretto v0.1.1-0.20220403145359-8e850b710d6d/go.mod h1:RAy2GVV4sTWVlNMavv3xhLsk18rxhfhDnombTe6EF5c= +github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= +github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= @@ -259,11 +252,8 @@ github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FM github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= @@ -274,8 +264,8 @@ github.com/fatanugraha/noloopclosure v0.1.1 h1:AhepjAikNpk50qTZoipHZqeZtnyKT/C2T github.com/fatanugraha/noloopclosure v0.1.1/go.mod h1:Mi9CiG5QvEgvPLtZLsTzjYwjIDnWAbo10r0BG7JpJII= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= +github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= @@ -289,11 +279,11 @@ github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoD github.com/form3tech-oss/jwt-go v3.2.6-0.20210809144907-32ab6a8243d7+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsouza/fake-gcs-server v1.19.0 h1:XyaGOlqo+R5sjT03x2ymk0xepaQlgwhRLTT2IopW0zA= github.com/fsouza/fake-gcs-server v1.19.0/go.mod h1:JtXHY/QzHhtyIxsNfIuQ+XgHtRb5B/w8nqbL5O8zqo0= github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= @@ -315,7 +305,6 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= @@ -327,8 +316,8 @@ github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= @@ -365,7 +354,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v0.0.0-20180814211427-aa810b61a9c7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -393,14 +381,14 @@ github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a h1:iR3fYXUjHCR97qWS8ch1y9zPNsgXThGwjKPrYfqMPks= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.49.0 h1:I8WHOavragDttlLHtSraHn/h39C+R60bEQ5NoGcHQr8= -github.com/golangci/golangci-lint v1.49.0/go.mod h1:+V/7lLv449R6w9mQ3WdV0EKh7Je/jTylMeSwBZcLeWE= +github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 h1:amWTbTGqOZ71ruzrdA+Nx5WA3tV1N0goTspwmKCQvBY= +github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2/go.mod h1:9wOXstvyDRshQ9LggQuzBCGysxs3b6Uo/1MvYCR2NMs= +github.com/golangci/golangci-lint v1.51.0 h1:M1bpDymgdaPKNzPwQdebCGki/nzvVkr2f/eUfk9C9oU= +github.com/golangci/golangci-lint v1.51.0/go.mod h1:7taIMcmZ5ksCuRruCV/mm8Ir3sE+bIuOHVCvt1B4hi4= github.com/golangci/gosec v0.0.0-20180901114220-8afd9cbb6cfb h1:Bi7BYmZVg4C+mKGi8LeohcP2GGUl2XJD4xCkJoZSaYc= github.com/golangci/gosec v0.0.0-20180901114220-8afd9cbb6cfb/go.mod h1:ON/c2UR0VAAv6ZEAFKhjCLplESSmRFfZcDLASbI1GWo= -github.com/golangci/misspell v0.3.5 h1:pLzmVdl3VxTOncgzHcvLOKirdvcx/TydsClUQXTehjo= -github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/misspell v0.4.0 h1:KtVB/hTK4bbL/S6bs64rYyk8adjmh1BygbBiaAiX+a0= +github.com/golangci/misspell v0.4.0/go.mod h1:W6O/bwV6lGDxUCChm2ykw9NQdd5bYd1Xkjo88UcWyJc= github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 h1:leSNB7iYzLYSSx3J/s5sVf4Drkc68W2wm4Ixh/mr0us= github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= @@ -421,18 +409,19 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-github/v33 v33.0.0/go.mod h1:GMdDnVZY/2TsWgp/lkYnpSAh6TrzhANBBwm6k6TTEXg= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/licensecheck v0.3.1 h1:QoxgoDkaeC4nFrtGN1jV7IPmDCHFNIVh54e5hSt6sPs= +github.com/google/licensecheck v0.3.1/go.mod h1:ORkR35t/JjW+emNKtfJDII0zlciG9JgbT7SmsohlHmY= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20180605153948-8b03ce837f34/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -441,25 +430,19 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20211122183932-1daafda22083 h1:c8EUapQFi+kjzedr4c6WqbwMdmB95+oDBWZ5XFHFYxY= github.com/google/pprof v0.0.0-20211122183932-1daafda22083/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.2.0 h1:y8Yozv7SZtlU//QXbezB6QkpuE6jMD2/gfzk4AftXjs= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0 h1:s7jOdKSaksJVOxE0Y/S32otcfiP+UQ0cL8/GTKaONwE= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.0.0-20190301152420-fca40860790e/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -476,7 +459,6 @@ github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/z github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= github.com/gostaticanalysis/comment v1.4.2 h1:hlnx5+S2fY9Zo9ePo4AhgYsYHbM2+eAv8m/s1JiCd6Q= @@ -492,7 +474,6 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92Bcuy github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= @@ -527,15 +508,19 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/xstrings v1.3.1 h1:4jgBlKK6tLKFvO8u5pmYjG91cqytmDCDvGh7ECVFfFs= +github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= +github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb v0.0.0-20170331210902-15e594fc09f1/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= @@ -601,8 +586,8 @@ github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiD github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/errcheck v1.6.2 h1:uGQ9xI8/pgc9iOoCe7kWQgRE6SBTrCGmTSf0LrEtY7c= -github.com/kisielk/errcheck v1.6.2/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= +github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8= +github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= @@ -611,8 +596,8 @@ github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0 github.com/klauspost/compress v1.10.5/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.13 h1:NFn1Wr8cfnenSJSA46lLq4wHCcBzKTSjnBIexDMMOV0= +github.com/klauspost/compress v1.15.13/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s= github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= @@ -628,8 +613,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kyoh86/exportloopref v0.1.8 h1:5Ry/at+eFdkX9Vsdw3qU4YkvGtzuVfzT4X7S77LoN/M= -github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= +github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ= +github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/lestrrat-go/blackmagic v1.0.1 h1:lS5Zts+5HIC/8og6cGHb0uCcNCa3OUt1ygh3Qz2Fe80= @@ -653,7 +638,6 @@ github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -661,9 +645,9 @@ github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= @@ -671,17 +655,20 @@ github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/maxatome/go-testdeep v1.11.0 h1:Tgh5efyCYyJFGUYiT0qxBSIDeXw0F5zSoatlou685kk= github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= -github.com/mgechev/revive v1.2.4 h1:+2Hd/S8oO2H0Ikq2+egtNwQsVhAeELHjxjIUFX5ajLI= -github.com/mgechev/revive v1.2.4/go.mod h1:iAWlQishqCuj4yhV24FTnKSXGpbAA+0SckXB8GQMX/Q= +github.com/mgechev/revive v1.2.5 h1:UF9AR8pOAuwNmhXj2odp4mxv9Nx2qUIwVz8ZsU+Mbec= +github.com/mgechev/revive v1.2.5/go.mod h1:nFOXent79jMTISAfOAasKfy0Z2Ejq0WX7Qn/KAdYopI= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.10/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= @@ -690,6 +677,8 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= @@ -719,8 +708,8 @@ github.com/ngaut/sync2 v0.0.0-20141008032647-7a24ed77b2ef/go.mod h1:7WjlapSfwQyo github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -733,7 +722,8 @@ github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1ls github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= +github.com/onsi/gomega v1.23.0 h1:/oxKu9c2HVap+F3PfKort2Hw5DEU+HGlW8n+tguWsys= +github.com/onsi/gomega v1.23.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= github.com/opentracing-contrib/go-stdlib v0.0.0-20170113013457-1de4cc2120e7/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= @@ -752,43 +742,43 @@ github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwp github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/g2s v0.0.0-20170223122336-d4e7ad98afea/go.mod h1:1VcHEd3ro4QMoHfiNl/j7Jkln9+KQuorp0PItHMJYNg= github.com/petermattis/goid v0.0.0-20170504144140-0ded85884ba5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= +github.com/petermattis/goid v0.0.0-20211229010228-4d14c490ee36 h1:64bxqeTEN0/xoEqhKGowgihNuzISS9rEG6YUMU4bzJo= +github.com/petermattis/goid v0.0.0-20211229010228-4d14c490ee36/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pierrec/lz4 v2.6.0+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pingcap/badger v1.5.1-0.20220314162537-ab58fbf40580 h1:MKVFZuqFvAMiDtv3AbihOQ6rY5IE8LWflI1BuZ/hF0Y= -github.com/pingcap/badger v1.5.1-0.20220314162537-ab58fbf40580/go.mod h1:upwDfet29M5y5koWilbWWA6ca3Lr0YVuzwX/DK58Vdk= +github.com/pingcap/badger v1.5.1-0.20230103063557-828f39b09b6d h1:AEcvKyVM8CUII3bYzgz8haFXtGiqcrtXW1csu/5UELY= +github.com/pingcap/badger v1.5.1-0.20230103063557-828f39b09b6d/go.mod h1:p8QnkZnmyV8L/M/jzYb8rT7kv3bz9m7bn1Ju94wDifs= github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ= -github.com/pingcap/check v0.0.0-20191107115940-caf2b9e6ccf4 h1:iRtOAQ6FXkY/BGvst3CDfTva4nTqh6CL8WXvanLdbu0= github.com/pingcap/check v0.0.0-20191107115940-caf2b9e6ccf4/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc= +github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712 h1:R8gStypOBmpnHEx1qi//SaqxJVI4inOqljg/Aj5/390= +github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc= github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pingcap/errors v0.11.5-0.20211224045212-9687c2b0f87c/go.mod h1:X2r9ueLEUZgtx2cIogM0v4Zj5uvvzhuuiu7Pn8HzMPg= -github.com/pingcap/errors v0.11.5-0.20220729040631-518f63d66278 h1:3Dm0DWeQlwV8LbpQxP2tojHhxd9aY59KI+QN0ns6bBo= -github.com/pingcap/errors v0.11.5-0.20220729040631-518f63d66278/go.mod h1:X2r9ueLEUZgtx2cIogM0v4Zj5uvvzhuuiu7Pn8HzMPg= +github.com/pingcap/errors v0.11.5-0.20221009092201-b66cddb77c32 h1:m5ZsBa5o/0CkzZXfXLaThzKuR85SnHHetqBCpzQ30h8= +github.com/pingcap/errors v0.11.5-0.20221009092201-b66cddb77c32/go.mod h1:X2r9ueLEUZgtx2cIogM0v4Zj5uvvzhuuiu7Pn8HzMPg= github.com/pingcap/failpoint v0.0.0-20210918120811-547c13e3eb00/go.mod h1:4qGtCB0QK0wBzKtFEGDhxXnSnbQApw1gc9siScUl8ew= -github.com/pingcap/failpoint v0.0.0-20220423142525-ae43b7f4e5c3 h1:kJolJWbyadVeL8RKBlqmXQR7FRKPsIeU85TUYyhbhiQ= -github.com/pingcap/failpoint v0.0.0-20220423142525-ae43b7f4e5c3/go.mod h1:4qGtCB0QK0wBzKtFEGDhxXnSnbQApw1gc9siScUl8ew= +github.com/pingcap/failpoint v0.0.0-20220801062533-2eaa32854a6c h1:CgbKAHto5CQgWM9fSBIvaxsJHuGP0uM74HXtv3MyyGQ= +github.com/pingcap/failpoint v0.0.0-20220801062533-2eaa32854a6c/go.mod h1:4qGtCB0QK0wBzKtFEGDhxXnSnbQApw1gc9siScUl8ew= github.com/pingcap/fn v0.0.0-20200306044125-d5540d389059 h1:Pe2LbxRmbTfAoKJ65bZLmhahmvHm7n9DUxGRQT00208= github.com/pingcap/fn v0.0.0-20200306044125-d5540d389059/go.mod h1:fMRU1BA1y+r89AxUoaAar4JjrhUkVDt0o0Np6V8XbDQ= github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989 h1:surzm05a8C9dN8dIUmo4Be2+pMRb6f55i+UIYrluu2E= github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989/go.mod h1:O17XtbryoCJhkKGbT62+L2OlrniwqiGLSqrmdHCMzZw= github.com/pingcap/kvproto v0.0.0-20191211054548-3c6b38ea5107/go.mod h1:WWLmULLO7l8IOcQG+t+ItJ3fEcrL5FxF0Wu+HrMy26w= -github.com/pingcap/kvproto v0.0.0-20221026112947-f8d61344b172/go.mod h1:OYtxs0786qojVTmkVeufx93xe+jUgm56GUYRIKnmaGI= -github.com/pingcap/kvproto v0.0.0-20221103025916-e7e21f0e9cd9 h1:ho5XUD8DVCnkpEj8oiTR57FXDTXnH6znyLe0gyrtzKk= -github.com/pingcap/kvproto v0.0.0-20221103025916-e7e21f0e9cd9/go.mod h1:OYtxs0786qojVTmkVeufx93xe+jUgm56GUYRIKnmaGI= +github.com/pingcap/kvproto v0.0.0-20230206112125-0561adc37543 h1:QcC52K9hhsP6eVmQBnSMI/b8TiOUVztbaeduTXspmeQ= +github.com/pingcap/kvproto v0.0.0-20230206112125-0561adc37543/go.mod h1:+on3Lfk/fb1lXkud3XvskJumhSIEEgN2TTbMObUlrxE= github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= -github.com/pingcap/log v0.0.0-20200511115504-543df19646ad/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= github.com/pingcap/log v0.0.0-20210625125904-98ed8e2eb1c7/go.mod h1:8AanEdAHATuRurdGxZXBz0At+9avep+ub7U1AGYLIMM= -github.com/pingcap/log v1.1.1-0.20221015072633-39906604fb81/go.mod h1:DWQW5jICDR7UJh4HtxXSM20Churx4CQL0fwL/SoOSA4= -github.com/pingcap/log v1.1.1-0.20221110065318-21a4942860b3 h1:T7e5Low0BU2ZazI2dz2mh3W1qv+w8wtvq1YR8DneA0c= -github.com/pingcap/log v1.1.1-0.20221110065318-21a4942860b3/go.mod h1:DWQW5jICDR7UJh4HtxXSM20Churx4CQL0fwL/SoOSA4= +github.com/pingcap/log v1.1.0/go.mod h1:DWQW5jICDR7UJh4HtxXSM20Churx4CQL0fwL/SoOSA4= +github.com/pingcap/log v1.1.1-0.20221116035753-734d527bc87c h1:crhkw6DD+07Bg1wYhW5Piw+kYNKZqFQqfC2puUf6gMI= +github.com/pingcap/log v1.1.1-0.20221116035753-734d527bc87c/go.mod h1:DWQW5jICDR7UJh4HtxXSM20Churx4CQL0fwL/SoOSA4= github.com/pingcap/sysutil v0.0.0-20220114020952-ea68d2dbf5b4 h1:HYbcxtnkN3s5tqrZ/z3eJS4j3Db8wMphEm1q10lY/TM= github.com/pingcap/sysutil v0.0.0-20220114020952-ea68d2dbf5b4/go.mod h1:sDCsM39cGiv2vwunZkaFA917vVkqDTGSPbbV7z4Oops= -github.com/pingcap/tipb v0.0.0-20221020071514-cd933387bcb5 h1:Yoo8j5xQGxjlsC3yt0ndsiAz0WZXED9rzsKmEN0U0DY= -github.com/pingcap/tipb v0.0.0-20221020071514-cd933387bcb5/go.mod h1:A7mrd7WHBl1o63LE2bIBGEJMTNWXqhgmYiOvMLxozfs= +github.com/pingcap/tipb v0.0.0-20230119054146-c6b7a5a1623b h1:j5sw2YZY7QfgIFZEoUcn1P5cYflms1PCVVS96i+IQiI= +github.com/pingcap/tipb v0.0.0-20230119054146-c6b7a5a1623b/go.mod h1:A7mrd7WHBl1o63LE2bIBGEJMTNWXqhgmYiOvMLxozfs= github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4 h1:49lOXmGaUpV9Fz3gd7TFZY106KVlPVa5jcYD1gaQf98= github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -807,31 +797,29 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.13.0 h1:b71QUfeo5M8gq2+evJdTPfZhYMAU0uKPkyPJ7TPsloU= -github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= +github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= +github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/prometheus/prometheus v0.0.0-20190525122359-d20e84d0fb64 h1:3DyLm+sTAJkfLyR/1pJ3L+fU2lFufWbpcgMFlGtqeyA= github.com/prometheus/prometheus v0.0.0-20190525122359-d20e84d0fb64/go.mod h1:oYrT4Vs22/NcnoVYXt5m4cIHP+znvgyusahVpyETKTw= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= @@ -843,8 +831,8 @@ github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6O github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.2 h1:YwD0ulJSJytLpiaWua0sBDusfsCZohxjxzVTYjwxfV8= -github.com/rivo/uniseg v0.4.2/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= +github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rlmcpherson/s3gof3r v0.5.0/go.mod h1:s7vv7SMDPInkitQMuZzH615G7yWHdrU2r/Go7Bo71Rs= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= @@ -859,14 +847,18 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20161028232340-1d7be4effb13/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sasha-s/go-deadlock v0.0.0-20161201235124-341000892f3d/go.mod h1:StQn567HiB1fF2yJ44N9au7wOhrPS3iZqiDbRupzT10= +github.com/sasha-s/go-deadlock v0.2.0 h1:lMqc+fUb7RrFS3gQLtoQsJ7/6TV/pAIFvBsqX73DK8Y= +github.com/sasha-s/go-deadlock v0.2.0/go.mod h1:StQn567HiB1fF2yJ44N9au7wOhrPS3iZqiDbRupzT10= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil/v3 v3.21.12/go.mod h1:BToYZVTlSVlfazpDDYFnsVZLaoRG+g8ufT6fPQLdJzA= -github.com/shirou/gopsutil/v3 v3.22.7 h1:flKnuCMfUUrO+oAvwAd6GKZgnPzr098VA/UJ14nhJd4= -github.com/shirou/gopsutil/v3 v3.22.7/go.mod h1:s648gW4IywYzUfE/KjXxUsqrqx/T2xO5VqOXxONeRfI= +github.com/shirou/gopsutil/v3 v3.22.12 h1:oG0ns6poeUSxf78JtOsfygNWuEHYYz8hnnNg7P04TJs= +github.com/shirou/gopsutil/v3 v3.22.12/go.mod h1:Xd7P1kwZcp5VW52+9XsirIKd/BROzbb2wdX3Kqlz9uI= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= @@ -880,6 +872,7 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= @@ -888,26 +881,34 @@ github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9 github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= +github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= +github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spkg/bom v1.0.0 h1:S939THe0ukL5WcTGiGqkgtaW5JW+O6ITaIlpJXTYY64= +github.com/spkg/bom v1.0.0/go.mod h1:lAz2VbTuYNcvs7iaFF8WW0ufXrHShJ7ck1fYFFbVXJs= github.com/stathat/consistent v1.0.0 h1:ZFJ1QTRn8npNBKW065raSZ8xfOqhpb8vLOkfp4CcL/U= github.com/stathat/consistent v1.0.0/go.mod h1:uajTPbgSygZBJ+V+0mY7meZ8i0XAcZs7AQ6V121XSxw= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -916,8 +917,9 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tdakkota/asciicheck v0.1.1 h1:PKzG7JUTUmVspQTDqtkX9eSiLGossXTybutHwTXuO0A= github.com/tdakkota/asciicheck v0.1.1/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= @@ -927,18 +929,20 @@ github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpR github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2 h1:mbAskLJ0oJfDRtkanvQPiooDH8HvJ2FBh+iKT/OmiQQ= github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2/go.mod h1:2PfKggNGDuadAa0LElHrByyrz4JPZ9fFx6Gs7nx7ZZU= -github.com/tikv/client-go/v2 v2.0.3-0.20221108030801-9c0835c80eba h1:nFVdyTXcQYZwQQCdSJcFI1vBFyzG1hVuZ39MAK6wqK4= -github.com/tikv/client-go/v2 v2.0.3-0.20221108030801-9c0835c80eba/go.mod h1:X9s4ct/MLk1sFqe5mU79KClKegLFDTa/FCx3hzexGtk= -github.com/tikv/pd/client v0.0.0-20221031025758-80f0d8ca4d07 h1:ckPpxKcl75mO2N6a4cJXiZH43hvcHPpqc9dh1TmH1nc= -github.com/tikv/pd/client v0.0.0-20221031025758-80f0d8ca4d07/go.mod h1:CipBxPfxPUME+BImx9MUYXCnAVLS3VJUr3mnSJwh40A= -github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144 h1:kl4KhGNsJIbDHS9/4U9yQo1UcPQM0kOMJHn29EoH/Ro= -github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/tiancaiamao/gp v0.0.0-20221230034425-4025bc8a4d4a h1:J/YdBZ46WKpXsxsW93SG+q0F8KI+yFrcIDT4c/RNoc4= +github.com/tiancaiamao/gp v0.0.0-20221230034425-4025bc8a4d4a/go.mod h1:h4xBhSNtOeEosLJ4P7JyKXX7Cabg7AVkWCK5gV2vOrM= +github.com/tikv/client-go/v2 v2.0.6-0.20230209044022-95ebf6a86301 h1:kiPiEBubzB2Ef2yPfoItQpjhGepcZSlRyqrXnfs92pQ= +github.com/tikv/client-go/v2 v2.0.6-0.20230209044022-95ebf6a86301/go.mod h1:KMEFxpYwZ3MIvW4lrSy9dXgtrLojw9c9//2XlS5TGzw= +github.com/tikv/pd/client v0.0.0-20230209034200-6d23a31c24be h1:hauBQBHSyrUxAI0zvkTiBKd472c+Iy+aY0Jd+b9VOJ8= +github.com/tikv/pd/client v0.0.0-20230209034200-6d23a31c24be/go.mod h1:ryhYHDwupsZHeOOF/N7So+1hbtAnuw0K2A+pKOElSVs= +github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e h1:MV6KaVu/hzByHP0UvJ4HcMGE/8a6A4Rggc/0wx2AvJo= +github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= -github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= -github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= +github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= +github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= -github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= -github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= +github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= +github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -983,6 +987,7 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -1048,17 +1053,18 @@ go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+ go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.12.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.20.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= -go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1070,6 +1076,7 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1077,8 +1084,10 @@ golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= +golang.org/x/crypto v0.0.0-20220518034528-6f7dac969898/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= +golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1093,10 +1102,10 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= -golang.org/x/exp/typeparams v0.0.0-20220613132600-b0d781184e0d h1:+W8Qf4iJtMGKkyAygcKohjxTk4JPsL9DpzApJ22m5Ic= -golang.org/x/exp/typeparams v0.0.0-20220613132600-b0d781184e0d/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp v0.0.0-20221023144134-a1e5550cf13e h1:SkwG94eNiiYJhbeDE018Grw09HIN/KB9NlRmZsrzfWs= +golang.org/x/exp v0.0.0-20221023144134-a1e5550cf13e/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/exp/typeparams v0.0.0-20221208152030-732eee02a75a h1:Jw5wfR+h9mnIYH+OtGT2im5wV1YGGDora5vTv/aa5bE= +golang.org/x/exp/typeparams v0.0.0-20221208152030-732eee02a75a/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1110,7 +1119,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= @@ -1121,13 +1129,14 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1149,7 +1158,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1167,46 +1175,29 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210427231257-85d9c07bbe3a/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= +golang.org/x/net v0.0.0-20220517181318-183a9ca12b87/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.6.0 h1:L4ZwwTvKW9gr0ZMS1yrHD9GZhIuVjOBBnaKH+SPQK0Q= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE= golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1218,8 +1209,9 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180816055513-1c9583448a9c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1268,72 +1260,58 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220909162455-aba9fc2a8ff2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0 h1:g6Z6vPFA9dYBAF7DWcH6sCcOntplXsDKcliusYijMlw= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 h1:M73Iuj3xbbb9Uk1DYhzydthsj6oOd6l9bpuFcNoUvTs= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1343,11 +1321,9 @@ golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -1388,35 +1364,30 @@ golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201125231158-b5590deeca9b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.5.0 h1:+bSpV5HIeWkuvgaMfI3UmKRThoTA5ODJTUd8T17NO+4= +golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= @@ -1439,29 +1410,8 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= -google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0 h1:ExR2D+5TYIrMphWgs5JCgwRhEDlPDXXrLwHHMgPHTXE= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.103.0 h1:9yuVqlu2JCvcLg9p8S3fcFLZij8EPSyvODIY1rkMizQ= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1479,7 +1429,6 @@ google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= @@ -1503,50 +1452,9 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb h1:0m9wktIpOxGw+SSKmydXWB3Z3GTfcPP6+q75HCQa6HI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20230202175211-008b39050e57 h1:vArvWooPH749rNHpBGgVl+U9B9dATjiEhJzcWGlovNs= +google.golang.org/genproto v0.0.0-20230202175211-008b39050e57/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/grpc v0.0.0-20180607172857-7a6a684ca69e/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -1563,25 +1471,13 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc v1.52.3 h1:pf7sOysg4LdgBqduXveGKrcEwbStiK2rtfghdzlUYDQ= +google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1594,7 +1490,7 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -1618,8 +1514,9 @@ gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mN gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= @@ -1635,6 +1532,7 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20220512140231-539c8e751b99/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1644,8 +1542,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.3.3 h1:oDx7VAwstgpYpb3wv0oxiZlxY+foCpRAwY7Vk6XpAgA= -honnef.co/go/tools v0.3.3/go.mod h1:jzwdWgg7Jdq75wlfblQxO4neNaFFSvgc1tD5Wv8U0Yw= +honnef.co/go/tools v0.4.0 h1:lyXVV1c8wUBJRKqI8JgIpT8TW1VDagfYYaxbKa/HoL8= +honnef.co/go/tools v0.4.0/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= k8s.io/api v0.0.0-20190409021203-6e4e0e4f393b/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= k8s.io/apimachinery v0.0.0-20190404173353-6a84e37a896d/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= @@ -1657,8 +1555,9 @@ rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 h1:ucqkfpjg9WzSUubAO62csmucvxl4/JeW3F4I4909XkM= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67 h1:e1sMhtVq9AfcEy8AXNb8eSg6gbzfdpYhoNqnPJa+GzI= diff --git a/infoschema/BUILD.bazel b/infoschema/BUILD.bazel index 53bf35a2d43e3..20a4f150e4a27 100644 --- a/infoschema/BUILD.bazel +++ b/infoschema/BUILD.bazel @@ -17,6 +17,7 @@ go_library( deps = [ "//config", "//ddl/placement", + "//ddl/resourcegroup", "//domain/infosync", "//errno", "//kv", @@ -50,8 +51,13 @@ go_library( "@com_github_ngaut_pools//:pools", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", + "@com_github_pingcap_kvproto//pkg/diagnosticspb", "@com_github_pingcap_kvproto//pkg/metapb", + "@com_github_pingcap_log//:log", "@com_github_tikv_client_go_v2//tikv", + "@org_golang_google_grpc//:grpc", + "@org_golang_google_grpc//credentials", + "@org_golang_google_grpc//credentials/insecure", "@org_golang_x_exp//slices", "@org_uber_go_zap//:zap", ], @@ -93,8 +99,10 @@ go_test( "//store/helper", "//store/mockstore", "//store/mockstore/mockstorage", + "//store/mockstore/unistore", "//table", "//testkit", + "//testkit/external", "//testkit/testsetup", "//testkit/testutil", "//types", @@ -104,14 +112,17 @@ go_test( "//util/pdapi", "//util/resourcegrouptag", "//util/set", + "//util/stmtsummary", "@com_github_gorilla_mux//:mux", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_fn//:fn", "@com_github_pingcap_kvproto//pkg/deadlock", + "@com_github_pingcap_kvproto//pkg/metapb", "@com_github_pingcap_tipb//go-tipb", "@com_github_prometheus_prometheus//promql", "@com_github_stretchr_testify//require", + "@com_github_tikv_client_go_v2//testutils", "@org_golang_google_grpc//:grpc", "@org_uber_go_goleak//:goleak", ], diff --git a/infoschema/builder.go b/infoschema/builder.go index 8ff50a8b50435..3240e1c5c5c49 100644 --- a/infoschema/builder.go +++ b/infoschema/builder.go @@ -211,14 +211,22 @@ func (b *Builder) ApplyDiff(m *meta.Meta, diff *model.SchemaDiff) ([]int64, erro return b.applyDropPolicy(diff.SchemaID), nil case model.ActionAlterPlacementPolicy: return b.applyAlterPolicy(m, diff) + case model.ActionCreateResourceGroup: + return nil, b.applyCreateOrAlterResourceGroup(m, diff) + case model.ActionAlterResourceGroup: + return nil, b.applyCreateOrAlterResourceGroup(m, diff) + case model.ActionDropResourceGroup: + return b.applyDropResourceGroup(m, diff), nil case model.ActionTruncateTablePartition, model.ActionTruncateTable: return b.applyTruncateTableOrPartition(m, diff) case model.ActionDropTable, model.ActionDropTablePartition: - return b.applyDropTableOrParition(m, diff) + return b.applyDropTableOrPartition(m, diff) case model.ActionRecoverTable: return b.applyRecoverTable(m, diff) case model.ActionCreateTables: return b.applyCreateTables(m, diff) + case model.ActionReorganizePartition: + return b.applyReorganizePartition(m, diff) case model.ActionFlashbackCluster: return []int64{-1}, nil default: @@ -269,7 +277,7 @@ func (b *Builder) applyTruncateTableOrPartition(m *meta.Meta, diff *model.Schema return tblIDs, nil } -func (b *Builder) applyDropTableOrParition(m *meta.Meta, diff *model.SchemaDiff) ([]int64, error) { +func (b *Builder) applyDropTableOrPartition(m *meta.Meta, diff *model.SchemaDiff) ([]int64, error) { tblIDs, err := b.applyTableUpdate(m, diff) if err != nil { return nil, errors.Trace(err) @@ -281,6 +289,22 @@ func (b *Builder) applyDropTableOrParition(m *meta.Meta, diff *model.SchemaDiff) return tblIDs, nil } +func (b *Builder) applyReorganizePartition(m *meta.Meta, diff *model.SchemaDiff) ([]int64, error) { + tblIDs, err := b.applyTableUpdate(m, diff) + if err != nil { + return nil, errors.Trace(err) + } + for _, opt := range diff.AffectedOpts { + if opt.OldTableID != 0 { + b.deleteBundle(b.is, opt.OldTableID) + } + if opt.TableID != 0 { + b.markTableBundleShouldUpdate(opt.TableID) + } + } + return tblIDs, nil +} + func (b *Builder) applyRecoverTable(m *meta.Meta, diff *model.SchemaDiff) ([]int64, error) { tblIDs, err := b.applyTableUpdate(m, diff) if err != nil { @@ -501,13 +525,36 @@ func (b *Builder) copySortedTables(oldTableID, newTableID int64) { } } +func (b *Builder) applyCreateOrAlterResourceGroup(m *meta.Meta, diff *model.SchemaDiff) error { + group, err := m.GetResourceGroup(diff.SchemaID) + if err != nil { + return errors.Trace(err) + } + if group == nil { + return ErrResourceGroupNotExists.GenWithStackByArgs(fmt.Sprintf("(Group ID %d)", diff.SchemaID)) + } + // TODO: need mark updated? + b.is.setResourceGroup(group) + return nil +} + +func (b *Builder) applyDropResourceGroup(m *meta.Meta, diff *model.SchemaDiff) []int64 { + group, ok := b.is.ResourceGroupByID(diff.SchemaID) + if !ok { + return nil + } + b.is.deleteResourceGroup(group.Name.L) + // TODO: return the related information. + return []int64{} +} + func (b *Builder) applyCreatePolicy(m *meta.Meta, diff *model.SchemaDiff) error { po, err := m.GetPolicy(diff.SchemaID) if err != nil { return errors.Trace(err) } if po == nil { - return ErrPlacementPolicyExists.GenWithStackByArgs( + return ErrPlacementPolicyNotExists.GenWithStackByArgs( fmt.Sprintf("(Policy ID %d)", diff.SchemaID), ) } @@ -529,7 +576,7 @@ func (b *Builder) applyAlterPolicy(m *meta.Meta, diff *model.SchemaDiff) ([]int6 } if po == nil { - return nil, ErrPlacementPolicyExists.GenWithStackByArgs( + return nil, ErrPlacementPolicyNotExists.GenWithStackByArgs( fmt.Sprintf("(Policy ID %d)", diff.SchemaID), ) } @@ -667,6 +714,8 @@ func (b *Builder) applyCreateTable(m *meta.Meta, dbInfo *model.DBInfo, tableID i switch tp { case model.ActionDropTablePartition: case model.ActionTruncateTablePartition: + // ReorganizePartition handle the bundles in applyReorganizePartition + case model.ActionReorganizePartition: default: pi := tblInfo.GetPartitionInfo() if pi != nil { @@ -693,18 +742,23 @@ func (b *Builder) applyCreateTable(m *meta.Meta, dbInfo *model.DBInfo, tableID i ConvertCharsetCollateToLowerCaseIfNeed(tblInfo) ConvertOldVersionUTF8ToUTF8MB4IfNeed(tblInfo) - if len(allocs) == 0 { + if len(allocs.Allocs) == 0 { allocs = autoid.NewAllocatorsFromTblInfo(b.store, dbInfo.ID, tblInfo) } else { tblVer := autoid.AllocOptionTableInfoVersion(tblInfo.Version) switch tp { case model.ActionRebaseAutoID, model.ActionModifyTableAutoIdCache: idCacheOpt := autoid.CustomAutoIncCacheOption(tblInfo.AutoIdCache) - newAlloc := autoid.NewAllocator(b.store, dbInfo.ID, tblInfo.ID, tblInfo.IsAutoIncColUnsigned(), autoid.RowIDAllocType, tblVer, idCacheOpt) - allocs = append(allocs, newAlloc) + // If the allocator type might be AutoIncrementType, create both AutoIncrementType + // and RowIDAllocType allocator for it. Because auto id and row id could share the same allocator. + // Allocate auto id may route to allocate row id, if row id allocator is nil, the program panic! + for _, tp := range [2]autoid.AllocatorType{autoid.AutoIncrementType, autoid.RowIDAllocType} { + newAlloc := autoid.NewAllocator(b.store, dbInfo.ID, tblInfo.ID, tblInfo.IsAutoIncColUnsigned(), tp, tblVer, idCacheOpt) + allocs = allocs.Append(newAlloc) + } case model.ActionRebaseAutoRandomBase: newAlloc := autoid.NewAllocator(b.store, dbInfo.ID, tblInfo.ID, tblInfo.IsAutoRandomBitColUnsigned(), autoid.AutoRandomType, tblVer) - allocs = append(allocs, newAlloc) + allocs = allocs.Append(newAlloc) case model.ActionModifyColumn: // Change column attribute from auto_increment to auto_random. if tblInfo.ContainsAutoRandomBits() && allocs.Get(autoid.AutoRandomType) == nil { @@ -713,7 +767,7 @@ func (b *Builder) applyCreateTable(m *meta.Meta, dbInfo *model.DBInfo, tableID i return a.GetType() != autoid.AutoIncrementType && a.GetType() != autoid.RowIDAllocType }) newAlloc := autoid.NewAllocator(b.store, dbInfo.ID, tblInfo.ID, tblInfo.IsAutoRandomBitColUnsigned(), autoid.AutoRandomType, tblVer) - allocs = append(allocs, newAlloc) + allocs = allocs.Append(newAlloc) } } } @@ -824,6 +878,7 @@ func (b *Builder) InitWithOldInfoSchema(oldSchema InfoSchema) *Builder { b.copySchemasMap(oldIS) b.copyBundlesMap(oldIS) b.copyPoliciesMap(oldIS) + b.copyResourceGroupMap(oldIS) b.copyTemporaryTableIDsMap(oldIS) b.copyReferredForeignKeyMap(oldIS) @@ -851,6 +906,13 @@ func (b *Builder) copyPoliciesMap(oldIS *infoSchema) { } } +func (b *Builder) copyResourceGroupMap(oldIS *infoSchema) { + is := b.is + for _, v := range oldIS.AllResourceGroups() { + is.resourceGroupMap[v.Name.L] = v + } +} + func (b *Builder) copyTemporaryTableIDsMap(oldIS *infoSchema) { is := b.is if len(oldIS.temporaryTableIDs) == 0 { @@ -892,7 +954,7 @@ func (b *Builder) getSchemaAndCopyIfNecessary(dbName string) *model.DBInfo { } // InitWithDBInfos initializes an empty new InfoSchema with a slice of DBInfo, all placement rules, and schema version. -func (b *Builder) InitWithDBInfos(dbInfos []*model.DBInfo, policies []*model.PolicyInfo, schemaVersion int64) (*Builder, error) { +func (b *Builder) InitWithDBInfos(dbInfos []*model.DBInfo, policies []*model.PolicyInfo, resourceGroups []*model.ResourceGroupInfo, schemaVersion int64) (*Builder, error) { info := b.is info.schemaMetaVersion = schemaVersion // build the policies. @@ -900,6 +962,11 @@ func (b *Builder) InitWithDBInfos(dbInfos []*model.DBInfo, policies []*model.Pol info.setPolicy(policy) } + // build the groups. + for _, group := range resourceGroups { + info.setResourceGroup(group) + } + // Maintain foreign key reference information. for _, di := range dbInfos { for _, t := range di.Tables { @@ -1003,6 +1070,7 @@ func NewBuilder(store kv.Storage, factory func() (pools.Resource, error)) *Build is: &infoSchema{ schemaMap: map[string]*schemaTables{}, policyMap: map[string]*model.PolicyInfo{}, + resourceGroupMap: map[string]*model.ResourceGroupInfo{}, ruleBundleMap: map[int64]*placement.Bundle{}, sortedTablesBuckets: make([]sortedTables, bucketCount), referredForeignKeyMap: make(map[SchemaAndTableName][]*model.ReferredFKInfo), diff --git a/infoschema/cache.go b/infoschema/cache.go index 22ea012a9be28..3ceab0bffb00d 100644 --- a/infoschema/cache.go +++ b/infoschema/cache.go @@ -15,6 +15,7 @@ package infoschema import ( + "fmt" "sort" "sync" @@ -36,15 +37,27 @@ var ( // It only promised to cache the infoschema, if it is newer than all the cached. type InfoCache struct { mu sync.RWMutex - // cache is sorted by SchemaVersion in descending order - cache []InfoSchema - // record SnapshotTS of the latest schema Insert. - maxUpdatedSnapshotTS uint64 + // cache is sorted by both SchemaVersion and timestamp in descending order, assume they have same order + cache []schemaAndTimestamp +} + +type schemaAndTimestamp struct { + infoschema InfoSchema + timestamp int64 } // NewCache creates a new InfoCache. -func NewCache(capcity int) *InfoCache { - return &InfoCache{cache: make([]InfoSchema, 0, capcity)} +func NewCache(capacity int) *InfoCache { + return &InfoCache{ + cache: make([]schemaAndTimestamp, 0, capacity), + } +} + +// Reset resets the cache. +func (h *InfoCache) Reset(capacity int) { + h.mu.Lock() + defer h.mu.Unlock() + h.cache = make([]schemaAndTimestamp, 0, capacity) } // GetLatest gets the newest information schema. @@ -54,18 +67,40 @@ func (h *InfoCache) GetLatest() InfoSchema { getLatestCounter.Inc() if len(h.cache) > 0 { hitLatestCounter.Inc() - return h.cache[0] + return h.cache[0].infoschema } return nil } +// GetSchemaByTimestamp returns the schema used at the specific timestamp +func (h *InfoCache) GetSchemaByTimestamp(ts uint64) (InfoSchema, error) { + h.mu.RLock() + defer h.mu.RUnlock() + return h.getSchemaByTimestampNoLock(ts) +} + +func (h *InfoCache) getSchemaByTimestampNoLock(ts uint64) (InfoSchema, error) { + i := sort.Search(len(h.cache), func(i int) bool { + return uint64(h.cache[i].timestamp) <= ts + }) + if i < len(h.cache) { + return h.cache[i].infoschema, nil + } + + return nil, fmt.Errorf("no schema cached for timestamp %d", ts) +} + // GetByVersion gets the information schema based on schemaVersion. Returns nil if it is not loaded. func (h *InfoCache) GetByVersion(version int64) InfoSchema { h.mu.RLock() defer h.mu.RUnlock() + return h.getByVersionNoLock(version) +} + +func (h *InfoCache) getByVersionNoLock(version int64) InfoSchema { getVersionCounter.Inc() i := sort.Search(len(h.cache), func(i int) bool { - return h.cache[i].SchemaMetaVersion() <= version + return h.cache[i].infoschema.SchemaMetaVersion() <= version }) // `GetByVersion` is allowed to load the latest schema that is less than argument `version`. @@ -86,9 +121,9 @@ func (h *InfoCache) GetByVersion(version int64) InfoSchema { // } // ``` - if i < len(h.cache) && (i != 0 || h.cache[i].SchemaMetaVersion() == version) { + if i < len(h.cache) && (i != 0 || h.cache[i].infoschema.SchemaMetaVersion() == version) { hitVersionCounter.Inc() - return h.cache[i] + return h.cache[i].infoschema } return nil } @@ -101,11 +136,9 @@ func (h *InfoCache) GetBySnapshotTS(snapshotTS uint64) InfoSchema { defer h.mu.RUnlock() getTSCounter.Inc() - if snapshotTS >= h.maxUpdatedSnapshotTS { - if len(h.cache) > 0 { - hitTSCounter.Inc() - return h.cache[0] - } + if schema, err := h.getSchemaByTimestampNoLock(snapshotTS); err == nil { + hitTSCounter.Inc() + return schema } return nil } @@ -118,16 +151,17 @@ func (h *InfoCache) Insert(is InfoSchema, snapshotTS uint64) bool { defer h.mu.Unlock() version := is.SchemaMetaVersion() + + // assume this is the timestamp order as well i := sort.Search(len(h.cache), func(i int) bool { - return h.cache[i].SchemaMetaVersion() <= version + return h.cache[i].infoschema.SchemaMetaVersion() <= version }) - if h.maxUpdatedSnapshotTS < snapshotTS { - h.maxUpdatedSnapshotTS = snapshotTS - } - // cached entry - if i < len(h.cache) && h.cache[i].SchemaMetaVersion() == version { + if i < len(h.cache) && h.cache[i].infoschema.SchemaMetaVersion() == version { + if h.cache[i].timestamp > int64(snapshotTS) { + h.cache[i].timestamp = int64(snapshotTS) + } return true } @@ -135,12 +169,18 @@ func (h *InfoCache) Insert(is InfoSchema, snapshotTS uint64) bool { // has free space, grown the slice h.cache = h.cache[:len(h.cache)+1] copy(h.cache[i+1:], h.cache[i:]) - h.cache[i] = is + h.cache[i] = schemaAndTimestamp{ + infoschema: is, + timestamp: int64(snapshotTS), + } return true } else if i < len(h.cache) { // drop older schema copy(h.cache[i+1:], h.cache[i:]) - h.cache[i] = is + h.cache[i] = schemaAndTimestamp{ + infoschema: is, + timestamp: int64(snapshotTS), + } return true } // older than all cached schemas, refuse to cache it diff --git a/infoschema/cache_test.go b/infoschema/cache_test.go index 83506bc4794d8..5d6e0e7f4e1b1 100644 --- a/infoschema/cache_test.go +++ b/infoschema/cache_test.go @@ -42,7 +42,7 @@ func TestInsert(t *testing.T) { ic.Insert(is5, 5) require.Equal(t, is5, ic.GetByVersion(5)) require.Equal(t, is2, ic.GetByVersion(2)) - require.Nil(t, ic.GetBySnapshotTS(2)) + require.Equal(t, is2, ic.GetBySnapshotTS(2)) require.Equal(t, is5, ic.GetBySnapshotTS(10)) // older @@ -59,7 +59,7 @@ func TestInsert(t *testing.T) { require.Equal(t, is5, ic.GetByVersion(5)) require.Equal(t, is2, ic.GetByVersion(2)) require.Nil(t, ic.GetByVersion(0)) - require.Nil(t, ic.GetBySnapshotTS(2)) + require.Equal(t, is2, ic.GetBySnapshotTS(2)) require.Equal(t, is6, ic.GetBySnapshotTS(10)) // replace 2, drop 2 @@ -91,7 +91,7 @@ func TestInsert(t *testing.T) { require.Nil(t, ic.GetByVersion(2)) require.Nil(t, ic.GetByVersion(0)) require.Nil(t, ic.GetBySnapshotTS(2)) - require.Nil(t, ic.GetBySnapshotTS(5)) + require.Equal(t, is5, ic.GetBySnapshotTS(5)) require.Equal(t, is6, ic.GetBySnapshotTS(10)) } @@ -129,3 +129,61 @@ func TestGetLatest(t *testing.T) { ic.Insert(is0, 0) require.Equal(t, is2, ic.GetLatest()) } + +func TestGetByTimestamp(t *testing.T) { + ic := infoschema.NewCache(16) + require.NotNil(t, ic) + require.Nil(t, ic.GetLatest()) + + is1 := infoschema.MockInfoSchemaWithSchemaVer(nil, 1) + ic.Insert(is1, 1) + require.Equal(t, is1, ic.GetLatest()) + _, err := ic.GetSchemaByTimestamp(0) + require.NotNil(t, err) + schema, err := ic.GetSchemaByTimestamp(1) + require.Nil(t, err) + require.Equal(t, int64(1), schema.SchemaMetaVersion()) + require.Equal(t, is1, ic.GetBySnapshotTS(1)) + schema, err = ic.GetSchemaByTimestamp(2) + require.Nil(t, err) + require.Equal(t, int64(1), schema.SchemaMetaVersion()) + require.Equal(t, is1, ic.GetBySnapshotTS(2)) + + is2 := infoschema.MockInfoSchemaWithSchemaVer(nil, 2) + ic.Insert(is2, 2) + require.Equal(t, is2, ic.GetLatest()) + _, err = ic.GetSchemaByTimestamp(0) + require.NotNil(t, err) + schema, err = ic.GetSchemaByTimestamp(1) + require.Nil(t, err) + require.Equal(t, int64(1), schema.SchemaMetaVersion()) + require.Equal(t, is1, ic.GetBySnapshotTS(1)) + schema, err = ic.GetSchemaByTimestamp(2) + require.Nil(t, err) + require.Equal(t, int64(2), schema.SchemaMetaVersion()) + require.Equal(t, is2, ic.GetBySnapshotTS(2)) + schema, err = ic.GetSchemaByTimestamp(3) + require.Nil(t, err) + require.Equal(t, int64(2), schema.SchemaMetaVersion()) + require.Equal(t, is2, ic.GetBySnapshotTS(3)) + + is0 := infoschema.MockInfoSchemaWithSchemaVer(nil, 0) + ic.Insert(is0, 0) + require.Equal(t, is2, ic.GetLatest()) + schema, err = ic.GetSchemaByTimestamp(0) + require.Nil(t, err) + require.Equal(t, int64(0), schema.SchemaMetaVersion()) + require.Equal(t, is0, ic.GetBySnapshotTS(0)) + schema, err = ic.GetSchemaByTimestamp(1) + require.Nil(t, err) + require.Equal(t, int64(1), schema.SchemaMetaVersion()) + require.Equal(t, is1, ic.GetBySnapshotTS(1)) + schema, err = ic.GetSchemaByTimestamp(2) + require.Nil(t, err) + require.Equal(t, int64(2), schema.SchemaMetaVersion()) + require.Equal(t, is2, ic.GetBySnapshotTS(2)) + schema, err = ic.GetSchemaByTimestamp(3) + require.Nil(t, err) + require.Equal(t, int64(2), schema.SchemaMetaVersion()) + require.Equal(t, is2, ic.GetBySnapshotTS(3)) +} diff --git a/infoschema/cluster_tables_test.go b/infoschema/cluster_tables_test.go index 5e323b2adc88a..5ae331155c5dd 100644 --- a/infoschema/cluster_tables_test.go +++ b/infoschema/cluster_tables_test.go @@ -31,6 +31,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/fn" "github.com/pingcap/kvproto/pkg/deadlock" + "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor" @@ -40,16 +41,20 @@ import ( "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/server" - "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/helper" + "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/store/mockstore/mockstorage" + "github.com/pingcap/tidb/store/mockstore/unistore" "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/testkit/external" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/pdapi" "github.com/pingcap/tidb/util/resourcegrouptag" "github.com/pingcap/tidb/util/set" + "github.com/pingcap/tidb/util/stmtsummary" "github.com/pingcap/tipb/go-tipb" "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/testutils" "google.golang.org/grpc" ) @@ -221,9 +226,12 @@ func TestSelectClusterTable(t *testing.T) { defer s.httpServer.Close() defer s.rpcserver.Stop() tk := s.newTestKitWithRoot(t) - slowLogFileName := "tidb-slow.log" + slowLogFileName := "tidb-slow0.log" prepareSlowLogfile(t, slowLogFileName) defer func() { require.NoError(t, os.Remove(slowLogFileName)) }() + config.UpdateGlobal(func(conf *config.Config) { + conf.Log.SlowQueryFile = slowLogFileName + }) tk.MustExec("use information_schema") tk.MustExec("set @@global.tidb_enable_stmt_summary=1") @@ -811,44 +819,485 @@ func (s *clusterTablesSuite) newTestKitWithRoot(t *testing.T) *testkit.TestKit { } func TestMDLView(t *testing.T) { - if !variable.EnableConcurrentDDL.Load() { - t.Skipf("test requires concurrent ddl") + testCases := []struct { + name string + createTable string + ddl string + queryInTxn []string + sqlDigest string + }{ + {"add column", "create table t(a int)", "alter table test.t add column b int", []string{"select 1", "select * from t"}, "[\"begin\",\"select ?\",\"select * from `t`\"]"}, + {"change column in 1 step", "create table t(a int)", "alter table test.t change column a b int", []string{"select 1", "select * from t"}, "[\"begin\",\"select ?\",\"select * from `t`\"]"}, } + for _, c := range testCases { + t.Run(c.name, func(t *testing.T) { + // setup suite + s := new(clusterTablesSuite) + s.store, s.dom = testkit.CreateMockStoreAndDomain(t) + s.httpServer, s.mockAddr = s.setUpMockPDHTTPServer() + s.startTime = time.Now() + defer s.httpServer.Close() - // setup suite + tk := s.newTestKitWithRoot(t) + tkDDL := s.newTestKitWithRoot(t) + tk3 := s.newTestKitWithRoot(t) + tk.MustExec("use test") + tk.MustExec("set global tidb_enable_metadata_lock=1") + tk.MustExec(c.createTable) + + tk.MustExec("begin") + for _, q := range c.queryInTxn { + tk.MustQuery(q) + } + + var wg sync.WaitGroup + wg.Add(1) + go func() { + tkDDL.MustExec(c.ddl) + wg.Done() + }() + + time.Sleep(200 * time.Millisecond) + + s.rpcserver, s.listenAddr = s.setUpRPCService(t, "127.0.0.1:0", tk3.Session().GetSessionManager()) + defer s.rpcserver.Stop() + + tk3.MustQuery("select DB_NAME, QUERY, SQL_DIGESTS from mysql.tidb_mdl_view").Check(testkit.Rows( + strings.Join([]string{ + "test", + c.ddl, + c.sqlDigest, + }, " "), + )) + + tk.MustExec("commit") + + wg.Wait() + }) + } +} + +func TestCreateBindingFromHistory(t *testing.T) { s := new(clusterTablesSuite) s.store, s.dom = testkit.CreateMockStoreAndDomain(t) + s.rpcserver, s.listenAddr = s.setUpRPCService(t, "127.0.0.1:0", nil) s.httpServer, s.mockAddr = s.setUpMockPDHTTPServer() s.startTime = time.Now() defer s.httpServer.Close() + defer s.rpcserver.Stop() + tk := s.newTestKitWithRoot(t) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t1(id int primary key, a int, b int, key(a))") + tk.MustExec("create table t2(id int primary key, a int, b int, key(a))") + var testCases = []struct { + sqls []string + hint string + }{ + { + sqls: []string{ + "select %s * from t1, t2 where t1.id = t2.id", + "select %s * from test.t1, t2 where t1.id = t2.id", + "select %s * from test.t1, test.t2 where t1.id = t2.id", + "select %s * from t1, test.t2 where t1.id = t2.id", + }, + hint: "/*+ merge_join(t1, t2) */", + }, + { + sqls: []string{ + "select %s * from t1 where a = 1", + "select %s * from test.t1 where a = 1", + }, + hint: "/*+ ignore_index(t, a) */", + }, + } + + for _, testCase := range testCases { + for _, bind := range testCase.sqls { + stmtsummary.StmtSummaryByDigestMap.Clear() + bindSQL := fmt.Sprintf(bind, testCase.hint) + tk.MustExec(bindSQL) + planDigest := tk.MustQuery(fmt.Sprintf("select plan_digest from information_schema.statements_summary where query_sample_text = '%s'", bindSQL)).Rows() + tk.MustExec(fmt.Sprintf("create session binding from history using plan digest '%s'", planDigest[0][0])) + showRes := tk.MustQuery("show bindings").Rows() + require.Equal(t, len(showRes), 1) + require.Equal(t, planDigest[0][0], showRes[0][10]) + for _, sql := range testCase.sqls { + tk.MustExec(fmt.Sprintf(sql, "")) + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) + } + } + showRes := tk.MustQuery("show bindings").Rows() + require.Equal(t, len(showRes), 1) + tk.MustExec(fmt.Sprintf("drop binding for sql digest '%s'", showRes[0][9])) + } + + // exception cases + tk.MustGetErrMsg(fmt.Sprintf("create binding from history using plan digest '%s'", "1"), "can't find any plans for '1'") + tk.MustGetErrMsg(fmt.Sprintf("create binding from history using plan digest '%s'", ""), "plan digest is empty") + tk.MustExec("create binding for select * from t1, t2 where t1.id = t2.id using select /*+ merge_join(t1, t2) */ * from t1, t2 where t1.id = t2.id") + showRes := tk.MustQuery("show bindings").Rows() + require.Equal(t, showRes[0][10], "") // plan digest should be nil by create for +} + +func TestCreateBindingForPrepareFromHistory(t *testing.T) { + s := new(clusterTablesSuite) + s.store, s.dom = testkit.CreateMockStoreAndDomain(t) + s.rpcserver, s.listenAddr = s.setUpRPCService(t, "127.0.0.1:0", nil) + s.httpServer, s.mockAddr = s.setUpMockPDHTTPServer() + s.startTime = time.Now() + defer s.httpServer.Close() + defer s.rpcserver.Stop() tk := s.newTestKitWithRoot(t) - tkDDL := s.newTestKitWithRoot(t) - tk3 := s.newTestKitWithRoot(t) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) + tk.MustExec("use test") - tk.MustExec("set global tidb_enable_metadata_lock=1") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(id int primary key, a int, key(a))") + + tk.MustExec("prepare stmt from 'select /*+ ignore_index(t,a) */ * from t where a = ?'") + tk.MustExec("set @a = 1") + tk.MustExec("execute stmt using @a") + planDigest := tk.MustQuery(fmt.Sprintf("select plan_digest from information_schema.statements_summary where query_sample_text = '%s'", "select /*+ ignore_index(t,a) */ * from t where a = ? [arguments: 1]")).Rows() + showRes := tk.MustQuery("show bindings").Rows() + require.Equal(t, len(showRes), 0) + tk.MustExec(fmt.Sprintf("create binding from history using plan digest '%s'", planDigest[0][0])) + showRes = tk.MustQuery("show bindings").Rows() + require.Equal(t, len(showRes), 1) + require.Equal(t, planDigest[0][0], showRes[0][10]) + tk.MustExec("execute stmt using @a") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) +} + +func TestErrorCasesCreateBindingFromHistory(t *testing.T) { + s := new(clusterTablesSuite) + s.store, s.dom = testkit.CreateMockStoreAndDomain(t) + s.rpcserver, s.listenAddr = s.setUpRPCService(t, "127.0.0.1:0", nil) + s.httpServer, s.mockAddr = s.setUpMockPDHTTPServer() + s.startTime = time.Now() + defer s.httpServer.Close() + defer s.rpcserver.Stop() + tk := s.newTestKitWithRoot(t) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2, t3") + tk.MustExec("create table t1(id int)") + tk.MustExec("create table t2(id int)") + tk.MustExec("create table t3(id int)") + + sql := "select * from t1 where t1.id in (select id from t2)" + tk.MustExec(sql) + planDigest := tk.MustQuery(fmt.Sprintf("select plan_digest from information_schema.statements_summary where query_sample_text = '%s'", sql)).Rows() + tk.MustGetErrMsg(fmt.Sprintf("create binding from history using plan digest '%s'", planDigest[0][0]), "can't create binding for query with sub query") + + sql = "select * from t1, t2, t3 where t1.id = t2.id and t2.id = t3.id" + tk.MustExec(sql) + planDigest = tk.MustQuery(fmt.Sprintf("select plan_digest from information_schema.statements_summary where query_sample_text = '%s'", sql)).Rows() + tk.MustGetErrMsg(fmt.Sprintf("create binding from history using plan digest '%s'", planDigest[0][0]), "can't create binding for query with more than two table join") +} + +// withMockTiFlash sets the mockStore to have N TiFlash stores (naming as tiflash0, tiflash1, ...). +func withMockTiFlash(nodes int) mockstore.MockTiKVStoreOption { + return mockstore.WithMultipleOptions( + mockstore.WithClusterInspector(func(c testutils.Cluster) { + mockCluster := c.(*unistore.Cluster) + _, _, region1 := mockstore.BootstrapWithSingleStore(c) + tiflashIdx := 0 + for tiflashIdx < nodes { + store2 := c.AllocID() + peer2 := c.AllocID() + addr2 := fmt.Sprintf("tiflash%d", tiflashIdx) + mockCluster.AddStore(store2, addr2, &metapb.StoreLabel{Key: "engine", Value: "tiflash"}) + mockCluster.AddPeer(region1, store2, peer2) + tiflashIdx++ + } + }), + mockstore.WithStoreType(mockstore.EmbedUnistore), + ) +} + +func TestBindingFromHistoryWithTiFlashBindable(t *testing.T) { + s := new(clusterTablesSuite) + s.store, s.dom = testkit.CreateMockStoreAndDomain(t) + s.store = testkit.CreateMockStore(t, withMockTiFlash(2)) + s.rpcserver, s.listenAddr = s.setUpRPCService(t, "127.0.0.1:0", nil) + s.httpServer, s.mockAddr = s.setUpMockPDHTTPServer() + s.startTime = time.Now() + defer s.httpServer.Close() + defer s.rpcserver.Stop() + tk := s.newTestKitWithRoot(t) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) + + tk.MustExec("use test;") + tk.MustExec("drop table if exists t;") tk.MustExec("create table t(a int);") - tk.MustExec("insert into t values(1);") + tk.MustExec("alter table test.t set tiflash replica 1") + tb := external.GetTableByName(t, tk, "test", "t") + err := domain.GetDomain(tk.Session()).DDL().UpdateTableReplicaInfo(tk.Session(), tb.Meta().ID, true) + require.NoError(t, err) + tk.MustExec("set @@session.tidb_isolation_read_engines = 'tiflash'") - tk.MustExec("begin") - tk.MustQuery("select 1;") - tk.MustQuery("select * from t;") + sql := "select * from t" + tk.MustExec(sql) + planDigest := tk.MustQuery(fmt.Sprintf("select plan_digest from information_schema.statements_summary where query_sample_text = '%s'", sql)).Rows() + tk.MustGetErrMsg(fmt.Sprintf("create binding from history using plan digest '%s'", planDigest[0][0]), "can't create binding for query with tiflash engine") +} - var wg sync.WaitGroup - wg.Add(1) - go func() { - tkDDL.MustExec("alter table test.t add column b int;") - wg.Done() - }() +func TestSetBindingStatusBySQLDigest(t *testing.T) { + s := new(clusterTablesSuite) + s.store, s.dom = testkit.CreateMockStoreAndDomain(t) + s.rpcserver, s.listenAddr = s.setUpRPCService(t, "127.0.0.1:0", nil) + s.httpServer, s.mockAddr = s.setUpMockPDHTTPServer() + s.startTime = time.Now() + defer s.httpServer.Close() + defer s.rpcserver.Stop() + tk := s.newTestKitWithRoot(t) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(id int, a int, key(a))") + sql := "select /*+ ignore_index(t, a) */ * from t where t.a = 1" + tk.MustExec(sql) + planDigest := tk.MustQuery(fmt.Sprintf("select plan_digest from information_schema.cluster_statements_summary where query_sample_text = '%s'", sql)).Rows() + tk.MustExec(fmt.Sprintf("create global binding from history using plan digest '%s'", planDigest[0][0])) + sql = "select * from t where t.a = 1" + tk.MustExec(sql) + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) + + sqlDigest := tk.MustQuery("show global bindings").Rows() + tk.MustExec(fmt.Sprintf("set binding disabled for sql digest '%s'", sqlDigest[0][9])) + tk.MustExec(sql) + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) + tk.MustExec(fmt.Sprintf("set binding enabled for sql digest '%s'", sqlDigest[0][9])) + tk.MustExec(sql) + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) + tk.MustGetErrMsg("set binding enabled for sql digest '2'", "can't find any binding for '2'") + tk.MustGetErrMsg("set binding enabled for sql digest ''", "sql digest is empty") + tk.MustGetErrMsg("set binding disabled for sql digest ''", "sql digest is empty") +} - time.Sleep(200 * time.Millisecond) +func TestCreateBindingWhenCloseStmtSummaryTable(t *testing.T) { + s := new(clusterTablesSuite) + s.store, s.dom = testkit.CreateMockStoreAndDomain(t) + s.rpcserver, s.listenAddr = s.setUpRPCService(t, "127.0.0.1:0", nil) + s.httpServer, s.mockAddr = s.setUpMockPDHTTPServer() + s.startTime = time.Now() + defer s.httpServer.Close() + defer s.rpcserver.Stop() + tk := s.newTestKitWithRoot(t) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) - s.rpcserver, s.listenAddr = s.setUpRPCService(t, "127.0.0.1:0", tk3.Session().GetSessionManager()) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(id int primary key, a int, key(a))") + tk.MustExec("set global tidb_enable_stmt_summary = 0") + tk.MustExec("select /*+ ignore_index(t, a) */ * from t where a = 1") + + tk.MustGetErrMsg("create binding from history using plan digest '4e3159169cc63c14b139a4e7d72eae1759875c9a9581f94bb2079aae961189cb'", + "can't find any plans for '4e3159169cc63c14b139a4e7d72eae1759875c9a9581f94bb2079aae961189cb'") +} + +func TestCreateBindingForNotSupportedStmt(t *testing.T) { + s := new(clusterTablesSuite) + s.store, s.dom = testkit.CreateMockStoreAndDomain(t) + s.rpcserver, s.listenAddr = s.setUpRPCService(t, "127.0.0.1:0", nil) + s.httpServer, s.mockAddr = s.setUpMockPDHTTPServer() + s.startTime = time.Now() + defer s.httpServer.Close() defer s.rpcserver.Stop() + tk := s.newTestKitWithRoot(t) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) - tk3.MustQuery("select DB_NAME, QUERY, SQL_DIGESTS from mysql.tidb_mdl_view").Check(testkit.Rows("test alter table test.t add column b int; [\"begin\",\"select ? ;\",\"select * from `t` ;\"]")) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(id int primary key, a int, key(a))") + + sql := "admin show ddl jobs" + tk.MustExec(sql) + planDigest := tk.MustQuery(fmt.Sprintf("select plan_digest from information_schema.statements_summary where query_sample_text = '%s'", sql)).Rows() + tk.MustGetErrMsg(fmt.Sprintf("create session binding from history using plan digest '%s'", planDigest[0][0]), fmt.Sprintf("can't find any plans for '%s'", planDigest[0][0])) + + sql = "show tables" + tk.MustExec(sql) + planDigest = tk.MustQuery(fmt.Sprintf("select plan_digest from information_schema.statements_summary where query_sample_text = '%s'", sql)).Rows() + tk.MustGetErrMsg(fmt.Sprintf("create session binding from history using plan digest '%s'", planDigest[0][0]), fmt.Sprintf("can't find any plans for '%s'", planDigest[0][0])) + + sql = "explain select /*+ ignore_index(t, a) */ * from t where a = 1" + tk.MustExec(sql) + planDigest = tk.MustQuery(fmt.Sprintf("select plan_digest from information_schema.statements_summary where query_sample_text = '%s'", sql)).Rows() + tk.MustGetErrMsg(fmt.Sprintf("create session binding from history using plan digest '%s'", planDigest[0][0]), fmt.Sprintf("can't find any plans for '%s'", planDigest[0][0])) +} - tk.MustExec("commit") +func TestCreateBindingRepeatedly(t *testing.T) { + s := new(clusterTablesSuite) + s.store, s.dom = testkit.CreateMockStoreAndDomain(t) + s.rpcserver, s.listenAddr = s.setUpRPCService(t, "127.0.0.1:0", nil) + s.httpServer, s.mockAddr = s.setUpMockPDHTTPServer() + s.startTime = time.Now() + defer s.httpServer.Close() + defer s.rpcserver.Stop() + tk := s.newTestKitWithRoot(t) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) - wg.Wait() + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(id int primary key, a int, key(a))") + + sql := "select /*+ ignore_index(t, a) */ * from t where a = 1" + tk.MustExec(sql) + planDigest := tk.MustQuery(fmt.Sprintf("select plan_digest from information_schema.statements_summary where query_sample_text = '%s'", sql)).Rows() + tk.MustExec(fmt.Sprintf("create session binding from history using plan digest '%s'", planDigest[0][0])) + binding := tk.MustQuery("show bindings").Rows() + loc, _ := time.LoadLocation("Asia/Shanghai") + createTime, _ := time.ParseInLocation("2006-01-02 15:04:05", binding[0][4].(string), loc) + updateTime, _ := time.ParseInLocation("2006-01-02 15:04:05", binding[0][5].(string), loc) + + // binding from history cover binding from history + tk.MustExec(fmt.Sprintf("create session binding from history using plan digest '%s'", planDigest[0][0])) + tk.MustExec(fmt.Sprintf("create session binding from history using plan digest '%s'", planDigest[0][0])) + tk.MustExec(fmt.Sprintf("create session binding from history using plan digest '%s'", planDigest[0][0])) + binding1 := tk.MustQuery("show bindings").Rows() + createTime1, _ := time.ParseInLocation("2006-01-02 15:04:05", binding1[0][4].(string), loc) + updateTime1, _ := time.ParseInLocation("2006-01-02 15:04:05", binding1[0][5].(string), loc) + require.Greater(t, createTime1.UnixNano(), createTime.UnixNano()) + require.Greater(t, updateTime1.UnixNano(), updateTime.UnixNano()) + for i := range binding1[0] { + if i != 4 && i != 5 { + require.Equal(t, binding[0][i], binding1[0][i]) + } + } + // binding from sql cover binding from history + tk.MustExec("create binding for select * from t where a = 1 using select /*+ ignore_index(t, a) */ * from t where a = 1") + binding2 := tk.MustQuery("show bindings").Rows() + createTime2, _ := time.ParseInLocation("2006-01-02 15:04:05", binding2[0][4].(string), loc) + updateTime2, _ := time.ParseInLocation("2006-01-02 15:04:05", binding2[0][5].(string), loc) + require.Greater(t, createTime2.UnixNano(), createTime1.UnixNano()) + require.Greater(t, updateTime2.UnixNano(), updateTime1.UnixNano()) + require.Equal(t, binding2[0][8], "manual") + require.Equal(t, binding2[0][10], "") + for i := range binding2[0] { + if i != 1 && i != 4 && i != 5 && i != 8 && i != 10 { + // bind_sql, create_time, update_time, source, plan_digest may be different + require.Equal(t, binding1[0][i], binding2[0][i]) + } + } + // binding from history cover binding from sql + tk.MustExec(fmt.Sprintf("create session binding from history using plan digest '%s'", planDigest[0][0])) + binding3 := tk.MustQuery("show bindings").Rows() + createTime3, _ := time.ParseInLocation("2006-01-02 15:04:05", binding3[0][4].(string), loc) + updateTime3, _ := time.ParseInLocation("2006-01-02 15:04:05", binding3[0][5].(string), loc) + require.Greater(t, createTime3.UnixNano(), createTime2.UnixNano()) + require.Greater(t, updateTime3.UnixNano(), updateTime2.UnixNano()) + require.Equal(t, binding3[0][8], "history") + require.Equal(t, binding3[0][10], planDigest[0][0]) + for i := range binding3[0] { + if i != 1 && i != 4 && i != 5 && i != 8 && i != 10 { + // bind_sql, create_time, update_time, source, plan_digest may be different + require.Equal(t, binding2[0][i], binding3[0][i]) + } + } +} + +func TestCreateBindingWithUsingKeyword(t *testing.T) { + s := new(clusterTablesSuite) + s.store, s.dom = testkit.CreateMockStoreAndDomain(t) + s.rpcserver, s.listenAddr = s.setUpRPCService(t, "127.0.0.1:0", nil) + s.httpServer, s.mockAddr = s.setUpMockPDHTTPServer() + s.startTime = time.Now() + defer s.httpServer.Close() + defer s.rpcserver.Stop() + tk := s.newTestKitWithRoot(t) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t, t1, t2") + tk.MustExec("create table t(id int primary key, a int, key(a))") + tk.MustExec("create table t1(id int primary key, a int, key(a))") + tk.MustExec("create table t2(id int primary key, a int, key(a))") + + // `JOIN` keyword and not specifying the associated columns with the `USING` keyword. + tk.MustGetErrMsg("CREATE GLOBAL BINDING for SELECT * FROM t t1 JOIN t t2 USING SELECT * FROM t t1 JOIN t t2;", + "[parser:1064]You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use line 1 column 67 near \"SELECT * FROM t t1 JOIN t t2;\" ") + sql := "SELECT * FROM t t1 JOIN t t2;" + tk.MustExec(sql) + planDigest := tk.MustQuery(fmt.Sprintf("select plan_digest from information_schema.statements_summary where query_sample_text = '%s'", sql)).Rows() + tk.MustExec(fmt.Sprintf("create session binding from history using plan digest '%s'", planDigest[0][0])) + tk.MustExec(sql) + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) + + // `DELETE` statements that contain the `USING` keyword. + tk.MustGetErrMsg("`CREATE GLOBAL BINDING for DELETE FROM t1 USING t1 JOIN t2 ON t1.a = t2.a USING DELETE FROM t1 USING t1 JOIN t2 ON t1.a = t2.a;", + "[parser:1064]You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use line 1 column 127 near \"`CREATE GLOBAL BINDING for DELETE FROM t1 USING t1 JOIN t2 ON t1.a = t2.a USING DELETE FROM t1 USING t1 JOIN t2 ON t1.a = t2.a;\" ") + sql = "DELETE FROM t1 USING t1 JOIN t2 ON t1.a = t2.a;" + tk.MustExec(sql) + planDigest = tk.MustQuery(fmt.Sprintf("select plan_digest from information_schema.statements_summary where query_sample_text = '%s'", sql)).Rows() + tk.MustExec(fmt.Sprintf("create session binding from history using plan digest '%s'", planDigest[0][0])) + tk.MustExec(sql) + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) +} + +func TestNewCreatedBindingCanWorkWithPlanCache(t *testing.T) { + s := new(clusterTablesSuite) + s.store, s.dom = testkit.CreateMockStoreAndDomain(t) + s.rpcserver, s.listenAddr = s.setUpRPCService(t, "127.0.0.1:0", nil) + s.httpServer, s.mockAddr = s.setUpMockPDHTTPServer() + s.startTime = time.Now() + defer s.httpServer.Close() + defer s.rpcserver.Stop() + tk := s.newTestKitWithRoot(t) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t, t1, t2") + tk.MustExec("create table t(id int primary key, a int, key(a))") + + tk.MustExec("prepare stmt from 'select * from t where a = ?'") + tk.MustExec("set @a = 0") + tk.MustExec("execute stmt using @a") + tk.MustExec("execute stmt using @a") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + sql := "select /*+ ignore_index(t, a) */ * from t where a = 1" + tk.MustExec(sql) + planDigest := tk.MustQuery(fmt.Sprintf("select plan_digest from information_schema.statements_summary where query_sample_text = '%s'", sql)).Rows() + tk.MustExec(fmt.Sprintf("create session binding from history using plan digest '%s'", planDigest[0][0])) + tk.MustExec("execute stmt using @a") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) +} + +func TestCreateBindingForPrepareToken(t *testing.T) { + s := new(clusterTablesSuite) + s.store, s.dom = testkit.CreateMockStoreAndDomain(t) + s.rpcserver, s.listenAddr = s.setUpRPCService(t, "127.0.0.1:0", nil) + s.httpServer, s.mockAddr = s.setUpMockPDHTTPServer() + s.startTime = time.Now() + defer s.httpServer.Close() + defer s.rpcserver.Stop() + tk := s.newTestKitWithRoot(t) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b time, c varchar(5))") + + //some builtin functions listed in https://dev.mysql.com/doc/refman/8.0/en/function-resolution.html + cases := []string{ + "select std(a) from t", + "select cast(a as decimal(10, 2)) from t", + "select bit_or(a) from t", + "select min(a) from t", + "select max(a) from t", + "select substr(c, 1, 2) from t", + } + + for _, sql := range cases { + prep := fmt.Sprintf("prepare stmt from '%s'", sql) + tk.MustExec(prep) + tk.MustExec("execute stmt") + planDigest := tk.MustQuery(fmt.Sprintf("select plan_digest from information_schema.statements_summary where query_sample_text = '%s'", sql)).Rows() + tk.MustExec(fmt.Sprintf("create binding from history using plan digest '%s'", planDigest[0][0])) + } } diff --git a/infoschema/error.go b/infoschema/error.go index a7e4929a35bcc..2e1a45c7ae113 100644 --- a/infoschema/error.go +++ b/infoschema/error.go @@ -32,7 +32,11 @@ var ( ErrPlacementPolicyExists = dbterror.ClassSchema.NewStd(mysql.ErrPlacementPolicyExists) // ErrPlacementPolicyNotExists return for placement_policy policy not exists. ErrPlacementPolicyNotExists = dbterror.ClassSchema.NewStd(mysql.ErrPlacementPolicyNotExists) - // ErrReservedSyntax for internal syntax. + // ErrResourceGroupExists return for resource group already exists. + ErrResourceGroupExists = dbterror.ClassSchema.NewStd(mysql.ErrResourceGroupExists) + // ErrResourceGroupNotExists return for resource group not exists. + ErrResourceGroupNotExists = dbterror.ClassSchema.NewStd(mysql.ErrResourceGroupNotExists) + // ErrReservedSyntax for internal syntax. ErrReservedSyntax = dbterror.ClassSchema.NewStd(mysql.ErrReservedSyntax) // ErrTableExists returns for table already exists. ErrTableExists = dbterror.ClassSchema.NewStd(mysql.ErrTableExists) @@ -64,6 +68,8 @@ var ( ErrKeyNotExists = dbterror.ClassSchema.NewStd(mysql.ErrKeyDoesNotExist) // ErrCannotAddForeign returns for foreign key exists. ErrCannotAddForeign = dbterror.ClassSchema.NewStd(mysql.ErrCannotAddForeign) + // ErrForeignKeyOnPartitioned returns for foreign key on partition table. + ErrForeignKeyOnPartitioned = dbterror.ClassSchema.NewStd(mysql.ErrForeignKeyOnPartitioned) // ErrForeignKeyNotMatch returns for foreign key not match. ErrForeignKeyNotMatch = dbterror.ClassSchema.NewStd(mysql.ErrWrongFkDef) // ErrIndexExists returns for index already exists. @@ -94,4 +100,6 @@ var ( ErrForeignKeyNoIndexInParent = dbterror.ClassSchema.NewStd(mysql.ErrForeignKeyNoIndexInParent) // ErrForeignKeyColumnNotNull returns when foreign key with SET NULL constrain and the related column has not null. ErrForeignKeyColumnNotNull = dbterror.ClassSchema.NewStd(mysql.ErrForeignKeyColumnNotNull) + // ErrResourceGroupSupportDisabled returns for resource group feature is disabled + ErrResourceGroupSupportDisabled = dbterror.ClassSchema.NewStd(mysql.ErrResourceGroupSupportDisabled) ) diff --git a/infoschema/infoschema.go b/infoschema/infoschema.go index d024afde40d7d..f46f7d082a66e 100644 --- a/infoschema/infoschema.go +++ b/infoschema/infoschema.go @@ -42,6 +42,7 @@ type InfoSchema interface { SchemaByID(id int64) (*model.DBInfo, bool) SchemaByTable(tableInfo *model.TableInfo) (*model.DBInfo, bool) PolicyByName(name model.CIStr) (*model.PolicyInfo, bool) + ResourceGroupByName(name model.CIStr) (*model.ResourceGroupInfo, bool) TableByID(id int64) (table.Table, bool) AllocByID(id int64) (autoid.Allocators, bool) AllSchemaNames() []string @@ -60,6 +61,8 @@ type InfoSchema interface { AllPlacementBundles() []*placement.Bundle // AllPlacementPolicies returns all placement policies AllPlacementPolicies() []*model.PolicyInfo + // AllResourceGroups returns all resource groups + AllResourceGroups() []*model.ResourceGroupInfo // HasTemporaryTable returns whether information schema has temporary table HasTemporaryTable() bool // GetTableReferredForeignKeys gets the table's ReferredFKInfo by lowercase schema and table name. @@ -93,6 +96,10 @@ type infoSchema struct { policyMutex sync.RWMutex policyMap map[string]*model.PolicyInfo + // resourceGroupMap stores all resource groups. + resourceGroupMutex sync.RWMutex + resourceGroupMap map[string]*model.ResourceGroupInfo + schemaMap map[string]*schemaTables // sortedTablesBuckets is a slice of sortedTables, a table's bucket index is (tableID % bucketCount). @@ -120,6 +127,7 @@ func MockInfoSchema(tbList []*model.TableInfo) InfoSchema { result := &infoSchema{} result.schemaMap = make(map[string]*schemaTables) result.policyMap = make(map[string]*model.PolicyInfo) + result.resourceGroupMap = make(map[string]*model.ResourceGroupInfo) result.ruleBundleMap = make(map[int64]*placement.Bundle) result.sortedTablesBuckets = make([]sortedTables, bucketCount) dbInfo := &model.DBInfo{ID: 0, Name: model.NewCIStr("test"), Tables: tbList} @@ -147,6 +155,7 @@ func MockInfoSchemaWithSchemaVer(tbList []*model.TableInfo, schemaVer int64) Inf result := &infoSchema{} result.schemaMap = make(map[string]*schemaTables) result.policyMap = make(map[string]*model.PolicyInfo) + result.resourceGroupMap = make(map[string]*model.ResourceGroupInfo) result.ruleBundleMap = make(map[int64]*placement.Bundle) result.sortedTablesBuckets = make([]sortedTables, bucketCount) dbInfo := &model.DBInfo{ID: 0, Name: model.NewCIStr("test"), Tables: tbList} @@ -235,6 +244,17 @@ func (is *infoSchema) PolicyByID(id int64) (val *model.PolicyInfo, ok bool) { return nil, false } +func (is *infoSchema) ResourceGroupByID(id int64) (val *model.ResourceGroupInfo, ok bool) { + is.resourceGroupMutex.RLock() + defer is.resourceGroupMutex.RUnlock() + for _, v := range is.resourceGroupMap { + if v.ID == id { + return v, true + } + } + return nil, false +} + func (is *infoSchema) SchemaByID(id int64) (val *model.DBInfo, ok bool) { for _, v := range is.schemaMap { if v.dbInfo.ID == id { @@ -270,7 +290,7 @@ func (is *infoSchema) TableByID(id int64) (val table.Table, ok bool) { func (is *infoSchema) AllocByID(id int64) (autoid.Allocators, bool) { tbl, ok := is.TableByID(id) if !ok { - return nil, false + return autoid.Allocators{}, false } return tbl.Allocators(nil), true } @@ -393,6 +413,25 @@ func (is *infoSchema) PolicyByName(name model.CIStr) (*model.PolicyInfo, bool) { return t, r } +// ResourceGroupByName is used to find the resource group. +func (is *infoSchema) ResourceGroupByName(name model.CIStr) (*model.ResourceGroupInfo, bool) { + is.resourceGroupMutex.RLock() + defer is.resourceGroupMutex.RUnlock() + t, r := is.resourceGroupMap[name.L] + return t, r +} + +// AllResourceGroups returns all resource groups. +func (is *infoSchema) AllResourceGroups() []*model.ResourceGroupInfo { + is.resourceGroupMutex.RLock() + defer is.resourceGroupMutex.RUnlock() + groups := make([]*model.ResourceGroupInfo, 0, len(is.resourceGroupMap)) + for _, group := range is.resourceGroupMap { + groups = append(groups, group) + } + return groups +} + // AllPlacementPolicies returns all placement policies func (is *infoSchema) AllPlacementPolicies() []*model.PolicyInfo { is.policyMutex.RLock() @@ -417,6 +456,18 @@ func (is *infoSchema) AllPlacementBundles() []*placement.Bundle { return bundles } +func (is *infoSchema) setResourceGroup(resourceGroup *model.ResourceGroupInfo) { + is.resourceGroupMutex.Lock() + defer is.resourceGroupMutex.Unlock() + is.resourceGroupMap[resourceGroup.Name.L] = resourceGroup +} + +func (is *infoSchema) deleteResourceGroup(name string) { + is.resourceGroupMutex.Lock() + defer is.resourceGroupMutex.Unlock() + delete(is.resourceGroupMap, name) +} + func (is *infoSchema) setPolicy(policy *model.PolicyInfo) { is.policyMutex.Lock() defer is.policyMutex.Unlock() @@ -674,6 +725,12 @@ func (ts *SessionExtendedInfoSchema) SchemaByTable(tableInfo *model.TableInfo) ( } } + if ts.MdlTables != nil { + if tbl, ok := ts.MdlTables.SchemaByTable(tableInfo); ok { + return tbl, true + } + } + return ts.InfoSchema.SchemaByTable(tableInfo) } diff --git a/infoschema/infoschema_test.go b/infoschema/infoschema_test.go index 66bd8cc33ef00..513dbfb6f7223 100644 --- a/infoschema/infoschema_test.go +++ b/infoschema/infoschema_test.go @@ -110,7 +110,7 @@ func TestBasic(t *testing.T) { }) require.NoError(t, err) - builder, err := infoschema.NewBuilder(dom.Store(), nil).InitWithDBInfos(dbInfos, nil, 1) + builder, err := infoschema.NewBuilder(dom.Store(), nil).InitWithDBInfos(dbInfos, nil, nil, 1) require.NoError(t, err) txn, err := store.Begin() @@ -256,7 +256,7 @@ func TestInfoTables(t *testing.T) { require.NoError(t, err) }() - builder, err := infoschema.NewBuilder(store, nil).InitWithDBInfos(nil, nil, 0) + builder, err := infoschema.NewBuilder(store, nil).InitWithDBInfos(nil, nil, nil, 0) require.NoError(t, err) is := builder.Build() @@ -296,6 +296,7 @@ func TestInfoTables(t *testing.T) { "DEADLOCKS", "PLACEMENT_POLICIES", "TRX_SUMMARY", + "RESOURCE_GROUPS", } for _, tbl := range infoTables { tb, err1 := is.TableByName(util.InformationSchemaName, model.NewCIStr(tbl)) @@ -410,7 +411,7 @@ func TestBuildSchemaWithGlobalTemporaryTable(t *testing.T) { // full load newDB, ok := newIS.SchemaByName(model.NewCIStr("test")) require.True(t, ok) - builder, err := infoschema.NewBuilder(store, nil).InitWithDBInfos([]*model.DBInfo{newDB}, newIS.AllPlacementPolicies(), newIS.SchemaMetaVersion()) + builder, err := infoschema.NewBuilder(store, nil).InitWithDBInfos([]*model.DBInfo{newDB}, newIS.AllPlacementPolicies(), newIS.AllResourceGroups(), newIS.SchemaMetaVersion()) require.NoError(t, err) require.True(t, builder.Build().HasTemporaryTable()) @@ -535,7 +536,7 @@ func TestBuildBundle(t *testing.T) { assertBundle(is, tbl2.Meta().ID, nil) assertBundle(is, p1.ID, p1Bundle) - builder, err := infoschema.NewBuilder(store, nil).InitWithDBInfos([]*model.DBInfo{db}, is.AllPlacementPolicies(), is.SchemaMetaVersion()) + builder, err := infoschema.NewBuilder(store, nil).InitWithDBInfos([]*model.DBInfo{db}, is.AllPlacementPolicies(), is.AllResourceGroups(), is.SchemaMetaVersion()) require.NoError(t, err) is2 := builder.Build() assertBundle(is2, tbl1.Meta().ID, tb1Bundle) diff --git a/infoschema/perfschema/tables.go b/infoschema/perfschema/tables.go index 9a5a36235cfa4..6889d61c3be85 100644 --- a/infoschema/perfschema/tables.go +++ b/infoschema/perfschema/tables.go @@ -207,6 +207,11 @@ func (vt *perfSchemaTable) Indices() []table.Index { return vt.indices } +// GetPartitionedTable implements table.Table GetPartitionedTable interface. +func (vt *perfSchemaTable) GetPartitionedTable() table.PartitionedTable { + return nil +} + // initTableIndices initializes the indices of the perfSchemaTable. func initTableIndices(t *perfSchemaTable) error { tblInfo := t.meta diff --git a/infoschema/tables.go b/infoschema/tables.go index 656a99f52d838..3a2711eb57147 100644 --- a/infoschema/tables.go +++ b/infoschema/tables.go @@ -22,12 +22,17 @@ import ( "net/http" "strconv" "strings" + "sync" + "time" "github.com/pingcap/errors" "github.com/pingcap/failpoint" + "github.com/pingcap/kvproto/pkg/diagnosticspb" "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/log" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl/placement" + "github.com/pingcap/tidb/ddl/resourcegroup" "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" @@ -47,9 +52,14 @@ import ( "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/pdapi" "github.com/pingcap/tidb/util/sem" + "github.com/pingcap/tidb/util/set" "github.com/pingcap/tidb/util/stmtsummary" "github.com/tikv/client-go/v2/tikv" "go.uber.org/zap" + "golang.org/x/exp/slices" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" ) const ( @@ -190,6 +200,8 @@ const ( TableMemoryUsage = "MEMORY_USAGE" // TableMemoryUsageOpsHistory is the memory control operators history. TableMemoryUsageOpsHistory = "MEMORY_USAGE_OPS_HISTORY" + // TableResourceGroups is the metadata of resource groups. + TableResourceGroups = "RESOURCE_GROUPS" ) const ( @@ -296,6 +308,7 @@ var tableIDMap = map[string]int64{ TableMemoryUsageOpsHistory: autoid.InformationSchemaDBID + 85, ClusterTableMemoryUsage: autoid.InformationSchemaDBID + 86, ClusterTableMemoryUsageOpsHistory: autoid.InformationSchemaDBID + 87, + TableResourceGroups: autoid.InformationSchemaDBID + 88, } // columnInfo represents the basic column information of all kinds of INFORMATION_SCHEMA tables @@ -812,6 +825,7 @@ var tableProcesslistCols = []columnInfo{ {name: "MEM", tp: mysql.TypeLonglong, size: 21, flag: mysql.UnsignedFlag}, {name: "DISK", tp: mysql.TypeLonglong, size: 21, flag: mysql.UnsignedFlag}, {name: "TxnStart", tp: mysql.TypeVarchar, size: 64, flag: mysql.NotNullFlag, deflt: ""}, + {name: "RESOURCE_GROUP", tp: mysql.TypeVarchar, size: resourcegroup.MaxGroupNameLength, flag: mysql.NotNullFlag, deflt: ""}, } var tableTiDBIndexesCols = []columnInfo{ @@ -890,6 +904,7 @@ var slowQueryCols = []columnInfo{ {name: variable.SlowLogBackoffTotal, tp: mysql.TypeDouble, size: 22}, {name: variable.SlowLogWriteSQLRespTotal, tp: mysql.TypeDouble, size: 22}, {name: variable.SlowLogResultRows, tp: mysql.TypeLonglong, size: 22}, + {name: variable.SlowLogWarnings, tp: mysql.TypeLongBlob, size: types.UnspecifiedLength}, {name: variable.SlowLogBackoffDetail, tp: mysql.TypeVarchar, size: 4096}, {name: variable.SlowLogPrepared, tp: mysql.TypeTiny, size: 1}, {name: variable.SlowLogSucc, tp: mysql.TypeTiny, size: 1}, @@ -1323,6 +1338,9 @@ var tableStatementsSummaryCols = []columnInfo{ {name: stmtsummary.PlanDigestStr, tp: mysql.TypeVarchar, size: 64, comment: "Digest of its execution plan"}, {name: stmtsummary.PlanStr, tp: mysql.TypeBlob, size: types.UnspecifiedLength, comment: "Sampled execution plan"}, {name: stmtsummary.BinaryPlan, tp: mysql.TypeBlob, size: types.UnspecifiedLength, comment: "Sampled binary plan"}, + {name: stmtsummary.Charset, tp: mysql.TypeVarchar, size: 64, comment: "Sampled charset"}, + {name: stmtsummary.Collation, tp: mysql.TypeVarchar, size: 64, comment: "Sampled collation"}, + {name: stmtsummary.PlanHint, tp: mysql.TypeVarchar, size: 64, comment: "Sampled plan hint"}, } var tableStorageStatsCols = []columnInfo{ @@ -1574,6 +1592,12 @@ var tableMemoryUsageOpsHistoryCols = []columnInfo{ {name: "SQL_TEXT", tp: mysql.TypeVarchar, size: 256}, } +var tableResourceGroupsCols = []columnInfo{ + {name: "NAME", tp: mysql.TypeVarchar, size: resourcegroup.MaxGroupNameLength, flag: mysql.NotNullFlag}, + {name: "RU_PER_SEC", tp: mysql.TypeLonglong, size: 21}, + {name: "BURSTABLE", tp: mysql.TypeVarchar, size: 3}, +} + // GetShardingInfo returns a nil or description string for the sharding information of given TableInfo. // The returned description string may be: // - "NOT_SHARDED": for tables that SHARD_ROW_ID_BITS is not specified. @@ -1729,8 +1753,8 @@ func FormatTiDBVersion(TiDBVersion string, isDefaultVersion bool) string { // The user hasn't set the config 'ServerVersion'. if isDefaultVersion { - nodeVersion = TiDBVersion[strings.LastIndex(TiDBVersion, "TiDB-")+len("TiDB-"):] - if nodeVersion[0] == 'v' { + nodeVersion = TiDBVersion[strings.Index(TiDBVersion, "TiDB-")+len("TiDB-"):] + if len(nodeVersion) > 0 && nodeVersion[0] == 'v' { nodeVersion = nodeVersion[1:] } nodeVersions := strings.Split(nodeVersion, "-") @@ -2036,6 +2060,7 @@ var tableNameToColumns = map[string][]columnInfo{ TableUserAttributes: tableUserAttributesCols, TableMemoryUsage: tableMemoryUsageCols, TableMemoryUsageOpsHistory: tableMemoryUsageOpsHistoryCols, + TableResourceGroups: tableResourceGroupsCols, } func createInfoSchemaTable(_ autoid.Allocators, meta *model.TableInfo) (table.Table, error) { @@ -2123,7 +2148,7 @@ func (it *infoschemaTable) UpdateRecord(gctx context.Context, ctx sessionctx.Con // Allocators implements table.Table Allocators interface. func (it *infoschemaTable) Allocators(_ sessionctx.Context) autoid.Allocators { - return nil + return autoid.Allocators{} } // Meta implements table.Table Meta interface. @@ -2141,6 +2166,11 @@ func (it *infoschemaTable) Type() table.Type { return it.tp } +// GetPartitionedTable implements table.Table GetPartitionedTable interface. +func (it *infoschemaTable) GetPartitionedTable() table.PartitionedTable { + return nil +} + // VirtualTable is a dummy table.Table implementation. type VirtualTable struct{} @@ -2206,7 +2236,7 @@ func (vt *VirtualTable) UpdateRecord(ctx context.Context, sctx sessionctx.Contex // Allocators implements table.Table Allocators interface. func (vt *VirtualTable) Allocators(_ sessionctx.Context) autoid.Allocators { - return nil + return autoid.Allocators{} } // Meta implements table.Table Meta interface. @@ -2223,3 +2253,142 @@ func (vt *VirtualTable) GetPhysicalID() int64 { func (vt *VirtualTable) Type() table.Type { return table.VirtualTable } + +// GetTiFlashServerInfo returns all TiFlash server infos +func GetTiFlashServerInfo(sctx sessionctx.Context) ([]ServerInfo, error) { + if config.GetGlobalConfig().DisaggregatedTiFlash { + return nil, table.ErrUnsupportedOp + } + serversInfo, err := GetStoreServerInfo(sctx) + if err != nil { + return nil, err + } + serversInfo = FilterClusterServerInfo(serversInfo, set.NewStringSet(kv.TiFlash.Name()), set.NewStringSet()) + return serversInfo, nil +} + +// FetchClusterServerInfoWithoutPrivilegeCheck fetches cluster server information +func FetchClusterServerInfoWithoutPrivilegeCheck(ctx context.Context, sctx sessionctx.Context, serversInfo []ServerInfo, serverInfoType diagnosticspb.ServerInfoType, recordWarningInStmtCtx bool) ([][]types.Datum, error) { + type result struct { + idx int + rows [][]types.Datum + err error + } + wg := sync.WaitGroup{} + ch := make(chan result, len(serversInfo)) + infoTp := serverInfoType + finalRows := make([][]types.Datum, 0, len(serversInfo)*10) + for i, srv := range serversInfo { + address := srv.Address + remote := address + if srv.ServerType == "tidb" { + remote = srv.StatusAddr + } + wg.Add(1) + go func(index int, remote, address, serverTP string) { + util.WithRecovery(func() { + defer wg.Done() + items, err := getServerInfoByGRPC(ctx, remote, infoTp) + if err != nil { + ch <- result{idx: index, err: err} + return + } + partRows := serverInfoItemToRows(items, serverTP, address) + ch <- result{idx: index, rows: partRows} + }, nil) + }(i, remote, address, srv.ServerType) + } + wg.Wait() + close(ch) + // Keep the original order to make the result more stable + var results []result //nolint: prealloc + for result := range ch { + if result.err != nil { + if recordWarningInStmtCtx { + sctx.GetSessionVars().StmtCtx.AppendWarning(result.err) + } else { + log.Warn(result.err.Error()) + } + continue + } + results = append(results, result) + } + slices.SortFunc(results, func(i, j result) bool { return i.idx < j.idx }) + for _, result := range results { + finalRows = append(finalRows, result.rows...) + } + return finalRows, nil +} + +func serverInfoItemToRows(items []*diagnosticspb.ServerInfoItem, tp, addr string) [][]types.Datum { + rows := make([][]types.Datum, 0, len(items)) + for _, v := range items { + for _, item := range v.Pairs { + row := types.MakeDatums( + tp, + addr, + v.Tp, + v.Name, + item.Key, + item.Value, + ) + rows = append(rows, row) + } + } + return rows +} + +func getServerInfoByGRPC(ctx context.Context, address string, tp diagnosticspb.ServerInfoType) ([]*diagnosticspb.ServerInfoItem, error) { + opt := grpc.WithTransportCredentials(insecure.NewCredentials()) + security := config.GetGlobalConfig().Security + if len(security.ClusterSSLCA) != 0 { + clusterSecurity := security.ClusterSecurity() + tlsConfig, err := clusterSecurity.ToTLSConfig() + if err != nil { + return nil, errors.Trace(err) + } + opt = grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig)) + } + conn, err := grpc.Dial(address, opt) + if err != nil { + return nil, err + } + defer func() { + err := conn.Close() + if err != nil { + log.Error("close grpc connection error", zap.Error(err)) + } + }() + + cli := diagnosticspb.NewDiagnosticsClient(conn) + ctx, cancel := context.WithTimeout(ctx, time.Second*10) + defer cancel() + r, err := cli.ServerInfo(ctx, &diagnosticspb.ServerInfoRequest{Tp: tp}) + if err != nil { + return nil, err + } + return r.Items, nil +} + +// FilterClusterServerInfo filters serversInfo by nodeTypes and addresses +func FilterClusterServerInfo(serversInfo []ServerInfo, nodeTypes, addresses set.StringSet) []ServerInfo { + if len(nodeTypes) == 0 && len(addresses) == 0 { + return serversInfo + } + + filterServers := make([]ServerInfo, 0, len(serversInfo)) + for _, srv := range serversInfo { + // Skip some node type which has been filtered in WHERE clause + // e.g: SELECT * FROM cluster_config WHERE type='tikv' + if len(nodeTypes) > 0 && !nodeTypes.Exist(srv.ServerType) { + continue + } + // Skip some node address which has been filtered in WHERE clause + // e.g: SELECT * FROM cluster_config WHERE address='192.16.8.12:2379' + if len(addresses) > 0 && !addresses.Exist(srv.Address) { + continue + } + filterServers = append(filterServers, srv) + } + return filterServers +} diff --git a/infoschema/tables_test.go b/infoschema/tables_test.go index 3650f2833a1a6..d44721090b8b6 100644 --- a/infoschema/tables_test.go +++ b/infoschema/tables_test.go @@ -56,8 +56,7 @@ func newTestKitWithRoot(t *testing.T, store kv.Storage) *testkit.TestKit { func newTestKitWithPlanCache(t *testing.T, store kv.Storage) *testkit.TestKit { tk := testkit.NewTestKit(t, store) - se, err := session.CreateSession4TestWithOpt(store, &session.Opt{PreparedPlanCache: plannercore.NewLRUPlanCache(100, - 0.1, math.MaxUint64, plannercore.PickPlanFromBucket, tk.Session())}) + se, err := session.CreateSession4TestWithOpt(store, &session.Opt{PreparedPlanCache: plannercore.NewLRUPlanCache(100, 0.1, math.MaxUint64, tk.Session())}) require.NoError(t, err) tk.SetSession(se) tk.RefreshConnectionID() @@ -162,7 +161,8 @@ func TestInfoSchemaFieldValue(t *testing.T) { " `DIGEST` varchar(64) DEFAULT '',\n" + " `MEM` bigint(21) unsigned DEFAULT NULL,\n" + " `DISK` bigint(21) unsigned DEFAULT NULL,\n" + - " `TxnStart` varchar(64) NOT NULL DEFAULT ''\n" + + " `TxnStart` varchar(64) NOT NULL DEFAULT '',\n" + + " `RESOURCE_GROUP` varchar(32) NOT NULL DEFAULT ''\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) tk.MustQuery("show create table information_schema.cluster_log").Check( testkit.Rows("" + @@ -264,6 +264,8 @@ func TestCurrentTimestampAsDefault(t *testing.T) { c_timestamp timestamp, c_timestamp_default timestamp default current_timestamp, c_timestamp_default_3 timestamp(3) default current_timestamp(3), + c_date_default date default current_date, + c_date_default_2 date default curdate(), c_varchar_default varchar(20) default "current_timestamp", c_varchar_default_3 varchar(20) default "current_timestamp(3)", c_varchar_default_on_update datetime default current_timestamp on update current_timestamp, @@ -276,6 +278,8 @@ func TestCurrentTimestampAsDefault(t *testing.T) { WHERE table_schema = "default_time_test" AND table_name = "default_time_table" ORDER BY column_name`, ).Check(testkit.Rows( + "c_date_default CURRENT_DATE ", + "c_date_default_2 CURRENT_DATE ", "c_datetime ", "c_datetime_default CURRENT_TIMESTAMP ", "c_datetime_default_2 CURRENT_TIMESTAMP(2) ", @@ -300,47 +304,50 @@ func TestSomeTables(t *testing.T) { tk.SetSession(se) sm := &testkit.MockSessionManager{PS: make([]*util.ProcessInfo, 0)} sm.PS = append(sm.PS, &util.ProcessInfo{ - ID: 1, - User: "user-1", - Host: "localhost", - Port: "", - DB: "information_schema", - Command: byte(1), - Digest: "abc1", - State: 1, - Info: "do something", - StmtCtx: tk.Session().GetSessionVars().StmtCtx, + ID: 1, + User: "user-1", + Host: "localhost", + Port: "", + DB: "information_schema", + Command: byte(1), + Digest: "abc1", + State: 1, + Info: "do something", + StmtCtx: tk.Session().GetSessionVars().StmtCtx, + ResourceGroupName: "rg1", }) sm.PS = append(sm.PS, &util.ProcessInfo{ - ID: 2, - User: "user-2", - Host: "localhost", - Port: "", - DB: "test", - Command: byte(2), - Digest: "abc2", - State: 2, - Info: strings.Repeat("x", 101), - StmtCtx: tk.Session().GetSessionVars().StmtCtx, + ID: 2, + User: "user-2", + Host: "localhost", + Port: "", + DB: "test", + Command: byte(2), + Digest: "abc2", + State: 2, + Info: strings.Repeat("x", 101), + StmtCtx: tk.Session().GetSessionVars().StmtCtx, + ResourceGroupName: "rg2", }) sm.PS = append(sm.PS, &util.ProcessInfo{ - ID: 3, - User: "user-3", - Host: "127.0.0.1", - Port: "12345", - DB: "test", - Command: byte(2), - Digest: "abc3", - State: 1, - Info: "check port", - StmtCtx: tk.Session().GetSessionVars().StmtCtx, + ID: 3, + User: "user-3", + Host: "127.0.0.1", + Port: "12345", + DB: "test", + Command: byte(2), + Digest: "abc3", + State: 1, + Info: "check port", + StmtCtx: tk.Session().GetSessionVars().StmtCtx, + ResourceGroupName: "rg3", }) tk.Session().SetSessionManager(sm) tk.MustQuery("select * from information_schema.PROCESSLIST order by ID;").Sort().Check( testkit.Rows( - fmt.Sprintf("1 user-1 localhost information_schema Quit 9223372036 %s %s abc1 0 0 ", "in transaction", "do something"), - fmt.Sprintf("2 user-2 localhost test Init DB 9223372036 %s %s abc2 0 0 ", "autocommit", strings.Repeat("x", 101)), - fmt.Sprintf("3 user-3 127.0.0.1:12345 test Init DB 9223372036 %s %s abc3 0 0 ", "in transaction", "check port"), + fmt.Sprintf("1 user-1 localhost information_schema Quit 9223372036 %s %s abc1 0 0 rg1", "in transaction", "do something"), + fmt.Sprintf("2 user-2 localhost test Init DB 9223372036 %s %s abc2 0 0 rg2", "autocommit", strings.Repeat("x", 101)), + fmt.Sprintf("3 user-3 127.0.0.1:12345 test Init DB 9223372036 %s %s abc3 0 0 rg3", "in transaction", "check port"), )) tk.MustQuery("SHOW PROCESSLIST;").Sort().Check( testkit.Rows( @@ -357,30 +364,32 @@ func TestSomeTables(t *testing.T) { sm = &testkit.MockSessionManager{PS: make([]*util.ProcessInfo, 0)} sm.PS = append(sm.PS, &util.ProcessInfo{ - ID: 1, - User: "user-1", - Host: "localhost", - DB: "information_schema", - Command: byte(1), - Digest: "abc1", - State: 1, + ID: 1, + User: "user-1", + Host: "localhost", + DB: "information_schema", + Command: byte(1), + Digest: "abc1", + State: 1, + ResourceGroupName: "rg1", }) sm.PS = append(sm.PS, &util.ProcessInfo{ - ID: 2, - User: "user-2", - Host: "localhost", - Command: byte(2), - Digest: "abc2", - State: 2, - Info: strings.Repeat("x", 101), - CurTxnStartTS: 410090409861578752, + ID: 2, + User: "user-2", + Host: "localhost", + Command: byte(2), + Digest: "abc2", + State: 2, + Info: strings.Repeat("x", 101), + CurTxnStartTS: 410090409861578752, + ResourceGroupName: "rg2", }) tk.Session().SetSessionManager(sm) tk.Session().GetSessionVars().TimeZone = time.UTC tk.MustQuery("select * from information_schema.PROCESSLIST order by ID;").Check( testkit.Rows( - fmt.Sprintf("1 user-1 localhost information_schema Quit 9223372036 %s %s abc1 0 0 ", "in transaction", ""), - fmt.Sprintf("2 user-2 localhost Init DB 9223372036 %s %s abc2 0 0 07-29 03:26:05.158(410090409861578752)", "autocommit", strings.Repeat("x", 101)), + fmt.Sprintf("1 user-1 localhost information_schema Quit 9223372036 %s %s abc1 0 0 rg1", "in transaction", ""), + fmt.Sprintf("2 user-2 localhost Init DB 9223372036 %s %s abc2 0 0 07-29 03:26:05.158(410090409861578752) rg2", "autocommit", strings.Repeat("x", 101)), )) tk.MustQuery("SHOW PROCESSLIST;").Sort().Check( testkit.Rows( @@ -394,11 +403,11 @@ func TestSomeTables(t *testing.T) { )) tk.MustQuery("select * from information_schema.PROCESSLIST where db is null;").Check( testkit.Rows( - fmt.Sprintf("2 user-2 localhost Init DB 9223372036 %s %s abc2 0 0 07-29 03:26:05.158(410090409861578752)", "autocommit", strings.Repeat("x", 101)), + fmt.Sprintf("2 user-2 localhost Init DB 9223372036 %s %s abc2 0 0 07-29 03:26:05.158(410090409861578752) rg2", "autocommit", strings.Repeat("x", 101)), )) tk.MustQuery("select * from information_schema.PROCESSLIST where Info is null;").Check( testkit.Rows( - fmt.Sprintf("1 user-1 localhost information_schema Quit 9223372036 %s %s abc1 0 0 ", "in transaction", ""), + fmt.Sprintf("1 user-1 localhost information_schema Quit 9223372036 %s %s abc1 0 0 rg1", "in transaction", ""), )) } @@ -531,18 +540,168 @@ func TestSlowQuery(t *testing.T) { slowLogFileName := "tidb_slow.log" prepareSlowLogfile(t, slowLogFileName) defer func() { require.NoError(t, os.Remove(slowLogFileName)) }() + expectedRes := [][]interface{}{ + {"2019-02-12 19:33:56.571953", + "406315658548871171", + "root", + "localhost", + "6", + "57", + "0.12", + "4.895492", + "0.4", + "0.2", + "0.000000003", + "2", + "0.000000002", + "0.00000001", + "0.000000003", + "0.19", + "0.21", + "0.01", + "0", + "0.18", + "[txnLock]", + "0.03", + "0", + "15", + "480", + "1", + "8", + "0.3824278", + "0.161", + "0.101", + "0.092", + "1.71", + "1", + "100001", + "100000", + "100", + "10", + "10", + "10", + "100", + "test", + "", + "0", + "42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772", + "t1:1,t2:2", + "0.1", + "0.2", + "0.03", + "127.0.0.1:20160", + "0.05", + "0.6", + "0.8", + "0.0.0.0:20160", + "70724", + "65536", + "0", + "0", + "0", + "0", + "10", + "", + "", + "0", + "1", + "0", + "0", + "1", + "0", + "0", + "abcd", + "60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4", + "", + "update t set i = 2;", + "select * from t_slim;"}, + {"2021-09-08 14:39:54.506967", + "427578666238083075", + "root", + "172.16.0.0", + "40507", + "0", + "0", + "25.571605962", + "0.002923536", + "0.006800973", + "0.002100764", + "0", + "0", + "0", + "0.000015801", + "25.542014572", + "0", + "0.002294647", + "0.000605473", + "12.483", + "[tikvRPC regionMiss tikvRPC regionMiss regionMiss]", + "0", + "0", + "624", + "172064", + "60", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "rtdb", + "", + "0", + "124acb3a0bec903176baca5f9da00b4e7512a41c93b417923f26502edeb324cc", + "", + "0", + "0", + "0", + "", + "0", + "0", + "0", + "", + "856544", + "0", + "86.635049185", + "0.015486658", + "100.054", + "0", + "0", + "", + "", + "0", + "1", + "0", + "0", + "0", + "0", + "0", + "", + "", + "", + "", + "INSERT INTO ...;", + }, + } tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", slowLogFileName)) tk.MustExec("set time_zone = '+08:00';") re := tk.MustQuery("select * from information_schema.slow_query") - re.Check(testkit.RowsWithSep("|", "2019-02-12 19:33:56.571953|406315658548871171|root|localhost|6|57|0.12|4.895492|0.4|0.2|0.000000003|2|0.000000002|0.00000001|0.000000003|0.19|0.21|0.01|0|0.18|[txnLock]|0.03|0|15|480|1|8|0.3824278|0.161|0.101|0.092|1.71|1|100001|100000|100|10|10|10|100|test||0|42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772|t1:1,t2:2|0.1|0.2|0.03|127.0.0.1:20160|0.05|0.6|0.8|0.0.0.0:20160|70724|65536|0|0|0|0|10||0|1|0|0|1|0|0|abcd|60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4||update t set i = 2;|select * from t_slim;", - "2021-09-08|14:39:54.506967|427578666238083075|root|172.16.0.0|40507|0|0|25.571605962|0.002923536|0.006800973|0.002100764|0|0|0|0.000015801|25.542014572|0|0.002294647|0.000605473|12.483|[tikvRPC regionMiss tikvRPC regionMiss regionMiss]|0|0|624|172064|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|rtdb||0|124acb3a0bec903176baca5f9da00b4e7512a41c93b417923f26502edeb324cc||0|0|0||0|0|0||856544|0|86.635049185|0.015486658|100.054|0|0||0|1|0|0|0|0|0|||||INSERT INTO ...;", - )) + re.Check(expectedRes) + tk.MustExec("set time_zone = '+00:00';") re = tk.MustQuery("select * from information_schema.slow_query") - re.Check(testkit.RowsWithSep("|", "2019-02-12 11:33:56.571953|406315658548871171|root|localhost|6|57|0.12|4.895492|0.4|0.2|0.000000003|2|0.000000002|0.00000001|0.000000003|0.19|0.21|0.01|0|0.18|[txnLock]|0.03|0|15|480|1|8|0.3824278|0.161|0.101|0.092|1.71|1|100001|100000|100|10|10|10|100|test||0|42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772|t1:1,t2:2|0.1|0.2|0.03|127.0.0.1:20160|0.05|0.6|0.8|0.0.0.0:20160|70724|65536|0|0|0|0|10||0|1|0|0|1|0|0|abcd|60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4||update t set i = 2;|select * from t_slim;", - "2021-09-08|06:39:54.506967|427578666238083075|root|172.16.0.0|40507|0|0|25.571605962|0.002923536|0.006800973|0.002100764|0|0|0|0.000015801|25.542014572|0|0.002294647|0.000605473|12.483|[tikvRPC regionMiss tikvRPC regionMiss regionMiss]|0|0|624|172064|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|rtdb||0|124acb3a0bec903176baca5f9da00b4e7512a41c93b417923f26502edeb324cc||0|0|0||0|0|0||856544|0|86.635049185|0.015486658|100.054|0|0||0|1|0|0|0|0|0|||||INSERT INTO ...;", - )) + expectedRes[0][0] = "2019-02-12 11:33:56.571953" + expectedRes[1][0] = "2021-09-08 06:39:54.506967" + re.Check(expectedRes) // Test for long query. f, err := os.OpenFile(slowLogFileName, os.O_CREATE|os.O_WRONLY, 0644) @@ -588,12 +747,12 @@ INSERT INTO ...; defer func() { require.NoError(t, os.Remove(slowLogFileName)) }() tk := testkit.NewTestKit(t, store) - //check schema + // check schema tk.MustQuery(`select COUNT(*) from information_schema.columns WHERE table_name = 'slow_query' and column_name = '` + columnName + `'`). Check(testkit.Rows("1")) - //check select + // check select tk.MustQuery(`select ` + columnName + ` from information_schema.slow_query`).Check(testkit.Rows("1")) } @@ -676,8 +835,14 @@ func TestSelectHiddenColumn(t *testing.T) { func TestFormatVersion(t *testing.T) { // Test for defaultVersions. - defaultVersions := []string{"5.7.25-TiDB-None", "5.7.25-TiDB-8.0.18", "5.7.25-TiDB-8.0.18-beta.1", "5.7.25-TiDB-v4.0.0-beta-446-g5268094af"} - defaultRes := []string{"None", "8.0.18", "8.0.18-beta.1", "4.0.0-beta"} + defaultVersions := []string{ + "5.7.25-TiDB-None", + "5.7.25-TiDB-8.0.18", + "5.7.25-TiDB-8.0.18-beta.1", + "5.7.25-TiDB-v4.0.0-beta-446-g5268094af", + "5.7.25-TiDB-", + "5.7.25-TiDB-v4.0.0-TiDB-446"} + defaultRes := []string{"None", "8.0.18", "8.0.18-beta.1", "4.0.0-beta", "", "4.0.0-TiDB"} for i, v := range defaultVersions { version := infoschema.FormatTiDBVersion(v, true) require.Equal(t, defaultRes[i], version) @@ -1052,7 +1217,7 @@ func TestStmtSummaryInternalQuery(t *testing.T) { "where digest_text like \"select `original_sql` , `bind_sql` , `default_db` , status%\"" tk.MustQuery(sql).Check(testkit.Rows( "select `original_sql` , `bind_sql` , `default_db` , status , `create_time` , `update_time` , charset , " + - "collation , source from `mysql` . `bind_info` where `update_time` > ? order by `update_time` , `create_time`")) + "collation , source , `sql_digest` , `plan_digest` from `mysql` . `bind_info` where `update_time` > ? order by `update_time` , `create_time`")) // Test for issue #21642. tk.MustQuery(`select tidb_version()`) @@ -1387,16 +1552,19 @@ func TestTiDBTrx(t *testing.T) { tk.MustExec("update test_tidb_trx set i = i + 1") _, digest := parser.NormalizeDigest("update test_tidb_trx set i = i + 1") sm := &testkit.MockSessionManager{TxnInfo: make([]*txninfo.TxnInfo, 2)} + memDBTracker := memory.NewTracker(memory.LabelForMemDB, -1) + memDBTracker.Consume(19) + tk.Session().GetSessionVars().MemDBFootprint = memDBTracker sm.TxnInfo[0] = &txninfo.TxnInfo{ StartTS: 424768545227014155, CurrentSQLDigest: digest.String(), State: txninfo.TxnIdle, EntriesCount: 1, - EntriesSize: 19, ConnectionID: 2, Username: "root", CurrentDB: "test", } + blockTime2 := time.Date(2021, 05, 20, 13, 18, 30, 123456000, time.Local) sm.TxnInfo[1] = &txninfo.TxnInfo{ StartTS: 425070846483628033, @@ -1413,7 +1581,7 @@ func TestTiDBTrx(t *testing.T) { tk.MustQuery("select * from information_schema.TIDB_TRX;").Check(testkit.Rows( "424768545227014155 2021-05-07 12:56:48.001000 "+digest.String()+" update `test_tidb_trx` set `i` = `i` + ? Idle 1 19 2 root test [] ", - "425070846483628033 2021-05-20 21:16:35.778000 LockWaiting 2021-05-20 13:18:30.123456 0 0 10 user1 db1 [\"sql1\",\"sql2\",\""+digest.String()+"\"] ")) + "425070846483628033 2021-05-20 21:16:35.778000 LockWaiting 2021-05-20 13:18:30.123456 0 19 10 user1 db1 [\"sql1\",\"sql2\",\""+digest.String()+"\"] ")) // Test the all_sql_digests column can be directly passed to the tidb_decode_sql_digests function. require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/sqlDigestRetrieverSkipRetrieveGlobal", "return")) @@ -1513,10 +1681,6 @@ func TestVariablesInfo(t *testing.T) { tk := testkit.NewTestKit(t, store) - if !variable.EnableConcurrentDDL.Load() { - t.Skip("skip test when concurrent DDL is disabled") - } - tk.MustExec("use information_schema") tk.MustExec("SET GLOBAL innodb_compression_level = 8;") @@ -1547,15 +1711,14 @@ func TestVariablesInfo(t *testing.T) { // See session/bootstrap.go:doDMLWorks() for where the exceptions are defined. stmt := tk.MustQuery(`SELECT variable_name, default_value, current_value FROM information_schema.variables_info WHERE current_value != default_value and default_value != '' ORDER BY variable_name`) stmt.Check(testkit.Rows( - "last_sql_use_alloc OFF ON", // for test stability - "tidb_enable_auto_analyze ON OFF", // always changed for tests - "tidb_enable_collect_execution_info ON OFF", // for test stability - "tidb_enable_mutation_checker OFF ON", // for new installs - "tidb_enable_plan_replayer_capture OFF false", // for enable plan replayer capture - "tidb_mem_oom_action CANCEL LOG", // always changed for tests - "tidb_row_format_version 1 2", // for new installs - "tidb_txn_assertion_level OFF FAST", // for new installs - "timestamp 0 123456789", // always dynamic + "last_sql_use_alloc OFF ON", // for test stability + "tidb_enable_auto_analyze ON OFF", // always changed for tests + "tidb_enable_collect_execution_info ON OFF", // for test stability + "tidb_enable_mutation_checker OFF ON", // for new installs + "tidb_mem_oom_action CANCEL LOG", // always changed for tests + "tidb_row_format_version 1 2", // for new installs + "tidb_txn_assertion_level OFF FAST", // for new installs + "timestamp 0 123456789", // always dynamic )) } @@ -1653,3 +1816,33 @@ func TestMemoryUsageAndOpsHistory(t *testing.T) { require.Equal(t, row[10], "e3237ec256015a3566757e0c2742507cd30ae04e4cac2fbc14d269eafe7b067b") // SQL_DIGEST require.Equal(t, row[11], "explain analyze select * from t t1 join t t2 join t t3 on t1.a=t2.a and t1.a=t3.a order by t1.a") // SQL_TEXT } + +func TestAddFieldsForBinding(t *testing.T) { + s := new(clusterTablesSuite) + s.store, s.dom = testkit.CreateMockStoreAndDomain(t) + s.rpcserver, s.listenAddr = s.setUpRPCService(t, "127.0.0.1:0", nil) + s.httpServer, s.mockAddr = s.setUpMockPDHTTPServer() + s.startTime = time.Now() + defer s.httpServer.Close() + defer s.rpcserver.Stop() + tk := s.newTestKitWithRoot(t) + + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, key(a))") + tk.MustExec("select /*+ ignore_index(t, a)*/ * from t where a = 1") + planDigest := "4e3159169cc63c14b139a4e7d72eae1759875c9a9581f94bb2079aae961189cb" + rows := tk.MustQuery(fmt.Sprintf("select stmt_type, prepared, sample_user, schema_name, query_sample_text, charset, collation, plan_hint, digest_text "+ + "from information_schema.cluster_statements_summary where plan_digest = '%s'", planDigest)).Rows() + + require.Equal(t, rows[0][0], "Select") + require.Equal(t, rows[0][1], "0") + require.Equal(t, rows[0][2], "root") + require.Equal(t, rows[0][3], "test") + require.Equal(t, rows[0][4], "select /*+ ignore_index(t, a)*/ * from t where a = 1") + require.Equal(t, rows[0][5], "utf8mb4") + require.Equal(t, rows[0][6], "utf8mb4_bin") + require.Equal(t, rows[0][7], "use_index(@`sel_1` `test`.`t` ), ignore_index(`t` `a`)") + require.Equal(t, rows[0][8], "select * from `t` where `a` = ?") +} diff --git a/keyspace/BUILD.bazel b/keyspace/BUILD.bazel new file mode 100644 index 0000000000000..a536722a018d7 --- /dev/null +++ b/keyspace/BUILD.bazel @@ -0,0 +1,12 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "keyspace", + srcs = ["keyspace.go"], + importpath = "github.com/pingcap/tidb/keyspace", + visibility = ["//visibility:public"], + deps = [ + "@com_github_pingcap_kvproto//pkg/kvrpcpb", + "@com_github_tikv_client_go_v2//tikv", + ], +) diff --git a/keyspace/keyspace.go b/keyspace/keyspace.go new file mode 100644 index 0000000000000..103d0f742cee7 --- /dev/null +++ b/keyspace/keyspace.go @@ -0,0 +1,38 @@ +// Copyright 2023 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 keyspace + +import ( + "fmt" + + "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/tikv/client-go/v2/tikv" +) + +const ( + // tidbKeyspaceEtcdPathPrefix is the keyspace prefix for etcd namespace + tidbKeyspaceEtcdPathPrefix = "/keyspaces/tidb/" +) + +// CodecV1 represents api v1 codec. +var CodecV1 = tikv.NewCodecV1(tikv.ModeTxn) + +// MakeKeyspaceEtcdNamespace return the keyspace prefix path for etcd namespace +func MakeKeyspaceEtcdNamespace(c tikv.Codec) string { + if c.GetAPIVersion() == kvrpcpb.APIVersion_V1 { + return "" + } + return fmt.Sprintf(tidbKeyspaceEtcdPathPrefix+"%d", c.GetKeyspaceID()) +} diff --git a/kv/BUILD.bazel b/kv/BUILD.bazel index 32dd9f1474179..309251993d7f0 100644 --- a/kv/BUILD.bazel +++ b/kv/BUILD.bazel @@ -30,6 +30,7 @@ go_library( "//types", "//util/codec", "//util/dbterror", + "//util/intest", "//util/logutil", "//util/memory", "//util/set", @@ -48,6 +49,7 @@ go_library( "@com_github_tikv_client_go_v2//tikvrpc", "@com_github_tikv_client_go_v2//util", "@com_github_tikv_pd_client//:client", + "@org_golang_x_exp//slices", "@org_uber_go_zap//:zap", ], ) @@ -82,6 +84,7 @@ go_test( "@com_github_pingcap_kvproto//pkg/coprocessor", "@com_github_pingcap_kvproto//pkg/deadlock", "@com_github_pingcap_kvproto//pkg/kvrpcpb", + "@com_github_pingcap_tipb//go-tipb", "@com_github_stretchr_testify//assert", "@com_github_stretchr_testify//require", "@com_github_tikv_client_go_v2//oracle", diff --git a/kv/interface_mock_test.go b/kv/interface_mock_test.go index 8090463c84223..283eb0858b716 100644 --- a/kv/interface_mock_test.go +++ b/kv/interface_mock_test.go @@ -52,6 +52,13 @@ func (t *mockTxn) LockKeys(_ context.Context, _ *LockCtx, _ ...Key) error { return nil } +func (t *mockTxn) LockKeysFunc(_ context.Context, _ *LockCtx, fn func(), _ ...Key) error { + if fn != nil { + fn() + } + return nil +} + func (t *mockTxn) SetOption(opt int, val interface{}) { t.opts[opt] = val } @@ -161,6 +168,20 @@ func (t *mockTxn) UpdateMemBufferFlags(_ []byte, _ ...FlagsOp) { } +func (t *mockTxn) SetMemoryFootprintChangeHook(func(uint64)) { + +} + +func (t *mockTxn) Mem() uint64 { + return 0 +} + +func (t *mockTxn) StartAggressiveLocking() error { return nil } +func (t *mockTxn) RetryAggressiveLocking(_ context.Context) error { return nil } +func (t *mockTxn) CancelAggressiveLocking(_ context.Context) error { return nil } +func (t *mockTxn) DoneAggressiveLocking(_ context.Context) error { return nil } +func (t *mockTxn) IsInAggressiveLockingMode() bool { return false } + // newMockTxn new a mockTxn. func newMockTxn() Transaction { return &mockTxn{ @@ -172,6 +193,10 @@ func newMockTxn() Transaction { // mockStorage is used to start a must commit-failed txn. type mockStorage struct{} +func (s *mockStorage) GetCodec() tikv.Codec { + return nil +} + func (s *mockStorage) Begin(opts ...tikv.TxnOption) (Transaction, error) { return newMockTxn(), nil } diff --git a/kv/key.go b/kv/key.go index 6b5ca28400721..3c243a06ed2eb 100644 --- a/kv/key.go +++ b/kv/key.go @@ -149,6 +149,7 @@ type Handle interface { // IntValue returns the int64 value if IsInt is true, it panics if IsInt returns false. IntValue() int64 // Next returns the minimum handle that is greater than this handle. + // The returned handle is not guaranteed to be able to decode. Next() Handle // Equal returns if the handle equals to another handle, it panics if the types are different. Equal(h Handle) bool @@ -299,6 +300,7 @@ func (*CommonHandle) IntValue() int64 { } // Next implements the Handle interface. +// Note that the returned encoded field is not guaranteed to be able to decode. func (ch *CommonHandle) Next() Handle { return &CommonHandle{ encoded: Key(ch.encoded).PrefixNext(), diff --git a/kv/kv.go b/kv/kv.go index 06e86f41659cb..057c22fb7312b 100644 --- a/kv/kv.go +++ b/kv/kv.go @@ -15,6 +15,7 @@ package kv import ( + "bytes" "context" "crypto/tls" "time" @@ -33,6 +34,7 @@ import ( "github.com/tikv/client-go/v2/tikvrpc" "github.com/tikv/client-go/v2/util" pd "github.com/tikv/pd/client" + "golang.org/x/exp/slices" ) // UnCommitIndexKVFlag uses to indicate the index key/value is no need to commit. @@ -201,8 +203,13 @@ type LockCtx = tikvstore.LockCtx type Transaction interface { RetrieverMutator AssertionProto + AggressiveLockingController // Size returns sum of keys and values length. Size() int + // Mem returns the memory consumption of the transaction. + Mem() uint64 + // SetMemoryFootprintChangeHook sets the hook that will be called when the memory footprint changes. + SetMemoryFootprintChangeHook(func(uint64)) // Len returns the number of entries in the DB. Len() int // Reset reset the Transaction to initial states. @@ -216,6 +223,10 @@ type Transaction interface { // LockKeys tries to lock the entries with the keys in KV store. // Will block until all keys are locked successfully or an error occurs. LockKeys(ctx context.Context, lockCtx *LockCtx, keys ...Key) error + // LockKeysFunc tries to lock the entries with the keys in KV store. + // Will block until all keys are locked successfully or an error occurs. + // fn is called before LockKeys unlocks the keys. + LockKeysFunc(ctx context.Context, lockCtx *LockCtx, fn func(), keys ...Key) error // SetOption sets an option with a value, when val is nil, uses the default // value of this option. SetOption(opt int, val interface{}) @@ -271,6 +282,15 @@ type AssertionProto interface { SetAssertion(key []byte, assertion ...FlagsOp) error } +// AggressiveLockingController is the interface that defines aggressive locking related operations. +type AggressiveLockingController interface { + StartAggressiveLocking() error + RetryAggressiveLocking(ctx context.Context) error + CancelAggressiveLocking(ctx context.Context) error + DoneAggressiveLocking(ctx context.Context) error + IsInAggressiveLockingMode() bool +} + // Client is used to send request to KV layer. type Client interface { // Send sends request to KV layer, returns a Response. @@ -331,13 +351,168 @@ func (t StoreType) Name() string { return "unspecified" } +// KeyRanges wrap the ranges for partitioned table cases. +// We might send ranges from different in the one request. +type KeyRanges struct { + ranges [][]KeyRange + rowCountHints [][]int + + isPartitioned bool +} + +// NewPartitionedKeyRanges constructs a new RequestRange for partitioned table. +func NewPartitionedKeyRanges(ranges [][]KeyRange) *KeyRanges { + return NewPartitionedKeyRangesWithHints(ranges, nil) +} + +// NewNonParitionedKeyRanges constructs a new RequestRange for a non partitioned table. +func NewNonParitionedKeyRanges(ranges []KeyRange) *KeyRanges { + return NewNonParitionedKeyRangesWithHint(ranges, nil) +} + +// NewPartitionedKeyRangesWithHints constructs a new RequestRange for partitioned table with row count hint. +func NewPartitionedKeyRangesWithHints(ranges [][]KeyRange, hints [][]int) *KeyRanges { + return &KeyRanges{ + ranges: ranges, + rowCountHints: hints, + isPartitioned: true, + } +} + +// NewNonParitionedKeyRangesWithHint constructs a new RequestRange for a non partitioned table with rou count hint. +func NewNonParitionedKeyRangesWithHint(ranges []KeyRange, hints []int) *KeyRanges { + rr := &KeyRanges{ + ranges: [][]KeyRange{ranges}, + isPartitioned: false, + } + if hints != nil { + rr.rowCountHints = [][]int{hints} + } + return rr +} + +// FirstPartitionRange returns the the result of first range. +// We may use some func to generate ranges for both partitioned table and non partitioned table. +// This method provides a way to fallback to non-partitioned ranges. +func (rr *KeyRanges) FirstPartitionRange() []KeyRange { + if len(rr.ranges) == 0 { + return []KeyRange{} + } + return rr.ranges[0] +} + +// SetToNonPartitioned set the status to non-partitioned. +func (rr *KeyRanges) SetToNonPartitioned() error { + if len(rr.ranges) > 1 { + return errors.Errorf("you want to change the partitioned ranges to non-partitioned ranges") + } + rr.isPartitioned = false + return nil +} + +// AppendSelfTo appends itself to another slice. +func (rr *KeyRanges) AppendSelfTo(ranges []KeyRange) []KeyRange { + for _, r := range rr.ranges { + ranges = append(ranges, r...) + } + return ranges +} + +// SortByFunc sorts each partition's ranges. +// Since the ranges are sorted in most cases, we check it first. +func (rr *KeyRanges) SortByFunc(sortFunc func(i, j KeyRange) bool) { + if !slices.IsSortedFunc(rr.ranges, func(i, j []KeyRange) bool { + // A simple short-circuit since the empty range actually won't make anything wrong. + if len(i) == 0 || len(j) == 0 { + return true + } + return sortFunc(i[0], j[0]) + }) { + slices.SortFunc(rr.ranges, func(i, j []KeyRange) bool { + if len(i) == 0 { + return true + } + if len(j) == 0 { + return false + } + return sortFunc(i[0], j[0]) + }) + } + for i := range rr.ranges { + if !slices.IsSortedFunc(rr.ranges[i], sortFunc) { + slices.SortFunc(rr.ranges[i], sortFunc) + } + } +} + +// ForEachPartitionWithErr runs the func for each partition with an error check. +func (rr *KeyRanges) ForEachPartitionWithErr(theFunc func([]KeyRange, []int) error) (err error) { + for i := range rr.ranges { + var hints []int + if len(rr.rowCountHints) > i { + hints = rr.rowCountHints[i] + } + err = theFunc(rr.ranges[i], hints) + if err != nil { + return err + } + } + return nil +} + +// ForEachPartition runs the func for each partition without error check. +func (rr *KeyRanges) ForEachPartition(theFunc func([]KeyRange)) { + for i := range rr.ranges { + theFunc(rr.ranges[i]) + } +} + +// PartitionNum returns how many partition is involved in the ranges. +func (rr *KeyRanges) PartitionNum() int { + return len(rr.ranges) +} + +// IsFullySorted checks whether the ranges are sorted inside partition and each partition is also sorated. +func (rr *KeyRanges) IsFullySorted() bool { + sortedByPartition := slices.IsSortedFunc(rr.ranges, func(i, j []KeyRange) bool { + // A simple short-circuit since the empty range actually won't make anything wrong. + if len(i) == 0 || len(j) == 0 { + return true + } + return bytes.Compare(i[0].StartKey, j[0].StartKey) < 0 + }) + if !sortedByPartition { + return false + } + for _, ranges := range rr.ranges { + if !slices.IsSortedFunc(ranges, func(i, j KeyRange) bool { + return bytes.Compare(i.StartKey, j.StartKey) < 0 + }) { + return false + } + } + return true +} + +// TotalRangeNum returns how many ranges there are. +func (rr *KeyRanges) TotalRangeNum() int { + ret := 0 + for _, r := range rr.ranges { + ret += len(r) + } + return ret +} + // Request represents a kv request. type Request struct { // Tp is the request type. - Tp int64 - StartTs uint64 - Data []byte - KeyRanges []KeyRange + Tp int64 + StartTs uint64 + Data []byte + + // KeyRanges makes sure that the request is sent first by partition then by region. + // When the table is small, it's possible that multiple partitions are in the same region. + KeyRanges *KeyRanges // For PartitionTableScan used by tiflash. PartitionIDAndRanges []PartitionIDAndRanges @@ -394,8 +569,12 @@ type Request struct { } // RequestSource indicates whether the request is an internal request. RequestSource util.RequestSource - // FixedRowCountHint is the optimization hint for copr request for task scheduling. - FixedRowCountHint []int + // StoreBatchSize indicates the batch size of coprocessor in the same store. + StoreBatchSize int + // ResourceGroupName is the name of the bind resource group. + ResourceGroupName string + // LimitSize indicates whether the request is scan and limit + LimitSize uint64 } // CoprRequestAdjuster is used to check and adjust a copr request according to specific rules. @@ -504,6 +683,8 @@ type Storage interface { GetMinSafeTS(txnScope string) uint64 // GetLockWaits return all lock wait information GetLockWaits() ([]*deadlockpb.WaitForEntry, error) + // GetCodec gets the codec of the storage. + GetCodec() tikv.Codec } // EtcdBackend is used for judging a storage is a real TiKV. diff --git a/kv/mpp.go b/kv/mpp.go index b0752f8186deb..095352c02832a 100644 --- a/kv/mpp.go +++ b/kv/mpp.go @@ -16,33 +16,101 @@ package kv import ( "context" - "sync" + "strconv" + "strings" "time" "github.com/pingcap/kvproto/pkg/mpp" + "github.com/pingcap/tidb/util/memory" + "github.com/pingcap/tipb/go-tipb" ) +// MppVersion indicates the mpp-version used to build mpp plan +type MppVersion int64 + +const ( + // MppVersionV0 supports TiFlash version [~, ~] + MppVersionV0 MppVersion = iota + + // MppVersionV1 supports TiFlash version [v6.6.x, ~] + MppVersionV1 + + // MppVersionV2 + // MppVersionV3 + + mppVersionMax + + newestMppVersion MppVersion = mppVersionMax - 1 + + // MppVersionUnspecified means the illegal or unspecified version, it only used in TiDB. + MppVersionUnspecified MppVersion = -1 + + // MppVersionUnspecifiedName denotes name of UNSPECIFIED mpp version + MppVersionUnspecifiedName string = "UNSPECIFIED" +) + +// ToInt64 transforms MppVersion to int64 +func (v MppVersion) ToInt64() int64 { + return int64(v) +} + +// ToMppVersion transforms string to MppVersion +func ToMppVersion(name string) (MppVersion, bool) { + name = strings.ToUpper(name) + if name == MppVersionUnspecifiedName { + return MppVersionUnspecified, true + } + v, err := strconv.ParseInt(name, 10, 64) + if err != nil { + return MppVersionUnspecified, false + } + version := MppVersion(v) + if version >= MppVersionUnspecified && version <= newestMppVersion { + return version, true + } + return MppVersionUnspecified, false +} + +// GetNewestMppVersion returns the mpp-version can be used in mpp plan +func GetNewestMppVersion() MppVersion { + return newestMppVersion +} + // MPPTaskMeta means the meta info such as location of a mpp task. type MPPTaskMeta interface { // GetAddress indicates which node this task should execute on. GetAddress() string } +// MPPQueryID means the global unique id of a mpp query. +type MPPQueryID struct { + QueryTs uint64 // timestamp of query execution, used for TiFlash minTSO schedule + LocalQueryID uint64 // unique mpp query id in local tidb memory. + ServerID uint64 +} + // MPPTask means the minimum execution unit of a mpp computation job. type MPPTask struct { - Meta MPPTaskMeta // on which store this task will execute - ID int64 // mppTaskID - StartTs uint64 - TableID int64 // physical table id + Meta MPPTaskMeta // on which store this task will execute + ID int64 // mppTaskID + StartTs uint64 + MppQueryID MPPQueryID + TableID int64 // physical table id + MppVersion MppVersion // mpp version - PartitionTableIDs []int64 + PartitionTableIDs []int64 + IsDisaggregatedTiFlashStaticPrune bool } // ToPB generates the pb structure. func (t *MPPTask) ToPB() *mpp.TaskMeta { meta := &mpp.TaskMeta{ - StartTs: t.StartTs, - TaskId: t.ID, + StartTs: t.StartTs, + QueryTs: t.MppQueryID.QueryTs, + LocalQueryId: t.MppQueryID.LocalQueryID, + ServerId: t.MppQueryID.ServerID, + TaskId: t.ID, + MppVersion: t.MppVersion.ToInt64(), } if t.ID != -1 { meta.Address = t.Meta.GetAddress() @@ -71,20 +139,20 @@ type MPPDispatchRequest struct { IsRoot bool // root task returns data to tidb directly. Timeout uint64 // If task is assigned but doesn't receive a connect request during timeout, the task should be destroyed. // SchemaVer is for any schema-ful storage (like tiflash) to validate schema correctness if necessary. - SchemaVar int64 - StartTs uint64 - ID int64 // identify a single task - State MppTaskStates + SchemaVar int64 + StartTs uint64 + MppQueryID MPPQueryID + ID int64 // identify a single task + State MppTaskStates } // MPPClient accepts and processes mpp requests. type MPPClient interface { // ConstructMPPTasks schedules task for a plan fragment. // TODO:: This interface will be refined after we support more executors. - ConstructMPPTasks(context.Context, *MPPBuildTasksRequest, *sync.Map, time.Duration) ([]MPPTaskMeta, error) - + ConstructMPPTasks(context.Context, *MPPBuildTasksRequest, time.Duration) ([]MPPTaskMeta, error) // DispatchMPPTasks dispatches ALL mpp requests at once, and returns an iterator that transfers the data. - DispatchMPPTasks(ctx context.Context, vars interface{}, reqs []*MPPDispatchRequest, needTriggerFallback bool, startTs uint64) Response + DispatchMPPTasks(ctx context.Context, vars interface{}, reqs []*MPPDispatchRequest, needTriggerFallback bool, startTs uint64, mppQueryID MPPQueryID, mppVersion MppVersion, memTracker *memory.Tracker) Response } // MPPBuildTasksRequest request the stores allocation for a mpp plan fragment. @@ -95,3 +163,56 @@ type MPPBuildTasksRequest struct { PartitionIDAndRanges []PartitionIDAndRanges } + +// ExchangeCompressionMode means the compress method used in exchange operator +type ExchangeCompressionMode int + +const ( + // ExchangeCompressionModeNONE indicates no compression + ExchangeCompressionModeNONE ExchangeCompressionMode = iota + // ExchangeCompressionModeFast indicates fast compression/decompression speed, compression ratio is lower than HC mode + ExchangeCompressionModeFast + // ExchangeCompressionModeHC indicates high compression (HC) ratio mode + ExchangeCompressionModeHC + // ExchangeCompressionModeUnspecified indicates unspecified compress method, let TiDB choose one + ExchangeCompressionModeUnspecified + + // RecommendedExchangeCompressionMode indicates recommended compression mode + RecommendedExchangeCompressionMode ExchangeCompressionMode = ExchangeCompressionModeFast + + exchangeCompressionModeUnspecifiedName string = "UNSPECIFIED" +) + +// Name returns the name of ExchangeCompressionMode +func (t ExchangeCompressionMode) Name() string { + if t == ExchangeCompressionModeUnspecified { + return exchangeCompressionModeUnspecifiedName + } + return t.ToTipbCompressionMode().String() +} + +// ToExchangeCompressionMode returns the ExchangeCompressionMode from name +func ToExchangeCompressionMode(name string) (ExchangeCompressionMode, bool) { + name = strings.ToUpper(name) + if name == exchangeCompressionModeUnspecifiedName { + return ExchangeCompressionModeUnspecified, true + } + value, ok := tipb.CompressionMode_value[name] + if ok { + return ExchangeCompressionMode(value), true + } + return ExchangeCompressionModeNONE, false +} + +// ToTipbCompressionMode returns tipb.CompressionMode from kv.ExchangeCompressionMode +func (t ExchangeCompressionMode) ToTipbCompressionMode() tipb.CompressionMode { + switch t { + case ExchangeCompressionModeNONE: + return tipb.CompressionMode_NONE + case ExchangeCompressionModeFast: + return tipb.CompressionMode_FAST + case ExchangeCompressionModeHC: + return tipb.CompressionMode_HIGH_COMPRESSION + } + return tipb.CompressionMode_NONE +} diff --git a/kv/option.go b/kv/option.go index 888a1e24f0fa0..631e69da7613d 100644 --- a/kv/option.go +++ b/kv/option.go @@ -15,6 +15,8 @@ package kv import ( + "context" + "github.com/tikv/client-go/v2/util" ) @@ -93,6 +95,10 @@ const ( ReplicaReadAdjuster // ScanBatchSize set the iter scan batch size. ScanBatchSize + // TxnSource set the source of this transaction. + TxnSource + // ResourceGroupName set the bind resource group name. + ResourceGroupName ) // ReplicaReadType is the type of replica to read data from @@ -109,6 +115,10 @@ const ( ReplicaReadClosest // ReplicaReadClosestAdaptive stands for 'read from follower which locates in the same zone if the response size exceeds certain threshold' ReplicaReadClosestAdaptive + // ReplicaReadLearner stands for 'read from learner'. + ReplicaReadLearner + // ReplicaReadPreferLeader stands for 'read from leader and auto-turn to followers if leader is abnormal'. + ReplicaReadPreferLeader ) // IsFollowerRead checks if follower is going to be used to read data. @@ -130,6 +140,15 @@ type RequestSource = util.RequestSource // WithInternalSourceType create context with internal source. var WithInternalSourceType = util.WithInternalSourceType +// GetInternalSourceType get internal source +func GetInternalSourceType(ctx context.Context) string { + v := ctx.Value(util.RequestSourceKey) + if v == nil { + return "" + } + return v.(util.RequestSource).RequestSourceType +} + const ( // InternalTxnOthers is the type of requests that consume low resources. // This reduces the size of metrics. @@ -165,4 +184,6 @@ const ( InternalTxnBR = InternalTxnTools // InternalTxnTrace handles the trace statement. InternalTxnTrace = "Trace" + // InternalTxnTTL is the type of TTL usage + InternalTxnTTL = "TTL" ) diff --git a/kv/txn.go b/kv/txn.go index d7828c7fb3138..fbbe6bdf27137 100644 --- a/kv/txn.go +++ b/kv/txn.go @@ -17,7 +17,6 @@ package kv import ( "context" "errors" - "flag" "fmt" "math" "math/rand" @@ -26,6 +25,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/util/intest" "github.com/pingcap/tidb/util/logutil" "github.com/tikv/client-go/v2/oracle" "go.uber.org/zap" @@ -195,20 +195,22 @@ func BackOff(attempts uint) int { func setRequestSourceForInnerTxn(ctx context.Context, txn Transaction) { if source := ctx.Value(RequestSourceKey); source != nil { requestSource := source.(RequestSource) - if !requestSource.RequestSourceInternal { - logutil.Logger(ctx).Warn("`RunInNewTxn` should be used by inner txn only") + if requestSource.RequestSourceType != "" { + if !requestSource.RequestSourceInternal { + logutil.Logger(ctx).Warn("`RunInNewTxn` should be used by inner txn only") + } + txn.SetOption(RequestSourceInternal, requestSource.RequestSourceInternal) + txn.SetOption(RequestSourceType, requestSource.RequestSourceType) + return } - txn.SetOption(RequestSourceInternal, requestSource.RequestSourceInternal) - txn.SetOption(RequestSourceType, requestSource.RequestSourceType) + } + // panic in test mode in case there are requests without source in the future. + // log warnings in production mode. + if intest.InTest { + panic("unexpected no source type context, if you see this error, " + + "the `RequestSourceTypeKey` is missing in your context") } else { - // panic in test mode in case there are requests without source in the future. - // log warnings in production mode. - if flag.Lookup("test.v") != nil || flag.Lookup("check.v") != nil { - panic("unexpected no source type context, if you see this error, " + - "the `RequestSourceTypeKey` is missing in your context") - } else { - logutil.Logger(ctx).Warn("unexpected no source type context, if you see this warning, " + - "the `RequestSourceTypeKey` is missing in the context") - } + logutil.Logger(ctx).Warn("unexpected no source type context, if you see this warning, " + + "the `RequestSourceTypeKey` is missing in the context") } } diff --git a/kv/version_test.go b/kv/version_test.go index 1a2aa30143d10..d0b0a810e3f45 100644 --- a/kv/version_test.go +++ b/kv/version_test.go @@ -17,6 +17,7 @@ package kv import ( "testing" + "github.com/pingcap/tipb/go-tipb" "github.com/stretchr/testify/assert" ) @@ -30,3 +31,57 @@ func TestVersion(t *testing.T) { assert.True(t, eq == 0) assert.True(t, MinVersion.Cmp(MaxVersion) < 0) } + +func TestMppVersion(t *testing.T) { + assert.Equal(t, int64(1), GetNewestMppVersion().ToInt64()) + { + v, ok := ToMppVersion("unspecified") + assert.True(t, ok) + assert.Equal(t, v, MppVersionUnspecified) + } + { + v, ok := ToMppVersion("-1") + assert.True(t, ok) + assert.Equal(t, v, MppVersionUnspecified) + } + { + v, ok := ToMppVersion("0") + assert.True(t, ok) + assert.Equal(t, v, MppVersionV0) + } + { + v, ok := ToMppVersion("1") + assert.True(t, ok) + assert.Equal(t, v, MppVersionV1) + } +} + +func TestExchangeCompressionMode(t *testing.T) { + assert.Equal(t, "UNSPECIFIED", ExchangeCompressionModeUnspecified.Name()) + { + a, ok := ToExchangeCompressionMode("UNSPECIFIED") + assert.Equal(t, a, ExchangeCompressionModeUnspecified) + assert.True(t, ok) + } + assert.Equal(t, "NONE", ExchangeCompressionModeNONE.Name()) + { + a, ok := ToExchangeCompressionMode("NONE") + assert.Equal(t, a, ExchangeCompressionModeNONE) + assert.True(t, ok) + } + assert.Equal(t, "FAST", ExchangeCompressionModeFast.Name()) + { + a, ok := ToExchangeCompressionMode("FAST") + assert.Equal(t, a, ExchangeCompressionModeFast) + assert.True(t, ok) + } + assert.Equal(t, "HIGH_COMPRESSION", ExchangeCompressionModeHC.Name()) + { + a, ok := ToExchangeCompressionMode("HIGH_COMPRESSION") + assert.Equal(t, a, ExchangeCompressionModeHC) + assert.True(t, ok) + } + // default `FAST` + assert.Equal(t, ExchangeCompressionModeFast, RecommendedExchangeCompressionMode) + assert.Equal(t, tipb.CompressionMode_FAST, RecommendedExchangeCompressionMode.ToTipbCompressionMode()) +} diff --git a/meta/BUILD.bazel b/meta/BUILD.bazel index 791662be8c215..c6c796a9771c1 100644 --- a/meta/BUILD.bazel +++ b/meta/BUILD.bazel @@ -16,10 +16,8 @@ go_library( "//parser/mysql", "//structure", "//util/dbterror", - "//util/logutil", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_kvproto//pkg/kvrpcpb", - "@org_uber_go_zap//:zap", ], ) @@ -33,12 +31,10 @@ go_test( embed = [":meta"], flaky = True, deps = [ - "//ddl", "//kv", "//parser/model", "//store/mockstore", "//testkit/testsetup", - "//testkit/testutil", "//util", "@com_github_pingcap_errors//:errors", "@com_github_stretchr_testify//require", diff --git a/meta/autoid/BUILD.bazel b/meta/autoid/BUILD.bazel index 7490d65691e4c..0eb6034820160 100644 --- a/meta/autoid/BUILD.bazel +++ b/meta/autoid/BUILD.bazel @@ -11,7 +11,7 @@ go_library( importpath = "github.com/pingcap/tidb/meta/autoid", visibility = ["//visibility:public"], deps = [ - "//autoid_service", + "//config", "//errno", "//kv", "//meta", @@ -23,7 +23,7 @@ go_library( "//util/execdetails", "//util/logutil", "//util/mathutil", - "@com_github_opentracing_opentracing_go//:opentracing-go", + "//util/tracing", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/autoid", @@ -31,6 +31,7 @@ go_library( "@com_github_tikv_client_go_v2//util", "@io_etcd_go_etcd_client_v3//:client", "@org_golang_google_grpc//:grpc", + "@org_golang_google_grpc//credentials", "@org_golang_google_grpc//credentials/insecure", "@org_uber_go_zap//:zap", ], diff --git a/meta/autoid/autoid.go b/meta/autoid/autoid.go index def3245bb2da3..4cd03bea89219 100644 --- a/meta/autoid/autoid.go +++ b/meta/autoid/autoid.go @@ -23,10 +23,9 @@ import ( "sync" "time" - "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/failpoint" - autoid "github.com/pingcap/tidb/autoid_service" + "github.com/pingcap/kvproto/pkg/autoid" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/metrics" @@ -37,6 +36,7 @@ import ( "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/mathutil" + "github.com/pingcap/tidb/util/tracing" "github.com/tikv/client-go/v2/txnkv/txnsnapshot" tikvutil "github.com/tikv/client-go/v2/util" clientv3 "go.etcd.io/etcd/client/v3" @@ -205,16 +205,36 @@ type Allocator interface { } // Allocators represents a set of `Allocator`s. -type Allocators []Allocator +type Allocators struct { + SepAutoInc bool + Allocs []Allocator +} // NewAllocators packs multiple `Allocator`s into Allocators. -func NewAllocators(allocators ...Allocator) Allocators { - return allocators +func NewAllocators(sepAutoInc bool, allocators ...Allocator) Allocators { + return Allocators{ + SepAutoInc: sepAutoInc, + Allocs: allocators, + } +} + +// Append add an allocator to the allocators. +func (all Allocators) Append(a Allocator) Allocators { + return Allocators{ + SepAutoInc: all.SepAutoInc, + Allocs: append(all.Allocs, a), + } } // Get returns the Allocator according to the AllocatorType. func (all Allocators) Get(allocType AllocatorType) Allocator { - for _, a := range all { + if !all.SepAutoInc { + if allocType == AutoIncrementType { + allocType = RowIDAllocType + } + } + + for _, a := range all.Allocs { if a.GetType() == allocType { return a } @@ -224,13 +244,16 @@ func (all Allocators) Get(allocType AllocatorType) Allocator { // Filter filters all the allocators that match pred. func (all Allocators) Filter(pred func(Allocator) bool) Allocators { - var ret Allocators - for _, a := range all { + var ret []Allocator + for _, a := range all.Allocs { if pred(a) { ret = append(ret, a) } } - return ret + return Allocators{ + SepAutoInc: all.SepAutoInc, + Allocs: ret, + } } type allocator struct { @@ -262,11 +285,15 @@ func SetStep(s int64) { // Base implements autoid.Allocator Base interface. func (alloc *allocator) Base() int64 { + alloc.mu.Lock() + defer alloc.mu.Unlock() return alloc.base } // End implements autoid.Allocator End interface. func (alloc *allocator) End() int64 { + alloc.mu.Lock() + defer alloc.mu.Unlock() return alloc.end } @@ -535,6 +562,11 @@ func NextStep(curStep int64, consumeDur time.Duration) int64 { return res } +// MockForTest is exported for testing. +// The actual implementation is in github.com/pingcap/tidb/autoid_service because of the +// package circle depending issue. +var MockForTest func(kv.Storage) autoid.AutoIDAllocClient + func newSinglePointAlloc(store kv.Storage, dbID, tblID int64, isUnsigned bool) *singlePointAlloc { ebd, ok := store.(kv.EtcdBackend) if !ok { @@ -564,7 +596,7 @@ func newSinglePointAlloc(store kv.Storage, dbID, tblID int64, isUnsigned bool) * spa.clientDiscover = clientDiscover{etcdCli: etcdCli} } else { spa.clientDiscover = clientDiscover{} - spa.mu.AutoIDAllocClient = autoid.MockForTest(store) + spa.mu.AutoIDAllocClient = MockForTest(store) } // mockAutoIDChange failpoint is not implemented in this allocator, so fallback to use the default one. @@ -593,10 +625,17 @@ func NewAllocator(store kv.Storage, dbID, tbID int64, isUnsigned bool, } // Use the MySQL compatible AUTO_INCREMENT mode. - if allocType == RowIDAllocType && alloc.customStep && alloc.step == 1 { - alloc1 := newSinglePointAlloc(store, dbID, tbID, isUnsigned) - if alloc1 != nil { - return alloc1 + if alloc.customStep && alloc.step == 1 && alloc.tbVersion >= model.TableInfoVersion5 { + if allocType == AutoIncrementType { + alloc1 := newSinglePointAlloc(store, dbID, tbID, isUnsigned) + if alloc1 != nil { + return alloc1 + } + } else if allocType == RowIDAllocType { + // Now that the autoid and rowid allocator are separated, the AUTO_ID_CACHE 1 setting should not make + // the rowid allocator do not use cache. + alloc.customStep = false + alloc.step = step } } @@ -630,6 +669,10 @@ func NewAllocatorsFromTblInfo(store kv.Storage, schemaID int64, tblInfo *model.T alloc := NewAllocator(store, dbID, tblInfo.ID, tblInfo.IsAutoIncColUnsigned(), RowIDAllocType, idCacheOpt, tblVer) allocs = append(allocs, alloc) } + if hasAutoIncID { + alloc := NewAllocator(store, dbID, tblInfo.ID, tblInfo.IsAutoIncColUnsigned(), AutoIncrementType, idCacheOpt, tblVer) + allocs = append(allocs, alloc) + } hasAutoRandID := tblInfo.ContainsAutoRandomBits() if hasAutoRandID { alloc := NewAllocator(store, dbID, tblInfo.ID, tblInfo.IsAutoRandomBitColUnsigned(), AutoRandomType, idCacheOpt, tblVer) @@ -638,7 +681,7 @@ func NewAllocatorsFromTblInfo(store kv.Storage, schemaID int64, tblInfo *model.T if tblInfo.IsSequence() { allocs = append(allocs, NewSequenceAllocator(store, dbID, tblInfo.ID, tblInfo.Sequence)) } - return NewAllocators(allocs...) + return NewAllocators(tblInfo.SepAutoInc(), allocs...) } // Alloc implements autoid.Allocator Alloc interface. @@ -839,7 +882,7 @@ func (alloc *allocator) alloc4Signed(ctx context.Context, n uint64, increment, o var newBase, newEnd int64 startTime := time.Now() nextStep := alloc.step - if !alloc.customStep { + if !alloc.customStep && alloc.end > 0 { // Although it may skip a segment here, we still think it is consumed. consumeDur := startTime.Sub(alloc.lastAllocTime) nextStep = NextStep(alloc.step, consumeDur) @@ -857,11 +900,7 @@ func (alloc *allocator) alloc4Signed(ctx context.Context, n uint64, increment, o ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnMeta) err := kv.RunInNewTxn(ctx, alloc.store, true, func(ctx context.Context, txn kv.Transaction) error { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("alloc.alloc4Signed", opentracing.ChildOf(span.Context())) - defer span1.Finish() - opentracing.ContextWithSpan(ctx, span1) - } + defer tracing.StartRegion(ctx, "alloc.alloc4Signed").End() if allocatorStats != nil { txn.SetOption(kv.CollectRuntimeStats, allocatorStats.SnapshotRuntimeStats) } @@ -945,13 +984,14 @@ func (alloc *allocator) alloc4Unsigned(ctx context.Context, n uint64, increment, }() } + if codeRun := ctx.Value("testIssue39528"); codeRun != nil { + *(codeRun.(*bool)) = true + return 0, 0, errors.New("mock error for test") + } + ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnMeta) err := kv.RunInNewTxn(ctx, alloc.store, true, func(ctx context.Context, txn kv.Transaction) error { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("alloc.alloc4Unsigned", opentracing.ChildOf(span.Context())) - defer span1.Finish() - opentracing.ContextWithSpan(ctx, span1) - } + defer tracing.StartRegion(ctx, "alloc.alloc4Unsigned").End() if allocatorStats != nil { txn.SetOption(kv.CollectRuntimeStats, allocatorStats.SnapshotRuntimeStats) } diff --git a/meta/autoid/autoid_service.go b/meta/autoid/autoid_service.go index 6133dfdfc3cb2..8e359f6e523fb 100644 --- a/meta/autoid/autoid_service.go +++ b/meta/autoid/autoid_service.go @@ -20,14 +20,16 @@ import ( "sync" "time" - "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/kvproto/pkg/autoid" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/tracing" clientv3 "go.etcd.io/etcd/client/v3" "go.uber.org/zap" "google.golang.org/grpc" + "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" ) @@ -77,13 +79,23 @@ func (d *clientDiscover) GetClient(ctx context.Context) (autoid.AutoIDAllocClien if err != nil { return nil, errors.Trace(err) } - if len(resp.Kvs) == 0 { return nil, errors.New("autoid service leader not found") } addr := string(resp.Kvs[0].Value) - grpcConn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials())) + opt := grpc.WithTransportCredentials(insecure.NewCredentials()) + security := config.GetGlobalConfig().Security + if len(security.ClusterSSLCA) != 0 { + clusterSecurity := security.ClusterSecurity() + tlsConfig, err := clusterSecurity.ToTLSConfig() + if err != nil { + return nil, errors.Trace(err) + } + opt = grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig)) + } + logutil.BgLogger().Info("[autoid client] connect to leader", zap.String("addr", addr)) + grpcConn, err := grpc.Dial(addr, opt) if err != nil { return nil, errors.Trace(err) } @@ -100,11 +112,8 @@ func (d *clientDiscover) GetClient(ctx context.Context) (autoid.AutoIDAllocClien // case increment=1 & offset=1: you can derive the ids like min+1, min+2... max. // case increment=x & offset=y: you firstly need to seek to firstID by `SeekToFirstAutoIDXXX`, then derive the IDs like firstID, firstID + increment * 2... in the caller. func (sp *singlePointAlloc) Alloc(ctx context.Context, n uint64, increment, offset int64) (min int64, max int64, _ error) { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("autoid.Alloc", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } + r, ctx := tracing.StartRegionEx(ctx, "autoid.Alloc") + defer r.End() if !validIncrementAndOffset(increment, offset) { return 0, 0, errInvalidIncrementAndOffset.GenWithStackByArgs(increment, offset) @@ -128,11 +137,14 @@ retry: if err != nil { if strings.Contains(err.Error(), "rpc error") { time.Sleep(backoffDuration) - sp.resetConn() + sp.resetConn(err) goto retry } return 0, 0, errors.Trace(err) } + if len(resp.Errmsg) != 0 { + return 0, 0, errors.Trace(errors.New(string(resp.Errmsg))) + } du := time.Since(start) metrics.AutoIDReqDuration.Observe(du.Seconds()) @@ -142,7 +154,9 @@ retry: const backoffDuration = 200 * time.Millisecond -func (sp *singlePointAlloc) resetConn() { +func (sp *singlePointAlloc) resetConn(reason error) { + logutil.BgLogger().Info("[autoid client] reset grpc connection", + zap.String("reason", reason.Error())) var grpcConn *grpc.ClientConn sp.mu.Lock() grpcConn = sp.mu.ClientConn @@ -152,7 +166,9 @@ func (sp *singlePointAlloc) resetConn() { // Close grpc.ClientConn to release resource. if grpcConn != nil { err := grpcConn.Close() - logutil.BgLogger().Info("[autoid client] AllocAutoID grpc error, reconnect", zap.Error(err)) + if err != nil { + logutil.BgLogger().Warn("[autoid client] close grpc connection error", zap.Error(err)) + } } } @@ -167,11 +183,8 @@ func (*singlePointAlloc) AllocSeqCache() (a int64, b int64, c int64, err error) // If allocIDs is true, it will allocate some IDs and save to the cache. // If allocIDs is false, it will not allocate IDs. func (sp *singlePointAlloc) Rebase(ctx context.Context, newBase int64, _ bool) error { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("autoid.Rebase", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } + r, ctx := tracing.StartRegionEx(ctx, "autoid.Rebase") + defer r.End() return sp.rebase(ctx, newBase, false) } @@ -182,7 +195,8 @@ retry: if err != nil { return errors.Trace(err) } - _, err = cli.Rebase(ctx, &autoid.RebaseRequest{ + var resp *autoid.RebaseResponse + resp, err = cli.Rebase(ctx, &autoid.RebaseRequest{ DbID: sp.dbID, TblID: sp.tblID, Base: newBase, @@ -192,13 +206,16 @@ retry: if err != nil { if strings.Contains(err.Error(), "rpc error") { time.Sleep(backoffDuration) - sp.resetConn() + sp.resetConn(err) goto retry } return errors.Trace(err) } + if len(resp.Errmsg) != 0 { + return errors.Trace(errors.New(string(resp.Errmsg))) + } sp.lastAllocated = newBase - return err + return nil } // ForceRebase set the next global auto ID to newBase. @@ -232,5 +249,5 @@ func (sp *singlePointAlloc) NextGlobalAutoID() (int64, error) { } func (*singlePointAlloc) GetType() AllocatorType { - return RowIDAllocType + return AutoIncrementType } diff --git a/meta/autoid/autoid_test.go b/meta/autoid/autoid_test.go index 0b8cd60257cf4..912b1e173bc8c 100644 --- a/meta/autoid/autoid_test.go +++ b/meta/autoid/autoid_test.go @@ -20,6 +20,7 @@ import ( "math" "math/rand" "sync" + "sync/atomic" "testing" "time" @@ -594,3 +595,57 @@ func TestAllocComputationIssue(t *testing.T) { require.Equal(t, int64(7), min) require.Equal(t, int64(13), max) } + +func TestIssue40584(t *testing.T) { + store, err := mockstore.NewMockStore() + require.NoError(t, err) + defer func() { + err := store.Close() + require.NoError(t, err) + }() + + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnMeta) + err = kv.RunInNewTxn(ctx, store, false, func(ctx context.Context, txn kv.Transaction) error { + m := meta.NewMeta(txn) + err = m.CreateDatabase(&model.DBInfo{ID: 1, Name: model.NewCIStr("a")}) + require.NoError(t, err) + err = m.CreateTableOrView(1, &model.TableInfo{ID: 1, Name: model.NewCIStr("t")}) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + alloc := autoid.NewAllocator(store, 1, 1, false, autoid.RowIDAllocType) + require.NotNil(t, alloc) + + finishAlloc := make(chan bool) + finishBase := make(chan bool) + var done int32 = 0 + + // call allocator.Alloc and allocator.Base in parallel for 3 seconds to detect data race + go func() { + for { + alloc.Alloc(ctx, 1, 1, 1) + if atomic.LoadInt32(&done) > 0 { + break + } + } + finishAlloc <- true + }() + + go func() { + for { + alloc.Base() + if atomic.LoadInt32(&done) > 0 { + break + } + } + finishBase <- true + }() + + runTime := time.NewTimer(time.Second * 3) + <-runTime.C + atomic.AddInt32(&done, 1) + <-finishAlloc + <-finishBase +} diff --git a/meta/meta.go b/meta/meta.go index ad2f5d02e0d05..af02ae7882ac3 100644 --- a/meta/meta.go +++ b/meta/meta.go @@ -19,7 +19,6 @@ import ( "encoding/binary" "encoding/json" "fmt" - "math" "strconv" "strings" "sync" @@ -34,8 +33,6 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/structure" "github.com/pingcap/tidb/util/dbterror" - "github.com/pingcap/tidb/util/logutil" - "go.uber.org/zap" ) var ( @@ -59,25 +56,27 @@ var ( // var ( - mMetaPrefix = []byte("m") - mNextGlobalIDKey = []byte("NextGlobalID") - mSchemaVersionKey = []byte("SchemaVersionKey") - mDBs = []byte("DBs") - mDBPrefix = "DB" - mTablePrefix = "Table" - mSequencePrefix = "SID" - mSeqCyclePrefix = "SequenceCycle" - mTableIDPrefix = "TID" - mIncIDPrefix = "IID" - mRandomIDPrefix = "TARID" - mBootstrapKey = []byte("BootstrapKey") - mSchemaDiffPrefix = "Diff" - mPolicies = []byte("Policies") - mPolicyPrefix = "Policy" - mPolicyGlobalID = []byte("PolicyGlobalID") - mPolicyMagicByte = CurrentMagicByteVer - mDDLTableVersion = []byte("DDLTableVersion") - mConcurrentDDL = []byte("concurrentDDL") + mMetaPrefix = []byte("m") + mNextGlobalIDKey = []byte("NextGlobalID") + mSchemaVersionKey = []byte("SchemaVersionKey") + mDBs = []byte("DBs") + mDBPrefix = "DB" + mTablePrefix = "Table" + mSequencePrefix = "SID" + mSeqCyclePrefix = "SequenceCycle" + mTableIDPrefix = "TID" + mIncIDPrefix = "IID" + mRandomIDPrefix = "TARID" + mBootstrapKey = []byte("BootstrapKey") + mSchemaDiffPrefix = "Diff" + mPolicies = []byte("Policies") + mPolicyPrefix = "Policy" + mResourceGroups = []byte("ResourceGroups") + mResourceGroupPrefix = "RG" + mPolicyGlobalID = []byte("PolicyGlobalID") + mPolicyMagicByte = CurrentMagicByteVer + mDDLTableVersion = []byte("DDLTableVersion") + mMetaDataLock = []byte("metadataLock") ) const ( @@ -109,6 +108,10 @@ var ( ErrPolicyExists = dbterror.ClassMeta.NewStd(errno.ErrPlacementPolicyExists) // ErrPolicyNotExists is the error for policy not exists. ErrPolicyNotExists = dbterror.ClassMeta.NewStd(errno.ErrPlacementPolicyNotExists) + // ErrResourceGroupExists is the error for resource group exists. + ErrResourceGroupExists = dbterror.ClassMeta.NewStd(errno.ErrResourceGroupExists) + // ErrResourceGroupNotExists is the error for resource group not exists. + ErrResourceGroupNotExists = dbterror.ClassMeta.NewStd(errno.ErrResourceGroupNotExists) // ErrTableExists is the error for table exists. ErrTableExists = dbterror.ClassMeta.NewStd(mysql.ErrTableExists) // ErrTableNotExists is the error for table not exists. @@ -119,6 +122,25 @@ var ( ErrInvalidString = dbterror.ClassMeta.NewStd(errno.ErrInvalidCharacterString) ) +// DDLTableVersion is to display ddl related table versions +type DDLTableVersion int + +const ( + // InitDDLTableVersion is the original version. + InitDDLTableVersion DDLTableVersion = 0 + // BaseDDLTableVersion is for support concurrent DDL, it added tidb_ddl_job, tidb_ddl_reorg and tidb_ddl_history. + BaseDDLTableVersion DDLTableVersion = 1 + // MDLTableVersion is for support MDL tables. + MDLTableVersion DDLTableVersion = 2 + // BackfillTableVersion is for support distributed reorg stage, it added tidb_background_subtask, tidb_background_subtask_history. + BackfillTableVersion DDLTableVersion = 3 +) + +// Bytes returns the byte slice. +func (ver DDLTableVersion) Bytes() []byte { + return []byte(strconv.Itoa(int(ver))) +} + // Meta is for handling meta information in a transaction. type Meta struct { txn *structure.TxStructure @@ -128,17 +150,13 @@ type Meta struct { // NewMeta creates a Meta in transaction txn. // If the current Meta needs to handle a job, jobListKey is the type of the job's list. -func NewMeta(txn kv.Transaction, jobListKeys ...JobListKeyType) *Meta { +func NewMeta(txn kv.Transaction) *Meta { txn.SetOption(kv.Priority, kv.PriorityHigh) txn.SetDiskFullOpt(kvrpcpb.DiskFullOpt_AllowedOnAlmostFull) t := structure.NewStructure(txn, txn, mMetaPrefix) - listKey := DefaultJobListKey - if len(jobListKeys) != 0 { - listKey = jobListKeys[0] - } return &Meta{txn: t, StartTS: txn.StartTS(), - jobListKey: listKey, + jobListKey: DefaultJobListKey, } } @@ -224,6 +242,10 @@ func (*Meta) policyKey(policyID int64) []byte { return []byte(fmt.Sprintf("%s:%d", mPolicyPrefix, policyID)) } +func (*Meta) resourceGroupKey(groupID int64) []byte { + return []byte(fmt.Sprintf("%s:%d", mResourceGroupPrefix, groupID)) +} + func (*Meta) dbKey(dbID int64) []byte { return DBkey(dbID) } @@ -436,6 +458,22 @@ func (m *Meta) checkPolicyNotExists(policyKey []byte) error { return errors.Trace(err) } +func (m *Meta) checkResourceGroupNotExists(groupKey []byte) error { + v, err := m.txn.HGet(mResourceGroups, groupKey) + if err == nil && v != nil { + err = ErrResourceGroupExists.GenWithStack("group already exists") + } + return errors.Trace(err) +} + +func (m *Meta) checkResourceGroupExists(groupKey []byte) error { + v, err := m.txn.HGet(mResourceGroups, groupKey) + if err == nil && v == nil { + err = ErrResourceGroupNotExists.GenWithStack("group doesn't exist") + } + return errors.Trace(err) +} + func (m *Meta) checkDBExists(dbKey []byte) error { v, err := m.txn.HGet(mDBs, dbKey) if err == nil && v == nil { @@ -501,6 +539,47 @@ func (m *Meta) UpdatePolicy(policy *model.PolicyInfo) error { return m.txn.HSet(mPolicies, policyKey, attachMagicByte(data)) } +// AddResourceGroup creates a resource group. +func (m *Meta) AddResourceGroup(group *model.ResourceGroupInfo) error { + if group.ID == 0 { + return errors.New("group.ID is invalid") + } + groupKey := m.resourceGroupKey(group.ID) + if err := m.checkResourceGroupNotExists(groupKey); err != nil { + return errors.Trace(err) + } + + data, err := json.Marshal(group) + if err != nil { + return errors.Trace(err) + } + return m.txn.HSet(mResourceGroups, groupKey, attachMagicByte(data)) +} + +// UpdateResourceGroup updates a resource group. +func (m *Meta) UpdateResourceGroup(group *model.ResourceGroupInfo) error { + groupKey := m.resourceGroupKey(group.ID) + if err := m.checkResourceGroupExists(groupKey); err != nil { + return errors.Trace(err) + } + + data, err := json.Marshal(group) + if err != nil { + return errors.Trace(err) + } + return m.txn.HSet(mResourceGroups, groupKey, attachMagicByte(data)) +} + +// DropResourceGroup drops a resource group. +func (m *Meta) DropResourceGroup(groupID int64) error { + // Check if group exists. + groupKey := m.resourceGroupKey(groupID) + if err := m.txn.HDel(mResourceGroups, groupKey); err != nil { + return errors.Trace(err) + } + return nil +} + // CreateDatabase creates a database with db info. func (m *Meta) CreateDatabase(dbInfo *model.DBInfo) error { dbKey := m.dbKey(dbInfo.ID) @@ -556,15 +635,25 @@ func (m *Meta) CreateTableOrView(dbID int64, tableInfo *model.TableInfo) error { } // SetDDLTables write a key into storage. -func (m *Meta) SetDDLTables() error { - err := m.txn.Set(mDDLTableVersion, []byte("1")) +func (m *Meta) SetDDLTables(ddlTableVersion DDLTableVersion) error { + err := m.txn.Set(mDDLTableVersion, ddlTableVersion.Bytes()) return errors.Trace(err) } -// SetMDLTables write a key into storage. -func (m *Meta) SetMDLTables() error { - err := m.txn.Set(mDDLTableVersion, []byte("2")) - return errors.Trace(err) +// CheckDDLTableVersion check if the tables related to concurrent DDL exists. +func (m *Meta) CheckDDLTableVersion() (DDLTableVersion, error) { + v, err := m.txn.Get(mDDLTableVersion) + if err != nil { + return -1, errors.Trace(err) + } + if string(v) == "" { + return InitDDLTableVersion, nil + } + ver, err := strconv.Atoi(string(v)) + if err != nil { + return -1, errors.Trace(err) + } + return DDLTableVersion(ver), nil } // CreateMySQLDatabaseIfNotExists creates mysql schema and return its DB ID. @@ -603,43 +692,27 @@ func (m *Meta) GetSystemDBID() (int64, error) { return 0, nil } -// CheckDDLTableExists check if the tables related to concurrent DDL exists. -func (m *Meta) CheckDDLTableExists() (bool, error) { - v, err := m.txn.Get(mDDLTableVersion) - if err != nil { - return false, errors.Trace(err) - } - return len(v) != 0, nil -} - -// CheckMDLTableExists check if the tables related to concurrent DDL exists. -func (m *Meta) CheckMDLTableExists() (bool, error) { - v, err := m.txn.Get(mDDLTableVersion) - if err != nil { - return false, errors.Trace(err) - } - return bytes.Equal(v, []byte("2")), nil -} - -// SetConcurrentDDL set the concurrent DDL flag. -func (m *Meta) SetConcurrentDDL(b bool) error { +// SetMetadataLock sets the metadata lock. +func (m *Meta) SetMetadataLock(b bool) error { var data []byte if b { data = []byte("1") } else { data = []byte("0") } - return errors.Trace(m.txn.Set(mConcurrentDDL, data)) + return errors.Trace(m.txn.Set(mMetaDataLock, data)) } -// IsConcurrentDDL returns true if the concurrent DDL flag is set. -func (m *Meta) IsConcurrentDDL() (bool, error) { - val, err := m.txn.Get(mConcurrentDDL) +// GetMetadataLock gets the metadata lock. +func (m *Meta) GetMetadataLock() (enable bool, isNull bool, err error) { + val, err := m.txn.Get(mMetaDataLock) if err != nil { - return false, errors.Trace(err) + return false, false, errors.Trace(err) } - - return len(val) == 0 || bytes.Equal(val, []byte("1")), nil + if len(val) == 0 { + return false, true, nil + } + return bytes.Equal(val, []byte("1")), false, nil } // CreateTableAndSetAutoID creates a table with tableInfo in database, @@ -884,6 +957,50 @@ func (m *Meta) GetPolicy(policyID int64) (*model.PolicyInfo, error) { return policy, errors.Trace(err) } +// ListResourceGroups shows all resource groups. +func (m *Meta) ListResourceGroups() ([]*model.ResourceGroupInfo, error) { + res, err := m.txn.HGetAll(mResourceGroups) + if err != nil { + return nil, errors.Trace(err) + } + + groups := make([]*model.ResourceGroupInfo, 0, len(res)) + for _, r := range res { + value, err := detachMagicByte(r.Value) + if err != nil { + return nil, errors.Trace(err) + } + group := &model.ResourceGroupInfo{} + err = json.Unmarshal(value, group) + if err != nil { + return nil, errors.Trace(err) + } + groups = append(groups, group) + } + return groups, nil +} + +// GetResourceGroup gets the database value with ID. +func (m *Meta) GetResourceGroup(groupID int64) (*model.ResourceGroupInfo, error) { + groupKey := m.resourceGroupKey(groupID) + value, err := m.txn.HGet(mResourceGroups, groupKey) + if err != nil { + return nil, errors.Trace(err) + } + if value == nil { + return nil, ErrResourceGroupNotExists.GenWithStack("resource group id : %d doesn't exist", groupID) + } + + value, err = detachMagicByte(value) + if err != nil { + return nil, errors.Trace(err) + } + + group := &model.ResourceGroupInfo{} + err = json.Unmarshal(value, group) + return group, errors.Trace(err) +} + func attachMagicByte(data []byte) []byte { data = append(data, 0) copy(data[1:], data) @@ -930,6 +1047,27 @@ func (m *Meta) GetTable(dbID int64, tableID int64) (*model.TableInfo, error) { return tableInfo, errors.Trace(err) } +// CheckTableExists checks if the table is existed with dbID and tableID. +func (m *Meta) CheckTableExists(dbID int64, tableID int64) (bool, error) { + // Check if db exists. + dbKey := m.dbKey(dbID) + if err := m.checkDBExists(dbKey); err != nil { + return false, errors.Trace(err) + } + + // Check if table exists. + tableKey := m.tableKey(tableID) + v, err := m.txn.HGet(dbKey, tableKey) + if err != nil { + return false, errors.Trace(err) + } + if v != nil { + return true, nil + } + + return false, nil +} + // DDL job structure // DDLJobList: list jobs // DDLJobHistory: hash @@ -942,12 +1080,8 @@ var ( mDDLJobListKey = []byte("DDLJobList") mDDLJobAddIdxList = []byte("DDLJobAddIdxList") mDDLJobHistoryKey = []byte("DDLJobHistory") - mDDLJobReorgKey = []byte("DDLJobReorg") ) -// JobListKeyType is a key type of the DDL job queue. -type JobListKeyType []byte - var ( // DefaultJobListKey keeps all actions of DDL jobs except "add index". DefaultJobListKey JobListKeyType = mDDLJobListKey @@ -973,31 +1107,8 @@ func (m *Meta) EnQueueDDLJob(job *model.Job, jobListKeys ...JobListKeyType) erro return m.enQueueDDLJob(listKey, job, true) } -// EnQueueDDLJobNoUpdate adds a DDL job to the list without update raw args. -func (m *Meta) EnQueueDDLJobNoUpdate(job *model.Job, jobListKeys ...JobListKeyType) error { - listKey := m.jobListKey - if len(jobListKeys) != 0 { - listKey = jobListKeys[0] - } - - return m.enQueueDDLJob(listKey, job, false) -} - -func (m *Meta) deQueueDDLJob(key []byte) (*model.Job, error) { - value, err := m.txn.LPop(key) - if err != nil || value == nil { - return nil, errors.Trace(err) - } - - job := &model.Job{} - err = job.Decode(value) - return job, errors.Trace(err) -} - -// DeQueueDDLJob pops a DDL job from the list. -func (m *Meta) DeQueueDDLJob() (*model.Job, error) { - return m.deQueueDDLJob(m.jobListKey) -} +// JobListKeyType is a key type of the DDL job queue. +type JobListKeyType []byte func (m *Meta) getDDLJob(key []byte, index int64) (*model.Job, error) { value, err := m.txn.LIndex(key, index) @@ -1018,61 +1129,6 @@ func (m *Meta) getDDLJob(key []byte, index int64) (*model.Job, error) { return job, errors.Trace(err) } -// GetDDLJobByIdx returns the corresponding DDL job by the index. -// The length of jobListKeys can only be 1 or 0. -// If its length is 1, we need to replace m.jobListKey with jobListKeys[0]. -// Otherwise, we use m.jobListKey directly. -func (m *Meta) GetDDLJobByIdx(index int64, jobListKeys ...JobListKeyType) (*model.Job, error) { - listKey := m.jobListKey - if len(jobListKeys) != 0 { - listKey = jobListKeys[0] - } - - startTime := time.Now() - job, err := m.getDDLJob(listKey, index) - metrics.MetaHistogram.WithLabelValues(metrics.GetDDLJobByIdx, metrics.RetLabel(err)).Observe(time.Since(startTime).Seconds()) - return job, errors.Trace(err) -} - -// updateDDLJob updates the DDL job with index and key. -// updateRawArgs is used to determine whether to update the raw args when encode the job. -func (m *Meta) updateDDLJob(index int64, job *model.Job, key []byte, updateRawArgs bool) error { - b, err := job.Encode(updateRawArgs) - if err == nil { - err = m.txn.LSet(key, index, b) - } - return errors.Trace(err) -} - -// UpdateDDLJob updates the DDL job with index. -// updateRawArgs is used to determine whether to update the raw args when encode the job. -// The length of jobListKeys can only be 1 or 0. -// If its length is 1, we need to replace m.jobListKey with jobListKeys[0]. -// Otherwise, we use m.jobListKey directly. -func (m *Meta) UpdateDDLJob(index int64, job *model.Job, updateRawArgs bool, jobListKeys ...JobListKeyType) error { - listKey := m.jobListKey - if len(jobListKeys) != 0 { - listKey = jobListKeys[0] - } - - startTime := time.Now() - err := m.updateDDLJob(index, job, listKey, updateRawArgs) - metrics.MetaHistogram.WithLabelValues(metrics.UpdateDDLJob, metrics.RetLabel(err)).Observe(time.Since(startTime).Seconds()) - return errors.Trace(err) -} - -// DDLJobQueueLen returns the DDL job queue length. -// The length of jobListKeys can only be 1 or 0. -// If its length is 1, we need to replace m.jobListKey with jobListKeys[0]. -// Otherwise, we use m.jobListKey directly. -func (m *Meta) DDLJobQueueLen(jobListKeys ...JobListKeyType) (int64, error) { - listKey := m.jobListKey - if len(jobListKeys) != 0 { - listKey = jobListKeys[0] - } - return m.txn.LLen(listKey) -} - // GetAllDDLJobsInQueue gets all DDL Jobs in the current queue. // The length of jobListKeys can only be 1 or 0. // If its length is 1, we need to replace m.jobListKey with jobListKeys[0]. @@ -1107,45 +1163,6 @@ func (*Meta) jobIDKey(id int64) []byte { return b } -func (m *Meta) reorgJobCurrentElement(id int64) []byte { - b := make([]byte, 0, 12) - b = append(b, m.jobIDKey(id)...) - b = append(b, "_ele"...) - return b -} - -func (m *Meta) reorgJobStartHandle(id int64, element *Element) []byte { - b := make([]byte, 0, 16+len(element.TypeKey)) - b = append(b, m.jobIDKey(id)...) - b = append(b, element.TypeKey...) - eID := make([]byte, 8) - binary.BigEndian.PutUint64(eID, uint64(element.ID)) - b = append(b, eID...) - return b -} - -func (*Meta) reorgJobEndHandle(id int64, element *Element) []byte { - b := make([]byte, 8, 25) - binary.BigEndian.PutUint64(b, uint64(id)) - b = append(b, element.TypeKey...) - eID := make([]byte, 8) - binary.BigEndian.PutUint64(eID, uint64(element.ID)) - b = append(b, eID...) - b = append(b, "_end"...) - return b -} - -func (*Meta) reorgJobPhysicalTableID(id int64, element *Element) []byte { - b := make([]byte, 8, 25) - binary.BigEndian.PutUint64(b, uint64(id)) - b = append(b, element.TypeKey...) - eID := make([]byte, 8) - binary.BigEndian.PutUint64(eID, uint64(element.ID)) - b = append(b, eID...) - b = append(b, "_pid"...) - return b -} - func (m *Meta) addHistoryDDLJob(key []byte, job *model.Job, updateRawArgs bool) error { b, err := job.Encode(updateRawArgs) if err == nil { @@ -1307,160 +1324,6 @@ func DecodeElement(b []byte) (*Element, error) { return &Element{ID: int64(id), TypeKey: tp}, nil } -// UpdateDDLReorgStartHandle saves the job reorganization latest processed element and start handle for later resuming. -func (m *Meta) UpdateDDLReorgStartHandle(job *model.Job, element *Element, startKey kv.Key) error { - err := m.txn.HSet(mDDLJobReorgKey, m.reorgJobCurrentElement(job.ID), element.EncodeElement()) - if err != nil { - return errors.Trace(err) - } - if startKey != nil { - err = m.txn.HSet(mDDLJobReorgKey, m.reorgJobStartHandle(job.ID, element), startKey) - if err != nil { - return errors.Trace(err) - } - } - return nil -} - -// UpdateDDLReorgHandle saves the job reorganization latest processed information for later resuming. -func (m *Meta) UpdateDDLReorgHandle(jobID int64, startKey, endKey kv.Key, physicalTableID int64, element *Element) error { - err := m.txn.HSet(mDDLJobReorgKey, m.reorgJobCurrentElement(jobID), element.EncodeElement()) - if err != nil { - return errors.Trace(err) - } - if startKey != nil { - err = m.txn.HSet(mDDLJobReorgKey, m.reorgJobStartHandle(jobID, element), startKey) - if err != nil { - return errors.Trace(err) - } - } - if endKey != nil { - err = m.txn.HSet(mDDLJobReorgKey, m.reorgJobEndHandle(jobID, element), endKey) - if err != nil { - return errors.Trace(err) - } - } - err = m.txn.HSet(mDDLJobReorgKey, m.reorgJobPhysicalTableID(jobID, element), []byte(strconv.FormatInt(physicalTableID, 10))) - return errors.Trace(err) -} - -// ClearAllDDLReorgHandle clears all reorganization related handles. -func (m *Meta) ClearAllDDLReorgHandle() error { - return m.txn.HClear(mDDLJobReorgKey) -} - -// ClearALLDDLJob clears all DDL jobs. -func (m *Meta) ClearALLDDLJob() error { - if err := m.txn.LClear(mDDLJobAddIdxList); err != nil { - return errors.Trace(err) - } - if err := m.txn.LClear(mDDLJobListKey); err != nil { - return errors.Trace(err) - } - return nil -} - -// ClearAllHistoryJob clears all history jobs. **IT IS VERY DANGEROUS** -func (m *Meta) ClearAllHistoryJob() error { - if err := m.txn.HClear(mDDLJobHistoryKey); err != nil { - return errors.Trace(err) - } - return nil -} - -// RemoveReorgElement removes the element of the reorganization information. -func (m *Meta) RemoveReorgElement(job *model.Job) error { - err := m.txn.HDel(mDDLJobReorgKey, m.reorgJobCurrentElement(job.ID)) - if err != nil { - return errors.Trace(err) - } - return nil -} - -// RemoveDDLReorgHandle removes the job reorganization related handles. -func (m *Meta) RemoveDDLReorgHandle(job *model.Job, elements []*Element) error { - if len(elements) == 0 { - return nil - } - - err := m.txn.HDel(mDDLJobReorgKey, m.reorgJobCurrentElement(job.ID)) - if err != nil { - return errors.Trace(err) - } - - for _, element := range elements { - err = m.txn.HDel(mDDLJobReorgKey, m.reorgJobStartHandle(job.ID, element)) - if err != nil { - return errors.Trace(err) - } - if err = m.txn.HDel(mDDLJobReorgKey, m.reorgJobEndHandle(job.ID, element)); err != nil { - logutil.BgLogger().Warn("remove DDL reorg end handle", zap.Error(err)) - } - if err = m.txn.HDel(mDDLJobReorgKey, m.reorgJobPhysicalTableID(job.ID, element)); err != nil { - logutil.BgLogger().Warn("remove DDL reorg physical ID", zap.Error(err)) - } - } - return nil -} - -// GetDDLReorgHandle gets the latest processed DDL reorganize position. -func (m *Meta) GetDDLReorgHandle(job *model.Job) (element *Element, startKey, endKey kv.Key, physicalTableID int64, err error) { - elementBytes, err := m.txn.HGet(mDDLJobReorgKey, m.reorgJobCurrentElement(job.ID)) - if err != nil { - return nil, nil, nil, 0, errors.Trace(err) - } - if elementBytes == nil { - return nil, nil, nil, 0, ErrDDLReorgElementNotExist - } - element, err = DecodeElement(elementBytes) - if err != nil { - return nil, nil, nil, 0, errors.Trace(err) - } - - startKey, err = getReorgJobFieldHandle(m.txn, m.reorgJobStartHandle(job.ID, element)) - if err != nil { - return nil, nil, nil, 0, errors.Trace(err) - } - endKey, err = getReorgJobFieldHandle(m.txn, m.reorgJobEndHandle(job.ID, element)) - if err != nil { - return nil, nil, nil, 0, errors.Trace(err) - } - - physicalTableID, err = m.txn.HGetInt64(mDDLJobReorgKey, m.reorgJobPhysicalTableID(job.ID, element)) - if err != nil { - err = errors.Trace(err) - return - } - - // physicalTableID may be 0, because older version TiDB (without table partition) doesn't store them. - // update them to table's in this case. - if physicalTableID == 0 { - if job.ReorgMeta != nil { - endKey = kv.IntHandle(job.ReorgMeta.EndHandle).Encoded() - } else { - endKey = kv.IntHandle(math.MaxInt64).Encoded() - } - physicalTableID = job.TableID - logutil.BgLogger().Warn("new TiDB binary running on old TiDB DDL reorg data", - zap.Int64("partition ID", physicalTableID), - zap.Stringer("startHandle", startKey), - zap.Stringer("endHandle", endKey)) - } - return -} - -func getReorgJobFieldHandle(t *structure.TxStructure, reorgJobField []byte) (kv.Key, error) { - bs, err := t.HGet(mDDLJobReorgKey, reorgJobField) - if err != nil { - return nil, errors.Trace(err) - } - keyNotFound := bs == nil - if keyNotFound { - return nil, nil - } - return bs, nil -} - func (*Meta) schemaDiffKey(schemaVersion int64) []byte { return []byte(fmt.Sprintf("%s:%d", mSchemaDiffPrefix, schemaVersion)) } diff --git a/meta/meta_autoid.go b/meta/meta_autoid.go index 18d384b2b25a7..5763aa268051a 100644 --- a/meta/meta_autoid.go +++ b/meta/meta_autoid.go @@ -102,7 +102,7 @@ type autoIDAccessors struct { access autoIDAccessor } -const sepAutoIncVer = model.TableInfoVersion4 + 1 +const sepAutoIncVer = model.TableInfoVersion5 // Get implements the interface AutoIDAccessors. func (a *autoIDAccessors) Get() (autoIDs AutoIDGroup, err error) { diff --git a/meta/meta_test.go b/meta/meta_test.go index 0529fdbcc5eda..4eda2126b3887 100644 --- a/meta/meta_test.go +++ b/meta/meta_test.go @@ -17,18 +17,15 @@ package meta_test import ( "context" "fmt" - "math" "strconv" "testing" "time" "github.com/pingcap/errors" - "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/testkit/testutil" "github.com/pingcap/tidb/util" "github.com/stretchr/testify/require" ) @@ -104,6 +101,45 @@ func TestPlacementPolicy(t *testing.T) { require.NoError(t, err) } +func TestResourceGroup(t *testing.T) { + store, err := mockstore.NewMockStore() + require.NoError(t, err) + + defer func() { + require.NoError(t, store.Close()) + }() + + txn, err := store.Begin() + require.NoError(t, err) + + // test the independent policy ID allocation. + m := meta.NewMeta(txn) + + checkResourceGroup := func(ru uint64) { + rg, err := m.GetResourceGroup(1) + require.NoError(t, err) + require.Equal(t, rg.RURate, ru) + } + + rg := &model.ResourceGroupInfo{ + ID: 1, + Name: model.NewCIStr("aa"), + ResourceGroupSettings: &model.ResourceGroupSettings{ + RURate: 100, + }, + } + require.NoError(t, m.AddResourceGroup(rg)) + checkResourceGroup(100) + + rg.RURate = 200 + require.NoError(t, m.UpdateResourceGroup(rg)) + checkResourceGroup(200) + + m.DropResourceGroup(1) + _, err = m.GetResourceGroup(1) + require.Error(t, err) +} + func TestBackupAndRestoreAutoIDs(t *testing.T) { store, err := mockstore.NewMockStore() require.NoError(t, err) @@ -252,10 +288,16 @@ func TestMeta(t *testing.T) { table, err := m.GetTable(1, 1) require.NoError(t, err) require.Equal(t, tbInfo, table) + tblExist, err := m.CheckTableExists(1, 1) + require.NoError(t, err) + require.Equal(t, true, tblExist) table, err = m.GetTable(1, 2) require.NoError(t, err) require.Nil(t, table) + tblExist, err = m.CheckTableExists(1, 2) + require.NoError(t, err) + require.Equal(t, false, tblExist) tbInfo2 := &model.TableInfo{ ID: 2, @@ -442,202 +484,6 @@ func TestElement(t *testing.T) { require.EqualError(t, err, `invalid encoded element "_col_" length 5`) } -func TestDDL(t *testing.T) { - testCases := []struct { - desc string - startHandle kv.Handle - endHandle kv.Handle - }{ - { - "kv.IntHandle", - kv.IntHandle(1), - kv.IntHandle(2), - }, - { - "kv.CommonHandle", - testutil.MustNewCommonHandle(t, "abc", 1222, "string"), - testutil.MustNewCommonHandle(t, "dddd", 1222, "string"), - }, - } - - for _, tc := range testCases { - // copy iterator variable into a new variable, see issue #27779 - tc := tc - t.Run(tc.desc, func(t *testing.T) { - store, err := mockstore.NewMockStore() - require.NoError(t, err) - defer func() { - err := store.Close() - require.NoError(t, err) - }() - - txn, err := store.Begin() - require.NoError(t, err) - - m := meta.NewMeta(txn) - - job := &model.Job{ID: 1} - err = m.EnQueueDDLJob(job) - require.NoError(t, err) - n, err := m.DDLJobQueueLen() - require.NoError(t, err) - require.Equal(t, int64(1), n) - - v, err := m.GetDDLJobByIdx(0) - require.NoError(t, err) - require.Equal(t, job, v) - v, err = m.GetDDLJobByIdx(1) - require.NoError(t, err) - require.Nil(t, v) - - job.ID = 2 - err = m.UpdateDDLJob(0, job, true) - require.NoError(t, err) - - element := &meta.Element{ID: 123, TypeKey: meta.IndexElementKey} - // There are 3 meta key relate to index reorganization: - // start_handle, end_handle and physical_table_id. - // Only start_handle is initialized. - err = m.UpdateDDLReorgStartHandle(job, element, kv.IntHandle(1).Encoded()) - require.NoError(t, err) - - // Since physical_table_id is uninitialized, we simulate older TiDB version that doesn't store them. - // In this case GetDDLReorgHandle always return maxInt64 as end_handle. - e, i, j, k, err := m.GetDDLReorgHandle(job) - require.NoError(t, err) - require.Equal(t, element, e) - require.Equal(t, kv.Key(kv.IntHandle(1).Encoded()), i) - require.Equal(t, kv.Key(kv.IntHandle(math.MaxInt64).Encoded()), j) - require.Equal(t, int64(0), k) - - element = &meta.Element{ID: 222, TypeKey: meta.ColumnElementKey} - err = m.UpdateDDLReorgHandle(job.ID, tc.startHandle.Encoded(), tc.endHandle.Encoded(), 3, element) - require.NoError(t, err) - element1 := &meta.Element{ID: 223, TypeKey: meta.IndexElementKey} - err = m.UpdateDDLReorgHandle(job.ID, tc.startHandle.Encoded(), tc.endHandle.Encoded(), 3, element1) - require.NoError(t, err) - - e, i, j, k, err = m.GetDDLReorgHandle(job) - require.NoError(t, err) - require.Equal(t, element1, e) - require.Equal(t, kv.Key(tc.startHandle.Encoded()), i) - require.Equal(t, kv.Key(tc.endHandle.Encoded()), j) - require.Equal(t, int64(3), k) - - err = m.RemoveDDLReorgHandle(job, []*meta.Element{element, element1}) - require.NoError(t, err) - e, i, j, k, err = m.GetDDLReorgHandle(job) - require.True(t, meta.ErrDDLReorgElementNotExist.Equal(err)) - require.Nil(t, e) - require.Nil(t, i) - require.Nil(t, j) - require.Equal(t, k, int64(0)) - - // new TiDB binary running on old TiDB DDL reorg data. - e, i, j, k, err = m.GetDDLReorgHandle(job) - require.True(t, meta.ErrDDLReorgElementNotExist.Equal(err)) - require.Nil(t, e) - require.Nil(t, i) - require.Nil(t, j) - require.Equal(t, k, int64(0)) - - // Test GetDDLReorgHandle failed. - _, _, _, _, err = m.GetDDLReorgHandle(job) - require.True(t, meta.ErrDDLReorgElementNotExist.Equal(err)) - - v, err = m.DeQueueDDLJob() - require.NoError(t, err) - require.Equal(t, job, v) - - err = m.AddHistoryDDLJob(job, true) - require.NoError(t, err) - v, err = m.GetHistoryDDLJob(2) - require.NoError(t, err) - require.Equal(t, job, v) - - // Add multiple history jobs. - arg := "test arg" - historyJob1 := &model.Job{ID: 1234} - historyJob1.Args = append(job.Args, arg) - err = m.AddHistoryDDLJob(historyJob1, true) - require.NoError(t, err) - historyJob2 := &model.Job{ID: 123} - historyJob2.Args = append(job.Args, arg) - err = m.AddHistoryDDLJob(historyJob2, false) - require.NoError(t, err) - all, err := ddl.GetAllHistoryDDLJobs(m) - require.NoError(t, err) - var lastID int64 - for _, job := range all { - require.Greater(t, job.ID, lastID) - lastID = job.ID - arg1 := "" - err := job.DecodeArgs(&arg1) - require.NoError(t, err) - if job.ID == historyJob1.ID { - require.Equal(t, historyJob1.Args[0], *(job.Args[0].(*string))) - } else { - require.Len(t, job.Args, 0) - } - } - - // Test for get last N history ddl jobs. - historyJobs, err := ddl.GetLastNHistoryDDLJobs(m, 2) - require.NoError(t, err) - require.Len(t, historyJobs, 2) - require.Equal(t, int64(1234), historyJobs[0].ID) - require.Equal(t, int64(123), historyJobs[1].ID) - - // Test GetAllDDLJobsInQueue. - err = m.EnQueueDDLJob(job) - require.NoError(t, err) - job1 := &model.Job{ID: 2} - err = m.EnQueueDDLJob(job1) - require.NoError(t, err) - jobs, err := m.GetAllDDLJobsInQueue() - require.NoError(t, err) - expectJobs := []*model.Job{job, job1} - require.Equal(t, expectJobs, jobs) - - err = txn.Commit(context.Background()) - require.NoError(t, err) - }) - } -} - -func TestAddIndexJob(t *testing.T) { - store, err := mockstore.NewMockStore() - require.NoError(t, err) - defer func() { - err := store.Close() - require.NoError(t, err) - }() - - txn1, err := store.Begin() - require.NoError(t, err) - - m := meta.NewMeta(txn1, meta.AddIndexJobListKey) - job := &model.Job{ID: 1} - err = m.EnQueueDDLJob(job) - require.NoError(t, err) - job.ID = 123 - err = m.UpdateDDLJob(0, job, true, meta.AddIndexJobListKey) - require.NoError(t, err) - v, err := m.GetDDLJobByIdx(0, meta.AddIndexJobListKey) - require.NoError(t, err) - require.Equal(t, job, v) - l, err := m.DDLJobQueueLen(meta.AddIndexJobListKey) - require.NoError(t, err) - require.Equal(t, int64(1), l) - jobs, err := m.GetAllDDLJobsInQueue(meta.AddIndexJobListKey) - require.NoError(t, err) - expectJobs := []*model.Job{job} - require.Equal(t, expectJobs, jobs) - - err = txn1.Commit(context.Background()) - require.NoError(t, err) -} - func BenchmarkGenGlobalIDs(b *testing.B) { store, err := mockstore.NewMockStore() require.NoError(b, err) @@ -767,45 +613,6 @@ func TestSequenceKey(b *testing.T) { require.Equal(b, tableID, id) } -func TestClearJob(t *testing.T) { - store, err := mockstore.NewMockStore() - require.NoError(t, err) - defer func() { - require.NoError(t, store.Close()) - }() - - txn, err := store.Begin() - require.NoError(t, err) - - job1 := &model.Job{ID: 1, TableID: 1, Type: model.ActionAddColumn} - job2 := &model.Job{ID: 2, TableID: 1, Type: model.ActionCreateTable} - job3 := &model.Job{ID: 3, TableID: 2, Type: model.ActionDropColumn} - - m := meta.NewMeta(txn) - - require.NoError(t, m.EnQueueDDLJob(job1)) - require.NoError(t, m.EnQueueDDLJob(job2)) - require.NoError(t, m.EnQueueDDLJob(job3)) - - require.NoError(t, m.AddHistoryDDLJob(job1, false)) - require.NoError(t, m.AddHistoryDDLJob(job2, false)) - - jobs, err := m.GetAllDDLJobsInQueue() - require.NoError(t, err) - require.Len(t, jobs, 3) - require.NoError(t, m.ClearALLDDLJob()) - jobs, err = m.GetAllDDLJobsInQueue() - require.NoError(t, err) - require.Len(t, jobs, 0) - - count, err := m.GetHistoryDDLCount() - require.NoError(t, err) - require.Equal(t, count, uint64(2)) - - err = txn.Rollback() - require.NoError(t, err) -} - func TestCreateMySQLDatabase(t *testing.T) { store, err := mockstore.NewMockStore() require.NoError(t, err) @@ -829,41 +636,3 @@ func TestCreateMySQLDatabase(t *testing.T) { err = txn.Rollback() require.NoError(t, err) } - -func TestDDLTable(t *testing.T) { - store, err := mockstore.NewMockStore() - require.NoError(t, err) - defer func() { - require.NoError(t, store.Close()) - }() - - txn, err := store.Begin() - require.NoError(t, err) - - m := meta.NewMeta(txn) - - exists, err := m.CheckDDLTableExists() - require.NoError(t, err) - require.False(t, exists) - - err = m.SetDDLTables() - require.NoError(t, err) - - exists, err = m.CheckDDLTableExists() - require.NoError(t, err) - require.True(t, exists) - - err = m.SetConcurrentDDL(true) - require.NoError(t, err) - b, err := m.IsConcurrentDDL() - require.NoError(t, err) - require.True(t, b) - err = m.SetConcurrentDDL(false) - require.NoError(t, err) - b, err = m.IsConcurrentDDL() - require.NoError(t, err) - require.False(t, b) - - err = txn.Rollback() - require.NoError(t, err) -} diff --git a/metrics/BUILD.bazel b/metrics/BUILD.bazel index ff37513801ede..c414e04d9c907 100644 --- a/metrics/BUILD.bazel +++ b/metrics/BUILD.bazel @@ -13,12 +13,14 @@ go_library( "meta.go", "metrics.go", "owner.go", + "resourcemanager.go", "server.go", "session.go", "sli.go", "stats.go", "telemetry.go", "topsql.go", + "ttl.go", ], importpath = "github.com/pingcap/tidb/metrics", visibility = ["//visibility:public"], diff --git a/metrics/ddl.go b/metrics/ddl.go index 5efe636c8a038..c97077ed0aea0 100644 --- a/metrics/ddl.go +++ b/metrics/ddl.go @@ -147,6 +147,8 @@ const ( LblAddIndex = "add_index" LblAddIndexMerge = "add_index_merge_tmp" LblModifyColumn = "modify_column" + + LblReorgPartition = "reorganize_partition" ) // GenerateReorgLabel returns the label with schema name and table name. diff --git a/metrics/grafana/overview.json b/metrics/grafana/overview.json index 3ee88ac3ae4c8..88a3b8acf82dd 100644 --- a/metrics/grafana/overview.json +++ b/metrics/grafana/overview.json @@ -983,6 +983,214 @@ "transform": "timeseries_aggregations", "type": "table-old" }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 9 + }, + "hiddenSeries": false, + "id": 200, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "paceLength": 10, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "irate(process_cpu_seconds_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\",job=~\".*pd.*\"}[30s])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{job}}-{{instance}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "CPU Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percentunit", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 9 + }, + "hiddenSeries": false, + "id": 201, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "paceLength": 10, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "process_resident_memory_bytes{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\",job=~\".*pd.*\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "process-{{job}}-{{instance}}", + "refId": "A" + }, + { + "exemplar": true, + "expr": "go_memstats_heap_inuse_bytes{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\",job=~\".*pd.*\"}", + "hide": false, + "interval": "", + "legendFormat": "HeapSys-{{job}}-{{instance}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Memory Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, { "aliasColors": {}, "bars": false, diff --git a/metrics/grafana/performance_overview.json b/metrics/grafana/performance_overview.json index 19f526e562280..5ee670584f99e 100644 --- a/metrics/grafana/performance_overview.json +++ b/metrics/grafana/performance_overview.json @@ -57,8 +57,8 @@ "editable": true, "gnetId": null, "graphTooltip": 1, - "id": null, - "iteration": 1577357354898, + "id": 31, + "iteration": 1669018858346, "links": [], "panels": [ { @@ -479,6 +479,11 @@ "lines": true, "linewidth": 2, "stack": false + }, + { + "$$hashKey": "object:321", + "alias": "tiflash_mpp", + "color": "#8F3BB8" } ], "spaceLength": 10, @@ -508,6 +513,14 @@ "interval": "", "legendFormat": "execute time", "refId": "F" + }, + { + "exemplar": true, + "expr": "sum(rate(tiflash_coprocessor_request_duration_seconds_sum{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\"}[1m])) ", + "hide": false, + "interval": "", + "legendFormat": "tiflash_mpp", + "refId": "A" } ], "thresholds": [], @@ -1048,12 +1061,12 @@ }, { "aliasColors": {}, - "bars": false, + "bars": true, "dashLength": 10, "dashes": false, "datasource": "${DS_TEST-CLUSTER}", "decimals": null, - "description": "TiDB current connection counts", + "description": "kv request time by command source", "editable": true, "error": false, "fill": 1, @@ -1066,7 +1079,7 @@ "y": 15 }, "hiddenSeries": false, - "id": 188, + "id": 23763571995, "legend": { "alignAsTable": true, "avg": true, @@ -1082,7 +1095,7 @@ "total": false, "values": true }, - "lines": true, + "lines": false, "linewidth": 1, "links": [], "nullPointMode": "null as zero", @@ -1094,57 +1107,49 @@ "pointradius": 5, "points": false, "renderer": "flot", - "seriesOverrides": [], + "seriesOverrides": [ + { + "$$hashKey": "object:243", + "alias": "kv request total time", + "bars": false, + "color": "#FADE2A", + "lines": true, + "stack": false + } + ], "spaceLength": 10, - "stack": false, + "stack": true, "steppedLine": false, "targets": [ { "exemplar": true, - "expr": "tidb_server_connections{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\"}", + "expr": "sum(rate(tidb_tikvclient_request_time_counter{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m])) by (type, source)", "format": "time_series", "interval": "", "intervalFactor": 2, - "legendFormat": "{{instance}}", + "legendFormat": "{{type}}-{{source}}", "refId": "A", "step": 30 }, { "exemplar": true, - "expr": "sum(tidb_server_connections{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\"})", + "expr": "sum(rate(tidb_tikvclient_request_time_counter{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m]))", "hide": false, "interval": "", - "intervalFactor": 2, - "legendFormat": "total", + "legendFormat": "kv request total time", "refId": "B" - }, - { - "exemplar": true, - "expr": "sum(tidb_server_tokens{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\"})", - "hide": false, - "interval": "", - "legendFormat": "active connections", - "refId": "D" - }, - { - "exemplar": true, - "expr": "sum(tidb_server_tokens{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\"}) by (instance)", - "hide": true, - "interval": "", - "legendFormat": "ac-{{instance}}", - "refId": "E" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, - "title": "Connection Count", + "title": "KV Request Time By Source", "tooltip": { "msResolution": false, "shared": true, "sort": 0, - "value_type": "individual" + "value_type": "cumulative" }, "type": "graph", "xaxis": { @@ -1156,9 +1161,9 @@ }, "yaxes": [ { - "$$hashKey": "object:3472", + "$$hashKey": "object:178", "decimals": 0, - "format": "short", + "format": "s", "label": null, "logBase": 1, "max": null, @@ -1166,7 +1171,7 @@ "show": true }, { - "$$hashKey": "object:3473", + "$$hashKey": "object:179", "format": "short", "label": null, "logBase": 1, @@ -1480,8 +1485,8 @@ "fill": 1, "fillGradient": 0, "gridPos": { - "h": 7, - "w": 12, + "h": 6, + "w": 8, "x": 0, "y": 29 }, @@ -1601,9 +1606,9 @@ "fillGradient": 0, "grid": {}, "gridPos": { - "h": 7, - "w": 12, - "x": 12, + "h": 6, + "w": 8, + "x": 8, "y": 29 }, "hiddenSeries": false, @@ -1720,6 +1725,148 @@ "alignLevel": null } }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "decimals": null, + "description": "TiDB current connection counts", + "editable": true, + "error": false, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 6, + "w": 8, + "x": 16, + "y": 29 + }, + "hiddenSeries": false, + "id": 188, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "$$hashKey": "object:113", + "alias": "disconnection/s", + "color": "#C4162A", + "linewidth": 2, + "yaxis": 2 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "tidb_server_connections{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{instance}}", + "refId": "A", + "step": 30 + }, + { + "exemplar": true, + "expr": "sum(tidb_server_connections{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\"})", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "total", + "refId": "B" + }, + { + "exemplar": true, + "expr": "sum(tidb_server_tokens{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\"})", + "hide": false, + "interval": "", + "legendFormat": "active connections", + "refId": "D" + }, + { + "exemplar": true, + "expr": "sum(rate(tidb_server_disconnection_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", result=\"ok\"}[1m]))", + "hide": false, + "interval": "", + "legendFormat": "disconnection/s", + "refId": "E" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Connection Count", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:3472", + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:3473", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, { "aliasColors": {}, "bars": false, @@ -1737,7 +1884,7 @@ "h": 8, "w": 8, "x": 0, - "y": 36 + "y": 35 }, "hiddenSeries": false, "id": 156, @@ -1861,7 +2008,7 @@ "h": 8, "w": 8, "x": 8, - "y": 36 + "y": 35 }, "hiddenSeries": false, "id": 170, @@ -1972,7 +2119,7 @@ "h": 8, "w": 8, "x": 16, - "y": 36 + "y": 35 }, "hiddenSeries": false, "id": 169, @@ -2097,7 +2244,7 @@ "h": 8, "w": 8, "x": 0, - "y": 44 + "y": 43 }, "hiddenSeries": false, "id": 172, @@ -2205,7 +2352,7 @@ "h": 8, "w": 8, "x": 8, - "y": 44 + "y": 43 }, "hiddenSeries": false, "id": 173, @@ -2312,7 +2459,7 @@ "h": 8, "w": 8, "x": 16, - "y": 44 + "y": 43 }, "hiddenSeries": false, "id": 77, @@ -2459,7 +2606,7 @@ "h": 8, "w": 8, "x": 0, - "y": 52 + "y": 51 }, "hiddenSeries": false, "id": 185, @@ -2573,7 +2720,7 @@ "h": 8, "w": 8, "x": 8, - "y": 52 + "y": 51 }, "hiddenSeries": false, "id": 183, @@ -2689,7 +2836,7 @@ "h": 8, "w": 8, "x": 16, - "y": 52 + "y": 51 }, "hiddenSeries": false, "id": 174, @@ -2805,7 +2952,7 @@ "h": 9, "w": 8, "x": 0, - "y": 60 + "y": 59 }, "hiddenSeries": false, "id": 176, @@ -2921,7 +3068,7 @@ "h": 9, "w": 8, "x": 8, - "y": 60 + "y": 59 }, "hiddenSeries": false, "id": 177, @@ -3037,7 +3184,7 @@ "h": 9, "w": 8, "x": 16, - "y": 60 + "y": 59 }, "hiddenSeries": false, "id": 186, @@ -3135,27 +3282,3153 @@ "align": false, "alignLevel": null } + }, + { + "collapsed": true, + "datasource": "${DS_TEST-CLUSTER}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 68 + }, + "id": 159, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "decimals": 1, + "description": "The CPU usage of each TiFlash instance", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 2 + }, + "hiddenSeries": false, + "id": 161, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": null, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "rate(tiflash_proxy_process_cpu_seconds_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", job=\"tiflash\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{instance}}", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeRegions": [], + "title": "CPU", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percentunit", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "decimals": 1, + "description": "The memory usage per TiFlash instance", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 2 + }, + "hiddenSeries": false, + "id": 1709, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": null, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "avg(tiflash_proxy_process_resident_memory_bytes{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}) by (instance)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{instance}}", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Memory", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "decimals": 1, + "description": "The I/O utilization per TiFlash instance", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 2 + }, + "hiddenSeries": false, + "id": 165, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": null, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "rate(node_disk_io_time_seconds_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"tiflash.*\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{instance}} - {{device}}", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeRegions": [], + "title": "IO utilization", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percentunit", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The MPP query count in TiFlash", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 9 + }, + "hiddenSeries": false, + "id": 157, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "max(tiflash_mpp_task_manager{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}) by (instance, type)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{instance}}-{{type}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "MPP Query count", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The number of coprocessor requests received by all TiFlash instances. batch is the number of batch requests. batch_cop is the number of coprocessor requests in the batch requests. cop is the number of coprocessor requests that are sent directly via the coprocessor interface. cop_dag is the number of dag requests in all coprocessor requests. super_batch is the number of requests to enable the Super Batch feature.", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 9 + }, + "hiddenSeries": false, + "id": 9, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(tiflash_coprocessor_request_count{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{type}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Request QPS", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The number of each type of dag executors in the requests received by all TiFlash instances. table_scan is the table scan executor. selection is the selection executor. aggregation is the aggregation executor. top_n is the TopN executor. limit is the limit executor.", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 9 + }, + "hiddenSeries": false, + "id": 2, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(tiflash_coprocessor_executor_count{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{type}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Executor QPS", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The overview of the total duration of all TiFlash instances processing coprocessor requests.", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 6, + "w": 8, + "x": 0, + "y": 16 + }, + "hiddenSeries": false, + "id": 166, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": false, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(tiflash_coprocessor_request_duration_seconds_sum[1m])) by (type)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{type}}", + "refId": "D" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Request Duration Overview", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": " The total duration of all TiFlash instances processing coprocessor requests.", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 6, + "w": 8, + "x": 8, + "y": 16 + }, + "hiddenSeries": false, + "id": 11, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "histogram_quantile(0.999, sum(rate(tiflash_coprocessor_request_duration_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", + "format": "time_series", + "hide": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": "999", + "refId": "A" + }, + { + "exemplar": true, + "expr": "histogram_quantile(0.99, sum(rate(tiflash_coprocessor_request_duration_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m])) by (le,type))", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "99-{{type}}", + "refId": "B" + }, + { + "exemplar": true, + "expr": "sum(rate(tiflash_coprocessor_request_duration_seconds_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m])) by (type) /sum(rate(tiflash_coprocessor_request_duration_seconds_count{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "avg-{{type}}", + "refId": "D" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Request Duration", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The duration of all TiFlash instances processing coprocessor requests. The processing time is from starting to execute the coprocessor request to completing the execution.", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 6, + "w": 8, + "x": 16, + "y": 16 + }, + "hiddenSeries": false, + "id": 13, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "histogram_quantile(0.999, sum(rate(tiflash_coprocessor_request_handle_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", + "format": "time_series", + "hide": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": "999", + "refId": "A" + }, + { + "exemplar": true, + "expr": "histogram_quantile(0.99, sum(rate(tiflash_coprocessor_request_handle_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m])) by (le,type))", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "99-{{type}}", + "refId": "B" + }, + { + "exemplar": true, + "expr": "sum(rate(tiflash_coprocessor_request_handle_seconds_sum[1m])) by (type) /sum(rate(tiflash_coprocessor_request_handle_seconds_count[1m])) by (type)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "avg-{{type}}", + "refId": "D" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Request Handle Duration", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The time used by wait_index for all TiFlash instances, namely the time used to wait until local index >= read_index after the read_index request is received.", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 6, + "w": 12, + "x": 0, + "y": 22 + }, + "hiddenSeries": false, + "id": 37, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/timeout/", + "yaxis": 2 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "histogram_quantile(1.00, sum(rate(tiflash_raft_wait_index_duration_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", + "format": "time_series", + "hide": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": "max", + "refId": "A" + }, + { + "expr": "histogram_quantile(0.99, sum(rate(tiflash_raft_wait_index_duration_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "99", + "refId": "B" + }, + { + "exemplar": true, + "expr": "sum(rate(tiflash_raft_wait_index_duration_seconds_sum[1m]))/sum(rate(tiflash_raft_wait_index_duration_seconds_count[1m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "avg", + "refId": "D" + }, + { + "expr": "sum(increase(tiflash_system_profile_event_RaftWaitIndexTimeout{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m])) by (instance)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{instance}}-timeout", + "refId": "E" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Raft Wait Index Duration", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "decimals": 2, + "format": "opm", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The number of times that each TiFlash instance triggers the read_index request per second, which equals to the number of Regions triggered.", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 6, + "w": 12, + "x": 12, + "y": 22 + }, + "hiddenSeries": false, + "id": 23763571994, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/timeout/", + "yaxis": 2 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "histogram_quantile(1.00, sum(rate(tiflash_raft_wait_index_duration_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", + "format": "time_series", + "hide": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": "max", + "refId": "A" + }, + { + "exemplar": true, + "expr": "histogram_quantile(0.99, sum(rate(tiflash_raft_read_index_duration_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "99", + "refId": "B" + }, + { + "exemplar": true, + "expr": "sum(rate(tiflash_raft_read_index_duration_seconds_sum[1m]))/sum(rate(tiflash_raft_read_index_duration_seconds_count[1m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "avg", + "refId": "D" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Raft Batch Read Index Duration", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "decimals": 2, + "format": "opm", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "decimals": 1, + "description": "The throughput of write by instance", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 28 + }, + "height": "", + "hiddenSeries": false, + "id": 89, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 250, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeatedByRow": true, + "seriesOverrides": [ + { + "alias": "/total/", + "yaxis": 2 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(tiflash_storage_throughput_bytes{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", type=~\"write\"}[1m])) by (instance)", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "write-{{instance}}", + "refId": "A", + "step": 10 + }, + { + "exemplar": true, + "expr": "sum(rate(tiflash_storage_throughput_bytes{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", type=~\"ingest\"}[1m])) by (instance)", + "hide": false, + "interval": "", + "legendFormat": "ingest-{{instance}}", + "refId": "B" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Write Throughput By Instance", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "binBps", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "decimals": 1, + "description": "The flow of different kinds of write operations", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 34 + }, + "height": "", + "hiddenSeries": false, + "id": 60, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": null, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeatedByRow": true, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(tiflash_system_profile_event_WriteBufferFromFileDescriptorWriteBytes{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m]))", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "File Descriptor", + "refId": "A", + "step": 10 + }, + { + "expr": "sum(rate(tiflash_system_profile_event_PSMWriteBytes{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Page", + "refId": "B" + }, + { + "expr": "sum(rate(tiflash_system_profile_event_PSMBackgroundWriteBytes{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "PageBackGround", + "refId": "C" + }, + { + "expr": "sum(rate(tiflash_system_profile_event_WriteBufferAIOWriteBytes{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m]))", + "format": "time_series", + "hide": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": "AIO", + "refId": "D" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Write flow", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "binBps", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "decimals": 1, + "description": "The flow of different kinds of read operations", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 34 + }, + "height": "", + "hiddenSeries": false, + "id": 59, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": null, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeatedByRow": true, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(tiflash_system_profile_event_ReadBufferFromFileDescriptorReadBytes{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m]))", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "File Descriptor", + "refId": "A", + "step": 10 + }, + { + "expr": "sum(rate(tiflash_system_profile_event_PSMReadBytes{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Page", + "refId": "B" + }, + { + "expr": "sum(rate(tiflash_system_profile_event_PSMBackgroundReadBytes{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "PageBackGround", + "refId": "C" + }, + { + "expr": "sum(rate(tiflash_system_profile_event_ReadBufferAIOReadBytes{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m]))", + "format": "time_series", + "hide": true, + "intervalFactor": 1, + "legendFormat": "AIO", + "refId": "D" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Read flow", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "binBps", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "title": "TiFlash", + "type": "row" + }, + { + "collapsed": true, + "datasource": "${DS_TEST-CLUSTER}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 69 + }, + "id": 515, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "CPU usage of TiCDC", + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 71 + }, + "hiddenSeries": false, + "id": 24, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": true, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": false, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "paceLength": 10, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "$$hashKey": "object:284", + "alias": "/.*MaxProcs/", + "fill": 0, + "linewidth": 2, + "yaxis": 2 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(process_cpu_seconds_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", job=\"ticdc\"}[1m])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{instance}}", + "refId": "A" + }, + { + "expr": "ticdc_server_go_max_procs{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", job=\"ticdc\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{instance}}-MaxProcs", + "refId": "B" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "CPU usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:295", + "format": "percentunit", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:296", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "Memory usage of TiCDC", + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 71 + }, + "hiddenSeries": false, + "id": 23, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "hideEmpty": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "paceLength": 10, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "process_resident_memory_bytes{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", job=\"ticdc\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "process-{{instance}}", + "refId": "A" + }, + { + "expr": "go_memstats_heap_alloc_bytes{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", job=\"ticdc\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "heap-{{instance}}", + "refId": "B" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Memory usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "Goroutine count of TiCDC", + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 71 + }, + "hiddenSeries": false, + "id": 26, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "paceLength": 10, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": " go_goroutines{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", job=\"ticdc\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{instance}}", + "refId": "A" + }, + { + "expr": "go_threads{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", job=\"ticdc\"}", + "format": "time_series", + "hide": true, + "intervalFactor": 1, + "legendFormat": "threads-{{instance}}", + "refId": "B" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Goroutine count", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The lag between changefeed checkpoint ts and the latest ts of upstream TiDB.", + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 78 + }, + "hiddenSeries": false, + "id": 3, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "paceLength": 10, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "max(ticdc_owner_checkpoint_ts_lag{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}) by (changefeed)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{changefeed}}", + "refId": "A" + }, + { + "exemplar": true, + "expr": "max(ticdc_processor_checkpoint_ts_lag{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}) by (instance,changefeed)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{instance}}-{{changefeed}}", + "refId": "B" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Changefeed checkpoint lag", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:79", + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:80", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The lag between changefeed resolved ts and the latest ts of upstream TiDB.", + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 78 + }, + "hiddenSeries": false, + "id": 513, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "paceLength": 10, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "max(ticdc_owner_resolved_ts_lag{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}) by (changefeed)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{changefeed}}", + "refId": "C" + }, + { + "exemplar": true, + "expr": "max(ticdc_processor_resolved_ts_lag{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}) by (instance,changefeed)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{instance}}-{{chanefeed}}", + "refId": "D" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Changefeed resolved ts lag", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The status of each changefeed.\n\n0: Normal\n\n1: Error\n\n2: Failed\n\n3: Stopped\n\n4: Finished\n\n-1: Unknown", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 78 + }, + "hiddenSeries": false, + "id": 163, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 1, + "points": true, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "max(ticdc_owner_status{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}) by (changefeed)", + "format": "time_series", + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{changefeed}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "The status of changefeeds", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The number of events that puller outputs to sorter \n per second", + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 85 + }, + "hiddenSeries": false, + "id": 218, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "paceLength": 10, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum (rate(ticdc_puller_txn_collect_event_count{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", type!=\"resolved\"}[1m])) by (changefeed, instance, type)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{changefeed}}-{{instance}}-{{type}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Puller output events/s", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The number of events that sorter outputs to puller \n per second", + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 85 + }, + "hiddenSeries": false, + "id": 228, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "paceLength": 10, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(ticdc_sorter_output_event_count{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m])) by (changefeed, instance, type)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{changefeed}}-{{instance}}-{{type}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Sorter output events/s", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The number of events that mounter outputs to sink per second", + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 92 + }, + "hiddenSeries": false, + "id": 219, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "paceLength": 10, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(ticdc_mounter_total_rows_count{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m])) by (instance,changefeed)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{changefeed}}-{{instance}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Mounter output events/s", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:196", + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:197", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The number of events that table sorter outputs to sink per second", + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 92 + }, + "hiddenSeries": false, + "id": 108, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(ticdc_sink_table_sink_total_rows_count{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[1m])) by (changefeed, instance)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{changefeed}}-{{instance}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Table sink output events/s", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The number of rows that sink flushes to downstream per second.", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 99 + }, + "hiddenSeries": false, + "id": 654, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(ticdc_sinkv2_batch_row_count_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", changefeed!=\"\"}[1m])) by (changefeed, instance)", + "interval": "", + "legendFormat": "{{changefeed}}-{{instance}}", + "queryType": "randomWalk", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "SinkV2 - Sink flush rows/s", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:258", + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:259", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "Full flush (backend flush + callback + conflict detector notify) duration", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 99 + }, + "hiddenSeries": false, + "id": 620, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "histogram_quantile(0.999, sum(rate(ticdc_sinkv2_txn_worker_flush_duration_bucket{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", changefeed!=\"\"}[1m])) by (le,changefeed,instance))", + "interval": "", + "legendFormat": "99.9-{{changefeed}}-{{instance}}", + "queryType": "randomWalk", + "refId": "A" + }, + { + "exemplar": true, + "expr": "sum(rate(ticdc_sinkv2_txn_worker_flush_duration_sum{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", changefeed!=\"\"}[1m])) by (changefeed,instance) / \nsum(rate(ticdc_sinkv2_txn_worker_flush_duration_count{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", changefeed!=\"\"}[1m])) by (changefeed,instance)", + "hide": false, + "interval": "", + "legendFormat": "avg-{{changefeed}}-{{instance}}", + "refId": "B" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Transaction Sink Full Flush Duration", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:332", + "format": "s", + "label": null, + "logBase": 2, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:333", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "MQ worker send messages to Kafka, this metric record the time cost on send every message.", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 106 + }, + "hiddenSeries": false, + "id": 653, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "histogram_quantile(0.999, sum(rate(ticdc_sinkv2_mq_worker_send_message_duration_bucket{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", changefeed!=\"\"}[1m])) by (le,changefeed,instance))", + "interval": "", + "legendFormat": "{{changefeed}}-{{instance}}-P999", + "queryType": "randomWalk", + "refId": "A" + }, + { + "exemplar": true, + "expr": "sum(rate(ticdc_sinkv2_mq_worker_send_message_duration_sum{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", changefeed!=\"\"}[1m])) by (changefeed,instance) / \nsum(rate(ticdc_sinkv2_mq_worker_send_message_duration_count{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", changefeed!=\"\"}[1m])) by (changefeed,instance)", + "hide": false, + "interval": "", + "legendFormat": "{{changefeed}}-{{instance}}-avg", + "refId": "B" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "MQ Worker Send Message Duration Percentile", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:406", + "format": "s", + "label": null, + "logBase": 2, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:407", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "Bytes/second written off all brokers.\nvalue = one-minute moving average rate of Bytes per second", + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 106 + }, + "hiddenSeries": false, + "id": 628, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "paceLength": 10, + "percentage": false, + "pluginVersion": "8.0.7", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(ticdc_sinkv2_kafka_producer_outgoing_byte_rate{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", changefeed!=\"\"}) by (changefeed, instance, broker)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{changefeed}}-{{instance}}-{{broker}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Kafka Outgoing Bytes", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:480", + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:481", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "title": "CDC", + "type": "row" } ], "refresh": "30s", - "schemaVersion": 18, + "schemaVersion": 27, "style": "dark", "tags": [], "templating": { "list": [ { "allValue": null, - "current": {}, + "current": { + "isNone": true, + "selected": false, + "text": "None", + "value": "" + }, "datasource": "${DS_TEST-CLUSTER}", + "definition": "", + "description": null, + "error": null, "hide": 2, "includeAll": false, "label": "K8s-cluster", "multi": false, "name": "k8s_cluster", "options": [], - "query": "label_values(pd_cluster_status, k8s_cluster)", + "query": { + "query": "label_values(pd_cluster_status, k8s_cluster)", + "refId": "${DS_TEST-CLUSTER}-k8s_cluster-Variable-Query" + }, "refresh": 2, "regex": "", + "skipUrlSync": false, "sort": 1, "tagValuesQuery": "", "tags": [], @@ -3165,17 +6438,29 @@ }, { "allValue": null, - "current": {}, + "current": { + "isNone": true, + "selected": false, + "text": "None", + "value": "" + }, "datasource": "${DS_TEST-CLUSTER}", + "definition": "", + "description": null, + "error": null, "hide": 2, "includeAll": false, "label": "tidb_cluster", "multi": false, "name": "tidb_cluster", "options": [], - "query": "label_values(pd_cluster_status{k8s_cluster=\"$k8s_cluster\"}, tidb_cluster)", + "query": { + "query": "label_values(pd_cluster_status{k8s_cluster=\"$k8s_cluster\"}, tidb_cluster)", + "refId": "${DS_TEST-CLUSTER}-tidb_cluster-Variable-Query" + }, "refresh": 2, "regex": "", + "skipUrlSync": false, "sort": 1, "tagValuesQuery": "", "tags": [], diff --git a/metrics/grafana/tidb.json b/metrics/grafana/tidb.json index bd686ffd05c92..8c19fe9a56bf9 100644 --- a/metrics/grafana/tidb.json +++ b/metrics/grafana/tidb.json @@ -3706,7 +3706,7 @@ "avg": false, "current": false, "max": false, - "min": false, + "min": false, "show": true, "total": false, "values": false @@ -3845,12 +3845,21 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_session_transaction_duration_seconds_count{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1m])) by (type, txn_mode)", + "expr": "sum(rate(tidb_session_transaction_duration_seconds_count{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", scope=~\"general\"}[1m])) by (type, txn_mode)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}-{{txn_mode}}", "refId": "A", "step": 10 + }, + { + "expr": "sum(rate(tidb_session_transaction_duration_seconds_count{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", scope=~\"internal\"}[1m])) by (type, txn_mode)", + "format": "time_series", + "hide": true, + "intervalFactor": 2, + "legendFormat": "Internal-{{type}}-{{txn_mode}}", + "refId": "B", + "step": 10 } ], "thresholds": [], @@ -3947,24 +3956,17 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_session_transaction_duration_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1m])) by (le, txn_mode))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_session_transaction_duration_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", scope=~\"general\"}[1m])) by (le, txn_mode))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99-{{txn_mode}}", "refId": "A" }, { - "expr": "histogram_quantile(0.95, sum(rate(tidb_session_transaction_duration_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1m])) by (le, txn_mode))", + "expr": "sum(rate(tidb_session_transaction_duration_seconds_sum{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", scope=~\"general\"}[1m])) by (txn_mode) / sum(rate(tidb_session_transaction_duration_seconds_count{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", scope=~\"general\"}[1m])) by (txn_mode)", "format": "time_series", "intervalFactor": 2, - "legendFormat": "95-{{txn_mode}}", - "refId": "B" - }, - { - "expr": "histogram_quantile(0.80, sum(rate(tidb_session_transaction_duration_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1m])) by (le, txn_mode))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "80-{{txn_mode}}", + "legendFormat": "avg-{{txn_mode}}", "refId": "C" } ], @@ -4045,7 +4047,7 @@ "reverseYBuckets": false, "targets": [ { - "expr": "sum(increase(tidb_session_transaction_statement_num_bucket{instance=~\"$instance\"}[1m])) by (le)", + "expr": "sum(increase(tidb_session_transaction_statement_num_bucket{instance=~\"$instance\", scope=~\"general\"}[1m])) by (le)", "format": "heatmap", "intervalFactor": 2, "legendFormat": "{{le}}", @@ -4114,7 +4116,7 @@ "reverseYBuckets": false, "targets": [ { - "expr": "sum(increase(tidb_session_retry_num_bucket{instance=~\"$instance\"}[1m])) by (le)", + "expr": "sum(increase(tidb_session_retry_num_bucket{instance=~\"$instance\", scope=~\"general\"}[1m])) by (le)", "format": "heatmap", "intervalFactor": 2, "legendFormat": "{{le}}", @@ -6799,6 +6801,204 @@ "align": false, "alignLevel": null } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "Counters of transactions or statements in which aggressive locking is enabled / takes effect.", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 74 + }, + "hiddenSeries": false, + "id": 295, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(irate(tidb_session_transaction_aggressive_locking_usage{instance=~\"$instance\"}[30s])) by (type)", + "interval": "", + "legendFormat": "{{type}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Aggressive Locking Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "Counters of keys involved in aggressive locking.", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 74 + }, + "hiddenSeries": false, + "id": 296, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(irate(tidb_tikvclient_aggressive_locking_count{instance=~\"$instance\"}[30s])) by (type)", + "interval": "", + "legendFormat": "{{type}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Aggressive Locking Keys", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } } ], "repeat": null, @@ -12883,7 +13083,7 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "tidb-cluster", + "datasource": "${DS_TEST-CLUSTER}", "description": "Speed of add index", "editable": true, "error": false, @@ -14337,57 +14537,46 @@ "align": false, "alignLevel": null } - } - ], - "repeat": null, - "title": "Statistics", - "type": "row" - }, - { - "collapsed": true, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 12 - }, - "id": 161, - "panels": [ + }, { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": "${DS_TEST-CLUSTER}", - "description": "TiDB new session durations for new etcd sessions", - "editable": true, - "error": false, + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, "fill": 1, - "grid": {}, + "fillGradient": 0, "gridPos": { "h": 7, "w": 8, "x": 0, - "y": 150 + "y": 184 }, - "id": 162, + "hiddenSeries": false, + "id": 236, "legend": { - "alignAsTable": true, "avg": false, "current": false, "max": false, "min": false, - "rightSide": false, "show": true, "total": false, "values": false }, "lines": true, - "linewidth": 2, + "linewidth": 1, "links": [], - "nullPointMode": "null as zero", + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, "percentage": false, + "pluginVersion": "7.5.11", "pointradius": 5, "points": false, "renderer": "flot", @@ -14397,20 +14586,260 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.95, sum(rate(tidb_owner_new_session_duration_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1m])) by (le, instance, result))", + "exemplar": true, + "expr": "sum(rate(tidb_plan_replayer_task{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", type=~\"dump\"}[1m])) by (result)", "format": "time_series", + "interval": "", "intervalFactor": 2, - "legendFormat": "{{instance}}-{{result}}", + "legendFormat": "dump-task-{{result}}", "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "New ETCD Session Duration 95", - "tooltip": { + "step": 30 + }, + { + "exemplar": true, + "expr": "sum(rate(tidb_plan_replayer_task{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", type=~\"capture\"}[1m])) by (result)", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "capture-task-{{result}}", + "refId": "B", + "step": 30 + }, + { + "exemplar": true, + "expr": "avg(tidb_plan_replayer_register_task{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"})", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "register-task", + "refId": "C" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Plan Replayer Task OPM", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 184 + }, + "hiddenSeries": false, + "id": 237, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(tidb_statistics_historical_stats{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", type=~\"generate\"}[1m])) by (result)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "generate-{{result}}", + "refId": "A", + "step": 30 + }, + { + "exemplar": true, + "expr": "sum(rate(tidb_statistics_historical_stats{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", type=~\"dump\"}[1m])) by (result)", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "dump-{{result}}", + "refId": "B", + "step": 30 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Historical Stats OPM", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "repeat": null, + "title": "Statistics", + "type": "row" + }, + { + "collapsed": true, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 12 + }, + "id": 161, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "TiDB new session durations for new etcd sessions", + "editable": true, + "error": false, + "fill": 1, + "grid": {}, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 150 + }, + "id": 162, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "histogram_quantile(0.95, sum(rate(tidb_owner_new_session_duration_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1m])) by (le, instance, result))", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{instance}}-{{result}}", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "New ETCD Session Duration 95", + "tooltip": { "msResolution": false, "shared": true, "sort": 0, @@ -16728,11 +17157,11 @@ "panels": [ { "aliasColors": {}, - "bars": true, + "bars": false, "dashLength": 10, "dashes": false, "datasource": "${DS_TEST-CLUSTER}", - "description": "kv request count by instance and command source", + "description": "TiDB cpu usage calculated with process cpu running seconds", "editable": true, "error": false, "fieldConfig": { @@ -16743,28 +17172,26 @@ "fillGradient": 0, "grid": {}, "gridPos": { - "h": 7, + "h": 8, "w": 12, "x": 0, - "y": 15 + "y": 20 }, "hiddenSeries": false, - "id": 259, + "id": 297, "legend": { "alignAsTable": true, - "avg": true, - "current": false, - "max": true, + "avg": false, + "current": true, + "max": false, "min": false, "rightSide": true, "show": true, - "sort": "max", - "sortDesc": true, "total": false, "values": true }, - "lines": false, - "linewidth": 2, + "lines": true, + "linewidth": 1, "links": [], "nullPointMode": "null as zero", "options": { @@ -16777,46 +17204,43 @@ "renderer": "flot", "seriesOverrides": [ { - "alias": "KV Requst Count", - "bars": false, - "color": "#FADE2A", - "lines": true, - "linewidth": 1, - "stack": false - } - ], + "alias": "total", + "fill": 0, + "lines": false + }, + { + "alias": "/limit/", + "color": "#C4162A", + "fill": 0, + "nullPointMode": "null" + } + ], "spaceLength": 10, - "stack": true, + "stack": false, "steppedLine": false, "targets": [ { - "exemplar": true, - "expr": "sum(rate(tidb_tikvclient_request_counter{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1m])) by (instance, type, source)", + "expr": "irate(process_cpu_seconds_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", job=\"tidb\"}[30s])", "format": "time_series", - "interval": "", + "hide": false, "intervalFactor": 1, - "legendFormat": "{{instance}}-{{type}}-{{source}}", + "legendFormat": "{{instance}}", "refId": "A", "step": 40 }, { - "exemplar": true, - "expr": "sum(rate(tidb_tikvclient_request_counter{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1m]))", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "KV Requst Count", - "refId": "B", - "step": 40 + "expr": "tidb_server_maxprocs{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", job=\"tidb\"}", + "legendFormat": "limit-{{instance}}", + "refId": "B" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, - "title": "KV Request OPS by source", + "title": "TiDB CPU Usage", "tooltip": { - "msResolution": true, + "msResolution": false, "shared": true, "sort": 0, "value_type": "individual" @@ -16831,8 +17255,7 @@ }, "yaxes": [ { - "$$hashKey": "object:62", - "format": "short", + "format": "percentunit", "label": null, "logBase": 1, "max": null, @@ -16840,7 +17263,6 @@ "show": true }, { - "$$hashKey": "object:63", "format": "short", "label": null, "logBase": 1, @@ -16856,11 +17278,12 @@ }, { "aliasColors": {}, - "bars": true, + "bars": false, "dashLength": 10, "dashes": false, "datasource": "${DS_TEST-CLUSTER}", - "description": "kv request time by instance and command source", + "decimals": null, + "description": "IO MBps: The total bytes of read and write in all TiKV instances", "editable": true, "error": false, "fieldConfig": { @@ -16871,29 +17294,27 @@ "fillGradient": 0, "grid": {}, "gridPos": { - "h": 7, + "h": 8, "w": 12, "x": 12, - "y": 15 + "y": 20 }, "hiddenSeries": false, - "id": 260, + "id": 301, "legend": { "alignAsTable": true, "avg": true, "current": false, "hideEmpty": true, "hideZero": true, - "max": true, + "max": false, "min": false, "rightSide": true, "show": true, - "sort": "max", - "sortDesc": true, "total": false, "values": true }, - "lines": false, + "lines": true, "linewidth": 1, "links": [], "nullPointMode": "null as zero", @@ -16905,46 +17326,155 @@ "pointradius": 5, "points": false, "renderer": "flot", - "seriesOverrides": [ - { - "alias": "KV Requst Time", - "bars": false, - "color": "#FADE2A", - "lines": true, - "linewidth": 1, - "stack": false - } - ], + "seriesOverrides": [], "spaceLength": 10, - "stack": true, + "stack": false, "steppedLine": false, "targets": [ { "exemplar": true, - "expr": "sum(rate(tidb_tikvclient_request_time_counter{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1m])) by (instance, type, source)", - "format": "time_series", + "expr": "avg(sum(rate(tikv_engine_flow_bytes{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", db=\"kv\", type=~\"wal_file_bytes|bytes_read|iter_bytes_read\"}[1m])) by (instance))", + "hide": false, + "instant": false, "interval": "", - "legendFormat": "{{instance}}-{{type}}-{{source}}", - "refId": "A", - "step": 40 + "legendFormat": "IO-Avg", + "refId": "D" }, { "exemplar": true, - "expr": "sum(rate(tidb_tikvclient_request_time_counter{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1m]))", - "format": "time_series", + "expr": "max(sum(rate(tikv_engine_flow_bytes{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", db=\"kv\", type=~\"wal_file_bytes|bytes_read|iter_bytes_read\"}[1m])) by (instance))", + "hide": false, "interval": "", - "legendFormat": "KV Requst Time", - "refId": "B", - "step": 40 + "legendFormat": "IO-Max", + "refId": "E" + }, + { + "exemplar": true, + "expr": "max(sum(rate(tikv_engine_flow_bytes{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", db=\"kv\", type=~\"wal_file_bytes|bytes_read|iter_bytes_read\"}[1m])) by (instance)) - min(sum(rate(tikv_engine_flow_bytes{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", db=\"kv\", type=~\"wal_file_bytes|bytes_read|iter_bytes_read\"}[1m])) by (instance))", + "hide": false, + "interval": "", + "legendFormat": "IO-Delta", + "refId": "F" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, - "title": "KV Request Time by source", + "title": "TiKV IO MBps", "tooltip": { - "msResolution": true, + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:208", + "decimals": null, + "format": "Bps", + "label": "MBps", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:209", + "decimals": null, + "format": "Bps", + "label": "MBps ", + "logBase": 1, + "max": null, + "min": "0", + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "decimals": 1, + "description": "The CPU usage of each TiKV instance", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 28 + }, + "hiddenSeries": false, + "id": 299, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": null, + "sort": "max", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(process_cpu_seconds_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", job=~\".*tikv\"}[1m])) by (instance)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{instance}}", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "TiKV CPU", + "tooltip": { + "msResolution": false, "shared": true, "sort": 0, "value_type": "individual" @@ -16959,8 +17489,7 @@ }, "yaxes": [ { - "$$hashKey": "object:62", - "format": "s", + "format": "percentunit", "label": null, "logBase": 1, "max": null, @@ -16968,7 +17497,1432 @@ "show": true }, { - "$$hashKey": "object:63", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The query count per second for each type of query in TTL jobs", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 28 + }, + "hiddenSeries": false, + "id": 279, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "delete ok", + "color": "#73BF69" + }, + { + "alias": "select ok", + "color": "#5794F2" + }, + { + "alias": "delete error", + "color": "#F2495C" + }, + { + "alias": "select error", + "color": "#FF7383" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(tidb_server_ttl_query_duration_count{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1m])) by (sql_type, result)", + "interval": "", + "legendFormat": "{{sql_type}} {{result}}", + "queryType": "randomWalk", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "TTL QPS By Type", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 36 + }, + "hiddenSeries": false, + "id": 302, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(tidb_server_ttl_insert_rows{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1m]))", + "interval": "", + "legendFormat": "insert rows per second", + "queryType": "randomWalk", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "TTL Insert Rows Per Second", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:394", + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:395", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The processed rows per second by TTL jobs", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 36 + }, + "hiddenSeries": false, + "id": 287, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(tidb_server_ttl_processed_expired_rows{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1m])) by (sql_type, result)", + "interval": "", + "legendFormat": "{{sql_type}} {{result}}", + "queryType": "randomWalk", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "TTL Processed Rows Per Second", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:1185", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:1186", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 44 + }, + "hiddenSeries": false, + "id": 296, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": false + }, + "lines": false, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(increase(tidb_server_ttl_insert_rows{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1h]))", + "interval": "1h", + "legendFormat": "insert rows per hour", + "queryType": "randomWalk", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "TTL Insert Rows Per Hour", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:394", + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:395", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The rows deleted per hour by TTL jobs", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 44 + }, + "hiddenSeries": false, + "id": 303, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": false + }, + "lines": false, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(increase(tidb_server_ttl_processed_expired_rows{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", sql_type=\"delete\", result=\"ok\"}[1h])) by (sql_type, result)", + "interval": "1h", + "legendFormat": "delete rows per hour", + "queryType": "randomWalk", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "TTL Delete Rows Per Hour", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:1185", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:1186", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The duration of the TTL scan queries", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 52 + }, + "hiddenSeries": false, + "id": 284, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "histogram_quantile(0.50, sum(rate(tidb_server_ttl_query_duration_bucket{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", sql_type=\"select\", result=\"ok\"}[1m])) by (le))", + "interval": "", + "legendFormat": "50", + "queryType": "randomWalk", + "refId": "A" + }, + { + "exemplar": true, + "expr": "histogram_quantile(0.80, sum(rate(tidb_server_ttl_query_duration_bucket{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", sql_type=\"select\", result=\"ok\"}[1m])) by (le))", + "hide": false, + "interval": "", + "legendFormat": "80", + "refId": "B" + }, + { + "exemplar": true, + "expr": "histogram_quantile(0.90, sum(rate(tidb_server_ttl_query_duration_bucket{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", sql_type=\"select\", result=\"ok\"}[1m])) by (le))\n", + "hide": false, + "interval": "", + "legendFormat": "90", + "refId": "C" + }, + { + "exemplar": true, + "expr": "histogram_quantile(0.99, sum(rate(tidb_server_ttl_query_duration_bucket{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", sql_type=\"select\", result=\"ok\"}[1m])) by (le))", + "hide": false, + "interval": "", + "legendFormat": "99", + "refId": "D" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "TTL Scan Query Duration", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The duration of the TTL delete queries", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 52 + }, + "hiddenSeries": false, + "id": 285, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "histogram_quantile(0.50, sum(rate(tidb_server_ttl_query_duration_bucket{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", sql_type=\"delete\", result=\"ok\"}[1m])) by (le))", + "interval": "", + "legendFormat": "50", + "queryType": "randomWalk", + "refId": "A" + }, + { + "exemplar": true, + "expr": "histogram_quantile(0.80, sum(rate(tidb_server_ttl_query_duration_bucket{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", sql_type=\"delete\", result=\"ok\"}[1m])) by (le))", + "hide": false, + "interval": "", + "legendFormat": "80", + "refId": "B" + }, + { + "exemplar": true, + "expr": "histogram_quantile(0.90, sum(rate(tidb_server_ttl_query_duration_bucket{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", sql_type=\"delete\", result=\"ok\"}[1m])) by (le))", + "hide": false, + "interval": "", + "legendFormat": "90", + "refId": "C" + }, + { + "exemplar": true, + "expr": "histogram_quantile(0.99, sum(rate(tidb_server_ttl_query_duration_bucket{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", sql_type=\"delete\", result=\"ok\"}[1m])) by (le))", + "hide": false, + "interval": "", + "legendFormat": "99", + "refId": "D" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "TTL Delete Query Duration", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The time spent on each phase for scan workers", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 60 + }, + "hiddenSeries": false, + "id": 276, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": false + }, + "lines": false, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "idle", + "color": "#73BF69" + }, + { + "alias": "query", + "color": "#FADE2A" + }, + { + "alias": "begin_txn", + "color": "#FFA6B0" + }, + { + "alias": "commit_txn", + "color": "#FF7383" + }, + { + "alias": "wait_retry", + "color": "#FF9830" + }, + { + "alias": "check_ttl", + "color": "#C4162A" + }, + { + "alias": "dispatch", + "color": "#8F3BB8" + }, + { + "alias": "wait_token", + "color": "#8AB8FF" + } + ], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(tidb_server_ttl_phase_time{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", type=\"scan_worker\"}[1m])) by (phase)", + "interval": "", + "legendFormat": "{{phase}}", + "queryType": "randomWalk", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Scan Worker Time By Phase", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The time spent on each phase for delete workers", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 60 + }, + "hiddenSeries": false, + "id": 282, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": false + }, + "lines": false, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "idle", + "color": "#73BF69" + }, + { + "alias": "query", + "color": "#FADE2A" + }, + { + "alias": "begin_txn", + "color": "#FFA6B0" + }, + { + "alias": "commit_txn", + "color": "#FF7383" + }, + { + "alias": "wait_retry", + "color": "#FF9830" + }, + { + "alias": "check_ttl", + "color": "#C4162A" + }, + { + "alias": "dispatch", + "color": "#8F3BB8" + }, + { + "alias": "wait_token", + "color": "#8AB8FF" + } + ], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(tidb_server_ttl_phase_time{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", type=\"delete_worker\"}[1m])) by (phase)\n", + "interval": "", + "legendFormat": "{{phase}}", + "queryType": "randomWalk", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Delete Worker Time By Phase", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The TTL job statuses in each worker", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 68 + }, + "hiddenSeries": false, + "id": 281, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "running", + "color": "#5794F2" + }, + { + "alias": "cancelling", + "color": "#F2495C" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(tidb_server_ttl_job_status{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}) by (type, instance)", + "interval": "", + "legendFormat": "{{ instance }} {{ type }}", + "queryType": "randomWalk", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "TTL Job Count By Status", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The TTL task statuses in each worker", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 68 + }, + "hiddenSeries": false, + "id": 294, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "running", + "color": "#5794F2" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(tidb_server_ttl_task_status{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}) by (type, instance)", + "interval": "", + "legendFormat": "{{ instance }} {{ type }}", + "queryType": "randomWalk", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "TTL Task Count By Status", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "title": "TTL", + "type": "row" + }, + { + "collapsed": true, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 19 + }, + "id": 291, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 20 + }, + "hiddenSeries": false, + "id": 289, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "tidb_server_gogc{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}", + "interval": "", + "legendFormat": "{{instance}}", + "queryType": "randomWalk", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "GOGC", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "exponential moving average of CPU Usage", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 20 + }, + "hiddenSeries": false, + "id": 293, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "tidb_rm_ema_cpu_usage{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}", + "interval": "", + "legendFormat": "{{instance}}", + "queryType": "randomWalk", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "EMA CPU Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { "format": "short", "label": null, "logBase": 1, @@ -16983,7 +18937,7 @@ } } ], - "title": "SourceSQL", + "title": "Resource Manager", "type": "row" } ], diff --git a/metrics/grafana/tidb_resource_control.json b/metrics/grafana/tidb_resource_control.json new file mode 100644 index 0000000000000..a34e2c92e95ab --- /dev/null +++ b/metrics/grafana/tidb_resource_control.json @@ -0,0 +1,2072 @@ +{ + "__inputs": [ + { + "name": "DS_TEST-CLUSTER", + "label": "test-cluster", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "7.5.11" + }, + { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "${DS_TEST-CLUSTER}", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 1, + "id": null, + "links": [], + "panels": [ + { + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 11, + "panels": [], + "title": "Resource Unit", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The total request unit cost for all resource groups.", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 12, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_unit_read_request_unit_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name) + sum(rate(resource_manager_resource_unit_write_request_unit_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{name}}", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_unit_read_request_unit_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) + sum(rate(resource_manager_resource_unit_write_request_unit_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s]))", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "total", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "RU", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:869", + "format": "short", + "label": null, + "logBase": 10, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:870", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 1 + }, + "hiddenSeries": false, + "id": 13, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "(sum(rate(resource_manager_resource_unit_read_request_unit_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name) + sum(rate(resource_manager_resource_unit_write_request_unit_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name)) / sum(rate(tidb_session_resource_group_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{name}}", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "(sum(rate(resource_manager_resource_unit_read_request_unit_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) + sum(rate(resource_manager_resource_unit_write_request_unit_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s]))) / sum(rate(tidb_session_resource_group_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s]))", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "total", + "refId": "B", + "step": 40 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "RU Per Query", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:869", + "format": "short", + "label": null, + "logBase": 10, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:870", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The read request unit cost for all resource groups.", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 8 + }, + "hiddenSeries": false, + "id": 14, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_unit_read_request_unit_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{name}}", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_unit_read_request_unit_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s]))", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "total", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "RRU", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:869", + "format": "short", + "label": null, + "logBase": 10, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:870", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 8 + }, + "hiddenSeries": false, + "id": 15, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_unit_read_request_unit_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name) / sum(rate(tidb_session_resource_group_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{name}}", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_unit_read_request_unit_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) / sum(rate(tidb_session_resource_group_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s]))", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "total", + "refId": "B", + "step": 40 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "RRU Per Query", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:869", + "format": "short", + "label": null, + "logBase": 10, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:870", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The write request unit cost for all resource groups.", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 15 + }, + "hiddenSeries": false, + "id": 16, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_unit_write_request_unit_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{name}}", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_unit_write_request_unit_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s]))", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "total", + "refId": "B", + "step": 40 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "WRU", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:869", + "format": "short", + "label": null, + "logBase": 10, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:870", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 15 + }, + "hiddenSeries": false, + "id": 17, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_unit_write_request_unit_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name) / sum(rate(tidb_session_resource_group_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{name}}", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_unit_write_request_unit_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) / sum(rate(tidb_session_resource_group_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s]))", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "total", + "refId": "B", + "step": 40 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "WRU Per Query", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:869", + "format": "short", + "label": null, + "logBase": 10, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:870", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": true, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 18, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 24 + }, + "hiddenSeries": false, + "id": 19, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_request_count{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name, type)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{name}}-{{type}}", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_request_count{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name)", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{name}}-total", + "refId": "B", + "step": 40 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "KV Request Count", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:869", + "format": "short", + "label": null, + "logBase": 2, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:870", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 24 + }, + "hiddenSeries": false, + "id": 20, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_request_count{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", type=\"read\"}[30s])) by (name) / sum(rate(tidb_session_resource_group_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{name}}-read", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_request_count{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", type=\"write\"}[30s])) by (name) / sum(rate(tidb_session_resource_group_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name)", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{name}}-write", + "refId": "B", + "step": 40 + }, + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_request_count{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", type=\"read\"}[30s])) / sum(rate(tidb_session_resource_group_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "total-read", + "refId": "C", + "step": 40 + }, + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_request_count{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", type=\"write\"}[30s])) / sum(rate(tidb_session_resource_group_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s]))", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "total-write", + "refId": "D", + "step": 40 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "KV Request Count Per Query", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:869", + "format": "short", + "label": null, + "logBase": 2, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:870", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 31 + }, + "hiddenSeries": false, + "id": 21, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_read_byte_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{name}}", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_read_byte_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s]))", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "total", + "refId": "B", + "step": 40 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Bytes Read", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:869", + "decimals": null, + "format": "bits", + "label": null, + "logBase": 2, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:870", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 31 + }, + "hiddenSeries": false, + "id": 22, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_read_byte_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name) / sum(rate(tidb_session_resource_group_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{name}}", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_read_byte_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) / sum(rate(tidb_session_resource_group_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s]))", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "total", + "refId": "B", + "step": 40 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Bytes Read Per Query", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:869", + "decimals": null, + "format": "bits", + "label": null, + "logBase": 2, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:870", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 39 + }, + "hiddenSeries": false, + "id": 23, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_write_byte_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{name}}", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_write_byte_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s]))", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "total", + "refId": "B", + "step": 40 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Bytes Written", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:869", + "format": "bits", + "label": null, + "logBase": 2, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:870", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 39 + }, + "hiddenSeries": false, + "id": 24, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_write_byte_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name) / sum(rate(tidb_session_resource_group_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{name}}", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_write_byte_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) / sum(rate(tidb_session_resource_group_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s]))", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "total", + "refId": "B", + "step": 40 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Bytes Written Per Query", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:869", + "format": "bits", + "label": null, + "logBase": 2, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:870", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 47 + }, + "hiddenSeries": false, + "id": 25, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_kv_cpu_time_ms_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{name}}", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_kv_cpu_time_ms_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s]))", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "total", + "refId": "B", + "step": 40 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "KV CPU Time", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:869", + "decimals": null, + "format": "ms", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:870", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 47 + }, + "hiddenSeries": false, + "id": 26, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_kv_cpu_time_ms_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name) / sum(rate(tidb_session_resource_group_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{name}}", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_kv_cpu_time_ms_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) / sum(rate(tidb_session_resource_group_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s]))", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "total", + "refId": "B", + "step": 40 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "KV CPU Time Per Query", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:869", + "decimals": null, + "format": "ms", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:870", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 55 + }, + "hiddenSeries": false, + "id": 27, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_sql_cpu_time_ms_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{name}}", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_sql_cpu_time_ms_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s]))", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "total", + "refId": "B", + "step": 40 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "SQL CPU Time", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:869", + "format": "bits", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:870", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 55 + }, + "hiddenSeries": false, + "id": 28, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_sql_cpu_time_ms_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name) / sum(rate(tidb_session_resource_group_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) by (name)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{name}}", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "sum(rate(resource_manager_resource_sql_cpu_time_ms_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s])) / sum(rate(tidb_session_resource_group_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}[30s]))", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "total", + "refId": "B", + "step": 40 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "SQL CPU Time Per Query", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:869", + "format": "bits", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:870", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "title": "Resource", + "type": "row" + } + ], + "refresh": "30s", + "schemaVersion": 18, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "allValue": null, + "current": {}, + "datasource": "${DS_TEST-CLUSTER}", + "hide": 2, + "includeAll": false, + "label": "K8s-cluster", + "multi": false, + "name": "k8s_cluster", + "options": [], + "query": "label_values(pd_cluster_status, k8s_cluster)", + "refresh": 2, + "regex": "", + "sort": 1, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": {}, + "datasource": "${DS_TEST-CLUSTER}", + "hide": 2, + "includeAll": false, + "label": "tidb_cluster", + "multi": false, + "name": "tidb_cluster", + "options": [], + "query": "label_values(pd_cluster_status{k8s_cluster=\"$k8s_cluster\"}, tidb_cluster)", + "refresh": 2, + "regex": "", + "sort": 1, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "browser", + "title": "Test-Cluster-TiDB-Resource-Control", + "uid": "000000201", + "version": 1 +} diff --git a/metrics/grafana/tidb_runtime.json b/metrics/grafana/tidb_runtime.json index 0324f6851de98..d17b1d90a104e 100644 --- a/metrics/grafana/tidb_runtime.json +++ b/metrics/grafana/tidb_runtime.json @@ -1384,6 +1384,131 @@ "align": false, "alignLevel": null } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "the time goroutines have spent in the scheduler", + "editable": true, + "error": false, + "fill": 1, + "grid": {}, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 57 + }, + "id": 30, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "histogram_quantile(0.999, sum(rate(go_sched_latencies_seconds_bucket{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[30s])) by (le, instance))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "999", + "refId": "A", + "step": 10 + }, + { + "expr": "histogram_quantile(0.9999, sum(rate(go_sched_latencies_seconds_bucket{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[30s])) by (le, instance))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "9999", + "refId": "B", + "step": 10 + }, + { + "expr": "histogram_quantile(0.99999, sum(rate(go_sched_latencies_seconds_bucket{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[30s])) by (le, instance))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "99999", + "refId": "C", + "step": 10 + }, + { + "expr": "histogram_quantile(0.999999, sum(rate(go_sched_latencies_seconds_bucket{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[30s])) by (le, instance))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "999999", + "refId": "D", + "step": 10 + }, + { + "expr": "histogram_quantile(1, sum(rate(go_sched_latencies_seconds_bucket{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[30s])) by (le, instance))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "max", + "refId": "E", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "goroutine scheduler lattency", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } } ], "repeat": "instance", diff --git a/metrics/log_backup.go b/metrics/log_backup.go index 6c706b8027a79..767fe2e251d8a 100644 --- a/metrics/log_backup.go +++ b/metrics/log_backup.go @@ -60,4 +60,10 @@ var ( Name: "region_request_failure", Help: "The failure reasons of requesting region checkpoints.", }, []string{"reason"}) + RegionCheckpointSubscriptionEvent = prometheus.NewCounterVec(prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "log_backup", + Name: "region_checkpoint_event", + Help: "The region flush event count.", + }, []string{"store"}) ) diff --git a/metrics/meta.go b/metrics/meta.go index 519ba6a0924a1..af967fe48a3bb 100644 --- a/metrics/meta.go +++ b/metrics/meta.go @@ -34,8 +34,6 @@ var ( GetSchemaDiff = "get_schema_diff" SetSchemaDiff = "set_schema_diff" - GetDDLJobByIdx = "get_ddl_job" - UpdateDDLJob = "update_ddl_job" GetHistoryDDLJob = "get_history_ddl_job" MetaHistogram = prometheus.NewHistogramVec( diff --git a/metrics/metrics.go b/metrics/metrics.go index a843e794cff1b..f63af624a3a0c 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -51,6 +51,7 @@ const ( LabelDDLOwner = "ddl-owner" LabelDDL = "ddl" LabelDDLWorker = "ddl-worker" + LabelDistReorg = "dist-reorg" LabelDDLSyncer = "ddl-syncer" LabelGCWorker = "gcworker" LabelAnalyze = "analyze" @@ -124,7 +125,6 @@ func RegisterMetrics() { prometheus.MustRegister(SyncLoadHistogram) prometheus.MustRegister(ReadStatsHistogram) prometheus.MustRegister(JobsGauge) - prometheus.MustRegister(KeepAliveCounter) prometheus.MustRegister(LoadPrivilegeCounter) prometheus.MustRegister(InfoCacheCounters) prometheus.MustRegister(LoadSchemaCounter) @@ -182,6 +182,7 @@ func RegisterMetrics() { prometheus.MustRegister(TokenGauge) prometheus.MustRegister(ConfigStatus) prometheus.MustRegister(TiFlashQueryTotalCounter) + prometheus.MustRegister(TiFlashFailedMPPStoreState) prometheus.MustRegister(SmallTxnWriteDuration) prometheus.MustRegister(TxnWriteThroughput) prometheus.MustRegister(LoadSysVarCacheCounter) @@ -194,6 +195,8 @@ func RegisterMetrics() { prometheus.MustRegister(ReadFromTableCacheCounter) prometheus.MustRegister(LoadTableCacheDurationHistogram) prometheus.MustRegister(NonTransactionalDMLCount) + prometheus.MustRegister(PessimisticDMLDurationByAttempt) + prometheus.MustRegister(ResourceGroupQueryTotalCounter) prometheus.MustRegister(MemoryUsage) prometheus.MustRegister(StatsCacheLRUCounter) prometheus.MustRegister(StatsCacheLRUGauge) @@ -207,7 +210,23 @@ func RegisterMetrics() { prometheus.MustRegister(RegionCheckpointRequest) prometheus.MustRegister(RegionCheckpointFailure) prometheus.MustRegister(AutoIDReqDuration) + prometheus.MustRegister(RegionCheckpointSubscriptionEvent) prometheus.MustRegister(RCCheckTSWriteConfilictCounter) + prometheus.MustRegister(AggressiveLockingUsageCount) + + prometheus.MustRegister(TTLQueryDuration) + prometheus.MustRegister(TTLProcessedExpiredRowsCounter) + prometheus.MustRegister(TTLJobStatus) + prometheus.MustRegister(TTLTaskStatus) + prometheus.MustRegister(TTLPhaseTime) + prometheus.MustRegister(TTLInsertRowsCount) + + prometheus.MustRegister(EMACPUUsageGauge) + prometheus.MustRegister(PoolConcurrencyCounter) + + prometheus.MustRegister(HistoricalStatsCounter) + prometheus.MustRegister(PlanReplayerTaskCounter) + prometheus.MustRegister(PlanReplayerRegisterTaskGauge) tikvmetrics.InitMetrics(TiDB, TiKVClient) tikvmetrics.RegisterMetrics() @@ -230,6 +249,7 @@ func ToggleSimplifiedMode(simplified bool) { InfoCacheCounters, ReadFromTableCacheCounter, TiFlashQueryTotalCounter, + TiFlashFailedMPPStoreState, CampaignOwnerCounter, NonTransactionalDMLCount, MemoryUsage, diff --git a/metrics/resourcemanager.go b/metrics/resourcemanager.go new file mode 100644 index 0000000000000..c6715512500d4 --- /dev/null +++ b/metrics/resourcemanager.go @@ -0,0 +1,35 @@ +// 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, +// 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 metrics + +import "github.com/prometheus/client_golang/prometheus" + +var ( + // EMACPUUsageGauge means exponential moving average of CPU usage + EMACPUUsageGauge = prometheus.NewGauge(prometheus.GaugeOpts{ + Namespace: "tidb", + Subsystem: "rm", + Name: "ema_cpu_usage", + Help: "exponential moving average of CPU usage", + }) + // PoolConcurrencyCounter means how much concurrency in the pool + PoolConcurrencyCounter = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "tidb", + Subsystem: "rm", + Name: "pool_concurrency", + Help: "How many concurrency in the pool", + }, []string{LblType}) +) diff --git a/metrics/server.go b/metrics/server.go index 116b02eb122b6..830e03b28e986 100644 --- a/metrics/server.go +++ b/metrics/server.go @@ -120,14 +120,6 @@ var ( Help: "Counter of system time jumps backward.", }) - KeepAliveCounter = prometheus.NewCounter( - prometheus.CounterOpts{ - Namespace: "tidb", - Subsystem: "monitor", - Name: "keep_alive_total", - Help: "Counter of TiDB keep alive.", - }) - PlanCacheCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: "tidb", @@ -279,6 +271,14 @@ var ( Help: "Counter of TiFlash queries.", }, []string{LblType, LblResult}) + TiFlashFailedMPPStoreState = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "tidb", + Subsystem: "server", + Name: "tiflash_failed_store", + Help: "Statues of failed tiflash mpp store,-1 means detector heartbeat,0 means reachable,1 means abnormal.", + }, []string{LblAddress}) + PDAPIExecutionHistogram = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Namespace: "tidb", diff --git a/metrics/session.go b/metrics/session.go index 11c3bf7a143b8..208092c11b087 100644 --- a/metrics/session.go +++ b/metrics/session.go @@ -59,14 +59,14 @@ var ( Name: "schema_lease_error_total", Help: "Counter of schema lease error", }, []string{LblType}) - SessionRetry = prometheus.NewHistogram( + SessionRetry = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Namespace: "tidb", Subsystem: "session", Name: "retry_num", Help: "Bucketed histogram of session retry count.", Buckets: prometheus.LinearBuckets(0, 1, 21), // 0 ~ 20 - }) + }, []string{LblScope}) SessionRetryErrorCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: "tidb", @@ -90,7 +90,7 @@ var ( Name: "transaction_statement_num", Help: "Bucketed histogram of statements count in each transaction.", Buckets: prometheus.ExponentialBuckets(1, 2, 16), // 1 ~ 32768 - }, []string{LblTxnMode, LblType}) + }, []string{LblTxnMode, LblType, LblScope}) TransactionDuration = prometheus.NewHistogramVec( prometheus.HistogramOpts{ @@ -99,7 +99,7 @@ var ( Name: "transaction_duration_seconds", Help: "Bucketed histogram of a transaction execution duration, including retry.", Buckets: prometheus.ExponentialBuckets(0.001, 2, 28), // 1ms ~ 1.5days - }, []string{LblTxnMode, LblType}) + }, []string{LblTxnMode, LblType, LblScope}) StatementDeadlockDetectDuration = prometheus.NewHistogram( prometheus.HistogramOpts{ @@ -169,6 +169,31 @@ var ( Help: "Counter of setting tidb_constraint_check_in_place to false, note that it doesn't count the default value set by tidb config", }, ) + + PessimisticDMLDurationByAttempt = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: "tidb", + Subsystem: "session", + Name: "transaction_pessimistic_dml_duration_by_attempt", + Help: "Bucketed histogram of duration of pessimistic DMLs, distinguished by first attempt and retries", + Buckets: prometheus.ExponentialBuckets(0.001, 2, 28), // 1ms ~ 1.5days + }, []string{LblType, LblPhase}) + + ResourceGroupQueryTotalCounter = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "session", + Name: "resource_group_query_total", + Help: "Counter of the total number of queries for the resource group", + }, []string{LblName}) + + AggressiveLockingUsageCount = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "server", + Name: "transaction_aggressive_locking_usage", + Help: "The counter of statements and transactions in which aggressive locking is used or takes effect", + }, []string{LblType}) ) // Label constants. @@ -210,4 +235,12 @@ const ( LblModule = "module" LblRCReadCheckTS = "read_check" LblRCWriteCheckTS = "write_check" + + LblName = "name" + + LblAggressiveLockingTxnUsed = "txn-used" + LblAggressiveLockingTxnEffective = "txn-effective" + LblAggressiveLockingStmtUsed = "stmt-used" + LblAggressiveLockingStmtEffective = "stmt-effective" + LblScope = "scope" ) diff --git a/metrics/stats.go b/metrics/stats.go index 76bd1ec7a936b..5d73753f5669c 100644 --- a/metrics/stats.go +++ b/metrics/stats.go @@ -150,4 +150,25 @@ var ( Name: "stats_healthy", Help: "Gauge of stats healthy", }, []string{LblType}) + + HistoricalStatsCounter = prometheus.NewCounterVec(prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "statistics", + Name: "historical_stats", + Help: "counter of the historical stats operation", + }, []string{LblType, LblResult}) + + PlanReplayerTaskCounter = prometheus.NewCounterVec(prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "plan_replayer", + Name: "task", + Help: "counter of plan replayer captured task", + }, []string{LblType, LblResult}) + + PlanReplayerRegisterTaskGauge = prometheus.NewGauge(prometheus.GaugeOpts{ + Namespace: "tidb", + Subsystem: "plan_replayer", + Name: "register_task", + Help: "gauge of plan replayer registered task", + }) ) diff --git a/metrics/telemetry.go b/metrics/telemetry.go index e7629bcd76f6a..39838853e123d 100644 --- a/metrics/telemetry.go +++ b/metrics/telemetry.go @@ -155,6 +155,62 @@ var ( Name: "flashback_cluster_usage", Help: "Counter of usage of flashback cluster", }) + TelemetryIndexMergeUsage = prometheus.NewCounter( + prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "telemetry", + Name: "index_merge_usage", + Help: "Counter of usage of index merge", + }) + TelemetryCompactPartitionCnt = prometheus.NewCounter( + prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "telemetry", + Name: "compact_partition_usage", + Help: "Counter of compact table partition", + }) + TelemetryReorganizePartitionCnt = prometheus.NewCounter( + prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "telemetry", + Name: "reorganize_partition_usage", + Help: "Counter of alter table reorganize partition", + }) + TelemetryDistReorgCnt = prometheus.NewCounter( + prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "telemetry", + Name: "distributed_reorg_count", + Help: "Counter of usage of distributed reorg DDL tasks count", + }) + TelemetryStoreBatchedQueryCnt = prometheus.NewCounter( + prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "telemetry", + Name: "store_batched_query", + Help: "Counter of queries which use store batched coprocessor tasks", + }) + TelemetryBatchedQueryTaskCnt = prometheus.NewCounter( + prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "telemetry", + Name: "batched_query_task", + Help: "Counter of coprocessor tasks in batched queries", + }) + TelemetryStoreBatchedCnt = prometheus.NewCounter( + prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "telemetry", + Name: "store_batched", + Help: "Counter of store batched coprocessor tasks", + }) + TelemetryStoreBatchedFallbackCnt = prometheus.NewCounter( + prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "telemetry", + Name: "store_batched_fallback", + Help: "Counter of store batched fallback coprocessor tasks", + }) ) // readCounter reads the value of a prometheus.Counter. @@ -254,6 +310,8 @@ type TablePartitionUsageCounter struct { TablePartitionCreateIntervalPartitionsCnt int64 `json:"table_partition_create_interval_partitions_cnt"` TablePartitionAddIntervalPartitionsCnt int64 `json:"table_partition_add_interval_partitions_cnt"` TablePartitionDropIntervalPartitionsCnt int64 `json:"table_partition_drop_interval_partitions_cnt"` + TablePartitionComactCnt int64 `json:"table_TablePartitionComactCnt"` + TablePartitionReorganizePartitionCnt int64 `json:"table_reorganize_partition_cnt"` } // ExchangePartitionUsageCounter records the usages of exchange partition. @@ -291,22 +349,25 @@ func (c TablePartitionUsageCounter) Cal(rhs TablePartitionUsageCounter) TablePar TablePartitionCreateIntervalPartitionsCnt: c.TablePartitionCreateIntervalPartitionsCnt - rhs.TablePartitionCreateIntervalPartitionsCnt, TablePartitionAddIntervalPartitionsCnt: c.TablePartitionAddIntervalPartitionsCnt - rhs.TablePartitionAddIntervalPartitionsCnt, TablePartitionDropIntervalPartitionsCnt: c.TablePartitionDropIntervalPartitionsCnt - rhs.TablePartitionDropIntervalPartitionsCnt, + TablePartitionComactCnt: c.TablePartitionComactCnt - rhs.TablePartitionComactCnt, + TablePartitionReorganizePartitionCnt: c.TablePartitionReorganizePartitionCnt - rhs.TablePartitionReorganizePartitionCnt, } } // ResetTablePartitionCounter gets the TxnCommitCounter. func ResetTablePartitionCounter(pre TablePartitionUsageCounter) TablePartitionUsageCounter { return TablePartitionUsageCounter{ - TablePartitionCnt: readCounter(TelemetryTablePartitionCnt), - TablePartitionListCnt: readCounter(TelemetryTablePartitionListCnt), - TablePartitionRangeCnt: readCounter(TelemetryTablePartitionRangeCnt), - TablePartitionHashCnt: readCounter(TelemetryTablePartitionHashCnt), - TablePartitionRangeColumnsCnt: readCounter(TelemetryTablePartitionRangeColumnsCnt), - TablePartitionRangeColumnsGt1Cnt: readCounter(TelemetryTablePartitionRangeColumnsGt1Cnt), - TablePartitionRangeColumnsGt2Cnt: readCounter(TelemetryTablePartitionRangeColumnsGt2Cnt), - TablePartitionRangeColumnsGt3Cnt: readCounter(TelemetryTablePartitionRangeColumnsGt3Cnt), - TablePartitionListColumnsCnt: readCounter(TelemetryTablePartitionListColumnsCnt), - TablePartitionMaxPartitionsCnt: mathutil.Max(readCounter(TelemetryTablePartitionMaxPartitionsCnt)-pre.TablePartitionMaxPartitionsCnt, pre.TablePartitionMaxPartitionsCnt), + TablePartitionCnt: readCounter(TelemetryTablePartitionCnt), + TablePartitionListCnt: readCounter(TelemetryTablePartitionListCnt), + TablePartitionRangeCnt: readCounter(TelemetryTablePartitionRangeCnt), + TablePartitionHashCnt: readCounter(TelemetryTablePartitionHashCnt), + TablePartitionRangeColumnsCnt: readCounter(TelemetryTablePartitionRangeColumnsCnt), + TablePartitionRangeColumnsGt1Cnt: readCounter(TelemetryTablePartitionRangeColumnsGt1Cnt), + TablePartitionRangeColumnsGt2Cnt: readCounter(TelemetryTablePartitionRangeColumnsGt2Cnt), + TablePartitionRangeColumnsGt3Cnt: readCounter(TelemetryTablePartitionRangeColumnsGt3Cnt), + TablePartitionListColumnsCnt: readCounter(TelemetryTablePartitionListColumnsCnt), + TablePartitionMaxPartitionsCnt: mathutil.Max(readCounter(TelemetryTablePartitionMaxPartitionsCnt)-pre.TablePartitionMaxPartitionsCnt, pre.TablePartitionMaxPartitionsCnt), + TablePartitionReorganizePartitionCnt: readCounter(TelemetryReorganizePartitionCnt), } } @@ -326,12 +387,15 @@ func GetTablePartitionCounter() TablePartitionUsageCounter { TablePartitionCreateIntervalPartitionsCnt: readCounter(TelemetryTablePartitionCreateIntervalPartitionsCnt), TablePartitionAddIntervalPartitionsCnt: readCounter(TelemetryTablePartitionAddIntervalPartitionsCnt), TablePartitionDropIntervalPartitionsCnt: readCounter(TelemetryTablePartitionDropIntervalPartitionsCnt), + TablePartitionComactCnt: readCounter(TelemetryCompactPartitionCnt), + TablePartitionReorganizePartitionCnt: readCounter(TelemetryReorganizePartitionCnt), } } // NonTransactionalStmtCounter records the usages of non-transactional statements. type NonTransactionalStmtCounter struct { DeleteCount int64 `json:"delete"` + UpdateCount int64 `json:"update"` InsertCount int64 `json:"insert"` } @@ -339,6 +403,7 @@ type NonTransactionalStmtCounter struct { func (n NonTransactionalStmtCounter) Sub(rhs NonTransactionalStmtCounter) NonTransactionalStmtCounter { return NonTransactionalStmtCounter{ DeleteCount: n.DeleteCount - rhs.DeleteCount, + UpdateCount: n.UpdateCount - rhs.UpdateCount, InsertCount: n.InsertCount - rhs.InsertCount, } } @@ -347,6 +412,7 @@ func (n NonTransactionalStmtCounter) Sub(rhs NonTransactionalStmtCounter) NonTra func GetNonTransactionalStmtCounter() NonTransactionalStmtCounter { return NonTransactionalStmtCounter{ DeleteCount: readCounter(NonTransactionalDMLCount.With(prometheus.Labels{LblType: "delete"})), + UpdateCount: readCounter(NonTransactionalDMLCount.With(prometheus.Labels{LblType: "update"})), InsertCount: readCounter(NonTransactionalDMLCount.With(prometheus.Labels{LblType: "insert"})), } } @@ -366,6 +432,7 @@ type DDLUsageCounter struct { AddIndexIngestUsed int64 `json:"add_index_ingest_used"` MetadataLockUsed bool `json:"metadata_lock_used"` FlashbackClusterUsed int64 `json:"flashback_cluster_used"` + DistReorgUsed int64 `json:"dist_reorg_used"` } // Sub returns the difference of two counters. @@ -373,6 +440,7 @@ func (a DDLUsageCounter) Sub(rhs DDLUsageCounter) DDLUsageCounter { return DDLUsageCounter{ AddIndexIngestUsed: a.AddIndexIngestUsed - rhs.AddIndexIngestUsed, FlashbackClusterUsed: a.FlashbackClusterUsed - rhs.FlashbackClusterUsed, + DistReorgUsed: a.DistReorgUsed - rhs.DistReorgUsed, } } @@ -381,5 +449,81 @@ func GetDDLUsageCounter() DDLUsageCounter { return DDLUsageCounter{ AddIndexIngestUsed: readCounter(TelemetryAddIndexIngestCnt), FlashbackClusterUsed: readCounter(TelemetryFlashbackClusterCnt), + DistReorgUsed: readCounter(TelemetryDistReorgCnt), + } +} + +// IndexMergeUsageCounter records the usages of IndexMerge feature. +type IndexMergeUsageCounter struct { + IndexMergeUsed int64 `json:"index_merge_used"` +} + +// Sub returns the difference of two counters. +func (i IndexMergeUsageCounter) Sub(rhs IndexMergeUsageCounter) IndexMergeUsageCounter { + return IndexMergeUsageCounter{ + IndexMergeUsed: i.IndexMergeUsed - rhs.IndexMergeUsed, + } +} + +// GetIndexMergeCounter gets the IndexMerge usage counter. +func GetIndexMergeCounter() IndexMergeUsageCounter { + return IndexMergeUsageCounter{ + IndexMergeUsed: readCounter(TelemetryIndexMergeUsage), + } +} + +// StoreBatchCoprCounter records the usages of batch copr statements. +type StoreBatchCoprCounter struct { + // BatchSize is the global value of `tidb_store_batch_size` + BatchSize int `json:"batch_size"` + // BatchedQuery is the counter of queries that use this feature. + BatchedQuery int64 `json:"query"` + // BatchedQueryTask is the counter of total tasks in queries above. + BatchedQueryTask int64 `json:"tasks"` + // BatchedCount is the counter of successfully batched tasks. + BatchedCount int64 `json:"batched"` + // BatchedFallbackCount is the counter of fallback batched tasks by region miss. + BatchedFallbackCount int64 `json:"batched_fallback"` +} + +// Sub returns the difference of two counters. +func (n StoreBatchCoprCounter) Sub(rhs StoreBatchCoprCounter) StoreBatchCoprCounter { + return StoreBatchCoprCounter{ + BatchedQuery: n.BatchedQuery - rhs.BatchedQuery, + BatchedQueryTask: n.BatchedQueryTask - rhs.BatchedQueryTask, + BatchedCount: n.BatchedCount - rhs.BatchedCount, + BatchedFallbackCount: n.BatchedFallbackCount - rhs.BatchedFallbackCount, + } +} + +// GetStoreBatchCoprCounter gets the IndexMerge usage counter. +func GetStoreBatchCoprCounter() StoreBatchCoprCounter { + return StoreBatchCoprCounter{ + BatchedQuery: readCounter(TelemetryStoreBatchedQueryCnt), + BatchedQueryTask: readCounter(TelemetryBatchedQueryTaskCnt), + BatchedCount: readCounter(TelemetryStoreBatchedCnt), + BatchedFallbackCount: readCounter(TelemetryStoreBatchedFallbackCnt), + } +} + +// AggressiveLockingUsageCounter records the usage of Aggressive Locking feature of pessimistic transaction. +type AggressiveLockingUsageCounter struct { + TxnAggressiveLockingUsed int64 `json:"txn_aggressive_locking_used"` + TxnAggressiveLockingEffective int64 `json:"txn_aggressive_locking_effective"` +} + +// Sub returns the difference of two counters. +func (i AggressiveLockingUsageCounter) Sub(rhs AggressiveLockingUsageCounter) AggressiveLockingUsageCounter { + return AggressiveLockingUsageCounter{ + TxnAggressiveLockingUsed: i.TxnAggressiveLockingUsed - rhs.TxnAggressiveLockingUsed, + TxnAggressiveLockingEffective: i.TxnAggressiveLockingEffective - rhs.TxnAggressiveLockingEffective, + } +} + +// GetAggressiveLockingUsageCounter returns the Aggressive Locking usage counter. +func GetAggressiveLockingUsageCounter() AggressiveLockingUsageCounter { + return AggressiveLockingUsageCounter{ + TxnAggressiveLockingUsed: readCounter(AggressiveLockingUsageCount.WithLabelValues(LblAggressiveLockingTxnUsed)), + TxnAggressiveLockingEffective: readCounter(AggressiveLockingUsageCount.WithLabelValues(LblAggressiveLockingTxnEffective)), } } diff --git a/metrics/ttl.go b/metrics/ttl.go new file mode 100644 index 0000000000000..52782b08dba76 --- /dev/null +++ b/metrics/ttl.go @@ -0,0 +1,69 @@ +// 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, +// 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 metrics + +import "github.com/prometheus/client_golang/prometheus" + +// TTL metrics +var ( + TTLQueryDuration = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: "tidb", + Subsystem: "server", + Name: "ttl_query_duration", + Help: "Bucketed histogram of processing time (s) of handled TTL queries.", + Buckets: prometheus.ExponentialBuckets(0.01, 2, 20), // 10ms ~ 1.45hour + }, []string{LblSQLType, LblResult}) + + TTLProcessedExpiredRowsCounter = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "server", + Name: "ttl_processed_expired_rows", + Help: "The count of expired rows processed in TTL jobs", + }, []string{LblSQLType, LblResult}) + + TTLJobStatus = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "tidb", + Subsystem: "server", + Name: "ttl_job_status", + Help: "The jobs count in the specified status", + }, []string{LblType}) + + TTLTaskStatus = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "tidb", + Subsystem: "server", + Name: "ttl_task_status", + Help: "The tasks count in the specified status", + }, []string{LblType}) + + TTLPhaseTime = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "server", + Name: "ttl_phase_time", + Help: "The time spent in each phase", + }, []string{LblType, LblPhase}) + + TTLInsertRowsCount = prometheus.NewCounter( + prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "server", + Name: "ttl_insert_rows", + Help: "The count of TTL rows inserted", + }) +) diff --git a/parser/BUILD.bazel b/parser/BUILD.bazel index f52b1fc9ac4f3..ec67a5c141849 100644 --- a/parser/BUILD.bazel +++ b/parser/BUILD.bazel @@ -17,6 +17,7 @@ go_library( "//parser/ast", "//parser/auth", "//parser/charset", + "//parser/duration", "//parser/model", "//parser/mysql", "//parser/opcode", diff --git a/parser/ast/ddl.go b/parser/ast/ddl.go index 9b7042e573cc1..97af9a3b95c6a 100644 --- a/parser/ast/ddl.go +++ b/parser/ast/ddl.go @@ -28,18 +28,21 @@ var ( _ DDLNode = &AlterTableStmt{} _ DDLNode = &AlterSequenceStmt{} _ DDLNode = &AlterPlacementPolicyStmt{} + _ DDLNode = &AlterResourceGroupStmt{} _ DDLNode = &CreateDatabaseStmt{} _ DDLNode = &CreateIndexStmt{} _ DDLNode = &CreateTableStmt{} _ DDLNode = &CreateViewStmt{} _ DDLNode = &CreateSequenceStmt{} _ DDLNode = &CreatePlacementPolicyStmt{} + _ DDLNode = &CreateResourceGroupStmt{} _ DDLNode = &DropDatabaseStmt{} _ DDLNode = &FlashBackDatabaseStmt{} _ DDLNode = &DropIndexStmt{} _ DDLNode = &DropTableStmt{} _ DDLNode = &DropSequenceStmt{} _ DDLNode = &DropPlacementPolicyStmt{} + _ DDLNode = &DropResourceGroupStmt{} _ DDLNode = &RenameTableStmt{} _ DDLNode = &TruncateTableStmt{} _ DDLNode = &RepairTableStmt{} @@ -1093,7 +1096,8 @@ func (n *CreateTableStmt) Restore(ctx *format.RestoreCtx) error { ctx.WritePlain(")") } - for i, option := range n.Options { + options := tableOptionsWithRestoreTTLFlag(ctx.Flags, n.Options) + for i, option := range options { ctx.WritePlain(" ") if err := option.Restore(ctx); err != nil { return errors.Annotatef(err, "An error occurred while splicing CreateTableStmt TableOption: [%v]", i) @@ -1180,6 +1184,13 @@ func (n *CreateTableStmt) Accept(v Visitor) (Node, bool) { } 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) } @@ -1273,6 +1284,32 @@ func (n *DropPlacementPolicyStmt) Accept(v Visitor) (Node, bool) { return v.Leave(n) } +type DropResourceGroupStmt struct { + ddlNode + + IfExists bool + ResourceGroupName model.CIStr +} + +// Restore implements Restore interface. +func (n *DropResourceGroupStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("DROP RESOURCE GROUP ") + if n.IfExists { + ctx.WriteKeyWord("IF EXISTS ") + } + ctx.WriteName(n.ResourceGroupName.O) + return nil +} + +func (n *DropResourceGroupStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropResourceGroupStmt) + return v.Leave(n) +} + // DropSequenceStmt is a statement to drop a Sequence. type DropSequenceStmt struct { ddlNode @@ -1533,6 +1570,43 @@ func (n *CreatePlacementPolicyStmt) Accept(v Visitor) (Node, bool) { return v.Leave(n) } +// CreateResourceGroupStmt is a statement to create a policy. +type CreateResourceGroupStmt struct { + ddlNode + + IfNotExists bool + ResourceGroupName model.CIStr + ResourceGroupOptionList []*ResourceGroupOption +} + +// Restore implements Node interface. +func (n *CreateResourceGroupStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("CREATE ") + + ctx.WriteKeyWord("RESOURCE GROUP ") + if n.IfNotExists { + ctx.WriteKeyWord("IF NOT EXISTS ") + } + ctx.WriteName(n.ResourceGroupName.O) + for i, option := range n.ResourceGroupOptionList { + ctx.WritePlain(" ") + if err := option.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while splicing CreatePlacementPolicy TableOption: [%v]", i) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *CreateResourceGroupStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateResourceGroupStmt) + return v.Leave(n) +} + // CreateSequenceStmt is a statement to create a Sequence. type CreateSequenceStmt struct { ddlNode @@ -1951,6 +2025,7 @@ const ( PlacementOptionLearnerConstraints PlacementOptionFollowerConstraints PlacementOptionVoterConstraints + PlacementOptionSurvivalPreferences PlacementOptionPolicy ) @@ -2015,6 +2090,10 @@ func (n *PlacementOption) Restore(ctx *format.RestoreCtx) error { ctx.WriteKeyWord("PLACEMENT POLICY ") ctx.WritePlain("= ") ctx.WriteName(n.StrValue) + case PlacementOptionSurvivalPreferences: + ctx.WriteKeyWord("SURVIVAL_PREFERENCES ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) default: return errors.Errorf("invalid PlacementOption: %d", n.Tp) } @@ -2024,6 +2103,61 @@ func (n *PlacementOption) Restore(ctx *format.RestoreCtx) error { return ctx.WriteWithSpecialComments(tidb.FeatureIDPlacement, fn) } +// ResourceGroupOption is used for parsing resource group option. +type ResourceGroupOption struct { + Tp ResourceUnitType + StrValue string + UintValue uint64 + BoolValue bool +} + +type ResourceUnitType int + +const ( + // RU mode + ResourceRURate ResourceUnitType = iota + // Raw mode + ResourceUnitCPU + ResourceUnitIOReadBandwidth + ResourceUnitIOWriteBandwidth + + // Options + ResourceBurstableOpiton +) + +func (n *ResourceGroupOption) Restore(ctx *format.RestoreCtx) error { + if ctx.Flags.HasSkipPlacementRuleForRestoreFlag() { + return nil + } + fn := func() error { + switch n.Tp { + case ResourceRURate: + ctx.WriteKeyWord("RU_PER_SEC ") + ctx.WritePlain("= ") + ctx.WritePlainf("%d", n.UintValue) + case ResourceUnitCPU: + ctx.WriteKeyWord("CPU ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case ResourceUnitIOReadBandwidth: + ctx.WriteKeyWord("IO_READ_BANDWIDTH ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case ResourceUnitIOWriteBandwidth: + ctx.WriteKeyWord("IO_WRITE_BANDWIDTH ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case ResourceBurstableOpiton: + ctx.WriteKeyWord("BURSTABLE") + default: + return errors.Errorf("invalid PlacementOption: %d", n.Tp) + } + return nil + } + // WriteSpecialComment + return ctx.WriteWithSpecialComments(tidb.FeatureIDResourceGroup, fn) +} + type StatsOptionType int const ( @@ -2074,6 +2208,9 @@ const ( TableOptionTableCheckSum TableOptionUnion TableOptionEncryption + TableOptionTTL + TableOptionTTLEnable + TableOptionTTLJobInterval TableOptionPlacementPolicy = TableOptionType(PlacementOptionPolicy) TableOptionStatsBuckets = TableOptionType(StatsOptionBuckets) TableOptionStatsTopN = TableOptionType(StatsOptionTopN) @@ -2120,13 +2257,16 @@ const ( // TableOption is used for parsing table option from SQL. type TableOption struct { - Tp TableOptionType - Default bool - StrValue string - UintValue uint64 - BoolValue bool - Value ValueExpr - TableNames []*TableName + 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 { @@ -2405,12 +2545,67 @@ func (n *TableOption) Restore(ctx *format.RestoreCtx) error { } else { ctx.WriteString(n.StrValue) } + case TableOptionTTL: + _ = ctx.WriteWithSpecialComments(tidb.FeatureIDTTL, func() error { + ctx.WriteKeyWord("TTL ") + ctx.WritePlain("= ") + ctx.WriteName(n.ColumnName.Name.String()) + ctx.WritePlain(" + INTERVAL ") + err := n.Value.Restore(ctx) + ctx.WritePlain(" ") + if err != nil { + return err + } + return n.TimeUnitValue.Restore(ctx) + }) + case TableOptionTTLEnable: + _ = ctx.WriteWithSpecialComments(tidb.FeatureIDTTL, func() error { + ctx.WriteKeyWord("TTL_ENABLE ") + ctx.WritePlain("= ") + if n.BoolValue { + ctx.WriteString("ON") + } else { + ctx.WriteString("OFF") + } + return nil + }) + case TableOptionTTLJobInterval: + _ = ctx.WriteWithSpecialComments(tidb.FeatureIDTTL, func() error { + ctx.WriteKeyWord("TTL_JOB_INTERVAL ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + return nil + }) default: return errors.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) +} + // SequenceOptionType is the type for SequenceOption type SequenceOptionType int @@ -2599,6 +2794,7 @@ const ( AlterTableAddLastPartition AlterTableReorganizeLastPartition AlterTableReorganizeFirstPartition + AlterTableRemoveTTL ) // LockType is the type for AlterTableSpec. @@ -3280,7 +3476,11 @@ func (n *AlterTableSpec) Restore(ctx *format.RestoreCtx) error { if err := spec.Restore(ctx); err != nil { return errors.Annotatef(err, "An error occurred while restore AlterTableSpec.StatsOptionsSpec") } - + case AlterTableRemoveTTL: + _ = ctx.WriteWithSpecialComments(tidb.FeatureIDTTL, func() error { + ctx.WriteKeyWord("REMOVE TTL") + return nil + }) default: // TODO: not support ctx.WritePlainf(" /* AlterTableType(%d) is not supported */ ", n.Tp) @@ -3344,6 +3544,13 @@ func (n *AlterTableSpec) Accept(v Visitor) (Node, bool) { } 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 @@ -3382,11 +3589,21 @@ func (n *AlterTableStmt) Restore(ctx *format.RestoreCtx) error { if err := n.Table.Restore(ctx); err != nil { return errors.Annotate(err, "An error occurred while restore AlterTableStmt.Table") } - var specs []*AlterTableSpec + specs := make([]*AlterTableSpec, 0, len(n.Specs)) for _, spec := range n.Specs { - if !(spec.IsAllPlacementRule() && ctx.Flags.HasSkipPlacementRuleForRestoreFlag()) { - specs = append(specs, spec) + if spec.IsAllPlacementRule() && ctx.Flags.HasSkipPlacementRuleForRestoreFlag() { + continue + } + if spec.Tp == AlterTableOption { + newOptions := tableOptionsWithRestoreTTLFlag(ctx.Flags, spec.Options) + if len(newOptions) == 0 { + continue + } + newSpec := *spec + newSpec.Options = newOptions + spec = &newSpec } + specs = append(specs, spec) } for i, spec := range specs { if i == 0 || spec.Tp == AlterTablePartition || spec.Tp == AlterTableRemovePartitioning || spec.Tp == AlterTableImportTablespace || spec.Tp == AlterTableDiscardTablespace { @@ -4232,6 +4449,39 @@ func (n *AlterPlacementPolicyStmt) Accept(v Visitor) (Node, bool) { return v.Leave(n) } +// AlterResourceGroupStmt is a statement to alter placement policy option. +type AlterResourceGroupStmt struct { + ddlNode + + ResourceGroupName model.CIStr + IfExists bool + ResourceGroupOptionList []*ResourceGroupOption +} + +func (n *AlterResourceGroupStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("ALTER RESOURCE GROUP ") + if n.IfExists { + ctx.WriteKeyWord("IF EXISTS ") + } + ctx.WriteName(n.ResourceGroupName.O) + for i, option := range n.ResourceGroupOptionList { + ctx.WritePlain(" ") + if err := option.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while splicing AlterResourceStmt Options: [%v]", i) + } + } + return nil +} + +func (n *AlterResourceGroupStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AlterResourceGroupStmt) + return v.Leave(n) +} + // AlterSequenceStmt is a statement to alter sequence option. type AlterSequenceStmt struct { ddlNode @@ -4286,3 +4536,25 @@ func restorePlacementStmtInSpecialComment(ctx *format.RestoreCtx, n DDLNode) err return n.Restore(ctx) }) } + +func tableOptionsWithRestoreTTLFlag(flags format.RestoreFlags, options []*TableOption) []*TableOption { + if !flags.HasRestoreWithTTLEnableOff() { + return options + } + + newOptions := make([]*TableOption, 0, len(options)) + for _, opt := range options { + if opt.Tp == TableOptionTTLEnable { + continue + } + + newOptions = append(newOptions, opt) + if opt.Tp == TableOptionTTL { + newOptions = append(newOptions, &TableOption{ + Tp: TableOptionTTLEnable, + BoolValue: false, + }) + } + } + return newOptions +} diff --git a/parser/ast/ddl_test.go b/parser/ast/ddl_test.go index 3a5b1087d0bd2..dbbb212037db8 100644 --- a/parser/ast/ddl_test.go +++ b/parser/ast/ddl_test.go @@ -248,6 +248,21 @@ func TestDDLColumnOptionRestore(t *testing.T) { runNodeRestoreTest(t, testCases, "CREATE TABLE child (id INT %s)", extractNodeFunc) } +func TestGeneratedRestore(t *testing.T) { + testCases := []NodeRestoreTestCase{ + {"generated always as(id + 1)", "GENERATED ALWAYS AS(`id`+1) VIRTUAL"}, + {"generated always as(id + 1) virtual", "GENERATED ALWAYS AS(`id`+1) VIRTUAL"}, + {"generated always as(id + 1) stored", "GENERATED ALWAYS AS(`id`+1) STORED"}, + {"generated always as(lower(id)) stored", "GENERATED ALWAYS AS(LOWER(`id`)) STORED"}, + {"generated always as(lower(child.id)) stored", "GENERATED ALWAYS AS(LOWER(`id`)) STORED"}, + } + extractNodeFunc := func(node Node) Node { + return node.(*CreateTableStmt).Cols[0].Options[0] + } + runNodeRestoreTestWithFlagsStmtChange(t, testCases, "CREATE TABLE child (id INT %s)", extractNodeFunc, + format.DefaultRestoreFlags|format.RestoreWithoutSchemaName|format.RestoreWithoutTableName) +} + func TestDDLColumnDefRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ // for type @@ -840,3 +855,66 @@ func TestFlashBackDatabaseRestore(t *testing.T) { } runNodeRestoreTest(t, testCases, "%s", extractNodeFunc) } + +func TestTableOptionTTLRestore(t *testing.T) { + sourceSQL1 := "create table t (created_at datetime) ttl = created_at + INTERVAL 1 YEAR" + sourceSQL2 := "alter table t ttl_enable = 'OFF'" + sourceSQL3 := "alter table t remove ttl" + cases := []struct { + sourceSQL string + flags format.RestoreFlags + expectSQL string + }{ + {sourceSQL1, format.DefaultRestoreFlags, "CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 1 YEAR"}, + {sourceSQL1, format.DefaultRestoreFlags | format.RestoreTiDBSpecialComment, "CREATE TABLE `t` (`created_at` DATETIME) /*T![ttl] TTL = `created_at` + INTERVAL 1 YEAR */"}, + {sourceSQL2, format.DefaultRestoreFlags, "ALTER TABLE `t` TTL_ENABLE = 'OFF'"}, + {sourceSQL2, format.DefaultRestoreFlags | format.RestoreTiDBSpecialComment, "ALTER TABLE `t` /*T![ttl] TTL_ENABLE = 'OFF' */"}, + {sourceSQL3, format.DefaultRestoreFlags, "ALTER TABLE `t` REMOVE TTL"}, + {sourceSQL3, format.DefaultRestoreFlags | format.RestoreTiDBSpecialComment, "ALTER TABLE `t` /*T![ttl] REMOVE TTL */"}, + } + + extractNodeFunc := func(node Node) Node { + return node + } + + for _, ca := range cases { + testCases := []NodeRestoreTestCase{ + {ca.sourceSQL, ca.expectSQL}, + } + runNodeRestoreTestWithFlags(t, testCases, "%s", extractNodeFunc, ca.flags) + } +} + +func TestTableOptionTTLRestoreWithTTLEnableOffFlag(t *testing.T) { + sourceSQL1 := "create table t (created_at datetime) ttl = created_at + INTERVAL 1 YEAR" + sourceSQL2 := "alter table t ttl_enable = 'ON'" + sourceSQL3 := "alter table t remove ttl" + sourceSQL4 := "create table t (created_at datetime) ttl = created_at + INTERVAL 1 YEAR ttl_enable = 'ON'" + sourceSQL5 := "alter table t ttl_enable = 'ON' placement policy p1" + cases := []struct { + sourceSQL string + flags format.RestoreFlags + expectSQL string + }{ + {sourceSQL1, format.DefaultRestoreFlags | format.RestoreWithTTLEnableOff, "CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'OFF'"}, + {sourceSQL1, format.DefaultRestoreFlags | format.RestoreTiDBSpecialComment | format.RestoreWithTTLEnableOff, "CREATE TABLE `t` (`created_at` DATETIME) /*T![ttl] TTL = `created_at` + INTERVAL 1 YEAR */ /*T![ttl] TTL_ENABLE = 'OFF' */"}, + {sourceSQL2, format.DefaultRestoreFlags | format.RestoreWithTTLEnableOff, "ALTER TABLE `t`"}, + {sourceSQL2, format.DefaultRestoreFlags | format.RestoreTiDBSpecialComment | format.RestoreWithTTLEnableOff, "ALTER TABLE `t`"}, + {sourceSQL3, format.DefaultRestoreFlags | format.RestoreWithTTLEnableOff, "ALTER TABLE `t` REMOVE TTL"}, + {sourceSQL3, format.DefaultRestoreFlags | format.RestoreTiDBSpecialComment | format.RestoreWithTTLEnableOff, "ALTER TABLE `t` /*T![ttl] REMOVE TTL */"}, + {sourceSQL4, format.DefaultRestoreFlags | format.RestoreWithTTLEnableOff, "CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'OFF'"}, + {sourceSQL4, format.DefaultRestoreFlags | format.RestoreTiDBSpecialComment | format.RestoreWithTTLEnableOff, "CREATE TABLE `t` (`created_at` DATETIME) /*T![ttl] TTL = `created_at` + INTERVAL 1 YEAR */ /*T![ttl] TTL_ENABLE = 'OFF' */"}, + {sourceSQL5, format.DefaultRestoreFlags | format.RestoreTiDBSpecialComment | format.RestoreWithTTLEnableOff, "ALTER TABLE `t` /*T![placement] PLACEMENT POLICY = `p1` */"}, + } + + extractNodeFunc := func(node Node) Node { + return node + } + + for _, ca := range cases { + testCases := []NodeRestoreTestCase{ + {ca.sourceSQL, ca.expectSQL}, + } + runNodeRestoreTestWithFlagsStmtChange(t, testCases, "%s", extractNodeFunc, ca.flags) + } +} diff --git a/parser/ast/dml.go b/parser/ast/dml.go index 2712a8f7eba51..140331a3ba275 100644 --- a/parser/ast/dml.go +++ b/parser/ast/dml.go @@ -288,15 +288,17 @@ func (*TableName) resultSet() {} // Restore implements Node interface. func (n *TableName) restoreName(ctx *format.RestoreCtx) { - // restore db name - if n.Schema.String() != "" { - ctx.WriteName(n.Schema.String()) - ctx.WritePlain(".") - } else if ctx.DefaultDB != "" { - // Try CTE, for a CTE table name, we shouldn't write the database name. - if !ctx.IsCTETableName(n.Name.L) { - ctx.WriteName(ctx.DefaultDB) + if !ctx.Flags.HasWithoutSchemaNameFlag() { + // restore db name + if n.Schema.String() != "" { + ctx.WriteName(n.Schema.String()) ctx.WritePlain(".") + } else if ctx.DefaultDB != "" { + // 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 @@ -356,6 +358,8 @@ const ( HintUse IndexHintType = iota + 1 HintIgnore HintForce + HintOrderIndex + HintNoOrderIndex ) // IndexHintScope is the type for index hint for join, order by or group by. @@ -386,6 +390,10 @@ func (n *IndexHint) Restore(ctx *format.RestoreCtx) error { 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") } @@ -1793,12 +1801,24 @@ func (n *ColumnNameOrUserVar) Accept(v Visitor) (node Node, ok bool) { return v.Leave(n) } +type FileLocRefTp int + +const ( + // FileLocServerOrRemote is used when there's no keywords in SQL, which means the data file should be located on the + // tidb-server or on remote storage (S3 for example). + FileLocServerOrRemote 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 +) + // LoadDataStmt is a statement to load data from a specified file, then insert this rows into an existing table. // See https://dev.mysql.com/doc/refman/5.7/en/load-data.html +// in TiDB we extend the syntax to use LOAD DATA as a more general way to import data. type LoadDataStmt struct { dmlNode - IsLocal bool + FileLocRef FileLocRefTp Path string OnDuplicate OnDuplicateKeyHandlingType Table *TableName @@ -1814,7 +1834,9 @@ type LoadDataStmt struct { // Restore implements Node interface. func (n *LoadDataStmt) Restore(ctx *format.RestoreCtx) error { ctx.WriteKeyWord("LOAD DATA ") - if n.IsLocal { + switch n.FileLocRef { + case FileLocServerOrRemote: + case FileLocClient: ctx.WriteKeyWord("LOCAL ") } ctx.WriteKeyWord("INFILE ") @@ -2221,8 +2243,8 @@ func (n *InsertStmt) SetWhereExpr(e ExprNode) { s.Where = e } -// TableSource implements ShardableDMLStmt interface. -func (n *InsertStmt) TableSource() (*TableSource, bool) { +// TableRefsJoin implements ShardableDMLStmt interface. +func (n *InsertStmt) TableRefsJoin() (*Join, bool) { if n.Select == nil { return nil, false } @@ -2230,8 +2252,7 @@ func (n *InsertStmt) TableSource() (*TableSource, bool) { if !ok { return nil, false } - table, ok := s.From.TableRefs.Left.(*TableSource) - return table, ok + return s.From.TableRefs, true } // DeleteStmt is a statement to delete rows from table. @@ -2410,10 +2431,9 @@ func (n *DeleteStmt) SetWhereExpr(e ExprNode) { n.Where = e } -// TableSource implements ShardableDMLStmt interface. -func (n *DeleteStmt) TableSource() (*TableSource, bool) { - table, ok := n.TableRefs.TableRefs.Left.(*TableSource) - return table, ok +// TableRefsJoin implements ShardableDMLStmt interface. +func (n *DeleteStmt) TableRefsJoin() (*Join, bool) { + return n.TableRefs.TableRefs, true } const ( @@ -2426,8 +2446,8 @@ type ShardableDMLStmt = interface { StmtNode WhereExpr() ExprNode SetWhereExpr(ExprNode) - // TableSource returns the *only* target table source in the statement. - TableSource() (table *TableSource, ok bool) + // TableRefsJoin returns the table refs in the statement. + TableRefsJoin() (refs *Join, ok bool) } var _ ShardableDMLStmt = &DeleteStmt{} @@ -2649,10 +2669,9 @@ func (n *UpdateStmt) SetWhereExpr(e ExprNode) { n.Where = e } -// TableSource implements ShardableDMLStmt interface. -func (n *UpdateStmt) TableSource() (*TableSource, bool) { - table, ok := n.TableRefs.TableRefs.Left.(*TableSource) - return table, ok +// TableRefsJoin implements ShardableDMLStmt interface. +func (n *UpdateStmt) TableRefsJoin() (*Join, bool) { + return n.TableRefs.TableRefs, true } // Limit is the limit clause. @@ -2766,6 +2785,7 @@ const ( ShowPlacementForPartition ShowPlacementLabels ShowSessionStates + ShowCreateResourceGroup ) const ( @@ -2786,19 +2806,20 @@ const ( type ShowStmt struct { dmlNode - Tp ShowStmtType // Databases/Tables/Columns/.... - DBName string - Table *TableName // Used for showing columns. - Partition model.CIStr // Used for showing partition. - Column *ColumnName // Used for `desc table column`. - IndexName model.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. + Tp ShowStmtType // Databases/Tables/Columns/.... + DBName string + Table *TableName // Used for showing columns. + Partition model.CIStr // Used for showing partition. + Column *ColumnName // Used for `desc table column`. + IndexName model.CIStr + ResourceGroupName string // used for showing resource group + 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 @@ -2874,6 +2895,9 @@ func (n *ShowStmt) Restore(ctx *format.RestoreCtx) error { case ShowCreatePlacementPolicy: ctx.WriteKeyWord("CREATE PLACEMENT POLICY ") ctx.WriteName(n.DBName) + case ShowCreateResourceGroup: + ctx.WriteKeyWord("CREATE RESOURCE GROUP ") + ctx.WriteName(n.ResourceGroupName) case ShowCreateUser: ctx.WriteKeyWord("CREATE USER ") if err := n.User.Restore(ctx); err != nil { diff --git a/parser/ast/expressions.go b/parser/ast/expressions.go index 270c46218af61..6bca49f4d2a7d 100644 --- a/parser/ast/expressions.go +++ b/parser/ast/expressions.go @@ -512,11 +512,11 @@ type ColumnName struct { // Restore implements Node interface. func (n *ColumnName) Restore(ctx *format.RestoreCtx) error { - if n.Schema.O != "" && !ctx.IsCTETableName(n.Table.L) { + if n.Schema.O != "" && !ctx.IsCTETableName(n.Table.L) && !ctx.Flags.HasWithoutSchemaNameFlag() { ctx.WriteName(n.Schema.O) ctx.WritePlain(".") } - if n.Table.O != "" { + if n.Table.O != "" && !ctx.Flags.HasWithoutTableNameFlag() { ctx.WriteName(n.Table.O) ctx.WritePlain(".") } diff --git a/parser/ast/functions.go b/parser/ast/functions.go index af47b56515743..fdedf53b701cf 100644 --- a/parser/ast/functions.go +++ b/parser/ast/functions.go @@ -331,7 +331,9 @@ const ( 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" @@ -380,21 +382,9 @@ type FuncCallExpr struct { // Restore implements Node interface. func (n *FuncCallExpr) Restore(ctx *format.RestoreCtx) 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 errors.Annotatef(err, "An error occurred while restore FuncCastExpr.Expr") - } - return nil + done, err := n.customRestore(ctx) + if done { + return err } if len(n.Schema.String()) != 0 { @@ -495,29 +485,70 @@ func (n *FuncCallExpr) Restore(ctx *format.RestoreCtx) error { 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, errors.Annotatef(err, "An error occurred while restore FuncCallExpr.Expr") + } + return true, nil + } + if n.FnName.L == JSONMemberOf { + if err := n.Args[0].Restore(ctx); err != nil { + return true, errors.Annotatef(err, "An error occurred while restore FuncCallExpr.(MEMBER OF).Args[0]") + } + ctx.WriteKeyWord(" MEMBER OF ") + ctx.WritePlain("(") + if err := n.Args[1].Restore(ctx); err != nil { + return true, errors.Annotatef(err, "An error occurred while restore FuncCallExpr.(MEMBER OF).Args[1]") + } + ctx.WritePlain(")") + return true, nil + } + return false, nil +} + // Format the ExprNode into a Writer. func (n *FuncCallExpr) Format(w io.Writer) { - fmt.Fprintf(w, "%s(", n.FnName.L) if !n.specialFormatArgs(w) { + fmt.Fprintf(w, "%s(", n.FnName.L) for i, arg := range n.Args { arg.Format(w) if i != len(n.Args)-1 { fmt.Fprint(w, ", ") } } + fmt.Fprint(w, ")") } - fmt.Fprint(w, ")") } // specialFormatArgs formats argument list for some special functions. func (n *FuncCallExpr) specialFormatArgs(w io.Writer) bool { switch n.FnName.L { case DateAdd, DateSub, AddDate, SubDate: + fmt.Fprintf(w, "%s(", n.FnName.L) n.Args[0].Format(w) fmt.Fprint(w, ", INTERVAL ") n.Args[1].Format(w) fmt.Fprint(w, " ") n.Args[2].Format(w) + fmt.Fprint(w, ")") + return true + case JSONMemberOf: + n.Args[0].Format(w) + fmt.Fprint(w, " MEMBER OF ") + fmt.Fprint(w, " (") + n.Args[1].Format(w) + fmt.Fprint(w, ")") return true } return false diff --git a/parser/ast/misc.go b/parser/ast/misc.go index b0668c7a09a7e..719371ee89439 100644 --- a/parser/ast/misc.go +++ b/parser/ast/misc.go @@ -98,6 +98,7 @@ 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 } @@ -112,7 +113,7 @@ func (n *AuthOption) Restore(ctx *format.RestoreCtx) error { if n.ByAuthString { ctx.WriteKeyWord(" BY ") ctx.WriteString(n.AuthString) - } else if n.HashString != "" { + } else if n.ByHashString { ctx.WriteKeyWord(" AS ") ctx.WriteString(n.HashString) } @@ -265,6 +266,15 @@ type PlanReplayerStmt struct { Stmt StmtNode Analyze bool Load bool + + // Capture indicates 'plan replayer capture ' + Capture bool + // Remove indicates `plan replayer capture remove + Remove bool + + SQLDigest string + PlanDigest string + // File is used to store 2 cases: // 1. plan replayer load 'file'; // 2. plan replayer dump explain 'file' @@ -284,6 +294,21 @@ func (n *PlanReplayerStmt) Restore(ctx *format.RestoreCtx) error { ctx.WriteString(n.File) return nil } + if n.Capture { + ctx.WriteKeyWord("PLAN REPLAYER CAPTURE ") + ctx.WriteString(n.SQLDigest) + ctx.WriteKeyWord(" ") + ctx.WriteString(n.PlanDigest) + return nil + } + if n.Remove { + ctx.WriteKeyWord("PLAN REPLAYER CAPTURE REMOVE ") + ctx.WriteString(n.SQLDigest) + ctx.WriteKeyWord(" ") + ctx.WriteString(n.PlanDigest) + return nil + } + ctx.WriteKeyWord("PLAN REPLAYER DUMP EXPLAIN ") if n.Analyze { ctx.WriteKeyWord("ANALYZE ") @@ -506,7 +531,6 @@ type Prepared struct { StmtType string Params []ParamMarkerExpr SchemaVersion int64 - UseCache bool CachedPlan interface{} CachedNames interface{} } @@ -1493,11 +1517,19 @@ const ( PasswordExpireDefault PasswordExpireNever PasswordExpireInterval + PasswordHistory + PasswordHistoryDefault + PasswordReuseInterval + PasswordReuseDefault Lock Unlock - + FailedLoginAttempts + PasswordLockTime + PasswordLockTimeUnbounded UserCommentType UserAttributeType + + UserResourceGroupName ) type PasswordOrLockOption struct { @@ -1521,6 +1553,25 @@ func (p *PasswordOrLockOption) Restore(ctx *format.RestoreCtx) error { 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 errors.Errorf("Unsupported PasswordOrLockOption.Type %d", p.Type) } @@ -1543,6 +1594,16 @@ func (c *CommentOrAttributeOption) Restore(ctx *format.RestoreCtx) error { 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 { @@ -1555,6 +1616,7 @@ type CreateUserStmt struct { ResourceOptions []*ResourceOption PasswordOrLockOptions []*PasswordOrLockOption CommentOrAttributeOption *CommentOrAttributeOption + ResourceGroupNameOption *ResourceGroupNameOption } // Restore implements Node interface. @@ -1613,6 +1675,12 @@ func (n *CreateUserStmt) Restore(ctx *format.RestoreCtx) error { } } + if n.ResourceGroupNameOption != nil { + if err := n.ResourceGroupNameOption.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore CreateUserStmt.ResourceGroupNameOption") + } + } + return nil } @@ -1649,6 +1717,7 @@ type AlterUserStmt struct { ResourceOptions []*ResourceOption PasswordOrLockOptions []*PasswordOrLockOption CommentOrAttributeOption *CommentOrAttributeOption + ResourceGroupNameOption *ResourceGroupNameOption } // Restore implements Node interface. @@ -1710,6 +1779,12 @@ func (n *AlterUserStmt) Restore(ctx *format.RestoreCtx) error { } } + if n.ResourceGroupNameOption != nil { + if err := n.ResourceGroupNameOption.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore AlterUserStmt.ResourceGroupNameOption") + } + } + return nil } @@ -1813,6 +1888,7 @@ type CreateBindingStmt struct { GlobalScope bool OriginNode StmtNode HintedNode StmtNode + PlanDigest string } func (n *CreateBindingStmt) Restore(ctx *format.RestoreCtx) error { @@ -1822,13 +1898,18 @@ func (n *CreateBindingStmt) Restore(ctx *format.RestoreCtx) error { } else { ctx.WriteKeyWord("SESSION ") } - ctx.WriteKeyWord("BINDING FOR ") - if err := n.OriginNode.Restore(ctx); err != nil { - return errors.Trace(err) - } - ctx.WriteKeyWord(" USING ") - if err := n.HintedNode.Restore(ctx); err != nil { - return errors.Trace(err) + if n.OriginNode == nil { + ctx.WriteKeyWord("BINDING FROM HISTORY USING PLAN DIGEST ") + ctx.WriteString(n.PlanDigest) + } else { + ctx.WriteKeyWord("BINDING FOR ") + if err := n.OriginNode.Restore(ctx); err != nil { + return errors.Trace(err) + } + ctx.WriteKeyWord(" USING ") + if err := n.HintedNode.Restore(ctx); err != nil { + return errors.Trace(err) + } } return nil } @@ -1839,16 +1920,18 @@ func (n *CreateBindingStmt) Accept(v Visitor) (Node, bool) { return v.Leave(newNode) } n = newNode.(*CreateBindingStmt) - origNode, ok := n.OriginNode.Accept(v) - if !ok { - return n, false - } - n.OriginNode = origNode.(StmtNode) - hintedNode, ok := n.HintedNode.Accept(v) - if !ok { - return n, false + if n.OriginNode != nil { + origNode, ok := n.OriginNode.Accept(v) + if !ok { + return n, false + } + n.OriginNode = origNode.(StmtNode) + hintedNode, ok := n.HintedNode.Accept(v) + if !ok { + return n, false + } + n.HintedNode = hintedNode.(StmtNode) } - n.HintedNode = hintedNode.(StmtNode) return v.Leave(n) } @@ -1859,6 +1942,7 @@ type DropBindingStmt struct { GlobalScope bool OriginNode StmtNode HintedNode StmtNode + SQLDigest string } func (n *DropBindingStmt) Restore(ctx *format.RestoreCtx) error { @@ -1869,14 +1953,19 @@ func (n *DropBindingStmt) Restore(ctx *format.RestoreCtx) error { ctx.WriteKeyWord("SESSION ") } ctx.WriteKeyWord("BINDING FOR ") - if err := n.OriginNode.Restore(ctx); err != nil { - return errors.Trace(err) - } - if n.HintedNode != nil { - ctx.WriteKeyWord(" USING ") - if err := n.HintedNode.Restore(ctx); err != nil { + if n.OriginNode == nil { + ctx.WriteKeyWord("SQL DIGEST ") + ctx.WriteString(n.SQLDigest) + } else { + if err := n.OriginNode.Restore(ctx); err != nil { return errors.Trace(err) } + if n.HintedNode != nil { + ctx.WriteKeyWord(" USING ") + if err := n.HintedNode.Restore(ctx); err != nil { + return errors.Trace(err) + } + } } return nil } @@ -1887,17 +1976,20 @@ func (n *DropBindingStmt) Accept(v Visitor) (Node, bool) { return v.Leave(newNode) } n = newNode.(*DropBindingStmt) - origNode, ok := n.OriginNode.Accept(v) - if !ok { - return n, false - } - n.OriginNode = origNode.(StmtNode) - if n.HintedNode != nil { - hintedNode, ok := n.HintedNode.Accept(v) + if n.OriginNode != nil { + // OriginNode is nil means we build drop binding by sql digest + origNode, ok := n.OriginNode.Accept(v) if !ok { return n, false } - n.HintedNode = hintedNode.(StmtNode) + n.OriginNode = origNode.(StmtNode) + if n.HintedNode != nil { + hintedNode, ok := n.HintedNode.Accept(v) + if !ok { + return n, false + } + n.HintedNode = hintedNode.(StmtNode) + } } return v.Leave(n) } @@ -1918,6 +2010,7 @@ type SetBindingStmt struct { BindingStatusType BindingStatusType OriginNode StmtNode HintedNode StmtNode + SQLDigest string } func (n *SetBindingStmt) Restore(ctx *format.RestoreCtx) error { @@ -1930,14 +2023,19 @@ func (n *SetBindingStmt) Restore(ctx *format.RestoreCtx) error { ctx.WriteKeyWord("DISABLED ") } ctx.WriteKeyWord("FOR ") - if err := n.OriginNode.Restore(ctx); err != nil { - return errors.Trace(err) - } - if n.HintedNode != nil { - ctx.WriteKeyWord(" USING ") - if err := n.HintedNode.Restore(ctx); err != nil { + if n.OriginNode == nil { + ctx.WriteKeyWord("SQL DIGEST ") + ctx.WriteString(n.SQLDigest) + } else { + if err := n.OriginNode.Restore(ctx); err != nil { return errors.Trace(err) } + if n.HintedNode != nil { + ctx.WriteKeyWord(" USING ") + if err := n.HintedNode.Restore(ctx); err != nil { + return errors.Trace(err) + } + } } return nil } @@ -1948,17 +2046,20 @@ func (n *SetBindingStmt) Accept(v Visitor) (Node, bool) { return v.Leave(newNode) } n = newNode.(*SetBindingStmt) - origNode, ok := n.OriginNode.Accept(v) - if !ok { - return n, false - } - n.OriginNode = origNode.(StmtNode) - if n.HintedNode != nil { - hintedNode, ok := n.HintedNode.Accept(v) + if n.OriginNode != nil { + // OriginNode is nil means we set binding stmt by sql digest + origNode, ok := n.OriginNode.Accept(v) if !ok { return n, false } - n.HintedNode = hintedNode.(StmtNode) + n.OriginNode = origNode.(StmtNode) + if n.HintedNode != nil { + hintedNode, ok := n.HintedNode.Accept(v) + if !ok { + return n, false + } + n.HintedNode = hintedNode.(StmtNode) + } } return v.Leave(n) } @@ -3648,9 +3749,13 @@ func (n *TableOptimizerHint) Restore(ctx *format.RestoreCtx) error { } 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 "mpp_1phase_agg", "mpp_2phase_agg", "hash_agg", "stream_agg", "agg_to_cop", "read_consistent_replica", "no_index_merge", "qb_name", "ignore_plan_cache", "limit_to_cop", "straight_join", "merge", "no_decorrelate": + case "mpp_1phase_agg", "mpp_2phase_agg", "hash_agg", "stream_agg", "agg_to_cop", "read_consistent_replica", "no_index_merge", "ignore_plan_cache", "limit_to_cop", "straight_join", "merge", "no_decorrelate": ctx.WritePlain(")") return nil } @@ -3670,7 +3775,7 @@ func (n *TableOptimizerHint) Restore(ctx *format.RestoreCtx) error { } table.Restore(ctx) } - case "use_index", "ignore_index", "use_index_merge", "force_index": + case "use_index", "ignore_index", "use_index_merge", "force_index", "order_index", "no_order_index": n.Tables[0].Restore(ctx) ctx.WritePlain(" ") for i, index := range n.Indexes { @@ -3679,6 +3784,16 @@ func (n *TableOptimizerHint) Restore(ctx *format.RestoreCtx) error { } 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 "use_toja", "use_cascades": if n.HintData.(bool) { ctx.WritePlain("TRUE") @@ -3709,9 +3824,9 @@ func (n *TableOptimizerHint) Restore(ctx *format.RestoreCtx) error { ctx.WriteString(hintData.To) case "set_var": hintData := n.HintData.(HintSetVar) - ctx.WriteString(hintData.VarName) - ctx.WritePlain(", ") - ctx.WriteString(hintData.Value) + ctx.WritePlain(hintData.VarName) + ctx.WritePlain(" = ") + ctx.WritePlain(hintData.Value) } ctx.WritePlain(")") return nil diff --git a/parser/ast/misc_test.go b/parser/ast/misc_test.go index 8042a171874d0..7379279d51567 100644 --- a/parser/ast/misc_test.go +++ b/parser/ast/misc_test.go @@ -228,6 +228,18 @@ func TestTableOptimizerHintRestore(t *testing.T) { {"IGNORE_INDEX(@sel_1 t1 c1)", "IGNORE_INDEX(@`sel_1` `t1` `c1`)"}, {"IGNORE_INDEX(t1@sel_1 c1)", "IGNORE_INDEX(`t1`@`sel_1` `c1`)"}, {"IGNORE_INDEX(t1@sel_1 partition(p0, p1) c1)", "IGNORE_INDEX(`t1`@`sel_1` PARTITION(`p0`, `p1`) `c1`)"}, + {"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`)"}, + {"ORDER_INDEX(test.t1@sel_1 partition(p0) c1)", "ORDER_INDEX(`test`.`t1`@`sel_1` PARTITION(`p0`) `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`)"}, + {"NO_ORDER_INDEX(test.t1@sel_1 partition(p0) c1)", "NO_ORDER_INDEX(`test`.`t1`@`sel_1` PARTITION(`p0`) `c1`)"}, {"TIDB_SMJ(`t1`)", "TIDB_SMJ(`t1`)"}, {"TIDB_SMJ(t1)", "TIDB_SMJ(`t1`)"}, {"TIDB_SMJ(t1,t2)", "TIDB_SMJ(`t1`, `t2`)"}, diff --git a/parser/auth/auth.go b/parser/auth/auth.go index 109fdda04b644..cb9abb883a33d 100644 --- a/parser/auth/auth.go +++ b/parser/auth/auth.go @@ -33,6 +33,7 @@ type UserIdentity struct { 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. diff --git a/parser/consistent_test.go b/parser/consistent_test.go index e78b7f31ddddd..1acc1a58bc850 100644 --- a/parser/consistent_test.go +++ b/parser/consistent_test.go @@ -14,7 +14,7 @@ package parser import ( - "io/ioutil" + gio "io" "os" "sort" "strings" @@ -27,7 +27,7 @@ func TestKeywordConsistent(t *testing.T) { parserFilename := "parser.y" parserFile, err := os.Open(parserFilename) requires.NoError(t, err) - data, err := ioutil.ReadAll(parserFile) + data, err := gio.ReadAll(parserFile) requires.NoError(t, err) content := string(data) diff --git a/parser/duration/BUILD.bazel b/parser/duration/BUILD.bazel new file mode 100644 index 0000000000000..8015c5ce5df7d --- /dev/null +++ b/parser/duration/BUILD.bazel @@ -0,0 +1,18 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "duration", + srcs = ["duration.go"], + importpath = "github.com/pingcap/tidb/parser/duration", + visibility = ["//visibility:public"], + deps = ["@com_github_pingcap_errors//:errors"], +) + +go_test( + name = "duration_test", + timeout = "short", + srcs = ["duration_test.go"], + embed = [":duration"], + flaky = True, + deps = ["@com_github_stretchr_testify//require"], +) diff --git a/parser/duration/duration.go b/parser/duration/duration.go new file mode 100644 index 0000000000000..6eb13111b0424 --- /dev/null +++ b/parser/duration/duration.go @@ -0,0 +1,73 @@ +// Copyright 2023 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 duration provides a customized duration, which supports unit 'd', 'h' and 'm' +package duration + +import ( + "strconv" + "time" + "unicode" + + "github.com/pingcap/errors" +) + +func readFloat(s string) (float64, string, error) { + numbers := "" + for pos, ch := range s { + if !unicode.IsDigit(ch) && ch != '.' { + numbers = s[:pos] + break + } + } + if len(numbers) > 0 { + i, err := strconv.ParseFloat(numbers, 64) + if err != nil { + return 0, s, err + } + return i, s[len(numbers):], nil + } + return 0, s, errors.New("fail to read an integer") +} + +// ParseDuration parses the duration which contains 'd', 'h' and 'm' +func ParseDuration(s string) (time.Duration, error) { + duration := time.Duration(0) + + if s == "0" { + return 0, nil + } + + var err error + var i float64 + for len(s) > 0 { + i, s, err = readFloat(s) + if err != nil { + return 0, err + } + switch s[0] { + case 'd': + duration += time.Duration(i * float64(time.Hour*24)) + case 'h': + duration += time.Duration(i * float64(time.Hour)) + case 'm': + duration += time.Duration(i * float64(time.Minute)) + default: + return 0, errors.Errorf("unknown unit %c", s[0]) + } + + s = s[1:] + } + + return duration, nil +} diff --git a/parser/duration/duration_test.go b/parser/duration/duration_test.go new file mode 100644 index 0000000000000..4a1555db69e41 --- /dev/null +++ b/parser/duration/duration_test.go @@ -0,0 +1,65 @@ +// Copyright 2023 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 duration + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestParseDuration(t *testing.T) { + cases := []struct { + str string + duration time.Duration + }{ + { + "1h", + time.Hour, + }, + { + "1h100m", + time.Hour + 100*time.Minute, + }, + { + "1d10000m", + 24*time.Hour + 10000*time.Minute, + }, + { + "1d100h", + 24*time.Hour + 100*time.Hour, + }, + { + "1.5d", + 36 * time.Hour, + }, + { + "1d1.5h", + 24*time.Hour + time.Hour + 30*time.Minute, + }, + { + "1d3.555h", + 24*time.Hour + time.Duration(3.555*float64(time.Hour)), + }, + } + + for _, c := range cases { + t.Run(c.str, func(t *testing.T) { + d, err := ParseDuration(c.str) + require.NoError(t, err) + require.Equal(t, c.duration, d) + }) + } +} diff --git a/parser/format/format.go b/parser/format/format.go index adada122e255e..a60c8d7b6589d 100644 --- a/parser/format/format.go +++ b/parser/format/format.go @@ -235,6 +235,9 @@ const ( RestoreTiDBSpecialComment SkipPlacementRuleForRestore + RestoreWithTTLEnableOff + RestoreWithoutSchemaName + RestoreWithoutTableName ) const ( @@ -246,6 +249,16 @@ 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) @@ -321,6 +334,11 @@ func (rf RestoreFlags) HasSkipPlacementRuleForRestoreFlag() bool { return rf.has(SkipPlacementRuleForRestore) } +// HasRestoreWithTTLEnableOff returns a boolean indicating whether to force set TTL_ENABLE='OFF' when restoring a TTL table +func (rf RestoreFlags) HasRestoreWithTTLEnableOff() bool { + return rf.has(RestoreWithTTLEnableOff) +} + // RestoreCtx is `Restore` context to hold flags and writer. type RestoreCtx struct { Flags RestoreFlags diff --git a/parser/format/format_test.go b/parser/format/format_test.go index 429c2c27c19d1..bc04033214cdd 100644 --- a/parser/format/format_test.go +++ b/parser/format/format_test.go @@ -15,7 +15,7 @@ package format import ( "bytes" - "io/ioutil" + "io" "strings" "testing" @@ -26,7 +26,7 @@ import ( func checkFormat(t *testing.T, f Formatter, buf *bytes.Buffer, str, expect string) { _, err := f.Format(str, 3) require.NoError(t, err) - b, err := ioutil.ReadAll(buf) + b, err := io.ReadAll(buf) require.NoError(t, err) require.Equal(t, expect, string(b)) } diff --git a/parser/hintparser.go b/parser/hintparser.go index 1b14e7d292e1e..998d9b3823d08 100644 --- a/parser/hintparser.go +++ b/parser/hintparser.go @@ -41,18 +41,18 @@ type yyhintXError struct { } const ( - yyhintDefault = 57424 + yyhintDefault = 57426 yyhintEOFCode = 57344 yyhintErrCode = 57345 hintAggToCop = 57379 hintBCJoin = 57394 hintBKA = 57355 hintBNL = 57357 - hintDupsWeedOut = 57420 - hintFalse = 57416 - hintFirstMatch = 57421 - hintForceIndex = 57406 - hintGB = 57419 + hintDupsWeedOut = 57422 + hintFalse = 57418 + hintFirstMatch = 57423 + hintForceIndex = 57408 + hintGB = 57421 hintHashAgg = 57381 hintHashJoin = 57359 hintHashJoinBuild = 57360 @@ -70,12 +70,12 @@ const ( hintJoinOrder = 57352 hintJoinPrefix = 57353 hintJoinSuffix = 57354 - hintLeading = 57408 - hintLimitToCop = 57405 - hintLooseScan = 57422 - hintMB = 57418 + hintLeading = 57410 + hintLimitToCop = 57407 + hintLooseScan = 57424 + hintMB = 57420 hintMRR = 57367 - hintMaterialization = 57423 + hintMaterialization = 57425 hintMaxExecutionTime = 57375 hintMemoryQuota = 57388 hintMerge = 57363 @@ -83,175 +83,179 @@ const ( hintMpp2PhaseAgg = 57383 hintNoBKA = 57356 hintNoBNL = 57358 - hintNoDecorrelate = 57410 + hintNoDecorrelate = 57412 hintNoHashJoin = 57362 hintNoICP = 57369 hintNoIndexMerge = 57366 hintNoMRR = 57368 hintNoMerge = 57364 + hintNoOrderIndex = 57401 hintNoRangeOptimization = 57370 hintNoSemijoin = 57374 hintNoSkipScan = 57372 hintNoSwapJoinInputs = 57389 - hintNthPlan = 57404 - hintOLAP = 57411 - hintOLTP = 57412 - hintPartition = 57413 + hintNthPlan = 57406 + hintOLAP = 57413 + hintOLTP = 57414 + hintOrderIndex = 57400 + hintPartition = 57415 hintQBName = 57378 hintQueryType = 57390 hintReadConsistentReplica = 57391 hintReadFromStorage = 57392 hintResourceGroup = 57377 hintSMJoin = 57393 - hintSemiJoinRewrite = 57409 + hintSemiJoinRewrite = 57411 hintSemijoin = 57373 hintSetVar = 57376 hintShuffleJoin = 57395 hintSingleAtIdentifier = 57349 hintSkipScan = 57371 - hintStraightJoin = 57407 + hintStraightJoin = 57409 hintStreamAgg = 57396 hintStringLit = 57350 hintSwapJoinInputs = 57397 - hintTiFlash = 57415 - hintTiKV = 57414 - hintTimeRange = 57402 - hintTrue = 57417 - hintUseCascades = 57403 + hintTiFlash = 57417 + hintTiKV = 57416 + hintTimeRange = 57404 + hintTrue = 57419 + hintUseCascades = 57405 hintUseIndex = 57399 hintUseIndexMerge = 57398 - hintUsePlanCache = 57400 - hintUseToja = 57401 + hintUsePlanCache = 57402 + hintUseToja = 57403 yyhintMaxDepth = 200 - yyhintTabOfs = -193 + yyhintTabOfs = -197 ) var ( yyhintXLAT = map[int]int{ - 41: 0, // ')' (146x) - 57379: 1, // hintAggToCop (133x) - 57394: 2, // hintBCJoin (133x) - 57355: 3, // hintBKA (133x) - 57357: 4, // hintBNL (133x) - 57406: 5, // hintForceIndex (133x) - 57381: 6, // hintHashAgg (133x) - 57359: 7, // hintHashJoin (133x) - 57360: 8, // hintHashJoinBuild (133x) - 57361: 9, // hintHashJoinProbe (133x) - 57384: 10, // hintIgnoreIndex (133x) - 57380: 11, // hintIgnorePlanCache (133x) - 57365: 12, // hintIndexMerge (133x) - 57385: 13, // hintInlHashJoin (133x) - 57386: 14, // hintInlJoin (133x) - 57387: 15, // hintInlMergeJoin (133x) - 57351: 16, // hintJoinFixedOrder (133x) - 57352: 17, // hintJoinOrder (133x) - 57353: 18, // hintJoinPrefix (133x) - 57354: 19, // hintJoinSuffix (133x) - 57408: 20, // hintLeading (133x) - 57405: 21, // hintLimitToCop (133x) - 57375: 22, // hintMaxExecutionTime (133x) - 57388: 23, // hintMemoryQuota (133x) - 57363: 24, // hintMerge (133x) - 57382: 25, // hintMpp1PhaseAgg (133x) - 57383: 26, // hintMpp2PhaseAgg (133x) - 57367: 27, // hintMRR (133x) - 57356: 28, // hintNoBKA (133x) - 57358: 29, // hintNoBNL (133x) - 57410: 30, // hintNoDecorrelate (133x) - 57362: 31, // hintNoHashJoin (133x) - 57369: 32, // hintNoICP (133x) - 57366: 33, // hintNoIndexMerge (133x) - 57364: 34, // hintNoMerge (133x) - 57368: 35, // hintNoMRR (133x) - 57370: 36, // hintNoRangeOptimization (133x) - 57374: 37, // hintNoSemijoin (133x) - 57372: 38, // hintNoSkipScan (133x) - 57389: 39, // hintNoSwapJoinInputs (133x) - 57404: 40, // hintNthPlan (133x) - 57378: 41, // hintQBName (133x) - 57390: 42, // hintQueryType (133x) - 57391: 43, // hintReadConsistentReplica (133x) - 57392: 44, // hintReadFromStorage (133x) - 57377: 45, // hintResourceGroup (133x) - 57373: 46, // hintSemijoin (133x) - 57409: 47, // hintSemiJoinRewrite (133x) - 57376: 48, // hintSetVar (133x) - 57395: 49, // hintShuffleJoin (133x) - 57371: 50, // hintSkipScan (133x) - 57393: 51, // hintSMJoin (133x) - 57407: 52, // hintStraightJoin (133x) - 57396: 53, // hintStreamAgg (133x) - 57397: 54, // hintSwapJoinInputs (133x) - 57402: 55, // hintTimeRange (133x) - 57403: 56, // hintUseCascades (133x) - 57399: 57, // hintUseIndex (133x) - 57398: 58, // hintUseIndexMerge (133x) - 57400: 59, // hintUsePlanCache (133x) - 57401: 60, // hintUseToja (133x) - 44: 61, // ',' (130x) - 57420: 62, // hintDupsWeedOut (110x) - 57421: 63, // hintFirstMatch (110x) - 57422: 64, // hintLooseScan (110x) - 57423: 65, // hintMaterialization (110x) - 57415: 66, // hintTiFlash (110x) - 57414: 67, // hintTiKV (110x) - 57416: 68, // hintFalse (109x) - 57411: 69, // hintOLAP (109x) - 57412: 70, // hintOLTP (109x) - 57417: 71, // hintTrue (109x) - 57419: 72, // hintGB (108x) - 57418: 73, // hintMB (108x) - 57347: 74, // hintIdentifier (107x) - 57349: 75, // hintSingleAtIdentifier (93x) - 93: 76, // ']' (84x) - 46: 77, // '.' (83x) - 57413: 78, // hintPartition (78x) - 61: 79, // '=' (74x) - 40: 80, // '(' (69x) - 57344: 81, // $end (25x) - 57444: 82, // QueryBlockOpt (20x) - 57436: 83, // Identifier (15x) - 57346: 84, // hintIntLit (8x) - 57350: 85, // hintStringLit (5x) - 57426: 86, // CommaOpt (4x) - 57432: 87, // HintTable (4x) - 57433: 88, // HintTableList (4x) - 91: 89, // '[' (3x) - 57425: 90, // BooleanHintName (2x) - 57427: 91, // HintIndexList (2x) - 57429: 92, // HintStorageType (2x) - 57430: 93, // HintStorageTypeAndTable (2x) - 57434: 94, // HintTableListOpt (2x) - 57439: 95, // JoinOrderOptimizerHintName (2x) - 57440: 96, // NullaryHintName (2x) - 57443: 97, // PartitionListOpt (2x) - 57446: 98, // StorageOptimizerHintOpt (2x) - 57447: 99, // SubqueryOptimizerHintName (2x) - 57450: 100, // SubqueryStrategy (2x) - 57451: 101, // SupportedIndexLevelOptimizerHintName (2x) - 57452: 102, // SupportedTableLevelOptimizerHintName (2x) - 57453: 103, // TableOptimizerHintOpt (2x) - 57455: 104, // UnsupportedIndexLevelOptimizerHintName (2x) - 57456: 105, // UnsupportedTableLevelOptimizerHintName (2x) - 57458: 106, // ViewName (2x) - 57428: 107, // HintQueryType (1x) - 57431: 108, // HintStorageTypeAndTableList (1x) - 57435: 109, // HintTrueOrFalse (1x) - 57437: 110, // IndexNameList (1x) - 57438: 111, // IndexNameListOpt (1x) - 57441: 112, // OptimizerHintList (1x) - 57442: 113, // PartitionList (1x) - 57445: 114, // Start (1x) - 57448: 115, // SubqueryStrategies (1x) - 57449: 116, // SubqueryStrategiesOpt (1x) - 57454: 117, // UnitOfBytes (1x) - 57457: 118, // Value (1x) - 57459: 119, // ViewNameList (1x) - 57424: 120, // $default (0x) - 57345: 121, // error (0x) - 57348: 122, // hintInvalid (0x) + 41: 0, // ')' (148x) + 57379: 1, // hintAggToCop (135x) + 57394: 2, // hintBCJoin (135x) + 57355: 3, // hintBKA (135x) + 57357: 4, // hintBNL (135x) + 57408: 5, // hintForceIndex (135x) + 57381: 6, // hintHashAgg (135x) + 57359: 7, // hintHashJoin (135x) + 57360: 8, // hintHashJoinBuild (135x) + 57361: 9, // hintHashJoinProbe (135x) + 57384: 10, // hintIgnoreIndex (135x) + 57380: 11, // hintIgnorePlanCache (135x) + 57365: 12, // hintIndexMerge (135x) + 57385: 13, // hintInlHashJoin (135x) + 57386: 14, // hintInlJoin (135x) + 57387: 15, // hintInlMergeJoin (135x) + 57351: 16, // hintJoinFixedOrder (135x) + 57352: 17, // hintJoinOrder (135x) + 57353: 18, // hintJoinPrefix (135x) + 57354: 19, // hintJoinSuffix (135x) + 57410: 20, // hintLeading (135x) + 57407: 21, // hintLimitToCop (135x) + 57375: 22, // hintMaxExecutionTime (135x) + 57388: 23, // hintMemoryQuota (135x) + 57363: 24, // hintMerge (135x) + 57382: 25, // hintMpp1PhaseAgg (135x) + 57383: 26, // hintMpp2PhaseAgg (135x) + 57367: 27, // hintMRR (135x) + 57356: 28, // hintNoBKA (135x) + 57358: 29, // hintNoBNL (135x) + 57412: 30, // hintNoDecorrelate (135x) + 57362: 31, // hintNoHashJoin (135x) + 57369: 32, // hintNoICP (135x) + 57366: 33, // hintNoIndexMerge (135x) + 57364: 34, // hintNoMerge (135x) + 57368: 35, // hintNoMRR (135x) + 57401: 36, // hintNoOrderIndex (135x) + 57370: 37, // hintNoRangeOptimization (135x) + 57374: 38, // hintNoSemijoin (135x) + 57372: 39, // hintNoSkipScan (135x) + 57389: 40, // hintNoSwapJoinInputs (135x) + 57406: 41, // hintNthPlan (135x) + 57400: 42, // hintOrderIndex (135x) + 57378: 43, // hintQBName (135x) + 57390: 44, // hintQueryType (135x) + 57391: 45, // hintReadConsistentReplica (135x) + 57392: 46, // hintReadFromStorage (135x) + 57377: 47, // hintResourceGroup (135x) + 57373: 48, // hintSemijoin (135x) + 57411: 49, // hintSemiJoinRewrite (135x) + 57376: 50, // hintSetVar (135x) + 57395: 51, // hintShuffleJoin (135x) + 57371: 52, // hintSkipScan (135x) + 57393: 53, // hintSMJoin (135x) + 57409: 54, // hintStraightJoin (135x) + 57396: 55, // hintStreamAgg (135x) + 57397: 56, // hintSwapJoinInputs (135x) + 57404: 57, // hintTimeRange (135x) + 57405: 58, // hintUseCascades (135x) + 57399: 59, // hintUseIndex (135x) + 57398: 60, // hintUseIndexMerge (135x) + 57402: 61, // hintUsePlanCache (135x) + 57403: 62, // hintUseToja (135x) + 44: 63, // ',' (132x) + 57422: 64, // hintDupsWeedOut (112x) + 57423: 65, // hintFirstMatch (112x) + 57424: 66, // hintLooseScan (112x) + 57425: 67, // hintMaterialization (112x) + 57417: 68, // hintTiFlash (112x) + 57416: 69, // hintTiKV (112x) + 57418: 70, // hintFalse (111x) + 57413: 71, // hintOLAP (111x) + 57414: 72, // hintOLTP (111x) + 57419: 73, // hintTrue (111x) + 57421: 74, // hintGB (110x) + 57420: 75, // hintMB (110x) + 57347: 76, // hintIdentifier (109x) + 57349: 77, // hintSingleAtIdentifier (95x) + 93: 78, // ']' (86x) + 46: 79, // '.' (85x) + 57415: 80, // hintPartition (80x) + 61: 81, // '=' (76x) + 40: 82, // '(' (71x) + 57344: 83, // $end (25x) + 57446: 84, // QueryBlockOpt (20x) + 57438: 85, // Identifier (15x) + 57346: 86, // hintIntLit (8x) + 57350: 87, // hintStringLit (5x) + 57428: 88, // CommaOpt (4x) + 57434: 89, // HintTable (4x) + 57435: 90, // HintTableList (4x) + 91: 91, // '[' (3x) + 57427: 92, // BooleanHintName (2x) + 57429: 93, // HintIndexList (2x) + 57431: 94, // HintStorageType (2x) + 57432: 95, // HintStorageTypeAndTable (2x) + 57436: 96, // HintTableListOpt (2x) + 57441: 97, // JoinOrderOptimizerHintName (2x) + 57442: 98, // NullaryHintName (2x) + 57445: 99, // PartitionListOpt (2x) + 57448: 100, // StorageOptimizerHintOpt (2x) + 57449: 101, // SubqueryOptimizerHintName (2x) + 57452: 102, // SubqueryStrategy (2x) + 57453: 103, // SupportedIndexLevelOptimizerHintName (2x) + 57454: 104, // SupportedTableLevelOptimizerHintName (2x) + 57455: 105, // TableOptimizerHintOpt (2x) + 57457: 106, // UnsupportedIndexLevelOptimizerHintName (2x) + 57458: 107, // UnsupportedTableLevelOptimizerHintName (2x) + 57460: 108, // ViewName (2x) + 57430: 109, // HintQueryType (1x) + 57433: 110, // HintStorageTypeAndTableList (1x) + 57437: 111, // HintTrueOrFalse (1x) + 57439: 112, // IndexNameList (1x) + 57440: 113, // IndexNameListOpt (1x) + 57443: 114, // OptimizerHintList (1x) + 57444: 115, // PartitionList (1x) + 57447: 116, // Start (1x) + 57450: 117, // SubqueryStrategies (1x) + 57451: 118, // SubqueryStrategiesOpt (1x) + 57456: 119, // UnitOfBytes (1x) + 57459: 120, // Value (1x) + 57461: 121, // ViewNameList (1x) + 57426: 122, // $default (0x) + 57345: 123, // error (0x) + 57348: 124, // hintInvalid (0x) } yyhintSymNames = []string{ @@ -291,11 +295,13 @@ var ( "hintNoIndexMerge", "hintNoMerge", "hintNoMRR", + "hintNoOrderIndex", "hintNoRangeOptimization", "hintNoSemijoin", "hintNoSkipScan", "hintNoSwapJoinInputs", "hintNthPlan", + "hintOrderIndex", "hintQBName", "hintQueryType", "hintReadConsistentReplica", @@ -382,89 +388,76 @@ var ( yyhintReductions = []struct{ xsym, components int }{ {0, 1}, + {116, 1}, {114, 1}, - {112, 1}, - {112, 3}, - {112, 1}, - {112, 3}, - {103, 4}, - {103, 4}, - {103, 4}, - {103, 4}, - {103, 4}, - {103, 4}, - {103, 5}, - {103, 5}, - {103, 5}, - {103, 6}, - {103, 4}, - {103, 4}, - {103, 6}, - {103, 6}, - {103, 6}, - {103, 5}, - {103, 4}, - {103, 5}, - {98, 5}, - {108, 1}, - {108, 3}, - {93, 4}, - {82, 0}, - {82, 1}, - {86, 0}, - {86, 1}, - {97, 0}, - {97, 4}, - {113, 1}, - {113, 3}, - {94, 1}, - {94, 1}, - {88, 2}, - {88, 3}, - {87, 3}, - {87, 5}, - {119, 3}, - {119, 1}, - {106, 2}, - {106, 1}, - {91, 4}, - {111, 0}, - {111, 1}, + {114, 3}, + {114, 1}, + {114, 3}, + {105, 4}, + {105, 4}, + {105, 4}, + {105, 4}, + {105, 4}, + {105, 4}, + {105, 5}, + {105, 5}, + {105, 5}, + {105, 6}, + {105, 4}, + {105, 4}, + {105, 6}, + {105, 6}, + {105, 6}, + {105, 5}, + {105, 4}, + {105, 5}, + {100, 5}, {110, 1}, {110, 3}, - {116, 0}, - {116, 1}, + {95, 4}, + {84, 0}, + {84, 1}, + {88, 0}, + {88, 1}, + {99, 0}, + {99, 4}, {115, 1}, {115, 3}, + {96, 1}, + {96, 1}, + {90, 2}, + {90, 3}, + {89, 3}, + {89, 5}, + {121, 3}, + {121, 1}, + {108, 2}, + {108, 1}, + {93, 4}, + {113, 0}, + {113, 1}, + {112, 1}, + {112, 3}, + {118, 0}, {118, 1}, - {118, 1}, - {118, 1}, - {117, 1}, {117, 1}, - {109, 1}, - {109, 1}, - {95, 1}, - {95, 1}, - {95, 1}, - {105, 1}, - {105, 1}, - {105, 1}, - {105, 1}, - {105, 1}, - {105, 1}, - {102, 1}, - {102, 1}, - {102, 1}, - {102, 1}, - {102, 1}, - {102, 1}, - {102, 1}, - {102, 1}, - {102, 1}, - {102, 1}, - {102, 1}, - {102, 1}, - {102, 1}, + {117, 3}, + {120, 1}, + {120, 1}, + {120, 1}, + {119, 1}, + {119, 1}, + {111, 1}, + {111, 1}, + {97, 1}, + {97, 1}, + {97, 1}, + {107, 1}, + {107, 1}, + {107, 1}, + {107, 1}, + {107, 1}, + {107, 1}, {104, 1}, {104, 1}, {104, 1}, @@ -472,449 +465,471 @@ var ( {104, 1}, {104, 1}, {104, 1}, + {104, 1}, + {104, 1}, + {104, 1}, + {104, 1}, + {104, 1}, + {104, 1}, + {106, 1}, + {106, 1}, + {106, 1}, + {106, 1}, + {106, 1}, + {106, 1}, + {106, 1}, + {103, 1}, + {103, 1}, + {103, 1}, + {103, 1}, + {103, 1}, + {103, 1}, {101, 1}, {101, 1}, - {101, 1}, - {101, 1}, - {99, 1}, - {99, 1}, - {100, 1}, - {100, 1}, - {100, 1}, - {100, 1}, - {90, 1}, - {90, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {107, 1}, - {107, 1}, + {102, 1}, + {102, 1}, + {102, 1}, + {102, 1}, {92, 1}, {92, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, - {83, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {109, 1}, + {109, 1}, + {94, 1}, + {94, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, + {85, 1}, } yyhintXErrors = map[yyhintXError]string{} - yyhintParseTab = [280][]uint16{ + yyhintParseTab = [284][]uint16{ // 0 - {1: 258, 226, 219, 221, 248, 254, 234, 235, 236, 246, 262, 238, 230, 228, 233, 198, 216, 217, 218, 237, 259, 205, 210, 229, 255, 256, 239, 220, 222, 265, 223, 241, 260, 224, 240, 242, 250, 244, 232, 206, 209, 214, 261, 215, 208, 249, 264, 207, 227, 243, 225, 263, 257, 231, 211, 252, 245, 247, 253, 251, 90: 212, 95: 199, 213, 98: 197, 204, 101: 203, 201, 196, 202, 200, 112: 195, 114: 194}, - {81: 193}, - {1: 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 361, 81: 192, 86: 470}, - {1: 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 81: 191}, - {1: 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 81: 189}, + {1: 264, 230, 223, 225, 252, 260, 238, 239, 240, 250, 268, 242, 234, 232, 237, 202, 220, 221, 222, 241, 265, 209, 214, 233, 261, 262, 243, 224, 226, 271, 227, 245, 266, 228, 244, 254, 246, 256, 248, 236, 210, 253, 213, 218, 267, 219, 212, 255, 270, 211, 231, 247, 229, 269, 263, 235, 215, 258, 249, 251, 259, 257, 92: 216, 97: 203, 217, 100: 201, 208, 103: 207, 205, 200, 206, 204, 114: 199, 116: 198}, + {83: 197}, + {1: 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 369, 83: 196, 88: 478}, + {1: 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 83: 195}, + {1: 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 83: 193}, // 5 - {80: 467}, - {80: 464}, - {80: 461}, - {80: 456}, - {80: 453}, + {82: 475}, + {82: 472}, + {82: 469}, + {82: 464}, + {82: 461}, // 10 - {80: 442}, - {80: 430}, - {80: 426}, - {80: 422}, - {80: 414}, + {82: 450}, + {82: 438}, + {82: 434}, + {82: 430}, + {82: 422}, // 15 - {80: 411}, - {80: 399}, - {80: 392}, - {80: 387}, - {80: 381}, + {82: 419}, + {82: 407}, + {82: 400}, + {82: 395}, + {82: 389}, // 20 - {80: 378}, - {80: 372}, - {80: 266}, - {80: 131}, - {80: 130}, + {82: 386}, + {82: 380}, + {82: 272}, + {82: 135}, + {82: 134}, // 25 - {80: 129}, - {80: 128}, - {80: 127}, - {80: 126}, - {80: 125}, + {82: 133}, + {82: 132}, + {82: 131}, + {82: 130}, + {82: 129}, // 30 - {80: 124}, - {80: 123}, - {80: 122}, - {80: 121}, - {80: 120}, + {82: 128}, + {82: 127}, + {82: 126}, + {82: 125}, + {82: 124}, // 35 - {80: 119}, - {80: 118}, - {80: 117}, - {80: 116}, - {80: 115}, + {82: 123}, + {82: 122}, + {82: 121}, + {82: 120}, + {82: 119}, // 40 - {80: 114}, - {80: 113}, - {80: 112}, - {80: 111}, - {80: 110}, + {82: 118}, + {82: 117}, + {82: 116}, + {82: 115}, + {82: 114}, // 45 - {80: 109}, - {80: 108}, - {80: 107}, - {80: 106}, - {80: 105}, + {82: 113}, + {82: 112}, + {82: 111}, + {82: 110}, + {82: 109}, // 50 - {80: 104}, - {80: 103}, - {80: 102}, - {80: 101}, - {80: 100}, + {82: 108}, + {82: 107}, + {82: 106}, + {82: 105}, + {82: 104}, // 55 - {80: 99}, - {80: 98}, - {80: 97}, - {80: 92}, - {80: 91}, + {82: 103}, + {82: 102}, + {82: 101}, + {82: 100}, + {82: 99}, // 60 - {80: 90}, - {80: 89}, - {80: 88}, - {80: 87}, - {80: 86}, + {82: 94}, + {82: 93}, + {82: 92}, + {82: 91}, + {82: 90}, // 65 - {80: 85}, - {80: 84}, - {80: 83}, - {80: 82}, - {80: 81}, + {82: 89}, + {82: 88}, + {82: 87}, + {82: 86}, + {82: 85}, // 70 - {80: 80}, - {80: 79}, - {80: 78}, - {66: 165, 165, 75: 268, 82: 267}, - {66: 273, 272, 92: 271, 270, 108: 269}, + {82: 84}, + {82: 83}, + {82: 82}, + {82: 81}, + {82: 80}, // 75 - {164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 76: 164, 164, 164, 84: 164}, - {369, 61: 370}, - {168, 61: 168}, - {89: 274}, - {89: 75}, + {68: 169, 169, 77: 274, 84: 273}, + {68: 279, 278, 94: 277, 276, 110: 275}, + {168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 78: 168, 168, 168, 86: 168}, + {377, 63: 378}, + {172, 63: 172}, // 80 - {89: 74}, - {1: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 62: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 268, 82: 276, 88: 275}, - {61: 367, 76: 366}, - {1: 308, 324, 284, 286, 335, 311, 288, 289, 290, 314, 310, 294, 315, 316, 317, 280, 281, 282, 283, 337, 309, 304, 318, 292, 312, 313, 296, 285, 287, 339, 291, 298, 295, 293, 297, 299, 303, 301, 319, 334, 307, 320, 321, 322, 306, 302, 338, 305, 325, 300, 323, 336, 326, 327, 332, 333, 329, 328, 330, 331, 62: 348, 349, 350, 351, 343, 342, 344, 340, 341, 345, 347, 346, 279, 83: 278, 87: 277}, - {155, 61: 155, 76: 155}, + {91: 280}, + {91: 77}, + {91: 76}, + {1: 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 64: 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 274, 84: 282, 90: 281}, + {63: 375, 78: 374}, // 85 - {165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 268, 165, 353, 165, 82: 352}, - {73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73}, - {72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72}, - {71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71}, - {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {1: 314, 330, 290, 292, 343, 317, 294, 295, 296, 320, 316, 300, 321, 322, 323, 286, 287, 288, 289, 345, 315, 310, 324, 298, 318, 319, 302, 291, 293, 347, 297, 304, 301, 299, 303, 337, 305, 309, 307, 325, 342, 336, 313, 326, 327, 328, 312, 308, 346, 311, 331, 306, 329, 344, 332, 333, 340, 341, 335, 334, 338, 339, 64: 356, 357, 358, 359, 351, 350, 352, 348, 349, 353, 355, 354, 285, 85: 284, 89: 283}, + {159, 63: 159, 78: 159}, + {169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 274, 169, 361, 169, 84: 360}, + {75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75}, + {74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74}, // 90 - {69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69}, - {68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, - {67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67}, - {66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66}, - {65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65}, + {73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73}, + {72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72}, + {71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69}, // 95 - {64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, - {63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}, - {62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62}, - {61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61}, - {60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60}, + {68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, + {67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67}, + {66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66}, + {65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65}, + {64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, // 100 - {59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59}, - {58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58}, - {57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57}, - {56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56}, - {55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55}, + {63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}, + {62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62}, + {61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61}, + {60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60}, + {59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59}, // 105 - {54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54}, - {53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53}, - {52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52}, - {51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51}, - {50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50}, + {58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58}, + {57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57}, + {56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56}, + {55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55}, + {54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54}, // 110 - {49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49}, - {48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48}, - {47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47}, - {46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46}, - {45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45}, + {53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53}, + {52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52}, + {51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51}, + {50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50}, + {49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49}, // 115 - {44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44}, - {43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43}, - {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42}, - {41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41}, - {40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}, + {48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48}, + {47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47}, + {46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46}, + {45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45}, + {44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44}, // 120 - {39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39}, - {38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38}, - {37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37}, - {36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36}, - {35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35}, + {43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43}, + {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42}, + {41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41}, + {40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}, + {39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39}, // 125 - {34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34}, - {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, 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, 33, 33, 33, 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, 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, 32, 32, 32, 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, 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, 31, 31, 31, 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, 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, 30, 30, 30, 30}, + {38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38}, + {37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37}, + {36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36}, + {35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35}, + {34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34}, // 130 - {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, 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, 29, 29, 29, 29}, - {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, 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, 28, 28, 28, 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, 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, 27, 27, 27, 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, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 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, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25}, + {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, 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, 33, 33, 33, 33, 33, 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, 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, 32, 32, 32, 32, 32, 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, 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, 31, 31, 31, 31, 31, 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, 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, 30, 30, 30, 30, 30, 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, 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, 29, 29, 29, 29, 29, 29}, // 135 - {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, 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, 24, 24, 24, 24}, - {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, 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, 23, 23, 23, 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, 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, 22, 22, 22, 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, 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, 21, 21, 21, 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, 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, 20, 20, 20, 20}, + {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, 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, 28, 28, 28, 28, 28, 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, 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, 27, 27, 27, 27, 27, 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, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 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, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 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, 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, 24, 24, 24, 24, 24, 24}, // 140 - {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, 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, 19, 19, 19, 19}, - {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, 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, 18, 18, 18, 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, 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, 17, 17, 17, 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, 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, 16, 16, 16, 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, 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, 15, 15, 15, 15}, + {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, 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, 23, 23, 23, 23, 23, 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, 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, 22, 22, 22, 22, 22, 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, 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, 21, 21, 21, 21, 21, 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, 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, 20, 20, 20, 20, 20, 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, 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, 19, 19, 19, 19, 19, 19}, // 145 - {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, 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, 14, 14, 14, 14}, - {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, 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, 13, 13, 13, 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, 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, 12, 12, 12, 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, 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, 11, 11, 11, 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, 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, 10, 10, 10, 10}, + {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, 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, 18, 18, 18, 18, 18, 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, 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, 17, 17, 17, 17, 17, 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, 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, 16, 16, 16, 16, 16, 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, 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, 15, 15, 15, 15, 15, 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, 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, 14, 14, 14, 14, 14, 14}, // 150 - {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, 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, 9, 9, 9, 9}, - {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, 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, 8, 8, 8, 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, 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, 7, 7, 7, 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, 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, 6, 6, 6, 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, 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, 5, 5, 5, 5}, + {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, 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, 13, 13, 13, 13, 13, 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, 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, 12, 12, 12, 12, 12, 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, 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, 11, 11, 11, 11, 11, 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, 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, 10, 10, 10, 10, 10, 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, 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, 9, 9, 9, 9, 9, 9}, // 155 - {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, 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, 4, 4, 4, 4}, - {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, 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, 3, 3, 3, 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, 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, 2, 2, 2, 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, 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, 1, 1, 1, 1}, - {161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 76: 161, 78: 356, 97: 365}, + {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, 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, 8, 8, 8, 8, 8, 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, 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, 7, 7, 7, 7, 7, 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, 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, 6, 6, 6, 6, 6, 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, 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, 5, 5, 5, 5, 5, 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, 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, 4, 4, 4, 4, 4, 4}, // 160 - {1: 308, 324, 284, 286, 335, 311, 288, 289, 290, 314, 310, 294, 315, 316, 317, 280, 281, 282, 283, 337, 309, 304, 318, 292, 312, 313, 296, 285, 287, 339, 291, 298, 295, 293, 297, 299, 303, 301, 319, 334, 307, 320, 321, 322, 306, 302, 338, 305, 325, 300, 323, 336, 326, 327, 332, 333, 329, 328, 330, 331, 62: 348, 349, 350, 351, 343, 342, 344, 340, 341, 345, 347, 346, 279, 83: 354}, - {165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 268, 165, 78: 165, 82: 355}, - {161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 76: 161, 78: 356, 97: 357}, - {80: 358}, - {152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 76: 152}, + {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, 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, 3, 3, 3, 3, 3, 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, 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, 2, 2, 2, 2, 2, 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, 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, 1, 1, 1, 1, 1, 1}, + {165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 78: 165, 80: 364, 99: 373}, + {1: 314, 330, 290, 292, 343, 317, 294, 295, 296, 320, 316, 300, 321, 322, 323, 286, 287, 288, 289, 345, 315, 310, 324, 298, 318, 319, 302, 291, 293, 347, 297, 304, 301, 299, 303, 337, 305, 309, 307, 325, 342, 336, 313, 326, 327, 328, 312, 308, 346, 311, 331, 306, 329, 344, 332, 333, 340, 341, 335, 334, 338, 339, 64: 356, 357, 358, 359, 351, 350, 352, 348, 349, 353, 355, 354, 285, 85: 362}, // 165 - {1: 308, 324, 284, 286, 335, 311, 288, 289, 290, 314, 310, 294, 315, 316, 317, 280, 281, 282, 283, 337, 309, 304, 318, 292, 312, 313, 296, 285, 287, 339, 291, 298, 295, 293, 297, 299, 303, 301, 319, 334, 307, 320, 321, 322, 306, 302, 338, 305, 325, 300, 323, 336, 326, 327, 332, 333, 329, 328, 330, 331, 62: 348, 349, 350, 351, 343, 342, 344, 340, 341, 345, 347, 346, 279, 83: 360, 113: 359}, - {362, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 361, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 86: 363}, - {159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159}, - {162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 62: 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 85: 162}, - {160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 76: 160}, + {169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 274, 169, 80: 169, 84: 363}, + {165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 78: 165, 80: 364, 99: 365}, + {82: 366}, + {156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 78: 156}, + {1: 314, 330, 290, 292, 343, 317, 294, 295, 296, 320, 316, 300, 321, 322, 323, 286, 287, 288, 289, 345, 315, 310, 324, 298, 318, 319, 302, 291, 293, 347, 297, 304, 301, 299, 303, 337, 305, 309, 307, 325, 342, 336, 313, 326, 327, 328, 312, 308, 346, 311, 331, 306, 329, 344, 332, 333, 340, 341, 335, 334, 338, 339, 64: 356, 357, 358, 359, 351, 350, 352, 348, 349, 353, 355, 354, 285, 85: 368, 115: 367}, // 170 - {1: 308, 324, 284, 286, 335, 311, 288, 289, 290, 314, 310, 294, 315, 316, 317, 280, 281, 282, 283, 337, 309, 304, 318, 292, 312, 313, 296, 285, 287, 339, 291, 298, 295, 293, 297, 299, 303, 301, 319, 334, 307, 320, 321, 322, 306, 302, 338, 305, 325, 300, 323, 336, 326, 327, 332, 333, 329, 328, 330, 331, 62: 348, 349, 350, 351, 343, 342, 344, 340, 341, 345, 347, 346, 279, 83: 364}, - {158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158}, - {153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 76: 153}, - {166, 61: 166}, - {1: 308, 324, 284, 286, 335, 311, 288, 289, 290, 314, 310, 294, 315, 316, 317, 280, 281, 282, 283, 337, 309, 304, 318, 292, 312, 313, 296, 285, 287, 339, 291, 298, 295, 293, 297, 299, 303, 301, 319, 334, 307, 320, 321, 322, 306, 302, 338, 305, 325, 300, 323, 336, 326, 327, 332, 333, 329, 328, 330, 331, 62: 348, 349, 350, 351, 343, 342, 344, 340, 341, 345, 347, 346, 279, 83: 278, 87: 368}, + {370, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 369, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 88: 371}, + {163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163}, + {166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 64: 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 87: 166}, + {164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 78: 164}, + {1: 314, 330, 290, 292, 343, 317, 294, 295, 296, 320, 316, 300, 321, 322, 323, 286, 287, 288, 289, 345, 315, 310, 324, 298, 318, 319, 302, 291, 293, 347, 297, 304, 301, 299, 303, 337, 305, 309, 307, 325, 342, 336, 313, 326, 327, 328, 312, 308, 346, 311, 331, 306, 329, 344, 332, 333, 340, 341, 335, 334, 338, 339, 64: 356, 357, 358, 359, 351, 350, 352, 348, 349, 353, 355, 354, 285, 85: 372}, // 175 - {154, 61: 154, 76: 154}, - {1: 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 81: 169}, - {66: 273, 272, 92: 271, 371}, - {167, 61: 167}, - {69: 165, 165, 75: 268, 82: 373}, + {162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162}, + {157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 78: 157}, + {170, 63: 170}, + {1: 314, 330, 290, 292, 343, 317, 294, 295, 296, 320, 316, 300, 321, 322, 323, 286, 287, 288, 289, 345, 315, 310, 324, 298, 318, 319, 302, 291, 293, 347, 297, 304, 301, 299, 303, 337, 305, 309, 307, 325, 342, 336, 313, 326, 327, 328, 312, 308, 346, 311, 331, 306, 329, 344, 332, 333, 340, 341, 335, 334, 338, 339, 64: 356, 357, 358, 359, 351, 350, 352, 348, 349, 353, 355, 354, 285, 85: 284, 89: 376}, + {158, 63: 158, 78: 158}, // 180 - {69: 375, 376, 107: 374}, - {377}, - {77}, - {76}, - {1: 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 81: 170}, + {1: 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 83: 173}, + {68: 279, 278, 94: 277, 379}, + {171, 63: 171}, + {71: 169, 169, 77: 274, 84: 381}, + {71: 383, 384, 109: 382}, // 185 - {165, 75: 268, 82: 379}, - {380}, - {1: 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 81: 171}, - {68: 165, 71: 165, 75: 268, 82: 382}, - {68: 385, 71: 384, 109: 383}, + {385}, + {79}, + {78}, + {1: 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 83: 174}, + {169, 77: 274, 84: 387}, // 190 - {386}, - {133}, - {132}, - {1: 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 81: 172}, - {85: 388}, + {388}, + {1: 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 83: 175}, + {70: 169, 73: 169, 77: 274, 84: 390}, + {70: 393, 73: 392, 111: 391}, + {394}, // 195 - {61: 361, 85: 163, 389}, - {85: 390}, - {391}, - {1: 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 81: 173}, - {75: 268, 82: 393, 84: 165}, + {137}, + {136}, + {1: 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 83: 176}, + {87: 396}, + {63: 369, 87: 167, 397}, // 200 - {84: 394}, - {72: 397, 396, 117: 395}, - {398}, - {135}, - {134}, + {87: 398}, + {399}, + {1: 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 83: 177}, + {77: 274, 84: 401, 86: 169}, + {86: 402}, // 205 - {1: 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 81: 174}, - {1: 308, 324, 284, 286, 335, 311, 288, 289, 290, 314, 310, 294, 315, 316, 317, 280, 281, 282, 283, 337, 309, 304, 318, 292, 312, 313, 296, 285, 287, 339, 291, 298, 295, 293, 297, 299, 303, 301, 319, 334, 307, 320, 321, 322, 306, 302, 338, 305, 325, 300, 323, 336, 326, 327, 332, 333, 329, 328, 330, 331, 62: 348, 349, 350, 351, 343, 342, 344, 340, 341, 345, 347, 346, 279, 83: 400}, - {401, 61: 402}, - {1: 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 81: 176}, - {165, 308, 324, 284, 286, 335, 311, 288, 289, 290, 314, 310, 294, 315, 316, 317, 280, 281, 282, 283, 337, 309, 304, 318, 292, 312, 313, 296, 285, 287, 339, 291, 298, 295, 293, 297, 299, 303, 301, 319, 334, 307, 320, 321, 322, 306, 302, 338, 305, 325, 300, 323, 336, 326, 327, 332, 333, 329, 328, 330, 331, 62: 348, 349, 350, 351, 343, 342, 344, 340, 341, 345, 347, 346, 279, 268, 77: 165, 82: 406, 405, 106: 404, 119: 403}, + {74: 405, 404, 119: 403}, + {406}, + {139}, + {138}, + {1: 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 83: 178}, // 210 - {408, 77: 409}, - {150, 77: 150}, - {165, 75: 268, 77: 165, 82: 407}, - {148, 77: 148}, - {149, 77: 149}, + {1: 314, 330, 290, 292, 343, 317, 294, 295, 296, 320, 316, 300, 321, 322, 323, 286, 287, 288, 289, 345, 315, 310, 324, 298, 318, 319, 302, 291, 293, 347, 297, 304, 301, 299, 303, 337, 305, 309, 307, 325, 342, 336, 313, 326, 327, 328, 312, 308, 346, 311, 331, 306, 329, 344, 332, 333, 340, 341, 335, 334, 338, 339, 64: 356, 357, 358, 359, 351, 350, 352, 348, 349, 353, 355, 354, 285, 85: 408}, + {409, 63: 410}, + {1: 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 83: 180}, + {169, 314, 330, 290, 292, 343, 317, 294, 295, 296, 320, 316, 300, 321, 322, 323, 286, 287, 288, 289, 345, 315, 310, 324, 298, 318, 319, 302, 291, 293, 347, 297, 304, 301, 299, 303, 337, 305, 309, 307, 325, 342, 336, 313, 326, 327, 328, 312, 308, 346, 311, 331, 306, 329, 344, 332, 333, 340, 341, 335, 334, 338, 339, 64: 356, 357, 358, 359, 351, 350, 352, 348, 349, 353, 355, 354, 285, 274, 79: 169, 84: 414, 413, 108: 412, 121: 411}, + {416, 79: 417}, // 215 - {1: 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 81: 175}, - {165, 308, 324, 284, 286, 335, 311, 288, 289, 290, 314, 310, 294, 315, 316, 317, 280, 281, 282, 283, 337, 309, 304, 318, 292, 312, 313, 296, 285, 287, 339, 291, 298, 295, 293, 297, 299, 303, 301, 319, 334, 307, 320, 321, 322, 306, 302, 338, 305, 325, 300, 323, 336, 326, 327, 332, 333, 329, 328, 330, 331, 62: 348, 349, 350, 351, 343, 342, 344, 340, 341, 345, 347, 346, 279, 268, 77: 165, 82: 406, 405, 106: 410}, - {151, 77: 151}, - {1: 308, 324, 284, 286, 335, 311, 288, 289, 290, 314, 310, 294, 315, 316, 317, 280, 281, 282, 283, 337, 309, 304, 318, 292, 312, 313, 296, 285, 287, 339, 291, 298, 295, 293, 297, 299, 303, 301, 319, 334, 307, 320, 321, 322, 306, 302, 338, 305, 325, 300, 323, 336, 326, 327, 332, 333, 329, 328, 330, 331, 62: 348, 349, 350, 351, 343, 342, 344, 340, 341, 345, 347, 346, 279, 83: 412}, - {413}, + {154, 79: 154}, + {169, 77: 274, 79: 169, 84: 415}, + {152, 79: 152}, + {153, 79: 153}, + {1: 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 83: 179}, // 220 - {1: 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 81: 177}, - {1: 308, 324, 284, 286, 335, 311, 288, 289, 290, 314, 310, 294, 315, 316, 317, 280, 281, 282, 283, 337, 309, 304, 318, 292, 312, 313, 296, 285, 287, 339, 291, 298, 295, 293, 297, 299, 303, 301, 319, 334, 307, 320, 321, 322, 306, 302, 338, 305, 325, 300, 323, 336, 326, 327, 332, 333, 329, 328, 330, 331, 62: 348, 349, 350, 351, 343, 342, 344, 340, 341, 345, 347, 346, 279, 83: 415}, - {79: 416}, - {1: 308, 324, 284, 286, 335, 311, 288, 289, 290, 314, 310, 294, 315, 316, 317, 280, 281, 282, 283, 337, 309, 304, 318, 292, 312, 313, 296, 285, 287, 339, 291, 298, 295, 293, 297, 299, 303, 301, 319, 334, 307, 320, 321, 322, 306, 302, 338, 305, 325, 300, 323, 336, 326, 327, 332, 333, 329, 328, 330, 331, 62: 348, 349, 350, 351, 343, 342, 344, 340, 341, 345, 347, 346, 279, 83: 419, 420, 418, 118: 417}, + {169, 314, 330, 290, 292, 343, 317, 294, 295, 296, 320, 316, 300, 321, 322, 323, 286, 287, 288, 289, 345, 315, 310, 324, 298, 318, 319, 302, 291, 293, 347, 297, 304, 301, 299, 303, 337, 305, 309, 307, 325, 342, 336, 313, 326, 327, 328, 312, 308, 346, 311, 331, 306, 329, 344, 332, 333, 340, 341, 335, 334, 338, 339, 64: 356, 357, 358, 359, 351, 350, 352, 348, 349, 353, 355, 354, 285, 274, 79: 169, 84: 414, 413, 108: 418}, + {155, 79: 155}, + {1: 314, 330, 290, 292, 343, 317, 294, 295, 296, 320, 316, 300, 321, 322, 323, 286, 287, 288, 289, 345, 315, 310, 324, 298, 318, 319, 302, 291, 293, 347, 297, 304, 301, 299, 303, 337, 305, 309, 307, 325, 342, 336, 313, 326, 327, 328, 312, 308, 346, 311, 331, 306, 329, 344, 332, 333, 340, 341, 335, 334, 338, 339, 64: 356, 357, 358, 359, 351, 350, 352, 348, 349, 353, 355, 354, 285, 85: 420}, {421}, + {1: 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 83: 181}, // 225 - {138}, - {137}, - {136}, - {1: 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 81: 178}, - {75: 268, 82: 423, 84: 165}, + {1: 314, 330, 290, 292, 343, 317, 294, 295, 296, 320, 316, 300, 321, 322, 323, 286, 287, 288, 289, 345, 315, 310, 324, 298, 318, 319, 302, 291, 293, 347, 297, 304, 301, 299, 303, 337, 305, 309, 307, 325, 342, 336, 313, 326, 327, 328, 312, 308, 346, 311, 331, 306, 329, 344, 332, 333, 340, 341, 335, 334, 338, 339, 64: 356, 357, 358, 359, 351, 350, 352, 348, 349, 353, 355, 354, 285, 85: 423}, + {81: 424}, + {1: 314, 330, 290, 292, 343, 317, 294, 295, 296, 320, 316, 300, 321, 322, 323, 286, 287, 288, 289, 345, 315, 310, 324, 298, 318, 319, 302, 291, 293, 347, 297, 304, 301, 299, 303, 337, 305, 309, 307, 325, 342, 336, 313, 326, 327, 328, 312, 308, 346, 311, 331, 306, 329, 344, 332, 333, 340, 341, 335, 334, 338, 339, 64: 356, 357, 358, 359, 351, 350, 352, 348, 349, 353, 355, 354, 285, 85: 427, 428, 426, 120: 425}, + {429}, + {142}, // 230 - {84: 424}, - {425}, - {1: 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 81: 179}, - {75: 268, 82: 427, 84: 165}, - {84: 428}, + {141}, + {140}, + {1: 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 83: 182}, + {77: 274, 84: 431, 86: 169}, + {86: 432}, // 235 - {429}, - {1: 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 81: 180}, - {165, 62: 165, 165, 165, 165, 75: 268, 82: 431}, - {142, 62: 435, 436, 437, 438, 100: 434, 115: 433, 432}, - {441}, + {433}, + {1: 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 83: 183}, + {77: 274, 84: 435, 86: 169}, + {86: 436}, + {437}, // 240 - {141, 61: 439}, - {140, 61: 140}, - {96, 61: 96}, - {95, 61: 95}, - {94, 61: 94}, + {1: 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 83: 184}, + {169, 64: 169, 169, 169, 169, 77: 274, 84: 439}, + {146, 64: 443, 444, 445, 446, 102: 442, 117: 441, 440}, + {449}, + {145, 63: 447}, // 245 - {93, 61: 93}, - {62: 435, 436, 437, 438, 100: 440}, - {139, 61: 139}, - {1: 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 81: 181}, - {1: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 62: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 268, 82: 444, 91: 443}, + {144, 63: 144}, + {98, 63: 98}, + {97, 63: 97}, + {96, 63: 96}, + {95, 63: 95}, // 250 - {452}, - {1: 308, 324, 284, 286, 335, 311, 288, 289, 290, 314, 310, 294, 315, 316, 317, 280, 281, 282, 283, 337, 309, 304, 318, 292, 312, 313, 296, 285, 287, 339, 291, 298, 295, 293, 297, 299, 303, 301, 319, 334, 307, 320, 321, 322, 306, 302, 338, 305, 325, 300, 323, 336, 326, 327, 332, 333, 329, 328, 330, 331, 62: 348, 349, 350, 351, 343, 342, 344, 340, 341, 345, 347, 346, 279, 83: 278, 87: 445}, - {163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 361, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 86: 446}, - {146, 308, 324, 284, 286, 335, 311, 288, 289, 290, 314, 310, 294, 315, 316, 317, 280, 281, 282, 283, 337, 309, 304, 318, 292, 312, 313, 296, 285, 287, 339, 291, 298, 295, 293, 297, 299, 303, 301, 319, 334, 307, 320, 321, 322, 306, 302, 338, 305, 325, 300, 323, 336, 326, 327, 332, 333, 329, 328, 330, 331, 62: 348, 349, 350, 351, 343, 342, 344, 340, 341, 345, 347, 346, 279, 83: 449, 110: 448, 447}, - {147}, + {64: 443, 444, 445, 446, 102: 448}, + {143, 63: 143}, + {1: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 83: 185}, + {1: 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 64: 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 274, 84: 452, 93: 451}, + {460}, // 255 - {145, 61: 450}, - {144, 61: 144}, - {1: 308, 324, 284, 286, 335, 311, 288, 289, 290, 314, 310, 294, 315, 316, 317, 280, 281, 282, 283, 337, 309, 304, 318, 292, 312, 313, 296, 285, 287, 339, 291, 298, 295, 293, 297, 299, 303, 301, 319, 334, 307, 320, 321, 322, 306, 302, 338, 305, 325, 300, 323, 336, 326, 327, 332, 333, 329, 328, 330, 331, 62: 348, 349, 350, 351, 343, 342, 344, 340, 341, 345, 347, 346, 279, 83: 451}, - {143, 61: 143}, - {1: 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 81: 182}, + {1: 314, 330, 290, 292, 343, 317, 294, 295, 296, 320, 316, 300, 321, 322, 323, 286, 287, 288, 289, 345, 315, 310, 324, 298, 318, 319, 302, 291, 293, 347, 297, 304, 301, 299, 303, 337, 305, 309, 307, 325, 342, 336, 313, 326, 327, 328, 312, 308, 346, 311, 331, 306, 329, 344, 332, 333, 340, 341, 335, 334, 338, 339, 64: 356, 357, 358, 359, 351, 350, 352, 348, 349, 353, 355, 354, 285, 85: 284, 89: 453}, + {167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 369, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 88: 454}, + {150, 314, 330, 290, 292, 343, 317, 294, 295, 296, 320, 316, 300, 321, 322, 323, 286, 287, 288, 289, 345, 315, 310, 324, 298, 318, 319, 302, 291, 293, 347, 297, 304, 301, 299, 303, 337, 305, 309, 307, 325, 342, 336, 313, 326, 327, 328, 312, 308, 346, 311, 331, 306, 329, 344, 332, 333, 340, 341, 335, 334, 338, 339, 64: 356, 357, 358, 359, 351, 350, 352, 348, 349, 353, 355, 354, 285, 85: 457, 112: 456, 455}, + {151}, + {149, 63: 458}, // 260 - {1: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 62: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 268, 82: 444, 91: 454}, - {455}, - {1: 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 81: 183}, - {165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 62: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 268, 82: 459, 88: 458, 94: 457}, - {460}, + {148, 63: 148}, + {1: 314, 330, 290, 292, 343, 317, 294, 295, 296, 320, 316, 300, 321, 322, 323, 286, 287, 288, 289, 345, 315, 310, 324, 298, 318, 319, 302, 291, 293, 347, 297, 304, 301, 299, 303, 337, 305, 309, 307, 325, 342, 336, 313, 326, 327, 328, 312, 308, 346, 311, 331, 306, 329, 344, 332, 333, 340, 341, 335, 334, 338, 339, 64: 356, 357, 358, 359, 351, 350, 352, 348, 349, 353, 355, 354, 285, 85: 459}, + {147, 63: 147}, + {1: 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 83: 186}, + {1: 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 64: 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 274, 84: 452, 93: 462}, // 265 - {157, 61: 367}, - {156, 308, 324, 284, 286, 335, 311, 288, 289, 290, 314, 310, 294, 315, 316, 317, 280, 281, 282, 283, 337, 309, 304, 318, 292, 312, 313, 296, 285, 287, 339, 291, 298, 295, 293, 297, 299, 303, 301, 319, 334, 307, 320, 321, 322, 306, 302, 338, 305, 325, 300, 323, 336, 326, 327, 332, 333, 329, 328, 330, 331, 62: 348, 349, 350, 351, 343, 342, 344, 340, 341, 345, 347, 346, 279, 83: 278, 87: 277}, - {1: 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 81: 184}, - {165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 62: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 268, 82: 459, 88: 458, 94: 462}, {463}, + {1: 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 83: 187}, + {169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 64: 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 274, 84: 467, 90: 466, 96: 465}, + {468}, + {161, 63: 375}, // 270 - {1: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 81: 185}, - {1: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 62: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 268, 82: 276, 88: 465}, - {466, 61: 367}, - {1: 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 81: 186}, - {165, 75: 268, 82: 468}, + {160, 314, 330, 290, 292, 343, 317, 294, 295, 296, 320, 316, 300, 321, 322, 323, 286, 287, 288, 289, 345, 315, 310, 324, 298, 318, 319, 302, 291, 293, 347, 297, 304, 301, 299, 303, 337, 305, 309, 307, 325, 342, 336, 313, 326, 327, 328, 312, 308, 346, 311, 331, 306, 329, 344, 332, 333, 340, 341, 335, 334, 338, 339, 64: 356, 357, 358, 359, 351, 350, 352, 348, 349, 353, 355, 354, 285, 85: 284, 89: 283}, + {1: 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 83: 188}, + {169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 64: 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 274, 84: 467, 90: 466, 96: 470}, + {471}, + {1: 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 83: 189}, // 275 - {469}, - {1: 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 81: 187}, - {1: 258, 226, 219, 221, 248, 254, 234, 235, 236, 246, 262, 238, 230, 228, 233, 198, 216, 217, 218, 237, 259, 205, 210, 229, 255, 256, 239, 220, 222, 265, 223, 241, 260, 224, 240, 242, 250, 244, 232, 206, 209, 214, 261, 215, 208, 249, 264, 207, 227, 243, 225, 263, 257, 231, 211, 252, 245, 247, 253, 251, 90: 212, 95: 199, 213, 98: 472, 204, 101: 203, 201, 471, 202, 200}, - {1: 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 81: 190}, - {1: 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 81: 188}, + {1: 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 64: 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 274, 84: 282, 90: 473}, + {474, 63: 375}, + {1: 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 83: 190}, + {169, 77: 274, 84: 476}, + {477}, + // 280 + {1: 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 83: 191}, + {1: 264, 230, 223, 225, 252, 260, 238, 239, 240, 250, 268, 242, 234, 232, 237, 202, 220, 221, 222, 241, 265, 209, 214, 233, 261, 262, 243, 224, 226, 271, 227, 245, 266, 228, 244, 254, 246, 256, 248, 236, 210, 253, 213, 218, 267, 219, 212, 255, 270, 211, 231, 247, 229, 269, 263, 235, 215, 258, 249, 251, 259, 257, 92: 216, 97: 203, 217, 100: 480, 208, 103: 207, 205, 479, 206, 204}, + {1: 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 83: 194}, + {1: 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 83: 192}, } ) @@ -954,7 +969,7 @@ func yyhintlex1(yylex yyhintLexer, lval *yyhintSymType) (n int) { } func yyhintParse(yylex yyhintLexer, parser *hintParser) int { - const yyError = 121 + const yyError = 123 yyEx, _ := yylex.(yyhintLexerEx) var yyn int diff --git a/parser/hintparser.y b/parser/hintparser.y index a2ccd21d2d401..0a29375be226d 100644 --- a/parser/hintparser.y +++ b/parser/hintparser.y @@ -103,6 +103,8 @@ import ( hintSwapJoinInputs "SWAP_JOIN_INPUTS" hintUseIndexMerge "USE_INDEX_MERGE" hintUseIndex "USE_INDEX" + hintOrderIndex "ORDER_INDEX" + hintNoOrderIndex "NO_ORDER_INDEX" hintUsePlanCache "USE_PLAN_CACHE" hintUseToja "USE_TOJA" hintTimeRange "TIME_RANGE" @@ -607,6 +609,8 @@ SupportedIndexLevelOptimizerHintName: | "IGNORE_INDEX" | "USE_INDEX_MERGE" | "FORCE_INDEX" +| "ORDER_INDEX" +| "NO_ORDER_INDEX" SubqueryOptimizerHintName: "SEMIJOIN" @@ -699,6 +703,8 @@ Identifier: | "SWAP_JOIN_INPUTS" | "USE_INDEX_MERGE" | "USE_INDEX" +| "ORDER_INDEX" +| "NO_ORDER_INDEX" | "USE_PLAN_CACHE" | "USE_TOJA" | "TIME_RANGE" diff --git a/parser/lexer.go b/parser/lexer.go index 0a172abfda027..01f1ef035914a 100644 --- a/parser/lexer.go +++ b/parser/lexer.go @@ -252,13 +252,17 @@ func (s *Scanner) Lex(v *yySymType) int { if tok == not && s.sqlMode.HasHighNotPrecedenceMode() { return not2 } - if tok == as && s.getNextToken() == of { + if (tok == as || tok == member) && s.getNextToken() == of { _, pos, lit = s.scan() v.ident = fmt.Sprintf("%s %s", v.ident, lit) - s.lastKeyword = asof s.lastScanOffset = pos.Offset v.offset = pos.Offset - return asof + if tok == as { + s.lastKeyword = asof + return asof + } + s.lastKeyword = memberof + return memberof } if tok == to { tok1, tok2 := s.getNextTwoTokens() diff --git a/parser/misc.go b/parser/misc.go index 372154e054867..87c0ef3dbde4c 100644 --- a/parser/misc.go +++ b/parser/misc.go @@ -153,6 +153,7 @@ var tokenMap = map[string]int{ "ANY": any, "APPROX_COUNT_DISTINCT": approxCountDistinct, "APPROX_PERCENTILE": approxPercentile, + "ARRAY": array, "AS": as, "ASC": asc, "ASCII": ascii, @@ -195,6 +196,7 @@ var tokenMap = map[string]int{ "BTREE": btree, "BUCKETS": buckets, "BUILTINS": builtins, + "BURSTABLE": burstable, "BY": by, "BYTE": byteType, "CACHE": cache, @@ -256,6 +258,7 @@ var tokenMap = map[string]int{ "CSV_NULL": csvNull, "CSV_SEPARATOR": csvSeparator, "CSV_TRIM_LAST_SEPARATORS": csvTrimLastSeparators, + "CURDATE": curDate, "CURRENT_DATE": currentDate, "CURRENT_ROLE": currentRole, "CURRENT_TIME": currentTime, @@ -289,6 +292,7 @@ var tokenMap = map[string]int{ "DEPTH": depth, "DESC": desc, "DESCRIBE": describe, + "DIGEST": digest, "DIRECTORY": directory, "DISABLE": disable, "DISABLED": disabled, @@ -408,6 +412,9 @@ var tokenMap = map[string]int{ "INVISIBLE": invisible, "INVOKER": invoker, "IO": io, + "RU_PER_SEC": ruRate, + "IO_READ_BANDWIDTH": ioReadBandwidth, + "IO_WRITE_BANDWIDTH": ioWriteBandwidth, "IPC": ipc, "IS": is, "ISOLATION": isolation, @@ -469,6 +476,7 @@ var tokenMap = map[string]int{ "MEDIUMINT": mediumIntType, "MEDIUMTEXT": mediumtextType, "MEMORY": memory, + "MEMBER": member, "MERGE": merge, "MICROSECOND": microsecond, "MIN_ROWS": minRows, @@ -593,6 +601,7 @@ var tokenMap = map[string]int{ "REQUIRE": require, "REQUIRED": required, "RESET": reset, + "RESOURCE": resource, "RESPECT": respect, "RESTART": restart, "RESTORE": restore, @@ -706,6 +715,7 @@ var tokenMap = map[string]int{ "SUBSTRING": substring, "SUM": sum, "SUPER": super, + "SURVIVAL_PREFERENCES": survivalPreferences, "SWAPS": swaps, "SWITCHES": switchesSym, "SYSTEM": system, @@ -726,6 +736,7 @@ var tokenMap = map[string]int{ "THEN": then, "TIDB": tidb, "TIDB_CURRENT_TSO": tidbCurrentTSO, + "TIDB_JSON": tidbJson, "TIFLASH": tiFlash, "TIKV_IMPORTER": tikvImporter, "TIME": timeType, @@ -759,6 +770,9 @@ var tokenMap = map[string]int{ "TRUE": trueKwd, "TRUNCATE": truncate, "TRUE_CARD_COST": trueCardCost, + "TTL": ttl, + "TTL_ENABLE": ttlEnable, + "TTL_JOB_INTERVAL": ttlJobInterval, "TYPE": tp, "UNBOUNDED": unbounded, "UNCOMMITTED": uncommitted, @@ -810,6 +824,9 @@ var tokenMap = map[string]int{ "YEAR": yearType, "ZEROFILL": zerofill, "WAIT": wait, + "FAILED_LOGIN_ATTEMPTS": failedLoginAttempts, + "PASSWORD_LOCK_TIME": passwordLockTime, + "REUSE": reuse, } // See https://dev.mysql.com/doc/refman/5.7/en/function-resolution.html for details. @@ -942,6 +959,8 @@ var hintTokenMap = map[string]int{ "SWAP_JOIN_INPUTS": hintSwapJoinInputs, "USE_INDEX_MERGE": hintUseIndexMerge, "USE_INDEX": hintUseIndex, + "ORDER_INDEX": hintOrderIndex, + "NO_ORDER_INDEX": hintNoOrderIndex, "USE_PLAN_CACHE": hintUsePlanCache, "USE_TOJA": hintUseToja, "TIME_RANGE": hintTimeRange, diff --git a/parser/model/BUILD.bazel b/parser/model/BUILD.bazel index f3f214ce29eeb..5387516deaf94 100644 --- a/parser/model/BUILD.bazel +++ b/parser/model/BUILD.bazel @@ -31,6 +31,7 @@ go_test( deps = [ "//parser/charset", "//parser/mysql", + "//parser/terror", "//parser/types", "@com_github_stretchr_testify//require", ], diff --git a/parser/model/ddl.go b/parser/model/ddl.go index 8a8acaa292666..36ada1ed9b3ea 100644 --- a/parser/model/ddl.go +++ b/parser/model/ddl.go @@ -98,6 +98,12 @@ const ( ActionMultiSchemaChange ActionType = 61 ActionFlashbackCluster ActionType = 62 ActionRecoverSchema ActionType = 63 + ActionReorganizePartition ActionType = 64 + ActionAlterTTLInfo ActionType = 65 + ActionAlterTTLRemove ActionType = 67 + ActionCreateResourceGroup ActionType = 68 + ActionAlterResourceGroup ActionType = 69 + ActionDropResourceGroup ActionType = 70 ) var actionMap = map[ActionType]string{ @@ -160,6 +166,12 @@ var actionMap = map[ActionType]string{ ActionMultiSchemaChange: "alter table multi-schema change", ActionFlashbackCluster: "flashback cluster", ActionRecoverSchema: "flashback schema", + ActionReorganizePartition: "alter table reorganize partition", + ActionAlterTTLInfo: "alter table ttl", + ActionAlterTTLRemove: "alter table no_ttl", + ActionCreateResourceGroup: "create resource group", + ActionAlterResourceGroup: "alter resource group", + ActionDropResourceGroup: "drop resource group", // `ActionAlterTableAlterPartition` is removed and will never be used. // Just left a tombstone here for compatibility. @@ -225,6 +237,7 @@ type DDLReorgMeta struct { WarningsCount map[errors.ErrorID]int64 `json:"warnings_count"` Location *TimeZoneLocation `json:"location"` ReorgTp ReorgType `json:"reorg_tp"` + IsDistReorg bool `json:"is_dist_reorg"` } // ReorgType indicates which process is used for the data reorganization. @@ -310,12 +323,19 @@ type MultiSchemaInfo struct { AddIndexes []CIStr `json:"-"` DropIndexes []CIStr `json:"-"` AlterIndexes []CIStr `json:"-"` - ForeignKeys []CIStr `json:"-"` + + AddForeignKeys []AddForeignKeyInfo `json:"-"` RelativeColumns []CIStr `json:"-"` PositionColumns []CIStr `json:"-"` } +// AddForeignKeyInfo contains foreign key information. +type AddForeignKeyInfo struct { + Name CIStr + Cols []CIStr +} + // NewMultiSchemaInfo new a MultiSchemaInfo. func NewMultiSchemaInfo() *MultiSchemaInfo { return &MultiSchemaInfo{ @@ -337,6 +357,7 @@ type SubJob struct { Warning *terror.Error `json:"warning"` CtxVars []interface{} `json:"-"` SchemaVer int64 `json:"schema_version"` + ReorgTp ReorgType `json:"reorg_tp"` } // IsNormal returns true if the sub-job is normally running. @@ -399,6 +420,49 @@ func (sub *SubJob) FromProxyJob(proxyJob *Job, ver int64) { sub.Warning = proxyJob.Warning sub.RowCount = proxyJob.RowCount sub.SchemaVer = ver + sub.ReorgTp = proxyJob.ReorgMeta.ReorgTp +} + +// JobMeta is meta info of Job. +type JobMeta struct { + SchemaID int64 `json:"schema_id"` + TableID int64 `json:"table_id"` + // Type is the DDL job's type. + Type ActionType `json:"job_type"` + // Query is the DDL job's SQL string. + Query string `json:"query"` + // Priority is only used to set the operation priority of adding indices. + Priority int `json:"priority"` +} + +// BackfillMeta is meta info of the backfill job. +type BackfillMeta struct { + IsUnique bool `json:"is_unique"` + EndInclude bool `json:"end_include"` + Error *terror.Error `json:"err"` + + SQLMode mysql.SQLMode `json:"sql_mode"` + Warnings map[errors.ErrorID]*terror.Error `json:"warnings"` + WarningsCount map[errors.ErrorID]int64 `json:"warnings_count"` + Location *TimeZoneLocation `json:"location"` + ReorgTp ReorgType `json:"reorg_tp"` + RowCount int64 `json:"row_count"` + StartKey []byte `json:"start_key"` + EndKey []byte `json:"end_key"` + CurrKey []byte `json:"curr_key"` + *JobMeta `json:"job_meta"` +} + +// Encode encodes BackfillMeta with json format. +func (bm *BackfillMeta) Encode() ([]byte, error) { + b, err := json.Marshal(bm) + return b, errors.Trace(err) +} + +// Decode decodes BackfillMeta from the json buffer. +func (bm *BackfillMeta) Decode(b []byte) error { + err := json.Unmarshal(b, bm) + return errors.Trace(err) } // Job is for a DDL operation. @@ -536,13 +600,18 @@ func (job *Job) GetRowCount() int64 { // SetWarnings sets the warnings of rows handled. func (job *Job) SetWarnings(warnings map[errors.ErrorID]*terror.Error, warningsCount map[errors.ErrorID]int64) { + job.Mu.Lock() job.ReorgMeta.Warnings = warnings job.ReorgMeta.WarningsCount = warningsCount + job.Mu.Unlock() } // GetWarnings gets the warnings of the rows handled. func (job *Job) GetWarnings() (map[errors.ErrorID]*terror.Error, map[errors.ErrorID]int64) { - return job.ReorgMeta.Warnings, job.ReorgMeta.WarningsCount + job.Mu.Lock() + w, wc := job.ReorgMeta.Warnings, job.ReorgMeta.WarningsCount + job.Mu.Unlock() + return w, wc } // Encode encodes job with json format. @@ -609,6 +678,10 @@ func (job *Job) String() string { rowCount := job.GetRowCount() ret := fmt.Sprintf("ID:%d, Type:%s, State:%s, SchemaState:%s, SchemaID:%d, TableID:%d, RowCount:%d, ArgLen:%d, start time: %v, Err:%v, ErrCount:%d, SnapshotVersion:%v", job.ID, job.Type, job.State, job.SchemaState, job.SchemaID, job.TableID, rowCount, len(job.Args), TSConvert2Time(job.StartTS), job.Error, job.ErrorCount, job.SnapshotVer) + if job.ReorgMeta != nil { + warnings, _ := job.GetWarnings() + ret += fmt.Sprintf(", UniqueWarnings:%d", len(warnings)) + } if job.Type != ActionMultiSchemaChange && job.MultiSchemaInfo != nil { ret += fmt.Sprintf(", Multi-Schema Change:true, Revertible:%v", job.MultiSchemaInfo.Revertible) } @@ -882,6 +955,30 @@ func (s JobState) String() string { } } +// StrToJobState converts string to JobState. +func StrToJobState(s string) JobState { + switch s { + case "running": + return JobStateRunning + case "rollingback": + return JobStateRollingback + case "rollback done": + return JobStateRollbackDone + case "done": + return JobStateDone + case "cancelled": + return JobStateCancelled + case "cancelling": + return JobStateCancelling + case "synced": + return JobStateSynced + case "queueing": + return JobStateQueueing + default: + return JobStateNone + } +} + // SchemaDiff contains the schema modification at a particular schema version. // It is used to reduce schema reload cost. type SchemaDiff struct { @@ -894,6 +991,8 @@ type SchemaDiff struct { OldTableID int64 `json:"old_table_id"` // OldSchemaID is the schema ID before rename table, only used by rename table DDL. OldSchemaID int64 `json:"old_schema_id"` + // RegenerateSchemaMap means whether to rebuild the schema map when applying to the schema diff. + RegenerateSchemaMap bool `json:"regenerate_schema_map"` AffectedOpts []*AffectedOption `json:"affected_options"` } diff --git a/parser/model/ddl_test.go b/parser/model/ddl_test.go index 7fddcca54e351..7ea82606363ce 100644 --- a/parser/model/ddl_test.go +++ b/parser/model/ddl_test.go @@ -18,6 +18,7 @@ import ( "unsafe" "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/terror" "github.com/stretchr/testify/require" ) @@ -51,3 +52,22 @@ func TestJobSize(t *testing.T) { job := model.Job{} require.Equal(t, 288, int(unsafe.Sizeof(job)), msg) } + +func TestBackfillMetaCodec(t *testing.T) { + jm := &model.JobMeta{ + SchemaID: 1, + TableID: 2, + Query: "alter table t add index idx(a)", + Priority: 1, + } + bm := &model.BackfillMeta{ + EndInclude: true, + Error: terror.ErrResultUndetermined, + JobMeta: jm, + } + bmBytes, err := bm.Encode() + require.NoError(t, err) + bmRet := &model.BackfillMeta{} + bmRet.Decode(bmBytes) + require.Equal(t, bm, bmRet) +} diff --git a/parser/model/model.go b/parser/model/model.go index add3d59d81ba3..ff710b05c7095 100644 --- a/parser/model/model.go +++ b/parser/model/model.go @@ -164,6 +164,9 @@ type ColumnInfo struct { // Clone clones ColumnInfo. func (c *ColumnInfo) Clone() *ColumnInfo { + if c == nil { + return nil + } nc := *c return &nc } @@ -378,8 +381,8 @@ func FindFKInfoByName(fks []*FKInfo, name string) *FKInfo { } // FindIndexByColumns find IndexInfo in indices which is cover the specified columns. -func FindIndexByColumns(tbInfo *TableInfo, cols ...CIStr) *IndexInfo { - for _, index := range tbInfo.Indices { +func FindIndexByColumns(tbInfo *TableInfo, indices []*IndexInfo, cols ...CIStr) *IndexInfo { + for _, index := range indices { if IsIndexPrefixCovered(tbInfo, index, cols...) { return index } @@ -443,14 +446,16 @@ const ( // However, the convert is missed in some scenarios before v2.1.9, so for all those tables prior to TableInfoVersion3, their // charsets / collations will be converted to lower-case while loading from the storage. TableInfoVersion3 = uint16(3) - // TableInfoVersion4 indicates that the auto_increment allocator in TiDB has been separated from - // _tidb_rowid allocator. This version is introduced to preserve the compatibility of old tables: - // the tables with version < TableInfoVersion4 still use a single allocator for auto_increment and _tidb_rowid. - // Also see https://github.com/pingcap/tidb/issues/982. + // TableInfoVersion4 is not used. TableInfoVersion4 = uint16(4) + // TableInfoVersion5 indicates that the auto_increment allocator in TiDB has been separated from + // _tidb_rowid allocator when AUTO_ID_CACHE is 1. This version is introduced to preserve the compatibility of old tables: + // the tables with version <= TableInfoVersion4 still use a single allocator for auto_increment and _tidb_rowid. + // Also see https://github.com/pingcap/tidb/issues/982. + TableInfoVersion5 = uint16(5) // CurrLatestTableInfoVersion means the latest table info in the current TiDB. - CurrLatestTableInfoVersion = TableInfoVersion4 + CurrLatestTableInfoVersion = TableInfoVersion5 ) // ExtraHandleName is the name of ExtraHandle Column. @@ -545,6 +550,13 @@ type TableInfo struct { StatsOptions *StatsOptions `json:"stats_options"` ExchangePartitionInfo *ExchangePartitionInfo `json:"exchange_partition_info"` + + TTLInfo *TTLInfo `json:"ttl_info"` +} + +// SepAutoInc decides whether _rowid and auto_increment id use separate allocator. +func (t *TableInfo) SepAutoInc() bool { + return t.Version >= TableInfoVersion5 && t.AutoIdCache == 1 } // TableCacheStatusType is the type of the table cache status @@ -745,6 +757,13 @@ func (t *TableInfo) Clone() *TableInfo { nt.ForeignKeys[i] = t.ForeignKeys[i].Clone() } + if t.Partition != nil { + nt.Partition = t.Partition.Clone() + } + if t.TTLInfo != nil { + nt.TTLInfo = t.TTLInfo.Clone() + } + return &nt } @@ -1177,6 +1196,8 @@ type PartitionInfo struct { DroppingDefinitions []PartitionDefinition `json:"dropping_definitions"` States []PartitionState `json:"states"` Num uint64 `json:"num"` + // Only used during ReorganizePartition so far + DDLState SchemaState `json:"ddl_state"` } // Clone clones itself. @@ -1311,15 +1332,15 @@ func (ci *PartitionDefinition) MemoryUsage() (sum int64) { } // FindPartitionDefinitionByName finds PartitionDefinition by name. -func (t *TableInfo) FindPartitionDefinitionByName(partitionDefinitionName string) *PartitionDefinition { +func (pi *PartitionInfo) FindPartitionDefinitionByName(partitionDefinitionName string) int { lowConstrName := strings.ToLower(partitionDefinitionName) - definitions := t.Partition.Definitions + definitions := pi.Definitions for i := range definitions { if definitions[i].Name.L == lowConstrName { - return &t.Partition.Definitions[i] + return i } } - return nil + return -1 } // IndexColumn provides index column info. @@ -1403,10 +1424,14 @@ type IndexInfo struct { Primary bool `json:"is_primary"` // Whether the index is primary key. Invisible bool `json:"is_invisible"` // Whether the index is invisible. Global bool `json:"is_global"` // Whether the index is global. + MVIndex bool `json:"mv_index"` // Whether the index is multivalued index. } // Clone clones IndexInfo. func (index *IndexInfo) Clone() *IndexInfo { + if index == nil { + return nil + } ni := *index ni.Columns = make([]*IndexColumn, len(index.Columns)) for i := range index.Columns { @@ -1716,6 +1741,7 @@ type PlacementSettings struct { LearnerConstraints string `json:"learner_constraints"` FollowerConstraints string `json:"follower_constraints"` VoterConstraints string `json:"voter_constraints"` + SurvivalPreferences string `json:"survival_preferences"` } // PolicyInfo is the struct to store the placement policy. @@ -1733,6 +1759,23 @@ func (p *PolicyInfo) Clone() *PolicyInfo { return &cloned } +// TTLInfo records the TTL config +type TTLInfo struct { + ColumnName CIStr `json:"column"` + IntervalExprStr string `json:"interval_expr"` + // `IntervalTimeUnit` is actually ast.TimeUnitType. Use `int` to avoid cycle dependency + IntervalTimeUnit int `json:"interval_time_unit"` + Enable bool `json:"enable"` + // JobInterval is the interval between two TTL scan jobs. + JobInterval string `json:"job_interval"` +} + +// Clone clones TTLInfo +func (t *TTLInfo) Clone() *TTLInfo { + cloned := *t + return &cloned +} + func writeSettingItemToBuilder(sb *strings.Builder, item string) { if sb.Len() != 0 { sb.WriteString(" ") @@ -1801,6 +1844,71 @@ func (p *PlacementSettings) Clone() *PlacementSettings { return &cloned } +// ResourceGroupRefInfo is the struct to refer the resource group. +type ResourceGroupRefInfo struct { + ID int64 `json:"id"` + Name CIStr `json:"name"` +} + +// ResourceGroupSettings is the settings of the resource group +type ResourceGroupSettings struct { + RURate uint64 `json:"ru_per_sec"` + CPULimiter string `json:"cpu_limit"` + IOReadBandwidth string `json:"io_read_bandwidth"` + IOWriteBandwidth string `json:"io_write_bandwidth"` + BurstLimit int64 `json:"burst_limit"` +} + +func (p *ResourceGroupSettings) String() string { + sb := new(strings.Builder) + if p.RURate != 0 { + writeSettingIntegerToBuilder(sb, "RU_PER_SEC", p.RURate) + } + if len(p.CPULimiter) > 0 { + writeSettingStringToBuilder(sb, "CPU", p.CPULimiter) + } + if len(p.IOReadBandwidth) > 0 { + writeSettingStringToBuilder(sb, "IO_READ_BANDWIDTH", p.IOReadBandwidth) + } + if len(p.IOWriteBandwidth) > 0 { + writeSettingStringToBuilder(sb, "IO_WRITE_BANDWIDTH", p.IOWriteBandwidth) + } + // Once burst limit is negative, meaning allow burst with unlimit. + if p.BurstLimit < 0 { + writeSettingItemToBuilder(sb, "BURSTABLE") + } + return sb.String() +} + +// Adjust adjusts the resource group settings. +func (p *ResourceGroupSettings) Adjust() { + // Curretly we only support ru_per_sec sytanx, so BurstLimit(capicity) is always same as ru_per_sec. + if p.BurstLimit == 0 { + p.BurstLimit = int64(p.RURate) + } +} + +// Clone clones the resource group settings. +func (p *ResourceGroupSettings) Clone() *ResourceGroupSettings { + cloned := *p + return &cloned +} + +// ResourceGroupInfo is the struct to store the resource group. +type ResourceGroupInfo struct { + *ResourceGroupSettings + ID int64 `json:"id"` + Name CIStr `json:"name"` + State SchemaState `json:"state"` +} + +// Clone clones the ResourceGroupInfo. +func (p *ResourceGroupInfo) Clone() *ResourceGroupInfo { + cloned := *p + cloned.ResourceGroupSettings = p.ResourceGroupSettings.Clone() + return &cloned +} + // StatsOptions is the struct to store the stats options. type StatsOptions struct { *StatsWindowSettings diff --git a/parser/model/model_test.go b/parser/model/model_test.go index 47a8ecad6e4a4..6062df58aabec 100644 --- a/parser/model/model_test.go +++ b/parser/model/model_test.go @@ -785,3 +785,23 @@ func TestIsIndexPrefixCovered(t *testing.T) { require.Equal(t, true, IsIndexPrefixCovered(tbl, i1, NewCIStr("c_4"), NewCIStr("c_2"))) require.Equal(t, false, IsIndexPrefixCovered(tbl, i0, NewCIStr("c_2"))) } + +func TestTTLInfoClone(t *testing.T) { + ttlInfo := &TTLInfo{ + ColumnName: NewCIStr("test"), + IntervalExprStr: "test_expr", + IntervalTimeUnit: 5, + Enable: true, + } + + clonedTTLInfo := ttlInfo.Clone() + clonedTTLInfo.ColumnName = NewCIStr("test_2") + clonedTTLInfo.IntervalExprStr = "test_expr_2" + clonedTTLInfo.IntervalTimeUnit = 9 + clonedTTLInfo.Enable = false + + require.Equal(t, "test", ttlInfo.ColumnName.O) + require.Equal(t, "test_expr", ttlInfo.IntervalExprStr) + require.Equal(t, 5, ttlInfo.IntervalTimeUnit) + require.Equal(t, true, ttlInfo.Enable) +} diff --git a/parser/mysql/const.go b/parser/mysql/const.go index 2d8da77f90e64..f836cc05e4286 100644 --- a/parser/mysql/const.go +++ b/parser/mysql/const.go @@ -209,6 +209,8 @@ const ( RoleEdgeTable = "role_edges" // DefaultRoleTable is the table contain default active role info DefaultRoleTable = "default_roles" + // PasswordHistoryTable is the table in system db contains password history. + PasswordHistoryTable = "password_history" ) // MySQL type maximum length. diff --git a/parser/mysql/errcode.go b/parser/mysql/errcode.go index f82bbb1e0978f..0ea2134f88d75 100644 --- a/parser/mysql/errcode.go +++ b/parser/mysql/errcode.go @@ -884,6 +884,7 @@ const ( ErrErrorLast = 1863 ErrMaxExecTimeExceeded = 1907 ErrInvalidFieldSize = 3013 + ErrPasswordExpireAnonymousUser = 3016 ErrIncorrectType = 3064 ErrInvalidJSONData = 3069 ErrGeneratedColumnFunctionIsNotAllowed = 3102 diff --git a/parser/mysql/errname.go b/parser/mysql/errname.go index eef4defcb2465..5b1cff580f658 100644 --- a/parser/mysql/errname.go +++ b/parser/mysql/errname.go @@ -97,7 +97,7 @@ var MySQLErrName = map[uint16]*ErrMessage{ ErrMultiplePriKey: Message("Multiple primary key defined", nil), ErrTooManyKeys: Message("Too many keys specified; max %d keys allowed", nil), ErrTooManyKeyParts: Message("Too many key parts specified; max %d parts allowed", nil), - ErrTooLongKey: Message("Specified key was too long; max key length is %d bytes", nil), + ErrTooLongKey: Message("Specified key was too long (%d bytes); max key length is %d bytes", nil), ErrKeyColumnDoesNotExits: Message("Key column '%-.192s' doesn't exist in table", nil), ErrBlobUsedAsKey: Message("BLOB column '%-.192s' can't be used in key specification with the used table type", nil), ErrTooBigFieldlength: Message("Column length too big for column '%-.192s' (max = %d); use BLOB or TEXT instead", nil), @@ -899,6 +899,7 @@ var MySQLErrName = map[uint16]*ErrMessage{ ErrDependentByGeneratedColumn: Message("Column '%s' has a generated column dependency.", nil), ErrGeneratedColumnRefAutoInc: Message("Generated column '%s' cannot refer to auto-increment column.", nil), ErrInvalidFieldSize: Message("Invalid size for column '%s'.", nil), + ErrPasswordExpireAnonymousUser: Message("The password for anonymous user cannot be expired.", nil), ErrIncorrectType: Message("Incorrect type for argument %s in function %s.", nil), ErrInvalidJSONData: Message("Invalid JSON data provided to function %s: %s", nil), ErrInvalidJSONText: Message("Invalid JSON text: %-.192s", nil), diff --git a/parser/mysql/type.go b/parser/mysql/type.go index c54d0f8984b63..8a2531d870d3e 100644 --- a/parser/mysql/type.go +++ b/parser/mysql/type.go @@ -43,7 +43,7 @@ const ( TypeLongBlob byte = 0xfb TypeBlob byte = 0xfc TypeVarString byte = 0xfd - TypeString byte = 0xfe + TypeString byte = 0xfe /* TypeString is char type */ TypeGeometry byte = 0xff ) @@ -74,6 +74,7 @@ const ( 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: TiFlash will check this flag and add a placeholder for this column */ ) // TypeInt24 bounds. diff --git a/parser/mysql/util.go b/parser/mysql/util.go index 367839b2ce3af..c69e290369598 100644 --- a/parser/mysql/util.go +++ b/parser/mysql/util.go @@ -93,3 +93,10 @@ func GetDefaultFieldLengthAndDecimalForCast(tp byte) (flen int, decimal int) { } return -1, -1 } + +// IsAuthPluginClearText is used to indicated that the plugin need clear-text password. +func IsAuthPluginClearText(authPlugin string) bool { + return authPlugin == AuthNativePassword || + authPlugin == AuthTiDBSM3Password || + authPlugin == AuthCachingSha2Password +} diff --git a/parser/parser.go b/parser/parser.go index 4dc144d7a6b9d..ba2b05bfa1282 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -34,6 +34,7 @@ import ( "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/charset" + "github.com/pingcap/tidb/parser/duration" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/opcode" @@ -54,2187 +55,2230 @@ type yyXError struct { } const ( - yyDefault = 58117 + yyDefault = 58135 yyEOFCode = 57344 - account = 57575 - action = 57576 - add = 57360 - addDate = 57917 - admin = 58002 - advise = 57577 - after = 57578 - against = 57579 - ago = 57580 - algorithm = 57581 - all = 57361 - alter = 57362 - always = 57582 - analyze = 57363 - and = 57364 - andand = 57355 - andnot = 58078 - any = 57583 - approxCountDistinct = 57918 - approxPercentile = 57919 - as = 57365 - asc = 57366 - ascii = 57584 + account = 57577 + action = 57578 + add = 57361 + addDate = 57928 + admin = 58020 + advise = 57579 + after = 57580 + against = 57581 + ago = 57582 + algorithm = 57583 + all = 57362 + alter = 57363 + always = 57584 + analyze = 57364 + and = 57365 + andand = 57356 + andnot = 58096 + any = 57585 + approxCountDistinct = 57929 + approxPercentile = 57930 + array = 57366 + as = 57367 + asc = 57368 + ascii = 57586 asof = 57347 - assignmentEq = 58079 - attribute = 57585 - attributes = 57586 - autoIdCache = 57591 - autoIncrement = 57592 - autoRandom = 57593 - autoRandomBase = 57594 - avg = 57595 - avgRowLength = 57596 - backend = 57597 - backup = 57598 - backups = 57599 - batch = 58003 - begin = 57600 - bernoulli = 57601 - between = 57367 - bigIntType = 57368 - binaryType = 57369 - binding = 57602 - bindingCache = 57603 - bindings = 57604 - binlog = 57605 - bitAnd = 57920 - bitLit = 58077 - bitOr = 57921 - bitType = 57606 - bitXor = 57922 - blobType = 57370 - block = 57607 - boolType = 57609 - booleanType = 57608 - both = 57371 - bound = 57923 - briefType = 57924 - btree = 57610 - buckets = 58004 - builtinApproxCountDistinct = 58051 - builtinApproxPercentile = 58052 - builtinBitAnd = 58046 - builtinBitOr = 58047 - builtinBitXor = 58048 - builtinCast = 58049 - builtinCount = 58050 - builtinCurDate = 58053 - builtinCurTime = 58054 - builtinDateAdd = 58055 - builtinDateSub = 58056 - builtinExtract = 58057 - builtinGroupConcat = 58058 - builtinMax = 58059 - builtinMin = 58060 - builtinNow = 58061 - builtinPosition = 58062 - builtinStddevPop = 58066 - builtinStddevSamp = 58067 - builtinSubstring = 58063 - builtinSum = 58064 - builtinSysDate = 58065 - builtinTranslate = 58068 - builtinTrim = 58069 - builtinUser = 58070 - builtinVarPop = 58071 - builtinVarSamp = 58072 - builtins = 58005 - by = 57372 - byteType = 57611 - cache = 57612 - call = 57373 - cancel = 58006 - capture = 57613 - cardinality = 58007 - cascade = 57374 - cascaded = 57614 - caseKwd = 57375 - cast = 57925 - causal = 57615 - chain = 57616 - change = 57376 - charType = 57378 - character = 57377 - charsetKwd = 57617 - check = 57379 - checkpoint = 57618 - checksum = 57619 - cipher = 57620 - cleanup = 57621 - client = 57622 - clientErrorsSummary = 57623 - cluster = 57649 - clustered = 57650 - cmSketch = 58008 - coalesce = 57624 - collate = 57380 - collation = 57625 - column = 57381 - columnFormat = 57626 - columnStatsUsage = 58009 - columns = 57627 - comment = 57629 - commit = 57630 - committed = 57631 - compact = 57632 - compressed = 57633 - compression = 57634 - concurrency = 57635 - config = 57628 - connection = 57636 - consistency = 57637 - consistent = 57638 - constraint = 57382 - constraints = 57927 - context = 57639 - convert = 57383 - copyKwd = 57926 - correlation = 58010 - cpu = 57640 - create = 57384 - createTableSelect = 58101 - cross = 57385 - csvBackslashEscape = 57641 - csvDelimiter = 57642 - csvHeader = 57643 - csvNotNull = 57644 - csvNull = 57645 - csvSeparator = 57646 - csvTrimLastSeparators = 57647 - cumeDist = 57386 - curTime = 57928 - current = 57648 - currentDate = 57387 - currentRole = 57391 - currentTime = 57388 - currentTs = 57389 - currentUser = 57390 - cycle = 57651 - data = 57652 - database = 57392 - databases = 57393 - dateAdd = 57929 - dateSub = 57930 - dateType = 57654 - datetimeType = 57653 - day = 57655 - dayHour = 57394 - dayMicrosecond = 57395 - dayMinute = 57396 - daySecond = 57397 - ddl = 58011 - deallocate = 57656 - decLit = 58074 - decimalType = 57398 - defaultKwd = 57399 - definer = 57657 - delayKeyWrite = 57658 - delayed = 57400 - deleteKwd = 57401 - denseRank = 57402 - dependency = 58012 - depth = 58013 - desc = 57403 - describe = 57404 - directory = 57659 - disable = 57660 - disabled = 57661 - discard = 57662 - disk = 57663 - distinct = 57405 - distinctRow = 57406 - div = 57407 - do = 57664 - dotType = 57931 - doubleAtIdentifier = 57352 - doubleType = 57408 - drainer = 58014 - drop = 57409 - dry = 58015 - dual = 57410 - dump = 57932 - duplicate = 57665 - dynamic = 57666 - elseKwd = 57411 - empty = 58092 - enable = 57667 - enabled = 57668 - enclosed = 57412 - encryption = 57669 - end = 57670 - enforced = 57671 - engine = 57672 - engines = 57673 - enum = 57674 - eq = 58080 + assignmentEq = 58097 + attribute = 57587 + attributes = 57588 + autoIdCache = 57593 + autoIncrement = 57594 + autoRandom = 57595 + autoRandomBase = 57596 + avg = 57597 + avgRowLength = 57598 + backend = 57599 + backup = 57600 + backups = 57601 + batch = 58021 + begin = 57602 + bernoulli = 57603 + between = 57369 + bigIntType = 57370 + binaryType = 57371 + binding = 57604 + bindingCache = 57605 + bindings = 57606 + binlog = 57607 + bitAnd = 57931 + bitLit = 58095 + bitOr = 57932 + bitType = 57608 + bitXor = 57933 + blobType = 57372 + block = 57609 + boolType = 57611 + booleanType = 57610 + both = 57373 + bound = 57934 + briefType = 57935 + btree = 57612 + buckets = 58022 + builtinApproxCountDistinct = 58069 + builtinApproxPercentile = 58070 + builtinBitAnd = 58064 + builtinBitOr = 58065 + builtinBitXor = 58066 + builtinCast = 58067 + builtinCount = 58068 + builtinCurDate = 58071 + builtinCurTime = 58072 + builtinDateAdd = 58073 + builtinDateSub = 58074 + builtinExtract = 58075 + builtinGroupConcat = 58076 + builtinMax = 58077 + builtinMin = 58078 + builtinNow = 58079 + builtinPosition = 58080 + builtinStddevPop = 58084 + builtinStddevSamp = 58085 + builtinSubstring = 58081 + builtinSum = 58082 + builtinSysDate = 58083 + builtinTranslate = 58086 + builtinTrim = 58087 + builtinUser = 58088 + builtinVarPop = 58089 + builtinVarSamp = 58090 + builtins = 58023 + burstable = 57936 + by = 57374 + byteType = 57613 + cache = 57614 + call = 57375 + cancel = 58024 + capture = 57615 + cardinality = 58025 + cascade = 57376 + cascaded = 57616 + caseKwd = 57377 + cast = 57937 + causal = 57617 + chain = 57618 + change = 57378 + charType = 57380 + character = 57379 + charsetKwd = 57619 + check = 57381 + checkpoint = 57620 + checksum = 57621 + cipher = 57622 + cleanup = 57623 + client = 57624 + clientErrorsSummary = 57625 + cluster = 57651 + clustered = 57652 + cmSketch = 58026 + coalesce = 57626 + collate = 57382 + collation = 57627 + column = 57383 + columnFormat = 57628 + columnStatsUsage = 58027 + columns = 57629 + comment = 57631 + commit = 57632 + committed = 57633 + compact = 57634 + compressed = 57635 + compression = 57636 + concurrency = 57637 + config = 57630 + connection = 57638 + consistency = 57639 + consistent = 57640 + constraint = 57384 + constraints = 57939 + context = 57641 + convert = 57385 + copyKwd = 57938 + correlation = 58028 + cpu = 57642 + create = 57386 + createTableSelect = 58119 + cross = 57387 + csvBackslashEscape = 57643 + csvDelimiter = 57644 + csvHeader = 57645 + csvNotNull = 57646 + csvNull = 57647 + csvSeparator = 57648 + csvTrimLastSeparators = 57649 + cumeDist = 57388 + curDate = 57941 + curTime = 57940 + current = 57650 + currentDate = 57389 + currentRole = 57393 + currentTime = 57390 + currentTs = 57391 + currentUser = 57392 + cycle = 57653 + data = 57654 + database = 57394 + databases = 57395 + dateAdd = 57942 + dateSub = 57943 + dateType = 57656 + datetimeType = 57655 + day = 57657 + dayHour = 57396 + dayMicrosecond = 57397 + dayMinute = 57398 + daySecond = 57399 + ddl = 58029 + deallocate = 57658 + decLit = 58092 + decimalType = 57400 + defaultKwd = 57401 + definer = 57659 + delayKeyWrite = 57660 + delayed = 57402 + deleteKwd = 57403 + denseRank = 57404 + dependency = 58030 + depth = 58031 + desc = 57405 + describe = 57406 + digest = 57661 + directory = 57662 + disable = 57663 + disabled = 57664 + discard = 57665 + disk = 57666 + distinct = 57407 + distinctRow = 57408 + div = 57409 + do = 57667 + dotType = 57944 + doubleAtIdentifier = 57353 + doubleType = 57410 + drainer = 58032 + drop = 57411 + dry = 58033 + dual = 57412 + dump = 57945 + duplicate = 57668 + dynamic = 57669 + elseKwd = 57413 + empty = 58110 + enable = 57670 + enabled = 57671 + enclosed = 57414 + encryption = 57672 + end = 57673 + enforced = 57674 + engine = 57675 + engines = 57676 + enum = 57677 + eq = 58098 yyErrCode = 57345 - errorKwd = 57675 - escape = 57676 - escaped = 57413 - event = 57677 - events = 57678 - evolve = 57679 - exact = 57933 - except = 57416 - exchange = 57680 - exclusive = 57681 - execute = 57682 - exists = 57414 - expansion = 57683 - expire = 57684 - explain = 57415 - exprPushdownBlacklist = 57934 - extended = 57685 - extract = 57935 - falseKwd = 57417 - faultsSym = 57686 - fetch = 57418 - fields = 57687 - file = 57688 - first = 57689 - firstValue = 57419 - fixed = 57690 - flashback = 57936 - floatLit = 58073 - floatType = 57420 - flush = 57691 - follower = 57937 - followerConstraints = 57938 - followers = 57939 - following = 57692 - forKwd = 57421 - force = 57422 - foreign = 57423 - format = 57693 - from = 57424 - full = 57694 - fulltext = 57425 - function = 57695 - ge = 58081 - general = 57696 - generated = 57426 - getFormat = 57940 - global = 57697 - grant = 57427 - grants = 57698 - group = 57428 - groupConcat = 57941 - groups = 57429 - hash = 57699 - having = 57430 - help = 57700 - hexLit = 58076 - highPriority = 57431 - higherThanComma = 58116 - higherThanParenthese = 58110 - hintComment = 57354 - histogram = 57701 - histogramsInFlight = 58035 - history = 57702 - hosts = 57703 - hour = 57704 - hourMicrosecond = 57432 - hourMinute = 57433 - hourSecond = 57434 - identSQLErrors = 57706 - identified = 57705 + errorKwd = 57678 + escape = 57679 + escaped = 57415 + event = 57680 + events = 57681 + evolve = 57682 + exact = 57946 + except = 57418 + exchange = 57683 + exclusive = 57684 + execute = 57685 + exists = 57416 + expansion = 57686 + expire = 57687 + explain = 57417 + exprPushdownBlacklist = 57947 + extended = 57688 + extract = 57948 + failedLoginAttempts = 57926 + falseKwd = 57419 + faultsSym = 57689 + fetch = 57420 + fields = 57690 + file = 57691 + first = 57692 + firstValue = 57421 + fixed = 57693 + flashback = 57949 + floatLit = 58091 + floatType = 57422 + flush = 57694 + follower = 57950 + followerConstraints = 57951 + followers = 57952 + following = 57695 + forKwd = 57423 + force = 57424 + foreign = 57425 + format = 57696 + from = 57426 + full = 57697 + fulltext = 57427 + function = 57698 + ge = 58099 + general = 57699 + generated = 57428 + getFormat = 57953 + global = 57700 + grant = 57429 + grants = 57701 + group = 57430 + groupConcat = 57954 + groups = 57431 + hash = 57702 + having = 57432 + help = 57703 + hexLit = 58094 + highPriority = 57433 + higherThanComma = 58134 + higherThanParenthese = 58128 + hintComment = 57355 + histogram = 57704 + histogramsInFlight = 58053 + history = 57705 + hosts = 57706 + hour = 57707 + hourMicrosecond = 57434 + hourMinute = 57435 + hourSecond = 57436 + identSQLErrors = 57709 + identified = 57708 identifier = 57346 - ifKwd = 57435 - ignore = 57436 - importKwd = 57707 - imports = 57708 - in = 57437 - increment = 57709 - incremental = 57710 - index = 57438 - indexes = 57711 - infile = 57439 - inner = 57440 - inplace = 57943 - insert = 57447 - insertMethod = 57712 - insertValues = 58099 - instance = 57713 - instant = 57944 - int1Type = 57449 - int2Type = 57450 - int3Type = 57451 - int4Type = 57452 - int8Type = 57453 - intLit = 58075 - intType = 57448 - integerType = 57441 - internal = 57945 - intersect = 57442 - interval = 57443 - into = 57444 - invalid = 57353 - invisible = 57714 - invoker = 57715 - io = 57716 - ipc = 57717 - is = 57446 - isolation = 57718 - issuer = 57719 - job = 58017 - jobs = 58016 - join = 57454 - jsonArrayagg = 57946 - jsonObjectAgg = 57947 - jsonType = 57720 - jss = 58083 - juss = 58084 - key = 57455 - keyBlockSize = 57721 - keys = 57456 - kill = 57457 - labels = 57722 - lag = 57458 - language = 57723 - last = 57724 - lastBackup = 57725 - lastValue = 57459 - lastval = 57726 - le = 58082 - lead = 57460 - leader = 57948 - leaderConstraints = 57949 - leading = 57461 - learner = 57950 - learnerConstraints = 57951 - learners = 57952 - left = 57462 - less = 57727 - level = 57728 - like = 57463 - limit = 57464 - linear = 57466 - lines = 57465 - list = 57729 - load = 57467 - local = 57730 - localTime = 57468 - localTs = 57469 - location = 57732 - lock = 57470 - locked = 57731 - logs = 57733 - long = 57560 - longblobType = 57471 - longtextType = 57472 - lowPriority = 57473 - lowerThanCharsetKwd = 58102 - lowerThanComma = 58115 - lowerThanCreateTableSelect = 58100 - lowerThanEq = 58112 - lowerThanFunction = 58107 - lowerThanInsertValues = 58098 - lowerThanKey = 58103 - lowerThanLocal = 58104 - lowerThanNot = 58114 - lowerThanOn = 58111 - lowerThanParenthese = 58109 - lowerThanRemove = 58105 - lowerThanSelectOpt = 58093 - lowerThanSelectStmt = 58097 - lowerThanSetKeyword = 58096 - lowerThanStringLitToken = 58095 - lowerThanValueKeyword = 58094 - lowerThenOrder = 58106 - lsh = 58085 - master = 57734 - match = 57474 - max = 57954 - maxConnectionsPerHour = 57737 - maxQueriesPerHour = 57738 - maxRows = 57739 - maxUpdatesPerHour = 57740 - maxUserConnections = 57741 - maxValue = 57475 - max_idxnum = 57735 - max_minutes = 57736 - mb = 57742 - mediumIntType = 57477 - mediumblobType = 57476 - mediumtextType = 57478 - memory = 57743 - merge = 57744 - microsecond = 57745 - min = 57953 - minRows = 57746 - minValue = 57748 - minute = 57747 - minuteMicrosecond = 57479 - minuteSecond = 57480 - mod = 57481 - mode = 57749 - modify = 57750 - month = 57751 - names = 57752 - national = 57753 - natural = 57574 - ncharType = 57754 - neg = 58113 - neq = 58086 - neqSynonym = 58087 - never = 57755 - next = 57756 - next_row_id = 57942 - nextval = 57757 - no = 57758 - noWriteToBinLog = 57483 - nocache = 57759 - nocycle = 57760 - nodeID = 58018 - nodeState = 58019 - nodegroup = 57761 - nomaxvalue = 57762 - nominvalue = 57763 - nonclustered = 57764 - none = 57765 - not = 57482 - not2 = 58091 - now = 57955 - nowait = 57766 - nthValue = 57484 - ntile = 57485 - null = 57486 - nulleq = 58088 - nulls = 57768 - numericType = 57487 - nvarcharType = 57767 - odbcDateType = 57357 - odbcTimeType = 57358 - odbcTimestampType = 57359 - of = 57488 - off = 57769 - offset = 57770 - on = 57489 - onDuplicate = 57771 - online = 57772 - only = 57773 - open = 57774 - optRuleBlacklist = 57956 - optimistic = 58020 - optimize = 57490 - option = 57491 - optional = 57775 - optionally = 57492 - or = 57493 - order = 57494 - outer = 57495 - outfile = 57445 - over = 57496 - packKeys = 57776 - pageSym = 57777 - paramMarker = 58089 - parser = 57778 - partial = 57779 - partition = 57497 - partitioning = 57780 - partitions = 57781 - password = 57782 - per_db = 57784 - per_table = 57785 - percent = 57783 - percentRank = 57498 - pessimistic = 58021 - pipes = 57356 - pipesAsOr = 57786 - placement = 57957 - plan = 57958 - planCache = 57959 - plugins = 57787 - policy = 57788 - position = 57960 - preSplitRegions = 57789 - preceding = 57790 - precisionType = 57499 - predicate = 57961 - prepare = 57791 - preserve = 57792 - primary = 57500 - primaryRegion = 57962 - privileges = 57793 - procedure = 57501 - process = 57794 - processlist = 57795 - profile = 57796 - profiles = 57797 - proxy = 57798 - pump = 58022 - purge = 57799 - quarter = 57800 - queries = 57801 - query = 57802 - quick = 57803 - rangeKwd = 57502 - rank = 57503 - rateLimit = 57804 - read = 57504 - realType = 57505 - rebuild = 57805 - recent = 57963 - recover = 57806 - recursive = 57506 - redundant = 57807 - references = 57507 - regexpKwd = 57508 - region = 58045 - regions = 58044 - release = 57509 - reload = 57808 - remove = 57809 - rename = 57510 - reorganize = 57810 - repair = 57811 - repeat = 57511 - repeatable = 57812 - replace = 57512 - replayer = 57964 - replica = 57813 - replicas = 57814 - replication = 57815 - require = 57513 - required = 57816 - reset = 58043 - respect = 57817 - restart = 57818 - restore = 57819 - restores = 57820 - restrict = 57514 - resume = 57821 - reverse = 57822 - revoke = 57515 - right = 57516 - rlike = 57517 - role = 57823 - rollback = 57824 - routine = 57825 - row = 57518 - rowCount = 57826 - rowFormat = 57827 - rowNumber = 57520 - rows = 57519 - rsh = 58090 - rtree = 57828 - run = 58023 - running = 57965 - s3 = 57966 - sampleRate = 58025 - samples = 58024 - san = 57829 - savepoint = 57830 - schedule = 57967 - second = 57831 - secondMicrosecond = 57521 - secondaryEngine = 57832 - secondaryLoad = 57833 - secondaryUnload = 57834 - security = 57835 - selectKwd = 57522 - sendCredentialsToTiKV = 57836 - separator = 57837 - sequence = 57838 - serial = 57839 - serializable = 57840 - session = 57841 - sessionStates = 58026 - set = 57523 - setval = 57842 - shardRowIDBits = 57843 - share = 57844 - shared = 57845 - show = 57524 - shutdown = 57846 - signed = 57847 - simple = 57848 - singleAtIdentifier = 57351 - skip = 57849 - skipSchemaFiles = 57850 - slave = 57851 - slow = 57852 - smallIntType = 57525 - snapshot = 57853 - some = 57854 - source = 57855 - spatial = 57526 - split = 58041 - sql = 57527 - sqlBigResult = 57528 - sqlBufferResult = 57856 - sqlCache = 57857 - sqlCalcFoundRows = 57529 - sqlNoCache = 57858 - sqlSmallResult = 57530 - sqlTsiDay = 57859 - sqlTsiHour = 57860 - sqlTsiMinute = 57861 - sqlTsiMonth = 57862 - sqlTsiQuarter = 57863 - sqlTsiSecond = 57864 - sqlTsiWeek = 57865 - sqlTsiYear = 57866 - ssl = 57531 - staleness = 57968 - start = 57867 - starting = 57532 - statistics = 58027 - stats = 58028 - statsAutoRecalc = 57868 - statsBuckets = 58031 - statsColChoice = 57589 - statsColList = 57590 - statsExtended = 57533 - statsHealthy = 58032 - statsHistograms = 58030 - statsLocked = 58034 - statsMeta = 58029 - statsOptions = 57587 - statsPersistent = 57869 - statsSamplePages = 57870 - statsSampleRate = 57588 - statsTopN = 58033 - status = 57871 - std = 57969 - stddev = 57970 - stddevPop = 57971 - stddevSamp = 57972 - stop = 57973 - storage = 57872 - stored = 57538 - straightJoin = 57534 - strict = 57974 - strictFormat = 57873 - stringLit = 57350 - strong = 57975 - subDate = 57976 - subject = 57874 - subpartition = 57875 - subpartitions = 57876 - substring = 57978 - sum = 57977 - super = 57877 - swaps = 57878 - switchesSym = 57879 - system = 57880 - systemTime = 57881 - tableChecksum = 57882 - tableKwd = 57536 - tableRefPriority = 58108 - tableSample = 57537 - tables = 57883 - tablespace = 57884 - target = 57979 - telemetry = 58036 - telemetryID = 58037 - temporary = 57885 - temptable = 57886 - terminated = 57539 - textType = 57887 - than = 57888 - then = 57540 - tiFlash = 58039 - tidb = 58038 - tidbCurrentTSO = 57535 - tikvImporter = 57889 - timeType = 57891 - timestampAdd = 57980 - timestampDiff = 57981 - timestampType = 57890 - tinyIntType = 57542 - tinyblobType = 57541 - tinytextType = 57543 - tls = 57982 - to = 57544 + ifKwd = 57437 + ignore = 57438 + importKwd = 57710 + imports = 57711 + in = 57439 + increment = 57712 + incremental = 57713 + index = 57440 + indexes = 57714 + infile = 57441 + inner = 57442 + inplace = 57956 + insert = 57449 + insertMethod = 57715 + insertValues = 58117 + instance = 57716 + instant = 57957 + int1Type = 57451 + int2Type = 57452 + int3Type = 57453 + int4Type = 57454 + int8Type = 57455 + intLit = 58093 + intType = 57450 + integerType = 57443 + internal = 57958 + intersect = 57444 + interval = 57445 + into = 57446 + invalid = 57354 + invisible = 57717 + invoker = 57718 + io = 57719 + ioReadBandwidth = 58018 + ioWriteBandwidth = 58019 + ipc = 57720 + is = 57448 + isolation = 57721 + issuer = 57722 + job = 58035 + jobs = 58034 + join = 57456 + jsonArrayagg = 57959 + jsonObjectAgg = 57960 + jsonType = 57723 + jss = 58101 + juss = 58102 + key = 57457 + keyBlockSize = 57724 + keys = 57458 + kill = 57459 + labels = 57725 + lag = 57460 + language = 57726 + last = 57727 + lastBackup = 57728 + lastValue = 57461 + lastval = 57729 + le = 58100 + lead = 57462 + leader = 57961 + leaderConstraints = 57962 + leading = 57463 + learner = 57963 + learnerConstraints = 57964 + learners = 57965 + left = 57464 + less = 57730 + level = 57731 + like = 57465 + limit = 57466 + linear = 57468 + lines = 57467 + list = 57732 + load = 57469 + local = 57733 + localTime = 57470 + localTs = 57471 + location = 57735 + lock = 57472 + locked = 57734 + logs = 57736 + long = 57562 + longblobType = 57473 + longtextType = 57474 + lowPriority = 57475 + lowerThanCharsetKwd = 58120 + lowerThanComma = 58133 + lowerThanCreateTableSelect = 58118 + lowerThanEq = 58130 + lowerThanFunction = 58125 + lowerThanInsertValues = 58116 + lowerThanKey = 58121 + lowerThanLocal = 58122 + lowerThanNot = 58132 + lowerThanOn = 58129 + lowerThanParenthese = 58127 + lowerThanRemove = 58123 + lowerThanSelectOpt = 58111 + lowerThanSelectStmt = 58115 + lowerThanSetKeyword = 58114 + lowerThanStringLitToken = 58113 + lowerThanValueKeyword = 58112 + lowerThenOrder = 58124 + lsh = 58103 + master = 57737 + match = 57476 + max = 57967 + maxConnectionsPerHour = 57740 + maxQueriesPerHour = 57741 + maxRows = 57742 + maxUpdatesPerHour = 57743 + maxUserConnections = 57744 + maxValue = 57477 + max_idxnum = 57738 + max_minutes = 57739 + mb = 57745 + mediumIntType = 57479 + mediumblobType = 57478 + mediumtextType = 57480 + member = 57746 + memberof = 57349 + memory = 57747 + merge = 57748 + microsecond = 57749 + min = 57966 + minRows = 57750 + minValue = 57752 + minute = 57751 + minuteMicrosecond = 57481 + minuteSecond = 57482 + mod = 57483 + mode = 57753 + modify = 57754 + month = 57755 + names = 57756 + national = 57757 + natural = 57576 + ncharType = 57758 + neg = 58131 + neq = 58104 + neqSynonym = 58105 + never = 57759 + next = 57760 + next_row_id = 57955 + nextval = 57761 + no = 57762 + noWriteToBinLog = 57485 + nocache = 57763 + nocycle = 57764 + nodeID = 58036 + nodeState = 58037 + nodegroup = 57765 + nomaxvalue = 57766 + nominvalue = 57767 + nonclustered = 57768 + none = 57769 + not = 57484 + not2 = 58109 + now = 57968 + nowait = 57770 + nthValue = 57486 + ntile = 57487 + null = 57488 + nulleq = 58106 + nulls = 57772 + numericType = 57489 + nvarcharType = 57771 + odbcDateType = 57358 + odbcTimeType = 57359 + odbcTimestampType = 57360 + of = 57490 + off = 57773 + offset = 57774 + on = 57491 + onDuplicate = 57775 + online = 57776 + only = 57777 + open = 57778 + optRuleBlacklist = 57969 + optimistic = 58038 + optimize = 57492 + option = 57493 + optional = 57779 + optionally = 57494 + or = 57495 + order = 57496 + outer = 57497 + outfile = 57447 + over = 57498 + packKeys = 57780 + pageSym = 57781 + paramMarker = 58107 + parser = 57782 + partial = 57783 + partition = 57499 + partitioning = 57784 + partitions = 57785 + password = 57786 + passwordLockTime = 57927 + per_db = 57788 + per_table = 57789 + percent = 57787 + percentRank = 57500 + pessimistic = 58039 + pipes = 57357 + pipesAsOr = 57790 + placement = 57970 + plan = 57971 + planCache = 57972 + plugins = 57791 + policy = 57792 + position = 57973 + preSplitRegions = 57793 + preceding = 57794 + precisionType = 57501 + predicate = 57974 + prepare = 57795 + preserve = 57796 + primary = 57502 + primaryRegion = 57975 + privileges = 57797 + procedure = 57503 + process = 57798 + processlist = 57799 + profile = 57800 + profiles = 57801 + proxy = 57802 + pump = 58040 + purge = 57803 + quarter = 57804 + queries = 57805 + query = 57806 + quick = 57807 + rangeKwd = 57504 + rank = 57505 + rateLimit = 57808 + read = 57506 + realType = 57507 + rebuild = 57809 + recent = 57976 + recover = 57810 + recursive = 57508 + redundant = 57811 + references = 57509 + regexpKwd = 57510 + region = 58063 + regions = 58062 + release = 57511 + reload = 57812 + remove = 57813 + rename = 57512 + reorganize = 57814 + repair = 57815 + repeat = 57513 + repeatable = 57816 + replace = 57514 + replayer = 57977 + replica = 57817 + replicas = 57818 + replication = 57819 + require = 57515 + required = 57820 + reset = 58061 + resource = 57821 + respect = 57822 + restart = 57823 + restore = 57824 + restores = 57825 + restrict = 57516 + resume = 57826 + reuse = 57827 + reverse = 57828 + revoke = 57517 + right = 57518 + rlike = 57519 + role = 57829 + rollback = 57830 + routine = 57831 + row = 57520 + rowCount = 57832 + rowFormat = 57833 + rowNumber = 57522 + rows = 57521 + rsh = 58108 + rtree = 57834 + ruRate = 58017 + run = 58041 + running = 57978 + s3 = 57979 + sampleRate = 58043 + samples = 58042 + san = 57835 + savepoint = 57836 + schedule = 57980 + second = 57837 + secondMicrosecond = 57523 + secondaryEngine = 57838 + secondaryLoad = 57839 + secondaryUnload = 57840 + security = 57841 + selectKwd = 57524 + sendCredentialsToTiKV = 57842 + separator = 57843 + sequence = 57844 + serial = 57845 + serializable = 57846 + session = 57847 + sessionStates = 58044 + set = 57525 + setval = 57848 + shardRowIDBits = 57849 + share = 57850 + shared = 57851 + show = 57526 + shutdown = 57852 + signed = 57853 + simple = 57854 + singleAtIdentifier = 57352 + skip = 57855 + skipSchemaFiles = 57856 + slave = 57857 + slow = 57858 + smallIntType = 57527 + snapshot = 57859 + some = 57860 + source = 57861 + spatial = 57528 + split = 58059 + sql = 57529 + sqlBigResult = 57530 + sqlBufferResult = 57862 + sqlCache = 57863 + sqlCalcFoundRows = 57531 + sqlNoCache = 57864 + sqlSmallResult = 57532 + sqlTsiDay = 57865 + sqlTsiHour = 57866 + sqlTsiMinute = 57867 + sqlTsiMonth = 57868 + sqlTsiQuarter = 57869 + sqlTsiSecond = 57870 + sqlTsiWeek = 57871 + sqlTsiYear = 57872 + ssl = 57533 + staleness = 57981 + start = 57873 + starting = 57534 + statistics = 58045 + stats = 58046 + statsAutoRecalc = 57874 + statsBuckets = 58049 + statsColChoice = 57591 + statsColList = 57592 + statsExtended = 57535 + statsHealthy = 58050 + statsHistograms = 58048 + statsLocked = 58052 + statsMeta = 58047 + statsOptions = 57589 + statsPersistent = 57875 + statsSamplePages = 57876 + statsSampleRate = 57590 + statsTopN = 58051 + status = 57877 + std = 57982 + stddev = 57983 + stddevPop = 57984 + stddevSamp = 57985 + stop = 57986 + storage = 57878 + stored = 57540 + straightJoin = 57536 + strict = 57987 + strictFormat = 57879 + stringLit = 57351 + strong = 57988 + subDate = 57989 + subject = 57880 + subpartition = 57881 + subpartitions = 57882 + substring = 57991 + sum = 57990 + super = 57883 + survivalPreferences = 57992 + swaps = 57884 + switchesSym = 57885 + system = 57886 + systemTime = 57887 + tableChecksum = 57888 + tableKwd = 57538 + tableRefPriority = 58126 + tableSample = 57539 + tables = 57889 + tablespace = 57890 + target = 57993 + telemetry = 58054 + telemetryID = 58055 + temporary = 57891 + temptable = 57892 + terminated = 57541 + textType = 57893 + than = 57894 + then = 57542 + tiFlash = 58057 + tidb = 58056 + tidbCurrentTSO = 57537 + tidbJson = 57994 + tikvImporter = 57895 + timeType = 57897 + timestampAdd = 57995 + timestampDiff = 57996 + timestampType = 57896 + tinyIntType = 57544 + tinyblobType = 57543 + tinytextType = 57545 + tls = 57997 + to = 57546 toTimestamp = 57348 - tokenIssuer = 57892 - tokudbDefault = 57983 - tokudbFast = 57984 - tokudbLzma = 57985 - tokudbQuickLZ = 57986 - tokudbSmall = 57988 - tokudbSnappy = 57987 - tokudbUncompressed = 57989 - tokudbZlib = 57990 - tokudbZstd = 57991 - top = 57992 - topn = 58040 - tp = 57893 - trace = 57894 - traditional = 57895 - trailing = 57545 - transaction = 57896 - trigger = 57546 - triggers = 57897 - trim = 57993 - trueCardCost = 57998 - trueKwd = 57547 - truncate = 57898 - unbounded = 57899 - uncommitted = 57900 - undefined = 57901 - underscoreCS = 57349 - unicodeSym = 57902 - union = 57549 - unique = 57548 - unknown = 57903 - unlock = 57550 - unsigned = 57551 - update = 57552 - usage = 57553 - use = 57554 - user = 57904 - using = 57555 - utcDate = 57556 - utcTime = 57558 - utcTimestamp = 57557 - validation = 57905 - value = 57906 - values = 57559 - varPop = 57995 - varSamp = 57996 - varbinaryType = 57563 - varcharType = 57561 - varcharacter = 57562 - variables = 57907 - variance = 57994 - varying = 57564 - verboseType = 57997 - view = 57908 - virtual = 57565 - visible = 57909 - voter = 57999 - voterConstraints = 58000 - voters = 58001 - wait = 57916 - warnings = 57910 - week = 57911 - weightString = 57912 - when = 57566 - where = 57567 - width = 58042 - window = 57569 - with = 57570 - without = 57913 - write = 57568 - x509 = 57914 - xor = 57571 - yearMonth = 57572 - yearType = 57915 - zerofill = 57573 + tokenIssuer = 57898 + tokudbDefault = 57998 + tokudbFast = 57999 + tokudbLzma = 58000 + tokudbQuickLZ = 58001 + tokudbSmall = 58003 + tokudbSnappy = 58002 + tokudbUncompressed = 58004 + tokudbZlib = 58005 + tokudbZstd = 58006 + top = 58007 + topn = 58058 + tp = 57899 + trace = 57900 + traditional = 57901 + trailing = 57547 + transaction = 57902 + trigger = 57548 + triggers = 57903 + trim = 58008 + trueCardCost = 58013 + trueKwd = 57549 + truncate = 57904 + ttl = 57905 + ttlEnable = 57906 + ttlJobInterval = 57907 + unbounded = 57908 + uncommitted = 57909 + undefined = 57910 + underscoreCS = 57350 + unicodeSym = 57911 + union = 57551 + unique = 57550 + unknown = 57912 + unlock = 57552 + unsigned = 57553 + update = 57554 + usage = 57555 + use = 57556 + user = 57913 + using = 57557 + utcDate = 57558 + utcTime = 57560 + utcTimestamp = 57559 + validation = 57914 + value = 57915 + values = 57561 + varPop = 58010 + varSamp = 58011 + varbinaryType = 57565 + varcharType = 57563 + varcharacter = 57564 + variables = 57916 + variance = 58009 + varying = 57566 + verboseType = 58012 + view = 57917 + virtual = 57567 + visible = 57918 + voter = 58014 + voterConstraints = 58015 + voters = 58016 + wait = 57925 + warnings = 57919 + week = 57920 + weightString = 57921 + when = 57568 + where = 57569 + width = 58060 + window = 57571 + with = 57572 + without = 57922 + write = 57570 + x509 = 57923 + xor = 57573 + yearMonth = 57574 + yearType = 57924 + zerofill = 57575 yyMaxDepth = 200 - yyTabOfs = -2557 + yyTabOfs = -2612 ) var ( yyXLAT = map[int]int{ - 57344: 0, // $end (2266x) - 59: 1, // ';' (2265x) - 58041: 2, // split (1878x) - 57744: 3, // merge (1877x) - 57809: 4, // remove (1876x) - 57810: 5, // reorganize (1876x) - 57629: 6, // comment (1866x) - 57872: 7, // storage (1784x) - 57592: 8, // autoIncrement (1773x) - 44: 9, // ',' (1688x) - 57689: 10, // first (1675x) - 57578: 11, // after (1669x) - 57839: 12, // serial (1665x) - 57593: 13, // autoRandom (1664x) - 57626: 14, // columnFormat (1664x) - 57782: 15, // password (1633x) - 57617: 16, // charsetKwd (1630x) - 57619: 17, // checksum (1618x) - 57957: 18, // placement (1616x) - 57721: 19, // keyBlockSize (1600x) - 57884: 20, // tablespace (1597x) - 57669: 21, // encryption (1595x) - 57672: 22, // engine (1592x) - 57652: 23, // data (1590x) - 57712: 24, // insertMethod (1588x) - 57739: 25, // maxRows (1588x) - 57746: 26, // minRows (1588x) - 57761: 27, // nodegroup (1588x) - 57636: 28, // connection (1580x) - 57594: 29, // autoRandomBase (1577x) - 58031: 30, // statsBuckets (1575x) - 58033: 31, // statsTopN (1575x) - 57591: 32, // autoIdCache (1574x) - 57596: 33, // avgRowLength (1574x) - 57634: 34, // compression (1574x) - 57658: 35, // delayKeyWrite (1574x) - 57776: 36, // packKeys (1574x) - 57789: 37, // preSplitRegions (1574x) - 57827: 38, // rowFormat (1574x) - 57832: 39, // secondaryEngine (1574x) - 57843: 40, // shardRowIDBits (1574x) - 57868: 41, // statsAutoRecalc (1574x) - 57589: 42, // statsColChoice (1574x) - 57590: 43, // statsColList (1574x) - 57869: 44, // statsPersistent (1574x) - 57870: 45, // statsSamplePages (1574x) - 57588: 46, // statsSampleRate (1574x) - 57882: 47, // tableChecksum (1574x) - 57585: 48, // attribute (1523x) - 57575: 49, // account (1521x) - 41: 50, // ')' (1514x) - 57821: 51, // resume (1510x) - 57847: 52, // signed (1510x) - 57853: 53, // snapshot (1509x) - 57597: 54, // backend (1508x) - 57618: 55, // checkpoint (1508x) - 57635: 56, // concurrency (1508x) - 57641: 57, // csvBackslashEscape (1508x) - 57642: 58, // csvDelimiter (1508x) - 57643: 59, // csvHeader (1508x) - 57644: 60, // csvNotNull (1508x) - 57645: 61, // csvNull (1508x) - 57646: 62, // csvSeparator (1508x) - 57647: 63, // csvTrimLastSeparators (1508x) - 57725: 64, // lastBackup (1508x) - 57771: 65, // onDuplicate (1508x) - 57772: 66, // online (1508x) - 57804: 67, // rateLimit (1508x) - 57836: 68, // sendCredentialsToTiKV (1508x) - 57850: 69, // skipSchemaFiles (1508x) - 57873: 70, // strictFormat (1508x) - 57889: 71, // tikvImporter (1508x) - 57898: 72, // truncate (1505x) - 57758: 73, // no (1504x) - 57867: 74, // start (1502x) - 57612: 75, // cache (1499x) - 57759: 76, // nocache (1498x) - 57651: 77, // cycle (1497x) - 57748: 78, // minValue (1497x) - 57709: 79, // increment (1496x) - 57760: 80, // nocycle (1496x) - 57762: 81, // nomaxvalue (1496x) - 57763: 82, // nominvalue (1496x) - 57818: 83, // restart (1494x) - 57581: 84, // algorithm (1493x) - 57893: 85, // tp (1493x) - 57650: 86, // clustered (1492x) - 57714: 87, // invisible (1492x) - 57764: 88, // nonclustered (1492x) - 58044: 89, // regions (1492x) - 57909: 90, // visible (1492x) - 57875: 91, // subpartition (1489x) - 57781: 92, // partitions (1488x) - 57927: 93, // constraints (1485x) - 57938: 94, // followerConstraints (1485x) - 57939: 95, // followers (1485x) - 57949: 96, // leaderConstraints (1485x) - 57951: 97, // learnerConstraints (1485x) - 57952: 98, // learners (1485x) - 57962: 99, // primaryRegion (1485x) - 57967: 100, // schedule (1485x) - 58000: 101, // voterConstraints (1485x) - 58001: 102, // voters (1485x) - 57627: 103, // columns (1484x) - 57908: 104, // view (1484x) - 57915: 105, // yearType (1481x) - 57655: 106, // day (1480x) - 57584: 107, // ascii (1479x) - 57611: 108, // byteType (1479x) - 57831: 109, // second (1479x) - 57866: 110, // sqlTsiYear (1479x) - 57902: 111, // unicodeSym (1479x) - 57687: 112, // fields (1478x) - 57704: 113, // hour (1478x) - 57745: 114, // microsecond (1478x) - 57747: 115, // minute (1478x) - 57751: 116, // month (1478x) - 57800: 117, // quarter (1478x) - 57859: 118, // sqlTsiDay (1478x) - 57860: 119, // sqlTsiHour (1478x) - 57861: 120, // sqlTsiMinute (1478x) - 57862: 121, // sqlTsiMonth (1478x) - 57863: 122, // sqlTsiQuarter (1478x) - 57864: 123, // sqlTsiSecond (1478x) - 57865: 124, // sqlTsiWeek (1478x) - 57911: 125, // week (1478x) - 57883: 126, // tables (1477x) - 57871: 127, // status (1476x) - 57837: 128, // separator (1475x) - 57620: 129, // cipher (1474x) - 57346: 130, // identifier (1474x) - 57719: 131, // issuer (1474x) - 57737: 132, // maxConnectionsPerHour (1474x) - 57738: 133, // maxQueriesPerHour (1474x) - 57740: 134, // maxUpdatesPerHour (1474x) - 57741: 135, // maxUserConnections (1474x) - 57790: 136, // preceding (1474x) - 57829: 137, // san (1474x) - 57874: 138, // subject (1474x) - 57892: 139, // tokenIssuer (1474x) - 57707: 140, // importKwd (1473x) - 57730: 141, // local (1473x) - 57802: 142, // query (1472x) - 57849: 143, // skip (1472x) - 57604: 144, // bindings (1471x) - 57657: 145, // definer (1471x) - 57699: 146, // hash (1471x) - 57705: 147, // identified (1471x) - 57733: 148, // logs (1471x) - 57817: 149, // respect (1471x) - 57630: 150, // commit (1470x) - 57648: 151, // current (1470x) - 57671: 152, // enforced (1470x) - 57692: 153, // following (1470x) - 57727: 154, // less (1470x) - 57766: 155, // nowait (1470x) - 57773: 156, // only (1470x) - 57824: 157, // rollback (1470x) - 57830: 158, // savepoint (1470x) - 57888: 159, // than (1470x) - 57906: 160, // value (1470x) - 57600: 161, // begin (1469x) - 57602: 162, // binding (1469x) - 57670: 163, // end (1469x) - 57697: 164, // global (1469x) - 57942: 165, // next_row_id (1469x) - 57770: 166, // offset (1469x) - 57788: 167, // policy (1469x) - 57961: 168, // predicate (1469x) - 57885: 169, // temporary (1469x) - 58039: 170, // tiFlash (1469x) - 57899: 171, // unbounded (1469x) - 57904: 172, // user (1469x) - 57720: 173, // jsonType (1468x) - 57959: 174, // planCache (1468x) - 57791: 175, // prepare (1468x) - 57823: 176, // role (1468x) - 57903: 177, // unknown (1468x) - 57916: 178, // wait (1468x) - 57610: 179, // btree (1467x) - 57653: 180, // datetimeType (1467x) - 57654: 181, // dateType (1467x) - 57690: 182, // fixed (1467x) - 57706: 183, // identSQLErrors (1467x) - 57718: 184, // isolation (1467x) - 57724: 185, // last (1467x) - 57732: 186, // location (1467x) - 57735: 187, // max_idxnum (1467x) - 57743: 188, // memory (1467x) - 57769: 189, // off (1467x) - 57775: 190, // optional (1467x) - 57784: 191, // per_db (1467x) - 57793: 192, // privileges (1467x) - 57813: 193, // replica (1467x) - 57816: 194, // required (1467x) - 57828: 195, // rtree (1467x) - 57965: 196, // running (1467x) - 58025: 197, // sampleRate (1467x) - 57838: 198, // sequence (1467x) - 57841: 199, // session (1467x) - 57852: 200, // slow (1467x) - 58028: 201, // stats (1467x) - 57891: 202, // timeType (1467x) - 57905: 203, // validation (1467x) - 57907: 204, // variables (1467x) - 57586: 205, // attributes (1466x) - 57632: 206, // compact (1466x) - 57660: 207, // disable (1466x) - 57665: 208, // duplicate (1466x) - 57666: 209, // dynamic (1466x) - 57667: 210, // enable (1466x) - 57675: 211, // errorKwd (1466x) - 57691: 212, // flush (1466x) - 57694: 213, // full (1466x) - 57742: 214, // mb (1466x) - 57749: 215, // mode (1466x) - 57755: 216, // never (1466x) - 57958: 217, // plan (1466x) - 57787: 218, // plugins (1466x) - 57795: 219, // processlist (1466x) - 57806: 220, // recover (1466x) - 57811: 221, // repair (1466x) - 57812: 222, // repeatable (1466x) - 58027: 223, // statistics (1466x) - 57876: 224, // subpartitions (1466x) - 58038: 225, // tidb (1466x) - 57890: 226, // timestampType (1466x) - 57913: 227, // without (1466x) - 58002: 228, // admin (1465x) - 57598: 229, // backup (1465x) - 58003: 230, // batch (1465x) - 57605: 231, // binlog (1465x) - 57607: 232, // block (1465x) - 57608: 233, // booleanType (1465x) - 57924: 234, // briefType (1465x) - 58004: 235, // buckets (1465x) - 58007: 236, // cardinality (1465x) - 57616: 237, // chain (1465x) - 57623: 238, // clientErrorsSummary (1465x) - 58008: 239, // cmSketch (1465x) - 57624: 240, // coalesce (1465x) - 57633: 241, // compressed (1465x) - 57639: 242, // context (1465x) - 57926: 243, // copyKwd (1465x) - 58010: 244, // correlation (1465x) - 57640: 245, // cpu (1465x) - 57656: 246, // deallocate (1465x) - 58012: 247, // dependency (1465x) - 57659: 248, // directory (1465x) - 57662: 249, // discard (1465x) - 57663: 250, // disk (1465x) - 57664: 251, // do (1465x) - 57931: 252, // dotType (1465x) - 58014: 253, // drainer (1465x) - 58015: 254, // dry (1465x) - 57680: 255, // exchange (1465x) - 57682: 256, // execute (1465x) - 57683: 257, // expansion (1465x) - 57936: 258, // flashback (1465x) - 57693: 259, // format (1465x) - 57696: 260, // general (1465x) - 57700: 261, // help (1465x) - 57701: 262, // histogram (1465x) - 57703: 263, // hosts (1465x) - 57943: 264, // inplace (1465x) - 57713: 265, // instance (1465x) - 57944: 266, // instant (1465x) - 57717: 267, // ipc (1465x) - 58017: 268, // job (1465x) - 58016: 269, // jobs (1465x) - 57722: 270, // labels (1465x) - 57731: 271, // locked (1465x) - 57750: 272, // modify (1465x) - 57756: 273, // next (1465x) - 58018: 274, // nodeID (1465x) - 58019: 275, // nodeState (1465x) - 57768: 276, // nulls (1465x) - 57777: 277, // pageSym (1465x) - 58022: 278, // pump (1465x) - 57799: 279, // purge (1465x) - 57805: 280, // rebuild (1465x) - 57807: 281, // redundant (1465x) - 57808: 282, // reload (1465x) - 57819: 283, // restore (1465x) - 57825: 284, // routine (1465x) - 57966: 285, // s3 (1465x) - 58024: 286, // samples (1465x) - 57833: 287, // secondaryLoad (1465x) - 57834: 288, // secondaryUnload (1465x) - 57844: 289, // share (1465x) - 57846: 290, // shutdown (1465x) - 57855: 291, // source (1465x) - 57587: 292, // statsOptions (1465x) - 57973: 293, // stop (1465x) - 57878: 294, // swaps (1465x) - 57983: 295, // tokudbDefault (1465x) - 57984: 296, // tokudbFast (1465x) - 57985: 297, // tokudbLzma (1465x) - 57986: 298, // tokudbQuickLZ (1465x) - 57988: 299, // tokudbSmall (1465x) - 57987: 300, // tokudbSnappy (1465x) - 57989: 301, // tokudbUncompressed (1465x) - 57990: 302, // tokudbZlib (1465x) - 57991: 303, // tokudbZstd (1465x) - 58040: 304, // topn (1465x) - 57894: 305, // trace (1465x) - 57895: 306, // traditional (1465x) - 57998: 307, // trueCardCost (1465x) - 57997: 308, // verboseType (1465x) - 57910: 309, // warnings (1465x) - 57576: 310, // action (1464x) - 57577: 311, // advise (1464x) - 57579: 312, // against (1464x) - 57580: 313, // ago (1464x) - 57582: 314, // always (1464x) - 57599: 315, // backups (1464x) - 57601: 316, // bernoulli (1464x) - 57603: 317, // bindingCache (1464x) - 57606: 318, // bitType (1464x) - 57609: 319, // boolType (1464x) - 58005: 320, // builtins (1464x) - 58006: 321, // cancel (1464x) - 57613: 322, // capture (1464x) - 57614: 323, // cascaded (1464x) - 57615: 324, // causal (1464x) - 57621: 325, // cleanup (1464x) - 57622: 326, // client (1464x) - 57649: 327, // cluster (1464x) - 57625: 328, // collation (1464x) - 58009: 329, // columnStatsUsage (1464x) - 57631: 330, // committed (1464x) - 57628: 331, // config (1464x) - 57637: 332, // consistency (1464x) - 57638: 333, // consistent (1464x) - 58011: 334, // ddl (1464x) - 58013: 335, // depth (1464x) - 57661: 336, // disabled (1464x) - 57932: 337, // dump (1464x) - 57668: 338, // enabled (1464x) - 57673: 339, // engines (1464x) - 57674: 340, // enum (1464x) - 57678: 341, // events (1464x) - 57679: 342, // evolve (1464x) - 57684: 343, // expire (1464x) - 57934: 344, // exprPushdownBlacklist (1464x) - 57685: 345, // extended (1464x) - 57686: 346, // faultsSym (1464x) - 57695: 347, // function (1464x) - 57698: 348, // grants (1464x) - 58035: 349, // histogramsInFlight (1464x) - 57702: 350, // history (1464x) - 57708: 351, // imports (1464x) - 57710: 352, // incremental (1464x) - 57711: 353, // indexes (1464x) - 57945: 354, // internal (1464x) - 57715: 355, // invoker (1464x) - 57716: 356, // io (1464x) - 57723: 357, // language (1464x) - 57728: 358, // level (1464x) - 57729: 359, // list (1464x) - 57734: 360, // master (1464x) - 57736: 361, // max_minutes (1464x) - 57753: 362, // national (1464x) - 57754: 363, // ncharType (1464x) - 57757: 364, // nextval (1464x) - 57765: 365, // none (1464x) - 57767: 366, // nvarcharType (1464x) - 57774: 367, // open (1464x) - 58020: 368, // optimistic (1464x) - 57956: 369, // optRuleBlacklist (1464x) - 57778: 370, // parser (1464x) - 57779: 371, // partial (1464x) - 57780: 372, // partitioning (1464x) - 57785: 373, // per_table (1464x) - 57783: 374, // percent (1464x) - 58021: 375, // pessimistic (1464x) - 57792: 376, // preserve (1464x) - 57796: 377, // profile (1464x) - 57797: 378, // profiles (1464x) - 57801: 379, // queries (1464x) - 57963: 380, // recent (1464x) - 58045: 381, // region (1464x) - 57964: 382, // replayer (1464x) - 58043: 383, // reset (1464x) - 57820: 384, // restores (1464x) - 58023: 385, // run (1464x) - 57835: 386, // security (1464x) - 57840: 387, // serializable (1464x) - 58026: 388, // sessionStates (1464x) - 57848: 389, // simple (1464x) - 57851: 390, // slave (1464x) - 58032: 391, // statsHealthy (1464x) - 58030: 392, // statsHistograms (1464x) - 58034: 393, // statsLocked (1464x) - 58029: 394, // statsMeta (1464x) - 57974: 395, // strict (1464x) - 57879: 396, // switchesSym (1464x) - 57880: 397, // system (1464x) - 57881: 398, // systemTime (1464x) - 57979: 399, // target (1464x) - 58037: 400, // telemetryID (1464x) - 57886: 401, // temptable (1464x) - 57887: 402, // textType (1464x) - 57982: 403, // tls (1464x) - 57992: 404, // top (1464x) - 57896: 405, // transaction (1464x) - 57897: 406, // triggers (1464x) - 57900: 407, // uncommitted (1464x) - 57901: 408, // undefined (1464x) - 58042: 409, // width (1464x) - 57914: 410, // x509 (1464x) - 57917: 411, // addDate (1463x) - 57583: 412, // any (1463x) - 57918: 413, // approxCountDistinct (1463x) - 57919: 414, // approxPercentile (1463x) - 57595: 415, // avg (1463x) - 57920: 416, // bitAnd (1463x) - 57921: 417, // bitOr (1463x) - 57922: 418, // bitXor (1463x) - 57923: 419, // bound (1463x) - 57925: 420, // cast (1463x) - 57928: 421, // curTime (1463x) - 57929: 422, // dateAdd (1463x) - 57930: 423, // dateSub (1463x) - 57676: 424, // escape (1463x) - 57677: 425, // event (1463x) - 57933: 426, // exact (1463x) - 57681: 427, // exclusive (1463x) - 57935: 428, // extract (1463x) - 57688: 429, // file (1463x) - 57937: 430, // follower (1463x) - 57940: 431, // getFormat (1463x) - 57941: 432, // groupConcat (1463x) - 57946: 433, // jsonArrayagg (1463x) - 57947: 434, // jsonObjectAgg (1463x) - 57726: 435, // lastval (1463x) - 57948: 436, // leader (1463x) - 57950: 437, // learner (1463x) - 57954: 438, // max (1463x) - 57953: 439, // min (1463x) - 57752: 440, // names (1463x) - 57955: 441, // now (1463x) - 57960: 442, // position (1463x) - 57794: 443, // process (1463x) - 57798: 444, // proxy (1463x) - 57803: 445, // quick (1463x) - 57814: 446, // replicas (1463x) - 57815: 447, // replication (1463x) - 57822: 448, // reverse (1463x) - 57826: 449, // rowCount (1463x) - 57842: 450, // setval (1463x) - 57845: 451, // shared (1463x) - 57854: 452, // some (1463x) - 57856: 453, // sqlBufferResult (1463x) - 57857: 454, // sqlCache (1463x) - 57858: 455, // sqlNoCache (1463x) - 57968: 456, // staleness (1463x) - 57969: 457, // std (1463x) - 57970: 458, // stddev (1463x) - 57971: 459, // stddevPop (1463x) - 57972: 460, // stddevSamp (1463x) - 57975: 461, // strong (1463x) - 57976: 462, // subDate (1463x) - 57978: 463, // substring (1463x) - 57977: 464, // sum (1463x) - 57877: 465, // super (1463x) - 58036: 466, // telemetry (1463x) - 57980: 467, // timestampAdd (1463x) - 57981: 468, // timestampDiff (1463x) - 57993: 469, // trim (1463x) - 57994: 470, // variance (1463x) - 57995: 471, // varPop (1463x) - 57996: 472, // varSamp (1463x) - 57999: 473, // voter (1463x) - 57912: 474, // weightString (1463x) - 57489: 475, // on (1398x) - 40: 476, // '(' (1331x) - 57570: 477, // with (1215x) - 57350: 478, // stringLit (1203x) - 58091: 479, // not2 (1195x) - 57482: 480, // not (1132x) - 57365: 481, // as (1109x) - 57399: 482, // defaultKwd (1103x) - 57549: 483, // union (1061x) - 57555: 484, // using (1054x) - 57462: 485, // left (1049x) - 57516: 486, // right (1049x) - 57380: 487, // collate (1046x) - 43: 488, // '+' (1026x) - 45: 489, // '-' (1025x) - 57481: 490, // mod (1005x) - 57497: 491, // partition (965x) - 57436: 492, // ignore (960x) - 57416: 493, // except (953x) - 57442: 494, // intersect (952x) - 57486: 495, // null (950x) - 57464: 496, // limit (933x) - 57421: 497, // forKwd (930x) - 57559: 498, // values (925x) - 57444: 499, // into (923x) - 57470: 500, // lock (919x) - 57567: 501, // where (914x) - 58080: 502, // eq (911x) - 57424: 503, // from (911x) - 57418: 504, // fetch (909x) - 57494: 505, // order (905x) - 57422: 506, // force (901x) - 57512: 507, // replace (898x) - 57378: 508, // charType (897x) - 57523: 509, // set (892x) - 57364: 510, // and (891x) - 58075: 511, // intLit (887x) - 57493: 512, // or (867x) - 57355: 513, // andand (866x) - 57786: 514, // pipesAsOr (866x) - 57571: 515, // xor (866x) - 57428: 516, // group (840x) - 57430: 517, // having (840x) - 57534: 518, // straightJoin (834x) - 57569: 519, // window (826x) - 57454: 520, // join (822x) - 57463: 521, // like (815x) - 57574: 522, // natural (812x) - 42: 523, // '*' (811x) - 57385: 524, // cross (811x) - 57440: 525, // inner (811x) - 125: 526, // '}' (808x) - 57519: 527, // rows (796x) - 57554: 528, // use (792x) - 57537: 529, // tableSample (786x) - 57502: 530, // rangeKwd (785x) - 57429: 531, // groups (784x) - 57403: 532, // desc (783x) - 57369: 533, // binaryType (782x) - 57366: 534, // asc (781x) - 57394: 535, // dayHour (781x) - 57395: 536, // dayMicrosecond (781x) - 57396: 537, // dayMinute (781x) - 57397: 538, // daySecond (781x) - 57432: 539, // hourMicrosecond (781x) - 57433: 540, // hourMinute (781x) - 57434: 541, // hourSecond (781x) - 57479: 542, // minuteMicrosecond (781x) - 57480: 543, // minuteSecond (781x) - 57521: 544, // secondMicrosecond (781x) - 57572: 545, // yearMonth (781x) - 57566: 546, // when (778x) - 57437: 547, // in (776x) - 57411: 548, // elseKwd (775x) - 57540: 549, // then (772x) - 47: 550, // '/' (769x) - 37: 551, // '%' (768x) - 38: 552, // '&' (768x) - 94: 553, // '^' (768x) - 124: 554, // '|' (768x) - 57407: 555, // div (768x) - 58085: 556, // lsh (768x) - 58090: 557, // rsh (768x) - 60: 558, // '<' (765x) - 62: 559, // '>' (765x) - 58081: 560, // ge (765x) - 57446: 561, // is (765x) - 58082: 562, // le (765x) - 58086: 563, // neq (765x) - 58087: 564, // neqSynonym (765x) - 58088: 565, // nulleq (765x) - 57367: 566, // between (763x) - 57435: 567, // ifKwd (758x) - 57508: 568, // regexpKwd (755x) - 57517: 569, // rlike (755x) - 57447: 570, // insert (749x) - 57351: 571, // singleAtIdentifier (739x) - 57536: 572, // tableKwd (739x) - 57390: 573, // currentUser (735x) - 57417: 574, // falseKwd (733x) - 57547: 575, // trueKwd (733x) - 58074: 576, // decLit (727x) - 58073: 577, // floatLit (727x) - 57518: 578, // row (727x) - 58076: 579, // hexLit (725x) - 58089: 580, // paramMarker (725x) - 57443: 581, // interval (724x) - 123: 582, // '{' (723x) - 58077: 583, // bitLit (723x) - 57455: 584, // key (723x) - 57392: 585, // database (719x) - 57414: 586, // exists (718x) - 57383: 587, // convert (715x) - 58061: 588, // builtinNow (714x) - 57389: 589, // currentTs (714x) - 57352: 590, // doubleAtIdentifier (714x) - 57468: 591, // localTime (714x) - 57469: 592, // localTs (714x) - 57379: 593, // check (713x) - 57500: 594, // primary (713x) - 57349: 595, // underscoreCS (713x) - 58050: 596, // builtinCount (712x) - 57356: 597, // pipes (712x) - 33: 598, // '!' (711x) - 126: 599, // '~' (711x) - 58051: 600, // builtinApproxCountDistinct (711x) - 58052: 601, // builtinApproxPercentile (711x) - 58046: 602, // builtinBitAnd (711x) - 58047: 603, // builtinBitOr (711x) - 58048: 604, // builtinBitXor (711x) - 58049: 605, // builtinCast (711x) - 58053: 606, // builtinCurDate (711x) - 58054: 607, // builtinCurTime (711x) - 58055: 608, // builtinDateAdd (711x) - 58056: 609, // builtinDateSub (711x) - 58057: 610, // builtinExtract (711x) - 58058: 611, // builtinGroupConcat (711x) - 58059: 612, // builtinMax (711x) - 58060: 613, // builtinMin (711x) - 58062: 614, // builtinPosition (711x) - 58066: 615, // builtinStddevPop (711x) - 58067: 616, // builtinStddevSamp (711x) - 58063: 617, // builtinSubstring (711x) - 58064: 618, // builtinSum (711x) - 58065: 619, // builtinSysDate (711x) - 58068: 620, // builtinTranslate (711x) - 58069: 621, // builtinTrim (711x) - 58070: 622, // builtinUser (711x) - 58071: 623, // builtinVarPop (711x) - 58072: 624, // builtinVarSamp (711x) - 57375: 625, // caseKwd (711x) - 57386: 626, // cumeDist (711x) - 57387: 627, // currentDate (711x) - 57391: 628, // currentRole (711x) - 57388: 629, // currentTime (711x) - 57402: 630, // denseRank (711x) - 57419: 631, // firstValue (711x) - 57458: 632, // lag (711x) - 57459: 633, // lastValue (711x) - 57460: 634, // lead (711x) - 57484: 635, // nthValue (711x) - 57485: 636, // ntile (711x) - 57498: 637, // percentRank (711x) - 57503: 638, // rank (711x) - 57511: 639, // repeat (711x) - 57520: 640, // rowNumber (711x) - 57535: 641, // tidbCurrentTSO (711x) - 57556: 642, // utcDate (711x) - 57558: 643, // utcTime (711x) - 57557: 644, // utcTimestamp (711x) - 57548: 645, // unique (706x) - 57382: 646, // constraint (704x) - 57507: 647, // references (701x) - 57426: 648, // generated (697x) - 57522: 649, // selectKwd (696x) - 57377: 650, // character (661x) - 57474: 651, // match (653x) - 57438: 652, // index (649x) - 57544: 653, // to (572x) - 57361: 654, // all (557x) - 46: 655, // '.' (552x) - 57363: 656, // analyze (536x) - 57552: 657, // update (532x) - 57475: 658, // maxValue (520x) - 58083: 659, // jss (518x) - 58084: 660, // juss (518x) - 57465: 661, // lines (507x) - 58079: 662, // assignmentEq (504x) - 57372: 663, // by (504x) - 58345: 664, // Identifier (502x) - 58424: 665, // NotKeywordToken (502x) - 58653: 666, // TiDBKeyword (502x) - 58663: 667, // UnReservedKeyword (502x) - 57362: 668, // alter (501x) - 57513: 669, // require (499x) - 64: 670, // '@' (494x) - 57527: 671, // sql (491x) - 57409: 672, // drop (488x) - 57374: 673, // cascade (487x) - 57504: 674, // read (487x) - 57514: 675, // restrict (487x) - 57347: 676, // asof (485x) - 57384: 677, // create (483x) - 57423: 678, // foreign (483x) - 57425: 679, // fulltext (483x) - 57348: 680, // toTimestamp (482x) - 57562: 681, // varcharacter (481x) - 57561: 682, // varcharType (481x) - 57376: 683, // change (480x) - 57398: 684, // decimalType (480x) - 57408: 685, // doubleType (480x) - 57420: 686, // floatType (480x) - 57441: 687, // integerType (480x) - 57448: 688, // intType (480x) - 57505: 689, // realType (480x) - 57510: 690, // rename (480x) - 57568: 691, // write (480x) - 57563: 692, // varbinaryType (479x) - 57360: 693, // add (478x) - 57368: 694, // bigIntType (478x) - 57370: 695, // blobType (478x) - 57449: 696, // int1Type (478x) - 57450: 697, // int2Type (478x) - 57451: 698, // int3Type (478x) - 57452: 699, // int4Type (478x) - 57453: 700, // int8Type (478x) - 57560: 701, // long (478x) - 57471: 702, // longblobType (478x) - 57472: 703, // longtextType (478x) - 57476: 704, // mediumblobType (478x) - 57477: 705, // mediumIntType (478x) - 57478: 706, // mediumtextType (478x) - 57487: 707, // numericType (478x) - 57490: 708, // optimize (478x) - 57525: 709, // smallIntType (478x) - 57541: 710, // tinyblobType (478x) - 57542: 711, // tinyIntType (478x) - 57543: 712, // tinytextType (478x) - 58618: 713, // SubSelect (223x) - 58673: 714, // UserVariable (181x) - 58593: 715, // SimpleIdent (180x) - 58398: 716, // Literal (178x) - 58608: 717, // StringLiteral (178x) - 58421: 718, // NextValueForSequence (177x) - 58322: 719, // FunctionCallGeneric (176x) - 58323: 720, // FunctionCallKeyword (176x) - 58324: 721, // FunctionCallNonKeyword (176x) - 58325: 722, // FunctionNameConflict (176x) - 58326: 723, // FunctionNameDateArith (176x) - 58327: 724, // FunctionNameDateArithMultiForms (176x) - 58328: 725, // FunctionNameDatetimePrecision (176x) - 58329: 726, // FunctionNameOptionalBraces (176x) - 58330: 727, // FunctionNameSequence (176x) - 58592: 728, // SimpleExpr (176x) - 58619: 729, // SumExpr (176x) - 58621: 730, // SystemVariable (176x) - 58684: 731, // Variable (176x) - 58707: 732, // WindowFuncCall (176x) - 58168: 733, // BitExpr (163x) - 58498: 734, // PredicateExpr (132x) - 58171: 735, // BoolPri (129x) - 58286: 736, // Expression (129x) - 58419: 737, // NUM (103x) - 58722: 738, // logAnd (97x) - 58723: 739, // logOr (97x) - 58631: 740, // TableName (77x) - 58276: 741, // EqOpt (75x) - 58609: 742, // StringName (56x) - 57401: 743, // deleteKwd (52x) - 57551: 744, // unsigned (47x) - 58389: 745, // LengthNum (46x) - 57496: 746, // over (45x) - 57573: 747, // zerofill (45x) - 58194: 748, // ColumnName (41x) - 57405: 749, // distinct (36x) - 57406: 750, // distinctRow (36x) - 58712: 751, // WindowingClause (35x) - 58546: 752, // SelectStmt (34x) - 58547: 753, // SelectStmtBasic (34x) - 58549: 754, // SelectStmtFromDualTable (34x) - 58550: 755, // SelectStmtFromTable (34x) - 58567: 756, // SetOprClause (34x) - 57400: 757, // delayed (33x) - 57431: 758, // highPriority (33x) - 57473: 759, // lowPriority (33x) - 58568: 760, // SetOprClauseList (33x) - 58571: 761, // SetOprStmtWithLimitOrderBy (33x) - 58572: 762, // SetOprStmtWoutLimitOrderBy (33x) - 58713: 763, // WithClause (31x) - 58559: 764, // SelectStmtWithClause (30x) - 58570: 765, // SetOprStmt (30x) - 57354: 766, // hintComment (27x) - 58377: 767, // Int64Num (26x) - 58297: 768, // FieldLen (25x) - 58463: 769, // OptWindowingClause (24x) - 58667: 770, // UpdateStmtNoWith (24x) - 58251: 771, // DeleteWithoutUsingStmt (23x) - 58469: 772, // OrderBy (23x) - 58553: 773, // SelectStmtLimit (23x) - 57528: 774, // sqlBigResult (23x) - 57529: 775, // sqlCalcFoundRows (23x) - 57530: 776, // sqlSmallResult (23x) - 58374: 777, // InsertIntoStmt (21x) - 58666: 778, // UpdateStmt (21x) - 58182: 779, // CharsetKw (20x) - 58520: 780, // ReplaceIntoStmt (20x) - 58675: 781, // Username (20x) - 58287: 782, // ExpressionList (18x) - 58250: 783, // DeleteWithUsingStmt (17x) - 58346: 784, // IfExists (17x) - 58493: 785, // PlacementPolicyOption (17x) - 58632: 786, // TableNameList (17x) - 57539: 787, // terminated (16x) - 58249: 788, // DeleteFromStmt (15x) - 58253: 789, // DistinctKwd (15x) - 58347: 790, // IfNotExists (15x) - 58481: 791, // PartitionNameList (15x) - 58254: 792, // DistinctOpt (14x) - 57412: 793, // enclosed (14x) - 58448: 794, // OptFieldLen (14x) - 58697: 795, // WhereClause (14x) - 58698: 796, // WhereClauseOptional (14x) - 58246: 797, // DefaultKwdOpt (13x) - 57413: 798, // escaped (13x) - 57492: 799, // optionally (13x) - 58655: 800, // TimestampUnit (13x) - 58285: 801, // ExprOrDefault (12x) - 58383: 802, // JoinTable (12x) - 58442: 803, // OptBinary (12x) - 57509: 804, // release (12x) - 58536: 805, // RolenameComposed (12x) - 58628: 806, // TableFactor (12x) - 58641: 807, // TableRef (12x) - 58141: 808, // AnalyzeOptionListOpt (11x) - 58317: 809, // FromOrIn (11x) - 58137: 810, // AlterTableStmt (10x) - 58183: 811, // CharsetName (10x) - 58195: 812, // ColumnNameList (10x) - 58236: 813, // DBName (10x) - 57467: 814, // load (10x) - 58425: 815, // NotSym (10x) - 57483: 816, // noWriteToBinLog (10x) - 58470: 817, // OrderByOptional (10x) - 58472: 818, // PartDefOption (10x) - 58591: 819, // SignedNum (10x) - 58654: 820, // TimeUnit (10x) - 58174: 821, // BuggyDefaultFalseDistinctOpt (9x) - 58245: 822, // DefaultFalseDistinctOpt (9x) - 58384: 823, // JoinType (9x) - 58432: 824, // NumLiteral (9x) - 58535: 825, // Rolename (9x) - 58530: 826, // RoleNameString (9x) - 58235: 827, // CrossOpt (8x) - 58277: 828, // EqOrAssignmentEq (8x) - 58284: 829, // ExplainableStmt (8x) - 58288: 830, // ExpressionListOpt (8x) - 58368: 831, // IndexPartSpecification (8x) - 58385: 832, // KeyOrIndex (8x) - 58422: 833, // NoWriteToBinLogAliasOpt (8x) - 58554: 834, // SelectStmtLimitOpt (8x) - 58687: 835, // VariableName (8x) - 58123: 836, // AllOrPartitionNameList (7x) - 58219: 837, // ConstraintKeywordOpt (7x) - 58241: 838, // DatabaseSym (7x) - 58303: 839, // FieldsOrColumns (7x) - 58315: 840, // ForceOpt (7x) - 58369: 841, // IndexPartSpecificationList (7x) - 58502: 842, // Priority (7x) - 58540: 843, // RowFormat (7x) - 58543: 844, // RowValue (7x) - 58565: 845, // SetExpr (7x) - 58577: 846, // ShowDatabaseNameOpt (7x) - 58638: 847, // TableOption (7x) - 57564: 848, // varying (7x) - 58142: 849, // AnalyzeTableStmt (6x) - 58163: 850, // BeginTransactionStmt (6x) - 58165: 851, // BindableStmt (6x) - 57381: 852, // column (6x) - 58189: 853, // ColumnDef (6x) - 58209: 854, // CommitStmt (6x) - 58238: 855, // DatabaseOption (6x) - 58279: 856, // EscapedTableRef (6x) - 58301: 857, // FieldTerminator (6x) - 57427: 858, // grant (6x) - 58351: 859, // IgnoreOptional (6x) - 58360: 860, // IndexInvisible (6x) - 58365: 861, // IndexNameList (6x) - 58371: 862, // IndexType (6x) - 58402: 863, // LoadDataStmt (6x) - 58482: 864, // PartitionNameListOpt (6x) - 58515: 865, // ReleaseSavepointStmt (6x) - 58537: 866, // RolenameList (6x) - 58539: 867, // RollbackStmt (6x) - 58544: 868, // SavepointStmt (6x) - 58575: 869, // SetStmt (6x) - 57524: 870, // show (6x) - 58636: 871, // TableOptimizerHints (6x) - 58676: 872, // UsernameList (6x) - 58714: 873, // WithClustered (6x) - 58121: 874, // AlgorithmClause (5x) - 58176: 875, // ByItem (5x) - 58188: 876, // CollationName (5x) - 58192: 877, // ColumnKeywordOpt (5x) - 58252: 878, // DirectPlacementOption (5x) - 58299: 879, // FieldOpt (5x) - 58300: 880, // FieldOpts (5x) - 58343: 881, // IdentList (5x) - 58363: 882, // IndexName (5x) - 58366: 883, // IndexOption (5x) - 58367: 884, // IndexOptionList (5x) - 57439: 885, // infile (5x) - 58394: 886, // LimitOption (5x) - 58406: 887, // LockClause (5x) - 58444: 888, // OptCharsetWithOptBinary (5x) - 58455: 889, // OptNullTreatment (5x) - 58496: 890, // PolicyName (5x) - 58503: 891, // PriorityOpt (5x) - 58545: 892, // SelectLockOpt (5x) - 58552: 893, // SelectStmtIntoOption (5x) - 58642: 894, // TableRefs (5x) - 58669: 895, // UserSpec (5x) - 58147: 896, // Assignment (4x) - 58153: 897, // AuthString (4x) - 58155: 898, // BRIEBooleanOptionName (4x) - 58156: 899, // BRIEIntegerOptionName (4x) - 58157: 900, // BRIEKeywordOptionName (4x) - 58158: 901, // BRIEOption (4x) - 58159: 902, // BRIEOptions (4x) - 58161: 903, // BRIEStringOptionName (4x) - 58175: 904, // BuiltinFunction (4x) - 58177: 905, // ByList (4x) - 58181: 906, // Char (4x) - 58213: 907, // ConfigItemName (4x) - 58217: 908, // Constraint (4x) - 58311: 909, // FloatOpt (4x) - 58372: 910, // IndexTypeName (4x) - 57491: 911, // option (4x) - 58460: 912, // OptWild (4x) - 57495: 913, // outer (4x) - 58497: 914, // Precision (4x) - 58511: 915, // ReferDef (4x) - 58526: 916, // RestrictOrCascadeOpt (4x) - 58542: 917, // RowStmt (4x) - 58560: 918, // SequenceOption (4x) - 57533: 919, // statsExtended (4x) - 58623: 920, // TableAsName (4x) - 58624: 921, // TableAsNameOpt (4x) - 58635: 922, // TableNameOptWild (4x) - 58637: 923, // TableOptimizerHintsOpt (4x) - 58639: 924, // TableOptionList (4x) - 58657: 925, // TraceableStmt (4x) - 58658: 926, // TransactionChar (4x) - 58670: 927, // UserSpecList (4x) - 58708: 928, // WindowName (4x) - 58144: 929, // AsOfClause (3x) - 58148: 930, // AssignmentList (3x) - 58150: 931, // AttributesOpt (3x) - 58172: 932, // Boolean (3x) - 58201: 933, // ColumnOption (3x) - 58204: 934, // ColumnPosition (3x) - 58210: 935, // CommonTableExpr (3x) - 58231: 936, // CreateTableStmt (3x) - 58239: 937, // DatabaseOptionList (3x) - 58247: 938, // DefaultTrueDistinctOpt (3x) - 58273: 939, // EnforcedOrNot (3x) - 57415: 940, // explain (3x) - 58290: 941, // ExtendedPriv (3x) - 58331: 942, // GeneratedAlways (3x) - 58333: 943, // GlobalScope (3x) - 58337: 944, // GroupByClause (3x) - 58355: 945, // IndexHint (3x) - 58359: 946, // IndexHintType (3x) - 58364: 947, // IndexNameAndTypeOpt (3x) - 57456: 948, // keys (3x) - 58396: 949, // Lines (3x) - 58416: 950, // MaxValueOrExpression (3x) - 58426: 951, // NowSym (3x) - 58427: 952, // NowSymFunc (3x) - 58428: 953, // NowSymOptionFraction (3x) - 58456: 954, // OptOrder (3x) - 58459: 955, // OptTemporary (3x) - 58473: 956, // PartDefOptionList (3x) - 58475: 957, // PartitionDefinition (3x) - 58485: 958, // PasswordExpire (3x) - 58487: 959, // PasswordOrLockOption (3x) - 58495: 960, // PluginNameList (3x) - 58501: 961, // PrimaryOpt (3x) - 58504: 962, // PrivElem (3x) - 58506: 963, // PrivType (3x) - 57501: 964, // procedure (3x) - 58521: 965, // RequireClause (3x) - 58522: 966, // RequireClauseOpt (3x) - 58524: 967, // RequireListElement (3x) - 58538: 968, // RolenameWithoutIdent (3x) - 58531: 969, // RoleOrPrivElem (3x) - 58551: 970, // SelectStmtGroup (3x) - 58569: 971, // SetOprOpt (3x) - 58622: 972, // TableAliasRefList (3x) - 58625: 973, // TableElement (3x) - 58634: 974, // TableNameListOpt2 (3x) - 58650: 975, // TextString (3x) - 58659: 976, // TransactionChars (3x) - 57546: 977, // trigger (3x) - 57550: 978, // unlock (3x) - 57553: 979, // usage (3x) - 58680: 980, // ValuesList (3x) - 58682: 981, // ValuesStmtList (3x) - 58678: 982, // ValueSym (3x) - 58685: 983, // VariableAssignment (3x) - 58705: 984, // WindowFrameStart (3x) - 58119: 985, // AdminStmt (2x) - 58122: 986, // AllColumnsOrPredicateColumnsOpt (2x) - 58124: 987, // AlterDatabaseStmt (2x) - 58125: 988, // AlterImportStmt (2x) - 58126: 989, // AlterInstanceStmt (2x) - 58127: 990, // AlterOrderItem (2x) - 58129: 991, // AlterPolicyStmt (2x) - 58130: 992, // AlterSequenceOption (2x) - 58132: 993, // AlterSequenceStmt (2x) - 58134: 994, // AlterTableSpec (2x) - 58138: 995, // AlterUserStmt (2x) - 58139: 996, // AnalyzeOption (2x) - 58167: 997, // BinlogStmt (2x) - 58160: 998, // BRIEStmt (2x) - 58162: 999, // BRIETables (2x) - 57373: 1000, // call (2x) - 58178: 1001, // CallStmt (2x) - 58179: 1002, // CastType (2x) - 58180: 1003, // ChangeStmt (2x) - 58186: 1004, // CheckConstraintKeyword (2x) - 58196: 1005, // ColumnNameListOpt (2x) - 58199: 1006, // ColumnNameOrUserVariable (2x) - 58202: 1007, // ColumnOptionList (2x) - 58203: 1008, // ColumnOptionListOpt (2x) - 58205: 1009, // ColumnSetValue (2x) - 58208: 1010, // CommentOrAttributeOption (2x) - 58212: 1011, // CompletionTypeWithinTransaction (2x) - 58214: 1012, // ConnectionOption (2x) - 58216: 1013, // ConnectionOptions (2x) - 58220: 1014, // CreateBindingStmt (2x) - 58221: 1015, // CreateDatabaseStmt (2x) - 58222: 1016, // CreateImportStmt (2x) - 58223: 1017, // CreateIndexStmt (2x) - 58224: 1018, // CreatePolicyStmt (2x) - 58225: 1019, // CreateRoleStmt (2x) - 58227: 1020, // CreateSequenceStmt (2x) - 58228: 1021, // CreateStatisticsStmt (2x) - 58229: 1022, // CreateTableOptionListOpt (2x) - 58232: 1023, // CreateUserStmt (2x) - 58234: 1024, // CreateViewStmt (2x) - 57393: 1025, // databases (2x) - 58243: 1026, // DeallocateStmt (2x) - 58244: 1027, // DeallocateSym (2x) - 57404: 1028, // describe (2x) - 58255: 1029, // DoStmt (2x) - 58256: 1030, // DropBindingStmt (2x) - 58257: 1031, // DropDatabaseStmt (2x) - 58258: 1032, // DropImportStmt (2x) - 58259: 1033, // DropIndexStmt (2x) - 58260: 1034, // DropPolicyStmt (2x) - 58261: 1035, // DropRoleStmt (2x) - 58262: 1036, // DropSequenceStmt (2x) - 58263: 1037, // DropStatisticsStmt (2x) - 58264: 1038, // DropStatsStmt (2x) - 58265: 1039, // DropTableStmt (2x) - 58266: 1040, // DropUserStmt (2x) - 58267: 1041, // DropViewStmt (2x) - 58269: 1042, // DuplicateOpt (2x) - 58271: 1043, // EmptyStmt (2x) - 58272: 1044, // EncryptionOpt (2x) - 58274: 1045, // EnforcedOrNotOpt (2x) - 58278: 1046, // ErrorHandling (2x) - 58280: 1047, // ExecuteStmt (2x) - 58281: 1048, // ExplainFormatType (2x) - 58282: 1049, // ExplainStmt (2x) - 58283: 1050, // ExplainSym (2x) - 58292: 1051, // Field (2x) - 58295: 1052, // FieldItem (2x) - 58302: 1053, // Fields (2x) - 58307: 1054, // FlashbackDatabaseStmt (2x) - 58308: 1055, // FlashbackTableStmt (2x) - 58309: 1056, // FlashbackToNewName (2x) - 58310: 1057, // FlashbackToTimestampStmt (2x) - 58314: 1058, // FlushStmt (2x) - 58320: 1059, // FuncDatetimePrecList (2x) - 58321: 1060, // FuncDatetimePrecListOpt (2x) - 58334: 1061, // GrantProxyStmt (2x) - 58335: 1062, // GrantRoleStmt (2x) - 58336: 1063, // GrantStmt (2x) - 58338: 1064, // HandleRange (2x) - 58340: 1065, // HashString (2x) - 58341: 1066, // HavingClause (2x) - 58342: 1067, // HelpStmt (2x) - 58354: 1068, // IndexAdviseStmt (2x) - 58356: 1069, // IndexHintList (2x) - 58357: 1070, // IndexHintListOpt (2x) - 58362: 1071, // IndexLockAndAlgorithmOpt (2x) - 58375: 1072, // InsertValues (2x) - 58380: 1073, // IntoOpt (2x) - 58386: 1074, // KeyOrIndexOpt (2x) - 57457: 1075, // kill (2x) - 58387: 1076, // KillOrKillTiDB (2x) - 58388: 1077, // KillStmt (2x) - 58393: 1078, // LimitClause (2x) - 57466: 1079, // linear (2x) - 58395: 1080, // LinearOpt (2x) - 58399: 1081, // LoadDataSetItem (2x) - 58403: 1082, // LoadStatsStmt (2x) - 58404: 1083, // LocalOpt (2x) - 58405: 1084, // LocationLabelList (2x) - 58407: 1085, // LockStatsStmt (2x) - 58408: 1086, // LockTablesStmt (2x) - 58417: 1087, // MaxValueOrExpressionList (2x) - 58423: 1088, // NonTransactionalDMLStmt (2x) - 58429: 1089, // NowSymOptionFractionParentheses (2x) - 58431: 1090, // NumList (2x) - 58434: 1091, // ObjectType (2x) - 57488: 1092, // of (2x) - 58435: 1093, // OfTablesOpt (2x) - 58436: 1094, // OnCommitOpt (2x) - 58437: 1095, // OnDelete (2x) - 58440: 1096, // OnUpdate (2x) - 58445: 1097, // OptCollate (2x) - 58450: 1098, // OptFull (2x) - 58452: 1099, // OptInteger (2x) - 58465: 1100, // OptionalBraces (2x) - 58464: 1101, // OptionLevel (2x) - 58454: 1102, // OptLeadLagInfo (2x) - 58453: 1103, // OptLLDefault (2x) - 58471: 1104, // OuterOpt (2x) - 58476: 1105, // PartitionDefinitionList (2x) - 58477: 1106, // PartitionDefinitionListOpt (2x) - 58478: 1107, // PartitionIntervalOpt (2x) - 58484: 1108, // PartitionOpt (2x) - 58486: 1109, // PasswordOpt (2x) - 58488: 1110, // PasswordOrLockOptionList (2x) - 58489: 1111, // PasswordOrLockOptions (2x) - 58492: 1112, // PlacementOptionList (2x) - 58494: 1113, // PlanReplayerStmt (2x) - 58500: 1114, // PreparedStmt (2x) - 58505: 1115, // PrivLevel (2x) - 58508: 1116, // PurgeImportStmt (2x) - 58509: 1117, // QuickOptional (2x) - 58510: 1118, // RecoverTableStmt (2x) - 58512: 1119, // ReferOpt (2x) - 58514: 1120, // RegexpSym (2x) - 58516: 1121, // RenameTableStmt (2x) - 58517: 1122, // RenameUserStmt (2x) - 58519: 1123, // RepeatableOpt (2x) - 58525: 1124, // RestartStmt (2x) - 58527: 1125, // ResumeImportStmt (2x) - 57515: 1126, // revoke (2x) - 58528: 1127, // RevokeRoleStmt (2x) - 58529: 1128, // RevokeStmt (2x) - 58532: 1129, // RoleOrPrivElemList (2x) - 58533: 1130, // RoleSpec (2x) - 58555: 1131, // SelectStmtOpt (2x) - 58558: 1132, // SelectStmtSQLCache (2x) - 58562: 1133, // SetBindingStmt (2x) - 58563: 1134, // SetDefaultRoleOpt (2x) - 58564: 1135, // SetDefaultRoleStmt (2x) - 58574: 1136, // SetRoleStmt (2x) - 58578: 1137, // ShowImportStmt (2x) - 58583: 1138, // ShowProfileType (2x) - 58586: 1139, // ShowStmt (2x) - 58587: 1140, // ShowTableAliasOpt (2x) - 58589: 1141, // ShutdownStmt (2x) - 58590: 1142, // SignedLiteral (2x) - 58594: 1143, // SplitOption (2x) - 58595: 1144, // SplitRegionStmt (2x) - 58599: 1145, // Statement (2x) - 58602: 1146, // StatsOptionsOpt (2x) - 58603: 1147, // StatsPersistentVal (2x) - 58604: 1148, // StatsType (2x) - 58605: 1149, // StopImportStmt (2x) - 58612: 1150, // SubPartDefinition (2x) - 58615: 1151, // SubPartitionMethod (2x) - 58620: 1152, // Symbol (2x) - 58626: 1153, // TableElementList (2x) - 58629: 1154, // TableLock (2x) - 58633: 1155, // TableNameListOpt (2x) - 58640: 1156, // TableOrTables (2x) - 58649: 1157, // TablesTerminalSym (2x) - 58647: 1158, // TableToTable (2x) - 58651: 1159, // TextStringList (2x) - 58656: 1160, // TraceStmt (2x) - 58661: 1161, // TruncateTableStmt (2x) - 58664: 1162, // UnlockStatsStmt (2x) - 58665: 1163, // UnlockTablesStmt (2x) - 58671: 1164, // UserToUser (2x) - 58668: 1165, // UseStmt (2x) - 58683: 1166, // Varchar (2x) - 58686: 1167, // VariableAssignmentList (2x) - 58695: 1168, // WhenClause (2x) - 58700: 1169, // WindowDefinition (2x) - 58703: 1170, // WindowFrameBound (2x) - 58710: 1171, // WindowSpec (2x) - 58715: 1172, // WithGrantOptionOpt (2x) - 58716: 1173, // WithList (2x) - 58720: 1174, // Writeable (2x) - 58118: 1175, // AdminShowSlow (1x) - 58120: 1176, // AdminStmtLimitOpt (1x) - 58128: 1177, // AlterOrderList (1x) - 58131: 1178, // AlterSequenceOptionList (1x) - 58133: 1179, // AlterTablePartitionOpt (1x) - 58135: 1180, // AlterTableSpecList (1x) - 58136: 1181, // AlterTableSpecListOpt (1x) - 58140: 1182, // AnalyzeOptionList (1x) - 58143: 1183, // AnyOrAll (1x) - 58145: 1184, // AsOfClauseOpt (1x) - 58146: 1185, // AsOpt (1x) - 58151: 1186, // AuthOption (1x) - 58152: 1187, // AuthPlugin (1x) - 58154: 1188, // AutoRandomOpt (1x) - 58164: 1189, // BetweenOrNotOp (1x) - 58166: 1190, // BindingStatusType (1x) - 58169: 1191, // BitValueType (1x) - 58170: 1192, // BlobType (1x) - 58173: 1193, // BooleanType (1x) - 57371: 1194, // both (1x) - 58184: 1195, // CharsetNameOrDefault (1x) - 58185: 1196, // CharsetOpt (1x) - 58187: 1197, // ClearPasswordExpireOptions (1x) - 58191: 1198, // ColumnFormat (1x) - 58193: 1199, // ColumnList (1x) - 58200: 1200, // ColumnNameOrUserVariableList (1x) - 58197: 1201, // ColumnNameOrUserVarListOpt (1x) - 58198: 1202, // ColumnNameOrUserVarListOptWithBrackets (1x) - 58206: 1203, // ColumnSetValueList (1x) - 58211: 1204, // CompareOp (1x) - 58215: 1205, // ConnectionOptionList (1x) - 58218: 1206, // ConstraintElem (1x) - 58226: 1207, // CreateSequenceOptionListOpt (1x) - 58230: 1208, // CreateTableSelectOpt (1x) - 58233: 1209, // CreateViewSelectOpt (1x) - 58240: 1210, // DatabaseOptionListOpt (1x) - 58242: 1211, // DateAndTimeType (1x) - 58237: 1212, // DBNameList (1x) - 58248: 1213, // DefaultValueExpr (1x) - 58268: 1214, // DryRunOptions (1x) - 57410: 1215, // dual (1x) - 58270: 1216, // ElseOpt (1x) - 58275: 1217, // EnforcedOrNotOrNotNullOpt (1x) - 58289: 1218, // ExpressionOpt (1x) - 58291: 1219, // FetchFirstOpt (1x) - 58293: 1220, // FieldAsName (1x) - 58294: 1221, // FieldAsNameOpt (1x) - 58296: 1222, // FieldItemList (1x) - 58298: 1223, // FieldList (1x) - 58304: 1224, // FirstAndLastPartOpt (1x) - 58305: 1225, // FirstOrNext (1x) - 58306: 1226, // FixedPointType (1x) - 58312: 1227, // FloatingPointType (1x) - 58313: 1228, // FlushOption (1x) - 58316: 1229, // FromDual (1x) - 58318: 1230, // FulltextSearchModifierOpt (1x) - 58319: 1231, // FuncDatetimePrec (1x) - 58332: 1232, // GetFormatSelector (1x) - 58339: 1233, // HandleRangeList (1x) - 58344: 1234, // IdentListWithParenOpt (1x) - 58348: 1235, // IfNotRunning (1x) - 58349: 1236, // IfRunning (1x) - 58350: 1237, // IgnoreLines (1x) - 58352: 1238, // ImportTruncate (1x) - 58358: 1239, // IndexHintScope (1x) - 58361: 1240, // IndexKeyTypeOpt (1x) - 58370: 1241, // IndexPartSpecificationListOpt (1x) - 58373: 1242, // IndexTypeOpt (1x) - 58353: 1243, // InOrNotOp (1x) - 58376: 1244, // InstanceOption (1x) - 58378: 1245, // IntegerType (1x) - 58379: 1246, // IntervalExpr (1x) - 58382: 1247, // IsolationLevel (1x) - 58381: 1248, // IsOrNotOp (1x) - 57461: 1249, // leading (1x) - 58390: 1250, // LikeEscapeOpt (1x) - 58391: 1251, // LikeOrNotOp (1x) - 58392: 1252, // LikeTableWithOrWithoutParen (1x) - 58397: 1253, // LinesTerminated (1x) - 58400: 1254, // LoadDataSetList (1x) - 58401: 1255, // LoadDataSetSpecOpt (1x) - 58409: 1256, // LockType (1x) - 58410: 1257, // LogTypeOpt (1x) - 58411: 1258, // Match (1x) - 58412: 1259, // MatchOpt (1x) - 58413: 1260, // MaxIndexNumOpt (1x) - 58414: 1261, // MaxMinutesOpt (1x) - 58415: 1262, // MaxValPartOpt (1x) - 58418: 1263, // NChar (1x) - 58430: 1264, // NullPartOpt (1x) - 58433: 1265, // NumericType (1x) - 58420: 1266, // NVarchar (1x) - 58438: 1267, // OnDeleteUpdateOpt (1x) - 58439: 1268, // OnDuplicateKeyUpdate (1x) - 58441: 1269, // OptBinMod (1x) - 58443: 1270, // OptCharset (1x) - 58446: 1271, // OptErrors (1x) - 58447: 1272, // OptExistingWindowName (1x) - 58449: 1273, // OptFromFirstLast (1x) - 58451: 1274, // OptGConcatSeparator (1x) - 58466: 1275, // OptionalShardColumn (1x) - 58457: 1276, // OptPartitionClause (1x) - 58458: 1277, // OptTable (1x) - 58461: 1278, // OptWindowFrameClause (1x) - 58462: 1279, // OptWindowOrderByClause (1x) - 58468: 1280, // Order (1x) - 58467: 1281, // OrReplace (1x) - 57445: 1282, // outfile (1x) - 58474: 1283, // PartDefValuesOpt (1x) - 58479: 1284, // PartitionKeyAlgorithmOpt (1x) - 58480: 1285, // PartitionMethod (1x) - 58483: 1286, // PartitionNumOpt (1x) - 58490: 1287, // PerDB (1x) - 58491: 1288, // PerTable (1x) - 57499: 1289, // precisionType (1x) - 58499: 1290, // PrepareSQL (1x) - 58507: 1291, // ProcedureCall (1x) - 57506: 1292, // recursive (1x) - 58513: 1293, // RegexpOrNotOp (1x) - 58518: 1294, // ReorganizePartitionRuleOpt (1x) - 58523: 1295, // RequireList (1x) - 58534: 1296, // RoleSpecList (1x) - 58541: 1297, // RowOrRows (1x) - 58548: 1298, // SelectStmtFieldList (1x) - 58556: 1299, // SelectStmtOpts (1x) - 58557: 1300, // SelectStmtOptsList (1x) - 58561: 1301, // SequenceOptionList (1x) - 58566: 1302, // SetOpr (1x) - 58573: 1303, // SetRoleOpt (1x) - 58576: 1304, // ShardableStmt (1x) - 58579: 1305, // ShowIndexKwd (1x) - 58580: 1306, // ShowLikeOrWhereOpt (1x) - 58581: 1307, // ShowPlacementTarget (1x) - 58582: 1308, // ShowProfileArgsOpt (1x) - 58584: 1309, // ShowProfileTypes (1x) - 58585: 1310, // ShowProfileTypesOpt (1x) - 58588: 1311, // ShowTargetFilterable (1x) - 57526: 1312, // spatial (1x) - 58596: 1313, // SplitSyntaxOption (1x) - 57531: 1314, // ssl (1x) - 58597: 1315, // Start (1x) - 58598: 1316, // Starting (1x) - 57532: 1317, // starting (1x) - 58600: 1318, // StatementList (1x) - 58601: 1319, // StatementScope (1x) - 58606: 1320, // StorageMedia (1x) - 57538: 1321, // stored (1x) - 58607: 1322, // StringList (1x) - 58610: 1323, // StringNameOrBRIEOptionKeyword (1x) - 58611: 1324, // StringType (1x) - 58613: 1325, // SubPartDefinitionList (1x) - 58614: 1326, // SubPartDefinitionListOpt (1x) - 58616: 1327, // SubPartitionNumOpt (1x) - 58617: 1328, // SubPartitionOpt (1x) - 58627: 1329, // TableElementListOpt (1x) - 58630: 1330, // TableLockList (1x) - 58643: 1331, // TableRefsClause (1x) - 58644: 1332, // TableSampleMethodOpt (1x) - 58645: 1333, // TableSampleOpt (1x) - 58646: 1334, // TableSampleUnitOpt (1x) - 58648: 1335, // TableToTableList (1x) - 58652: 1336, // TextType (1x) - 57545: 1337, // trailing (1x) - 58660: 1338, // TrimDirection (1x) - 58662: 1339, // Type (1x) - 58672: 1340, // UserToUserList (1x) - 58674: 1341, // UserVariableList (1x) - 58677: 1342, // UsingRoles (1x) - 58679: 1343, // Values (1x) - 58681: 1344, // ValuesOpt (1x) - 58688: 1345, // ViewAlgorithm (1x) - 58689: 1346, // ViewCheckOption (1x) - 58690: 1347, // ViewDefiner (1x) - 58691: 1348, // ViewFieldList (1x) - 58692: 1349, // ViewName (1x) - 58693: 1350, // ViewSQLSecurity (1x) - 57565: 1351, // virtual (1x) - 58694: 1352, // VirtualOrStored (1x) - 58696: 1353, // WhenClauseList (1x) - 58699: 1354, // WindowClauseOptional (1x) - 58701: 1355, // WindowDefinitionList (1x) - 58702: 1356, // WindowFrameBetween (1x) - 58704: 1357, // WindowFrameExtent (1x) - 58706: 1358, // WindowFrameUnits (1x) - 58709: 1359, // WindowNameOrSpec (1x) - 58711: 1360, // WindowSpecDetails (1x) - 58717: 1361, // WithReadLockOpt (1x) - 58718: 1362, // WithValidation (1x) - 58719: 1363, // WithValidationOpt (1x) - 58721: 1364, // Year (1x) - 58117: 1365, // $default (0x) - 58078: 1366, // andnot (0x) - 58149: 1367, // AssignmentListOpt (0x) - 58190: 1368, // ColumnDefList (0x) - 58207: 1369, // CommaOpt (0x) - 58101: 1370, // createTableSelect (0x) - 58092: 1371, // empty (0x) - 57345: 1372, // error (0x) - 58116: 1373, // higherThanComma (0x) - 58110: 1374, // higherThanParenthese (0x) - 58099: 1375, // insertValues (0x) - 57353: 1376, // invalid (0x) - 58102: 1377, // lowerThanCharsetKwd (0x) - 58115: 1378, // lowerThanComma (0x) - 58100: 1379, // lowerThanCreateTableSelect (0x) - 58112: 1380, // lowerThanEq (0x) - 58107: 1381, // lowerThanFunction (0x) - 58098: 1382, // lowerThanInsertValues (0x) - 58103: 1383, // lowerThanKey (0x) - 58104: 1384, // lowerThanLocal (0x) - 58114: 1385, // lowerThanNot (0x) - 58111: 1386, // lowerThanOn (0x) - 58109: 1387, // lowerThanParenthese (0x) - 58105: 1388, // lowerThanRemove (0x) - 58093: 1389, // lowerThanSelectOpt (0x) - 58097: 1390, // lowerThanSelectStmt (0x) - 58096: 1391, // lowerThanSetKeyword (0x) - 58095: 1392, // lowerThanStringLitToken (0x) - 58094: 1393, // lowerThanValueKeyword (0x) - 58106: 1394, // lowerThenOrder (0x) - 58113: 1395, // neg (0x) - 57357: 1396, // odbcDateType (0x) - 57359: 1397, // odbcTimestampType (0x) - 57358: 1398, // odbcTimeType (0x) - 58108: 1399, // tableRefPriority (0x) + 57344: 0, // $end (2317x) + 59: 1, // ';' (2316x) + 58059: 2, // split (1911x) + 57748: 3, // merge (1910x) + 57813: 4, // remove (1910x) + 57814: 5, // reorganize (1909x) + 57631: 6, // comment (1904x) + 57878: 7, // storage (1817x) + 57594: 8, // autoIncrement (1806x) + 44: 9, // ',' (1718x) + 57692: 10, // first (1705x) + 57580: 11, // after (1699x) + 57845: 12, // serial (1695x) + 57595: 13, // autoRandom (1694x) + 57628: 14, // columnFormat (1694x) + 57786: 15, // password (1669x) + 57619: 16, // charsetKwd (1661x) + 57621: 17, // checksum (1649x) + 57970: 18, // placement (1647x) + 57724: 19, // keyBlockSize (1631x) + 57890: 20, // tablespace (1628x) + 57672: 21, // encryption (1626x) + 57675: 22, // engine (1623x) + 57654: 23, // data (1621x) + 57715: 24, // insertMethod (1619x) + 57742: 25, // maxRows (1619x) + 57750: 26, // minRows (1619x) + 57765: 27, // nodegroup (1619x) + 57638: 28, // connection (1611x) + 57596: 29, // autoRandomBase (1608x) + 58049: 30, // statsBuckets (1606x) + 58051: 31, // statsTopN (1606x) + 57905: 32, // ttl (1606x) + 57593: 33, // autoIdCache (1605x) + 57598: 34, // avgRowLength (1605x) + 57636: 35, // compression (1605x) + 57660: 36, // delayKeyWrite (1605x) + 57780: 37, // packKeys (1605x) + 57793: 38, // preSplitRegions (1605x) + 57833: 39, // rowFormat (1605x) + 57838: 40, // secondaryEngine (1605x) + 57849: 41, // shardRowIDBits (1605x) + 57874: 42, // statsAutoRecalc (1605x) + 57591: 43, // statsColChoice (1605x) + 57592: 44, // statsColList (1605x) + 57875: 45, // statsPersistent (1605x) + 57876: 46, // statsSamplePages (1605x) + 57590: 47, // statsSampleRate (1605x) + 57888: 48, // tableChecksum (1605x) + 57906: 49, // ttlEnable (1605x) + 57907: 50, // ttlJobInterval (1605x) + 57821: 51, // resource (1564x) + 57587: 52, // attribute (1556x) + 57577: 53, // account (1554x) + 57926: 54, // failedLoginAttempts (1554x) + 57927: 55, // passwordLockTime (1554x) + 57826: 56, // resume (1538x) + 57853: 57, // signed (1538x) + 41: 58, // ')' (1537x) + 57859: 59, // snapshot (1537x) + 57599: 60, // backend (1536x) + 57620: 61, // checkpoint (1536x) + 57637: 62, // concurrency (1536x) + 57643: 63, // csvBackslashEscape (1536x) + 57644: 64, // csvDelimiter (1536x) + 57645: 65, // csvHeader (1536x) + 57646: 66, // csvNotNull (1536x) + 57647: 67, // csvNull (1536x) + 57648: 68, // csvSeparator (1536x) + 57649: 69, // csvTrimLastSeparators (1536x) + 57728: 70, // lastBackup (1536x) + 57775: 71, // onDuplicate (1536x) + 57776: 72, // online (1536x) + 57808: 73, // rateLimit (1536x) + 57842: 74, // sendCredentialsToTiKV (1536x) + 57856: 75, // skipSchemaFiles (1536x) + 57879: 76, // strictFormat (1536x) + 57895: 77, // tikvImporter (1536x) + 57904: 78, // truncate (1533x) + 57762: 79, // no (1532x) + 57873: 80, // start (1530x) + 57614: 81, // cache (1527x) + 57763: 82, // nocache (1526x) + 57653: 83, // cycle (1525x) + 57752: 84, // minValue (1525x) + 57712: 85, // increment (1524x) + 57764: 86, // nocycle (1524x) + 57766: 87, // nomaxvalue (1524x) + 57767: 88, // nominvalue (1524x) + 57823: 89, // restart (1522x) + 57583: 90, // algorithm (1521x) + 58062: 91, // regions (1521x) + 57899: 92, // tp (1521x) + 57652: 93, // clustered (1520x) + 57717: 94, // invisible (1520x) + 57768: 95, // nonclustered (1520x) + 57918: 96, // visible (1520x) + 57881: 97, // subpartition (1517x) + 57785: 98, // partitions (1516x) + 57939: 99, // constraints (1514x) + 57951: 100, // followerConstraints (1514x) + 57952: 101, // followers (1514x) + 57962: 102, // leaderConstraints (1514x) + 57964: 103, // learnerConstraints (1514x) + 57965: 104, // learners (1514x) + 57975: 105, // primaryRegion (1514x) + 57980: 106, // schedule (1514x) + 57992: 107, // survivalPreferences (1514x) + 58015: 108, // voterConstraints (1514x) + 58016: 109, // voters (1514x) + 57629: 110, // columns (1512x) + 57917: 111, // view (1512x) + 57657: 112, // day (1510x) + 57924: 113, // yearType (1510x) + 57837: 114, // second (1508x) + 57872: 115, // sqlTsiYear (1508x) + 57586: 116, // ascii (1507x) + 57613: 117, // byteType (1507x) + 57707: 118, // hour (1507x) + 57749: 119, // microsecond (1507x) + 57751: 120, // minute (1507x) + 57755: 121, // month (1507x) + 57804: 122, // quarter (1507x) + 57865: 123, // sqlTsiDay (1507x) + 57866: 124, // sqlTsiHour (1507x) + 57867: 125, // sqlTsiMinute (1507x) + 57868: 126, // sqlTsiMonth (1507x) + 57869: 127, // sqlTsiQuarter (1507x) + 57870: 128, // sqlTsiSecond (1507x) + 57871: 129, // sqlTsiWeek (1507x) + 57911: 130, // unicodeSym (1507x) + 57920: 131, // week (1507x) + 57690: 132, // fields (1506x) + 57889: 133, // tables (1505x) + 57936: 134, // burstable (1504x) + 58017: 135, // ruRate (1504x) + 57877: 136, // status (1504x) + 57843: 137, // separator (1503x) + 57622: 138, // cipher (1502x) + 57346: 139, // identifier (1502x) + 57722: 140, // issuer (1502x) + 57740: 141, // maxConnectionsPerHour (1502x) + 57741: 142, // maxQueriesPerHour (1502x) + 57743: 143, // maxUpdatesPerHour (1502x) + 57744: 144, // maxUserConnections (1502x) + 57794: 145, // preceding (1502x) + 57835: 146, // san (1502x) + 57880: 147, // subject (1502x) + 57898: 148, // tokenIssuer (1502x) + 57710: 149, // importKwd (1501x) + 57733: 150, // local (1501x) + 57806: 151, // query (1500x) + 57855: 152, // skip (1500x) + 57606: 153, // bindings (1499x) + 57659: 154, // definer (1499x) + 57702: 155, // hash (1499x) + 57708: 156, // identified (1499x) + 57736: 157, // logs (1499x) + 57822: 158, // respect (1499x) + 57632: 159, // commit (1498x) + 57650: 160, // current (1498x) + 57674: 161, // enforced (1498x) + 57695: 162, // following (1498x) + 57730: 163, // less (1498x) + 57770: 164, // nowait (1498x) + 57777: 165, // only (1498x) + 57830: 166, // rollback (1498x) + 57836: 167, // savepoint (1498x) + 57894: 168, // than (1498x) + 57908: 169, // unbounded (1498x) + 57915: 170, // value (1498x) + 57602: 171, // begin (1497x) + 57604: 172, // binding (1497x) + 57673: 173, // end (1497x) + 57700: 174, // global (1497x) + 57955: 175, // next_row_id (1497x) + 57774: 176, // offset (1497x) + 57792: 177, // policy (1497x) + 57974: 178, // predicate (1497x) + 57891: 179, // temporary (1497x) + 58057: 180, // tiFlash (1497x) + 57913: 181, // user (1497x) + 57723: 182, // jsonType (1496x) + 57972: 183, // planCache (1496x) + 57795: 184, // prepare (1496x) + 57829: 185, // role (1496x) + 57912: 186, // unknown (1496x) + 57925: 187, // wait (1496x) + 57612: 188, // btree (1495x) + 57655: 189, // datetimeType (1495x) + 57656: 190, // dateType (1495x) + 57693: 191, // fixed (1495x) + 57709: 192, // identSQLErrors (1495x) + 57721: 193, // isolation (1495x) + 57727: 194, // last (1495x) + 57735: 195, // location (1495x) + 57738: 196, // max_idxnum (1495x) + 57747: 197, // memory (1495x) + 57773: 198, // off (1495x) + 57779: 199, // optional (1495x) + 57788: 200, // per_db (1495x) + 57971: 201, // plan (1495x) + 57797: 202, // privileges (1495x) + 57817: 203, // replica (1495x) + 57820: 204, // required (1495x) + 57834: 205, // rtree (1495x) + 57978: 206, // running (1495x) + 58043: 207, // sampleRate (1495x) + 57844: 208, // sequence (1495x) + 57847: 209, // session (1495x) + 57858: 210, // slow (1495x) + 58046: 211, // stats (1495x) + 57897: 212, // timeType (1495x) + 57914: 213, // validation (1495x) + 57916: 214, // variables (1495x) + 57588: 215, // attributes (1494x) + 57634: 216, // compact (1494x) + 57661: 217, // digest (1494x) + 57663: 218, // disable (1494x) + 57668: 219, // duplicate (1494x) + 57669: 220, // dynamic (1494x) + 57670: 221, // enable (1494x) + 57678: 222, // errorKwd (1494x) + 57694: 223, // flush (1494x) + 57697: 224, // full (1494x) + 57705: 225, // history (1494x) + 57745: 226, // mb (1494x) + 57753: 227, // mode (1494x) + 57791: 228, // plugins (1494x) + 57799: 229, // processlist (1494x) + 57810: 230, // recover (1494x) + 57815: 231, // repair (1494x) + 57816: 232, // repeatable (1494x) + 58045: 233, // statistics (1494x) + 57882: 234, // subpartitions (1494x) + 58056: 235, // tidb (1494x) + 57896: 236, // timestampType (1494x) + 57922: 237, // without (1494x) + 58020: 238, // admin (1493x) + 57600: 239, // backup (1493x) + 58021: 240, // batch (1493x) + 57607: 241, // binlog (1493x) + 57609: 242, // block (1493x) + 57610: 243, // booleanType (1493x) + 57935: 244, // briefType (1493x) + 58022: 245, // buckets (1493x) + 57615: 246, // capture (1493x) + 58025: 247, // cardinality (1493x) + 57618: 248, // chain (1493x) + 57625: 249, // clientErrorsSummary (1493x) + 58026: 250, // cmSketch (1493x) + 57626: 251, // coalesce (1493x) + 57635: 252, // compressed (1493x) + 57641: 253, // context (1493x) + 57938: 254, // copyKwd (1493x) + 58028: 255, // correlation (1493x) + 57642: 256, // cpu (1493x) + 57658: 257, // deallocate (1493x) + 58030: 258, // dependency (1493x) + 57662: 259, // directory (1493x) + 57665: 260, // discard (1493x) + 57666: 261, // disk (1493x) + 57667: 262, // do (1493x) + 57944: 263, // dotType (1493x) + 58032: 264, // drainer (1493x) + 58033: 265, // dry (1493x) + 57683: 266, // exchange (1493x) + 57685: 267, // execute (1493x) + 57686: 268, // expansion (1493x) + 57949: 269, // flashback (1493x) + 57696: 270, // format (1493x) + 57699: 271, // general (1493x) + 57703: 272, // help (1493x) + 57704: 273, // histogram (1493x) + 57706: 274, // hosts (1493x) + 57956: 275, // inplace (1493x) + 57716: 276, // instance (1493x) + 57957: 277, // instant (1493x) + 57720: 278, // ipc (1493x) + 58035: 279, // job (1493x) + 58034: 280, // jobs (1493x) + 57725: 281, // labels (1493x) + 57734: 282, // locked (1493x) + 57754: 283, // modify (1493x) + 57760: 284, // next (1493x) + 58036: 285, // nodeID (1493x) + 58037: 286, // nodeState (1493x) + 57772: 287, // nulls (1493x) + 57781: 288, // pageSym (1493x) + 58040: 289, // pump (1493x) + 57803: 290, // purge (1493x) + 57809: 291, // rebuild (1493x) + 57811: 292, // redundant (1493x) + 57812: 293, // reload (1493x) + 57824: 294, // restore (1493x) + 57831: 295, // routine (1493x) + 57979: 296, // s3 (1493x) + 58042: 297, // samples (1493x) + 57839: 298, // secondaryLoad (1493x) + 57840: 299, // secondaryUnload (1493x) + 57850: 300, // share (1493x) + 57852: 301, // shutdown (1493x) + 57861: 302, // source (1493x) + 57589: 303, // statsOptions (1493x) + 57986: 304, // stop (1493x) + 57884: 305, // swaps (1493x) + 57994: 306, // tidbJson (1493x) + 57998: 307, // tokudbDefault (1493x) + 57999: 308, // tokudbFast (1493x) + 58000: 309, // tokudbLzma (1493x) + 58001: 310, // tokudbQuickLZ (1493x) + 58003: 311, // tokudbSmall (1493x) + 58002: 312, // tokudbSnappy (1493x) + 58004: 313, // tokudbUncompressed (1493x) + 58005: 314, // tokudbZlib (1493x) + 58006: 315, // tokudbZstd (1493x) + 58058: 316, // topn (1493x) + 57900: 317, // trace (1493x) + 57901: 318, // traditional (1493x) + 58013: 319, // trueCardCost (1493x) + 58012: 320, // verboseType (1493x) + 57919: 321, // warnings (1493x) + 57578: 322, // action (1492x) + 57579: 323, // advise (1492x) + 57581: 324, // against (1492x) + 57582: 325, // ago (1492x) + 57584: 326, // always (1492x) + 57601: 327, // backups (1492x) + 57603: 328, // bernoulli (1492x) + 57605: 329, // bindingCache (1492x) + 57608: 330, // bitType (1492x) + 57611: 331, // boolType (1492x) + 58023: 332, // builtins (1492x) + 58024: 333, // cancel (1492x) + 57616: 334, // cascaded (1492x) + 57617: 335, // causal (1492x) + 57623: 336, // cleanup (1492x) + 57624: 337, // client (1492x) + 57651: 338, // cluster (1492x) + 57627: 339, // collation (1492x) + 58027: 340, // columnStatsUsage (1492x) + 57633: 341, // committed (1492x) + 57630: 342, // config (1492x) + 57639: 343, // consistency (1492x) + 57640: 344, // consistent (1492x) + 58029: 345, // ddl (1492x) + 58031: 346, // depth (1492x) + 57664: 347, // disabled (1492x) + 57945: 348, // dump (1492x) + 57671: 349, // enabled (1492x) + 57676: 350, // engines (1492x) + 57677: 351, // enum (1492x) + 57681: 352, // events (1492x) + 57682: 353, // evolve (1492x) + 57687: 354, // expire (1492x) + 57947: 355, // exprPushdownBlacklist (1492x) + 57688: 356, // extended (1492x) + 57689: 357, // faultsSym (1492x) + 57698: 358, // function (1492x) + 57701: 359, // grants (1492x) + 58053: 360, // histogramsInFlight (1492x) + 57711: 361, // imports (1492x) + 57713: 362, // incremental (1492x) + 57714: 363, // indexes (1492x) + 57958: 364, // internal (1492x) + 57718: 365, // invoker (1492x) + 57719: 366, // io (1492x) + 57726: 367, // language (1492x) + 57731: 368, // level (1492x) + 57732: 369, // list (1492x) + 57737: 370, // master (1492x) + 57739: 371, // max_minutes (1492x) + 57757: 372, // national (1492x) + 57758: 373, // ncharType (1492x) + 57759: 374, // never (1492x) + 57761: 375, // nextval (1492x) + 57769: 376, // none (1492x) + 57771: 377, // nvarcharType (1492x) + 57778: 378, // open (1492x) + 58038: 379, // optimistic (1492x) + 57969: 380, // optRuleBlacklist (1492x) + 57782: 381, // parser (1492x) + 57783: 382, // partial (1492x) + 57784: 383, // partitioning (1492x) + 57789: 384, // per_table (1492x) + 57787: 385, // percent (1492x) + 58039: 386, // pessimistic (1492x) + 57796: 387, // preserve (1492x) + 57800: 388, // profile (1492x) + 57801: 389, // profiles (1492x) + 57805: 390, // queries (1492x) + 57976: 391, // recent (1492x) + 58063: 392, // region (1492x) + 57977: 393, // replayer (1492x) + 58061: 394, // reset (1492x) + 57825: 395, // restores (1492x) + 57827: 396, // reuse (1492x) + 58041: 397, // run (1492x) + 57841: 398, // security (1492x) + 57846: 399, // serializable (1492x) + 58044: 400, // sessionStates (1492x) + 57854: 401, // simple (1492x) + 57857: 402, // slave (1492x) + 58050: 403, // statsHealthy (1492x) + 58048: 404, // statsHistograms (1492x) + 58052: 405, // statsLocked (1492x) + 58047: 406, // statsMeta (1492x) + 57987: 407, // strict (1492x) + 57885: 408, // switchesSym (1492x) + 57886: 409, // system (1492x) + 57887: 410, // systemTime (1492x) + 57993: 411, // target (1492x) + 58055: 412, // telemetryID (1492x) + 57892: 413, // temptable (1492x) + 57893: 414, // textType (1492x) + 57997: 415, // tls (1492x) + 58007: 416, // top (1492x) + 57902: 417, // transaction (1492x) + 57903: 418, // triggers (1492x) + 57909: 419, // uncommitted (1492x) + 57910: 420, // undefined (1492x) + 58060: 421, // width (1492x) + 57923: 422, // x509 (1492x) + 57928: 423, // addDate (1491x) + 57585: 424, // any (1491x) + 57929: 425, // approxCountDistinct (1491x) + 57930: 426, // approxPercentile (1491x) + 57597: 427, // avg (1491x) + 57931: 428, // bitAnd (1491x) + 57932: 429, // bitOr (1491x) + 57933: 430, // bitXor (1491x) + 57934: 431, // bound (1491x) + 57937: 432, // cast (1491x) + 57941: 433, // curDate (1491x) + 57940: 434, // curTime (1491x) + 57942: 435, // dateAdd (1491x) + 57943: 436, // dateSub (1491x) + 57679: 437, // escape (1491x) + 57680: 438, // event (1491x) + 57946: 439, // exact (1491x) + 57684: 440, // exclusive (1491x) + 57948: 441, // extract (1491x) + 57691: 442, // file (1491x) + 57950: 443, // follower (1491x) + 57953: 444, // getFormat (1491x) + 57954: 445, // groupConcat (1491x) + 58018: 446, // ioReadBandwidth (1491x) + 58019: 447, // ioWriteBandwidth (1491x) + 57959: 448, // jsonArrayagg (1491x) + 57960: 449, // jsonObjectAgg (1491x) + 57729: 450, // lastval (1491x) + 57961: 451, // leader (1491x) + 57963: 452, // learner (1491x) + 57967: 453, // max (1491x) + 57746: 454, // member (1491x) + 57966: 455, // min (1491x) + 57756: 456, // names (1491x) + 57968: 457, // now (1491x) + 57973: 458, // position (1491x) + 57798: 459, // process (1491x) + 57802: 460, // proxy (1491x) + 57807: 461, // quick (1491x) + 57818: 462, // replicas (1491x) + 57819: 463, // replication (1491x) + 57828: 464, // reverse (1491x) + 57832: 465, // rowCount (1491x) + 57848: 466, // setval (1491x) + 57851: 467, // shared (1491x) + 57860: 468, // some (1491x) + 57862: 469, // sqlBufferResult (1491x) + 57863: 470, // sqlCache (1491x) + 57864: 471, // sqlNoCache (1491x) + 57981: 472, // staleness (1491x) + 57982: 473, // std (1491x) + 57983: 474, // stddev (1491x) + 57984: 475, // stddevPop (1491x) + 57985: 476, // stddevSamp (1491x) + 57988: 477, // strong (1491x) + 57989: 478, // subDate (1491x) + 57991: 479, // substring (1491x) + 57990: 480, // sum (1491x) + 57883: 481, // super (1491x) + 58054: 482, // telemetry (1491x) + 57995: 483, // timestampAdd (1491x) + 57996: 484, // timestampDiff (1491x) + 58008: 485, // trim (1491x) + 58009: 486, // variance (1491x) + 58010: 487, // varPop (1491x) + 58011: 488, // varSamp (1491x) + 58014: 489, // voter (1491x) + 57921: 490, // weightString (1491x) + 57491: 491, // on (1420x) + 40: 492, // '(' (1356x) + 57572: 493, // with (1236x) + 57351: 494, // stringLit (1235x) + 58109: 495, // not2 (1214x) + 57401: 496, // defaultKwd (1154x) + 57484: 497, // not (1150x) + 57367: 498, // as (1131x) + 57382: 499, // collate (1097x) + 57551: 500, // union (1081x) + 57557: 501, // using (1072x) + 57464: 502, // left (1067x) + 57518: 503, // right (1067x) + 43: 504, // '+' (1044x) + 45: 505, // '-' (1042x) + 57483: 506, // mod (1022x) + 57499: 507, // partition (1015x) + 57438: 508, // ignore (980x) + 57418: 509, // except (970x) + 57488: 510, // null (970x) + 57444: 511, // intersect (969x) + 57466: 512, // limit (950x) + 57423: 513, // forKwd (948x) + 57380: 514, // charType (946x) + 57561: 515, // values (946x) + 57446: 516, // into (940x) + 57472: 517, // lock (936x) + 58098: 518, // eq (933x) + 57569: 519, // where (931x) + 57426: 520, // from (929x) + 57420: 521, // fetch (926x) + 57514: 522, // replace (923x) + 57496: 523, // order (922x) + 57424: 524, // force (921x) + 58093: 525, // intLit (911x) + 57525: 526, // set (909x) + 57365: 527, // and (908x) + 57495: 528, // or (884x) + 57356: 529, // andand (883x) + 57790: 530, // pipesAsOr (883x) + 57573: 531, // xor (883x) + 57430: 532, // group (862x) + 57432: 533, // having (857x) + 57536: 534, // straightJoin (851x) + 57571: 535, // window (843x) + 57456: 536, // join (839x) + 57465: 537, // like (831x) + 57576: 538, // natural (829x) + 57387: 539, // cross (828x) + 57442: 540, // inner (828x) + 42: 541, // '*' (827x) + 125: 542, // '}' (825x) + 57521: 543, // rows (813x) + 57556: 544, // use (809x) + 57539: 545, // tableSample (803x) + 57504: 546, // rangeKwd (802x) + 57431: 547, // groups (801x) + 57405: 548, // desc (800x) + 57371: 549, // binaryType (799x) + 57396: 550, // dayHour (799x) + 57397: 551, // dayMicrosecond (799x) + 57398: 552, // dayMinute (799x) + 57399: 553, // daySecond (799x) + 57434: 554, // hourMicrosecond (799x) + 57435: 555, // hourMinute (799x) + 57436: 556, // hourSecond (799x) + 57481: 557, // minuteMicrosecond (799x) + 57482: 558, // minuteSecond (799x) + 57523: 559, // secondMicrosecond (799x) + 57574: 560, // yearMonth (799x) + 57368: 561, // asc (798x) + 57568: 562, // when (795x) + 57413: 563, // elseKwd (792x) + 57439: 564, // in (792x) + 57542: 565, // then (789x) + 47: 566, // '/' (785x) + 37: 567, // '%' (784x) + 38: 568, // '&' (784x) + 94: 569, // '^' (784x) + 124: 570, // '|' (784x) + 57409: 571, // div (784x) + 58103: 572, // lsh (784x) + 58108: 573, // rsh (784x) + 60: 574, // '<' (782x) + 62: 575, // '>' (782x) + 58099: 576, // ge (782x) + 57448: 577, // is (782x) + 58100: 578, // le (782x) + 58104: 579, // neq (782x) + 58105: 580, // neqSynonym (782x) + 58106: 581, // nulleq (782x) + 57369: 582, // between (779x) + 57437: 583, // ifKwd (778x) + 57510: 584, // regexpKwd (771x) + 57519: 585, // rlike (771x) + 57349: 586, // memberof (768x) + 57449: 587, // insert (767x) + 57538: 588, // tableKwd (759x) + 57352: 589, // singleAtIdentifier (756x) + 57392: 590, // currentUser (752x) + 57419: 591, // falseKwd (751x) + 57549: 592, // trueKwd (751x) + 58092: 593, // decLit (745x) + 58091: 594, // floatLit (745x) + 57520: 595, // row (744x) + 58094: 596, // hexLit (743x) + 58107: 597, // paramMarker (742x) + 58095: 598, // bitLit (741x) + 57445: 599, // interval (741x) + 57457: 600, // key (741x) + 123: 601, // '{' (740x) + 57394: 602, // database (736x) + 57416: 603, // exists (735x) + 57385: 604, // convert (732x) + 58071: 605, // builtinCurDate (731x) + 58079: 606, // builtinNow (731x) + 57381: 607, // check (731x) + 57389: 608, // currentDate (731x) + 57391: 609, // currentTs (731x) + 57353: 610, // doubleAtIdentifier (731x) + 57470: 611, // localTime (731x) + 57471: 612, // localTs (731x) + 57502: 613, // primary (731x) + 57350: 614, // underscoreCS (731x) + 58068: 615, // builtinCount (729x) + 57357: 616, // pipes (729x) + 33: 617, // '!' (728x) + 126: 618, // '~' (728x) + 58069: 619, // builtinApproxCountDistinct (728x) + 58070: 620, // builtinApproxPercentile (728x) + 58064: 621, // builtinBitAnd (728x) + 58065: 622, // builtinBitOr (728x) + 58066: 623, // builtinBitXor (728x) + 58067: 624, // builtinCast (728x) + 58072: 625, // builtinCurTime (728x) + 58073: 626, // builtinDateAdd (728x) + 58074: 627, // builtinDateSub (728x) + 58075: 628, // builtinExtract (728x) + 58076: 629, // builtinGroupConcat (728x) + 58077: 630, // builtinMax (728x) + 58078: 631, // builtinMin (728x) + 58080: 632, // builtinPosition (728x) + 58084: 633, // builtinStddevPop (728x) + 58085: 634, // builtinStddevSamp (728x) + 58081: 635, // builtinSubstring (728x) + 58082: 636, // builtinSum (728x) + 58083: 637, // builtinSysDate (728x) + 58086: 638, // builtinTranslate (728x) + 58087: 639, // builtinTrim (728x) + 58088: 640, // builtinUser (728x) + 58089: 641, // builtinVarPop (728x) + 58090: 642, // builtinVarSamp (728x) + 57377: 643, // caseKwd (728x) + 57388: 644, // cumeDist (728x) + 57393: 645, // currentRole (728x) + 57390: 646, // currentTime (728x) + 57404: 647, // denseRank (728x) + 57421: 648, // firstValue (728x) + 57460: 649, // lag (728x) + 57461: 650, // lastValue (728x) + 57462: 651, // lead (728x) + 57486: 652, // nthValue (728x) + 57487: 653, // ntile (728x) + 57500: 654, // percentRank (728x) + 57505: 655, // rank (728x) + 57513: 656, // repeat (728x) + 57522: 657, // rowNumber (728x) + 57537: 658, // tidbCurrentTSO (728x) + 57558: 659, // utcDate (728x) + 57560: 660, // utcTime (728x) + 57559: 661, // utcTimestamp (728x) + 57550: 662, // unique (724x) + 57384: 663, // constraint (722x) + 57509: 664, // references (719x) + 57524: 665, // selectKwd (716x) + 57428: 666, // generated (715x) + 57379: 667, // character (709x) + 57440: 668, // index (697x) + 57476: 669, // match (669x) + 57546: 670, // to (588x) + 57362: 671, // all (573x) + 46: 672, // '.' (568x) + 57364: 673, // analyze (552x) + 57554: 674, // update (549x) + 57477: 675, // maxValue (536x) + 58101: 676, // jss (534x) + 58102: 677, // juss (534x) + 57366: 678, // array (532x) + 57467: 679, // lines (523x) + 58097: 680, // assignmentEq (520x) + 57374: 681, // by (520x) + 57363: 682, // alter (518x) + 57515: 683, // require (515x) + 64: 684, // '@' (510x) + 58368: 685, // Identifier (509x) + 58447: 686, // NotKeywordToken (509x) + 57529: 687, // sql (509x) + 58678: 688, // TiDBKeyword (509x) + 58688: 689, // UnReservedKeyword (509x) + 57411: 690, // drop (504x) + 57376: 691, // cascade (503x) + 57506: 692, // read (503x) + 57516: 693, // restrict (503x) + 57347: 694, // asof (501x) + 57386: 695, // create (499x) + 57425: 696, // foreign (499x) + 57427: 697, // fulltext (499x) + 57348: 698, // toTimestamp (498x) + 57564: 699, // varcharacter (497x) + 57563: 700, // varcharType (497x) + 57378: 701, // change (496x) + 57400: 702, // decimalType (496x) + 57410: 703, // doubleType (496x) + 57422: 704, // floatType (496x) + 57443: 705, // integerType (496x) + 57450: 706, // intType (496x) + 57507: 707, // realType (496x) + 57512: 708, // rename (496x) + 57570: 709, // write (496x) + 57565: 710, // varbinaryType (495x) + 57361: 711, // add (494x) + 57370: 712, // bigIntType (494x) + 57372: 713, // blobType (494x) + 57451: 714, // int1Type (494x) + 57452: 715, // int2Type (494x) + 57453: 716, // int3Type (494x) + 57454: 717, // int4Type (494x) + 57455: 718, // int8Type (494x) + 57562: 719, // long (494x) + 57473: 720, // longblobType (494x) + 57474: 721, // longtextType (494x) + 57478: 722, // mediumblobType (494x) + 57479: 723, // mediumIntType (494x) + 57480: 724, // mediumtextType (494x) + 57489: 725, // numericType (494x) + 57492: 726, // optimize (494x) + 57527: 727, // smallIntType (494x) + 57543: 728, // tinyblobType (494x) + 57544: 729, // tinyIntType (494x) + 57545: 730, // tinytextType (494x) + 58643: 731, // SubSelect (224x) + 58698: 732, // UserVariable (182x) + 58618: 733, // SimpleIdent (181x) + 58421: 734, // Literal (180x) + 58633: 735, // StringLiteral (180x) + 58444: 736, // NextValueForSequence (178x) + 58345: 737, // FunctionCallGeneric (177x) + 58346: 738, // FunctionCallKeyword (177x) + 58347: 739, // FunctionCallNonKeyword (177x) + 58348: 740, // FunctionNameConflict (177x) + 58349: 741, // FunctionNameDateArith (177x) + 58350: 742, // FunctionNameDateArithMultiForms (177x) + 58351: 743, // FunctionNameDatetimePrecision (177x) + 58352: 744, // FunctionNameOptionalBraces (177x) + 58353: 745, // FunctionNameSequence (177x) + 58617: 746, // SimpleExpr (177x) + 58644: 747, // SumExpr (177x) + 58646: 748, // SystemVariable (177x) + 58709: 749, // Variable (177x) + 58732: 750, // WindowFuncCall (177x) + 58188: 751, // BitExpr (163x) + 58520: 752, // PredicateExpr (132x) + 58191: 753, // BoolPri (129x) + 58309: 754, // Expression (129x) + 58442: 755, // NUM (108x) + 58747: 756, // logAnd (97x) + 58748: 757, // logOr (97x) + 58299: 758, // EqOpt (80x) + 58656: 759, // TableName (77x) + 58634: 760, // StringName (56x) + 57403: 761, // deleteKwd (53x) + 58412: 762, // LengthNum (47x) + 57553: 763, // unsigned (47x) + 57498: 764, // over (45x) + 57575: 765, // zerofill (45x) + 58213: 766, // ColumnName (41x) + 57407: 767, // distinct (36x) + 57408: 768, // distinctRow (36x) + 58737: 769, // WindowingClause (35x) + 58571: 770, // SelectStmt (34x) + 58572: 771, // SelectStmtBasic (34x) + 58574: 772, // SelectStmtFromDualTable (34x) + 58575: 773, // SelectStmtFromTable (34x) + 58592: 774, // SetOprClause (34x) + 57402: 775, // delayed (33x) + 57433: 776, // highPriority (33x) + 57475: 777, // lowPriority (33x) + 58593: 778, // SetOprClauseList (33x) + 58596: 779, // SetOprStmtWithLimitOrderBy (33x) + 58597: 780, // SetOprStmtWoutLimitOrderBy (33x) + 58738: 781, // WithClause (31x) + 58584: 782, // SelectStmtWithClause (30x) + 58595: 783, // SetOprStmt (30x) + 58400: 784, // Int64Num (28x) + 57355: 785, // hintComment (27x) + 58320: 786, // FieldLen (25x) + 58486: 787, // OptWindowingClause (24x) + 58692: 788, // UpdateStmtNoWith (24x) + 58272: 789, // DeleteWithoutUsingStmt (23x) + 58492: 790, // OrderBy (23x) + 58578: 791, // SelectStmtLimit (23x) + 57530: 792, // sqlBigResult (23x) + 57531: 793, // sqlCalcFoundRows (23x) + 57532: 794, // sqlSmallResult (23x) + 58397: 795, // InsertIntoStmt (21x) + 58542: 796, // ReplaceIntoStmt (21x) + 58691: 797, // UpdateStmt (21x) + 58202: 798, // CharsetKw (20x) + 58700: 799, // Username (20x) + 58369: 800, // IfExists (19x) + 58310: 801, // ExpressionList (18x) + 58271: 802, // DeleteWithUsingStmt (17x) + 58515: 803, // PlacementPolicyOption (17x) + 58657: 804, // TableNameList (17x) + 58370: 805, // IfNotExists (16x) + 57541: 806, // terminated (16x) + 58270: 807, // DeleteFromStmt (15x) + 58275: 808, // DistinctKwd (15x) + 58504: 809, // PartitionNameList (15x) + 58276: 810, // DistinctOpt (14x) + 57414: 811, // enclosed (14x) + 58471: 812, // OptFieldLen (14x) + 58680: 813, // TimestampUnit (14x) + 58722: 814, // WhereClause (14x) + 58723: 815, // WhereClauseOptional (14x) + 58267: 816, // DefaultKwdOpt (13x) + 57415: 817, // escaped (13x) + 57494: 818, // optionally (13x) + 58308: 819, // ExprOrDefault (12x) + 58406: 820, // JoinTable (12x) + 58465: 821, // OptBinary (12x) + 57511: 822, // release (12x) + 58561: 823, // RolenameComposed (12x) + 58653: 824, // TableFactor (12x) + 58666: 825, // TableRef (12x) + 58160: 826, // AnalyzeOptionListOpt (11x) + 58340: 827, // FromOrIn (11x) + 58679: 828, // TimeUnit (11x) + 58156: 829, // AlterTableStmt (10x) + 58203: 830, // CharsetName (10x) + 58214: 831, // ColumnNameList (10x) + 58257: 832, // DBName (10x) + 57469: 833, // load (10x) + 58448: 834, // NotSym (10x) + 57485: 835, // noWriteToBinLog (10x) + 58493: 836, // OrderByOptional (10x) + 58495: 837, // PartDefOption (10x) + 58616: 838, // SignedNum (10x) + 58194: 839, // BuggyDefaultFalseDistinctOpt (9x) + 58266: 840, // DefaultFalseDistinctOpt (9x) + 58407: 841, // JoinType (9x) + 58455: 842, // NumLiteral (9x) + 58560: 843, // Rolename (9x) + 58555: 844, // RoleNameString (9x) + 58255: 845, // CrossOpt (8x) + 58300: 846, // EqOrAssignmentEq (8x) + 58307: 847, // ExplainableStmt (8x) + 58311: 848, // ExpressionListOpt (8x) + 58391: 849, // IndexPartSpecification (8x) + 58408: 850, // KeyOrIndex (8x) + 58445: 851, // NoWriteToBinLogAliasOpt (8x) + 58579: 852, // SelectStmtLimitOpt (8x) + 58712: 853, // VariableName (8x) + 58141: 854, // AllOrPartitionNameList (7x) + 58238: 855, // ConstraintKeywordOpt (7x) + 58262: 856, // DatabaseSym (7x) + 58326: 857, // FieldsOrColumns (7x) + 58338: 858, // ForceOpt (7x) + 58392: 859, // IndexPartSpecificationList (7x) + 58524: 860, // Priority (7x) + 58565: 861, // RowFormat (7x) + 58568: 862, // RowValue (7x) + 58590: 863, // SetExpr (7x) + 58602: 864, // ShowDatabaseNameOpt (7x) + 58663: 865, // TableOption (7x) + 57566: 866, // varying (7x) + 58161: 867, // AnalyzeTableStmt (6x) + 58183: 868, // BeginTransactionStmt (6x) + 58185: 869, // BindableStmt (6x) + 57383: 870, // column (6x) + 58208: 871, // ColumnDef (6x) + 58228: 872, // CommitStmt (6x) + 58259: 873, // DatabaseOption (6x) + 58302: 874, // EscapedTableRef (6x) + 58324: 875, // FieldTerminator (6x) + 57429: 876, // grant (6x) + 58374: 877, // IgnoreOptional (6x) + 58383: 878, // IndexInvisible (6x) + 58388: 879, // IndexNameList (6x) + 58394: 880, // IndexType (6x) + 58425: 881, // LoadDataStmt (6x) + 58505: 882, // PartitionNameListOpt (6x) + 58537: 883, // ReleaseSavepointStmt (6x) + 58562: 884, // RolenameList (6x) + 58564: 885, // RollbackStmt (6x) + 58569: 886, // SavepointStmt (6x) + 58600: 887, // SetStmt (6x) + 57526: 888, // show (6x) + 58661: 889, // TableOptimizerHints (6x) + 58701: 890, // UsernameList (6x) + 58739: 891, // WithClustered (6x) + 58139: 892, // AlgorithmClause (5x) + 58196: 893, // ByItem (5x) + 58207: 894, // CollationName (5x) + 58211: 895, // ColumnKeywordOpt (5x) + 58273: 896, // DirectPlacementOption (5x) + 58274: 897, // DirectResourceGroupOption (5x) + 58322: 898, // FieldOpt (5x) + 58323: 899, // FieldOpts (5x) + 58366: 900, // IdentList (5x) + 58386: 901, // IndexName (5x) + 58389: 902, // IndexOption (5x) + 58390: 903, // IndexOptionList (5x) + 57441: 904, // infile (5x) + 58417: 905, // LimitOption (5x) + 58429: 906, // LockClause (5x) + 58467: 907, // OptCharsetWithOptBinary (5x) + 58478: 908, // OptNullTreatment (5x) + 58518: 909, // PolicyName (5x) + 58525: 910, // PriorityOpt (5x) + 58547: 911, // ResourceGroupName (5x) + 58570: 912, // SelectLockOpt (5x) + 58577: 913, // SelectStmtIntoOption (5x) + 58667: 914, // TableRefs (5x) + 58694: 915, // UserSpec (5x) + 58167: 916, // Assignment (4x) + 58173: 917, // AuthString (4x) + 58175: 918, // BRIEBooleanOptionName (4x) + 58176: 919, // BRIEIntegerOptionName (4x) + 58177: 920, // BRIEKeywordOptionName (4x) + 58178: 921, // BRIEOption (4x) + 58179: 922, // BRIEOptions (4x) + 58181: 923, // BRIEStringOptionName (4x) + 58195: 924, // BuiltinFunction (4x) + 58197: 925, // ByList (4x) + 58201: 926, // Char (4x) + 58232: 927, // ConfigItemName (4x) + 58236: 928, // Constraint (4x) + 58334: 929, // FloatOpt (4x) + 58395: 930, // IndexTypeName (4x) + 57493: 931, // option (4x) + 58483: 932, // OptWild (4x) + 57497: 933, // outer (4x) + 58519: 934, // Precision (4x) + 58533: 935, // ReferDef (4x) + 58551: 936, // RestrictOrCascadeOpt (4x) + 58567: 937, // RowStmt (4x) + 58585: 938, // SequenceOption (4x) + 57535: 939, // statsExtended (4x) + 58648: 940, // TableAsName (4x) + 58649: 941, // TableAsNameOpt (4x) + 58660: 942, // TableNameOptWild (4x) + 58662: 943, // TableOptimizerHintsOpt (4x) + 58664: 944, // TableOptionList (4x) + 58682: 945, // TraceableStmt (4x) + 58683: 946, // TransactionChar (4x) + 58695: 947, // UserSpecList (4x) + 58733: 948, // WindowName (4x) + 58164: 949, // AsOfClause (3x) + 58168: 950, // AssignmentList (3x) + 58170: 951, // AttributesOpt (3x) + 58192: 952, // Boolean (3x) + 58220: 953, // ColumnOption (3x) + 58223: 954, // ColumnPosition (3x) + 58229: 955, // CommonTableExpr (3x) + 58251: 956, // CreateTableStmt (3x) + 58256: 957, // CurdateSym (3x) + 58260: 958, // DatabaseOptionList (3x) + 58268: 959, // DefaultTrueDistinctOpt (3x) + 58296: 960, // EnforcedOrNot (3x) + 57417: 961, // explain (3x) + 58313: 962, // ExtendedPriv (3x) + 58354: 963, // GeneratedAlways (3x) + 58356: 964, // GlobalScope (3x) + 58360: 965, // GroupByClause (3x) + 58378: 966, // IndexHint (3x) + 58382: 967, // IndexHintType (3x) + 58387: 968, // IndexNameAndTypeOpt (3x) + 57458: 969, // keys (3x) + 58419: 970, // Lines (3x) + 58439: 971, // MaxValueOrExpression (3x) + 58449: 972, // NowSym (3x) + 58450: 973, // NowSymFunc (3x) + 58451: 974, // NowSymOptionFraction (3x) + 58479: 975, // OptOrder (3x) + 58482: 976, // OptTemporary (3x) + 58496: 977, // PartDefOptionList (3x) + 58498: 978, // PartitionDefinition (3x) + 58509: 979, // PasswordOrLockOption (3x) + 58517: 980, // PluginNameList (3x) + 58523: 981, // PrimaryOpt (3x) + 58526: 982, // PrivElem (3x) + 58528: 983, // PrivType (3x) + 57503: 984, // procedure (3x) + 58543: 985, // RequireClause (3x) + 58544: 986, // RequireClauseOpt (3x) + 58546: 987, // RequireListElement (3x) + 58563: 988, // RolenameWithoutIdent (3x) + 58556: 989, // RoleOrPrivElem (3x) + 58576: 990, // SelectStmtGroup (3x) + 58594: 991, // SetOprOpt (3x) + 58647: 992, // TableAliasRefList (3x) + 58650: 993, // TableElement (3x) + 58659: 994, // TableNameListOpt2 (3x) + 58675: 995, // TextString (3x) + 58684: 996, // TransactionChars (3x) + 57548: 997, // trigger (3x) + 57552: 998, // unlock (3x) + 57555: 999, // usage (3x) + 58705: 1000, // ValuesList (3x) + 58707: 1001, // ValuesStmtList (3x) + 58703: 1002, // ValueSym (3x) + 58710: 1003, // VariableAssignment (3x) + 58730: 1004, // WindowFrameStart (3x) + 58137: 1005, // AdminStmt (2x) + 58140: 1006, // AllColumnsOrPredicateColumnsOpt (2x) + 58142: 1007, // AlterDatabaseStmt (2x) + 58143: 1008, // AlterImportStmt (2x) + 58144: 1009, // AlterInstanceStmt (2x) + 58145: 1010, // AlterOrderItem (2x) + 58147: 1011, // AlterPolicyStmt (2x) + 58148: 1012, // AlterResourceGroupStmt (2x) + 58149: 1013, // AlterSequenceOption (2x) + 58151: 1014, // AlterSequenceStmt (2x) + 58152: 1015, // AlterTableSpec (2x) + 58157: 1016, // AlterUserStmt (2x) + 58158: 1017, // AnalyzeOption (2x) + 58187: 1018, // BinlogStmt (2x) + 58180: 1019, // BRIEStmt (2x) + 58182: 1020, // BRIETables (2x) + 57375: 1021, // call (2x) + 58198: 1022, // CallStmt (2x) + 58199: 1023, // CastType (2x) + 58200: 1024, // ChangeStmt (2x) + 58206: 1025, // CheckConstraintKeyword (2x) + 58215: 1026, // ColumnNameListOpt (2x) + 58218: 1027, // ColumnNameOrUserVariable (2x) + 58221: 1028, // ColumnOptionList (2x) + 58222: 1029, // ColumnOptionListOpt (2x) + 58224: 1030, // ColumnSetValue (2x) + 58227: 1031, // CommentOrAttributeOption (2x) + 58231: 1032, // CompletionTypeWithinTransaction (2x) + 58233: 1033, // ConnectionOption (2x) + 58235: 1034, // ConnectionOptions (2x) + 58239: 1035, // CreateBindingStmt (2x) + 58240: 1036, // CreateDatabaseStmt (2x) + 58241: 1037, // CreateImportStmt (2x) + 58242: 1038, // CreateIndexStmt (2x) + 58243: 1039, // CreatePolicyStmt (2x) + 58244: 1040, // CreateResourceGroupStmt (2x) + 58245: 1041, // CreateRoleStmt (2x) + 58247: 1042, // CreateSequenceStmt (2x) + 58248: 1043, // CreateStatisticsStmt (2x) + 58249: 1044, // CreateTableOptionListOpt (2x) + 58252: 1045, // CreateUserStmt (2x) + 58254: 1046, // CreateViewStmt (2x) + 57395: 1047, // databases (2x) + 58264: 1048, // DeallocateStmt (2x) + 58265: 1049, // DeallocateSym (2x) + 57406: 1050, // describe (2x) + 58277: 1051, // DoStmt (2x) + 58278: 1052, // DropBindingStmt (2x) + 58279: 1053, // DropDatabaseStmt (2x) + 58280: 1054, // DropImportStmt (2x) + 58281: 1055, // DropIndexStmt (2x) + 58282: 1056, // DropPolicyStmt (2x) + 58283: 1057, // DropResourceGroupStmt (2x) + 58284: 1058, // DropRoleStmt (2x) + 58285: 1059, // DropSequenceStmt (2x) + 58286: 1060, // DropStatisticsStmt (2x) + 58287: 1061, // DropStatsStmt (2x) + 58288: 1062, // DropTableStmt (2x) + 58289: 1063, // DropUserStmt (2x) + 58290: 1064, // DropViewStmt (2x) + 58292: 1065, // DuplicateOpt (2x) + 58294: 1066, // EmptyStmt (2x) + 58295: 1067, // EncryptionOpt (2x) + 58297: 1068, // EnforcedOrNotOpt (2x) + 58301: 1069, // ErrorHandling (2x) + 58303: 1070, // ExecuteStmt (2x) + 58304: 1071, // ExplainFormatType (2x) + 58305: 1072, // ExplainStmt (2x) + 58306: 1073, // ExplainSym (2x) + 58315: 1074, // Field (2x) + 58318: 1075, // FieldItem (2x) + 58325: 1076, // Fields (2x) + 58330: 1077, // FlashbackDatabaseStmt (2x) + 58331: 1078, // FlashbackTableStmt (2x) + 58332: 1079, // FlashbackToNewName (2x) + 58333: 1080, // FlashbackToTimestampStmt (2x) + 58337: 1081, // FlushStmt (2x) + 58343: 1082, // FuncDatetimePrecList (2x) + 58344: 1083, // FuncDatetimePrecListOpt (2x) + 58357: 1084, // GrantProxyStmt (2x) + 58358: 1085, // GrantRoleStmt (2x) + 58359: 1086, // GrantStmt (2x) + 58361: 1087, // HandleRange (2x) + 58363: 1088, // HashString (2x) + 58364: 1089, // HavingClause (2x) + 58365: 1090, // HelpStmt (2x) + 58377: 1091, // IndexAdviseStmt (2x) + 58379: 1092, // IndexHintList (2x) + 58380: 1093, // IndexHintListOpt (2x) + 58385: 1094, // IndexLockAndAlgorithmOpt (2x) + 58398: 1095, // InsertValues (2x) + 58403: 1096, // IntoOpt (2x) + 58409: 1097, // KeyOrIndexOpt (2x) + 57459: 1098, // kill (2x) + 58410: 1099, // KillOrKillTiDB (2x) + 58411: 1100, // KillStmt (2x) + 58416: 1101, // LimitClause (2x) + 57468: 1102, // linear (2x) + 58418: 1103, // LinearOpt (2x) + 58422: 1104, // LoadDataSetItem (2x) + 58426: 1105, // LoadStatsStmt (2x) + 58427: 1106, // LocalOpt (2x) + 58428: 1107, // LocationLabelList (2x) + 58430: 1108, // LockStatsStmt (2x) + 58431: 1109, // LockTablesStmt (2x) + 58440: 1110, // MaxValueOrExpressionList (2x) + 58446: 1111, // NonTransactionalDMLStmt (2x) + 58452: 1112, // NowSymOptionFractionParentheses (2x) + 58454: 1113, // NumList (2x) + 58457: 1114, // ObjectType (2x) + 57490: 1115, // of (2x) + 58458: 1116, // OfTablesOpt (2x) + 58459: 1117, // OnCommitOpt (2x) + 58460: 1118, // OnDelete (2x) + 58463: 1119, // OnUpdate (2x) + 58468: 1120, // OptCollate (2x) + 58473: 1121, // OptFull (2x) + 58475: 1122, // OptInteger (2x) + 58488: 1123, // OptionalBraces (2x) + 58487: 1124, // OptionLevel (2x) + 58477: 1125, // OptLeadLagInfo (2x) + 58476: 1126, // OptLLDefault (2x) + 58494: 1127, // OuterOpt (2x) + 58499: 1128, // PartitionDefinitionList (2x) + 58500: 1129, // PartitionDefinitionListOpt (2x) + 58501: 1130, // PartitionIntervalOpt (2x) + 58507: 1131, // PartitionOpt (2x) + 58508: 1132, // PasswordOpt (2x) + 58510: 1133, // PasswordOrLockOptionList (2x) + 58511: 1134, // PasswordOrLockOptions (2x) + 58514: 1135, // PlacementOptionList (2x) + 58516: 1136, // PlanReplayerStmt (2x) + 58522: 1137, // PreparedStmt (2x) + 58527: 1138, // PrivLevel (2x) + 58530: 1139, // PurgeImportStmt (2x) + 58531: 1140, // QuickOptional (2x) + 58532: 1141, // RecoverTableStmt (2x) + 58534: 1142, // ReferOpt (2x) + 58536: 1143, // RegexpSym (2x) + 58538: 1144, // RenameTableStmt (2x) + 58539: 1145, // RenameUserStmt (2x) + 58541: 1146, // RepeatableOpt (2x) + 58548: 1147, // ResourceGroupNameOption (2x) + 58549: 1148, // ResourceGroupOptionList (2x) + 58550: 1149, // RestartStmt (2x) + 58552: 1150, // ResumeImportStmt (2x) + 57517: 1151, // revoke (2x) + 58553: 1152, // RevokeRoleStmt (2x) + 58554: 1153, // RevokeStmt (2x) + 58557: 1154, // RoleOrPrivElemList (2x) + 58558: 1155, // RoleSpec (2x) + 58580: 1156, // SelectStmtOpt (2x) + 58583: 1157, // SelectStmtSQLCache (2x) + 58587: 1158, // SetBindingStmt (2x) + 58588: 1159, // SetDefaultRoleOpt (2x) + 58589: 1160, // SetDefaultRoleStmt (2x) + 58599: 1161, // SetRoleStmt (2x) + 58603: 1162, // ShowImportStmt (2x) + 58608: 1163, // ShowProfileType (2x) + 58611: 1164, // ShowStmt (2x) + 58612: 1165, // ShowTableAliasOpt (2x) + 58614: 1166, // ShutdownStmt (2x) + 58615: 1167, // SignedLiteral (2x) + 58619: 1168, // SplitOption (2x) + 58620: 1169, // SplitRegionStmt (2x) + 58624: 1170, // Statement (2x) + 58627: 1171, // StatsOptionsOpt (2x) + 58628: 1172, // StatsPersistentVal (2x) + 58629: 1173, // StatsType (2x) + 58630: 1174, // StopImportStmt (2x) + 58637: 1175, // SubPartDefinition (2x) + 58640: 1176, // SubPartitionMethod (2x) + 58645: 1177, // Symbol (2x) + 58651: 1178, // TableElementList (2x) + 58654: 1179, // TableLock (2x) + 58658: 1180, // TableNameListOpt (2x) + 58665: 1181, // TableOrTables (2x) + 58674: 1182, // TablesTerminalSym (2x) + 58672: 1183, // TableToTable (2x) + 58676: 1184, // TextStringList (2x) + 58681: 1185, // TraceStmt (2x) + 58686: 1186, // TruncateTableStmt (2x) + 58689: 1187, // UnlockStatsStmt (2x) + 58690: 1188, // UnlockTablesStmt (2x) + 58696: 1189, // UserToUser (2x) + 58693: 1190, // UseStmt (2x) + 58708: 1191, // Varchar (2x) + 58711: 1192, // VariableAssignmentList (2x) + 58720: 1193, // WhenClause (2x) + 58725: 1194, // WindowDefinition (2x) + 58728: 1195, // WindowFrameBound (2x) + 58735: 1196, // WindowSpec (2x) + 58740: 1197, // WithGrantOptionOpt (2x) + 58741: 1198, // WithList (2x) + 58745: 1199, // Writeable (2x) + 58136: 1200, // AdminShowSlow (1x) + 58138: 1201, // AdminStmtLimitOpt (1x) + 58146: 1202, // AlterOrderList (1x) + 58150: 1203, // AlterSequenceOptionList (1x) + 58153: 1204, // AlterTableSpecList (1x) + 58154: 1205, // AlterTableSpecListOpt (1x) + 58155: 1206, // AlterTableSpecSingleOpt (1x) + 58159: 1207, // AnalyzeOptionList (1x) + 58162: 1208, // AnyOrAll (1x) + 58163: 1209, // ArrayKwdOpt (1x) + 58165: 1210, // AsOfClauseOpt (1x) + 58166: 1211, // AsOpt (1x) + 58171: 1212, // AuthOption (1x) + 58172: 1213, // AuthPlugin (1x) + 58174: 1214, // AutoRandomOpt (1x) + 58184: 1215, // BetweenOrNotOp (1x) + 58186: 1216, // BindingStatusType (1x) + 58189: 1217, // BitValueType (1x) + 58190: 1218, // BlobType (1x) + 58193: 1219, // BooleanType (1x) + 57373: 1220, // both (1x) + 58204: 1221, // CharsetNameOrDefault (1x) + 58205: 1222, // CharsetOpt (1x) + 58210: 1223, // ColumnFormat (1x) + 58212: 1224, // ColumnList (1x) + 58219: 1225, // ColumnNameOrUserVariableList (1x) + 58216: 1226, // ColumnNameOrUserVarListOpt (1x) + 58217: 1227, // ColumnNameOrUserVarListOptWithBrackets (1x) + 58225: 1228, // ColumnSetValueList (1x) + 58230: 1229, // CompareOp (1x) + 58234: 1230, // ConnectionOptionList (1x) + 58237: 1231, // ConstraintElem (1x) + 58246: 1232, // CreateSequenceOptionListOpt (1x) + 58250: 1233, // CreateTableSelectOpt (1x) + 58253: 1234, // CreateViewSelectOpt (1x) + 58261: 1235, // DatabaseOptionListOpt (1x) + 58263: 1236, // DateAndTimeType (1x) + 58258: 1237, // DBNameList (1x) + 58269: 1238, // DefaultValueExpr (1x) + 58291: 1239, // DryRunOptions (1x) + 57412: 1240, // dual (1x) + 58293: 1241, // ElseOpt (1x) + 58298: 1242, // EnforcedOrNotOrNotNullOpt (1x) + 58312: 1243, // ExpressionOpt (1x) + 58314: 1244, // FetchFirstOpt (1x) + 58316: 1245, // FieldAsName (1x) + 58317: 1246, // FieldAsNameOpt (1x) + 58319: 1247, // FieldItemList (1x) + 58321: 1248, // FieldList (1x) + 58327: 1249, // FirstAndLastPartOpt (1x) + 58328: 1250, // FirstOrNext (1x) + 58329: 1251, // FixedPointType (1x) + 58335: 1252, // FloatingPointType (1x) + 58336: 1253, // FlushOption (1x) + 58339: 1254, // FromDual (1x) + 58341: 1255, // FulltextSearchModifierOpt (1x) + 58342: 1256, // FuncDatetimePrec (1x) + 58355: 1257, // GetFormatSelector (1x) + 58362: 1258, // HandleRangeList (1x) + 58367: 1259, // IdentListWithParenOpt (1x) + 58371: 1260, // IfNotRunning (1x) + 58372: 1261, // IfRunning (1x) + 58373: 1262, // IgnoreLines (1x) + 58375: 1263, // ImportTruncate (1x) + 58381: 1264, // IndexHintScope (1x) + 58384: 1265, // IndexKeyTypeOpt (1x) + 58393: 1266, // IndexPartSpecificationListOpt (1x) + 58396: 1267, // IndexTypeOpt (1x) + 58376: 1268, // InOrNotOp (1x) + 58399: 1269, // InstanceOption (1x) + 58401: 1270, // IntegerType (1x) + 58402: 1271, // IntervalExpr (1x) + 58405: 1272, // IsolationLevel (1x) + 58404: 1273, // IsOrNotOp (1x) + 57463: 1274, // leading (1x) + 58413: 1275, // LikeEscapeOpt (1x) + 58414: 1276, // LikeOrNotOp (1x) + 58415: 1277, // LikeTableWithOrWithoutParen (1x) + 58420: 1278, // LinesTerminated (1x) + 58423: 1279, // LoadDataSetList (1x) + 58424: 1280, // LoadDataSetSpecOpt (1x) + 58432: 1281, // LockType (1x) + 58433: 1282, // LogTypeOpt (1x) + 58434: 1283, // Match (1x) + 58435: 1284, // MatchOpt (1x) + 58436: 1285, // MaxIndexNumOpt (1x) + 58437: 1286, // MaxMinutesOpt (1x) + 58438: 1287, // MaxValPartOpt (1x) + 58441: 1288, // NChar (1x) + 58453: 1289, // NullPartOpt (1x) + 58456: 1290, // NumericType (1x) + 58443: 1291, // NVarchar (1x) + 58461: 1292, // OnDeleteUpdateOpt (1x) + 58462: 1293, // OnDuplicateKeyUpdate (1x) + 58464: 1294, // OptBinMod (1x) + 58466: 1295, // OptCharset (1x) + 58469: 1296, // OptErrors (1x) + 58470: 1297, // OptExistingWindowName (1x) + 58472: 1298, // OptFromFirstLast (1x) + 58474: 1299, // OptGConcatSeparator (1x) + 58489: 1300, // OptionalShardColumn (1x) + 58480: 1301, // OptPartitionClause (1x) + 58481: 1302, // OptTable (1x) + 58484: 1303, // OptWindowFrameClause (1x) + 58485: 1304, // OptWindowOrderByClause (1x) + 58491: 1305, // Order (1x) + 58490: 1306, // OrReplace (1x) + 57447: 1307, // outfile (1x) + 58497: 1308, // PartDefValuesOpt (1x) + 58502: 1309, // PartitionKeyAlgorithmOpt (1x) + 58503: 1310, // PartitionMethod (1x) + 58506: 1311, // PartitionNumOpt (1x) + 58512: 1312, // PerDB (1x) + 58513: 1313, // PerTable (1x) + 57501: 1314, // precisionType (1x) + 58521: 1315, // PrepareSQL (1x) + 58529: 1316, // ProcedureCall (1x) + 57508: 1317, // recursive (1x) + 58535: 1318, // RegexpOrNotOp (1x) + 58540: 1319, // ReorganizePartitionRuleOpt (1x) + 58545: 1320, // RequireList (1x) + 58559: 1321, // RoleSpecList (1x) + 58566: 1322, // RowOrRows (1x) + 58573: 1323, // SelectStmtFieldList (1x) + 58581: 1324, // SelectStmtOpts (1x) + 58582: 1325, // SelectStmtOptsList (1x) + 58586: 1326, // SequenceOptionList (1x) + 58591: 1327, // SetOpr (1x) + 58598: 1328, // SetRoleOpt (1x) + 58601: 1329, // ShardableStmt (1x) + 58604: 1330, // ShowIndexKwd (1x) + 58605: 1331, // ShowLikeOrWhereOpt (1x) + 58606: 1332, // ShowPlacementTarget (1x) + 58607: 1333, // ShowProfileArgsOpt (1x) + 58609: 1334, // ShowProfileTypes (1x) + 58610: 1335, // ShowProfileTypesOpt (1x) + 58613: 1336, // ShowTargetFilterable (1x) + 57528: 1337, // spatial (1x) + 58621: 1338, // SplitSyntaxOption (1x) + 57533: 1339, // ssl (1x) + 58622: 1340, // Start (1x) + 58623: 1341, // Starting (1x) + 57534: 1342, // starting (1x) + 58625: 1343, // StatementList (1x) + 58626: 1344, // StatementScope (1x) + 58631: 1345, // StorageMedia (1x) + 57540: 1346, // stored (1x) + 58632: 1347, // StringList (1x) + 58635: 1348, // StringNameOrBRIEOptionKeyword (1x) + 58636: 1349, // StringType (1x) + 58638: 1350, // SubPartDefinitionList (1x) + 58639: 1351, // SubPartDefinitionListOpt (1x) + 58641: 1352, // SubPartitionNumOpt (1x) + 58642: 1353, // SubPartitionOpt (1x) + 58652: 1354, // TableElementListOpt (1x) + 58655: 1355, // TableLockList (1x) + 58668: 1356, // TableRefsClause (1x) + 58669: 1357, // TableSampleMethodOpt (1x) + 58670: 1358, // TableSampleOpt (1x) + 58671: 1359, // TableSampleUnitOpt (1x) + 58673: 1360, // TableToTableList (1x) + 58677: 1361, // TextType (1x) + 57547: 1362, // trailing (1x) + 58685: 1363, // TrimDirection (1x) + 58687: 1364, // Type (1x) + 58697: 1365, // UserToUserList (1x) + 58699: 1366, // UserVariableList (1x) + 58702: 1367, // UsingRoles (1x) + 58704: 1368, // Values (1x) + 58706: 1369, // ValuesOpt (1x) + 58713: 1370, // ViewAlgorithm (1x) + 58714: 1371, // ViewCheckOption (1x) + 58715: 1372, // ViewDefiner (1x) + 58716: 1373, // ViewFieldList (1x) + 58717: 1374, // ViewName (1x) + 58718: 1375, // ViewSQLSecurity (1x) + 57567: 1376, // virtual (1x) + 58719: 1377, // VirtualOrStored (1x) + 58721: 1378, // WhenClauseList (1x) + 58724: 1379, // WindowClauseOptional (1x) + 58726: 1380, // WindowDefinitionList (1x) + 58727: 1381, // WindowFrameBetween (1x) + 58729: 1382, // WindowFrameExtent (1x) + 58731: 1383, // WindowFrameUnits (1x) + 58734: 1384, // WindowNameOrSpec (1x) + 58736: 1385, // WindowSpecDetails (1x) + 58742: 1386, // WithReadLockOpt (1x) + 58743: 1387, // WithValidation (1x) + 58744: 1388, // WithValidationOpt (1x) + 58746: 1389, // Year (1x) + 58135: 1390, // $default (0x) + 58096: 1391, // andnot (0x) + 58169: 1392, // AssignmentListOpt (0x) + 58209: 1393, // ColumnDefList (0x) + 58226: 1394, // CommaOpt (0x) + 58119: 1395, // createTableSelect (0x) + 58110: 1396, // empty (0x) + 57345: 1397, // error (0x) + 58134: 1398, // higherThanComma (0x) + 58128: 1399, // higherThanParenthese (0x) + 58117: 1400, // insertValues (0x) + 57354: 1401, // invalid (0x) + 58120: 1402, // lowerThanCharsetKwd (0x) + 58133: 1403, // lowerThanComma (0x) + 58118: 1404, // lowerThanCreateTableSelect (0x) + 58130: 1405, // lowerThanEq (0x) + 58125: 1406, // lowerThanFunction (0x) + 58116: 1407, // lowerThanInsertValues (0x) + 58121: 1408, // lowerThanKey (0x) + 58122: 1409, // lowerThanLocal (0x) + 58132: 1410, // lowerThanNot (0x) + 58129: 1411, // lowerThanOn (0x) + 58127: 1412, // lowerThanParenthese (0x) + 58123: 1413, // lowerThanRemove (0x) + 58111: 1414, // lowerThanSelectOpt (0x) + 58115: 1415, // lowerThanSelectStmt (0x) + 58114: 1416, // lowerThanSetKeyword (0x) + 58113: 1417, // lowerThanStringLitToken (0x) + 58112: 1418, // lowerThanValueKeyword (0x) + 58124: 1419, // lowerThenOrder (0x) + 58131: 1420, // neg (0x) + 57358: 1421, // odbcDateType (0x) + 57360: 1422, // odbcTimestampType (0x) + 57359: 1423, // odbcTimeType (0x) + 58126: 1424, // tableRefPriority (0x) } yySymNames = []string{ @@ -2270,6 +2314,7 @@ var ( "autoRandomBase", "statsBuckets", "statsTopN", + "ttl", "autoIdCache", "avgRowLength", "compression", @@ -2286,11 +2331,16 @@ var ( "statsSamplePages", "statsSampleRate", "tableChecksum", + "ttlEnable", + "ttlJobInterval", + "resource", "attribute", "account", - "')'", + "failedLoginAttempts", + "passwordLockTime", "resume", "signed", + "')'", "snapshot", "backend", "checkpoint", @@ -2323,11 +2373,11 @@ var ( "nominvalue", "restart", "algorithm", + "regions", "tp", "clustered", "invisible", "nonclustered", - "regions", "visible", "subpartition", "partitions", @@ -2339,18 +2389,17 @@ var ( "learners", "primaryRegion", "schedule", + "survivalPreferences", "voterConstraints", "voters", "columns", "view", - "yearType", "day", - "ascii", - "byteType", + "yearType", "second", "sqlTsiYear", - "unicodeSym", - "fields", + "ascii", + "byteType", "hour", "microsecond", "minute", @@ -2363,8 +2412,12 @@ var ( "sqlTsiQuarter", "sqlTsiSecond", "sqlTsiWeek", + "unicodeSym", "week", + "fields", "tables", + "burstable", + "ruRate", "status", "separator", "cipher", @@ -2398,6 +2451,7 @@ var ( "rollback", "savepoint", "than", + "unbounded", "value", "begin", "binding", @@ -2409,7 +2463,6 @@ var ( "predicate", "temporary", "tiFlash", - "unbounded", "user", "jsonType", "planCache", @@ -2430,6 +2483,7 @@ var ( "off", "optional", "per_db", + "plan", "privileges", "replica", "required", @@ -2445,6 +2499,7 @@ var ( "variables", "attributes", "compact", + "digest", "disable", "duplicate", "dynamic", @@ -2452,10 +2507,9 @@ var ( "errorKwd", "flush", "full", + "history", "mb", "mode", - "never", - "plan", "plugins", "processlist", "recover", @@ -2474,6 +2528,7 @@ var ( "booleanType", "briefType", "buckets", + "capture", "cardinality", "chain", "clientErrorsSummary", @@ -2533,6 +2588,7 @@ var ( "statsOptions", "stop", "swaps", + "tidbJson", "tokudbDefault", "tokudbFast", "tokudbLzma", @@ -2560,7 +2616,6 @@ var ( "boolType", "builtins", "cancel", - "capture", "cascaded", "causal", "cleanup", @@ -2588,7 +2643,6 @@ var ( "function", "grants", "histogramsInFlight", - "history", "imports", "incremental", "indexes", @@ -2602,6 +2656,7 @@ var ( "max_minutes", "national", "ncharType", + "never", "nextval", "none", "nvarcharType", @@ -2623,6 +2678,7 @@ var ( "replayer", "reset", "restores", + "reuse", "run", "security", "serializable", @@ -2659,6 +2715,7 @@ var ( "bitXor", "bound", "cast", + "curDate", "curTime", "dateAdd", "dateSub", @@ -2671,12 +2728,15 @@ var ( "follower", "getFormat", "groupConcat", + "ioReadBandwidth", + "ioWriteBandwidth", "jsonArrayagg", "jsonObjectAgg", "lastval", "leader", "learner", "max", + "member", "min", "names", "now", @@ -2718,38 +2778,38 @@ var ( "with", "stringLit", "not2", + "defaultKwd", "not", "as", - "defaultKwd", + "collate", "union", "using", "left", "right", - "collate", "'+'", "'-'", "mod", "partition", "ignore", "except", - "intersect", "null", + "intersect", "limit", "forKwd", + "charType", "values", "into", "lock", - "where", "eq", + "where", "from", "fetch", + "replace", "order", "force", - "replace", - "charType", + "intLit", "set", "and", - "intLit", "or", "andand", "pipesAsOr", @@ -2761,9 +2821,9 @@ var ( "join", "like", "natural", - "'*'", "cross", "inner", + "'*'", "'}'", "rows", "use", @@ -2772,7 +2832,6 @@ var ( "groups", "desc", "binaryType", - "asc", "dayHour", "dayMicrosecond", "dayMinute", @@ -2784,9 +2843,10 @@ var ( "minuteSecond", "secondMicrosecond", "yearMonth", + "asc", "when", - "in", "elseKwd", + "in", "then", "'/'", "'%'", @@ -2808,9 +2868,10 @@ var ( "ifKwd", "regexpKwd", "rlike", + "memberof", "insert", - "singleAtIdentifier", "tableKwd", + "singleAtIdentifier", "currentUser", "falseKwd", "trueKwd", @@ -2819,19 +2880,21 @@ var ( "row", "hexLit", "paramMarker", - "interval", - "'{'", "bitLit", + "interval", "key", + "'{'", "database", "exists", "convert", + "builtinCurDate", "builtinNow", + "check", + "currentDate", "currentTs", "doubleAtIdentifier", "localTime", "localTs", - "check", "primary", "underscoreCS", "builtinCount", @@ -2844,7 +2907,6 @@ var ( "builtinBitOr", "builtinBitXor", "builtinCast", - "builtinCurDate", "builtinCurTime", "builtinDateAdd", "builtinDateSub", @@ -2865,7 +2927,6 @@ var ( "builtinVarSamp", "caseKwd", "cumeDist", - "currentDate", "currentRole", "currentTime", "denseRank", @@ -2886,11 +2947,11 @@ var ( "unique", "constraint", "references", - "generated", "selectKwd", + "generated", "character", - "match", "index", + "match", "to", "all", "'.'", @@ -2899,17 +2960,18 @@ var ( "maxValue", "jss", "juss", + "array", "lines", "assignmentEq", "by", - "Identifier", - "NotKeywordToken", - "TiDBKeyword", - "UnReservedKeyword", "alter", "require", "'@'", + "Identifier", + "NotKeywordToken", "sql", + "TiDBKeyword", + "UnReservedKeyword", "drop", "cascade", "read", @@ -2978,12 +3040,12 @@ var ( "NUM", "logAnd", "logOr", - "TableName", "EqOpt", + "TableName", "StringName", "deleteKwd", - "unsigned", "LengthNum", + "unsigned", "over", "zerofill", "ColumnName", @@ -3004,8 +3066,8 @@ var ( "WithClause", "SelectStmtWithClause", "SetOprStmt", - "hintComment", "Int64Num", + "hintComment", "FieldLen", "OptWindowingClause", "UpdateStmtNoWith", @@ -3016,29 +3078,29 @@ var ( "sqlCalcFoundRows", "sqlSmallResult", "InsertIntoStmt", + "ReplaceIntoStmt", "UpdateStmt", "CharsetKw", - "ReplaceIntoStmt", "Username", + "IfExists", "ExpressionList", "DeleteWithUsingStmt", - "IfExists", "PlacementPolicyOption", "TableNameList", + "IfNotExists", "terminated", "DeleteFromStmt", "DistinctKwd", - "IfNotExists", "PartitionNameList", "DistinctOpt", "enclosed", "OptFieldLen", + "TimestampUnit", "WhereClause", "WhereClauseOptional", "DefaultKwdOpt", "escaped", "optionally", - "TimestampUnit", "ExprOrDefault", "JoinTable", "OptBinary", @@ -3048,6 +3110,7 @@ var ( "TableRef", "AnalyzeOptionListOpt", "FromOrIn", + "TimeUnit", "AlterTableStmt", "CharsetName", "ColumnNameList", @@ -3058,7 +3121,6 @@ var ( "OrderByOptional", "PartDefOption", "SignedNum", - "TimeUnit", "BuggyDefaultFalseDistinctOpt", "DefaultFalseDistinctOpt", "JoinType", @@ -3117,6 +3179,7 @@ var ( "CollationName", "ColumnKeywordOpt", "DirectPlacementOption", + "DirectResourceGroupOption", "FieldOpt", "FieldOpts", "IdentList", @@ -3130,6 +3193,7 @@ var ( "OptNullTreatment", "PolicyName", "PriorityOpt", + "ResourceGroupName", "SelectLockOpt", "SelectStmtIntoOption", "TableRefs", @@ -3175,6 +3239,7 @@ var ( "ColumnPosition", "CommonTableExpr", "CreateTableStmt", + "CurdateSym", "DatabaseOptionList", "DefaultTrueDistinctOpt", "EnforcedOrNot", @@ -3196,7 +3261,6 @@ var ( "OptTemporary", "PartDefOptionList", "PartitionDefinition", - "PasswordExpire", "PasswordOrLockOption", "PluginNameList", "PrimaryOpt", @@ -3230,6 +3294,7 @@ var ( "AlterInstanceStmt", "AlterOrderItem", "AlterPolicyStmt", + "AlterResourceGroupStmt", "AlterSequenceOption", "AlterSequenceStmt", "AlterTableSpec", @@ -3257,6 +3322,7 @@ var ( "CreateImportStmt", "CreateIndexStmt", "CreatePolicyStmt", + "CreateResourceGroupStmt", "CreateRoleStmt", "CreateSequenceStmt", "CreateStatisticsStmt", @@ -3273,6 +3339,7 @@ var ( "DropImportStmt", "DropIndexStmt", "DropPolicyStmt", + "DropResourceGroupStmt", "DropRoleStmt", "DropSequenceStmt", "DropStatisticsStmt", @@ -3362,6 +3429,8 @@ var ( "RenameTableStmt", "RenameUserStmt", "RepeatableOpt", + "ResourceGroupNameOption", + "ResourceGroupOptionList", "RestartStmt", "ResumeImportStmt", "revoke", @@ -3417,11 +3486,12 @@ var ( "AdminStmtLimitOpt", "AlterOrderList", "AlterSequenceOptionList", - "AlterTablePartitionOpt", "AlterTableSpecList", "AlterTableSpecListOpt", + "AlterTableSpecSingleOpt", "AnalyzeOptionList", "AnyOrAll", + "ArrayKwdOpt", "AsOfClauseOpt", "AsOpt", "AuthOption", @@ -3435,7 +3505,6 @@ var ( "both", "CharsetNameOrDefault", "CharsetOpt", - "ClearPasswordExpireOptions", "ColumnFormat", "ColumnList", "ColumnNameOrUserVariableList", @@ -3642,7809 +3711,7995 @@ var ( yyReductions = []struct{ xsym, components int }{ {0, 1}, - {1315, 1}, - {810, 6}, - {810, 8}, - {810, 10}, - {810, 5}, - {810, 7}, - {810, 7}, - {810, 9}, - {1112, 1}, - {1112, 2}, - {1112, 3}, - {878, 3}, - {878, 3}, - {878, 3}, - {878, 3}, - {878, 3}, - {878, 3}, - {878, 3}, - {878, 3}, - {878, 3}, - {878, 3}, - {878, 3}, - {785, 4}, - {785, 4}, - {785, 4}, - {785, 4}, - {931, 3}, - {931, 3}, - {1146, 3}, - {1146, 3}, - {1179, 1}, - {1179, 2}, - {1179, 4}, - {1179, 8}, - {1179, 8}, - {1179, 3}, - {1179, 3}, - {1084, 0}, - {1084, 3}, - {994, 1}, - {994, 5}, - {994, 5}, - {994, 5}, - {994, 5}, - {994, 6}, - {994, 2}, - {994, 5}, - {994, 6}, - {994, 8}, - {994, 8}, - {994, 1}, - {994, 1}, - {994, 3}, - {994, 4}, - {994, 5}, - {994, 3}, - {994, 4}, - {994, 8}, - {994, 4}, - {994, 7}, - {994, 3}, - {994, 4}, - {994, 4}, - {994, 4}, - {994, 4}, - {994, 2}, - {994, 2}, - {994, 4}, - {994, 4}, - {994, 5}, - {994, 3}, - {994, 2}, - {994, 2}, - {994, 5}, - {994, 6}, - {994, 6}, - {994, 8}, - {994, 5}, - {994, 5}, - {994, 3}, - {994, 3}, - {994, 3}, - {994, 5}, - {994, 1}, - {994, 1}, - {994, 1}, - {994, 1}, - {994, 2}, - {994, 2}, - {994, 1}, - {994, 1}, - {994, 4}, - {994, 3}, - {994, 4}, - {994, 1}, - {994, 1}, - {1294, 0}, - {1294, 5}, - {836, 1}, - {836, 1}, - {1363, 0}, - {1363, 1}, - {1362, 2}, - {1362, 2}, - {873, 1}, - {873, 1}, - {874, 3}, - {874, 3}, - {874, 3}, - {874, 3}, - {874, 3}, - {887, 3}, - {887, 3}, - {1174, 2}, - {1174, 2}, - {832, 1}, - {832, 1}, - {1074, 0}, - {1074, 1}, - {877, 0}, - {877, 1}, - {934, 0}, - {934, 1}, - {934, 2}, - {1181, 0}, - {1181, 1}, - {1180, 1}, - {1180, 3}, - {791, 1}, - {791, 3}, - {837, 0}, - {837, 1}, - {837, 2}, - {1152, 1}, - {1121, 3}, - {1335, 1}, - {1335, 3}, - {1158, 3}, - {1122, 3}, {1340, 1}, - {1340, 3}, - {1164, 3}, - {1118, 5}, - {1118, 3}, - {1118, 4}, - {1057, 4}, - {1057, 5}, - {1057, 5}, - {1055, 4}, - {1056, 0}, - {1056, 2}, - {1054, 4}, - {1144, 6}, - {1144, 8}, - {1143, 6}, - {1143, 2}, - {1313, 0}, - {1313, 2}, - {1313, 1}, - {1313, 3}, - {849, 5}, - {849, 6}, - {849, 7}, - {849, 7}, - {849, 8}, - {849, 9}, - {849, 8}, - {849, 7}, - {849, 6}, - {849, 8}, - {986, 0}, - {986, 2}, - {986, 2}, - {808, 0}, - {808, 2}, - {1182, 1}, - {1182, 3}, - {996, 2}, - {996, 2}, - {996, 3}, - {996, 3}, - {996, 2}, - {996, 2}, + {829, 6}, + {829, 8}, + {829, 10}, + {829, 5}, + {829, 7}, + {829, 7}, + {829, 9}, + {1148, 1}, + {1148, 2}, + {1148, 3}, + {897, 3}, + {897, 1}, + {1135, 1}, + {1135, 2}, + {1135, 3}, {896, 3}, - {930, 1}, - {930, 3}, - {1367, 0}, - {1367, 1}, - {850, 1}, - {850, 2}, - {850, 2}, - {850, 2}, - {850, 4}, - {850, 5}, - {850, 6}, - {850, 4}, - {850, 5}, - {997, 2}, - {1368, 1}, - {1368, 3}, - {853, 3}, - {853, 3}, - {748, 1}, - {748, 3}, - {748, 5}, - {812, 1}, - {812, 3}, - {1005, 0}, - {1005, 1}, - {1234, 0}, - {1234, 3}, - {881, 1}, - {881, 3}, - {1201, 0}, - {1201, 1}, - {1200, 1}, - {1200, 3}, - {1006, 1}, - {1006, 1}, - {1202, 0}, - {1202, 3}, - {854, 1}, - {854, 2}, - {961, 0}, - {961, 1}, - {815, 1}, - {815, 1}, - {939, 1}, - {939, 2}, - {1045, 0}, - {1045, 1}, - {1217, 2}, - {1217, 1}, - {933, 2}, - {933, 1}, - {933, 1}, - {933, 2}, - {933, 3}, - {933, 1}, - {933, 2}, - {933, 2}, - {933, 3}, - {933, 3}, - {933, 2}, - {933, 6}, - {933, 6}, - {933, 1}, - {933, 2}, - {933, 2}, - {933, 2}, - {933, 2}, - {1188, 0}, - {1188, 3}, - {1188, 5}, - {1320, 1}, - {1320, 1}, - {1320, 1}, - {1198, 1}, - {1198, 1}, - {1198, 1}, - {942, 0}, - {942, 2}, - {1352, 0}, - {1352, 1}, - {1352, 1}, - {1007, 1}, - {1007, 2}, - {1008, 0}, - {1008, 1}, - {1206, 7}, - {1206, 7}, - {1206, 7}, - {1206, 7}, + {896, 3}, + {896, 3}, + {896, 3}, + {896, 3}, + {896, 3}, + {896, 3}, + {896, 3}, + {896, 3}, + {896, 3}, + {896, 3}, + {896, 3}, + {803, 4}, + {803, 4}, + {803, 4}, + {803, 4}, + {951, 3}, + {951, 3}, + {1171, 3}, + {1171, 3}, + {1206, 1}, + {1206, 2}, + {1206, 4}, + {1206, 8}, {1206, 8}, - {1206, 5}, - {1258, 2}, - {1258, 2}, - {1258, 2}, + {1206, 3}, + {1206, 3}, + {1206, 2}, + {1107, 0}, + {1107, 3}, + {1015, 1}, + {1015, 5}, + {1015, 5}, + {1015, 5}, + {1015, 5}, + {1015, 6}, + {1015, 2}, + {1015, 5}, + {1015, 6}, + {1015, 8}, + {1015, 8}, + {1015, 1}, + {1015, 1}, + {1015, 3}, + {1015, 4}, + {1015, 5}, + {1015, 3}, + {1015, 4}, + {1015, 8}, + {1015, 4}, + {1015, 7}, + {1015, 3}, + {1015, 4}, + {1015, 4}, + {1015, 4}, + {1015, 4}, + {1015, 2}, + {1015, 2}, + {1015, 4}, + {1015, 4}, + {1015, 5}, + {1015, 3}, + {1015, 2}, + {1015, 2}, + {1015, 5}, + {1015, 6}, + {1015, 6}, + {1015, 8}, + {1015, 5}, + {1015, 5}, + {1015, 3}, + {1015, 3}, + {1015, 3}, + {1015, 5}, + {1015, 1}, + {1015, 1}, + {1015, 1}, + {1015, 1}, + {1015, 2}, + {1015, 2}, + {1015, 1}, + {1015, 1}, + {1015, 4}, + {1015, 3}, + {1015, 4}, + {1015, 1}, + {1015, 1}, + {1319, 0}, + {1319, 5}, + {854, 1}, + {854, 1}, + {1388, 0}, + {1388, 1}, + {1387, 2}, + {1387, 2}, + {891, 1}, + {891, 1}, + {892, 3}, + {892, 3}, + {892, 3}, + {892, 3}, + {892, 3}, + {906, 3}, + {906, 3}, + {1199, 2}, + {1199, 2}, + {850, 1}, + {850, 1}, + {1097, 0}, + {1097, 1}, + {895, 0}, + {895, 1}, + {954, 0}, + {954, 1}, + {954, 2}, + {1205, 0}, + {1205, 1}, + {1204, 1}, + {1204, 3}, + {809, 1}, + {809, 3}, + {855, 0}, + {855, 1}, + {855, 2}, + {1177, 1}, + {1144, 3}, + {1360, 1}, + {1360, 3}, + {1183, 3}, + {1145, 3}, + {1365, 1}, + {1365, 3}, + {1189, 3}, + {1141, 5}, + {1141, 3}, + {1141, 4}, + {1080, 4}, + {1080, 5}, + {1080, 5}, + {1078, 4}, + {1079, 0}, + {1079, 2}, + {1077, 4}, + {1169, 6}, + {1169, 8}, + {1168, 6}, + {1168, 2}, + {1338, 0}, + {1338, 2}, + {1338, 1}, + {1338, 3}, + {867, 5}, + {867, 6}, + {867, 7}, + {867, 7}, + {867, 8}, + {867, 9}, + {867, 8}, + {867, 7}, + {867, 6}, + {867, 8}, + {1006, 0}, + {1006, 2}, + {1006, 2}, + {826, 0}, + {826, 2}, + {1207, 1}, + {1207, 3}, + {1017, 2}, + {1017, 2}, + {1017, 3}, + {1017, 3}, + {1017, 2}, + {1017, 2}, + {916, 3}, + {950, 1}, + {950, 3}, + {1392, 0}, + {1392, 1}, + {868, 1}, + {868, 2}, + {868, 2}, + {868, 2}, + {868, 4}, + {868, 5}, + {868, 6}, + {868, 4}, + {868, 5}, + {1018, 2}, + {1393, 1}, + {1393, 3}, + {871, 3}, + {871, 3}, + {766, 1}, + {766, 3}, + {766, 5}, + {831, 1}, + {831, 3}, + {1026, 0}, + {1026, 1}, {1259, 0}, - {1259, 1}, - {915, 5}, - {1095, 3}, - {1096, 3}, - {1267, 0}, - {1267, 1}, - {1267, 1}, - {1267, 2}, - {1267, 2}, - {1119, 1}, - {1119, 1}, - {1119, 2}, - {1119, 2}, - {1119, 2}, - {1213, 1}, - {1213, 1}, - {1213, 1}, - {1213, 1}, - {904, 3}, - {904, 3}, - {904, 4}, - {1089, 3}, - {1089, 1}, + {1259, 3}, + {900, 1}, + {900, 3}, + {1226, 0}, + {1226, 1}, + {1225, 1}, + {1225, 3}, + {1027, 1}, + {1027, 1}, + {1227, 0}, + {1227, 3}, + {872, 1}, + {872, 2}, + {981, 0}, + {981, 1}, + {834, 1}, + {834, 1}, + {960, 1}, + {960, 2}, + {1068, 0}, + {1068, 1}, + {1242, 2}, + {1242, 1}, + {953, 2}, {953, 1}, + {953, 1}, + {953, 2}, {953, 3}, - {953, 4}, - {718, 4}, - {718, 4}, - {952, 1}, - {952, 1}, - {952, 1}, - {952, 1}, - {951, 1}, - {951, 1}, - {951, 1}, + {953, 1}, + {953, 2}, + {953, 2}, + {953, 3}, + {953, 3}, + {953, 2}, + {953, 6}, + {953, 6}, + {953, 1}, + {953, 2}, + {953, 2}, + {953, 2}, + {953, 2}, + {1214, 0}, + {1214, 3}, + {1214, 5}, + {1345, 1}, + {1345, 1}, + {1345, 1}, + {1223, 1}, + {1223, 1}, + {1223, 1}, + {963, 0}, + {963, 2}, + {1377, 0}, + {1377, 1}, + {1377, 1}, + {1028, 1}, + {1028, 2}, + {1029, 0}, + {1029, 1}, + {1231, 7}, + {1231, 7}, + {1231, 7}, + {1231, 7}, + {1231, 8}, + {1231, 5}, + {1283, 2}, + {1283, 2}, + {1283, 2}, + {1284, 0}, + {1284, 1}, + {935, 5}, + {1118, 3}, + {1119, 3}, + {1292, 0}, + {1292, 1}, + {1292, 1}, + {1292, 2}, + {1292, 2}, + {1142, 1}, {1142, 1}, {1142, 2}, {1142, 2}, - {824, 1}, - {824, 1}, - {824, 1}, - {1148, 1}, - {1148, 1}, - {1148, 1}, - {1190, 1}, - {1190, 1}, - {1021, 12}, - {1037, 3}, - {1017, 13}, - {1241, 0}, - {1241, 3}, - {841, 1}, - {841, 3}, - {831, 3}, - {831, 4}, - {1071, 0}, - {1071, 1}, - {1071, 1}, - {1071, 2}, - {1071, 2}, - {1240, 0}, - {1240, 1}, - {1240, 1}, - {1240, 1}, - {987, 4}, - {987, 3}, - {1015, 5}, - {813, 1}, - {890, 1}, - {855, 4}, - {855, 4}, - {855, 4}, - {855, 2}, - {855, 1}, - {855, 5}, - {1210, 0}, - {1210, 1}, - {937, 1}, - {937, 2}, - {936, 12}, - {936, 7}, - {1094, 0}, - {1094, 4}, - {1094, 4}, - {797, 0}, - {797, 1}, - {1108, 0}, - {1108, 6}, - {1151, 6}, - {1151, 5}, - {1284, 0}, - {1284, 3}, - {1285, 1}, - {1285, 5}, - {1285, 6}, - {1285, 4}, - {1285, 5}, - {1285, 4}, - {1285, 3}, - {1285, 1}, - {1107, 0}, - {1107, 7}, - {1246, 1}, - {1246, 2}, - {1264, 0}, - {1264, 2}, - {1262, 0}, - {1262, 2}, - {1224, 0}, - {1224, 14}, - {1080, 0}, - {1080, 1}, - {1328, 0}, - {1328, 4}, - {1327, 0}, - {1327, 2}, - {1286, 0}, - {1286, 2}, - {1106, 0}, - {1106, 3}, - {1105, 1}, - {1105, 3}, - {957, 5}, - {1326, 0}, - {1326, 3}, - {1325, 1}, - {1325, 3}, - {1150, 3}, - {956, 0}, - {956, 2}, - {818, 3}, - {818, 3}, - {818, 4}, - {818, 3}, - {818, 4}, - {818, 4}, - {818, 3}, - {818, 3}, - {818, 3}, - {818, 3}, - {818, 1}, - {1283, 0}, - {1283, 4}, - {1283, 6}, - {1283, 1}, - {1283, 5}, - {1283, 1}, - {1283, 1}, - {1042, 0}, - {1042, 1}, - {1042, 1}, - {1185, 0}, - {1185, 1}, - {1208, 0}, - {1208, 1}, - {1208, 1}, - {1208, 1}, - {1208, 1}, - {1209, 1}, - {1209, 1}, - {1209, 1}, - {1209, 1}, - {1252, 2}, - {1252, 4}, - {1024, 11}, - {1281, 0}, - {1281, 2}, - {1345, 0}, - {1345, 3}, - {1345, 3}, - {1345, 3}, - {1347, 0}, - {1347, 3}, - {1350, 0}, - {1350, 3}, - {1350, 3}, - {1349, 1}, - {1348, 0}, - {1348, 3}, - {1199, 1}, - {1199, 3}, - {1346, 0}, - {1346, 4}, - {1346, 4}, - {1029, 2}, - {771, 13}, - {771, 9}, - {783, 10}, - {788, 1}, - {788, 1}, - {788, 2}, - {788, 2}, - {838, 1}, - {1031, 4}, - {1033, 7}, - {1039, 6}, - {955, 0}, - {955, 1}, - {955, 2}, - {1041, 4}, - {1041, 6}, - {1040, 3}, - {1040, 5}, - {1035, 3}, - {1035, 5}, - {1038, 3}, - {1038, 5}, - {1038, 4}, - {916, 0}, - {916, 1}, - {916, 1}, - {1156, 1}, - {1156, 1}, - {741, 0}, - {741, 1}, - {1043, 0}, - {1160, 2}, - {1160, 5}, - {1160, 3}, - {1160, 6}, - {1050, 1}, - {1050, 1}, - {1050, 1}, - {1049, 2}, - {1049, 3}, - {1049, 2}, - {1049, 4}, - {1049, 7}, - {1049, 5}, - {1049, 7}, - {1049, 5}, - {1049, 3}, - {1049, 6}, - {1049, 6}, - {1048, 1}, - {1048, 1}, - {1048, 1}, - {1048, 1}, - {1048, 1}, - {1048, 1}, - {1048, 1}, - {868, 2}, - {865, 3}, - {998, 5}, - {998, 5}, - {999, 2}, - {999, 2}, - {999, 2}, - {1212, 1}, - {1212, 3}, - {902, 0}, - {902, 2}, - {899, 1}, - {899, 1}, - {898, 1}, - {898, 1}, - {898, 1}, - {898, 1}, - {898, 1}, - {898, 1}, - {898, 1}, - {898, 1}, - {903, 1}, - {903, 1}, - {903, 1}, - {903, 1}, - {900, 1}, - {900, 1}, - {900, 2}, - {901, 3}, - {901, 3}, - {901, 3}, - {901, 3}, - {901, 5}, - {901, 3}, - {901, 3}, - {901, 3}, - {901, 3}, - {901, 6}, - {901, 3}, - {901, 3}, - {901, 3}, - {901, 3}, - {901, 3}, - {901, 3}, - {745, 1}, - {767, 1}, - {737, 1}, - {932, 1}, - {932, 1}, - {932, 1}, - {1101, 1}, - {1101, 1}, - {1101, 1}, - {1116, 3}, - {1016, 8}, - {1149, 4}, - {1125, 4}, - {988, 6}, - {1032, 4}, - {1137, 5}, - {1236, 0}, - {1236, 2}, + {1142, 2}, + {1238, 1}, + {1238, 1}, + {1238, 1}, + {1238, 1}, + {924, 3}, + {924, 3}, + {924, 4}, + {1112, 3}, + {1112, 1}, + {974, 1}, + {974, 3}, + {974, 4}, + {974, 3}, + {974, 1}, + {736, 4}, + {736, 4}, + {973, 1}, + {973, 1}, + {973, 1}, + {973, 1}, + {972, 1}, + {972, 1}, + {972, 1}, + {957, 1}, + {957, 1}, + {1167, 1}, + {1167, 2}, + {1167, 2}, + {842, 1}, + {842, 1}, + {842, 1}, + {1173, 1}, + {1173, 1}, + {1173, 1}, + {1216, 1}, + {1216, 1}, + {1043, 12}, + {1060, 3}, + {1038, 13}, + {1266, 0}, + {1266, 3}, + {859, 1}, + {859, 3}, + {849, 3}, + {849, 4}, + {1094, 0}, + {1094, 1}, + {1094, 1}, + {1094, 2}, + {1094, 2}, + {1265, 0}, + {1265, 1}, + {1265, 1}, + {1265, 1}, + {1007, 4}, + {1007, 3}, + {1036, 5}, + {832, 1}, + {909, 1}, + {911, 1}, + {873, 4}, + {873, 4}, + {873, 4}, + {873, 2}, + {873, 1}, + {873, 5}, {1235, 0}, - {1235, 3}, - {1271, 0}, + {1235, 1}, + {958, 1}, + {958, 2}, + {956, 12}, + {956, 7}, + {1117, 0}, + {1117, 4}, + {1117, 4}, + {816, 0}, + {816, 1}, + {1131, 0}, + {1131, 6}, + {1176, 6}, + {1176, 5}, + {1309, 0}, + {1309, 3}, + {1310, 1}, + {1310, 5}, + {1310, 6}, + {1310, 4}, + {1310, 5}, + {1310, 4}, + {1310, 3}, + {1310, 1}, + {1130, 0}, + {1130, 7}, {1271, 1}, - {1046, 0}, - {1046, 1}, - {1046, 2}, - {1046, 2}, - {1046, 2}, - {1046, 2}, - {1238, 0}, - {1238, 3}, - {1238, 3}, - {736, 3}, - {736, 3}, - {736, 3}, - {736, 3}, - {736, 2}, - {736, 9}, - {736, 3}, - {736, 3}, - {736, 3}, - {736, 1}, - {950, 1}, - {950, 1}, - {1230, 0}, - {1230, 4}, - {1230, 7}, - {1230, 3}, - {1230, 3}, - {739, 1}, - {739, 1}, - {738, 1}, - {738, 1}, - {782, 1}, - {782, 3}, - {1087, 1}, - {1087, 3}, - {830, 0}, - {830, 1}, - {1060, 0}, - {1060, 1}, - {1059, 1}, - {735, 3}, - {735, 3}, - {735, 4}, - {735, 5}, - {735, 1}, - {1204, 1}, - {1204, 1}, - {1204, 1}, - {1204, 1}, - {1204, 1}, - {1204, 1}, - {1204, 1}, - {1204, 1}, - {1189, 1}, - {1189, 2}, - {1248, 1}, - {1248, 2}, - {1243, 1}, - {1243, 2}, - {1251, 1}, - {1251, 2}, - {1293, 1}, - {1293, 2}, - {1183, 1}, - {1183, 1}, - {1183, 1}, - {734, 5}, - {734, 3}, - {734, 5}, - {734, 4}, - {734, 3}, - {734, 1}, - {1120, 1}, - {1120, 1}, - {1250, 0}, - {1250, 2}, - {1051, 1}, - {1051, 3}, - {1051, 5}, + {1271, 2}, + {1289, 0}, + {1289, 2}, + {1287, 0}, + {1287, 2}, + {1249, 0}, + {1249, 14}, + {1103, 0}, + {1103, 1}, + {1353, 0}, + {1353, 4}, + {1352, 0}, + {1352, 2}, + {1311, 0}, + {1311, 2}, + {1129, 0}, + {1129, 3}, + {1128, 1}, + {1128, 3}, + {978, 5}, + {1351, 0}, + {1351, 3}, + {1350, 1}, + {1350, 3}, + {1175, 3}, + {977, 0}, + {977, 2}, + {837, 3}, + {837, 3}, + {837, 4}, + {837, 3}, + {837, 4}, + {837, 4}, + {837, 3}, + {837, 3}, + {837, 3}, + {837, 3}, + {837, 1}, + {1308, 0}, + {1308, 4}, + {1308, 6}, + {1308, 1}, + {1308, 5}, + {1308, 1}, + {1308, 1}, + {1065, 0}, + {1065, 1}, + {1065, 1}, + {1211, 0}, + {1211, 1}, + {1233, 0}, + {1233, 1}, + {1233, 1}, + {1233, 1}, + {1233, 1}, + {1234, 1}, + {1234, 1}, + {1234, 1}, + {1234, 1}, + {1277, 2}, + {1277, 4}, + {1046, 11}, + {1306, 0}, + {1306, 2}, + {1370, 0}, + {1370, 3}, + {1370, 3}, + {1370, 3}, + {1372, 0}, + {1372, 3}, + {1375, 0}, + {1375, 3}, + {1375, 3}, + {1374, 1}, + {1373, 0}, + {1373, 3}, + {1224, 1}, + {1224, 3}, + {1371, 0}, + {1371, 4}, + {1371, 4}, {1051, 2}, - {1221, 0}, - {1221, 1}, - {1220, 1}, - {1220, 2}, - {1220, 1}, - {1220, 2}, - {1223, 1}, - {1223, 3}, - {944, 3}, + {789, 13}, + {789, 9}, + {802, 10}, + {807, 1}, + {807, 1}, + {807, 2}, + {807, 2}, + {856, 1}, + {1053, 4}, + {1055, 7}, + {1062, 6}, + {976, 0}, + {976, 1}, + {976, 2}, + {1064, 4}, + {1064, 6}, + {1063, 3}, + {1063, 5}, + {1058, 3}, + {1058, 5}, + {1061, 3}, + {1061, 5}, + {1061, 4}, + {936, 0}, + {936, 1}, + {936, 1}, + {1181, 1}, + {1181, 1}, + {758, 0}, + {758, 1}, {1066, 0}, - {1066, 2}, - {1184, 0}, - {1184, 1}, - {929, 3}, - {784, 0}, - {784, 2}, - {790, 0}, - {790, 3}, - {859, 0}, - {859, 1}, - {882, 0}, - {882, 1}, - {884, 0}, - {884, 2}, - {883, 3}, - {883, 1}, - {883, 3}, - {883, 2}, - {883, 1}, - {883, 1}, - {947, 1}, - {947, 3}, - {947, 3}, - {1242, 0}, - {1242, 1}, - {862, 2}, - {862, 2}, - {910, 1}, - {910, 1}, - {910, 1}, - {860, 1}, - {860, 1}, - {664, 1}, - {664, 1}, - {664, 1}, - {664, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {667, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {666, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {665, 1}, - {1001, 2}, - {1291, 1}, - {1291, 3}, - {1291, 4}, - {1291, 6}, - {777, 9}, - {1073, 0}, + {1185, 2}, + {1185, 5}, + {1185, 3}, + {1185, 6}, + {1073, 1}, + {1073, 1}, {1073, 1}, - {1072, 5}, - {1072, 4}, - {1072, 4}, - {1072, 4}, - {1072, 4}, {1072, 2}, - {1072, 1}, - {1072, 1}, - {1072, 1}, - {1072, 1}, + {1072, 3}, {1072, 2}, - {982, 1}, - {982, 1}, - {980, 1}, - {980, 3}, - {844, 3}, - {1344, 0}, - {1344, 1}, - {1343, 3}, - {1343, 1}, - {801, 1}, - {801, 1}, - {1009, 3}, - {1203, 0}, - {1203, 1}, - {1203, 3}, - {1268, 0}, - {1268, 5}, - {780, 6}, - {716, 1}, - {716, 1}, - {716, 1}, - {716, 1}, - {716, 1}, - {716, 1}, - {716, 1}, - {716, 2}, - {716, 1}, - {716, 1}, - {716, 2}, - {716, 2}, - {717, 1}, - {717, 2}, - {1177, 1}, - {1177, 3}, - {990, 2}, - {772, 3}, - {905, 1}, - {905, 3}, - {875, 1}, - {875, 2}, - {1280, 1}, - {1280, 1}, - {954, 0}, - {954, 1}, - {954, 1}, - {817, 0}, - {817, 1}, - {733, 3}, - {733, 3}, - {733, 3}, - {733, 3}, - {733, 3}, - {733, 3}, - {733, 5}, - {733, 5}, - {733, 5}, - {733, 3}, - {733, 3}, - {733, 3}, - {733, 3}, - {733, 3}, - {733, 3}, - {733, 1}, - {715, 1}, - {715, 3}, - {715, 5}, - {728, 1}, - {728, 1}, - {728, 1}, - {728, 1}, - {728, 3}, - {728, 1}, - {728, 1}, - {728, 1}, - {728, 1}, - {728, 1}, - {728, 2}, - {728, 2}, - {728, 2}, - {728, 2}, - {728, 3}, - {728, 2}, - {728, 1}, - {728, 3}, - {728, 5}, - {728, 6}, - {728, 2}, - {728, 4}, - {728, 2}, - {728, 6}, - {728, 5}, - {728, 6}, - {728, 6}, - {728, 4}, - {728, 4}, - {728, 3}, - {728, 3}, - {789, 1}, - {789, 1}, - {792, 1}, - {792, 1}, - {822, 0}, - {822, 1}, - {938, 0}, - {938, 1}, - {821, 1}, - {821, 2}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {722, 1}, - {1100, 0}, - {1100, 2}, - {726, 1}, - {726, 1}, - {726, 1}, - {726, 1}, - {726, 1}, - {725, 1}, - {725, 1}, - {725, 1}, - {725, 1}, - {725, 1}, - {725, 1}, - {720, 4}, - {720, 4}, - {720, 2}, - {720, 3}, - {720, 2}, - {720, 4}, - {720, 6}, - {720, 2}, - {720, 2}, - {720, 2}, - {720, 4}, - {720, 6}, - {720, 4}, - {721, 4}, - {721, 4}, - {721, 6}, - {721, 8}, - {721, 8}, - {721, 6}, - {721, 6}, - {721, 6}, - {721, 6}, - {721, 6}, - {721, 8}, - {721, 8}, - {721, 8}, - {721, 8}, - {721, 4}, - {721, 6}, - {721, 6}, - {721, 7}, - {721, 4}, - {721, 7}, - {721, 7}, - {721, 1}, - {721, 8}, - {1232, 1}, - {1232, 1}, - {1232, 1}, - {1232, 1}, - {723, 1}, - {723, 1}, - {724, 1}, - {724, 1}, - {1338, 1}, - {1338, 1}, - {1338, 1}, - {727, 4}, - {727, 6}, - {727, 1}, - {729, 6}, - {729, 4}, - {729, 4}, - {729, 5}, - {729, 6}, - {729, 5}, - {729, 6}, - {729, 5}, - {729, 6}, - {729, 5}, - {729, 6}, - {729, 5}, - {729, 5}, - {729, 8}, - {729, 6}, - {729, 6}, - {729, 6}, - {729, 6}, - {729, 6}, - {729, 6}, - {729, 6}, - {729, 5}, - {729, 6}, - {729, 7}, - {729, 8}, - {729, 8}, - {729, 9}, - {1274, 0}, - {1274, 2}, - {719, 4}, - {719, 6}, - {1231, 0}, - {1231, 2}, - {1231, 3}, - {820, 1}, - {820, 1}, - {820, 1}, - {820, 1}, - {820, 1}, - {820, 1}, - {820, 1}, - {820, 1}, - {820, 1}, - {820, 1}, - {820, 1}, - {820, 1}, - {800, 1}, - {800, 1}, - {800, 1}, - {800, 1}, - {800, 1}, - {800, 1}, - {800, 1}, - {800, 1}, - {800, 1}, - {800, 1}, - {800, 1}, - {800, 1}, - {800, 1}, - {800, 1}, - {800, 1}, - {800, 1}, - {800, 1}, - {1218, 0}, - {1218, 1}, - {1353, 1}, - {1353, 2}, - {1168, 4}, - {1216, 0}, - {1216, 2}, - {1002, 2}, - {1002, 3}, - {1002, 1}, - {1002, 1}, - {1002, 2}, - {1002, 2}, - {1002, 2}, - {1002, 2}, - {1002, 2}, - {1002, 1}, - {1002, 1}, - {1002, 2}, - {1002, 1}, - {842, 1}, - {842, 1}, - {842, 1}, - {891, 0}, - {891, 1}, - {740, 1}, - {740, 3}, - {786, 1}, - {786, 3}, + {1072, 4}, + {1072, 7}, + {1072, 5}, + {1072, 7}, + {1072, 5}, + {1072, 3}, + {1072, 6}, + {1072, 6}, + {1071, 1}, + {1071, 1}, + {1071, 1}, + {1071, 1}, + {1071, 1}, + {1071, 1}, + {1071, 1}, + {1071, 1}, + {886, 2}, + {883, 3}, + {1019, 5}, + {1019, 5}, + {1020, 2}, + {1020, 2}, + {1020, 2}, + {1237, 1}, + {1237, 3}, + {922, 0}, {922, 2}, - {922, 4}, - {972, 1}, - {972, 3}, - {912, 0}, - {912, 2}, - {1117, 0}, - {1117, 1}, - {1114, 4}, - {1290, 1}, - {1290, 1}, - {1047, 2}, - {1047, 4}, - {1341, 1}, - {1341, 3}, - {1026, 3}, - {1027, 1}, - {1027, 1}, - {867, 1}, - {867, 2}, - {867, 3}, - {867, 4}, - {1011, 4}, - {1011, 4}, - {1011, 5}, - {1011, 2}, - {1011, 3}, - {1011, 1}, - {1011, 2}, - {1141, 1}, + {919, 1}, + {919, 1}, + {918, 1}, + {918, 1}, + {918, 1}, + {918, 1}, + {918, 1}, + {918, 1}, + {918, 1}, + {918, 1}, + {923, 1}, + {923, 1}, + {923, 1}, + {923, 1}, + {920, 1}, + {920, 1}, + {920, 2}, + {921, 3}, + {921, 3}, + {921, 3}, + {921, 3}, + {921, 5}, + {921, 3}, + {921, 3}, + {921, 3}, + {921, 3}, + {921, 6}, + {921, 3}, + {921, 3}, + {921, 3}, + {921, 3}, + {921, 3}, + {921, 3}, + {762, 1}, + {784, 1}, + {755, 1}, + {952, 1}, + {952, 1}, + {952, 1}, {1124, 1}, - {1067, 2}, - {753, 4}, - {754, 3}, - {755, 7}, - {1333, 0}, - {1333, 7}, - {1333, 5}, - {1332, 0}, - {1332, 1}, - {1332, 1}, - {1332, 1}, - {1334, 0}, - {1334, 1}, - {1334, 1}, - {1123, 0}, - {1123, 4}, - {752, 7}, - {752, 6}, - {752, 5}, - {752, 6}, - {752, 6}, - {764, 2}, - {764, 2}, - {763, 2}, - {763, 3}, - {1173, 3}, - {1173, 1}, - {935, 4}, - {1229, 2}, - {1354, 0}, - {1354, 2}, - {1355, 1}, - {1355, 3}, - {1169, 3}, - {928, 1}, - {1171, 3}, - {1360, 4}, - {1272, 0}, - {1272, 1}, - {1276, 0}, - {1276, 3}, - {1279, 0}, - {1279, 3}, - {1278, 0}, - {1278, 2}, - {1358, 1}, - {1358, 1}, - {1358, 1}, - {1357, 1}, - {1357, 1}, - {984, 2}, - {984, 2}, - {984, 2}, - {984, 4}, - {984, 2}, - {1356, 4}, - {1170, 1}, - {1170, 2}, - {1170, 2}, - {1170, 2}, - {1170, 4}, - {769, 0}, - {769, 1}, - {751, 2}, - {1359, 1}, - {1359, 1}, - {732, 4}, - {732, 4}, - {732, 4}, - {732, 4}, - {732, 4}, - {732, 5}, - {732, 7}, - {732, 7}, - {732, 6}, - {732, 6}, - {732, 9}, - {1102, 0}, - {1102, 3}, - {1102, 3}, - {1103, 0}, - {1103, 2}, - {889, 0}, - {889, 2}, - {889, 2}, - {1273, 0}, - {1273, 2}, - {1273, 2}, - {1331, 1}, - {894, 1}, - {894, 3}, - {856, 1}, - {856, 4}, - {807, 1}, - {807, 1}, - {806, 6}, - {806, 2}, - {806, 3}, - {864, 0}, - {864, 4}, - {921, 0}, - {921, 1}, - {920, 1}, - {920, 2}, - {946, 2}, - {946, 2}, - {946, 2}, - {1239, 0}, - {1239, 2}, - {1239, 3}, - {1239, 3}, - {945, 5}, - {861, 0}, - {861, 1}, - {861, 3}, - {861, 1}, - {861, 3}, + {1124, 1}, + {1124, 1}, + {1139, 3}, + {1037, 8}, + {1174, 4}, + {1150, 4}, + {1008, 6}, + {1054, 4}, + {1162, 5}, + {1261, 0}, + {1261, 2}, + {1260, 0}, + {1260, 3}, + {1296, 0}, + {1296, 1}, + {1069, 0}, {1069, 1}, {1069, 2}, - {1070, 0}, - {1070, 1}, - {802, 3}, - {802, 5}, - {802, 7}, - {802, 7}, - {802, 9}, - {802, 4}, - {802, 6}, - {802, 3}, - {802, 5}, - {823, 1}, - {823, 1}, - {1104, 0}, - {1104, 1}, - {827, 1}, - {827, 2}, - {827, 2}, - {1078, 0}, - {1078, 2}, - {886, 1}, - {886, 1}, - {1297, 1}, - {1297, 1}, - {1225, 1}, - {1225, 1}, - {1219, 0}, - {1219, 1}, - {773, 2}, - {773, 4}, - {773, 4}, - {773, 5}, - {834, 0}, - {834, 1}, - {1131, 1}, - {1131, 1}, - {1131, 1}, - {1131, 1}, - {1131, 1}, - {1131, 1}, - {1131, 1}, - {1131, 1}, - {1131, 1}, - {1299, 0}, - {1299, 1}, - {1300, 2}, - {1300, 1}, - {871, 1}, - {923, 0}, - {923, 1}, - {1132, 1}, - {1132, 1}, - {1298, 1}, - {970, 0}, - {970, 1}, - {893, 0}, - {893, 5}, - {713, 3}, - {713, 3}, - {713, 3}, - {713, 3}, - {892, 0}, - {892, 3}, - {892, 3}, - {892, 4}, - {892, 5}, - {892, 4}, - {892, 5}, - {892, 5}, - {892, 4}, - {1093, 0}, - {1093, 2}, - {765, 1}, - {765, 1}, - {765, 2}, - {765, 2}, - {762, 3}, - {762, 3}, - {761, 4}, - {761, 4}, - {761, 5}, - {761, 2}, - {761, 2}, - {761, 3}, - {760, 1}, - {760, 3}, + {1069, 2}, + {1069, 2}, + {1069, 2}, + {1263, 0}, + {1263, 3}, + {1263, 3}, + {754, 3}, + {754, 3}, + {754, 3}, + {754, 3}, + {754, 2}, + {754, 9}, + {754, 3}, + {754, 3}, + {754, 3}, + {754, 1}, + {971, 1}, + {971, 1}, + {1255, 0}, + {1255, 4}, + {1255, 7}, + {1255, 3}, + {1255, 3}, + {757, 1}, + {757, 1}, {756, 1}, {756, 1}, - {1302, 2}, - {1302, 2}, - {1302, 2}, - {971, 1}, - {1003, 9}, - {1003, 9}, - {869, 2}, - {869, 4}, - {869, 6}, - {869, 4}, - {869, 4}, - {869, 3}, - {869, 6}, - {869, 6}, - {869, 3}, - {1136, 3}, - {1135, 6}, - {1134, 1}, - {1134, 1}, - {1134, 1}, - {1303, 3}, - {1303, 1}, - {1303, 1}, - {976, 1}, - {976, 3}, - {926, 3}, - {926, 2}, - {926, 2}, - {926, 3}, - {1247, 2}, - {1247, 2}, - {1247, 2}, - {1247, 1}, - {845, 1}, - {845, 1}, - {845, 1}, - {828, 1}, - {828, 1}, - {835, 1}, - {835, 3}, - {907, 1}, - {907, 3}, - {907, 3}, - {983, 3}, - {983, 4}, - {983, 4}, - {983, 4}, - {983, 3}, - {983, 3}, - {983, 2}, - {983, 4}, - {983, 4}, - {983, 2}, - {983, 2}, - {1195, 1}, - {1195, 1}, - {811, 1}, - {811, 1}, - {876, 1}, - {876, 1}, - {1167, 1}, - {1167, 3}, - {731, 1}, - {731, 1}, - {730, 1}, - {714, 1}, - {781, 1}, - {781, 3}, - {781, 2}, - {781, 2}, - {872, 1}, - {872, 3}, - {1109, 1}, - {1109, 4}, - {897, 1}, - {826, 1}, - {826, 1}, + {801, 1}, + {801, 3}, + {1110, 1}, + {1110, 3}, + {848, 0}, + {848, 1}, + {1083, 0}, + {1083, 1}, + {1082, 1}, + {753, 3}, + {753, 3}, + {753, 4}, + {753, 5}, + {753, 1}, + {1229, 1}, + {1229, 1}, + {1229, 1}, + {1229, 1}, + {1229, 1}, + {1229, 1}, + {1229, 1}, + {1229, 1}, + {1215, 1}, + {1215, 2}, + {1273, 1}, + {1273, 2}, + {1268, 1}, + {1268, 2}, + {1276, 1}, + {1276, 2}, + {1318, 1}, + {1318, 2}, + {1208, 1}, + {1208, 1}, + {1208, 1}, + {752, 5}, + {752, 3}, + {752, 5}, + {752, 4}, + {752, 3}, + {752, 5}, + {752, 1}, + {1143, 1}, + {1143, 1}, + {1275, 0}, + {1275, 2}, + {1074, 1}, + {1074, 3}, + {1074, 5}, + {1074, 2}, + {1246, 0}, + {1246, 1}, + {1245, 1}, + {1245, 2}, + {1245, 1}, + {1245, 2}, + {1248, 1}, + {1248, 3}, + {965, 3}, + {1089, 0}, + {1089, 2}, + {1210, 0}, + {1210, 1}, + {949, 3}, + {800, 0}, + {800, 2}, + {805, 0}, {805, 3}, - {805, 2}, - {968, 1}, + {877, 0}, + {877, 1}, + {901, 0}, + {901, 1}, + {903, 0}, + {903, 2}, + {902, 3}, + {902, 1}, + {902, 3}, + {902, 2}, + {902, 1}, + {902, 1}, {968, 1}, - {825, 1}, - {825, 1}, - {866, 1}, - {866, 3}, - {1176, 2}, - {1176, 4}, - {1176, 4}, - {985, 3}, - {985, 5}, - {985, 6}, - {985, 4}, - {985, 4}, - {985, 5}, - {985, 5}, - {985, 5}, - {985, 6}, - {985, 4}, - {985, 5}, - {985, 6}, - {985, 6}, - {985, 4}, - {985, 3}, - {985, 3}, - {985, 4}, - {985, 4}, - {985, 5}, - {985, 5}, - {985, 3}, - {985, 3}, - {985, 3}, - {985, 3}, - {985, 3}, - {985, 3}, - {985, 3}, - {985, 3}, - {985, 4}, - {1175, 2}, - {1175, 2}, - {1175, 3}, - {1175, 3}, - {1233, 1}, - {1233, 3}, - {1064, 5}, - {1090, 1}, - {1090, 3}, - {1139, 3}, - {1139, 4}, - {1139, 4}, - {1139, 5}, - {1139, 4}, - {1139, 5}, - {1139, 4}, - {1139, 4}, - {1139, 6}, - {1139, 4}, - {1139, 8}, - {1139, 2}, - {1139, 5}, - {1139, 3}, - {1139, 3}, - {1139, 2}, - {1139, 5}, - {1139, 2}, - {1139, 2}, - {1139, 4}, - {1307, 2}, - {1307, 2}, - {1307, 4}, - {1310, 0}, - {1310, 1}, - {1309, 1}, - {1309, 3}, - {1138, 1}, - {1138, 1}, - {1138, 2}, - {1138, 2}, - {1138, 2}, - {1138, 1}, - {1138, 1}, - {1138, 1}, - {1138, 1}, - {1308, 0}, - {1308, 3}, - {1342, 0}, - {1342, 2}, - {1305, 1}, - {1305, 1}, - {1305, 1}, - {809, 1}, - {809, 1}, - {1311, 1}, - {1311, 1}, - {1311, 1}, - {1311, 1}, - {1311, 3}, - {1311, 3}, - {1311, 3}, - {1311, 3}, - {1311, 5}, - {1311, 4}, - {1311, 5}, - {1311, 5}, - {1311, 1}, - {1311, 5}, - {1311, 1}, - {1311, 2}, - {1311, 2}, - {1311, 2}, - {1311, 1}, - {1311, 2}, - {1311, 2}, - {1311, 2}, - {1311, 2}, - {1311, 2}, - {1311, 2}, - {1311, 2}, - {1311, 1}, - {1311, 1}, - {1311, 1}, - {1311, 1}, - {1311, 1}, - {1311, 1}, - {1311, 1}, - {1311, 1}, - {1311, 1}, - {1311, 1}, - {1311, 1}, - {1311, 2}, - {1311, 1}, - {1311, 1}, - {1311, 1}, - {1311, 1}, - {1311, 2}, - {1306, 0}, - {1306, 2}, - {1306, 2}, - {943, 0}, - {943, 1}, - {943, 1}, - {1319, 0}, - {1319, 1}, - {1319, 1}, - {1319, 1}, - {1098, 0}, - {1098, 1}, - {846, 0}, - {846, 2}, - {1140, 2}, - {1058, 3}, - {960, 1}, - {960, 3}, - {1228, 1}, - {1228, 1}, - {1228, 3}, + {968, 3}, + {968, 3}, + {1267, 0}, + {1267, 1}, + {880, 2}, + {880, 2}, + {930, 1}, + {930, 1}, + {930, 1}, + {878, 1}, + {878, 1}, + {685, 1}, + {685, 1}, + {685, 1}, + {685, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {689, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {688, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {686, 1}, + {1022, 2}, + {1316, 1}, + {1316, 3}, + {1316, 4}, + {1316, 6}, + {795, 9}, + {1096, 0}, + {1096, 1}, + {1095, 5}, + {1095, 4}, + {1095, 4}, + {1095, 4}, + {1095, 4}, + {1095, 2}, + {1095, 1}, + {1095, 1}, + {1095, 1}, + {1095, 1}, + {1095, 2}, + {1002, 1}, + {1002, 1}, + {1000, 1}, + {1000, 3}, + {862, 3}, + {1369, 0}, + {1369, 1}, + {1368, 3}, + {1368, 1}, + {819, 1}, + {819, 1}, + {1030, 3}, + {1228, 0}, {1228, 1}, - {1228, 2}, {1228, 3}, - {1228, 1}, - {1257, 0}, - {1257, 1}, + {1293, 0}, + {1293, 5}, + {796, 6}, + {734, 1}, + {734, 1}, + {734, 1}, + {734, 1}, + {734, 1}, + {734, 1}, + {734, 1}, + {734, 2}, + {734, 1}, + {734, 1}, + {734, 2}, + {734, 2}, + {735, 1}, + {735, 2}, + {1202, 1}, + {1202, 3}, + {1010, 2}, + {790, 3}, + {925, 1}, + {925, 3}, + {893, 1}, + {893, 2}, + {1305, 1}, + {1305, 1}, + {975, 0}, + {975, 1}, + {975, 1}, + {836, 0}, + {836, 1}, + {751, 3}, + {751, 3}, + {751, 3}, + {751, 3}, + {751, 3}, + {751, 3}, + {751, 5}, + {751, 5}, + {751, 5}, + {751, 3}, + {751, 3}, + {751, 3}, + {751, 3}, + {751, 3}, + {751, 3}, + {751, 1}, + {733, 1}, + {733, 3}, + {733, 5}, + {746, 1}, + {746, 1}, + {746, 1}, + {746, 1}, + {746, 3}, + {746, 1}, + {746, 1}, + {746, 1}, + {746, 1}, + {746, 1}, + {746, 2}, + {746, 2}, + {746, 2}, + {746, 2}, + {746, 3}, + {746, 2}, + {746, 1}, + {746, 3}, + {746, 5}, + {746, 6}, + {746, 2}, + {746, 4}, + {746, 2}, + {746, 7}, + {746, 5}, + {746, 6}, + {746, 6}, + {746, 4}, + {746, 4}, + {746, 3}, + {746, 3}, + {1209, 0}, + {1209, 1}, + {808, 1}, + {808, 1}, + {810, 1}, + {810, 1}, + {840, 0}, + {840, 1}, + {959, 0}, + {959, 1}, + {839, 1}, + {839, 2}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {740, 1}, + {1123, 0}, + {1123, 2}, + {744, 1}, + {744, 1}, + {744, 1}, + {744, 1}, + {744, 1}, + {743, 1}, + {743, 1}, + {743, 1}, + {743, 1}, + {743, 1}, + {743, 1}, + {738, 4}, + {738, 4}, + {738, 2}, + {738, 3}, + {738, 2}, + {738, 4}, + {738, 6}, + {738, 2}, + {738, 2}, + {738, 2}, + {738, 4}, + {738, 6}, + {738, 4}, + {739, 4}, + {739, 4}, + {739, 6}, + {739, 8}, + {739, 8}, + {739, 6}, + {739, 6}, + {739, 6}, + {739, 6}, + {739, 6}, + {739, 8}, + {739, 8}, + {739, 8}, + {739, 8}, + {739, 4}, + {739, 6}, + {739, 6}, + {739, 7}, + {739, 4}, + {739, 7}, + {739, 7}, + {739, 1}, + {739, 8}, {1257, 1}, {1257, 1}, {1257, 1}, {1257, 1}, - {833, 0}, - {833, 1}, - {833, 1}, - {1155, 0}, - {1155, 1}, - {974, 0}, - {974, 2}, - {1361, 0}, - {1361, 3}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {1145, 1}, - {925, 1}, - {925, 1}, - {925, 1}, - {925, 1}, - {925, 1}, - {925, 1}, - {925, 1}, - {925, 1}, - {925, 1}, - {925, 1}, - {925, 1}, - {925, 1}, - {925, 1}, - {925, 1}, - {925, 1}, - {925, 1}, - {829, 1}, - {829, 1}, - {829, 1}, - {829, 1}, - {829, 1}, - {829, 1}, - {829, 1}, - {829, 1}, - {829, 1}, - {1318, 1}, - {1318, 3}, - {908, 2}, - {1004, 1}, - {1004, 1}, - {973, 1}, - {973, 1}, - {1153, 1}, - {1153, 3}, - {1329, 0}, - {1329, 3}, - {847, 1}, - {847, 4}, - {847, 4}, - {847, 4}, - {847, 3}, - {847, 4}, - {847, 3}, - {847, 3}, - {847, 3}, - {847, 3}, - {847, 3}, - {847, 3}, - {847, 3}, - {847, 3}, - {847, 1}, - {847, 3}, - {847, 3}, - {847, 3}, - {847, 3}, - {847, 3}, - {847, 3}, - {847, 3}, - {847, 3}, - {847, 3}, - {847, 3}, - {847, 3}, - {847, 3}, - {847, 3}, - {847, 2}, - {847, 2}, - {847, 3}, - {847, 3}, - {847, 5}, - {847, 3}, - {840, 0}, - {840, 1}, - {1147, 1}, - {1147, 1}, - {1022, 0}, - {1022, 1}, - {924, 1}, - {924, 2}, - {924, 3}, - {1277, 0}, - {1277, 1}, - {1161, 3}, - {843, 3}, - {843, 3}, - {843, 3}, - {843, 3}, - {843, 3}, - {843, 3}, - {843, 3}, - {843, 3}, - {843, 3}, - {843, 3}, - {843, 3}, - {843, 3}, - {843, 3}, - {843, 3}, - {843, 3}, - {1339, 1}, - {1339, 1}, - {1339, 1}, - {1265, 3}, - {1265, 2}, - {1265, 3}, - {1265, 3}, - {1265, 2}, - {1245, 1}, - {1245, 1}, - {1245, 1}, - {1245, 1}, - {1245, 1}, - {1245, 1}, - {1245, 1}, - {1245, 1}, - {1245, 1}, - {1245, 1}, - {1245, 1}, - {1193, 1}, - {1193, 1}, - {1099, 0}, - {1099, 1}, - {1099, 1}, - {1226, 1}, - {1226, 1}, - {1226, 1}, - {1227, 1}, - {1227, 1}, - {1227, 1}, - {1227, 2}, - {1191, 1}, - {1324, 3}, - {1324, 2}, - {1324, 3}, - {1324, 2}, - {1324, 3}, - {1324, 3}, - {1324, 2}, - {1324, 2}, - {1324, 1}, - {1324, 2}, - {1324, 5}, - {1324, 5}, - {1324, 1}, - {1324, 3}, - {1324, 2}, - {906, 1}, - {906, 1}, - {1263, 1}, - {1263, 2}, - {1263, 2}, - {1166, 2}, - {1166, 2}, - {1166, 1}, + {741, 1}, + {741, 1}, + {742, 1}, + {742, 1}, + {1363, 1}, + {1363, 1}, + {1363, 1}, + {745, 4}, + {745, 6}, + {745, 1}, + {747, 6}, + {747, 4}, + {747, 4}, + {747, 5}, + {747, 6}, + {747, 5}, + {747, 6}, + {747, 5}, + {747, 6}, + {747, 5}, + {747, 6}, + {747, 5}, + {747, 5}, + {747, 8}, + {747, 6}, + {747, 6}, + {747, 6}, + {747, 6}, + {747, 6}, + {747, 6}, + {747, 6}, + {747, 5}, + {747, 6}, + {747, 7}, + {747, 8}, + {747, 8}, + {747, 9}, + {1299, 0}, + {1299, 2}, + {737, 4}, + {737, 6}, + {1256, 0}, + {1256, 2}, + {1256, 3}, + {828, 1}, + {828, 1}, + {828, 1}, + {828, 1}, + {828, 1}, + {828, 1}, + {828, 1}, + {828, 1}, + {828, 1}, + {828, 1}, + {828, 1}, + {828, 1}, + {813, 1}, + {813, 1}, + {813, 1}, + {813, 1}, + {813, 1}, + {813, 1}, + {813, 1}, + {813, 1}, + {813, 1}, + {813, 1}, + {813, 1}, + {813, 1}, + {813, 1}, + {813, 1}, + {813, 1}, + {813, 1}, + {813, 1}, + {1243, 0}, + {1243, 1}, + {1378, 1}, + {1378, 2}, + {1193, 4}, + {1241, 0}, + {1241, 2}, + {1023, 2}, + {1023, 3}, + {1023, 1}, + {1023, 1}, + {1023, 2}, + {1023, 2}, + {1023, 2}, + {1023, 2}, + {1023, 2}, + {1023, 1}, + {1023, 1}, + {1023, 2}, + {1023, 1}, + {860, 1}, + {860, 1}, + {860, 1}, + {910, 0}, + {910, 1}, + {759, 1}, + {759, 3}, + {804, 1}, + {804, 3}, + {942, 2}, + {942, 4}, + {992, 1}, + {992, 3}, + {932, 0}, + {932, 2}, + {1140, 0}, + {1140, 1}, + {1137, 4}, + {1315, 1}, + {1315, 1}, + {1070, 2}, + {1070, 4}, + {1366, 1}, + {1366, 3}, + {1048, 3}, + {1049, 1}, + {1049, 1}, + {885, 1}, + {885, 2}, + {885, 3}, + {885, 4}, + {1032, 4}, + {1032, 4}, + {1032, 5}, + {1032, 2}, + {1032, 3}, + {1032, 1}, + {1032, 2}, {1166, 1}, - {1266, 2}, - {1266, 2}, - {1266, 1}, - {1266, 2}, - {1266, 2}, - {1266, 3}, - {1266, 3}, - {1266, 2}, - {1364, 1}, - {1364, 1}, - {1192, 1}, - {1192, 2}, - {1192, 1}, - {1192, 1}, - {1192, 2}, - {1336, 1}, - {1336, 2}, - {1336, 1}, - {1336, 1}, - {888, 1}, - {888, 1}, - {888, 1}, - {888, 1}, - {1211, 1}, - {1211, 2}, - {1211, 2}, - {1211, 2}, - {1211, 3}, - {768, 3}, - {794, 0}, - {794, 1}, - {879, 1}, + {1149, 1}, + {1090, 2}, + {771, 4}, + {772, 3}, + {773, 7}, + {1358, 0}, + {1358, 7}, + {1358, 5}, + {1357, 0}, + {1357, 1}, + {1357, 1}, + {1357, 1}, + {1359, 0}, + {1359, 1}, + {1359, 1}, + {1146, 0}, + {1146, 4}, + {770, 7}, + {770, 6}, + {770, 5}, + {770, 6}, + {770, 6}, + {782, 2}, + {782, 2}, + {781, 2}, + {781, 3}, + {1198, 3}, + {1198, 1}, + {955, 4}, + {1254, 2}, + {1379, 0}, + {1379, 2}, + {1380, 1}, + {1380, 3}, + {1194, 3}, + {948, 1}, + {1196, 3}, + {1385, 4}, + {1297, 0}, + {1297, 1}, + {1301, 0}, + {1301, 3}, + {1304, 0}, + {1304, 3}, + {1303, 0}, + {1303, 2}, + {1383, 1}, + {1383, 1}, + {1383, 1}, + {1382, 1}, + {1382, 1}, + {1004, 2}, + {1004, 2}, + {1004, 2}, + {1004, 4}, + {1004, 2}, + {1381, 4}, + {1195, 1}, + {1195, 2}, + {1195, 2}, + {1195, 2}, + {1195, 4}, + {787, 0}, + {787, 1}, + {769, 2}, + {1384, 1}, + {1384, 1}, + {750, 4}, + {750, 4}, + {750, 4}, + {750, 4}, + {750, 4}, + {750, 5}, + {750, 7}, + {750, 7}, + {750, 6}, + {750, 6}, + {750, 9}, + {1125, 0}, + {1125, 3}, + {1125, 3}, + {1126, 0}, + {1126, 2}, + {908, 0}, + {908, 2}, + {908, 2}, + {1298, 0}, + {1298, 2}, + {1298, 2}, + {1356, 1}, + {914, 1}, + {914, 3}, + {874, 1}, + {874, 4}, + {825, 1}, + {825, 1}, + {824, 6}, + {824, 2}, + {824, 3}, + {882, 0}, + {882, 4}, + {941, 0}, + {941, 1}, + {940, 1}, + {940, 2}, + {967, 2}, + {967, 2}, + {967, 2}, + {1264, 0}, + {1264, 2}, + {1264, 3}, + {1264, 3}, + {966, 5}, + {879, 0}, {879, 1}, + {879, 3}, {879, 1}, - {880, 0}, - {880, 2}, - {909, 0}, - {909, 1}, - {909, 1}, - {914, 5}, - {1269, 0}, - {1269, 1}, - {803, 0}, - {803, 2}, - {803, 3}, - {1270, 0}, - {1270, 2}, - {779, 2}, - {779, 1}, - {779, 2}, - {1097, 0}, - {1097, 2}, + {879, 3}, + {1092, 1}, + {1092, 2}, + {1093, 0}, + {1093, 1}, + {820, 3}, + {820, 5}, + {820, 7}, + {820, 7}, + {820, 9}, + {820, 4}, + {820, 6}, + {820, 3}, + {820, 5}, + {841, 1}, + {841, 1}, + {1127, 0}, + {1127, 1}, + {845, 1}, + {845, 2}, + {845, 2}, + {1101, 0}, + {1101, 2}, + {905, 1}, + {905, 1}, {1322, 1}, - {1322, 3}, - {975, 1}, - {975, 1}, - {975, 1}, - {1159, 1}, - {1159, 3}, - {742, 1}, - {742, 1}, - {1323, 1}, - {1323, 1}, + {1322, 1}, + {1250, 1}, + {1250, 1}, + {1244, 0}, + {1244, 1}, + {791, 2}, + {791, 4}, + {791, 4}, + {791, 5}, + {852, 0}, + {852, 1}, + {1156, 1}, + {1156, 1}, + {1156, 1}, + {1156, 1}, + {1156, 1}, + {1156, 1}, + {1156, 1}, + {1156, 1}, + {1156, 1}, + {1324, 0}, + {1324, 1}, + {1325, 2}, + {1325, 1}, + {889, 1}, + {943, 0}, + {943, 1}, + {1157, 1}, + {1157, 1}, {1323, 1}, + {990, 0}, + {990, 1}, + {913, 0}, + {913, 5}, + {731, 3}, + {731, 3}, + {731, 3}, + {731, 3}, + {912, 0}, + {912, 3}, + {912, 3}, + {912, 4}, + {912, 5}, + {912, 4}, + {912, 5}, + {912, 5}, + {912, 4}, + {1116, 0}, + {1116, 2}, + {783, 1}, + {783, 1}, + {783, 2}, + {783, 2}, + {780, 3}, + {780, 3}, + {779, 4}, + {779, 4}, + {779, 5}, + {779, 2}, + {779, 2}, + {779, 3}, {778, 1}, - {778, 2}, - {770, 10}, - {770, 8}, - {1165, 2}, - {795, 2}, - {796, 0}, - {796, 1}, - {1369, 0}, - {1369, 1}, - {1023, 8}, - {1019, 4}, - {995, 8}, - {995, 9}, - {989, 3}, - {1244, 2}, - {1244, 6}, - {895, 2}, + {778, 3}, + {774, 1}, + {774, 1}, + {1327, 2}, + {1327, 2}, + {1327, 2}, + {991, 1}, + {1024, 9}, + {1024, 9}, + {887, 2}, + {887, 4}, + {887, 6}, + {887, 4}, + {887, 4}, + {887, 3}, + {887, 6}, + {887, 6}, + {887, 3}, + {1161, 3}, + {1160, 6}, + {1159, 1}, + {1159, 1}, + {1159, 1}, + {1328, 3}, + {1328, 1}, + {1328, 1}, + {996, 1}, + {996, 3}, + {946, 3}, + {946, 2}, + {946, 2}, + {946, 3}, + {1272, 2}, + {1272, 2}, + {1272, 2}, + {1272, 1}, + {863, 1}, + {863, 1}, + {863, 1}, + {846, 1}, + {846, 1}, + {853, 1}, + {853, 3}, {927, 1}, {927, 3}, - {1013, 0}, - {1013, 2}, - {1205, 1}, - {1205, 2}, - {1012, 2}, - {1012, 2}, - {1012, 2}, - {1012, 2}, - {966, 0}, - {966, 1}, - {965, 2}, - {965, 2}, - {965, 2}, - {965, 2}, - {1295, 1}, - {1295, 3}, + {927, 3}, + {1003, 3}, + {1003, 4}, + {1003, 4}, + {1003, 4}, + {1003, 3}, + {1003, 3}, + {1003, 2}, + {1003, 4}, + {1003, 4}, + {1003, 2}, + {1003, 2}, + {1221, 1}, + {1221, 1}, + {830, 1}, + {830, 1}, + {894, 1}, + {894, 1}, + {1192, 1}, + {1192, 3}, + {749, 1}, + {749, 1}, + {748, 1}, + {732, 1}, + {799, 1}, + {799, 3}, + {799, 2}, + {799, 2}, + {890, 1}, + {890, 3}, + {1132, 1}, + {1132, 4}, + {917, 1}, + {844, 1}, + {844, 1}, + {823, 3}, + {823, 2}, + {988, 1}, + {988, 1}, + {843, 1}, + {843, 1}, + {884, 1}, + {884, 3}, + {1201, 2}, + {1201, 4}, + {1201, 4}, + {1005, 3}, + {1005, 5}, + {1005, 6}, + {1005, 4}, + {1005, 4}, + {1005, 5}, + {1005, 5}, + {1005, 5}, + {1005, 6}, + {1005, 4}, + {1005, 5}, + {1005, 6}, + {1005, 6}, + {1005, 4}, + {1005, 3}, + {1005, 3}, + {1005, 4}, + {1005, 4}, + {1005, 5}, + {1005, 5}, + {1005, 3}, + {1005, 3}, + {1005, 3}, + {1005, 3}, + {1005, 3}, + {1005, 3}, + {1005, 3}, + {1005, 3}, + {1005, 4}, + {1200, 2}, + {1200, 2}, + {1200, 3}, + {1200, 3}, + {1258, 1}, + {1258, 3}, + {1087, 5}, + {1113, 1}, + {1113, 3}, + {1164, 3}, + {1164, 4}, + {1164, 4}, + {1164, 5}, + {1164, 4}, + {1164, 5}, + {1164, 5}, + {1164, 4}, + {1164, 4}, + {1164, 6}, + {1164, 4}, + {1164, 8}, + {1164, 2}, + {1164, 5}, + {1164, 3}, + {1164, 3}, + {1164, 2}, + {1164, 5}, + {1164, 2}, + {1164, 2}, + {1164, 4}, + {1332, 2}, + {1332, 2}, + {1332, 4}, + {1335, 0}, + {1335, 1}, + {1334, 1}, + {1334, 3}, + {1163, 1}, + {1163, 1}, + {1163, 2}, + {1163, 2}, + {1163, 2}, + {1163, 1}, + {1163, 1}, + {1163, 1}, + {1163, 1}, + {1333, 0}, + {1333, 3}, + {1367, 0}, + {1367, 2}, + {1330, 1}, + {1330, 1}, + {1330, 1}, + {827, 1}, + {827, 1}, + {1336, 1}, + {1336, 1}, + {1336, 1}, + {1336, 1}, + {1336, 3}, + {1336, 3}, + {1336, 3}, + {1336, 3}, + {1336, 5}, + {1336, 4}, + {1336, 5}, + {1336, 5}, + {1336, 1}, + {1336, 5}, + {1336, 1}, + {1336, 2}, + {1336, 2}, + {1336, 2}, + {1336, 1}, + {1336, 2}, + {1336, 2}, + {1336, 2}, + {1336, 2}, + {1336, 2}, + {1336, 2}, + {1336, 2}, + {1336, 1}, + {1336, 1}, + {1336, 1}, + {1336, 1}, + {1336, 1}, + {1336, 1}, + {1336, 1}, + {1336, 1}, + {1336, 1}, + {1336, 1}, + {1336, 1}, + {1336, 2}, + {1336, 1}, + {1336, 1}, + {1336, 1}, + {1336, 1}, + {1336, 2}, + {1331, 0}, + {1331, 2}, + {1331, 2}, + {964, 0}, + {964, 1}, + {964, 1}, + {1344, 0}, + {1344, 1}, + {1344, 1}, + {1344, 1}, + {1121, 0}, + {1121, 1}, + {864, 0}, + {864, 2}, + {1165, 2}, + {1081, 3}, + {980, 1}, + {980, 3}, + {1253, 1}, + {1253, 1}, + {1253, 3}, + {1253, 1}, + {1253, 2}, + {1253, 3}, + {1253, 1}, + {1282, 0}, + {1282, 1}, + {1282, 1}, + {1282, 1}, + {1282, 1}, + {1282, 1}, + {851, 0}, + {851, 1}, + {851, 1}, + {1180, 0}, + {1180, 1}, + {994, 0}, + {994, 2}, + {1386, 0}, + {1386, 3}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {1170, 1}, + {945, 1}, + {945, 1}, + {945, 1}, + {945, 1}, + {945, 1}, + {945, 1}, + {945, 1}, + {945, 1}, + {945, 1}, + {945, 1}, + {945, 1}, + {945, 1}, + {945, 1}, + {945, 1}, + {945, 1}, + {945, 1}, + {847, 1}, + {847, 1}, + {847, 1}, + {847, 1}, + {847, 1}, + {847, 1}, + {847, 1}, + {847, 1}, + {847, 1}, + {1343, 1}, + {1343, 3}, + {928, 2}, + {1025, 1}, + {1025, 1}, + {993, 1}, + {993, 1}, + {1178, 1}, + {1178, 3}, + {1354, 0}, + {1354, 3}, + {865, 1}, + {865, 4}, + {865, 4}, + {865, 4}, + {865, 3}, + {865, 4}, + {865, 3}, + {865, 3}, + {865, 3}, + {865, 3}, + {865, 3}, + {865, 3}, + {865, 3}, + {865, 3}, + {865, 1}, + {865, 3}, + {865, 3}, + {865, 3}, + {865, 3}, + {865, 3}, + {865, 3}, + {865, 3}, + {865, 3}, + {865, 3}, + {865, 3}, + {865, 3}, + {865, 3}, + {865, 3}, + {865, 2}, + {865, 2}, + {865, 3}, + {865, 3}, + {865, 5}, + {865, 3}, + {865, 7}, + {865, 3}, + {865, 3}, + {858, 0}, + {858, 1}, + {1172, 1}, + {1172, 1}, + {1044, 0}, + {1044, 1}, + {944, 1}, + {944, 2}, + {944, 3}, + {1302, 0}, + {1302, 1}, + {1186, 3}, + {861, 3}, + {861, 3}, + {861, 3}, + {861, 3}, + {861, 3}, + {861, 3}, + {861, 3}, + {861, 3}, + {861, 3}, + {861, 3}, + {861, 3}, + {861, 3}, + {861, 3}, + {861, 3}, + {861, 3}, + {1364, 1}, + {1364, 1}, + {1364, 1}, + {1290, 3}, + {1290, 2}, + {1290, 3}, + {1290, 3}, + {1290, 2}, + {1270, 1}, + {1270, 1}, + {1270, 1}, + {1270, 1}, + {1270, 1}, + {1270, 1}, + {1270, 1}, + {1270, 1}, + {1270, 1}, + {1270, 1}, + {1270, 1}, + {1219, 1}, + {1219, 1}, + {1122, 0}, + {1122, 1}, + {1122, 1}, + {1251, 1}, + {1251, 1}, + {1251, 1}, + {1252, 1}, + {1252, 1}, + {1252, 1}, + {1252, 2}, + {1217, 1}, + {1349, 3}, + {1349, 2}, + {1349, 3}, + {1349, 2}, + {1349, 3}, + {1349, 3}, + {1349, 2}, + {1349, 2}, + {1349, 1}, + {1349, 2}, + {1349, 5}, + {1349, 5}, + {1349, 1}, + {1349, 3}, + {1349, 2}, + {926, 1}, + {926, 1}, + {1288, 1}, + {1288, 2}, + {1288, 2}, + {1191, 2}, + {1191, 2}, + {1191, 1}, + {1191, 1}, + {1291, 2}, + {1291, 2}, + {1291, 1}, + {1291, 2}, + {1291, 2}, + {1291, 3}, + {1291, 3}, + {1291, 2}, + {1389, 1}, + {1389, 1}, + {1218, 1}, + {1218, 2}, + {1218, 1}, + {1218, 1}, + {1218, 2}, + {1361, 1}, + {1361, 2}, + {1361, 1}, + {1361, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {1236, 1}, + {1236, 2}, + {1236, 2}, + {1236, 2}, + {1236, 3}, + {786, 3}, + {812, 0}, + {812, 1}, + {898, 1}, + {898, 1}, + {898, 1}, + {899, 0}, + {899, 2}, + {929, 0}, + {929, 1}, + {929, 1}, + {934, 5}, + {1294, 0}, + {1294, 1}, + {821, 0}, + {821, 2}, + {821, 3}, + {1295, 0}, {1295, 2}, - {967, 2}, - {967, 2}, - {967, 2}, - {967, 2}, - {967, 2}, - {1010, 0}, - {1010, 2}, - {1010, 2}, - {1111, 0}, - {1111, 1}, - {1110, 1}, - {1110, 2}, - {959, 2}, - {959, 2}, - {959, 1}, - {959, 4}, - {959, 2}, - {959, 2}, - {958, 3}, + {798, 2}, + {798, 1}, + {798, 2}, + {1120, 0}, + {1120, 2}, + {1347, 1}, + {1347, 3}, + {995, 1}, + {995, 1}, + {995, 1}, + {1184, 1}, + {1184, 3}, + {760, 1}, + {760, 1}, + {1348, 1}, + {1348, 1}, + {1348, 1}, + {797, 1}, + {797, 2}, + {788, 10}, + {788, 8}, + {1190, 2}, + {814, 2}, + {815, 0}, + {815, 1}, + {1394, 0}, + {1394, 1}, + {1045, 9}, + {1041, 4}, + {1016, 9}, + {1016, 9}, + {1009, 3}, + {1269, 2}, + {1269, 6}, + {915, 2}, + {947, 1}, + {947, 3}, + {1034, 0}, + {1034, 2}, + {1230, 1}, + {1230, 2}, + {1033, 2}, + {1033, 2}, + {1033, 2}, + {1033, 2}, + {986, 0}, + {986, 1}, + {985, 2}, + {985, 2}, + {985, 2}, + {985, 2}, + {1320, 1}, + {1320, 3}, + {1320, 2}, + {987, 2}, + {987, 2}, + {987, 2}, + {987, 2}, + {987, 2}, + {1031, 0}, + {1031, 2}, + {1031, 2}, + {1147, 0}, + {1147, 3}, + {1134, 0}, + {1134, 1}, + {1133, 1}, + {1133, 2}, + {979, 2}, + {979, 2}, + {979, 3}, + {979, 3}, + {979, 4}, + {979, 5}, + {979, 2}, + {979, 5}, + {979, 3}, + {979, 3}, + {979, 2}, + {979, 2}, + {979, 2}, + {1212, 0}, + {1212, 3}, + {1212, 3}, + {1212, 5}, + {1212, 5}, + {1212, 4}, + {1213, 1}, + {1088, 1}, + {1088, 1}, + {1155, 1}, + {1321, 1}, + {1321, 3}, + {869, 1}, + {869, 1}, + {869, 1}, + {869, 1}, + {869, 1}, + {869, 1}, + {869, 1}, + {869, 1}, + {1035, 7}, + {1035, 9}, + {1052, 5}, + {1052, 7}, + {1052, 7}, + {1158, 5}, + {1158, 7}, + {1158, 7}, + {1086, 9}, + {1084, 7}, + {1085, 4}, {1197, 0}, - {1186, 0}, - {1186, 3}, - {1186, 3}, - {1186, 5}, - {1186, 5}, - {1186, 4}, - {1187, 1}, - {1065, 1}, - {1065, 1}, - {1130, 1}, - {1296, 1}, - {1296, 3}, - {851, 1}, - {851, 1}, - {851, 1}, - {851, 1}, - {851, 1}, - {851, 1}, - {851, 1}, - {851, 1}, - {1014, 7}, - {1030, 5}, - {1030, 7}, - {1133, 5}, - {1133, 7}, - {1063, 9}, - {1061, 7}, - {1062, 4}, - {1172, 0}, - {1172, 3}, - {1172, 3}, - {1172, 3}, - {1172, 3}, - {1172, 3}, - {941, 1}, - {941, 2}, - {969, 1}, - {969, 1}, - {969, 1}, - {969, 3}, - {969, 3}, - {1129, 1}, - {1129, 3}, + {1197, 3}, + {1197, 3}, + {1197, 3}, + {1197, 3}, + {1197, 3}, {962, 1}, - {962, 4}, - {963, 1}, - {963, 2}, - {963, 1}, - {963, 1}, - {963, 2}, - {963, 2}, - {963, 1}, - {963, 1}, - {963, 1}, - {963, 1}, - {963, 1}, - {963, 1}, - {963, 1}, - {963, 1}, - {963, 1}, - {963, 2}, - {963, 1}, - {963, 2}, - {963, 1}, - {963, 2}, - {963, 2}, - {963, 1}, - {963, 1}, - {963, 1}, - {963, 1}, - {963, 3}, - {963, 2}, - {963, 2}, - {963, 2}, - {963, 2}, - {963, 2}, - {963, 2}, - {963, 2}, - {963, 1}, - {963, 1}, - {1091, 0}, - {1091, 1}, - {1091, 1}, - {1091, 1}, - {1115, 1}, - {1115, 3}, - {1115, 3}, - {1115, 3}, - {1115, 1}, - {1128, 7}, - {1127, 4}, - {863, 15}, - {1237, 0}, - {1237, 3}, - {1196, 0}, - {1196, 3}, - {1083, 0}, - {1083, 1}, - {1053, 0}, - {1053, 2}, - {839, 1}, - {839, 1}, - {1222, 2}, - {1222, 1}, - {1052, 3}, - {1052, 4}, - {1052, 3}, - {1052, 3}, - {857, 1}, + {962, 2}, + {989, 1}, + {989, 1}, + {989, 1}, + {989, 3}, + {989, 3}, + {1154, 1}, + {1154, 3}, + {982, 1}, + {982, 4}, + {983, 1}, + {983, 2}, + {983, 1}, + {983, 1}, + {983, 2}, + {983, 2}, + {983, 1}, + {983, 1}, + {983, 1}, + {983, 1}, + {983, 1}, + {983, 1}, + {983, 1}, + {983, 1}, + {983, 1}, + {983, 2}, + {983, 1}, + {983, 2}, + {983, 1}, + {983, 2}, + {983, 2}, + {983, 1}, + {983, 1}, + {983, 1}, + {983, 1}, + {983, 3}, + {983, 2}, + {983, 2}, + {983, 2}, + {983, 2}, + {983, 2}, + {983, 2}, + {983, 2}, + {983, 1}, + {983, 1}, + {1114, 0}, + {1114, 1}, + {1114, 1}, + {1114, 1}, + {1138, 1}, + {1138, 3}, + {1138, 3}, + {1138, 3}, + {1138, 1}, + {1153, 7}, + {1152, 4}, + {881, 15}, + {1262, 0}, + {1262, 3}, + {1222, 0}, + {1222, 3}, + {1106, 0}, + {1106, 1}, + {1076, 0}, + {1076, 2}, {857, 1}, {857, 1}, - {949, 0}, - {949, 3}, - {1316, 0}, - {1316, 3}, - {1253, 0}, - {1253, 3}, - {1255, 0}, - {1255, 2}, - {1254, 3}, - {1254, 1}, - {1081, 3}, - {1163, 2}, - {1086, 3}, - {1157, 1}, - {1157, 1}, - {1154, 2}, - {1256, 1}, - {1256, 2}, - {1256, 1}, - {1256, 2}, - {1330, 1}, - {1330, 3}, - {1088, 6}, - {1304, 1}, - {1304, 1}, - {1304, 1}, - {1214, 0}, - {1214, 2}, - {1214, 3}, - {1275, 0}, - {1275, 2}, - {1077, 2}, - {1077, 3}, - {1077, 3}, - {1077, 2}, - {1076, 1}, - {1076, 2}, - {1082, 3}, - {1085, 3}, - {1162, 3}, - {1034, 5}, - {1018, 7}, - {991, 6}, - {1020, 6}, - {1207, 0}, - {1207, 1}, - {1301, 1}, - {1301, 2}, - {918, 3}, - {918, 3}, - {918, 3}, - {918, 3}, - {918, 3}, - {918, 1}, - {918, 2}, - {918, 3}, - {918, 1}, - {918, 2}, - {918, 3}, - {918, 1}, - {918, 2}, - {918, 1}, - {918, 1}, - {918, 2}, - {819, 1}, - {819, 2}, - {819, 2}, - {1036, 4}, - {993, 5}, - {1178, 1}, - {1178, 2}, - {992, 1}, - {992, 1}, - {992, 3}, - {992, 3}, - {1068, 8}, - {1261, 0}, - {1261, 2}, - {1260, 0}, - {1260, 3}, - {1288, 0}, - {1288, 2}, - {1287, 0}, - {1287, 2}, - {1044, 1}, - {981, 1}, - {981, 3}, - {917, 2}, - {1113, 5}, - {1113, 6}, - {1113, 9}, - {1113, 10}, - {1113, 5}, - {1113, 6}, - {1113, 4}, + {1247, 2}, + {1247, 1}, + {1075, 3}, + {1075, 4}, + {1075, 3}, + {1075, 3}, + {875, 1}, + {875, 1}, + {875, 1}, + {970, 0}, + {970, 3}, + {1341, 0}, + {1341, 3}, + {1278, 0}, + {1278, 3}, + {1280, 0}, + {1280, 2}, + {1279, 3}, + {1279, 1}, + {1104, 3}, + {1188, 2}, + {1109, 3}, + {1182, 1}, + {1182, 1}, + {1179, 2}, + {1281, 1}, + {1281, 2}, + {1281, 1}, + {1281, 2}, + {1355, 1}, + {1355, 3}, + {1111, 6}, + {1329, 1}, + {1329, 1}, + {1329, 1}, + {1329, 1}, + {1239, 0}, + {1239, 2}, + {1239, 3}, + {1300, 0}, + {1300, 2}, + {1100, 2}, + {1100, 3}, + {1100, 3}, + {1100, 2}, + {1099, 1}, + {1099, 2}, + {1105, 3}, + {1108, 3}, + {1187, 3}, + {1056, 5}, + {1040, 6}, + {1012, 6}, + {1057, 5}, + {1039, 7}, + {1011, 6}, + {1042, 6}, + {1232, 0}, + {1232, 1}, + {1326, 1}, + {1326, 2}, + {938, 3}, + {938, 3}, + {938, 3}, + {938, 3}, + {938, 3}, + {938, 1}, + {938, 2}, + {938, 3}, + {938, 1}, + {938, 2}, + {938, 3}, + {938, 1}, + {938, 2}, + {938, 1}, + {938, 1}, + {938, 2}, + {838, 1}, + {838, 2}, + {838, 2}, + {1059, 4}, + {1014, 5}, + {1203, 1}, + {1203, 2}, + {1013, 1}, + {1013, 1}, + {1013, 3}, + {1013, 3}, + {1091, 8}, + {1286, 0}, + {1286, 2}, + {1285, 0}, + {1285, 3}, + {1313, 0}, + {1313, 2}, + {1312, 0}, + {1312, 2}, + {1067, 1}, + {1001, 1}, + {1001, 3}, + {937, 2}, + {1136, 5}, + {1136, 6}, + {1136, 9}, + {1136, 10}, + {1136, 5}, + {1136, 6}, + {1136, 4}, + {1136, 5}, + {1136, 6}, } yyXErrors = map[yyXError]string{} - yyParseTab = [4368][]uint16{ + yyParseTab = [4477][]uint16{ // 0 - {2062, 2062, 2564, 51: 2588, 72: 2711, 74: 2567, 83: 2599, 150: 2569, 157: 2597, 2582, 161: 2566, 175: 2593, 212: 2618, 217: 2724, 220: 2562, 228: 2617, 2584, 2720, 2568, 246: 2596, 251: 2572, 256: 2594, 258: 2563, 261: 2600, 279: 2586, 283: 2585, 290: 2598, 293: 2587, 305: 2577, 476: 2608, 2607, 498: 2606, 500: 2719, 507: 2592, 509: 2616, 528: 2714, 532: 2580, 570: 2591, 572: 2605, 649: 2601, 652: 2723, 656: 2565, 2713, 668: 2560, 672: 2571, 677: 2570, 683: 2615, 690: 2561, 713: 2612, 743: 2573, 752: 2614, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 2576, 2691, 2690, 770: 2712, 2574, 777: 2670, 2702, 780: 2683, 783: 2575, 788: 2634, 804: 2583, 810: 2622, 814: 2717, 849: 2628, 2629, 854: 2632, 858: 2715, 863: 2673, 865: 2685, 867: 2680, 2689, 2692, 2589, 936: 2641, 940: 2578, 978: 2718, 985: 2620, 987: 2621, 2624, 2625, 991: 2627, 993: 2626, 995: 2623, 997: 2630, 2631, 1000: 2590, 2669, 1003: 2637, 1014: 2645, 2638, 2639, 2640, 2646, 2644, 2647, 2648, 1023: 2643, 2642, 1026: 2633, 2595, 2579, 2649, 2661, 2650, 2651, 2652, 2654, 2658, 2655, 2659, 2660, 2653, 2657, 2656, 1043: 2619, 1047: 2635, 1049: 2636, 2581, 1054: 2665, 2663, 1057: 2664, 2662, 1061: 2667, 2668, 2666, 1067: 2708, 2671, 1075: 2722, 2721, 2672, 1082: 2674, 1085: 2675, 2705, 1088: 2709, 1113: 2677, 2678, 1116: 2679, 1118: 2684, 1121: 2681, 2682, 1124: 2707, 2686, 2716, 2688, 2687, 1133: 2693, 1135: 2695, 2694, 2698, 1139: 2699, 1141: 2706, 1144: 2696, 2710, 1149: 2697, 1160: 2700, 2701, 2676, 2704, 1165: 2703, 1315: 2558, 1318: 2559}, - {2557}, - {2556, 6923}, - {18: 6874, 140: 6871, 172: 6872, 198: 6875, 265: 6873, 492: 4217, 572: 1873, 585: 6201, 838: 6870, 859: 4216}, - {172: 6855, 572: 6854}, + {2105, 2105, 2619, 56: 2643, 78: 2769, 80: 2622, 89: 2654, 159: 2624, 166: 2652, 2637, 171: 2621, 184: 2648, 201: 2782, 223: 2673, 230: 2617, 238: 2672, 2639, 2778, 2623, 257: 2651, 262: 2627, 267: 2649, 269: 2618, 272: 2655, 290: 2641, 294: 2640, 301: 2653, 304: 2642, 317: 2632, 492: 2663, 2662, 515: 2661, 517: 2777, 522: 2647, 526: 2671, 544: 2772, 548: 2635, 587: 2646, 2660, 665: 2656, 668: 2781, 673: 2620, 2771, 682: 2615, 690: 2626, 695: 2625, 701: 2670, 708: 2616, 731: 2667, 761: 2628, 770: 2669, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 2631, 2749, 2748, 788: 2770, 2629, 795: 2728, 2741, 2760, 802: 2630, 807: 2690, 822: 2638, 829: 2677, 833: 2775, 867: 2684, 2685, 872: 2688, 876: 2773, 881: 2731, 883: 2743, 885: 2738, 2747, 2750, 2644, 956: 2697, 961: 2633, 998: 2776, 1005: 2675, 1007: 2676, 2679, 2680, 1011: 2682, 2683, 1014: 2681, 1016: 2678, 1018: 2686, 2687, 1021: 2645, 2727, 1024: 2693, 1035: 2701, 2694, 2695, 2696, 2702, 2703, 2700, 2704, 2705, 1045: 2699, 2698, 1048: 2689, 2650, 2634, 2706, 2719, 2707, 2708, 2709, 2711, 2715, 2716, 2712, 2717, 2718, 2710, 2714, 2713, 1066: 2674, 1070: 2691, 1072: 2692, 2636, 1077: 2723, 2721, 1080: 2722, 2720, 1084: 2725, 2726, 2724, 1090: 2766, 2729, 1098: 2780, 2779, 2730, 1105: 2732, 1108: 2733, 2763, 1111: 2767, 1136: 2735, 2736, 1139: 2737, 1141: 2742, 1144: 2739, 2740, 1149: 2765, 2744, 2774, 2746, 2745, 1158: 2751, 1160: 2753, 2752, 2756, 1164: 2757, 1166: 2764, 1169: 2754, 2768, 1174: 2755, 1185: 2758, 2759, 2734, 2762, 1190: 2761, 1340: 2613, 1343: 2614}, + {2612}, + {2611, 7087}, + {18: 7033, 51: 7032, 149: 7029, 181: 7030, 208: 7034, 276: 7031, 508: 4303, 588: 1914, 602: 6310, 856: 7028, 877: 4302}, + {181: 7013, 588: 7012}, // 5 - {572: 6848}, - {327: 6832, 572: 6833, 585: 6201, 838: 6834}, - {381: 6813, 491: 6814, 572: 2400, 1313: 6812}, - {352: 6768, 572: 6767}, - {2368, 2368, 368: 6766, 375: 6765}, + {588: 7006}, + {338: 6990, 588: 6991, 602: 6310, 856: 6992}, + {392: 6971, 507: 6972, 588: 2448, 1338: 6970}, + {362: 6926, 588: 6925}, + {2416, 2416, 379: 6924, 386: 6923}, // 10 - {405: 6754}, - {478: 6753}, - {2335, 2335, 73: 6030, 510: 6028, 804: 6029, 1011: 6752}, - {18: 2112, 84: 2112, 104: 2112, 140: 6524, 145: 2112, 162: 610, 164: 6460, 169: 5629, 172: 6525, 176: 6526, 198: 6528, 6164, 223: 6516, 512: 6523, 572: 2081, 585: 6201, 645: 6518, 652: 2217, 671: 2112, 679: 6520, 838: 6521, 943: 6527, 955: 5628, 1240: 6517, 1281: 6522, 1312: 6519}, - {18: 6467, 104: 6461, 126: 2081, 140: 6465, 162: 610, 164: 6460, 169: 5629, 172: 6462, 175: 1048, 6463, 198: 6468, 6164, 201: 6464, 223: 6456, 572: 2081, 585: 6201, 652: 6458, 838: 6457, 943: 6466, 955: 6459}, + {417: 6912}, + {494: 6911}, + {2383, 2383, 79: 6139, 527: 6137, 822: 6138, 1032: 6910}, + {18: 2155, 51: 6649, 90: 2155, 111: 2155, 149: 6645, 154: 2155, 172: 632, 174: 6574, 179: 5735, 181: 6646, 185: 6647, 208: 6650, 6273, 233: 6637, 528: 6644, 588: 2124, 602: 6310, 662: 6639, 668: 2261, 687: 2155, 697: 6641, 856: 6642, 964: 6648, 976: 5734, 1265: 6638, 1306: 6643, 1337: 6640}, + {18: 6581, 51: 6582, 111: 6575, 133: 2124, 149: 6579, 172: 632, 174: 6574, 179: 5735, 181: 6576, 184: 1071, 6577, 208: 6583, 6273, 211: 6578, 233: 6570, 588: 2124, 602: 6310, 668: 6572, 856: 6571, 964: 6580, 976: 6573}, // 15 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3614, 782: 6455}, - {2: 867, 867, 867, 867, 867, 867, 867, 10: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 51: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 492: 867, 503: 867, 757: 867, 867, 867, 766: 5436, 871: 5437, 923: 6443}, - {2089, 2089}, - {2088, 2088}, - {476: 2608, 498: 2606, 572: 2605, 649: 2601, 657: 2713, 713: 3914, 743: 2573, 752: 3913, 2602, 2603, 2604, 2613, 760: 2611, 3915, 3916, 770: 5217, 5215, 783: 5216}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3694, 801: 6569}, + {2: 890, 890, 890, 890, 890, 890, 890, 10: 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 59: 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 508: 890, 520: 890, 775: 890, 890, 890, 785: 5542, 889: 5543, 943: 6557}, + {2132, 2132}, + {2131, 2131}, + {492: 2663, 515: 2661, 588: 2660, 665: 2656, 674: 2771, 731: 3996, 761: 2628, 770: 3995, 2657, 2658, 2659, 2668, 778: 2666, 3997, 3998, 788: 5323, 5321, 802: 5322}, // 20 - {74: 2567, 150: 2569, 157: 2597, 2582, 161: 2566, 217: 6416, 259: 6415, 476: 2608, 2607, 498: 2606, 507: 2592, 509: 6419, 570: 2591, 572: 2605, 649: 2601, 656: 2565, 2713, 713: 6417, 743: 2573, 752: 6418, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 2576, 6425, 6424, 770: 2712, 2574, 777: 6422, 6421, 780: 6423, 783: 2575, 788: 6420, 804: 2583, 814: 6434, 849: 6433, 6427, 854: 6428, 863: 6426, 865: 6430, 867: 6431, 6429, 6432, 925: 6414}, - {2: 2057, 2057, 2057, 2057, 2057, 2057, 2057, 10: 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 51: 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 476: 2057, 2057, 497: 2057, 2057, 507: 2057, 570: 2057, 572: 2057, 649: 2057, 656: 2057, 2057, 668: 2057, 743: 2057}, - {2: 2056, 2056, 2056, 2056, 2056, 2056, 2056, 10: 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 51: 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 476: 2056, 2056, 497: 2056, 2056, 507: 2056, 570: 2056, 572: 2056, 649: 2056, 656: 2056, 2056, 668: 2056, 743: 2056}, - {2: 2055, 2055, 2055, 2055, 2055, 2055, 2055, 10: 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 51: 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 476: 2055, 2055, 497: 2055, 2055, 507: 2055, 570: 2055, 572: 2055, 649: 2055, 656: 2055, 2055, 668: 2055, 743: 2055}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 6384, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 2608, 2607, 497: 6383, 2606, 507: 2592, 570: 2591, 572: 2605, 649: 2601, 656: 6385, 2713, 664: 3947, 2785, 2786, 2784, 2730, 713: 2731, 740: 6381, 743: 2573, 752: 2732, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 2576, 2738, 2737, 770: 2712, 2574, 777: 2735, 2734, 780: 2736, 783: 2575, 788: 2733, 810: 2739, 829: 6382}, + {80: 2622, 159: 2624, 166: 2652, 2637, 171: 2621, 201: 6530, 270: 6529, 492: 2663, 2662, 515: 2661, 522: 2647, 526: 6533, 587: 2646, 2660, 665: 2656, 673: 2620, 2771, 731: 6531, 761: 2628, 770: 6532, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 2631, 6539, 6538, 788: 2770, 2629, 795: 6536, 6537, 6535, 802: 2630, 807: 6534, 822: 2638, 833: 6548, 867: 6547, 6541, 872: 6542, 881: 6540, 883: 6544, 885: 6545, 6543, 6546, 945: 6528}, + {2: 2100, 2100, 2100, 2100, 2100, 2100, 2100, 10: 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 59: 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 492: 2100, 2100, 513: 2100, 515: 2100, 522: 2100, 587: 2100, 2100, 665: 2100, 673: 2100, 2100, 682: 2100, 761: 2100}, + {2: 2099, 2099, 2099, 2099, 2099, 2099, 2099, 10: 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 59: 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 492: 2099, 2099, 513: 2099, 515: 2099, 522: 2099, 587: 2099, 2099, 665: 2099, 673: 2099, 2099, 682: 2099, 761: 2099}, + {2: 2098, 2098, 2098, 2098, 2098, 2098, 2098, 10: 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 59: 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 492: 2098, 2098, 513: 2098, 515: 2098, 522: 2098, 587: 2098, 2098, 665: 2098, 673: 2098, 2098, 682: 2098, 761: 2098}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 6497, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 2663, 2662, 513: 6496, 515: 2661, 522: 2647, 587: 2646, 2660, 665: 2656, 673: 6498, 2771, 682: 2794, 685: 4029, 2849, 688: 2850, 2848, 731: 2795, 759: 6494, 761: 2628, 770: 2796, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 2631, 2802, 2801, 788: 2770, 2629, 795: 2799, 2800, 2798, 802: 2630, 807: 2797, 829: 2803, 847: 6495}, // 25 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6380, 2785, 2786, 2784}, - {158: 6378}, - {572: 6296, 585: 6201, 838: 6295, 999: 6374}, - {572: 6296, 585: 6201, 838: 6295, 999: 6294}, - {140: 6292}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6493, 2849, 688: 2850, 2848}, + {167: 6491}, + {588: 6409, 602: 6310, 856: 6408, 1020: 6487}, + {588: 6409, 602: 6310, 856: 6408, 1020: 6407}, + {149: 6405}, // 30 - {140: 6287}, - {140: 6281}, - {16: 3862, 18: 6125, 30: 6154, 6153, 103: 603, 112: 603, 126: 603, 610, 140: 6114, 144: 610, 164: 6163, 183: 6138, 192: 6123, 199: 6164, 204: 610, 213: 6165, 218: 6148, 603, 253: 6145, 278: 6144, 309: 6137, 315: 6160, 317: 6142, 320: 6124, 328: 6140, 6158, 331: 6131, 339: 6129, 341: 6147, 345: 6135, 347: 6146, 6118, 6157, 351: 6162, 353: 6127, 360: 6119, 367: 6133, 377: 6122, 6121, 384: 6161, 388: 6149, 391: 6155, 6152, 6156, 6151, 406: 6141, 508: 3863, 572: 6117, 596: 6136, 650: 3861, 652: 6126, 656: 6159, 677: 6116, 779: 6132, 919: 6150, 943: 6139, 948: 6128, 964: 6143, 1025: 6130, 1098: 6120, 1305: 6134, 1311: 6115}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 6103, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6105, 2785, 2786, 2784, 1291: 6104}, - {2: 867, 867, 867, 867, 867, 867, 867, 10: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 51: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 492: 867, 499: 867, 757: 867, 867, 867, 766: 5436, 871: 5437, 923: 6090}, + {149: 6400}, + {149: 6394}, + {16: 3942, 18: 6234, 30: 6263, 6262, 110: 625, 132: 625, 625, 136: 632, 149: 6223, 153: 632, 174: 6272, 192: 6247, 202: 6232, 209: 6273, 214: 632, 224: 6274, 228: 6257, 625, 264: 6254, 289: 6253, 321: 6246, 327: 6269, 329: 6251, 332: 6233, 339: 6249, 6267, 342: 6240, 350: 6238, 352: 6256, 356: 6244, 358: 6255, 6227, 6266, 6271, 363: 6236, 370: 6228, 378: 6242, 388: 6231, 6230, 395: 6270, 400: 6258, 403: 6264, 6261, 6265, 6260, 418: 6250, 514: 3943, 588: 6226, 615: 6245, 667: 3941, 6235, 673: 6268, 695: 6225, 798: 6241, 939: 6259, 964: 6248, 969: 6237, 984: 6252, 1047: 6239, 1121: 6229, 1330: 6243, 1336: 6224}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 6212, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6214, 2849, 688: 2850, 2848, 1316: 6213}, + {2: 890, 890, 890, 890, 890, 890, 890, 10: 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 59: 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 508: 890, 516: 890, 775: 890, 890, 890, 785: 5542, 889: 5543, 943: 6199}, // 35 - {2: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 10: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 51: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 499: 1071, 757: 5441, 5440, 5439, 842: 5442, 891: 6056}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6051, 2785, 2786, 2784}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6045, 2785, 2786, 2784}, - {175: 6043}, - {175: 1049}, + {2: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 10: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 59: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 516: 1094, 775: 5547, 5546, 5545, 860: 5548, 910: 6165}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6160, 2849, 688: 2850, 2848}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6154, 2849, 688: 2850, 2848}, + {184: 6152}, + {184: 1072}, // 40 - {1047, 1047, 73: 6030, 510: 6028, 653: 6027, 804: 6029, 1011: 6026}, - {1036, 1036}, - {1035, 1035}, - {478: 6025}, - {2: 872, 872, 872, 872, 872, 872, 872, 10: 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 51: 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 5995, 6001, 6002, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 476: 872, 478: 872, 872, 872, 482: 872, 485: 872, 872, 488: 872, 872, 872, 495: 872, 498: 872, 507: 872, 872, 511: 872, 518: 5998, 523: 872, 533: 872, 567: 872, 570: 872, 872, 573: 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 585: 872, 872, 872, 872, 872, 872, 872, 872, 595: 872, 872, 598: 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 651: 872, 654: 3572, 749: 3570, 3571, 757: 5441, 5440, 5439, 766: 5436, 774: 5994, 5997, 5993, 789: 5916, 792: 5991, 842: 5992, 871: 5990, 1131: 6000, 5996, 1299: 5989, 5999}, + {1070, 1070, 79: 6139, 527: 6137, 670: 6136, 822: 6138, 1032: 6135}, + {1059, 1059}, + {1058, 1058}, + {494: 6134}, + {2: 895, 895, 895, 895, 895, 895, 895, 10: 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 59: 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 6104, 6110, 6111, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 492: 895, 494: 895, 895, 895, 895, 502: 895, 895, 895, 895, 895, 510: 895, 514: 895, 895, 522: 895, 525: 895, 534: 6107, 541: 895, 549: 895, 583: 895, 587: 895, 589: 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 601: 895, 895, 895, 895, 895, 895, 608: 895, 895, 895, 895, 895, 614: 895, 895, 617: 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 669: 895, 671: 3652, 767: 3650, 3651, 775: 5547, 5546, 5545, 785: 5542, 792: 6103, 6106, 6102, 808: 6025, 810: 6100, 860: 6101, 889: 6099, 1156: 6109, 6105, 1324: 6098, 6108}, // 45 - {257, 257, 50: 257, 475: 257, 477: 257, 483: 257, 257, 493: 257, 257, 496: 257, 257, 499: 257, 257, 2745, 503: 5964, 257, 257, 516: 257, 795: 2746, 5965, 1229: 5963}, - {862, 862, 50: 862, 475: 862, 477: 862, 483: 862, 862, 493: 862, 862, 496: 862, 862, 499: 862, 862, 504: 862, 862, 516: 5954, 944: 5956, 970: 5955}, - {1311, 1311, 50: 1311, 475: 1311, 477: 1311, 483: 1311, 1311, 493: 1311, 1311, 496: 1311, 1311, 499: 1311, 1311, 504: 1311, 2748, 772: 2749, 817: 5950}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 5945}, - {578: 3922, 917: 3921, 981: 3920}, + {273, 273, 58: 273, 491: 273, 493: 273, 500: 273, 273, 509: 273, 511: 273, 273, 273, 516: 273, 273, 519: 2809, 6073, 273, 523: 273, 532: 273, 814: 2810, 6074, 1254: 6072}, + {885, 885, 58: 885, 491: 885, 493: 885, 500: 885, 885, 509: 885, 511: 885, 885, 885, 516: 885, 885, 521: 885, 523: 885, 532: 6063, 965: 6065, 990: 6064}, + {1336, 1336, 58: 1336, 491: 1336, 493: 1336, 500: 1336, 1336, 509: 1336, 511: 1336, 1336, 1336, 516: 1336, 1336, 521: 1336, 523: 2812, 790: 2813, 836: 6059}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 6054}, + {595: 4004, 937: 4003, 1001: 4002}, // 50 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5932, 2785, 2786, 2784, 935: 5931, 1173: 5929, 1292: 5930}, - {476: 2608, 2607, 498: 2606, 572: 2605, 649: 2601, 713: 5928, 752: 3907, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 3906, 3909, 3908}, - {843, 843, 50: 843, 475: 843, 477: 843, 484: 843}, - {842, 842, 50: 842, 475: 842, 477: 842, 484: 842}, - {483: 5913, 493: 5914, 5915, 1302: 5912}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6041, 2849, 688: 2850, 2848, 955: 6040, 1198: 6038, 1317: 6039}, + {492: 2663, 2662, 515: 2661, 588: 2660, 665: 2656, 731: 6037, 770: 3989, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 3988, 3991, 3990}, + {866, 866, 58: 866, 491: 866, 493: 866, 501: 866}, + {865, 865, 58: 865, 491: 865, 493: 865, 501: 865}, + {500: 6022, 509: 6023, 511: 6024, 1327: 6021}, // 55 - {499, 499, 483: 828, 493: 828, 828, 496: 2751, 504: 2752, 2748, 772: 3917, 3918}, - {483: 831, 493: 831, 831}, - {501, 501, 483: 829, 493: 829, 829}, - {253: 5897, 278: 5896}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 5738, 5733, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 5736, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 5742, 2831, 5735, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 5739, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 5740, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 5734, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 5743, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 5741, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 5737, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 482: 5745, 508: 3863, 571: 5749, 590: 5748, 650: 3861, 664: 5746, 2785, 2786, 2784, 779: 5750, 835: 5747, 983: 5751, 1167: 5744}, + {518, 518, 500: 851, 509: 851, 511: 851, 2815, 521: 2816, 523: 2812, 790: 3999, 4000}, + {500: 854, 509: 854, 511: 854}, + {520, 520, 500: 852, 509: 852, 511: 852}, + {264: 6006, 289: 6005}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 5844, 5839, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 5842, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 5848, 2895, 5841, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 5845, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 5846, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 5840, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 5849, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 5847, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 5843, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 496: 5851, 514: 3943, 589: 5855, 610: 5854, 667: 3941, 685: 5852, 2849, 688: 2850, 2848, 798: 5856, 853: 5853, 1003: 5857, 1192: 5850}, // 60 - {17: 5606, 212: 5611, 218: 5609, 220: 5604, 5610, 282: 5608, 321: 5607, 5612, 325: 5605, 342: 5613, 383: 5614, 593: 5603, 870: 5602}, - {22: 582, 126: 582, 582, 141: 4776, 148: 582, 192: 582, 200: 582, 211: 582, 225: 582, 238: 582, 260: 582, 263: 582, 533: 582, 572: 582, 816: 4775, 833: 5575}, + {17: 5712, 223: 5717, 228: 5715, 230: 5710, 5716, 246: 5718, 293: 5714, 333: 5713, 336: 5711, 353: 5719, 394: 5720, 607: 5709, 888: 5708}, + {22: 604, 133: 604, 136: 604, 150: 4880, 157: 604, 202: 604, 210: 604, 222: 604, 235: 604, 249: 604, 271: 604, 274: 604, 549: 604, 588: 604, 835: 4879, 851: 5681}, + {595, 595}, + {594, 594}, + {593, 593}, + // 65 + {592, 592}, + {591, 591}, + {590, 590}, + {589, 589}, + {588, 588}, + // 70 + {587, 587}, + {586, 586}, + {585, 585}, + {584, 584}, + {583, 583}, + // 75 + {582, 582}, + {581, 581}, + {580, 580}, + {579, 579}, + {578, 578}, + // 80 + {577, 577}, + {576, 576}, + {575, 575}, + {574, 574}, {573, 573}, + // 85 {572, 572}, {571, 571}, - // 65 {570, 570}, {569, 569}, {568, 568}, + // 90 {567, 567}, {566, 566}, - // 70 {565, 565}, {564, 564}, {563, 563}, + // 95 {562, 562}, {561, 561}, - // 75 {560, 560}, {559, 559}, {558, 558}, + // 100 {557, 557}, {556, 556}, - // 80 {555, 555}, {554, 554}, {553, 553}, + // 105 {552, 552}, {551, 551}, - // 85 {550, 550}, {549, 549}, {548, 548}, + // 110 {547, 547}, {546, 546}, - // 90 {545, 545}, {544, 544}, {543, 543}, + // 115 {542, 542}, {541, 541}, - // 95 {540, 540}, {539, 539}, {538, 538}, + // 120 {537, 537}, {536, 536}, - // 100 {535, 535}, {534, 534}, {533, 533}, + // 125 {532, 532}, {531, 531}, - // 105 {530, 530}, {529, 529}, {528, 528}, + // 130 {527, 527}, {526, 526}, - // 110 {525, 525}, {524, 524}, {523, 523}, + // 135 {522, 522}, {521, 521}, - // 115 - {520, 520}, {519, 519}, - {518, 518}, {517, 517}, {516, 516}, - // 120 + // 140 {515, 515}, {514, 514}, {513, 513}, {512, 512}, {511, 511}, - // 125 + // 145 {510, 510}, {509, 509}, {508, 508}, {507, 507}, {506, 506}, - // 130 + // 150 {505, 505}, {504, 504}, {503, 503}, {502, 502}, - {500, 500}, - // 135 - {498, 498}, - {497, 497}, - {496, 496}, - {495, 495}, - {494, 494}, - // 140 - {493, 493}, - {492, 492}, - {491, 491}, - {490, 490}, - {489, 489}, - // 145 - {488, 488}, - {487, 487}, - {486, 486}, - {485, 485}, - {484, 484}, - // 150 - {483, 483}, - {482, 482}, - {481, 481}, - {455, 455}, - {2: 401, 401, 401, 401, 401, 401, 401, 10: 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 51: 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 572: 5572, 1277: 5573}, + {501, 501}, // 155 - {263, 263, 484: 263}, - {2: 867, 867, 867, 867, 867, 867, 867, 10: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 51: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 476: 867, 492: 867, 582: 867, 757: 867, 867, 867, 766: 5436, 871: 5437, 923: 5438}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5434, 2785, 2786, 2784, 813: 5435}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 5277, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 5279, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 5285, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 5281, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 5278, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 5286, 3232, 2956, 3184, 5280, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 5283, 5387, 2868, 3107, 5284, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 5282, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 5288, 500: 5311, 570: 5305, 647: 5309, 649: 5294, 652: 5304, 654: 5298, 657: 5307, 664: 3517, 2785, 2786, 2784, 5299, 672: 5303, 677: 5300, 742: 5287, 5302, 805: 5289, 814: 5293, 858: 5308, 870: 5306, 941: 5290, 962: 5291, 5297, 968: 5292, 5295, 977: 5301, 979: 5310, 1129: 5388}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 5277, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 5279, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 5285, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 5281, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 5278, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 5286, 3232, 2956, 3184, 5280, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 5283, 2867, 2868, 3107, 5284, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 5282, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 5288, 500: 5311, 570: 5305, 647: 5309, 649: 5294, 652: 5304, 654: 5298, 657: 5307, 664: 3517, 2785, 2786, 2784, 5299, 672: 5303, 677: 5300, 742: 5287, 5302, 805: 5289, 814: 5293, 858: 5308, 870: 5306, 941: 5290, 962: 5291, 5297, 968: 5292, 5295, 977: 5301, 979: 5310, 1129: 5296}, + {500, 500}, + {474, 474}, + {2: 417, 417, 417, 417, 417, 417, 417, 10: 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 59: 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 588: 5678, 1302: 5679}, + {279, 279, 501: 279}, + {2: 890, 890, 890, 890, 890, 890, 890, 10: 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 59: 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 492: 890, 508: 890, 601: 890, 775: 890, 890, 890, 785: 5542, 889: 5543, 943: 5544}, // 160 - {23: 5236, 201: 5237}, - {126: 5219, 201: 5234, 572: 5220, 1157: 5233}, - {126: 5219, 201: 5221, 572: 5220, 1157: 5218}, - {475: 5202, 496: 66, 1275: 5201}, - {28: 5196, 130: 4735, 142: 5197, 476: 5194, 511: 2759, 737: 5195, 904: 5198}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5540, 2849, 688: 2850, 2848, 832: 5541}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 5383, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 5385, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 5391, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 5387, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 5384, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 5392, 3306, 3021, 3258, 5386, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 5389, 5493, 2932, 3173, 5390, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 5388, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 5394, 517: 5417, 587: 5411, 664: 5415, 5400, 668: 5410, 671: 5404, 674: 5413, 682: 5405, 685: 3597, 2849, 688: 2850, 2848, 5409, 695: 5406, 760: 5393, 5408, 823: 5395, 833: 5399, 876: 5414, 888: 5412, 962: 5396, 982: 5397, 5403, 988: 5398, 5401, 997: 5407, 999: 5416, 1154: 5494}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 5383, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 5385, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 5391, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 5387, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 5384, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 5392, 3306, 3021, 3258, 5386, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 5389, 2931, 2932, 3173, 5390, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 5388, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 5394, 517: 5417, 587: 5411, 664: 5415, 5400, 668: 5410, 671: 5404, 674: 5413, 682: 5405, 685: 3597, 2849, 688: 2850, 2848, 5409, 695: 5406, 760: 5393, 5408, 823: 5395, 833: 5399, 876: 5414, 888: 5412, 962: 5396, 982: 5397, 5403, 988: 5398, 5401, 997: 5407, 999: 5416, 1154: 5402}, + {23: 5342, 211: 5343}, + {133: 5325, 211: 5340, 588: 5326, 1182: 5339}, // 165 - {28: 60, 130: 60, 142: 60, 225: 5193, 476: 60, 511: 60}, - {311: 5176}, - {382: 2725}, - {337: 2726, 814: 2727}, - {940: 2729}, + {133: 5325, 211: 5327, 588: 5326, 1182: 5324}, + {491: 5307, 512: 71, 1300: 5306}, + {28: 5301, 139: 4839, 151: 5302, 492: 5299, 525: 2823, 755: 5300, 924: 5303}, + {28: 65, 139: 65, 151: 65, 235: 5298, 492: 65, 525: 65}, + {323: 5281}, // 170 - {478: 2728}, - {1, 1}, - {200: 2742, 476: 2608, 2607, 2743, 498: 2606, 507: 2592, 570: 2591, 572: 2605, 649: 2601, 656: 2741, 2713, 668: 2730, 713: 2731, 743: 2573, 752: 2732, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 2576, 2738, 2737, 770: 2712, 2574, 777: 2735, 2734, 780: 2736, 783: 2575, 788: 2733, 810: 2739, 829: 2740}, - {492: 4217, 572: 1873, 859: 4216}, - {457, 457, 483: 828, 493: 828, 828, 496: 2751, 504: 2752, 2748, 772: 3917, 3918}, + {393: 2783}, + {246: 2786, 348: 2784, 833: 2785}, + {961: 2793}, + {494: 2792}, + {4: 2788, 494: 2787}, // 175 - {459, 459, 483: 829, 493: 829, 829}, - {464, 464}, - {463, 463}, - {462, 462}, - {461, 461}, + {494: 2791}, + {494: 2789}, + {494: 2790}, + {1, 1}, + {2, 2}, // 180 - {460, 460}, - {458, 458}, - {456, 456}, - {7, 7}, - {200: 4210, 476: 2608, 2607, 4211, 498: 2606, 507: 2592, 570: 2591, 572: 2605, 649: 2601, 657: 2713, 668: 2730, 713: 2731, 743: 2573, 752: 2732, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 2576, 2738, 2737, 770: 2712, 2574, 777: 2735, 2734, 780: 2736, 783: 2575, 788: 2733, 810: 2739, 829: 4209}, - // 185 - {142: 2744}, {3, 3}, - {257, 257, 496: 257, 501: 2745, 504: 257, 257, 795: 2746, 2747}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4208}, - {256, 256, 50: 256, 475: 256, 477: 256, 483: 256, 256, 493: 256, 256, 496: 256, 256, 499: 256, 256, 504: 256, 256, 516: 256, 256, 519: 256}, + {210: 2806, 492: 2663, 2662, 2807, 515: 2661, 522: 2647, 587: 2646, 2660, 665: 2656, 673: 2805, 2771, 682: 2794, 731: 2795, 761: 2628, 770: 2796, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 2631, 2802, 2801, 788: 2770, 2629, 795: 2799, 2800, 2798, 802: 2630, 807: 2797, 829: 2803, 847: 2804}, + {508: 4303, 588: 1914, 877: 4302}, + {476, 476, 500: 851, 509: 851, 511: 851, 2815, 521: 2816, 523: 2812, 790: 3999, 4000}, + {478, 478, 500: 852, 509: 852, 511: 852}, + // 185 + {483, 483}, + {482, 482}, + {481, 481}, + {480, 480}, + {479, 479}, // 190 - {1311, 1311, 496: 1311, 504: 1311, 2748, 772: 2749, 817: 2750}, - {663: 2773}, - {1310, 1310, 50: 1310, 128: 1310, 475: 1310, 477: 1310, 483: 1310, 1310, 493: 1310, 1310, 496: 1310, 1310, 499: 1310, 1310, 504: 1310}, - {883, 883, 496: 2751, 504: 2752, 773: 2753, 834: 2754}, - {511: 2759, 580: 2761, 737: 2758, 745: 2760, 886: 2768}, + {477, 477}, + {475, 475}, + {9, 9}, + {210: 4296, 492: 2663, 2662, 4297, 515: 2661, 522: 2647, 587: 2646, 2660, 665: 2656, 674: 2771, 682: 2794, 731: 2795, 761: 2628, 770: 2796, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 2631, 2802, 2801, 788: 2770, 2629, 795: 2799, 2800, 2798, 802: 2630, 807: 2797, 829: 2803, 847: 4295}, + {151: 2808}, // 195 - {10: 2755, 273: 2756, 1225: 2757}, - {882, 882, 50: 882, 475: 882, 477: 882, 483: 882, 882, 493: 882, 882, 497: 882, 499: 882, 882}, {5, 5}, - {511: 891, 527: 891, 578: 891, 580: 891}, - {511: 890, 527: 890, 578: 890, 580: 890}, + {273, 273, 512: 273, 519: 2809, 521: 273, 523: 273, 814: 2810, 2811}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4294}, + {272, 272, 58: 272, 491: 272, 493: 272, 500: 272, 272, 509: 272, 511: 272, 272, 272, 516: 272, 272, 521: 272, 523: 272, 532: 272, 272, 535: 272}, + {1336, 1336, 512: 1336, 521: 1336, 523: 2812, 790: 2813, 836: 2814}, // 200 - {511: 2759, 527: 889, 578: 889, 580: 2761, 737: 2758, 745: 2760, 886: 2762, 1219: 2763}, - {1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 15: 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 50: 1992, 1992, 53: 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 84: 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 105: 1992, 1992, 109: 1992, 1992, 113: 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 166: 1992, 186: 1992, 214: 1992, 475: 1992, 1992, 1992, 481: 1992, 1992, 1992, 1992, 487: 1992, 491: 1992, 1992, 1992, 1992, 497: 1992, 1992, 1992, 1992, 506: 1992, 1992, 1992, 1992, 527: 1992, 572: 1992, 578: 1992, 649: 1992, 1992, 652: 1992, 656: 1992}, - {1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 15: 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 53: 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 105: 1990, 1990, 109: 1990, 1990, 113: 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 132: 1990, 1990, 1990, 1990, 166: 1990, 186: 1990, 1990, 191: 1990, 214: 1990, 254: 1990, 475: 1990, 1990, 1990, 481: 1990, 1990, 1990, 1990, 487: 1990, 491: 1990, 1990, 1990, 1990, 496: 1990, 1990, 1990, 1990, 1990, 1990, 504: 1990, 506: 1990, 1990, 1990, 1990, 527: 1990, 570: 1990, 572: 1990, 578: 1990, 649: 1990, 1990, 652: 1990, 656: 1990, 1990, 1990, 661: 1990, 743: 1990}, - {895, 895, 9: 895, 50: 895, 166: 895, 475: 895, 477: 895, 483: 895, 895, 493: 895, 895, 497: 895, 499: 895, 895, 527: 895, 578: 895}, - {894, 894, 9: 894, 50: 894, 166: 894, 475: 894, 477: 894, 483: 894, 894, 493: 894, 894, 497: 894, 499: 894, 894, 527: 894, 578: 894}, + {681: 2837}, + {1335, 1335, 58: 1335, 137: 1335, 491: 1335, 493: 1335, 500: 1335, 1335, 509: 1335, 511: 1335, 1335, 1335, 516: 1335, 1335, 521: 1335}, + {906, 906, 512: 2815, 521: 2816, 791: 2817, 852: 2818}, + {525: 2823, 597: 2825, 755: 2822, 762: 2824, 905: 2832}, + {10: 2819, 284: 2820, 1250: 2821}, // 205 - {527: 888, 578: 888}, - {527: 2765, 578: 2764, 1297: 2766}, - {156: 893}, - {156: 892}, - {156: 2767}, + {905, 905, 58: 905, 491: 905, 493: 905, 500: 905, 905, 509: 905, 511: 905, 513: 905, 516: 905, 905}, + {7, 7}, + {525: 914, 543: 914, 595: 914, 597: 914}, + {525: 913, 543: 913, 595: 913, 597: 913}, + {525: 2823, 543: 912, 595: 912, 597: 2825, 755: 2822, 762: 2824, 905: 2826, 1244: 2827}, // 210 - {884, 884, 50: 884, 475: 884, 477: 884, 483: 884, 884, 493: 884, 884, 497: 884, 499: 884, 884}, - {887, 887, 9: 2769, 50: 887, 166: 2770, 475: 887, 477: 887, 483: 887, 887, 493: 887, 887, 497: 887, 499: 887, 887}, - {511: 2759, 580: 2761, 737: 2758, 745: 2760, 886: 2772}, - {511: 2759, 580: 2761, 737: 2758, 745: 2760, 886: 2771}, - {885, 885, 50: 885, 475: 885, 477: 885, 483: 885, 885, 493: 885, 885, 497: 885, 499: 885, 885}, + {2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 15: 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 56: 2034, 58: 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 90: 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 112: 2034, 2034, 2034, 2034, 118: 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 131: 2034, 134: 2034, 2034, 176: 2034, 195: 2034, 226: 2034, 491: 2034, 2034, 2034, 496: 2034, 498: 2034, 2034, 2034, 2034, 507: 2034, 2034, 2034, 511: 2034, 513: 2034, 2034, 2034, 2034, 2034, 522: 2034, 524: 2034, 526: 2034, 543: 2034, 588: 2034, 595: 2034, 665: 2034, 667: 2034, 2034, 673: 2034}, + {2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 15: 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 58: 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 112: 2032, 2032, 2032, 2032, 118: 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 131: 2032, 134: 2032, 2032, 141: 2032, 2032, 2032, 2032, 176: 2032, 195: 2032, 2032, 200: 2032, 226: 2032, 265: 2032, 491: 2032, 2032, 2032, 496: 2032, 498: 2032, 2032, 2032, 2032, 507: 2032, 2032, 2032, 511: 2032, 2032, 2032, 2032, 2032, 2032, 2032, 519: 2032, 521: 2032, 2032, 524: 2032, 526: 2032, 543: 2032, 587: 2032, 2032, 595: 2032, 665: 2032, 667: 2032, 2032, 673: 2032, 2032, 2032, 679: 2032, 761: 2032}, + {918, 918, 9: 918, 58: 918, 176: 918, 491: 918, 493: 918, 500: 918, 918, 509: 918, 511: 918, 513: 918, 516: 918, 918, 543: 918, 595: 918}, + {917, 917, 9: 917, 58: 917, 176: 917, 491: 917, 493: 917, 500: 917, 917, 509: 917, 511: 917, 513: 917, 516: 917, 917, 543: 917, 595: 917}, + {543: 911, 595: 911}, // 215 - {886, 886, 50: 886, 475: 886, 477: 886, 483: 886, 886, 493: 886, 886, 497: 886, 499: 886, 886}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 2777, 875: 3267, 905: 3266}, - {1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 4205, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 477: 1551, 1551, 1551, 1551, 1551, 483: 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 492: 1551, 1551, 1551, 496: 1551, 1551, 499: 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 509: 1551, 1551, 512: 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 534: 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 568: 1551, 1551, 597: 1551, 655: 1551, 659: 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, 4202, 1550, 1550, 1550, 1550, 1550, 483: 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 492: 1550, 1550, 1550, 496: 1550, 1550, 499: 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 509: 1550, 1550, 512: 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 534: 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 568: 1550, 1550, 597: 1550, 655: 1550, 659: 1550, 1550}, - {762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 477: 762, 762, 762, 762, 762, 483: 762, 762, 762, 762, 762, 762, 762, 762, 492: 762, 762, 762, 496: 762, 762, 499: 762, 762, 762, 762, 762, 762, 762, 762, 509: 762, 762, 512: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 534: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 568: 762, 762, 597: 762, 662: 4200}, + {543: 2829, 595: 2828, 1322: 2830}, + {165: 916}, + {165: 915}, + {165: 2831}, + {907, 907, 58: 907, 491: 907, 493: 907, 500: 907, 907, 509: 907, 511: 907, 513: 907, 516: 907, 907}, // 220 - {1318, 1318, 9: 1318, 50: 1318, 128: 1318, 475: 1318, 477: 1318, 483: 1318, 1318, 493: 1318, 1318, 496: 1318, 1318, 499: 1318, 1318, 504: 1318, 1318, 510: 3371, 512: 3369, 3370, 3368, 3366, 517: 1318, 519: 1318, 527: 1318, 530: 1318, 1318, 4199, 534: 4198, 738: 3367, 3365, 1280: 4197}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4196}, - {476: 4168}, - {1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 477: 1952, 1952, 481: 1952, 483: 1952, 1952, 1952, 1952, 492: 1952, 1952, 1952, 496: 1952, 1952, 499: 1952, 1952, 1952, 4151, 1952, 1952, 1952, 1952, 509: 1952, 1952, 512: 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 522: 1952, 524: 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 534: 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 548: 1952, 1952, 558: 4148, 4146, 4145, 4153, 4147, 4149, 4150, 4152, 1204: 4144, 1248: 4143}, - {1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 477: 1927, 1927, 481: 1927, 483: 1927, 1927, 1927, 1927, 492: 1927, 1927, 1927, 496: 1927, 1927, 499: 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 509: 1927, 1927, 512: 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 522: 1927, 524: 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 534: 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 548: 1927, 1927, 558: 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927}, + {910, 910, 9: 2833, 58: 910, 176: 2834, 491: 910, 493: 910, 500: 910, 910, 509: 910, 511: 910, 513: 910, 516: 910, 910}, + {525: 2823, 597: 2825, 755: 2822, 762: 2824, 905: 2836}, + {525: 2823, 597: 2825, 755: 2822, 762: 2824, 905: 2835}, + {908, 908, 58: 908, 491: 908, 493: 908, 500: 908, 908, 509: 908, 511: 908, 513: 908, 516: 908, 908}, + {909, 909, 58: 909, 491: 909, 493: 909, 500: 909, 909, 509: 909, 511: 909, 513: 909, 516: 909, 909}, // 225 - {1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 477: 1900, 1900, 4115, 4114, 1900, 483: 1900, 1900, 1900, 1900, 488: 3712, 3713, 3718, 492: 1900, 1900, 1900, 496: 1900, 1900, 499: 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 509: 1900, 1900, 512: 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 4119, 1900, 3714, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 534: 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 4118, 1900, 1900, 3715, 3716, 3709, 3719, 3708, 3717, 3710, 3711, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 4116, 568: 4125, 4126, 815: 4117, 1120: 4120, 1189: 4122, 1243: 4121, 1251: 4123, 1293: 4124}, - {1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 4111, 1849, 1849, 1849, 1849, 1849, 483: 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 492: 1849, 1849, 1849, 496: 1849, 1849, 499: 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 509: 1849, 1849, 512: 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 534: 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 568: 1849, 1849, 597: 1849, 655: 1849, 659: 1849, 1849}, - {1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 668: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848}, - {1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 668: 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847}, - {1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 668: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 2841, 893: 3347, 925: 3346}, + {1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 4291, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 493: 1590, 1590, 1590, 497: 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 508: 1590, 1590, 511: 1590, 1590, 1590, 516: 1590, 1590, 1590, 1590, 1590, 1590, 523: 1590, 1590, 526: 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 550: 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 584: 1590, 1590, 1590, 616: 1590, 672: 1590, 676: 1590, 1590}, + {1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 4288, 1589, 1589, 1589, 497: 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 508: 1589, 1589, 511: 1589, 1589, 1589, 516: 1589, 1589, 1589, 1589, 1589, 1589, 523: 1589, 1589, 526: 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 550: 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 584: 1589, 1589, 1589, 616: 1589, 672: 1589, 676: 1589, 1589}, + {785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 493: 785, 785, 785, 497: 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 508: 785, 785, 511: 785, 785, 785, 516: 785, 785, 785, 785, 785, 785, 523: 785, 785, 526: 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 550: 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 584: 785, 785, 785, 616: 785, 680: 4286}, + {1343, 1343, 9: 1343, 58: 1343, 137: 1343, 491: 1343, 493: 1343, 500: 1343, 1343, 509: 1343, 511: 1343, 1343, 1343, 516: 1343, 1343, 521: 1343, 523: 1343, 527: 3451, 3449, 3450, 3448, 3446, 533: 1343, 535: 1343, 543: 1343, 546: 1343, 1343, 4285, 561: 4284, 756: 3447, 3445, 1305: 4283}, // 230 - {1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 668: 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845}, - {1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 668: 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844}, - {1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1249, 1843, 1843, 1843, 1843, 1843, 483: 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 492: 1843, 1843, 1843, 496: 1843, 1843, 499: 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 509: 1843, 1843, 512: 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 534: 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 568: 1843, 1843, 597: 1843, 655: 1843, 659: 1843, 1843}, - {1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 668: 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842}, - {1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 668: 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4282}, + {492: 4254}, + {1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 493: 1994, 1994, 498: 1994, 500: 1994, 1994, 1994, 1994, 508: 1994, 1994, 511: 1994, 1994, 1994, 516: 1994, 1994, 4237, 1994, 1994, 1994, 523: 1994, 1994, 526: 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 538: 1994, 1994, 1994, 542: 1994, 1994, 1994, 1994, 1994, 1994, 1994, 550: 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 565: 1994, 574: 4234, 4232, 4231, 4239, 4233, 4235, 4236, 4238, 1229: 4230, 1273: 4229}, + {1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 493: 1969, 1969, 498: 1969, 500: 1969, 1969, 1969, 1969, 508: 1969, 1969, 511: 1969, 1969, 1969, 516: 1969, 1969, 1969, 1969, 1969, 1969, 523: 1969, 1969, 526: 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 538: 1969, 1969, 1969, 542: 1969, 1969, 1969, 1969, 1969, 1969, 1969, 550: 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 565: 1969, 574: 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969}, + {1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 493: 1941, 1941, 4197, 497: 4196, 1941, 500: 1941, 1941, 1941, 1941, 3792, 3793, 3798, 508: 1941, 1941, 511: 1941, 1941, 1941, 516: 1941, 1941, 1941, 1941, 1941, 1941, 523: 1941, 1941, 526: 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 4201, 1941, 1941, 1941, 3794, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 550: 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 4200, 1941, 3795, 3796, 3789, 3799, 3788, 3797, 3790, 3791, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 4198, 584: 4208, 4209, 4207, 834: 4199, 1143: 4202, 1215: 4204, 1268: 4203, 1276: 4205, 1318: 4206}, // 235 - {1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 668: 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840}, - {1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 668: 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839}, - {1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 668: 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838}, - {1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 668: 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837}, - {1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 668: 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836}, + {1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 4193, 1890, 1890, 1890, 497: 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 508: 1890, 1890, 511: 1890, 1890, 1890, 516: 1890, 1890, 1890, 1890, 1890, 1890, 523: 1890, 1890, 526: 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 550: 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 584: 1890, 1890, 1890, 616: 1890, 672: 1890, 676: 1890, 1890}, + {1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 687: 1889, 690: 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889}, + {1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 687: 1888, 690: 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888}, + {1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 687: 1887, 690: 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887}, + {1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 687: 1886, 690: 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886}, // 240 - {1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 668: 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835}, - {1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 668: 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834}, - {1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 668: 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833}, - {1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 668: 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832}, - {1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 4106, 1831, 1831, 1831, 1831, 1831, 483: 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 492: 1831, 1831, 1831, 496: 1831, 1831, 499: 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 509: 1831, 1831, 512: 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 534: 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 568: 1831, 1831, 597: 1831, 655: 1831, 659: 1831, 1831}, + {1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 687: 1885, 690: 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885}, + {1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1272, 1884, 1884, 1884, 497: 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 508: 1884, 1884, 511: 1884, 1884, 1884, 516: 1884, 1884, 1884, 1884, 1884, 1884, 523: 1884, 1884, 526: 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 550: 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 584: 1884, 1884, 1884, 616: 1884, 672: 1884, 676: 1884, 1884}, + {1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 687: 1883, 690: 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883}, + {1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 687: 1882, 690: 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882}, + {1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 687: 1881, 690: 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881}, // 245 - {1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 668: 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830}, - {1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 668: 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829}, - {1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 668: 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828}, - {1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 668: 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827}, - {1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 668: 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826}, + {1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 687: 1880, 690: 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880}, + {1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 687: 1879, 690: 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879}, + {1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 687: 1878, 690: 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878}, + {1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 687: 1877, 690: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877}, + {1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 687: 1876, 690: 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876}, // 250 - {1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 668: 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825}, - {1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 668: 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824}, - {1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 668: 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823}, - {1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 668: 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822}, - {1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 668: 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821}, + {1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 687: 1875, 690: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875}, + {1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 687: 1874, 690: 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874}, + {1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 687: 1873, 690: 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873}, + {1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 4188, 1872, 1872, 1872, 497: 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 508: 1872, 1872, 511: 1872, 1872, 1872, 516: 1872, 1872, 1872, 1872, 1872, 1872, 523: 1872, 1872, 526: 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 550: 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 584: 1872, 1872, 1872, 616: 1872, 672: 1872, 676: 1872, 1872}, + {1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 687: 1871, 690: 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871}, // 255 - {1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1248, 1820, 1820, 1820, 1820, 1820, 483: 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 492: 1820, 1820, 1820, 496: 1820, 1820, 499: 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 509: 1820, 1820, 512: 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 534: 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 568: 1820, 1820, 597: 1820, 655: 1820, 659: 1820, 1820}, - {1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 668: 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819}, - {1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 668: 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818}, - {1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 668: 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817}, - {1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 668: 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816}, + {1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 687: 1870, 690: 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870}, + {1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 687: 1869, 690: 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869}, + {1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 687: 1868, 690: 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868}, + {1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 687: 1867, 690: 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867}, + {1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 687: 1866, 690: 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866}, // 260 - {1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 668: 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815}, - {1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 668: 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814}, - {1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 668: 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813}, - {1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 668: 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812}, - {1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 668: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811}, + {1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 687: 1865, 690: 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865}, + {1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 687: 1864, 690: 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864}, + {1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 687: 1863, 690: 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863}, + {1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 687: 1862, 690: 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862}, + {1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1271, 1861, 1861, 1861, 497: 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 508: 1861, 1861, 511: 1861, 1861, 1861, 516: 1861, 1861, 1861, 1861, 1861, 1861, 523: 1861, 1861, 526: 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 550: 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 584: 1861, 1861, 1861, 616: 1861, 672: 1861, 676: 1861, 1861}, // 265 - {1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 668: 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810}, - {1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1245, 1809, 4105, 1809, 1809, 1809, 483: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 492: 1809, 1809, 1809, 496: 1809, 1809, 499: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 509: 1809, 1809, 512: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 534: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 568: 1809, 1809, 597: 1809, 655: 1809, 659: 1809, 1809}, - {1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 668: 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808}, - {1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1243, 1807, 1807, 1807, 1807, 1807, 483: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 492: 1807, 1807, 1807, 496: 1807, 1807, 499: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 509: 1807, 1807, 512: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 534: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 568: 1807, 1807, 597: 1807, 655: 1807, 659: 1807, 1807}, - {1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 668: 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806}, + {1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 687: 1860, 690: 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860}, + {1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 687: 1859, 690: 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859}, + {1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 687: 1858, 690: 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858}, + {1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 687: 1857, 690: 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857}, + {1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 687: 1856, 690: 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856}, // 270 - {1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 668: 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805}, - {1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 668: 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804}, - {1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 668: 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803}, - {1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 668: 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802}, - {1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 668: 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801}, + {1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 687: 1855, 690: 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855}, + {1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 687: 1854, 690: 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854}, + {1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 687: 1853, 690: 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853}, + {1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 687: 1852, 690: 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852}, + {1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 687: 1851, 690: 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851}, // 275 - {1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 668: 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800}, - {1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 668: 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799}, - {1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 668: 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798}, - {1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 668: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797}, - {1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 668: 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796}, + {1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1268, 1850, 4187, 1850, 497: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 508: 1850, 1850, 511: 1850, 1850, 1850, 516: 1850, 1850, 1850, 1850, 1850, 1850, 523: 1850, 1850, 526: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 550: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 584: 1850, 1850, 1850, 616: 1850, 672: 1850, 676: 1850, 1850}, + {1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 687: 1849, 690: 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849}, + {1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1266, 1848, 1848, 1848, 497: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 508: 1848, 1848, 511: 1848, 1848, 1848, 516: 1848, 1848, 1848, 1848, 1848, 1848, 523: 1848, 1848, 526: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 550: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 584: 1848, 1848, 1848, 616: 1848, 672: 1848, 676: 1848, 1848}, + {1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 687: 1847, 690: 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847}, + {1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 687: 1846, 690: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846}, // 280 - {1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 668: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795}, - {1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 668: 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794}, - {1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 668: 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793}, - {1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 668: 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792}, - {1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 668: 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791}, + {1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 687: 1845, 690: 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845}, + {1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 687: 1844, 690: 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844}, + {1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 687: 1843, 690: 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843}, + {1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 687: 1842, 690: 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842}, + {1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 687: 1841, 690: 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841}, // 285 - {1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 668: 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790}, - {1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 668: 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789}, - {1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 668: 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788}, - {1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 668: 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787}, - {1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 668: 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786}, + {1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 687: 1840, 690: 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840}, + {1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 687: 1839, 690: 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839}, + {1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 687: 1838, 690: 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838}, + {1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 687: 1837, 690: 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837}, + {1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 687: 1836, 690: 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836}, // 290 - {1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 668: 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785}, - {1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1239, 1784, 1784, 1784, 1784, 1784, 483: 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 492: 1784, 1784, 1784, 496: 1784, 1784, 499: 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 509: 1784, 1784, 512: 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 534: 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 568: 1784, 1784, 597: 1784, 655: 1784, 659: 1784, 1784}, - {1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 668: 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783}, - {1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 668: 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782}, - {1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 668: 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781}, + {1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 687: 1835, 690: 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835}, + {1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 687: 1834, 690: 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834}, + {1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 687: 1833, 690: 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833}, + {1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 687: 1832, 690: 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832}, + {1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 687: 1831, 690: 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831}, // 295 - {1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 668: 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780}, - {1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 668: 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779}, - {1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1242, 1778, 1778, 1778, 1778, 1778, 483: 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 492: 1778, 1778, 1778, 496: 1778, 1778, 499: 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 509: 1778, 1778, 512: 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 534: 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 568: 1778, 1778, 597: 1778, 655: 1778, 659: 1778, 1778}, - {1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 668: 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777}, - {1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 668: 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776}, + {1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 687: 1830, 690: 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830}, + {1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 687: 1829, 690: 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829}, + {1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 687: 1828, 690: 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828}, + {1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 687: 1827, 690: 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827}, + {1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 687: 1826, 690: 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826}, // 300 - {1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 668: 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775}, - {1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 668: 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774}, - {1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 668: 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773}, - {1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 668: 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772}, - {1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 668: 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771}, + {1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1262, 1825, 1825, 1825, 497: 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 508: 1825, 1825, 511: 1825, 1825, 1825, 516: 1825, 1825, 1825, 1825, 1825, 1825, 523: 1825, 1825, 526: 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 550: 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 584: 1825, 1825, 1825, 616: 1825, 672: 1825, 676: 1825, 1825}, + {1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 687: 1824, 690: 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824}, + {1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 687: 1823, 690: 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823}, + {1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 687: 1822, 690: 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822}, + {1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 687: 1821, 690: 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821}, // 305 - {1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 668: 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770}, - {1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 668: 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769}, - {1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 4102, 1768, 1768, 1768, 1768, 1768, 483: 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 492: 1768, 1768, 1768, 496: 1768, 1768, 499: 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 509: 1768, 1768, 512: 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 534: 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 568: 1768, 1768, 597: 1768, 655: 1768, 659: 1768, 1768}, - {1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 668: 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767}, - {1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 668: 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766}, + {1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 687: 1820, 690: 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820}, + {1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1265, 1819, 1819, 1819, 497: 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 508: 1819, 1819, 511: 1819, 1819, 1819, 516: 1819, 1819, 1819, 1819, 1819, 1819, 523: 1819, 1819, 526: 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 550: 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 584: 1819, 1819, 1819, 616: 1819, 672: 1819, 676: 1819, 1819}, + {1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 687: 1818, 690: 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818}, + {1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 687: 1817, 690: 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817}, + {1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 687: 1816, 690: 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816}, // 310 - {1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 668: 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765}, - {1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 668: 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764}, - {1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 668: 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763}, - {1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 668: 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762}, - {1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 668: 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761}, + {1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 687: 1815, 690: 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815}, + {1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 687: 1814, 690: 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814}, + {1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 687: 1813, 690: 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813}, + {1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 687: 1812, 690: 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812}, + {1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 687: 1811, 690: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811}, // 315 - {1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 668: 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760}, - {1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 668: 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759}, - {1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 668: 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758}, - {1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 668: 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757}, - {1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 668: 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756}, + {1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 687: 1810, 690: 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810}, + {1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 4184, 1809, 1809, 1809, 497: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 508: 1809, 1809, 511: 1809, 1809, 1809, 516: 1809, 1809, 1809, 1809, 1809, 1809, 523: 1809, 1809, 526: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 550: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 584: 1809, 1809, 1809, 616: 1809, 672: 1809, 676: 1809, 1809}, + {1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 687: 1808, 690: 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808}, + {1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 687: 1807, 690: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807}, + {1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 687: 1806, 690: 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806}, // 320 - {1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 668: 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755}, - {1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 668: 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754}, - {1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 668: 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753}, - {1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 668: 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752}, - {1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 668: 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751}, + {1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 687: 1805, 690: 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805}, + {1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 687: 1804, 690: 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804}, + {1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 687: 1803, 690: 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803}, + {1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 687: 1802, 690: 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802}, + {1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 687: 1801, 690: 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801}, // 325 - {1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 668: 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750}, - {1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 668: 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749}, - {1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 668: 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748}, - {1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 668: 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747}, - {1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 668: 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746}, + {1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 687: 1800, 690: 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800}, + {1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 687: 1799, 690: 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799}, + {1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 687: 1798, 690: 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798}, + {1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 687: 1797, 690: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797}, + {1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 687: 1796, 690: 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796}, // 330 - {1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 668: 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745}, - {1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 668: 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744}, - {1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1226, 1743, 4101, 1743, 1743, 1743, 483: 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 492: 1743, 1743, 1743, 496: 1743, 1743, 499: 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 509: 1743, 1743, 512: 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 534: 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 568: 1743, 1743, 597: 1743, 655: 1743, 659: 1743, 1743}, - {1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1225, 1742, 4100, 1742, 1742, 1742, 483: 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 492: 1742, 1742, 1742, 496: 1742, 1742, 499: 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 509: 1742, 1742, 512: 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 534: 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 568: 1742, 1742, 597: 1742, 655: 1742, 659: 1742, 1742}, - {1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 668: 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741}, + {1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 687: 1795, 690: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795}, + {1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 687: 1794, 690: 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794}, + {1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 687: 1793, 690: 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793}, + {1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 687: 1792, 690: 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792}, + {1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 687: 1791, 690: 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791}, // 335 - {1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 668: 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740}, - {1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1224, 1739, 1739, 1739, 1739, 1739, 483: 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 492: 1739, 1739, 1739, 496: 1739, 1739, 499: 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 509: 1739, 1739, 512: 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 534: 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 568: 1739, 1739, 597: 1739, 655: 1739, 659: 1739, 1739}, - {1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 668: 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738}, - {1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 668: 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737}, - {1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 668: 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736}, + {1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 687: 1790, 690: 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790}, + {1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 687: 1789, 690: 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789}, + {1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 687: 1788, 690: 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788}, + {1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 687: 1787, 690: 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787}, + {1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 687: 1786, 690: 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786}, // 340 - {1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 668: 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735}, - {1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1221, 1734, 1734, 1734, 1734, 1734, 483: 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 492: 1734, 1734, 1734, 496: 1734, 1734, 499: 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 509: 1734, 1734, 512: 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 534: 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 568: 1734, 1734, 597: 1734, 655: 1734, 659: 1734, 1734}, - {1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 668: 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733}, - {1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1222, 1732, 1732, 1732, 1732, 1732, 483: 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 492: 1732, 1732, 1732, 496: 1732, 1732, 499: 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 509: 1732, 1732, 512: 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 534: 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 568: 1732, 1732, 597: 1732, 655: 1732, 659: 1732, 1732}, - {1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 4090, 1731, 1731, 1731, 1731, 1731, 483: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 492: 1731, 1731, 1731, 496: 1731, 1731, 499: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 509: 1731, 1731, 512: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 534: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 568: 1731, 1731, 597: 1731, 655: 1731, 659: 1731, 1731}, + {1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 687: 1785, 690: 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785}, + {1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 687: 1784, 690: 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784}, + {1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1249, 1783, 4183, 1783, 497: 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 508: 1783, 1783, 511: 1783, 1783, 1783, 516: 1783, 1783, 1783, 1783, 1783, 1783, 523: 1783, 1783, 526: 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 550: 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 584: 1783, 1783, 1783, 616: 1783, 672: 1783, 676: 1783, 1783}, + {1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1248, 1782, 4182, 1782, 497: 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 508: 1782, 1782, 511: 1782, 1782, 1782, 516: 1782, 1782, 1782, 1782, 1782, 1782, 523: 1782, 1782, 526: 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 550: 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 584: 1782, 1782, 1782, 616: 1782, 672: 1782, 676: 1782, 1782}, + {1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 687: 1781, 690: 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781}, // 345 - {1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 668: 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730}, - {1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 668: 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729}, - {1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1223, 1728, 1728, 1728, 1728, 1728, 483: 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 492: 1728, 1728, 1728, 496: 1728, 1728, 499: 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 509: 1728, 1728, 512: 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 534: 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 568: 1728, 1728, 597: 1728, 655: 1728, 659: 1728, 1728}, - {1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 668: 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727}, - {1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1246, 1726, 1726, 1726, 1726, 1726, 483: 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 492: 1726, 1726, 1726, 496: 1726, 1726, 499: 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 509: 1726, 1726, 512: 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 534: 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 568: 1726, 1726, 597: 1726, 655: 1726, 659: 1726, 1726}, + {1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 687: 1780, 690: 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780}, + {1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1247, 1779, 1779, 1779, 497: 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 508: 1779, 1779, 511: 1779, 1779, 1779, 516: 1779, 1779, 1779, 1779, 1779, 1779, 523: 1779, 1779, 526: 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 550: 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 584: 1779, 1779, 1779, 616: 1779, 672: 1779, 676: 1779, 1779}, + {1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 687: 1778, 690: 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778}, + {1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 687: 1777, 690: 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777}, + {1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 687: 1776, 690: 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776}, // 350 - {1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 668: 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725}, - {1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 668: 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724}, - {1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 668: 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723}, - {1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 668: 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722}, - {1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 668: 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721}, + {1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 687: 1775, 690: 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775}, + {1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1244, 1774, 1774, 1774, 497: 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 508: 1774, 1774, 511: 1774, 1774, 1774, 516: 1774, 1774, 1774, 1774, 1774, 1774, 523: 1774, 1774, 526: 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 550: 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 584: 1774, 1774, 1774, 616: 1774, 672: 1774, 676: 1774, 1774}, + {1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 687: 1773, 690: 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773}, + {1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1245, 1772, 1772, 1772, 497: 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 508: 1772, 1772, 511: 1772, 1772, 1772, 516: 1772, 1772, 1772, 1772, 1772, 1772, 523: 1772, 1772, 526: 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 550: 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 584: 1772, 1772, 1772, 616: 1772, 672: 1772, 676: 1772, 1772}, + {1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 4172, 1771, 1771, 1771, 497: 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 508: 1771, 1771, 511: 1771, 1771, 1771, 516: 1771, 1771, 1771, 1771, 1771, 1771, 523: 1771, 1771, 526: 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 550: 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 584: 1771, 1771, 1771, 616: 1771, 672: 1771, 676: 1771, 1771}, // 355 - {1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 668: 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720}, - {1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 668: 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719}, - {1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 668: 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718}, - {1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 668: 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717}, - {1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 668: 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716}, + {1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 687: 1770, 690: 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770}, + {1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 687: 1769, 690: 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769}, + {1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1246, 1768, 1768, 1768, 497: 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 508: 1768, 1768, 511: 1768, 1768, 1768, 516: 1768, 1768, 1768, 1768, 1768, 1768, 523: 1768, 1768, 526: 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 550: 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 584: 1768, 1768, 1768, 616: 1768, 672: 1768, 676: 1768, 1768}, + {1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 687: 1767, 690: 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767}, + {1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1269, 1766, 1766, 1766, 497: 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 508: 1766, 1766, 511: 1766, 1766, 1766, 516: 1766, 1766, 1766, 1766, 1766, 1766, 523: 1766, 1766, 526: 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 550: 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 584: 1766, 1766, 1766, 616: 1766, 672: 1766, 676: 1766, 1766}, // 360 - {1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 668: 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715}, - {1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 668: 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714}, - {1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1233, 1713, 1713, 1713, 1713, 1713, 483: 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 492: 1713, 1713, 1713, 496: 1713, 1713, 499: 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 509: 1713, 1713, 512: 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 534: 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 568: 1713, 1713, 597: 1713, 655: 1713, 659: 1713, 1713}, - {1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 668: 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712}, - {1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 668: 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711}, + {1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 687: 1765, 690: 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765}, + {1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 687: 1764, 690: 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764}, + {1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 687: 1763, 690: 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763}, + {1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 687: 1762, 690: 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762}, + {1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 687: 1761, 690: 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761}, // 365 - {1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 668: 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710}, - {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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 1709, 1709, 1709, 1709, 668: 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, 1709}, - {1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 668: 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708}, - {1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 668: 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707}, - {1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 668: 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706}, + {1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 687: 1760, 690: 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760}, + {1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 687: 1759, 690: 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759}, + {1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 687: 1758, 690: 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758}, + {1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 687: 1757, 690: 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757}, + {1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 687: 1756, 690: 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756}, // 370 - {1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 668: 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705}, - {1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 668: 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704}, - {1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 668: 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703}, - {1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 668: 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 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, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 668: 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701}, + {1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 687: 1755, 690: 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755}, + {1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 687: 1754, 690: 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754}, + {1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1256, 1753, 1753, 1753, 497: 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 508: 1753, 1753, 511: 1753, 1753, 1753, 516: 1753, 1753, 1753, 1753, 1753, 1753, 523: 1753, 1753, 526: 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 550: 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 584: 1753, 1753, 1753, 616: 1753, 672: 1753, 676: 1753, 1753}, + {1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 687: 1752, 690: 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752}, + {1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 687: 1751, 690: 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751}, // 375 - {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 668: 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, - {1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 668: 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699}, - {1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 668: 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698}, - {1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 668: 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697}, - {1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 668: 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696}, + {1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 687: 1750, 690: 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750}, + {1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 687: 1749, 690: 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749}, + {1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 687: 1748, 690: 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748}, + {1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 687: 1747, 690: 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747}, + {1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 687: 1746, 690: 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746}, // 380 - {1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 668: 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695}, - {1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 668: 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694}, - {1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 668: 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693}, - {1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 668: 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692}, - {1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 668: 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691}, + {1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 687: 1745, 690: 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745}, + {1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 687: 1744, 690: 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744}, + {1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 687: 1743, 690: 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743}, + {1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 687: 1742, 690: 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742}, + {1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 687: 1741, 690: 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741}, // 385 - {1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1230, 1690, 1690, 1690, 1690, 1690, 483: 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 492: 1690, 1690, 1690, 496: 1690, 1690, 499: 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 509: 1690, 1690, 512: 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 534: 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 568: 1690, 1690, 597: 1690, 655: 1690, 659: 1690, 1690}, - {1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 668: 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689}, - {1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 668: 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688}, - {1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 668: 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687}, - {1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 668: 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686}, + {1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 687: 1740, 690: 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740}, + {1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 687: 1739, 690: 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739}, + {1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 687: 1738, 690: 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738}, + {1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 687: 1737, 690: 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737}, + {1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 687: 1736, 690: 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736}, // 390 - {1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 668: 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685}, - {1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 668: 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684}, - {1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 668: 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683}, - {1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 668: 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682}, - {1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 668: 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681}, + {1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 687: 1735, 690: 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735}, + {1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 687: 1734, 690: 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734}, + {1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 687: 1733, 690: 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733}, + {1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 687: 1732, 690: 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732}, + {1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 687: 1731, 690: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731}, // 395 - {1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 668: 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680}, - {1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 668: 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679}, - {1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 668: 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678}, - {1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 668: 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677}, - {1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 668: 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676}, + {1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1253, 1730, 1730, 1730, 497: 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 508: 1730, 1730, 511: 1730, 1730, 1730, 516: 1730, 1730, 1730, 1730, 1730, 1730, 523: 1730, 1730, 526: 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 550: 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 584: 1730, 1730, 1730, 616: 1730, 672: 1730, 676: 1730, 1730}, + {1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 687: 1729, 690: 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729}, + {1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 687: 1728, 690: 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728}, + {1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 687: 1727, 690: 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727}, + {1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 687: 1726, 690: 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726}, // 400 - {1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 668: 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675}, - {1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 668: 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674}, - {1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1228, 1673, 1673, 1673, 1673, 1673, 483: 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 492: 1673, 1673, 1673, 496: 1673, 1673, 499: 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 509: 1673, 1673, 512: 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 534: 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 568: 1673, 1673, 597: 1673, 655: 1673, 659: 1673, 1673}, - {1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1247, 1672, 1672, 1672, 1672, 1672, 483: 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 492: 1672, 1672, 1672, 496: 1672, 1672, 499: 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 509: 1672, 1672, 512: 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 534: 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 568: 1672, 1672, 597: 1672, 655: 1672, 659: 1672, 1672}, - {1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1235, 1671, 1671, 1671, 1671, 1671, 483: 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 492: 1671, 1671, 1671, 496: 1671, 1671, 499: 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 509: 1671, 1671, 512: 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 534: 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 568: 1671, 1671, 597: 1671, 655: 1671, 659: 1671, 1671}, + {1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 687: 1725, 690: 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725}, + {1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 687: 1724, 690: 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724}, + {1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 687: 1723, 690: 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723}, + {1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 687: 1722, 690: 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722}, + {1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 687: 1721, 690: 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721}, // 405 - {1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 668: 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670}, - {1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 668: 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669}, - {1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 668: 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668}, - {1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1237, 1667, 1667, 1667, 1667, 1667, 483: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 492: 1667, 1667, 1667, 496: 1667, 1667, 499: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 509: 1667, 1667, 512: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 534: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 568: 1667, 1667, 597: 1667, 655: 1667, 659: 1667, 1667}, - {1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1236, 1666, 1666, 1666, 1666, 1666, 483: 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 492: 1666, 1666, 1666, 496: 1666, 1666, 499: 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 509: 1666, 1666, 512: 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 534: 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 568: 1666, 1666, 597: 1666, 655: 1666, 659: 1666, 1666}, + {1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 687: 1720, 690: 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720}, + {1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 687: 1719, 690: 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719}, + {1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 687: 1718, 690: 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718}, + {1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 687: 1717, 690: 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717}, + {1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 687: 1716, 690: 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716}, // 410 - {1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 668: 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665}, - {1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 668: 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664}, - {1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 668: 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663}, - {1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 668: 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662}, - {1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 668: 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661}, + {1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 687: 1715, 690: 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715}, + {1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 687: 1714, 690: 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714}, + {1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1251, 1713, 1713, 1713, 497: 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 508: 1713, 1713, 511: 1713, 1713, 1713, 516: 1713, 1713, 1713, 1713, 1713, 1713, 523: 1713, 1713, 526: 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 550: 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 584: 1713, 1713, 1713, 616: 1713, 672: 1713, 676: 1713, 1713}, + {1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1270, 1712, 1712, 1712, 497: 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 508: 1712, 1712, 511: 1712, 1712, 1712, 516: 1712, 1712, 1712, 1712, 1712, 1712, 523: 1712, 1712, 526: 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 550: 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 584: 1712, 1712, 1712, 616: 1712, 672: 1712, 676: 1712, 1712}, + {1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1258, 1711, 1711, 1711, 497: 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 508: 1711, 1711, 511: 1711, 1711, 1711, 516: 1711, 1711, 1711, 1711, 1711, 1711, 523: 1711, 1711, 526: 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 550: 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 584: 1711, 1711, 1711, 616: 1711, 672: 1711, 676: 1711, 1711}, // 415 - {1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1227, 1660, 1660, 1660, 1660, 1660, 483: 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 492: 1660, 1660, 1660, 496: 1660, 1660, 499: 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 509: 1660, 1660, 512: 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 534: 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 568: 1660, 1660, 597: 1660, 655: 1660, 659: 1660, 1660}, - {1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 668: 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659}, - {1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 668: 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658}, - {1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 668: 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657}, - {1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 668: 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656}, + {1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 687: 1710, 690: 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710}, + {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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 687: 1709, 690: 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}, + {1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 687: 1708, 690: 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708}, + {1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1260, 1707, 1707, 1707, 497: 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 508: 1707, 1707, 511: 1707, 1707, 1707, 516: 1707, 1707, 1707, 1707, 1707, 1707, 523: 1707, 1707, 526: 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 550: 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 584: 1707, 1707, 1707, 616: 1707, 672: 1707, 676: 1707, 1707}, + {1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1259, 1706, 1706, 1706, 497: 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 508: 1706, 1706, 511: 1706, 1706, 1706, 516: 1706, 1706, 1706, 1706, 1706, 1706, 523: 1706, 1706, 526: 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 550: 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 584: 1706, 1706, 1706, 616: 1706, 672: 1706, 676: 1706, 1706}, // 420 - {1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 668: 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655}, - {1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 668: 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654}, - {1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 668: 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653}, - {1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 668: 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652}, - {1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 668: 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651}, + {1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 687: 1705, 690: 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705}, + {1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 687: 1704, 690: 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704}, + {1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 687: 1703, 690: 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703}, + {1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 687: 1702, 690: 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 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, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 687: 1701, 690: 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701}, // 425 - {1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 668: 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650}, - {1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 668: 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649}, - {1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 668: 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648}, - {1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 668: 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647}, - {1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 668: 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1250, 1700, 1700, 1700, 497: 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 508: 1700, 1700, 511: 1700, 1700, 1700, 516: 1700, 1700, 1700, 1700, 1700, 1700, 523: 1700, 1700, 526: 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 550: 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 584: 1700, 1700, 1700, 616: 1700, 672: 1700, 676: 1700, 1700}, + {1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 687: 1699, 690: 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699}, + {1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 687: 1698, 690: 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698}, + {1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 687: 1697, 690: 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697}, + {1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 687: 1696, 690: 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696}, // 430 - {1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 668: 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645}, - {1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 668: 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644}, - {1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 668: 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643}, - {1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 668: 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642}, - {1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 668: 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641}, + {1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 687: 1695, 690: 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695}, + {1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 687: 1694, 690: 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694}, + {1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 687: 1693, 690: 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693}, + {1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 687: 1692, 690: 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692}, + {1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 687: 1691, 690: 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691}, // 435 - {1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 668: 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640}, - {1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 668: 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639}, - {1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 668: 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638}, - {1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 668: 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637}, - {1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 668: 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636}, + {1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 687: 1690, 690: 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690}, + {1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 687: 1689, 690: 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689}, + {1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 687: 1688, 690: 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688}, + {1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 687: 1687, 690: 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687}, + {1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 687: 1686, 690: 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686}, // 440 - {1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 668: 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635}, - {1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 668: 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634}, - {1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 668: 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633}, - {1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 668: 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632}, - {1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 668: 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631}, + {1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 687: 1685, 690: 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685}, + {1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 687: 1684, 690: 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684}, + {1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 687: 1683, 690: 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683}, + {1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 687: 1682, 690: 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682}, + {1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 687: 1681, 690: 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681}, // 445 - {1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 668: 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630}, - {1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 668: 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629}, - {1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 668: 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628}, - {1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 668: 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627}, - {1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 668: 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626}, + {1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 687: 1680, 690: 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680}, + {1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 687: 1679, 690: 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679}, + {1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 687: 1678, 690: 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678}, + {1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 687: 1677, 690: 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677}, + {1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 687: 1676, 690: 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676}, // 450 - {1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 668: 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625}, - {1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 668: 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624}, - {1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 668: 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623}, - {1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 668: 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622}, - {1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 668: 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621}, + {1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 687: 1675, 690: 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675}, + {1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 687: 1674, 690: 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674}, + {1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 687: 1673, 690: 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673}, + {1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 687: 1672, 690: 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672}, + {1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 687: 1671, 690: 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671}, // 455 - {1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 668: 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620}, - {1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 668: 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619}, - {1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 668: 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618}, - {1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 668: 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617}, - {1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 668: 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616}, + {1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 687: 1670, 690: 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670}, + {1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 687: 1669, 690: 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669}, + {1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 687: 1668, 690: 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668}, + {1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 687: 1667, 690: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667}, + {1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 687: 1666, 690: 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666}, // 460 - {1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 668: 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615}, - {1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 668: 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614}, - {1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 668: 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613}, - {1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 668: 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612}, - {1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 668: 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611}, + {1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 687: 1665, 690: 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665}, + {1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 687: 1664, 690: 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664}, + {1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 687: 1663, 690: 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663}, + {1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 687: 1662, 690: 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662}, + {1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 687: 1661, 690: 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661}, // 465 - {1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 668: 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610}, - {1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 668: 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609}, - {1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 668: 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608}, - {1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 668: 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607}, - {1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 668: 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606}, + {1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 687: 1660, 690: 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660}, + {1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 687: 1659, 690: 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659}, + {1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 687: 1658, 690: 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658}, + {1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 687: 1657, 690: 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657}, + {1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 687: 1656, 690: 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656}, // 470 - {1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 668: 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605}, - {1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 668: 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604}, - {1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 668: 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603}, - {1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 668: 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602}, - {1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 668: 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601}, + {1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 687: 1655, 690: 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655}, + {1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 687: 1654, 690: 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654}, + {1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 687: 1653, 690: 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653}, + {1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 687: 1652, 690: 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652}, + {1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 687: 1651, 690: 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651}, // 475 - {1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 668: 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600}, - {1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 668: 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599}, - {1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 668: 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598}, - {1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 668: 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597}, - {1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 668: 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596}, + {1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 687: 1650, 690: 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650}, + {1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 687: 1649, 690: 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649}, + {1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 687: 1648, 690: 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648}, + {1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 687: 1647, 690: 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647}, + {1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 687: 1646, 690: 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646}, // 480 - {1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 668: 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595}, - {1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 668: 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 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, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 668: 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 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, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 668: 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 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, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 668: 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591}, + {1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 687: 1645, 690: 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645}, + {1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 687: 1644, 690: 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644}, + {1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 687: 1643, 690: 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643}, + {1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 687: 1642, 690: 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642}, + {1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 687: 1641, 690: 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641}, // 485 - {1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 668: 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590}, - {1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 668: 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 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, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 668: 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 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, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 668: 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 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, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 668: 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586}, + {1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 687: 1640, 690: 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640}, + {1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 687: 1639, 690: 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639}, + {1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 687: 1638, 690: 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638}, + {1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 687: 1637, 690: 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637}, + {1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 687: 1636, 690: 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636}, // 490 - {1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 668: 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585}, - {1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 668: 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 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, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 668: 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 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, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 668: 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 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, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 668: 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581}, + {1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 687: 1635, 690: 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635}, + {1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 687: 1634, 690: 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634}, + {1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 687: 1633, 690: 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633}, + {1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 687: 1632, 690: 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632}, + {1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 687: 1631, 690: 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631}, // 495 - {1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 668: 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580}, - {1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 668: 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 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, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 668: 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 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, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 668: 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 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, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 668: 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576}, + {1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 687: 1630, 690: 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630}, + {1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 687: 1629, 690: 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629}, + {1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 687: 1628, 690: 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628}, + {1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 687: 1627, 690: 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627}, + {1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 687: 1626, 690: 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626}, // 500 - {1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 668: 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575}, - {1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 668: 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 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, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 668: 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 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, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 668: 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 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, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 668: 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571}, + {1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 687: 1625, 690: 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625}, + {1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 687: 1624, 690: 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624}, + {1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 687: 1623, 690: 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623}, + {1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 687: 1622, 690: 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622}, + {1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 687: 1621, 690: 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621}, // 505 - {1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 668: 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570}, - {1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 668: 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 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, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 668: 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 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, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 668: 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 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, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 668: 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566}, + {1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 687: 1620, 690: 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620}, + {1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 687: 1619, 690: 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619}, + {1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 687: 1618, 690: 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618}, + {1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 687: 1617, 690: 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617}, + {1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 687: 1616, 690: 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616}, // 510 - {1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 668: 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565}, - {1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 668: 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 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, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 668: 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 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, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 668: 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 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, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 668: 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561}, + {1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 687: 1615, 690: 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615}, + {1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 687: 1614, 690: 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614}, + {1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 687: 1613, 690: 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613}, + {1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 687: 1612, 690: 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612}, + {1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 687: 1611, 690: 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611}, // 515 - {1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 668: 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560}, - {1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 668: 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 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, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 668: 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 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, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 668: 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 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, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 668: 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556}, + {1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 687: 1610, 690: 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610}, + {1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 687: 1609, 690: 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609}, + {1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 687: 1608, 690: 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608}, + {1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 687: 1607, 690: 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607}, + {1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 687: 1606, 690: 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606}, // 520 - {1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 668: 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555}, - {1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 668: 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 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, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 668: 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 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, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 668: 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552}, - {1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 4087, 1549, 1549, 1549, 1549, 1549, 483: 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 492: 1549, 1549, 1549, 496: 1549, 1549, 499: 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 509: 1549, 1549, 512: 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 534: 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 568: 1549, 1549, 597: 1549, 655: 1549, 659: 1549, 1549}, + {1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 687: 1605, 690: 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605}, + {1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 687: 1604, 690: 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604}, + {1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 687: 1603, 690: 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603}, + {1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 687: 1602, 690: 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602}, + {1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 687: 1601, 690: 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601}, // 525 - {1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 4076, 1548, 1548, 1548, 1548, 1548, 483: 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 492: 1548, 1548, 1548, 496: 1548, 1548, 499: 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 509: 1548, 1548, 512: 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 534: 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 568: 1548, 1548, 597: 1548, 655: 1548, 659: 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, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 668: 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 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, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 668: 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 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, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 668: 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545}, - {1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 668: 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544}, + {1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 687: 1600, 690: 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600}, + {1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 687: 1599, 690: 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599}, + {1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 687: 1598, 690: 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598}, + {1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 687: 1597, 690: 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597}, + {1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 687: 1596, 690: 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596}, // 530 - {1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 668: 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 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, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 668: 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 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, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 668: 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 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, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 668: 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540}, - {1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 668: 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539}, + {1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 687: 1595, 690: 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595}, + {1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 687: 1594, 690: 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 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, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 687: 1593, 690: 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 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, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 687: 1592, 690: 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 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, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 687: 1591, 690: 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591}, // 535 - {1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 668: 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 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, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 668: 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 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, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 668: 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 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, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 668: 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535}, - {1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 668: 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534}, + {1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 4169, 1588, 1588, 1588, 497: 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 508: 1588, 1588, 511: 1588, 1588, 1588, 516: 1588, 1588, 1588, 1588, 1588, 1588, 523: 1588, 1588, 526: 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 550: 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 584: 1588, 1588, 1588, 616: 1588, 672: 1588, 676: 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, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 4158, 1587, 1587, 1587, 497: 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 508: 1587, 1587, 511: 1587, 1587, 1587, 516: 1587, 1587, 1587, 1587, 1587, 1587, 523: 1587, 1587, 526: 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 550: 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 584: 1587, 1587, 1587, 616: 1587, 672: 1587, 676: 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, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 687: 1586, 690: 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 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, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 687: 1585, 690: 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585}, + {1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 687: 1584, 690: 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584}, // 540 - {1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 668: 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 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, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 668: 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 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, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 668: 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 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, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 668: 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530}, - {1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 668: 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529}, + {1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 687: 1583, 690: 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 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, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 687: 1582, 690: 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 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, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 687: 1581, 690: 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 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, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 687: 1580, 690: 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580}, + {1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 687: 1579, 690: 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579}, // 545 - {1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 668: 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 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, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 668: 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 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, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 668: 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 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, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 668: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525}, - {1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 668: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524}, + {1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 687: 1578, 690: 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 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, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 687: 1577, 690: 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 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, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 687: 1576, 690: 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 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, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 687: 1575, 690: 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575}, + {1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 687: 1574, 690: 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574}, // 550 - {1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 668: 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 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, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 668: 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 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, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 668: 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 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, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 668: 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520}, - {1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 668: 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519}, + {1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 687: 1573, 690: 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 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, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 687: 1572, 690: 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 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, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 687: 1571, 690: 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 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, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 687: 1570, 690: 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570}, + {1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 687: 1569, 690: 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569}, // 555 - {1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 668: 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 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, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 668: 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 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, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 668: 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 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, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 668: 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515}, - {1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 668: 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514}, + {1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 687: 1568, 690: 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 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, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 687: 1567, 690: 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 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, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 687: 1566, 690: 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 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, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 687: 1565, 690: 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565}, + {1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 687: 1564, 690: 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564}, // 560 - {1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 668: 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 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, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 668: 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 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, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 668: 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 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, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 668: 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510}, - {1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 668: 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509}, + {1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 687: 1563, 690: 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 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, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 687: 1562, 690: 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 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, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 687: 1561, 690: 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 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, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 687: 1560, 690: 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560}, + {1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 687: 1559, 690: 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559}, // 565 - {1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 668: 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 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, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 668: 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 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, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 668: 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 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, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 668: 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505}, - {1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 668: 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504}, + {1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 687: 1558, 690: 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 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, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 687: 1557, 690: 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 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, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 687: 1556, 690: 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 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, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 687: 1555, 690: 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555}, + {1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 687: 1554, 690: 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554}, // 570 - {1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 668: 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 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, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 668: 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 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, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 668: 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 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, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 668: 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 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, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 668: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499}, + {1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 687: 1553, 690: 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 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, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 687: 1552, 690: 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 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, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 687: 1551, 690: 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 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, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 687: 1550, 690: 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550}, + {1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 687: 1549, 690: 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549}, // 575 - {1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 668: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 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, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 668: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 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, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 668: 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 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, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 668: 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495}, - {1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 668: 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494}, + {1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 687: 1548, 690: 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 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, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 687: 1547, 690: 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 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, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 687: 1546, 690: 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 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, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 687: 1545, 690: 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545}, + {1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 687: 1544, 690: 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544}, // 580 - {1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 668: 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 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, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 668: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 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, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 668: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 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, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 668: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 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, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 668: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489}, + {1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 687: 1543, 690: 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 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, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 687: 1542, 690: 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 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, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 687: 1541, 690: 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 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, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 687: 1540, 690: 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540}, + {1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 687: 1539, 690: 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539}, // 585 - {1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 668: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 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, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 668: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 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, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 668: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 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, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 668: 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485}, - {1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 668: 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484}, + {1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 687: 1538, 690: 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 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, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 687: 1537, 690: 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 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, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 687: 1536, 690: 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 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, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 687: 1535, 690: 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535}, + {1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 687: 1534, 690: 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534}, // 590 - {1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 668: 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 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, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 668: 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 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, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 668: 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 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, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 668: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480}, - {1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 668: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479}, + {1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 687: 1533, 690: 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 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, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 687: 1532, 690: 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 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, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 687: 1531, 690: 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 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, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 687: 1530, 690: 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530}, + {1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 687: 1529, 690: 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529}, // 595 - {1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 668: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 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, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 668: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 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, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 668: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 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, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 668: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475}, - {1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 668: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474}, + {1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 687: 1528, 690: 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 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, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 687: 1527, 690: 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 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, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 687: 1526, 690: 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 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, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 687: 1525, 690: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525}, + {1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 687: 1524, 690: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524}, // 600 - {1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 668: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 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, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 668: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 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, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 668: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 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, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 668: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470}, - {1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 668: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469}, + {1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 687: 1523, 690: 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 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, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 687: 1522, 690: 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 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, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 687: 1521, 690: 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 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, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 687: 1520, 690: 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520}, + {1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 687: 1519, 690: 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519}, // 605 - {1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 668: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 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, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 668: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 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, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 668: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 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, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 668: 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465}, - {1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 668: 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464}, + {1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 687: 1518, 690: 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 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, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 687: 1517, 690: 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 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, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 687: 1516, 690: 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 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, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 687: 1515, 690: 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515}, + {1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 687: 1514, 690: 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514}, // 610 - {1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 668: 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 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, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 668: 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 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, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 668: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 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, 1165, 1460, 1460, 1460, 1460, 1460, 483: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 492: 1460, 1460, 1460, 496: 1460, 1460, 499: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 509: 1460, 1460, 512: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 534: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 568: 1460, 1460, 597: 1460, 655: 1460, 659: 1460, 1460}, - {1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 668: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459}, + {1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 687: 1513, 690: 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 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, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 687: 1512, 690: 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 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, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 687: 1511, 690: 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 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, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 687: 1510, 690: 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510}, + {1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 687: 1509, 690: 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509}, // 615 - {1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 668: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 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, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 668: 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 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, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 668: 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 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, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 668: 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455}, - {1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 668: 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454}, + {1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 687: 1508, 690: 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 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, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 687: 1507, 690: 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 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, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 687: 1506, 690: 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 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, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 687: 1505, 690: 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505}, + {1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 687: 1504, 690: 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504}, // 620 - {1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 668: 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 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, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 668: 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 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, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 668: 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 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, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 668: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450}, - {1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 668: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449}, + {1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 687: 1503, 690: 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 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, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 687: 1502, 690: 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 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, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 687: 1501, 690: 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 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, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 687: 1500, 690: 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 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, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 687: 1499, 690: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499}, // 625 - {1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 668: 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 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, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 668: 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 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, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 668: 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 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, 4067, 1445, 1445, 1445, 1445, 1445, 483: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 492: 1445, 1445, 1445, 496: 1445, 1445, 499: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 509: 1445, 1445, 512: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 534: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 568: 1445, 1445, 597: 1445, 655: 1445, 659: 1445, 1445}, - {1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 668: 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444}, + {1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 687: 1498, 690: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 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, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 687: 1497, 690: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 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, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 687: 1496, 690: 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 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, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 687: 1495, 690: 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495}, + {1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 687: 1494, 690: 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494}, // 630 - {1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 668: 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 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, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 668: 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 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, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 668: 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 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, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 668: 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440}, - {1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 668: 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439}, + {1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 687: 1493, 690: 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 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, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1188, 1492, 1492, 1492, 497: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 508: 1492, 1492, 511: 1492, 1492, 1492, 516: 1492, 1492, 1492, 1492, 1492, 1492, 523: 1492, 1492, 526: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 550: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 584: 1492, 1492, 1492, 616: 1492, 672: 1492, 676: 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, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 687: 1491, 690: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 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, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 687: 1490, 690: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 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, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 687: 1489, 690: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489}, // 635 - {1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 668: 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 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, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 668: 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 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, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 668: 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 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, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 668: 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 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, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 668: 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434}, + {1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 687: 1488, 690: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 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, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 687: 1487, 690: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 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, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 687: 1486, 690: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 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, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 687: 1485, 690: 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485}, + {1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 687: 1484, 690: 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484}, // 640 - {1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 668: 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 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, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 668: 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 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, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 668: 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 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, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 668: 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 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, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 668: 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429}, + {1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 687: 1483, 690: 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 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, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 687: 1482, 690: 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 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, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 687: 1481, 690: 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 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, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 687: 1480, 690: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480}, + {1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 687: 1479, 690: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479}, // 645 - {1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 668: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 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, 1164, 1427, 1427, 1427, 1427, 1427, 483: 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 492: 1427, 1427, 1427, 496: 1427, 1427, 499: 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 509: 1427, 1427, 512: 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 534: 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 568: 1427, 1427, 597: 1427, 655: 1427, 659: 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, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 668: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 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, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 668: 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425}, - {1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 668: 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424}, + {1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 687: 1478, 690: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 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, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 687: 1477, 690: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 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, 4149, 1476, 1476, 1476, 497: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 508: 1476, 1476, 511: 1476, 1476, 1476, 516: 1476, 1476, 1476, 1476, 1476, 1476, 523: 1476, 1476, 526: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 550: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 584: 1476, 1476, 1476, 616: 1476, 672: 1476, 676: 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, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 687: 1475, 690: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475}, + {1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 687: 1474, 690: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474}, // 650 - {1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 668: 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 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, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 668: 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 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, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 668: 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 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, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 668: 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420}, - {1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 668: 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419}, + {1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 687: 1473, 690: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 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, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 687: 1472, 690: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 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, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 687: 1471, 690: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 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, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 687: 1470, 690: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470}, + {1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 687: 1469, 690: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469}, // 655 - {1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 668: 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 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, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 668: 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 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, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 668: 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 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, 4060, 1415, 1415, 1415, 1415, 1415, 483: 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 492: 1415, 1415, 1415, 496: 1415, 1415, 499: 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 509: 1415, 1415, 512: 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 534: 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 568: 1415, 1415, 597: 1415, 655: 1415, 659: 1415, 1415}, - {1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 4053, 1414, 1414, 1414, 1414, 1414, 483: 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 492: 1414, 1414, 1414, 496: 1414, 1414, 499: 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 509: 1414, 1414, 512: 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 534: 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 568: 1414, 1414, 597: 1414, 655: 1414, 659: 1414, 1414}, + {1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 687: 1468, 690: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 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, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 687: 1467, 690: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 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, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 687: 1466, 690: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 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, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 687: 1465, 690: 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465}, + {1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 687: 1464, 690: 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464}, // 660 - {1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 668: 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 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, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 668: 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 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, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 668: 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 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, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 668: 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410}, - {1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 668: 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409}, + {1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 687: 1463, 690: 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 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, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 687: 1462, 690: 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 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, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 687: 1461, 690: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 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, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 687: 1460, 690: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460}, + {1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 687: 1459, 690: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459}, // 665 - {1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 668: 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 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, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 668: 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 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, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 668: 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 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, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 668: 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405}, - {1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 668: 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404}, + {1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1187, 1458, 1458, 1458, 497: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 508: 1458, 1458, 511: 1458, 1458, 1458, 516: 1458, 1458, 1458, 1458, 1458, 1458, 523: 1458, 1458, 526: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 550: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 584: 1458, 1458, 1458, 616: 1458, 672: 1458, 676: 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, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 687: 1457, 690: 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 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, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 687: 1456, 690: 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 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, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 687: 1455, 690: 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455}, + {1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 687: 1454, 690: 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454}, // 670 - {1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 668: 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 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, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 668: 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 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, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 668: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 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, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 668: 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400}, - {1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 668: 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399}, + {1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 687: 1453, 690: 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 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, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 687: 1452, 690: 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 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, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 687: 1451, 690: 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 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, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 687: 1450, 690: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450}, + {1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 687: 1449, 690: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449}, // 675 - {1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 668: 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 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, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 668: 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 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, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 668: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 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, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 668: 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395}, - {1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 4033, 1394, 1394, 1394, 1394, 1394, 483: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 492: 1394, 1394, 1394, 496: 1394, 1394, 499: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 509: 1394, 1394, 512: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 534: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 568: 1394, 1394, 597: 1394, 655: 1394, 659: 1394, 1394}, + {1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 687: 1448, 690: 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 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, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 687: 1447, 690: 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 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, 4142, 1446, 1446, 1446, 497: 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 508: 1446, 1446, 511: 1446, 1446, 1446, 516: 1446, 1446, 1446, 1446, 1446, 1446, 523: 1446, 1446, 526: 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 550: 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 584: 1446, 1446, 1446, 616: 1446, 672: 1446, 676: 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, 4135, 1445, 1445, 1445, 497: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 508: 1445, 1445, 511: 1445, 1445, 1445, 516: 1445, 1445, 1445, 1445, 1445, 1445, 523: 1445, 1445, 526: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 550: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 584: 1445, 1445, 1445, 616: 1445, 672: 1445, 676: 1445, 1445}, + {1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 687: 1444, 690: 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444}, // 680 - {1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 4025, 1393, 1393, 1393, 1393, 1393, 483: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 492: 1393, 1393, 1393, 496: 1393, 1393, 499: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 509: 1393, 1393, 512: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 534: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 568: 1393, 1393, 597: 1393, 655: 1393, 659: 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, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 668: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 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, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 668: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 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, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 668: 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390}, - {1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 668: 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389}, + {1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 687: 1443, 690: 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 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, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 687: 1442, 690: 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 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, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 687: 1441, 690: 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 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, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 687: 1440, 690: 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440}, + {1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 687: 1439, 690: 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439}, // 685 - {1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 668: 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 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, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 668: 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 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, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 668: 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 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, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 668: 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385}, - {1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 668: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384}, + {1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 687: 1438, 690: 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 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, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 687: 1437, 690: 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 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, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 687: 1436, 690: 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 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, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 687: 1435, 690: 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 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, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 687: 1434, 690: 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434}, // 690 - {1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 668: 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 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, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 668: 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 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, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 668: 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 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, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 668: 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380}, - {1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 668: 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379}, + {1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 687: 1433, 690: 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 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, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 687: 1432, 690: 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 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, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 687: 1431, 690: 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 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, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 687: 1430, 690: 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 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, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 687: 1429, 690: 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429}, // 695 - {1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 668: 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 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, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 668: 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 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, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 668: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376}, - {1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 477: 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 499: 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 509: 1338, 1338, 512: 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 534: 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 568: 1338, 1338, 584: 1338, 593: 1338, 1338, 597: 1338, 645: 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, 477: 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 499: 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 509: 1337, 1337, 512: 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 534: 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 568: 1337, 1337, 584: 1337, 593: 1337, 1337, 597: 1337, 645: 1337, 1337, 1337, 1337}, + {1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 687: 1428, 690: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 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, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 687: 1427, 690: 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 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, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 687: 1426, 690: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 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, 4115, 1425, 1425, 1425, 497: 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 508: 1425, 1425, 511: 1425, 1425, 1425, 516: 1425, 1425, 1425, 1425, 1425, 1425, 523: 1425, 1425, 526: 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 550: 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 584: 1425, 1425, 1425, 616: 1425, 672: 1425, 676: 1425, 1425}, + {1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 4107, 1424, 1424, 1424, 497: 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 508: 1424, 1424, 511: 1424, 1424, 1424, 516: 1424, 1424, 1424, 1424, 1424, 1424, 523: 1424, 1424, 526: 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 550: 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 584: 1424, 1424, 1424, 616: 1424, 672: 1424, 676: 1424, 1424}, // 700 - {1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 477: 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 499: 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 509: 1336, 1336, 512: 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 534: 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 568: 1336, 1336, 584: 1336, 593: 1336, 1336, 597: 1336, 645: 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, 477: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 499: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 509: 1335, 1335, 512: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 534: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 568: 1335, 1335, 584: 1335, 593: 1335, 1335, 597: 1335, 645: 1335, 1335, 1335, 1335}, - {1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 477: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 499: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 509: 1334, 1334, 512: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 534: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 568: 1334, 1334, 584: 1334, 593: 1334, 1334, 597: 1334, 645: 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, 477: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 499: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 509: 1333, 1333, 512: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 534: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 568: 1333, 1333, 584: 1333, 593: 1333, 1333, 597: 1333, 645: 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, 477: 1332, 4024, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 499: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 509: 1332, 1332, 512: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 534: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 568: 1332, 1332, 584: 1332, 593: 1332, 1332, 597: 1332, 645: 1332, 1332, 1332, 1332}, + {1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 687: 1423, 690: 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 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, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 687: 1422, 690: 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 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, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 687: 1421, 690: 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 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, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 687: 1420, 690: 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420}, + {1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 687: 1419, 690: 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419}, // 705 - {478: 4021, 579: 4022, 583: 4023}, - {1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 477: 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 499: 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 509: 1330, 1330, 512: 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 534: 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 568: 1330, 1330, 584: 1330, 593: 1330, 1330, 597: 1330, 645: 1330, 1330, 1330, 1330}, - {1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 477: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 499: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 509: 1329, 1329, 512: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 534: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 568: 1329, 1329, 584: 1329, 593: 1329, 1329, 597: 1329, 645: 1329, 1329, 1329, 1329}, - {1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 477: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 499: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 509: 1326, 1326, 512: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 534: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 568: 1326, 1326, 584: 1326, 593: 1326, 1326, 597: 1326, 645: 1326, 1326, 1326, 1326}, - {1321, 1321, 9: 3438, 50: 1321, 128: 1321, 475: 1321, 477: 1321, 483: 1321, 1321, 493: 1321, 1321, 496: 1321, 1321, 499: 1321, 1321, 504: 1321}, + {1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 687: 1418, 690: 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 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, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 687: 1417, 690: 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 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, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 687: 1416, 690: 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 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, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 687: 1415, 690: 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415}, + {1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 687: 1414, 690: 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414}, // 710 - {1320, 1320, 9: 1320, 50: 1320, 128: 1320, 475: 1320, 477: 1320, 483: 1320, 1320, 493: 1320, 1320, 496: 1320, 1320, 499: 1320, 1320, 504: 1320, 1320, 517: 1320, 519: 1320, 527: 1320, 530: 1320, 1320}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 1240, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4019}, - {1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 477: 1294, 1294, 1294, 1294, 1294, 483: 1294, 1294, 1294, 1294, 3376, 1294, 1294, 1294, 492: 1294, 1294, 1294, 496: 1294, 1294, 499: 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 509: 1294, 1294, 512: 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 534: 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 568: 1294, 1294, 597: 3377}, - {1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 477: 1293, 1293, 1293, 1293, 1293, 483: 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 492: 1293, 1293, 1293, 496: 1293, 1293, 499: 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 509: 1293, 1293, 512: 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 534: 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 568: 1293, 1293, 597: 1293, 655: 4014, 659: 1293, 1293}, - {1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 477: 1290, 1290, 1290, 1290, 1290, 483: 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 492: 1290, 1290, 1290, 496: 1290, 1290, 499: 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 509: 1290, 1290, 512: 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 534: 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 568: 1290, 1290, 597: 1290, 659: 4010, 4011}, + {1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 687: 1413, 690: 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 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, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 687: 1412, 690: 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 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, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 687: 1411, 690: 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 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, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 687: 1410, 690: 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410}, + {1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 687: 1409, 690: 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409}, // 715 - {1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 477: 1289, 1289, 1289, 1289, 1289, 483: 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 492: 1289, 1289, 1289, 496: 1289, 1289, 499: 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 509: 1289, 1289, 512: 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 534: 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 568: 1289, 1289, 597: 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, 477: 1288, 1288, 1288, 1288, 1288, 483: 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 492: 1288, 1288, 1288, 496: 1288, 1288, 499: 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 509: 1288, 1288, 512: 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 534: 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 568: 1288, 1288, 597: 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, 477: 1287, 1287, 1287, 1287, 1287, 483: 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 492: 1287, 1287, 1287, 496: 1287, 1287, 499: 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 509: 1287, 1287, 512: 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 534: 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 568: 1287, 1287, 597: 1287}, - {1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 477: 1285, 1285, 1285, 1285, 1285, 483: 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 492: 1285, 1285, 1285, 496: 1285, 1285, 499: 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 509: 1285, 1285, 512: 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 534: 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 568: 1285, 1285, 597: 1285}, - {1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 477: 1284, 1284, 1284, 1284, 1284, 483: 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 492: 1284, 1284, 1284, 496: 1284, 1284, 499: 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 509: 1284, 1284, 512: 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 534: 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 568: 1284, 1284, 597: 1284}, + {1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 687: 1408, 690: 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 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, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 687: 1407, 690: 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 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, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 687: 1406, 690: 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 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, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 687: 1405, 690: 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405}, + {1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 687: 1404, 690: 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404}, // 720 - {1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 477: 1283, 1283, 1283, 1283, 1283, 483: 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 492: 1283, 1283, 1283, 496: 1283, 1283, 499: 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 509: 1283, 1283, 512: 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 534: 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 568: 1283, 1283, 597: 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, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 477: 1282, 1282, 1282, 1282, 1282, 483: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 492: 1282, 1282, 1282, 496: 1282, 1282, 499: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 509: 1282, 1282, 512: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 534: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 568: 1282, 1282, 597: 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, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 477: 1281, 1281, 1281, 1281, 1281, 483: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 492: 1281, 1281, 1281, 496: 1281, 1281, 499: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 509: 1281, 1281, 512: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 534: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 568: 1281, 1281, 597: 1281}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3374, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 4009, 3279, 3360, 3278, 3275}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3374, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 4008, 3279, 3360, 3278, 3275}, + {1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 687: 1403, 690: 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 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, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 687: 1402, 690: 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 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, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 687: 1401, 690: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401}, + {1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 493: 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 516: 1363, 1363, 1363, 1363, 1363, 1363, 523: 1363, 1363, 526: 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 550: 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 584: 1363, 1363, 1363, 600: 1363, 607: 1363, 613: 1363, 616: 1363, 662: 1363, 1363, 1363, 666: 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, 493: 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 516: 1362, 1362, 1362, 1362, 1362, 1362, 523: 1362, 1362, 526: 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 550: 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 584: 1362, 1362, 1362, 600: 1362, 607: 1362, 613: 1362, 616: 1362, 662: 1362, 1362, 1362, 666: 1362}, // 725 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3374, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 4007, 3279, 3360, 3278, 3275}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3374, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 4006, 3279, 3360, 3278, 3275}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3374, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 4005, 3279, 3360, 3278, 3275}, - {1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 477: 1274, 1274, 1274, 1274, 1274, 483: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 492: 1274, 1274, 1274, 496: 1274, 1274, 499: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 509: 1274, 1274, 512: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 534: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 568: 1274, 1274, 597: 1274}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 2607, 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3905, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 2605, 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 649: 2601, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3904, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3902, 752: 3907, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 3906, 3909, 3908, 782: 3903}, + {1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 493: 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 516: 1361, 1361, 1361, 1361, 1361, 1361, 523: 1361, 1361, 526: 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 550: 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 584: 1361, 1361, 1361, 600: 1361, 607: 1361, 613: 1361, 616: 1361, 662: 1361, 1361, 1361, 666: 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, 493: 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 516: 1360, 1360, 1360, 1360, 1360, 1360, 523: 1360, 1360, 526: 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 550: 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 584: 1360, 1360, 1360, 600: 1360, 607: 1360, 613: 1360, 616: 1360, 662: 1360, 1360, 1360, 666: 1360}, + {1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 493: 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 516: 1359, 1359, 1359, 1359, 1359, 1359, 523: 1359, 1359, 526: 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 550: 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 584: 1359, 1359, 1359, 600: 1359, 607: 1359, 613: 1359, 616: 1359, 662: 1359, 1359, 1359, 666: 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, 493: 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 516: 1358, 1358, 1358, 1358, 1358, 1358, 523: 1358, 1358, 526: 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 550: 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 584: 1358, 1358, 1358, 600: 1358, 607: 1358, 613: 1358, 616: 1358, 662: 1358, 1358, 1358, 666: 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, 493: 1357, 4106, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 516: 1357, 1357, 1357, 1357, 1357, 1357, 523: 1357, 1357, 526: 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 550: 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 584: 1357, 1357, 1357, 600: 1357, 607: 1357, 613: 1357, 616: 1357, 662: 1357, 1357, 1357, 666: 1357}, // 730 - {476: 3897}, - {476: 2608, 713: 3896}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3893, 2785, 2786, 2784}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3374, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3892, 3279, 3360, 3278, 3275}, - {476: 3887}, + {494: 4103, 596: 4104, 598: 4105}, + {1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 493: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 516: 1355, 1355, 1355, 1355, 1355, 1355, 523: 1355, 1355, 526: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 550: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 584: 1355, 1355, 1355, 600: 1355, 607: 1355, 613: 1355, 616: 1355, 662: 1355, 1355, 1355, 666: 1355}, + {1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 493: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 516: 1354, 1354, 1354, 1354, 1354, 1354, 523: 1354, 1354, 526: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 550: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 584: 1354, 1354, 1354, 600: 1354, 607: 1354, 613: 1354, 616: 1354, 662: 1354, 1354, 1354, 666: 1354}, + {1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 493: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 516: 1351, 1351, 1351, 1351, 1351, 1351, 523: 1351, 1351, 526: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 550: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 584: 1351, 1351, 1351, 600: 1351, 607: 1351, 613: 1351, 616: 1351, 662: 1351, 1351, 1351, 666: 1351}, + {1346, 1346, 9: 3518, 58: 1346, 137: 1346, 491: 1346, 493: 1346, 500: 1346, 1346, 509: 1346, 511: 1346, 1346, 1346, 516: 1346, 1346, 521: 1346}, // 735 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 546: 1094, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3874, 1218: 3875}, - {476: 3816}, - {476: 3813}, - {476: 3805}, - {476: 1244}, + {1345, 1345, 9: 1345, 58: 1345, 137: 1345, 491: 1345, 493: 1345, 500: 1345, 1345, 509: 1345, 511: 1345, 1345, 1345, 516: 1345, 1345, 521: 1345, 523: 1345, 533: 1345, 535: 1345, 543: 1345, 546: 1345, 1345}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 1263, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4101}, + {1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 493: 1319, 1319, 1319, 497: 1319, 1319, 3456, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 508: 1319, 1319, 511: 1319, 1319, 1319, 516: 1319, 1319, 1319, 1319, 1319, 1319, 523: 1319, 1319, 526: 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 550: 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 584: 1319, 1319, 1319, 616: 3457}, + {1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 493: 1318, 1318, 1318, 497: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 508: 1318, 1318, 511: 1318, 1318, 1318, 516: 1318, 1318, 1318, 1318, 1318, 1318, 523: 1318, 1318, 526: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 550: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 584: 1318, 1318, 1318, 616: 1318, 672: 4096, 676: 1318, 1318}, + {1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 493: 1315, 1315, 1315, 497: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 508: 1315, 1315, 511: 1315, 1315, 1315, 516: 1315, 1315, 1315, 1315, 1315, 1315, 523: 1315, 1315, 526: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 550: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 584: 1315, 1315, 1315, 616: 1315, 676: 4092, 4093}, // 740 - {476: 1241}, - {476: 1238}, - {476: 1234}, - {476: 1232}, - {476: 1231}, + {1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 493: 1314, 1314, 1314, 497: 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 508: 1314, 1314, 511: 1314, 1314, 1314, 516: 1314, 1314, 1314, 1314, 1314, 1314, 523: 1314, 1314, 526: 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 550: 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 584: 1314, 1314, 1314, 616: 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, 493: 1313, 1313, 1313, 497: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 508: 1313, 1313, 511: 1313, 1313, 1313, 516: 1313, 1313, 1313, 1313, 1313, 1313, 523: 1313, 1313, 526: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 550: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 584: 1313, 1313, 1313, 616: 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, 493: 1312, 1312, 1312, 497: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 508: 1312, 1312, 511: 1312, 1312, 1312, 516: 1312, 1312, 1312, 1312, 1312, 1312, 523: 1312, 1312, 526: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 550: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 584: 1312, 1312, 1312, 616: 1312}, + {1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 493: 1310, 1310, 1310, 497: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 508: 1310, 1310, 511: 1310, 1310, 1310, 516: 1310, 1310, 1310, 1310, 1310, 1310, 523: 1310, 1310, 526: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 550: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 584: 1310, 1310, 1310, 616: 1310}, + {1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 493: 1309, 1309, 1309, 497: 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 508: 1309, 1309, 511: 1309, 1309, 1309, 516: 1309, 1309, 1309, 1309, 1309, 1309, 523: 1309, 1309, 526: 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 550: 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 584: 1309, 1309, 1309, 616: 1309}, // 745 - {476: 1229}, - {1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 483: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 492: 1218, 1218, 1218, 496: 1218, 1218, 499: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 509: 1218, 1218, 512: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 534: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 568: 1218, 1218, 597: 1218}, - {1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 483: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 492: 1217, 1217, 1217, 496: 1217, 1217, 499: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 509: 1217, 1217, 512: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 534: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 568: 1217, 1217, 597: 1217}, - {1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 483: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 492: 1216, 1216, 1216, 496: 1216, 1216, 499: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 509: 1216, 1216, 512: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 534: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 568: 1216, 1216, 597: 1216}, - {1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 483: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 492: 1215, 1215, 1215, 496: 1215, 1215, 499: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 509: 1215, 1215, 512: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 534: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 568: 1215, 1215, 597: 1215}, + {1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 493: 1308, 1308, 1308, 497: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 508: 1308, 1308, 511: 1308, 1308, 1308, 516: 1308, 1308, 1308, 1308, 1308, 1308, 523: 1308, 1308, 526: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 550: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 584: 1308, 1308, 1308, 616: 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, 493: 1307, 1307, 1307, 497: 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 508: 1307, 1307, 511: 1307, 1307, 1307, 516: 1307, 1307, 1307, 1307, 1307, 1307, 523: 1307, 1307, 526: 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 550: 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 584: 1307, 1307, 1307, 616: 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, 493: 1306, 1306, 1306, 497: 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 508: 1306, 1306, 511: 1306, 1306, 1306, 516: 1306, 1306, 1306, 1306, 1306, 1306, 523: 1306, 1306, 526: 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 550: 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 584: 1306, 1306, 1306, 616: 1306}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3454, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 4091, 3359, 3440, 3358, 3355}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3454, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 4090, 3359, 3440, 3358, 3355}, // 750 - {1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 483: 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 492: 1214, 1214, 1214, 496: 1214, 1214, 499: 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 509: 1214, 1214, 512: 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 534: 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 568: 1214, 1214, 597: 1214}, - {1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 483: 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 492: 1213, 1213, 1213, 496: 1213, 1213, 499: 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 509: 1213, 1213, 512: 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 534: 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 568: 1213, 1213, 597: 1213}, - {1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 483: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 492: 1212, 1212, 1212, 496: 1212, 1212, 499: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 509: 1212, 1212, 512: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 534: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 568: 1212, 1212, 597: 1212}, - {1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 483: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 492: 1211, 1211, 1211, 496: 1211, 1211, 499: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 509: 1211, 1211, 512: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 534: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 568: 1211, 1211, 597: 1211}, - {1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 483: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 492: 1210, 1210, 1210, 496: 1210, 1210, 499: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 509: 1210, 1210, 512: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 534: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 568: 1210, 1210, 597: 1210}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3454, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 4089, 3359, 3440, 3358, 3355}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3454, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 4088, 3359, 3440, 3358, 3355}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3454, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 4087, 3359, 3440, 3358, 3355}, + {1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 493: 1299, 1299, 1299, 497: 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 508: 1299, 1299, 511: 1299, 1299, 1299, 516: 1299, 1299, 1299, 1299, 1299, 1299, 523: 1299, 1299, 526: 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 550: 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 584: 1299, 1299, 1299, 616: 1299}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 2662, 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3987, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 2660, 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 665: 2656, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3986, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3984, 770: 3989, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 3988, 3991, 3990, 801: 3985}, // 755 - {1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 483: 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 492: 1209, 1209, 1209, 496: 1209, 1209, 499: 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 509: 1209, 1209, 512: 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 534: 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 568: 1209, 1209, 597: 1209}, - {1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 483: 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 492: 1208, 1208, 1208, 496: 1208, 1208, 499: 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 509: 1208, 1208, 512: 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 534: 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 568: 1208, 1208, 597: 1208}, - {476: 3802}, - {476: 3799}, - {1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 3796, 1220, 1220, 1220, 1220, 1220, 483: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 492: 1220, 1220, 1220, 496: 1220, 1220, 499: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 509: 1220, 1220, 512: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 534: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 568: 1220, 1220, 597: 1220, 1100: 3797}, + {492: 3979}, + {492: 2663, 731: 3978}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 3975, 2849, 688: 2850, 2848}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3454, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3974, 3359, 3440, 3358, 3355}, + {492: 3967}, // 760 - {476: 3794}, - {1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 3790, 1126, 1126, 1126, 1126, 1126, 483: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 492: 1126, 1126, 1126, 496: 1126, 1126, 499: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 509: 1126, 1126, 512: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 534: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 568: 1126, 1126, 597: 1126, 1231: 3789}, - {476: 3781}, - {476: 3777}, - {476: 3772}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 562: 1117, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3954, 1243: 3955}, + {492: 3896}, + {492: 3893}, + {492: 3885}, + {492: 1267}, // 765 - {476: 3769}, - {476: 3764}, - {476: 3755}, - {476: 3748}, - {476: 3743}, + {492: 1264}, + {492: 1261}, + {492: 1257}, + {492: 1255}, + {492: 1254}, // 770 - {476: 3706}, - {476: 3692}, - {476: 3675}, - {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 477: 1173, 1173, 1173, 1173, 1173, 483: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 492: 1173, 1173, 1173, 496: 1173, 1173, 499: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 509: 1173, 1173, 512: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 534: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 597: 1173}, - {476: 3668}, + {492: 1252}, + {1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 497: 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 508: 1241, 1241, 511: 1241, 1241, 1241, 516: 1241, 1241, 1241, 1241, 1241, 1241, 523: 1241, 1241, 526: 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 550: 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 584: 1241, 1241, 1241, 616: 1241}, + {1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 497: 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 508: 1240, 1240, 511: 1240, 1240, 1240, 516: 1240, 1240, 1240, 1240, 1240, 1240, 523: 1240, 1240, 526: 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 550: 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 584: 1240, 1240, 1240, 616: 1240}, + {1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 497: 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 508: 1239, 1239, 511: 1239, 1239, 1239, 516: 1239, 1239, 1239, 1239, 1239, 1239, 523: 1239, 1239, 526: 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 550: 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 584: 1239, 1239, 1239, 616: 1239}, + {1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 497: 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 508: 1238, 1238, 511: 1238, 1238, 1238, 516: 1238, 1238, 1238, 1238, 1238, 1238, 523: 1238, 1238, 526: 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 550: 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 584: 1238, 1238, 1238, 616: 1238}, // 775 - {476: 1167}, - {476: 1166}, - {1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 477: 1158, 1158, 1158, 1158, 1158, 483: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 492: 1158, 1158, 1158, 496: 1158, 1158, 499: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 509: 1158, 1158, 512: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 534: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 568: 1158, 1158, 597: 1158}, - {476: 3665}, - {476: 3662}, + {1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 497: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 508: 1237, 1237, 511: 1237, 1237, 1237, 516: 1237, 1237, 1237, 1237, 1237, 1237, 523: 1237, 1237, 526: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 550: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 584: 1237, 1237, 1237, 616: 1237}, + {1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 497: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 508: 1236, 1236, 511: 1236, 1236, 1236, 516: 1236, 1236, 1236, 1236, 1236, 1236, 523: 1236, 1236, 526: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 550: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 584: 1236, 1236, 1236, 616: 1236}, + {1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 497: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 508: 1235, 1235, 511: 1235, 1235, 1235, 516: 1235, 1235, 1235, 1235, 1235, 1235, 523: 1235, 1235, 526: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 550: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 584: 1235, 1235, 1235, 616: 1235}, + {1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 497: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 508: 1234, 1234, 511: 1234, 1234, 1234, 516: 1234, 1234, 1234, 1234, 1234, 1234, 523: 1234, 1234, 526: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 550: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 584: 1234, 1234, 1234, 616: 1234}, + {1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 497: 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 508: 1233, 1233, 511: 1233, 1233, 1233, 516: 1233, 1233, 1233, 1233, 1233, 1233, 523: 1233, 1233, 526: 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 550: 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 584: 1233, 1233, 1233, 616: 1233}, // 780 - {476: 3654}, - {476: 3646}, - {476: 3638}, - {476: 3624}, - {476: 3612}, + {1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 497: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 508: 1232, 1232, 511: 1232, 1232, 1232, 516: 1232, 1232, 1232, 1232, 1232, 1232, 523: 1232, 1232, 526: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 550: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 584: 1232, 1232, 1232, 616: 1232}, + {1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 497: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 508: 1231, 1231, 511: 1231, 1231, 1231, 516: 1231, 1231, 1231, 1231, 1231, 1231, 523: 1231, 1231, 526: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 550: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 584: 1231, 1231, 1231, 616: 1231}, + {492: 3882}, + {492: 3879}, + {1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 3876, 1243, 1243, 1243, 497: 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 508: 1243, 1243, 511: 1243, 1243, 1243, 516: 1243, 1243, 1243, 1243, 1243, 1243, 523: 1243, 1243, 526: 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 550: 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 584: 1243, 1243, 1243, 616: 1243, 1123: 3877}, // 785 - {476: 3607}, - {476: 3602}, - {476: 3597}, - {476: 3592}, - {476: 3587}, + {492: 3874}, + {1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 3870, 1149, 1149, 1149, 497: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 508: 1149, 1149, 511: 1149, 1149, 1149, 516: 1149, 1149, 1149, 1149, 1149, 1149, 523: 1149, 1149, 526: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 550: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 584: 1149, 1149, 1149, 616: 1149, 1256: 3869}, + {492: 3861}, + {492: 3857}, + {492: 3852}, // 790 - {476: 3582}, - {476: 3569}, - {476: 3566}, - {476: 3563}, - {476: 3560}, + {492: 3849}, + {492: 3844}, + {492: 3835}, + {492: 3828}, + {492: 3823}, // 795 - {476: 3557}, - {476: 3554}, - {476: 3550}, - {476: 3544}, - {476: 3531}, + {492: 3786}, + {492: 3772}, + {492: 3755}, + {1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 493: 1196, 1196, 1196, 497: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 508: 1196, 1196, 511: 1196, 1196, 1196, 516: 1196, 1196, 1196, 1196, 1196, 1196, 523: 1196, 1196, 526: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 550: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 584: 1196, 1196, 1196, 616: 1196}, + {492: 3748}, // 800 - {476: 3526}, - {476: 3521}, - {476: 3363}, - {765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 477: 765, 765, 765, 765, 765, 483: 765, 765, 765, 765, 765, 765, 765, 765, 492: 765, 765, 765, 496: 765, 765, 499: 765, 765, 765, 765, 765, 765, 765, 765, 509: 765, 765, 512: 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 534: 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 568: 765, 765, 597: 765}, - {764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 477: 764, 764, 764, 764, 764, 483: 764, 764, 764, 764, 764, 764, 764, 764, 492: 764, 764, 764, 496: 764, 764, 499: 764, 764, 764, 764, 764, 764, 764, 764, 509: 764, 764, 512: 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 534: 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 568: 764, 764, 597: 764}, + {492: 1190}, + {492: 1189}, + {1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 493: 1181, 1181, 1181, 497: 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 508: 1181, 1181, 511: 1181, 1181, 1181, 516: 1181, 1181, 1181, 1181, 1181, 1181, 523: 1181, 1181, 526: 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 550: 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 584: 1181, 1181, 1181, 616: 1181}, + {492: 3745}, + {492: 3742}, // 805 - {763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 477: 763, 763, 763, 763, 763, 483: 763, 763, 763, 763, 763, 763, 763, 763, 492: 763, 763, 763, 496: 763, 763, 499: 763, 763, 763, 763, 763, 763, 763, 763, 509: 763, 763, 512: 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 534: 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 568: 763, 763, 597: 763}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3364}, - {9: 3372, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3520}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3519}, + {492: 3734}, + {492: 3726}, + {492: 3718}, + {492: 3704}, + {492: 3692}, // 810 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3518}, - {2: 1944, 1944, 1944, 1944, 1944, 1944, 1944, 10: 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 51: 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 476: 1944, 478: 1944, 1944, 1944, 482: 1944, 485: 1944, 1944, 488: 1944, 1944, 1944, 495: 1944, 498: 1944, 507: 1944, 1944, 511: 1944, 533: 1944, 567: 1944, 570: 1944, 1944, 573: 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 585: 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 595: 1944, 1944, 598: 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 651: 1944}, - {2: 1943, 1943, 1943, 1943, 1943, 1943, 1943, 10: 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 51: 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 476: 1943, 478: 1943, 1943, 1943, 482: 1943, 485: 1943, 1943, 488: 1943, 1943, 1943, 495: 1943, 498: 1943, 507: 1943, 1943, 511: 1943, 533: 1943, 567: 1943, 570: 1943, 1943, 573: 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 585: 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 595: 1943, 1943, 598: 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 651: 1943}, - {2: 1942, 1942, 1942, 1942, 1942, 1942, 1942, 10: 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 51: 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 476: 1942, 478: 1942, 1942, 1942, 482: 1942, 485: 1942, 1942, 488: 1942, 1942, 1942, 495: 1942, 498: 1942, 507: 1942, 1942, 511: 1942, 533: 1942, 567: 1942, 570: 1942, 1942, 573: 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 585: 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 595: 1942, 1942, 598: 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 651: 1942}, - {2: 1941, 1941, 1941, 1941, 1941, 1941, 1941, 10: 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 51: 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 476: 1941, 478: 1941, 1941, 1941, 482: 1941, 485: 1941, 1941, 488: 1941, 1941, 1941, 495: 1941, 498: 1941, 507: 1941, 1941, 511: 1941, 533: 1941, 567: 1941, 570: 1941, 1941, 573: 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 585: 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 595: 1941, 1941, 598: 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 651: 1941}, + {492: 3687}, + {492: 3682}, + {492: 3677}, + {492: 3672}, + {492: 3667}, // 815 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3374, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3373, 3279, 3360, 3278, 3275}, - {50: 3378, 487: 3376, 597: 3377}, - {476: 1240}, - {762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 477: 762, 762, 762, 762, 762, 483: 762, 762, 762, 762, 762, 762, 762, 762, 492: 762, 762, 762, 496: 762, 762, 499: 762, 762, 762, 762, 762, 762, 762, 762, 509: 762, 762, 512: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 534: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 568: 762, 762, 597: 762}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 533: 3515, 664: 3517, 2785, 2786, 2784, 742: 3514, 876: 3513}, + {492: 3662}, + {492: 3649}, + {492: 3646}, + {492: 3643}, + {492: 3640}, // 820 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3374, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3512, 3279, 3360, 3278, 3275}, - {149: 949, 492: 949, 503: 3380, 746: 949, 1273: 3379}, - {149: 3384, 492: 3385, 746: 952, 889: 3383}, - {10: 3381, 185: 3382}, - {149: 948, 492: 948, 746: 948}, + {492: 3637}, + {492: 3634}, + {492: 3630}, + {492: 3624}, + {492: 3611}, // 825 - {149: 947, 492: 947, 746: 947}, - {746: 3388, 751: 3389}, - {276: 3387}, - {276: 3386}, - {746: 950}, + {492: 3606}, + {492: 3601}, + {492: 3443}, + {788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 493: 788, 788, 788, 497: 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 508: 788, 788, 511: 788, 788, 788, 516: 788, 788, 788, 788, 788, 788, 523: 788, 788, 526: 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 550: 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 584: 788, 788, 788, 616: 788}, + {787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 493: 787, 787, 787, 497: 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 508: 787, 787, 511: 787, 787, 787, 516: 787, 787, 787, 787, 787, 787, 523: 787, 787, 526: 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 550: 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 584: 787, 787, 787, 616: 787}, // 830 - {746: 951}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 3427, 664: 3426, 2785, 2786, 2784, 928: 3429, 1171: 3430, 1359: 3428}, - {958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 477: 958, 958, 958, 958, 958, 483: 958, 958, 958, 958, 958, 958, 958, 958, 492: 958, 958, 958, 496: 958, 958, 499: 958, 958, 958, 958, 958, 958, 958, 958, 509: 958, 958, 512: 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 534: 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 568: 958, 958, 597: 958}, - {1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 668: 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849}, - {1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 668: 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843}, + {786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 493: 786, 786, 786, 497: 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 508: 786, 786, 511: 786, 786, 786, 516: 786, 786, 786, 786, 786, 786, 523: 786, 786, 526: 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 550: 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 584: 786, 786, 786, 616: 786}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3444}, + {9: 3452, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3600}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3599}, // 835 - {1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 668: 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831}, - {1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 668: 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820}, - {1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 668: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809}, - {1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 668: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807}, - {1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 668: 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3598}, + {2: 1986, 1986, 1986, 1986, 1986, 1986, 1986, 10: 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 59: 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 492: 1986, 494: 1986, 1986, 1986, 1986, 502: 1986, 1986, 1986, 1986, 1986, 510: 1986, 514: 1986, 1986, 522: 1986, 525: 1986, 549: 1986, 583: 1986, 587: 1986, 589: 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 601: 1986, 1986, 1986, 1986, 1986, 1986, 608: 1986, 1986, 1986, 1986, 1986, 614: 1986, 1986, 617: 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 669: 1986}, + {2: 1985, 1985, 1985, 1985, 1985, 1985, 1985, 10: 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 59: 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 492: 1985, 494: 1985, 1985, 1985, 1985, 502: 1985, 1985, 1985, 1985, 1985, 510: 1985, 514: 1985, 1985, 522: 1985, 525: 1985, 549: 1985, 583: 1985, 587: 1985, 589: 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 601: 1985, 1985, 1985, 1985, 1985, 1985, 608: 1985, 1985, 1985, 1985, 1985, 614: 1985, 1985, 617: 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 669: 1985}, + {2: 1984, 1984, 1984, 1984, 1984, 1984, 1984, 10: 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 59: 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 492: 1984, 494: 1984, 1984, 1984, 1984, 502: 1984, 1984, 1984, 1984, 1984, 510: 1984, 514: 1984, 1984, 522: 1984, 525: 1984, 549: 1984, 583: 1984, 587: 1984, 589: 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 601: 1984, 1984, 1984, 1984, 1984, 1984, 608: 1984, 1984, 1984, 1984, 1984, 614: 1984, 1984, 617: 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 669: 1984}, + {2: 1983, 1983, 1983, 1983, 1983, 1983, 1983, 10: 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 59: 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 492: 1983, 494: 1983, 1983, 1983, 1983, 502: 1983, 1983, 1983, 1983, 1983, 510: 1983, 514: 1983, 1983, 522: 1983, 525: 1983, 549: 1983, 583: 1983, 587: 1983, 589: 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 601: 1983, 1983, 1983, 1983, 1983, 1983, 608: 1983, 1983, 1983, 1983, 1983, 614: 1983, 1983, 617: 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 669: 1983}, // 840 - {1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 668: 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778}, - {1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 668: 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768}, - {1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 668: 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743}, - {1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 668: 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742}, - {1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 668: 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3454, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3453, 3359, 3440, 3358, 3355}, + {58: 3458, 499: 3456, 616: 3457}, + {492: 1263}, + {785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 493: 785, 785, 785, 497: 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 508: 785, 785, 511: 785, 785, 785, 516: 785, 785, 785, 785, 785, 785, 523: 785, 785, 526: 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 550: 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 584: 785, 785, 785, 616: 785}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 549: 3595, 685: 3597, 2849, 688: 2850, 2848, 760: 3594, 894: 3593}, // 845 - {1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 668: 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734}, - {1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 668: 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732}, - {1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 668: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731}, - {1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 668: 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728}, - {1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 668: 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3454, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3592, 3359, 3440, 3358, 3355}, + {158: 972, 508: 972, 520: 3460, 764: 972, 1298: 3459}, + {158: 3464, 508: 3465, 764: 975, 908: 3463}, + {10: 3461, 194: 3462}, + {158: 971, 508: 971, 764: 971}, // 850 - {1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 668: 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713}, - {1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 668: 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690}, - {1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 668: 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673}, - {1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 668: 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672}, - {1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 668: 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671}, + {158: 970, 508: 970, 764: 970}, + {764: 3468, 769: 3469}, + {287: 3467}, + {287: 3466}, + {764: 973}, // 855 - {1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 668: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667}, - {1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 668: 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666}, - {1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 668: 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660}, - {1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 668: 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 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, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 668: 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550}, + {764: 974}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 3507, 685: 3506, 2849, 688: 2850, 2848, 948: 3509, 1196: 3510, 1384: 3508}, + {981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 493: 981, 981, 981, 497: 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 508: 981, 981, 511: 981, 981, 981, 516: 981, 981, 981, 981, 981, 981, 523: 981, 981, 526: 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 550: 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 584: 981, 981, 981, 616: 981}, + {1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 687: 1890, 690: 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890}, + {1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 687: 1884, 690: 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884}, // 860 - {1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 668: 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 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, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 668: 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548}, - {1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 668: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460}, - {1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 668: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445}, - {1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 668: 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427}, + {1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 687: 1872, 690: 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872}, + {1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 687: 1861, 690: 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861}, + {1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 687: 1850, 690: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850}, + {1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 687: 1848, 690: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848}, + {1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 687: 1825, 690: 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825}, // 865 - {1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 668: 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415}, - {1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 668: 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414}, - {1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 668: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 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, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 668: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393}, - {1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 477: 1000, 1000, 1000, 1000, 1000, 483: 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 496: 1000, 1000, 499: 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 509: 1000, 1000, 512: 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 534: 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 568: 1000, 1000, 597: 1000}, + {1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 687: 1819, 690: 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819}, + {1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 687: 1809, 690: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809}, + {1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 687: 1783, 690: 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783}, + {1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 687: 1782, 690: 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782}, + {1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 687: 1779, 690: 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779}, // 870 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 997, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 491: 997, 505: 997, 527: 997, 530: 997, 997, 664: 3426, 2785, 2786, 2784, 928: 3433, 1272: 3432, 1360: 3431}, - {971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 477: 971, 971, 971, 971, 971, 483: 971, 971, 971, 971, 971, 971, 971, 971, 492: 971, 971, 971, 496: 971, 971, 499: 971, 971, 971, 971, 971, 971, 971, 971, 509: 971, 971, 512: 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 534: 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 568: 971, 971, 597: 971}, - {970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 477: 970, 970, 970, 970, 970, 483: 970, 970, 970, 970, 970, 970, 970, 970, 492: 970, 970, 970, 496: 970, 970, 499: 970, 970, 970, 970, 970, 970, 970, 970, 509: 970, 970, 512: 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 534: 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 568: 970, 970, 597: 970}, - {969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 477: 969, 969, 969, 969, 969, 483: 969, 969, 969, 969, 969, 969, 969, 969, 492: 969, 969, 969, 496: 969, 969, 499: 969, 969, 969, 969, 969, 969, 969, 969, 509: 969, 969, 512: 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 534: 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 568: 969, 969, 597: 969}, - {50: 3511}, + {1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 687: 1774, 690: 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774}, + {1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 687: 1772, 690: 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772}, + {1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 687: 1771, 690: 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771}, + {1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 687: 1768, 690: 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768}, + {1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 687: 1766, 690: 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766}, // 875 - {50: 995, 491: 3435, 505: 995, 527: 995, 530: 995, 995, 1276: 3434}, - {50: 996, 491: 996, 505: 996, 527: 996, 530: 996, 996}, - {50: 993, 505: 3441, 527: 993, 530: 993, 993, 1279: 3440}, - {663: 3436}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 2777, 875: 3267, 905: 3437}, + {1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 687: 1753, 690: 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753}, + {1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 687: 1730, 690: 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730}, + {1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 687: 1713, 690: 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713}, + {1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 687: 1712, 690: 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712}, + {1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 687: 1711, 690: 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711}, // 880 - {9: 3438, 50: 994, 505: 994, 527: 994, 530: 994, 994}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 2777, 875: 3439}, - {1319, 1319, 9: 1319, 50: 1319, 128: 1319, 475: 1319, 477: 1319, 483: 1319, 1319, 493: 1319, 1319, 496: 1319, 1319, 499: 1319, 1319, 504: 1319, 1319, 517: 1319, 519: 1319, 527: 1319, 530: 1319, 1319}, - {50: 991, 527: 3446, 530: 3447, 3448, 1278: 3444, 1358: 3445}, - {663: 3442}, + {1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 687: 1707, 690: 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707}, + {1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 687: 1706, 690: 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 687: 1700, 690: 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 687: 1590, 690: 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590}, + {1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 687: 1589, 690: 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589}, // 885 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 2777, 875: 3267, 905: 3443}, - {9: 3438, 50: 992, 527: 992, 530: 992, 992}, - {50: 998}, - {151: 3459, 171: 3455, 511: 3449, 566: 3460, 576: 3451, 3450, 580: 3457, 3458, 824: 3456, 984: 3453, 1356: 3454, 3452}, - {151: 989, 171: 989, 511: 989, 566: 989, 576: 989, 989, 580: 989, 989}, + {1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 687: 1588, 690: 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 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, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 687: 1587, 690: 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587}, + {1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 687: 1492, 690: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492}, + {1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 687: 1476, 690: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476}, + {1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 687: 1458, 690: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458}, // 890 - {151: 988, 171: 988, 511: 988, 566: 988, 576: 988, 988, 580: 988, 988}, - {151: 987, 171: 987, 511: 987, 566: 987, 576: 987, 987, 580: 987, 987}, - {2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 50: 2239, 136: 2239, 153: 2239, 475: 2239, 2239, 2239, 479: 2239, 2239, 2239, 2239, 2239, 487: 2239, 491: 2239, 2239, 495: 2239, 498: 2239, 506: 2239, 2239, 2239, 572: 2239, 584: 2239, 593: 2239, 2239, 645: 2239, 2239, 2239, 2239, 2239, 2239, 652: 2239}, - {2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 50: 2238, 136: 2238, 153: 2238, 197: 2238, 475: 2238, 2238, 2238, 479: 2238, 2238, 2238, 2238, 2238, 487: 2238, 491: 2238, 2238, 495: 2238, 498: 2238, 506: 2238, 2238, 2238, 572: 2238, 584: 2238, 593: 2238, 2238, 645: 2238, 2238, 2238, 2238, 2238, 2238, 652: 2238}, - {2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 50: 2237, 136: 2237, 153: 2237, 197: 2237, 475: 2237, 2237, 2237, 479: 2237, 2237, 2237, 2237, 2237, 487: 2237, 491: 2237, 2237, 495: 2237, 498: 2237, 506: 2237, 2237, 2237, 572: 2237, 584: 2237, 593: 2237, 2237, 645: 2237, 2237, 2237, 2237, 2237, 2237, 652: 2237}, + {1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 687: 1446, 690: 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 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, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 687: 1445, 690: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445}, + {1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 687: 1425, 690: 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425}, + {1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 687: 1424, 690: 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424}, + {1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 493: 1023, 1023, 1023, 497: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 511: 1023, 1023, 1023, 516: 1023, 1023, 1023, 1023, 1023, 1023, 523: 1023, 1023, 526: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 550: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 584: 1023, 1023, 1023, 616: 1023}, // 895 - {50: 990}, - {50: 986}, - {50: 985}, - {136: 3506}, - {136: 3504}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 1020, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 507: 1020, 523: 1020, 543: 1020, 546: 1020, 1020, 685: 3506, 2849, 688: 2850, 2848, 948: 3513, 1297: 3512, 1385: 3511}, + {994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 493: 994, 994, 994, 497: 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 508: 994, 994, 511: 994, 994, 994, 516: 994, 994, 994, 994, 994, 994, 523: 994, 994, 526: 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 550: 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 584: 994, 994, 994, 616: 994}, + {993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 493: 993, 993, 993, 497: 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 508: 993, 993, 511: 993, 993, 993, 516: 993, 993, 993, 993, 993, 993, 523: 993, 993, 526: 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 550: 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 584: 993, 993, 993, 616: 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, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 493: 992, 992, 992, 497: 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 508: 992, 992, 511: 992, 992, 992, 516: 992, 992, 992, 992, 992, 992, 523: 992, 992, 526: 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 550: 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 584: 992, 992, 992, 616: 992}, + {58: 3591}, // 900 - {136: 3502}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3509}, - {578: 3508}, - {151: 3459, 171: 3461, 511: 3449, 576: 3451, 3450, 580: 3463, 3464, 824: 3462, 984: 3466, 1170: 3465}, - {136: 3506, 153: 3507}, + {58: 1018, 507: 3515, 523: 1018, 543: 1018, 546: 1018, 1018, 1301: 3514}, + {58: 1019, 507: 1019, 523: 1019, 543: 1019, 546: 1019, 1019}, + {58: 1016, 523: 3521, 543: 1016, 546: 1016, 1016, 1304: 3520}, + {681: 3516}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 2841, 893: 3347, 925: 3517}, // 905 - {136: 3504, 153: 3505}, - {136: 3502, 153: 3503}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3469}, - {510: 3467}, - {50: 978, 510: 978}, + {9: 3518, 58: 1017, 523: 1017, 543: 1017, 546: 1017, 1017}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 2841, 893: 3519}, + {1344, 1344, 9: 1344, 58: 1344, 137: 1344, 491: 1344, 493: 1344, 500: 1344, 1344, 509: 1344, 511: 1344, 1344, 1344, 516: 1344, 1344, 521: 1344, 523: 1344, 533: 1344, 535: 1344, 543: 1344, 546: 1344, 1344}, + {58: 1014, 543: 3526, 546: 3527, 3528, 1303: 3524, 1383: 3525}, + {681: 3522}, // 910 - {151: 3459, 171: 3461, 511: 3449, 576: 3451, 3450, 580: 3463, 3464, 824: 3462, 984: 3466, 1170: 3468}, - {50: 979}, - {105: 3490, 3486, 109: 3483, 3498, 113: 3485, 3482, 3484, 3488, 3489, 3494, 3493, 3492, 3496, 3497, 3491, 3495, 3487, 510: 3371, 512: 3369, 3370, 3368, 3366, 535: 3480, 3477, 3479, 3478, 3474, 3476, 3475, 3472, 3473, 3471, 3481, 738: 3367, 3365, 800: 3470, 820: 3499}, - {1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 483: 1123, 1123, 1123, 1123, 488: 1123, 1123, 1123, 492: 1123, 1123, 1123, 496: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 509: 1123, 1123, 512: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 534: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 568: 1123, 1123, 572: 1123, 649: 1123}, - {1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 483: 1122, 1122, 1122, 1122, 488: 1122, 1122, 1122, 492: 1122, 1122, 1122, 496: 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 509: 1122, 1122, 512: 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 534: 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 568: 1122, 1122, 572: 1122, 649: 1122}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 2841, 893: 3347, 925: 3523}, + {9: 3518, 58: 1015, 543: 1015, 546: 1015, 1015}, + {58: 1021}, + {160: 3539, 169: 3535, 525: 3529, 582: 3540, 593: 3531, 3530, 597: 3537, 599: 3538, 842: 3536, 1004: 3533, 1381: 3534, 3532}, + {160: 1012, 169: 1012, 525: 1012, 582: 1012, 593: 1012, 1012, 597: 1012, 599: 1012}, // 915 - {1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 483: 1121, 1121, 1121, 1121, 488: 1121, 1121, 1121, 492: 1121, 1121, 1121, 496: 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 509: 1121, 1121, 512: 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 534: 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 568: 1121, 1121, 572: 1121, 649: 1121}, - {1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 483: 1120, 1120, 1120, 1120, 488: 1120, 1120, 1120, 492: 1120, 1120, 1120, 496: 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 509: 1120, 1120, 512: 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 534: 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 568: 1120, 1120, 572: 1120, 649: 1120}, - {1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 483: 1119, 1119, 1119, 1119, 488: 1119, 1119, 1119, 492: 1119, 1119, 1119, 496: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 509: 1119, 1119, 512: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 534: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 568: 1119, 1119, 572: 1119, 649: 1119}, - {1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 483: 1118, 1118, 1118, 1118, 488: 1118, 1118, 1118, 492: 1118, 1118, 1118, 496: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 509: 1118, 1118, 512: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 534: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 568: 1118, 1118, 572: 1118, 649: 1118}, - {1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 483: 1117, 1117, 1117, 1117, 488: 1117, 1117, 1117, 492: 1117, 1117, 1117, 496: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 509: 1117, 1117, 512: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 534: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 568: 1117, 1117, 572: 1117, 649: 1117}, + {160: 1011, 169: 1011, 525: 1011, 582: 1011, 593: 1011, 1011, 597: 1011, 599: 1011}, + {160: 1010, 169: 1010, 525: 1010, 582: 1010, 593: 1010, 1010, 597: 1010, 599: 1010}, + {2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, 58: 2283, 145: 2283, 162: 2283, 491: 2283, 2283, 2283, 495: 2283, 2283, 2283, 2283, 2283, 2283, 507: 2283, 2283, 510: 2283, 514: 2283, 2283, 522: 2283, 524: 2283, 588: 2283, 600: 2283, 607: 2283, 613: 2283, 662: 2283, 2283, 2283, 2283, 2283, 2283, 2283}, + {2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 58: 2282, 145: 2282, 162: 2282, 207: 2282, 491: 2282, 2282, 2282, 495: 2282, 2282, 2282, 2282, 2282, 2282, 507: 2282, 2282, 510: 2282, 514: 2282, 2282, 522: 2282, 524: 2282, 588: 2282, 600: 2282, 607: 2282, 613: 2282, 662: 2282, 2282, 2282, 2282, 2282, 2282, 2282}, + {2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 58: 2281, 145: 2281, 162: 2281, 207: 2281, 491: 2281, 2281, 2281, 495: 2281, 2281, 2281, 2281, 2281, 2281, 507: 2281, 2281, 510: 2281, 514: 2281, 2281, 522: 2281, 524: 2281, 588: 2281, 600: 2281, 607: 2281, 613: 2281, 662: 2281, 2281, 2281, 2281, 2281, 2281, 2281}, // 920 - {1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 483: 1116, 1116, 1116, 1116, 488: 1116, 1116, 1116, 492: 1116, 1116, 1116, 496: 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 509: 1116, 1116, 512: 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 534: 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 568: 1116, 1116, 572: 1116, 649: 1116}, - {1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 483: 1115, 1115, 1115, 1115, 488: 1115, 1115, 1115, 492: 1115, 1115, 1115, 496: 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 509: 1115, 1115, 512: 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 534: 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 568: 1115, 1115, 572: 1115, 649: 1115}, - {1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 483: 1114, 1114, 1114, 1114, 488: 1114, 1114, 1114, 492: 1114, 1114, 1114, 496: 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 509: 1114, 1114, 512: 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 534: 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 568: 1114, 1114, 572: 1114, 649: 1114}, - {1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 483: 1113, 1113, 1113, 1113, 488: 1113, 1113, 1113, 492: 1113, 1113, 1113, 496: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 509: 1113, 1113, 512: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 534: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 568: 1113, 1113, 572: 1113, 649: 1113}, - {1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 483: 1112, 1112, 1112, 1112, 488: 1112, 1112, 1112, 492: 1112, 1112, 1112, 496: 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 509: 1112, 1112, 512: 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 534: 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 568: 1112, 1112, 572: 1112, 649: 1112}, + {58: 1013}, + {58: 1009}, + {58: 1008}, + {145: 3586}, + {145: 3584}, // 925 - {1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 483: 1111, 1111, 1111, 1111, 488: 1111, 1111, 1111, 492: 1111, 1111, 1111, 496: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 509: 1111, 1111, 512: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 534: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 568: 1111, 1111, 572: 1111, 649: 1111}, - {1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 483: 1110, 1110, 1110, 1110, 488: 1110, 1110, 1110, 492: 1110, 1110, 1110, 496: 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 509: 1110, 1110, 512: 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 534: 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 568: 1110, 1110, 572: 1110, 649: 1110}, - {1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 483: 1109, 1109, 1109, 1109, 488: 1109, 1109, 1109, 492: 1109, 1109, 1109, 496: 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 509: 1109, 1109, 512: 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 534: 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 568: 1109, 1109, 572: 1109, 649: 1109}, - {1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 483: 1108, 1108, 1108, 1108, 488: 1108, 1108, 1108, 492: 1108, 1108, 1108, 496: 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 509: 1108, 1108, 512: 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 534: 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 568: 1108, 1108, 572: 1108, 649: 1108}, - {1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 483: 1107, 1107, 1107, 1107, 488: 1107, 1107, 1107, 492: 1107, 1107, 1107, 496: 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 509: 1107, 1107, 512: 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 534: 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 568: 1107, 1107, 572: 1107, 649: 1107}, + {145: 3582}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3589}, + {595: 3588}, + {160: 3539, 169: 3541, 525: 3529, 593: 3531, 3530, 597: 3543, 599: 3544, 842: 3542, 1004: 3546, 1195: 3545}, + {145: 3586, 162: 3587}, // 930 - {1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 483: 1106, 1106, 1106, 1106, 488: 1106, 1106, 1106, 492: 1106, 1106, 1106, 496: 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 509: 1106, 1106, 512: 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 534: 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 568: 1106, 1106, 572: 1106, 649: 1106}, - {1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 483: 1105, 1105, 1105, 1105, 488: 1105, 1105, 1105, 492: 1105, 1105, 1105, 496: 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 509: 1105, 1105, 512: 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 534: 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 568: 1105, 1105, 572: 1105, 649: 1105}, - {1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 483: 1104, 1104, 1104, 1104, 488: 1104, 1104, 1104, 492: 1104, 1104, 1104, 496: 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 509: 1104, 1104, 512: 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 534: 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 568: 1104, 1104, 572: 1104, 649: 1104}, - {1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 483: 1103, 1103, 1103, 1103, 488: 1103, 1103, 1103, 492: 1103, 1103, 1103, 496: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 509: 1103, 1103, 512: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 534: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 568: 1103, 1103, 572: 1103, 649: 1103}, - {1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 483: 1102, 1102, 1102, 1102, 488: 1102, 1102, 1102, 492: 1102, 1102, 1102, 496: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 509: 1102, 1102, 512: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 534: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 568: 1102, 1102, 572: 1102, 649: 1102}, + {145: 3584, 162: 3585}, + {145: 3582, 162: 3583}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3549}, + {527: 3547}, + {58: 1001, 527: 1001}, // 935 - {1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 483: 1101, 1101, 1101, 1101, 488: 1101, 1101, 1101, 492: 1101, 1101, 1101, 496: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 509: 1101, 1101, 512: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 534: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 568: 1101, 1101, 572: 1101, 649: 1101}, - {1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 483: 1100, 1100, 1100, 1100, 488: 1100, 1100, 1100, 492: 1100, 1100, 1100, 496: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 509: 1100, 1100, 512: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 534: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 568: 1100, 1100, 572: 1100, 649: 1100}, - {1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 483: 1099, 1099, 1099, 1099, 488: 1099, 1099, 1099, 492: 1099, 1099, 1099, 496: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 509: 1099, 1099, 512: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 534: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 568: 1099, 1099, 572: 1099, 649: 1099}, - {1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 483: 1098, 1098, 1098, 1098, 488: 1098, 1098, 1098, 492: 1098, 1098, 1098, 496: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 509: 1098, 1098, 512: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 534: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 568: 1098, 1098, 572: 1098, 649: 1098}, - {1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 483: 1097, 1097, 1097, 1097, 488: 1097, 1097, 1097, 492: 1097, 1097, 1097, 496: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 509: 1097, 1097, 512: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 534: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 568: 1097, 1097, 572: 1097, 649: 1097}, + {160: 3539, 169: 3541, 525: 3529, 593: 3531, 3530, 597: 3543, 599: 3544, 842: 3542, 1004: 3546, 1195: 3548}, + {58: 1002}, + {112: 3566, 3570, 3563, 3578, 118: 3565, 3562, 3564, 3568, 3569, 3574, 3573, 3572, 3576, 3577, 3571, 3575, 131: 3567, 527: 3451, 3449, 3450, 3448, 3446, 550: 3560, 3557, 3559, 3558, 3554, 3556, 3555, 3552, 3553, 3551, 3561, 756: 3447, 3445, 813: 3550, 828: 3579}, + {1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 511: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 526: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 550: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 584: 1146, 1146, 1146, 588: 1146, 665: 1146, 667: 1146, 1146}, + {1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 511: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 526: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 550: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 584: 1145, 1145, 1145, 588: 1145, 665: 1145, 667: 1145, 1145}, // 940 - {1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 483: 1096, 1096, 1096, 1096, 488: 1096, 1096, 1096, 492: 1096, 1096, 1096, 496: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 509: 1096, 1096, 512: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 534: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 568: 1096, 1096, 572: 1096, 649: 1096}, - {1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 483: 1095, 1095, 1095, 1095, 488: 1095, 1095, 1095, 492: 1095, 1095, 1095, 496: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 509: 1095, 1095, 512: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 534: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 568: 1095, 1095, 572: 1095, 649: 1095}, - {136: 3500, 153: 3501}, - {50: 981, 510: 981}, - {50: 974, 510: 974}, + {1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 511: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 526: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 550: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 584: 1144, 1144, 1144, 588: 1144, 665: 1144, 667: 1144, 1144}, + {1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 511: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 526: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 550: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 584: 1143, 1143, 1143, 588: 1143, 665: 1143, 667: 1143, 1143}, + {1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 511: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 526: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 550: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 584: 1142, 1142, 1142, 588: 1142, 665: 1142, 667: 1142, 1142}, + {1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 511: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 526: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 550: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 584: 1141, 1141, 1141, 588: 1141, 665: 1141, 667: 1141, 1141}, + {1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 511: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 526: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 550: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 584: 1140, 1140, 1140, 588: 1140, 665: 1140, 667: 1140, 1140}, // 945 - {50: 982, 510: 982}, - {50: 975, 510: 975}, - {50: 983, 510: 983}, - {50: 976, 510: 976}, - {50: 984, 510: 984}, + {1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 511: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 526: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 550: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 584: 1139, 1139, 1139, 588: 1139, 665: 1139, 667: 1139, 1139}, + {1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 511: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 526: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 550: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 584: 1138, 1138, 1138, 588: 1138, 665: 1138, 667: 1138, 1138}, + {1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 511: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 526: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 550: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 584: 1137, 1137, 1137, 588: 1137, 665: 1137, 667: 1137, 1137}, + {1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 511: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 526: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 550: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 584: 1136, 1136, 1136, 588: 1136, 665: 1136, 667: 1136, 1136}, + {1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 511: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 526: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 550: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 584: 1135, 1135, 1135, 588: 1135, 665: 1135, 667: 1135, 1135}, // 950 - {50: 977, 510: 977}, - {50: 980, 510: 980}, - {105: 3490, 3486, 109: 3483, 3498, 113: 3485, 3482, 3484, 3488, 3489, 3494, 3493, 3492, 3496, 3497, 3491, 3495, 3487, 510: 3371, 512: 3369, 3370, 3368, 3366, 535: 3480, 3477, 3479, 3478, 3474, 3476, 3475, 3472, 3473, 3471, 3481, 738: 3367, 3365, 800: 3470, 820: 3510}, - {136: 3500}, - {999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 477: 999, 999, 999, 999, 999, 483: 999, 999, 999, 999, 999, 999, 999, 999, 492: 999, 999, 999, 496: 999, 999, 499: 999, 999, 999, 999, 999, 999, 999, 999, 509: 999, 999, 512: 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 534: 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 568: 999, 999, 597: 999}, + {1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 511: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 526: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 550: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 584: 1134, 1134, 1134, 588: 1134, 665: 1134, 667: 1134, 1134}, + {1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 511: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 526: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 550: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 584: 1133, 1133, 1133, 588: 1133, 665: 1133, 667: 1133, 1133}, + {1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 511: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 526: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 550: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 584: 1132, 1132, 1132, 588: 1132, 665: 1132, 667: 1132, 1132}, + {1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 511: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 526: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 550: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 584: 1131, 1131, 1131, 588: 1131, 665: 1131, 667: 1131, 1131}, + {1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 511: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 526: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 550: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 584: 1130, 1130, 1130, 588: 1130, 665: 1130, 667: 1130, 1130}, // 955 - {1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 477: 1276, 1276, 1276, 1276, 1276, 483: 1276, 1276, 1276, 1276, 3376, 1276, 1276, 1276, 492: 1276, 1276, 1276, 496: 1276, 1276, 499: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 509: 1276, 1276, 512: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 534: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 568: 1276, 1276, 597: 1276}, - {1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 477: 1286, 1286, 1286, 1286, 1286, 483: 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 492: 1286, 1286, 1286, 496: 1286, 1286, 499: 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 509: 1286, 1286, 512: 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 534: 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 568: 1286, 1286, 597: 1286}, - {769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 512: 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 534: 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 568: 769, 769, 572: 769, 584: 769, 593: 769, 769, 597: 769, 645: 769, 769, 769, 769, 769, 769, 652: 769}, - {768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 512: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 534: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 568: 768, 768, 572: 768, 584: 768, 593: 768, 768, 597: 768, 645: 768, 768, 768, 768, 768, 768, 652: 768}, - {268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 512: 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 568: 268, 268, 571: 268, 268, 584: 268, 593: 268, 268, 597: 268, 645: 268, 268, 268, 268, 268, 268, 652: 268, 268, 656: 268, 661: 268, 663: 268, 669: 268, 268, 268}, + {1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 511: 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 526: 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 550: 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 584: 1129, 1129, 1129, 588: 1129, 665: 1129, 667: 1129, 1129}, + {1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 511: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 526: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 550: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 584: 1128, 1128, 1128, 588: 1128, 665: 1128, 667: 1128, 1128}, + {1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 511: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 526: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 550: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 584: 1127, 1127, 1127, 588: 1127, 665: 1127, 667: 1127, 1127}, + {1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 511: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 526: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 550: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 584: 1126, 1126, 1126, 588: 1126, 665: 1126, 667: 1126, 1126}, + {1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 511: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 526: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 550: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 584: 1125, 1125, 1125, 588: 1125, 665: 1125, 667: 1125, 1125}, // 960 - {267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 512: 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 568: 267, 267, 571: 267, 267, 584: 267, 593: 267, 267, 597: 267, 645: 267, 267, 267, 267, 267, 267, 652: 267, 267, 656: 267, 661: 267, 663: 267, 669: 267, 267, 267}, - {1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 477: 1958, 1958, 481: 1958, 483: 1958, 1958, 1958, 1958, 492: 1958, 1958, 1958, 496: 1958, 1958, 499: 1958, 1958, 1958, 503: 1958, 1958, 1958, 1958, 509: 1958, 1958, 512: 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 522: 1958, 524: 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 534: 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 548: 1958, 1958, 738: 3367, 3365}, - {1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 477: 1959, 1959, 481: 1959, 483: 1959, 1959, 1959, 1959, 492: 1959, 1959, 1959, 496: 1959, 1959, 499: 1959, 1959, 1959, 503: 1959, 1959, 1959, 1959, 509: 1959, 3371, 512: 1959, 3370, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 522: 1959, 524: 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 534: 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 548: 1959, 1959, 738: 3367, 3365}, - {1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 477: 1960, 1960, 481: 1960, 483: 1960, 1960, 1960, 1960, 492: 1960, 1960, 1960, 496: 1960, 1960, 499: 1960, 1960, 1960, 503: 1960, 1960, 1960, 1960, 509: 1960, 3371, 512: 1960, 3370, 1960, 3366, 1960, 1960, 1960, 1960, 1960, 522: 1960, 524: 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 534: 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 548: 1960, 1960, 738: 3367, 3365}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3522}, + {1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 511: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 526: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 550: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 584: 1124, 1124, 1124, 588: 1124, 665: 1124, 667: 1124, 1124}, + {1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 511: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 526: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 550: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 584: 1123, 1123, 1123, 588: 1123, 665: 1123, 667: 1123, 1123}, + {1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 511: 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 526: 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 550: 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 584: 1122, 1122, 1122, 588: 1122, 665: 1122, 667: 1122, 1122}, + {1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 511: 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 526: 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 550: 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 584: 1121, 1121, 1121, 588: 1121, 665: 1121, 667: 1121, 1121}, + {1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 511: 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 526: 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 550: 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 584: 1120, 1120, 1120, 588: 1120, 665: 1120, 667: 1120, 1120}, // 965 - {50: 3523, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {149: 3384, 492: 3385, 746: 952, 889: 3524}, - {746: 3388, 751: 3525}, - {959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 477: 959, 959, 959, 959, 959, 483: 959, 959, 959, 959, 959, 959, 959, 959, 492: 959, 959, 959, 496: 959, 959, 499: 959, 959, 959, 959, 959, 959, 959, 959, 509: 959, 959, 512: 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 534: 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 568: 959, 959, 597: 959}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3527}, + {1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 511: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 526: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 550: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 584: 1119, 1119, 1119, 588: 1119, 665: 1119, 667: 1119, 1119}, + {1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 511: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 526: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 550: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 584: 1118, 1118, 1118, 588: 1118, 665: 1118, 667: 1118, 1118}, + {145: 3580, 162: 3581}, + {58: 1004, 527: 1004}, + {58: 997, 527: 997}, // 970 - {50: 3528, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {149: 3384, 492: 3385, 746: 952, 889: 3529}, - {746: 3388, 751: 3530}, - {960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 477: 960, 960, 960, 960, 960, 483: 960, 960, 960, 960, 960, 960, 960, 960, 492: 960, 960, 960, 496: 960, 960, 499: 960, 960, 960, 960, 960, 960, 960, 960, 509: 960, 960, 512: 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 534: 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 568: 960, 960, 597: 960}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3532}, + {58: 1005, 527: 1005}, + {58: 998, 527: 998}, + {58: 1006, 527: 1006}, + {58: 999, 527: 999}, + {58: 1007, 527: 1007}, // 975 - {9: 3534, 50: 957, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365, 1102: 3533}, - {50: 3541}, - {511: 3449, 576: 3451, 3450, 580: 3536, 824: 3535}, - {9: 3538, 50: 954, 1103: 3540}, - {9: 3538, 50: 954, 1103: 3537}, + {58: 1000, 527: 1000}, + {58: 1003, 527: 1003}, + {112: 3566, 3570, 3563, 3578, 118: 3565, 3562, 3564, 3568, 3569, 3574, 3573, 3572, 3576, 3577, 3571, 3575, 131: 3567, 527: 3451, 3449, 3450, 3448, 3446, 550: 3560, 3557, 3559, 3558, 3554, 3556, 3555, 3552, 3553, 3551, 3561, 756: 3447, 3445, 813: 3550, 828: 3590}, + {145: 3580}, + {1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 493: 1022, 1022, 1022, 497: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 508: 1022, 1022, 511: 1022, 1022, 1022, 516: 1022, 1022, 1022, 1022, 1022, 1022, 523: 1022, 1022, 526: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 550: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 584: 1022, 1022, 1022, 616: 1022}, // 980 - {50: 955}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3539}, - {50: 953, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {50: 956}, - {149: 3384, 492: 3385, 746: 952, 889: 3542}, + {1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 493: 1301, 1301, 1301, 497: 1301, 1301, 3456, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 508: 1301, 1301, 511: 1301, 1301, 1301, 516: 1301, 1301, 1301, 1301, 1301, 1301, 523: 1301, 1301, 526: 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 550: 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 584: 1301, 1301, 1301, 616: 1301}, + {1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 493: 1311, 1311, 1311, 497: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 508: 1311, 1311, 511: 1311, 1311, 1311, 516: 1311, 1311, 1311, 1311, 1311, 1311, 523: 1311, 1311, 526: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 550: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 584: 1311, 1311, 1311, 616: 1311}, + {792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 526: 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 550: 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 584: 792, 792, 792, 588: 792, 600: 792, 607: 792, 613: 792, 616: 792, 662: 792, 792, 792, 792, 792, 792, 792}, + {791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 526: 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 550: 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 584: 791, 791, 791, 588: 791, 600: 791, 607: 791, 613: 791, 616: 791, 662: 791, 791, 791, 791, 791, 791, 791}, + {284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 526: 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 584: 284, 284, 284, 588: 284, 284, 600: 284, 607: 284, 613: 284, 616: 284, 662: 284, 284, 284, 284, 284, 284, 284, 670: 284, 673: 284, 678: 284, 284, 681: 284, 683: 284, 284, 687: 284}, // 985 - {746: 3388, 751: 3543}, - {961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 477: 961, 961, 961, 961, 961, 483: 961, 961, 961, 961, 961, 961, 961, 961, 492: 961, 961, 961, 496: 961, 961, 499: 961, 961, 961, 961, 961, 961, 961, 961, 509: 961, 961, 512: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 534: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 568: 961, 961, 597: 961}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3545}, - {9: 3534, 50: 957, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365, 1102: 3546}, - {50: 3547}, + {283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 526: 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 584: 283, 283, 283, 588: 283, 283, 600: 283, 607: 283, 613: 283, 616: 283, 662: 283, 283, 283, 283, 283, 283, 283, 670: 283, 673: 283, 678: 283, 283, 681: 283, 683: 283, 283, 687: 283}, + {2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 493: 2000, 2000, 498: 2000, 500: 2000, 2000, 2000, 2000, 508: 2000, 2000, 511: 2000, 2000, 2000, 516: 2000, 2000, 519: 2000, 2000, 2000, 523: 2000, 2000, 526: 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 538: 2000, 2000, 2000, 542: 2000, 2000, 2000, 2000, 2000, 2000, 2000, 550: 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 565: 2000, 756: 3447, 3445}, + {2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 493: 2001, 2001, 498: 2001, 500: 2001, 2001, 2001, 2001, 508: 2001, 2001, 511: 2001, 2001, 2001, 516: 2001, 2001, 519: 2001, 2001, 2001, 523: 2001, 2001, 526: 2001, 3451, 2001, 3450, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 538: 2001, 2001, 2001, 542: 2001, 2001, 2001, 2001, 2001, 2001, 2001, 550: 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 565: 2001, 756: 3447, 3445}, + {2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 493: 2002, 2002, 498: 2002, 500: 2002, 2002, 2002, 2002, 508: 2002, 2002, 511: 2002, 2002, 2002, 516: 2002, 2002, 519: 2002, 2002, 2002, 523: 2002, 2002, 526: 2002, 3451, 2002, 3450, 2002, 3446, 2002, 2002, 2002, 2002, 2002, 538: 2002, 2002, 2002, 542: 2002, 2002, 2002, 2002, 2002, 2002, 2002, 550: 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 565: 2002, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3602}, // 990 - {149: 3384, 492: 3385, 746: 952, 889: 3548}, - {746: 3388, 751: 3549}, - {962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 477: 962, 962, 962, 962, 962, 483: 962, 962, 962, 962, 962, 962, 962, 962, 492: 962, 962, 962, 496: 962, 962, 499: 962, 962, 962, 962, 962, 962, 962, 962, 509: 962, 962, 512: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 534: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 568: 962, 962, 597: 962}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3374, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3551, 3279, 3360, 3278, 3275}, - {50: 3552, 487: 3376, 597: 3377}, + {58: 3603, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {158: 3464, 508: 3465, 764: 975, 908: 3604}, + {764: 3468, 769: 3605}, + {982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 493: 982, 982, 982, 497: 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 508: 982, 982, 511: 982, 982, 982, 516: 982, 982, 982, 982, 982, 982, 523: 982, 982, 526: 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 550: 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 584: 982, 982, 982, 616: 982}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3607}, // 995 - {746: 3388, 751: 3553}, - {963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 477: 963, 963, 963, 963, 963, 483: 963, 963, 963, 963, 963, 963, 963, 963, 492: 963, 963, 963, 496: 963, 963, 499: 963, 963, 963, 963, 963, 963, 963, 963, 509: 963, 963, 512: 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 534: 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 568: 963, 963, 597: 963}, - {50: 3555}, - {746: 3388, 751: 3556}, - {964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 477: 964, 964, 964, 964, 964, 483: 964, 964, 964, 964, 964, 964, 964, 964, 492: 964, 964, 964, 496: 964, 964, 499: 964, 964, 964, 964, 964, 964, 964, 964, 509: 964, 964, 512: 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 534: 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 568: 964, 964, 597: 964}, + {58: 3608, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {158: 3464, 508: 3465, 764: 975, 908: 3609}, + {764: 3468, 769: 3610}, + {983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 493: 983, 983, 983, 497: 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 508: 983, 983, 511: 983, 983, 983, 516: 983, 983, 983, 983, 983, 983, 523: 983, 983, 526: 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 550: 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 584: 983, 983, 983, 616: 983}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3612}, // 1000 - {50: 3558}, - {746: 3388, 751: 3559}, - {965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 477: 965, 965, 965, 965, 965, 483: 965, 965, 965, 965, 965, 965, 965, 965, 492: 965, 965, 965, 496: 965, 965, 499: 965, 965, 965, 965, 965, 965, 965, 965, 509: 965, 965, 512: 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 534: 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 568: 965, 965, 597: 965}, - {50: 3561}, - {746: 3388, 751: 3562}, + {9: 3614, 58: 980, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445, 1125: 3613}, + {58: 3621}, + {525: 3529, 593: 3531, 3530, 597: 3616, 842: 3615}, + {9: 3618, 58: 977, 1126: 3620}, + {9: 3618, 58: 977, 1126: 3617}, // 1005 - {966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 477: 966, 966, 966, 966, 966, 483: 966, 966, 966, 966, 966, 966, 966, 966, 492: 966, 966, 966, 496: 966, 966, 499: 966, 966, 966, 966, 966, 966, 966, 966, 509: 966, 966, 512: 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 534: 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 568: 966, 966, 597: 966}, - {50: 3564}, - {746: 3388, 751: 3565}, - {967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 477: 967, 967, 967, 967, 967, 483: 967, 967, 967, 967, 967, 967, 967, 967, 492: 967, 967, 967, 496: 967, 967, 499: 967, 967, 967, 967, 967, 967, 967, 967, 509: 967, 967, 512: 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 534: 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 568: 967, 967, 597: 967}, - {50: 3567}, + {58: 978}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3619}, + {58: 976, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {58: 979}, + {158: 3464, 508: 3465, 764: 975, 908: 3622}, // 1010 - {746: 3388, 751: 3568}, - {968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 477: 968, 968, 968, 968, 968, 483: 968, 968, 968, 968, 968, 968, 968, 968, 492: 968, 968, 968, 496: 968, 968, 499: 968, 968, 968, 968, 968, 968, 968, 968, 509: 968, 968, 512: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 534: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 568: 968, 968, 597: 968}, - {2: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 10: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 51: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 476: 1255, 478: 1255, 1255, 1255, 482: 1255, 485: 1255, 1255, 488: 1255, 1255, 1255, 495: 1255, 498: 1255, 507: 1255, 1255, 511: 1255, 533: 1255, 567: 1255, 570: 1255, 1255, 573: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 585: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 595: 1255, 1255, 598: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 651: 1255, 654: 3572, 749: 3570, 3571, 789: 3573, 792: 3574, 821: 3576, 3575}, - {2: 1259, 1259, 1259, 1259, 1259, 1259, 1259, 10: 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 51: 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 476: 1259, 478: 1259, 1259, 1259, 482: 1259, 485: 1259, 1259, 488: 1259, 1259, 1259, 495: 1259, 498: 1259, 507: 1259, 1259, 511: 1259, 518: 1259, 523: 1259, 533: 1259, 567: 1259, 570: 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 585: 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 595: 1259, 1259, 598: 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 649: 1259, 651: 1259, 654: 1259, 749: 1259, 1259, 757: 1259, 1259, 1259, 766: 1259, 774: 1259, 1259, 1259}, - {2: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 10: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 51: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 476: 1258, 478: 1258, 1258, 1258, 482: 1258, 485: 1258, 1258, 488: 1258, 1258, 1258, 495: 1258, 498: 1258, 507: 1258, 1258, 511: 1258, 518: 1258, 523: 1258, 533: 1258, 567: 1258, 570: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 585: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 595: 1258, 1258, 598: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 649: 1258, 651: 1258, 654: 1258, 749: 1258, 1258, 757: 1258, 1258, 1258, 766: 1258, 774: 1258, 1258, 1258}, + {764: 3468, 769: 3623}, + {984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 493: 984, 984, 984, 497: 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 508: 984, 984, 511: 984, 984, 984, 516: 984, 984, 984, 984, 984, 984, 523: 984, 984, 526: 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 550: 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 584: 984, 984, 984, 616: 984}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3625}, + {9: 3614, 58: 980, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445, 1125: 3626}, + {58: 3627}, // 1015 - {2: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 10: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 51: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 476: 1257, 478: 1257, 1257, 1257, 482: 1257, 485: 1257, 1257, 488: 1257, 1257, 1257, 495: 1257, 498: 1257, 507: 1257, 1257, 511: 1257, 518: 1257, 523: 1257, 533: 1257, 567: 1257, 570: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 585: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 595: 1257, 1257, 598: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 649: 1257, 651: 1257, 654: 1257, 749: 1257, 1257, 757: 1257, 1257, 1257, 766: 1257, 774: 1257, 1257, 1257}, - {2: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 10: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 51: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 476: 1256, 478: 1256, 1256, 1256, 482: 1256, 485: 1256, 1256, 488: 1256, 1256, 1256, 495: 1256, 498: 1256, 507: 1256, 1256, 511: 1256, 533: 1256, 567: 1256, 570: 1256, 1256, 573: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 585: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 595: 1256, 1256, 598: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 651: 1256, 654: 3581}, - {2: 1254, 1254, 1254, 1254, 1254, 1254, 1254, 10: 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 51: 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 476: 1254, 478: 1254, 1254, 1254, 482: 1254, 485: 1254, 1254, 488: 1254, 1254, 1254, 495: 1254, 498: 1254, 507: 1254, 1254, 511: 1254, 533: 1254, 567: 1254, 570: 1254, 1254, 573: 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 585: 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 595: 1254, 1254, 598: 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 651: 1254}, - {2: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 10: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 51: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 476: 1251, 478: 1251, 1251, 1251, 482: 1251, 485: 1251, 1251, 488: 1251, 1251, 1251, 495: 1251, 498: 1251, 507: 1251, 1251, 511: 1251, 533: 1251, 567: 1251, 570: 1251, 1251, 573: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 585: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 595: 1251, 1251, 598: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 651: 1251}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3577}, + {158: 3464, 508: 3465, 764: 975, 908: 3628}, + {764: 3468, 769: 3629}, + {985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 493: 985, 985, 985, 497: 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 508: 985, 985, 511: 985, 985, 985, 516: 985, 985, 985, 985, 985, 985, 523: 985, 985, 526: 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 550: 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 584: 985, 985, 985, 616: 985}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3454, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3631, 3359, 3440, 3358, 3355}, + {58: 3632, 499: 3456, 616: 3457}, // 1020 - {50: 3578, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 3579}, - {1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 477: 1137, 1137, 1137, 1137, 1137, 483: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 492: 1137, 1137, 1137, 496: 1137, 1137, 499: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 509: 1137, 1137, 512: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 534: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 568: 1137, 1137, 597: 1137}, - {972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 477: 972, 972, 972, 972, 972, 483: 972, 972, 972, 972, 972, 972, 972, 972, 492: 972, 972, 972, 496: 972, 972, 499: 972, 972, 972, 972, 972, 972, 972, 972, 509: 972, 972, 512: 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 534: 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 568: 972, 972, 597: 972}, - {2: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 10: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 51: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 476: 1250, 478: 1250, 1250, 1250, 482: 1250, 485: 1250, 1250, 488: 1250, 1250, 1250, 495: 1250, 498: 1250, 507: 1250, 1250, 511: 1250, 533: 1250, 567: 1250, 570: 1250, 1250, 573: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 585: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 595: 1250, 1250, 598: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 651: 1250}, + {764: 3468, 769: 3633}, + {986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 493: 986, 986, 986, 497: 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 508: 986, 986, 511: 986, 986, 986, 516: 986, 986, 986, 986, 986, 986, 523: 986, 986, 526: 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 550: 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 584: 986, 986, 986, 616: 986}, + {58: 3635}, + {764: 3468, 769: 3636}, + {987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 493: 987, 987, 987, 497: 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 508: 987, 987, 511: 987, 987, 987, 516: 987, 987, 987, 987, 987, 987, 523: 987, 987, 526: 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 550: 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 584: 987, 987, 987, 616: 987}, // 1025 - {2: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 10: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 51: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 476: 1255, 478: 1255, 1255, 1255, 482: 1255, 485: 1255, 1255, 488: 1255, 1255, 1255, 495: 1255, 498: 1255, 507: 1255, 1255, 511: 1255, 533: 1255, 567: 1255, 570: 1255, 1255, 573: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 585: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 595: 1255, 1255, 598: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 651: 1255, 654: 3572, 749: 3570, 3571, 789: 3573, 792: 3574, 821: 3583, 3575}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3584}, - {50: 3585, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 3586}, - {1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 477: 1138, 1138, 1138, 1138, 1138, 483: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 492: 1138, 1138, 1138, 496: 1138, 1138, 499: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 509: 1138, 1138, 512: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 534: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 568: 1138, 1138, 597: 1138}, + {58: 3638}, + {764: 3468, 769: 3639}, + {988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 493: 988, 988, 988, 497: 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 508: 988, 988, 511: 988, 988, 988, 516: 988, 988, 988, 988, 988, 988, 523: 988, 988, 526: 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 550: 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 584: 988, 988, 988, 616: 988}, + {58: 3641}, + {764: 3468, 769: 3642}, // 1030 - {2: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 10: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 51: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 476: 1255, 478: 1255, 1255, 1255, 482: 1255, 485: 1255, 1255, 488: 1255, 1255, 1255, 495: 1255, 498: 1255, 507: 1255, 1255, 511: 1255, 533: 1255, 567: 1255, 570: 1255, 1255, 573: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 585: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 595: 1255, 1255, 598: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 651: 1255, 654: 3572, 749: 3570, 3571, 789: 3573, 792: 3574, 821: 3588, 3575}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3589}, - {50: 3590, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 3591}, - {1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 477: 1139, 1139, 1139, 1139, 1139, 483: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 492: 1139, 1139, 1139, 496: 1139, 1139, 499: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 509: 1139, 1139, 512: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 534: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 568: 1139, 1139, 597: 1139}, + {989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 493: 989, 989, 989, 497: 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 508: 989, 989, 511: 989, 989, 989, 516: 989, 989, 989, 989, 989, 989, 523: 989, 989, 526: 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 550: 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 584: 989, 989, 989, 616: 989}, + {58: 3644}, + {764: 3468, 769: 3645}, + {990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 493: 990, 990, 990, 497: 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 508: 990, 990, 511: 990, 990, 990, 516: 990, 990, 990, 990, 990, 990, 523: 990, 990, 526: 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 550: 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 584: 990, 990, 990, 616: 990}, + {58: 3647}, // 1035 - {2: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 10: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 51: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 476: 1255, 478: 1255, 1255, 1255, 482: 1255, 485: 1255, 1255, 488: 1255, 1255, 1255, 495: 1255, 498: 1255, 507: 1255, 1255, 511: 1255, 533: 1255, 567: 1255, 570: 1255, 1255, 573: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 585: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 595: 1255, 1255, 598: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 651: 1255, 654: 3572, 749: 3570, 3571, 789: 3573, 792: 3574, 821: 3593, 3575}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3594}, - {50: 3595, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 3596}, - {1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 477: 1140, 1140, 1140, 1140, 1140, 483: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 492: 1140, 1140, 1140, 496: 1140, 1140, 499: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 509: 1140, 1140, 512: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 534: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 568: 1140, 1140, 597: 1140}, + {764: 3468, 769: 3648}, + {991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 493: 991, 991, 991, 497: 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 508: 991, 991, 511: 991, 991, 991, 516: 991, 991, 991, 991, 991, 991, 523: 991, 991, 526: 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 550: 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 584: 991, 991, 991, 616: 991}, + {2: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 10: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 59: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 492: 1278, 494: 1278, 1278, 1278, 1278, 502: 1278, 1278, 1278, 1278, 1278, 510: 1278, 514: 1278, 1278, 522: 1278, 525: 1278, 549: 1278, 583: 1278, 587: 1278, 589: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 601: 1278, 1278, 1278, 1278, 1278, 1278, 608: 1278, 1278, 1278, 1278, 1278, 614: 1278, 1278, 617: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 669: 1278, 671: 3652, 767: 3650, 3651, 808: 3653, 810: 3654, 839: 3656, 3655}, + {2: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 10: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 59: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 492: 1282, 494: 1282, 1282, 1282, 1282, 502: 1282, 1282, 1282, 1282, 1282, 510: 1282, 514: 1282, 1282, 522: 1282, 525: 1282, 534: 1282, 541: 1282, 549: 1282, 583: 1282, 587: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 601: 1282, 1282, 1282, 1282, 1282, 1282, 608: 1282, 1282, 1282, 1282, 1282, 614: 1282, 1282, 617: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 665: 1282, 669: 1282, 671: 1282, 767: 1282, 1282, 775: 1282, 1282, 1282, 785: 1282, 792: 1282, 1282, 1282}, + {2: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 10: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 59: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 492: 1281, 494: 1281, 1281, 1281, 1281, 502: 1281, 1281, 1281, 1281, 1281, 510: 1281, 514: 1281, 1281, 522: 1281, 525: 1281, 534: 1281, 541: 1281, 549: 1281, 583: 1281, 587: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 601: 1281, 1281, 1281, 1281, 1281, 1281, 608: 1281, 1281, 1281, 1281, 1281, 614: 1281, 1281, 617: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 665: 1281, 669: 1281, 671: 1281, 767: 1281, 1281, 775: 1281, 1281, 1281, 785: 1281, 792: 1281, 1281, 1281}, // 1040 - {2: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 10: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 51: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 476: 1255, 478: 1255, 1255, 1255, 482: 1255, 485: 1255, 1255, 488: 1255, 1255, 1255, 495: 1255, 498: 1255, 507: 1255, 1255, 511: 1255, 533: 1255, 567: 1255, 570: 1255, 1255, 573: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 585: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 595: 1255, 1255, 598: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 651: 1255, 654: 3572, 749: 3570, 3571, 789: 3573, 792: 3574, 821: 3598, 3575}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3599}, - {50: 3600, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 3601}, - {1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 477: 1141, 1141, 1141, 1141, 1141, 483: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 492: 1141, 1141, 1141, 496: 1141, 1141, 499: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 509: 1141, 1141, 512: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 534: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 568: 1141, 1141, 597: 1141}, + {2: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 10: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 59: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 492: 1280, 494: 1280, 1280, 1280, 1280, 502: 1280, 1280, 1280, 1280, 1280, 510: 1280, 514: 1280, 1280, 522: 1280, 525: 1280, 534: 1280, 541: 1280, 549: 1280, 583: 1280, 587: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 601: 1280, 1280, 1280, 1280, 1280, 1280, 608: 1280, 1280, 1280, 1280, 1280, 614: 1280, 1280, 617: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 665: 1280, 669: 1280, 671: 1280, 767: 1280, 1280, 775: 1280, 1280, 1280, 785: 1280, 792: 1280, 1280, 1280}, + {2: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 10: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 59: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 492: 1279, 494: 1279, 1279, 1279, 1279, 502: 1279, 1279, 1279, 1279, 1279, 510: 1279, 514: 1279, 1279, 522: 1279, 525: 1279, 549: 1279, 583: 1279, 587: 1279, 589: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 601: 1279, 1279, 1279, 1279, 1279, 1279, 608: 1279, 1279, 1279, 1279, 1279, 614: 1279, 1279, 617: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 669: 1279, 671: 3661}, + {2: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 10: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 59: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 492: 1277, 494: 1277, 1277, 1277, 1277, 502: 1277, 1277, 1277, 1277, 1277, 510: 1277, 514: 1277, 1277, 522: 1277, 525: 1277, 549: 1277, 583: 1277, 587: 1277, 589: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 601: 1277, 1277, 1277, 1277, 1277, 1277, 608: 1277, 1277, 1277, 1277, 1277, 614: 1277, 1277, 617: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 669: 1277}, + {2: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 10: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 59: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 492: 1274, 494: 1274, 1274, 1274, 1274, 502: 1274, 1274, 1274, 1274, 1274, 510: 1274, 514: 1274, 1274, 522: 1274, 525: 1274, 549: 1274, 583: 1274, 587: 1274, 589: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 601: 1274, 1274, 1274, 1274, 1274, 1274, 608: 1274, 1274, 1274, 1274, 1274, 614: 1274, 1274, 617: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 669: 1274}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3657}, // 1045 - {2: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 10: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 51: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 476: 1255, 478: 1255, 1255, 1255, 482: 1255, 485: 1255, 1255, 488: 1255, 1255, 1255, 495: 1255, 498: 1255, 507: 1255, 1255, 511: 1255, 533: 1255, 567: 1255, 570: 1255, 1255, 573: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 585: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 595: 1255, 1255, 598: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 651: 1255, 654: 3572, 749: 3570, 3571, 789: 3573, 792: 3574, 821: 3603, 3575}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3604}, - {50: 3605, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 3606}, - {1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 477: 1142, 1142, 1142, 1142, 1142, 483: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 492: 1142, 1142, 1142, 496: 1142, 1142, 499: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 509: 1142, 1142, 512: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 534: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 568: 1142, 1142, 597: 1142}, + {58: 3658, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 3659}, + {1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 493: 1160, 1160, 1160, 497: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 508: 1160, 1160, 511: 1160, 1160, 1160, 516: 1160, 1160, 1160, 1160, 1160, 1160, 523: 1160, 1160, 526: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 550: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 584: 1160, 1160, 1160, 616: 1160}, + {995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 493: 995, 995, 995, 497: 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 508: 995, 995, 511: 995, 995, 995, 516: 995, 995, 995, 995, 995, 995, 523: 995, 995, 526: 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 550: 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 584: 995, 995, 995, 616: 995}, + {2: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 10: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 59: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 492: 1273, 494: 1273, 1273, 1273, 1273, 502: 1273, 1273, 1273, 1273, 1273, 510: 1273, 514: 1273, 1273, 522: 1273, 525: 1273, 549: 1273, 583: 1273, 587: 1273, 589: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 601: 1273, 1273, 1273, 1273, 1273, 1273, 608: 1273, 1273, 1273, 1273, 1273, 614: 1273, 1273, 617: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 669: 1273}, // 1050 - {2: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 10: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 51: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 476: 1255, 478: 1255, 1255, 1255, 482: 1255, 485: 1255, 1255, 488: 1255, 1255, 1255, 495: 1255, 498: 1255, 507: 1255, 1255, 511: 1255, 533: 1255, 567: 1255, 570: 1255, 1255, 573: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 585: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 595: 1255, 1255, 598: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 651: 1255, 654: 3572, 749: 3570, 3571, 789: 3573, 792: 3574, 821: 3608, 3575}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3609}, - {50: 3610, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 3611}, - {1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 477: 1143, 1143, 1143, 1143, 1143, 483: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 492: 1143, 1143, 1143, 496: 1143, 1143, 499: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 509: 1143, 1143, 512: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 534: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 568: 1143, 1143, 597: 1143}, + {2: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 10: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 59: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 492: 1278, 494: 1278, 1278, 1278, 1278, 502: 1278, 1278, 1278, 1278, 1278, 510: 1278, 514: 1278, 1278, 522: 1278, 525: 1278, 549: 1278, 583: 1278, 587: 1278, 589: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 601: 1278, 1278, 1278, 1278, 1278, 1278, 608: 1278, 1278, 1278, 1278, 1278, 614: 1278, 1278, 617: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 669: 1278, 671: 3652, 767: 3650, 3651, 808: 3653, 810: 3654, 839: 3663, 3655}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3664}, + {58: 3665, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 3666}, + {1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 493: 1161, 1161, 1161, 497: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 508: 1161, 1161, 511: 1161, 1161, 1161, 516: 1161, 1161, 1161, 1161, 1161, 1161, 523: 1161, 1161, 526: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 550: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 584: 1161, 1161, 1161, 616: 1161}, // 1055 - {2: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 10: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 51: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 476: 1255, 478: 1255, 1255, 1255, 482: 1255, 485: 1255, 1255, 488: 1255, 1255, 1255, 495: 1255, 498: 1255, 507: 1255, 1255, 511: 1255, 533: 1255, 567: 1255, 570: 1255, 1255, 573: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 585: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 595: 1255, 1255, 598: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 651: 1255, 654: 3572, 749: 3570, 3571, 789: 3573, 792: 3574, 821: 3613, 3575}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3614, 782: 3615}, - {1940, 1940, 9: 1940, 50: 1940, 128: 1940, 484: 1940, 505: 1940, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {9: 3616, 50: 1311, 128: 1311, 505: 2748, 772: 2749, 817: 3617}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3623}, + {2: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 10: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 59: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 492: 1278, 494: 1278, 1278, 1278, 1278, 502: 1278, 1278, 1278, 1278, 1278, 510: 1278, 514: 1278, 1278, 522: 1278, 525: 1278, 549: 1278, 583: 1278, 587: 1278, 589: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 601: 1278, 1278, 1278, 1278, 1278, 1278, 608: 1278, 1278, 1278, 1278, 1278, 614: 1278, 1278, 617: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 669: 1278, 671: 3652, 767: 3650, 3651, 808: 3653, 810: 3654, 839: 3668, 3655}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3669}, + {58: 3670, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 3671}, + {1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 493: 1162, 1162, 1162, 497: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 508: 1162, 1162, 511: 1162, 1162, 1162, 516: 1162, 1162, 1162, 1162, 1162, 1162, 523: 1162, 1162, 526: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 550: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 584: 1162, 1162, 1162, 616: 1162}, // 1060 - {50: 1130, 128: 3619, 1274: 3618}, - {50: 3621}, - {478: 3620}, - {50: 1129}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 3622}, + {2: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 10: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 59: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 492: 1278, 494: 1278, 1278, 1278, 1278, 502: 1278, 1278, 1278, 1278, 1278, 510: 1278, 514: 1278, 1278, 522: 1278, 525: 1278, 549: 1278, 583: 1278, 587: 1278, 589: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 601: 1278, 1278, 1278, 1278, 1278, 1278, 608: 1278, 1278, 1278, 1278, 1278, 614: 1278, 1278, 617: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 669: 1278, 671: 3652, 767: 3650, 3651, 808: 3653, 810: 3654, 839: 3673, 3655}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3674}, + {58: 3675, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 3676}, + {1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 493: 1163, 1163, 1163, 497: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 508: 1163, 1163, 511: 1163, 1163, 1163, 516: 1163, 1163, 1163, 1163, 1163, 1163, 523: 1163, 1163, 526: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 550: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 584: 1163, 1163, 1163, 616: 1163}, // 1065 - {1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 477: 1144, 1144, 1144, 1144, 1144, 483: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 492: 1144, 1144, 1144, 496: 1144, 1144, 499: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 509: 1144, 1144, 512: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 534: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 568: 1144, 1144, 597: 1144}, - {1939, 1939, 9: 1939, 50: 1939, 128: 1939, 484: 1939, 505: 1939, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 523: 3628, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 654: 3627, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3625, 749: 3570, 3571, 789: 3626}, - {50: 3636, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3614, 782: 3634}, + {2: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 10: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 59: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 492: 1278, 494: 1278, 1278, 1278, 1278, 502: 1278, 1278, 1278, 1278, 1278, 510: 1278, 514: 1278, 1278, 522: 1278, 525: 1278, 549: 1278, 583: 1278, 587: 1278, 589: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 601: 1278, 1278, 1278, 1278, 1278, 1278, 608: 1278, 1278, 1278, 1278, 1278, 614: 1278, 1278, 617: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 669: 1278, 671: 3652, 767: 3650, 3651, 808: 3653, 810: 3654, 839: 3678, 3655}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3679}, + {58: 3680, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 3681}, + {1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 493: 1164, 1164, 1164, 497: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 508: 1164, 1164, 511: 1164, 1164, 1164, 516: 1164, 1164, 1164, 1164, 1164, 1164, 523: 1164, 1164, 526: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 550: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 584: 1164, 1164, 1164, 616: 1164}, // 1070 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3631}, - {50: 3629}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 3630}, - {1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 477: 1145, 1145, 1145, 1145, 1145, 483: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 492: 1145, 1145, 1145, 496: 1145, 1145, 499: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 509: 1145, 1145, 512: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 534: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 568: 1145, 1145, 597: 1145}, - {50: 3632, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, + {2: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 10: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 59: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 492: 1278, 494: 1278, 1278, 1278, 1278, 502: 1278, 1278, 1278, 1278, 1278, 510: 1278, 514: 1278, 1278, 522: 1278, 525: 1278, 549: 1278, 583: 1278, 587: 1278, 589: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 601: 1278, 1278, 1278, 1278, 1278, 1278, 608: 1278, 1278, 1278, 1278, 1278, 614: 1278, 1278, 617: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 669: 1278, 671: 3652, 767: 3650, 3651, 808: 3653, 810: 3654, 839: 3683, 3655}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3684}, + {58: 3685, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 3686}, + {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 493: 1165, 1165, 1165, 497: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 508: 1165, 1165, 511: 1165, 1165, 1165, 516: 1165, 1165, 1165, 1165, 1165, 1165, 523: 1165, 1165, 526: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 550: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 616: 1165}, // 1075 - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 3633}, - {1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 477: 1147, 1147, 1147, 1147, 1147, 483: 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 492: 1147, 1147, 1147, 496: 1147, 1147, 499: 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 509: 1147, 1147, 512: 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 534: 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 568: 1147, 1147, 597: 1147}, - {9: 3616, 50: 3635}, - {1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 477: 1148, 1148, 1148, 1148, 1148, 483: 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 492: 1148, 1148, 1148, 496: 1148, 1148, 499: 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 509: 1148, 1148, 512: 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 534: 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 568: 1148, 1148, 597: 1148}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 3637}, + {2: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 10: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 59: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 492: 1278, 494: 1278, 1278, 1278, 1278, 502: 1278, 1278, 1278, 1278, 1278, 510: 1278, 514: 1278, 1278, 522: 1278, 525: 1278, 549: 1278, 583: 1278, 587: 1278, 589: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 601: 1278, 1278, 1278, 1278, 1278, 1278, 608: 1278, 1278, 1278, 1278, 1278, 614: 1278, 1278, 617: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 669: 1278, 671: 3652, 767: 3650, 3651, 808: 3653, 810: 3654, 839: 3688, 3655}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3689}, + {58: 3690, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 3691}, + {1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 493: 1166, 1166, 1166, 497: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 508: 1166, 1166, 511: 1166, 1166, 1166, 516: 1166, 1166, 1166, 1166, 1166, 1166, 523: 1166, 1166, 526: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 550: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 584: 1166, 1166, 1166, 616: 1166}, // 1080 - {1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 477: 1146, 1146, 1146, 1146, 1146, 483: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 492: 1146, 1146, 1146, 496: 1146, 1146, 499: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 509: 1146, 1146, 512: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 534: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 568: 1146, 1146, 597: 1146}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 654: 3640, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3639}, - {50: 3644, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3641}, - {50: 3642, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, + {2: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 10: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 59: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 492: 1278, 494: 1278, 1278, 1278, 1278, 502: 1278, 1278, 1278, 1278, 1278, 510: 1278, 514: 1278, 1278, 522: 1278, 525: 1278, 549: 1278, 583: 1278, 587: 1278, 589: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 601: 1278, 1278, 1278, 1278, 1278, 1278, 608: 1278, 1278, 1278, 1278, 1278, 614: 1278, 1278, 617: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 669: 1278, 671: 3652, 767: 3650, 3651, 808: 3653, 810: 3654, 839: 3693, 3655}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3694, 801: 3695}, + {1982, 1982, 9: 1982, 58: 1982, 137: 1982, 501: 1982, 523: 1982, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {9: 3696, 58: 1336, 137: 1336, 523: 2812, 790: 2813, 836: 3697}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3703}, // 1085 - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 3643}, - {1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 477: 1149, 1149, 1149, 1149, 1149, 483: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 492: 1149, 1149, 1149, 496: 1149, 1149, 499: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 509: 1149, 1149, 512: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 534: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 568: 1149, 1149, 597: 1149}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 3645}, - {1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 477: 1150, 1150, 1150, 1150, 1150, 483: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 492: 1150, 1150, 1150, 496: 1150, 1150, 499: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 509: 1150, 1150, 512: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 534: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 568: 1150, 1150, 597: 1150}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 654: 3648, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3647}, + {58: 1153, 137: 3699, 1299: 3698}, + {58: 3701}, + {494: 3700}, + {58: 1152}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 3702}, // 1090 - {50: 3652, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3649}, - {50: 3650, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 3651}, - {1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 477: 1151, 1151, 1151, 1151, 1151, 483: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 492: 1151, 1151, 1151, 496: 1151, 1151, 499: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 509: 1151, 1151, 512: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 534: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 568: 1151, 1151, 597: 1151}, + {1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 493: 1167, 1167, 1167, 497: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 508: 1167, 1167, 511: 1167, 1167, 1167, 516: 1167, 1167, 1167, 1167, 1167, 1167, 523: 1167, 1167, 526: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 550: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 584: 1167, 1167, 1167, 616: 1167}, + {1981, 1981, 9: 1981, 58: 1981, 137: 1981, 501: 1981, 523: 1981, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 541: 3708, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 671: 3707, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3705, 767: 3650, 3651, 808: 3706}, + {58: 3716, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3694, 801: 3714}, // 1095 - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 3653}, - {1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 477: 1152, 1152, 1152, 1152, 1152, 483: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 492: 1152, 1152, 1152, 496: 1152, 1152, 499: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 509: 1152, 1152, 512: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 534: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 568: 1152, 1152, 597: 1152}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 654: 3656, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3655}, - {50: 3660, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3657}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3711}, + {58: 3709}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 3710}, + {1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 493: 1168, 1168, 1168, 497: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 508: 1168, 1168, 511: 1168, 1168, 1168, 516: 1168, 1168, 1168, 1168, 1168, 1168, 523: 1168, 1168, 526: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 550: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 584: 1168, 1168, 1168, 616: 1168}, + {58: 3712, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, // 1100 - {50: 3658, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 3659}, - {1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 477: 1153, 1153, 1153, 1153, 1153, 483: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 492: 1153, 1153, 1153, 496: 1153, 1153, 499: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 509: 1153, 1153, 512: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 534: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 568: 1153, 1153, 597: 1153}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 3661}, - {1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 477: 1154, 1154, 1154, 1154, 1154, 483: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 492: 1154, 1154, 1154, 496: 1154, 1154, 499: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 509: 1154, 1154, 512: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 534: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 568: 1154, 1154, 597: 1154}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 3713}, + {1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 493: 1170, 1170, 1170, 497: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 508: 1170, 1170, 511: 1170, 1170, 1170, 516: 1170, 1170, 1170, 1170, 1170, 1170, 523: 1170, 1170, 526: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 550: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 584: 1170, 1170, 1170, 616: 1170}, + {9: 3696, 58: 3715}, + {1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 493: 1171, 1171, 1171, 497: 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 508: 1171, 1171, 511: 1171, 1171, 1171, 516: 1171, 1171, 1171, 1171, 1171, 1171, 523: 1171, 1171, 526: 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 550: 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 584: 1171, 1171, 1171, 616: 1171}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 3717}, // 1105 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3614, 782: 3663}, - {9: 3616, 50: 3664}, - {1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 477: 1155, 1155, 1155, 1155, 1155, 483: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 492: 1155, 1155, 1155, 496: 1155, 1155, 499: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 509: 1155, 1155, 512: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 534: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 568: 1155, 1155, 597: 1155}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3614, 782: 3666}, - {9: 3616, 50: 3667}, + {1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 493: 1169, 1169, 1169, 497: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 508: 1169, 1169, 511: 1169, 1169, 1169, 516: 1169, 1169, 1169, 1169, 1169, 1169, 523: 1169, 1169, 526: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 550: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 584: 1169, 1169, 1169, 616: 1169}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 671: 3720, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3719}, + {58: 3724, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3721}, + {58: 3722, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, // 1110 - {1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 477: 1156, 1156, 1156, 1156, 1156, 483: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 492: 1156, 1156, 1156, 496: 1156, 1156, 499: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 509: 1156, 1156, 512: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 534: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 568: 1156, 1156, 597: 1156}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3669}, - {9: 3670, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3671}, - {9: 3672, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 3723}, + {1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 493: 1172, 1172, 1172, 497: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 508: 1172, 1172, 511: 1172, 1172, 1172, 516: 1172, 1172, 1172, 1172, 1172, 1172, 523: 1172, 1172, 526: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 550: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 584: 1172, 1172, 1172, 616: 1172}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 3725}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 493: 1173, 1173, 1173, 497: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 508: 1173, 1173, 511: 1173, 1173, 1173, 516: 1173, 1173, 1173, 1173, 1173, 1173, 523: 1173, 1173, 526: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 550: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 584: 1173, 1173, 1173, 616: 1173}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 671: 3728, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3727}, // 1115 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3673}, - {50: 3674, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 477: 1172, 1172, 1172, 1172, 1172, 483: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 492: 1172, 1172, 1172, 496: 1172, 1172, 499: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 509: 1172, 1172, 512: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 534: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 568: 1172, 1172, 597: 1172}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3676, 1194: 3678, 1249: 3679, 1337: 3680, 3677}, - {50: 3688, 503: 3689, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, + {58: 3732, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3729}, + {58: 3730, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 3731}, + {1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 493: 1174, 1174, 1174, 497: 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 508: 1174, 1174, 511: 1174, 1174, 1174, 516: 1174, 1174, 1174, 1174, 1174, 1174, 523: 1174, 1174, 526: 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 550: 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 584: 1174, 1174, 1174, 616: 1174}, // 1120 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 503: 3682, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3681}, - {2: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 10: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 51: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 476: 1163, 478: 1163, 1163, 1163, 482: 1163, 485: 1163, 1163, 488: 1163, 1163, 1163, 495: 1163, 498: 1163, 503: 1163, 507: 1163, 1163, 511: 1163, 533: 1163, 567: 1163, 570: 1163, 1163, 573: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 585: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 595: 1163, 1163, 598: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 651: 1163}, - {2: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 10: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 51: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 476: 1162, 478: 1162, 1162, 1162, 482: 1162, 485: 1162, 1162, 488: 1162, 1162, 1162, 495: 1162, 498: 1162, 503: 1162, 507: 1162, 1162, 511: 1162, 533: 1162, 567: 1162, 570: 1162, 1162, 573: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 585: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 595: 1162, 1162, 598: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 651: 1162}, - {2: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 10: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 51: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 476: 1161, 478: 1161, 1161, 1161, 482: 1161, 485: 1161, 1161, 488: 1161, 1161, 1161, 495: 1161, 498: 1161, 503: 1161, 507: 1161, 1161, 511: 1161, 533: 1161, 567: 1161, 570: 1161, 1161, 573: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 585: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 595: 1161, 1161, 598: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 651: 1161}, - {503: 3685, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 3733}, + {1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 493: 1175, 1175, 1175, 497: 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 508: 1175, 1175, 511: 1175, 1175, 1175, 516: 1175, 1175, 1175, 1175, 1175, 1175, 523: 1175, 1175, 526: 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 550: 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 584: 1175, 1175, 1175, 616: 1175}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 671: 3736, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3735}, + {58: 3740, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3737}, // 1125 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3683}, - {50: 3684, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 477: 1178, 1178, 1178, 1178, 1178, 483: 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 492: 1178, 1178, 1178, 496: 1178, 1178, 499: 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 509: 1178, 1178, 512: 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 534: 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 568: 1178, 1178, 597: 1178}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3686}, - {50: 3687, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, + {58: 3738, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 3739}, + {1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 493: 1176, 1176, 1176, 497: 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 508: 1176, 1176, 511: 1176, 1176, 1176, 516: 1176, 1176, 1176, 1176, 1176, 1176, 523: 1176, 1176, 526: 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 550: 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 584: 1176, 1176, 1176, 616: 1176}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 3741}, + {1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 493: 1177, 1177, 1177, 497: 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 508: 1177, 1177, 511: 1177, 1177, 1177, 516: 1177, 1177, 1177, 1177, 1177, 1177, 523: 1177, 1177, 526: 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 550: 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 584: 1177, 1177, 1177, 616: 1177}, // 1130 - {1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 477: 1177, 1177, 1177, 1177, 1177, 483: 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 492: 1177, 1177, 1177, 496: 1177, 1177, 499: 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 509: 1177, 1177, 512: 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 534: 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 568: 1177, 1177, 597: 1177}, - {1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 477: 1180, 1180, 1180, 1180, 1180, 483: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 492: 1180, 1180, 1180, 496: 1180, 1180, 499: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 509: 1180, 1180, 512: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 534: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 568: 1180, 1180, 597: 1180}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3690}, - {50: 3691, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 477: 1179, 1179, 1179, 1179, 1179, 483: 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 492: 1179, 1179, 1179, 496: 1179, 1179, 499: 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 509: 1179, 1179, 512: 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 534: 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 568: 1179, 1179, 597: 1179}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3694, 801: 3743}, + {9: 3696, 58: 3744}, + {1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 493: 1178, 1178, 1178, 497: 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 508: 1178, 1178, 511: 1178, 1178, 1178, 516: 1178, 1178, 1178, 1178, 1178, 1178, 523: 1178, 1178, 526: 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 550: 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 584: 1178, 1178, 1178, 616: 1178}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3694, 801: 3746}, + {9: 3696, 58: 3747}, // 1135 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3693}, - {9: 3694, 503: 3695, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3701}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3696}, - {50: 3697, 497: 3698, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, + {1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 493: 1179, 1179, 1179, 497: 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 508: 1179, 1179, 511: 1179, 1179, 1179, 516: 1179, 1179, 1179, 1179, 1179, 1179, 523: 1179, 1179, 526: 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 550: 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 584: 1179, 1179, 1179, 616: 1179}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3749}, + {9: 3750, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3751}, + {9: 3752, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, // 1140 - {1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 477: 1185, 1185, 1185, 1185, 1185, 483: 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 492: 1185, 1185, 1185, 496: 1185, 1185, 499: 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 509: 1185, 1185, 512: 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 534: 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 568: 1185, 1185, 597: 1185}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3699}, - {50: 3700, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 477: 1183, 1183, 1183, 1183, 1183, 483: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 492: 1183, 1183, 1183, 496: 1183, 1183, 499: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 509: 1183, 1183, 512: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 534: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 568: 1183, 1183, 597: 1183}, - {9: 3703, 50: 3702, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3753}, + {58: 3754, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 493: 1195, 1195, 1195, 497: 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 508: 1195, 1195, 511: 1195, 1195, 1195, 516: 1195, 1195, 1195, 1195, 1195, 1195, 523: 1195, 1195, 526: 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 550: 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 584: 1195, 1195, 1195, 616: 1195}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3756, 1220: 3758, 1274: 3759, 1362: 3760, 3757}, + {58: 3768, 520: 3769, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, // 1145 - {1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 477: 1186, 1186, 1186, 1186, 1186, 483: 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 492: 1186, 1186, 1186, 496: 1186, 1186, 499: 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 509: 1186, 1186, 512: 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 534: 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 568: 1186, 1186, 597: 1186}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3704}, - {50: 3705, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 477: 1184, 1184, 1184, 1184, 1184, 483: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 492: 1184, 1184, 1184, 496: 1184, 1184, 499: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 509: 1184, 1184, 512: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 534: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 568: 1184, 1184, 597: 1184}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 3707}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 520: 3762, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3761}, + {2: 1186, 1186, 1186, 1186, 1186, 1186, 1186, 10: 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 59: 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 492: 1186, 494: 1186, 1186, 1186, 1186, 502: 1186, 1186, 1186, 1186, 1186, 510: 1186, 514: 1186, 1186, 520: 1186, 522: 1186, 525: 1186, 549: 1186, 583: 1186, 587: 1186, 589: 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 601: 1186, 1186, 1186, 1186, 1186, 1186, 608: 1186, 1186, 1186, 1186, 1186, 614: 1186, 1186, 617: 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 669: 1186}, + {2: 1185, 1185, 1185, 1185, 1185, 1185, 1185, 10: 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 59: 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 492: 1185, 494: 1185, 1185, 1185, 1185, 502: 1185, 1185, 1185, 1185, 1185, 510: 1185, 514: 1185, 1185, 520: 1185, 522: 1185, 525: 1185, 549: 1185, 583: 1185, 587: 1185, 589: 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 601: 1185, 1185, 1185, 1185, 1185, 1185, 608: 1185, 1185, 1185, 1185, 1185, 614: 1185, 1185, 617: 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 669: 1185}, + {2: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 10: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 59: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 492: 1184, 494: 1184, 1184, 1184, 1184, 502: 1184, 1184, 1184, 1184, 1184, 510: 1184, 514: 1184, 1184, 520: 1184, 522: 1184, 525: 1184, 549: 1184, 583: 1184, 587: 1184, 589: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 601: 1184, 1184, 1184, 1184, 1184, 1184, 608: 1184, 1184, 1184, 1184, 1184, 614: 1184, 1184, 617: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 669: 1184}, + {520: 3765, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, // 1150 - {488: 3712, 3713, 3718, 523: 3714, 547: 3720, 550: 3715, 3716, 3709, 3719, 3708, 3717, 3710, 3711}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 3742}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 3741}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 3740}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 3739}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3763}, + {58: 3764, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 493: 1201, 1201, 1201, 497: 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 508: 1201, 1201, 511: 1201, 1201, 1201, 516: 1201, 1201, 1201, 1201, 1201, 1201, 523: 1201, 1201, 526: 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 550: 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 584: 1201, 1201, 1201, 616: 1201}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3766}, + {58: 3767, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, // 1155 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3736, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 3735}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3730, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 3729}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 3728}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 3727}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 3726}, + {1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 493: 1200, 1200, 1200, 497: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 508: 1200, 1200, 511: 1200, 1200, 1200, 516: 1200, 1200, 1200, 1200, 1200, 1200, 523: 1200, 1200, 526: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 550: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 584: 1200, 1200, 1200, 616: 1200}, + {1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 493: 1203, 1203, 1203, 497: 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 508: 1203, 1203, 511: 1203, 1203, 1203, 516: 1203, 1203, 1203, 1203, 1203, 1203, 523: 1203, 1203, 526: 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 550: 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 584: 1203, 1203, 1203, 616: 1203}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3770}, + {58: 3771, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 493: 1202, 1202, 1202, 497: 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 508: 1202, 1202, 511: 1202, 1202, 1202, 516: 1202, 1202, 1202, 1202, 1202, 1202, 523: 1202, 1202, 526: 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 550: 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 584: 1202, 1202, 1202, 616: 1202}, // 1160 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 3725}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 3724}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 3723}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3721}, - {50: 3722, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3773}, + {9: 3774, 520: 3775, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3781}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3776}, + {58: 3777, 513: 3778, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, // 1165 - {1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 477: 1187, 1187, 1187, 1187, 1187, 483: 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 492: 1187, 1187, 1187, 496: 1187, 1187, 499: 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 509: 1187, 1187, 512: 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 534: 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 568: 1187, 1187, 597: 1187}, - {1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 477: 1295, 1295, 1295, 1295, 1295, 483: 1295, 1295, 1295, 1295, 488: 1295, 1295, 1295, 492: 1295, 1295, 1295, 496: 1295, 1295, 499: 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 509: 1295, 1295, 512: 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 534: 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 568: 1295, 1295}, - {1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 477: 1296, 1296, 1296, 1296, 1296, 483: 1296, 1296, 1296, 1296, 488: 1296, 1296, 1296, 492: 1296, 1296, 1296, 496: 1296, 1296, 499: 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 509: 1296, 1296, 512: 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 534: 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 3719, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 568: 1296, 1296}, - {1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 477: 1297, 1297, 1297, 1297, 1297, 483: 1297, 1297, 1297, 1297, 488: 1297, 1297, 1297, 492: 1297, 1297, 1297, 496: 1297, 1297, 499: 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 509: 1297, 1297, 512: 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 534: 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 3719, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 568: 1297, 1297}, - {1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 477: 1298, 1298, 1298, 1298, 1298, 483: 1298, 1298, 1298, 1298, 488: 1298, 1298, 1298, 492: 1298, 1298, 1298, 496: 1298, 1298, 499: 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 509: 1298, 1298, 512: 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 534: 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 3719, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 568: 1298, 1298}, + {1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 493: 1208, 1208, 1208, 497: 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 508: 1208, 1208, 511: 1208, 1208, 1208, 516: 1208, 1208, 1208, 1208, 1208, 1208, 523: 1208, 1208, 526: 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 550: 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 584: 1208, 1208, 1208, 616: 1208}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3779}, + {58: 3780, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 493: 1206, 1206, 1206, 497: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 508: 1206, 1206, 511: 1206, 1206, 1206, 516: 1206, 1206, 1206, 1206, 1206, 1206, 523: 1206, 1206, 526: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 550: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 584: 1206, 1206, 1206, 616: 1206}, + {9: 3783, 58: 3782, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, // 1170 - {1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 477: 1299, 1299, 1299, 1299, 1299, 483: 1299, 1299, 1299, 1299, 488: 1299, 1299, 1299, 492: 1299, 1299, 1299, 496: 1299, 1299, 499: 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 509: 1299, 1299, 512: 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 534: 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 3719, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 568: 1299, 1299}, - {1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 477: 1300, 1300, 1300, 1300, 1300, 483: 1300, 1300, 1300, 1300, 488: 1300, 1300, 1300, 492: 1300, 1300, 1300, 496: 1300, 1300, 499: 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 509: 1300, 1300, 512: 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 534: 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 3719, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 568: 1300, 1300}, - {1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 477: 1304, 1304, 1304, 1304, 1304, 483: 1304, 1304, 1304, 1304, 488: 1304, 1304, 3718, 492: 1304, 1304, 1304, 496: 1304, 1304, 499: 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 509: 1304, 1304, 512: 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 3714, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 534: 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 3715, 3716, 1304, 3719, 1304, 3717, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 568: 1304, 1304}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 1240, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3731}, - {105: 3490, 3486, 109: 3483, 3498, 113: 3485, 3482, 3484, 3488, 3489, 3494, 3493, 3492, 3496, 3497, 3491, 3495, 3487, 510: 3371, 512: 3369, 3370, 3368, 3366, 535: 3480, 3477, 3479, 3478, 3474, 3476, 3475, 3472, 3473, 3471, 3481, 738: 3367, 3365, 800: 3470, 820: 3732}, + {1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 493: 1209, 1209, 1209, 497: 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 508: 1209, 1209, 511: 1209, 1209, 1209, 516: 1209, 1209, 1209, 1209, 1209, 1209, 523: 1209, 1209, 526: 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 550: 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 584: 1209, 1209, 1209, 616: 1209}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3784}, + {58: 3785, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 493: 1207, 1207, 1207, 497: 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 508: 1207, 1207, 511: 1207, 1207, 1207, 516: 1207, 1207, 1207, 1207, 1207, 1207, 523: 1207, 1207, 526: 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 550: 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 584: 1207, 1207, 1207, 616: 1207}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 3787}, // 1175 - {1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 477: 1302, 1302, 1302, 1302, 1302, 483: 1302, 1302, 1302, 1302, 488: 1302, 1302, 1302, 492: 1302, 1302, 1302, 496: 1302, 1302, 499: 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 509: 1302, 1302, 512: 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 534: 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 568: 1302, 1302}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 3734}, - {1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 477: 1301, 1301, 1301, 1301, 1301, 483: 1301, 1301, 1301, 1301, 488: 1301, 1301, 3718, 492: 1301, 1301, 1301, 496: 1301, 1301, 499: 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 509: 1301, 1301, 512: 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 3714, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 534: 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 3715, 3716, 1301, 3719, 1301, 3717, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 568: 1301, 1301}, - {1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 477: 1305, 1305, 1305, 1305, 1305, 483: 1305, 1305, 1305, 1305, 488: 1305, 1305, 3718, 492: 1305, 1305, 1305, 496: 1305, 1305, 499: 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 509: 1305, 1305, 512: 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 3714, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 534: 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 3715, 3716, 1305, 3719, 1305, 3717, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 568: 1305, 1305}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 1240, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3737}, + {504: 3792, 3793, 3798, 541: 3794, 564: 3800, 566: 3795, 3796, 3789, 3799, 3788, 3797, 3790, 3791}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 3822}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 3821}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 3820}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 3819}, // 1180 - {105: 3490, 3486, 109: 3483, 3498, 113: 3485, 3482, 3484, 3488, 3489, 3494, 3493, 3492, 3496, 3497, 3491, 3495, 3487, 510: 3371, 512: 3369, 3370, 3368, 3366, 535: 3480, 3477, 3479, 3478, 3474, 3476, 3475, 3472, 3473, 3471, 3481, 738: 3367, 3365, 800: 3470, 820: 3738}, - {1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 477: 1303, 1303, 1303, 1303, 1303, 483: 1303, 1303, 1303, 1303, 488: 1303, 1303, 1303, 492: 1303, 1303, 1303, 496: 1303, 1303, 499: 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 509: 1303, 1303, 512: 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 534: 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 568: 1303, 1303}, - {1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 477: 1306, 1306, 1306, 1306, 1306, 483: 1306, 1306, 1306, 1306, 488: 3712, 3713, 3718, 492: 1306, 1306, 1306, 496: 1306, 1306, 499: 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 509: 1306, 1306, 512: 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 3714, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 534: 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 3715, 3716, 1306, 3719, 1306, 3717, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 568: 1306, 1306}, - {1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 477: 1307, 1307, 1307, 1307, 1307, 483: 1307, 1307, 1307, 1307, 488: 3712, 3713, 3718, 492: 1307, 1307, 1307, 496: 1307, 1307, 499: 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 509: 1307, 1307, 512: 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 3714, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 534: 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 3715, 3716, 1307, 3719, 1307, 3717, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 568: 1307, 1307}, - {1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 477: 1308, 1308, 1308, 1308, 1308, 483: 1308, 1308, 1308, 1308, 488: 3712, 3713, 3718, 492: 1308, 1308, 1308, 496: 1308, 1308, 499: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 509: 1308, 1308, 512: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 3714, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 534: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 3715, 3716, 1308, 3719, 1308, 3717, 3710, 3711, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 568: 1308, 1308}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3816, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 3815}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3810, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 3809}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 3808}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 3807}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 3806}, // 1185 - {1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 477: 1309, 1309, 1309, 1309, 1309, 483: 1309, 1309, 1309, 1309, 488: 3712, 3713, 3718, 492: 1309, 1309, 1309, 496: 1309, 1309, 499: 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 509: 1309, 1309, 512: 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 3714, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 534: 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 3715, 3716, 3709, 3719, 1309, 3717, 3710, 3711, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 568: 1309, 1309}, - {105: 3490, 3486, 109: 3483, 3498, 113: 3485, 3482, 3484, 3488, 3489, 3494, 3493, 3492, 3496, 3497, 3491, 3495, 3487, 535: 3480, 3477, 3479, 3478, 3474, 3476, 3475, 3472, 3473, 3471, 3481, 800: 3470, 820: 3744}, - {503: 3745}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3746}, - {50: 3747, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 3805}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 3804}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 3803}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3801}, + {58: 3802, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, // 1190 - {1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 477: 1189, 1189, 1189, 1189, 1189, 483: 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 492: 1189, 1189, 1189, 496: 1189, 1189, 499: 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 509: 1189, 1189, 512: 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 534: 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 568: 1189, 1189, 597: 1189}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3749}, - {9: 3750, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {581: 3751}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3752}, + {1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 493: 1210, 1210, 1210, 497: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 508: 1210, 1210, 511: 1210, 1210, 1210, 516: 1210, 1210, 1210, 1210, 1210, 1210, 523: 1210, 1210, 526: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 550: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 584: 1210, 1210, 1210, 616: 1210}, + {1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 493: 1320, 1320, 1320, 497: 1320, 1320, 500: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 508: 1320, 1320, 511: 1320, 1320, 1320, 516: 1320, 1320, 1320, 1320, 1320, 1320, 523: 1320, 1320, 526: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 550: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 584: 1320, 1320, 1320}, + {1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 493: 1321, 1321, 1321, 497: 1321, 1321, 500: 1321, 1321, 1321, 1321, 1321, 1321, 1321, 508: 1321, 1321, 511: 1321, 1321, 1321, 516: 1321, 1321, 1321, 1321, 1321, 1321, 523: 1321, 1321, 526: 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 550: 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 3799, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 584: 1321, 1321, 1321}, + {1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 493: 1322, 1322, 1322, 497: 1322, 1322, 500: 1322, 1322, 1322, 1322, 1322, 1322, 1322, 508: 1322, 1322, 511: 1322, 1322, 1322, 516: 1322, 1322, 1322, 1322, 1322, 1322, 523: 1322, 1322, 526: 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 550: 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 3799, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 584: 1322, 1322, 1322}, + {1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 493: 1323, 1323, 1323, 497: 1323, 1323, 500: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 508: 1323, 1323, 511: 1323, 1323, 1323, 516: 1323, 1323, 1323, 1323, 1323, 1323, 523: 1323, 1323, 526: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 550: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 3799, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 584: 1323, 1323, 1323}, // 1195 - {105: 3490, 3486, 109: 3483, 3498, 113: 3485, 3482, 3484, 3488, 3489, 3494, 3493, 3492, 3496, 3497, 3491, 3495, 3487, 510: 3371, 512: 3369, 3370, 3368, 3366, 535: 3480, 3477, 3479, 3478, 3474, 3476, 3475, 3472, 3473, 3471, 3481, 738: 3367, 3365, 800: 3470, 820: 3753}, - {50: 3754}, - {1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 477: 1190, 1190, 1190, 1190, 1190, 483: 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 492: 1190, 1190, 1190, 496: 1190, 1190, 499: 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 509: 1190, 1190, 512: 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 534: 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 568: 1190, 1190, 597: 1190}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3756}, - {9: 3757, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, + {1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 493: 1324, 1324, 1324, 497: 1324, 1324, 500: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 508: 1324, 1324, 511: 1324, 1324, 1324, 516: 1324, 1324, 1324, 1324, 1324, 1324, 523: 1324, 1324, 526: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 550: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 3799, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 584: 1324, 1324, 1324}, + {1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 493: 1325, 1325, 1325, 497: 1325, 1325, 500: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 508: 1325, 1325, 511: 1325, 1325, 1325, 516: 1325, 1325, 1325, 1325, 1325, 1325, 523: 1325, 1325, 526: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 550: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 3799, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 584: 1325, 1325, 1325}, + {1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 493: 1329, 1329, 1329, 497: 1329, 1329, 500: 1329, 1329, 1329, 1329, 1329, 1329, 3798, 508: 1329, 1329, 511: 1329, 1329, 1329, 516: 1329, 1329, 1329, 1329, 1329, 1329, 523: 1329, 1329, 526: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 3794, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 550: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 3795, 3796, 1329, 3799, 1329, 3797, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 584: 1329, 1329, 1329}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 1263, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3811}, + {112: 3566, 3570, 3563, 3578, 118: 3565, 3562, 3564, 3568, 3569, 3574, 3573, 3572, 3576, 3577, 3571, 3575, 131: 3567, 527: 3451, 3449, 3450, 3448, 3446, 550: 3560, 3557, 3559, 3558, 3554, 3556, 3555, 3552, 3553, 3551, 3561, 756: 3447, 3445, 813: 3550, 828: 3812}, // 1200 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3759, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3758}, - {50: 3763, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 1240, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3760}, - {105: 3490, 3486, 109: 3483, 3498, 113: 3485, 3482, 3484, 3488, 3489, 3494, 3493, 3492, 3496, 3497, 3491, 3495, 3487, 510: 3371, 512: 3369, 3370, 3368, 3366, 535: 3480, 3477, 3479, 3478, 3474, 3476, 3475, 3472, 3473, 3471, 3481, 738: 3367, 3365, 800: 3470, 820: 3761}, - {50: 3762, 488: 3733}, + {1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 493: 1327, 1327, 1327, 497: 1327, 1327, 500: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 508: 1327, 1327, 511: 1327, 1327, 1327, 516: 1327, 1327, 1327, 1327, 1327, 1327, 523: 1327, 1327, 526: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 550: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 584: 1327, 1327, 1327}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 3814}, + {1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 493: 1326, 1326, 1326, 497: 1326, 1326, 500: 1326, 1326, 1326, 1326, 1326, 1326, 3798, 508: 1326, 1326, 511: 1326, 1326, 1326, 516: 1326, 1326, 1326, 1326, 1326, 1326, 523: 1326, 1326, 526: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 3794, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 550: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 3795, 3796, 1326, 3799, 1326, 3797, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 584: 1326, 1326, 1326}, + {1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 493: 1330, 1330, 1330, 497: 1330, 1330, 500: 1330, 1330, 1330, 1330, 1330, 1330, 3798, 508: 1330, 1330, 511: 1330, 1330, 1330, 516: 1330, 1330, 1330, 1330, 1330, 1330, 523: 1330, 1330, 526: 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 3794, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 550: 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 3795, 3796, 1330, 3799, 1330, 3797, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 584: 1330, 1330, 1330}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 1263, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3817}, // 1205 - {1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 477: 1191, 1191, 1191, 1191, 1191, 483: 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 492: 1191, 1191, 1191, 496: 1191, 1191, 499: 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 509: 1191, 1191, 512: 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 534: 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 568: 1191, 1191, 597: 1191}, - {1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 477: 1192, 1192, 1192, 1192, 1192, 483: 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 492: 1192, 1192, 1192, 496: 1192, 1192, 499: 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 509: 1192, 1192, 512: 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 534: 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 568: 1192, 1192, 597: 1192}, - {50: 1934, 511: 3766, 1059: 3765, 3767}, - {50: 1933}, - {50: 1932}, + {112: 3566, 3570, 3563, 3578, 118: 3565, 3562, 3564, 3568, 3569, 3574, 3573, 3572, 3576, 3577, 3571, 3575, 131: 3567, 527: 3451, 3449, 3450, 3448, 3446, 550: 3560, 3557, 3559, 3558, 3554, 3556, 3555, 3552, 3553, 3551, 3561, 756: 3447, 3445, 813: 3550, 828: 3818}, + {1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 493: 1328, 1328, 1328, 497: 1328, 1328, 500: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 508: 1328, 1328, 511: 1328, 1328, 1328, 516: 1328, 1328, 1328, 1328, 1328, 1328, 523: 1328, 1328, 526: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 550: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 584: 1328, 1328, 1328}, + {1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 493: 1331, 1331, 1331, 497: 1331, 1331, 500: 1331, 1331, 1331, 1331, 3792, 3793, 3798, 508: 1331, 1331, 511: 1331, 1331, 1331, 516: 1331, 1331, 1331, 1331, 1331, 1331, 523: 1331, 1331, 526: 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 3794, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 550: 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 3795, 3796, 1331, 3799, 1331, 3797, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 584: 1331, 1331, 1331}, + {1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 493: 1332, 1332, 1332, 497: 1332, 1332, 500: 1332, 1332, 1332, 1332, 3792, 3793, 3798, 508: 1332, 1332, 511: 1332, 1332, 1332, 516: 1332, 1332, 1332, 1332, 1332, 1332, 523: 1332, 1332, 526: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 3794, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 550: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 3795, 3796, 1332, 3799, 1332, 3797, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 584: 1332, 1332, 1332}, + {1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 493: 1333, 1333, 1333, 497: 1333, 1333, 500: 1333, 1333, 1333, 1333, 3792, 3793, 3798, 508: 1333, 1333, 511: 1333, 1333, 1333, 516: 1333, 1333, 1333, 1333, 1333, 1333, 523: 1333, 1333, 526: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 3794, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 550: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 3795, 3796, 1333, 3799, 1333, 3797, 3790, 3791, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 584: 1333, 1333, 1333}, // 1210 - {50: 3768}, - {1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 477: 1193, 1193, 1193, 1193, 1193, 483: 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 492: 1193, 1193, 1193, 496: 1193, 1193, 499: 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 509: 1193, 1193, 512: 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 534: 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 568: 1193, 1193, 597: 1193}, - {50: 1934, 511: 3766, 1059: 3765, 3770}, - {50: 3771}, - {1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 477: 1194, 1194, 1194, 1194, 1194, 483: 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 492: 1194, 1194, 1194, 496: 1194, 1194, 499: 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 509: 1194, 1194, 512: 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 534: 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 568: 1194, 1194, 597: 1194}, + {1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 493: 1334, 1334, 1334, 497: 1334, 1334, 500: 1334, 1334, 1334, 1334, 3792, 3793, 3798, 508: 1334, 1334, 511: 1334, 1334, 1334, 516: 1334, 1334, 1334, 1334, 1334, 1334, 523: 1334, 1334, 526: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 3794, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 550: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 3795, 3796, 3789, 3799, 1334, 3797, 3790, 3791, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 584: 1334, 1334, 1334}, + {112: 3566, 3570, 3563, 3578, 118: 3565, 3562, 3564, 3568, 3569, 3574, 3573, 3572, 3576, 3577, 3571, 3575, 131: 3567, 550: 3560, 3557, 3559, 3558, 3554, 3556, 3555, 3552, 3553, 3551, 3561, 813: 3550, 828: 3824}, + {520: 3825}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3826}, + {58: 3827, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, // 1215 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 3773}, - {9: 3774, 488: 3712, 3713, 3718, 523: 3714, 550: 3715, 3716, 3709, 3719, 3708, 3717, 3710, 3711}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 3775}, - {50: 3776, 488: 3712, 3713, 3718, 523: 3714, 550: 3715, 3716, 3709, 3719, 3708, 3717, 3710, 3711}, - {1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 477: 1196, 1196, 1196, 1196, 1196, 483: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 492: 1196, 1196, 1196, 496: 1196, 1196, 499: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 509: 1196, 1196, 512: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 534: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 568: 1196, 1196, 597: 1196}, + {1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 493: 1212, 1212, 1212, 497: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 508: 1212, 1212, 511: 1212, 1212, 1212, 516: 1212, 1212, 1212, 1212, 1212, 1212, 523: 1212, 1212, 526: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 550: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 584: 1212, 1212, 1212, 616: 1212}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3829}, + {9: 3830, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {599: 3831}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3832}, // 1220 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 1936, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3614, 782: 3778, 830: 3779}, - {9: 3616, 50: 1935}, - {50: 3780}, - {1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 477: 1197, 1197, 1197, 1197, 1197, 483: 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 492: 1197, 1197, 1197, 496: 1197, 1197, 499: 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 509: 1197, 1197, 512: 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 534: 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 568: 1197, 1197, 597: 1197}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3614, 782: 3782}, + {112: 3566, 3570, 3563, 3578, 118: 3565, 3562, 3564, 3568, 3569, 3574, 3573, 3572, 3576, 3577, 3571, 3575, 131: 3567, 527: 3451, 3449, 3450, 3448, 3446, 550: 3560, 3557, 3559, 3558, 3554, 3556, 3555, 3552, 3553, 3551, 3561, 756: 3447, 3445, 813: 3550, 828: 3833}, + {58: 3834}, + {1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 493: 1213, 1213, 1213, 497: 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 508: 1213, 1213, 511: 1213, 1213, 1213, 516: 1213, 1213, 1213, 1213, 1213, 1213, 523: 1213, 1213, 526: 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 550: 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 584: 1213, 1213, 1213, 616: 1213}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3836}, + {9: 3837, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, // 1225 - {9: 3616, 50: 3783, 484: 3784}, - {1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 477: 1202, 1202, 1202, 1202, 1202, 483: 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 492: 1202, 1202, 1202, 496: 1202, 1202, 499: 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 509: 1202, 1202, 512: 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 534: 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 568: 1202, 1202, 597: 1202}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 533: 3787, 664: 3517, 2785, 2786, 2784, 742: 3786, 811: 3785}, - {50: 3788}, - {771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 50: 771, 103: 771, 112: 771, 475: 771, 771, 771, 479: 771, 771, 771, 771, 771, 487: 771, 491: 771, 771, 495: 771, 498: 771, 506: 771, 771, 771, 771, 533: 771, 572: 771, 584: 771, 593: 771, 771, 645: 771, 771, 771, 771, 771, 771, 652: 771, 661: 771}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3839, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3838}, + {58: 3843, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 1263, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3840}, + {112: 3566, 3570, 3563, 3578, 118: 3565, 3562, 3564, 3568, 3569, 3574, 3573, 3572, 3576, 3577, 3571, 3575, 131: 3567, 527: 3451, 3449, 3450, 3448, 3446, 550: 3560, 3557, 3559, 3558, 3554, 3556, 3555, 3552, 3553, 3551, 3561, 756: 3447, 3445, 813: 3550, 828: 3841}, + {58: 3842, 504: 3813}, // 1230 - {770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 50: 770, 103: 770, 112: 770, 475: 770, 770, 770, 479: 770, 770, 770, 770, 770, 487: 770, 491: 770, 770, 495: 770, 498: 770, 506: 770, 770, 770, 770, 533: 770, 572: 770, 584: 770, 593: 770, 770, 645: 770, 770, 770, 770, 770, 770, 652: 770, 661: 770}, - {1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 477: 1201, 1201, 1201, 1201, 1201, 483: 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 492: 1201, 1201, 1201, 496: 1201, 1201, 499: 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 509: 1201, 1201, 512: 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 534: 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 568: 1201, 1201, 597: 1201}, - {1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 477: 1203, 1203, 1203, 1203, 1203, 483: 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 492: 1203, 1203, 1203, 496: 1203, 1203, 499: 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 509: 1203, 1203, 512: 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 534: 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 568: 1203, 1203, 597: 1203}, - {50: 3791, 511: 3792}, - {1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 477: 1125, 1125, 1125, 1125, 1125, 483: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 492: 1125, 1125, 1125, 496: 1125, 1125, 499: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 509: 1125, 1125, 512: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 534: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 568: 1125, 1125, 597: 1125}, + {1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 493: 1214, 1214, 1214, 497: 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 508: 1214, 1214, 511: 1214, 1214, 1214, 516: 1214, 1214, 1214, 1214, 1214, 1214, 523: 1214, 1214, 526: 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 550: 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 584: 1214, 1214, 1214, 616: 1214}, + {1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 493: 1215, 1215, 1215, 497: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 508: 1215, 1215, 511: 1215, 1215, 1215, 516: 1215, 1215, 1215, 1215, 1215, 1215, 523: 1215, 1215, 526: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 550: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 584: 1215, 1215, 1215, 616: 1215}, + {58: 1976, 525: 3846, 1082: 3845, 3847}, + {58: 1975}, + {58: 1974}, // 1235 - {50: 3793}, - {1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 477: 1124, 1124, 1124, 1124, 1124, 483: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 492: 1124, 1124, 1124, 496: 1124, 1124, 499: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 509: 1124, 1124, 512: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 534: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 568: 1124, 1124, 597: 1124}, - {50: 3795}, - {1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 477: 1204, 1204, 1204, 1204, 1204, 483: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 492: 1204, 1204, 1204, 496: 1204, 1204, 499: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 509: 1204, 1204, 512: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 534: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 568: 1204, 1204, 597: 1204}, - {50: 3798}, + {58: 3848}, + {1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 493: 1216, 1216, 1216, 497: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 508: 1216, 1216, 511: 1216, 1216, 1216, 516: 1216, 1216, 1216, 1216, 1216, 1216, 523: 1216, 1216, 526: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 550: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 584: 1216, 1216, 1216, 616: 1216}, + {58: 1976, 525: 3846, 1082: 3845, 3850}, + {58: 3851}, + {1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 493: 1217, 1217, 1217, 497: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 508: 1217, 1217, 511: 1217, 1217, 1217, 516: 1217, 1217, 1217, 1217, 1217, 1217, 523: 1217, 1217, 526: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 550: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 584: 1217, 1217, 1217, 616: 1217}, // 1240 - {1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 477: 1205, 1205, 1205, 1205, 1205, 483: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 492: 1205, 1205, 1205, 496: 1205, 1205, 499: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 509: 1205, 1205, 512: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 534: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 568: 1205, 1205, 597: 1205}, - {1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 477: 1219, 1219, 1219, 1219, 1219, 483: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 492: 1219, 1219, 1219, 496: 1219, 1219, 499: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 509: 1219, 1219, 512: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 534: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 568: 1219, 1219, 597: 1219, 653: 1219, 669: 1219, 671: 1219}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 1936, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3614, 782: 3778, 830: 3800}, - {50: 3801}, - {1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 477: 1206, 1206, 1206, 1206, 1206, 483: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 492: 1206, 1206, 1206, 496: 1206, 1206, 499: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 509: 1206, 1206, 512: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 534: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 568: 1206, 1206, 597: 1206}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 3853}, + {9: 3854, 504: 3792, 3793, 3798, 541: 3794, 566: 3795, 3796, 3789, 3799, 3788, 3797, 3790, 3791}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 3855}, + {58: 3856, 504: 3792, 3793, 3798, 541: 3794, 566: 3795, 3796, 3789, 3799, 3788, 3797, 3790, 3791}, + {1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 493: 1219, 1219, 1219, 497: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 508: 1219, 1219, 511: 1219, 1219, 1219, 516: 1219, 1219, 1219, 1219, 1219, 1219, 523: 1219, 1219, 526: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 550: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 584: 1219, 1219, 1219, 616: 1219}, // 1245 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 1936, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3614, 782: 3778, 830: 3803}, - {50: 3804}, - {1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 477: 1207, 1207, 1207, 1207, 1207, 483: 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 492: 1207, 1207, 1207, 496: 1207, 1207, 499: 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 509: 1207, 1207, 512: 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 534: 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 568: 1207, 1207, 597: 1207}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3806, 2785, 2786, 2784, 715: 3807}, - {50: 1293, 502: 1293, 655: 3809}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 1978, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3694, 801: 3858, 848: 3859}, + {9: 3696, 58: 1977}, + {58: 3860}, + {1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 493: 1220, 1220, 1220, 497: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 508: 1220, 1220, 511: 1220, 1220, 1220, 516: 1220, 1220, 1220, 1220, 1220, 1220, 523: 1220, 1220, 526: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 550: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 584: 1220, 1220, 1220, 616: 1220}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3694, 801: 3862}, // 1250 - {50: 3808}, - {1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 477: 1262, 1262, 1262, 1262, 1262, 483: 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 492: 1262, 1262, 1262, 496: 1262, 1262, 499: 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 509: 1262, 1262, 512: 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 534: 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 568: 1262, 1262, 597: 1262}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3810, 2785, 2786, 2784}, - {50: 1292, 502: 1292, 655: 3811}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3812, 2785, 2786, 2784}, + {9: 3696, 58: 3863, 501: 3864}, + {1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 493: 1225, 1225, 1225, 497: 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 508: 1225, 1225, 511: 1225, 1225, 1225, 516: 1225, 1225, 1225, 1225, 1225, 1225, 523: 1225, 1225, 526: 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 550: 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 584: 1225, 1225, 1225, 616: 1225}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 549: 3867, 685: 3597, 2849, 688: 2850, 2848, 760: 3866, 830: 3865}, + {58: 3868}, + {794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 58: 794, 110: 794, 132: 794, 491: 794, 794, 794, 495: 794, 794, 794, 794, 794, 794, 507: 794, 794, 510: 794, 514: 794, 794, 522: 794, 524: 794, 526: 794, 549: 794, 588: 794, 600: 794, 607: 794, 613: 794, 662: 794, 794, 794, 794, 794, 794, 794, 678: 794, 794}, // 1255 - {1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 477: 1291, 1291, 1291, 1291, 1291, 483: 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 492: 1291, 1291, 1291, 496: 1291, 1291, 499: 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 509: 1291, 1291, 512: 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 534: 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 568: 1291, 1291, 597: 1291, 659: 1291, 1291}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3806, 2785, 2786, 2784, 715: 3814}, - {50: 3815}, - {1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 477: 1263, 1263, 1263, 1263, 1263, 483: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 492: 1263, 1263, 1263, 496: 1263, 1263, 499: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 509: 1263, 1263, 512: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 534: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 568: 1263, 1263, 597: 1263}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3817}, + {793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 58: 793, 110: 793, 132: 793, 491: 793, 793, 793, 495: 793, 793, 793, 793, 793, 793, 507: 793, 793, 510: 793, 514: 793, 793, 522: 793, 524: 793, 526: 793, 549: 793, 588: 793, 600: 793, 607: 793, 613: 793, 662: 793, 793, 793, 793, 793, 793, 793, 678: 793, 793}, + {1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 493: 1224, 1224, 1224, 497: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 508: 1224, 1224, 511: 1224, 1224, 1224, 516: 1224, 1224, 1224, 1224, 1224, 1224, 523: 1224, 1224, 526: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 550: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 584: 1224, 1224, 1224, 616: 1224}, + {1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 493: 1226, 1226, 1226, 497: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 508: 1226, 1226, 511: 1226, 1226, 1226, 516: 1226, 1226, 1226, 1226, 1226, 1226, 523: 1226, 1226, 526: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 550: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 584: 1226, 1226, 1226, 616: 1226}, + {58: 3871, 525: 3872}, + {1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 493: 1148, 1148, 1148, 497: 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 508: 1148, 1148, 511: 1148, 1148, 1148, 516: 1148, 1148, 1148, 1148, 1148, 1148, 523: 1148, 1148, 526: 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 550: 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 584: 1148, 1148, 1148, 616: 1148}, // 1260 - {9: 3818, 484: 3819, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {52: 3830, 105: 3826, 173: 3832, 180: 3827, 3825, 202: 3829, 508: 3837, 533: 3823, 650: 3836, 684: 3828, 3833, 3834, 689: 3835, 744: 3831, 906: 3824, 1002: 3822}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 533: 3787, 664: 3517, 2785, 2786, 2784, 742: 3786, 811: 3820}, - {50: 3821}, - {1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 477: 1264, 1264, 1264, 1264, 1264, 483: 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 492: 1264, 1264, 1264, 496: 1264, 1264, 499: 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 509: 1264, 1264, 512: 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 534: 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 568: 1264, 1264, 597: 1264}, + {58: 3873}, + {1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 493: 1147, 1147, 1147, 497: 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 508: 1147, 1147, 511: 1147, 1147, 1147, 516: 1147, 1147, 1147, 1147, 1147, 1147, 523: 1147, 1147, 526: 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 550: 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 584: 1147, 1147, 1147, 616: 1147}, + {58: 3875}, + {1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 493: 1227, 1227, 1227, 497: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 508: 1227, 1227, 511: 1227, 1227, 1227, 516: 1227, 1227, 1227, 1227, 1227, 1227, 523: 1227, 1227, 526: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 550: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 584: 1227, 1227, 1227, 616: 1227}, + {58: 3878}, // 1265 - {50: 3873}, - {50: 298, 476: 3852, 768: 3853, 794: 3872}, - {16: 298, 50: 298, 476: 3852, 508: 298, 533: 298, 650: 298, 768: 3853, 794: 3857}, - {50: 1085}, - {50: 1084}, + {1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 493: 1228, 1228, 1228, 497: 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 508: 1228, 1228, 511: 1228, 1228, 1228, 516: 1228, 1228, 1228, 1228, 1228, 1228, 523: 1228, 1228, 526: 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 550: 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 584: 1228, 1228, 1228, 616: 1228}, + {1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 493: 1242, 1242, 1242, 497: 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 508: 1242, 1242, 511: 1242, 1242, 1242, 516: 1242, 1242, 1242, 1242, 1242, 1242, 523: 1242, 1242, 526: 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 550: 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 584: 1242, 1242, 1242, 616: 1242, 670: 1242, 683: 1242, 687: 1242}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 1978, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3694, 801: 3858, 848: 3880}, + {58: 3881}, + {1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 493: 1229, 1229, 1229, 497: 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 508: 1229, 1229, 511: 1229, 1229, 1229, 516: 1229, 1229, 1229, 1229, 1229, 1229, 523: 1229, 1229, 526: 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 550: 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 584: 1229, 1229, 1229, 616: 1229}, // 1270 - {50: 298, 476: 3852, 768: 3853, 794: 3856}, - {50: 291, 476: 3839, 768: 3840, 909: 3855, 914: 3841}, - {50: 298, 476: 3852, 768: 3853, 794: 3851}, - {50: 362, 687: 3848, 3849, 1099: 3850}, - {50: 362, 687: 3848, 3849, 1099: 3847}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 1978, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3694, 801: 3858, 848: 3883}, + {58: 3884}, + {1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 493: 1230, 1230, 1230, 497: 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 508: 1230, 1230, 511: 1230, 1230, 1230, 516: 1230, 1230, 1230, 1230, 1230, 1230, 523: 1230, 1230, 526: 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 550: 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 584: 1230, 1230, 1230, 616: 1230}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 3886, 2849, 688: 2850, 2848, 733: 3887}, + {58: 1318, 518: 1318, 672: 3889}, // 1275 - {50: 1078}, - {50: 1077}, - {50: 291, 476: 3839, 768: 3840, 909: 3838, 914: 3841}, - {50: 1075}, - {16: 336, 50: 336, 476: 336, 508: 336, 533: 336, 650: 336}, + {58: 3888}, + {1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 493: 1287, 1287, 1287, 497: 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 508: 1287, 1287, 511: 1287, 1287, 1287, 516: 1287, 1287, 1287, 1287, 1287, 1287, 523: 1287, 1287, 526: 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 550: 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 584: 1287, 1287, 1287, 616: 1287}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 3890, 2849, 688: 2850, 2848}, + {58: 1317, 518: 1317, 672: 3891}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 3892, 2849, 688: 2850, 2848}, // 1280 - {16: 335, 50: 335, 476: 335, 508: 335, 533: 335, 650: 335}, - {50: 1076}, - {511: 2759, 737: 2758, 745: 3842}, - {290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 50: 290, 52: 290, 475: 290, 479: 290, 290, 290, 290, 487: 290, 491: 290, 495: 290, 584: 290, 593: 290, 290, 645: 290, 290, 290, 290, 744: 290, 747: 290}, - {289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 50: 289, 52: 289, 475: 289, 479: 289, 289, 289, 289, 487: 289, 491: 289, 495: 289, 584: 289, 593: 289, 289, 645: 289, 289, 289, 289, 744: 289, 747: 289}, + {1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 493: 1316, 1316, 1316, 497: 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 508: 1316, 1316, 511: 1316, 1316, 1316, 516: 1316, 1316, 1316, 1316, 1316, 1316, 523: 1316, 1316, 526: 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 550: 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 584: 1316, 1316, 1316, 616: 1316, 676: 1316, 1316}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 3886, 2849, 688: 2850, 2848, 733: 3894}, + {58: 3895}, + {1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 493: 1288, 1288, 1288, 497: 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 508: 1288, 1288, 511: 1288, 1288, 1288, 516: 1288, 1288, 1288, 1288, 1288, 1288, 523: 1288, 1288, 526: 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 550: 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 584: 1288, 1288, 1288, 616: 1288}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3897}, // 1285 - {9: 3844, 50: 3843}, - {299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 16: 299, 50: 299, 52: 299, 107: 299, 299, 111: 299, 475: 299, 479: 299, 299, 299, 299, 487: 299, 491: 299, 495: 299, 508: 299, 532: 299, 299, 299, 584: 299, 593: 299, 299, 645: 299, 299, 299, 299, 650: 299, 744: 299, 747: 299}, - {511: 2759, 737: 2758, 745: 3845}, - {50: 3846}, - {288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 50: 288, 52: 288, 475: 288, 479: 288, 288, 288, 288, 487: 288, 491: 288, 495: 288, 584: 288, 593: 288, 288, 645: 288, 288, 288, 288, 744: 288, 747: 288}, + {9: 3898, 501: 3899, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {57: 3910, 113: 3906, 182: 3912, 189: 3907, 3905, 212: 3909, 514: 3917, 549: 3903, 667: 3916, 702: 3908, 3913, 3914, 707: 3915, 763: 3911, 926: 3904, 1023: 3902}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 549: 3867, 685: 3597, 2849, 688: 2850, 2848, 760: 3866, 830: 3900}, + {58: 3901}, + {1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 493: 1289, 1289, 1289, 497: 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 508: 1289, 1289, 511: 1289, 1289, 1289, 516: 1289, 1289, 1289, 1289, 1289, 1289, 523: 1289, 1289, 526: 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 550: 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 584: 1289, 1289, 1289, 616: 1289}, // 1290 - {50: 1079}, - {50: 361}, - {50: 360}, - {50: 1080}, - {50: 1081}, + {58: 3953}, + {58: 314, 492: 3932, 678: 314, 786: 3933, 812: 3952}, + {16: 314, 58: 314, 492: 3932, 514: 314, 549: 314, 667: 314, 678: 314, 786: 3933, 812: 3937}, + {58: 1108, 678: 1108}, + {58: 1107, 678: 1107}, // 1295 - {511: 2759, 737: 2758, 745: 3854}, - {297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 16: 297, 50: 297, 52: 297, 107: 297, 297, 111: 297, 475: 297, 479: 297, 297, 297, 297, 487: 297, 491: 297, 495: 297, 508: 297, 532: 297, 297, 297, 584: 297, 593: 297, 297, 645: 297, 297, 297, 297, 650: 297, 744: 297, 747: 297}, - {50: 3843}, - {50: 1082}, - {50: 1083}, + {58: 314, 492: 3932, 678: 314, 786: 3933, 812: 3936}, + {58: 307, 492: 3919, 678: 307, 786: 3920, 929: 3935, 934: 3921}, + {58: 314, 492: 3932, 678: 314, 786: 3933, 812: 3931}, + {58: 378, 678: 378, 705: 3928, 3929, 1122: 3930}, + {58: 378, 678: 378, 705: 3928, 3929, 1122: 3927}, // 1300 - {16: 3862, 50: 285, 508: 3863, 533: 3859, 650: 3861, 779: 3860, 803: 3858}, - {50: 1086}, - {282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 16: 3862, 50: 282, 475: 282, 479: 282, 282, 282, 282, 487: 282, 491: 282, 495: 282, 508: 3863, 584: 282, 593: 282, 282, 645: 282, 282, 282, 282, 650: 3861, 779: 3870, 1270: 3869}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 533: 3787, 664: 3517, 2785, 2786, 2784, 742: 3786, 811: 3866}, - {509: 3865}, + {58: 1101, 678: 1101}, + {58: 1100, 678: 1100}, + {58: 307, 492: 3919, 678: 307, 786: 3920, 929: 3918, 934: 3921}, + {58: 1098, 678: 1098}, + {16: 352, 58: 352, 492: 352, 514: 352, 549: 352, 667: 352, 678: 352}, // 1305 - {279, 279, 279, 279, 279, 279, 279, 279, 279, 10: 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 51: 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 478: 279, 482: 279, 501: 279, 279, 521: 279, 533: 279}, - {509: 3864}, - {278, 278, 278, 278, 278, 278, 278, 278, 278, 10: 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 51: 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 478: 278, 482: 278, 501: 278, 278, 521: 278, 533: 278}, - {280, 280, 280, 280, 280, 280, 280, 280, 280, 10: 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 51: 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 478: 280, 482: 280, 501: 280, 280, 521: 280, 533: 280}, - {287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 50: 287, 475: 287, 479: 287, 287, 287, 287, 487: 287, 491: 287, 495: 287, 533: 3867, 584: 287, 593: 287, 287, 645: 287, 287, 287, 287, 1269: 3868}, + {16: 351, 58: 351, 492: 351, 514: 351, 549: 351, 667: 351, 678: 351}, + {58: 1099, 678: 1099}, + {525: 2823, 755: 2822, 762: 3922}, + {306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 57: 306, 306, 491: 306, 495: 306, 306, 306, 306, 306, 507: 306, 510: 306, 600: 306, 607: 306, 613: 306, 662: 306, 306, 306, 666: 306, 678: 306, 763: 306, 765: 306}, + {305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 57: 305, 305, 491: 305, 495: 305, 305, 305, 305, 305, 507: 305, 510: 305, 600: 305, 607: 305, 613: 305, 662: 305, 305, 305, 666: 305, 678: 305, 763: 305, 765: 305}, // 1310 - {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 50: 286, 475: 286, 479: 286, 286, 286, 286, 487: 286, 491: 286, 495: 286, 584: 286, 593: 286, 286, 645: 286, 286, 286, 286}, - {283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 50: 283, 475: 283, 479: 283, 283, 283, 283, 487: 283, 491: 283, 495: 283, 584: 283, 593: 283, 283, 645: 283, 283, 283, 283}, - {284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 50: 284, 475: 284, 479: 284, 284, 284, 284, 487: 284, 491: 284, 495: 284, 584: 284, 593: 284, 284, 645: 284, 284, 284, 284}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 533: 3787, 664: 3517, 2785, 2786, 2784, 742: 3786, 811: 3871}, - {281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 50: 281, 475: 281, 479: 281, 281, 281, 281, 487: 281, 491: 281, 495: 281, 584: 281, 593: 281, 281, 645: 281, 281, 281, 281}, + {9: 3924, 58: 3923}, + {315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 16: 315, 57: 315, 315, 116: 315, 315, 130: 315, 491: 315, 495: 315, 315, 315, 315, 315, 507: 315, 510: 315, 514: 315, 548: 315, 315, 561: 315, 600: 315, 607: 315, 613: 315, 662: 315, 315, 315, 666: 315, 315, 678: 315, 763: 315, 765: 315}, + {525: 2823, 755: 2822, 762: 3925}, + {58: 3926}, + {304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 57: 304, 304, 491: 304, 495: 304, 304, 304, 304, 304, 507: 304, 510: 304, 600: 304, 607: 304, 613: 304, 662: 304, 304, 304, 666: 304, 678: 304, 763: 304, 765: 304}, // 1315 - {50: 1087}, - {1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 477: 1265, 1265, 1265, 1265, 1265, 483: 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 492: 1265, 1265, 1265, 496: 1265, 1265, 499: 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 509: 1265, 1265, 512: 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 534: 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 568: 1265, 1265, 597: 1265}, - {510: 3371, 512: 3369, 3370, 3368, 3366, 546: 1093, 738: 3367, 3365}, - {546: 3878, 1168: 3877, 1353: 3876}, - {163: 1089, 546: 3878, 548: 3884, 1168: 3883, 1216: 3882}, + {58: 1102, 678: 1102}, + {58: 377, 678: 377}, + {58: 376, 678: 376}, + {58: 1103, 678: 1103}, + {58: 1104, 678: 1104}, // 1320 - {163: 1092, 546: 1092, 548: 1092}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3879}, - {510: 3371, 512: 3369, 3370, 3368, 3366, 549: 3880, 738: 3367, 3365}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3881}, - {163: 1090, 510: 3371, 512: 3369, 3370, 3368, 3366, 546: 1090, 548: 1090, 738: 3367, 3365}, + {525: 2823, 755: 2822, 762: 3934}, + {313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 16: 313, 57: 313, 313, 116: 313, 313, 130: 313, 491: 313, 495: 313, 313, 313, 313, 313, 507: 313, 510: 313, 514: 313, 548: 313, 313, 561: 313, 600: 313, 607: 313, 613: 313, 662: 313, 313, 313, 666: 313, 313, 678: 313, 763: 313, 765: 313}, + {58: 3923}, + {58: 1105, 678: 1105}, + {58: 1106, 678: 1106}, // 1325 - {163: 3886}, - {163: 1091, 546: 1091, 548: 1091}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3885}, - {163: 1088, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 477: 1266, 1266, 1266, 1266, 1266, 483: 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 492: 1266, 1266, 1266, 496: 1266, 1266, 499: 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 509: 1266, 1266, 512: 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 534: 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 568: 1266, 1266, 597: 1266}, + {16: 3942, 58: 301, 514: 3943, 549: 3939, 667: 3941, 678: 301, 798: 3940, 821: 3938}, + {58: 1109, 678: 1109}, + {298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 16: 3942, 58: 298, 491: 298, 495: 298, 298, 298, 298, 298, 507: 298, 510: 298, 514: 3943, 600: 298, 607: 298, 613: 298, 662: 298, 298, 298, 666: 298, 3941, 678: 298, 798: 3950, 1295: 3949}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 549: 3867, 685: 3597, 2849, 688: 2850, 2848, 760: 3866, 830: 3946}, + {526: 3945}, // 1330 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3888}, - {481: 3889, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {52: 3830, 105: 3826, 173: 3832, 180: 3827, 3825, 202: 3829, 508: 3837, 533: 3823, 650: 3836, 684: 3828, 3833, 3834, 689: 3835, 744: 3831, 906: 3824, 1002: 3890}, - {50: 3891}, - {1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 477: 1267, 1267, 1267, 1267, 1267, 483: 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 492: 1267, 1267, 1267, 496: 1267, 1267, 499: 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 509: 1267, 1267, 512: 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 534: 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 568: 1267, 1267, 597: 1267}, + {295, 295, 295, 295, 295, 295, 295, 295, 295, 10: 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 59: 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 494: 295, 496: 295, 518: 295, 295, 537: 295, 549: 295}, + {526: 3944}, + {294, 294, 294, 294, 294, 294, 294, 294, 294, 10: 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 59: 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 494: 294, 496: 294, 518: 294, 294, 537: 294, 549: 294}, + {296, 296, 296, 296, 296, 296, 296, 296, 296, 10: 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 59: 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 494: 296, 496: 296, 518: 296, 296, 537: 296, 549: 296}, + {303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 58: 303, 491: 303, 495: 303, 303, 303, 303, 303, 507: 303, 510: 303, 549: 3947, 600: 303, 607: 303, 613: 303, 662: 303, 303, 303, 666: 303, 678: 303, 1294: 3948}, // 1335 - {1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 477: 1268, 1268, 1268, 1268, 1268, 483: 1268, 1268, 1268, 1268, 3376, 1268, 1268, 1268, 492: 1268, 1268, 1268, 496: 1268, 1268, 499: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 509: 1268, 1268, 512: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 534: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 568: 1268, 1268, 597: 1268}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3894}, - {510: 3371, 512: 3369, 3370, 3368, 3366, 526: 3895, 738: 3367, 3365}, - {1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 477: 1269, 1269, 1269, 1269, 1269, 483: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 492: 1269, 1269, 1269, 496: 1269, 1269, 499: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 509: 1269, 1269, 512: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 534: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 568: 1269, 1269, 597: 1269}, - {1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 477: 1270, 1270, 1270, 1270, 1270, 483: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 492: 1270, 1270, 1270, 496: 1270, 1270, 499: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 509: 1270, 1270, 512: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 534: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 568: 1270, 1270, 597: 1270}, + {302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 58: 302, 491: 302, 495: 302, 302, 302, 302, 302, 507: 302, 510: 302, 600: 302, 607: 302, 613: 302, 662: 302, 302, 302, 666: 302, 678: 302}, + {299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 58: 299, 491: 299, 495: 299, 299, 299, 299, 299, 507: 299, 510: 299, 600: 299, 607: 299, 613: 299, 662: 299, 299, 299, 666: 299, 678: 299}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 58: 300, 491: 300, 495: 300, 300, 300, 300, 300, 507: 300, 510: 300, 600: 300, 607: 300, 613: 300, 662: 300, 300, 300, 666: 300, 678: 300}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 549: 3867, 685: 3597, 2849, 688: 2850, 2848, 760: 3866, 830: 3951}, + {297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 58: 297, 491: 297, 495: 297, 297, 297, 297, 297, 507: 297, 510: 297, 600: 297, 607: 297, 613: 297, 662: 297, 297, 297, 666: 297, 678: 297}, // 1340 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3614, 782: 3898}, - {9: 3899}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3900}, - {9: 1939, 50: 3901, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 477: 1271, 1271, 1271, 1271, 1271, 483: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 492: 1271, 1271, 1271, 496: 1271, 1271, 499: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 509: 1271, 1271, 512: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 534: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 568: 1271, 1271, 597: 1271}, + {58: 1110, 678: 1110}, + {1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 493: 1290, 1290, 1290, 497: 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 508: 1290, 1290, 511: 1290, 1290, 1290, 516: 1290, 1290, 1290, 1290, 1290, 1290, 523: 1290, 1290, 526: 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 550: 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 584: 1290, 1290, 1290, 616: 1290}, + {527: 3451, 3449, 3450, 3448, 3446, 562: 1116, 756: 3447, 3445}, + {562: 3958, 1193: 3957, 1378: 3956}, + {173: 1112, 562: 3958, 3964, 1193: 3963, 1241: 3962}, // 1345 - {9: 1940, 50: 4004, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {9: 4001}, - {9: 1274, 50: 1274, 479: 1274, 1274, 483: 828, 487: 1274, 1274, 1274, 1274, 493: 828, 828, 496: 2751, 502: 1274, 504: 2752, 2748, 510: 1274, 512: 1274, 1274, 1274, 1274, 521: 1274, 523: 1274, 547: 1274, 550: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 568: 1274, 1274, 597: 1274, 772: 3917, 3918}, - {476: 3805, 578: 3922, 917: 3921, 981: 3920}, - {476: 2608, 498: 2606, 572: 2605, 649: 2601, 713: 3914, 752: 3913, 2602, 2603, 2604, 2613, 760: 2611, 3915, 3916}, + {173: 1115, 562: 1115, 1115}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3959}, + {527: 3451, 3449, 3450, 3448, 3446, 565: 3960, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3961}, + {173: 1113, 527: 3451, 3449, 3450, 3448, 3446, 562: 1113, 1113, 756: 3447, 3445}, // 1350 - {50: 3912, 483: 829, 493: 829, 829}, - {50: 3911}, - {50: 3910}, - {856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 483: 856, 856, 856, 856, 856, 856, 856, 856, 492: 856, 856, 856, 496: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 509: 856, 856, 512: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 534: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 568: 856, 856, 572: 856, 597: 856, 649: 856, 657: 856, 743: 856}, - {857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 483: 857, 857, 857, 857, 857, 857, 857, 857, 492: 857, 857, 857, 496: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 509: 857, 857, 512: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 534: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 568: 857, 857, 572: 857, 597: 857, 649: 857, 657: 857, 743: 857}, + {173: 3966}, + {173: 1114, 562: 1114, 1114}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3965}, + {173: 1111, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 493: 1291, 1291, 1291, 497: 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 508: 1291, 1291, 511: 1291, 1291, 1291, 516: 1291, 1291, 1291, 1291, 1291, 1291, 523: 1291, 1291, 526: 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 550: 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 584: 1291, 1291, 1291, 616: 1291}, // 1355 - {858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 483: 858, 858, 858, 858, 858, 858, 858, 858, 492: 858, 858, 858, 496: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 509: 858, 858, 512: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 534: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 568: 858, 858, 572: 858, 597: 858, 649: 858, 657: 858, 743: 858}, - {1013, 1013, 50: 1013, 475: 1013, 477: 1013, 483: 829, 1013, 493: 829, 829}, - {1012, 1012, 50: 1012, 475: 1012, 477: 1012, 483: 828, 1012, 493: 828, 828, 496: 2751, 504: 2752, 2748, 772: 3917, 3918}, - {841, 841, 50: 841, 475: 841, 477: 841, 484: 841}, - {840, 840, 50: 840, 475: 840, 477: 840, 484: 840}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3968}, + {498: 3969, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {57: 3910, 113: 3906, 182: 3912, 189: 3907, 3905, 212: 3909, 514: 3917, 549: 3903, 667: 3916, 702: 3908, 3913, 3914, 707: 3915, 763: 3911, 926: 3904, 1023: 3970}, + {58: 1284, 678: 3972, 1209: 3971}, + {58: 3973}, // 1360 - {834, 834, 50: 834, 475: 834, 477: 834, 484: 834, 496: 2751, 504: 2752, 773: 3919}, - {833, 833, 50: 833, 475: 833, 477: 833, 484: 833}, - {832, 832, 50: 832, 475: 832, 477: 832, 484: 832}, - {1311, 1311, 9: 3934, 50: 1311, 475: 1311, 477: 1311, 483: 1311, 1311, 493: 1311, 1311, 496: 1311, 1311, 499: 1311, 1311, 504: 1311, 2748, 772: 2749, 817: 3933}, - {10, 10, 9: 10, 50: 10, 475: 10, 477: 10, 483: 10, 10, 493: 10, 10, 496: 10, 10, 499: 10, 10, 504: 10, 10}, + {58: 1283}, + {1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 493: 1292, 1292, 1292, 497: 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 508: 1292, 1292, 511: 1292, 1292, 1292, 516: 1292, 1292, 1292, 1292, 1292, 1292, 523: 1292, 1292, 526: 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 550: 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 584: 1292, 1292, 1292, 616: 1292}, + {1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 493: 1293, 1293, 1293, 497: 1293, 1293, 3456, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 508: 1293, 1293, 511: 1293, 1293, 1293, 516: 1293, 1293, 1293, 1293, 1293, 1293, 523: 1293, 1293, 526: 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 550: 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 584: 1293, 1293, 1293, 616: 1293}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3976}, + {527: 3451, 3449, 3450, 3448, 3446, 542: 3977, 756: 3447, 3445}, // 1365 - {476: 3923, 844: 3924}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 1351, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3929, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3925, 801: 3928, 1343: 3927, 3926}, - {8, 8, 9: 8, 50: 8, 475: 8, 477: 8, 483: 8, 8, 493: 8, 8, 496: 8, 8, 499: 8, 8, 504: 8, 8}, - {1347, 1347, 9: 1347, 50: 1347, 475: 1347, 484: 1347, 496: 1347, 501: 1347, 505: 1347, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {50: 3932}, + {1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 493: 1294, 1294, 1294, 497: 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 508: 1294, 1294, 511: 1294, 1294, 1294, 516: 1294, 1294, 1294, 1294, 1294, 1294, 523: 1294, 1294, 526: 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 550: 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 584: 1294, 1294, 1294, 616: 1294}, + {1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 493: 1295, 1295, 1295, 497: 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 508: 1295, 1295, 511: 1295, 1295, 1295, 516: 1295, 1295, 1295, 1295, 1295, 1295, 523: 1295, 1295, 526: 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 550: 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 584: 1295, 1295, 1295, 616: 1295}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3694, 801: 3980}, + {9: 3981}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3982}, // 1370 - {9: 3930, 50: 1350}, - {9: 1348, 50: 1348}, - {1346, 1346, 9: 1346, 50: 1346, 475: 1346, 3813, 484: 1346, 496: 1346, 501: 1346, 505: 1346}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3929, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3925, 801: 3931}, - {9: 1349, 50: 1349}, + {9: 1981, 58: 3983, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 493: 1296, 1296, 1296, 497: 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 508: 1296, 1296, 511: 1296, 1296, 1296, 516: 1296, 1296, 1296, 1296, 1296, 1296, 523: 1296, 1296, 526: 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 550: 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 584: 1296, 1296, 1296, 616: 1296}, + {9: 1982, 58: 4086, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {9: 4083}, + {9: 1299, 58: 1299, 495: 1299, 497: 1299, 499: 1299, 851, 504: 1299, 1299, 1299, 509: 851, 511: 851, 2815, 518: 1299, 521: 2816, 523: 2812, 527: 1299, 1299, 1299, 1299, 1299, 537: 1299, 541: 1299, 564: 1299, 566: 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 584: 1299, 1299, 1299, 616: 1299, 790: 3999, 4000}, // 1375 - {1352, 1352, 9: 1352, 50: 1352, 89: 1352, 475: 1352, 477: 1352, 483: 1352, 1352, 493: 1352, 1352, 496: 1352, 1352, 499: 1352, 1352, 504: 1352, 1352, 510: 1352}, - {883, 883, 50: 883, 475: 883, 477: 883, 483: 883, 883, 493: 883, 883, 496: 2751, 883, 499: 883, 883, 504: 2752, 773: 2753, 834: 3936}, - {578: 3922, 917: 3935}, - {9, 9, 9: 9, 50: 9, 475: 9, 477: 9, 483: 9, 9, 493: 9, 9, 496: 9, 9, 499: 9, 9, 504: 9, 9}, - {854, 854, 50: 854, 475: 854, 477: 854, 483: 854, 854, 493: 854, 854, 497: 3938, 499: 854, 3939, 892: 3937}, + {492: 3885, 595: 4004, 937: 4003, 1001: 4002}, + {492: 2663, 515: 2661, 588: 2660, 665: 2656, 731: 3996, 770: 3995, 2657, 2658, 2659, 2668, 778: 2666, 3997, 3998}, + {58: 3994, 500: 852, 509: 852, 511: 852}, + {58: 3993}, + {58: 3992}, // 1380 - {860, 860, 50: 860, 475: 860, 477: 860, 483: 860, 860, 493: 860, 860, 499: 3964, 893: 3963}, - {289: 3944, 657: 3943}, - {547: 3940}, - {289: 3941}, - {215: 3942}, + {879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 497: 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 508: 879, 879, 511: 879, 879, 879, 515: 879, 879, 879, 879, 879, 879, 879, 523: 879, 879, 526: 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 550: 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 584: 879, 879, 879, 588: 879, 616: 879, 665: 879, 674: 879, 761: 879}, + {880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 497: 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 508: 880, 880, 511: 880, 880, 880, 515: 880, 880, 880, 880, 880, 880, 880, 523: 880, 880, 526: 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 550: 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 584: 880, 880, 880, 588: 880, 616: 880, 665: 880, 674: 880, 761: 880}, + {881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 497: 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 508: 881, 881, 511: 881, 881, 881, 515: 881, 881, 881, 881, 881, 881, 881, 523: 881, 881, 526: 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 550: 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 584: 881, 881, 881, 588: 881, 616: 881, 665: 881, 674: 881, 761: 881}, + {1036, 1036, 58: 1036, 491: 1036, 493: 1036, 500: 852, 1036, 509: 852, 511: 852}, + {1035, 1035, 58: 1035, 491: 1035, 493: 1035, 500: 851, 1035, 509: 851, 511: 851, 2815, 521: 2816, 523: 2812, 790: 3999, 4000}, // 1385 - {846, 846, 50: 846, 475: 846, 477: 846, 483: 846, 846, 493: 846, 846, 499: 846}, - {845, 845, 50: 845, 143: 845, 155: 845, 178: 845, 475: 845, 477: 845, 483: 845, 845, 493: 845, 845, 499: 845, 1092: 3946, 3957}, - {845, 845, 50: 845, 143: 845, 155: 845, 475: 845, 477: 845, 483: 845, 845, 493: 845, 845, 499: 845, 1092: 3946, 3945}, - {852, 852, 50: 852, 143: 3955, 155: 3954, 475: 852, 477: 852, 483: 852, 852, 493: 852, 852, 499: 852}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 3948, 786: 3949}, + {864, 864, 58: 864, 491: 864, 493: 864, 501: 864}, + {863, 863, 58: 863, 491: 863, 493: 863, 501: 863}, + {857, 857, 58: 857, 491: 857, 493: 857, 501: 857, 512: 2815, 521: 2816, 791: 4001}, + {856, 856, 58: 856, 491: 856, 493: 856, 501: 856}, + {855, 855, 58: 855, 491: 855, 493: 855, 501: 855}, // 1390 - {1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 534: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 568: 1069, 1069, 572: 1069, 584: 1069, 587: 1069, 593: 1069, 1069, 597: 1069, 645: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 3952, 1069, 1069, 1069, 661: 1069, 663: 1069, 668: 1069, 672: 1069, 1069, 1069, 1069, 1069, 1069, 680: 1069, 683: 1069, 690: 1069, 1069, 693: 1069, 708: 1069}, - {1067, 1067, 9: 1067, 50: 1067, 143: 1067, 155: 1067, 178: 1067, 475: 1067, 477: 1067, 483: 1067, 1067, 493: 1067, 1067, 499: 1067, 503: 1067, 653: 1067, 673: 1067, 675: 1067}, - {844, 844, 9: 3950, 50: 844, 143: 844, 155: 844, 178: 844, 475: 844, 477: 844, 483: 844, 844, 493: 844, 844, 499: 844}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 3951}, - {1066, 1066, 9: 1066, 50: 1066, 143: 1066, 155: 1066, 168: 1066, 178: 1066, 475: 1066, 477: 1066, 483: 1066, 1066, 493: 1066, 1066, 499: 1066, 503: 1066, 653: 1066, 1066, 673: 1066, 675: 1066, 680: 1066}, + {1336, 1336, 9: 4016, 58: 1336, 491: 1336, 493: 1336, 500: 1336, 1336, 509: 1336, 511: 1336, 1336, 1336, 516: 1336, 1336, 521: 1336, 523: 2812, 790: 2813, 836: 4015}, + {12, 12, 9: 12, 58: 12, 491: 12, 493: 12, 500: 12, 12, 509: 12, 511: 12, 12, 12, 516: 12, 12, 521: 12, 523: 12}, + {492: 4005, 862: 4006}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 1376, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 4011, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4007, 819: 4010, 1368: 4009, 4008}, + {10, 10, 9: 10, 58: 10, 491: 10, 493: 10, 500: 10, 10, 509: 10, 511: 10, 10, 10, 516: 10, 10, 521: 10, 523: 10}, // 1395 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3953, 2785, 2786, 2784}, - {1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 534: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 568: 1068, 1068, 572: 1068, 584: 1068, 587: 1068, 593: 1068, 1068, 597: 1068, 645: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 656: 1068, 1068, 1068, 661: 1068, 663: 1068, 668: 1068, 672: 1068, 1068, 1068, 1068, 1068, 1068, 680: 1068, 683: 1068, 690: 1068, 1068, 693: 1068, 708: 1068}, - {849, 849, 50: 849, 475: 849, 477: 849, 483: 849, 849, 493: 849, 849, 499: 849}, - {271: 3956}, - {847, 847, 50: 847, 475: 847, 477: 847, 483: 847, 847, 493: 847, 847, 499: 847}, + {1372, 1372, 9: 1372, 58: 1372, 491: 1372, 501: 1372, 512: 1372, 519: 1372, 523: 1372, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {58: 4014}, + {9: 4012, 58: 1375}, + {9: 1373, 58: 1373}, + {1371, 1371, 9: 1371, 58: 1371, 491: 1371, 3893, 501: 1371, 512: 1371, 519: 1371, 523: 1371}, // 1400 - {853, 853, 50: 853, 143: 3960, 155: 3958, 178: 3959, 475: 853, 477: 853, 483: 853, 853, 493: 853, 853, 499: 853}, - {851, 851, 50: 851, 475: 851, 477: 851, 483: 851, 851, 493: 851, 851, 499: 851}, - {511: 2759, 737: 3962}, - {271: 3961}, - {848, 848, 50: 848, 475: 848, 477: 848, 483: 848, 848, 493: 848, 848, 499: 848}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 4011, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4007, 819: 4013}, + {9: 1374, 58: 1374}, + {1377, 1377, 9: 1377, 58: 1377, 91: 1377, 491: 1377, 493: 1377, 500: 1377, 1377, 509: 1377, 511: 1377, 1377, 1377, 516: 1377, 1377, 521: 1377, 523: 1377, 527: 1377}, + {906, 906, 58: 906, 491: 906, 493: 906, 500: 906, 906, 509: 906, 511: 906, 2815, 906, 516: 906, 906, 521: 2816, 791: 2817, 852: 4018}, + {595: 4004, 937: 4017}, // 1405 - {850, 850, 50: 850, 475: 850, 477: 850, 483: 850, 850, 493: 850, 850, 499: 850}, - {1014, 1014, 50: 1014, 475: 1014, 477: 1014, 483: 1014, 1014, 493: 1014, 1014}, - {1282: 3965}, - {478: 3966}, - {108, 108, 50: 108, 103: 3970, 112: 3969, 475: 108, 477: 108, 483: 108, 108, 493: 108, 108, 661: 108, 839: 3968, 1053: 3967}, + {11, 11, 9: 11, 58: 11, 491: 11, 493: 11, 500: 11, 11, 509: 11, 511: 11, 11, 11, 516: 11, 11, 521: 11, 523: 11}, + {877, 877, 58: 877, 491: 877, 493: 877, 500: 877, 877, 509: 877, 511: 877, 513: 4020, 516: 877, 4021, 912: 4019}, + {883, 883, 58: 883, 491: 883, 493: 883, 500: 883, 883, 509: 883, 511: 883, 516: 4046, 913: 4045}, + {300: 4026, 674: 4025}, + {564: 4022}, // 1410 - {95, 95, 50: 95, 475: 95, 477: 95, 483: 95, 95, 493: 95, 95, 661: 3991, 949: 3990}, - {787: 3973, 793: 3975, 798: 3976, 3974, 1052: 3972, 1222: 3971}, - {106, 106, 17: 106, 51: 106, 53: 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 475: 106, 106, 503: 106, 547: 106, 656: 106, 787: 106, 793: 106, 798: 106, 106}, - {105, 105, 17: 105, 51: 105, 53: 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 475: 105, 105, 503: 105, 547: 105, 656: 105, 787: 105, 793: 105, 798: 105, 105}, - {107, 107, 50: 107, 475: 107, 107, 107, 483: 107, 107, 492: 107, 107, 107, 509: 107, 661: 107, 787: 3973, 793: 3975, 798: 3976, 3974, 1052: 3989}, + {300: 4023}, + {227: 4024}, + {869, 869, 58: 869, 491: 869, 493: 869, 500: 869, 869, 509: 869, 511: 869, 516: 869}, + {868, 868, 58: 868, 152: 868, 164: 868, 187: 868, 491: 868, 493: 868, 500: 868, 868, 509: 868, 511: 868, 516: 868, 1115: 4028, 4039}, + {868, 868, 58: 868, 152: 868, 164: 868, 491: 868, 493: 868, 500: 868, 868, 509: 868, 511: 868, 516: 868, 1115: 4028, 4027}, // 1415 - {103, 103, 50: 103, 475: 103, 103, 103, 483: 103, 103, 492: 103, 103, 103, 509: 103, 661: 103, 787: 103, 793: 103, 798: 103, 103}, - {663: 3987}, - {793: 3984}, - {663: 3982}, - {663: 3977}, + {875, 875, 58: 875, 152: 4037, 164: 4036, 491: 875, 493: 875, 500: 875, 875, 509: 875, 511: 875, 516: 875}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4030, 804: 4031}, + {1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 550: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 584: 1092, 1092, 1092, 588: 1092, 600: 1092, 604: 1092, 607: 1092, 613: 1092, 616: 1092, 662: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 4034, 1092, 1092, 1092, 679: 1092, 681: 1092, 1092, 690: 1092, 1092, 1092, 1092, 1092, 1092, 698: 1092, 701: 1092, 708: 1092, 1092, 711: 1092, 726: 1092}, + {1090, 1090, 9: 1090, 58: 1090, 152: 1090, 164: 1090, 187: 1090, 491: 1090, 493: 1090, 500: 1090, 1090, 509: 1090, 511: 1090, 516: 1090, 520: 1090, 670: 1090, 691: 1090, 693: 1090}, + {867, 867, 9: 4032, 58: 867, 152: 867, 164: 867, 187: 867, 491: 867, 493: 867, 500: 867, 867, 509: 867, 511: 867, 516: 867}, // 1420 - {478: 3979, 579: 3980, 583: 3981, 857: 3978}, - {99, 99, 50: 99, 475: 99, 99, 99, 483: 99, 99, 492: 99, 99, 99, 509: 99, 661: 99, 787: 99, 793: 99, 798: 99, 99}, - {98, 98, 50: 98, 475: 98, 98, 98, 483: 98, 98, 492: 98, 98, 98, 509: 98, 661: 98, 787: 98, 793: 98, 798: 98, 98}, - {97, 97, 50: 97, 475: 97, 97, 97, 483: 97, 97, 492: 97, 97, 97, 509: 97, 661: 97, 787: 97, 793: 97, 798: 97, 97}, - {96, 96, 50: 96, 475: 96, 96, 96, 483: 96, 96, 492: 96, 96, 96, 509: 96, 661: 96, 787: 96, 793: 96, 798: 96, 96}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4033}, + {1089, 1089, 9: 1089, 58: 1089, 152: 1089, 164: 1089, 178: 1089, 187: 1089, 491: 1089, 493: 1089, 500: 1089, 1089, 509: 1089, 511: 1089, 516: 1089, 520: 1089, 670: 1089, 1089, 691: 1089, 693: 1089, 698: 1089}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4035, 2849, 688: 2850, 2848}, + {1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 550: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 584: 1091, 1091, 1091, 588: 1091, 600: 1091, 604: 1091, 607: 1091, 613: 1091, 616: 1091, 662: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 673: 1091, 1091, 1091, 679: 1091, 681: 1091, 1091, 690: 1091, 1091, 1091, 1091, 1091, 1091, 698: 1091, 701: 1091, 708: 1091, 1091, 711: 1091, 726: 1091}, + {872, 872, 58: 872, 491: 872, 493: 872, 500: 872, 872, 509: 872, 511: 872, 516: 872}, // 1425 - {478: 3979, 579: 3980, 583: 3981, 857: 3983}, - {100, 100, 50: 100, 475: 100, 100, 100, 483: 100, 100, 492: 100, 100, 100, 509: 100, 661: 100, 787: 100, 793: 100, 798: 100, 100}, - {663: 3985}, - {478: 3979, 579: 3980, 583: 3981, 857: 3986}, - {101, 101, 50: 101, 475: 101, 101, 101, 483: 101, 101, 492: 101, 101, 101, 509: 101, 661: 101, 787: 101, 793: 101, 798: 101, 101}, + {282: 4038}, + {870, 870, 58: 870, 491: 870, 493: 870, 500: 870, 870, 509: 870, 511: 870, 516: 870}, + {876, 876, 58: 876, 152: 4042, 164: 4040, 187: 4041, 491: 876, 493: 876, 500: 876, 876, 509: 876, 511: 876, 516: 876}, + {874, 874, 58: 874, 491: 874, 493: 874, 500: 874, 874, 509: 874, 511: 874, 516: 874}, + {525: 2823, 755: 4044}, // 1430 - {478: 3979, 579: 3980, 583: 3981, 857: 3988}, - {102, 102, 50: 102, 475: 102, 102, 102, 483: 102, 102, 492: 102, 102, 102, 509: 102, 661: 102, 787: 102, 793: 102, 798: 102, 102}, - {104, 104, 50: 104, 475: 104, 104, 104, 483: 104, 104, 492: 104, 104, 104, 509: 104, 661: 104, 787: 104, 793: 104, 798: 104, 104}, - {859, 859, 50: 859, 475: 859, 477: 859, 483: 859, 859, 493: 859, 859}, - {93, 93, 50: 93, 475: 93, 93, 93, 483: 93, 93, 492: 93, 93, 93, 509: 93, 787: 93, 1316: 3992, 3993}, + {282: 4043}, + {871, 871, 58: 871, 491: 871, 493: 871, 500: 871, 871, 509: 871, 511: 871, 516: 871}, + {873, 873, 58: 873, 491: 873, 493: 873, 500: 873, 873, 509: 873, 511: 873, 516: 873}, + {1037, 1037, 58: 1037, 491: 1037, 493: 1037, 500: 1037, 1037, 509: 1037, 511: 1037}, + {1307: 4047}, // 1435 - {91, 91, 50: 91, 475: 91, 91, 91, 483: 91, 91, 492: 91, 91, 91, 509: 91, 787: 3997, 1253: 3996}, - {663: 3994}, - {478: 3979, 579: 3980, 583: 3981, 857: 3995}, - {92, 92, 50: 92, 475: 92, 92, 92, 483: 92, 92, 492: 92, 92, 92, 509: 92, 787: 92}, - {94, 94, 50: 94, 475: 94, 94, 94, 483: 94, 94, 492: 94, 94, 94, 509: 94}, + {494: 4048}, + {114, 114, 58: 114, 110: 4052, 132: 4051, 491: 114, 493: 114, 500: 114, 114, 509: 114, 511: 114, 679: 114, 857: 4050, 1076: 4049}, + {101, 101, 58: 101, 491: 101, 493: 101, 500: 101, 101, 509: 101, 511: 101, 679: 4073, 970: 4072}, + {806: 4055, 811: 4057, 817: 4058, 4056, 1075: 4054, 1247: 4053}, + {112, 112, 17: 112, 56: 112, 59: 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 491: 112, 112, 520: 112, 564: 112, 673: 112, 806: 112, 811: 112, 817: 112, 112}, // 1440 - {663: 3998}, - {478: 3979, 579: 3980, 583: 3981, 857: 3999}, - {90, 90, 50: 90, 475: 90, 90, 90, 483: 90, 90, 492: 90, 90, 90, 509: 90}, - {855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 483: 855, 855, 855, 855, 855, 855, 855, 855, 492: 855, 855, 855, 496: 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 509: 855, 855, 512: 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 534: 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 568: 855, 855, 572: 855, 597: 855, 649: 855, 657: 855, 743: 855}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4002}, + {111, 111, 17: 111, 56: 111, 59: 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 491: 111, 111, 520: 111, 564: 111, 673: 111, 806: 111, 811: 111, 817: 111, 111}, + {113, 113, 58: 113, 491: 113, 113, 113, 500: 113, 113, 508: 113, 113, 511: 113, 526: 113, 679: 113, 806: 4055, 811: 4057, 817: 4058, 4056, 1075: 4071}, + {109, 109, 58: 109, 491: 109, 109, 109, 500: 109, 109, 508: 109, 109, 511: 109, 526: 109, 679: 109, 806: 109, 811: 109, 817: 109, 109}, + {681: 4069}, + {811: 4066}, // 1445 - {9: 1939, 50: 4003, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 477: 1272, 1272, 1272, 1272, 1272, 483: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 492: 1272, 1272, 1272, 496: 1272, 1272, 499: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 509: 1272, 1272, 512: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 534: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 568: 1272, 1272, 597: 1272}, - {1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 477: 1273, 1273, 1273, 1273, 1273, 483: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 492: 1273, 1273, 1273, 496: 1273, 1273, 499: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 509: 1273, 1273, 512: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 534: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 568: 1273, 1273, 597: 1273}, - {1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 477: 1275, 1275, 1275, 1275, 1275, 483: 1275, 1275, 1275, 1275, 3376, 1275, 1275, 1275, 492: 1275, 1275, 1275, 496: 1275, 1275, 499: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 509: 1275, 1275, 512: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 534: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 568: 1275, 1275, 597: 1275}, - {1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 477: 1277, 1277, 1277, 1277, 1277, 483: 1277, 1277, 1277, 1277, 3376, 1277, 1277, 1277, 492: 1277, 1277, 1277, 496: 1277, 1277, 499: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 509: 1277, 1277, 512: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 534: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 568: 1277, 1277, 597: 1277}, + {681: 4064}, + {681: 4059}, + {494: 4061, 596: 4062, 598: 4063, 875: 4060}, + {105, 105, 58: 105, 491: 105, 105, 105, 500: 105, 105, 508: 105, 105, 511: 105, 526: 105, 679: 105, 806: 105, 811: 105, 817: 105, 105}, + {104, 104, 58: 104, 491: 104, 104, 104, 500: 104, 104, 508: 104, 104, 511: 104, 526: 104, 679: 104, 806: 104, 811: 104, 817: 104, 104}, // 1450 - {1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 477: 1278, 1278, 1278, 1278, 1278, 483: 1278, 1278, 1278, 1278, 3376, 1278, 1278, 1278, 492: 1278, 1278, 1278, 496: 1278, 1278, 499: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 509: 1278, 1278, 512: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 534: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 568: 1278, 1278, 597: 1278}, - {1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 477: 1279, 1279, 1279, 1279, 1279, 483: 1279, 1279, 1279, 1279, 3376, 1279, 1279, 1279, 492: 1279, 1279, 1279, 496: 1279, 1279, 499: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 509: 1279, 1279, 512: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 534: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 568: 1279, 1279, 597: 1279}, - {1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 477: 1280, 1280, 1280, 1280, 1280, 483: 1280, 1280, 1280, 1280, 3376, 1280, 1280, 1280, 492: 1280, 1280, 1280, 496: 1280, 1280, 499: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 509: 1280, 1280, 512: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 534: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 568: 1280, 1280, 597: 1280}, - {478: 4013}, - {478: 4012}, + {103, 103, 58: 103, 491: 103, 103, 103, 500: 103, 103, 508: 103, 103, 511: 103, 526: 103, 679: 103, 806: 103, 811: 103, 817: 103, 103}, + {102, 102, 58: 102, 491: 102, 102, 102, 500: 102, 102, 508: 102, 102, 511: 102, 526: 102, 679: 102, 806: 102, 811: 102, 817: 102, 102}, + {494: 4061, 596: 4062, 598: 4063, 875: 4065}, + {106, 106, 58: 106, 491: 106, 106, 106, 500: 106, 106, 508: 106, 106, 511: 106, 526: 106, 679: 106, 806: 106, 811: 106, 817: 106, 106}, + {681: 4067}, // 1455 - {1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 477: 1260, 1260, 1260, 1260, 1260, 483: 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 492: 1260, 1260, 1260, 496: 1260, 1260, 499: 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 509: 1260, 1260, 512: 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 534: 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 568: 1260, 1260, 597: 1260}, - {1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 477: 1261, 1261, 1261, 1261, 1261, 483: 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 492: 1261, 1261, 1261, 496: 1261, 1261, 499: 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 509: 1261, 1261, 512: 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 534: 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 568: 1261, 1261, 597: 1261}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4015, 2785, 2786, 2784}, - {1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 4016, 1292, 1292, 1292, 1292, 1292, 483: 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 492: 1292, 1292, 1292, 496: 1292, 1292, 499: 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 509: 1292, 1292, 512: 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 534: 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 568: 1292, 1292, 597: 1292, 655: 3811, 659: 1292, 1292}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 1936, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3614, 782: 3778, 830: 4017}, + {494: 4061, 596: 4062, 598: 4063, 875: 4068}, + {107, 107, 58: 107, 491: 107, 107, 107, 500: 107, 107, 508: 107, 107, 511: 107, 526: 107, 679: 107, 806: 107, 811: 107, 817: 107, 107}, + {494: 4061, 596: 4062, 598: 4063, 875: 4070}, + {108, 108, 58: 108, 491: 108, 108, 108, 500: 108, 108, 508: 108, 108, 511: 108, 526: 108, 679: 108, 806: 108, 811: 108, 817: 108, 108}, + {110, 110, 58: 110, 491: 110, 110, 110, 500: 110, 110, 508: 110, 110, 511: 110, 526: 110, 679: 110, 806: 110, 811: 110, 817: 110, 110}, // 1460 - {50: 4018}, - {1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 477: 1127, 1127, 1127, 1127, 1127, 483: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 492: 1127, 1127, 1127, 496: 1127, 1127, 499: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 509: 1127, 1127, 512: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 534: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 568: 1127, 1127, 597: 1127}, - {105: 3490, 3486, 109: 3483, 3498, 113: 3485, 3482, 3484, 3488, 3489, 3494, 3493, 3492, 3496, 3497, 3491, 3495, 3487, 510: 3371, 512: 3369, 3370, 3368, 3366, 535: 3480, 3477, 3479, 3478, 3474, 3476, 3475, 3472, 3473, 3471, 3481, 738: 3367, 3365, 800: 3470, 820: 4020}, - {488: 3733}, - {1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 477: 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 499: 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 509: 1331, 1331, 512: 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 534: 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 568: 1331, 1331, 584: 1331, 593: 1331, 1331, 597: 1331, 645: 1331, 1331, 1331, 1331}, + {882, 882, 58: 882, 491: 882, 493: 882, 500: 882, 882, 509: 882, 511: 882}, + {99, 99, 58: 99, 491: 99, 99, 99, 500: 99, 99, 508: 99, 99, 511: 99, 526: 99, 806: 99, 1341: 4074, 4075}, + {97, 97, 58: 97, 491: 97, 97, 97, 500: 97, 97, 508: 97, 97, 511: 97, 526: 97, 806: 4079, 1278: 4078}, + {681: 4076}, + {494: 4061, 596: 4062, 598: 4063, 875: 4077}, // 1465 - {1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 477: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 499: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 509: 1328, 1328, 512: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 534: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 568: 1328, 1328, 584: 1328, 593: 1328, 1328, 597: 1328, 645: 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, 477: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 499: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 509: 1327, 1327, 512: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 534: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 568: 1327, 1327, 584: 1327, 593: 1327, 1327, 597: 1327, 645: 1327, 1327, 1327, 1327}, - {1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 477: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 499: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 509: 1325, 1325, 512: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 534: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 568: 1325, 1325, 584: 1325, 593: 1325, 1325, 597: 1325, 645: 1325, 1325, 1325, 1325}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 654: 4027, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4026}, - {50: 4031, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, + {98, 98, 58: 98, 491: 98, 98, 98, 500: 98, 98, 508: 98, 98, 511: 98, 526: 98, 806: 98}, + {100, 100, 58: 100, 491: 100, 100, 100, 500: 100, 100, 508: 100, 100, 511: 100, 526: 100}, + {681: 4080}, + {494: 4061, 596: 4062, 598: 4063, 875: 4081}, + {96, 96, 58: 96, 491: 96, 96, 96, 500: 96, 96, 508: 96, 96, 511: 96, 526: 96}, // 1470 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4028}, - {50: 4029, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 4030}, - {1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 477: 1135, 1135, 1135, 1135, 1135, 483: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 492: 1135, 1135, 1135, 496: 1135, 1135, 499: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 509: 1135, 1135, 512: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 534: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 568: 1135, 1135, 597: 1135}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 4032}, + {878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 497: 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 508: 878, 878, 511: 878, 878, 878, 515: 878, 878, 878, 878, 878, 878, 878, 523: 878, 878, 526: 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 550: 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 584: 878, 878, 878, 588: 878, 616: 878, 665: 878, 674: 878, 761: 878}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4084}, + {9: 1981, 58: 4085, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 493: 1297, 1297, 1297, 497: 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 508: 1297, 1297, 511: 1297, 1297, 1297, 516: 1297, 1297, 1297, 1297, 1297, 1297, 523: 1297, 1297, 526: 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 550: 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 584: 1297, 1297, 1297, 616: 1297}, + {1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 493: 1298, 1298, 1298, 497: 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 508: 1298, 1298, 511: 1298, 1298, 1298, 516: 1298, 1298, 1298, 1298, 1298, 1298, 523: 1298, 1298, 526: 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 550: 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 584: 1298, 1298, 1298, 616: 1298}, // 1475 - {1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 477: 1136, 1136, 1136, 1136, 1136, 483: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 492: 1136, 1136, 1136, 496: 1136, 1136, 499: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 509: 1136, 1136, 512: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 534: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 568: 1136, 1136, 597: 1136}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 654: 4035, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4034}, - {9: 4045, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4036}, - {9: 4037, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, + {1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 493: 1300, 1300, 1300, 497: 1300, 1300, 3456, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 508: 1300, 1300, 511: 1300, 1300, 1300, 516: 1300, 1300, 1300, 1300, 1300, 1300, 523: 1300, 1300, 526: 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 550: 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 584: 1300, 1300, 1300, 616: 1300}, + {1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 493: 1302, 1302, 1302, 497: 1302, 1302, 3456, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 508: 1302, 1302, 511: 1302, 1302, 1302, 516: 1302, 1302, 1302, 1302, 1302, 1302, 523: 1302, 1302, 526: 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 550: 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 584: 1302, 1302, 1302, 616: 1302}, + {1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 493: 1303, 1303, 1303, 497: 1303, 1303, 3456, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 508: 1303, 1303, 511: 1303, 1303, 1303, 516: 1303, 1303, 1303, 1303, 1303, 1303, 523: 1303, 1303, 526: 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 550: 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 584: 1303, 1303, 1303, 616: 1303}, + {1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 493: 1304, 1304, 1304, 497: 1304, 1304, 3456, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 508: 1304, 1304, 511: 1304, 1304, 1304, 516: 1304, 1304, 1304, 1304, 1304, 1304, 523: 1304, 1304, 526: 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 550: 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 584: 1304, 1304, 1304, 616: 1304}, + {1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 493: 1305, 1305, 1305, 497: 1305, 1305, 3456, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 508: 1305, 1305, 511: 1305, 1305, 1305, 516: 1305, 1305, 1305, 1305, 1305, 1305, 523: 1305, 1305, 526: 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 550: 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 584: 1305, 1305, 1305, 616: 1305}, // 1480 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 654: 4039, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4038}, - {50: 4043, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4040}, - {50: 4041, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 4042}, + {494: 4095}, + {494: 4094}, + {1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 493: 1285, 1285, 1285, 497: 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 508: 1285, 1285, 511: 1285, 1285, 1285, 516: 1285, 1285, 1285, 1285, 1285, 1285, 523: 1285, 1285, 526: 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 550: 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 584: 1285, 1285, 1285, 616: 1285}, + {1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 493: 1286, 1286, 1286, 497: 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 508: 1286, 1286, 511: 1286, 1286, 1286, 516: 1286, 1286, 1286, 1286, 1286, 1286, 523: 1286, 1286, 526: 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 550: 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 584: 1286, 1286, 1286, 616: 1286}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4097, 2849, 688: 2850, 2848}, // 1485 - {1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 477: 1131, 1131, 1131, 1131, 1131, 483: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 492: 1131, 1131, 1131, 496: 1131, 1131, 499: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 509: 1131, 1131, 512: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 534: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 568: 1131, 1131, 597: 1131}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 4044}, - {1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 477: 1133, 1133, 1133, 1133, 1133, 483: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 492: 1133, 1133, 1133, 496: 1133, 1133, 499: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 509: 1133, 1133, 512: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 534: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 568: 1133, 1133, 597: 1133}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 654: 4047, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4046}, - {50: 4051, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, + {1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 4098, 1317, 1317, 1317, 497: 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 508: 1317, 1317, 511: 1317, 1317, 1317, 516: 1317, 1317, 1317, 1317, 1317, 1317, 523: 1317, 1317, 526: 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 550: 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 584: 1317, 1317, 1317, 616: 1317, 672: 3891, 676: 1317, 1317}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 1978, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3694, 801: 3858, 848: 4099}, + {58: 4100}, + {1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 493: 1150, 1150, 1150, 497: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 508: 1150, 1150, 511: 1150, 1150, 1150, 516: 1150, 1150, 1150, 1150, 1150, 1150, 523: 1150, 1150, 526: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 550: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 584: 1150, 1150, 1150, 616: 1150}, + {112: 3566, 3570, 3563, 3578, 118: 3565, 3562, 3564, 3568, 3569, 3574, 3573, 3572, 3576, 3577, 3571, 3575, 131: 3567, 527: 3451, 3449, 3450, 3448, 3446, 550: 3560, 3557, 3559, 3558, 3554, 3556, 3555, 3552, 3553, 3551, 3561, 756: 3447, 3445, 813: 3550, 828: 4102}, // 1490 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4048}, - {50: 4049, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 4050}, - {1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 477: 1132, 1132, 1132, 1132, 1132, 483: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 492: 1132, 1132, 1132, 496: 1132, 1132, 499: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 509: 1132, 1132, 512: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 534: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 568: 1132, 1132, 597: 1132}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 4052}, + {504: 3813}, + {1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 493: 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 516: 1356, 1356, 1356, 1356, 1356, 1356, 523: 1356, 1356, 526: 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 550: 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 584: 1356, 1356, 1356, 600: 1356, 607: 1356, 613: 1356, 616: 1356, 662: 1356, 1356, 1356, 666: 1356}, + {1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 493: 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 516: 1353, 1353, 1353, 1353, 1353, 1353, 523: 1353, 1353, 526: 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 550: 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 584: 1353, 1353, 1353, 600: 1353, 607: 1353, 613: 1353, 616: 1353, 662: 1353, 1353, 1353, 666: 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, 493: 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 516: 1352, 1352, 1352, 1352, 1352, 1352, 523: 1352, 1352, 526: 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 550: 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 584: 1352, 1352, 1352, 600: 1352, 607: 1352, 613: 1352, 616: 1352, 662: 1352, 1352, 1352, 666: 1352}, + {1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 493: 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 516: 1350, 1350, 1350, 1350, 1350, 1350, 523: 1350, 1350, 526: 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 550: 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 584: 1350, 1350, 1350, 600: 1350, 607: 1350, 613: 1350, 616: 1350, 662: 1350, 1350, 1350, 666: 1350}, // 1495 - {1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 477: 1134, 1134, 1134, 1134, 1134, 483: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 492: 1134, 1134, 1134, 496: 1134, 1134, 499: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 509: 1134, 1134, 512: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 534: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 568: 1134, 1134, 597: 1134}, - {105: 3490, 3486, 109: 3483, 3498, 113: 3485, 3482, 3484, 3488, 3489, 3494, 3493, 3492, 3496, 3497, 3491, 3495, 3487, 800: 4054}, - {9: 4055}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4056}, - {9: 4057, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 671: 4109, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4108}, + {58: 4113, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4110}, + {58: 4111, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 4112}, // 1500 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4058}, - {50: 4059, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 477: 1181, 1181, 1181, 1181, 1181, 483: 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 492: 1181, 1181, 1181, 496: 1181, 1181, 499: 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 509: 1181, 1181, 512: 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 534: 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 568: 1181, 1181, 597: 1181}, - {105: 3490, 3486, 109: 3483, 3498, 113: 3485, 3482, 3484, 3488, 3489, 3494, 3493, 3492, 3496, 3497, 3491, 3495, 3487, 800: 4061}, - {9: 4062}, + {1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 493: 1158, 1158, 1158, 497: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 508: 1158, 1158, 511: 1158, 1158, 1158, 516: 1158, 1158, 1158, 1158, 1158, 1158, 523: 1158, 1158, 526: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 550: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 584: 1158, 1158, 1158, 616: 1158}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 4114}, + {1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 493: 1159, 1159, 1159, 497: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 508: 1159, 1159, 511: 1159, 1159, 1159, 516: 1159, 1159, 1159, 1159, 1159, 1159, 523: 1159, 1159, 526: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 550: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 584: 1159, 1159, 1159, 616: 1159}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 671: 4117, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4116}, + {9: 4127, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, // 1505 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4063}, - {9: 4064, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4065}, - {50: 4066, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 477: 1182, 1182, 1182, 1182, 1182, 483: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 492: 1182, 1182, 1182, 496: 1182, 1182, 499: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 509: 1182, 1182, 512: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 534: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 568: 1182, 1182, 597: 1182}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4118}, + {9: 4119, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 671: 4121, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4120}, + {58: 4125, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4122}, // 1510 - {180: 4070, 4069, 202: 4071, 226: 4072, 1232: 4068}, - {9: 4073}, - {9: 1171}, - {9: 1170}, - {9: 1169}, + {58: 4123, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 4124}, + {1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 493: 1154, 1154, 1154, 497: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 508: 1154, 1154, 511: 1154, 1154, 1154, 516: 1154, 1154, 1154, 1154, 1154, 1154, 523: 1154, 1154, 526: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 550: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 584: 1154, 1154, 1154, 616: 1154}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 4126}, + {1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 493: 1156, 1156, 1156, 497: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 508: 1156, 1156, 511: 1156, 1156, 1156, 516: 1156, 1156, 1156, 1156, 1156, 1156, 523: 1156, 1156, 526: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 550: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 584: 1156, 1156, 1156, 616: 1156}, // 1515 - {9: 1168}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4074}, - {50: 4075, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 477: 1188, 1188, 1188, 1188, 1188, 483: 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 492: 1188, 1188, 1188, 496: 1188, 1188, 499: 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 509: 1188, 1188, 512: 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 534: 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 568: 1188, 1188, 597: 1188}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 4077}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 671: 4129, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4128}, + {58: 4133, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4130}, + {58: 4131, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 4132}, // 1520 - {9: 4078}, - {488: 4082, 4083, 511: 2759, 737: 4079, 767: 4081, 819: 4080}, - {1991, 1991, 6: 1991, 1991, 1991, 1991, 15: 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 73: 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 106: 1991, 132: 1991, 1991, 1991, 1991, 482: 1991, 1991, 487: 1991, 496: 1991, 501: 1991, 504: 1991, 506: 1991, 508: 1991, 650: 1991, 652: 1991, 658: 1991}, - {50: 4086}, - {31, 31, 6: 31, 31, 31, 15: 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, 50: 31, 73: 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 482: 31, 31, 487: 31, 506: 31, 508: 31, 650: 31, 652: 31, 658: 31}, + {1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 493: 1155, 1155, 1155, 497: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 508: 1155, 1155, 511: 1155, 1155, 1155, 516: 1155, 1155, 1155, 1155, 1155, 1155, 523: 1155, 1155, 526: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 550: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 584: 1155, 1155, 1155, 616: 1155}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 4134}, + {1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 493: 1157, 1157, 1157, 497: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 508: 1157, 1157, 511: 1157, 1157, 1157, 516: 1157, 1157, 1157, 1157, 1157, 1157, 523: 1157, 1157, 526: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 550: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 584: 1157, 1157, 1157, 616: 1157}, + {112: 3566, 3570, 3563, 3578, 118: 3565, 3562, 3564, 3568, 3569, 3574, 3573, 3572, 3576, 3577, 3571, 3575, 131: 3567, 813: 4136}, + {9: 4137}, // 1525 - {511: 2759, 737: 4079, 767: 4085}, - {511: 2759, 737: 4084}, - {29, 29, 6: 29, 29, 29, 15: 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, 50: 29, 73: 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 482: 29, 29, 487: 29, 506: 29, 508: 29, 650: 29, 652: 29, 658: 29}, - {30, 30, 6: 30, 30, 30, 15: 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, 50: 30, 73: 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 482: 30, 30, 487: 30, 506: 30, 508: 30, 650: 30, 652: 30, 658: 30}, - {1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 477: 1159, 1159, 1159, 1159, 1159, 483: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 492: 1159, 1159, 1159, 496: 1159, 1159, 499: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 509: 1159, 1159, 512: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 534: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 568: 1159, 1159, 597: 1159}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4138}, + {9: 4139, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4140}, + {58: 4141, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 493: 1204, 1204, 1204, 497: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 508: 1204, 1204, 511: 1204, 1204, 1204, 516: 1204, 1204, 1204, 1204, 1204, 1204, 523: 1204, 1204, 526: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 550: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 584: 1204, 1204, 1204, 616: 1204}, // 1530 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 4088}, - {50: 4089}, - {1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 477: 1160, 1160, 1160, 1160, 1160, 483: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 492: 1160, 1160, 1160, 496: 1160, 1160, 499: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 509: 1160, 1160, 512: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 534: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 568: 1160, 1160, 597: 1160}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4091}, - {50: 4092, 481: 4093, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, + {112: 3566, 3570, 3563, 3578, 118: 3565, 3562, 3564, 3568, 3569, 3574, 3573, 3572, 3576, 3577, 3571, 3575, 131: 3567, 813: 4143}, + {9: 4144}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4145}, + {9: 4146, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4147}, // 1535 - {1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 477: 1176, 1176, 1176, 1176, 1176, 483: 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 492: 1176, 1176, 1176, 496: 1176, 1176, 499: 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 509: 1176, 1176, 512: 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 534: 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 568: 1176, 1176, 597: 1176}, - {508: 3837, 533: 4095, 650: 3836, 906: 4094}, - {476: 3852, 768: 4098}, - {476: 3852, 768: 4096}, - {50: 4097}, + {58: 4148, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 493: 1205, 1205, 1205, 497: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 508: 1205, 1205, 511: 1205, 1205, 1205, 516: 1205, 1205, 1205, 1205, 1205, 1205, 523: 1205, 1205, 526: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 550: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 584: 1205, 1205, 1205, 616: 1205}, + {189: 4152, 4151, 212: 4153, 236: 4154, 1257: 4150}, + {9: 4155}, + {9: 1194}, // 1540 - {1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 477: 1174, 1174, 1174, 1174, 1174, 483: 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 492: 1174, 1174, 1174, 496: 1174, 1174, 499: 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 509: 1174, 1174, 512: 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 534: 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 568: 1174, 1174, 597: 1174}, - {50: 4099}, - {1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 477: 1175, 1175, 1175, 1175, 1175, 483: 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 492: 1175, 1175, 1175, 496: 1175, 1175, 499: 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 509: 1175, 1175, 512: 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 534: 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 568: 1175, 1175, 597: 1175}, - {1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 477: 1198, 1198, 1198, 1198, 1198, 483: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 492: 1198, 1198, 1198, 496: 1198, 1198, 499: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 509: 1198, 1198, 512: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 534: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 568: 1198, 1198, 597: 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, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 477: 1199, 1199, 1199, 1199, 1199, 483: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 492: 1199, 1199, 1199, 496: 1199, 1199, 499: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 509: 1199, 1199, 512: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 534: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 568: 1199, 1199, 597: 1199}, + {9: 1193}, + {9: 1192}, + {9: 1191}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4156}, + {58: 4157, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, // 1545 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 1936, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3614, 782: 3778, 830: 4103}, - {50: 4104}, - {1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 477: 1195, 1195, 1195, 1195, 1195, 483: 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 492: 1195, 1195, 1195, 496: 1195, 1195, 499: 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 509: 1195, 1195, 512: 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 534: 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 568: 1195, 1195, 597: 1195}, - {1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 477: 1200, 1200, 1200, 1200, 1200, 483: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 492: 1200, 1200, 1200, 496: 1200, 1200, 499: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 509: 1200, 1200, 512: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 534: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 568: 1200, 1200, 597: 1200}, - {2: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 10: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 51: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 476: 1255, 478: 1255, 1255, 1255, 482: 1255, 485: 1255, 1255, 488: 1255, 1255, 1255, 495: 1255, 498: 1255, 507: 1255, 1255, 511: 1255, 533: 1255, 567: 1255, 570: 1255, 1255, 573: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 585: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 595: 1255, 1255, 598: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 651: 1255, 654: 3572, 749: 3570, 3571, 789: 3573, 792: 3574, 821: 4107, 3575}, + {1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 493: 1211, 1211, 1211, 497: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 508: 1211, 1211, 511: 1211, 1211, 1211, 516: 1211, 1211, 1211, 1211, 1211, 1211, 523: 1211, 1211, 526: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 550: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 584: 1211, 1211, 1211, 616: 1211}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4159}, + {9: 4160}, + {504: 4164, 4165, 525: 2823, 755: 4161, 784: 4163, 838: 4162}, + {2033, 2033, 6: 2033, 2033, 2033, 2033, 15: 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 58: 2033, 79: 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 112: 2033, 141: 2033, 2033, 2033, 2033, 496: 2033, 499: 2033, 2033, 512: 2033, 514: 2033, 519: 2033, 521: 2033, 524: 2033, 667: 2033, 2033, 675: 2033}, // 1550 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4108}, - {50: 4109, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 477: 973, 973, 973, 973, 973, 483: 973, 973, 973, 973, 973, 973, 973, 973, 492: 973, 973, 973, 496: 973, 973, 499: 973, 973, 973, 973, 973, 973, 973, 973, 509: 973, 973, 512: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 534: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 568: 973, 973, 597: 973, 746: 3388, 751: 3580, 769: 4110}, - {1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 477: 1157, 1157, 1157, 1157, 1157, 483: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 492: 1157, 1157, 1157, 496: 1157, 1157, 499: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 509: 1157, 1157, 512: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 534: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 568: 1157, 1157, 597: 1157}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 1936, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3614, 782: 3778, 830: 4112}, + {58: 4168}, + {33, 33, 6: 33, 33, 33, 15: 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, 58: 33, 79: 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 496: 33, 499: 33, 33, 514: 33, 524: 33, 667: 33, 33, 675: 33}, + {525: 2823, 755: 4161, 784: 4167}, + {525: 2823, 755: 4166}, + {31, 31, 6: 31, 31, 31, 15: 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, 58: 31, 79: 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 496: 31, 499: 31, 31, 514: 31, 524: 31, 667: 31, 31, 675: 31}, // 1555 - {50: 4113}, - {1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 477: 1128, 1128, 1128, 1128, 1128, 483: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 492: 1128, 1128, 1128, 496: 1128, 1128, 499: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 509: 1128, 1128, 512: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 534: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 568: 1128, 1128, 597: 1128}, - {152: 2331, 177: 2331, 196: 2331, 495: 2331, 521: 2331, 547: 2331, 566: 2331, 568: 2331, 2331, 574: 2331, 2331, 586: 2331}, - {152: 2330, 177: 2330, 196: 2330, 495: 2330, 521: 2330, 547: 2330, 566: 2330, 568: 2330, 2330, 574: 2330, 2330, 586: 2330}, - {2: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 10: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 51: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 476: 1918, 478: 1918, 1918, 482: 1918, 485: 1918, 1918, 488: 1918, 1918, 1918, 495: 1918, 498: 1918, 507: 1918, 1918, 511: 1918, 533: 1918, 567: 1918, 570: 1918, 1918, 573: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 585: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 595: 1918, 1918, 598: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918}, + {32, 32, 6: 32, 32, 32, 15: 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, 58: 32, 79: 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 496: 32, 499: 32, 32, 514: 32, 524: 32, 667: 32, 32, 675: 32}, + {1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 493: 1182, 1182, 1182, 497: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 508: 1182, 1182, 511: 1182, 1182, 1182, 516: 1182, 1182, 1182, 1182, 1182, 1182, 523: 1182, 1182, 526: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 550: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 584: 1182, 1182, 1182, 616: 1182}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4170}, + {58: 4171}, + {1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 493: 1183, 1183, 1183, 497: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 508: 1183, 1183, 511: 1183, 1183, 1183, 516: 1183, 1183, 1183, 1183, 1183, 1183, 523: 1183, 1183, 526: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 550: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 584: 1183, 1183, 1183, 616: 1183}, // 1560 - {521: 4141, 547: 4140, 566: 4139, 568: 4125, 4126, 1120: 4142}, - {476: 1914}, - {2: 1912, 1912, 1912, 1912, 1912, 1912, 1912, 10: 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 51: 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 476: 1912, 478: 1912, 1912, 482: 1912, 485: 1912, 1912, 488: 1912, 1912, 1912, 495: 1912, 498: 1912, 507: 1912, 1912, 511: 1912, 533: 1912, 567: 1912, 570: 1912, 1912, 573: 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 585: 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 595: 1912, 1912, 598: 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912}, - {2: 1910, 1910, 1910, 1910, 1910, 1910, 1910, 10: 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 51: 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 476: 1910, 478: 1910, 1910, 482: 1910, 485: 1910, 1910, 488: 1910, 1910, 1910, 495: 1910, 498: 1910, 507: 1910, 1910, 511: 1910, 533: 1910, 567: 1910, 570: 1910, 1910, 573: 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 585: 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 595: 1910, 1910, 598: 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910}, - {476: 4135, 713: 4136}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4173}, + {58: 4174, 498: 4175, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 493: 1199, 1199, 1199, 497: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 508: 1199, 1199, 511: 1199, 1199, 1199, 516: 1199, 1199, 1199, 1199, 1199, 1199, 523: 1199, 1199, 526: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 550: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 584: 1199, 1199, 1199, 616: 1199}, + {514: 3917, 549: 4177, 667: 3916, 926: 4176}, + {492: 3932, 786: 4180}, // 1565 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 4132}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3374, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 4128, 3279, 3360, 3278, 3275}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3374, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 4127, 3279, 3360, 3278, 3275}, - {2: 1899, 1899, 1899, 1899, 1899, 1899, 1899, 10: 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 51: 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 476: 1899, 478: 1899, 1899, 482: 1899, 485: 1899, 1899, 488: 1899, 1899, 1899, 495: 1899, 498: 1899, 507: 1899, 1899, 511: 1899, 533: 1899, 567: 1899, 570: 1899, 1899, 573: 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 585: 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 595: 1899, 1899, 598: 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899}, - {2: 1898, 1898, 1898, 1898, 1898, 1898, 1898, 10: 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 51: 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 476: 1898, 478: 1898, 1898, 482: 1898, 485: 1898, 1898, 488: 1898, 1898, 1898, 495: 1898, 498: 1898, 507: 1898, 1898, 511: 1898, 533: 1898, 567: 1898, 570: 1898, 1898, 573: 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 585: 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 595: 1898, 1898, 598: 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898}, + {492: 3932, 786: 4178}, + {58: 4179}, + {1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 493: 1197, 1197, 1197, 497: 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 508: 1197, 1197, 511: 1197, 1197, 1197, 516: 1197, 1197, 1197, 1197, 1197, 1197, 523: 1197, 1197, 526: 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 550: 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 584: 1197, 1197, 1197, 616: 1197}, + {58: 4181}, + {1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 493: 1198, 1198, 1198, 497: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 508: 1198, 1198, 511: 1198, 1198, 1198, 516: 1198, 1198, 1198, 1198, 1198, 1198, 523: 1198, 1198, 526: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 550: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 584: 1198, 1198, 1198, 616: 1198}, // 1570 - {1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 477: 1901, 1901, 481: 1901, 483: 1901, 1901, 1901, 1901, 3376, 492: 1901, 1901, 1901, 496: 1901, 1901, 499: 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 509: 1901, 1901, 512: 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 522: 1901, 524: 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 534: 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 548: 1901, 1901, 558: 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 597: 3377}, - {1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 4130, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 477: 1897, 1897, 481: 1897, 483: 1897, 1897, 1897, 1897, 3376, 492: 1897, 1897, 1897, 496: 1897, 1897, 499: 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 509: 1897, 1897, 512: 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 522: 1897, 524: 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 534: 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 548: 1897, 1897, 558: 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 597: 3377, 1250: 4129}, - {1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 477: 1902, 1902, 481: 1902, 483: 1902, 1902, 1902, 1902, 492: 1902, 1902, 1902, 496: 1902, 1902, 499: 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 509: 1902, 1902, 512: 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 522: 1902, 524: 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 534: 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 548: 1902, 1902, 558: 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902}, - {478: 4131}, - {1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 477: 1896, 1896, 481: 1896, 483: 1896, 1896, 1896, 1896, 492: 1896, 1896, 1896, 496: 1896, 1896, 499: 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 509: 1896, 1896, 512: 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 522: 1896, 524: 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 534: 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 548: 1896, 1896, 558: 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896}, + {1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 493: 1221, 1221, 1221, 497: 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 508: 1221, 1221, 511: 1221, 1221, 1221, 516: 1221, 1221, 1221, 1221, 1221, 1221, 523: 1221, 1221, 526: 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 550: 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 584: 1221, 1221, 1221, 616: 1221}, + {1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 493: 1222, 1222, 1222, 497: 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 508: 1222, 1222, 511: 1222, 1222, 1222, 516: 1222, 1222, 1222, 1222, 1222, 1222, 523: 1222, 1222, 526: 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 550: 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 584: 1222, 1222, 1222, 616: 1222}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 1978, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3694, 801: 3858, 848: 4185}, + {58: 4186}, + {1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 493: 1218, 1218, 1218, 497: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 508: 1218, 1218, 511: 1218, 1218, 1218, 516: 1218, 1218, 1218, 1218, 1218, 1218, 523: 1218, 1218, 526: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 550: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 584: 1218, 1218, 1218, 616: 1218}, // 1575 - {488: 3712, 3713, 3718, 510: 4133, 523: 3714, 550: 3715, 3716, 3709, 3719, 3708, 3717, 3710, 3711}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 4134}, - {1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 477: 1903, 1903, 481: 1903, 483: 1903, 1903, 1903, 1903, 492: 1903, 1903, 1903, 496: 1903, 1903, 499: 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 509: 1903, 1903, 512: 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 522: 1903, 524: 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 534: 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 548: 1903, 1903, 558: 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 2607, 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3905, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 2605, 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 649: 2601, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3904, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3614, 752: 3907, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 3906, 3909, 3908, 782: 4137}, - {1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 477: 1904, 1904, 481: 1904, 483: 1904, 1904, 1904, 1904, 492: 1904, 1904, 1904, 496: 1904, 1904, 499: 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 509: 1904, 1904, 512: 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 522: 1904, 524: 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 534: 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 548: 1904, 1904, 558: 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904}, + {1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 493: 1223, 1223, 1223, 497: 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 508: 1223, 1223, 511: 1223, 1223, 1223, 516: 1223, 1223, 1223, 1223, 1223, 1223, 523: 1223, 1223, 526: 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 550: 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 584: 1223, 1223, 1223, 616: 1223}, + {2: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 10: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 59: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 492: 1278, 494: 1278, 1278, 1278, 1278, 502: 1278, 1278, 1278, 1278, 1278, 510: 1278, 514: 1278, 1278, 522: 1278, 525: 1278, 549: 1278, 583: 1278, 587: 1278, 589: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 601: 1278, 1278, 1278, 1278, 1278, 1278, 608: 1278, 1278, 1278, 1278, 1278, 614: 1278, 1278, 617: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 669: 1278, 671: 3652, 767: 3650, 3651, 808: 3653, 810: 3654, 839: 4189, 3655}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4190}, + {58: 4191, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 493: 996, 996, 996, 497: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 508: 996, 996, 511: 996, 996, 996, 516: 996, 996, 996, 996, 996, 996, 523: 996, 996, 526: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 550: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 584: 996, 996, 996, 616: 996, 764: 3468, 769: 3660, 787: 4192}, // 1580 - {9: 3616, 50: 4138}, - {1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 477: 1905, 1905, 481: 1905, 483: 1905, 1905, 1905, 1905, 492: 1905, 1905, 1905, 496: 1905, 1905, 499: 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 509: 1905, 1905, 512: 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 522: 1905, 524: 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 534: 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 548: 1905, 1905, 558: 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905}, - {2: 1917, 1917, 1917, 1917, 1917, 1917, 1917, 10: 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 51: 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 476: 1917, 478: 1917, 1917, 482: 1917, 485: 1917, 1917, 488: 1917, 1917, 1917, 495: 1917, 498: 1917, 507: 1917, 1917, 511: 1917, 533: 1917, 567: 1917, 570: 1917, 1917, 573: 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 585: 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 595: 1917, 1917, 598: 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917}, - {476: 1913}, - {2: 1911, 1911, 1911, 1911, 1911, 1911, 1911, 10: 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 51: 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 476: 1911, 478: 1911, 1911, 482: 1911, 485: 1911, 1911, 488: 1911, 1911, 1911, 495: 1911, 498: 1911, 507: 1911, 1911, 511: 1911, 533: 1911, 567: 1911, 570: 1911, 1911, 573: 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 585: 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 595: 1911, 1911, 598: 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911}, + {1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 493: 1180, 1180, 1180, 497: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 508: 1180, 1180, 511: 1180, 1180, 1180, 516: 1180, 1180, 1180, 1180, 1180, 1180, 523: 1180, 1180, 526: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 550: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 584: 1180, 1180, 1180, 616: 1180}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 1978, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3694, 801: 3858, 848: 4194}, + {58: 4195}, + {1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 493: 1151, 1151, 1151, 497: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 508: 1151, 1151, 511: 1151, 1151, 1151, 516: 1151, 1151, 1151, 1151, 1151, 1151, 523: 1151, 1151, 526: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 550: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 584: 1151, 1151, 1151, 616: 1151}, + {161: 2379, 186: 2379, 206: 2379, 510: 2379, 537: 2379, 564: 2379, 582: 2379, 584: 2379, 2379, 591: 2379, 2379, 603: 2379}, // 1585 - {2: 1909, 1909, 1909, 1909, 1909, 1909, 1909, 10: 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 51: 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 476: 1909, 478: 1909, 1909, 482: 1909, 485: 1909, 1909, 488: 1909, 1909, 1909, 495: 1909, 498: 1909, 507: 1909, 1909, 511: 1909, 533: 1909, 567: 1909, 570: 1909, 1909, 573: 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 585: 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 595: 1909, 1909, 598: 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909}, - {177: 4166, 495: 4167, 574: 4165, 4164}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 4158, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 4159, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 4157, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 654: 4160, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 4155, 1183: 4156}, - {2: 1926, 1926, 1926, 1926, 1926, 1926, 1926, 10: 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 51: 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 476: 1926, 478: 1926, 1926, 482: 1926, 485: 1926, 1926, 488: 1926, 1926, 1926, 495: 1926, 498: 1926, 507: 1926, 1926, 511: 1926, 533: 1926, 567: 1926, 570: 1926, 1926, 573: 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 585: 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 595: 1926, 1926, 598: 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 654: 1926}, - {2: 1925, 1925, 1925, 1925, 1925, 1925, 1925, 10: 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 51: 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 476: 1925, 478: 1925, 1925, 482: 1925, 485: 1925, 1925, 488: 1925, 1925, 1925, 495: 1925, 498: 1925, 507: 1925, 1925, 511: 1925, 533: 1925, 567: 1925, 570: 1925, 1925, 573: 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 585: 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 595: 1925, 1925, 598: 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 654: 1925}, + {161: 2378, 186: 2378, 206: 2378, 510: 2378, 537: 2378, 564: 2378, 582: 2378, 584: 2378, 2378, 591: 2378, 2378, 603: 2378}, + {2: 1960, 1960, 1960, 1960, 1960, 1960, 1960, 10: 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 59: 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 492: 1960, 494: 1960, 1960, 1960, 502: 1960, 1960, 1960, 1960, 1960, 510: 1960, 514: 1960, 1960, 522: 1960, 525: 1960, 549: 1960, 583: 1960, 587: 1960, 589: 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 601: 1960, 1960, 1960, 1960, 1960, 1960, 608: 1960, 1960, 1960, 1960, 1960, 614: 1960, 1960, 617: 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960}, + {537: 4227, 564: 4226, 582: 4225, 584: 4208, 4209, 1143: 4228}, + {492: 1956}, + {2: 1954, 1954, 1954, 1954, 1954, 1954, 1954, 10: 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 59: 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 492: 1954, 494: 1954, 1954, 1954, 502: 1954, 1954, 1954, 1954, 1954, 510: 1954, 514: 1954, 1954, 522: 1954, 525: 1954, 549: 1954, 583: 1954, 587: 1954, 589: 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 601: 1954, 1954, 1954, 1954, 1954, 1954, 608: 1954, 1954, 1954, 1954, 1954, 614: 1954, 1954, 617: 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954}, // 1590 - {2: 1924, 1924, 1924, 1924, 1924, 1924, 1924, 10: 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 51: 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 476: 1924, 478: 1924, 1924, 482: 1924, 485: 1924, 1924, 488: 1924, 1924, 1924, 495: 1924, 498: 1924, 507: 1924, 1924, 511: 1924, 533: 1924, 567: 1924, 570: 1924, 1924, 573: 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 585: 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 595: 1924, 1924, 598: 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 654: 1924}, - {2: 1923, 1923, 1923, 1923, 1923, 1923, 1923, 10: 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 51: 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 476: 1923, 478: 1923, 1923, 482: 1923, 485: 1923, 1923, 488: 1923, 1923, 1923, 495: 1923, 498: 1923, 507: 1923, 1923, 511: 1923, 533: 1923, 567: 1923, 570: 1923, 1923, 573: 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 585: 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 595: 1923, 1923, 598: 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 654: 1923}, - {2: 1922, 1922, 1922, 1922, 1922, 1922, 1922, 10: 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 51: 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 476: 1922, 478: 1922, 1922, 482: 1922, 485: 1922, 1922, 488: 1922, 1922, 1922, 495: 1922, 498: 1922, 507: 1922, 1922, 511: 1922, 533: 1922, 567: 1922, 570: 1922, 1922, 573: 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 585: 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 595: 1922, 1922, 598: 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 654: 1922}, - {2: 1921, 1921, 1921, 1921, 1921, 1921, 1921, 10: 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 51: 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 476: 1921, 478: 1921, 1921, 482: 1921, 485: 1921, 1921, 488: 1921, 1921, 1921, 495: 1921, 498: 1921, 507: 1921, 1921, 511: 1921, 533: 1921, 567: 1921, 570: 1921, 1921, 573: 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 585: 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 595: 1921, 1921, 598: 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 654: 1921}, - {2: 1920, 1920, 1920, 1920, 1920, 1920, 1920, 10: 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 51: 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 476: 1920, 478: 1920, 1920, 482: 1920, 485: 1920, 1920, 488: 1920, 1920, 1920, 495: 1920, 498: 1920, 507: 1920, 1920, 511: 1920, 533: 1920, 567: 1920, 570: 1920, 1920, 573: 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 585: 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 595: 1920, 1920, 598: 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 654: 1920}, + {2: 1952, 1952, 1952, 1952, 1952, 1952, 1952, 10: 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 59: 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 492: 1952, 494: 1952, 1952, 1952, 502: 1952, 1952, 1952, 1952, 1952, 510: 1952, 514: 1952, 1952, 522: 1952, 525: 1952, 549: 1952, 583: 1952, 587: 1952, 589: 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 601: 1952, 1952, 1952, 1952, 1952, 1952, 608: 1952, 1952, 1952, 1952, 1952, 614: 1952, 1952, 617: 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952}, + {492: 4221, 731: 4222}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 4218}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3454, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 4214, 3359, 3440, 3358, 3355}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3454, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 4213, 3359, 3440, 3358, 3355}, // 1595 - {2: 1919, 1919, 1919, 1919, 1919, 1919, 1919, 10: 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 51: 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 476: 1919, 478: 1919, 1919, 482: 1919, 485: 1919, 1919, 488: 1919, 1919, 1919, 495: 1919, 498: 1919, 507: 1919, 1919, 511: 1919, 533: 1919, 567: 1919, 570: 1919, 1919, 573: 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 585: 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 595: 1919, 1919, 598: 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 654: 1919}, - {177: 1916, 479: 4115, 4114, 495: 1916, 574: 1916, 1916, 815: 4154}, - {177: 1915, 495: 1915, 574: 1915, 1915}, - {1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 477: 1930, 1930, 481: 1930, 483: 1930, 1930, 1930, 1930, 492: 1930, 1930, 1930, 496: 1930, 1930, 499: 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 509: 1930, 1930, 512: 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 522: 1930, 524: 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 534: 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 548: 1930, 1930, 558: 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930}, - {476: 2608, 713: 4163}, + {492: 4210}, + {2: 1940, 1940, 1940, 1940, 1940, 1940, 1940, 10: 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 59: 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 492: 1940, 494: 1940, 1940, 1940, 502: 1940, 1940, 1940, 1940, 1940, 510: 1940, 514: 1940, 1940, 522: 1940, 525: 1940, 549: 1940, 583: 1940, 587: 1940, 589: 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 601: 1940, 1940, 1940, 1940, 1940, 1940, 608: 1940, 1940, 1940, 1940, 1940, 614: 1940, 1940, 617: 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940}, + {2: 1939, 1939, 1939, 1939, 1939, 1939, 1939, 10: 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 59: 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 492: 1939, 494: 1939, 1939, 1939, 502: 1939, 1939, 1939, 1939, 1939, 510: 1939, 514: 1939, 1939, 522: 1939, 525: 1939, 549: 1939, 583: 1939, 587: 1939, 589: 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 601: 1939, 1939, 1939, 1939, 1939, 1939, 608: 1939, 1939, 1939, 1939, 1939, 614: 1939, 1939, 617: 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3454, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 4211, 3359, 3440, 3358, 3355}, + {58: 4212, 499: 3456, 616: 3457}, // 1600 - {762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 477: 762, 762, 762, 762, 762, 483: 762, 762, 762, 762, 762, 762, 762, 762, 492: 762, 762, 762, 496: 762, 762, 499: 762, 762, 762, 762, 762, 762, 762, 762, 509: 762, 762, 512: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 534: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 568: 762, 762, 597: 762, 662: 4161}, - {1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1908, 1730, 1730, 1730, 1730, 1730, 483: 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 492: 1730, 1730, 1730, 496: 1730, 1730, 499: 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 509: 1730, 1730, 512: 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 534: 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 568: 1730, 1730, 597: 1730, 655: 1730, 659: 1730, 1730}, - {1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1907, 1729, 1729, 1729, 1729, 1729, 483: 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 492: 1729, 1729, 1729, 496: 1729, 1729, 499: 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 509: 1729, 1729, 512: 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 534: 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 568: 1729, 1729, 597: 1729, 655: 1729, 659: 1729, 1729}, - {476: 1906}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 4162}, + {1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 493: 1942, 1942, 498: 1942, 500: 1942, 1942, 1942, 1942, 508: 1942, 1942, 511: 1942, 1942, 1942, 516: 1942, 1942, 1942, 1942, 1942, 1942, 523: 1942, 1942, 526: 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 538: 1942, 1942, 1942, 542: 1942, 1942, 1942, 1942, 1942, 1942, 1942, 550: 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 565: 1942, 574: 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942}, + {1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 493: 1943, 1943, 498: 1943, 3456, 1943, 1943, 1943, 1943, 508: 1943, 1943, 511: 1943, 1943, 1943, 516: 1943, 1943, 1943, 1943, 1943, 1943, 523: 1943, 1943, 526: 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 538: 1943, 1943, 1943, 542: 1943, 1943, 1943, 1943, 1943, 1943, 1943, 550: 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 565: 1943, 574: 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 616: 3457}, + {1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 4216, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 493: 1938, 1938, 498: 1938, 3456, 1938, 1938, 1938, 1938, 508: 1938, 1938, 511: 1938, 1938, 1938, 516: 1938, 1938, 1938, 1938, 1938, 1938, 523: 1938, 1938, 526: 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 538: 1938, 1938, 1938, 542: 1938, 1938, 1938, 1938, 1938, 1938, 1938, 550: 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 565: 1938, 574: 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 616: 3457, 1275: 4215}, + {1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 493: 1944, 1944, 498: 1944, 500: 1944, 1944, 1944, 1944, 508: 1944, 1944, 511: 1944, 1944, 1944, 516: 1944, 1944, 1944, 1944, 1944, 1944, 523: 1944, 1944, 526: 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 538: 1944, 1944, 1944, 542: 1944, 1944, 1944, 1944, 1944, 1944, 1944, 550: 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 565: 1944, 574: 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944}, + {494: 4217}, // 1605 - {1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 477: 1928, 1928, 481: 1928, 483: 1928, 1928, 1928, 1928, 492: 1928, 1928, 1928, 496: 1928, 1928, 499: 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 509: 1928, 1928, 512: 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 522: 1928, 524: 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 534: 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 548: 1928, 1928, 558: 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928}, - {1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 477: 1929, 1929, 481: 1929, 483: 1929, 1929, 1929, 1929, 492: 1929, 1929, 1929, 496: 1929, 1929, 499: 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 509: 1929, 1929, 512: 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 522: 1929, 524: 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 534: 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 548: 1929, 1929, 558: 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929}, - {1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 477: 1955, 1955, 481: 1955, 483: 1955, 1955, 1955, 1955, 492: 1955, 1955, 1955, 496: 1955, 1955, 499: 1955, 1955, 1955, 503: 1955, 1955, 1955, 1955, 509: 1955, 1955, 512: 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 522: 1955, 524: 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 534: 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 548: 1955, 1955}, - {1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 477: 1954, 1954, 481: 1954, 483: 1954, 1954, 1954, 1954, 492: 1954, 1954, 1954, 496: 1954, 1954, 499: 1954, 1954, 1954, 503: 1954, 1954, 1954, 1954, 509: 1954, 1954, 512: 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 522: 1954, 524: 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 534: 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 548: 1954, 1954}, - {1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 477: 1953, 1953, 481: 1953, 483: 1953, 1953, 1953, 1953, 492: 1953, 1953, 1953, 496: 1953, 1953, 499: 1953, 1953, 1953, 503: 1953, 1953, 1953, 1953, 509: 1953, 1953, 512: 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 522: 1953, 524: 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 534: 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 548: 1953, 1953}, + {1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 493: 1937, 1937, 498: 1937, 500: 1937, 1937, 1937, 1937, 508: 1937, 1937, 511: 1937, 1937, 1937, 516: 1937, 1937, 1937, 1937, 1937, 1937, 523: 1937, 1937, 526: 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 538: 1937, 1937, 1937, 542: 1937, 1937, 1937, 1937, 1937, 1937, 1937, 550: 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 565: 1937, 574: 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937}, + {504: 3792, 3793, 3798, 527: 4219, 541: 3794, 566: 3795, 3796, 3789, 3799, 3788, 3797, 3790, 3791}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 4220}, + {1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 493: 1945, 1945, 498: 1945, 500: 1945, 1945, 1945, 1945, 508: 1945, 1945, 511: 1945, 1945, 1945, 516: 1945, 1945, 1945, 1945, 1945, 1945, 523: 1945, 1945, 526: 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 538: 1945, 1945, 1945, 542: 1945, 1945, 1945, 1945, 1945, 1945, 1945, 550: 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 565: 1945, 574: 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 2662, 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3987, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 2660, 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 665: 2656, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3986, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3694, 770: 3989, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 3988, 3991, 3990, 801: 4223}, // 1610 - {1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 477: 1931, 1931, 481: 1931, 483: 1931, 1931, 1931, 1931, 492: 1931, 1931, 1931, 496: 1931, 1931, 499: 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 509: 1931, 1931, 512: 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 522: 1931, 524: 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 534: 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 548: 1931, 1931, 558: 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 4170, 812: 4171}, - {2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 476: 2354, 491: 2354, 496: 2354, 502: 2354, 508: 2354, 2354, 532: 2354, 2354, 2354, 650: 2354, 655: 4192, 672: 2354, 2354, 675: 2354, 681: 2354, 2354, 684: 2354, 2354, 2354, 2354, 2354, 2354, 692: 2354, 694: 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 709: 2354, 2354, 2354, 2354}, - {9: 2351, 50: 2351}, - {9: 4172, 50: 4173}, + {1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 493: 1946, 1946, 498: 1946, 500: 1946, 1946, 1946, 1946, 508: 1946, 1946, 511: 1946, 1946, 1946, 516: 1946, 1946, 1946, 1946, 1946, 1946, 523: 1946, 1946, 526: 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 538: 1946, 1946, 1946, 542: 1946, 1946, 1946, 1946, 1946, 1946, 1946, 550: 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 565: 1946, 574: 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946}, + {9: 3696, 58: 4224}, + {1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 493: 1947, 1947, 498: 1947, 500: 1947, 1947, 1947, 1947, 508: 1947, 1947, 511: 1947, 1947, 1947, 516: 1947, 1947, 1947, 1947, 1947, 1947, 523: 1947, 1947, 526: 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 538: 1947, 1947, 1947, 542: 1947, 1947, 1947, 1947, 1947, 1947, 1947, 550: 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 565: 1947, 574: 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947}, + {2: 1959, 1959, 1959, 1959, 1959, 1959, 1959, 10: 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 59: 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 492: 1959, 494: 1959, 1959, 1959, 502: 1959, 1959, 1959, 1959, 1959, 510: 1959, 514: 1959, 1959, 522: 1959, 525: 1959, 549: 1959, 583: 1959, 587: 1959, 589: 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 601: 1959, 1959, 1959, 1959, 1959, 1959, 608: 1959, 1959, 1959, 1959, 1959, 614: 1959, 1959, 617: 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959}, + {492: 1955}, // 1615 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 4191}, - {312: 4174}, - {476: 4175}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 4176}, - {50: 1949, 477: 4179, 488: 3712, 3713, 3718, 523: 3714, 547: 4178, 550: 3715, 3716, 3709, 3719, 3708, 3717, 3710, 3711, 1230: 4177}, + {2: 1953, 1953, 1953, 1953, 1953, 1953, 1953, 10: 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 59: 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 492: 1953, 494: 1953, 1953, 1953, 502: 1953, 1953, 1953, 1953, 1953, 510: 1953, 514: 1953, 1953, 522: 1953, 525: 1953, 549: 1953, 583: 1953, 587: 1953, 589: 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 601: 1953, 1953, 1953, 1953, 1953, 1953, 608: 1953, 1953, 1953, 1953, 1953, 614: 1953, 1953, 617: 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953}, + {2: 1951, 1951, 1951, 1951, 1951, 1951, 1951, 10: 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 59: 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 492: 1951, 494: 1951, 1951, 1951, 502: 1951, 1951, 1951, 1951, 1951, 510: 1951, 514: 1951, 1951, 522: 1951, 525: 1951, 549: 1951, 583: 1951, 587: 1951, 589: 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 601: 1951, 1951, 1951, 1951, 1951, 1951, 608: 1951, 1951, 1951, 1951, 1951, 614: 1951, 1951, 617: 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951}, + {186: 4252, 510: 4253, 591: 4251, 4250}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 4244, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 4245, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 4243, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 671: 4246, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 4241, 1208: 4242}, + {2: 1968, 1968, 1968, 1968, 1968, 1968, 1968, 10: 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 59: 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 492: 1968, 494: 1968, 1968, 1968, 502: 1968, 1968, 1968, 1968, 1968, 510: 1968, 514: 1968, 1968, 522: 1968, 525: 1968, 549: 1968, 583: 1968, 587: 1968, 589: 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 601: 1968, 1968, 1968, 1968, 1968, 1968, 608: 1968, 1968, 1968, 1968, 1968, 614: 1968, 1968, 617: 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 671: 1968}, // 1620 - {50: 4190}, - {233: 4183, 522: 4182}, - {142: 4180}, - {257: 4181}, - {50: 1945}, + {2: 1967, 1967, 1967, 1967, 1967, 1967, 1967, 10: 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 59: 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 492: 1967, 494: 1967, 1967, 1967, 502: 1967, 1967, 1967, 1967, 1967, 510: 1967, 514: 1967, 1967, 522: 1967, 525: 1967, 549: 1967, 583: 1967, 587: 1967, 589: 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 601: 1967, 1967, 1967, 1967, 1967, 1967, 608: 1967, 1967, 1967, 1967, 1967, 614: 1967, 1967, 617: 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 671: 1967}, + {2: 1966, 1966, 1966, 1966, 1966, 1966, 1966, 10: 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 59: 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 492: 1966, 494: 1966, 1966, 1966, 502: 1966, 1966, 1966, 1966, 1966, 510: 1966, 514: 1966, 1966, 522: 1966, 525: 1966, 549: 1966, 583: 1966, 587: 1966, 589: 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 601: 1966, 1966, 1966, 1966, 1966, 1966, 608: 1966, 1966, 1966, 1966, 1966, 614: 1966, 1966, 617: 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 671: 1966}, + {2: 1965, 1965, 1965, 1965, 1965, 1965, 1965, 10: 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 59: 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 492: 1965, 494: 1965, 1965, 1965, 502: 1965, 1965, 1965, 1965, 1965, 510: 1965, 514: 1965, 1965, 522: 1965, 525: 1965, 549: 1965, 583: 1965, 587: 1965, 589: 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 601: 1965, 1965, 1965, 1965, 1965, 1965, 608: 1965, 1965, 1965, 1965, 1965, 614: 1965, 1965, 617: 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 671: 1965}, + {2: 1964, 1964, 1964, 1964, 1964, 1964, 1964, 10: 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 59: 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 492: 1964, 494: 1964, 1964, 1964, 502: 1964, 1964, 1964, 1964, 1964, 510: 1964, 514: 1964, 1964, 522: 1964, 525: 1964, 549: 1964, 583: 1964, 587: 1964, 589: 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 601: 1964, 1964, 1964, 1964, 1964, 1964, 608: 1964, 1964, 1964, 1964, 1964, 614: 1964, 1964, 617: 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 671: 1964}, + {2: 1963, 1963, 1963, 1963, 1963, 1963, 1963, 10: 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 59: 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 492: 1963, 494: 1963, 1963, 1963, 502: 1963, 1963, 1963, 1963, 1963, 510: 1963, 514: 1963, 1963, 522: 1963, 525: 1963, 549: 1963, 583: 1963, 587: 1963, 589: 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 601: 1963, 1963, 1963, 1963, 1963, 1963, 608: 1963, 1963, 1963, 1963, 1963, 614: 1963, 1963, 617: 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 671: 1963}, // 1625 - {357: 4185}, - {215: 4184}, - {50: 1946}, - {215: 4186}, - {50: 1948, 477: 4187}, + {2: 1962, 1962, 1962, 1962, 1962, 1962, 1962, 10: 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 59: 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 492: 1962, 494: 1962, 1962, 1962, 502: 1962, 1962, 1962, 1962, 1962, 510: 1962, 514: 1962, 1962, 522: 1962, 525: 1962, 549: 1962, 583: 1962, 587: 1962, 589: 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 601: 1962, 1962, 1962, 1962, 1962, 1962, 608: 1962, 1962, 1962, 1962, 1962, 614: 1962, 1962, 617: 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 671: 1962}, + {2: 1961, 1961, 1961, 1961, 1961, 1961, 1961, 10: 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 59: 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 492: 1961, 494: 1961, 1961, 1961, 502: 1961, 1961, 1961, 1961, 1961, 510: 1961, 514: 1961, 1961, 522: 1961, 525: 1961, 549: 1961, 583: 1961, 587: 1961, 589: 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 601: 1961, 1961, 1961, 1961, 1961, 1961, 608: 1961, 1961, 1961, 1961, 1961, 614: 1961, 1961, 617: 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 671: 1961}, + {186: 1958, 495: 4197, 497: 4196, 510: 1958, 591: 1958, 1958, 834: 4240}, + {186: 1957, 510: 1957, 591: 1957, 1957}, + {1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 493: 1972, 1972, 498: 1972, 500: 1972, 1972, 1972, 1972, 508: 1972, 1972, 511: 1972, 1972, 1972, 516: 1972, 1972, 1972, 1972, 1972, 1972, 523: 1972, 1972, 526: 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 538: 1972, 1972, 1972, 542: 1972, 1972, 1972, 1972, 1972, 1972, 1972, 550: 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 565: 1972, 574: 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972}, // 1630 - {142: 4188}, - {257: 4189}, - {50: 1947}, - {1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 477: 1956, 1956, 481: 1956, 483: 1956, 1956, 1956, 1956, 492: 1956, 1956, 1956, 496: 1956, 1956, 499: 1956, 1956, 1956, 503: 1956, 1956, 1956, 1956, 509: 1956, 1956, 512: 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 522: 1956, 524: 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 534: 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 548: 1956, 1956}, - {9: 2350, 50: 2350}, + {492: 2663, 731: 4249}, + {785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 493: 785, 785, 785, 497: 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 508: 785, 785, 511: 785, 785, 785, 516: 785, 785, 785, 785, 785, 785, 523: 785, 785, 526: 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 550: 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 584: 785, 785, 785, 616: 785, 680: 4247}, + {1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1950, 1770, 1770, 1770, 497: 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 508: 1770, 1770, 511: 1770, 1770, 1770, 516: 1770, 1770, 1770, 1770, 1770, 1770, 523: 1770, 1770, 526: 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 550: 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 584: 1770, 1770, 1770, 616: 1770, 672: 1770, 676: 1770, 1770}, + {1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1949, 1769, 1769, 1769, 497: 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 508: 1769, 1769, 511: 1769, 1769, 1769, 516: 1769, 1769, 1769, 1769, 1769, 1769, 523: 1769, 1769, 526: 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 550: 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 584: 1769, 1769, 1769, 616: 1769, 672: 1769, 676: 1769, 1769}, + {492: 1948}, // 1635 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4193, 2785, 2786, 2784}, - {2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 476: 2353, 491: 2353, 496: 2353, 502: 2353, 508: 2353, 2353, 532: 2353, 2353, 2353, 650: 2353, 655: 4194, 672: 2353, 2353, 675: 2353, 681: 2353, 2353, 684: 2353, 2353, 2353, 2353, 2353, 2353, 692: 2353, 694: 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 709: 2353, 2353, 2353, 2353}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4195, 2785, 2786, 2784}, - {2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 476: 2352, 491: 2352, 496: 2352, 502: 2352, 508: 2352, 2352, 532: 2352, 2352, 2352, 650: 2352, 672: 2352, 2352, 675: 2352, 681: 2352, 2352, 684: 2352, 2352, 2352, 2352, 2352, 2352, 692: 2352, 694: 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 709: 2352, 2352, 2352, 2352}, - {1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 477: 1957, 1957, 481: 1957, 483: 1957, 1957, 1957, 1957, 492: 1957, 1957, 1957, 496: 1957, 1957, 499: 1957, 1957, 1957, 503: 1957, 1957, 1957, 1957, 509: 1957, 1957, 512: 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 522: 1957, 524: 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 534: 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 548: 1957, 1957, 738: 3367, 3365}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 4248}, + {1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 493: 1970, 1970, 498: 1970, 500: 1970, 1970, 1970, 1970, 508: 1970, 1970, 511: 1970, 1970, 1970, 516: 1970, 1970, 1970, 1970, 1970, 1970, 523: 1970, 1970, 526: 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 538: 1970, 1970, 1970, 542: 1970, 1970, 1970, 1970, 1970, 1970, 1970, 550: 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 565: 1970, 574: 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970}, + {1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 493: 1971, 1971, 498: 1971, 500: 1971, 1971, 1971, 1971, 508: 1971, 1971, 511: 1971, 1971, 1971, 516: 1971, 1971, 1971, 1971, 1971, 1971, 523: 1971, 1971, 526: 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 538: 1971, 1971, 1971, 542: 1971, 1971, 1971, 1971, 1971, 1971, 1971, 550: 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 565: 1971, 574: 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971}, + {1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 493: 1997, 1997, 498: 1997, 500: 1997, 1997, 1997, 1997, 508: 1997, 1997, 511: 1997, 1997, 1997, 516: 1997, 1997, 519: 1997, 1997, 1997, 523: 1997, 1997, 526: 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 538: 1997, 1997, 1997, 542: 1997, 1997, 1997, 1997, 1997, 1997, 1997, 550: 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 565: 1997}, + {1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 493: 1996, 1996, 498: 1996, 500: 1996, 1996, 1996, 1996, 508: 1996, 1996, 511: 1996, 1996, 1996, 516: 1996, 1996, 519: 1996, 1996, 1996, 523: 1996, 1996, 526: 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 538: 1996, 1996, 1996, 542: 1996, 1996, 1996, 1996, 1996, 1996, 1996, 550: 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 565: 1996}, // 1640 - {1317, 1317, 9: 1317, 50: 1317, 128: 1317, 475: 1317, 477: 1317, 483: 1317, 1317, 493: 1317, 1317, 496: 1317, 1317, 499: 1317, 1317, 504: 1317, 1317, 517: 1317, 519: 1317, 527: 1317, 530: 1317, 1317}, - {1316, 1316, 9: 1316, 50: 1316, 128: 1316, 475: 1316, 477: 1316, 483: 1316, 1316, 493: 1316, 1316, 496: 1316, 1316, 499: 1316, 1316, 504: 1316, 1316, 517: 1316, 519: 1316, 527: 1316, 530: 1316, 1316}, - {1315, 1315, 9: 1315, 50: 1315, 128: 1315, 475: 1315, 477: 1315, 483: 1315, 1315, 493: 1315, 1315, 496: 1315, 1315, 499: 1315, 1315, 504: 1315, 1315, 517: 1315, 519: 1315, 527: 1315, 530: 1315, 1315}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4201}, - {1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 477: 1961, 1961, 481: 1961, 483: 1961, 1961, 1961, 1961, 492: 1961, 1961, 1961, 496: 1961, 1961, 499: 1961, 1961, 1961, 503: 1961, 1961, 1961, 1961, 509: 1961, 3371, 512: 3369, 3370, 3368, 3366, 1961, 1961, 1961, 1961, 1961, 522: 1961, 524: 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 534: 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 548: 1961, 1961, 738: 3367, 3365}, + {1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 493: 1995, 1995, 498: 1995, 500: 1995, 1995, 1995, 1995, 508: 1995, 1995, 511: 1995, 1995, 1995, 516: 1995, 1995, 519: 1995, 1995, 1995, 523: 1995, 1995, 526: 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 538: 1995, 1995, 1995, 542: 1995, 1995, 1995, 1995, 1995, 1995, 1995, 550: 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 565: 1995}, + {1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 493: 1973, 1973, 498: 1973, 500: 1973, 1973, 1973, 1973, 508: 1973, 1973, 511: 1973, 1973, 1973, 516: 1973, 1973, 1973, 1973, 1973, 1973, 523: 1973, 1973, 526: 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 538: 1973, 1973, 1973, 542: 1973, 1973, 1973, 1973, 1973, 1973, 1973, 550: 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 565: 1973, 574: 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 4256, 831: 4257}, + {2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 492: 2402, 507: 2402, 512: 2402, 514: 2402, 518: 2402, 526: 2402, 548: 2402, 2402, 561: 2402, 667: 2402, 672: 4278, 690: 2402, 2402, 693: 2402, 699: 2402, 2402, 702: 2402, 2402, 2402, 2402, 2402, 2402, 710: 2402, 712: 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 727: 2402, 2402, 2402, 2402}, + {9: 2399, 58: 2399}, // 1645 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 4203}, - {50: 4204}, - {2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 477: 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 499: 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 509: 2250, 2250, 512: 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 534: 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 568: 2250, 2250, 584: 2250, 593: 2250, 2250, 597: 2250, 645: 2250, 2250, 2250, 2250}, - {497: 4206}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 4207}, + {9: 4258, 58: 4259}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 4277}, + {324: 4260}, + {492: 4261}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 4262}, // 1650 - {2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 477: 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 499: 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 509: 2251, 2251, 512: 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 534: 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 568: 2251, 2251, 584: 2251, 593: 2251, 2251, 597: 2251, 645: 2251, 2251, 2251, 2251}, - {258, 258, 50: 258, 475: 258, 477: 258, 483: 258, 258, 493: 258, 258, 496: 258, 258, 499: 258, 258, 504: 258, 258, 510: 3371, 512: 3369, 3370, 3368, 3366, 258, 258, 519: 258, 738: 3367, 3365}, - {6, 6}, - {142: 4212}, - {2, 2}, + {58: 1991, 493: 4265, 504: 3792, 3793, 3798, 541: 3794, 564: 4264, 566: 3795, 3796, 3789, 3799, 3788, 3797, 3790, 3791, 1255: 4263}, + {58: 4276}, + {243: 4269, 538: 4268}, + {151: 4266}, + {268: 4267}, // 1655 - {257, 257, 496: 257, 501: 2745, 504: 257, 257, 795: 2746, 4213}, - {1311, 1311, 496: 1311, 504: 1311, 2748, 772: 2749, 817: 4214}, - {883, 883, 496: 2751, 504: 2752, 773: 2753, 834: 4215}, - {4, 4}, - {572: 4218}, + {58: 1987}, + {367: 4271}, + {227: 4270}, + {58: 1988}, + {227: 4272}, // 1660 - {2: 1872, 1872, 1872, 1872, 1872, 1872, 1872, 10: 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 51: 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 476: 1872, 499: 1872, 503: 1872, 572: 1872, 582: 1872}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 4219}, - {2432, 2432, 2432, 2432, 2432, 2432, 4267, 4269, 410, 10: 4236, 15: 4286, 2193, 4284, 4223, 4288, 4275, 4304, 4268, 4271, 4270, 4273, 4274, 4276, 4283, 410, 4294, 4295, 4281, 4282, 4287, 4289, 4301, 4300, 4306, 4302, 4299, 4292, 4297, 4298, 4291, 4293, 4296, 4285, 72: 4238, 75: 4259, 4260, 84: 4261, 140: 4241, 185: 4230, 205: 4224, 4222, 4245, 210: 4246, 221: 4240, 227: 4256, 240: 4234, 249: 4242, 255: 4237, 272: 4247, 280: 4243, 287: 4257, 4258, 292: 4225, 477: 4255, 482: 4266, 4303, 487: 2193, 491: 2432, 500: 4262, 505: 4244, 4254, 508: 2193, 4227, 587: 4228, 593: 4233, 650: 2193, 652: 4272, 656: 4221, 668: 4249, 672: 4235, 674: 4263, 683: 4248, 690: 4250, 693: 4229, 708: 4239, 785: 4277, 797: 4279, 818: 4278, 840: 4280, 843: 4290, 847: 4305, 874: 4253, 887: 4251, 924: 4226, 931: 4231, 994: 4265, 1146: 4232, 1174: 4252, 1180: 4264, 4220}, - {2191, 2191, 5067, 5068, 5065, 5066, 491: 5069, 1108: 5064, 1179: 5063}, - {491: 5037}, + {58: 1990, 493: 4273}, + {151: 4274}, + {268: 4275}, + {58: 1989}, + {1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 493: 1998, 1998, 498: 1998, 500: 1998, 1998, 1998, 1998, 508: 1998, 1998, 511: 1998, 1998, 1998, 516: 1998, 1998, 519: 1998, 1998, 1998, 523: 1998, 1998, 526: 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 538: 1998, 1998, 1998, 542: 1998, 1998, 1998, 1998, 1998, 1998, 1998, 550: 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 565: 1998}, // 1665 - {2552, 2552, 170: 5031, 491: 5032}, - {167: 5023}, - {478: 2064, 482: 2064, 502: 4307, 741: 5020}, - {478: 2064, 482: 2064, 502: 4307, 741: 5017}, - {2517, 2517, 2517, 2517, 2517, 2517, 4267, 4269, 410, 2517, 15: 4286, 2193, 4284, 4223, 4288, 4275, 4304, 4268, 4271, 4270, 4273, 4274, 4276, 4283, 410, 4294, 4295, 4281, 4282, 4287, 4289, 4301, 4300, 4306, 4302, 4299, 4292, 4297, 4298, 4291, 4293, 4296, 4285, 482: 4266, 4303, 487: 2193, 491: 2517, 506: 5013, 508: 2193, 650: 2193, 652: 4272, 785: 4277, 797: 4279, 818: 4278, 840: 4280, 843: 4290, 847: 5014}, + {9: 2398, 58: 2398}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4279, 2849, 688: 2850, 2848}, + {2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 492: 2401, 507: 2401, 512: 2401, 514: 2401, 518: 2401, 526: 2401, 548: 2401, 2401, 561: 2401, 667: 2401, 672: 4280, 690: 2401, 2401, 693: 2401, 699: 2401, 2401, 702: 2401, 2401, 2401, 2401, 2401, 2401, 710: 2401, 712: 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 727: 2401, 2401, 2401, 2401}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4281, 2849, 688: 2850, 2848}, + {2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 492: 2400, 507: 2400, 512: 2400, 514: 2400, 518: 2400, 526: 2400, 548: 2400, 2400, 561: 2400, 667: 2400, 690: 2400, 2400, 693: 2400, 699: 2400, 2400, 702: 2400, 2400, 2400, 2400, 2400, 2400, 710: 2400, 712: 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 727: 2400, 2400, 2400, 2400}, // 1670 - {170: 5003}, - {653: 4995}, - {2: 2437, 2437, 2437, 2437, 2437, 2437, 2437, 10: 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 51: 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 476: 2437, 491: 4854, 567: 2437, 584: 2426, 593: 2426, 2426, 645: 2426, 4615, 652: 2426, 678: 2426, 2426, 837: 4856, 852: 4450, 877: 4852, 908: 4853, 919: 4855}, - {491: 4845}, - {2506, 2506, 2506, 2506, 2506, 2506, 9: 2506, 491: 2506}, + {1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 493: 1999, 1999, 498: 1999, 500: 1999, 1999, 1999, 1999, 508: 1999, 1999, 511: 1999, 1999, 1999, 516: 1999, 1999, 519: 1999, 1999, 1999, 523: 1999, 1999, 526: 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 538: 1999, 1999, 1999, 542: 1999, 1999, 1999, 1999, 1999, 1999, 1999, 550: 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 565: 1999, 756: 3447, 3445}, + {1342, 1342, 9: 1342, 58: 1342, 137: 1342, 491: 1342, 493: 1342, 500: 1342, 1342, 509: 1342, 511: 1342, 1342, 1342, 516: 1342, 1342, 521: 1342, 523: 1342, 533: 1342, 535: 1342, 543: 1342, 546: 1342, 1342}, + {1341, 1341, 9: 1341, 58: 1341, 137: 1341, 491: 1341, 493: 1341, 500: 1341, 1341, 509: 1341, 511: 1341, 1341, 1341, 516: 1341, 1341, 521: 1341, 523: 1341, 533: 1341, 535: 1341, 543: 1341, 546: 1341, 1341}, + {1340, 1340, 9: 1340, 58: 1340, 137: 1340, 491: 1340, 493: 1340, 500: 1340, 1340, 509: 1340, 511: 1340, 1340, 1340, 516: 1340, 1340, 521: 1340, 523: 1340, 533: 1340, 535: 1340, 543: 1340, 546: 1340, 1340}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4287}, // 1675 - {2505, 2505, 2505, 2505, 2505, 2505, 9: 2505, 491: 2505}, - {491: 4843}, - {491: 4840}, - {2: 2437, 2437, 2437, 2437, 2437, 2437, 2437, 10: 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 51: 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 491: 4819, 567: 2437, 584: 4436, 593: 4451, 4818, 646: 4452, 652: 4437, 678: 4822, 832: 4821, 852: 4450, 877: 4817, 919: 4820, 1004: 4823}, - {491: 4810}, + {2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 493: 2003, 2003, 498: 2003, 500: 2003, 2003, 2003, 2003, 508: 2003, 2003, 511: 2003, 2003, 2003, 516: 2003, 2003, 519: 2003, 2003, 2003, 523: 2003, 2003, 526: 2003, 3451, 3449, 3450, 3448, 3446, 2003, 2003, 2003, 2003, 2003, 538: 2003, 2003, 2003, 542: 2003, 2003, 2003, 2003, 2003, 2003, 2003, 550: 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 565: 2003, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4289}, + {58: 4290}, + {2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 493: 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 516: 2296, 2296, 2296, 2296, 2296, 2296, 523: 2296, 2296, 526: 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 550: 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 2296, 584: 2296, 2296, 2296, 600: 2296, 607: 2296, 613: 2296, 616: 2296, 662: 2296, 2296, 2296, 666: 2296}, + {513: 4292}, // 1680 - {491: 4799}, - {491: 4797}, - {491: 4794}, - {491: 4791}, - {20: 4788, 491: 4787}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4293}, + {2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 493: 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 516: 2297, 2297, 2297, 2297, 2297, 2297, 523: 2297, 2297, 526: 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 550: 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 584: 2297, 2297, 2297, 600: 2297, 607: 2297, 613: 2297, 616: 2297, 662: 2297, 2297, 2297, 666: 2297}, + {274, 274, 58: 274, 491: 274, 493: 274, 500: 274, 274, 509: 274, 511: 274, 274, 274, 516: 274, 274, 521: 274, 523: 274, 527: 3451, 3449, 3450, 3448, 3446, 274, 274, 535: 274, 756: 3447, 3445}, + {8, 8}, + {151: 4298}, // 1685 - {20: 4784, 491: 4783}, - {491: 4773}, - {663: 4766}, - {948: 4765}, - {948: 4764}, + {4, 4}, + {273, 273, 512: 273, 519: 2809, 521: 273, 523: 273, 814: 2810, 4299}, + {1336, 1336, 512: 1336, 521: 1336, 523: 2812, 790: 2813, 836: 4300}, + {906, 906, 512: 2815, 521: 2816, 791: 2817, 852: 4301}, + {6, 6}, // 1690 - {2: 2437, 2437, 2437, 2437, 2437, 2437, 2437, 10: 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 51: 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 567: 2437, 852: 4450, 877: 4760}, - {2: 2437, 2437, 2437, 2437, 2437, 2437, 2437, 10: 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 51: 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 567: 2437, 852: 4450, 877: 4476}, - {2: 2437, 2437, 2437, 2437, 2437, 2437, 2437, 10: 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 51: 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 593: 4451, 646: 4452, 652: 4449, 852: 4450, 877: 4447, 1004: 4448}, - {2: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 10: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 51: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 481: 4434, 502: 4307, 584: 4436, 652: 4437, 4432, 741: 4433, 832: 4435, 852: 4431}, - {2473, 2473, 2473, 2473, 2473, 2473, 9: 2473, 491: 2473}, + {588: 4304}, + {2: 1913, 1913, 1913, 1913, 1913, 1913, 1913, 10: 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 59: 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 492: 1913, 516: 1913, 520: 1913, 588: 1913, 601: 1913}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4305}, + {2480, 2480, 2480, 2480, 2480, 2480, 4353, 4355, 426, 10: 4322, 15: 4372, 2236, 4370, 4309, 4374, 4361, 4390, 4354, 4357, 4356, 4359, 4360, 4362, 4369, 426, 4380, 4381, 4391, 4367, 4368, 4373, 4375, 4387, 4386, 4395, 4388, 4385, 4378, 4383, 4384, 4377, 4379, 4382, 4371, 4392, 4393, 78: 4324, 81: 4345, 4346, 90: 4347, 149: 4327, 194: 4316, 215: 4310, 4308, 218: 4331, 221: 4332, 231: 4326, 237: 4342, 251: 4320, 260: 4328, 266: 4323, 283: 4333, 291: 4329, 298: 4343, 4344, 303: 4311, 493: 4341, 496: 4352, 499: 2236, 4389, 507: 2480, 514: 2236, 517: 4348, 523: 4330, 4340, 526: 4313, 604: 4314, 607: 4319, 667: 2236, 4358, 673: 4307, 682: 4335, 690: 4321, 692: 4349, 701: 4334, 708: 4336, 711: 4315, 726: 4325, 803: 4363, 816: 4365, 837: 4364, 858: 4366, 861: 4376, 865: 4394, 892: 4339, 906: 4337, 944: 4312, 951: 4317, 1015: 4351, 1171: 4318, 1199: 4338, 1204: 4350, 4306}, + {2234, 2234, 5171, 5172, 5169, 5170, 507: 5173, 1131: 5168, 1206: 5167}, // 1695 - {2472, 2472, 2472, 2472, 2472, 2472, 9: 2472, 491: 2472}, - {2471, 2471, 2471, 2471, 2471, 2471, 9: 2471, 491: 2471}, - {2470, 2470, 2470, 2470, 2470, 2470, 8: 409, 2470, 29: 409, 491: 2470}, - {203: 4430}, - {203: 4429}, + {507: 5141}, + {2607, 2607, 180: 5135, 507: 5136}, + {177: 5127}, + {494: 2107, 496: 2107, 518: 4396, 758: 5124}, + {494: 2107, 496: 2107, 518: 4396, 758: 5121}, // 1700 - {2467, 2467, 2467, 2467, 2467, 2467, 9: 2467, 491: 2467}, - {2466, 2466, 2466, 2466, 2466, 2466, 9: 2466, 491: 2466}, - {2462, 2462, 2462, 2462, 2462, 2462, 9: 2462, 491: 2462}, - {2461, 2461, 2461, 2461, 2461, 2461, 9: 2461, 491: 2461}, - {130: 2064, 243: 2064, 264: 2064, 266: 2064, 482: 2064, 502: 4307, 741: 4423}, + {2565, 2565, 2565, 2565, 2565, 2565, 4353, 4355, 426, 2565, 15: 4372, 2236, 4370, 4309, 4374, 4361, 4390, 4354, 4357, 4356, 4359, 4360, 4362, 4369, 426, 4380, 4381, 4391, 4367, 4368, 4373, 4375, 4387, 4386, 4395, 4388, 4385, 4378, 4383, 4384, 4377, 4379, 4382, 4371, 4392, 4393, 496: 4352, 499: 2236, 4389, 507: 2565, 514: 2236, 524: 5117, 667: 2236, 4358, 803: 4363, 816: 4365, 837: 4364, 858: 4366, 861: 4376, 865: 5118}, + {180: 5107}, + {670: 5099}, + {2: 2485, 2485, 2485, 2485, 2485, 2485, 2485, 10: 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 59: 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 492: 2485, 507: 4958, 583: 2485, 600: 2474, 607: 2474, 613: 2474, 662: 2474, 4714, 668: 2474, 696: 2474, 2474, 855: 4960, 870: 4549, 895: 4956, 928: 4957, 939: 4959}, + {507: 4949}, // 1705 - {2: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 10: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 51: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 482: 2064, 502: 4307, 741: 4420}, - {156: 4419, 691: 4418}, - {2431, 2431, 2431, 2431, 2431, 2431, 9: 4416, 491: 2431}, - {2430, 2430, 2430, 2430, 2430, 2430, 9: 2430, 491: 2430}, - {16: 2192, 18: 2192, 21: 2192, 487: 2192, 508: 2192, 650: 2192}, + {2554, 2554, 2554, 2554, 2554, 2554, 9: 2554, 507: 2554}, + {2553, 2553, 2553, 2553, 2553, 2553, 9: 2553, 507: 2553}, + {507: 4947}, + {507: 4944}, + {2: 2485, 2485, 2485, 2485, 2485, 2485, 2485, 10: 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 59: 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 507: 4923, 583: 2485, 600: 4535, 607: 4550, 613: 4922, 663: 4551, 668: 4536, 696: 4926, 850: 4925, 870: 4549, 895: 4921, 939: 4924, 1025: 4927}, // 1710 - {478: 2064, 502: 4307, 741: 4414}, - {2: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 10: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 51: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 478: 2064, 502: 4307, 741: 4412}, - {22: 4407, 188: 4408, 250: 4409}, - {2: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 10: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 51: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 478: 2064, 502: 4307, 741: 4405}, - {248: 4402}, + {507: 4914}, + {507: 4903}, + {507: 4901}, + {507: 4898}, + {507: 4895}, // 1715 - {248: 4399}, - {502: 4307, 511: 2064, 741: 4397}, - {502: 4307, 511: 2064, 741: 4395}, - {2: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 10: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 51: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 502: 4307, 741: 4393}, - {502: 4307, 511: 2064, 741: 4391}, + {20: 4892, 507: 4891}, + {20: 4888, 507: 4887}, + {507: 4877}, + {681: 4870}, + {969: 4869}, // 1720 - {2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 15: 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 50: 2137, 475: 2137, 2137, 2137, 481: 2137, 2137, 2137, 487: 2137, 491: 2137, 2137, 498: 2137, 506: 2137, 2137, 2137, 572: 2137, 649: 2137, 2137, 652: 2137}, - {444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 15: 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 475: 444, 444, 444, 481: 444, 444, 444, 487: 444, 491: 444, 444, 498: 444, 506: 444, 444, 444, 572: 444, 649: 444, 444, 652: 444}, - {16: 3862, 487: 4386, 508: 3863, 650: 3861, 779: 4385}, - {8: 4379, 29: 4380}, - {502: 4307, 511: 2064, 741: 4377}, + {969: 4868}, + {2: 2485, 2485, 2485, 2485, 2485, 2485, 2485, 10: 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 59: 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 583: 2485, 870: 4549, 895: 4864}, + {2: 2485, 2485, 2485, 2485, 2485, 2485, 2485, 10: 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 59: 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 583: 2485, 870: 4549, 895: 4575}, + {2: 2485, 2485, 2485, 2485, 2485, 2485, 2485, 10: 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 59: 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 607: 4550, 663: 4551, 668: 4548, 870: 4549, 895: 4546, 1025: 4547}, + {2: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 10: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 59: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 498: 4533, 518: 4396, 600: 4535, 668: 4536, 670: 4531, 758: 4532, 850: 4534, 870: 4530}, // 1725 - {502: 4307, 511: 2064, 741: 4375}, - {478: 2064, 502: 4307, 741: 4373}, - {502: 4307, 511: 2064, 741: 4371}, - {502: 4307, 511: 2064, 741: 4369}, - {478: 2064, 502: 4307, 741: 4367}, + {2521, 2521, 2521, 2521, 2521, 2521, 9: 2521, 507: 2521}, + {2520, 2520, 2520, 2520, 2520, 2520, 9: 2520, 507: 2520}, + {2519, 2519, 2519, 2519, 2519, 2519, 9: 2519, 507: 2519}, + {2518, 2518, 2518, 2518, 2518, 2518, 8: 425, 2518, 29: 425, 507: 2518}, + {213: 4529}, // 1730 - {478: 2064, 502: 4307, 741: 4365}, - {502: 4307, 511: 2064, 741: 4363}, - {502: 4307, 511: 2064, 741: 4361}, - {430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 15: 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 475: 430, 430, 430, 481: 430, 430, 430, 487: 430, 491: 430, 430, 498: 430, 506: 430, 430, 430, 572: 430, 649: 430, 430, 652: 430}, - {482: 2064, 502: 4307, 511: 2064, 741: 4359}, + {213: 4528}, + {2515, 2515, 2515, 2515, 2515, 2515, 9: 2515, 507: 2515}, + {2514, 2514, 2514, 2514, 2514, 2514, 9: 2514, 507: 2514}, + {2510, 2510, 2510, 2510, 2510, 2510, 9: 2510, 507: 2510}, + {2509, 2509, 2509, 2509, 2509, 2509, 9: 2509, 507: 2509}, // 1735 - {482: 2064, 502: 4307, 511: 2064, 741: 4356}, - {482: 2064, 502: 4307, 511: 2064, 741: 4353}, - {502: 4307, 511: 2064, 741: 4351}, - {502: 4307, 511: 2064, 741: 4349}, - {502: 4307, 511: 2064, 576: 2064, 2064, 741: 4347}, + {139: 2107, 254: 2107, 275: 2107, 277: 2107, 496: 2107, 518: 4396, 758: 4522}, + {2: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 10: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 59: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 496: 2107, 518: 4396, 758: 4519}, + {165: 4518, 709: 4517}, + {2479, 2479, 2479, 2479, 2479, 2479, 9: 4515, 507: 2479}, + {2478, 2478, 2478, 2478, 2478, 2478, 9: 2478, 507: 2478}, // 1740 - {478: 2064, 502: 4307, 741: 4345}, - {478: 2064, 502: 4307, 741: 4343}, - {502: 4307, 511: 2064, 741: 4341}, - {502: 4307, 511: 2064, 741: 4339}, - {482: 2064, 502: 4307, 511: 2064, 741: 4335}, + {16: 2235, 18: 2235, 21: 2235, 499: 2235, 514: 2235, 667: 2235}, + {494: 2107, 518: 4396, 758: 4513}, + {2: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 10: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 59: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 494: 2107, 518: 4396, 758: 4511}, + {22: 4506, 197: 4507, 261: 4508}, + {2: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 10: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 59: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 494: 2107, 518: 4396, 758: 4504}, // 1745 - {2: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 10: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 51: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 478: 2064, 495: 2064, 502: 4307, 741: 4332}, - {476: 2064, 502: 4307, 741: 4327}, - {478: 2064, 502: 4307, 741: 4324}, - {404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 15: 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 475: 404, 404, 404, 481: 404, 404, 404, 487: 404, 491: 404, 404, 498: 404, 506: 404, 404, 404, 572: 404, 649: 404, 404, 652: 404}, - {182: 2064, 206: 2064, 209: 2064, 241: 2064, 281: 2064, 295: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 482: 2064, 502: 4307, 741: 4308}, + {259: 4501}, + {259: 4498}, + {518: 4396, 525: 2107, 758: 4496}, + {518: 4396, 525: 2107, 758: 4494}, + {2: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 10: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 59: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 518: 4396, 758: 4492}, // 1750 - {2: 2063, 2063, 2063, 2063, 2063, 2063, 2063, 10: 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 51: 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 476: 2063, 478: 2063, 482: 2063, 488: 2063, 2063, 492: 2063, 495: 2063, 507: 2063, 511: 2063, 533: 2063, 574: 2063, 2063, 2063, 2063}, - {182: 4311, 206: 4314, 209: 4310, 241: 4312, 281: 4313, 295: 4315, 4316, 4321, 4320, 4317, 4322, 4323, 4318, 4319, 482: 4309}, - {398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 15: 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 475: 398, 398, 398, 481: 398, 398, 398, 487: 398, 491: 398, 398, 498: 398, 506: 398, 398, 398, 572: 398, 649: 398, 398, 652: 398}, - {397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 15: 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 475: 397, 397, 397, 481: 397, 397, 397, 487: 397, 491: 397, 397, 498: 397, 506: 397, 397, 397, 572: 397, 649: 397, 397, 652: 397}, - {396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 15: 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 475: 396, 396, 396, 481: 396, 396, 396, 487: 396, 491: 396, 396, 498: 396, 506: 396, 396, 396, 572: 396, 649: 396, 396, 652: 396}, + {518: 4396, 525: 2107, 758: 4490}, + {2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 15: 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 58: 2180, 491: 2180, 2180, 2180, 496: 2180, 498: 2180, 2180, 2180, 507: 2180, 2180, 514: 2180, 2180, 522: 2180, 524: 2180, 588: 2180, 665: 2180, 667: 2180, 2180}, + {463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 15: 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 491: 463, 463, 463, 496: 463, 498: 463, 463, 463, 507: 463, 463, 514: 463, 463, 522: 463, 524: 463, 588: 463, 665: 463, 667: 463, 463}, + {16: 3942, 499: 4485, 514: 3943, 667: 3941, 798: 4484}, + {8: 4478, 29: 4479}, // 1755 - {395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 15: 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 475: 395, 395, 395, 481: 395, 395, 395, 487: 395, 491: 395, 395, 498: 395, 506: 395, 395, 395, 572: 395, 649: 395, 395, 652: 395}, - {394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 15: 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 475: 394, 394, 394, 481: 394, 394, 394, 487: 394, 491: 394, 394, 498: 394, 506: 394, 394, 394, 572: 394, 649: 394, 394, 652: 394}, - {393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 15: 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 475: 393, 393, 393, 481: 393, 393, 393, 487: 393, 491: 393, 393, 498: 393, 506: 393, 393, 393, 572: 393, 649: 393, 393, 652: 393}, - {392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 15: 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 475: 392, 392, 392, 481: 392, 392, 392, 487: 392, 491: 392, 392, 498: 392, 506: 392, 392, 392, 572: 392, 649: 392, 392, 652: 392}, - {391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 15: 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 475: 391, 391, 391, 481: 391, 391, 391, 487: 391, 491: 391, 391, 498: 391, 506: 391, 391, 391, 572: 391, 649: 391, 391, 652: 391}, + {518: 4396, 525: 2107, 758: 4476}, + {518: 4396, 525: 2107, 758: 4474}, + {494: 2107, 518: 4396, 758: 4472}, + {518: 4396, 525: 2107, 758: 4470}, + {518: 4396, 525: 2107, 758: 4468}, // 1760 - {390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 15: 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 475: 390, 390, 390, 481: 390, 390, 390, 487: 390, 491: 390, 390, 498: 390, 506: 390, 390, 390, 572: 390, 649: 390, 390, 652: 390}, - {389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 15: 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 475: 389, 389, 389, 481: 389, 389, 389, 487: 389, 491: 389, 389, 498: 389, 506: 389, 389, 389, 572: 389, 649: 389, 389, 652: 389}, - {388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 15: 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 475: 388, 388, 388, 481: 388, 388, 388, 487: 388, 491: 388, 388, 498: 388, 506: 388, 388, 388, 572: 388, 649: 388, 388, 652: 388}, - {387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 15: 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 475: 387, 387, 387, 481: 387, 387, 387, 487: 387, 491: 387, 387, 498: 387, 506: 387, 387, 387, 572: 387, 649: 387, 387, 652: 387}, - {386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 15: 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 475: 386, 386, 386, 481: 386, 386, 386, 487: 386, 491: 386, 386, 498: 386, 506: 386, 386, 386, 572: 386, 649: 386, 386, 652: 386}, + {494: 2107, 518: 4396, 758: 4466}, + {494: 2107, 518: 4396, 758: 4464}, + {518: 4396, 525: 2107, 758: 4462}, + {518: 4396, 525: 2107, 758: 4460}, + {449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 15: 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 491: 449, 449, 449, 496: 449, 498: 449, 449, 449, 507: 449, 449, 514: 449, 449, 522: 449, 524: 449, 588: 449, 665: 449, 667: 449, 449}, // 1765 - {385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 15: 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 475: 385, 385, 385, 481: 385, 385, 385, 487: 385, 491: 385, 385, 498: 385, 506: 385, 385, 385, 572: 385, 649: 385, 385, 652: 385}, - {384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 15: 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 475: 384, 384, 384, 481: 384, 384, 384, 487: 384, 491: 384, 384, 498: 384, 506: 384, 384, 384, 572: 384, 649: 384, 384, 652: 384}, - {478: 4326, 1044: 4325}, - {411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 15: 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 475: 411, 411, 411, 481: 411, 411, 411, 487: 411, 491: 411, 411, 498: 411, 506: 411, 411, 411, 572: 411, 649: 411, 411, 652: 411}, - {11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 15: 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, 475: 11, 11, 11, 481: 11, 11, 11, 487: 11, 491: 11, 11, 498: 11, 506: 11, 11, 11, 11, 572: 11, 649: 11, 11, 652: 11}, + {496: 2107, 518: 4396, 525: 2107, 758: 4458}, + {496: 2107, 518: 4396, 525: 2107, 758: 4455}, + {496: 2107, 518: 4396, 525: 2107, 758: 4452}, + {518: 4396, 525: 2107, 758: 4450}, + {518: 4396, 525: 2107, 758: 4448}, // 1770 - {476: 4328}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 579, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 3948, 786: 4329, 1155: 4330}, - {578, 578, 9: 3950, 50: 578, 477: 578}, - {50: 4331}, - {412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 15: 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 475: 412, 412, 412, 481: 412, 412, 412, 487: 412, 491: 412, 412, 498: 412, 506: 412, 412, 412, 572: 412, 649: 412, 412, 652: 412}, + {518: 4396, 525: 2107, 593: 2107, 2107, 758: 4446}, + {494: 2107, 518: 4396, 758: 4444}, + {494: 2107, 518: 4396, 758: 4442}, + {518: 4396, 525: 2107, 758: 4440}, + {518: 4396, 525: 2107, 758: 4438}, // 1775 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 495: 4333, 664: 3517, 2785, 2786, 2784, 742: 4334}, - {414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 15: 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 475: 414, 414, 414, 481: 414, 414, 414, 487: 414, 491: 414, 414, 498: 414, 506: 414, 414, 414, 572: 414, 649: 414, 414, 652: 414}, - {413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 15: 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 475: 413, 413, 413, 481: 413, 413, 413, 487: 413, 491: 413, 413, 498: 413, 506: 413, 413, 413, 572: 413, 649: 413, 413, 652: 413}, - {482: 4337, 511: 2759, 737: 2758, 745: 4338, 1147: 4336}, - {417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 15: 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 475: 417, 417, 417, 481: 417, 417, 417, 487: 417, 491: 417, 417, 498: 417, 506: 417, 417, 417, 572: 417, 649: 417, 417, 652: 417}, + {496: 2107, 518: 4396, 525: 2107, 758: 4434}, + {2: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 10: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 59: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 494: 2107, 510: 2107, 518: 4396, 758: 4431}, + {492: 2107, 518: 4396, 758: 4426}, + {494: 2107, 518: 4396, 758: 4423}, + {2: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 10: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 59: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 518: 4396, 758: 4417}, // 1780 - {408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 15: 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 475: 408, 408, 408, 481: 408, 408, 408, 487: 408, 491: 408, 408, 498: 408, 506: 408, 408, 408, 572: 408, 649: 408, 408, 652: 408}, - {407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 15: 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 475: 407, 407, 407, 481: 407, 407, 407, 487: 407, 491: 407, 407, 498: 407, 506: 407, 407, 407, 572: 407, 649: 407, 407, 652: 407}, - {511: 2759, 737: 2758, 745: 4340}, - {418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 15: 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 475: 418, 418, 418, 481: 418, 418, 418, 487: 418, 491: 418, 418, 498: 418, 506: 418, 418, 418, 572: 418, 649: 418, 418, 652: 418}, - {511: 2759, 737: 2758, 745: 4342}, + {494: 2107, 518: 4396, 758: 4415}, + {494: 2107, 518: 4396, 758: 4413}, + {420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 15: 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 491: 420, 420, 420, 496: 420, 498: 420, 420, 420, 507: 420, 420, 514: 420, 420, 522: 420, 524: 420, 588: 420, 665: 420, 667: 420, 420}, + {191: 2107, 216: 2107, 220: 2107, 252: 2107, 292: 2107, 307: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 496: 2107, 518: 4396, 758: 4397}, + {2: 2106, 2106, 2106, 2106, 2106, 2106, 2106, 10: 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 59: 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 492: 2106, 494: 2106, 496: 2106, 504: 2106, 2106, 508: 2106, 510: 2106, 522: 2106, 525: 2106, 549: 2106, 591: 2106, 2106, 2106, 2106}, // 1785 - {419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 15: 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 475: 419, 419, 419, 481: 419, 419, 419, 487: 419, 491: 419, 419, 498: 419, 506: 419, 419, 419, 572: 419, 649: 419, 419, 652: 419}, - {478: 4344}, - {420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 15: 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 475: 420, 420, 420, 481: 420, 420, 420, 487: 420, 491: 420, 420, 498: 420, 506: 420, 420, 420, 572: 420, 649: 420, 420, 652: 420}, - {478: 4346}, - {421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 15: 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 475: 421, 421, 421, 481: 421, 421, 421, 487: 421, 491: 421, 421, 498: 421, 506: 421, 421, 421, 572: 421, 649: 421, 421, 652: 421}, + {191: 4400, 216: 4403, 220: 4399, 252: 4401, 292: 4402, 307: 4404, 4405, 4410, 4409, 4406, 4411, 4412, 4407, 4408, 496: 4398}, + {414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 15: 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 491: 414, 414, 414, 496: 414, 498: 414, 414, 414, 507: 414, 414, 514: 414, 414, 522: 414, 524: 414, 588: 414, 665: 414, 667: 414, 414}, + {413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 15: 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 491: 413, 413, 413, 496: 413, 498: 413, 413, 413, 507: 413, 413, 514: 413, 413, 522: 413, 524: 413, 588: 413, 665: 413, 667: 413, 413}, + {412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 15: 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 491: 412, 412, 412, 496: 412, 498: 412, 412, 412, 507: 412, 412, 514: 412, 412, 522: 412, 524: 412, 588: 412, 665: 412, 667: 412, 412}, + {411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 15: 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 491: 411, 411, 411, 496: 411, 498: 411, 411, 411, 507: 411, 411, 514: 411, 411, 522: 411, 524: 411, 588: 411, 665: 411, 667: 411, 411}, // 1790 - {511: 3449, 576: 3451, 3450, 824: 4348}, - {422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 15: 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 475: 422, 422, 422, 481: 422, 422, 422, 487: 422, 491: 422, 422, 498: 422, 506: 422, 422, 422, 572: 422, 649: 422, 422, 652: 422}, - {511: 2759, 737: 2758, 745: 4350}, - {423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 15: 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 475: 423, 423, 423, 481: 423, 423, 423, 487: 423, 491: 423, 423, 498: 423, 506: 423, 423, 423, 572: 423, 649: 423, 423, 652: 423}, - {511: 2759, 737: 2758, 745: 4352}, + {410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 15: 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 491: 410, 410, 410, 496: 410, 498: 410, 410, 410, 507: 410, 410, 514: 410, 410, 522: 410, 524: 410, 588: 410, 665: 410, 667: 410, 410}, + {409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 15: 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 491: 409, 409, 409, 496: 409, 498: 409, 409, 409, 507: 409, 409, 514: 409, 409, 522: 409, 524: 409, 588: 409, 665: 409, 667: 409, 409}, + {408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 15: 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 491: 408, 408, 408, 496: 408, 498: 408, 408, 408, 507: 408, 408, 514: 408, 408, 522: 408, 524: 408, 588: 408, 665: 408, 667: 408, 408}, + {407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 15: 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 491: 407, 407, 407, 496: 407, 498: 407, 407, 407, 507: 407, 407, 514: 407, 407, 522: 407, 524: 407, 588: 407, 665: 407, 667: 407, 407}, + {406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 15: 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 491: 406, 406, 406, 496: 406, 498: 406, 406, 406, 507: 406, 406, 514: 406, 406, 522: 406, 524: 406, 588: 406, 665: 406, 667: 406, 406}, // 1795 - {424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 15: 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 475: 424, 424, 424, 481: 424, 424, 424, 487: 424, 491: 424, 424, 498: 424, 506: 424, 424, 424, 572: 424, 649: 424, 424, 652: 424}, - {482: 4355, 511: 2759, 737: 2758, 745: 4354}, - {426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 15: 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 475: 426, 426, 426, 481: 426, 426, 426, 487: 426, 491: 426, 426, 498: 426, 506: 426, 426, 426, 572: 426, 649: 426, 426, 652: 426}, - {425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 15: 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 475: 425, 425, 425, 481: 425, 425, 425, 487: 425, 491: 425, 425, 498: 425, 506: 425, 425, 425, 572: 425, 649: 425, 425, 652: 425}, - {482: 4358, 511: 2759, 737: 2758, 745: 4357}, + {405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 15: 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 491: 405, 405, 405, 496: 405, 498: 405, 405, 405, 507: 405, 405, 514: 405, 405, 522: 405, 524: 405, 588: 405, 665: 405, 667: 405, 405}, + {404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 15: 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 491: 404, 404, 404, 496: 404, 498: 404, 404, 404, 507: 404, 404, 514: 404, 404, 522: 404, 524: 404, 588: 404, 665: 404, 667: 404, 404}, + {403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 15: 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 491: 403, 403, 403, 496: 403, 498: 403, 403, 403, 507: 403, 403, 514: 403, 403, 522: 403, 524: 403, 588: 403, 665: 403, 667: 403, 403}, + {402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 15: 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 491: 402, 402, 402, 496: 402, 498: 402, 402, 402, 507: 402, 402, 514: 402, 402, 522: 402, 524: 402, 588: 402, 665: 402, 667: 402, 402}, + {401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 15: 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 491: 401, 401, 401, 496: 401, 498: 401, 401, 401, 507: 401, 401, 514: 401, 401, 522: 401, 524: 401, 588: 401, 665: 401, 667: 401, 401}, // 1800 - {428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 15: 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 475: 428, 428, 428, 481: 428, 428, 428, 487: 428, 491: 428, 428, 498: 428, 506: 428, 428, 428, 572: 428, 649: 428, 428, 652: 428}, - {427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 15: 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 475: 427, 427, 427, 481: 427, 427, 427, 487: 427, 491: 427, 427, 498: 427, 506: 427, 427, 427, 572: 427, 649: 427, 427, 652: 427}, - {482: 4337, 511: 2759, 737: 2758, 745: 4338, 1147: 4360}, - {429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 15: 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 475: 429, 429, 429, 481: 429, 429, 429, 487: 429, 491: 429, 429, 498: 429, 506: 429, 429, 429, 572: 429, 649: 429, 429, 652: 429}, - {511: 2759, 737: 2758, 745: 4362}, + {400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 15: 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 491: 400, 400, 400, 496: 400, 498: 400, 400, 400, 507: 400, 400, 514: 400, 400, 522: 400, 524: 400, 588: 400, 665: 400, 667: 400, 400}, + {494: 4414}, + {427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 15: 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 491: 427, 427, 427, 496: 427, 498: 427, 427, 427, 507: 427, 427, 514: 427, 427, 522: 427, 524: 427, 588: 427, 665: 427, 667: 427, 427}, + {494: 4416}, + {428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 15: 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 491: 428, 428, 428, 496: 428, 498: 428, 428, 428, 507: 428, 428, 514: 428, 428, 522: 428, 524: 428, 588: 428, 665: 428, 667: 428, 428}, // 1805 - {431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 15: 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 475: 431, 431, 431, 481: 431, 431, 431, 487: 431, 491: 431, 431, 498: 431, 506: 431, 431, 431, 572: 431, 649: 431, 431, 652: 431}, - {511: 2759, 737: 2758, 745: 4364}, - {432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 15: 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 475: 432, 432, 432, 481: 432, 432, 432, 487: 432, 491: 432, 432, 498: 432, 506: 432, 432, 432, 572: 432, 649: 432, 432, 652: 432}, - {478: 4366}, - {433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 15: 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 475: 433, 433, 433, 481: 433, 433, 433, 487: 433, 491: 433, 433, 498: 433, 506: 433, 433, 433, 572: 433, 649: 433, 433, 652: 433}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4418, 2849, 688: 2850, 2848}, + {504: 4419}, + {599: 4420}, + {494: 3345, 510: 3336, 525: 3340, 591: 3335, 3337, 3339, 3338, 596: 3343, 598: 3344, 614: 3342, 734: 4421, 3341}, + {112: 3566, 3570, 3563, 3578, 118: 3565, 3562, 3564, 3568, 3569, 3574, 3573, 3572, 3576, 3577, 3571, 3575, 131: 3567, 550: 3560, 3557, 3559, 3558, 3554, 3556, 3555, 3552, 3553, 3551, 3561, 813: 3550, 828: 4422}, // 1810 - {478: 4368}, - {434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 15: 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 475: 434, 434, 434, 481: 434, 434, 434, 487: 434, 491: 434, 434, 498: 434, 506: 434, 434, 434, 572: 434, 649: 434, 434, 652: 434}, - {511: 2759, 737: 2758, 745: 4370}, - {435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 15: 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 475: 435, 435, 435, 481: 435, 435, 435, 487: 435, 491: 435, 435, 498: 435, 506: 435, 435, 435, 572: 435, 649: 435, 435, 652: 435}, - {511: 2759, 737: 2758, 745: 4372}, + {429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 15: 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 491: 429, 429, 429, 496: 429, 498: 429, 429, 429, 507: 429, 429, 514: 429, 429, 522: 429, 524: 429, 588: 429, 665: 429, 667: 429, 429}, + {494: 4425, 1067: 4424}, + {430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 15: 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 491: 430, 430, 430, 496: 430, 498: 430, 430, 430, 507: 430, 430, 514: 430, 430, 522: 430, 524: 430, 588: 430, 665: 430, 667: 430, 430}, + {13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15: 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, 491: 13, 13, 13, 496: 13, 498: 13, 13, 13, 507: 13, 13, 514: 13, 13, 522: 13, 524: 13, 526: 13, 588: 13, 665: 13, 667: 13, 13}, + {492: 4427}, // 1815 - {436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 15: 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 475: 436, 436, 436, 481: 436, 436, 436, 487: 436, 491: 436, 436, 498: 436, 506: 436, 436, 436, 572: 436, 649: 436, 436, 652: 436}, - {478: 4374}, - {437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 15: 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 475: 437, 437, 437, 481: 437, 437, 437, 487: 437, 491: 437, 437, 498: 437, 506: 437, 437, 437, 572: 437, 649: 437, 437, 652: 437}, - {511: 2759, 737: 2758, 745: 4376}, - {438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 15: 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 475: 438, 438, 438, 481: 438, 438, 438, 487: 438, 491: 438, 438, 498: 438, 506: 438, 438, 438, 572: 438, 649: 438, 438, 652: 438}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 601, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4030, 804: 4428, 1180: 4429}, + {600, 600, 9: 4032, 58: 600, 493: 600}, + {58: 4430}, + {431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 15: 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 491: 431, 431, 431, 496: 431, 498: 431, 431, 431, 507: 431, 431, 514: 431, 431, 522: 431, 524: 431, 588: 431, 665: 431, 667: 431, 431}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 510: 4432, 685: 3597, 2849, 688: 2850, 2848, 760: 4433}, // 1820 - {511: 2759, 737: 2758, 745: 4378}, - {440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 15: 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 475: 440, 440, 440, 481: 440, 440, 440, 487: 440, 491: 440, 440, 498: 440, 506: 440, 440, 440, 572: 440, 649: 440, 440, 652: 440}, - {502: 4307, 511: 2064, 741: 4383}, - {502: 4307, 511: 2064, 741: 4381}, - {511: 2759, 737: 2758, 745: 4382}, + {433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 15: 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 491: 433, 433, 433, 496: 433, 498: 433, 433, 433, 507: 433, 433, 514: 433, 433, 522: 433, 524: 433, 588: 433, 665: 433, 667: 433, 433}, + {432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 15: 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 491: 432, 432, 432, 496: 432, 498: 432, 432, 432, 507: 432, 432, 514: 432, 432, 522: 432, 524: 432, 588: 432, 665: 432, 667: 432, 432}, + {496: 4436, 525: 2823, 755: 2822, 762: 4437, 1172: 4435}, + {436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 15: 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 491: 436, 436, 436, 496: 436, 498: 436, 436, 436, 507: 436, 436, 514: 436, 436, 522: 436, 524: 436, 588: 436, 665: 436, 667: 436, 436}, + {424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 15: 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 491: 424, 424, 424, 496: 424, 498: 424, 424, 424, 507: 424, 424, 514: 424, 424, 522: 424, 524: 424, 588: 424, 665: 424, 667: 424, 424}, // 1825 - {439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 15: 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 475: 439, 439, 439, 481: 439, 439, 439, 487: 439, 491: 439, 439, 498: 439, 506: 439, 439, 439, 572: 439, 649: 439, 439, 652: 439}, - {511: 2759, 737: 2758, 745: 4384}, - {441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 15: 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 475: 441, 441, 441, 481: 441, 441, 441, 487: 441, 491: 441, 441, 498: 441, 506: 441, 441, 441, 572: 441, 649: 441, 441, 652: 441}, - {2: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 10: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 51: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 478: 2064, 502: 4307, 533: 2064, 741: 4389}, - {2: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 10: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 51: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 478: 2064, 502: 4307, 533: 2064, 741: 4387}, + {423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 15: 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 491: 423, 423, 423, 496: 423, 498: 423, 423, 423, 507: 423, 423, 514: 423, 423, 522: 423, 524: 423, 588: 423, 665: 423, 667: 423, 423}, + {525: 2823, 755: 2822, 762: 4439}, + {437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 15: 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 491: 437, 437, 437, 496: 437, 498: 437, 437, 437, 507: 437, 437, 514: 437, 437, 522: 437, 524: 437, 588: 437, 665: 437, 667: 437, 437}, + {525: 2823, 755: 2822, 762: 4441}, + {438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 15: 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 491: 438, 438, 438, 496: 438, 498: 438, 438, 438, 507: 438, 438, 514: 438, 438, 522: 438, 524: 438, 588: 438, 665: 438, 667: 438, 438}, // 1830 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 533: 3515, 664: 3517, 2785, 2786, 2784, 742: 3514, 876: 4388}, - {442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 15: 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 475: 442, 442, 442, 481: 442, 442, 442, 487: 442, 491: 442, 442, 498: 442, 506: 442, 442, 442, 572: 442, 649: 442, 442, 652: 442}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 533: 3787, 664: 3517, 2785, 2786, 2784, 742: 3786, 811: 4390}, - {443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 15: 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 475: 443, 443, 443, 481: 443, 443, 443, 487: 443, 491: 443, 443, 498: 443, 506: 443, 443, 443, 572: 443, 649: 443, 443, 652: 443}, - {511: 2759, 737: 2758, 745: 4392}, + {494: 4443}, + {439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 15: 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 491: 439, 439, 439, 496: 439, 498: 439, 439, 439, 507: 439, 439, 514: 439, 439, 522: 439, 524: 439, 588: 439, 665: 439, 667: 439, 439}, + {494: 4445}, + {440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 15: 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 491: 440, 440, 440, 496: 440, 498: 440, 440, 440, 507: 440, 440, 514: 440, 440, 522: 440, 524: 440, 588: 440, 665: 440, 667: 440, 440}, + {525: 3529, 593: 3531, 3530, 842: 4447}, // 1835 - {2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 15: 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 50: 2138, 475: 2138, 2138, 2138, 481: 2138, 2138, 2138, 487: 2138, 491: 2138, 2138, 498: 2138, 506: 2138, 2138, 2138, 572: 2138, 649: 2138, 2138, 652: 2138}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4394, 2785, 2786, 2784}, - {2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 15: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 50: 2139, 475: 2139, 2139, 2139, 481: 2139, 2139, 2139, 487: 2139, 491: 2139, 2139, 498: 2139, 506: 2139, 2139, 2139, 572: 2139, 649: 2139, 2139, 652: 2139}, - {511: 2759, 737: 2758, 745: 4396}, - {2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 15: 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 50: 2140, 475: 2140, 2140, 2140, 481: 2140, 2140, 2140, 487: 2140, 491: 2140, 2140, 498: 2140, 506: 2140, 2140, 2140, 572: 2140, 649: 2140, 2140, 652: 2140}, + {441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 15: 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 491: 441, 441, 441, 496: 441, 498: 441, 441, 441, 507: 441, 441, 514: 441, 441, 522: 441, 524: 441, 588: 441, 665: 441, 667: 441, 441}, + {525: 2823, 755: 2822, 762: 4449}, + {442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 15: 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 491: 442, 442, 442, 496: 442, 498: 442, 442, 442, 507: 442, 442, 514: 442, 442, 522: 442, 524: 442, 588: 442, 665: 442, 667: 442, 442}, + {525: 2823, 755: 2822, 762: 4451}, + {443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 15: 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 491: 443, 443, 443, 496: 443, 498: 443, 443, 443, 507: 443, 443, 514: 443, 443, 522: 443, 524: 443, 588: 443, 665: 443, 667: 443, 443}, // 1840 - {511: 2759, 737: 2758, 745: 4398}, - {2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 15: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 50: 2141, 475: 2141, 2141, 2141, 481: 2141, 2141, 2141, 487: 2141, 491: 2141, 2141, 498: 2141, 506: 2141, 2141, 2141, 572: 2141, 649: 2141, 2141, 652: 2141}, - {478: 2064, 502: 4307, 741: 4400}, - {478: 4401}, - {2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 15: 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 50: 2142, 475: 2142, 2142, 2142, 481: 2142, 2142, 2142, 487: 2142, 491: 2142, 2142, 498: 2142, 506: 2142, 2142, 2142, 572: 2142, 649: 2142, 2142, 652: 2142}, + {496: 4454, 525: 2823, 755: 2822, 762: 4453}, + {445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 15: 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 491: 445, 445, 445, 496: 445, 498: 445, 445, 445, 507: 445, 445, 514: 445, 445, 522: 445, 524: 445, 588: 445, 665: 445, 667: 445, 445}, + {444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 15: 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 491: 444, 444, 444, 496: 444, 498: 444, 444, 444, 507: 444, 444, 514: 444, 444, 522: 444, 524: 444, 588: 444, 665: 444, 667: 444, 444}, + {496: 4457, 525: 2823, 755: 2822, 762: 4456}, + {447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 15: 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 491: 447, 447, 447, 496: 447, 498: 447, 447, 447, 507: 447, 447, 514: 447, 447, 522: 447, 524: 447, 588: 447, 665: 447, 667: 447, 447}, // 1845 - {478: 2064, 502: 4307, 741: 4403}, - {478: 4404}, - {2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 15: 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 50: 2143, 475: 2143, 2143, 2143, 481: 2143, 2143, 2143, 487: 2143, 491: 2143, 2143, 498: 2143, 506: 2143, 2143, 2143, 572: 2143, 649: 2143, 2143, 652: 2143}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 664: 3517, 2785, 2786, 2784, 742: 4406}, - {2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 15: 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 50: 2144, 475: 2144, 2144, 2144, 481: 2144, 2144, 2144, 487: 2144, 491: 2144, 2144, 498: 2144, 506: 2144, 2144, 2144, 572: 2144, 649: 2144, 2144, 652: 2144}, + {446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 15: 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 491: 446, 446, 446, 496: 446, 498: 446, 446, 446, 507: 446, 446, 514: 446, 446, 522: 446, 524: 446, 588: 446, 665: 446, 667: 446, 446}, + {496: 4436, 525: 2823, 755: 2822, 762: 4437, 1172: 4459}, + {448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 15: 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 491: 448, 448, 448, 496: 448, 498: 448, 448, 448, 507: 448, 448, 514: 448, 448, 522: 448, 524: 448, 588: 448, 665: 448, 667: 448, 448}, + {525: 2823, 755: 2822, 762: 4461}, + {450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 15: 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 491: 450, 450, 450, 496: 450, 498: 450, 450, 450, 507: 450, 450, 514: 450, 450, 522: 450, 524: 450, 588: 450, 665: 450, 667: 450, 450}, // 1850 - {2: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 10: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 51: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 478: 2064, 502: 4307, 741: 4410}, - {416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 15: 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 475: 416, 416, 416, 481: 416, 416, 416, 487: 416, 491: 416, 416, 498: 416, 506: 416, 416, 416, 572: 416, 649: 416, 416, 652: 416}, - {415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 15: 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 475: 415, 415, 415, 481: 415, 415, 415, 487: 415, 491: 415, 415, 498: 415, 506: 415, 415, 415, 572: 415, 649: 415, 415, 652: 415}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 664: 3517, 2785, 2786, 2784, 742: 4411}, - {2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 15: 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 50: 2145, 475: 2145, 2145, 2145, 481: 2145, 2145, 2145, 487: 2145, 491: 2145, 2145, 498: 2145, 506: 2145, 2145, 2145, 572: 2145, 649: 2145, 2145, 652: 2145}, + {525: 2823, 755: 2822, 762: 4463}, + {451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 15: 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 491: 451, 451, 451, 496: 451, 498: 451, 451, 451, 507: 451, 451, 514: 451, 451, 522: 451, 524: 451, 588: 451, 665: 451, 667: 451, 451}, + {494: 4465}, + {452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 15: 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 491: 452, 452, 452, 496: 452, 498: 452, 452, 452, 507: 452, 452, 514: 452, 452, 522: 452, 524: 452, 588: 452, 665: 452, 667: 452, 452}, + {494: 4467}, // 1855 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 664: 3517, 2785, 2786, 2784, 742: 4413}, - {2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 15: 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 50: 2146, 475: 2146, 2146, 2146, 481: 2146, 2146, 2146, 487: 2146, 491: 2146, 2146, 498: 2146, 506: 2146, 2146, 2146, 572: 2146, 649: 2146, 2146, 652: 2146}, - {478: 4415}, - {2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 15: 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 50: 2147, 475: 2147, 2147, 2147, 481: 2147, 2147, 2147, 487: 2147, 491: 2147, 2147, 498: 2147, 506: 2147, 2147, 2147, 572: 2147, 649: 2147, 2147, 652: 2147}, - {6: 4267, 4269, 410, 10: 4236, 15: 4286, 2193, 4284, 4223, 4288, 4275, 4304, 4268, 4271, 4270, 4273, 4274, 4276, 4283, 410, 4294, 4295, 4281, 4282, 4287, 4289, 4301, 4300, 4306, 4302, 4299, 4292, 4297, 4298, 4291, 4293, 4296, 4285, 72: 4238, 75: 4259, 4260, 84: 4261, 140: 4241, 185: 4230, 205: 4224, 207: 4245, 210: 4246, 221: 4240, 227: 4256, 240: 4234, 249: 4242, 255: 4237, 272: 4247, 280: 4243, 287: 4257, 4258, 292: 4225, 477: 4255, 482: 4266, 4303, 487: 2193, 500: 4262, 505: 4244, 4254, 508: 2193, 4227, 587: 4228, 593: 4233, 650: 2193, 652: 4272, 668: 4249, 672: 4235, 674: 4263, 683: 4248, 690: 4250, 693: 4229, 708: 4239, 785: 4277, 797: 4279, 818: 4278, 840: 4280, 843: 4290, 847: 4305, 874: 4253, 887: 4251, 924: 4226, 931: 4231, 994: 4417, 1146: 4232, 1174: 4252}, + {453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 15: 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 491: 453, 453, 453, 496: 453, 498: 453, 453, 453, 507: 453, 453, 514: 453, 453, 522: 453, 524: 453, 588: 453, 665: 453, 667: 453, 453}, + {525: 2823, 755: 2822, 762: 4469}, + {454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 15: 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 491: 454, 454, 454, 496: 454, 498: 454, 454, 454, 507: 454, 454, 514: 454, 454, 522: 454, 524: 454, 588: 454, 665: 454, 667: 454, 454}, + {525: 2823, 755: 2822, 762: 4471}, + {455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 15: 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 491: 455, 455, 455, 496: 455, 498: 455, 455, 455, 507: 455, 455, 514: 455, 455, 522: 455, 524: 455, 588: 455, 665: 455, 667: 455, 455}, // 1860 - {2429, 2429, 2429, 2429, 2429, 2429, 9: 2429, 491: 2429}, - {2443, 2443, 2443, 2443, 2443, 2443, 9: 2443, 491: 2443}, - {2442, 2442, 2442, 2442, 2442, 2442, 9: 2442, 491: 2442}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 482: 4421, 664: 4422, 2785, 2786, 2784}, - {2445, 2445, 2445, 2445, 2445, 2445, 9: 2445, 84: 2445, 491: 2445}, + {494: 4473}, + {456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 15: 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 491: 456, 456, 456, 496: 456, 498: 456, 456, 456, 507: 456, 456, 514: 456, 456, 522: 456, 524: 456, 588: 456, 665: 456, 667: 456, 456}, + {525: 2823, 755: 2822, 762: 4475}, + {457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 15: 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 491: 457, 457, 457, 496: 457, 498: 457, 457, 457, 507: 457, 457, 514: 457, 457, 522: 457, 524: 457, 588: 457, 665: 457, 667: 457, 457}, + {525: 2823, 755: 2822, 762: 4477}, // 1865 - {2444, 2444, 2444, 2444, 2444, 2444, 9: 2444, 84: 2444, 491: 2444}, - {130: 4428, 243: 4425, 264: 4426, 266: 4427, 482: 4424}, - {2450, 2450, 2450, 2450, 2450, 2450, 9: 2450, 491: 2450, 500: 2450}, - {2449, 2449, 2449, 2449, 2449, 2449, 9: 2449, 491: 2449, 500: 2449}, - {2448, 2448, 2448, 2448, 2448, 2448, 9: 2448, 491: 2448, 500: 2448}, + {459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 15: 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 491: 459, 459, 459, 496: 459, 498: 459, 459, 459, 507: 459, 459, 514: 459, 459, 522: 459, 524: 459, 588: 459, 665: 459, 667: 459, 459}, + {518: 4396, 525: 2107, 758: 4482}, + {518: 4396, 525: 2107, 758: 4480}, + {525: 2823, 755: 2822, 762: 4481}, + {458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 15: 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 491: 458, 458, 458, 496: 458, 498: 458, 458, 458, 507: 458, 458, 514: 458, 458, 522: 458, 524: 458, 588: 458, 665: 458, 667: 458, 458}, // 1870 - {2447, 2447, 2447, 2447, 2447, 2447, 9: 2447, 491: 2447, 500: 2447}, - {2446, 2446, 2446, 2446, 2446, 2446, 9: 2446, 491: 2446, 500: 2446}, - {2468, 2468, 2468, 2468, 2468, 2468, 9: 2468, 491: 2468}, - {2469, 2469, 2469, 2469, 2469, 2469, 9: 2469, 491: 2469}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4444, 2785, 2786, 2784}, + {525: 2823, 755: 2822, 762: 4483}, + {460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 15: 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 491: 460, 460, 460, 496: 460, 498: 460, 460, 460, 507: 460, 460, 514: 460, 460, 522: 460, 524: 460, 588: 460, 665: 460, 667: 460, 460}, + {2: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 10: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 59: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 494: 2107, 518: 4396, 549: 2107, 758: 4488}, + {2: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 10: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 59: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 494: 2107, 518: 4396, 549: 2107, 758: 4486}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 549: 3595, 685: 3597, 2849, 688: 2850, 2848, 760: 3594, 894: 4487}, // 1875 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 4443}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 4442}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 4441}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4438, 2785, 2786, 2784}, - {2: 2441, 2441, 2441, 2441, 2441, 2441, 2441, 10: 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 51: 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 476: 2441, 484: 2441, 497: 2441, 567: 2441}, + {461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 15: 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 491: 461, 461, 461, 496: 461, 498: 461, 461, 461, 507: 461, 461, 514: 461, 461, 522: 461, 524: 461, 588: 461, 665: 461, 667: 461, 461}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 549: 3867, 685: 3597, 2849, 688: 2850, 2848, 760: 3866, 830: 4489}, + {462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 15: 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 491: 462, 462, 462, 496: 462, 498: 462, 462, 462, 507: 462, 462, 514: 462, 462, 522: 462, 524: 462, 588: 462, 665: 462, 667: 462, 462}, + {525: 2823, 755: 2822, 762: 4491}, + {2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 15: 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 58: 2181, 491: 2181, 2181, 2181, 496: 2181, 498: 2181, 2181, 2181, 507: 2181, 2181, 514: 2181, 2181, 522: 2181, 524: 2181, 588: 2181, 665: 2181, 667: 2181, 2181}, // 1880 - {2: 2440, 2440, 2440, 2440, 2440, 2440, 2440, 10: 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 51: 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 476: 2440, 484: 2440, 497: 2440, 567: 2440}, - {653: 4439}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4440, 2785, 2786, 2784}, - {2474, 2474, 2474, 2474, 2474, 2474, 9: 2474, 491: 2474}, - {2475, 2475, 2475, 2475, 2475, 2475, 9: 2475, 491: 2475}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4493, 2849, 688: 2850, 2848}, + {2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 15: 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 58: 2182, 491: 2182, 2182, 2182, 496: 2182, 498: 2182, 2182, 2182, 507: 2182, 2182, 514: 2182, 2182, 522: 2182, 524: 2182, 588: 2182, 665: 2182, 667: 2182, 2182}, + {525: 2823, 755: 2822, 762: 4495}, + {2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 15: 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 58: 2183, 491: 2183, 2183, 2183, 496: 2183, 498: 2183, 2183, 2183, 507: 2183, 2183, 514: 2183, 2183, 522: 2183, 524: 2183, 588: 2183, 665: 2183, 667: 2183, 2183}, + {525: 2823, 755: 2822, 762: 4497}, // 1885 - {2476, 2476, 2476, 2476, 2476, 2476, 9: 2476, 491: 2476}, - {2477, 2477, 2477, 2477, 2477, 2477, 9: 2477, 491: 2477}, - {653: 4445}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4446, 2785, 2786, 2784}, - {2478, 2478, 2478, 2478, 2478, 2478, 9: 2478, 491: 2478}, + {2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 15: 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 58: 2184, 491: 2184, 2184, 2184, 496: 2184, 498: 2184, 2184, 2184, 507: 2184, 2184, 514: 2184, 2184, 522: 2184, 524: 2184, 588: 2184, 665: 2184, 667: 2184, 2184}, + {494: 2107, 518: 4396, 758: 4499}, + {494: 4500}, + {2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 15: 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 58: 2185, 491: 2185, 2185, 2185, 496: 2185, 498: 2185, 2185, 2185, 507: 2185, 2185, 514: 2185, 2185, 522: 2185, 524: 2185, 588: 2185, 665: 2185, 667: 2185, 2185}, + {494: 2107, 518: 4396, 758: 4502}, // 1890 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 4462}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4457, 2785, 2786, 2784}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4453, 2785, 2786, 2784}, - {2: 2436, 2436, 2436, 2436, 2436, 2436, 2436, 10: 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 51: 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 476: 2436, 567: 2436}, - {2: 452, 452, 452, 452, 452, 452, 452, 10: 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 51: 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452}, + {494: 4503}, + {2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 15: 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 58: 2186, 491: 2186, 2186, 2186, 496: 2186, 498: 2186, 2186, 2186, 507: 2186, 2186, 514: 2186, 2186, 522: 2186, 524: 2186, 588: 2186, 665: 2186, 667: 2186, 2186}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 685: 3597, 2849, 688: 2850, 2848, 760: 4505}, + {2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 15: 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 58: 2187, 491: 2187, 2187, 2187, 496: 2187, 498: 2187, 2187, 2187, 507: 2187, 2187, 514: 2187, 2187, 522: 2187, 524: 2187, 588: 2187, 665: 2187, 667: 2187, 2187}, + {2: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 10: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 59: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 494: 2107, 518: 4396, 758: 4509}, // 1895 - {2: 451, 451, 451, 451, 451, 451, 451, 10: 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 51: 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451}, - {87: 4456, 90: 4455, 860: 4454}, - {2463, 2463, 2463, 2463, 2463, 2463, 9: 2463, 491: 2463}, - {1851, 1851, 1851, 1851, 1851, 1851, 1851, 9: 1851, 19: 1851, 50: 1851, 84: 1851, 1851, 1851, 1851, 1851, 90: 1851, 477: 1851, 484: 1851, 491: 1851, 500: 1851}, - {1850, 1850, 1850, 1850, 1850, 1850, 1850, 9: 1850, 19: 1850, 50: 1850, 84: 1850, 1850, 1850, 1850, 1850, 90: 1850, 477: 1850, 484: 1850, 491: 1850, 500: 1850}, + {435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 15: 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 491: 435, 435, 435, 496: 435, 498: 435, 435, 435, 507: 435, 435, 514: 435, 435, 522: 435, 524: 435, 588: 435, 665: 435, 667: 435, 435}, + {434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 15: 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 491: 434, 434, 434, 496: 434, 498: 434, 434, 434, 507: 434, 434, 514: 434, 434, 522: 434, 524: 434, 588: 434, 665: 434, 667: 434, 434}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 685: 3597, 2849, 688: 2850, 2848, 760: 4510}, + {2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 15: 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 58: 2188, 491: 2188, 2188, 2188, 496: 2188, 498: 2188, 2188, 2188, 507: 2188, 2188, 514: 2188, 2188, 522: 2188, 524: 2188, 588: 2188, 665: 2188, 667: 2188, 2188}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 685: 3597, 2849, 688: 2850, 2848, 760: 4512}, // 1900 - {152: 4459, 479: 4115, 4114, 815: 4460, 939: 4458}, - {2465, 2465, 2465, 2465, 2465, 2465, 9: 2465, 491: 2465}, - {2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 50: 2329, 475: 2329, 479: 2329, 2329, 2329, 2329, 487: 2329, 491: 2329, 495: 2329, 584: 2329, 593: 2329, 2329, 645: 2329, 2329, 2329, 2329}, - {152: 4461}, - {2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 50: 2328, 475: 2328, 479: 2328, 2328, 2328, 2328, 487: 2328, 491: 2328, 495: 2328, 584: 2328, 593: 2328, 2328, 645: 2328, 2328, 2328, 2328}, + {2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 15: 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 58: 2189, 491: 2189, 2189, 2189, 496: 2189, 498: 2189, 2189, 2189, 507: 2189, 2189, 514: 2189, 2189, 522: 2189, 524: 2189, 588: 2189, 665: 2189, 667: 2189, 2189}, + {494: 4514}, + {2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 15: 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 58: 2190, 491: 2190, 2190, 2190, 496: 2190, 498: 2190, 2190, 2190, 507: 2190, 2190, 514: 2190, 2190, 522: 2190, 524: 2190, 588: 2190, 665: 2190, 667: 2190, 2190}, + {6: 4353, 4355, 426, 10: 4322, 15: 4372, 2236, 4370, 4309, 4374, 4361, 4390, 4354, 4357, 4356, 4359, 4360, 4362, 4369, 426, 4380, 4381, 4391, 4367, 4368, 4373, 4375, 4387, 4386, 4395, 4388, 4385, 4378, 4383, 4384, 4377, 4379, 4382, 4371, 4392, 4393, 78: 4324, 81: 4345, 4346, 90: 4347, 149: 4327, 194: 4316, 215: 4310, 218: 4331, 221: 4332, 231: 4326, 237: 4342, 251: 4320, 260: 4328, 266: 4323, 283: 4333, 291: 4329, 298: 4343, 4344, 303: 4311, 493: 4341, 496: 4352, 499: 2236, 4389, 514: 2236, 517: 4348, 523: 4330, 4340, 526: 4313, 604: 4314, 607: 4319, 667: 2236, 4358, 682: 4335, 690: 4321, 692: 4349, 701: 4334, 708: 4336, 711: 4315, 726: 4325, 803: 4363, 816: 4365, 837: 4364, 858: 4366, 861: 4376, 865: 4394, 892: 4339, 906: 4337, 944: 4312, 951: 4317, 1015: 4516, 1171: 4318, 1199: 4338}, + {2477, 2477, 2477, 2477, 2477, 2477, 9: 2477, 507: 2477}, // 1905 - {509: 4463, 672: 4464}, - {482: 4466}, - {482: 4465}, - {2479, 2479, 2479, 2479, 2479, 2479, 9: 2479, 491: 2479}, - {476: 4468, 478: 3265, 488: 4470, 4471, 495: 3256, 511: 3260, 574: 3255, 3257, 3259, 3258, 579: 3263, 583: 3264, 595: 3262, 716: 4469, 3261, 1142: 4467}, + {2491, 2491, 2491, 2491, 2491, 2491, 9: 2491, 507: 2491}, + {2490, 2490, 2490, 2490, 2490, 2490, 9: 2490, 507: 2490}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 496: 4520, 685: 4521, 2849, 688: 2850, 2848}, + {2493, 2493, 2493, 2493, 2493, 2493, 9: 2493, 90: 2493, 507: 2493}, + {2492, 2492, 2492, 2492, 2492, 2492, 9: 2492, 90: 2492, 507: 2492}, // 1910 - {2481, 2481, 2481, 2481, 2481, 2481, 9: 2481, 491: 2481}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4474}, - {2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 50: 2242, 475: 2242, 479: 2242, 2242, 2242, 2242, 487: 2242, 491: 2242, 495: 2242, 584: 2242, 593: 2242, 2242, 645: 2242, 2242, 2242, 2242}, - {511: 3449, 576: 3451, 3450, 824: 4473}, - {511: 3449, 576: 3451, 3450, 824: 4472}, + {139: 4527, 254: 4524, 275: 4525, 277: 4526, 496: 4523}, + {2498, 2498, 2498, 2498, 2498, 2498, 9: 2498, 507: 2498, 517: 2498}, + {2497, 2497, 2497, 2497, 2497, 2497, 9: 2497, 507: 2497, 517: 2497}, + {2496, 2496, 2496, 2496, 2496, 2496, 9: 2496, 507: 2496, 517: 2496}, + {2495, 2495, 2495, 2495, 2495, 2495, 9: 2495, 507: 2495, 517: 2495}, // 1915 - {2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 50: 2240, 475: 2240, 479: 2240, 2240, 2240, 2240, 487: 2240, 491: 2240, 495: 2240, 584: 2240, 593: 2240, 2240, 645: 2240, 2240, 2240, 2240}, - {2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 50: 2241, 475: 2241, 479: 2241, 2241, 2241, 2241, 487: 2241, 491: 2241, 495: 2241, 584: 2241, 593: 2241, 2241, 645: 2241, 2241, 2241, 2241}, - {50: 4475, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {2480, 2480, 2480, 2480, 2480, 2480, 9: 2480, 491: 2480}, - {2: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 10: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 51: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 567: 4478, 784: 4477}, + {2494, 2494, 2494, 2494, 2494, 2494, 9: 2494, 507: 2494, 517: 2494}, + {2516, 2516, 2516, 2516, 2516, 2516, 9: 2516, 507: 2516}, + {2517, 2517, 2517, 2517, 2517, 2517, 9: 2517, 507: 2517}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4543, 2849, 688: 2850, 2848}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4542}, // 1920 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 4480}, - {586: 4479}, - {1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 51: 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 478: 1876, 491: 1876, 573: 1876}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 4482, 853: 4481}, - {2435, 2435, 2435, 2435, 2435, 2435, 9: 2435, 4757, 4758, 491: 2435, 934: 4756}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4541}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4540}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4537, 2849, 688: 2850, 2848}, + {2: 2489, 2489, 2489, 2489, 2489, 2489, 2489, 10: 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 59: 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 492: 2489, 501: 2489, 513: 2489, 583: 2489}, + {2: 2488, 2488, 2488, 2488, 2488, 2488, 2488, 10: 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 59: 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 492: 2488, 501: 2488, 513: 2488, 583: 2488}, // 1925 - {12: 4484, 105: 4532, 110: 4533, 173: 4523, 180: 4543, 4542, 4508, 202: 4545, 226: 4544, 233: 4505, 318: 4512, 4504, 340: 4521, 362: 4528, 4527, 366: 4531, 402: 4539, 508: 4526, 4522, 533: 4517, 650: 4525, 681: 4530, 4529, 684: 4506, 4511, 4509, 4502, 4496, 4510, 692: 4518, 694: 4503, 4535, 4497, 4498, 4499, 4500, 4501, 4524, 4537, 4541, 4536, 4495, 4540, 4507, 709: 4494, 4534, 4493, 4538, 906: 4513, 1166: 4515, 1191: 4492, 4519, 4489, 1211: 4487, 1226: 4490, 4491, 1245: 4488, 1263: 4514, 1265: 4485, 4516, 1324: 4486, 1336: 4520, 1339: 4483, 1364: 4546}, - {2289, 2289, 2289, 2289, 2289, 2289, 4626, 4632, 4620, 2289, 2289, 2289, 4624, 4633, 4631, 50: 2289, 475: 4625, 479: 4115, 4114, 2296, 4623, 487: 4630, 491: 2289, 495: 4619, 584: 2333, 593: 2426, 4617, 645: 4622, 4615, 4637, 4634, 815: 4618, 837: 4627, 915: 4629, 933: 4635, 942: 4628, 961: 4621, 1007: 4636, 4755}, - {2289, 2289, 2289, 2289, 2289, 2289, 4626, 4632, 4620, 2289, 2289, 2289, 4624, 4633, 4631, 50: 2289, 475: 4625, 479: 4115, 4114, 2296, 4623, 487: 4630, 491: 2289, 495: 4619, 584: 2333, 593: 2426, 4617, 645: 4622, 4615, 4637, 4634, 815: 4618, 837: 4627, 915: 4629, 933: 4635, 942: 4628, 961: 4621, 1007: 4636, 4616}, - {383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 50: 383, 475: 383, 479: 383, 383, 383, 383, 487: 383, 491: 383, 495: 383, 584: 383, 593: 383, 383, 645: 383, 383, 383, 383}, - {382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 50: 382, 475: 382, 479: 382, 382, 382, 382, 487: 382, 491: 382, 495: 382, 584: 382, 593: 382, 382, 645: 382, 382, 382, 382}, + {670: 4538}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4539, 2849, 688: 2850, 2848}, + {2522, 2522, 2522, 2522, 2522, 2522, 9: 2522, 507: 2522}, + {2523, 2523, 2523, 2523, 2523, 2523, 9: 2523, 507: 2523}, + {2524, 2524, 2524, 2524, 2524, 2524, 9: 2524, 507: 2524}, // 1930 - {381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 50: 381, 475: 381, 479: 381, 381, 381, 381, 487: 381, 491: 381, 495: 381, 584: 381, 593: 381, 381, 645: 381, 381, 381, 381}, - {298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 50: 298, 52: 298, 475: 298, 3852, 479: 298, 298, 298, 298, 487: 298, 491: 298, 495: 298, 584: 298, 593: 298, 298, 645: 298, 298, 298, 298, 744: 298, 747: 298, 768: 3853, 794: 4613}, - {293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 50: 293, 52: 293, 475: 293, 479: 293, 293, 293, 293, 487: 293, 491: 293, 495: 293, 584: 293, 593: 293, 293, 645: 293, 293, 293, 293, 744: 293, 747: 293, 880: 4612}, - {291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 50: 291, 52: 291, 475: 291, 3839, 479: 291, 291, 291, 291, 487: 291, 491: 291, 495: 291, 584: 291, 593: 291, 291, 645: 291, 291, 291, 291, 744: 291, 747: 291, 768: 3840, 909: 4610, 914: 3841}, - {291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 50: 291, 52: 291, 475: 291, 3839, 479: 291, 291, 291, 291, 487: 291, 491: 291, 495: 291, 584: 291, 593: 291, 291, 645: 291, 291, 291, 291, 744: 291, 747: 291, 768: 3840, 909: 4608, 914: 3841}, + {2525, 2525, 2525, 2525, 2525, 2525, 9: 2525, 507: 2525}, + {670: 4544}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4545, 2849, 688: 2850, 2848}, + {2526, 2526, 2526, 2526, 2526, 2526, 9: 2526, 507: 2526}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 4561}, // 1935 - {298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 50: 298, 475: 298, 3852, 479: 298, 298, 298, 298, 487: 298, 491: 298, 495: 298, 584: 298, 593: 298, 298, 645: 298, 298, 298, 298, 768: 3853, 794: 4607}, - {375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 50: 375, 52: 375, 475: 375, 375, 479: 375, 375, 375, 375, 487: 375, 491: 375, 495: 375, 584: 375, 593: 375, 375, 645: 375, 375, 375, 375, 744: 375, 747: 375}, - {374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 50: 374, 52: 374, 475: 374, 374, 479: 374, 374, 374, 374, 487: 374, 491: 374, 495: 374, 584: 374, 593: 374, 374, 645: 374, 374, 374, 374, 744: 374, 747: 374}, - {373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 50: 373, 52: 373, 475: 373, 373, 479: 373, 373, 373, 373, 487: 373, 491: 373, 495: 373, 584: 373, 593: 373, 373, 645: 373, 373, 373, 373, 744: 373, 747: 373}, - {372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 50: 372, 52: 372, 475: 372, 372, 479: 372, 372, 372, 372, 487: 372, 491: 372, 495: 372, 584: 372, 593: 372, 372, 645: 372, 372, 372, 372, 744: 372, 747: 372}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4556, 2849, 688: 2850, 2848}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4552, 2849, 688: 2850, 2848}, + {2: 2484, 2484, 2484, 2484, 2484, 2484, 2484, 10: 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 59: 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 492: 2484, 583: 2484}, + {2: 471, 471, 471, 471, 471, 471, 471, 10: 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 59: 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471}, + {2: 470, 470, 470, 470, 470, 470, 470, 10: 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 59: 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470}, // 1940 - {371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 50: 371, 52: 371, 475: 371, 371, 479: 371, 371, 371, 371, 487: 371, 491: 371, 495: 371, 584: 371, 593: 371, 371, 645: 371, 371, 371, 371, 744: 371, 747: 371}, - {370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 50: 370, 52: 370, 475: 370, 370, 479: 370, 370, 370, 370, 487: 370, 491: 370, 495: 370, 584: 370, 593: 370, 370, 645: 370, 370, 370, 370, 744: 370, 747: 370}, - {369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 50: 369, 52: 369, 475: 369, 369, 479: 369, 369, 369, 369, 487: 369, 491: 369, 495: 369, 584: 369, 593: 369, 369, 645: 369, 369, 369, 369, 744: 369, 747: 369}, - {368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 50: 368, 52: 368, 475: 368, 368, 479: 368, 368, 368, 368, 487: 368, 491: 368, 495: 368, 584: 368, 593: 368, 368, 645: 368, 368, 368, 368, 744: 368, 747: 368}, - {367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 50: 367, 52: 367, 475: 367, 367, 479: 367, 367, 367, 367, 487: 367, 491: 367, 495: 367, 584: 367, 593: 367, 367, 645: 367, 367, 367, 367, 744: 367, 747: 367}, + {94: 4555, 96: 4554, 878: 4553}, + {2511, 2511, 2511, 2511, 2511, 2511, 9: 2511, 507: 2511}, + {1892, 1892, 1892, 1892, 1892, 1892, 1892, 9: 1892, 19: 1892, 58: 1892, 90: 1892, 92: 1892, 1892, 1892, 1892, 1892, 493: 1892, 501: 1892, 507: 1892, 517: 1892}, + {1891, 1891, 1891, 1891, 1891, 1891, 1891, 9: 1891, 19: 1891, 58: 1891, 90: 1891, 92: 1891, 1891, 1891, 1891, 1891, 493: 1891, 501: 1891, 507: 1891, 517: 1891}, + {161: 4558, 495: 4197, 497: 4196, 834: 4559, 960: 4557}, // 1945 - {366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 50: 366, 52: 366, 475: 366, 366, 479: 366, 366, 366, 366, 487: 366, 491: 366, 495: 366, 584: 366, 593: 366, 366, 645: 366, 366, 366, 366, 744: 366, 747: 366}, - {365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 50: 365, 52: 365, 475: 365, 365, 479: 365, 365, 365, 365, 487: 365, 491: 365, 495: 365, 584: 365, 593: 365, 365, 645: 365, 365, 365, 365, 744: 365, 747: 365}, - {364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 50: 364, 52: 364, 475: 364, 479: 364, 364, 364, 364, 487: 364, 491: 364, 495: 364, 584: 364, 593: 364, 364, 645: 364, 364, 364, 364, 744: 364, 747: 364}, - {363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 50: 363, 52: 363, 475: 363, 479: 363, 363, 363, 363, 487: 363, 491: 363, 495: 363, 584: 363, 593: 363, 363, 645: 363, 363, 363, 363, 744: 363, 747: 363}, - {359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 50: 359, 52: 359, 475: 359, 359, 479: 359, 359, 359, 359, 487: 359, 491: 359, 495: 359, 584: 359, 593: 359, 359, 645: 359, 359, 359, 359, 744: 359, 747: 359}, + {2513, 2513, 2513, 2513, 2513, 2513, 9: 2513, 507: 2513}, + {2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377, 58: 2377, 491: 2377, 495: 2377, 2377, 2377, 2377, 2377, 507: 2377, 510: 2377, 600: 2377, 607: 2377, 613: 2377, 662: 2377, 2377, 2377, 666: 2377}, + {161: 4560}, + {2376, 2376, 2376, 2376, 2376, 2376, 2376, 2376, 2376, 2376, 2376, 2376, 2376, 2376, 2376, 58: 2376, 491: 2376, 495: 2376, 2376, 2376, 2376, 2376, 507: 2376, 510: 2376, 600: 2376, 607: 2376, 613: 2376, 662: 2376, 2376, 2376, 666: 2376}, + {526: 4562, 690: 4563}, // 1950 - {358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 50: 358, 52: 358, 475: 358, 358, 479: 358, 358, 358, 358, 487: 358, 491: 358, 495: 358, 584: 358, 593: 358, 358, 645: 358, 358, 358, 358, 744: 358, 747: 358}, - {357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 50: 357, 52: 357, 475: 357, 357, 479: 357, 357, 357, 357, 487: 357, 491: 357, 495: 357, 584: 357, 593: 357, 357, 645: 357, 357, 357, 357, 744: 357, 747: 357}, - {356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 50: 356, 52: 356, 475: 356, 356, 479: 356, 356, 356, 356, 487: 356, 491: 356, 495: 356, 584: 356, 593: 356, 356, 645: 356, 356, 356, 356, 744: 356, 747: 356}, - {355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 50: 355, 52: 355, 475: 355, 355, 479: 355, 355, 355, 355, 487: 355, 491: 355, 495: 355, 584: 355, 593: 355, 355, 645: 355, 355, 355, 355, 744: 355, 747: 355}, - {354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 50: 354, 52: 354, 475: 354, 354, 479: 354, 354, 354, 354, 487: 354, 491: 354, 495: 354, 584: 354, 593: 354, 354, 645: 354, 354, 354, 354, 744: 354, 747: 354, 1289: 4606}, + {496: 4565}, + {496: 4564}, + {2527, 2527, 2527, 2527, 2527, 2527, 9: 2527, 507: 2527}, + {492: 4567, 494: 3345, 504: 4569, 4570, 510: 3336, 525: 3340, 591: 3335, 3337, 3339, 3338, 596: 3343, 598: 3344, 614: 3342, 734: 4568, 3341, 1167: 4566}, + {2529, 2529, 2529, 2529, 2529, 2529, 9: 2529, 507: 2529}, // 1955 - {352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 50: 352, 475: 352, 352, 479: 352, 352, 352, 352, 487: 352, 491: 352, 495: 352, 584: 352, 593: 352, 352, 645: 352, 352, 352, 352}, - {285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 16: 3862, 50: 285, 475: 285, 3852, 479: 285, 285, 285, 285, 487: 285, 491: 285, 495: 285, 508: 3863, 533: 3859, 584: 285, 593: 285, 285, 645: 285, 285, 285, 285, 650: 3861, 768: 4603, 779: 3860, 803: 4604}, - {285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 16: 3862, 50: 285, 475: 285, 3852, 479: 285, 285, 285, 285, 487: 285, 491: 285, 495: 285, 508: 3863, 533: 3859, 584: 285, 593: 285, 285, 645: 285, 285, 285, 285, 650: 3861, 768: 4600, 779: 3860, 803: 4601}, - {476: 3852, 768: 4598}, - {476: 3852, 768: 4596}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4573}, + {2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286, 58: 2286, 491: 2286, 495: 2286, 2286, 2286, 2286, 2286, 507: 2286, 510: 2286, 600: 2286, 607: 2286, 613: 2286, 662: 2286, 2286, 2286, 666: 2286}, + {525: 3529, 593: 3531, 3530, 842: 4572}, + {525: 3529, 593: 3531, 3530, 842: 4571}, + {2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 58: 2284, 491: 2284, 495: 2284, 2284, 2284, 2284, 2284, 507: 2284, 510: 2284, 600: 2284, 607: 2284, 613: 2284, 662: 2284, 2284, 2284, 666: 2284}, // 1960 - {298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 50: 298, 475: 298, 3852, 479: 298, 298, 298, 298, 487: 298, 491: 298, 495: 298, 584: 298, 593: 298, 298, 645: 298, 298, 298, 298, 768: 3853, 794: 4595}, - {476: 3852, 768: 4594}, - {343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 50: 343, 475: 343, 479: 343, 343, 343, 343, 487: 343, 491: 343, 495: 343, 584: 343, 593: 343, 343, 645: 343, 343, 343, 343}, - {285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 16: 3862, 50: 285, 107: 4575, 4577, 111: 4576, 475: 285, 479: 285, 285, 285, 285, 487: 285, 491: 285, 495: 285, 508: 3863, 533: 3859, 584: 285, 593: 285, 285, 645: 285, 285, 285, 285, 650: 3861, 779: 3860, 803: 4574, 888: 4593}, - {476: 4589}, + {2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 58: 2285, 491: 2285, 495: 2285, 2285, 2285, 2285, 2285, 507: 2285, 510: 2285, 600: 2285, 607: 2285, 613: 2285, 662: 2285, 2285, 2285, 666: 2285}, + {58: 4574, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {2528, 2528, 2528, 2528, 2528, 2528, 9: 2528, 507: 2528}, + {2: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 10: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 59: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 583: 4577, 800: 4576}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 4579}, // 1965 - {476: 4579}, - {339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 50: 339, 475: 339, 479: 339, 339, 339, 339, 487: 339, 491: 339, 495: 339, 584: 339, 593: 339, 339, 645: 339, 339, 339, 339}, - {285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 16: 3862, 50: 285, 107: 4575, 4577, 111: 4576, 475: 285, 479: 285, 285, 285, 285, 487: 285, 491: 285, 495: 285, 508: 4572, 533: 3859, 584: 285, 593: 285, 285, 645: 285, 285, 285, 285, 650: 4571, 681: 4530, 4529, 692: 4573, 779: 3860, 803: 4574, 888: 4570, 1166: 4569}, - {336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 16: 336, 50: 336, 475: 336, 336, 479: 336, 336, 336, 336, 487: 336, 491: 336, 495: 336, 508: 336, 533: 336, 584: 336, 593: 336, 336, 645: 336, 336, 336, 336, 650: 336, 848: 4568}, - {335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 16: 335, 50: 335, 475: 335, 335, 479: 335, 335, 335, 335, 487: 335, 491: 335, 495: 335, 508: 335, 533: 335, 584: 335, 593: 335, 335, 645: 335, 335, 335, 335, 650: 335, 848: 4567}, + {603: 4578}, + {1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 59: 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 494: 1917, 507: 1917, 590: 1917}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 4581, 871: 4580}, + {2483, 2483, 2483, 2483, 2483, 2483, 9: 2483, 4861, 4862, 507: 2483, 954: 4860}, + {12: 4583, 113: 4631, 115: 4632, 182: 4622, 189: 4642, 4641, 4607, 212: 4644, 236: 4643, 243: 4604, 330: 4611, 4603, 351: 4620, 372: 4627, 4626, 377: 4630, 414: 4638, 514: 4625, 526: 4621, 549: 4616, 667: 4624, 699: 4629, 4628, 702: 4605, 4610, 4608, 4601, 4595, 4609, 710: 4617, 712: 4602, 4634, 4596, 4597, 4598, 4599, 4600, 4623, 4636, 4640, 4635, 4594, 4639, 4606, 727: 4593, 4633, 4592, 4637, 926: 4612, 1191: 4614, 1217: 4591, 4618, 4588, 1236: 4586, 1251: 4589, 4590, 1270: 4587, 1288: 4613, 1290: 4584, 4615, 1349: 4585, 1361: 4619, 1364: 4582, 1389: 4645}, // 1970 - {334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 16: 334, 50: 334, 475: 334, 334, 479: 334, 334, 334, 334, 487: 334, 491: 334, 495: 334, 508: 334, 533: 334, 584: 334, 593: 334, 334, 645: 334, 334, 334, 334, 650: 334, 681: 4565, 4564, 848: 4566}, - {508: 4559, 650: 4558, 681: 4561, 4560}, - {329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 16: 329, 50: 329, 107: 329, 329, 111: 329, 475: 329, 329, 479: 329, 329, 329, 329, 487: 329, 491: 329, 495: 329, 508: 329, 533: 329, 584: 329, 593: 329, 329, 645: 329, 329, 329, 329, 650: 329}, - {328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 16: 328, 50: 328, 107: 328, 328, 111: 328, 475: 328, 328, 479: 328, 328, 328, 328, 487: 328, 491: 328, 495: 328, 508: 328, 533: 328, 584: 328, 593: 328, 328, 645: 328, 328, 328, 328, 650: 328}, - {476: 325}, + {2337, 2337, 2337, 2337, 2337, 2337, 4725, 4731, 4719, 2337, 2337, 2337, 4723, 4732, 4730, 58: 2337, 491: 4724, 495: 4197, 4722, 4196, 2344, 4729, 507: 2337, 510: 4718, 600: 2381, 607: 2474, 613: 4716, 662: 4721, 4714, 4736, 666: 4733, 834: 4717, 855: 4726, 935: 4728, 953: 4734, 963: 4727, 981: 4720, 1028: 4735, 4859}, + {2337, 2337, 2337, 2337, 2337, 2337, 4725, 4731, 4719, 2337, 2337, 2337, 4723, 4732, 4730, 58: 2337, 491: 4724, 495: 4197, 4722, 4196, 2344, 4729, 507: 2337, 510: 4718, 600: 2381, 607: 2474, 613: 4716, 662: 4721, 4714, 4736, 666: 4733, 834: 4717, 855: 4726, 935: 4728, 953: 4734, 963: 4727, 981: 4720, 1028: 4735, 4715}, + {399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 58: 399, 491: 399, 495: 399, 399, 399, 399, 399, 507: 399, 510: 399, 600: 399, 607: 399, 613: 399, 662: 399, 399, 399, 666: 399}, + {398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 58: 398, 491: 398, 495: 398, 398, 398, 398, 398, 507: 398, 510: 398, 600: 398, 607: 398, 613: 398, 662: 398, 398, 398, 666: 398}, + {397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 58: 397, 491: 397, 495: 397, 397, 397, 397, 397, 507: 397, 510: 397, 600: 397, 607: 397, 613: 397, 662: 397, 397, 397, 666: 397}, // 1975 - {319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 50: 319, 52: 319, 475: 319, 319, 479: 319, 319, 319, 319, 487: 319, 491: 319, 495: 319, 584: 319, 593: 319, 319, 645: 319, 319, 319, 319, 744: 319, 747: 319}, - {318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 50: 318, 52: 318, 475: 318, 318, 479: 318, 318, 318, 318, 487: 318, 491: 318, 495: 318, 584: 318, 593: 318, 318, 645: 318, 318, 318, 318, 744: 318, 747: 318}, - {317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 50: 317, 475: 317, 479: 317, 317, 317, 317, 487: 317, 491: 317, 495: 317, 584: 317, 593: 317, 317, 645: 317, 317, 317, 317}, - {298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 50: 298, 475: 298, 3852, 479: 298, 298, 298, 298, 487: 298, 491: 298, 495: 298, 584: 298, 593: 298, 298, 645: 298, 298, 298, 298, 768: 3853, 794: 4557}, - {315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 50: 315, 475: 315, 479: 315, 315, 315, 315, 487: 315, 491: 315, 495: 315, 584: 315, 593: 315, 315, 645: 315, 315, 315, 315}, + {314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 57: 314, 314, 491: 314, 3932, 495: 314, 314, 314, 314, 314, 507: 314, 510: 314, 600: 314, 607: 314, 613: 314, 662: 314, 314, 314, 666: 314, 763: 314, 765: 314, 786: 3933, 812: 4712}, + {309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 57: 309, 309, 491: 309, 495: 309, 309, 309, 309, 309, 507: 309, 510: 309, 600: 309, 607: 309, 613: 309, 662: 309, 309, 309, 666: 309, 763: 309, 765: 309, 899: 4711}, + {307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 57: 307, 307, 491: 307, 3919, 495: 307, 307, 307, 307, 307, 507: 307, 510: 307, 600: 307, 607: 307, 613: 307, 662: 307, 307, 307, 666: 307, 763: 307, 765: 307, 786: 3920, 929: 4709, 934: 3921}, + {307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 57: 307, 307, 491: 307, 3919, 495: 307, 307, 307, 307, 307, 507: 307, 510: 307, 600: 307, 607: 307, 613: 307, 662: 307, 307, 307, 666: 307, 763: 307, 765: 307, 786: 3920, 929: 4707, 934: 3921}, + {314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 58: 314, 491: 314, 3932, 495: 314, 314, 314, 314, 314, 507: 314, 510: 314, 600: 314, 607: 314, 613: 314, 662: 314, 314, 314, 666: 314, 786: 3933, 812: 4706}, // 1980 - {314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 50: 314, 475: 314, 479: 314, 314, 314, 314, 487: 314, 491: 314, 495: 314, 584: 314, 593: 314, 314, 645: 314, 314, 314, 314}, - {312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 16: 312, 50: 312, 107: 312, 312, 111: 312, 475: 312, 479: 312, 312, 312, 312, 487: 312, 491: 312, 495: 312, 508: 312, 533: 312, 584: 312, 593: 312, 312, 645: 312, 312, 312, 312, 650: 312}, - {298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 16: 298, 50: 298, 107: 298, 298, 111: 298, 475: 298, 3852, 479: 298, 298, 298, 298, 487: 298, 491: 298, 495: 298, 508: 298, 533: 298, 584: 298, 593: 298, 298, 645: 298, 298, 298, 298, 650: 298, 768: 3853, 794: 4556}, - {310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 16: 310, 50: 310, 107: 310, 310, 111: 310, 475: 310, 479: 310, 310, 310, 310, 487: 310, 491: 310, 495: 310, 508: 310, 533: 310, 584: 310, 593: 310, 310, 645: 310, 310, 310, 310, 650: 310}, - {309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 16: 309, 50: 309, 107: 309, 309, 111: 309, 475: 309, 479: 309, 309, 309, 309, 487: 309, 491: 309, 495: 309, 508: 309, 533: 309, 584: 309, 593: 309, 309, 645: 309, 309, 309, 309, 650: 309}, + {391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 57: 391, 391, 491: 391, 391, 495: 391, 391, 391, 391, 391, 507: 391, 510: 391, 600: 391, 607: 391, 613: 391, 662: 391, 391, 391, 666: 391, 763: 391, 765: 391}, + {390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 57: 390, 390, 491: 390, 390, 495: 390, 390, 390, 390, 390, 507: 390, 510: 390, 600: 390, 607: 390, 613: 390, 662: 390, 390, 390, 666: 390, 763: 390, 765: 390}, + {389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 57: 389, 389, 491: 389, 389, 495: 389, 389, 389, 389, 389, 507: 389, 510: 389, 600: 389, 607: 389, 613: 389, 662: 389, 389, 389, 666: 389, 763: 389, 765: 389}, + {388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 57: 388, 388, 491: 388, 388, 495: 388, 388, 388, 388, 388, 507: 388, 510: 388, 600: 388, 607: 388, 613: 388, 662: 388, 388, 388, 666: 388, 763: 388, 765: 388}, + {387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 57: 387, 387, 491: 387, 387, 495: 387, 387, 387, 387, 387, 507: 387, 510: 387, 600: 387, 607: 387, 613: 387, 662: 387, 387, 387, 666: 387, 763: 387, 765: 387}, // 1985 - {304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 50: 304, 475: 304, 479: 304, 304, 304, 304, 487: 304, 491: 304, 495: 304, 584: 304, 593: 304, 304, 645: 304, 304, 304, 304}, - {298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 50: 298, 475: 298, 3852, 479: 298, 298, 298, 298, 487: 298, 491: 298, 495: 298, 584: 298, 593: 298, 298, 645: 298, 298, 298, 298, 768: 3853, 794: 4555}, - {298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 50: 298, 475: 298, 3852, 479: 298, 298, 298, 298, 487: 298, 491: 298, 495: 298, 584: 298, 593: 298, 298, 645: 298, 298, 298, 298, 768: 3853, 794: 4554}, - {298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 50: 298, 475: 298, 3852, 479: 298, 298, 298, 298, 487: 298, 491: 298, 495: 298, 584: 298, 593: 298, 298, 645: 298, 298, 298, 298, 768: 3853, 794: 4553}, - {298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 50: 298, 52: 298, 475: 298, 3852, 479: 298, 298, 298, 298, 487: 298, 491: 298, 495: 298, 584: 298, 593: 298, 298, 645: 298, 298, 298, 298, 744: 298, 747: 298, 768: 3853, 794: 4547}, + {386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 57: 386, 386, 491: 386, 386, 495: 386, 386, 386, 386, 386, 507: 386, 510: 386, 600: 386, 607: 386, 613: 386, 662: 386, 386, 386, 666: 386, 763: 386, 765: 386}, + {385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 57: 385, 385, 491: 385, 385, 495: 385, 385, 385, 385, 385, 507: 385, 510: 385, 600: 385, 607: 385, 613: 385, 662: 385, 385, 385, 666: 385, 763: 385, 765: 385}, + {384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 57: 384, 384, 491: 384, 384, 495: 384, 384, 384, 384, 384, 507: 384, 510: 384, 600: 384, 607: 384, 613: 384, 662: 384, 384, 384, 666: 384, 763: 384, 765: 384}, + {383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 57: 383, 383, 491: 383, 383, 495: 383, 383, 383, 383, 383, 507: 383, 510: 383, 600: 383, 607: 383, 613: 383, 662: 383, 383, 383, 666: 383, 763: 383, 765: 383}, + {382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 57: 382, 382, 491: 382, 382, 495: 382, 382, 382, 382, 382, 507: 382, 510: 382, 600: 382, 607: 382, 613: 382, 662: 382, 382, 382, 666: 382, 763: 382, 765: 382}, // 1990 - {293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 50: 293, 52: 293, 475: 293, 479: 293, 293, 293, 293, 487: 293, 491: 293, 495: 293, 584: 293, 593: 293, 293, 645: 293, 293, 293, 293, 744: 293, 747: 293, 880: 4548}, - {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 50: 300, 52: 4550, 475: 300, 479: 300, 300, 300, 300, 487: 300, 491: 300, 495: 300, 584: 300, 593: 300, 300, 645: 300, 300, 300, 300, 744: 4549, 747: 4551, 879: 4552}, - {296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 50: 296, 52: 296, 475: 296, 479: 296, 296, 296, 296, 487: 296, 491: 296, 495: 296, 584: 296, 593: 296, 296, 645: 296, 296, 296, 296, 744: 296, 747: 296}, - {295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 50: 295, 52: 295, 475: 295, 479: 295, 295, 295, 295, 487: 295, 491: 295, 495: 295, 584: 295, 593: 295, 295, 645: 295, 295, 295, 295, 744: 295, 747: 295}, - {294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 50: 294, 52: 294, 475: 294, 479: 294, 294, 294, 294, 487: 294, 491: 294, 495: 294, 584: 294, 593: 294, 294, 645: 294, 294, 294, 294, 744: 294, 747: 294}, + {381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 57: 381, 381, 491: 381, 381, 495: 381, 381, 381, 381, 381, 507: 381, 510: 381, 600: 381, 607: 381, 613: 381, 662: 381, 381, 381, 666: 381, 763: 381, 765: 381}, + {380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 57: 380, 380, 491: 380, 495: 380, 380, 380, 380, 380, 507: 380, 510: 380, 600: 380, 607: 380, 613: 380, 662: 380, 380, 380, 666: 380, 763: 380, 765: 380}, + {379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 57: 379, 379, 491: 379, 495: 379, 379, 379, 379, 379, 507: 379, 510: 379, 600: 379, 607: 379, 613: 379, 662: 379, 379, 379, 666: 379, 763: 379, 765: 379}, + {375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 57: 375, 375, 491: 375, 375, 495: 375, 375, 375, 375, 375, 507: 375, 510: 375, 600: 375, 607: 375, 613: 375, 662: 375, 375, 375, 666: 375, 763: 375, 765: 375}, + {374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 57: 374, 374, 491: 374, 374, 495: 374, 374, 374, 374, 374, 507: 374, 510: 374, 600: 374, 607: 374, 613: 374, 662: 374, 374, 374, 666: 374, 763: 374, 765: 374}, // 1995 - {292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 50: 292, 52: 292, 475: 292, 479: 292, 292, 292, 292, 487: 292, 491: 292, 495: 292, 584: 292, 593: 292, 292, 645: 292, 292, 292, 292, 744: 292, 747: 292}, - {301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 50: 301, 475: 301, 479: 301, 301, 301, 301, 487: 301, 491: 301, 495: 301, 584: 301, 593: 301, 301, 645: 301, 301, 301, 301}, - {302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 50: 302, 475: 302, 479: 302, 302, 302, 302, 487: 302, 491: 302, 495: 302, 584: 302, 593: 302, 302, 645: 302, 302, 302, 302}, - {303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 50: 303, 475: 303, 479: 303, 303, 303, 303, 487: 303, 491: 303, 495: 303, 584: 303, 593: 303, 303, 645: 303, 303, 303, 303}, - {311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 16: 311, 50: 311, 107: 311, 311, 111: 311, 475: 311, 479: 311, 311, 311, 311, 487: 311, 491: 311, 495: 311, 508: 311, 533: 311, 584: 311, 593: 311, 311, 645: 311, 311, 311, 311, 650: 311}, + {373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 57: 373, 373, 491: 373, 373, 495: 373, 373, 373, 373, 373, 507: 373, 510: 373, 600: 373, 607: 373, 613: 373, 662: 373, 373, 373, 666: 373, 763: 373, 765: 373}, + {372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 57: 372, 372, 491: 372, 372, 495: 372, 372, 372, 372, 372, 507: 372, 510: 372, 600: 372, 607: 372, 613: 372, 662: 372, 372, 372, 666: 372, 763: 372, 765: 372}, + {371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 57: 371, 371, 491: 371, 371, 495: 371, 371, 371, 371, 371, 507: 371, 510: 371, 600: 371, 607: 371, 613: 371, 662: 371, 371, 371, 666: 371, 763: 371, 765: 371}, + {370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 57: 370, 370, 491: 370, 370, 495: 370, 370, 370, 370, 370, 507: 370, 510: 370, 600: 370, 607: 370, 613: 370, 662: 370, 370, 370, 666: 370, 763: 370, 765: 370, 1314: 4705}, + {368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 58: 368, 491: 368, 368, 495: 368, 368, 368, 368, 368, 507: 368, 510: 368, 600: 368, 607: 368, 613: 368, 662: 368, 368, 368, 666: 368}, // 2000 - {316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 50: 316, 475: 316, 479: 316, 316, 316, 316, 487: 316, 491: 316, 495: 316, 584: 316, 593: 316, 316, 645: 316, 316, 316, 316}, - {333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 16: 333, 50: 333, 475: 333, 333, 479: 333, 333, 333, 333, 487: 333, 491: 333, 495: 333, 508: 333, 533: 333, 584: 333, 593: 333, 333, 645: 333, 333, 333, 333, 650: 333, 848: 4563}, - {332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 16: 332, 50: 332, 475: 332, 332, 479: 332, 332, 332, 332, 487: 332, 491: 332, 495: 332, 508: 332, 533: 332, 584: 332, 593: 332, 332, 645: 332, 332, 332, 332, 650: 332, 848: 4562}, - {476: 327}, - {476: 326}, + {301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 16: 3942, 58: 301, 491: 301, 3932, 495: 301, 301, 301, 301, 301, 507: 301, 510: 301, 514: 3943, 549: 3939, 600: 301, 607: 301, 613: 301, 662: 301, 301, 301, 666: 301, 3941, 786: 4702, 798: 3940, 821: 4703}, + {301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 16: 3942, 58: 301, 491: 301, 3932, 495: 301, 301, 301, 301, 301, 507: 301, 510: 301, 514: 3943, 549: 3939, 600: 301, 607: 301, 613: 301, 662: 301, 301, 301, 666: 301, 3941, 786: 4699, 798: 3940, 821: 4700}, + {492: 3932, 786: 4697}, + {492: 3932, 786: 4695}, + {314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 58: 314, 491: 314, 3932, 495: 314, 314, 314, 314, 314, 507: 314, 510: 314, 600: 314, 607: 314, 613: 314, 662: 314, 314, 314, 666: 314, 786: 3933, 812: 4694}, // 2005 - {476: 321}, - {476: 322}, - {476: 324}, - {476: 323}, - {476: 320}, + {492: 3932, 786: 4693}, + {359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 58: 359, 491: 359, 495: 359, 359, 359, 359, 359, 507: 359, 510: 359, 600: 359, 607: 359, 613: 359, 662: 359, 359, 359, 666: 359}, + {301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 16: 3942, 58: 301, 116: 4674, 4676, 130: 4675, 491: 301, 495: 301, 301, 301, 301, 301, 507: 301, 510: 301, 514: 3943, 549: 3939, 600: 301, 607: 301, 613: 301, 662: 301, 301, 301, 666: 301, 3941, 798: 3940, 821: 4673, 907: 4692}, + {492: 4688}, + {492: 4678}, // 2010 - {330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 16: 330, 50: 330, 107: 330, 330, 111: 330, 475: 330, 330, 479: 330, 330, 330, 330, 487: 330, 491: 330, 495: 330, 508: 330, 533: 330, 584: 330, 593: 330, 330, 645: 330, 330, 330, 330, 650: 330}, - {331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 16: 331, 50: 331, 107: 331, 331, 111: 331, 475: 331, 331, 479: 331, 331, 331, 331, 487: 331, 491: 331, 495: 331, 508: 331, 533: 331, 584: 331, 593: 331, 331, 645: 331, 331, 331, 331, 650: 331}, - {285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 16: 3862, 50: 285, 107: 4575, 4577, 111: 4576, 475: 285, 479: 285, 285, 285, 285, 487: 285, 491: 285, 495: 285, 508: 3863, 533: 3859, 584: 285, 593: 285, 285, 645: 285, 285, 285, 285, 650: 3861, 779: 3860, 803: 4574, 888: 4578}, - {337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 50: 337, 475: 337, 479: 337, 337, 337, 337, 487: 337, 491: 337, 495: 337, 584: 337, 593: 337, 337, 645: 337, 337, 337, 337}, - {509: 3865, 848: 4568}, + {355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 58: 355, 491: 355, 495: 355, 355, 355, 355, 355, 507: 355, 510: 355, 600: 355, 607: 355, 613: 355, 662: 355, 355, 355, 666: 355}, + {301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 16: 3942, 58: 301, 116: 4674, 4676, 130: 4675, 491: 301, 495: 301, 301, 301, 301, 301, 507: 301, 510: 301, 514: 4671, 549: 3939, 600: 301, 607: 301, 613: 301, 662: 301, 301, 301, 666: 301, 4670, 699: 4629, 4628, 710: 4672, 798: 3940, 821: 4673, 907: 4669, 1191: 4668}, + {352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 16: 352, 58: 352, 491: 352, 352, 495: 352, 352, 352, 352, 352, 507: 352, 510: 352, 514: 352, 549: 352, 600: 352, 607: 352, 613: 352, 662: 352, 352, 352, 666: 352, 352, 866: 4667}, + {351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 16: 351, 58: 351, 491: 351, 351, 495: 351, 351, 351, 351, 351, 507: 351, 510: 351, 514: 351, 549: 351, 600: 351, 607: 351, 613: 351, 662: 351, 351, 351, 666: 351, 351, 866: 4666}, + {350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 16: 350, 58: 350, 491: 350, 350, 495: 350, 350, 350, 350, 350, 507: 350, 510: 350, 514: 350, 549: 350, 600: 350, 607: 350, 613: 350, 662: 350, 350, 350, 666: 350, 350, 699: 4664, 4663, 866: 4665}, // 2015 - {509: 3864, 848: 4567}, - {313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 50: 313, 475: 313, 479: 313, 313, 313, 313, 487: 313, 491: 313, 495: 313, 584: 313, 593: 313, 313, 645: 313, 313, 313, 313}, - {308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 50: 308, 475: 308, 479: 308, 308, 308, 308, 487: 308, 491: 308, 495: 308, 584: 308, 593: 308, 308, 645: 308, 308, 308, 308}, - {307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 50: 307, 475: 307, 479: 307, 307, 307, 307, 487: 307, 491: 307, 495: 307, 584: 307, 593: 307, 307, 645: 307, 307, 307, 307}, - {306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 50: 306, 475: 306, 479: 306, 306, 306, 306, 487: 306, 491: 306, 495: 306, 584: 306, 593: 306, 306, 645: 306, 306, 306, 306}, + {514: 4658, 667: 4657, 699: 4660, 4659}, + {345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 16: 345, 58: 345, 116: 345, 345, 130: 345, 491: 345, 345, 495: 345, 345, 345, 345, 345, 507: 345, 510: 345, 514: 345, 549: 345, 600: 345, 607: 345, 613: 345, 662: 345, 345, 345, 666: 345, 345}, + {344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 16: 344, 58: 344, 116: 344, 344, 130: 344, 491: 344, 344, 495: 344, 344, 344, 344, 344, 507: 344, 510: 344, 514: 344, 549: 344, 600: 344, 607: 344, 613: 344, 662: 344, 344, 344, 666: 344, 344}, + {492: 341}, + {335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 57: 335, 335, 491: 335, 335, 495: 335, 335, 335, 335, 335, 507: 335, 510: 335, 600: 335, 607: 335, 613: 335, 662: 335, 335, 335, 666: 335, 763: 335, 765: 335}, // 2020 - {305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 50: 305, 475: 305, 479: 305, 305, 305, 305, 487: 305, 491: 305, 495: 305, 584: 305, 593: 305, 305, 645: 305, 305, 305, 305}, - {338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 50: 338, 475: 338, 479: 338, 338, 338, 338, 487: 338, 491: 338, 495: 338, 584: 338, 593: 338, 338, 645: 338, 338, 338, 338}, - {478: 4581, 579: 4582, 583: 4583, 975: 4584, 1159: 4580}, - {9: 4586, 50: 4585}, - {9: 273, 50: 273}, + {334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 57: 334, 334, 491: 334, 334, 495: 334, 334, 334, 334, 334, 507: 334, 510: 334, 600: 334, 607: 334, 613: 334, 662: 334, 334, 334, 666: 334, 763: 334, 765: 334}, + {333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 58: 333, 491: 333, 495: 333, 333, 333, 333, 333, 507: 333, 510: 333, 600: 333, 607: 333, 613: 333, 662: 333, 333, 333, 666: 333}, + {314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 58: 314, 491: 314, 3932, 495: 314, 314, 314, 314, 314, 507: 314, 510: 314, 600: 314, 607: 314, 613: 314, 662: 314, 314, 314, 666: 314, 786: 3933, 812: 4656}, + {331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 58: 331, 491: 331, 495: 331, 331, 331, 331, 331, 507: 331, 510: 331, 600: 331, 607: 331, 613: 331, 662: 331, 331, 331, 666: 331}, + {330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 58: 330, 491: 330, 495: 330, 330, 330, 330, 330, 507: 330, 510: 330, 600: 330, 607: 330, 613: 330, 662: 330, 330, 330, 666: 330}, // 2025 - {9: 272, 50: 272}, - {9: 271, 50: 271}, - {9: 270, 50: 270}, - {285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 16: 3862, 50: 285, 107: 4575, 4577, 111: 4576, 475: 285, 479: 285, 285, 285, 285, 487: 285, 491: 285, 495: 285, 508: 3863, 533: 3859, 584: 285, 593: 285, 285, 645: 285, 285, 285, 285, 650: 3861, 779: 3860, 803: 4574, 888: 4588}, - {478: 4581, 579: 4582, 583: 4583, 975: 4587}, + {328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 16: 328, 58: 328, 116: 328, 328, 130: 328, 491: 328, 495: 328, 328, 328, 328, 328, 507: 328, 510: 328, 514: 328, 549: 328, 600: 328, 607: 328, 613: 328, 662: 328, 328, 328, 666: 328, 328}, + {314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 16: 314, 58: 314, 116: 314, 314, 130: 314, 491: 314, 3932, 495: 314, 314, 314, 314, 314, 507: 314, 510: 314, 514: 314, 549: 314, 600: 314, 607: 314, 613: 314, 662: 314, 314, 314, 666: 314, 314, 786: 3933, 812: 4655}, + {326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 16: 326, 58: 326, 116: 326, 326, 130: 326, 491: 326, 495: 326, 326, 326, 326, 326, 507: 326, 510: 326, 514: 326, 549: 326, 600: 326, 607: 326, 613: 326, 662: 326, 326, 326, 666: 326, 326}, + {325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 16: 325, 58: 325, 116: 325, 325, 130: 325, 491: 325, 495: 325, 325, 325, 325, 325, 507: 325, 510: 325, 514: 325, 549: 325, 600: 325, 607: 325, 613: 325, 662: 325, 325, 325, 666: 325, 325}, + {320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 58: 320, 491: 320, 495: 320, 320, 320, 320, 320, 507: 320, 510: 320, 600: 320, 607: 320, 613: 320, 662: 320, 320, 320, 666: 320}, // 2030 - {9: 269, 50: 269}, - {340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 50: 340, 475: 340, 479: 340, 340, 340, 340, 487: 340, 491: 340, 495: 340, 584: 340, 593: 340, 340, 645: 340, 340, 340, 340}, - {478: 4581, 579: 4582, 583: 4583, 975: 4584, 1159: 4590}, - {9: 4586, 50: 4591}, - {285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 16: 3862, 50: 285, 107: 4575, 4577, 111: 4576, 475: 285, 479: 285, 285, 285, 285, 487: 285, 491: 285, 495: 285, 508: 3863, 533: 3859, 584: 285, 593: 285, 285, 645: 285, 285, 285, 285, 650: 3861, 779: 3860, 803: 4574, 888: 4592}, + {314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 58: 314, 491: 314, 3932, 495: 314, 314, 314, 314, 314, 507: 314, 510: 314, 600: 314, 607: 314, 613: 314, 662: 314, 314, 314, 666: 314, 786: 3933, 812: 4654}, + {314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 58: 314, 491: 314, 3932, 495: 314, 314, 314, 314, 314, 507: 314, 510: 314, 600: 314, 607: 314, 613: 314, 662: 314, 314, 314, 666: 314, 786: 3933, 812: 4653}, + {314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 58: 314, 491: 314, 3932, 495: 314, 314, 314, 314, 314, 507: 314, 510: 314, 600: 314, 607: 314, 613: 314, 662: 314, 314, 314, 666: 314, 786: 3933, 812: 4652}, + {314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 57: 314, 314, 491: 314, 3932, 495: 314, 314, 314, 314, 314, 507: 314, 510: 314, 600: 314, 607: 314, 613: 314, 662: 314, 314, 314, 666: 314, 763: 314, 765: 314, 786: 3933, 812: 4646}, + {309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 57: 309, 309, 491: 309, 495: 309, 309, 309, 309, 309, 507: 309, 510: 309, 600: 309, 607: 309, 613: 309, 662: 309, 309, 309, 666: 309, 763: 309, 765: 309, 899: 4647}, // 2035 - {341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 50: 341, 475: 341, 479: 341, 341, 341, 341, 487: 341, 491: 341, 495: 341, 584: 341, 593: 341, 341, 645: 341, 341, 341, 341}, - {342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 50: 342, 475: 342, 479: 342, 342, 342, 342, 487: 342, 491: 342, 495: 342, 584: 342, 593: 342, 342, 645: 342, 342, 342, 342}, - {344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 50: 344, 475: 344, 479: 344, 344, 344, 344, 487: 344, 491: 344, 495: 344, 584: 344, 593: 344, 344, 645: 344, 344, 344, 344}, - {345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 50: 345, 475: 345, 479: 345, 345, 345, 345, 487: 345, 491: 345, 495: 345, 584: 345, 593: 345, 345, 645: 345, 345, 345, 345}, - {285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 16: 3862, 50: 285, 475: 285, 479: 285, 285, 285, 285, 487: 285, 491: 285, 495: 285, 508: 3863, 533: 3859, 584: 285, 593: 285, 285, 645: 285, 285, 285, 285, 650: 3861, 779: 3860, 803: 4597}, + {316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 57: 4649, 316, 491: 316, 495: 316, 316, 316, 316, 316, 507: 316, 510: 316, 600: 316, 607: 316, 613: 316, 662: 316, 316, 316, 666: 316, 763: 4648, 765: 4650, 898: 4651}, + {312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 57: 312, 312, 491: 312, 495: 312, 312, 312, 312, 312, 507: 312, 510: 312, 600: 312, 607: 312, 613: 312, 662: 312, 312, 312, 666: 312, 763: 312, 765: 312}, + {311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 57: 311, 311, 491: 311, 495: 311, 311, 311, 311, 311, 507: 311, 510: 311, 600: 311, 607: 311, 613: 311, 662: 311, 311, 311, 666: 311, 763: 311, 765: 311}, + {310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 57: 310, 310, 491: 310, 495: 310, 310, 310, 310, 310, 507: 310, 510: 310, 600: 310, 607: 310, 613: 310, 662: 310, 310, 310, 666: 310, 763: 310, 765: 310}, + {308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 57: 308, 308, 491: 308, 495: 308, 308, 308, 308, 308, 507: 308, 510: 308, 600: 308, 607: 308, 613: 308, 662: 308, 308, 308, 666: 308, 763: 308, 765: 308}, // 2040 - {346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 50: 346, 475: 346, 479: 346, 346, 346, 346, 487: 346, 491: 346, 495: 346, 584: 346, 593: 346, 346, 645: 346, 346, 346, 346}, - {285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 16: 3862, 50: 285, 475: 285, 479: 285, 285, 285, 285, 487: 285, 491: 285, 495: 285, 508: 3863, 533: 3859, 584: 285, 593: 285, 285, 645: 285, 285, 285, 285, 650: 3861, 779: 3860, 803: 4599}, - {347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 50: 347, 475: 347, 479: 347, 347, 347, 347, 487: 347, 491: 347, 495: 347, 584: 347, 593: 347, 347, 645: 347, 347, 347, 347}, - {285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 16: 3862, 50: 285, 475: 285, 479: 285, 285, 285, 285, 487: 285, 491: 285, 495: 285, 508: 3863, 533: 3859, 584: 285, 593: 285, 285, 645: 285, 285, 285, 285, 650: 3861, 779: 3860, 803: 4602}, - {348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 50: 348, 475: 348, 479: 348, 348, 348, 348, 487: 348, 491: 348, 495: 348, 584: 348, 593: 348, 348, 645: 348, 348, 348, 348}, + {317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 58: 317, 491: 317, 495: 317, 317, 317, 317, 317, 507: 317, 510: 317, 600: 317, 607: 317, 613: 317, 662: 317, 317, 317, 666: 317}, + {318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 58: 318, 491: 318, 495: 318, 318, 318, 318, 318, 507: 318, 510: 318, 600: 318, 607: 318, 613: 318, 662: 318, 318, 318, 666: 318}, + {319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 58: 319, 491: 319, 495: 319, 319, 319, 319, 319, 507: 319, 510: 319, 600: 319, 607: 319, 613: 319, 662: 319, 319, 319, 666: 319}, + {327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 16: 327, 58: 327, 116: 327, 327, 130: 327, 491: 327, 495: 327, 327, 327, 327, 327, 507: 327, 510: 327, 514: 327, 549: 327, 600: 327, 607: 327, 613: 327, 662: 327, 327, 327, 666: 327, 327}, + {332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 58: 332, 491: 332, 495: 332, 332, 332, 332, 332, 507: 332, 510: 332, 600: 332, 607: 332, 613: 332, 662: 332, 332, 332, 666: 332}, // 2045 - {349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 50: 349, 475: 349, 479: 349, 349, 349, 349, 487: 349, 491: 349, 495: 349, 584: 349, 593: 349, 349, 645: 349, 349, 349, 349}, - {285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 16: 3862, 50: 285, 475: 285, 479: 285, 285, 285, 285, 487: 285, 491: 285, 495: 285, 508: 3863, 533: 3859, 584: 285, 593: 285, 285, 645: 285, 285, 285, 285, 650: 3861, 779: 3860, 803: 4605}, - {350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 50: 350, 475: 350, 479: 350, 350, 350, 350, 487: 350, 491: 350, 495: 350, 584: 350, 593: 350, 350, 645: 350, 350, 350, 350}, - {351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 50: 351, 475: 351, 479: 351, 351, 351, 351, 487: 351, 491: 351, 495: 351, 584: 351, 593: 351, 351, 645: 351, 351, 351, 351}, - {353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 50: 353, 52: 353, 475: 353, 353, 479: 353, 353, 353, 353, 487: 353, 491: 353, 495: 353, 584: 353, 593: 353, 353, 645: 353, 353, 353, 353, 744: 353, 747: 353}, + {349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 16: 349, 58: 349, 491: 349, 349, 495: 349, 349, 349, 349, 349, 507: 349, 510: 349, 514: 349, 549: 349, 600: 349, 607: 349, 613: 349, 662: 349, 349, 349, 666: 349, 349, 866: 4662}, + {348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 16: 348, 58: 348, 491: 348, 348, 495: 348, 348, 348, 348, 348, 507: 348, 510: 348, 514: 348, 549: 348, 600: 348, 607: 348, 613: 348, 662: 348, 348, 348, 666: 348, 348, 866: 4661}, + {492: 343}, + {492: 342}, + {492: 337}, // 2050 - {376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 50: 376, 475: 376, 479: 376, 376, 376, 376, 487: 376, 491: 376, 495: 376, 584: 376, 593: 376, 376, 645: 376, 376, 376, 376}, - {293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 50: 293, 52: 293, 475: 293, 479: 293, 293, 293, 293, 487: 293, 491: 293, 495: 293, 584: 293, 593: 293, 293, 645: 293, 293, 293, 293, 744: 293, 747: 293, 880: 4609}, - {377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 50: 377, 52: 4550, 475: 377, 479: 377, 377, 377, 377, 487: 377, 491: 377, 495: 377, 584: 377, 593: 377, 377, 645: 377, 377, 377, 377, 744: 4549, 747: 4551, 879: 4552}, - {293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 50: 293, 52: 293, 475: 293, 479: 293, 293, 293, 293, 487: 293, 491: 293, 495: 293, 584: 293, 593: 293, 293, 645: 293, 293, 293, 293, 744: 293, 747: 293, 880: 4611}, - {378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 50: 378, 52: 4550, 475: 378, 479: 378, 378, 378, 378, 487: 378, 491: 378, 495: 378, 584: 378, 593: 378, 378, 645: 378, 378, 378, 378, 744: 4549, 747: 4551, 879: 4552}, + {492: 338}, + {492: 340}, + {492: 339}, + {492: 336}, + {346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 16: 346, 58: 346, 116: 346, 346, 130: 346, 491: 346, 346, 495: 346, 346, 346, 346, 346, 507: 346, 510: 346, 514: 346, 549: 346, 600: 346, 607: 346, 613: 346, 662: 346, 346, 346, 666: 346, 346}, // 2055 - {379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 50: 379, 52: 4550, 475: 379, 479: 379, 379, 379, 379, 487: 379, 491: 379, 495: 379, 584: 379, 593: 379, 379, 645: 379, 379, 379, 379, 744: 4549, 747: 4551, 879: 4552}, - {293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 50: 293, 52: 293, 475: 293, 479: 293, 293, 293, 293, 487: 293, 491: 293, 495: 293, 584: 293, 593: 293, 293, 645: 293, 293, 293, 293, 744: 293, 747: 293, 880: 4614}, - {380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 50: 380, 52: 4550, 475: 380, 479: 380, 380, 380, 380, 487: 380, 491: 380, 495: 380, 584: 380, 593: 380, 380, 645: 380, 380, 380, 380, 744: 4549, 747: 4551, 879: 4552}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 584: 2425, 593: 2425, 2425, 645: 2425, 652: 2425, 664: 4754, 2785, 2786, 2784, 678: 2425, 2425, 1152: 4753}, - {2355, 2355, 2355, 2355, 2355, 2355, 9: 2355, 2355, 2355, 50: 2355, 491: 2355}, + {347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 16: 347, 58: 347, 116: 347, 347, 130: 347, 491: 347, 347, 495: 347, 347, 347, 347, 347, 507: 347, 510: 347, 514: 347, 549: 347, 600: 347, 607: 347, 613: 347, 662: 347, 347, 347, 666: 347, 347}, + {301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 16: 3942, 58: 301, 116: 4674, 4676, 130: 4675, 491: 301, 495: 301, 301, 301, 301, 301, 507: 301, 510: 301, 514: 3943, 549: 3939, 600: 301, 607: 301, 613: 301, 662: 301, 301, 301, 666: 301, 3941, 798: 3940, 821: 4673, 907: 4677}, + {353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 58: 353, 491: 353, 495: 353, 353, 353, 353, 353, 507: 353, 510: 353, 600: 353, 607: 353, 613: 353, 662: 353, 353, 353, 666: 353}, + {526: 3945, 866: 4667}, + {526: 3944, 866: 4666}, // 2060 - {584: 2332}, - {495: 4752}, - {2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 50: 2322, 475: 2322, 479: 2322, 2322, 2322, 2322, 487: 2322, 491: 2322, 495: 2322, 584: 2322, 593: 2322, 2322, 645: 2322, 2322, 2322, 2322}, - {2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 50: 2321, 475: 2321, 479: 2321, 2321, 2321, 2321, 487: 2321, 491: 2321, 495: 2321, 584: 2321, 593: 2321, 2321, 645: 2321, 2321, 2321, 2321}, - {584: 4748}, + {329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 58: 329, 491: 329, 495: 329, 329, 329, 329, 329, 507: 329, 510: 329, 600: 329, 607: 329, 613: 329, 662: 329, 329, 329, 666: 329}, + {324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 58: 324, 491: 324, 495: 324, 324, 324, 324, 324, 507: 324, 510: 324, 600: 324, 607: 324, 613: 324, 662: 324, 324, 324, 666: 324}, + {323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 58: 323, 491: 323, 495: 323, 323, 323, 323, 323, 507: 323, 510: 323, 600: 323, 607: 323, 613: 323, 662: 323, 323, 323, 666: 323}, + {322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 58: 322, 491: 322, 495: 322, 322, 322, 322, 322, 507: 322, 510: 322, 600: 322, 607: 322, 613: 322, 662: 322, 322, 322, 666: 322}, + {321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 58: 321, 491: 321, 495: 321, 321, 321, 321, 321, 507: 321, 510: 321, 600: 321, 607: 321, 613: 321, 662: 321, 321, 321, 666: 321}, // 2065 - {2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318, 50: 2318, 475: 2318, 479: 2318, 2318, 2318, 2318, 487: 2318, 491: 2318, 495: 2318, 584: 4747, 593: 2318, 2318, 645: 2318, 2318, 2318, 2318}, - {130: 4735, 273: 4737, 364: 4738, 476: 4734, 478: 3265, 488: 4470, 4471, 495: 3256, 511: 3260, 574: 3255, 3257, 3259, 3258, 579: 3263, 583: 3264, 588: 4722, 4719, 591: 4720, 4721, 595: 3262, 716: 4469, 3261, 4732, 904: 4733, 951: 4717, 4718, 4736, 1089: 4730, 1142: 4731, 1213: 4729}, - {482: 4727}, - {657: 4715}, - {478: 4714}, + {354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 58: 354, 491: 354, 495: 354, 354, 354, 354, 354, 507: 354, 510: 354, 600: 354, 607: 354, 613: 354, 662: 354, 354, 354, 666: 354}, + {494: 4680, 596: 4681, 598: 4682, 995: 4683, 1184: 4679}, + {9: 4685, 58: 4684}, + {9: 289, 58: 289}, + {9: 288, 58: 288}, // 2070 - {593: 4705}, - {481: 4698}, - {2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 50: 2310, 475: 2310, 479: 2310, 2310, 2310, 2310, 487: 2310, 491: 2310, 495: 2310, 584: 2310, 593: 2310, 2310, 645: 2310, 2310, 2310, 2310}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 533: 3515, 664: 3517, 2785, 2786, 2784, 742: 3514, 876: 4697}, - {182: 4695, 209: 4696, 482: 4694, 1198: 4693}, + {9: 287, 58: 287}, + {9: 286, 58: 286}, + {301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 16: 3942, 58: 301, 116: 4674, 4676, 130: 4675, 491: 301, 495: 301, 301, 301, 301, 301, 507: 301, 510: 301, 514: 3943, 549: 3939, 600: 301, 607: 301, 613: 301, 662: 301, 301, 301, 666: 301, 3941, 798: 3940, 821: 4673, 907: 4687}, + {494: 4680, 596: 4681, 598: 4682, 995: 4686}, + {9: 285, 58: 285}, // 2075 - {188: 4692, 250: 4691, 482: 4690, 1320: 4689}, - {2305, 2305, 2305, 2305, 2305, 2305, 2305, 2305, 2305, 2305, 2305, 2305, 2305, 2305, 2305, 50: 2305, 475: 2305, 4683, 479: 2305, 2305, 2305, 2305, 487: 2305, 491: 2305, 495: 2305, 584: 2305, 593: 2305, 2305, 645: 2305, 2305, 2305, 2305, 1188: 4682}, - {314: 4681}, - {2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291, 50: 2291, 475: 2291, 479: 2291, 2291, 2291, 2291, 487: 2291, 491: 2291, 495: 2291, 584: 2291, 593: 2291, 2291, 645: 2291, 2291, 2291, 2291}, - {2288, 2288, 2288, 2288, 2288, 2288, 4626, 4632, 4620, 2288, 2288, 2288, 4624, 4633, 4631, 50: 2288, 475: 4625, 479: 4115, 4114, 2296, 4623, 487: 4630, 491: 2288, 495: 4619, 584: 2333, 593: 2426, 4617, 645: 4622, 4615, 4637, 4634, 815: 4618, 837: 4627, 915: 4629, 933: 4680, 942: 4628, 961: 4621}, + {356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 58: 356, 491: 356, 495: 356, 356, 356, 356, 356, 507: 356, 510: 356, 600: 356, 607: 356, 613: 356, 662: 356, 356, 356, 666: 356}, + {494: 4680, 596: 4681, 598: 4682, 995: 4683, 1184: 4689}, + {9: 4685, 58: 4690}, + {301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 16: 3942, 58: 301, 116: 4674, 4676, 130: 4675, 491: 301, 495: 301, 301, 301, 301, 301, 507: 301, 510: 301, 514: 3943, 549: 3939, 600: 301, 607: 301, 613: 301, 662: 301, 301, 301, 666: 301, 3941, 798: 3940, 821: 4673, 907: 4691}, + {357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 58: 357, 491: 357, 495: 357, 357, 357, 357, 357, 507: 357, 510: 357, 600: 357, 607: 357, 613: 357, 662: 357, 357, 357, 666: 357}, // 2080 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 4638}, - {2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 50: 2228, 475: 2228, 4640, 479: 2228, 2228, 2228, 2228, 487: 2228, 491: 2228, 495: 2228, 584: 2228, 593: 2228, 2228, 645: 2228, 2228, 2228, 2228, 651: 2228, 1241: 4639}, - {2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 50: 2278, 475: 2278, 479: 2278, 2278, 2278, 2278, 487: 2278, 491: 2278, 495: 2278, 584: 2278, 593: 2278, 2278, 645: 2278, 2278, 2278, 2278, 651: 4655, 1258: 4656, 4657}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 4644, 664: 4169, 2785, 2786, 2784, 748: 4643, 831: 4642, 841: 4641}, - {9: 4653, 50: 4652}, + {358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 58: 358, 491: 358, 495: 358, 358, 358, 358, 358, 507: 358, 510: 358, 600: 358, 607: 358, 613: 358, 662: 358, 358, 358, 666: 358}, + {360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 58: 360, 491: 360, 495: 360, 360, 360, 360, 360, 507: 360, 510: 360, 600: 360, 607: 360, 613: 360, 662: 360, 360, 360, 666: 360}, + {361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 58: 361, 491: 361, 495: 361, 361, 361, 361, 361, 507: 361, 510: 361, 600: 361, 607: 361, 613: 361, 662: 361, 361, 361, 666: 361}, + {301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 16: 3942, 58: 301, 491: 301, 495: 301, 301, 301, 301, 301, 507: 301, 510: 301, 514: 3943, 549: 3939, 600: 301, 607: 301, 613: 301, 662: 301, 301, 301, 666: 301, 3941, 798: 3940, 821: 4696}, + {362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 58: 362, 491: 362, 495: 362, 362, 362, 362, 362, 507: 362, 510: 362, 600: 362, 607: 362, 613: 362, 662: 362, 362, 362, 666: 362}, // 2085 - {9: 2226, 50: 2226}, - {9: 298, 50: 298, 476: 3852, 532: 298, 534: 298, 768: 3853, 794: 4650}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4645}, - {50: 4646, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {9: 1314, 50: 1314, 532: 4649, 534: 4648, 954: 4647}, + {301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 16: 3942, 58: 301, 491: 301, 495: 301, 301, 301, 301, 301, 507: 301, 510: 301, 514: 3943, 549: 3939, 600: 301, 607: 301, 613: 301, 662: 301, 301, 301, 666: 301, 3941, 798: 3940, 821: 4698}, + {363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 58: 363, 491: 363, 495: 363, 363, 363, 363, 363, 507: 363, 510: 363, 600: 363, 607: 363, 613: 363, 662: 363, 363, 363, 666: 363}, + {301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 16: 3942, 58: 301, 491: 301, 495: 301, 301, 301, 301, 301, 507: 301, 510: 301, 514: 3943, 549: 3939, 600: 301, 607: 301, 613: 301, 662: 301, 301, 301, 666: 301, 3941, 798: 3940, 821: 4701}, + {364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 58: 364, 491: 364, 495: 364, 364, 364, 364, 364, 507: 364, 510: 364, 600: 364, 607: 364, 613: 364, 662: 364, 364, 364, 666: 364}, + {365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 58: 365, 491: 365, 495: 365, 365, 365, 365, 365, 507: 365, 510: 365, 600: 365, 607: 365, 613: 365, 662: 365, 365, 365, 666: 365}, // 2090 - {9: 2223, 50: 2223}, - {1313, 1313, 1313, 1313, 1313, 1313, 9: 1313, 50: 1313, 491: 1313}, - {1312, 1312, 1312, 1312, 1312, 1312, 9: 1312, 50: 1312, 491: 1312}, - {9: 1314, 50: 1314, 532: 4649, 534: 4648, 954: 4651}, - {9: 2224, 50: 2224}, + {301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 16: 3942, 58: 301, 491: 301, 495: 301, 301, 301, 301, 301, 507: 301, 510: 301, 514: 3943, 549: 3939, 600: 301, 607: 301, 613: 301, 662: 301, 301, 301, 666: 301, 3941, 798: 3940, 821: 4704}, + {366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 58: 366, 491: 366, 495: 366, 366, 366, 366, 366, 507: 366, 510: 366, 600: 366, 607: 366, 613: 366, 662: 366, 366, 366, 666: 366}, + {367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 58: 367, 491: 367, 495: 367, 367, 367, 367, 367, 507: 367, 510: 367, 600: 367, 607: 367, 613: 367, 662: 367, 367, 367, 666: 367}, + {369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 57: 369, 369, 491: 369, 369, 495: 369, 369, 369, 369, 369, 507: 369, 510: 369, 600: 369, 607: 369, 613: 369, 662: 369, 369, 369, 666: 369, 763: 369, 765: 369}, + {392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 58: 392, 491: 392, 495: 392, 392, 392, 392, 392, 507: 392, 510: 392, 600: 392, 607: 392, 613: 392, 662: 392, 392, 392, 666: 392}, // 2095 - {2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 50: 2227, 475: 2227, 479: 2227, 2227, 2227, 2227, 487: 2227, 491: 2227, 495: 2227, 584: 2227, 593: 2227, 2227, 645: 2227, 2227, 2227, 2227, 651: 2227}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 4644, 664: 4169, 2785, 2786, 2784, 748: 4643, 831: 4654}, - {9: 2225, 50: 2225}, - {213: 4677, 371: 4678, 389: 4679}, - {2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 50: 2277, 475: 2277, 479: 2277, 2277, 2277, 2277, 487: 2277, 491: 2277, 495: 2277, 584: 2277, 593: 2277, 2277, 645: 2277, 2277, 2277, 2277}, + {309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 57: 309, 309, 491: 309, 495: 309, 309, 309, 309, 309, 507: 309, 510: 309, 600: 309, 607: 309, 613: 309, 662: 309, 309, 309, 666: 309, 763: 309, 765: 309, 899: 4708}, + {393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 57: 4649, 393, 491: 393, 495: 393, 393, 393, 393, 393, 507: 393, 510: 393, 600: 393, 607: 393, 613: 393, 662: 393, 393, 393, 666: 393, 763: 4648, 765: 4650, 898: 4651}, + {309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 57: 309, 309, 491: 309, 495: 309, 309, 309, 309, 309, 507: 309, 510: 309, 600: 309, 607: 309, 613: 309, 662: 309, 309, 309, 666: 309, 763: 309, 765: 309, 899: 4710}, + {394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 57: 4649, 394, 491: 394, 495: 394, 394, 394, 394, 394, 507: 394, 510: 394, 600: 394, 607: 394, 613: 394, 662: 394, 394, 394, 666: 394, 763: 4648, 765: 4650, 898: 4651}, + {395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 57: 4649, 395, 491: 395, 495: 395, 395, 395, 395, 395, 507: 395, 510: 395, 600: 395, 607: 395, 613: 395, 662: 395, 395, 395, 666: 395, 763: 4648, 765: 4650, 898: 4651}, // 2100 - {2273, 2273, 2273, 2273, 2273, 2273, 2273, 2273, 2273, 2273, 2273, 2273, 2273, 2273, 2273, 50: 2273, 475: 4659, 479: 2273, 2273, 2273, 2273, 487: 2273, 491: 2273, 495: 2273, 584: 2273, 593: 2273, 2273, 645: 2273, 2273, 2273, 2273, 1095: 4660, 4661, 1267: 4658}, - {2276, 2276, 2276, 2276, 2276, 2276, 2276, 2276, 2276, 2276, 2276, 2276, 2276, 2276, 2276, 50: 2276, 475: 2276, 479: 2276, 2276, 2276, 2276, 487: 2276, 491: 2276, 495: 2276, 584: 2276, 593: 2276, 2276, 645: 2276, 2276, 2276, 2276}, - {657: 4675, 743: 4664}, - {2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 50: 2272, 475: 4673, 479: 2272, 2272, 2272, 2272, 487: 2272, 491: 2272, 495: 2272, 584: 2272, 593: 2272, 2272, 645: 2272, 2272, 2272, 2272, 1096: 4674}, - {2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 50: 2271, 475: 4662, 479: 2271, 2271, 2271, 2271, 487: 2271, 491: 2271, 495: 2271, 584: 2271, 593: 2271, 2271, 645: 2271, 2271, 2271, 2271, 1095: 4663}, + {309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 57: 309, 309, 491: 309, 495: 309, 309, 309, 309, 309, 507: 309, 510: 309, 600: 309, 607: 309, 613: 309, 662: 309, 309, 309, 666: 309, 763: 309, 765: 309, 899: 4713}, + {396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 57: 4649, 396, 491: 396, 495: 396, 396, 396, 396, 396, 507: 396, 510: 396, 600: 396, 607: 396, 613: 396, 662: 396, 396, 396, 666: 396, 763: 4648, 765: 4650, 898: 4651}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 600: 2473, 607: 2473, 613: 2473, 662: 2473, 668: 2473, 685: 4858, 2849, 688: 2850, 2848, 696: 2473, 2473, 1177: 4857}, + {2403, 2403, 2403, 2403, 2403, 2403, 9: 2403, 2403, 2403, 58: 2403, 507: 2403}, + {600: 2380}, // 2105 - {743: 4664}, - {2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 50: 2269, 475: 2269, 479: 2269, 2269, 2269, 2269, 487: 2269, 491: 2269, 495: 2269, 584: 2269, 593: 2269, 2269, 645: 2269, 2269, 2269, 2269}, - {73: 4669, 509: 4668, 673: 4667, 675: 4666, 1119: 4665}, - {2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275, 50: 2275, 475: 2275, 479: 2275, 2275, 2275, 2275, 487: 2275, 491: 2275, 495: 2275, 584: 2275, 593: 2275, 2275, 645: 2275, 2275, 2275, 2275}, - {2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 50: 2268, 475: 2268, 479: 2268, 2268, 2268, 2268, 487: 2268, 491: 2268, 495: 2268, 584: 2268, 593: 2268, 2268, 645: 2268, 2268, 2268, 2268}, + {510: 4856}, + {2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370, 58: 2370, 491: 2370, 495: 2370, 2370, 2370, 2370, 2370, 507: 2370, 510: 2370, 600: 2370, 607: 2370, 613: 2370, 662: 2370, 2370, 2370, 666: 2370}, + {2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369, 58: 2369, 491: 2369, 495: 2369, 2369, 2369, 2369, 2369, 507: 2369, 510: 2369, 600: 2369, 607: 2369, 613: 2369, 662: 2369, 2369, 2369, 666: 2369}, + {600: 4852}, + {2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366, 58: 2366, 491: 2366, 495: 2366, 2366, 2366, 2366, 2366, 507: 2366, 510: 2366, 600: 4851, 607: 2366, 613: 2366, 662: 2366, 2366, 2366, 666: 2366}, // 2110 - {2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 50: 2267, 475: 2267, 479: 2267, 2267, 2267, 2267, 487: 2267, 491: 2267, 495: 2267, 584: 2267, 593: 2267, 2267, 645: 2267, 2267, 2267, 2267}, - {482: 4672, 495: 4671}, - {310: 4670}, - {2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 50: 2265, 475: 2265, 479: 2265, 2265, 2265, 2265, 487: 2265, 491: 2265, 495: 2265, 584: 2265, 593: 2265, 2265, 645: 2265, 2265, 2265, 2265}, - {2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 50: 2266, 475: 2266, 479: 2266, 2266, 2266, 2266, 487: 2266, 491: 2266, 495: 2266, 584: 2266, 593: 2266, 2266, 645: 2266, 2266, 2266, 2266}, + {139: 4839, 284: 4841, 375: 4842, 492: 4838, 494: 3345, 504: 4569, 4570, 510: 3336, 525: 3340, 591: 3335, 3337, 3339, 3338, 596: 3343, 598: 3344, 605: 4824, 4823, 608: 4819, 4820, 611: 4821, 4822, 614: 3342, 734: 4568, 3341, 4836, 924: 4837, 957: 4818, 972: 4816, 4817, 4840, 1112: 4834, 1167: 4835, 1238: 4833}, + {496: 4831}, + {674: 4814}, + {494: 4813}, + {607: 4804}, // 2115 - {2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 50: 2264, 475: 2264, 479: 2264, 2264, 2264, 2264, 487: 2264, 491: 2264, 495: 2264, 584: 2264, 593: 2264, 2264, 645: 2264, 2264, 2264, 2264}, - {657: 4675}, - {2270, 2270, 2270, 2270, 2270, 2270, 2270, 2270, 2270, 2270, 2270, 2270, 2270, 2270, 2270, 50: 2270, 475: 2270, 479: 2270, 2270, 2270, 2270, 487: 2270, 491: 2270, 495: 2270, 584: 2270, 593: 2270, 2270, 645: 2270, 2270, 2270, 2270}, - {73: 4669, 509: 4668, 673: 4667, 675: 4666, 1119: 4676}, - {2274, 2274, 2274, 2274, 2274, 2274, 2274, 2274, 2274, 2274, 2274, 2274, 2274, 2274, 2274, 50: 2274, 475: 2274, 479: 2274, 2274, 2274, 2274, 487: 2274, 491: 2274, 495: 2274, 584: 2274, 593: 2274, 2274, 645: 2274, 2274, 2274, 2274}, + {498: 4797}, + {2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358, 2358, 58: 2358, 491: 2358, 495: 2358, 2358, 2358, 2358, 2358, 507: 2358, 510: 2358, 600: 2358, 607: 2358, 613: 2358, 662: 2358, 2358, 2358, 666: 2358}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 549: 3595, 685: 3597, 2849, 688: 2850, 2848, 760: 3594, 894: 4796}, + {191: 4794, 220: 4795, 496: 4793, 1223: 4792}, + {197: 4791, 261: 4790, 496: 4789, 1345: 4788}, // 2120 - {2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 50: 2281, 475: 2281, 479: 2281, 2281, 2281, 2281, 487: 2281, 491: 2281, 495: 2281, 584: 2281, 593: 2281, 2281, 645: 2281, 2281, 2281, 2281}, - {2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 50: 2280, 475: 2280, 479: 2280, 2280, 2280, 2280, 487: 2280, 491: 2280, 495: 2280, 584: 2280, 593: 2280, 2280, 645: 2280, 2280, 2280, 2280}, - {2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 50: 2279, 475: 2279, 479: 2279, 2279, 2279, 2279, 487: 2279, 491: 2279, 495: 2279, 584: 2279, 593: 2279, 2279, 645: 2279, 2279, 2279, 2279}, - {2290, 2290, 2290, 2290, 2290, 2290, 2290, 2290, 2290, 2290, 2290, 2290, 2290, 2290, 2290, 50: 2290, 475: 2290, 479: 2290, 2290, 2290, 2290, 487: 2290, 491: 2290, 495: 2290, 584: 2290, 593: 2290, 2290, 645: 2290, 2290, 2290, 2290}, - {481: 2295}, + {2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 58: 2353, 491: 2353, 4782, 495: 2353, 2353, 2353, 2353, 2353, 507: 2353, 510: 2353, 600: 2353, 607: 2353, 613: 2353, 662: 2353, 2353, 2353, 666: 2353, 1214: 4781}, + {326: 4780}, + {2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 58: 2339, 491: 2339, 495: 2339, 2339, 2339, 2339, 2339, 507: 2339, 510: 2339, 600: 2339, 607: 2339, 613: 2339, 662: 2339, 2339, 2339, 666: 2339}, + {2336, 2336, 2336, 2336, 2336, 2336, 4725, 4731, 4719, 2336, 2336, 2336, 4723, 4732, 4730, 58: 2336, 491: 4724, 495: 4197, 4722, 4196, 2344, 4729, 507: 2336, 510: 4718, 600: 2381, 607: 2474, 613: 4716, 662: 4721, 4714, 4736, 666: 4733, 834: 4717, 855: 4726, 935: 4728, 953: 4779, 963: 4727, 981: 4720}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4737}, // 2125 - {2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 50: 2306, 475: 2306, 479: 2306, 2306, 2306, 2306, 487: 2306, 491: 2306, 495: 2306, 584: 2306, 593: 2306, 2306, 645: 2306, 2306, 2306, 2306}, - {511: 2759, 737: 2758, 745: 4684}, - {9: 4686, 50: 4685}, - {2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304, 50: 2304, 475: 2304, 479: 2304, 2304, 2304, 2304, 487: 2304, 491: 2304, 495: 2304, 584: 2304, 593: 2304, 2304, 645: 2304, 2304, 2304, 2304}, - {511: 2759, 737: 2758, 745: 4687}, + {2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 58: 2272, 491: 2272, 4739, 495: 2272, 2272, 2272, 2272, 2272, 507: 2272, 510: 2272, 600: 2272, 607: 2272, 613: 2272, 662: 2272, 2272, 2272, 666: 2272, 669: 2272, 1266: 4738}, + {2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 58: 2326, 491: 2326, 495: 2326, 2326, 2326, 2326, 2326, 507: 2326, 510: 2326, 600: 2326, 607: 2326, 613: 2326, 662: 2326, 2326, 2326, 666: 2326, 669: 4754, 1283: 4755, 4756}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 4743, 685: 4255, 2849, 688: 2850, 2848, 766: 4742, 849: 4741, 859: 4740}, + {9: 4752, 58: 4751}, + {9: 2270, 58: 2270}, // 2130 - {50: 4688}, - {2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 50: 2303, 475: 2303, 479: 2303, 2303, 2303, 2303, 487: 2303, 491: 2303, 495: 2303, 584: 2303, 593: 2303, 2303, 645: 2303, 2303, 2303, 2303}, - {2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, 50: 2307, 475: 2307, 479: 2307, 2307, 2307, 2307, 487: 2307, 491: 2307, 495: 2307, 584: 2307, 593: 2307, 2307, 645: 2307, 2307, 2307, 2307}, - {2302, 2302, 2302, 2302, 2302, 2302, 2302, 2302, 2302, 2302, 2302, 2302, 2302, 2302, 2302, 50: 2302, 475: 2302, 479: 2302, 2302, 2302, 2302, 487: 2302, 491: 2302, 495: 2302, 584: 2302, 593: 2302, 2302, 645: 2302, 2302, 2302, 2302}, - {2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 50: 2301, 475: 2301, 479: 2301, 2301, 2301, 2301, 487: 2301, 491: 2301, 495: 2301, 584: 2301, 593: 2301, 2301, 645: 2301, 2301, 2301, 2301}, + {9: 314, 58: 314, 492: 3932, 548: 314, 561: 314, 786: 3933, 812: 4749}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4744}, + {58: 4745, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {9: 1339, 58: 1339, 548: 4748, 561: 4747, 975: 4746}, + {9: 2267, 58: 2267}, // 2135 - {2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 50: 2300, 475: 2300, 479: 2300, 2300, 2300, 2300, 487: 2300, 491: 2300, 495: 2300, 584: 2300, 593: 2300, 2300, 645: 2300, 2300, 2300, 2300}, - {2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 50: 2308, 475: 2308, 479: 2308, 2308, 2308, 2308, 487: 2308, 491: 2308, 495: 2308, 584: 2308, 593: 2308, 2308, 645: 2308, 2308, 2308, 2308}, - {2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299, 50: 2299, 475: 2299, 479: 2299, 2299, 2299, 2299, 487: 2299, 491: 2299, 495: 2299, 584: 2299, 593: 2299, 2299, 645: 2299, 2299, 2299, 2299}, - {2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 50: 2298, 475: 2298, 479: 2298, 2298, 2298, 2298, 487: 2298, 491: 2298, 495: 2298, 584: 2298, 593: 2298, 2298, 645: 2298, 2298, 2298, 2298}, - {2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297, 50: 2297, 475: 2297, 479: 2297, 2297, 2297, 2297, 487: 2297, 491: 2297, 495: 2297, 584: 2297, 593: 2297, 2297, 645: 2297, 2297, 2297, 2297}, + {1338, 1338, 1338, 1338, 1338, 1338, 9: 1338, 58: 1338, 507: 1338}, + {1337, 1337, 1337, 1337, 1337, 1337, 9: 1337, 58: 1337, 507: 1337}, + {9: 1339, 58: 1339, 548: 4748, 561: 4747, 975: 4750}, + {9: 2268, 58: 2268}, + {2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 58: 2271, 491: 2271, 495: 2271, 2271, 2271, 2271, 2271, 507: 2271, 510: 2271, 600: 2271, 607: 2271, 613: 2271, 662: 2271, 2271, 2271, 666: 2271, 669: 2271}, // 2140 - {2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309, 50: 2309, 475: 2309, 479: 2309, 2309, 2309, 2309, 487: 2309, 491: 2309, 495: 2309, 584: 2309, 593: 2309, 2309, 645: 2309, 2309, 2309, 2309}, - {476: 4699}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4700}, - {50: 4701, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {2294, 2294, 2294, 2294, 2294, 2294, 2294, 2294, 2294, 2294, 2294, 2294, 2294, 2294, 2294, 50: 2294, 475: 2294, 479: 2294, 2294, 2294, 2294, 487: 2294, 491: 2294, 495: 2294, 584: 2294, 593: 2294, 2294, 645: 2294, 2294, 2294, 2294, 1321: 4704, 1351: 4703, 4702}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 4743, 685: 4255, 2849, 688: 2850, 2848, 766: 4742, 849: 4753}, + {9: 2269, 58: 2269}, + {224: 4776, 382: 4777, 401: 4778}, + {2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 58: 2325, 491: 2325, 495: 2325, 2325, 2325, 2325, 2325, 507: 2325, 510: 2325, 600: 2325, 607: 2325, 613: 2325, 662: 2325, 2325, 2325, 666: 2325}, + {2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 58: 2321, 491: 4758, 495: 2321, 2321, 2321, 2321, 2321, 507: 2321, 510: 2321, 600: 2321, 607: 2321, 613: 2321, 662: 2321, 2321, 2321, 666: 2321, 1118: 4759, 4760, 1292: 4757}, // 2145 - {2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311, 50: 2311, 475: 2311, 479: 2311, 2311, 2311, 2311, 487: 2311, 491: 2311, 495: 2311, 584: 2311, 593: 2311, 2311, 645: 2311, 2311, 2311, 2311}, - {2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293, 50: 2293, 475: 2293, 479: 2293, 2293, 2293, 2293, 487: 2293, 491: 2293, 495: 2293, 584: 2293, 593: 2293, 2293, 645: 2293, 2293, 2293, 2293}, - {2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 50: 2292, 475: 2292, 479: 2292, 2292, 2292, 2292, 487: 2292, 491: 2292, 495: 2292, 584: 2292, 593: 2292, 2292, 645: 2292, 2292, 2292, 2292}, - {476: 4706}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4707}, + {2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 58: 2324, 491: 2324, 495: 2324, 2324, 2324, 2324, 2324, 507: 2324, 510: 2324, 600: 2324, 607: 2324, 613: 2324, 662: 2324, 2324, 2324, 666: 2324}, + {674: 4774, 761: 4763}, + {2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 58: 2320, 491: 4772, 495: 2320, 2320, 2320, 2320, 2320, 507: 2320, 510: 2320, 600: 2320, 607: 2320, 613: 2320, 662: 2320, 2320, 2320, 666: 2320, 1119: 4773}, + {2319, 2319, 2319, 2319, 2319, 2319, 2319, 2319, 2319, 2319, 2319, 2319, 2319, 2319, 2319, 58: 2319, 491: 4761, 495: 2319, 2319, 2319, 2319, 2319, 507: 2319, 510: 2319, 600: 2319, 607: 2319, 613: 2319, 662: 2319, 2319, 2319, 666: 2319, 1118: 4762}, + {761: 4763}, // 2150 - {50: 4708, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 50: 2327, 152: 4459, 475: 2327, 479: 4115, 4114, 2327, 2327, 487: 2327, 491: 2327, 495: 2327, 584: 2327, 593: 2327, 2327, 645: 2327, 2327, 2327, 2327, 815: 4709, 939: 4710, 1045: 4711, 1217: 4712}, - {152: 4461, 495: 4713}, - {2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 50: 2326, 475: 2326, 479: 2326, 2326, 2326, 2326, 487: 2326, 491: 2326, 495: 2326, 584: 2326, 593: 2326, 2326, 645: 2326, 2326, 2326, 2326}, - {2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 50: 2324, 475: 2324, 479: 2324, 2324, 2324, 2324, 487: 2324, 491: 2324, 495: 2324, 584: 2324, 593: 2324, 2324, 645: 2324, 2324, 2324, 2324}, + {2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 58: 2317, 491: 2317, 495: 2317, 2317, 2317, 2317, 2317, 507: 2317, 510: 2317, 600: 2317, 607: 2317, 613: 2317, 662: 2317, 2317, 2317, 666: 2317}, + {79: 4768, 526: 4767, 691: 4766, 693: 4765, 1142: 4764}, + {2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 58: 2323, 491: 2323, 495: 2323, 2323, 2323, 2323, 2323, 507: 2323, 510: 2323, 600: 2323, 607: 2323, 613: 2323, 662: 2323, 2323, 2323, 666: 2323}, + {2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 58: 2316, 491: 2316, 495: 2316, 2316, 2316, 2316, 2316, 507: 2316, 510: 2316, 600: 2316, 607: 2316, 613: 2316, 662: 2316, 2316, 2316, 666: 2316}, + {2315, 2315, 2315, 2315, 2315, 2315, 2315, 2315, 2315, 2315, 2315, 2315, 2315, 2315, 2315, 58: 2315, 491: 2315, 495: 2315, 2315, 2315, 2315, 2315, 507: 2315, 510: 2315, 600: 2315, 607: 2315, 613: 2315, 662: 2315, 2315, 2315, 666: 2315}, // 2155 - {2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 50: 2312, 475: 2312, 479: 2312, 2312, 2312, 2312, 487: 2312, 491: 2312, 495: 2312, 584: 2312, 593: 2312, 2312, 645: 2312, 2312, 2312, 2312}, - {2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 50: 2325, 475: 2325, 479: 2325, 2325, 2325, 2325, 487: 2325, 491: 2325, 495: 2325, 584: 2325, 593: 2325, 2325, 645: 2325, 2325, 2325, 2325}, - {2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 50: 2313, 475: 2313, 479: 2313, 2313, 2313, 2313, 487: 2313, 491: 2313, 495: 2313, 584: 2313, 593: 2313, 2313, 645: 2313, 2313, 2313, 2313}, - {588: 4722, 4719, 591: 4720, 4721, 951: 4717, 4718, 4716}, - {2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 50: 2314, 475: 2314, 479: 2314, 2314, 2314, 2314, 487: 2314, 491: 2314, 495: 2314, 584: 2314, 593: 2314, 2314, 645: 2314, 2314, 2314, 2314}, + {496: 4771, 510: 4770}, + {322: 4769}, + {2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 58: 2313, 491: 2313, 495: 2313, 2313, 2313, 2313, 2313, 507: 2313, 510: 2313, 600: 2313, 607: 2313, 613: 2313, 662: 2313, 2313, 2313, 666: 2313}, + {2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 58: 2314, 491: 2314, 495: 2314, 2314, 2314, 2314, 2314, 507: 2314, 510: 2314, 600: 2314, 607: 2314, 613: 2314, 662: 2314, 2314, 2314, 666: 2314}, + {2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 58: 2312, 491: 2312, 495: 2312, 2312, 2312, 2312, 2312, 507: 2312, 510: 2312, 600: 2312, 607: 2312, 613: 2312, 662: 2312, 2312, 2312, 666: 2312}, // 2160 - {2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 50: 2254, 475: 2254, 479: 2254, 2254, 2254, 2254, 487: 2254, 491: 2254, 495: 2254, 584: 2254, 593: 2254, 2254, 645: 2254, 2254, 2254, 2254}, - {476: 4723}, - {2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 50: 2245, 475: 2245, 2249, 479: 2245, 2245, 2245, 2245, 487: 2245, 491: 2245, 495: 2245, 584: 2245, 593: 2245, 2245, 645: 2245, 2245, 2245, 2245}, - {2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 50: 2244, 475: 2244, 2248, 479: 2244, 2244, 2244, 2244, 487: 2244, 491: 2244, 495: 2244, 584: 2244, 593: 2244, 2244, 645: 2244, 2244, 2244, 2244}, - {2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 50: 2243, 475: 2243, 2247, 479: 2243, 2243, 2243, 2243, 487: 2243, 491: 2243, 495: 2243, 584: 2243, 593: 2243, 2243, 645: 2243, 2243, 2243, 2243}, + {674: 4774}, + {2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318, 58: 2318, 491: 2318, 495: 2318, 2318, 2318, 2318, 2318, 507: 2318, 510: 2318, 600: 2318, 607: 2318, 613: 2318, 662: 2318, 2318, 2318, 666: 2318}, + {79: 4768, 526: 4767, 691: 4766, 693: 4765, 1142: 4775}, + {2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 58: 2322, 491: 2322, 495: 2322, 2322, 2322, 2322, 2322, 507: 2322, 510: 2322, 600: 2322, 607: 2322, 613: 2322, 662: 2322, 2322, 2322, 666: 2322}, + {2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 58: 2329, 491: 2329, 495: 2329, 2329, 2329, 2329, 2329, 507: 2329, 510: 2329, 600: 2329, 607: 2329, 613: 2329, 662: 2329, 2329, 2329, 666: 2329}, // 2165 - {476: 2246}, - {50: 4724, 511: 2759, 737: 4725}, - {2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 50: 2253, 475: 2253, 479: 2253, 2253, 2253, 2253, 487: 2253, 491: 2253, 495: 2253, 584: 2253, 593: 2253, 2253, 645: 2253, 2253, 2253, 2253}, - {50: 4726}, - {2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 50: 2252, 475: 2252, 479: 2252, 2252, 2252, 2252, 487: 2252, 491: 2252, 495: 2252, 584: 2252, 593: 2252, 2252, 645: 2252, 2252, 2252, 2252}, + {2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 58: 2328, 491: 2328, 495: 2328, 2328, 2328, 2328, 2328, 507: 2328, 510: 2328, 600: 2328, 607: 2328, 613: 2328, 662: 2328, 2328, 2328, 666: 2328}, + {2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 58: 2327, 491: 2327, 495: 2327, 2327, 2327, 2327, 2327, 507: 2327, 510: 2327, 600: 2327, 607: 2327, 613: 2327, 662: 2327, 2327, 2327, 666: 2327}, + {2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 58: 2338, 491: 2338, 495: 2338, 2338, 2338, 2338, 2338, 507: 2338, 510: 2338, 600: 2338, 607: 2338, 613: 2338, 662: 2338, 2338, 2338, 666: 2338}, + {498: 2343}, + {2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 58: 2354, 491: 2354, 495: 2354, 2354, 2354, 2354, 2354, 507: 2354, 510: 2354, 600: 2354, 607: 2354, 613: 2354, 662: 2354, 2354, 2354, 666: 2354}, // 2170 - {160: 4728}, - {2315, 2315, 2315, 2315, 2315, 2315, 2315, 2315, 2315, 2315, 2315, 2315, 2315, 2315, 2315, 50: 2315, 475: 2315, 479: 2315, 2315, 2315, 2315, 487: 2315, 491: 2315, 495: 2315, 584: 2315, 593: 2315, 2315, 645: 2315, 2315, 2315, 2315}, - {2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 50: 2316, 475: 2316, 479: 2316, 2316, 2316, 2316, 487: 2316, 491: 2316, 495: 2316, 584: 2316, 593: 2316, 2316, 645: 2316, 2316, 2316, 2316}, - {2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 50: 2263, 475: 2263, 479: 2263, 2263, 2263, 2263, 487: 2263, 491: 2263, 495: 2263, 584: 2263, 593: 2263, 2263, 645: 2263, 2263, 2263, 2263}, - {2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 50: 2262, 475: 2262, 479: 2262, 2262, 2262, 2262, 487: 2262, 491: 2262, 495: 2262, 584: 2262, 593: 2262, 2262, 645: 2262, 2262, 2262, 2262}, + {525: 2823, 755: 2822, 762: 4783}, + {9: 4785, 58: 4784}, + {2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 2352, 58: 2352, 491: 2352, 495: 2352, 2352, 2352, 2352, 2352, 507: 2352, 510: 2352, 600: 2352, 607: 2352, 613: 2352, 662: 2352, 2352, 2352, 666: 2352}, + {525: 2823, 755: 2822, 762: 4786}, + {58: 4787}, // 2175 - {2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 50: 2261, 475: 2261, 479: 2261, 2261, 2261, 2261, 487: 2261, 491: 2261, 495: 2261, 584: 2261, 593: 2261, 2261, 645: 2261, 2261, 2261, 2261}, - {2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 50: 2260, 475: 2260, 479: 2260, 2260, 2260, 2260, 487: 2260, 491: 2260, 495: 2260, 584: 2260, 593: 2260, 2260, 645: 2260, 2260, 2260, 2260}, - {130: 4735, 476: 4734, 588: 4722, 4719, 591: 4720, 4721, 904: 4743, 951: 4717, 4718, 4736, 1089: 4744}, - {476: 4739}, - {2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 50: 2255, 475: 2255, 479: 2255, 2255, 2255, 2255, 487: 2255, 491: 2255, 495: 2255, 584: 2255, 593: 2255, 2255, 645: 2255, 2255, 2255, 2255}, + {2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 58: 2351, 491: 2351, 495: 2351, 2351, 2351, 2351, 2351, 507: 2351, 510: 2351, 600: 2351, 607: 2351, 613: 2351, 662: 2351, 2351, 2351, 666: 2351}, + {2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355, 58: 2355, 491: 2355, 495: 2355, 2355, 2355, 2355, 2355, 507: 2355, 510: 2355, 600: 2355, 607: 2355, 613: 2355, 662: 2355, 2355, 2355, 666: 2355}, + {2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350, 58: 2350, 491: 2350, 495: 2350, 2350, 2350, 2350, 2350, 507: 2350, 510: 2350, 600: 2350, 607: 2350, 613: 2350, 662: 2350, 2350, 2350, 666: 2350}, + {2349, 2349, 2349, 2349, 2349, 2349, 2349, 2349, 2349, 2349, 2349, 2349, 2349, 2349, 2349, 58: 2349, 491: 2349, 495: 2349, 2349, 2349, 2349, 2349, 507: 2349, 510: 2349, 600: 2349, 607: 2349, 613: 2349, 662: 2349, 2349, 2349, 666: 2349}, + {2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348, 58: 2348, 491: 2348, 495: 2348, 2348, 2348, 2348, 2348, 507: 2348, 510: 2348, 600: 2348, 607: 2348, 613: 2348, 662: 2348, 2348, 2348, 666: 2348}, // 2180 - {160: 4205}, - {476: 4202}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 4740, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3614, 782: 4741}, - {2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 50: 2258, 475: 2258, 479: 2258, 2258, 2258, 2258, 487: 2258, 491: 2258, 495: 2258, 584: 2258, 593: 2258, 2258, 645: 2258, 2258, 2258, 2258}, - {9: 3616, 50: 4742}, + {2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 58: 2356, 491: 2356, 495: 2356, 2356, 2356, 2356, 2356, 507: 2356, 510: 2356, 600: 2356, 607: 2356, 613: 2356, 662: 2356, 2356, 2356, 666: 2356}, + {2347, 2347, 2347, 2347, 2347, 2347, 2347, 2347, 2347, 2347, 2347, 2347, 2347, 2347, 2347, 58: 2347, 491: 2347, 495: 2347, 2347, 2347, 2347, 2347, 507: 2347, 510: 2347, 600: 2347, 607: 2347, 613: 2347, 662: 2347, 2347, 2347, 666: 2347}, + {2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346, 58: 2346, 491: 2346, 495: 2346, 2346, 2346, 2346, 2346, 507: 2346, 510: 2346, 600: 2346, 607: 2346, 613: 2346, 662: 2346, 2346, 2346, 666: 2346}, + {2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 58: 2345, 491: 2345, 495: 2345, 2345, 2345, 2345, 2345, 507: 2345, 510: 2345, 600: 2345, 607: 2345, 613: 2345, 662: 2345, 2345, 2345, 666: 2345}, + {2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 58: 2357, 491: 2357, 495: 2357, 2357, 2357, 2357, 2357, 507: 2357, 510: 2357, 600: 2357, 607: 2357, 613: 2357, 662: 2357, 2357, 2357, 666: 2357}, // 2185 - {2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 50: 2257, 475: 2257, 479: 2257, 2257, 2257, 2257, 487: 2257, 491: 2257, 495: 2257, 584: 2257, 593: 2257, 2257, 645: 2257, 2257, 2257, 2257}, - {50: 4746}, - {50: 4745}, - {2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 50: 2256, 475: 2256, 479: 2256, 2256, 2256, 2256, 487: 2256, 491: 2256, 495: 2256, 584: 2256, 593: 2256, 2256, 645: 2256, 2256, 2256, 2256}, - {2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 50: 2259, 475: 2259, 479: 2259, 2259, 2259, 2259, 487: 2259, 491: 2259, 495: 2259, 584: 2259, 593: 2259, 2259, 645: 2259, 2259, 2259, 2259}, + {492: 4798}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4799}, + {58: 4800, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 58: 2342, 491: 2342, 495: 2342, 2342, 2342, 2342, 2342, 507: 2342, 510: 2342, 600: 2342, 607: 2342, 613: 2342, 662: 2342, 2342, 2342, 666: 2342, 1346: 4803, 1376: 4802, 4801}, + {2359, 2359, 2359, 2359, 2359, 2359, 2359, 2359, 2359, 2359, 2359, 2359, 2359, 2359, 2359, 58: 2359, 491: 2359, 495: 2359, 2359, 2359, 2359, 2359, 507: 2359, 510: 2359, 600: 2359, 607: 2359, 613: 2359, 662: 2359, 2359, 2359, 666: 2359}, // 2190 - {2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 50: 2317, 475: 2317, 479: 2317, 2317, 2317, 2317, 487: 2317, 491: 2317, 495: 2317, 584: 2317, 593: 2317, 2317, 645: 2317, 2317, 2317, 2317}, - {2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 50: 2320, 86: 4749, 88: 4750, 475: 2320, 479: 2320, 2320, 2320, 2320, 487: 2320, 491: 2320, 495: 2320, 584: 2320, 593: 2320, 2320, 645: 2320, 2320, 2320, 2320, 873: 4751}, - {2452, 2452, 2452, 2452, 2452, 2452, 2452, 2452, 2452, 2452, 2452, 2452, 2452, 2452, 2452, 19: 2452, 50: 2452, 84: 2452, 2452, 2452, 2452, 2452, 90: 2452, 475: 2452, 477: 2452, 479: 2452, 2452, 2452, 2452, 484: 2452, 487: 2452, 491: 2452, 495: 2452, 500: 2452, 584: 2452, 593: 2452, 2452, 645: 2452, 2452, 2452, 2452}, - {2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2451, 19: 2451, 50: 2451, 84: 2451, 2451, 2451, 2451, 2451, 90: 2451, 475: 2451, 477: 2451, 479: 2451, 2451, 2451, 2451, 484: 2451, 487: 2451, 491: 2451, 495: 2451, 500: 2451, 584: 2451, 593: 2451, 2451, 645: 2451, 2451, 2451, 2451}, - {2319, 2319, 2319, 2319, 2319, 2319, 2319, 2319, 2319, 2319, 2319, 2319, 2319, 2319, 2319, 50: 2319, 475: 2319, 479: 2319, 2319, 2319, 2319, 487: 2319, 491: 2319, 495: 2319, 584: 2319, 593: 2319, 2319, 645: 2319, 2319, 2319, 2319}, + {2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 58: 2341, 491: 2341, 495: 2341, 2341, 2341, 2341, 2341, 507: 2341, 510: 2341, 600: 2341, 607: 2341, 613: 2341, 662: 2341, 2341, 2341, 666: 2341}, + {2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 58: 2340, 491: 2340, 495: 2340, 2340, 2340, 2340, 2340, 507: 2340, 510: 2340, 600: 2340, 607: 2340, 613: 2340, 662: 2340, 2340, 2340, 666: 2340}, + {492: 4805}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4806}, + {58: 4807, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, // 2195 - {2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 50: 2323, 475: 2323, 479: 2323, 2323, 2323, 2323, 487: 2323, 491: 2323, 495: 2323, 584: 2323, 593: 2323, 2323, 645: 2323, 2323, 2323, 2323}, - {584: 2424, 593: 2424, 2424, 645: 2424, 652: 2424, 678: 2424, 2424}, - {2423, 2423, 2423, 2423, 2423, 2423, 9: 2423, 491: 2423, 584: 2423, 593: 2423, 2423, 645: 2423, 652: 2423, 678: 2423, 2423}, - {2356, 2356, 2356, 2356, 2356, 2356, 9: 2356, 2356, 2356, 50: 2356, 491: 2356}, - {2482, 2482, 2482, 2482, 2482, 2482, 9: 2482, 491: 2482}, + {2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375, 58: 2375, 161: 4558, 491: 2375, 495: 4197, 2375, 4196, 2375, 2375, 507: 2375, 510: 2375, 600: 2375, 607: 2375, 613: 2375, 662: 2375, 2375, 2375, 666: 2375, 834: 4808, 960: 4809, 1068: 4810, 1242: 4811}, + {161: 4560, 510: 4812}, + {2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374, 58: 2374, 491: 2374, 495: 2374, 2374, 2374, 2374, 2374, 507: 2374, 510: 2374, 600: 2374, 607: 2374, 613: 2374, 662: 2374, 2374, 2374, 666: 2374}, + {2372, 2372, 2372, 2372, 2372, 2372, 2372, 2372, 2372, 2372, 2372, 2372, 2372, 2372, 2372, 58: 2372, 491: 2372, 495: 2372, 2372, 2372, 2372, 2372, 507: 2372, 510: 2372, 600: 2372, 607: 2372, 613: 2372, 662: 2372, 2372, 2372, 666: 2372}, + {2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360, 58: 2360, 491: 2360, 495: 2360, 2360, 2360, 2360, 2360, 507: 2360, 510: 2360, 600: 2360, 607: 2360, 613: 2360, 662: 2360, 2360, 2360, 666: 2360}, // 2200 - {2434, 2434, 2434, 2434, 2434, 2434, 9: 2434, 491: 2434}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 4759}, - {2433, 2433, 2433, 2433, 2433, 2433, 9: 2433, 491: 2433}, - {2: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 10: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 51: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 567: 4478, 784: 4761}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 4482, 853: 4762}, + {2373, 2373, 2373, 2373, 2373, 2373, 2373, 2373, 2373, 2373, 2373, 2373, 2373, 2373, 2373, 58: 2373, 491: 2373, 495: 2373, 2373, 2373, 2373, 2373, 507: 2373, 510: 2373, 600: 2373, 607: 2373, 613: 2373, 662: 2373, 2373, 2373, 666: 2373}, + {2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361, 58: 2361, 491: 2361, 495: 2361, 2361, 2361, 2361, 2361, 507: 2361, 510: 2361, 600: 2361, 607: 2361, 613: 2361, 662: 2361, 2361, 2361, 666: 2361}, + {605: 4824, 4823, 608: 4819, 4820, 611: 4821, 4822, 957: 4818, 972: 4816, 4817, 4815}, + {2362, 2362, 2362, 2362, 2362, 2362, 2362, 2362, 2362, 2362, 2362, 2362, 2362, 2362, 2362, 58: 2362, 491: 2362, 495: 2362, 2362, 2362, 2362, 2362, 507: 2362, 510: 2362, 600: 2362, 607: 2362, 613: 2362, 662: 2362, 2362, 2362, 666: 2362}, + {2302, 2302, 2302, 2302, 2302, 2302, 2302, 2302, 2302, 2302, 2302, 2302, 2302, 2302, 2302, 58: 2302, 491: 2302, 495: 2302, 2302, 2302, 2302, 2302, 507: 2302, 510: 2302, 600: 2302, 607: 2302, 613: 2302, 662: 2302, 2302, 2302, 666: 2302}, // 2205 - {2435, 2435, 2435, 2435, 2435, 2435, 9: 2435, 4757, 4758, 491: 2435, 934: 4763}, - {2483, 2483, 2483, 2483, 2483, 2483, 9: 2483, 491: 2483}, - {2484, 2484, 2484, 2484, 2484, 2484, 9: 2484, 491: 2484}, - {2485, 2485, 2485, 2485, 2485, 2485, 9: 2485, 491: 2485}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 4769, 990: 4768, 1177: 4767}, + {492: 4827}, + {492: 4825}, + {2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 58: 2298, 491: 2298, 2287, 495: 2298, 2298, 2298, 2298, 2298, 507: 2298, 510: 2298, 600: 2298, 607: 2298, 613: 2298, 662: 2298, 2298, 2298, 666: 2298}, + {2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291, 58: 2291, 491: 2291, 2295, 495: 2291, 2291, 2291, 2291, 2291, 507: 2291, 510: 2291, 600: 2291, 607: 2291, 613: 2291, 662: 2291, 2291, 2291, 666: 2291}, + {2290, 2290, 2290, 2290, 2290, 2290, 2290, 2290, 2290, 2290, 2290, 2290, 2290, 2290, 2290, 58: 2290, 491: 2290, 2294, 495: 2290, 2290, 2290, 2290, 2290, 507: 2290, 510: 2290, 600: 2290, 607: 2290, 613: 2290, 662: 2290, 2290, 2290, 666: 2290}, // 2210 - {2486, 2486, 2486, 2486, 2486, 2486, 9: 4771, 491: 2486}, - {1324, 1324, 1324, 1324, 1324, 1324, 9: 1324, 491: 1324}, - {1314, 1314, 1314, 1314, 1314, 1314, 9: 1314, 491: 1314, 532: 4649, 534: 4648, 954: 4770}, - {1322, 1322, 1322, 1322, 1322, 1322, 9: 1322, 491: 1322}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 4769, 990: 4772}, + {2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 58: 2289, 491: 2289, 2293, 495: 2289, 2289, 2289, 2289, 2289, 507: 2289, 510: 2289, 600: 2289, 607: 2289, 613: 2289, 662: 2289, 2289, 2289, 666: 2289}, + {492: 2292}, + {492: 2288}, + {58: 4826}, + {2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299, 58: 2299, 491: 2299, 495: 2299, 2299, 2299, 2299, 2299, 507: 2299, 510: 2299, 600: 2299, 607: 2299, 613: 2299, 662: 2299, 2299, 2299, 666: 2299}, // 2215 - {1323, 1323, 1323, 1323, 1323, 1323, 9: 1323, 491: 1323}, - {2: 582, 582, 582, 582, 582, 582, 582, 10: 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 51: 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 4776, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 654: 582, 816: 4775, 833: 4774}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 654: 4778, 664: 4780, 2785, 2786, 2784, 791: 4779, 836: 4777}, - {581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 51: 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 476: 581, 491: 581, 511: 581, 533: 581, 572: 581, 654: 581}, - {580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 51: 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 476: 580, 491: 580, 511: 580, 533: 580, 572: 580, 654: 580}, + {58: 4828, 525: 2823, 755: 4829}, + {2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 58: 2301, 491: 2301, 495: 2301, 2301, 2301, 2301, 2301, 507: 2301, 510: 2301, 600: 2301, 607: 2301, 613: 2301, 662: 2301, 2301, 2301, 666: 2301}, + {58: 4830}, + {2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 58: 2300, 491: 2300, 495: 2300, 2300, 2300, 2300, 2300, 507: 2300, 510: 2300, 600: 2300, 607: 2300, 613: 2300, 662: 2300, 2300, 2300, 666: 2300}, + {170: 4832}, // 2220 - {2489, 2489, 2489, 2489, 2489, 2489, 9: 2489, 491: 2489}, - {2458, 2458, 2458, 2458, 2458, 2458, 9: 2458, 20: 2458, 491: 2458}, - {2457, 2457, 2457, 2457, 2457, 2457, 9: 4781, 20: 2457, 491: 2457}, - {2428, 2428, 2428, 2428, 2428, 2428, 9: 2428, 20: 2428, 50: 2428, 103: 2428, 168: 2428, 170: 2428, 477: 2428, 491: 2428, 499: 2428, 652: 2428, 654: 2428}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4782, 2785, 2786, 2784}, + {2363, 2363, 2363, 2363, 2363, 2363, 2363, 2363, 2363, 2363, 2363, 2363, 2363, 2363, 2363, 58: 2363, 491: 2363, 495: 2363, 2363, 2363, 2363, 2363, 507: 2363, 510: 2363, 600: 2363, 607: 2363, 613: 2363, 662: 2363, 2363, 2363, 666: 2363}, + {2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364, 58: 2364, 491: 2364, 495: 2364, 2364, 2364, 2364, 2364, 507: 2364, 510: 2364, 600: 2364, 607: 2364, 613: 2364, 662: 2364, 2364, 2364, 666: 2364}, + {2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311, 58: 2311, 491: 2311, 495: 2311, 2311, 2311, 2311, 2311, 507: 2311, 510: 2311, 600: 2311, 607: 2311, 613: 2311, 662: 2311, 2311, 2311, 666: 2311}, + {2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 58: 2310, 491: 2310, 495: 2310, 2310, 2310, 2310, 2310, 507: 2310, 510: 2310, 600: 2310, 607: 2310, 613: 2310, 662: 2310, 2310, 2310, 666: 2310}, + {2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309, 58: 2309, 491: 2309, 495: 2309, 2309, 2309, 2309, 2309, 507: 2309, 510: 2309, 600: 2309, 607: 2309, 613: 2309, 662: 2309, 2309, 2309, 666: 2309}, // 2225 - {2427, 2427, 2427, 2427, 2427, 2427, 9: 2427, 20: 2427, 50: 2427, 103: 2427, 168: 2427, 170: 2427, 477: 2427, 491: 2427, 499: 2427, 652: 2427, 654: 2427}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 654: 4778, 664: 4780, 2785, 2786, 2784, 791: 4779, 836: 4785}, - {2490, 2490, 2490, 2490, 2490, 2490, 9: 2490, 491: 2490}, - {20: 4786}, - {2492, 2492, 2492, 2492, 2492, 2492, 9: 2492, 491: 2492}, + {2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 58: 2308, 491: 2308, 495: 2308, 2308, 2308, 2308, 2308, 507: 2308, 510: 2308, 600: 2308, 607: 2308, 613: 2308, 662: 2308, 2308, 2308, 666: 2308}, + {139: 4839, 492: 4838, 605: 4824, 4823, 608: 4819, 4820, 611: 4821, 4822, 924: 4847, 957: 4818, 972: 4816, 4817, 4840, 1112: 4848}, + {492: 4843}, + {2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 58: 2303, 491: 2303, 495: 2303, 2303, 2303, 2303, 2303, 507: 2303, 510: 2303, 600: 2303, 607: 2303, 613: 2303, 662: 2303, 2303, 2303, 666: 2303}, + {170: 4291}, // 2230 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 654: 4778, 664: 4780, 2785, 2786, 2784, 791: 4779, 836: 4789}, - {2491, 2491, 2491, 2491, 2491, 2491, 9: 2491, 491: 2491}, - {20: 4790}, - {2493, 2493, 2493, 2493, 2493, 2493, 9: 2493, 491: 2493}, - {2: 582, 582, 582, 582, 582, 582, 582, 10: 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 51: 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 4776, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 654: 582, 816: 4775, 833: 4792}, + {492: 4288}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 4844, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3694, 801: 4845}, + {2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 58: 2306, 491: 2306, 495: 2306, 2306, 2306, 2306, 2306, 507: 2306, 510: 2306, 600: 2306, 607: 2306, 613: 2306, 662: 2306, 2306, 2306, 666: 2306}, + {9: 3696, 58: 4846}, + {2305, 2305, 2305, 2305, 2305, 2305, 2305, 2305, 2305, 2305, 2305, 2305, 2305, 2305, 2305, 58: 2305, 491: 2305, 495: 2305, 2305, 2305, 2305, 2305, 507: 2305, 510: 2305, 600: 2305, 607: 2305, 613: 2305, 662: 2305, 2305, 2305, 666: 2305}, // 2235 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 654: 4778, 664: 4780, 2785, 2786, 2784, 791: 4779, 836: 4793}, - {2494, 2494, 2494, 2494, 2494, 2494, 9: 2494, 491: 2494}, - {2: 582, 582, 582, 582, 582, 582, 582, 10: 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 51: 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 4776, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 654: 582, 816: 4775, 833: 4795}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 654: 4778, 664: 4780, 2785, 2786, 2784, 791: 4779, 836: 4796}, - {2495, 2495, 2495, 2495, 2495, 2495, 9: 2495, 491: 2495}, + {58: 4850}, + {58: 4849}, + {2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304, 58: 2304, 491: 2304, 495: 2304, 2304, 2304, 2304, 2304, 507: 2304, 510: 2304, 600: 2304, 607: 2304, 613: 2304, 662: 2304, 2304, 2304, 666: 2304}, + {2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, 58: 2307, 491: 2307, 495: 2307, 2307, 2307, 2307, 2307, 507: 2307, 510: 2307, 600: 2307, 607: 2307, 613: 2307, 662: 2307, 2307, 2307, 666: 2307}, + {2365, 2365, 2365, 2365, 2365, 2365, 2365, 2365, 2365, 2365, 2365, 2365, 2365, 2365, 2365, 58: 2365, 491: 2365, 495: 2365, 2365, 2365, 2365, 2365, 507: 2365, 510: 2365, 600: 2365, 607: 2365, 613: 2365, 662: 2365, 2365, 2365, 666: 2365}, // 2240 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 654: 4778, 664: 4780, 2785, 2786, 2784, 791: 4779, 836: 4798}, - {2496, 2496, 2496, 2496, 2496, 2496, 9: 2496, 491: 2496}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4800, 2785, 2786, 2784}, - {477: 4801}, - {572: 4802}, + {2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368, 58: 2368, 93: 4853, 95: 4854, 491: 2368, 495: 2368, 2368, 2368, 2368, 2368, 507: 2368, 510: 2368, 600: 2368, 607: 2368, 613: 2368, 662: 2368, 2368, 2368, 666: 2368, 891: 4855}, + {2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 19: 2500, 58: 2500, 90: 2500, 92: 2500, 2500, 2500, 2500, 2500, 491: 2500, 493: 2500, 495: 2500, 2500, 2500, 2500, 2500, 501: 2500, 507: 2500, 510: 2500, 517: 2500, 600: 2500, 607: 2500, 613: 2500, 662: 2500, 2500, 2500, 666: 2500}, + {2499, 2499, 2499, 2499, 2499, 2499, 2499, 2499, 2499, 2499, 2499, 2499, 2499, 2499, 2499, 19: 2499, 58: 2499, 90: 2499, 92: 2499, 2499, 2499, 2499, 2499, 491: 2499, 493: 2499, 495: 2499, 2499, 2499, 2499, 2499, 501: 2499, 507: 2499, 510: 2499, 517: 2499, 600: 2499, 607: 2499, 613: 2499, 662: 2499, 2499, 2499, 666: 2499}, + {2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 58: 2367, 491: 2367, 495: 2367, 2367, 2367, 2367, 2367, 507: 2367, 510: 2367, 600: 2367, 607: 2367, 613: 2367, 662: 2367, 2367, 2367, 666: 2367}, + {2371, 2371, 2371, 2371, 2371, 2371, 2371, 2371, 2371, 2371, 2371, 2371, 2371, 2371, 2371, 58: 2371, 491: 2371, 495: 2371, 2371, 2371, 2371, 2371, 507: 2371, 510: 2371, 600: 2371, 607: 2371, 613: 2371, 662: 2371, 2371, 2371, 666: 2371}, // 2245 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 4803}, - {2456, 2456, 2456, 2456, 2456, 2456, 9: 2456, 227: 4807, 477: 4806, 491: 2456, 1362: 4805, 4804}, - {2497, 2497, 2497, 2497, 2497, 2497, 9: 2497, 491: 2497}, - {2455, 2455, 2455, 2455, 2455, 2455, 9: 2455, 491: 2455}, - {203: 4809}, + {600: 2472, 607: 2472, 613: 2472, 662: 2472, 668: 2472, 696: 2472, 2472}, + {2471, 2471, 2471, 2471, 2471, 2471, 9: 2471, 507: 2471, 600: 2471, 607: 2471, 613: 2471, 662: 2471, 668: 2471, 696: 2471, 2471}, + {2404, 2404, 2404, 2404, 2404, 2404, 9: 2404, 2404, 2404, 58: 2404, 507: 2404}, + {2530, 2530, 2530, 2530, 2530, 2530, 9: 2530, 507: 2530}, + {2482, 2482, 2482, 2482, 2482, 2482, 9: 2482, 507: 2482}, // 2250 - {203: 4808}, - {2453, 2453, 2453, 2453, 2453, 2453, 9: 2453, 491: 2453}, - {2454, 2454, 2454, 2454, 2454, 2454, 9: 2454, 491: 2454}, - {154: 4811}, - {159: 4812}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 4863}, + {2481, 2481, 2481, 2481, 2481, 2481, 9: 2481, 507: 2481}, + {2: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 10: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 59: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 583: 4577, 800: 4865}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 4581, 871: 4866}, + {2483, 2483, 2483, 2483, 2483, 2483, 9: 2483, 4861, 4862, 507: 2483, 954: 4867}, // 2255 - {476: 4813}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 4814}, - {50: 4815, 488: 3712, 3713, 3718, 523: 3714, 550: 3715, 3716, 3709, 3719, 3708, 3717, 3710, 3711}, - {1877, 1877, 1877, 1877, 1877, 1877, 9: 1877, 491: 1877, 567: 4478, 784: 4816}, - {2499, 2499, 2499, 2499, 2499, 2499, 9: 2499, 491: 2499}, + {2531, 2531, 2531, 2531, 2531, 2531, 9: 2531, 507: 2531}, + {2532, 2532, 2532, 2532, 2532, 2532, 9: 2532, 507: 2532}, + {2533, 2533, 2533, 2533, 2533, 2533, 9: 2533, 507: 2533}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 4873, 1010: 4872, 1202: 4871}, + {2534, 2534, 2534, 2534, 2534, 2534, 9: 4875, 507: 2534}, // 2260 - {2: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 10: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 51: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 567: 4478, 784: 4835}, - {584: 4834}, - {2: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 10: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 51: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 567: 4478, 784: 4832}, - {2: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 10: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 51: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 567: 4478, 784: 4830}, - {2: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 10: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 51: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 567: 4478, 784: 4828}, + {1349, 1349, 1349, 1349, 1349, 1349, 9: 1349, 507: 1349}, + {1339, 1339, 1339, 1339, 1339, 1339, 9: 1339, 507: 1339, 548: 4748, 561: 4747, 975: 4874}, + {1347, 1347, 1347, 1347, 1347, 1347, 9: 1347, 507: 1347}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 4873, 1010: 4876}, + {1348, 1348, 1348, 1348, 1348, 1348, 9: 1348, 507: 1348}, // 2265 - {584: 4825}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4824, 2785, 2786, 2784}, - {2464, 2464, 2464, 2464, 2464, 2464, 9: 2464, 491: 2464}, - {2: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 10: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 51: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 567: 4478, 784: 4826}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4754, 2785, 2786, 2784, 1152: 4827}, + {2: 604, 604, 604, 604, 604, 604, 604, 10: 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 59: 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 4880, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 671: 604, 835: 4879, 851: 4878}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 671: 4882, 685: 4884, 2849, 688: 2850, 2848, 809: 4883, 854: 4881}, + {603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 59: 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 492: 603, 507: 603, 525: 603, 549: 603, 588: 603, 671: 603}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 59: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 492: 602, 507: 602, 525: 602, 549: 602, 588: 602, 671: 602}, + {2537, 2537, 2537, 2537, 2537, 2537, 9: 2537, 507: 2537}, // 2270 - {2487, 2487, 2487, 2487, 2487, 2487, 9: 2487, 491: 2487}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4829, 2785, 2786, 2784}, - {2488, 2488, 2488, 2488, 2488, 2488, 9: 2488, 491: 2488}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4831, 2785, 2786, 2784}, - {2498, 2498, 2498, 2498, 2498, 2498, 9: 2498, 491: 2498}, + {2506, 2506, 2506, 2506, 2506, 2506, 9: 2506, 20: 2506, 507: 2506}, + {2505, 2505, 2505, 2505, 2505, 2505, 9: 4885, 20: 2505, 507: 2505}, + {2476, 2476, 2476, 2476, 2476, 2476, 9: 2476, 20: 2476, 58: 2476, 110: 2476, 178: 2476, 180: 2476, 493: 2476, 507: 2476, 516: 2476, 668: 2476, 671: 2476}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4886, 2849, 688: 2850, 2848}, + {2475, 2475, 2475, 2475, 2475, 2475, 9: 2475, 20: 2475, 58: 2475, 110: 2475, 178: 2475, 180: 2475, 493: 2475, 507: 2475, 516: 2475, 668: 2475, 671: 2475}, // 2275 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4780, 2785, 2786, 2784, 791: 4833}, - {2500, 2500, 2500, 2500, 2500, 2500, 9: 4781, 491: 2500}, - {2501, 2501, 2501, 2501, 2501, 2501, 9: 2501, 491: 2501}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 4836}, - {2069, 2069, 2069, 2069, 2069, 2069, 9: 2069, 491: 2069, 673: 4839, 675: 4838, 916: 4837}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 671: 4882, 685: 4884, 2849, 688: 2850, 2848, 809: 4883, 854: 4889}, + {2538, 2538, 2538, 2538, 2538, 2538, 9: 2538, 507: 2538}, + {20: 4890}, + {2540, 2540, 2540, 2540, 2540, 2540, 9: 2540, 507: 2540}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 671: 4882, 685: 4884, 2849, 688: 2850, 2848, 809: 4883, 854: 4893}, // 2280 - {2502, 2502, 2502, 2502, 2502, 2502, 9: 2502, 491: 2502}, - {2068, 2068, 2068, 2068, 2068, 2068, 9: 2068, 491: 2068}, - {2067, 2067, 2067, 2067, 2067, 2067, 9: 2067, 491: 2067}, - {141: 4776, 511: 582, 816: 4775, 833: 4841}, - {511: 2759, 737: 4842}, + {2539, 2539, 2539, 2539, 2539, 2539, 9: 2539, 507: 2539}, + {20: 4894}, + {2541, 2541, 2541, 2541, 2541, 2541, 9: 2541, 507: 2541}, + {2: 604, 604, 604, 604, 604, 604, 604, 10: 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 59: 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 4880, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 671: 604, 835: 4879, 851: 4896}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 671: 4882, 685: 4884, 2849, 688: 2850, 2848, 809: 4883, 854: 4897}, // 2285 - {2503, 2503, 2503, 2503, 2503, 2503, 9: 2503, 491: 2503}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 654: 4778, 664: 4780, 2785, 2786, 2784, 791: 4779, 836: 4844}, - {2504, 2504, 2504, 2504, 2504, 2504, 9: 2504, 491: 2504}, - {154: 4846}, - {159: 4847}, + {2542, 2542, 2542, 2542, 2542, 2542, 9: 2542, 507: 2542}, + {2: 604, 604, 604, 604, 604, 604, 604, 10: 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 59: 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 4880, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 671: 604, 835: 4879, 851: 4899}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 671: 4882, 685: 4884, 2849, 688: 2850, 2848, 809: 4883, 854: 4900}, + {2543, 2543, 2543, 2543, 2543, 2543, 9: 2543, 507: 2543}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 671: 4882, 685: 4884, 2849, 688: 2850, 2848, 809: 4883, 854: 4902}, // 2290 - {476: 4848}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 4849}, - {50: 4850, 488: 3712, 3713, 3718, 523: 3714, 550: 3715, 3716, 3709, 3719, 3708, 3717, 3710, 3711}, - {582, 582, 582, 582, 582, 582, 9: 582, 141: 4776, 491: 582, 816: 4775, 833: 4851}, - {2508, 2508, 2508, 2508, 2508, 2508, 9: 2508, 491: 2508}, + {2544, 2544, 2544, 2544, 2544, 2544, 9: 2544, 507: 2544}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4904, 2849, 688: 2850, 2848}, + {493: 4905}, + {588: 4906}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4907}, // 2295 - {2: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 10: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 51: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 476: 1875, 567: 4870, 790: 4984}, - {2511, 2511, 2511, 2511, 2511, 2511, 9: 2511, 491: 2511}, - {1875, 1875, 1875, 1875, 1875, 1875, 9: 1875, 92: 1875, 141: 1875, 476: 1875, 491: 1875, 567: 4870, 790: 4938, 816: 1875}, - {2: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 10: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 51: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 567: 4870, 790: 4929}, - {584: 4436, 593: 4862, 4857, 645: 4860, 652: 4437, 678: 4861, 4858, 832: 4859, 1206: 4863}, + {2504, 2504, 2504, 2504, 2504, 2504, 9: 2504, 237: 4911, 493: 4910, 507: 2504, 1387: 4909, 4908}, + {2545, 2545, 2545, 2545, 2545, 2545, 9: 2545, 507: 2545}, + {2503, 2503, 2503, 2503, 2503, 2503, 9: 2503, 507: 2503}, + {213: 4913}, + {213: 4912}, // 2300 - {584: 4923}, - {2: 2439, 2439, 2439, 2439, 2439, 2439, 2439, 10: 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 51: 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 476: 2439, 584: 4436, 652: 4437, 832: 4879, 1074: 4917}, - {2: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 10: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 51: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 476: 1875, 484: 1875, 567: 4870, 790: 4911}, - {2: 2439, 2439, 2439, 2439, 2439, 2439, 2439, 10: 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 51: 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 476: 2439, 484: 2439, 584: 4436, 652: 4437, 832: 4879, 1074: 4880}, - {584: 4868}, + {2501, 2501, 2501, 2501, 2501, 2501, 9: 2501, 507: 2501}, + {2502, 2502, 2502, 2502, 2502, 2502, 9: 2502, 507: 2502}, + {163: 4915}, + {168: 4916}, + {492: 4917}, // 2305 - {476: 4864}, - {453, 453, 453, 453, 453, 453, 9: 453, 50: 453, 491: 453}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 4865}, - {50: 4866, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {2327, 2327, 2327, 2327, 2327, 2327, 9: 2327, 50: 2327, 152: 4459, 479: 4115, 4114, 491: 2327, 815: 4460, 939: 4710, 1045: 4867}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 4918}, + {58: 4919, 504: 3792, 3793, 3798, 541: 3794, 566: 3795, 3796, 3789, 3799, 3788, 3797, 3790, 3791}, + {1918, 1918, 1918, 1918, 1918, 1918, 9: 1918, 507: 1918, 583: 4577, 800: 4920}, + {2547, 2547, 2547, 2547, 2547, 2547, 9: 2547, 507: 2547}, + {2: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 10: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 59: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 583: 4577, 800: 4939}, // 2310 - {2282, 2282, 2282, 2282, 2282, 2282, 9: 2282, 50: 2282, 491: 2282}, - {2: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 10: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 51: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 476: 1875, 567: 4870, 790: 4869}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 1871, 664: 4874, 2785, 2786, 2784, 882: 4873}, - {479: 4115, 4114, 815: 4871}, - {586: 4872}, + {600: 4938}, + {2: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 10: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 59: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 583: 4577, 800: 4936}, + {2: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 10: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 59: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 583: 4577, 800: 4934}, + {2: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 10: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 59: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 583: 4577, 800: 4932}, + {600: 4929}, // 2315 - {1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 51: 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 476: 1874, 478: 1874, 484: 1874, 491: 1874, 573: 1874, 816: 1874}, - {476: 4875}, - {476: 1870}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 4644, 664: 4169, 2785, 2786, 2784, 748: 4643, 831: 4642, 841: 4876}, - {9: 4653, 50: 4877}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4928, 2849, 688: 2850, 2848}, + {2512, 2512, 2512, 2512, 2512, 2512, 9: 2512, 507: 2512}, + {2: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 10: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 59: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 583: 4577, 800: 4930}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4858, 2849, 688: 2850, 2848, 1177: 4931}, + {2535, 2535, 2535, 2535, 2535, 2535, 9: 2535, 507: 2535}, // 2320 - {647: 4637, 915: 4878}, - {2283, 2283, 2283, 2283, 2283, 2283, 9: 2283, 50: 2283, 491: 2283}, - {2: 2438, 2438, 2438, 2438, 2438, 2438, 2438, 10: 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 51: 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 476: 2438, 484: 2438}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 1871, 484: 1871, 664: 4882, 2785, 2786, 2784, 882: 4883, 947: 4881}, - {476: 4891}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4933, 2849, 688: 2850, 2848}, + {2536, 2536, 2536, 2536, 2536, 2536, 9: 2536, 507: 2536}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4935, 2849, 688: 2850, 2848}, + {2546, 2546, 2546, 2546, 2546, 2546, 9: 2546, 507: 2546}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4884, 2849, 688: 2850, 2848, 809: 4937}, // 2325 - {85: 4889, 476: 1870, 484: 1870}, - {476: 1861, 484: 4884}, - {146: 4887, 179: 4886, 195: 4888, 910: 4885}, - {476: 1860}, - {1854, 1854, 1854, 1854, 1854, 1854, 1854, 9: 1854, 19: 1854, 50: 1854, 84: 1854, 1854, 1854, 1854, 1854, 90: 1854, 475: 1854, 1854, 1854, 484: 1854, 491: 1854, 500: 1854}, + {2548, 2548, 2548, 2548, 2548, 2548, 9: 4885, 507: 2548}, + {2549, 2549, 2549, 2549, 2549, 2549, 9: 2549, 507: 2549}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 4940}, + {2112, 2112, 2112, 2112, 2112, 2112, 9: 2112, 507: 2112, 691: 4943, 693: 4942, 936: 4941}, + {2550, 2550, 2550, 2550, 2550, 2550, 9: 2550, 507: 2550}, // 2330 - {1853, 1853, 1853, 1853, 1853, 1853, 1853, 9: 1853, 19: 1853, 50: 1853, 84: 1853, 1853, 1853, 1853, 1853, 90: 1853, 475: 1853, 1853, 1853, 484: 1853, 491: 1853, 500: 1853}, - {1852, 1852, 1852, 1852, 1852, 1852, 1852, 9: 1852, 19: 1852, 50: 1852, 84: 1852, 1852, 1852, 1852, 1852, 90: 1852, 475: 1852, 1852, 1852, 484: 1852, 491: 1852, 500: 1852}, - {146: 4887, 179: 4886, 195: 4888, 910: 4890}, - {476: 1859}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 4644, 664: 4169, 2785, 2786, 2784, 748: 4643, 831: 4642, 841: 4892}, + {2111, 2111, 2111, 2111, 2111, 2111, 9: 2111, 507: 2111}, + {2110, 2110, 2110, 2110, 2110, 2110, 9: 2110, 507: 2110}, + {150: 4880, 525: 604, 835: 4879, 851: 4945}, + {525: 2823, 755: 4946}, + {2551, 2551, 2551, 2551, 2551, 2551, 9: 2551, 507: 2551}, // 2335 - {9: 4653, 50: 4893}, - {1869, 1869, 1869, 1869, 1869, 1869, 1869, 9: 1869, 19: 1869, 50: 1869, 85: 1869, 1869, 1869, 1869, 90: 1869, 477: 1869, 484: 1869, 491: 1869, 884: 4894}, - {2284, 2284, 2284, 2284, 2284, 2284, 4899, 9: 2284, 19: 4896, 50: 2284, 85: 4903, 4749, 4456, 4750, 90: 4455, 477: 4898, 484: 4902, 491: 2284, 860: 4900, 862: 4897, 873: 4901, 883: 4895}, - {1868, 1868, 1868, 1868, 1868, 1868, 1868, 9: 1868, 19: 1868, 50: 1868, 84: 1868, 1868, 1868, 1868, 1868, 90: 1868, 477: 1868, 484: 1868, 491: 1868, 500: 1868}, - {502: 4307, 511: 2064, 741: 4909}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 671: 4882, 685: 4884, 2849, 688: 2850, 2848, 809: 4883, 854: 4948}, + {2552, 2552, 2552, 2552, 2552, 2552, 9: 2552, 507: 2552}, + {163: 4950}, + {168: 4951}, + {492: 4952}, // 2340 - {1866, 1866, 1866, 1866, 1866, 1866, 1866, 9: 1866, 19: 1866, 50: 1866, 84: 1866, 1866, 1866, 1866, 1866, 90: 1866, 477: 1866, 484: 1866, 491: 1866, 500: 1866}, - {370: 4907}, - {478: 4906}, - {1863, 1863, 1863, 1863, 1863, 1863, 1863, 9: 1863, 19: 1863, 50: 1863, 84: 1863, 1863, 1863, 1863, 1863, 90: 1863, 477: 1863, 484: 1863, 491: 1863, 500: 1863}, - {1862, 1862, 1862, 1862, 1862, 1862, 1862, 9: 1862, 19: 1862, 50: 1862, 84: 1862, 1862, 1862, 1862, 1862, 90: 1862, 477: 1862, 484: 1862, 491: 1862, 500: 1862}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 4953}, + {58: 4954, 504: 3792, 3793, 3798, 541: 3794, 566: 3795, 3796, 3789, 3799, 3788, 3797, 3790, 3791}, + {604, 604, 604, 604, 604, 604, 9: 604, 150: 4880, 507: 604, 835: 4879, 851: 4955}, + {2556, 2556, 2556, 2556, 2556, 2556, 9: 2556, 507: 2556}, + {2: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 10: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 59: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 492: 1916, 583: 4974, 805: 5088}, // 2345 - {146: 4887, 179: 4886, 195: 4888, 910: 4905}, - {146: 4887, 179: 4886, 195: 4888, 910: 4904}, - {1855, 1855, 1855, 1855, 1855, 1855, 1855, 9: 1855, 19: 1855, 50: 1855, 84: 1855, 1855, 1855, 1855, 1855, 90: 1855, 475: 1855, 477: 1855, 484: 1855, 491: 1855, 500: 1855}, - {1856, 1856, 1856, 1856, 1856, 1856, 1856, 9: 1856, 19: 1856, 50: 1856, 84: 1856, 1856, 1856, 1856, 1856, 90: 1856, 475: 1856, 477: 1856, 484: 1856, 491: 1856, 500: 1856}, - {1864, 1864, 1864, 1864, 1864, 1864, 1864, 9: 1864, 19: 1864, 50: 1864, 84: 1864, 1864, 1864, 1864, 1864, 90: 1864, 477: 1864, 484: 1864, 491: 1864, 500: 1864}, + {2559, 2559, 2559, 2559, 2559, 2559, 9: 2559, 507: 2559}, + {1916, 1916, 1916, 1916, 1916, 1916, 9: 1916, 98: 1916, 150: 1916, 492: 1916, 507: 1916, 583: 4974, 805: 5042, 835: 1916}, + {2: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 10: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 59: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 583: 4974, 805: 5033}, + {600: 4535, 607: 4966, 613: 4961, 662: 4964, 668: 4536, 696: 4965, 4962, 850: 4963, 1231: 4967}, + {600: 5027}, // 2350 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4908, 2785, 2786, 2784}, - {1865, 1865, 1865, 1865, 1865, 1865, 1865, 9: 1865, 19: 1865, 50: 1865, 84: 1865, 1865, 1865, 1865, 1865, 90: 1865, 477: 1865, 484: 1865, 491: 1865, 500: 1865}, - {511: 2759, 737: 2758, 745: 4910}, - {1867, 1867, 1867, 1867, 1867, 1867, 1867, 9: 1867, 19: 1867, 50: 1867, 84: 1867, 1867, 1867, 1867, 1867, 90: 1867, 477: 1867, 484: 1867, 491: 1867, 500: 1867}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 1871, 484: 1871, 664: 4882, 2785, 2786, 2784, 882: 4883, 947: 4912}, + {2: 2487, 2487, 2487, 2487, 2487, 2487, 2487, 10: 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 59: 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 492: 2487, 600: 4535, 668: 4536, 850: 4983, 1097: 5021}, + {2: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 10: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 59: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 492: 1916, 501: 1916, 583: 4974, 805: 5015}, + {2: 2487, 2487, 2487, 2487, 2487, 2487, 2487, 10: 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 59: 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 492: 2487, 501: 2487, 600: 4535, 668: 4536, 850: 4983, 1097: 4984}, + {600: 4972}, + {492: 4968}, // 2355 - {476: 4913}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 4644, 664: 4169, 2785, 2786, 2784, 748: 4643, 831: 4642, 841: 4914}, - {9: 4653, 50: 4915}, - {1869, 1869, 1869, 1869, 1869, 1869, 1869, 9: 1869, 19: 1869, 50: 1869, 85: 1869, 1869, 1869, 1869, 90: 1869, 477: 1869, 484: 1869, 491: 1869, 884: 4916}, - {2285, 2285, 2285, 2285, 2285, 2285, 4899, 9: 2285, 19: 4896, 50: 2285, 85: 4903, 4749, 4456, 4750, 90: 4455, 477: 4898, 484: 4902, 491: 2285, 860: 4900, 862: 4897, 873: 4901, 883: 4895}, + {472, 472, 472, 472, 472, 472, 9: 472, 58: 472, 507: 472}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4969}, + {58: 4970, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {2375, 2375, 2375, 2375, 2375, 2375, 9: 2375, 58: 2375, 161: 4558, 495: 4197, 497: 4196, 507: 2375, 834: 4559, 960: 4809, 1068: 4971}, + {2330, 2330, 2330, 2330, 2330, 2330, 9: 2330, 58: 2330, 507: 2330}, // 2360 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 1871, 664: 4874, 2785, 2786, 2784, 882: 4918}, - {476: 4919}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 4644, 664: 4169, 2785, 2786, 2784, 748: 4643, 831: 4642, 841: 4920}, - {9: 4653, 50: 4921}, - {1869, 1869, 1869, 1869, 1869, 1869, 1869, 9: 1869, 19: 1869, 50: 1869, 85: 1869, 1869, 1869, 1869, 90: 1869, 477: 1869, 484: 1869, 491: 1869, 884: 4922}, + {2: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 10: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 59: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 492: 1916, 583: 4974, 805: 4973}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 1912, 685: 4978, 2849, 688: 2850, 2848, 901: 4977}, + {495: 4197, 497: 4196, 834: 4975}, + {603: 4976}, + {1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 59: 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 492: 1915, 494: 1915, 501: 1915, 507: 1915, 590: 1915, 835: 1915}, // 2365 - {2286, 2286, 2286, 2286, 2286, 2286, 4899, 9: 2286, 19: 4896, 50: 2286, 85: 4903, 4749, 4456, 4750, 90: 4455, 477: 4898, 484: 4902, 491: 2286, 860: 4900, 862: 4897, 873: 4901, 883: 4895}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 1871, 484: 1871, 664: 4882, 2785, 2786, 2784, 882: 4883, 947: 4924}, - {476: 4925}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 4644, 664: 4169, 2785, 2786, 2784, 748: 4643, 831: 4642, 841: 4926}, - {9: 4653, 50: 4927}, + {492: 4979}, + {492: 1911}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 4743, 685: 4255, 2849, 688: 2850, 2848, 766: 4742, 849: 4741, 859: 4980}, + {9: 4752, 58: 4981}, + {664: 4736, 935: 4982}, // 2370 - {1869, 1869, 1869, 1869, 1869, 1869, 1869, 9: 1869, 19: 1869, 50: 1869, 85: 1869, 1869, 1869, 1869, 90: 1869, 477: 1869, 484: 1869, 491: 1869, 884: 4928}, - {2287, 2287, 2287, 2287, 2287, 2287, 4899, 9: 2287, 19: 4896, 50: 2287, 85: 4903, 4749, 4456, 4750, 90: 4455, 477: 4898, 484: 4902, 491: 2287, 860: 4900, 862: 4897, 873: 4901, 883: 4895}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4930, 2785, 2786, 2784}, - {236: 4932, 244: 4934, 247: 4933, 1148: 4931}, - {476: 4935}, + {2331, 2331, 2331, 2331, 2331, 2331, 9: 2331, 58: 2331, 507: 2331}, + {2: 2486, 2486, 2486, 2486, 2486, 2486, 2486, 10: 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 59: 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 492: 2486, 501: 2486}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 1912, 501: 1912, 685: 4986, 2849, 688: 2850, 2848, 901: 4987, 968: 4985}, + {492: 4995}, + {92: 4993, 492: 1911, 501: 1911}, // 2375 - {50: 2236, 476: 2236}, - {50: 2235, 476: 2235}, - {50: 2234, 476: 2234}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 4170, 812: 4936}, - {9: 4172, 50: 4937}, + {492: 1902, 501: 4988}, + {155: 4991, 188: 4990, 205: 4992, 930: 4989}, + {492: 1901}, + {1895, 1895, 1895, 1895, 1895, 1895, 1895, 9: 1895, 19: 1895, 58: 1895, 90: 1895, 92: 1895, 1895, 1895, 1895, 1895, 491: 1895, 1895, 1895, 501: 1895, 507: 1895, 517: 1895}, + {1894, 1894, 1894, 1894, 1894, 1894, 1894, 9: 1894, 19: 1894, 58: 1894, 90: 1894, 92: 1894, 1894, 1894, 1894, 1894, 491: 1894, 1894, 1894, 501: 1894, 507: 1894, 517: 1894}, // 2380 - {2507, 2507, 2507, 2507, 2507, 2507, 9: 2507, 491: 2507}, - {582, 582, 582, 582, 582, 582, 9: 582, 92: 582, 141: 4776, 476: 582, 491: 582, 816: 4775, 833: 4939}, - {2159, 2159, 2159, 2159, 2159, 2159, 9: 2159, 92: 4941, 476: 4942, 491: 2159, 1106: 4940}, - {2510, 2510, 2510, 2510, 2510, 2510, 9: 2510, 491: 2510}, - {511: 2759, 737: 4983}, + {1893, 1893, 1893, 1893, 1893, 1893, 1893, 9: 1893, 19: 1893, 58: 1893, 90: 1893, 92: 1893, 1893, 1893, 1893, 1893, 491: 1893, 1893, 1893, 501: 1893, 507: 1893, 517: 1893}, + {155: 4991, 188: 4990, 205: 4992, 930: 4994}, + {492: 1900}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 4743, 685: 4255, 2849, 688: 2850, 2848, 766: 4742, 849: 4741, 859: 4996}, + {9: 4752, 58: 4997}, // 2385 - {491: 4945, 957: 4944, 1105: 4943}, - {9: 4981, 50: 4980}, - {9: 2157, 50: 2157}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4946, 2785, 2786, 2784}, - {6: 2136, 2136, 9: 2136, 18: 2136, 20: 2136, 22: 2136, 2136, 2136, 2136, 2136, 2136, 50: 2136, 151: 4951, 350: 4950, 476: 2136, 482: 4949, 498: 4948, 652: 2136, 1283: 4947}, + {1910, 1910, 1910, 1910, 1910, 1910, 1910, 9: 1910, 19: 1910, 58: 1910, 92: 1910, 1910, 1910, 1910, 1910, 493: 1910, 501: 1910, 507: 1910, 903: 4998}, + {2332, 2332, 2332, 2332, 2332, 2332, 5003, 9: 2332, 19: 5000, 58: 2332, 92: 5007, 4853, 4555, 4854, 4554, 493: 5002, 501: 5006, 507: 2332, 878: 5004, 880: 5001, 891: 5005, 902: 4999}, + {1909, 1909, 1909, 1909, 1909, 1909, 1909, 9: 1909, 19: 1909, 58: 1909, 90: 1909, 92: 1909, 1909, 1909, 1909, 1909, 493: 1909, 501: 1909, 507: 1909, 517: 1909}, + {518: 4396, 525: 2107, 758: 5013}, + {1907, 1907, 1907, 1907, 1907, 1907, 1907, 9: 1907, 19: 1907, 58: 1907, 90: 1907, 92: 1907, 1907, 1907, 1907, 1907, 493: 1907, 501: 1907, 507: 1907, 517: 1907}, // 2390 - {6: 2149, 2149, 9: 2149, 18: 2149, 20: 2149, 22: 2149, 2149, 2149, 2149, 2149, 2149, 50: 2149, 476: 2149, 652: 2149, 956: 4967}, - {154: 4952, 547: 4953}, - {6: 2133, 2133, 9: 2133, 18: 2133, 20: 2133, 22: 2133, 2133, 2133, 2133, 2133, 2133, 50: 2133, 476: 2133, 652: 2133}, - {6: 2131, 2131, 9: 2131, 18: 2131, 20: 2131, 22: 2131, 2131, 2131, 2131, 2131, 2131, 50: 2131, 476: 2131, 652: 2131}, - {6: 2130, 2130, 9: 2130, 18: 2130, 20: 2130, 22: 2130, 2130, 2130, 2130, 2130, 2130, 50: 2130, 476: 2130, 652: 2130}, + {381: 5011}, + {494: 5010}, + {1904, 1904, 1904, 1904, 1904, 1904, 1904, 9: 1904, 19: 1904, 58: 1904, 90: 1904, 92: 1904, 1904, 1904, 1904, 1904, 493: 1904, 501: 1904, 507: 1904, 517: 1904}, + {1903, 1903, 1903, 1903, 1903, 1903, 1903, 9: 1903, 19: 1903, 58: 1903, 90: 1903, 92: 1903, 1903, 1903, 1903, 1903, 493: 1903, 501: 1903, 507: 1903, 517: 1903}, + {155: 4991, 188: 4990, 205: 4992, 930: 5009}, // 2395 - {159: 4962}, - {476: 4954}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 658: 4956, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 4957, 950: 4958, 1087: 4955}, - {9: 4960, 50: 4959}, - {9: 1951, 50: 1951}, + {155: 4991, 188: 4990, 205: 4992, 930: 5008}, + {1896, 1896, 1896, 1896, 1896, 1896, 1896, 9: 1896, 19: 1896, 58: 1896, 90: 1896, 92: 1896, 1896, 1896, 1896, 1896, 491: 1896, 493: 1896, 501: 1896, 507: 1896, 517: 1896}, + {1897, 1897, 1897, 1897, 1897, 1897, 1897, 9: 1897, 19: 1897, 58: 1897, 90: 1897, 92: 1897, 1897, 1897, 1897, 1897, 491: 1897, 493: 1897, 501: 1897, 507: 1897, 517: 1897}, + {1905, 1905, 1905, 1905, 1905, 1905, 1905, 9: 1905, 19: 1905, 58: 1905, 90: 1905, 92: 1905, 1905, 1905, 1905, 1905, 493: 1905, 501: 1905, 507: 1905, 517: 1905}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5012, 2849, 688: 2850, 2848}, // 2400 - {9: 1950, 50: 1950, 488: 3712, 3713, 3718, 523: 3714, 550: 3715, 3716, 3709, 3719, 3708, 3717, 3710, 3711}, - {9: 1938, 50: 1938}, - {6: 2132, 2132, 9: 2132, 18: 2132, 20: 2132, 22: 2132, 2132, 2132, 2132, 2132, 2132, 50: 2132, 476: 2132, 652: 2132}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 658: 4956, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 4957, 950: 4961}, - {9: 1937, 50: 1937}, + {1906, 1906, 1906, 1906, 1906, 1906, 1906, 9: 1906, 19: 1906, 58: 1906, 90: 1906, 92: 1906, 1906, 1906, 1906, 1906, 493: 1906, 501: 1906, 507: 1906, 517: 1906}, + {525: 2823, 755: 2822, 762: 5014}, + {1908, 1908, 1908, 1908, 1908, 1908, 1908, 9: 1908, 19: 1908, 58: 1908, 90: 1908, 92: 1908, 1908, 1908, 1908, 1908, 493: 1908, 501: 1908, 507: 1908, 517: 1908}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 1912, 501: 1912, 685: 4986, 2849, 688: 2850, 2848, 901: 4987, 968: 5016}, + {492: 5017}, // 2405 - {476: 4964, 658: 4963}, - {6: 2135, 2135, 9: 2135, 18: 2135, 20: 2135, 22: 2135, 2135, 2135, 2135, 2135, 2135, 50: 2135, 476: 2135, 652: 2135}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 658: 4956, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 4957, 950: 4958, 1087: 4965}, - {9: 4960, 50: 4966}, - {6: 2134, 2134, 9: 2134, 18: 2134, 20: 2134, 22: 2134, 2134, 2134, 2134, 2134, 2134, 50: 2134, 476: 2134, 652: 2134}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 4743, 685: 4255, 2849, 688: 2850, 2848, 766: 4742, 849: 4741, 859: 5018}, + {9: 4752, 58: 5019}, + {1910, 1910, 1910, 1910, 1910, 1910, 1910, 9: 1910, 19: 1910, 58: 1910, 92: 1910, 1910, 1910, 1910, 1910, 493: 1910, 501: 1910, 507: 1910, 903: 5020}, + {2333, 2333, 2333, 2333, 2333, 2333, 5003, 9: 2333, 19: 5000, 58: 2333, 92: 5007, 4853, 4555, 4854, 4554, 493: 5002, 501: 5006, 507: 2333, 878: 5004, 880: 5001, 891: 5005, 902: 4999}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 1912, 685: 4978, 2849, 688: 2850, 2848, 901: 5022}, // 2410 - {6: 4267, 4971, 9: 2154, 18: 4223, 20: 4275, 22: 4268, 4271, 4270, 4273, 4274, 4276, 50: 2154, 476: 4969, 652: 4272, 785: 4277, 818: 4970, 1326: 4968}, - {9: 2155, 50: 2155}, - {91: 4974, 1150: 4973, 1325: 4972}, - {2148, 2148, 6: 2148, 2148, 9: 2148, 18: 2148, 20: 2148, 22: 2148, 2148, 2148, 2148, 2148, 2148, 50: 2148, 476: 2148, 652: 2148}, - {22: 4407}, + {492: 5023}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 4743, 685: 4255, 2849, 688: 2850, 2848, 766: 4742, 849: 4741, 859: 5024}, + {9: 4752, 58: 5025}, + {1910, 1910, 1910, 1910, 1910, 1910, 1910, 9: 1910, 19: 1910, 58: 1910, 92: 1910, 1910, 1910, 1910, 1910, 493: 1910, 501: 1910, 507: 1910, 903: 5026}, + {2334, 2334, 2334, 2334, 2334, 2334, 5003, 9: 2334, 19: 5000, 58: 2334, 92: 5007, 4853, 4555, 4854, 4554, 493: 5002, 501: 5006, 507: 2334, 878: 5004, 880: 5001, 891: 5005, 902: 4999}, // 2415 - {9: 4978, 50: 4977}, - {9: 2152, 50: 2152}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4975, 2785, 2786, 2784}, - {6: 2149, 2149, 9: 2149, 18: 2149, 20: 2149, 22: 2149, 2149, 2149, 2149, 2149, 2149, 50: 2149, 652: 2149, 956: 4976}, - {6: 4267, 4971, 9: 2150, 18: 4223, 20: 4275, 22: 4268, 4271, 4270, 4273, 4274, 4276, 50: 2150, 652: 4272, 785: 4277, 818: 4970}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 1912, 501: 1912, 685: 4986, 2849, 688: 2850, 2848, 901: 4987, 968: 5028}, + {492: 5029}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 4743, 685: 4255, 2849, 688: 2850, 2848, 766: 4742, 849: 4741, 859: 5030}, + {9: 4752, 58: 5031}, + {1910, 1910, 1910, 1910, 1910, 1910, 1910, 9: 1910, 19: 1910, 58: 1910, 92: 1910, 1910, 1910, 1910, 1910, 493: 1910, 501: 1910, 507: 1910, 903: 5032}, // 2420 - {9: 2153, 50: 2153}, - {91: 4974, 1150: 4979}, - {9: 2151, 50: 2151}, - {2158, 2158, 2158, 2158, 2158, 2158, 9: 2158, 475: 2158, 2158, 2158, 481: 2158, 491: 2158, 2158, 498: 2158, 507: 2158, 572: 2158, 649: 2158}, - {491: 4945, 957: 4982}, + {2335, 2335, 2335, 2335, 2335, 2335, 5003, 9: 2335, 19: 5000, 58: 2335, 92: 5007, 4853, 4555, 4854, 4554, 493: 5002, 501: 5006, 507: 2335, 878: 5004, 880: 5001, 891: 5005, 902: 4999}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5034, 2849, 688: 2850, 2848}, + {247: 5036, 255: 5038, 258: 5037, 1173: 5035}, + {492: 5039}, + {58: 2280, 492: 2280}, // 2425 - {9: 2156, 50: 2156}, - {2509, 2509, 2509, 2509, 2509, 2509, 9: 2509, 491: 2509}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 4986, 664: 4169, 2785, 2786, 2784, 748: 4482, 853: 4985}, - {2435, 2435, 2435, 2435, 2435, 2435, 9: 2435, 4757, 4758, 491: 2435, 934: 4994}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 584: 2426, 593: 2426, 2426, 645: 2426, 4615, 652: 2426, 664: 4169, 2785, 2786, 2784, 678: 2426, 2426, 748: 4482, 837: 4856, 853: 4988, 908: 4989, 973: 4990, 1153: 4987}, + {58: 2279, 492: 2279}, + {58: 2278, 492: 2278}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 4256, 831: 5040}, + {9: 4258, 58: 5041}, + {2555, 2555, 2555, 2555, 2555, 2555, 9: 2555, 507: 2555}, // 2430 - {9: 4992, 50: 4991}, - {9: 450, 50: 450}, - {9: 449, 50: 449}, - {9: 448, 50: 448}, - {2512, 2512, 2512, 2512, 2512, 2512, 9: 2512, 491: 2512}, + {604, 604, 604, 604, 604, 604, 9: 604, 98: 604, 150: 4880, 492: 604, 507: 604, 835: 4879, 851: 5043}, + {2202, 2202, 2202, 2202, 2202, 2202, 9: 2202, 98: 5045, 492: 5046, 507: 2202, 1129: 5044}, + {2558, 2558, 2558, 2558, 2558, 2558, 9: 2558, 507: 2558}, + {525: 2823, 755: 5087}, + {507: 5049, 978: 5048, 1128: 5047}, // 2435 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 584: 2426, 593: 2426, 2426, 645: 2426, 4615, 652: 2426, 664: 4169, 2785, 2786, 2784, 678: 2426, 2426, 748: 4482, 837: 4856, 853: 4988, 908: 4989, 973: 4993}, - {9: 447, 50: 447}, - {2513, 2513, 2513, 2513, 2513, 2513, 9: 2513, 491: 2513}, - {16: 3862, 508: 3863, 650: 3861, 779: 4996}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 482: 4998, 533: 3787, 664: 3517, 2785, 2786, 2784, 742: 3786, 811: 4997}, + {9: 5085, 58: 5084}, + {9: 2200, 58: 2200}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5050, 2849, 688: 2850, 2848}, + {6: 2179, 2179, 9: 2179, 18: 2179, 20: 2179, 22: 2179, 2179, 2179, 2179, 2179, 2179, 58: 2179, 160: 5055, 225: 5054, 492: 2179, 496: 5053, 515: 5052, 668: 2179, 1308: 5051}, + {6: 2192, 2192, 9: 2192, 18: 2192, 20: 2192, 22: 2192, 2192, 2192, 2192, 2192, 2192, 58: 2192, 492: 2192, 668: 2192, 977: 5071}, // 2440 - {277, 277, 277, 277, 277, 277, 9: 277, 487: 5000, 491: 277, 1097: 5002}, - {277, 277, 277, 277, 277, 277, 9: 277, 487: 5000, 491: 277, 1097: 4999}, - {2514, 2514, 2514, 2514, 2514, 2514, 9: 2514, 491: 2514}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 533: 3515, 664: 3517, 2785, 2786, 2784, 742: 3514, 876: 5001}, - {276, 276, 276, 276, 276, 276, 9: 276, 491: 276}, + {163: 5056, 564: 5057}, + {6: 2176, 2176, 9: 2176, 18: 2176, 20: 2176, 22: 2176, 2176, 2176, 2176, 2176, 2176, 58: 2176, 492: 2176, 668: 2176}, + {6: 2174, 2174, 9: 2174, 18: 2174, 20: 2174, 22: 2174, 2174, 2174, 2174, 2174, 2174, 58: 2174, 492: 2174, 668: 2174}, + {6: 2173, 2173, 9: 2173, 18: 2173, 20: 2173, 22: 2173, 2173, 2173, 2173, 2173, 2173, 58: 2173, 492: 2173, 668: 2173}, + {168: 5066}, // 2445 - {2515, 2515, 2515, 2515, 2515, 2515, 9: 2515, 491: 2515}, - {193: 5004}, - {511: 2759, 737: 2758, 745: 5005}, - {2519, 2519, 2519, 2519, 2519, 2519, 9: 2519, 186: 5006, 491: 2519, 1084: 5007}, - {270: 5008}, + {492: 5058}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 675: 5060, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 5061, 971: 5062, 1110: 5059}, + {9: 5064, 58: 5063}, + {9: 1993, 58: 1993}, + {9: 1992, 58: 1992, 504: 3792, 3793, 3798, 541: 3794, 566: 3795, 3796, 3789, 3799, 3788, 3797, 3790, 3791}, // 2450 - {2516, 2516, 2516, 2516, 2516, 2516, 9: 2516, 491: 2516}, - {478: 5010, 1322: 5009}, - {2518, 2518, 2518, 2518, 2518, 2518, 9: 5011, 16: 2518, 18: 2518, 21: 2518, 482: 2518, 487: 2518, 491: 2518, 508: 2518, 2518, 650: 2518}, - {275, 275, 275, 275, 275, 275, 9: 275, 16: 275, 18: 275, 21: 275, 482: 275, 487: 275, 491: 275, 508: 275, 275, 650: 275}, - {478: 5012}, + {9: 1980, 58: 1980}, + {6: 2175, 2175, 9: 2175, 18: 2175, 20: 2175, 22: 2175, 2175, 2175, 2175, 2175, 2175, 58: 2175, 492: 2175, 668: 2175}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 675: 5060, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 5061, 971: 5065}, + {9: 1979, 58: 1979}, + {492: 5068, 675: 5067}, // 2455 - {274, 274, 274, 274, 274, 274, 9: 274, 16: 274, 18: 274, 21: 274, 482: 274, 487: 274, 491: 274, 508: 274, 274, 650: 274}, - {8: 409, 29: 409}, - {403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 15: 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 475: 403, 403, 403, 481: 403, 403, 403, 487: 403, 491: 403, 403, 498: 403, 506: 403, 403, 403, 572: 403, 649: 403, 403, 652: 403}, - {6: 4267, 4269, 410, 15: 4286, 2193, 4284, 4223, 4288, 4275, 4304, 4268, 4271, 4270, 4273, 4274, 4276, 4283, 410, 4294, 4295, 4281, 4282, 4287, 4289, 4301, 4300, 4306, 4302, 4299, 4292, 4297, 4298, 4291, 4293, 4296, 4285, 482: 4266, 4303, 487: 2193, 506: 5013, 508: 2193, 650: 2193, 652: 4272, 785: 4277, 797: 4279, 818: 4278, 840: 4280, 843: 4290, 847: 5016}, - {402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 15: 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 475: 402, 402, 402, 481: 402, 402, 402, 487: 402, 491: 402, 402, 498: 402, 506: 402, 402, 402, 572: 402, 649: 402, 402, 652: 402}, + {6: 2178, 2178, 9: 2178, 18: 2178, 20: 2178, 22: 2178, 2178, 2178, 2178, 2178, 2178, 58: 2178, 492: 2178, 668: 2178}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 675: 5060, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 5061, 971: 5062, 1110: 5069}, + {9: 5064, 58: 5070}, + {6: 2177, 2177, 9: 2177, 18: 2177, 20: 2177, 22: 2177, 2177, 2177, 2177, 2177, 2177, 58: 2177, 492: 2177, 668: 2177}, + {6: 4353, 5075, 9: 2197, 18: 4309, 20: 4361, 22: 4354, 4357, 4356, 4359, 4360, 4362, 58: 2197, 492: 5073, 668: 4358, 803: 4363, 837: 5074, 1351: 5072}, // 2460 - {478: 5019, 482: 5018}, - {2528, 2528, 2528, 2528, 2528, 2528, 9: 2528, 491: 2528}, - {2527, 2527, 2527, 2527, 2527, 2527, 9: 2527, 491: 2527}, - {478: 5022, 482: 5021}, - {2530, 2530, 2530, 2530, 2530, 2530, 9: 2530, 491: 2530}, + {9: 2198, 58: 2198}, + {97: 5078, 1175: 5077, 1350: 5076}, + {2191, 2191, 6: 2191, 2191, 9: 2191, 18: 2191, 20: 2191, 22: 2191, 2191, 2191, 2191, 2191, 2191, 58: 2191, 492: 2191, 668: 2191}, + {22: 4506}, + {9: 5082, 58: 5081}, // 2465 - {2529, 2529, 2529, 2529, 2529, 2529, 9: 2529, 491: 2529}, - {2: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 10: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 51: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 478: 2064, 482: 2064, 502: 4307, 509: 5025, 741: 5024}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 5027, 482: 5029, 664: 5030, 2785, 2786, 2784, 890: 5028}, - {482: 5026}, - {2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 15: 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 50: 2531, 475: 2531, 2531, 2531, 481: 2531, 2531, 2531, 487: 2531, 491: 2531, 2531, 498: 2531, 506: 2531, 2531, 2531, 2531, 572: 2531, 649: 2531, 2531, 652: 2531}, + {9: 2195, 58: 2195}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5079, 2849, 688: 2850, 2848}, + {6: 2192, 2192, 9: 2192, 18: 2192, 20: 2192, 22: 2192, 2192, 2192, 2192, 2192, 2192, 58: 2192, 668: 2192, 977: 5080}, + {6: 4353, 5075, 9: 2193, 18: 4309, 20: 4361, 22: 4354, 4357, 4356, 4359, 4360, 4362, 58: 2193, 668: 4358, 803: 4363, 837: 5074}, + {9: 2196, 58: 2196}, // 2470 - {2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 15: 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 50: 2534, 475: 2534, 2534, 2534, 481: 2534, 2534, 2534, 487: 2534, 491: 2534, 2534, 498: 2534, 506: 2534, 2534, 2534, 2534, 572: 2534, 649: 2534, 2534, 652: 2534}, - {2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 15: 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 50: 2533, 475: 2533, 2533, 2533, 481: 2533, 2533, 2533, 487: 2533, 491: 2533, 2533, 498: 2533, 506: 2533, 2533, 2533, 2533, 572: 2533, 649: 2533, 2533, 652: 2533}, - {2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 15: 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 50: 2532, 475: 2532, 2532, 2532, 481: 2532, 2532, 2532, 487: 2532, 491: 2532, 2532, 498: 2532, 506: 2532, 2532, 2532, 2532, 572: 2532, 649: 2532, 2532, 652: 2532}, - {2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 15: 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 50: 2209, 89: 2209, 93: 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 475: 2209, 2209, 2209, 481: 2209, 2209, 2209, 487: 2209, 491: 2209, 2209, 498: 2209, 506: 2209, 2209, 2209, 2209, 572: 2209, 649: 2209, 2209, 652: 2209}, - {193: 5036}, + {97: 5078, 1175: 5083}, + {9: 2194, 58: 2194}, + {2201, 2201, 2201, 2201, 2201, 2201, 9: 2201, 491: 2201, 2201, 2201, 498: 2201, 507: 2201, 2201, 515: 2201, 522: 2201, 588: 2201, 665: 2201}, + {507: 5049, 978: 5086}, + {9: 2199, 58: 2199}, // 2475 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4780, 2785, 2786, 2784, 791: 5033}, - {2550, 2550, 9: 4781, 170: 5034}, - {193: 5035}, - {2549, 2549}, - {2551, 2551}, + {2557, 2557, 2557, 2557, 2557, 2557, 9: 2557, 507: 2557}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 5090, 685: 4255, 2849, 688: 2850, 2848, 766: 4581, 871: 5089}, + {2483, 2483, 2483, 2483, 2483, 2483, 9: 2483, 4861, 4862, 507: 2483, 954: 5098}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 600: 2474, 607: 2474, 613: 2474, 662: 2474, 4714, 668: 2474, 685: 4255, 2849, 688: 2850, 2848, 696: 2474, 2474, 766: 4581, 855: 4960, 871: 5092, 928: 5093, 993: 5094, 1178: 5091}, + {9: 5096, 58: 5095}, // 2480 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4780, 2785, 2786, 2784, 791: 5038}, - {2383, 2383, 9: 4781, 477: 5041, 652: 5040, 808: 5039}, - {2554, 2554}, - {922, 922, 3161, 2991, 3026, 2871, 2907, 3028, 2798, 922, 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 477: 922, 594: 5058, 664: 5057, 2785, 2786, 2784, 861: 5056}, - {511: 5046, 576: 3451, 3450, 737: 5044, 824: 5045, 996: 5043, 1182: 5042}, + {9: 469, 58: 469}, + {9: 468, 58: 468}, + {9: 467, 58: 467}, + {2560, 2560, 2560, 2560, 2560, 2560, 9: 2560, 507: 2560}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 600: 2474, 607: 2474, 613: 2474, 662: 2474, 4714, 668: 2474, 685: 4255, 2849, 688: 2850, 2848, 696: 2474, 2474, 766: 4581, 855: 4960, 871: 5092, 928: 5093, 993: 5097}, // 2485 - {2382, 2382, 9: 5054}, - {2381, 2381, 9: 2381}, - {235: 5048, 239: 5050, 286: 5051, 304: 5049}, - {197: 5047}, - {197: 2239, 235: 1990, 239: 1990, 286: 1990, 304: 1990}, + {9: 466, 58: 466}, + {2561, 2561, 2561, 2561, 2561, 2561, 9: 2561, 507: 2561}, + {16: 3942, 514: 3943, 667: 3941, 798: 5100}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 496: 5102, 549: 3867, 685: 3597, 2849, 688: 2850, 2848, 760: 3866, 830: 5101}, + {293, 293, 293, 293, 293, 293, 9: 293, 499: 5104, 507: 293, 1120: 5106}, // 2490 - {2374, 2374, 9: 2374}, - {2379, 2379, 9: 2379}, - {2378, 2378, 9: 2378}, - {335: 5052, 409: 5053}, - {2375, 2375, 9: 2375}, + {293, 293, 293, 293, 293, 293, 9: 293, 499: 5104, 507: 293, 1120: 5103}, + {2562, 2562, 2562, 2562, 2562, 2562, 9: 2562, 507: 2562}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 549: 3595, 685: 3597, 2849, 688: 2850, 2848, 760: 3594, 894: 5105}, + {292, 292, 292, 292, 292, 292, 9: 292, 507: 292}, + {2563, 2563, 2563, 2563, 2563, 2563, 9: 2563, 507: 2563}, // 2495 - {2377, 2377, 9: 2377}, - {2376, 2376, 9: 2376}, - {511: 5046, 576: 3451, 3450, 737: 5044, 824: 5045, 996: 5055}, - {2380, 2380, 9: 2380}, - {2383, 2383, 9: 5060, 477: 5041, 808: 5059}, + {203: 5108}, + {525: 2823, 755: 2822, 762: 5109}, + {2567, 2567, 2567, 2567, 2567, 2567, 9: 2567, 195: 5110, 507: 2567, 1107: 5111}, + {281: 5112}, + {2564, 2564, 2564, 2564, 2564, 2564, 9: 2564, 507: 2564}, // 2500 - {921, 921, 9: 921, 50: 921, 477: 921}, - {919, 919, 9: 919, 50: 919, 477: 919}, - {2553, 2553}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 594: 5062, 664: 5061, 2785, 2786, 2784}, - {920, 920, 9: 920, 50: 920, 477: 920}, + {494: 5114, 1347: 5113}, + {2566, 2566, 2566, 2566, 2566, 2566, 9: 5115, 16: 2566, 18: 2566, 21: 2566, 496: 2566, 499: 2566, 507: 2566, 514: 2566, 526: 2566, 667: 2566}, + {291, 291, 291, 291, 291, 291, 9: 291, 16: 291, 18: 291, 21: 291, 496: 291, 499: 291, 507: 291, 514: 291, 526: 291, 667: 291}, + {494: 5116}, + {290, 290, 290, 290, 290, 290, 9: 290, 16: 290, 18: 290, 21: 290, 496: 290, 499: 290, 507: 290, 514: 290, 526: 290, 667: 290}, // 2505 - {918, 918, 9: 918, 50: 918, 477: 918}, - {2555, 2555}, - {2526, 2526}, - {372: 5175}, - {491: 5167}, + {8: 425, 29: 425}, + {419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 15: 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 491: 419, 419, 419, 496: 419, 498: 419, 419, 419, 507: 419, 419, 514: 419, 419, 522: 419, 524: 419, 588: 419, 665: 419, 667: 419, 419}, + {6: 4353, 4355, 426, 15: 4372, 2236, 4370, 4309, 4374, 4361, 4390, 4354, 4357, 4356, 4359, 4360, 4362, 4369, 426, 4380, 4381, 4391, 4367, 4368, 4373, 4375, 4387, 4386, 4395, 4388, 4385, 4378, 4383, 4384, 4377, 4379, 4382, 4371, 4392, 4393, 496: 4352, 499: 2236, 4389, 514: 2236, 524: 5117, 667: 2236, 4358, 803: 4363, 816: 4365, 837: 4364, 858: 4366, 861: 4376, 865: 5120}, + {418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 15: 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 491: 418, 418, 418, 496: 418, 498: 418, 418, 418, 507: 418, 418, 514: 418, 418, 522: 418, 524: 418, 588: 418, 665: 418, 667: 418, 418}, + {494: 5123, 496: 5122}, // 2510 - {658: 5160}, - {10: 5153}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 663: 5071, 5070, 2785, 2786, 2784}, - {2149, 2149, 6: 2149, 2149, 18: 2149, 20: 2149, 22: 2149, 2149, 2149, 2149, 2149, 2149, 205: 4224, 652: 2149, 931: 5151, 956: 5152}, - {146: 2167, 359: 5076, 398: 5077, 530: 5075, 584: 2167, 1079: 5078, 5073, 1151: 5074, 1285: 5072}, + {2577, 2577, 2577, 2577, 2577, 2577, 9: 2577, 507: 2577}, + {2576, 2576, 2576, 2576, 2576, 2576, 9: 2576, 507: 2576}, + {494: 5126, 496: 5125}, + {2579, 2579, 2579, 2579, 2579, 2579, 9: 2579, 507: 2579}, + {2578, 2578, 2578, 2578, 2578, 2578, 9: 2578, 507: 2578}, // 2515 - {2161, 2161, 91: 2161, 5141, 475: 2161, 2161, 2161, 481: 2161, 492: 2161, 498: 2161, 507: 2161, 572: 2161, 649: 2161, 1286: 5140}, - {146: 5128, 584: 5127}, - {2185, 2185, 91: 2185, 2185, 475: 2185, 2185, 2185, 481: 2185, 492: 2185, 498: 2185, 507: 2185, 572: 2185, 649: 2185}, - {103: 3970, 112: 3969, 476: 5091, 839: 5092}, - {103: 3970, 112: 3969, 476: 5084, 839: 5085}, + {2: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 10: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 59: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 494: 2107, 496: 2107, 518: 4396, 526: 5129, 758: 5128}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 5131, 496: 5133, 685: 5134, 2849, 688: 2850, 2848, 909: 5132}, + {496: 5130}, + {2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 15: 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 58: 2580, 491: 2580, 2580, 2580, 496: 2580, 498: 2580, 2580, 2580, 507: 2580, 2580, 514: 2580, 2580, 522: 2580, 524: 2580, 526: 2580, 588: 2580, 665: 2580, 667: 2580, 2580}, + {2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 15: 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 58: 2583, 491: 2583, 2583, 2583, 496: 2583, 498: 2583, 2583, 2583, 507: 2583, 2583, 514: 2583, 2583, 522: 2583, 524: 2583, 526: 2583, 588: 2583, 665: 2583, 667: 2583, 2583}, // 2520 - {2178, 2178, 91: 2178, 2178, 475: 2178, 2178, 2178, 481: 2178, 492: 2178, 496: 5080, 498: 2178, 507: 2178, 572: 2178, 581: 5079, 649: 2178}, - {146: 2166, 584: 2166}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 5082}, - {511: 2759, 737: 2758, 745: 5081}, - {2179, 2179, 91: 2179, 2179, 475: 2179, 2179, 2179, 481: 2179, 492: 2179, 498: 2179, 507: 2179, 572: 2179, 649: 2179}, + {2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 15: 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 58: 2582, 491: 2582, 2582, 2582, 496: 2582, 498: 2582, 2582, 2582, 507: 2582, 2582, 514: 2582, 2582, 522: 2582, 524: 2582, 526: 2582, 588: 2582, 665: 2582, 667: 2582, 2582}, + {2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 15: 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 58: 2581, 491: 2581, 2581, 2581, 496: 2581, 498: 2581, 2581, 2581, 507: 2581, 2581, 514: 2581, 2581, 522: 2581, 524: 2581, 526: 2581, 588: 2581, 665: 2581, 667: 2581, 2581}, + {2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 15: 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 58: 2253, 91: 2253, 99: 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 491: 2253, 2253, 2253, 496: 2253, 498: 2253, 2253, 2253, 507: 2253, 2253, 514: 2253, 2253, 522: 2253, 524: 2253, 526: 2253, 588: 2253, 665: 2253, 667: 2253, 2253}, + {203: 5140}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4884, 2849, 688: 2850, 2848, 809: 5137}, // 2525 - {105: 3490, 3486, 109: 3483, 3498, 113: 3485, 3482, 3484, 3488, 3489, 3494, 3493, 3492, 3496, 3497, 3491, 3495, 3487, 510: 3371, 512: 3369, 3370, 3368, 3366, 535: 3480, 3477, 3479, 3478, 3474, 3476, 3475, 3472, 3473, 3471, 3481, 738: 3367, 3365, 800: 3470, 820: 5083}, - {2180, 2180, 91: 2180, 2180, 475: 2180, 2180, 2180, 481: 2180, 492: 2180, 498: 2180, 507: 2180, 572: 2180, 649: 2180}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 5089}, - {476: 5086}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 4170, 812: 5087}, + {2605, 2605, 9: 4885, 180: 5138}, + {203: 5139}, + {2604, 2604}, + {2606, 2606}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4884, 2849, 688: 2850, 2848, 809: 5142}, // 2530 - {9: 4172, 50: 5088}, - {2181, 2181, 91: 2181, 2181, 475: 2181, 2181, 2181, 481: 2181, 492: 2181, 498: 2181, 507: 2181, 572: 2181, 649: 2181}, - {50: 5090, 488: 3712, 3713, 3718, 523: 3714, 550: 3715, 3716, 3709, 3719, 3708, 3717, 3710, 3711}, - {2182, 2182, 91: 2182, 2182, 475: 2182, 2182, 2182, 481: 2182, 492: 2182, 498: 2182, 507: 2182, 572: 2182, 649: 2182}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 5124}, + {2431, 2431, 9: 4885, 493: 5145, 668: 5144, 826: 5143}, + {2609, 2609}, + {945, 945, 3234, 3056, 3092, 2935, 2972, 3094, 2862, 945, 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 493: 945, 613: 5162, 685: 5161, 2849, 688: 2850, 2848, 879: 5160}, + {525: 5150, 593: 3531, 3530, 755: 5148, 842: 5149, 1017: 5147, 1207: 5146}, + {2430, 2430, 9: 5158}, // 2535 - {476: 5093}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 4170, 812: 5094}, - {9: 4172, 50: 5095}, - {2177, 2177, 91: 2177, 2177, 475: 2177, 2177, 2177, 481: 2177, 492: 2177, 498: 2177, 507: 2177, 572: 2177, 581: 5097, 649: 2177, 1107: 5096}, - {2183, 2183, 91: 2183, 2183, 475: 2183, 2183, 2183, 481: 2183, 492: 2183, 498: 2183, 507: 2183, 572: 2183, 649: 2183}, + {2429, 2429, 9: 2429}, + {245: 5152, 250: 5154, 297: 5155, 316: 5153}, + {207: 5151}, + {207: 2283, 245: 2032, 250: 2032, 297: 2032, 316: 2032}, + {2422, 2422, 9: 2422}, // 2540 - {476: 5098}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 5100, 1246: 5099}, - {50: 5102}, - {50: 2175, 105: 3490, 3486, 109: 3483, 3498, 113: 3485, 3482, 3484, 3488, 3489, 3494, 3493, 3492, 3496, 3497, 3491, 3495, 3487, 488: 3712, 3713, 3718, 523: 3714, 535: 3480, 3477, 3479, 3478, 3474, 3476, 3475, 3472, 3473, 3471, 3481, 550: 3715, 3716, 3709, 3719, 3708, 3717, 3710, 3711, 800: 3470, 820: 5101}, - {50: 2174}, + {2427, 2427, 9: 2427}, + {2426, 2426, 9: 2426}, + {346: 5156, 421: 5157}, + {2423, 2423, 9: 2423}, + {2425, 2425, 9: 2425}, // 2545 - {2169, 2169, 10: 5104, 91: 2169, 2169, 475: 2169, 2169, 2169, 481: 2169, 492: 2169, 495: 2169, 498: 2169, 507: 2169, 572: 2169, 649: 2169, 658: 2169, 1224: 5103}, - {2173, 2173, 91: 2173, 2173, 475: 2173, 2173, 2173, 481: 2173, 492: 2173, 495: 5119, 498: 2173, 507: 2173, 572: 2173, 649: 2173, 658: 2173, 1264: 5118}, - {491: 5105}, - {154: 5106}, - {159: 5107}, + {2424, 2424, 9: 2424}, + {525: 5150, 593: 3531, 3530, 755: 5148, 842: 5149, 1017: 5159}, + {2428, 2428, 9: 2428}, + {2431, 2431, 9: 5164, 493: 5145, 826: 5163}, + {944, 944, 9: 944, 58: 944, 493: 944}, // 2550 - {476: 5108}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 5109}, - {50: 5110, 488: 3712, 3713, 3718, 523: 3714, 550: 3715, 3716, 3709, 3719, 3708, 3717, 3710, 3711}, - {185: 5111}, - {491: 5112}, + {942, 942, 9: 942, 58: 942, 493: 942}, + {2608, 2608}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 613: 5166, 685: 5165, 2849, 688: 2850, 2848}, + {943, 943, 9: 943, 58: 943, 493: 943}, + {941, 941, 9: 941, 58: 941, 493: 941}, // 2555 - {154: 5113}, - {159: 5114}, - {476: 5115}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 5116}, - {50: 5117, 488: 3712, 3713, 3718, 523: 3714, 550: 3715, 3716, 3709, 3719, 3708, 3717, 3710, 3711}, + {2610, 2610}, + {2575, 2575}, + {32: 5280, 383: 5279}, + {507: 5271}, + {675: 5264}, // 2560 - {2168, 2168, 91: 2168, 2168, 475: 2168, 2168, 2168, 481: 2168, 492: 2168, 495: 2168, 498: 2168, 507: 2168, 572: 2168, 649: 2168, 658: 2168}, - {2171, 2171, 91: 2171, 2171, 475: 2171, 2171, 2171, 481: 2171, 492: 2171, 498: 2171, 507: 2171, 572: 2171, 649: 2171, 658: 5122, 1262: 5121}, - {491: 5120}, - {2172, 2172, 91: 2172, 2172, 475: 2172, 2172, 2172, 481: 2172, 492: 2172, 498: 2172, 507: 2172, 572: 2172, 649: 2172, 658: 2172}, - {2176, 2176, 91: 2176, 2176, 475: 2176, 2176, 2176, 481: 2176, 492: 2176, 498: 2176, 507: 2176, 572: 2176, 649: 2176}, + {10: 5257}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 681: 5175, 685: 5174, 2849, 688: 2850, 2848}, + {2192, 2192, 6: 2192, 2192, 18: 2192, 20: 2192, 22: 2192, 2192, 2192, 2192, 2192, 2192, 215: 4310, 668: 2192, 951: 5255, 977: 5256}, + {155: 2210, 369: 5180, 410: 5181, 546: 5179, 600: 2210, 1102: 5182, 5177, 1176: 5178, 1310: 5176}, + {2204, 2204, 97: 2204, 5245, 491: 2204, 2204, 2204, 498: 2204, 508: 2204, 515: 2204, 522: 2204, 588: 2204, 665: 2204, 1311: 5244}, // 2565 - {491: 5123}, - {2170, 2170, 91: 2170, 2170, 475: 2170, 2170, 2170, 481: 2170, 492: 2170, 498: 2170, 507: 2170, 572: 2170, 649: 2170}, - {50: 5125, 488: 3712, 3713, 3718, 523: 3714, 550: 3715, 3716, 3709, 3719, 3708, 3717, 3710, 3711}, - {2177, 2177, 91: 2177, 2177, 475: 2177, 2177, 2177, 481: 2177, 492: 2177, 498: 2177, 507: 2177, 572: 2177, 581: 5097, 649: 2177, 1107: 5126}, - {2184, 2184, 91: 2184, 2184, 475: 2184, 2184, 2184, 481: 2184, 492: 2184, 498: 2184, 507: 2184, 572: 2184, 649: 2184}, + {155: 5232, 600: 5231}, + {2228, 2228, 97: 2228, 2228, 491: 2228, 2228, 2228, 498: 2228, 508: 2228, 515: 2228, 522: 2228, 588: 2228, 665: 2228}, + {110: 4052, 132: 4051, 492: 5195, 857: 5196}, + {110: 4052, 132: 4051, 492: 5188, 857: 5189}, + {2221, 2221, 97: 2221, 2221, 491: 2221, 2221, 2221, 498: 2221, 508: 2221, 512: 5184, 515: 2221, 522: 2221, 588: 2221, 599: 5183, 665: 2221}, // 2570 - {84: 5133, 476: 2187, 1284: 5132}, - {476: 5129}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 5130}, - {50: 5131, 488: 3712, 3713, 3718, 523: 3714, 550: 3715, 3716, 3709, 3719, 3708, 3717, 3710, 3711}, - {2188, 2188, 91: 2188, 2188, 224: 2188, 475: 2188, 2188, 2188, 481: 2188, 492: 2188, 498: 2188, 507: 2188, 572: 2188, 649: 2188}, + {155: 2209, 600: 2209}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 5186}, + {525: 2823, 755: 2822, 762: 5185}, + {2222, 2222, 97: 2222, 2222, 491: 2222, 2222, 2222, 498: 2222, 508: 2222, 515: 2222, 522: 2222, 588: 2222, 665: 2222}, + {112: 3566, 3570, 3563, 3578, 118: 3565, 3562, 3564, 3568, 3569, 3574, 3573, 3572, 3576, 3577, 3571, 3575, 131: 3567, 527: 3451, 3449, 3450, 3448, 3446, 550: 3560, 3557, 3559, 3558, 3554, 3556, 3555, 3552, 3553, 3551, 3561, 756: 3447, 3445, 813: 3550, 828: 5187}, // 2575 - {476: 5136}, - {502: 5134}, - {511: 2759, 737: 5135}, - {476: 2186}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 2349, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 4170, 812: 5137, 1005: 5138}, + {2223, 2223, 97: 2223, 2223, 491: 2223, 2223, 2223, 498: 2223, 508: 2223, 515: 2223, 522: 2223, 588: 2223, 665: 2223}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 5193}, + {492: 5190}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 4256, 831: 5191}, + {9: 4258, 58: 5192}, // 2580 - {9: 4172, 50: 2348}, - {50: 5139}, - {2189, 2189, 91: 2189, 2189, 224: 2189, 475: 2189, 2189, 2189, 481: 2189, 492: 2189, 498: 2189, 507: 2189, 572: 2189, 649: 2189}, - {2165, 2165, 91: 5144, 475: 2165, 2165, 2165, 481: 2165, 492: 2165, 498: 2165, 507: 2165, 572: 2165, 649: 2165, 1328: 5143}, - {511: 2759, 737: 2758, 745: 5142}, + {2224, 2224, 97: 2224, 2224, 491: 2224, 2224, 2224, 498: 2224, 508: 2224, 515: 2224, 522: 2224, 588: 2224, 665: 2224}, + {58: 5194, 504: 3792, 3793, 3798, 541: 3794, 566: 3795, 3796, 3789, 3799, 3788, 3797, 3790, 3791}, + {2225, 2225, 97: 2225, 2225, 491: 2225, 2225, 2225, 498: 2225, 508: 2225, 515: 2225, 522: 2225, 588: 2225, 665: 2225}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 5228}, + {492: 5197}, // 2585 - {2160, 2160, 91: 2160, 475: 2160, 2160, 2160, 481: 2160, 492: 2160, 498: 2160, 507: 2160, 572: 2160, 649: 2160}, - {2159, 2159, 475: 2159, 4942, 2159, 481: 2159, 492: 2159, 498: 2159, 507: 2159, 572: 2159, 649: 2159, 1106: 5150}, - {663: 5145}, - {146: 2167, 584: 2167, 1079: 5078, 5073, 1151: 5146}, - {2163, 2163, 224: 5148, 475: 2163, 2163, 2163, 481: 2163, 492: 2163, 498: 2163, 507: 2163, 572: 2163, 649: 2163, 1327: 5147}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 4256, 831: 5198}, + {9: 4258, 58: 5199}, + {2220, 2220, 97: 2220, 2220, 491: 2220, 2220, 2220, 498: 2220, 508: 2220, 515: 2220, 522: 2220, 588: 2220, 599: 5201, 665: 2220, 1130: 5200}, + {2226, 2226, 97: 2226, 2226, 491: 2226, 2226, 2226, 498: 2226, 508: 2226, 515: 2226, 522: 2226, 588: 2226, 665: 2226}, + {492: 5202}, // 2590 - {2164, 2164, 475: 2164, 2164, 2164, 481: 2164, 492: 2164, 498: 2164, 507: 2164, 572: 2164, 649: 2164}, - {511: 2759, 737: 2758, 745: 5149}, - {2162, 2162, 475: 2162, 2162, 2162, 481: 2162, 492: 2162, 498: 2162, 507: 2162, 572: 2162, 649: 2162}, - {2190, 2190, 475: 2190, 2190, 2190, 481: 2190, 492: 2190, 498: 2190, 507: 2190, 572: 2190, 649: 2190}, - {2521, 2521}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 5204, 1271: 5203}, + {58: 5206}, + {58: 2218, 112: 3566, 3570, 3563, 3578, 118: 3565, 3562, 3564, 3568, 3569, 3574, 3573, 3572, 3576, 3577, 3571, 3575, 131: 3567, 504: 3792, 3793, 3798, 541: 3794, 550: 3560, 3557, 3559, 3558, 3554, 3556, 3555, 3552, 3553, 3551, 3561, 566: 3795, 3796, 3789, 3799, 3788, 3797, 3790, 3791, 813: 3550, 828: 5205}, + {58: 2217}, + {2212, 2212, 10: 5208, 97: 2212, 2212, 491: 2212, 2212, 2212, 498: 2212, 508: 2212, 510: 2212, 515: 2212, 522: 2212, 588: 2212, 665: 2212, 675: 2212, 1249: 5207}, // 2595 - {2520, 2520, 6: 4267, 4971, 18: 4223, 20: 4275, 22: 4268, 4271, 4270, 4273, 4274, 4276, 652: 4272, 785: 4277, 818: 4970}, - {491: 5154}, - {154: 5155}, - {159: 5156}, - {476: 5157}, + {2216, 2216, 97: 2216, 2216, 491: 2216, 2216, 2216, 498: 2216, 508: 2216, 510: 5223, 515: 2216, 522: 2216, 588: 2216, 665: 2216, 675: 2216, 1289: 5222}, + {507: 5209}, + {163: 5210}, + {168: 5211}, + {492: 5212}, // 2600 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 5158}, - {50: 5159, 488: 3712, 3713, 3718, 523: 3714, 550: 3715, 3716, 3709, 3719, 3708, 3717, 3710, 3711}, - {2522, 2522}, - {491: 5161}, - {154: 5162}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 5213}, + {58: 5214, 504: 3792, 3793, 3798, 541: 3794, 566: 3795, 3796, 3789, 3799, 3788, 3797, 3790, 3791}, + {194: 5215}, + {507: 5216}, + {163: 5217}, // 2605 - {159: 5163}, - {476: 5164}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 5165}, - {50: 5166, 488: 3712, 3713, 3718, 523: 3714, 550: 3715, 3716, 3709, 3719, 3708, 3717, 3710, 3711}, - {2523, 2523}, + {168: 5218}, + {492: 5219}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 5220}, + {58: 5221, 504: 3792, 3793, 3798, 541: 3794, 566: 3795, 3796, 3789, 3799, 3788, 3797, 3790, 3791}, + {2211, 2211, 97: 2211, 2211, 491: 2211, 2211, 2211, 498: 2211, 508: 2211, 510: 2211, 515: 2211, 522: 2211, 588: 2211, 665: 2211, 675: 2211}, // 2610 - {582, 582, 582, 582, 582, 582, 582, 582, 582, 10: 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 51: 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 4776, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 816: 4775, 833: 5168}, - {2460, 2460, 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4780, 2785, 2786, 2784, 791: 5170, 1294: 5169}, - {2524, 2524}, - {9: 4781, 499: 5171}, - {476: 5172}, + {2214, 2214, 97: 2214, 2214, 491: 2214, 2214, 2214, 498: 2214, 508: 2214, 515: 2214, 522: 2214, 588: 2214, 665: 2214, 675: 5226, 1287: 5225}, + {507: 5224}, + {2215, 2215, 97: 2215, 2215, 491: 2215, 2215, 2215, 498: 2215, 508: 2215, 515: 2215, 522: 2215, 588: 2215, 665: 2215, 675: 2215}, + {2219, 2219, 97: 2219, 2219, 491: 2219, 2219, 2219, 498: 2219, 508: 2219, 515: 2219, 522: 2219, 588: 2219, 665: 2219}, + {507: 5227}, // 2615 - {491: 4945, 957: 4944, 1105: 5173}, - {9: 4981, 50: 5174}, - {2459, 2459}, - {2525, 2525}, - {141: 5177, 885: 110, 1083: 5178}, + {2213, 2213, 97: 2213, 2213, 491: 2213, 2213, 2213, 498: 2213, 508: 2213, 515: 2213, 522: 2213, 588: 2213, 665: 2213}, + {58: 5229, 504: 3792, 3793, 3798, 541: 3794, 566: 3795, 3796, 3789, 3799, 3788, 3797, 3790, 3791}, + {2220, 2220, 97: 2220, 2220, 491: 2220, 2220, 2220, 498: 2220, 508: 2220, 515: 2220, 522: 2220, 588: 2220, 599: 5201, 665: 2220, 1130: 5230}, + {2227, 2227, 97: 2227, 2227, 491: 2227, 2227, 2227, 498: 2227, 508: 2227, 515: 2227, 522: 2227, 588: 2227, 665: 2227}, + {90: 5237, 492: 2230, 1309: 5236}, // 2620 - {885: 109}, - {885: 5179}, - {478: 5180}, - {19, 19, 187: 19, 361: 5182, 661: 19, 1261: 5181}, - {17, 17, 187: 5185, 661: 17, 1260: 5184}, + {492: 5233}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 5234}, + {58: 5235, 504: 3792, 3793, 3798, 541: 3794, 566: 3795, 3796, 3789, 3799, 3788, 3797, 3790, 3791}, + {2231, 2231, 97: 2231, 2231, 234: 2231, 491: 2231, 2231, 2231, 498: 2231, 508: 2231, 515: 2231, 522: 2231, 588: 2231, 665: 2231}, + {492: 5240}, // 2625 - {511: 2759, 737: 5183}, - {18, 18, 187: 18, 661: 18}, - {95, 95, 661: 3991, 949: 5192}, - {15, 15, 191: 15, 373: 5187, 661: 15, 1288: 5186}, - {13, 13, 191: 5190, 661: 13, 1287: 5189}, + {518: 5238}, + {525: 2823, 755: 5239}, + {492: 2229}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 2397, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 4256, 831: 5241, 1026: 5242}, + {9: 4258, 58: 2396}, // 2630 - {511: 2759, 737: 5188}, - {14, 14, 191: 14, 661: 14}, - {16, 16, 661: 16}, - {511: 2759, 737: 5191}, - {12, 12, 661: 12}, + {58: 5243}, + {2232, 2232, 97: 2232, 2232, 234: 2232, 491: 2232, 2232, 2232, 498: 2232, 508: 2232, 515: 2232, 522: 2232, 588: 2232, 665: 2232}, + {2208, 2208, 97: 5248, 491: 2208, 2208, 2208, 498: 2208, 508: 2208, 515: 2208, 522: 2208, 588: 2208, 665: 2208, 1353: 5247}, + {525: 2823, 755: 2822, 762: 5246}, + {2203, 2203, 97: 2203, 491: 2203, 2203, 2203, 498: 2203, 508: 2203, 515: 2203, 522: 2203, 588: 2203, 665: 2203}, // 2635 - {20, 20}, - {28: 59, 130: 59, 142: 59, 476: 59, 511: 59}, - {130: 4735, 476: 5194, 904: 4743}, - {64, 64}, - {511: 2759, 737: 5200}, + {2202, 2202, 491: 2202, 5046, 2202, 498: 2202, 508: 2202, 515: 2202, 522: 2202, 588: 2202, 665: 2202, 1129: 5254}, + {681: 5249}, + {155: 2210, 600: 2210, 1102: 5182, 5177, 1176: 5250}, + {2206, 2206, 234: 5252, 491: 2206, 2206, 2206, 498: 2206, 508: 2206, 515: 2206, 522: 2206, 588: 2206, 665: 2206, 1352: 5251}, + {2207, 2207, 491: 2207, 2207, 2207, 498: 2207, 508: 2207, 515: 2207, 522: 2207, 588: 2207, 665: 2207}, // 2640 - {511: 2759, 737: 5199}, - {61, 61}, - {62, 62}, - {63, 63}, - {496: 5204}, + {525: 2823, 755: 2822, 762: 5253}, + {2205, 2205, 491: 2205, 2205, 2205, 498: 2205, 508: 2205, 515: 2205, 522: 2205, 588: 2205, 665: 2205}, + {2233, 2233, 491: 2233, 2233, 2233, 498: 2233, 508: 2233, 515: 2233, 522: 2233, 588: 2233, 665: 2233}, + {2570, 2570}, + {2569, 2569, 6: 4353, 5075, 18: 4309, 20: 4361, 22: 4354, 4357, 4356, 4359, 4360, 4362, 668: 4358, 803: 4363, 837: 5074}, // 2645 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 5203}, - {496: 65}, - {511: 2759, 737: 5205}, - {254: 5207, 477: 69, 570: 69, 657: 69, 743: 69, 1214: 5206}, - {477: 2607, 570: 2591, 657: 2713, 743: 2573, 763: 5210, 770: 2712, 2574, 777: 5214, 5213, 783: 2575, 788: 5212, 1304: 5211}, + {507: 5258}, + {163: 5259}, + {168: 5260}, + {492: 5261}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 5262}, // 2650 - {385: 5208}, - {142: 5209, 477: 68, 570: 68, 657: 68, 743: 68}, - {477: 67, 570: 67, 657: 67, 743: 67}, - {657: 2713, 743: 2573, 770: 5217, 5215, 783: 5216}, - {73, 73}, + {58: 5263, 504: 3792, 3793, 3798, 541: 3794, 566: 3795, 3796, 3789, 3799, 3788, 3797, 3790, 3791}, + {2571, 2571}, + {507: 5265}, + {163: 5266}, + {168: 5267}, // 2655 - {72, 72}, - {71, 71}, - {70, 70}, - {2087, 2087}, - {2086, 2086}, + {492: 5268}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 5269}, + {58: 5270, 504: 3792, 3793, 3798, 541: 3794, 566: 3795, 3796, 3789, 3799, 3788, 3797, 3790, 3791}, + {2572, 2572}, + {604, 604, 604, 604, 604, 604, 604, 604, 604, 10: 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 59: 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 4880, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 835: 4879, 851: 5272}, // 2660 - {262, 262, 484: 262}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 5224, 1154: 5225, 1330: 5223}, - {82, 82, 82, 82, 82, 82, 82, 82, 82, 10: 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, 82, 82, 82, 82, 82, 51: 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 82, 82, 82, 82}, - {81, 81, 81, 81, 81, 81, 81, 81, 81, 10: 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 51: 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 3948, 786: 5222}, + {2508, 2508, 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4884, 2849, 688: 2850, 2848, 809: 5274, 1319: 5273}, + {2573, 2573}, + {9: 4885, 516: 5275}, + {492: 5276}, + {507: 5049, 978: 5048, 1128: 5277}, // 2665 - {57, 57, 9: 3950}, - {83, 83, 9: 5231}, - {674: 5227, 691: 5228, 1256: 5226}, - {75, 75, 9: 75}, - {80, 80, 9: 80}, + {9: 5085, 58: 5278}, + {2507, 2507}, + {2574, 2574}, + {2568, 2568}, + {150: 5282, 904: 116, 1106: 5283}, // 2670 - {79, 79, 9: 79, 141: 5230}, - {77, 77, 9: 77, 141: 5229}, - {76, 76, 9: 76}, - {78, 78, 9: 78}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 5224, 1154: 5232}, + {904: 115}, + {904: 5284}, + {494: 5285}, + {21, 21, 196: 21, 371: 5287, 679: 21, 1286: 5286}, + {19, 19, 196: 5290, 679: 19, 1285: 5289}, // 2675 - {74, 74, 9: 74}, - {84, 84}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 3948, 786: 5235}, - {56, 56, 9: 3950}, - {141: 5177, 885: 110, 1083: 5239}, + {525: 2823, 755: 5288}, + {20, 20, 196: 20, 679: 20}, + {101, 101, 679: 4073, 970: 5297}, + {17, 17, 200: 17, 384: 5292, 679: 17, 1313: 5291}, + {15, 15, 200: 5295, 679: 15, 1312: 5294}, // 2680 - {478: 5238}, - {58, 58}, - {885: 5240}, - {478: 5241}, - {492: 5242, 499: 2129, 507: 5243, 1042: 5244}, + {525: 2823, 755: 5293}, + {16, 16, 200: 16, 679: 16}, + {18, 18, 679: 18}, + {525: 2823, 755: 5296}, + {14, 14, 679: 14}, // 2685 - {2128, 2128, 475: 2128, 2128, 2128, 481: 2128, 498: 2128, 2128, 572: 2128, 649: 2128}, - {2127, 2127, 475: 2127, 2127, 2127, 481: 2127, 498: 2127, 2127, 572: 2127, 649: 2127}, - {499: 5245}, - {572: 5246}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 5247}, + {22, 22}, + {28: 64, 139: 64, 151: 64, 492: 64, 525: 64}, + {139: 4839, 492: 5299, 924: 4847}, + {69, 69}, + {525: 2823, 755: 5305}, // 2690 - {112, 112, 103: 112, 112: 112, 476: 112, 492: 112, 509: 112, 650: 5249, 661: 112, 1196: 5248}, - {108, 108, 103: 3970, 112: 3969, 476: 108, 492: 108, 509: 108, 661: 108, 839: 3968, 1053: 5252}, - {509: 5250}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 533: 3787, 664: 3517, 2785, 2786, 2784, 742: 3786, 811: 5251}, - {111, 111, 103: 111, 112: 111, 476: 111, 492: 111, 509: 111, 661: 111}, + {525: 2823, 755: 5304}, + {66, 66}, + {67, 67}, + {68, 68}, + {512: 5309}, // 2695 - {95, 95, 476: 95, 492: 95, 509: 95, 661: 3991, 949: 5253}, - {114, 114, 476: 114, 492: 5255, 509: 114, 1237: 5254}, - {2337, 2337, 476: 5258, 509: 2337, 1202: 5259}, - {511: 2759, 737: 5256}, - {661: 5257}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 5308}, + {512: 70}, + {525: 2823, 755: 5310}, + {265: 5312, 493: 74, 522: 74, 587: 74, 674: 74, 761: 74, 1239: 5311}, + {493: 2662, 522: 2647, 587: 2646, 674: 2771, 761: 2628, 781: 5315, 788: 2770, 2629, 795: 5319, 5320, 5318, 802: 2630, 807: 5317, 1329: 5316}, // 2700 - {113, 113, 476: 113, 509: 113}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 2343, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 571: 3375, 664: 4169, 2785, 2786, 2784, 714: 5272, 748: 5271, 1006: 5270, 1200: 5269, 5273}, - {89, 89, 509: 5261, 1255: 5260}, - {115, 115}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3806, 2785, 2786, 2784, 715: 5264, 1081: 5263, 1254: 5262}, + {397: 5313}, + {151: 5314, 493: 73, 522: 73, 587: 73, 674: 73, 761: 73}, + {493: 72, 522: 72, 587: 72, 674: 72, 761: 72}, + {674: 2771, 761: 2628, 788: 5323, 5321, 802: 5322}, + {79, 79}, // 2705 - {88, 88, 9: 5267}, - {86, 86, 9: 86}, - {502: 5265}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3929, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3925, 801: 5266}, - {85, 85, 9: 85}, + {78, 78}, + {77, 77}, + {76, 76}, + {75, 75}, + {2130, 2130}, // 2710 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3806, 2785, 2786, 2784, 715: 5264, 1081: 5268}, - {87, 87, 9: 87}, - {9: 5275, 50: 2342}, - {9: 2341, 50: 2341}, - {9: 2339, 50: 2339}, + {2129, 2129}, + {278, 278, 501: 278}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 5330, 1179: 5331, 1355: 5329}, + {88, 88, 88, 88, 88, 88, 88, 88, 88, 10: 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, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 59: 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88}, + {87, 87, 87, 87, 87, 87, 87, 87, 87, 10: 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 59: 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87}, // 2715 - {9: 2338, 50: 2338}, - {50: 5274}, - {2336, 2336, 509: 2336}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 571: 3375, 664: 4169, 2785, 2786, 2784, 714: 5272, 748: 5271, 1006: 5276}, - {9: 2340, 50: 2340}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4030, 804: 5328}, + {62, 62, 9: 4032}, + {89, 89, 9: 5337}, + {692: 5333, 709: 5334, 1281: 5332}, + {81, 81, 9: 81}, // 2720 - {9: 172, 130: 172, 475: 172, 503: 172, 571: 1849, 653: 172, 670: 1849}, - {9: 137, 475: 137, 137, 503: 137, 571: 1818, 653: 137, 670: 1818}, - {9: 151, 475: 151, 151, 503: 151, 571: 1792, 653: 151, 670: 1792}, - {9: 138, 475: 138, 138, 503: 138, 571: 1789, 653: 138, 670: 1789}, - {9: 127, 475: 127, 127, 503: 127, 571: 1754, 653: 127, 670: 1754}, + {86, 86, 9: 86}, + {85, 85, 9: 85, 150: 5336}, + {83, 83, 9: 83, 150: 5335}, + {82, 82, 9: 82}, + {84, 84, 9: 84}, // 2725 - {9: 147, 475: 147, 147, 503: 147, 571: 1677, 653: 147, 670: 1677}, - {9: 152, 475: 152, 152, 503: 152, 571: 1670, 653: 152, 670: 1670}, - {326: 5386, 390: 5385, 571: 1651, 670: 1651}, - {9: 139, 475: 139, 139, 503: 139, 571: 1648, 653: 139, 670: 1648}, - {9: 128, 475: 128, 128, 503: 128, 571: 1645, 653: 128, 670: 1645}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 5330, 1179: 5338}, + {80, 80, 9: 80}, + {90, 90}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4030, 804: 5341}, + {61, 61, 9: 4032}, // 2730 - {571: 5383, 670: 5382}, - {9: 748, 475: 748, 503: 748, 571: 268, 653: 748, 670: 268}, - {9: 747, 475: 747, 503: 747, 653: 747}, - {9: 168, 130: 5381, 475: 168, 503: 168, 653: 168}, - {9: 170, 475: 170, 503: 170, 653: 170}, + {150: 5282, 904: 116, 1106: 5345}, + {494: 5344}, + {63, 63}, + {904: 5346}, + {494: 5347}, // 2735 - {9: 169, 475: 169, 503: 169, 653: 169}, - {503: 5379}, - {9: 148, 475: 148, 148, 499: 5377, 503: 148, 653: 148}, - {9: 165, 475: 165, 503: 165, 653: 165}, - {9: 5329, 475: 5330, 503: 5331}, + {508: 5348, 516: 2172, 522: 5349, 1065: 5350}, + {2171, 2171, 491: 2171, 2171, 2171, 498: 2171, 515: 2171, 2171, 588: 2171, 665: 2171}, + {2170, 2170, 491: 2170, 2170, 2170, 498: 2170, 515: 2170, 2170, 588: 2170, 665: 2170}, + {516: 5351}, + {588: 5352}, // 2740 - {9: 163, 475: 163, 5326, 503: 163, 653: 163}, - {9: 161, 192: 5325, 475: 161, 161, 503: 161, 653: 161}, - {9: 159, 284: 5324, 475: 159, 159, 503: 159, 653: 159}, - {9: 158, 20: 5318, 104: 5320, 169: 5319, 172: 5317, 176: 5321, 284: 5322, 475: 158, 158, 503: 158, 653: 158}, - {9: 155, 475: 155, 155, 503: 155, 653: 155}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 5353}, + {118, 118, 110: 118, 132: 118, 492: 118, 508: 118, 526: 118, 667: 5355, 679: 118, 1222: 5354}, + {114, 114, 110: 4052, 132: 4051, 492: 114, 508: 114, 526: 114, 679: 114, 857: 4050, 1076: 5358}, + {526: 5356}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 549: 3867, 685: 3597, 2849, 688: 2850, 2848, 760: 3866, 830: 5357}, // 2745 - {9: 154, 475: 154, 154, 503: 154, 653: 154}, - {9: 153, 176: 5316, 475: 153, 153, 503: 153, 653: 153}, - {9: 150, 475: 150, 150, 503: 150, 653: 150}, - {9: 149, 475: 149, 149, 503: 149, 653: 149}, - {104: 5315, 1025: 5314}, + {117, 117, 110: 117, 132: 117, 492: 117, 508: 117, 526: 117, 679: 117}, + {101, 101, 492: 101, 508: 101, 526: 101, 679: 4073, 970: 5359}, + {120, 120, 492: 120, 508: 5361, 526: 120, 1262: 5360}, + {2385, 2385, 492: 5364, 526: 2385, 1227: 5365}, + {525: 2823, 755: 5362}, // 2750 - {9: 145, 475: 145, 145, 503: 145, 653: 145}, - {911: 5313}, - {9: 143, 475: 143, 143, 503: 143, 653: 143}, - {9: 140, 475: 140, 140, 503: 140, 653: 140}, - {126: 5312}, + {679: 5363}, + {119, 119, 492: 119, 526: 119}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 2391, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 589: 3455, 685: 4255, 2849, 688: 2850, 2848, 732: 5378, 766: 5377, 1027: 5376, 1225: 5375, 5379}, + {95, 95, 526: 5367, 1280: 5366}, + {121, 121}, // 2755 - {9: 135, 475: 135, 135, 503: 135, 653: 135}, - {9: 144, 475: 144, 144, 503: 144, 653: 144}, - {9: 146, 475: 146, 146, 503: 146, 653: 146}, - {9: 133, 475: 133, 133, 503: 133, 653: 133}, - {9: 131, 475: 131, 131, 503: 131, 653: 131}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 3886, 2849, 688: 2850, 2848, 733: 5370, 1104: 5369, 1279: 5368}, + {94, 94, 9: 5373}, + {92, 92, 9: 92}, + {518: 5371}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 4011, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4007, 819: 5372}, // 2760 - {9: 157, 475: 157, 157, 503: 157, 653: 157}, - {9: 156, 475: 156, 156, 503: 156, 653: 156}, - {126: 5323}, - {9: 134, 475: 134, 134, 503: 134, 653: 134}, - {9: 132, 475: 132, 132, 503: 132, 653: 132}, + {91, 91, 9: 91}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 3886, 2849, 688: 2850, 2848, 733: 5370, 1104: 5374}, + {93, 93, 9: 93}, + {9: 5381, 58: 2390}, + {9: 2389, 58: 2389}, // 2765 - {9: 130, 475: 130, 130, 503: 130, 653: 130}, - {9: 136, 475: 136, 136, 503: 136, 653: 136}, - {9: 129, 475: 129, 129, 503: 129, 653: 129}, - {9: 160, 475: 160, 160, 503: 160, 653: 160}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 4170, 812: 5327}, + {9: 2387, 58: 2387}, + {9: 2386, 58: 2386}, + {58: 5380}, + {2384, 2384, 526: 2384}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 589: 3455, 685: 4255, 2849, 688: 2850, 2848, 732: 5378, 766: 5377, 1027: 5382}, // 2770 - {9: 4172, 50: 5328}, - {9: 162, 475: 162, 503: 162, 653: 162}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 5277, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 5279, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 5285, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 5281, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 5278, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 5286, 3232, 2956, 3184, 5280, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 5283, 2867, 2868, 3107, 5284, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 5282, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 5288, 500: 5311, 570: 5305, 647: 5309, 649: 5294, 652: 5304, 654: 5298, 657: 5307, 664: 3517, 2785, 2786, 2784, 5299, 672: 5303, 677: 5300, 742: 5287, 5302, 805: 5289, 814: 5293, 858: 5308, 870: 5306, 941: 5290, 962: 5291, 5297, 968: 5292, 5376, 977: 5301, 979: 5310}, - {2: 126, 126, 126, 126, 126, 126, 126, 10: 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 51: 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 5343, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 523: 126, 572: 5342, 964: 5344, 1091: 5345}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 5334, 872: 5335}, + {9: 2388, 58: 2388}, + {9: 178, 139: 178, 491: 178, 520: 178, 589: 1890, 670: 178, 684: 1890}, + {9: 143, 491: 143, 143, 520: 143, 589: 1859, 670: 143, 684: 1859}, + {9: 157, 491: 157, 157, 520: 157, 589: 1833, 670: 157, 684: 1833}, + {9: 144, 491: 144, 144, 520: 144, 589: 1830, 670: 144, 684: 1830}, // 2775 - {761, 761, 6: 761, 9: 761, 15: 761, 48: 761, 761, 104: 761, 147: 761, 477: 761, 484: 761, 502: 761, 571: 5340, 653: 761, 669: 761, 5339, 761}, - {1220, 1220, 6: 1220, 9: 1220, 15: 1220, 48: 1220, 1220, 104: 1220, 147: 1220, 476: 3796, 1220, 484: 1220, 502: 1220, 653: 1220, 669: 1220, 671: 1220, 1100: 5338}, - {757, 757, 9: 757, 477: 757}, - {116, 116, 9: 5336}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 5337}, + {9: 133, 491: 133, 133, 520: 133, 589: 1794, 670: 133, 684: 1794}, + {9: 153, 491: 153, 153, 520: 153, 589: 1717, 670: 153, 684: 1717}, + {9: 158, 491: 158, 158, 520: 158, 589: 1710, 670: 158, 684: 1710}, + {337: 5492, 402: 5491, 589: 1691, 684: 1691}, + {9: 145, 491: 145, 145, 520: 145, 589: 1688, 670: 145, 684: 1688}, // 2780 - {756, 756, 9: 756, 477: 756}, - {758, 758, 6: 758, 9: 758, 15: 758, 48: 758, 758, 104: 758, 147: 758, 477: 758, 484: 758, 502: 758, 653: 758, 669: 758, 671: 758}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 664: 3517, 2785, 2786, 2784, 742: 5341}, - {759, 759, 6: 759, 9: 759, 15: 759, 48: 759, 759, 104: 759, 147: 759, 477: 759, 484: 759, 502: 759, 653: 759, 669: 759, 671: 759}, - {760, 760, 6: 760, 9: 760, 15: 760, 48: 760, 760, 104: 760, 147: 760, 477: 760, 484: 760, 502: 760, 653: 760, 669: 760, 671: 760}, + {9: 134, 491: 134, 134, 520: 134, 589: 1685, 670: 134, 684: 1685}, + {589: 5489, 684: 5488}, + {9: 771, 491: 771, 520: 771, 589: 284, 670: 771, 684: 284}, + {9: 770, 491: 770, 520: 770, 670: 770}, + {9: 174, 139: 5487, 491: 174, 520: 174, 670: 174}, // 2785 - {2: 125, 125, 125, 125, 125, 125, 125, 10: 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 51: 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 523: 125}, - {2: 124, 124, 124, 124, 124, 124, 124, 10: 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 51: 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 523: 124}, - {2: 123, 123, 123, 123, 123, 123, 123, 10: 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 51: 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 523: 123}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 523: 5346, 664: 5347, 2785, 2786, 2784, 1115: 5348}, - {503: 122, 653: 122, 655: 5374}, + {9: 176, 491: 176, 520: 176, 670: 176}, + {9: 175, 491: 175, 520: 175, 670: 175}, + {520: 5485}, + {9: 154, 491: 154, 154, 516: 5483, 520: 154, 670: 154}, + {9: 171, 491: 171, 520: 171, 670: 171}, // 2790 - {503: 118, 653: 118, 655: 5371}, - {503: 5349}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 5350, 895: 5351, 927: 5352}, - {206, 206, 6: 206, 9: 206, 15: 206, 48: 206, 206, 147: 5356, 477: 206, 669: 206, 1186: 5355}, - {245, 245, 6: 245, 9: 245, 15: 245, 48: 245, 245, 477: 245, 669: 245}, + {9: 5435, 491: 5436, 520: 5437}, + {9: 169, 491: 169, 5432, 520: 169, 670: 169}, + {9: 167, 202: 5431, 491: 167, 167, 520: 167, 670: 167}, + {9: 165, 295: 5430, 491: 165, 165, 520: 165, 670: 165}, + {9: 164, 20: 5424, 111: 5426, 179: 5425, 181: 5423, 185: 5427, 295: 5428, 491: 164, 164, 520: 164, 670: 164}, // 2795 - {117, 117, 9: 5353}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 5350, 895: 5354}, - {244, 244, 6: 244, 9: 244, 15: 244, 48: 244, 244, 477: 244, 669: 244}, - {246, 246, 6: 246, 9: 246, 15: 246, 48: 246, 246, 477: 246, 669: 246}, - {477: 5358, 663: 5357}, + {9: 161, 491: 161, 161, 520: 161, 670: 161}, + {9: 160, 491: 160, 160, 520: 160, 670: 160}, + {9: 159, 185: 5422, 491: 159, 159, 520: 159, 670: 159}, + {9: 156, 491: 156, 156, 520: 156, 670: 156}, + {9: 155, 491: 155, 155, 520: 155, 670: 155}, // 2800 - {15: 5369, 478: 5366, 897: 5368}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 664: 3517, 2785, 2786, 2784, 742: 5360, 1187: 5359}, - {204, 204, 6: 204, 9: 204, 15: 204, 48: 204, 204, 477: 204, 481: 5362, 663: 5361, 669: 204}, - {200, 200, 6: 200, 9: 200, 15: 200, 48: 200, 200, 477: 200, 481: 200, 663: 200, 669: 200}, - {478: 5366, 897: 5367}, + {111: 5421, 1047: 5420}, + {9: 151, 491: 151, 151, 520: 151, 670: 151}, + {931: 5419}, + {9: 149, 491: 149, 149, 520: 149, 670: 149}, + {9: 146, 491: 146, 146, 520: 146, 670: 146}, // 2805 - {478: 5364, 579: 5365, 1065: 5363}, - {202, 202, 6: 202, 9: 202, 15: 202, 48: 202, 202, 477: 202, 669: 202}, - {199, 199, 6: 199, 9: 199, 15: 199, 48: 199, 199, 477: 199, 669: 199}, - {198, 198, 6: 198, 9: 198, 15: 198, 48: 198, 198, 477: 198, 669: 198}, - {753, 753, 6: 753, 9: 753, 15: 753, 48: 753, 753, 753, 477: 753, 669: 753}, + {133: 5418}, + {9: 141, 491: 141, 141, 520: 141, 670: 141}, + {9: 150, 491: 150, 150, 520: 150, 670: 150}, + {9: 152, 491: 152, 152, 520: 152, 670: 152}, + {9: 139, 491: 139, 139, 520: 139, 670: 139}, // 2810 - {203, 203, 6: 203, 9: 203, 15: 203, 48: 203, 203, 477: 203, 669: 203}, - {205, 205, 6: 205, 9: 205, 15: 205, 48: 205, 205, 477: 205, 669: 205}, - {478: 5364, 579: 5365, 1065: 5370}, - {201, 201, 6: 201, 9: 201, 15: 201, 48: 201, 201, 477: 201, 669: 201}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 523: 5372, 664: 5373, 2785, 2786, 2784}, + {9: 137, 491: 137, 137, 520: 137, 670: 137}, + {9: 163, 491: 163, 163, 520: 163, 670: 163}, + {9: 162, 491: 162, 162, 520: 162, 670: 162}, + {133: 5429}, + {9: 140, 491: 140, 140, 520: 140, 670: 140}, // 2815 - {503: 120, 653: 120}, - {503: 119, 653: 119}, - {523: 5375}, - {503: 121, 653: 121}, - {9: 164, 475: 164, 503: 164, 653: 164}, + {9: 138, 491: 138, 138, 520: 138, 670: 138}, + {9: 136, 491: 136, 136, 520: 136, 670: 136}, + {9: 142, 491: 142, 142, 520: 142, 670: 142}, + {9: 135, 491: 135, 135, 520: 135, 670: 135}, + {9: 166, 491: 166, 166, 520: 166, 670: 166}, // 2820 - {285: 5378}, - {9: 166, 475: 166, 503: 166, 653: 166}, - {285: 5380}, - {9: 167, 475: 167, 503: 167, 653: 167}, - {9: 171, 130: 171, 475: 171, 503: 171, 653: 171}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 4256, 831: 5433}, + {9: 4258, 58: 5434}, + {9: 168, 491: 168, 520: 168, 670: 168}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 5383, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 5385, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 5391, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 5387, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 5384, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 5392, 3306, 3021, 3258, 5386, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 5389, 2931, 2932, 3173, 5390, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 5388, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 5394, 517: 5417, 587: 5411, 664: 5415, 5400, 668: 5410, 671: 5404, 674: 5413, 682: 5405, 685: 3597, 2849, 688: 2850, 2848, 5409, 695: 5406, 760: 5393, 5408, 823: 5395, 833: 5399, 876: 5414, 888: 5412, 962: 5396, 982: 5397, 5403, 988: 5398, 5482, 997: 5407, 999: 5416}, + {2: 132, 132, 132, 132, 132, 132, 132, 10: 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 59: 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 5449, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 541: 132, 588: 5448, 984: 5450, 1114: 5451}, // 2825 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 664: 3517, 2785, 2786, 2784, 742: 5384}, - {749, 749, 9: 749, 475: 749, 503: 749, 653: 749}, - {750, 750, 9: 750, 475: 750, 503: 750, 653: 750}, - {9: 142, 475: 142, 142, 503: 142, 653: 142}, - {9: 141, 475: 141, 141, 503: 141, 653: 141}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 5440, 890: 5441}, + {784, 784, 6: 784, 9: 784, 15: 784, 51: 784, 784, 784, 784, 784, 111: 784, 156: 784, 493: 784, 501: 784, 518: 784, 589: 5446, 670: 784, 683: 784, 5445, 687: 784}, + {1243, 1243, 6: 1243, 9: 1243, 15: 1243, 51: 1243, 1243, 1243, 1243, 1243, 111: 1243, 156: 1243, 492: 3876, 1243, 501: 1243, 518: 1243, 670: 1243, 683: 1243, 687: 1243, 1123: 5444}, + {780, 780, 9: 780, 493: 780}, + {122, 122, 9: 5442}, // 2830 - {475: 5429, 571: 1765, 670: 1765}, - {9: 5329, 475: 5389, 653: 5390}, - {2: 126, 126, 126, 126, 126, 126, 126, 10: 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 51: 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 5343, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 523: 126, 572: 5342, 964: 5344, 1091: 5392}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 5334, 872: 5391}, - {179, 179, 9: 5336}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 5443}, + {779, 779, 9: 779, 493: 779}, + {781, 781, 6: 781, 9: 781, 15: 781, 51: 781, 781, 781, 781, 781, 111: 781, 156: 781, 493: 781, 501: 781, 518: 781, 670: 781, 683: 781, 687: 781}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 685: 3597, 2849, 688: 2850, 2848, 760: 5447}, + {782, 782, 6: 782, 9: 782, 15: 782, 51: 782, 782, 782, 782, 782, 111: 782, 156: 782, 493: 782, 501: 782, 518: 782, 670: 782, 683: 782, 687: 782}, // 2835 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 523: 5346, 664: 5347, 2785, 2786, 2784, 1115: 5393}, - {653: 5394}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 5350, 895: 5351, 927: 5395}, - {235, 235, 9: 5353, 477: 235, 669: 5397, 965: 5396, 5398}, - {234, 234, 6: 234, 15: 234, 48: 234, 234, 477: 234}, + {783, 783, 6: 783, 9: 783, 15: 783, 51: 783, 783, 783, 783, 783, 111: 783, 156: 783, 493: 783, 501: 783, 518: 783, 670: 783, 683: 783, 687: 783}, + {2: 131, 131, 131, 131, 131, 131, 131, 10: 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 59: 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 541: 131}, + {2: 130, 130, 130, 130, 130, 130, 130, 10: 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 59: 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 541: 130}, + {2: 129, 129, 129, 129, 129, 129, 129, 10: 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 59: 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 541: 129}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 541: 5452, 685: 5453, 2849, 688: 2850, 2848, 1138: 5454}, // 2840 - {129: 5418, 131: 5416, 137: 5419, 5417, 5420, 365: 5411, 410: 5413, 967: 5415, 1295: 5414, 1314: 5412}, - {178, 178, 477: 5400, 1172: 5399}, - {181, 181}, - {132: 5404, 5402, 5403, 5405, 858: 5401}, - {911: 5410}, + {520: 128, 670: 128, 672: 5480}, + {520: 124, 670: 124, 672: 5477}, + {520: 5455}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 5456, 915: 5457, 947: 5458}, + {215, 215, 6: 215, 9: 215, 15: 215, 51: 215, 215, 215, 215, 215, 156: 5462, 493: 215, 683: 215, 1212: 5461}, // 2845 - {511: 2759, 737: 5409}, - {511: 2759, 737: 5408}, - {511: 2759, 737: 5407}, - {511: 2759, 737: 5406}, - {173, 173}, + {261, 261, 6: 261, 9: 261, 15: 261, 51: 261, 261, 261, 261, 261, 493: 261, 683: 261}, + {123, 123, 9: 5459}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 5456, 915: 5460}, + {260, 260, 6: 260, 9: 260, 15: 260, 51: 260, 260, 260, 260, 260, 493: 260, 683: 260}, + {262, 262, 6: 262, 9: 262, 15: 262, 51: 262, 262, 262, 262, 262, 493: 262, 683: 262}, // 2850 - {174, 174}, - {175, 175}, - {176, 176}, - {177, 177}, - {233, 233, 6: 233, 15: 233, 48: 233, 233, 477: 233}, + {493: 5464, 681: 5463}, + {15: 5475, 494: 5472, 917: 5474}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 685: 3597, 2849, 688: 2850, 2848, 760: 5466, 1213: 5465}, + {213, 213, 6: 213, 9: 213, 15: 213, 51: 213, 213, 213, 213, 213, 493: 213, 498: 5468, 681: 5467, 683: 213}, + {209, 209, 6: 209, 9: 209, 15: 209, 51: 209, 209, 209, 209, 209, 493: 209, 498: 209, 681: 209, 683: 209}, // 2855 - {232, 232, 6: 232, 15: 232, 48: 232, 232, 477: 232}, - {231, 231, 6: 231, 15: 231, 48: 231, 231, 477: 231}, - {230, 230, 6: 230, 15: 230, 48: 230, 230, 129: 5418, 131: 5416, 137: 5419, 5417, 5420, 477: 230, 510: 5426, 967: 5427}, - {229, 229, 6: 229, 15: 229, 48: 229, 229, 129: 229, 131: 229, 137: 229, 229, 229, 477: 229, 510: 229}, - {478: 5425}, + {494: 5472, 917: 5473}, + {494: 5470, 596: 5471, 1088: 5469}, + {211, 211, 6: 211, 9: 211, 15: 211, 51: 211, 211, 211, 211, 211, 493: 211, 683: 211}, + {208, 208, 6: 208, 9: 208, 15: 208, 51: 208, 208, 208, 208, 208, 493: 208, 683: 208}, + {207, 207, 6: 207, 9: 207, 15: 207, 51: 207, 207, 207, 207, 207, 493: 207, 683: 207}, // 2860 - {478: 5424}, - {478: 5423}, - {478: 5422}, - {478: 5421}, - {222, 222, 6: 222, 15: 222, 48: 222, 222, 129: 222, 131: 222, 137: 222, 222, 222, 477: 222, 510: 222}, + {776, 776, 6: 776, 9: 776, 15: 776, 51: 776, 776, 776, 776, 776, 58: 776, 493: 776, 683: 776}, + {212, 212, 6: 212, 9: 212, 15: 212, 51: 212, 212, 212, 212, 212, 493: 212, 683: 212}, + {214, 214, 6: 214, 9: 214, 15: 214, 51: 214, 214, 214, 214, 214, 493: 214, 683: 214}, + {494: 5470, 596: 5471, 1088: 5476}, + {210, 210, 6: 210, 9: 210, 15: 210, 51: 210, 210, 210, 210, 210, 493: 210, 683: 210}, // 2865 - {223, 223, 6: 223, 15: 223, 48: 223, 223, 129: 223, 131: 223, 137: 223, 223, 223, 477: 223, 510: 223}, - {224, 224, 6: 224, 15: 224, 48: 224, 224, 129: 224, 131: 224, 137: 224, 224, 224, 477: 224, 510: 224}, - {225, 225, 6: 225, 15: 225, 48: 225, 225, 129: 225, 131: 225, 137: 225, 225, 225, 477: 225, 510: 225}, - {226, 226, 6: 226, 15: 226, 48: 226, 226, 129: 226, 131: 226, 137: 226, 226, 226, 477: 226, 510: 226}, - {129: 5418, 131: 5416, 137: 5419, 5417, 5420, 967: 5428}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 541: 5478, 685: 5479, 2849, 688: 2850, 2848}, + {520: 126, 670: 126}, + {520: 125, 670: 125}, + {541: 5481}, + {520: 127, 670: 127}, // 2870 - {227, 227, 6: 227, 15: 227, 48: 227, 227, 129: 227, 131: 227, 137: 227, 227, 227, 477: 227, 510: 227}, - {228, 228, 6: 228, 15: 228, 48: 228, 228, 129: 228, 131: 228, 137: 228, 228, 228, 477: 228, 510: 228}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 5430}, - {653: 5431}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 5334, 872: 5432}, + {9: 170, 491: 170, 520: 170, 670: 170}, + {296: 5484}, + {9: 172, 491: 172, 520: 172, 670: 172}, + {296: 5486}, + {9: 173, 491: 173, 520: 173, 670: 173}, // 2875 - {178, 178, 9: 5336, 477: 5400, 1172: 5433}, - {180, 180}, - {2210, 2210, 9: 2210, 16: 2210, 18: 2210, 21: 2210, 482: 2210, 487: 2210, 501: 2210, 503: 2210, 508: 2210, 2210, 521: 2210, 650: 2210, 653: 2210, 680: 2210}, - {259, 259}, - {2: 868, 868, 868, 868, 868, 868, 868, 10: 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 51: 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 476: 868, 478: 868, 868, 868, 482: 868, 485: 868, 868, 488: 868, 868, 868, 492: 868, 495: 868, 498: 868, 868, 503: 868, 507: 868, 868, 511: 868, 518: 868, 523: 868, 533: 868, 567: 868, 570: 868, 868, 573: 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 585: 868, 868, 868, 868, 868, 868, 868, 868, 595: 868, 868, 598: 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 651: 868, 654: 868, 749: 868, 868, 757: 868, 868, 868, 766: 868, 774: 868, 868, 868}, + {9: 177, 139: 177, 491: 177, 520: 177, 670: 177}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 685: 3597, 2849, 688: 2850, 2848, 760: 5490}, + {772, 772, 9: 772, 491: 772, 520: 772, 670: 772}, + {773, 773, 9: 773, 491: 773, 520: 773, 670: 773}, + {9: 148, 491: 148, 148, 520: 148, 670: 148}, // 2880 - {2: 866, 866, 866, 866, 866, 866, 866, 10: 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 51: 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 476: 866, 492: 866, 499: 866, 503: 866, 582: 866, 757: 866, 866, 866}, - {2: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 10: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 51: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 476: 1071, 492: 1071, 582: 1071, 757: 5441, 5440, 5439, 842: 5442, 891: 5443}, - {2: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 10: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 51: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 476: 1074, 478: 1074, 1074, 1074, 482: 1074, 485: 1074, 1074, 488: 1074, 1074, 1074, 492: 1074, 495: 1074, 498: 1074, 1074, 503: 1074, 507: 1074, 1074, 511: 1074, 518: 1074, 523: 1074, 533: 1074, 567: 1074, 570: 1074, 1074, 573: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 585: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 595: 1074, 1074, 598: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 651: 1074, 654: 1074, 749: 1074, 1074, 757: 1074, 1074, 1074, 766: 1074, 774: 1074, 1074, 1074}, - {2: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 10: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 51: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 476: 1073, 478: 1073, 1073, 1073, 482: 1073, 485: 1073, 1073, 488: 1073, 1073, 1073, 492: 1073, 495: 1073, 498: 1073, 1073, 503: 1073, 507: 1073, 1073, 511: 1073, 518: 1073, 523: 1073, 533: 1073, 567: 1073, 570: 1073, 1073, 573: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 585: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 595: 1073, 1073, 598: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 651: 1073, 654: 1073, 749: 1073, 1073, 757: 1073, 1073, 1073, 766: 1073, 774: 1073, 1073, 1073}, - {2: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 10: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 51: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 476: 1072, 478: 1072, 1072, 1072, 482: 1072, 485: 1072, 1072, 488: 1072, 1072, 1072, 492: 1072, 495: 1072, 498: 1072, 1072, 503: 1072, 507: 1072, 1072, 511: 1072, 518: 1072, 523: 1072, 533: 1072, 567: 1072, 570: 1072, 1072, 573: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 585: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 595: 1072, 1072, 598: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 651: 1072, 654: 1072, 749: 1072, 1072, 757: 1072, 1072, 1072, 766: 1072, 774: 1072, 1072, 1072}, + {9: 147, 491: 147, 147, 520: 147, 670: 147}, + {491: 5535, 589: 1806, 684: 1806}, + {9: 5435, 491: 5495, 670: 5496}, + {2: 132, 132, 132, 132, 132, 132, 132, 10: 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 59: 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 5449, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 541: 132, 588: 5448, 984: 5450, 1114: 5498}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 5440, 890: 5497}, // 2885 - {2: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 10: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 51: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 476: 1070, 492: 1070, 499: 1070, 503: 1070, 582: 1070}, - {2: 1873, 1873, 1873, 1873, 1873, 1873, 1873, 10: 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 51: 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 476: 1873, 492: 4217, 582: 1873, 859: 5444}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 5453, 582: 5448, 664: 3947, 2785, 2786, 2784, 713: 5452, 740: 5451, 802: 5450, 806: 5449, 5447, 856: 5445, 894: 5446}, - {945, 945, 9: 945, 50: 945, 475: 945, 477: 945, 483: 945, 945, 493: 945, 945, 496: 945, 945, 499: 945, 945, 945, 504: 945, 945, 509: 945, 516: 945, 945, 519: 945}, - {9: 5499, 509: 5569}, + {185, 185, 9: 5442}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 541: 5452, 685: 5453, 2849, 688: 2850, 2848, 1138: 5499}, + {670: 5500}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 5456, 915: 5457, 947: 5501}, + {251, 251, 9: 5459, 493: 251, 683: 5503, 985: 5502, 5504}, // 2890 - {9: 943, 485: 5466, 5467, 509: 5556, 518: 5465, 520: 5468, 522: 5464, 524: 5469, 5470, 823: 5463, 827: 5462}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5553, 2785, 2786, 2784}, - {941, 941, 9: 941, 50: 941, 475: 941, 477: 941, 483: 941, 941, 941, 941, 493: 941, 941, 496: 941, 941, 499: 941, 941, 941, 504: 941, 941, 509: 941, 516: 941, 941, 941, 941, 941, 522: 941, 524: 941, 941, 941}, - {940, 940, 9: 940, 50: 940, 475: 940, 477: 940, 483: 940, 940, 940, 940, 493: 940, 940, 496: 940, 940, 499: 940, 940, 940, 504: 940, 940, 509: 940, 516: 940, 940, 940, 940, 940, 522: 940, 524: 940, 940, 940}, - {936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 477: 936, 481: 936, 483: 936, 936, 936, 936, 491: 5503, 936, 936, 936, 496: 936, 936, 499: 936, 936, 936, 504: 936, 936, 936, 509: 936, 516: 936, 936, 936, 936, 936, 522: 936, 524: 936, 936, 936, 528: 936, 936, 676: 936, 864: 5502}, + {250, 250, 6: 250, 15: 250, 51: 250, 250, 250, 250, 250, 493: 250}, + {138: 5524, 140: 5522, 146: 5525, 5523, 5526, 376: 5517, 422: 5519, 987: 5521, 1320: 5520, 1339: 5518}, + {184, 184, 493: 5506, 1197: 5505}, + {187, 187}, + {141: 5510, 5508, 5509, 5511, 876: 5507}, // 2895 - {934, 934, 3161, 2991, 3026, 2871, 2907, 3028, 2798, 934, 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 934, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 934, 477: 934, 481: 5460, 483: 934, 934, 934, 934, 493: 934, 934, 496: 934, 934, 499: 934, 934, 934, 504: 934, 934, 509: 934, 516: 934, 934, 934, 934, 934, 522: 934, 524: 934, 934, 934, 664: 5459, 2785, 2786, 2784, 920: 5458, 5457}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 5453, 2607, 498: 2606, 572: 2605, 582: 5448, 649: 2601, 664: 3947, 2785, 2786, 2784, 713: 5456, 740: 5451, 752: 3907, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 3906, 3909, 3908, 802: 5450, 806: 5449, 5455, 856: 5445, 894: 5454}, - {9: 5499, 50: 5500}, - {943, 943, 9: 943, 50: 943, 475: 943, 477: 943, 483: 943, 943, 5466, 5467, 493: 943, 943, 496: 943, 943, 499: 943, 943, 943, 504: 943, 943, 509: 943, 516: 943, 943, 5465, 943, 5468, 522: 5464, 524: 5469, 5470, 823: 5463, 827: 5462}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 934, 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 4000, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 481: 5460, 483: 828, 485: 934, 934, 493: 828, 828, 496: 2751, 504: 2752, 2748, 518: 934, 520: 934, 522: 934, 524: 934, 934, 664: 5459, 2785, 2786, 2784, 772: 3917, 3918, 920: 5458, 5457}, + {931: 5516}, + {525: 2823, 755: 5515}, + {525: 2823, 755: 5514}, + {525: 2823, 755: 5513}, + {525: 2823, 755: 5512}, // 2900 - {938, 938, 9: 938, 50: 938, 475: 938, 477: 938, 483: 938, 938, 938, 938, 493: 938, 938, 496: 938, 938, 499: 938, 938, 938, 504: 938, 938, 509: 938, 516: 938, 938, 938, 938, 938, 522: 938, 524: 938, 938, 938}, - {933, 933, 9: 933, 50: 933, 475: 933, 477: 933, 483: 933, 933, 933, 933, 492: 933, 933, 933, 496: 933, 933, 499: 933, 933, 933, 504: 933, 933, 933, 509: 933, 516: 933, 933, 933, 933, 933, 522: 933, 524: 933, 933, 933, 528: 933, 933, 676: 933}, - {932, 932, 9: 932, 50: 932, 475: 932, 477: 932, 483: 932, 932, 932, 932, 492: 932, 932, 932, 496: 932, 932, 499: 932, 932, 932, 504: 932, 932, 932, 509: 932, 516: 932, 932, 932, 932, 932, 522: 932, 524: 932, 932, 932, 528: 932, 932, 676: 932}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5461, 2785, 2786, 2784}, - {931, 931, 9: 931, 50: 931, 475: 931, 477: 931, 483: 931, 931, 931, 931, 492: 931, 931, 931, 496: 931, 931, 499: 931, 931, 931, 504: 931, 931, 931, 509: 931, 516: 931, 931, 931, 931, 931, 522: 931, 524: 931, 931, 931, 528: 931, 931, 676: 931}, + {179, 179}, + {180, 180}, + {181, 181}, + {182, 182}, + {183, 183}, // 2905 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 5453, 664: 3947, 2785, 2786, 2784, 713: 5452, 740: 5451, 802: 5450, 806: 5449, 5492}, - {520: 902, 913: 5479, 1104: 5483}, - {485: 5466, 5467, 520: 5476, 823: 5477}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 5453, 664: 3947, 2785, 2786, 2784, 713: 5452, 740: 5451, 802: 5450, 806: 5449, 5473}, - {520: 904, 913: 904}, + {249, 249, 6: 249, 15: 249, 51: 249, 249, 249, 249, 249, 493: 249}, + {248, 248, 6: 248, 15: 248, 51: 248, 248, 248, 248, 248, 493: 248}, + {247, 247, 6: 247, 15: 247, 51: 247, 247, 247, 247, 247, 493: 247}, + {246, 246, 6: 246, 15: 246, 51: 246, 246, 246, 246, 246, 138: 5524, 140: 5522, 146: 5525, 5523, 5526, 493: 246, 527: 5532, 987: 5533}, + {245, 245, 6: 245, 15: 245, 51: 245, 245, 245, 245, 245, 138: 245, 140: 245, 146: 245, 245, 245, 493: 245, 527: 245}, // 2910 - {520: 903, 913: 903}, - {2: 900, 900, 900, 900, 900, 900, 900, 10: 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 51: 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 476: 900}, - {520: 5472}, - {520: 5471}, - {2: 898, 898, 898, 898, 898, 898, 898, 10: 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 51: 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 476: 898}, + {494: 5531}, + {494: 5530}, + {494: 5529}, + {494: 5528}, + {494: 5527}, // 2915 - {2: 899, 899, 899, 899, 899, 899, 899, 10: 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 51: 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 476: 899}, - {906, 906, 9: 906, 50: 906, 475: 5474, 477: 906, 483: 906, 906, 906, 906, 493: 906, 906, 496: 906, 906, 499: 906, 906, 906, 504: 906, 906, 509: 906, 516: 906, 906, 906, 906, 906, 522: 906, 524: 906, 906, 906, 823: 5463, 827: 5462}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 5475}, - {905, 905, 9: 905, 50: 905, 475: 905, 477: 905, 483: 905, 905, 905, 905, 493: 905, 905, 496: 905, 905, 499: 905, 905, 905, 504: 905, 905, 509: 905, 3371, 512: 3369, 3370, 3368, 3366, 905, 905, 905, 905, 905, 522: 905, 524: 905, 905, 905, 738: 3367, 3365}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 5453, 664: 3947, 2785, 2786, 2784, 713: 5452, 740: 5451, 802: 5450, 806: 5449, 5482}, + {238, 238, 6: 238, 15: 238, 51: 238, 238, 238, 238, 238, 138: 238, 140: 238, 146: 238, 238, 238, 493: 238, 527: 238}, + {239, 239, 6: 239, 15: 239, 51: 239, 239, 239, 239, 239, 138: 239, 140: 239, 146: 239, 239, 239, 493: 239, 527: 239}, + {240, 240, 6: 240, 15: 240, 51: 240, 240, 240, 240, 240, 138: 240, 140: 240, 146: 240, 240, 240, 493: 240, 527: 240}, + {241, 241, 6: 241, 15: 241, 51: 241, 241, 241, 241, 241, 138: 241, 140: 241, 146: 241, 241, 241, 493: 241, 527: 241}, + {242, 242, 6: 242, 15: 242, 51: 242, 242, 242, 242, 242, 138: 242, 140: 242, 146: 242, 242, 242, 493: 242, 527: 242}, // 2920 - {520: 902, 913: 5479, 1104: 5478}, - {520: 5480}, - {520: 901}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 5453, 664: 3947, 2785, 2786, 2784, 713: 5452, 740: 5451, 802: 5450, 806: 5449, 5481}, - {907, 907, 9: 907, 50: 907, 475: 907, 477: 907, 483: 907, 907, 907, 907, 493: 907, 907, 496: 907, 907, 499: 907, 907, 907, 504: 907, 907, 509: 907, 516: 907, 907, 907, 907, 907, 522: 907, 524: 907, 907, 907, 823: 5463, 827: 5462}, + {138: 5524, 140: 5522, 146: 5525, 5523, 5526, 987: 5534}, + {243, 243, 6: 243, 15: 243, 51: 243, 243, 243, 243, 243, 138: 243, 140: 243, 146: 243, 243, 243, 493: 243, 527: 243}, + {244, 244, 6: 244, 15: 244, 51: 244, 244, 244, 244, 244, 138: 244, 140: 244, 146: 244, 244, 244, 493: 244, 527: 244}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 5536}, + {670: 5537}, // 2925 - {908, 908, 9: 908, 50: 908, 475: 908, 477: 908, 483: 908, 908, 908, 908, 493: 908, 908, 496: 908, 908, 499: 908, 908, 908, 504: 908, 908, 509: 908, 516: 908, 908, 908, 908, 908, 522: 908, 524: 908, 908, 908, 823: 5463, 827: 5462}, - {520: 5484}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 5453, 664: 3947, 2785, 2786, 2784, 713: 5452, 740: 5451, 802: 5450, 806: 5449, 5485}, - {475: 5486, 484: 5487, 5466, 5467, 518: 5465, 520: 5468, 522: 5464, 524: 5469, 5470, 823: 5463, 827: 5462}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 5491}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 5440, 890: 5538}, + {184, 184, 9: 5442, 493: 5506, 1197: 5539}, + {186, 186}, + {2254, 2254, 9: 2254, 16: 2254, 18: 2254, 21: 2254, 496: 2254, 499: 2254, 514: 2254, 519: 2254, 2254, 526: 2254, 537: 2254, 667: 2254, 670: 2254, 698: 2254}, + {275, 275}, // 2930 - {476: 5488}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 4170, 812: 5489}, - {9: 4172, 50: 5490}, - {909, 909, 9: 909, 50: 909, 475: 909, 477: 909, 483: 909, 909, 909, 909, 493: 909, 909, 496: 909, 909, 499: 909, 909, 909, 504: 909, 909, 509: 909, 516: 909, 909, 909, 909, 909, 522: 909, 524: 909, 909, 909}, - {910, 910, 9: 910, 50: 910, 475: 910, 477: 910, 483: 910, 910, 910, 910, 493: 910, 910, 496: 910, 910, 499: 910, 910, 910, 504: 910, 910, 509: 910, 3371, 512: 3369, 3370, 3368, 3366, 910, 910, 910, 910, 910, 522: 910, 524: 910, 910, 910, 738: 3367, 3365}, + {2: 891, 891, 891, 891, 891, 891, 891, 10: 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 59: 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 492: 891, 494: 891, 891, 891, 891, 502: 891, 891, 891, 891, 891, 508: 891, 510: 891, 514: 891, 891, 891, 520: 891, 522: 891, 525: 891, 534: 891, 541: 891, 549: 891, 583: 891, 587: 891, 589: 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 601: 891, 891, 891, 891, 891, 891, 608: 891, 891, 891, 891, 891, 614: 891, 891, 617: 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 669: 891, 671: 891, 767: 891, 891, 775: 891, 891, 891, 785: 891, 792: 891, 891, 891}, + {2: 889, 889, 889, 889, 889, 889, 889, 10: 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 59: 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 492: 889, 508: 889, 516: 889, 520: 889, 601: 889, 775: 889, 889, 889}, + {2: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 10: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 59: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 492: 1094, 508: 1094, 601: 1094, 775: 5547, 5546, 5545, 860: 5548, 910: 5549}, + {2: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 10: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 59: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 492: 1097, 494: 1097, 1097, 1097, 1097, 502: 1097, 1097, 1097, 1097, 1097, 508: 1097, 510: 1097, 514: 1097, 1097, 1097, 520: 1097, 522: 1097, 525: 1097, 534: 1097, 541: 1097, 549: 1097, 583: 1097, 587: 1097, 589: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 601: 1097, 1097, 1097, 1097, 1097, 1097, 608: 1097, 1097, 1097, 1097, 1097, 614: 1097, 1097, 617: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 669: 1097, 671: 1097, 767: 1097, 1097, 775: 1097, 1097, 1097, 785: 1097, 792: 1097, 1097, 1097}, + {2: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 10: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 59: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 492: 1096, 494: 1096, 1096, 1096, 1096, 502: 1096, 1096, 1096, 1096, 1096, 508: 1096, 510: 1096, 514: 1096, 1096, 1096, 520: 1096, 522: 1096, 525: 1096, 534: 1096, 541: 1096, 549: 1096, 583: 1096, 587: 1096, 589: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 601: 1096, 1096, 1096, 1096, 1096, 1096, 608: 1096, 1096, 1096, 1096, 1096, 614: 1096, 1096, 617: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 669: 1096, 671: 1096, 767: 1096, 1096, 775: 1096, 1096, 1096, 785: 1096, 792: 1096, 1096, 1096}, // 2935 - {913, 913, 9: 913, 50: 913, 475: 5493, 477: 913, 483: 913, 5494, 5466, 5467, 493: 913, 913, 496: 913, 913, 499: 913, 913, 913, 504: 913, 913, 509: 913, 516: 913, 913, 5465, 913, 5468, 522: 5464, 524: 5469, 5470, 913, 823: 5463, 827: 5462}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 5498}, - {476: 5495}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 4170, 812: 5496}, - {9: 4172, 50: 5497}, + {2: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 10: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 59: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 492: 1095, 494: 1095, 1095, 1095, 1095, 502: 1095, 1095, 1095, 1095, 1095, 508: 1095, 510: 1095, 514: 1095, 1095, 1095, 520: 1095, 522: 1095, 525: 1095, 534: 1095, 541: 1095, 549: 1095, 583: 1095, 587: 1095, 589: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 601: 1095, 1095, 1095, 1095, 1095, 1095, 608: 1095, 1095, 1095, 1095, 1095, 614: 1095, 1095, 617: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 669: 1095, 671: 1095, 767: 1095, 1095, 775: 1095, 1095, 1095, 785: 1095, 792: 1095, 1095, 1095}, + {2: 1093, 1093, 1093, 1093, 1093, 1093, 1093, 10: 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 59: 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 492: 1093, 508: 1093, 516: 1093, 520: 1093, 601: 1093}, + {2: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 10: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 59: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 492: 1914, 508: 4303, 601: 1914, 877: 5550}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 5559, 601: 5554, 685: 4029, 2849, 688: 2850, 2848, 731: 5558, 759: 5557, 820: 5556, 824: 5555, 5553, 874: 5551, 914: 5552}, + {968, 968, 9: 968, 58: 968, 491: 968, 493: 968, 500: 968, 968, 509: 968, 511: 968, 968, 968, 516: 968, 968, 519: 968, 521: 968, 523: 968, 526: 968, 532: 968, 968, 535: 968}, // 2940 - {911, 911, 9: 911, 50: 911, 475: 911, 477: 911, 483: 911, 911, 911, 911, 493: 911, 911, 496: 911, 911, 499: 911, 911, 911, 504: 911, 911, 509: 911, 516: 911, 911, 911, 911, 911, 522: 911, 524: 911, 911, 911}, - {912, 912, 9: 912, 50: 912, 475: 912, 477: 912, 483: 912, 912, 912, 912, 493: 912, 912, 496: 912, 912, 499: 912, 912, 912, 504: 912, 912, 509: 912, 3371, 512: 3369, 3370, 3368, 3366, 912, 912, 912, 912, 912, 522: 912, 524: 912, 912, 912, 738: 3367, 3365}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 5453, 582: 5448, 664: 3947, 2785, 2786, 2784, 713: 5452, 740: 5451, 802: 5450, 806: 5449, 5455, 856: 5501}, - {937, 937, 9: 937, 50: 937, 475: 937, 477: 937, 483: 937, 937, 937, 937, 493: 937, 937, 496: 937, 937, 499: 937, 937, 937, 504: 937, 937, 509: 937, 516: 937, 937, 937, 937, 937, 522: 937, 524: 937, 937, 937}, - {944, 944, 9: 944, 50: 944, 475: 944, 477: 944, 483: 944, 944, 493: 944, 944, 496: 944, 944, 499: 944, 944, 944, 504: 944, 944, 509: 944, 516: 944, 944, 519: 944}, + {9: 5605, 526: 5675}, + {9: 966, 502: 5572, 5573, 526: 5662, 534: 5571, 536: 5574, 538: 5570, 5575, 5576, 841: 5569, 845: 5568}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5659, 2849, 688: 2850, 2848}, + {964, 964, 9: 964, 58: 964, 491: 964, 493: 964, 500: 964, 964, 964, 964, 509: 964, 511: 964, 964, 964, 516: 964, 964, 519: 964, 521: 964, 523: 964, 526: 964, 532: 964, 964, 964, 964, 964, 538: 964, 964, 964, 542: 964}, + {963, 963, 9: 963, 58: 963, 491: 963, 493: 963, 500: 963, 963, 963, 963, 509: 963, 511: 963, 963, 963, 516: 963, 963, 519: 963, 521: 963, 523: 963, 526: 963, 532: 963, 963, 963, 963, 963, 538: 963, 963, 963, 542: 963}, // 2945 - {934, 934, 3161, 2991, 3026, 2871, 2907, 3028, 2798, 934, 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 934, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 934, 477: 934, 481: 5460, 483: 934, 934, 934, 934, 492: 934, 934, 934, 496: 934, 934, 499: 934, 934, 934, 504: 934, 934, 934, 509: 934, 516: 934, 934, 934, 934, 934, 522: 934, 524: 934, 934, 934, 528: 934, 934, 664: 5459, 2785, 2786, 2784, 676: 934, 920: 5458, 5507}, - {476: 5504}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4780, 2785, 2786, 2784, 791: 5505}, - {9: 4781, 50: 5506}, - {935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 481: 935, 483: 935, 935, 935, 935, 492: 935, 935, 935, 496: 935, 935, 935, 935, 935, 935, 504: 935, 935, 935, 509: 935, 516: 935, 935, 935, 935, 935, 522: 935, 524: 935, 935, 935, 528: 935, 935, 566: 935, 572: 935, 649: 935, 652: 935, 663: 935, 676: 935}, + {959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 493: 959, 498: 959, 500: 959, 959, 959, 959, 507: 5609, 959, 959, 511: 959, 959, 959, 516: 959, 959, 519: 959, 521: 959, 523: 959, 959, 526: 959, 532: 959, 959, 959, 959, 959, 538: 959, 959, 959, 542: 959, 544: 959, 959, 694: 959, 882: 5608}, + {957, 957, 3234, 3056, 3092, 2935, 2972, 3094, 2862, 957, 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 957, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 957, 493: 957, 498: 5566, 500: 957, 957, 957, 957, 509: 957, 511: 957, 957, 957, 516: 957, 957, 519: 957, 521: 957, 523: 957, 526: 957, 532: 957, 957, 957, 957, 957, 538: 957, 957, 957, 542: 957, 685: 5565, 2849, 688: 2850, 2848, 940: 5564, 5563}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 5559, 2662, 515: 2661, 588: 2660, 601: 5554, 665: 2656, 685: 4029, 2849, 688: 2850, 2848, 731: 5562, 759: 5557, 770: 3989, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 3988, 3991, 3990, 820: 5556, 824: 5555, 5561, 874: 5551, 914: 5560}, + {9: 5605, 58: 5606}, + {966, 966, 9: 966, 58: 966, 491: 966, 493: 966, 500: 966, 966, 5572, 5573, 509: 966, 511: 966, 966, 966, 516: 966, 966, 519: 966, 521: 966, 523: 966, 526: 966, 532: 966, 966, 5571, 966, 5574, 538: 5570, 5575, 5576, 841: 5569, 845: 5568}, // 2950 - {1880, 1880, 9: 1880, 50: 1880, 475: 1880, 477: 1880, 483: 1880, 1880, 1880, 1880, 492: 1880, 1880, 1880, 496: 1880, 1880, 499: 1880, 1880, 1880, 504: 1880, 1880, 1880, 509: 1880, 516: 1880, 1880, 1880, 1880, 1880, 522: 1880, 524: 1880, 1880, 1880, 528: 1880, 1880, 676: 5509, 929: 5508, 1184: 5510}, - {1879, 1879, 9: 1879, 50: 1879, 475: 1879, 477: 1879, 483: 1879, 1879, 1879, 1879, 492: 1879, 1879, 1879, 496: 1879, 1879, 499: 1879, 1879, 1879, 504: 1879, 1879, 1879, 509: 1879, 516: 1879, 1879, 1879, 1879, 1879, 522: 1879, 524: 1879, 1879, 1879, 528: 1879, 1879}, - {226: 5551}, - {915, 915, 9: 915, 50: 915, 475: 915, 477: 915, 483: 915, 915, 915, 915, 492: 5513, 915, 915, 496: 915, 915, 499: 915, 915, 915, 504: 915, 915, 5514, 509: 915, 516: 915, 915, 915, 915, 915, 522: 915, 524: 915, 915, 915, 528: 5512, 915, 945: 5516, 5515, 1069: 5517, 5511}, - {1030, 1030, 9: 1030, 50: 1030, 475: 1030, 477: 1030, 483: 1030, 1030, 1030, 1030, 493: 1030, 1030, 496: 1030, 1030, 499: 1030, 1030, 1030, 504: 1030, 1030, 509: 1030, 516: 1030, 1030, 1030, 1030, 1030, 522: 1030, 524: 1030, 1030, 1030, 529: 5532, 1333: 5533}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 957, 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 4082, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 498: 5566, 500: 851, 502: 957, 957, 509: 851, 511: 851, 2815, 521: 2816, 523: 2812, 534: 957, 536: 957, 538: 957, 957, 957, 685: 5565, 2849, 688: 2850, 2848, 790: 3999, 4000, 940: 5564, 5563}, + {961, 961, 9: 961, 58: 961, 491: 961, 493: 961, 500: 961, 961, 961, 961, 509: 961, 511: 961, 961, 961, 516: 961, 961, 519: 961, 521: 961, 523: 961, 526: 961, 532: 961, 961, 961, 961, 961, 538: 961, 961, 961, 542: 961}, + {956, 956, 9: 956, 58: 956, 491: 956, 493: 956, 500: 956, 956, 956, 956, 508: 956, 956, 511: 956, 956, 956, 516: 956, 956, 519: 956, 521: 956, 523: 956, 956, 526: 956, 532: 956, 956, 956, 956, 956, 538: 956, 956, 956, 542: 956, 544: 956, 956, 694: 956}, + {955, 955, 9: 955, 58: 955, 491: 955, 493: 955, 500: 955, 955, 955, 955, 508: 955, 955, 511: 955, 955, 955, 516: 955, 955, 519: 955, 521: 955, 523: 955, 955, 526: 955, 532: 955, 955, 955, 955, 955, 538: 955, 955, 955, 542: 955, 544: 955, 955, 694: 955}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5567, 2849, 688: 2850, 2848}, // 2955 - {584: 4436, 652: 4437, 832: 5531}, - {584: 4436, 652: 4437, 832: 5530}, - {584: 4436, 652: 4437, 832: 5529}, - {476: 927, 497: 5519, 1239: 5520}, - {917, 917, 9: 917, 50: 917, 475: 917, 477: 917, 483: 917, 917, 917, 917, 492: 917, 917, 917, 496: 917, 917, 499: 917, 917, 917, 504: 917, 917, 917, 509: 917, 516: 917, 917, 917, 917, 917, 522: 917, 524: 917, 917, 917, 528: 917, 917}, + {954, 954, 9: 954, 58: 954, 491: 954, 493: 954, 500: 954, 954, 954, 954, 508: 954, 954, 511: 954, 954, 954, 516: 954, 954, 519: 954, 521: 954, 523: 954, 954, 526: 954, 532: 954, 954, 954, 954, 954, 538: 954, 954, 954, 542: 954, 544: 954, 954, 694: 954}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 5559, 685: 4029, 2849, 688: 2850, 2848, 731: 5558, 759: 5557, 820: 5556, 824: 5555, 5598}, + {536: 925, 933: 5585, 1127: 5589}, + {502: 5572, 5573, 536: 5582, 841: 5583}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 5559, 685: 4029, 2849, 688: 2850, 2848, 731: 5558, 759: 5557, 820: 5556, 824: 5555, 5579}, // 2960 - {914, 914, 9: 914, 50: 914, 475: 914, 477: 914, 483: 914, 914, 914, 914, 492: 5513, 914, 914, 496: 914, 914, 499: 914, 914, 914, 504: 914, 914, 5514, 509: 914, 516: 914, 914, 914, 914, 914, 522: 914, 524: 914, 914, 914, 528: 5512, 914, 945: 5518, 5515}, - {916, 916, 9: 916, 50: 916, 475: 916, 477: 916, 483: 916, 916, 916, 916, 492: 916, 916, 916, 496: 916, 916, 499: 916, 916, 916, 504: 916, 916, 916, 509: 916, 516: 916, 916, 916, 916, 916, 522: 916, 524: 916, 916, 916, 528: 916, 916}, - {505: 5525, 516: 5526, 520: 5524}, - {476: 5521}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 922, 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 922, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 594: 5058, 664: 5057, 2785, 2786, 2784, 861: 5522}, + {536: 927, 933: 927}, + {536: 926, 933: 926}, + {2: 923, 923, 923, 923, 923, 923, 923, 10: 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 59: 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 492: 923}, + {536: 5578}, + {536: 5577}, // 2965 - {9: 5060, 50: 5523}, - {923, 923, 9: 923, 50: 923, 475: 923, 477: 923, 483: 923, 923, 923, 923, 492: 923, 923, 923, 496: 923, 923, 499: 923, 923, 923, 504: 923, 923, 923, 509: 923, 516: 923, 923, 923, 923, 923, 522: 923, 524: 923, 923, 923, 528: 923, 923}, - {476: 926}, - {663: 5528}, - {663: 5527}, + {2: 921, 921, 921, 921, 921, 921, 921, 10: 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 59: 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 492: 921}, + {2: 922, 922, 922, 922, 922, 922, 922, 10: 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 59: 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 492: 922}, + {929, 929, 9: 929, 58: 929, 491: 5580, 493: 929, 500: 929, 929, 929, 929, 509: 929, 511: 929, 929, 929, 516: 929, 929, 519: 929, 521: 929, 523: 929, 526: 929, 532: 929, 929, 929, 929, 929, 538: 929, 929, 929, 542: 929, 841: 5569, 845: 5568}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 5581}, + {928, 928, 9: 928, 58: 928, 491: 928, 493: 928, 500: 928, 928, 928, 928, 509: 928, 511: 928, 928, 928, 516: 928, 928, 519: 928, 521: 928, 523: 928, 526: 928, 3451, 3449, 3450, 3448, 3446, 928, 928, 928, 928, 928, 538: 928, 928, 928, 542: 928, 756: 3447, 3445}, // 2970 - {476: 924}, - {476: 925}, - {476: 928, 497: 928}, - {476: 929, 497: 929}, - {476: 930, 497: 930}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 5559, 685: 4029, 2849, 688: 2850, 2848, 731: 5558, 759: 5557, 820: 5556, 824: 5555, 5588}, + {536: 925, 933: 5585, 1127: 5584}, + {536: 5586}, + {536: 924}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 5559, 685: 4029, 2849, 688: 2850, 2848, 731: 5558, 759: 5557, 820: 5556, 824: 5555, 5587}, // 2975 - {89: 5537, 316: 5536, 397: 5535, 476: 1027, 1332: 5534}, - {939, 939, 9: 939, 50: 939, 475: 939, 477: 939, 483: 939, 939, 939, 939, 493: 939, 939, 496: 939, 939, 499: 939, 939, 939, 504: 939, 939, 509: 939, 516: 939, 939, 939, 939, 939, 522: 939, 524: 939, 939, 939}, - {476: 5538}, - {476: 1026}, - {476: 1025}, + {930, 930, 9: 930, 58: 930, 491: 930, 493: 930, 500: 930, 930, 930, 930, 509: 930, 511: 930, 930, 930, 516: 930, 930, 519: 930, 521: 930, 523: 930, 526: 930, 532: 930, 930, 930, 930, 930, 538: 930, 930, 930, 542: 930, 841: 5569, 845: 5568}, + {931, 931, 9: 931, 58: 931, 491: 931, 493: 931, 500: 931, 931, 931, 931, 509: 931, 511: 931, 931, 931, 516: 931, 931, 519: 931, 521: 931, 523: 931, 526: 931, 532: 931, 931, 931, 931, 931, 538: 931, 931, 931, 542: 931, 841: 5569, 845: 5568}, + {536: 5590}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 5559, 685: 4029, 2849, 688: 2850, 2848, 731: 5558, 759: 5557, 820: 5556, 824: 5555, 5591}, + {491: 5592, 501: 5593, 5572, 5573, 534: 5571, 536: 5574, 538: 5570, 5575, 5576, 841: 5569, 845: 5568}, // 2980 - {476: 1024}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 5540, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 5539}, - {50: 1023, 374: 5548, 510: 3371, 512: 3369, 3370, 3368, 3366, 527: 5547, 738: 3367, 3365, 1334: 5546}, - {1020, 1020, 9: 1020, 50: 1020, 222: 5542, 475: 1020, 477: 1020, 483: 1020, 1020, 1020, 1020, 493: 1020, 1020, 496: 1020, 1020, 499: 1020, 1020, 1020, 504: 1020, 1020, 509: 1020, 516: 1020, 1020, 1020, 1020, 1020, 522: 1020, 524: 1020, 1020, 1020, 1123: 5541}, - {1028, 1028, 9: 1028, 50: 1028, 475: 1028, 477: 1028, 483: 1028, 1028, 1028, 1028, 493: 1028, 1028, 496: 1028, 1028, 499: 1028, 1028, 1028, 504: 1028, 1028, 509: 1028, 516: 1028, 1028, 1028, 1028, 1028, 522: 1028, 524: 1028, 1028, 1028}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 5597}, + {492: 5594}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 4256, 831: 5595}, + {9: 4258, 58: 5596}, + {932, 932, 9: 932, 58: 932, 491: 932, 493: 932, 500: 932, 932, 932, 932, 509: 932, 511: 932, 932, 932, 516: 932, 932, 519: 932, 521: 932, 523: 932, 526: 932, 532: 932, 932, 932, 932, 932, 538: 932, 932, 932, 542: 932}, // 2985 - {476: 5543}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 5544}, - {50: 5545, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {1019, 1019, 9: 1019, 50: 1019, 475: 1019, 477: 1019, 483: 1019, 1019, 1019, 1019, 493: 1019, 1019, 496: 1019, 1019, 499: 1019, 1019, 1019, 504: 1019, 1019, 509: 1019, 516: 1019, 1019, 1019, 1019, 1019, 522: 1019, 524: 1019, 1019, 1019}, - {50: 5549}, + {933, 933, 9: 933, 58: 933, 491: 933, 493: 933, 500: 933, 933, 933, 933, 509: 933, 511: 933, 933, 933, 516: 933, 933, 519: 933, 521: 933, 523: 933, 526: 933, 3451, 3449, 3450, 3448, 3446, 933, 933, 933, 933, 933, 538: 933, 933, 933, 542: 933, 756: 3447, 3445}, + {936, 936, 9: 936, 58: 936, 491: 5599, 493: 936, 500: 936, 5600, 5572, 5573, 509: 936, 511: 936, 936, 936, 516: 936, 936, 519: 936, 521: 936, 523: 936, 526: 936, 532: 936, 936, 5571, 936, 5574, 538: 5570, 5575, 5576, 542: 936, 841: 5569, 845: 5568}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 5604}, + {492: 5601}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 4256, 831: 5602}, // 2990 - {50: 1022}, - {50: 1021}, - {1020, 1020, 9: 1020, 50: 1020, 222: 5542, 475: 1020, 477: 1020, 483: 1020, 1020, 1020, 1020, 493: 1020, 1020, 496: 1020, 1020, 499: 1020, 1020, 1020, 504: 1020, 1020, 509: 1020, 516: 1020, 1020, 1020, 1020, 1020, 522: 1020, 524: 1020, 1020, 1020, 1123: 5550}, - {1029, 1029, 9: 1029, 50: 1029, 475: 1029, 477: 1029, 483: 1029, 1029, 1029, 1029, 493: 1029, 1029, 496: 1029, 1029, 499: 1029, 1029, 1029, 504: 1029, 1029, 509: 1029, 516: 1029, 1029, 1029, 1029, 1029, 522: 1029, 524: 1029, 1029, 1029}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 5552}, + {9: 4258, 58: 5603}, + {934, 934, 9: 934, 58: 934, 491: 934, 493: 934, 500: 934, 934, 934, 934, 509: 934, 511: 934, 934, 934, 516: 934, 934, 519: 934, 521: 934, 523: 934, 526: 934, 532: 934, 934, 934, 934, 934, 538: 934, 934, 934, 542: 934}, + {935, 935, 9: 935, 58: 935, 491: 935, 493: 935, 500: 935, 935, 935, 935, 509: 935, 511: 935, 935, 935, 516: 935, 935, 519: 935, 521: 935, 523: 935, 526: 935, 3451, 3449, 3450, 3448, 3446, 935, 935, 935, 935, 935, 538: 935, 935, 935, 542: 935, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 5559, 601: 5554, 685: 4029, 2849, 688: 2850, 2848, 731: 5558, 759: 5557, 820: 5556, 824: 5555, 5561, 874: 5607}, + {960, 960, 9: 960, 58: 960, 491: 960, 493: 960, 500: 960, 960, 960, 960, 509: 960, 511: 960, 960, 960, 516: 960, 960, 519: 960, 521: 960, 523: 960, 526: 960, 532: 960, 960, 960, 960, 960, 538: 960, 960, 960, 542: 960}, // 2995 - {1878, 1878, 9: 1878, 50: 1878, 475: 1878, 477: 1878, 483: 1878, 1878, 1878, 1878, 492: 1878, 1878, 1878, 496: 1878, 1878, 499: 1878, 1878, 1878, 504: 1878, 1878, 1878, 509: 1878, 3371, 512: 3369, 3370, 3368, 3366, 1878, 1878, 1878, 1878, 1878, 522: 1878, 524: 1878, 1878, 1878, 528: 1878, 1878, 738: 3367, 3365}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 5453, 664: 3947, 2785, 2786, 2784, 713: 5452, 740: 5451, 802: 5450, 806: 5449, 5554}, - {485: 5466, 5467, 518: 5465, 520: 5468, 522: 5464, 524: 5469, 5470, 5555, 823: 5463, 827: 5462}, - {942, 942, 9: 942, 50: 942, 475: 942, 477: 942, 483: 942, 942, 493: 942, 942, 496: 942, 942, 499: 942, 942, 942, 504: 942, 942, 509: 942, 516: 942, 942, 519: 942}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 5557, 896: 5558, 930: 5559}, + {967, 967, 9: 967, 58: 967, 491: 967, 493: 967, 500: 967, 967, 509: 967, 511: 967, 967, 967, 516: 967, 967, 519: 967, 521: 967, 523: 967, 526: 967, 532: 967, 967, 535: 967}, + {957, 957, 3234, 3056, 3092, 2935, 2972, 3094, 2862, 957, 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 957, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 957, 493: 957, 498: 5566, 500: 957, 957, 957, 957, 508: 957, 957, 511: 957, 957, 957, 516: 957, 957, 519: 957, 521: 957, 523: 957, 957, 526: 957, 532: 957, 957, 957, 957, 957, 538: 957, 957, 957, 542: 957, 544: 957, 957, 685: 5565, 2849, 688: 2850, 2848, 694: 957, 940: 5564, 5613}, + {492: 5610}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4884, 2849, 688: 2850, 2848, 809: 5611}, + {9: 4885, 58: 5612}, // 3000 - {502: 5567}, - {2372, 2372, 9: 2372, 484: 2372, 496: 2372, 501: 2372, 505: 2372}, - {257, 257, 9: 5560, 484: 257, 496: 257, 501: 2745, 505: 257, 795: 2746, 5561}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 5557, 896: 5566}, - {1311, 1311, 484: 1311, 496: 1311, 505: 2748, 772: 2749, 817: 5562}, + {958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 498: 958, 500: 958, 958, 958, 958, 508: 958, 958, 511: 958, 958, 958, 515: 958, 958, 958, 519: 958, 521: 958, 523: 958, 958, 526: 958, 532: 958, 958, 958, 958, 958, 538: 958, 958, 958, 542: 958, 544: 958, 958, 582: 958, 588: 958, 665: 958, 668: 958, 681: 958, 694: 958}, + {1921, 1921, 9: 1921, 58: 1921, 491: 1921, 493: 1921, 500: 1921, 1921, 1921, 1921, 508: 1921, 1921, 511: 1921, 1921, 1921, 516: 1921, 1921, 519: 1921, 521: 1921, 523: 1921, 1921, 526: 1921, 532: 1921, 1921, 1921, 1921, 1921, 538: 1921, 1921, 1921, 542: 1921, 544: 1921, 1921, 694: 5615, 949: 5614, 1210: 5616}, + {1920, 1920, 9: 1920, 58: 1920, 491: 1920, 493: 1920, 500: 1920, 1920, 1920, 1920, 508: 1920, 1920, 511: 1920, 1920, 1920, 516: 1920, 1920, 519: 1920, 521: 1920, 523: 1920, 1920, 526: 1920, 532: 1920, 1920, 1920, 1920, 1920, 538: 1920, 1920, 1920, 542: 1920, 544: 1920, 1920}, + {236: 5657}, + {938, 938, 9: 938, 58: 938, 491: 938, 493: 938, 500: 938, 938, 938, 938, 508: 5619, 938, 511: 938, 938, 938, 516: 938, 938, 519: 938, 521: 938, 523: 938, 5620, 526: 938, 532: 938, 938, 938, 938, 938, 538: 938, 938, 938, 542: 938, 544: 5618, 938, 966: 5622, 5621, 1092: 5623, 5617}, // 3005 - {897, 897, 484: 897, 496: 5563, 1078: 5564}, - {511: 2759, 580: 2761, 737: 2758, 745: 2760, 886: 5565}, - {261, 261, 484: 261}, - {896, 896, 484: 896}, - {2371, 2371, 9: 2371, 484: 2371, 496: 2371, 501: 2371, 505: 2371}, + {1053, 1053, 9: 1053, 58: 1053, 491: 1053, 493: 1053, 500: 1053, 1053, 1053, 1053, 509: 1053, 511: 1053, 1053, 1053, 516: 1053, 1053, 519: 1053, 521: 1053, 523: 1053, 526: 1053, 532: 1053, 1053, 1053, 1053, 1053, 538: 1053, 1053, 1053, 542: 1053, 545: 5638, 1358: 5639}, + {600: 4535, 668: 4536, 850: 5637}, + {600: 4535, 668: 4536, 850: 5636}, + {600: 4535, 668: 4536, 850: 5635}, + {492: 950, 513: 5625, 1264: 5626}, // 3010 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3929, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3925, 801: 5568}, - {2373, 2373, 9: 2373, 484: 2373, 496: 2373, 501: 2373, 505: 2373}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 5557, 896: 5558, 930: 5570}, - {257, 257, 9: 5560, 484: 257, 501: 2745, 795: 2746, 5571}, - {260, 260, 484: 260}, + {940, 940, 9: 940, 58: 940, 491: 940, 493: 940, 500: 940, 940, 940, 940, 508: 940, 940, 511: 940, 940, 940, 516: 940, 940, 519: 940, 521: 940, 523: 940, 940, 526: 940, 532: 940, 940, 940, 940, 940, 538: 940, 940, 940, 542: 940, 544: 940, 940}, + {937, 937, 9: 937, 58: 937, 491: 937, 493: 937, 500: 937, 937, 937, 937, 508: 5619, 937, 511: 937, 937, 937, 516: 937, 937, 519: 937, 521: 937, 523: 937, 5620, 526: 937, 532: 937, 937, 937, 937, 937, 538: 937, 937, 937, 542: 937, 544: 5618, 937, 966: 5624, 5621}, + {939, 939, 9: 939, 58: 939, 491: 939, 493: 939, 500: 939, 939, 939, 939, 508: 939, 939, 511: 939, 939, 939, 516: 939, 939, 519: 939, 521: 939, 523: 939, 939, 526: 939, 532: 939, 939, 939, 939, 939, 538: 939, 939, 939, 542: 939, 544: 939, 939}, + {523: 5631, 532: 5632, 536: 5630}, + {492: 5627}, // 3015 - {2: 400, 400, 400, 400, 400, 400, 400, 10: 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 51: 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 5574}, - {399, 399}, - {22: 5587, 126: 5577, 5580, 148: 588, 192: 5579, 200: 5590, 211: 5588, 225: 5581, 238: 5585, 260: 5589, 263: 5582, 533: 5586, 572: 5576, 1156: 5584, 1228: 5578, 1257: 5583}, - {2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 10: 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 51: 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 477: 2066, 567: 2066}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 945, 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 945, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 613: 5162, 685: 5161, 2849, 688: 2850, 2848, 879: 5628}, + {9: 5164, 58: 5629}, + {946, 946, 9: 946, 58: 946, 491: 946, 493: 946, 500: 946, 946, 946, 946, 508: 946, 946, 511: 946, 946, 946, 516: 946, 946, 519: 946, 521: 946, 523: 946, 946, 526: 946, 532: 946, 946, 946, 946, 946, 538: 946, 946, 946, 542: 946, 544: 946, 946}, + {492: 949}, + {681: 5634}, // 3020 - {2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 10: 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 51: 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 477: 2065, 567: 2065}, - {598, 598}, - {595, 595}, - {594, 594}, - {218: 5597}, + {681: 5633}, + {492: 947}, + {492: 948}, + {492: 951, 513: 951}, + {492: 952, 513: 952}, // 3025 - {592, 592}, - {148: 5596}, - {579, 579, 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 477: 579, 664: 3947, 2785, 2786, 2784, 740: 3948, 786: 4329, 1155: 5591}, - {589, 589}, - {148: 587}, + {492: 953, 513: 953}, + {91: 5643, 328: 5642, 409: 5641, 492: 1050, 1357: 5640}, + {962, 962, 9: 962, 58: 962, 491: 962, 493: 962, 500: 962, 962, 962, 962, 509: 962, 511: 962, 962, 962, 516: 962, 962, 519: 962, 521: 962, 523: 962, 526: 962, 532: 962, 962, 962, 962, 962, 538: 962, 962, 962, 542: 962}, + {492: 5644}, + {492: 1049}, // 3030 - {148: 586}, - {148: 585}, - {148: 584}, - {148: 583}, - {575, 575, 477: 5593, 1361: 5592}, + {492: 1048}, + {492: 1047}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 5646, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 5645}, + {58: 1046, 385: 5654, 527: 3451, 3449, 3450, 3448, 3446, 543: 5653, 756: 3447, 3445, 1359: 5652}, + {1043, 1043, 9: 1043, 58: 1043, 232: 5648, 491: 1043, 493: 1043, 500: 1043, 1043, 1043, 1043, 509: 1043, 511: 1043, 1043, 1043, 516: 1043, 1043, 519: 1043, 521: 1043, 523: 1043, 526: 1043, 532: 1043, 1043, 1043, 1043, 1043, 538: 1043, 1043, 1043, 542: 1043, 1146: 5647}, // 3035 - {590, 590}, - {674: 5594}, - {500: 5595}, - {574, 574}, - {591, 591}, + {1051, 1051, 9: 1051, 58: 1051, 491: 1051, 493: 1051, 500: 1051, 1051, 1051, 1051, 509: 1051, 511: 1051, 1051, 1051, 516: 1051, 1051, 519: 1051, 521: 1051, 523: 1051, 526: 1051, 532: 1051, 1051, 1051, 1051, 1051, 538: 1051, 1051, 1051, 542: 1051}, + {492: 5649}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 5650}, + {58: 5651, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {1042, 1042, 9: 1042, 58: 1042, 491: 1042, 493: 1042, 500: 1042, 1042, 1042, 1042, 509: 1042, 511: 1042, 1042, 1042, 516: 1042, 1042, 519: 1042, 521: 1042, 523: 1042, 526: 1042, 532: 1042, 1042, 1042, 1042, 1042, 538: 1042, 1042, 1042, 542: 1042}, // 3040 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5598, 2785, 2786, 2784, 960: 5599}, - {597, 597, 9: 597}, - {593, 593, 9: 5600}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5601, 2785, 2786, 2784}, - {596, 596, 9: 596}, + {58: 5655}, + {58: 1045}, + {58: 1044}, + {1043, 1043, 9: 1043, 58: 1043, 232: 5648, 491: 1043, 493: 1043, 500: 1043, 1043, 1043, 1043, 509: 1043, 511: 1043, 1043, 1043, 516: 1043, 1043, 519: 1043, 521: 1043, 523: 1043, 526: 1043, 532: 1043, 1043, 1043, 1043, 1043, 538: 1043, 1043, 1043, 542: 1043, 1146: 5656}, + {1052, 1052, 9: 1052, 58: 1052, 491: 1052, 493: 1052, 500: 1052, 1052, 1052, 1052, 509: 1052, 511: 1052, 1052, 1052, 516: 1052, 1052, 519: 1052, 521: 1052, 523: 1052, 526: 1052, 532: 1052, 1052, 1052, 1052, 1052, 538: 1052, 1052, 1052, 542: 1052}, // 3045 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 5705, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 5706, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 5707, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 5708}, - {572: 5691, 652: 5692}, - {652: 5688}, - {572: 5683, 652: 5682}, - {572: 5680}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 5658}, + {1919, 1919, 9: 1919, 58: 1919, 491: 1919, 493: 1919, 500: 1919, 1919, 1919, 1919, 508: 1919, 1919, 511: 1919, 1919, 1919, 516: 1919, 1919, 519: 1919, 521: 1919, 523: 1919, 1919, 526: 1919, 3451, 3449, 3450, 3448, 3446, 1919, 1919, 1919, 1919, 1919, 538: 1919, 1919, 1919, 542: 1919, 544: 1919, 1919, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 5559, 685: 4029, 2849, 688: 2850, 2848, 731: 5558, 759: 5557, 820: 5556, 824: 5555, 5660}, + {502: 5572, 5573, 534: 5571, 536: 5574, 538: 5570, 5575, 5576, 542: 5661, 841: 5569, 845: 5568}, + {965, 965, 9: 965, 58: 965, 491: 965, 493: 965, 500: 965, 965, 509: 965, 511: 965, 965, 965, 516: 965, 965, 519: 965, 521: 965, 523: 965, 526: 965, 532: 965, 965, 535: 965}, // 3050 - {334: 5674}, - {144: 5671, 223: 5673, 344: 5669, 369: 5670, 919: 5672}, - {207: 5666, 210: 5665}, - {572: 5624}, - {144: 5618, 164: 5620, 174: 607, 199: 5622, 265: 5621, 1319: 5619}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 5663, 916: 5664, 950: 5665}, + {518: 5673}, + {2420, 2420, 9: 2420, 501: 2420, 512: 2420, 519: 2420, 523: 2420}, + {273, 273, 9: 5666, 501: 273, 512: 273, 519: 2809, 523: 273, 814: 2810, 5667}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 5663, 916: 5672}, // 3055 - {144: 5617}, - {144: 5616}, - {400: 5615}, - {712, 712}, - {717, 717}, + {1336, 1336, 501: 1336, 512: 1336, 523: 2812, 790: 2813, 836: 5668}, + {920, 920, 501: 920, 512: 5669, 1101: 5670}, + {525: 2823, 597: 2825, 755: 2822, 762: 2824, 905: 5671}, + {277, 277, 501: 277}, + {919, 919, 501: 919}, // 3060 - {718, 718}, - {719, 719}, - {174: 5623}, - {174: 606}, - {174: 605}, + {2419, 2419, 9: 2419, 501: 2419, 512: 2419, 519: 2419, 523: 2419}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 4011, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4007, 819: 5674}, + {2421, 2421, 9: 2421, 501: 2421, 512: 2421, 519: 2421, 523: 2421}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 5663, 916: 5664, 950: 5676}, + {273, 273, 9: 5666, 501: 273, 519: 2809, 814: 2810, 5677}, // 3065 - {174: 604}, - {711, 711}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 5625}, - {677: 5626, 936: 5627}, - {164: 5630, 169: 5629, 572: 2081, 955: 5628}, + {276, 276, 501: 276}, + {2: 416, 416, 416, 416, 416, 416, 416, 10: 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 59: 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 5680}, + {415, 415}, + {22: 5693, 133: 5683, 136: 5686, 157: 610, 202: 5685, 210: 5696, 222: 5694, 235: 5687, 249: 5691, 271: 5695, 274: 5688, 549: 5692, 588: 5682, 1181: 5690, 1253: 5684, 1282: 5689}, // 3070 - {720, 720}, - {572: 5632}, - {126: 2080, 572: 2080}, - {169: 5631}, - {126: 2079, 572: 2079}, + {2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 10: 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 59: 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 493: 2109, 583: 2109}, + {2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 10: 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 59: 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 493: 2108, 583: 2108}, + {620, 620}, + {617, 617}, + {616, 616}, // 3075 - {2: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 10: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 51: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 567: 4870, 790: 5633}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 5634}, - {446, 446, 6: 446, 446, 446, 15: 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 475: 446, 5638, 446, 481: 446, 446, 446, 487: 446, 491: 446, 446, 498: 446, 506: 446, 446, 446, 521: 5637, 572: 446, 649: 446, 446, 652: 446, 1252: 5636, 1329: 5635}, - {406, 406, 6: 4267, 4269, 410, 15: 4286, 2193, 4284, 4223, 4288, 4275, 4304, 4268, 4271, 4270, 4273, 4274, 4276, 4283, 410, 4294, 4295, 4281, 4282, 4287, 4289, 4301, 4300, 4306, 4302, 4299, 4292, 4297, 4298, 4291, 4293, 4296, 4285, 475: 406, 406, 406, 481: 406, 4266, 4303, 487: 2193, 491: 406, 406, 498: 406, 506: 5013, 406, 2193, 572: 406, 649: 406, 2193, 652: 4272, 785: 4277, 797: 4279, 818: 4278, 840: 4280, 843: 4290, 847: 4305, 924: 5653, 1022: 5652}, - {2196, 2196, 475: 5646, 1094: 5645}, + {228: 5703}, + {614, 614}, + {157: 5702}, + {601, 601, 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 493: 601, 685: 4029, 2849, 688: 2850, 2848, 759: 4030, 804: 4428, 1180: 5697}, + {611, 611}, // 3080 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 5644}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 521: 5639, 584: 2426, 593: 2426, 2426, 645: 2426, 4615, 652: 2426, 664: 4169, 2785, 2786, 2784, 678: 2426, 2426, 748: 4482, 837: 4856, 853: 4988, 908: 4989, 973: 4990, 1153: 5640}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 5642}, - {9: 4992, 50: 5641}, - {445, 445, 6: 445, 445, 445, 15: 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 475: 445, 445, 445, 481: 445, 445, 445, 487: 445, 491: 445, 445, 498: 445, 506: 445, 445, 445, 572: 445, 649: 445, 445, 652: 445}, + {157: 609}, + {157: 608}, + {157: 607}, + {157: 606}, + {157: 605}, // 3085 - {50: 5643}, - {2114, 2114, 475: 2114}, - {2115, 2115, 475: 2115}, - {2197, 2197}, - {150: 5647}, + {597, 597, 493: 5699, 1386: 5698}, + {612, 612}, + {692: 5700}, + {517: 5701}, + {596, 596}, // 3090 - {376: 5649, 743: 5648}, - {527: 5651}, - {527: 5650}, - {2194, 2194}, - {2195, 2195}, + {613, 613}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5704, 2849, 688: 2850, 2848, 980: 5705}, + {619, 619, 9: 619}, + {615, 615, 9: 5706}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5707, 2849, 688: 2850, 2848}, // 3095 - {2191, 2191, 475: 2191, 2191, 2191, 481: 2191, 491: 5655, 2191, 498: 2191, 507: 2191, 572: 2191, 649: 2191, 1108: 5654}, - {405, 405, 6: 4267, 4269, 410, 5015, 15: 4286, 2193, 4284, 4223, 4288, 4275, 4304, 4268, 4271, 4270, 4273, 4274, 4276, 4283, 410, 4294, 4295, 4281, 4282, 4287, 4289, 4301, 4300, 4306, 4302, 4299, 4292, 4297, 4298, 4291, 4293, 4296, 4285, 475: 405, 405, 405, 481: 405, 4266, 4303, 487: 2193, 491: 405, 405, 498: 405, 506: 5013, 405, 2193, 572: 405, 649: 405, 2193, 652: 4272, 785: 4277, 797: 4279, 818: 4278, 840: 4280, 843: 4290, 847: 5014}, - {2129, 2129, 475: 2129, 2129, 2129, 481: 2129, 492: 5242, 498: 2129, 507: 5243, 572: 2129, 649: 2129, 1042: 5656}, - {663: 5071}, - {2126, 2126, 475: 2126, 2126, 2126, 481: 5658, 498: 2126, 572: 2126, 649: 2126, 1185: 5657}, + {618, 618, 9: 618}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 5811, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 5812, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 5813, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 5814}, + {588: 5797, 668: 5798}, + {668: 5794}, + {588: 5789, 668: 5788}, // 3100 - {2124, 2124, 475: 2124, 2608, 2607, 498: 2606, 572: 2605, 649: 2601, 713: 5663, 752: 5661, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 3906, 5662, 5660, 1208: 5659}, - {2125, 2125, 475: 2125, 2125, 2125, 498: 2125, 572: 2125, 649: 2125}, - {2196, 2196, 475: 5646, 1094: 5664}, - {2123, 2123, 475: 2123}, - {2122, 2122, 475: 2122, 483: 829, 493: 829, 829}, + {588: 5786}, + {345: 5780}, + {153: 5777, 233: 5779, 355: 5775, 380: 5776, 939: 5778}, + {218: 5772, 221: 5771}, + {588: 5730}, // 3105 - {2121, 2121, 475: 2121}, - {2120, 2120, 475: 2120, 483: 828, 493: 828, 828, 496: 2751, 504: 2752, 2748, 772: 3917, 3918}, - {2198, 2198}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5598, 2785, 2786, 2784, 960: 5668}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5598, 2785, 2786, 2784, 960: 5667}, + {153: 5724, 174: 5726, 183: 629, 209: 5728, 276: 5727, 1344: 5725}, + {153: 5723}, + {153: 5722}, + {412: 5721}, + {735, 735}, // 3110 - {722, 722, 9: 5600}, - {723, 723, 9: 5600}, - {725, 725}, - {724, 724}, - {716, 716}, + {740, 740}, + {741, 741}, + {742, 742}, + {183: 5729}, + {183: 628}, // 3115 - {715, 715}, - {714, 714}, - {269: 5675}, - {511: 2759, 737: 4079, 767: 5677, 1090: 5676}, - {729, 729, 9: 5678}, + {183: 627}, + {183: 626}, + {734, 734}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 5731}, + {695: 5732, 956: 5733}, // 3120 - {703, 703, 9: 703}, - {511: 2759, 737: 4079, 767: 5679}, - {702, 702, 9: 702}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 3948, 786: 5681}, - {730, 730, 9: 3950}, + {174: 5736, 179: 5735, 588: 2124, 976: 5734}, + {743, 743}, + {588: 5738}, + {133: 2123, 588: 2123}, + {179: 5737}, // 3125 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 5686}, - {500: 5684}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 3948, 786: 5685}, - {721, 721, 9: 3950}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5687, 2785, 2786, 2784}, + {133: 2122, 588: 2122}, + {2: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 10: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 59: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 583: 4974, 805: 5739}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 5740}, + {465, 465, 6: 465, 465, 465, 15: 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 491: 465, 5744, 465, 496: 465, 498: 465, 465, 465, 507: 465, 465, 514: 465, 465, 522: 465, 524: 465, 537: 5743, 588: 465, 665: 465, 667: 465, 465, 1277: 5742, 1354: 5741}, + {422, 422, 6: 4353, 4355, 426, 15: 4372, 2236, 4370, 4309, 4374, 4361, 4390, 4354, 4357, 4356, 4359, 4360, 4362, 4369, 426, 4380, 4381, 4391, 4367, 4368, 4373, 4375, 4387, 4386, 4395, 4388, 4385, 4378, 4383, 4384, 4377, 4379, 4382, 4371, 4392, 4393, 491: 422, 422, 422, 496: 4352, 498: 422, 2236, 4389, 507: 422, 422, 514: 2236, 422, 522: 422, 524: 5117, 588: 422, 665: 422, 667: 2236, 4358, 803: 4363, 816: 4365, 837: 4364, 858: 4366, 861: 4376, 865: 4394, 944: 5759, 1044: 5758}, // 3130 - {732, 732}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 5689}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5690, 2785, 2786, 2784}, - {733, 733}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 3948, 786: 5704}, + {2239, 2239, 491: 5752, 1117: 5751}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 5750}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 537: 5745, 600: 2474, 607: 2474, 613: 2474, 662: 2474, 4714, 668: 2474, 685: 4255, 2849, 688: 2850, 2848, 696: 2474, 2474, 766: 4581, 855: 4960, 871: 5092, 928: 5093, 993: 5094, 1178: 5746}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 5748}, + {9: 5096, 58: 5747}, // 3135 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 5693}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5694, 2785, 2786, 2784}, - {734, 734, 476: 5697, 1064: 5696, 1233: 5695}, - {731, 731, 9: 5702}, - {706, 706, 9: 706}, + {464, 464, 6: 464, 464, 464, 15: 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 491: 464, 464, 464, 496: 464, 498: 464, 464, 464, 507: 464, 464, 514: 464, 464, 522: 464, 524: 464, 588: 464, 665: 464, 667: 464, 464}, + {58: 5749}, + {2157, 2157, 491: 2157}, + {2158, 2158, 491: 2158}, + {2240, 2240}, // 3140 - {511: 2759, 737: 4079, 767: 5698}, - {9: 5699}, - {511: 2759, 737: 4079, 767: 5700}, - {50: 5701}, - {704, 704, 9: 704}, + {159: 5753}, + {387: 5755, 761: 5754}, + {543: 5757}, + {543: 5756}, + {2237, 2237}, // 3145 - {476: 5697, 1064: 5703}, - {705, 705, 9: 705}, - {735, 735, 9: 3950}, - {165: 1656, 380: 5725, 404: 5726, 655: 1656, 1175: 5724}, - {739, 739, 165: 1495, 268: 5711, 5710, 655: 1495}, + {2238, 2238}, + {2234, 2234, 491: 2234, 2234, 2234, 498: 2234, 507: 5761, 2234, 515: 2234, 522: 2234, 588: 2234, 665: 2234, 1131: 5760}, + {421, 421, 6: 4353, 4355, 426, 5119, 15: 4372, 2236, 4370, 4309, 4374, 4361, 4390, 4354, 4357, 4356, 4359, 4360, 4362, 4369, 426, 4380, 4381, 4391, 4367, 4368, 4373, 4375, 4387, 4386, 4395, 4388, 4385, 4378, 4383, 4384, 4377, 4379, 4382, 4371, 4392, 4393, 491: 421, 421, 421, 496: 4352, 498: 421, 2236, 4389, 507: 421, 421, 514: 2236, 421, 522: 421, 524: 5117, 588: 421, 665: 421, 667: 2236, 4358, 803: 4363, 816: 4365, 837: 4364, 858: 4366, 861: 4376, 865: 5118}, + {2172, 2172, 491: 2172, 2172, 2172, 498: 2172, 508: 5348, 515: 2172, 522: 5349, 588: 2172, 665: 2172, 1065: 5762}, + {681: 5175}, // 3150 - {713, 713, 165: 1474, 655: 1474}, - {165: 5709}, - {736, 736}, - {257, 257, 501: 2745, 511: 2759, 737: 4079, 767: 5722, 795: 2746, 5721}, - {379: 5712}, + {2169, 2169, 491: 2169, 2169, 2169, 498: 5764, 515: 2169, 588: 2169, 665: 2169, 1211: 5763}, + {2167, 2167, 491: 2167, 2663, 2662, 515: 2661, 588: 2660, 665: 2656, 731: 5769, 770: 5767, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 3988, 5768, 5766, 1233: 5765}, + {2168, 2168, 491: 2168, 2168, 2168, 515: 2168, 588: 2168, 665: 2168}, + {2239, 2239, 491: 5752, 1117: 5770}, + {2166, 2166, 491: 2166}, // 3155 - {496: 5713, 511: 2759, 737: 4079, 767: 5677, 1090: 5714, 1176: 5715}, - {511: 2759, 737: 2758, 745: 5716}, - {728, 728, 9: 5678}, - {727, 727}, - {742, 742, 9: 5717, 166: 5718}, + {2165, 2165, 491: 2165, 500: 852, 509: 852, 511: 852}, + {2164, 2164, 491: 2164}, + {2163, 2163, 491: 2163, 500: 851, 509: 851, 511: 851, 2815, 521: 2816, 523: 2812, 790: 3999, 4000}, + {2241, 2241}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5704, 2849, 688: 2850, 2848, 980: 5774}, // 3160 - {511: 2759, 737: 2758, 745: 5720}, - {511: 2759, 737: 2758, 745: 5719}, - {740, 740}, - {741, 741}, - {738, 738}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5704, 2849, 688: 2850, 2848, 980: 5773}, + {745, 745, 9: 5706}, + {746, 746, 9: 5706}, + {748, 748}, + {747, 747}, // 3165 - {257, 257, 501: 2745, 795: 2746, 5723}, + {739, 739}, + {738, 738}, {737, 737}, - {726, 726}, - {511: 2759, 737: 5732}, - {354: 5728, 511: 2759, 654: 5729, 737: 5727}, + {280: 5781}, + {525: 2823, 755: 4161, 784: 5783, 1113: 5782}, // 3170 - {709, 709}, - {511: 2759, 737: 5731}, - {511: 2759, 737: 5730}, - {707, 707}, - {708, 708}, + {752, 752, 9: 5784}, + {726, 726, 9: 726}, + {525: 2823, 755: 4161, 784: 5785}, + {725, 725, 9: 725}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4030, 804: 5787}, // 3175 - {710, 710}, - {2: 279, 279, 279, 279, 279, 279, 279, 10: 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 51: 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 478: 279, 482: 279, 502: 1820, 533: 279, 655: 1820, 662: 1820}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 5884, 502: 1818, 655: 1818, 662: 1818, 664: 5883, 2785, 2786, 2784}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 5881, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 502: 1781, 655: 1781, 662: 1781, 664: 5746, 2785, 2786, 2784, 835: 5789}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 502: 1775, 655: 1775, 662: 1775, 664: 5746, 2785, 2786, 2784, 835: 5878}, + {753, 753, 9: 4032}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 5792}, + {517: 5790}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4030, 804: 5791}, + {744, 744, 9: 4032}, // 3180 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 482: 5874, 502: 1773, 533: 3787, 655: 1773, 662: 1773, 664: 3517, 2785, 2786, 2784, 742: 3786, 811: 5873}, - {497: 5863, 502: 5862, 655: 1768, 662: 1768}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 5769, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 5770, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 5774, 482: 5859, 502: 1759, 654: 5857, 1759, 662: 1759, 664: 3517, 2785, 2786, 2784, 742: 5287, 805: 5776, 825: 5777, 5775, 866: 5773, 1134: 5858, 1303: 5856}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 5854, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 502: 1757, 655: 1757, 662: 1757, 664: 5746, 2785, 2786, 2784, 835: 5786}, - {184: 5839, 502: 1740, 655: 1740, 662: 1740, 674: 5840, 926: 5838, 976: 5837}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5793, 2849, 688: 2850, 2848}, + {755, 755}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 5795}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5796, 2849, 688: 2850, 2848}, + {756, 756}, // 3185 - {336: 5794, 338: 5793, 502: 1684, 655: 1684, 662: 1684, 1190: 5795}, - {478: 5792, 502: 1484, 655: 1484, 662: 1484}, - {821, 821, 9: 5782}, - {176: 5768}, - {502: 789, 655: 5766, 662: 789}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4030, 804: 5810}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 5799}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5800, 2849, 688: 2850, 2848}, + {757, 757, 492: 5803, 1087: 5802, 1258: 5801}, + {754, 754, 9: 5808}, // 3190 - {502: 5755, 662: 5756, 828: 5764}, - {502: 5755, 662: 5756, 828: 5759}, - {502: 5755, 662: 5756, 828: 5757}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 482: 5754, 533: 3787, 664: 3517, 2785, 2786, 2784, 742: 3786, 811: 5753, 1195: 5752}, - {767, 767, 9: 767}, + {729, 729, 9: 729}, + {525: 2823, 755: 4161, 784: 5804}, + {9: 5805}, + {525: 2823, 755: 4161, 784: 5806}, + {58: 5807}, // 3195 - {774, 774, 9: 774}, - {773, 773, 9: 773}, - {772, 772, 9: 772}, - {2: 791, 791, 791, 791, 791, 791, 791, 10: 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 51: 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 478: 791, 791, 791, 482: 791, 485: 791, 791, 488: 791, 791, 791, 495: 791, 498: 791, 507: 791, 791, 511: 791, 533: 791, 567: 791, 570: 791, 791, 573: 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 585: 791, 791, 791, 791, 791, 791, 791, 791, 595: 791, 791, 598: 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 651: 791}, - {2: 790, 790, 790, 790, 790, 790, 790, 10: 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 51: 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 478: 790, 790, 790, 482: 790, 485: 790, 790, 488: 790, 790, 790, 495: 790, 498: 790, 507: 790, 790, 511: 790, 533: 790, 567: 790, 570: 790, 790, 573: 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 585: 790, 790, 790, 790, 790, 790, 790, 790, 595: 790, 790, 598: 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 651: 790}, + {727, 727, 9: 727}, + {492: 5803, 1087: 5809}, + {728, 728, 9: 728}, + {758, 758, 9: 4032}, + {175: 1696, 391: 5831, 416: 5832, 672: 1696, 1200: 5830}, // 3200 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 5758}, - {779, 779, 9: 779, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 5761, 3286, 478: 3265, 3284, 2778, 482: 3929, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 5760, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3925, 801: 5762, 845: 5763}, - {793, 793, 3161, 2991, 3026, 2871, 2907, 3028, 2798, 793, 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3374, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3892, 3279, 3360, 3278, 3275}, - {794, 794, 9: 794}, + {762, 762, 175: 1527, 279: 5817, 5816, 672: 1527}, + {736, 736, 175: 1506, 672: 1506}, + {175: 5815}, + {759, 759}, + {273, 273, 519: 2809, 525: 2823, 755: 4161, 784: 5828, 814: 2810, 5827}, // 3205 - {792, 792, 9: 792}, - {780, 780, 9: 780}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 5761, 3286, 478: 3265, 3284, 2778, 482: 3929, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 5760, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3925, 801: 5762, 845: 5765}, - {784, 784, 9: 784}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5767, 2785, 2786, 2784}, + {390: 5818}, + {512: 5819, 525: 2823, 755: 4161, 784: 5783, 1113: 5820, 1201: 5821}, + {525: 2823, 755: 2822, 762: 5822}, + {751, 751, 9: 5784}, + {750, 750}, // 3210 - {502: 788, 662: 788}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 5769, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 5770, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 5774, 654: 5772, 664: 3517, 2785, 2786, 2784, 742: 5287, 805: 5776, 825: 5777, 5775, 866: 5773, 1134: 5771}, - {751, 751, 9: 751, 571: 1849, 653: 751, 670: 1849}, - {810, 810, 571: 1679, 653: 810, 670: 1679}, - {653: 5780}, + {765, 765, 9: 5823, 176: 5824}, + {525: 2823, 755: 2822, 762: 5826}, + {525: 2823, 755: 2822, 762: 5825}, + {763, 763}, + {764, 764}, // 3215 - {653: 809}, - {808, 808, 9: 5778, 653: 808}, - {752, 752, 9: 752, 571: 268, 653: 752, 670: 268}, - {746, 746, 9: 746, 653: 746}, - {745, 745, 9: 745, 653: 745}, + {761, 761}, + {273, 273, 519: 2809, 814: 2810, 5829}, + {760, 760}, + {749, 749}, + {525: 2823, 755: 5838}, // 3220 - {744, 744, 9: 744, 653: 744}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 5769, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 5774, 664: 3517, 2785, 2786, 2784, 742: 5287, 805: 5776, 825: 5779, 5775}, - {743, 743, 9: 743, 653: 743}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 5334, 872: 5781}, - {811, 811, 9: 5336}, + {364: 5834, 525: 2823, 671: 5835, 755: 5833}, + {732, 732}, + {525: 2823, 755: 5837}, + {525: 2823, 755: 5836}, + {730, 730}, // 3225 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 5733, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 5736, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 5783, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 5784, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 5737, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 508: 3863, 571: 5749, 590: 5748, 650: 3861, 664: 5746, 2785, 2786, 2784, 779: 5750, 835: 5747, 983: 5785}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 502: 1781, 655: 1781, 662: 1781, 664: 5746, 2785, 2786, 2784, 835: 5789}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 502: 1757, 655: 1757, 662: 1757, 664: 5746, 2785, 2786, 2784, 835: 5786}, - {766, 766, 9: 766}, - {502: 5755, 662: 5756, 828: 5787}, + {731, 731}, + {733, 733}, + {2: 295, 295, 295, 295, 295, 295, 295, 10: 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 59: 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 494: 295, 496: 295, 518: 1861, 549: 295, 672: 1861, 680: 1861}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 5993, 518: 1859, 672: 1859, 680: 1859, 685: 5992, 2849, 688: 2850, 2848}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 5990, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 518: 1822, 672: 1822, 680: 1822, 685: 5852, 2849, 688: 2850, 2848, 853: 5895}, // 3230 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 5761, 3286, 478: 3265, 3284, 2778, 482: 3929, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 5760, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3925, 801: 5762, 845: 5788}, - {782, 782, 9: 782}, - {502: 5755, 662: 5756, 828: 5790}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 5761, 3286, 478: 3265, 3284, 2778, 482: 3929, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 5760, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3925, 801: 5762, 845: 5791}, - {783, 783, 9: 783}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 518: 1816, 672: 1816, 680: 1816, 685: 5852, 2849, 688: 2850, 2848, 853: 5987}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 496: 5983, 518: 1814, 549: 3867, 672: 1814, 680: 1814, 685: 3597, 2849, 688: 2850, 2848, 760: 3866, 830: 5982}, + {513: 5972, 518: 5971, 672: 1809, 680: 1809}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 5875, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 5876, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 5880, 496: 5968, 518: 1799, 671: 5966, 1799, 680: 1799, 685: 3597, 2849, 688: 2850, 2848, 760: 5393, 823: 5882, 843: 5883, 5881, 884: 5879, 1159: 5967, 1328: 5965}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 5963, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 518: 1797, 672: 1797, 680: 1797, 685: 5852, 2849, 688: 2850, 2848, 853: 5892}, // 3235 - {813, 813}, - {497: 2233}, - {497: 2232}, - {497: 5796}, - {476: 2608, 2607, 498: 2606, 507: 2592, 570: 2591, 572: 2605, 649: 2601, 657: 2713, 713: 5799, 743: 5797, 752: 5800, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 5798, 5802, 5801, 770: 2712, 5804, 777: 5805, 5803, 780: 5806, 851: 5807}, + {193: 5948, 518: 1780, 672: 1780, 680: 1780, 692: 5949, 946: 5947, 996: 5946}, + {347: 5900, 349: 5899, 518: 1724, 672: 1724, 680: 1724, 1216: 5901}, + {494: 5898, 518: 1516, 672: 1516, 680: 1516}, + {844, 844, 9: 5888}, + {185: 5874}, // 3240 - {2: 867, 867, 867, 867, 867, 867, 867, 10: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 51: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 492: 867, 503: 867, 757: 867, 867, 867, 766: 5436, 871: 5437, 923: 5810}, - {476: 2608, 498: 2606, 572: 2605, 649: 2601, 657: 2713, 713: 3914, 752: 3913, 2602, 2603, 2604, 2613, 760: 2611, 3915, 3916, 770: 5217}, - {191, 191, 483: 828, 191, 493: 828, 828, 496: 2751, 504: 2752, 2748, 772: 3917, 3918}, - {193, 193, 483: 829, 193, 493: 829, 829}, - {194, 194, 484: 194}, + {518: 812, 672: 5872, 680: 812}, + {518: 5861, 680: 5862, 846: 5870}, + {518: 5861, 680: 5862, 846: 5865}, + {518: 5861, 680: 5862, 846: 5863}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 496: 5860, 549: 3867, 685: 3597, 2849, 688: 2850, 2848, 760: 3866, 830: 5859, 1221: 5858}, // 3245 - {192, 192, 484: 192}, - {190, 190, 484: 190}, - {189, 189, 484: 189}, - {188, 188, 484: 188}, - {187, 187, 484: 187}, + {790, 790, 9: 790}, + {797, 797, 9: 797}, + {796, 796, 9: 796}, + {795, 795, 9: 795}, + {2: 814, 814, 814, 814, 814, 814, 814, 10: 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 59: 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 494: 814, 814, 814, 814, 502: 814, 814, 814, 814, 814, 510: 814, 514: 814, 814, 522: 814, 525: 814, 549: 814, 583: 814, 587: 814, 589: 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 601: 814, 814, 814, 814, 814, 814, 608: 814, 814, 814, 814, 814, 614: 814, 814, 617: 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 669: 814}, // 3250 - {183, 183, 484: 5808}, - {476: 2608, 2607, 498: 2606, 507: 2592, 570: 2591, 572: 2605, 649: 2601, 657: 2713, 713: 5799, 743: 5797, 752: 5800, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 5798, 5802, 5801, 770: 2712, 5804, 777: 5805, 5803, 780: 5806, 851: 5809}, - {182, 182}, - {2: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 10: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 51: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 492: 1071, 503: 1071, 757: 5441, 5440, 5439, 842: 5442, 891: 5811}, - {2: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 10: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 51: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 5813, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 492: 1059, 503: 1059, 1117: 5812}, + {2: 813, 813, 813, 813, 813, 813, 813, 10: 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 59: 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 494: 813, 813, 813, 813, 502: 813, 813, 813, 813, 813, 510: 813, 514: 813, 813, 522: 813, 525: 813, 549: 813, 583: 813, 587: 813, 589: 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 601: 813, 813, 813, 813, 813, 813, 608: 813, 813, 813, 813, 813, 614: 813, 813, 617: 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 669: 813}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 5864}, + {802, 802, 9: 802, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 5867, 3366, 494: 3345, 3364, 4011, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 5866, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4007, 819: 5868, 863: 5869}, + {816, 816, 3234, 3056, 3092, 2935, 2972, 3094, 2862, 816, 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3454, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3974, 3359, 3440, 3358, 3355}, // 3255 - {2: 1873, 1873, 1873, 1873, 1873, 1873, 1873, 10: 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 51: 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 492: 4217, 503: 1873, 859: 5814}, - {2: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 10: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 51: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 492: 1058, 503: 1058}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 503: 5815, 664: 5817, 2785, 2786, 2784, 922: 5818, 972: 5816}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 5830}, - {9: 5826, 503: 5825}, + {817, 817, 9: 817}, + {815, 815, 9: 815}, + {803, 803, 9: 803}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 5867, 3366, 494: 3345, 3364, 4011, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 5866, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4007, 819: 5868, 863: 5871}, + {807, 807, 9: 807}, // 3260 - {9: 1061, 484: 1061, 503: 1061, 655: 5820, 912: 5819}, - {9: 1063, 484: 1063, 503: 1063}, - {9: 1065, 484: 1065, 503: 1065}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 523: 5822, 664: 5821, 2785, 2786, 2784}, - {9: 1061, 484: 1061, 503: 1061, 655: 5824, 912: 5823}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5873, 2849, 688: 2850, 2848}, + {518: 811, 680: 811}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 5875, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 5876, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 5880, 671: 5878, 685: 3597, 2849, 688: 2850, 2848, 760: 5393, 823: 5882, 843: 5883, 5881, 884: 5879, 1159: 5877}, + {774, 774, 9: 774, 589: 1890, 670: 774, 684: 1890}, + {833, 833, 589: 1719, 670: 833, 684: 1719}, // 3265 - {9: 1060, 484: 1060, 503: 1060}, - {9: 1064, 484: 1064, 503: 1064}, - {523: 5822}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 5453, 582: 5448, 664: 3947, 2785, 2786, 2784, 713: 5452, 740: 5451, 802: 5450, 806: 5449, 5455, 856: 5445, 894: 5828}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5817, 2785, 2786, 2784, 922: 5827}, + {670: 5886}, + {670: 832}, + {831, 831, 9: 5884, 670: 831}, + {775, 775, 9: 775, 589: 284, 670: 775, 684: 284}, + {769, 769, 9: 769, 670: 769}, // 3270 - {9: 1062, 484: 1062, 503: 1062}, - {257, 257, 9: 5499, 484: 257, 501: 2745, 795: 2746, 5829}, - {2091, 2091, 484: 2091}, - {936, 936, 936, 936, 936, 936, 936, 936, 936, 10: 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 51: 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 481: 936, 484: 936, 491: 5503, 936, 496: 936, 501: 936, 505: 936, 936, 528: 936, 864: 5831}, - {934, 934, 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 481: 5460, 484: 934, 492: 934, 496: 934, 501: 934, 505: 934, 934, 528: 934, 664: 5459, 2785, 2786, 2784, 920: 5458, 5832}, + {768, 768, 9: 768, 670: 768}, + {767, 767, 9: 767, 670: 767}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 5875, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 5880, 685: 3597, 2849, 688: 2850, 2848, 760: 5393, 823: 5882, 843: 5885, 5881}, + {766, 766, 9: 766, 670: 766}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 5440, 890: 5887}, // 3275 - {915, 915, 484: 915, 492: 5513, 496: 915, 501: 915, 505: 915, 5514, 528: 5512, 945: 5516, 5515, 1069: 5517, 5833}, - {257, 257, 484: 257, 496: 257, 501: 2745, 505: 257, 795: 2746, 5834}, - {1311, 1311, 484: 1311, 496: 1311, 505: 2748, 772: 2749, 817: 5835}, - {897, 897, 484: 897, 496: 5563, 1078: 5836}, - {2092, 2092, 484: 2092}, + {834, 834, 9: 5442}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 5839, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 5842, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 5889, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 5890, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 5843, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 514: 3943, 589: 5855, 610: 5854, 667: 3941, 685: 5852, 2849, 688: 2850, 2848, 798: 5856, 853: 5853, 1003: 5891}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 518: 1822, 672: 1822, 680: 1822, 685: 5852, 2849, 688: 2850, 2848, 853: 5895}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 518: 1797, 672: 1797, 680: 1797, 685: 5852, 2849, 688: 2850, 2848, 853: 5892}, + {789, 789, 9: 789}, // 3280 - {816, 816, 9: 5852}, - {804, 804, 9: 804}, - {358: 5844}, - {156: 5842, 691: 5841}, - {801, 801, 9: 801}, + {518: 5861, 680: 5862, 846: 5893}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 5867, 3366, 494: 3345, 3364, 4011, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 5866, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4007, 819: 5868, 863: 5894}, + {805, 805, 9: 805}, + {518: 5861, 680: 5862, 846: 5896}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 5867, 3366, 494: 3345, 3364, 4011, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 5866, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4007, 819: 5868, 863: 5897}, // 3285 - {800, 800, 9: 800, 676: 5509, 929: 5843}, - {799, 799, 9: 799}, - {222: 5846, 387: 5848, 674: 5847, 1247: 5845}, - {802, 802, 9: 802}, - {674: 5851}, + {806, 806, 9: 806}, + {836, 836}, + {513: 2277}, + {513: 2276}, + {513: 5902}, // 3290 - {330: 5849, 407: 5850}, - {795, 795, 9: 795}, - {797, 797, 9: 797}, - {796, 796, 9: 796}, - {798, 798, 9: 798}, + {492: 2663, 2662, 515: 2661, 522: 2647, 587: 2646, 2660, 665: 2656, 674: 2771, 687: 5914, 731: 5905, 761: 5903, 770: 5906, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 5904, 5908, 5907, 788: 2770, 5910, 795: 5911, 5912, 5909, 869: 5913}, + {2: 890, 890, 890, 890, 890, 890, 890, 10: 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 59: 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 508: 890, 520: 890, 775: 890, 890, 890, 785: 5542, 889: 5543, 943: 5919}, + {492: 2663, 515: 2661, 588: 2660, 665: 2656, 674: 2771, 731: 3996, 770: 3995, 2657, 2658, 2659, 2668, 778: 2666, 3997, 3998, 788: 5323}, + {200, 200, 500: 851, 200, 509: 851, 511: 851, 2815, 521: 2816, 523: 2812, 790: 3999, 4000}, + {202, 202, 500: 852, 202, 509: 852, 511: 852}, // 3295 - {184: 5839, 674: 5840, 926: 5853}, - {803, 803, 9: 803}, - {184: 5839, 502: 1740, 655: 1740, 662: 1740, 674: 5840, 926: 5838, 976: 5855}, - {817, 817, 9: 5852}, - {812, 812}, + {203, 203, 501: 203}, + {201, 201, 501: 201}, + {199, 199, 501: 199}, + {198, 198, 501: 198}, + {197, 197, 501: 197}, // 3300 - {809, 809, 493: 5860}, - {806, 806}, - {805, 805}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 5769, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 5774, 664: 3517, 2785, 2786, 2784, 742: 5287, 805: 5776, 825: 5777, 5775, 866: 5861}, - {807, 807, 9: 5778}, + {196, 196, 501: 196}, + {190, 190, 501: 5917}, + {217: 5915}, + {494: 5916}, + {188, 188}, // 3305 - {15: 5868, 478: 5867, 1109: 5872}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 5864}, - {502: 5865}, - {15: 5868, 478: 5867, 1109: 5866}, - {819, 819}, + {492: 2663, 2662, 515: 2661, 522: 2647, 587: 2646, 2660, 665: 2656, 674: 2771, 731: 5905, 761: 5903, 770: 5906, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 5904, 5908, 5907, 788: 2770, 5910, 795: 5911, 5912, 5909, 869: 5918}, + {189, 189}, + {2: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 10: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 59: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 508: 1094, 520: 1094, 775: 5547, 5546, 5545, 860: 5548, 910: 5920}, + {2: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 10: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 59: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 5922, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 508: 1082, 520: 1082, 1140: 5921}, + {2: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 10: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 59: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 508: 4303, 520: 1914, 877: 5923}, // 3310 - {755, 755}, - {476: 5869}, - {478: 5366, 897: 5870}, - {50: 5871}, - {754, 754}, + {2: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 10: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 59: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 508: 1081, 520: 1081}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 520: 5924, 685: 5926, 2849, 688: 2850, 2848, 942: 5927, 992: 5925}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 5939}, + {9: 5935, 520: 5934}, + {9: 1084, 501: 1084, 520: 1084, 672: 5929, 932: 5928}, // 3315 - {820, 820}, - {778, 778, 9: 778, 487: 5875}, - {775, 775, 9: 775}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 482: 5876, 664: 3517, 2785, 2786, 2784, 742: 5877}, - {777, 777, 9: 777}, + {9: 1086, 501: 1086, 520: 1086}, + {9: 1088, 501: 1088, 520: 1088}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 541: 5931, 685: 5930, 2849, 688: 2850, 2848}, + {9: 1084, 501: 1084, 520: 1084, 672: 5933, 932: 5932}, + {9: 1083, 501: 1083, 520: 1083}, // 3320 - {776, 776, 9: 776}, - {502: 5755, 662: 5756, 828: 5879}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 5761, 3286, 478: 3265, 3284, 2778, 482: 3929, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 5760, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3925, 801: 5762, 845: 5880}, - {781, 781, 9: 781}, - {184: 5839, 502: 1740, 655: 1740, 662: 1740, 674: 5840, 926: 5838, 976: 5882}, + {9: 1087, 501: 1087, 520: 1087}, + {541: 5931}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 5559, 601: 5554, 685: 4029, 2849, 688: 2850, 2848, 731: 5558, 759: 5557, 820: 5556, 824: 5555, 5561, 874: 5551, 914: 5937}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5926, 2849, 688: 2850, 2848, 942: 5936}, + {9: 1085, 501: 1085, 520: 1085}, // 3325 - {818, 818, 9: 5852}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5886, 2785, 2786, 2784, 907: 5893}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5886, 2785, 2786, 2784, 907: 5885}, - {502: 5755, 662: 5756, 828: 5891}, - {489: 5888, 502: 787, 655: 5887, 662: 787}, + {273, 273, 9: 5605, 501: 273, 519: 2809, 814: 2810, 5938}, + {2134, 2134, 501: 2134}, + {959, 959, 959, 959, 959, 959, 959, 959, 959, 10: 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 59: 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 498: 959, 501: 959, 507: 5609, 959, 512: 959, 519: 959, 523: 959, 959, 544: 959, 882: 5940}, + {957, 957, 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 498: 5566, 501: 957, 508: 957, 512: 957, 519: 957, 523: 957, 957, 544: 957, 685: 5565, 2849, 688: 2850, 2848, 940: 5564, 5941}, + {938, 938, 501: 938, 508: 5619, 512: 938, 519: 938, 523: 938, 5620, 544: 5618, 966: 5622, 5621, 1092: 5623, 5942}, // 3330 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5886, 2785, 2786, 2784, 907: 5890}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5886, 2785, 2786, 2784, 907: 5889}, - {502: 785, 662: 785}, - {502: 786, 662: 786}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 5761, 3286, 478: 3265, 3284, 2778, 482: 3929, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 5760, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3925, 801: 5762, 845: 5892}, + {273, 273, 501: 273, 512: 273, 519: 2809, 523: 273, 814: 2810, 5943}, + {1336, 1336, 501: 1336, 512: 1336, 523: 2812, 790: 2813, 836: 5944}, + {920, 920, 501: 920, 512: 5669, 1101: 5945}, + {2135, 2135, 501: 2135}, + {839, 839, 9: 5961}, // 3335 - {814, 814}, - {502: 5755, 662: 5756, 828: 5894}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 5761, 3286, 478: 3265, 3284, 2778, 482: 3929, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 5760, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3925, 801: 5762, 845: 5895}, - {815, 815}, - {653: 5905}, + {827, 827, 9: 827}, + {368: 5953}, + {165: 5951, 709: 5950}, + {824, 824, 9: 824}, + {823, 823, 9: 823, 694: 5615, 949: 5952}, // 3340 - {653: 5898}, - {275: 5899}, - {502: 5900}, - {478: 5901}, - {497: 5902}, + {822, 822, 9: 822}, + {232: 5955, 399: 5957, 692: 5956, 1272: 5954}, + {825, 825, 9: 825}, + {692: 5960}, + {341: 5958, 419: 5959}, // 3345 - {274: 5903}, - {478: 5904}, - {822, 822}, - {275: 5906}, - {502: 5907}, + {818, 818, 9: 818}, + {820, 820, 9: 820}, + {819, 819, 9: 819}, + {821, 821, 9: 821}, + {193: 5948, 692: 5949, 946: 5962}, // 3350 - {478: 5908}, - {497: 5909}, - {274: 5910}, - {478: 5911}, - {823, 823}, + {826, 826, 9: 826}, + {193: 5948, 518: 1780, 672: 1780, 680: 1780, 692: 5949, 946: 5947, 996: 5964}, + {840, 840, 9: 5961}, + {835, 835}, + {832, 832, 509: 5969}, // 3355 - {476: 2608, 498: 2606, 572: 2605, 649: 2601, 713: 5923, 752: 5922, 2602, 2603, 2604, 5924}, - {476: 1253, 498: 1253, 572: 1253, 649: 1253, 654: 3572, 749: 3570, 3571, 789: 5916, 792: 5917, 938: 5919, 971: 5921}, - {476: 1253, 498: 1253, 572: 1253, 649: 1253, 654: 3572, 749: 3570, 3571, 789: 5916, 792: 5917, 938: 5919, 971: 5920}, - {476: 1253, 498: 1253, 572: 1253, 649: 1253, 654: 3572, 749: 3570, 3571, 789: 5916, 792: 5917, 938: 5919, 971: 5918}, - {2: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 10: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 51: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 476: 1256, 478: 1256, 1256, 1256, 482: 1256, 485: 1256, 1256, 488: 1256, 1256, 1256, 495: 1256, 498: 1256, 507: 1256, 1256, 511: 1256, 518: 1256, 523: 1256, 533: 1256, 567: 1256, 570: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 585: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 595: 1256, 1256, 598: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 649: 1256, 651: 1256, 654: 1256, 749: 1256, 1256, 757: 1256, 1256, 1256, 766: 1256, 774: 1256, 1256, 1256}, + {829, 829}, + {828, 828}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 5875, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 5880, 685: 3597, 2849, 688: 2850, 2848, 760: 5393, 823: 5882, 843: 5883, 5881, 884: 5970}, + {830, 830, 9: 5884}, + {15: 5977, 494: 5976, 1132: 5981}, // 3360 - {476: 1252, 498: 1252, 572: 1252, 649: 1252}, - {476: 825, 498: 825, 572: 825, 649: 825}, - {476: 824, 498: 824, 572: 824, 649: 824}, - {476: 826, 498: 826, 572: 826, 649: 826}, - {476: 827, 498: 827, 572: 827, 649: 827}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 5973}, + {518: 5974}, + {15: 5977, 494: 5976, 1132: 5975}, + {842, 842}, + {778, 778}, // 3365 - {839, 839, 50: 839, 475: 839, 477: 839, 483: 829, 839, 493: 829, 829}, - {838, 838, 50: 838, 475: 838, 477: 838, 483: 828, 838, 493: 828, 828, 496: 2751, 504: 2752, 2748, 772: 5925, 5926}, - {483: 830, 493: 830, 830}, - {837, 837, 50: 837, 475: 837, 477: 837, 484: 837, 496: 2751, 504: 2752, 773: 5927}, - {836, 836, 50: 836, 475: 836, 477: 836, 484: 836}, + {492: 5978}, + {494: 5472, 917: 5979}, + {58: 5980}, + {777, 777}, + {843, 843}, // 3370 - {835, 835, 50: 835, 475: 835, 477: 835, 484: 835}, - {50: 4000, 483: 828, 493: 828, 828, 496: 2751, 504: 2752, 2748, 772: 3917, 3918}, - {9: 5943, 476: 1011, 498: 1011, 572: 1011, 649: 1011, 657: 1011, 743: 1011}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5932, 2785, 2786, 2784, 935: 5931, 1173: 5942}, - {9: 1008, 476: 1008, 498: 1008, 572: 1008, 649: 1008, 657: 1008, 743: 1008}, + {801, 801, 9: 801, 499: 5984}, + {798, 798, 9: 798}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 496: 5985, 685: 3597, 2849, 688: 2850, 2848, 760: 5986}, + {800, 800, 9: 800}, + {799, 799, 9: 799}, // 3375 - {476: 5933, 481: 2347, 1234: 5934}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5938, 2785, 2786, 2784, 881: 5937}, - {481: 5935}, - {476: 2608, 713: 5936}, - {9: 1007, 476: 1007, 498: 1007, 572: 1007, 649: 1007, 657: 1007, 743: 1007}, + {518: 5861, 680: 5862, 846: 5988}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 5867, 3366, 494: 3345, 3364, 4011, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 5866, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4007, 819: 5868, 863: 5989}, + {804, 804, 9: 804}, + {193: 5948, 518: 1780, 672: 1780, 680: 1780, 692: 5949, 946: 5947, 996: 5991}, + {841, 841, 9: 5961}, // 3380 - {9: 5940, 50: 5939}, - {2345, 2345, 9: 2345, 50: 2345, 477: 2345}, - {481: 2346}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5941, 2785, 2786, 2784}, - {2344, 2344, 9: 2344, 50: 2344, 477: 2344}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5995, 2849, 688: 2850, 2848, 927: 6002}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5995, 2849, 688: 2850, 2848, 927: 5994}, + {518: 5861, 680: 5862, 846: 6000}, + {505: 5997, 518: 810, 672: 5996, 680: 810}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5995, 2849, 688: 2850, 2848, 927: 5999}, // 3385 - {9: 5943, 476: 1010, 498: 1010, 572: 1010, 649: 1010, 657: 1010, 743: 1010}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5932, 2785, 2786, 2784, 935: 5944}, - {9: 1009, 476: 1009, 498: 1009, 572: 1009, 649: 1009, 657: 1009, 743: 1009}, - {1311, 1311, 50: 1311, 475: 1311, 477: 1311, 483: 1311, 1311, 493: 1311, 1311, 496: 1311, 1311, 499: 1311, 1311, 504: 1311, 2748, 772: 2749, 817: 5946}, - {883, 883, 50: 883, 475: 883, 477: 883, 483: 883, 883, 493: 883, 883, 496: 2751, 883, 499: 883, 883, 504: 2752, 773: 2753, 834: 5947}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5995, 2849, 688: 2850, 2848, 927: 5998}, + {518: 808, 680: 808}, + {518: 809, 680: 809}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 5867, 3366, 494: 3345, 3364, 4011, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 5866, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4007, 819: 5868, 863: 6001}, + {837, 837}, // 3390 - {854, 854, 50: 854, 475: 854, 477: 854, 483: 854, 854, 493: 854, 854, 497: 3938, 499: 854, 3939, 892: 5948}, - {860, 860, 50: 860, 475: 860, 477: 860, 483: 860, 860, 493: 860, 860, 499: 3964, 893: 5949}, - {1015, 1015, 50: 1015, 475: 1015, 477: 1015, 483: 1015, 1015, 493: 1015, 1015}, - {883, 883, 50: 883, 475: 883, 477: 883, 483: 883, 883, 493: 883, 883, 496: 2751, 883, 499: 883, 883, 504: 2752, 773: 2753, 834: 5951}, - {854, 854, 50: 854, 475: 854, 477: 854, 483: 854, 854, 493: 854, 854, 497: 3938, 499: 854, 3939, 892: 5952}, + {518: 5861, 680: 5862, 846: 6003}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 5867, 3366, 494: 3345, 3364, 4011, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 5866, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4007, 819: 5868, 863: 6004}, + {838, 838}, + {670: 6014}, + {670: 6007}, // 3395 - {860, 860, 50: 860, 475: 860, 477: 860, 483: 860, 860, 493: 860, 860, 499: 3964, 893: 5953}, - {1016, 1016, 50: 1016, 475: 1016, 477: 1016, 483: 1016, 1016, 493: 1016, 1016}, - {663: 5961}, - {1311, 1311, 50: 1311, 475: 1311, 477: 1311, 483: 1311, 1311, 493: 1311, 1311, 496: 1311, 1311, 499: 1311, 1311, 504: 1311, 2748, 772: 2749, 817: 5957}, - {861, 861, 50: 861, 475: 861, 477: 861, 483: 861, 861, 493: 861, 861, 496: 861, 861, 499: 861, 861, 504: 861, 861, 517: 861, 519: 861}, + {286: 6008}, + {518: 6009}, + {494: 6010}, + {513: 6011}, + {285: 6012}, // 3400 - {883, 883, 50: 883, 475: 883, 477: 883, 483: 883, 883, 493: 883, 883, 496: 2751, 883, 499: 883, 883, 504: 2752, 773: 2753, 834: 5958}, - {854, 854, 50: 854, 475: 854, 477: 854, 483: 854, 854, 493: 854, 854, 497: 3938, 499: 854, 3939, 892: 5959}, - {860, 860, 50: 860, 475: 860, 477: 860, 483: 860, 860, 493: 860, 860, 499: 3964, 893: 5960}, - {1017, 1017, 50: 1017, 475: 1017, 477: 1017, 483: 1017, 1017, 493: 1017, 1017}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 2777, 875: 3267, 905: 5962}, + {494: 6013}, + {845, 845}, + {286: 6015}, + {518: 6016}, + {494: 6017}, // 3405 - {1883, 1883, 9: 3438, 50: 1883, 475: 1883, 477: 1883, 483: 1883, 1883, 493: 1883, 1883, 496: 1883, 1883, 499: 1883, 1883, 504: 1883, 1883, 517: 1883, 519: 1883}, - {257, 257, 50: 257, 475: 257, 477: 257, 483: 257, 257, 493: 257, 257, 496: 257, 257, 499: 257, 257, 2745, 504: 257, 257, 516: 257, 795: 2746, 5988}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 5453, 582: 5448, 664: 3947, 2785, 2786, 2784, 713: 5452, 740: 5451, 802: 5450, 806: 5449, 5455, 856: 5445, 894: 5973, 1215: 5972, 1331: 5971}, - {862, 862, 50: 862, 475: 862, 477: 862, 483: 862, 862, 493: 862, 862, 496: 862, 862, 499: 862, 862, 504: 862, 862, 516: 5954, 944: 5956, 970: 5966}, - {1311, 1311, 50: 1311, 475: 1311, 477: 1311, 483: 1311, 1311, 493: 1311, 1311, 496: 1311, 1311, 499: 1311, 1311, 504: 1311, 2748, 772: 2749, 817: 5967}, + {513: 6018}, + {285: 6019}, + {494: 6020}, + {846, 846}, + {492: 2663, 515: 2661, 588: 2660, 665: 2656, 731: 6032, 770: 6031, 2657, 2658, 2659, 6033}, // 3410 - {883, 883, 50: 883, 475: 883, 477: 883, 483: 883, 883, 493: 883, 883, 496: 2751, 883, 499: 883, 883, 504: 2752, 773: 2753, 834: 5968}, - {854, 854, 50: 854, 475: 854, 477: 854, 483: 854, 854, 493: 854, 854, 497: 3938, 499: 854, 3939, 892: 5969}, - {860, 860, 50: 860, 475: 860, 477: 860, 483: 860, 860, 493: 860, 860, 499: 3964, 893: 5970}, - {1018, 1018, 50: 1018, 475: 1018, 477: 1018, 483: 1018, 1018, 493: 1018, 1018}, - {257, 257, 50: 257, 475: 257, 477: 257, 483: 257, 257, 493: 257, 257, 496: 257, 257, 499: 257, 257, 2745, 504: 257, 257, 516: 257, 257, 519: 257, 795: 2746, 5974}, + {492: 1276, 515: 1276, 588: 1276, 665: 1276, 671: 3652, 767: 3650, 3651, 808: 6025, 810: 6026, 959: 6028, 991: 6030}, + {492: 1276, 515: 1276, 588: 1276, 665: 1276, 671: 3652, 767: 3650, 3651, 808: 6025, 810: 6026, 959: 6028, 991: 6029}, + {492: 1276, 515: 1276, 588: 1276, 665: 1276, 671: 3652, 767: 3650, 3651, 808: 6025, 810: 6026, 959: 6028, 991: 6027}, + {2: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 10: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 59: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 492: 1279, 494: 1279, 1279, 1279, 1279, 502: 1279, 1279, 1279, 1279, 1279, 510: 1279, 514: 1279, 1279, 522: 1279, 525: 1279, 534: 1279, 541: 1279, 549: 1279, 583: 1279, 587: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 601: 1279, 1279, 1279, 1279, 1279, 1279, 608: 1279, 1279, 1279, 1279, 1279, 614: 1279, 1279, 617: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 665: 1279, 669: 1279, 671: 1279, 767: 1279, 1279, 775: 1279, 1279, 1279, 785: 1279, 792: 1279, 1279, 1279}, + {492: 1275, 515: 1275, 588: 1275, 665: 1275}, // 3415 - {1006, 1006, 50: 1006, 475: 1006, 477: 1006, 483: 1006, 1006, 493: 1006, 1006, 496: 1006, 1006, 499: 1006, 1006, 1006, 504: 1006, 1006, 516: 1006}, - {946, 946, 9: 5499, 50: 946, 475: 946, 477: 946, 483: 946, 946, 493: 946, 946, 496: 946, 946, 499: 946, 946, 946, 504: 946, 946, 516: 946, 946, 519: 946}, - {862, 862, 50: 862, 475: 862, 477: 862, 483: 862, 862, 493: 862, 862, 496: 862, 862, 499: 862, 862, 504: 862, 862, 516: 5954, 862, 519: 862, 944: 5956, 970: 5975}, - {1882, 1882, 50: 1882, 475: 1882, 477: 1882, 483: 1882, 1882, 493: 1882, 1882, 496: 1882, 1882, 499: 1882, 1882, 504: 1882, 1882, 517: 5976, 519: 1882, 1066: 5977}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 5987}, + {492: 848, 515: 848, 588: 848, 665: 848}, + {492: 847, 515: 847, 588: 847, 665: 847}, + {492: 849, 515: 849, 588: 849, 665: 849}, + {492: 850, 515: 850, 588: 850, 665: 850}, + {862, 862, 58: 862, 491: 862, 493: 862, 500: 852, 862, 509: 852, 511: 852}, // 3420 - {1005, 1005, 50: 1005, 475: 1005, 477: 1005, 483: 1005, 1005, 493: 1005, 1005, 496: 1005, 1005, 499: 1005, 1005, 504: 1005, 1005, 519: 5979, 1354: 5978}, - {1031, 1031, 50: 1031, 475: 1031, 477: 1031, 483: 1031, 1031, 493: 1031, 1031, 496: 1031, 1031, 499: 1031, 1031, 504: 1031, 1031}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3426, 2785, 2786, 2784, 928: 5982, 1169: 5981, 1355: 5980}, - {1004, 1004, 9: 5985, 50: 1004, 475: 1004, 477: 1004, 483: 1004, 1004, 493: 1004, 1004, 496: 1004, 1004, 499: 1004, 1004, 504: 1004, 1004}, - {1003, 1003, 9: 1003, 50: 1003, 475: 1003, 477: 1003, 483: 1003, 1003, 493: 1003, 1003, 496: 1003, 1003, 499: 1003, 1003, 504: 1003, 1003}, + {861, 861, 58: 861, 491: 861, 493: 861, 500: 851, 861, 509: 851, 511: 851, 2815, 521: 2816, 523: 2812, 790: 6034, 6035}, + {500: 853, 509: 853, 511: 853}, + {860, 860, 58: 860, 491: 860, 493: 860, 501: 860, 512: 2815, 521: 2816, 791: 6036}, + {859, 859, 58: 859, 491: 859, 493: 859, 501: 859}, + {858, 858, 58: 858, 491: 858, 493: 858, 501: 858}, // 3425 - {481: 5983}, - {476: 3427, 1171: 5984}, - {1001, 1001, 9: 1001, 50: 1001, 475: 1001, 477: 1001, 483: 1001, 1001, 493: 1001, 1001, 496: 1001, 1001, 499: 1001, 1001, 504: 1001, 1001}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3426, 2785, 2786, 2784, 928: 5982, 1169: 5986}, - {1002, 1002, 9: 1002, 50: 1002, 475: 1002, 477: 1002, 483: 1002, 1002, 493: 1002, 1002, 496: 1002, 1002, 499: 1002, 1002, 504: 1002, 1002}, + {58: 4082, 500: 851, 509: 851, 511: 851, 2815, 521: 2816, 523: 2812, 790: 3999, 4000}, + {9: 6052, 492: 1034, 515: 1034, 588: 1034, 665: 1034, 674: 1034, 761: 1034}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6041, 2849, 688: 2850, 2848, 955: 6040, 1198: 6051}, + {9: 1031, 492: 1031, 515: 1031, 588: 1031, 665: 1031, 674: 1031, 761: 1031}, + {492: 6042, 498: 2395, 1259: 6043}, // 3430 - {1881, 1881, 50: 1881, 475: 1881, 477: 1881, 483: 1881, 1881, 493: 1881, 1881, 496: 1881, 1881, 499: 1881, 1881, 1881, 503: 1881, 1881, 1881, 510: 3371, 512: 3369, 3370, 3368, 3366, 1881, 519: 1881, 738: 3367, 3365}, - {1032, 1032, 50: 1032, 475: 1032, 477: 1032, 483: 1032, 1032, 493: 1032, 1032, 496: 1032, 1032, 499: 1032, 1032, 504: 1032, 1032, 516: 1032}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 523: 6005, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 6006, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 6004, 1051: 6007, 1223: 6008, 1298: 6009}, - {2: 881, 881, 881, 881, 881, 881, 881, 10: 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 51: 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 476: 881, 478: 881, 881, 881, 482: 881, 485: 881, 881, 488: 881, 881, 881, 495: 881, 498: 881, 507: 881, 881, 511: 881, 518: 881, 523: 881, 533: 881, 567: 881, 570: 881, 881, 573: 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 585: 881, 881, 881, 881, 881, 881, 881, 881, 595: 881, 881, 598: 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 651: 881, 654: 881, 749: 881, 881, 757: 881, 881, 881, 766: 881, 774: 881, 881, 881}, - {2: 880, 880, 880, 880, 880, 880, 880, 10: 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 51: 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 476: 880, 478: 880, 880, 880, 482: 880, 485: 880, 880, 488: 880, 880, 880, 495: 880, 498: 880, 507: 880, 880, 511: 880, 518: 880, 523: 880, 533: 880, 567: 880, 570: 880, 880, 573: 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 585: 880, 880, 880, 880, 880, 880, 880, 880, 595: 880, 880, 598: 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 651: 880, 654: 880, 749: 880, 880, 757: 880, 880, 880, 766: 880, 774: 880, 880, 880}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6047, 2849, 688: 2850, 2848, 900: 6046}, + {498: 6044}, + {492: 2663, 731: 6045}, + {9: 1030, 492: 1030, 515: 1030, 588: 1030, 665: 1030, 674: 1030, 761: 1030}, + {9: 6049, 58: 6048}, // 3435 - {2: 879, 879, 879, 879, 879, 879, 879, 10: 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 51: 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 476: 879, 478: 879, 879, 879, 482: 879, 485: 879, 879, 488: 879, 879, 879, 495: 879, 498: 879, 507: 879, 879, 511: 879, 518: 879, 523: 879, 533: 879, 567: 879, 570: 879, 879, 573: 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 585: 879, 879, 879, 879, 879, 879, 879, 879, 595: 879, 879, 598: 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 651: 879, 654: 879, 749: 879, 879, 757: 879, 879, 879, 766: 879, 774: 879, 879, 879}, - {2: 878, 878, 878, 878, 878, 878, 878, 10: 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 51: 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 476: 878, 478: 878, 878, 878, 482: 878, 485: 878, 878, 488: 878, 878, 878, 495: 878, 498: 878, 507: 878, 878, 511: 878, 518: 878, 523: 878, 533: 878, 567: 878, 570: 878, 878, 573: 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 585: 878, 878, 878, 878, 878, 878, 878, 878, 595: 878, 878, 598: 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 651: 878, 654: 878, 749: 878, 878, 757: 878, 878, 878, 766: 878, 774: 878, 878, 878}, - {2: 877, 877, 877, 877, 877, 877, 877, 10: 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 51: 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 476: 877, 478: 877, 877, 877, 482: 877, 485: 877, 877, 488: 877, 877, 877, 495: 877, 498: 877, 507: 877, 877, 511: 877, 518: 877, 523: 877, 533: 877, 567: 877, 570: 877, 877, 573: 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 585: 877, 877, 877, 877, 877, 877, 877, 877, 595: 877, 877, 598: 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 651: 877, 654: 877, 749: 877, 877, 757: 877, 877, 877, 766: 877, 774: 877, 877, 877}, - {2: 876, 876, 876, 876, 876, 876, 876, 10: 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 51: 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 476: 876, 478: 876, 876, 876, 482: 876, 485: 876, 876, 488: 876, 876, 876, 495: 876, 498: 876, 507: 876, 876, 511: 876, 518: 876, 523: 876, 533: 876, 567: 876, 570: 876, 876, 573: 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 585: 876, 876, 876, 876, 876, 876, 876, 876, 595: 876, 876, 598: 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 651: 876, 654: 876, 749: 876, 876, 757: 876, 876, 876, 766: 876, 774: 876, 876, 876}, - {2: 875, 875, 875, 875, 875, 875, 875, 10: 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 51: 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 476: 875, 478: 875, 875, 875, 482: 875, 485: 875, 875, 488: 875, 875, 875, 495: 875, 498: 875, 507: 875, 875, 511: 875, 518: 875, 523: 875, 533: 875, 567: 875, 570: 875, 875, 573: 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 585: 875, 875, 875, 875, 875, 875, 875, 875, 595: 875, 875, 598: 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 651: 875, 654: 875, 749: 875, 875, 757: 875, 875, 875, 766: 875, 774: 875, 875, 875}, + {2393, 2393, 9: 2393, 58: 2393, 493: 2393}, + {498: 2394}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6050, 2849, 688: 2850, 2848}, + {2392, 2392, 9: 2392, 58: 2392, 493: 2392}, + {9: 6052, 492: 1033, 515: 1033, 588: 1033, 665: 1033, 674: 1033, 761: 1033}, // 3440 - {2: 874, 874, 874, 874, 874, 874, 874, 10: 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 51: 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 476: 874, 478: 874, 874, 874, 482: 874, 485: 874, 874, 488: 874, 874, 874, 495: 874, 498: 874, 507: 874, 874, 511: 874, 518: 874, 523: 874, 533: 874, 567: 874, 570: 874, 874, 573: 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 585: 874, 874, 874, 874, 874, 874, 874, 874, 595: 874, 874, 598: 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 651: 874, 654: 874, 749: 874, 874, 757: 874, 874, 874, 766: 874, 774: 874, 874, 874}, - {2: 873, 873, 873, 873, 873, 873, 873, 10: 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 51: 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 476: 873, 478: 873, 873, 873, 482: 873, 485: 873, 873, 488: 873, 873, 873, 495: 873, 498: 873, 507: 873, 873, 511: 873, 518: 873, 523: 873, 533: 873, 567: 873, 570: 873, 873, 573: 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 585: 873, 873, 873, 873, 873, 873, 873, 873, 595: 873, 873, 598: 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 651: 873, 654: 873, 749: 873, 873, 757: 873, 873, 873, 766: 873, 774: 873, 873, 873}, - {2: 871, 871, 871, 871, 871, 871, 871, 10: 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 51: 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 5995, 6001, 6002, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 476: 871, 478: 871, 871, 871, 482: 871, 485: 871, 871, 488: 871, 871, 871, 495: 871, 498: 871, 507: 871, 871, 511: 871, 518: 5998, 523: 871, 533: 871, 567: 871, 570: 871, 871, 573: 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 585: 871, 871, 871, 871, 871, 871, 871, 871, 595: 871, 871, 598: 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 651: 871, 654: 3572, 749: 3570, 3571, 757: 5441, 5440, 5439, 766: 5436, 774: 5994, 5997, 5993, 789: 5916, 792: 5991, 842: 5992, 871: 5990, 1131: 6003, 5996}, - {2: 869, 869, 869, 869, 869, 869, 869, 10: 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 51: 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 476: 869, 478: 869, 869, 869, 482: 869, 485: 869, 869, 488: 869, 869, 869, 495: 869, 498: 869, 507: 869, 869, 511: 869, 518: 869, 523: 869, 533: 869, 567: 869, 570: 869, 869, 573: 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 585: 869, 869, 869, 869, 869, 869, 869, 869, 595: 869, 869, 598: 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 651: 869, 654: 869, 749: 869, 869, 757: 869, 869, 869, 766: 869, 774: 869, 869, 869}, - {2: 865, 865, 865, 865, 865, 865, 865, 10: 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 51: 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 476: 865, 478: 865, 865, 865, 482: 865, 485: 865, 865, 488: 865, 865, 865, 495: 865, 498: 865, 507: 865, 865, 511: 865, 518: 865, 523: 865, 533: 865, 567: 865, 570: 865, 865, 573: 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 585: 865, 865, 865, 865, 865, 865, 865, 865, 595: 865, 865, 598: 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 651: 865, 654: 865, 749: 865, 865, 757: 865, 865, 865, 766: 865, 774: 865, 865, 865}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6041, 2849, 688: 2850, 2848, 955: 6053}, + {9: 1032, 492: 1032, 515: 1032, 588: 1032, 665: 1032, 674: 1032, 761: 1032}, + {1336, 1336, 58: 1336, 491: 1336, 493: 1336, 500: 1336, 1336, 509: 1336, 511: 1336, 1336, 1336, 516: 1336, 1336, 521: 1336, 523: 2812, 790: 2813, 836: 6055}, + {906, 906, 58: 906, 491: 906, 493: 906, 500: 906, 906, 509: 906, 511: 906, 2815, 906, 516: 906, 906, 521: 2816, 791: 2817, 852: 6056}, + {877, 877, 58: 877, 491: 877, 493: 877, 500: 877, 877, 509: 877, 511: 877, 513: 4020, 516: 877, 4021, 912: 6057}, // 3445 - {2: 864, 864, 864, 864, 864, 864, 864, 10: 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 51: 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 476: 864, 478: 864, 864, 864, 482: 864, 485: 864, 864, 488: 864, 864, 864, 495: 864, 498: 864, 507: 864, 864, 511: 864, 518: 864, 523: 864, 533: 864, 567: 864, 570: 864, 864, 573: 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 585: 864, 864, 864, 864, 864, 864, 864, 864, 595: 864, 864, 598: 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 651: 864, 654: 864, 749: 864, 864, 757: 864, 864, 864, 766: 864, 774: 864, 864, 864}, - {2: 870, 870, 870, 870, 870, 870, 870, 10: 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 51: 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 476: 870, 478: 870, 870, 870, 482: 870, 485: 870, 870, 488: 870, 870, 870, 495: 870, 498: 870, 507: 870, 870, 511: 870, 518: 870, 523: 870, 533: 870, 567: 870, 570: 870, 870, 573: 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 585: 870, 870, 870, 870, 870, 870, 870, 870, 595: 870, 870, 598: 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 651: 870, 654: 870, 749: 870, 870, 757: 870, 870, 870, 766: 870, 774: 870, 870, 870}, - {1891, 1891, 3161, 2991, 3026, 2871, 2907, 3028, 2798, 1891, 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 1891, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 1891, 477: 1891, 6022, 481: 6021, 483: 1891, 1891, 493: 1891, 1891, 496: 1891, 1891, 499: 1891, 1891, 1891, 503: 1891, 1891, 1891, 510: 3371, 512: 3369, 3370, 3368, 3366, 1891, 1891, 664: 6020, 2785, 2786, 2784, 738: 3367, 3365, 1220: 6019, 6018}, - {1895, 1895, 9: 1895, 50: 1895, 475: 1895, 477: 1895, 483: 1895, 1895, 493: 1895, 1895, 496: 1895, 1895, 499: 1895, 1895, 1895, 503: 1895, 1895, 1895, 516: 1895, 1895}, - {1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 477: 1293, 1293, 1293, 1293, 1293, 483: 1293, 1293, 487: 1293, 1293, 1293, 1293, 493: 1293, 1293, 496: 1293, 1293, 499: 1293, 1293, 1293, 1293, 1293, 1293, 1293, 510: 1293, 512: 1293, 1293, 1293, 1293, 1293, 1293, 521: 1293, 523: 1293, 547: 1293, 550: 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 568: 1293, 1293, 597: 1293, 655: 6013, 659: 1293, 1293}, + {883, 883, 58: 883, 491: 883, 493: 883, 500: 883, 883, 509: 883, 511: 883, 516: 4046, 913: 6058}, + {1038, 1038, 58: 1038, 491: 1038, 493: 1038, 500: 1038, 1038, 509: 1038, 511: 1038}, + {906, 906, 58: 906, 491: 906, 493: 906, 500: 906, 906, 509: 906, 511: 906, 2815, 906, 516: 906, 906, 521: 2816, 791: 2817, 852: 6060}, + {877, 877, 58: 877, 491: 877, 493: 877, 500: 877, 877, 509: 877, 511: 877, 513: 4020, 516: 877, 4021, 912: 6061}, + {883, 883, 58: 883, 491: 883, 493: 883, 500: 883, 883, 509: 883, 511: 883, 516: 4046, 913: 6062}, // 3450 - {1885, 1885, 9: 1885, 50: 1885, 475: 1885, 477: 1885, 483: 1885, 1885, 493: 1885, 1885, 496: 1885, 1885, 499: 1885, 1885, 1885, 503: 1885, 1885, 1885, 516: 1885, 1885}, - {863, 863, 9: 6011, 50: 863, 475: 863, 477: 863, 483: 863, 863, 493: 863, 863, 496: 863, 863, 499: 863, 863, 863, 503: 863, 863, 863, 516: 863, 863}, - {1882, 1882, 50: 1882, 475: 1882, 477: 1882, 483: 1882, 1882, 493: 1882, 1882, 496: 1882, 1882, 499: 1882, 1882, 1882, 503: 1882, 1882, 1882, 516: 1882, 5976, 1066: 6010}, - {1033, 1033, 50: 1033, 475: 1033, 477: 1033, 483: 1033, 1033, 493: 1033, 1033, 496: 1033, 1033, 499: 1033, 1033, 1033, 503: 1033, 1033, 1033, 516: 1033}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 523: 6005, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 6006, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 6004, 1051: 6012}, + {1039, 1039, 58: 1039, 491: 1039, 493: 1039, 500: 1039, 1039, 509: 1039, 511: 1039}, + {681: 6070}, + {1336, 1336, 58: 1336, 491: 1336, 493: 1336, 500: 1336, 1336, 509: 1336, 511: 1336, 1336, 1336, 516: 1336, 1336, 521: 1336, 523: 2812, 790: 2813, 836: 6066}, + {884, 884, 58: 884, 491: 884, 493: 884, 500: 884, 884, 509: 884, 511: 884, 884, 884, 516: 884, 884, 521: 884, 523: 884, 533: 884, 535: 884}, + {906, 906, 58: 906, 491: 906, 493: 906, 500: 906, 906, 509: 906, 511: 906, 2815, 906, 516: 906, 906, 521: 2816, 791: 2817, 852: 6067}, // 3455 - {1884, 1884, 9: 1884, 50: 1884, 475: 1884, 477: 1884, 483: 1884, 1884, 493: 1884, 1884, 496: 1884, 1884, 499: 1884, 1884, 1884, 503: 1884, 1884, 1884, 516: 1884, 1884}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 523: 6014, 664: 6015, 2785, 2786, 2784}, - {1894, 1894, 9: 1894, 50: 1894, 475: 1894, 477: 1894, 483: 1894, 1894, 493: 1894, 1894, 496: 1894, 1894, 499: 1894, 1894, 1894, 503: 1894, 1894, 1894, 516: 1894, 1894}, - {1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 4016, 1292, 1292, 1292, 1292, 1292, 483: 1292, 1292, 487: 1292, 1292, 1292, 1292, 493: 1292, 1292, 496: 1292, 1292, 499: 1292, 1292, 1292, 1292, 1292, 1292, 1292, 510: 1292, 512: 1292, 1292, 1292, 1292, 1292, 1292, 521: 1292, 523: 1292, 547: 1292, 550: 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 568: 1292, 1292, 597: 1292, 655: 6016, 659: 1292, 1292}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 523: 6017, 664: 3812, 2785, 2786, 2784}, + {877, 877, 58: 877, 491: 877, 493: 877, 500: 877, 877, 509: 877, 511: 877, 513: 4020, 516: 877, 4021, 912: 6068}, + {883, 883, 58: 883, 491: 883, 493: 883, 500: 883, 883, 509: 883, 511: 883, 516: 4046, 913: 6069}, + {1040, 1040, 58: 1040, 491: 1040, 493: 1040, 500: 1040, 1040, 509: 1040, 511: 1040}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 2841, 893: 3347, 925: 6071}, + {1924, 1924, 9: 3518, 58: 1924, 491: 1924, 493: 1924, 500: 1924, 1924, 509: 1924, 511: 1924, 1924, 1924, 516: 1924, 1924, 521: 1924, 523: 1924, 533: 1924, 535: 1924}, // 3460 - {1893, 1893, 9: 1893, 50: 1893, 475: 1893, 477: 1893, 483: 1893, 1893, 493: 1893, 1893, 496: 1893, 1893, 499: 1893, 1893, 1893, 503: 1893, 1893, 1893, 516: 1893, 1893}, - {1892, 1892, 9: 1892, 50: 1892, 475: 1892, 477: 1892, 483: 1892, 1892, 493: 1892, 1892, 496: 1892, 1892, 499: 1892, 1892, 1892, 503: 1892, 1892, 1892, 516: 1892, 1892}, - {1890, 1890, 9: 1890, 50: 1890, 475: 1890, 477: 1890, 483: 1890, 1890, 493: 1890, 1890, 496: 1890, 1890, 499: 1890, 1890, 1890, 503: 1890, 1890, 1890, 516: 1890, 1890}, - {1889, 1889, 9: 1889, 50: 1889, 475: 1889, 477: 1889, 483: 1889, 1889, 493: 1889, 1889, 496: 1889, 1889, 499: 1889, 1889, 1889, 503: 1889, 1889, 1889, 516: 1889, 1889}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 6024, 664: 6023, 2785, 2786, 2784}, + {273, 273, 58: 273, 491: 273, 493: 273, 500: 273, 273, 509: 273, 511: 273, 273, 273, 516: 273, 273, 519: 2809, 521: 273, 523: 273, 532: 273, 814: 2810, 6097}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 5559, 601: 5554, 685: 4029, 2849, 688: 2850, 2848, 731: 5558, 759: 5557, 820: 5556, 824: 5555, 5561, 874: 5551, 914: 6082, 1240: 6081, 1356: 6080}, + {885, 885, 58: 885, 491: 885, 493: 885, 500: 885, 885, 509: 885, 511: 885, 885, 885, 516: 885, 885, 521: 885, 523: 885, 532: 6063, 965: 6065, 990: 6075}, + {1336, 1336, 58: 1336, 491: 1336, 493: 1336, 500: 1336, 1336, 509: 1336, 511: 1336, 1336, 1336, 516: 1336, 1336, 521: 1336, 523: 2812, 790: 2813, 836: 6076}, + {906, 906, 58: 906, 491: 906, 493: 906, 500: 906, 906, 509: 906, 511: 906, 2815, 906, 516: 906, 906, 521: 2816, 791: 2817, 852: 6077}, // 3465 - {1887, 1887, 9: 1887, 50: 1887, 475: 1887, 477: 1887, 483: 1887, 1887, 493: 1887, 1887, 496: 1887, 1887, 499: 1887, 1887, 1887, 503: 1887, 1887, 1887, 516: 1887, 1887}, - {1888, 1888, 9: 1888, 50: 1888, 475: 1888, 477: 1888, 483: 1888, 1888, 493: 1888, 1888, 496: 1888, 1888, 499: 1888, 1888, 1888, 503: 1888, 1888, 1888, 516: 1888, 1888}, - {1886, 1886, 9: 1886, 50: 1886, 475: 1886, 477: 1886, 483: 1886, 1886, 493: 1886, 1886, 496: 1886, 1886, 499: 1886, 1886, 1886, 503: 1886, 1886, 1886, 516: 1886, 1886}, - {1034, 1034}, - {1046, 1046}, + {877, 877, 58: 877, 491: 877, 493: 877, 500: 877, 877, 509: 877, 511: 877, 513: 4020, 516: 877, 4021, 912: 6078}, + {883, 883, 58: 883, 491: 883, 493: 883, 500: 883, 883, 509: 883, 511: 883, 516: 4046, 913: 6079}, + {1041, 1041, 58: 1041, 491: 1041, 493: 1041, 500: 1041, 1041, 509: 1041, 511: 1041}, + {273, 273, 58: 273, 491: 273, 493: 273, 500: 273, 273, 509: 273, 511: 273, 273, 273, 516: 273, 273, 519: 2809, 521: 273, 523: 273, 532: 273, 273, 535: 273, 814: 2810, 6083}, + {1029, 1029, 58: 1029, 491: 1029, 493: 1029, 500: 1029, 1029, 509: 1029, 511: 1029, 1029, 1029, 516: 1029, 1029, 519: 1029, 521: 1029, 523: 1029, 532: 1029}, // 3470 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 6040, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6041, 2785, 2786, 2784}, - {73: 6033, 237: 6032}, - {1038, 1038}, - {804: 6031}, - {1037, 1037}, + {969, 969, 9: 5605, 58: 969, 491: 969, 493: 969, 500: 969, 969, 509: 969, 511: 969, 969, 969, 516: 969, 969, 519: 969, 521: 969, 523: 969, 532: 969, 969, 535: 969}, + {885, 885, 58: 885, 491: 885, 493: 885, 500: 885, 885, 509: 885, 511: 885, 885, 885, 516: 885, 885, 521: 885, 523: 885, 532: 6063, 885, 535: 885, 965: 6065, 990: 6084}, + {1923, 1923, 58: 1923, 491: 1923, 493: 1923, 500: 1923, 1923, 509: 1923, 511: 1923, 1923, 1923, 516: 1923, 1923, 521: 1923, 523: 1923, 533: 6085, 535: 1923, 1089: 6086}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 6096}, + {1028, 1028, 58: 1028, 491: 1028, 493: 1028, 500: 1028, 1028, 509: 1028, 511: 1028, 1028, 1028, 516: 1028, 1028, 521: 1028, 523: 1028, 535: 6088, 1379: 6087}, // 3475 - {1040, 1040, 73: 6038}, - {237: 6034}, - {1039, 1039, 73: 6036, 804: 6035}, - {1042, 1042}, - {804: 6037}, + {1054, 1054, 58: 1054, 491: 1054, 493: 1054, 500: 1054, 1054, 509: 1054, 511: 1054, 1054, 1054, 516: 1054, 1054, 521: 1054, 523: 1054}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 3506, 2849, 688: 2850, 2848, 948: 6091, 1194: 6090, 1380: 6089}, + {1027, 1027, 9: 6094, 58: 1027, 491: 1027, 493: 1027, 500: 1027, 1027, 509: 1027, 511: 1027, 1027, 1027, 516: 1027, 1027, 521: 1027, 523: 1027}, + {1026, 1026, 9: 1026, 58: 1026, 491: 1026, 493: 1026, 500: 1026, 1026, 509: 1026, 511: 1026, 1026, 1026, 516: 1026, 1026, 521: 1026, 523: 1026}, + {498: 6092}, // 3480 - {1041, 1041}, - {804: 6039}, - {1043, 1043}, - {1661, 1661, 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6042, 2785, 2786, 2784}, - {1045, 1045}, + {492: 3507, 1196: 6093}, + {1024, 1024, 9: 1024, 58: 1024, 491: 1024, 493: 1024, 500: 1024, 1024, 509: 1024, 511: 1024, 1024, 1024, 516: 1024, 1024, 521: 1024, 523: 1024}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 3506, 2849, 688: 2850, 2848, 948: 6091, 1194: 6095}, + {1025, 1025, 9: 1025, 58: 1025, 491: 1025, 493: 1025, 500: 1025, 1025, 509: 1025, 511: 1025, 1025, 1025, 516: 1025, 1025, 521: 1025, 523: 1025}, + {1922, 1922, 58: 1922, 491: 1922, 493: 1922, 500: 1922, 1922, 509: 1922, 511: 1922, 1922, 1922, 516: 1922, 1922, 519: 1922, 1922, 1922, 523: 1922, 527: 3451, 3449, 3450, 3448, 3446, 1922, 535: 1922, 756: 3447, 3445}, // 3485 - {1044, 1044}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6044, 2785, 2786, 2784}, - {1050, 1050}, - {1054, 1054, 484: 6046}, - {571: 3375, 714: 6048, 1341: 6047}, + {1055, 1055, 58: 1055, 491: 1055, 493: 1055, 500: 1055, 1055, 509: 1055, 511: 1055, 1055, 1055, 516: 1055, 1055, 521: 1055, 523: 1055, 532: 1055}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 541: 6114, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 6115, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 6113, 1074: 6116, 1248: 6117, 1323: 6118}, + {2: 904, 904, 904, 904, 904, 904, 904, 10: 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 59: 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 492: 904, 494: 904, 904, 904, 904, 502: 904, 904, 904, 904, 904, 510: 904, 514: 904, 904, 522: 904, 525: 904, 534: 904, 541: 904, 549: 904, 583: 904, 587: 904, 589: 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 601: 904, 904, 904, 904, 904, 904, 608: 904, 904, 904, 904, 904, 614: 904, 904, 617: 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 669: 904, 671: 904, 767: 904, 904, 775: 904, 904, 904, 785: 904, 792: 904, 904, 904}, + {2: 903, 903, 903, 903, 903, 903, 903, 10: 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 59: 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 492: 903, 494: 903, 903, 903, 903, 502: 903, 903, 903, 903, 903, 510: 903, 514: 903, 903, 522: 903, 525: 903, 534: 903, 541: 903, 549: 903, 583: 903, 587: 903, 589: 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 601: 903, 903, 903, 903, 903, 903, 608: 903, 903, 903, 903, 903, 614: 903, 903, 617: 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 669: 903, 671: 903, 767: 903, 903, 775: 903, 903, 903, 785: 903, 792: 903, 903, 903}, + {2: 902, 902, 902, 902, 902, 902, 902, 10: 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 59: 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 492: 902, 494: 902, 902, 902, 902, 502: 902, 902, 902, 902, 902, 510: 902, 514: 902, 902, 522: 902, 525: 902, 534: 902, 541: 902, 549: 902, 583: 902, 587: 902, 589: 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 601: 902, 902, 902, 902, 902, 902, 608: 902, 902, 902, 902, 902, 614: 902, 902, 617: 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 669: 902, 671: 902, 767: 902, 902, 775: 902, 902, 902, 785: 902, 792: 902, 902, 902}, // 3490 - {1053, 1053, 9: 6049}, - {1052, 1052, 9: 1052}, - {571: 3375, 714: 6050}, - {1051, 1051, 9: 1051}, - {503: 6052}, + {2: 901, 901, 901, 901, 901, 901, 901, 10: 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 59: 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 492: 901, 494: 901, 901, 901, 901, 502: 901, 901, 901, 901, 901, 510: 901, 514: 901, 901, 522: 901, 525: 901, 534: 901, 541: 901, 549: 901, 583: 901, 587: 901, 589: 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 601: 901, 901, 901, 901, 901, 901, 608: 901, 901, 901, 901, 901, 614: 901, 901, 617: 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 669: 901, 671: 901, 767: 901, 901, 775: 901, 901, 901, 785: 901, 792: 901, 901, 901}, + {2: 900, 900, 900, 900, 900, 900, 900, 10: 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 59: 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 492: 900, 494: 900, 900, 900, 900, 502: 900, 900, 900, 900, 900, 510: 900, 514: 900, 900, 522: 900, 525: 900, 534: 900, 541: 900, 549: 900, 583: 900, 587: 900, 589: 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 601: 900, 900, 900, 900, 900, 900, 608: 900, 900, 900, 900, 900, 614: 900, 900, 617: 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 669: 900, 671: 900, 767: 900, 900, 775: 900, 900, 900, 785: 900, 792: 900, 900, 900}, + {2: 899, 899, 899, 899, 899, 899, 899, 10: 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 59: 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 492: 899, 494: 899, 899, 899, 899, 502: 899, 899, 899, 899, 899, 510: 899, 514: 899, 899, 522: 899, 525: 899, 534: 899, 541: 899, 549: 899, 583: 899, 587: 899, 589: 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 601: 899, 899, 899, 899, 899, 899, 608: 899, 899, 899, 899, 899, 614: 899, 899, 617: 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 669: 899, 671: 899, 767: 899, 899, 775: 899, 899, 899, 785: 899, 792: 899, 899, 899}, + {2: 898, 898, 898, 898, 898, 898, 898, 10: 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 59: 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 492: 898, 494: 898, 898, 898, 898, 502: 898, 898, 898, 898, 898, 510: 898, 514: 898, 898, 522: 898, 525: 898, 534: 898, 541: 898, 549: 898, 583: 898, 587: 898, 589: 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 601: 898, 898, 898, 898, 898, 898, 608: 898, 898, 898, 898, 898, 614: 898, 898, 617: 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 669: 898, 671: 898, 767: 898, 898, 775: 898, 898, 898, 785: 898, 792: 898, 898, 898}, + {2: 897, 897, 897, 897, 897, 897, 897, 10: 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 59: 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 492: 897, 494: 897, 897, 897, 897, 502: 897, 897, 897, 897, 897, 510: 897, 514: 897, 897, 522: 897, 525: 897, 534: 897, 541: 897, 549: 897, 583: 897, 587: 897, 589: 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 601: 897, 897, 897, 897, 897, 897, 608: 897, 897, 897, 897, 897, 614: 897, 897, 617: 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 669: 897, 671: 897, 767: 897, 897, 775: 897, 897, 897, 785: 897, 792: 897, 897, 897}, // 3495 - {478: 6054, 571: 3375, 714: 6055, 1290: 6053}, - {1057, 1057}, - {1056, 1056}, - {1055, 1055}, - {2: 1369, 1369, 1369, 1369, 1369, 1369, 1369, 10: 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 51: 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 499: 6057, 1073: 6058}, + {2: 896, 896, 896, 896, 896, 896, 896, 10: 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 59: 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 492: 896, 494: 896, 896, 896, 896, 502: 896, 896, 896, 896, 896, 510: 896, 514: 896, 896, 522: 896, 525: 896, 534: 896, 541: 896, 549: 896, 583: 896, 587: 896, 589: 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 601: 896, 896, 896, 896, 896, 896, 608: 896, 896, 896, 896, 896, 614: 896, 896, 617: 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 669: 896, 671: 896, 767: 896, 896, 775: 896, 896, 896, 785: 896, 792: 896, 896, 896}, + {2: 894, 894, 894, 894, 894, 894, 894, 10: 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 59: 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 6104, 6110, 6111, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 492: 894, 494: 894, 894, 894, 894, 502: 894, 894, 894, 894, 894, 510: 894, 514: 894, 894, 522: 894, 525: 894, 534: 6107, 541: 894, 549: 894, 583: 894, 587: 894, 589: 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 601: 894, 894, 894, 894, 894, 894, 608: 894, 894, 894, 894, 894, 614: 894, 894, 617: 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 669: 894, 671: 3652, 767: 3650, 3651, 775: 5547, 5546, 5545, 785: 5542, 792: 6103, 6106, 6102, 808: 6025, 810: 6100, 860: 6101, 889: 6099, 1156: 6112, 6105}, + {2: 892, 892, 892, 892, 892, 892, 892, 10: 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 59: 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 492: 892, 494: 892, 892, 892, 892, 502: 892, 892, 892, 892, 892, 510: 892, 514: 892, 892, 522: 892, 525: 892, 534: 892, 541: 892, 549: 892, 583: 892, 587: 892, 589: 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 601: 892, 892, 892, 892, 892, 892, 608: 892, 892, 892, 892, 892, 614: 892, 892, 617: 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 669: 892, 671: 892, 767: 892, 892, 775: 892, 892, 892, 785: 892, 792: 892, 892, 892}, + {2: 888, 888, 888, 888, 888, 888, 888, 10: 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 59: 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 492: 888, 494: 888, 888, 888, 888, 502: 888, 888, 888, 888, 888, 510: 888, 514: 888, 888, 522: 888, 525: 888, 534: 888, 541: 888, 549: 888, 583: 888, 587: 888, 589: 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 601: 888, 888, 888, 888, 888, 888, 608: 888, 888, 888, 888, 888, 614: 888, 888, 617: 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 669: 888, 671: 888, 767: 888, 888, 775: 888, 888, 888, 785: 888, 792: 888, 888, 888}, + {2: 887, 887, 887, 887, 887, 887, 887, 10: 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 59: 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 492: 887, 494: 887, 887, 887, 887, 502: 887, 887, 887, 887, 887, 510: 887, 514: 887, 887, 522: 887, 525: 887, 534: 887, 541: 887, 549: 887, 583: 887, 587: 887, 589: 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 601: 887, 887, 887, 887, 887, 887, 608: 887, 887, 887, 887, 887, 614: 887, 887, 617: 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 669: 887, 671: 887, 767: 887, 887, 775: 887, 887, 887, 785: 887, 792: 887, 887, 887}, // 3500 - {2: 1368, 1368, 1368, 1368, 1368, 1368, 1368, 10: 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 51: 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6059}, - {160: 936, 476: 936, 936, 491: 5503, 498: 936, 509: 936, 572: 936, 649: 936, 864: 6060}, - {160: 6068, 476: 6061, 2607, 498: 6069, 509: 6067, 572: 2605, 649: 2601, 713: 6066, 752: 6064, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 3906, 6065, 6063, 982: 6062, 1072: 6070}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 2349, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 2608, 2607, 498: 2606, 572: 2605, 649: 2601, 664: 4169, 2785, 2786, 2784, 713: 5928, 748: 4170, 752: 3907, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 3906, 3909, 3908, 812: 5137, 1005: 6082}, + {2: 893, 893, 893, 893, 893, 893, 893, 10: 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 59: 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 492: 893, 494: 893, 893, 893, 893, 502: 893, 893, 893, 893, 893, 510: 893, 514: 893, 893, 522: 893, 525: 893, 534: 893, 541: 893, 549: 893, 583: 893, 587: 893, 589: 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 601: 893, 893, 893, 893, 893, 893, 608: 893, 893, 893, 893, 893, 614: 893, 893, 617: 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 669: 893, 671: 893, 767: 893, 893, 775: 893, 893, 893, 785: 893, 792: 893, 893, 893}, + {1932, 1932, 3234, 3056, 3092, 2935, 2972, 3094, 2862, 1932, 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 1932, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 1932, 493: 1932, 6131, 498: 6130, 500: 1932, 1932, 509: 1932, 511: 1932, 1932, 1932, 516: 1932, 1932, 519: 1932, 1932, 1932, 523: 1932, 527: 3451, 3449, 3450, 3448, 3446, 1932, 1932, 685: 6129, 2849, 688: 2850, 2848, 756: 3447, 3445, 1245: 6128, 6127}, + {1936, 1936, 9: 1936, 58: 1936, 491: 1936, 493: 1936, 500: 1936, 1936, 509: 1936, 511: 1936, 1936, 1936, 516: 1936, 1936, 519: 1936, 1936, 1936, 523: 1936, 532: 1936, 1936}, + {1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 493: 1318, 1318, 1318, 497: 1318, 1318, 1318, 1318, 1318, 504: 1318, 1318, 1318, 509: 1318, 511: 1318, 1318, 1318, 516: 1318, 1318, 1318, 1318, 1318, 1318, 523: 1318, 527: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 537: 1318, 541: 1318, 564: 1318, 566: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 584: 1318, 1318, 1318, 616: 1318, 672: 6122, 676: 1318, 1318}, + {1926, 1926, 9: 1926, 58: 1926, 491: 1926, 493: 1926, 500: 1926, 1926, 509: 1926, 511: 1926, 1926, 1926, 516: 1926, 1926, 519: 1926, 1926, 1926, 523: 1926, 532: 1926, 1926}, // 3505 - {476: 3923, 844: 6079, 980: 6078}, - {1361, 1361, 475: 1361, 484: 1361}, - {1360, 1360, 475: 1360, 483: 829, 1360, 493: 829, 829}, - {1359, 1359, 475: 1359, 484: 1359}, - {1358, 1358, 475: 1358, 483: 828, 1358, 493: 828, 828, 496: 2751, 504: 2752, 2748, 772: 3917, 3918}, + {886, 886, 9: 6120, 58: 886, 491: 886, 493: 886, 500: 886, 886, 509: 886, 511: 886, 886, 886, 516: 886, 886, 519: 886, 886, 886, 523: 886, 532: 886, 886}, + {1923, 1923, 58: 1923, 491: 1923, 493: 1923, 500: 1923, 1923, 509: 1923, 511: 1923, 1923, 1923, 516: 1923, 1923, 519: 1923, 1923, 1923, 523: 1923, 532: 1923, 6085, 1089: 6119}, + {1056, 1056, 58: 1056, 491: 1056, 493: 1056, 500: 1056, 1056, 509: 1056, 511: 1056, 1056, 1056, 516: 1056, 1056, 519: 1056, 1056, 1056, 523: 1056, 532: 1056}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 541: 6114, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 6115, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 6113, 1074: 6121}, + {1925, 1925, 9: 1925, 58: 1925, 491: 1925, 493: 1925, 500: 1925, 1925, 509: 1925, 511: 1925, 1925, 1925, 516: 1925, 1925, 519: 1925, 1925, 1925, 523: 1925, 532: 1925, 1925}, // 3510 - {1344, 1344, 3161, 2991, 3026, 2871, 2907, 3028, 2798, 1344, 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 1344, 484: 1344, 664: 4169, 2785, 2786, 2784, 748: 6072, 1009: 6073, 1203: 6071}, - {476: 1356}, - {476: 1355, 578: 3922, 917: 3921, 981: 3920}, - {1339, 1339, 484: 1339}, - {1357, 1357, 9: 6076, 475: 1357, 484: 1357}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 541: 6123, 685: 6124, 2849, 688: 2850, 2848}, + {1935, 1935, 9: 1935, 58: 1935, 491: 1935, 493: 1935, 500: 1935, 1935, 509: 1935, 511: 1935, 1935, 1935, 516: 1935, 1935, 519: 1935, 1935, 1935, 523: 1935, 532: 1935, 1935}, + {1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 4098, 1317, 1317, 1317, 497: 1317, 1317, 1317, 1317, 1317, 504: 1317, 1317, 1317, 509: 1317, 511: 1317, 1317, 1317, 516: 1317, 1317, 1317, 1317, 1317, 1317, 523: 1317, 527: 1317, 1317, 1317, 1317, 1317, 1317, 1317, 537: 1317, 541: 1317, 564: 1317, 566: 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 584: 1317, 1317, 1317, 616: 1317, 672: 6125, 676: 1317, 1317}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 541: 6126, 685: 3892, 2849, 688: 2850, 2848}, + {1934, 1934, 9: 1934, 58: 1934, 491: 1934, 493: 1934, 500: 1934, 1934, 509: 1934, 511: 1934, 1934, 1934, 516: 1934, 1934, 519: 1934, 1934, 1934, 523: 1934, 532: 1934, 1934}, // 3515 - {502: 6074}, - {1343, 1343, 9: 1343, 475: 1343, 484: 1343}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3929, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3925, 801: 6075}, - {1345, 1345, 9: 1345, 475: 1345, 484: 1345}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 6072, 1009: 6077}, + {1933, 1933, 9: 1933, 58: 1933, 491: 1933, 493: 1933, 500: 1933, 1933, 509: 1933, 511: 1933, 1933, 1933, 516: 1933, 1933, 519: 1933, 1933, 1933, 523: 1933, 532: 1933, 1933}, + {1931, 1931, 9: 1931, 58: 1931, 491: 1931, 493: 1931, 500: 1931, 1931, 509: 1931, 511: 1931, 1931, 1931, 516: 1931, 1931, 519: 1931, 1931, 1931, 523: 1931, 532: 1931, 1931}, + {1930, 1930, 9: 1930, 58: 1930, 491: 1930, 493: 1930, 500: 1930, 1930, 509: 1930, 511: 1930, 1930, 1930, 516: 1930, 1930, 519: 1930, 1930, 1930, 523: 1930, 532: 1930, 1930}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 6133, 685: 6132, 2849, 688: 2850, 2848}, + {1928, 1928, 9: 1928, 58: 1928, 491: 1928, 493: 1928, 500: 1928, 1928, 509: 1928, 511: 1928, 1928, 1928, 516: 1928, 1928, 519: 1928, 1928, 1928, 523: 1928, 532: 1928, 1928}, // 3520 - {1342, 1342, 9: 1342, 475: 1342, 484: 1342}, - {1362, 1362, 9: 6080, 475: 1362, 484: 1362}, - {1354, 1354, 9: 1354, 475: 1354, 484: 1354}, - {476: 3923, 844: 6081}, - {1353, 1353, 9: 1353, 475: 1353, 484: 1353}, + {1929, 1929, 9: 1929, 58: 1929, 491: 1929, 493: 1929, 500: 1929, 1929, 509: 1929, 511: 1929, 1929, 1929, 516: 1929, 1929, 519: 1929, 1929, 1929, 523: 1929, 532: 1929, 1929}, + {1927, 1927, 9: 1927, 58: 1927, 491: 1927, 493: 1927, 500: 1927, 1927, 509: 1927, 511: 1927, 1927, 1927, 516: 1927, 1927, 519: 1927, 1927, 1927, 523: 1927, 532: 1927, 1927}, + {1057, 1057}, + {1069, 1069}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 6149, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6150, 2849, 688: 2850, 2848}, // 3525 - {50: 6083}, - {160: 6068, 476: 2608, 2607, 498: 6069, 572: 2605, 649: 2601, 713: 6088, 752: 6086, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 3906, 6087, 6085, 982: 6084}, - {476: 3923, 844: 6079, 980: 6089}, - {1366, 1366, 475: 1366, 484: 1366}, - {1365, 1365, 475: 1365, 483: 829, 1365, 493: 829, 829}, + {79: 6142, 248: 6141}, + {1061, 1061}, + {822: 6140}, + {1060, 1060}, + {1063, 1063, 79: 6147}, // 3530 - {1364, 1364, 475: 1364, 484: 1364}, - {1363, 1363, 475: 1363, 483: 828, 1363, 493: 828, 828, 496: 2751, 504: 2752, 2748, 772: 3917, 3918}, - {1367, 1367, 9: 6080, 475: 1367, 484: 1367}, - {2: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 10: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 51: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 492: 1071, 499: 1071, 757: 5441, 5440, 5439, 842: 5442, 891: 6091}, - {2: 1873, 1873, 1873, 1873, 1873, 1873, 1873, 10: 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 51: 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 492: 4217, 499: 1873, 859: 6092}, + {248: 6143}, + {1062, 1062, 79: 6145, 822: 6144}, + {1065, 1065}, + {822: 6146}, + {1064, 1064}, // 3535 - {2: 1369, 1369, 1369, 1369, 1369, 1369, 1369, 10: 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 51: 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 499: 6057, 1073: 6093}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6094}, - {160: 936, 476: 936, 936, 491: 5503, 498: 936, 509: 936, 572: 936, 649: 936, 864: 6095}, - {160: 6068, 476: 6061, 2607, 498: 6069, 509: 6067, 572: 2605, 649: 2601, 713: 6066, 752: 6064, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 3906, 6065, 6063, 982: 6062, 1072: 6096}, - {1341, 1341, 475: 6098, 484: 1341, 1268: 6097}, + {822: 6148}, + {1066, 1066}, + {1701, 1701, 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6151, 2849, 688: 2850, 2848}, + {1068, 1068}, + {1067, 1067}, // 3540 - {1370, 1370, 484: 1370}, - {208: 6099}, - {584: 6100}, - {657: 6101}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 5557, 896: 5558, 930: 6102}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6153, 2849, 688: 2850, 2848}, + {1073, 1073}, + {1077, 1077, 501: 6155}, + {589: 3455, 732: 6157, 1366: 6156}, + {1076, 1076, 9: 6158}, // 3545 - {1340, 1340, 9: 5560, 484: 1340}, - {1374, 1374, 476: 6111, 655: 1849}, - {1375, 1375}, - {655: 6106}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6107, 2785, 2786, 2784}, + {1075, 1075, 9: 1075}, + {589: 3455, 732: 6159}, + {1074, 1074, 9: 1074}, + {520: 6161}, + {494: 6163, 589: 3455, 732: 6164, 1315: 6162}, // 3550 - {1373, 1373, 476: 6108}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 1936, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3614, 782: 3778, 830: 6109}, - {50: 6110}, - {1371, 1371}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 1936, 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 3614, 782: 3778, 830: 6112}, + {1080, 1080}, + {1079, 1079}, + {1078, 1078}, + {2: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 10: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 59: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 516: 6166, 1096: 6167}, + {2: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 10: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 59: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393}, // 3555 - {50: 6113}, - {1372, 1372}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6275, 2785, 2786, 2784}, - {613, 613, 501: 6272, 521: 6271, 1306: 6270}, - {18: 6258, 104: 6255, 140: 6260, 172: 6259, 198: 6257, 572: 6254, 585: 6256}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 6168}, + {170: 959, 492: 959, 959, 507: 5609, 515: 959, 526: 959, 588: 959, 665: 959, 882: 6169}, + {170: 6177, 492: 6170, 2662, 515: 6178, 526: 6176, 588: 2660, 665: 2656, 731: 6175, 770: 6173, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 3988, 6174, 6172, 1002: 6171, 1095: 6179}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 2397, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 2663, 2662, 515: 2661, 588: 2660, 665: 2656, 685: 4255, 2849, 688: 2850, 2848, 731: 6037, 766: 4256, 770: 3989, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 3988, 3991, 3990, 831: 5241, 1026: 6191}, + {492: 4005, 862: 6188, 1000: 6187}, // 3560 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 6243, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6244}, - {690, 690, 497: 6238}, - {127: 6237}, - {103: 3970, 112: 3969, 126: 6232, 219: 6231, 839: 6233}, - {686, 686}, + {1386, 1386, 491: 1386, 501: 1386}, + {1385, 1385, 491: 1385, 500: 852, 1385, 509: 852, 511: 852}, + {1384, 1384, 491: 1384, 501: 1384}, + {1383, 1383, 491: 1383, 500: 851, 1383, 509: 851, 511: 851, 2815, 521: 2816, 523: 2812, 790: 3999, 4000}, + {1369, 1369, 3234, 3056, 3092, 2935, 2972, 3094, 2862, 1369, 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 1369, 501: 1369, 685: 4255, 2849, 688: 2850, 2848, 766: 6181, 1030: 6182, 1228: 6180}, // 3565 - {678, 678, 188: 6213, 232: 6214, 242: 6215, 245: 6212, 267: 6217, 277: 6216, 291: 6219, 294: 6218, 496: 678, 678, 504: 678, 654: 6220, 1138: 6211, 1309: 6210, 6209}, - {684, 684}, - {683, 683}, - {615, 615, 270: 6200, 497: 6199, 501: 615, 521: 615}, - {503: 661, 547: 661}, + {492: 1381}, + {492: 1380, 595: 4004, 937: 4003, 1001: 4002}, + {1364, 1364, 501: 1364}, + {1382, 1382, 9: 6185, 491: 1382, 501: 1382}, + {518: 6183}, // 3570 - {503: 660, 547: 660}, - {503: 659, 547: 659}, - {656, 656, 501: 656, 521: 656}, - {655, 655, 501: 655, 521: 655}, - {654, 654, 501: 654, 521: 654}, + {1368, 1368, 9: 1368, 491: 1368, 501: 1368}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 4011, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 4007, 819: 6184}, + {1370, 1370, 9: 1370, 491: 1370, 501: 1370}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 6181, 1030: 6186}, + {1367, 1367, 9: 1367, 491: 1367, 501: 1367}, // 3575 - {653, 653, 501: 653, 521: 653}, - {126: 6197}, - {503: 6167, 547: 6168, 809: 6192}, - {103: 603, 112: 603, 213: 6165, 1098: 6186}, - {476: 6181}, + {1387, 1387, 9: 6189, 491: 1387, 501: 1387}, + {1379, 1379, 9: 1379, 491: 1379, 501: 1379}, + {492: 4005, 862: 6190}, + {1378, 1378, 9: 1378, 491: 1378, 501: 1378}, + {58: 6192}, // 3580 - {644, 644, 501: 644, 521: 644}, - {642, 642, 501: 642, 521: 642}, - {127: 6179, 144: 6180, 204: 6178}, - {638, 638, 501: 638, 521: 638}, - {601, 601, 501: 601, 503: 6167, 521: 601, 547: 6168, 809: 6170, 846: 6177}, + {170: 6177, 492: 2663, 2662, 515: 6178, 588: 2660, 665: 2656, 731: 6197, 770: 6195, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 3988, 6196, 6194, 1002: 6193}, + {492: 4005, 862: 6188, 1000: 6198}, + {1391, 1391, 491: 1391, 501: 1391}, + {1390, 1390, 491: 1390, 500: 852, 1390, 509: 852, 511: 852}, + {1389, 1389, 491: 1389, 501: 1389}, // 3585 - {127: 6176}, - {127: 6175}, - {127: 6174}, - {127: 6173}, - {127: 6172}, + {1388, 1388, 491: 1388, 500: 851, 1388, 509: 851, 511: 851, 2815, 521: 2816, 523: 2812, 790: 3999, 4000}, + {1392, 1392, 9: 6189, 491: 1392, 501: 1392}, + {2: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 10: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 59: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 508: 1094, 516: 1094, 775: 5547, 5546, 5545, 860: 5548, 910: 6200}, + {2: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 10: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 59: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 508: 4303, 516: 1914, 877: 6201}, + {2: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 10: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 59: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 516: 6166, 1096: 6202}, // 3590 - {601, 601, 501: 601, 503: 6167, 521: 601, 547: 6168, 809: 6170, 846: 6169}, - {630, 630, 501: 630, 521: 630}, - {629, 629, 501: 629, 521: 629}, - {628, 628, 501: 628, 521: 628}, - {627, 627, 501: 627, 521: 627}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 6203}, + {170: 959, 492: 959, 959, 507: 5609, 515: 959, 526: 959, 588: 959, 665: 959, 882: 6204}, + {170: 6177, 492: 6170, 2662, 515: 6178, 526: 6176, 588: 2660, 665: 2656, 731: 6175, 770: 6173, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 3988, 6174, 6172, 1002: 6171, 1095: 6205}, + {1366, 1366, 491: 6207, 501: 1366, 1293: 6206}, + {1395, 1395, 501: 1395}, // 3595 - {626, 626, 501: 626, 521: 626}, - {625, 625, 501: 625, 521: 625}, - {624, 624, 501: 624, 521: 624}, - {623, 623, 501: 623, 521: 623}, - {622, 622, 501: 622, 521: 622}, + {219: 6208}, + {600: 6209}, + {674: 6210}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 5663, 916: 5664, 950: 6211}, + {1365, 1365, 9: 5666, 501: 1365}, // 3600 - {621, 621, 501: 621, 521: 621}, - {620, 620, 501: 620, 521: 620}, - {127: 6166}, - {618, 618, 501: 618, 521: 618}, - {617, 617, 501: 617, 521: 617}, + {1399, 1399, 492: 6220, 672: 1890}, + {1400, 1400}, + {672: 6215}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6216, 2849, 688: 2850, 2848}, + {1398, 1398, 492: 6217}, // 3605 - {616, 616, 501: 616, 521: 616}, - {127: 609, 144: 609, 204: 609}, - {127: 608, 144: 608, 162: 608, 204: 608}, - {103: 602, 112: 602, 126: 602, 219: 602}, - {619, 619, 501: 619, 521: 619}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 1978, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3694, 801: 3858, 848: 6218}, + {58: 6219}, + {1396, 1396}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 1978, 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 3694, 801: 3858, 848: 6221}, + {58: 6222}, // 3610 - {2: 658, 658, 658, 658, 658, 658, 658, 10: 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 51: 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658}, - {2: 657, 657, 657, 657, 657, 657, 657, 10: 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 51: 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657}, - {631, 631, 501: 631, 521: 631}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5434, 2785, 2786, 2784, 813: 6171}, - {600, 600, 501: 600, 521: 600}, + {1397, 1397}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6388, 2849, 688: 2850, 2848}, + {635, 635, 519: 6385, 537: 6384, 1331: 6383}, + {18: 6367, 51: 6368, 111: 6364, 149: 6370, 181: 6369, 208: 6366, 588: 6363, 602: 6365}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 6352, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 6353}, // 3615 - {632, 632, 501: 632, 521: 632}, - {633, 633, 501: 633, 521: 633}, - {634, 634, 501: 634, 521: 634}, - {635, 635, 501: 635, 521: 635}, - {636, 636, 501: 636, 521: 636}, + {712, 712, 513: 6347}, + {136: 6346}, + {110: 4052, 132: 4051, 6341, 229: 6340, 857: 6342}, + {708, 708}, + {700, 700, 197: 6322, 242: 6323, 253: 6324, 256: 6321, 278: 6326, 288: 6325, 302: 6328, 305: 6327, 512: 700, 700, 521: 700, 671: 6329, 1163: 6320, 1334: 6319, 6318}, // 3620 - {637, 637, 501: 637, 521: 637}, - {641, 641, 501: 641, 521: 641}, - {640, 640, 501: 640, 521: 640}, - {639, 639, 501: 639, 521: 639}, - {523: 6182}, + {706, 706}, + {705, 705}, + {637, 637, 281: 6309, 513: 6308, 519: 637, 537: 637}, + {520: 683, 564: 683}, + {520: 682, 564: 682}, // 3625 - {50: 6183}, - {183: 6185, 309: 6184}, - {645, 645, 501: 645, 521: 645}, - {643, 643, 501: 643, 521: 643}, - {103: 3970, 112: 3969, 839: 6187}, + {520: 681, 564: 681}, + {678, 678, 519: 678, 537: 678}, + {677, 677, 519: 677, 537: 677}, + {676, 676, 519: 676, 537: 676}, + {675, 675, 519: 675, 537: 675}, // 3630 - {503: 6167, 547: 6168, 809: 6189, 1140: 6188}, - {601, 601, 501: 601, 503: 6167, 521: 601, 547: 6168, 809: 6170, 846: 6191}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6190}, - {599, 599, 501: 599, 503: 599, 521: 599, 547: 599}, - {646, 646, 501: 646, 521: 646}, + {133: 6306}, + {520: 6276, 564: 6277, 827: 6301}, + {110: 625, 132: 625, 224: 6274, 1121: 6295}, + {492: 6290}, + {666, 666, 519: 666, 537: 666}, // 3635 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6193, 2785, 2786, 2784, 740: 6194}, - {1069, 1069, 501: 1069, 503: 6167, 521: 1069, 547: 6168, 655: 3952, 809: 6195}, - {649, 649, 501: 649, 521: 649}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6196, 2785, 2786, 2784}, - {648, 648, 501: 648, 521: 648}, + {664, 664, 519: 664, 537: 664}, + {136: 6288, 153: 6289, 214: 6287}, + {660, 660, 519: 660, 537: 660}, + {623, 623, 519: 623, 6276, 537: 623, 564: 6277, 827: 6279, 864: 6286}, + {136: 6285}, // 3640 - {601, 601, 501: 601, 503: 6167, 521: 601, 547: 6168, 809: 6170, 846: 6198}, - {651, 651, 501: 651, 521: 651}, - {572: 6204, 585: 6201, 838: 6203, 1307: 6202}, - {614, 614, 501: 614, 521: 614}, - {2: 2085, 2085, 2085, 2085, 2085, 2085, 2085, 10: 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 51: 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 482: 2085, 487: 2085, 508: 2085, 2085, 523: 2085, 567: 2085, 650: 2085}, + {136: 6284}, + {136: 6283}, + {136: 6282}, + {136: 6281}, + {623, 623, 519: 623, 6276, 537: 623, 564: 6277, 827: 6279, 864: 6278}, // 3645 - {682, 682}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5434, 2785, 2786, 2784, 813: 6208}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6205}, - {680, 680, 491: 6206}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6207, 2785, 2786, 2784}, + {652, 652, 519: 652, 537: 652}, + {651, 651, 519: 651, 537: 651}, + {650, 650, 519: 650, 537: 650}, + {649, 649, 519: 649, 537: 649}, + {648, 648, 519: 648, 537: 648}, // 3650 - {679, 679}, - {681, 681}, - {665, 665, 496: 665, 6227, 504: 665, 1308: 6226}, - {677, 677, 9: 6224, 496: 677, 677, 504: 677}, - {676, 676, 9: 676, 496: 676, 676, 504: 676}, + {647, 647, 519: 647, 537: 647}, + {646, 646, 519: 646, 537: 646}, + {645, 645, 519: 645, 537: 645}, + {644, 644, 519: 644, 537: 644}, + {643, 643, 519: 643, 537: 643}, // 3655 - {674, 674, 9: 674, 496: 674, 674, 504: 674}, - {673, 673, 9: 673, 496: 673, 673, 504: 673}, - {356: 6223}, - {396: 6222}, - {346: 6221}, + {642, 642, 519: 642, 537: 642}, + {136: 6275}, + {640, 640, 519: 640, 537: 640}, + {639, 639, 519: 639, 537: 639}, + {638, 638, 519: 638, 537: 638}, // 3660 - {669, 669, 9: 669, 496: 669, 669, 504: 669}, - {668, 668, 9: 668, 496: 668, 668, 504: 668}, - {667, 667, 9: 667, 496: 667, 667, 504: 667}, - {666, 666, 9: 666, 496: 666, 666, 504: 666}, - {670, 670, 9: 670, 496: 670, 670, 504: 670}, + {136: 631, 153: 631, 214: 631}, + {136: 630, 153: 630, 172: 630, 214: 630}, + {110: 624, 132: 624, 624, 229: 624}, + {641, 641, 519: 641, 537: 641}, + {2: 680, 680, 680, 680, 680, 680, 680, 10: 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 59: 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680}, // 3665 - {671, 671, 9: 671, 496: 671, 671, 504: 671}, - {672, 672, 9: 672, 496: 672, 672, 504: 672}, - {188: 6213, 232: 6214, 242: 6215, 245: 6212, 267: 6217, 277: 6216, 291: 6219, 294: 6218, 654: 6220, 1138: 6225}, - {675, 675, 9: 675, 496: 675, 675, 504: 675}, - {883, 883, 496: 2751, 504: 2752, 773: 2753, 834: 6230}, + {2: 679, 679, 679, 679, 679, 679, 679, 10: 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 59: 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679}, + {653, 653, 519: 653, 537: 653}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5540, 2849, 688: 2850, 2848, 832: 6280}, + {622, 622, 519: 622, 537: 622}, + {654, 654, 519: 654, 537: 654}, // 3670 - {142: 6228}, - {511: 2759, 737: 4079, 767: 6229}, - {664, 664, 496: 664, 504: 664}, - {685, 685}, - {687, 687}, + {655, 655, 519: 655, 537: 655}, + {656, 656, 519: 656, 537: 656}, + {657, 657, 519: 657, 537: 657}, + {658, 658, 519: 658, 537: 658}, + {659, 659, 519: 659, 537: 659}, // 3675 - {601, 601, 501: 601, 503: 6167, 521: 601, 547: 6168, 809: 6170, 846: 6236}, - {503: 6167, 547: 6168, 809: 6189, 1140: 6234}, - {601, 601, 501: 601, 503: 6167, 521: 601, 547: 6168, 809: 6170, 846: 6235}, - {647, 647, 501: 647, 521: 647}, - {652, 652, 501: 652, 521: 652}, + {663, 663, 519: 663, 537: 663}, + {662, 662, 519: 662, 537: 662}, + {661, 661, 519: 661, 537: 661}, + {541: 6291}, + {58: 6292}, // 3680 - {688, 688}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 6239}, - {663, 663, 484: 6241, 1342: 6240}, - {689, 689}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 5769, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 5774, 664: 3517, 2785, 2786, 2784, 742: 5287, 805: 5776, 825: 5777, 5775, 866: 6242}, + {192: 6294, 321: 6293}, + {667, 667, 519: 667, 537: 667}, + {665, 665, 519: 665, 537: 665}, + {110: 4052, 132: 4051, 857: 6296}, + {520: 6276, 564: 6277, 827: 6298, 1165: 6297}, // 3685 - {662, 662, 9: 5778}, - {601, 601, 89: 1751, 165: 1751, 491: 1751, 501: 601, 503: 6167, 521: 601, 547: 6168, 652: 1751, 655: 1751, 809: 6170, 846: 6253}, - {89: 936, 165: 6246, 491: 5503, 652: 936, 864: 6245}, - {89: 6247, 652: 6248}, - {692, 692}, + {623, 623, 519: 623, 6276, 537: 623, 564: 6277, 827: 6279, 864: 6300}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 6299}, + {621, 621, 519: 621, 621, 537: 621, 564: 621}, + {668, 668, 519: 668, 537: 668}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6302, 2849, 688: 2850, 2848, 759: 6303}, // 3690 - {257, 257, 501: 2745, 795: 2746, 6252}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6249, 2785, 2786, 2784}, - {89: 6250}, - {257, 257, 501: 2745, 795: 2746, 6251}, - {691, 691}, + {1092, 1092, 519: 1092, 6276, 537: 1092, 564: 6277, 672: 4034, 827: 6304}, + {671, 671, 519: 671, 537: 671}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6305, 2849, 688: 2850, 2848}, + {670, 670, 519: 670, 537: 670}, + {623, 623, 519: 623, 6276, 537: 623, 564: 6277, 827: 6279, 864: 6307}, // 3695 - {693, 693}, - {650, 650, 501: 650, 521: 650}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6269}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6268}, - {2: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 10: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 51: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 567: 4870, 790: 6266}, + {673, 673, 519: 673, 537: 673}, + {588: 6313, 602: 6310, 856: 6312, 1332: 6311}, + {636, 636, 519: 636, 537: 636}, + {2: 2128, 2128, 2128, 2128, 2128, 2128, 2128, 10: 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 59: 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 496: 2128, 499: 2128, 514: 2128, 526: 2128, 541: 2128, 583: 2128, 667: 2128}, + {704, 704}, // 3700 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6265}, - {167: 6263}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 6262}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6261, 2785, 2786, 2784}, - {694, 694}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5540, 2849, 688: 2850, 2848, 832: 6317}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 6314}, + {702, 702, 507: 6315}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6316, 2849, 688: 2850, 2848}, + {701, 701}, // 3705 - {695, 695}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5030, 2785, 2786, 2784, 890: 6264}, - {696, 696}, - {697, 697}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5434, 2785, 2786, 2784, 813: 6267}, + {703, 703}, + {687, 687, 512: 687, 6336, 521: 687, 1333: 6335}, + {699, 699, 9: 6333, 512: 699, 699, 521: 699}, + {698, 698, 9: 698, 512: 698, 698, 521: 698}, + {696, 696, 9: 696, 512: 696, 696, 521: 696}, // 3710 - {698, 698}, - {699, 699}, - {700, 700}, - {701, 701}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 3375, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3374, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 6274, 3279, 3360, 3278, 3275}, + {695, 695, 9: 695, 512: 695, 695, 521: 695}, + {366: 6332}, + {408: 6331}, + {357: 6330}, + {691, 691, 9: 691, 512: 691, 691, 521: 691}, // 3715 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 2864, 2812, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 2893, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 2898, 2825, 2789, 2807, 2972, 3055, 3044, 2842, 2854, 2965, 2966, 2961, 2919, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 2900, 2885, 2881, 2973, 2997, 2783, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 2904, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 2823, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 2889, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 2890, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 2960, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 2848, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 2774, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 2906, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 2775, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3170, 2902, 3171, 3172, 2801, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3185, 3186, 3237, 3236, 3081, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 2942, 2959, 3082, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3203, 3204, 3205, 2955, 3156, 3215, 3216, 3227, 3211, 3212, 3213, 3246, 2901, 476: 3286, 478: 3265, 3284, 2778, 482: 3294, 485: 3298, 3302, 488: 3283, 3282, 3321, 495: 3256, 498: 3295, 507: 3301, 3319, 511: 3260, 533: 3290, 567: 3297, 570: 3320, 2776, 573: 3303, 3255, 3257, 3259, 3258, 3287, 3263, 3277, 3268, 3289, 3264, 585: 3296, 3288, 3293, 3299, 3309, 3362, 3310, 3311, 595: 3262, 3340, 598: 3280, 3281, 3335, 3336, 3337, 3338, 3339, 3291, 3317, 3322, 3332, 3333, 3326, 3341, 3342, 3343, 3327, 3345, 3346, 3328, 3344, 3323, 3331, 3329, 3315, 3347, 3348, 3292, 3352, 3304, 3305, 3308, 3351, 3357, 3356, 3358, 3355, 3359, 3354, 3353, 3350, 3300, 3349, 3307, 3306, 3312, 3313, 651: 2779, 664: 3270, 2785, 2786, 2784, 713: 3285, 3361, 3271, 3276, 3261, 3334, 3274, 3272, 3273, 3314, 3325, 3324, 3318, 3316, 3330, 3269, 3279, 3360, 3278, 3275, 2782, 2781, 2780, 6273}, - {611, 611, 510: 3371, 512: 3369, 3370, 3368, 3366, 738: 3367, 3365}, - {612, 612, 487: 3376, 597: 3377}, - {1972, 1972, 183: 6277, 572: 1972, 1271: 6276}, - {577, 577, 572: 6279, 974: 6278}, + {690, 690, 9: 690, 512: 690, 690, 521: 690}, + {689, 689, 9: 689, 512: 689, 689, 521: 689}, + {688, 688, 9: 688, 512: 688, 688, 521: 688}, + {692, 692, 9: 692, 512: 692, 692, 521: 692}, + {693, 693, 9: 693, 512: 693, 693, 521: 693}, // 3720 - {1971, 1971, 572: 1971}, - {1977, 1977}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 3948, 786: 6280}, - {576, 576, 9: 3950}, - {2: 1974, 1974, 1974, 1974, 1974, 1974, 1974, 10: 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 51: 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 567: 6283, 1235: 6282}, + {694, 694, 9: 694, 512: 694, 694, 521: 694}, + {197: 6322, 242: 6323, 253: 6324, 256: 6321, 278: 6326, 288: 6325, 302: 6328, 305: 6327, 671: 6329, 1163: 6334}, + {697, 697, 9: 697, 512: 697, 697, 521: 697}, + {906, 906, 512: 2815, 521: 2816, 791: 2817, 852: 6339}, + {151: 6337}, // 3725 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6286, 2785, 2786, 2784}, - {479: 4115, 4114, 815: 6284}, - {196: 6285}, - {2: 1973, 1973, 1973, 1973, 1973, 1973, 1973, 10: 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 51: 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973}, - {1980, 1980}, + {525: 2823, 755: 4161, 784: 6338}, + {686, 686, 512: 686, 521: 686}, + {707, 707}, + {709, 709}, + {623, 623, 519: 623, 6276, 537: 623, 564: 6277, 827: 6279, 864: 6345}, // 3730 - {2: 1976, 1976, 1976, 1976, 1976, 1976, 1976, 10: 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 51: 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 567: 6289, 1236: 6288}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6291, 2785, 2786, 2784}, - {196: 6290}, - {2: 1975, 1975, 1975, 1975, 1975, 1975, 1975, 10: 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 51: 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975}, - {1981, 1981}, + {520: 6276, 564: 6277, 827: 6298, 1165: 6343}, + {623, 623, 519: 623, 6276, 537: 623, 564: 6277, 827: 6279, 864: 6344}, + {669, 669, 519: 669, 537: 669}, + {674, 674, 519: 674, 537: 674}, + {710, 710}, // 3735 - {511: 2759, 737: 6293}, - {1983, 1983}, - {503: 6303}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 523: 6298, 664: 5434, 2785, 2786, 2784, 813: 6300, 1212: 6299}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 3948, 786: 6297}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 6348}, + {685, 685, 501: 6350, 1367: 6349}, + {711, 711}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 5875, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 5880, 685: 3597, 2849, 688: 2850, 2848, 760: 5393, 823: 5882, 843: 5883, 5881, 884: 6351}, + {684, 684, 9: 5884}, // 3740 - {9: 3950, 503: 2030, 653: 2030}, - {503: 2032, 653: 2032}, - {9: 6301, 503: 2031, 653: 2031}, - {9: 2029, 503: 2029, 653: 2029}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5434, 2785, 2786, 2784, 813: 6302}, + {623, 623, 91: 1791, 175: 1791, 507: 1791, 519: 623, 6276, 537: 623, 564: 6277, 668: 1791, 672: 1791, 827: 6279, 864: 6362}, + {91: 959, 175: 6355, 507: 5609, 668: 959, 882: 6354}, + {91: 6356, 668: 6357}, + {714, 714}, + {273, 273, 519: 2809, 814: 2810, 6361}, // 3745 - {9: 2028, 503: 2028, 653: 2028}, - {478: 6304}, - {2027, 2027, 17: 2027, 51: 2027, 53: 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 475: 2027, 656: 2027, 902: 6305}, - {2033, 2033, 17: 6332, 51: 6308, 53: 6328, 6321, 6311, 6307, 6315, 6319, 6331, 6314, 6320, 6318, 6316, 6329, 6322, 6310, 6330, 6309, 6312, 6313, 6317, 475: 6323, 656: 6333, 898: 6325, 6324, 6327, 6306, 903: 6326}, - {2026, 2026, 17: 2026, 51: 2026, 53: 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 475: 2026, 656: 2026}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6358, 2849, 688: 2850, 2848}, + {91: 6359}, + {273, 273, 519: 2809, 814: 2810, 6360}, + {713, 713}, + {715, 715}, // 3750 - {502: 2025, 511: 2025}, - {502: 2024, 511: 2024}, - {502: 2023, 511: 2023, 574: 2023, 2023}, - {502: 2022, 511: 2022, 574: 2022, 2022}, - {502: 2021, 511: 2021, 574: 2021, 2021}, + {672, 672, 519: 672, 537: 672}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 6382}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 6381}, + {2: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 10: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 59: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 583: 4974, 805: 6379}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 6378}, // 3755 - {502: 2020, 511: 2020, 574: 2020, 2020}, - {502: 2019, 511: 2019, 574: 2019, 2019}, - {502: 2018, 511: 2018, 574: 2018, 2018}, - {502: 2017, 511: 2017, 574: 2017, 2017}, - {502: 2016, 511: 2016, 574: 2016, 2016}, + {177: 6376}, + {532: 6373}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 6372}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6371, 2849, 688: 2850, 2848}, + {716, 716}, // 3760 - {478: 2015, 502: 2015}, - {478: 2014, 502: 2014}, - {478: 2013, 502: 2013}, - {478: 2012, 502: 2012}, - {2: 2011, 2011, 2011, 2011, 2011, 2011, 2011, 10: 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 51: 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 478: 2011, 492: 2011, 502: 2011, 507: 2011}, + {717, 717}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6374, 2849, 688: 2850, 2848, 911: 6375}, + {2252, 2252, 134: 2252, 2252}, + {718, 718}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5134, 2849, 688: 2850, 2848, 909: 6377}, // 3765 - {2: 2010, 2010, 2010, 2010, 2010, 2010, 2010, 10: 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 51: 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 478: 2010, 492: 2010, 502: 2010, 507: 2010}, - {208: 6373}, - {502: 4307, 511: 2064, 741: 6371}, - {502: 4307, 511: 2064, 574: 2064, 2064, 741: 6369}, - {478: 2064, 502: 4307, 741: 6367}, + {719, 719}, + {720, 720}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5540, 2849, 688: 2850, 2848, 832: 6380}, + {721, 721}, + {722, 722}, // 3770 - {2: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 10: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 51: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 478: 2064, 492: 2064, 502: 4307, 507: 2064, 741: 6362}, - {478: 2064, 502: 4307, 511: 2064, 741: 6357}, - {478: 2064, 502: 4307, 511: 2064, 741: 6354}, - {502: 4307, 511: 2064, 741: 6349}, - {103: 2064, 112: 2064, 502: 4307, 511: 2064, 741: 6346}, + {723, 723}, + {724, 724}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 3455, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3454, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 6387, 3359, 3440, 3358, 3355}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 2928, 2876, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 2958, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 2889, 2963, 3037, 3121, 2853, 2871, 2918, 3030, 3031, 3026, 2984, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 2965, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 2847, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 2969, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 2887, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 2954, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 2955, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3025, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 2912, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 2838, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 2971, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 2839, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3243, 2967, 3244, 3245, 2865, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3259, 3260, 3331, 3332, 3311, 3310, 3147, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3007, 3024, 3148, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3277, 3278, 3279, 3020, 3229, 3289, 3290, 3301, 3285, 3286, 3287, 3320, 2966, 492: 3366, 494: 3345, 3364, 3374, 2842, 502: 3378, 3382, 3363, 3362, 3401, 510: 3336, 514: 3399, 3375, 522: 3381, 525: 3340, 549: 3370, 583: 3377, 587: 3400, 589: 2840, 3383, 3335, 3337, 3339, 3338, 3367, 3343, 3357, 3344, 3348, 601: 3369, 3376, 3368, 3373, 3397, 3379, 608: 3384, 3389, 3442, 3390, 3391, 614: 3342, 3420, 617: 3360, 3361, 3415, 3416, 3417, 3418, 3419, 3371, 3402, 3412, 3413, 3406, 3421, 3422, 3423, 3407, 3425, 3426, 3408, 3424, 3403, 3411, 3409, 3395, 3427, 3428, 3372, 3432, 3385, 3388, 3431, 3437, 3436, 3438, 3435, 3439, 3434, 3433, 3430, 3380, 3429, 3387, 3386, 3392, 3393, 669: 2843, 685: 3350, 2849, 688: 2850, 2848, 731: 3365, 3441, 3351, 3356, 3341, 3414, 3354, 3352, 3353, 3394, 3405, 3404, 3398, 3396, 3410, 3349, 3359, 3440, 3358, 3355, 2846, 2845, 2844, 6386}, + {633, 633, 527: 3451, 3449, 3450, 3448, 3446, 756: 3447, 3445}, // 3775 - {189: 2064, 2064, 194: 2064, 502: 4307, 511: 2064, 574: 2064, 2064, 741: 6343}, - {189: 2064, 2064, 194: 2064, 502: 4307, 511: 2064, 574: 2064, 2064, 741: 6334}, - {189: 6340, 6341, 194: 6342, 511: 2759, 574: 6338, 6339, 737: 6337, 932: 6335, 1101: 6336}, - {1994, 1994, 17: 1994, 51: 1994, 53: 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 475: 1994, 656: 1994}, - {1993, 1993, 17: 1993, 51: 1993, 53: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 475: 1993, 656: 1993}, + {634, 634, 499: 3456, 616: 3457}, + {2014, 2014, 192: 6390, 588: 2014, 1296: 6389}, + {599, 599, 588: 6392, 994: 6391}, + {2013, 2013, 588: 2013}, + {2019, 2019}, // 3780 - {1989, 1989, 17: 1989, 51: 1989, 53: 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 475: 1989, 656: 1989}, - {1988, 1988, 17: 1988, 51: 1988, 53: 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 475: 1988, 656: 1988}, - {1987, 1987, 17: 1987, 51: 1987, 53: 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 475: 1987, 656: 1987}, - {1986, 1986, 17: 1986, 51: 1986, 53: 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 475: 1986, 656: 1986}, - {1985, 1985, 17: 1985, 51: 1985, 53: 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 475: 1985, 656: 1985}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4030, 804: 6393}, + {598, 598, 9: 4032}, + {2: 2016, 2016, 2016, 2016, 2016, 2016, 2016, 10: 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 59: 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 583: 6396, 1260: 6395}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6399, 2849, 688: 2850, 2848}, + {495: 4197, 497: 4196, 834: 6397}, // 3785 - {1984, 1984, 17: 1984, 51: 1984, 53: 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 475: 1984, 656: 1984}, - {189: 6340, 6341, 194: 6342, 511: 2759, 574: 6338, 6339, 737: 6337, 932: 6344, 1101: 6345}, - {1996, 1996, 17: 1996, 51: 1996, 53: 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 475: 1996, 656: 1996}, - {1995, 1995, 17: 1995, 51: 1995, 53: 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 475: 1995, 656: 1995}, - {103: 3970, 112: 3969, 511: 2759, 737: 2758, 745: 6348, 839: 6347}, + {206: 6398}, + {2: 2015, 2015, 2015, 2015, 2015, 2015, 2015, 10: 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 59: 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015}, + {2022, 2022}, + {2: 2018, 2018, 2018, 2018, 2018, 2018, 2018, 10: 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 59: 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 583: 6402, 1261: 6401}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6404, 2849, 688: 2850, 2848}, // 3790 - {1998, 1998, 17: 1998, 51: 1998, 53: 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 475: 1998, 656: 1998}, - {1997, 1997, 17: 1997, 51: 1997, 53: 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 475: 1997, 656: 1997}, - {511: 2759, 737: 2758, 745: 6350}, - {214: 6351}, - {550: 6352}, + {206: 6403}, + {2: 2017, 2017, 2017, 2017, 2017, 2017, 2017, 10: 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 59: 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017}, + {2023, 2023}, + {525: 2823, 755: 6406}, + {2025, 2025}, // 3795 - {109: 6353}, - {1999, 1999, 17: 1999, 51: 1999, 53: 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 475: 1999, 656: 1999}, - {478: 6355, 511: 2759, 737: 2758, 745: 6356}, - {2001, 2001, 17: 2001, 51: 2001, 53: 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 475: 2001, 656: 2001}, - {2000, 2000, 17: 2000, 51: 2000, 53: 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 475: 2000, 656: 2000}, + {520: 6416}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 541: 6411, 685: 5540, 2849, 688: 2850, 2848, 832: 6413, 1237: 6412}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4030, 804: 6410}, + {9: 4032, 520: 2072, 670: 2072}, + {520: 2074, 670: 2074}, // 3800 - {478: 6359, 511: 2759, 737: 2758, 745: 6358}, - {2002, 2002, 17: 2002, 51: 2002, 53: 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 105: 3490, 3486, 109: 3483, 3498, 113: 3485, 3482, 3484, 3488, 3489, 3494, 3493, 3492, 3496, 3497, 3491, 3495, 3487, 475: 2002, 656: 2002, 800: 6360}, - {2003, 2003, 17: 2003, 51: 2003, 53: 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 475: 2003, 656: 2003}, - {313: 6361}, - {2004, 2004, 17: 2004, 51: 2004, 53: 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 475: 2004, 656: 2004}, + {9: 6414, 520: 2073, 670: 2073}, + {9: 2071, 520: 2071, 670: 2071}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5540, 2849, 688: 2850, 2848, 832: 6415}, + {9: 2070, 520: 2070, 670: 2070}, + {494: 6417}, // 3805 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 492: 6365, 507: 6366, 664: 3517, 2785, 2786, 2784, 742: 6364, 1323: 6363}, - {2005, 2005, 17: 2005, 51: 2005, 53: 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 475: 2005, 656: 2005}, - {266, 266, 17: 266, 51: 266, 53: 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 475: 266, 656: 266}, - {265, 265, 17: 265, 51: 265, 53: 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 475: 265, 656: 265}, - {264, 264, 17: 264, 51: 264, 53: 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 475: 264, 656: 264}, + {2069, 2069, 17: 2069, 56: 2069, 59: 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 491: 2069, 673: 2069, 922: 6418}, + {2075, 2075, 17: 6445, 56: 6421, 59: 6441, 6434, 6424, 6420, 6428, 6432, 6444, 6427, 6433, 6431, 6429, 6442, 6435, 6423, 6443, 6422, 6425, 6426, 6430, 491: 6436, 673: 6446, 918: 6438, 6437, 6440, 6419, 923: 6439}, + {2068, 2068, 17: 2068, 56: 2068, 59: 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 491: 2068, 673: 2068}, + {518: 2067, 525: 2067}, + {518: 2066, 525: 2066}, // 3810 - {478: 6368}, - {2006, 2006, 17: 2006, 51: 2006, 53: 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 475: 2006, 656: 2006}, - {511: 2759, 574: 6338, 6339, 737: 6337, 932: 6370}, - {2007, 2007, 17: 2007, 51: 2007, 53: 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 475: 2007, 656: 2007}, - {511: 2759, 737: 2758, 745: 6372}, + {518: 2065, 525: 2065, 591: 2065, 2065}, + {518: 2064, 525: 2064, 591: 2064, 2064}, + {518: 2063, 525: 2063, 591: 2063, 2063}, + {518: 2062, 525: 2062, 591: 2062, 2062}, + {518: 2061, 525: 2061, 591: 2061, 2061}, // 3815 - {2008, 2008, 17: 2008, 51: 2008, 53: 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 475: 2008, 656: 2008}, - {2: 2009, 2009, 2009, 2009, 2009, 2009, 2009, 10: 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 51: 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 478: 2009, 492: 2009, 502: 2009, 507: 2009}, - {653: 6375}, - {478: 6376}, - {2027, 2027, 17: 2027, 51: 2027, 53: 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 475: 2027, 656: 2027, 902: 6377}, + {518: 2060, 525: 2060, 591: 2060, 2060}, + {518: 2059, 525: 2059, 591: 2059, 2059}, + {518: 2058, 525: 2058, 591: 2058, 2058}, + {494: 2057, 518: 2057}, + {494: 2056, 518: 2056}, // 3820 - {2034, 2034, 17: 6332, 51: 6308, 53: 6328, 6321, 6311, 6307, 6315, 6319, 6331, 6314, 6320, 6318, 6316, 6329, 6322, 6310, 6330, 6309, 6312, 6313, 6317, 475: 6323, 656: 6333, 898: 6325, 6324, 6327, 6306, 903: 6326}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6379, 2785, 2786, 2784}, - {2035, 2035}, - {2036, 2036}, - {2054, 2054, 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 6413}, + {494: 2055, 518: 2055}, + {494: 2054, 518: 2054}, + {2: 2053, 2053, 2053, 2053, 2053, 2053, 2053, 10: 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 59: 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 494: 2053, 508: 2053, 518: 2053, 522: 2053}, + {2: 2052, 2052, 2052, 2052, 2052, 2052, 2052, 10: 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 59: 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 494: 2052, 508: 2052, 518: 2052, 522: 2052}, + {219: 6486}, // 3825 - {2052, 2052}, - {28: 6411}, - {1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 10: 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 51: 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 502: 6400, 655: 1784}, - {259: 6387, 476: 2608, 2607, 498: 2606, 507: 2592, 570: 2591, 572: 2605, 649: 2601, 657: 2713, 668: 2730, 713: 2731, 743: 2573, 752: 2732, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 2576, 2738, 2737, 770: 2712, 2574, 777: 2735, 2734, 780: 2736, 783: 2575, 788: 2733, 810: 2739, 829: 6386}, - {2046, 2046}, + {518: 4396, 525: 2107, 758: 6484}, + {518: 4396, 525: 2107, 591: 2107, 2107, 758: 6482}, + {494: 2107, 518: 4396, 758: 6480}, + {2: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 10: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 59: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 494: 2107, 508: 2107, 518: 4396, 522: 2107, 758: 6475}, + {494: 2107, 518: 4396, 525: 2107, 758: 6470}, // 3830 - {502: 6388}, - {173: 6392, 234: 6395, 252: 6394, 306: 6391, 6397, 6396, 478: 6390, 578: 6393, 1048: 6389}, - {476: 2608, 2607, 498: 2606, 507: 2592, 570: 2591, 572: 2605, 649: 2601, 657: 2713, 668: 2730, 713: 2731, 743: 2573, 752: 2732, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 2576, 2738, 2737, 770: 2712, 2574, 777: 2735, 2734, 780: 2736, 783: 2575, 788: 2733, 810: 2739, 829: 6399}, - {476: 2608, 2607, 498: 2606, 507: 2592, 570: 2591, 572: 2605, 649: 2601, 657: 2713, 668: 2730, 713: 2731, 743: 2573, 752: 2732, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 2576, 2738, 2737, 770: 2712, 2574, 777: 2735, 2734, 780: 2736, 783: 2575, 788: 2733, 810: 2739, 829: 6398}, - {476: 2043, 2043, 497: 2043, 2043, 507: 2043, 570: 2043, 572: 2043, 649: 2043, 657: 2043, 668: 2043, 743: 2043}, + {494: 2107, 518: 4396, 525: 2107, 758: 6467}, + {518: 4396, 525: 2107, 758: 6462}, + {110: 2107, 132: 2107, 518: 4396, 525: 2107, 758: 6459}, + {198: 2107, 2107, 204: 2107, 518: 4396, 525: 2107, 591: 2107, 2107, 758: 6456}, + {198: 2107, 2107, 204: 2107, 518: 4396, 525: 2107, 591: 2107, 2107, 758: 6447}, // 3835 - {476: 2042, 2042, 497: 2042, 2042, 507: 2042, 570: 2042, 572: 2042, 649: 2042, 657: 2042, 668: 2042, 743: 2042}, - {476: 2041, 2041, 497: 2041, 2041, 507: 2041, 570: 2041, 572: 2041, 649: 2041, 657: 2041, 668: 2041, 743: 2041}, - {476: 2040, 2040, 497: 2040, 2040, 507: 2040, 570: 2040, 572: 2040, 649: 2040, 657: 2040, 668: 2040, 743: 2040}, - {476: 2039, 2039, 497: 2039, 2039, 507: 2039, 570: 2039, 572: 2039, 649: 2039, 657: 2039, 668: 2039, 743: 2039}, - {476: 2038, 2038, 497: 2038, 2038, 507: 2038, 570: 2038, 572: 2038, 649: 2038, 657: 2038, 668: 2038, 743: 2038}, + {198: 6453, 6454, 204: 6455, 525: 2823, 591: 6451, 6452, 755: 6450, 952: 6448, 1124: 6449}, + {2036, 2036, 17: 2036, 56: 2036, 59: 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 491: 2036, 673: 2036}, + {2035, 2035, 17: 2035, 56: 2035, 59: 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 491: 2035, 673: 2035}, + {2031, 2031, 17: 2031, 56: 2031, 59: 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 491: 2031, 673: 2031}, + {2030, 2030, 17: 2030, 56: 2030, 59: 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 491: 2030, 673: 2030}, // 3840 - {476: 2037, 2037, 497: 2037, 2037, 507: 2037, 570: 2037, 572: 2037, 649: 2037, 657: 2037, 668: 2037, 743: 2037}, - {2044, 2044}, - {2045, 2045}, - {173: 6392, 234: 6395, 252: 6394, 306: 6391, 6397, 6396, 478: 6401, 578: 6393, 1048: 6402}, - {476: 2608, 2607, 497: 6407, 2606, 507: 2592, 570: 2591, 572: 2605, 649: 2601, 657: 2713, 668: 2730, 713: 2731, 743: 2573, 752: 2732, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 2576, 2738, 2737, 770: 2712, 2574, 777: 2735, 2734, 780: 2736, 783: 2575, 788: 2733, 810: 2739, 829: 6408}, + {2029, 2029, 17: 2029, 56: 2029, 59: 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 491: 2029, 673: 2029}, + {2028, 2028, 17: 2028, 56: 2028, 59: 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 491: 2028, 673: 2028}, + {2027, 2027, 17: 2027, 56: 2027, 59: 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 491: 2027, 673: 2027}, + {2026, 2026, 17: 2026, 56: 2026, 59: 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 491: 2026, 673: 2026}, + {198: 6453, 6454, 204: 6455, 525: 2823, 591: 6451, 6452, 755: 6450, 952: 6457, 1124: 6458}, // 3845 - {476: 2608, 2607, 497: 6403, 2606, 507: 2592, 570: 2591, 572: 2605, 649: 2601, 657: 2713, 668: 2730, 713: 2731, 743: 2573, 752: 2732, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 2576, 2738, 2737, 770: 2712, 2574, 777: 2735, 2734, 780: 2736, 783: 2575, 788: 2733, 810: 2739, 829: 6404}, - {28: 6405}, - {2047, 2047}, - {511: 2759, 737: 6406}, - {2048, 2048}, + {2038, 2038, 17: 2038, 56: 2038, 59: 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 491: 2038, 673: 2038}, + {2037, 2037, 17: 2037, 56: 2037, 59: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 491: 2037, 673: 2037}, + {110: 4052, 132: 4051, 525: 2823, 755: 2822, 762: 6461, 857: 6460}, + {2040, 2040, 17: 2040, 56: 2040, 59: 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 491: 2040, 673: 2040}, + {2039, 2039, 17: 2039, 56: 2039, 59: 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 491: 2039, 673: 2039}, // 3850 - {28: 6409}, - {2049, 2049}, - {511: 2759, 737: 6410}, - {2050, 2050}, - {511: 2759, 737: 6412}, + {525: 2823, 755: 2822, 762: 6463}, + {226: 6464}, + {566: 6465}, + {114: 6466}, + {2041, 2041, 17: 2041, 56: 2041, 59: 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 491: 2041, 673: 2041}, // 3855 - {2051, 2051}, - {2053, 2053}, - {2061, 2061}, - {502: 6440}, - {74: 2567, 150: 2569, 157: 2597, 2582, 161: 2566, 399: 6436, 476: 2608, 2607, 498: 2606, 507: 2592, 509: 6419, 570: 2591, 572: 2605, 649: 2601, 656: 2565, 2713, 713: 6417, 743: 2573, 752: 6418, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 2576, 6425, 6424, 770: 2712, 2574, 777: 6422, 6421, 780: 6423, 783: 2575, 788: 6420, 804: 2583, 814: 6434, 849: 6433, 6427, 854: 6428, 863: 6426, 865: 6430, 867: 6431, 6429, 6432, 925: 6435}, + {494: 6468, 525: 2823, 755: 2822, 762: 6469}, + {2043, 2043, 17: 2043, 56: 2043, 59: 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 491: 2043, 673: 2043}, + {2042, 2042, 17: 2042, 56: 2042, 59: 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 491: 2042, 673: 2042}, + {494: 6472, 525: 2823, 755: 2822, 762: 6471}, + {2044, 2044, 17: 2044, 56: 2044, 59: 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 112: 3566, 3570, 3563, 3578, 118: 3565, 3562, 3564, 3568, 3569, 3574, 3573, 3572, 3576, 3577, 3571, 3575, 131: 3567, 491: 2044, 673: 2044, 813: 6473}, // 3860 - {473, 473, 483: 828, 493: 828, 828, 496: 2751, 504: 2752, 2748, 772: 3917, 3918}, - {475, 475, 483: 829, 493: 829, 829}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 5738, 5733, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 5736, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 5735, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 5740, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 5734, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 5743, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 5741, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 5737, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 508: 3863, 571: 5749, 590: 5748, 650: 3861, 664: 5746, 2785, 2786, 2784, 779: 5750, 835: 5747, 983: 5751, 1167: 5744}, - {480, 480}, - {479, 479}, + {2045, 2045, 17: 2045, 56: 2045, 59: 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 491: 2045, 673: 2045}, + {325: 6474}, + {2046, 2046, 17: 2046, 56: 2046, 59: 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 491: 2046, 673: 2046}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 508: 6478, 522: 6479, 685: 3597, 2849, 688: 2850, 2848, 760: 6477, 1348: 6476}, + {2047, 2047, 17: 2047, 56: 2047, 59: 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 491: 2047, 673: 2047}, // 3865 - {478, 478}, - {477, 477}, - {476, 476}, - {474, 474}, - {472, 472}, + {282, 282, 17: 282, 56: 282, 59: 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 491: 282, 673: 282}, + {281, 281, 17: 281, 56: 281, 59: 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 491: 281, 673: 281}, + {280, 280, 17: 280, 56: 280, 59: 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 491: 280, 673: 280}, + {494: 6481}, + {2048, 2048, 17: 2048, 56: 2048, 59: 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 491: 2048, 673: 2048}, // 3870 - {471, 471}, - {470, 470}, - {469, 469}, - {468, 468}, - {467, 467}, + {525: 2823, 591: 6451, 6452, 755: 6450, 952: 6483}, + {2049, 2049, 17: 2049, 56: 2049, 59: 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 491: 2049, 673: 2049}, + {525: 2823, 755: 2822, 762: 6485}, + {2050, 2050, 17: 2050, 56: 2050, 59: 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 491: 2050, 673: 2050}, + {2: 2051, 2051, 2051, 2051, 2051, 2051, 2051, 10: 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 59: 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 494: 2051, 508: 2051, 518: 2051, 522: 2051}, // 3875 - {466, 466}, - {465, 465}, - {23: 5236}, - {2059, 2059}, - {502: 6437}, + {670: 6488}, + {494: 6489}, + {2069, 2069, 17: 2069, 56: 2069, 59: 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 491: 2069, 673: 2069, 922: 6490}, + {2076, 2076, 17: 6445, 56: 6421, 59: 6441, 6434, 6424, 6420, 6428, 6432, 6444, 6427, 6433, 6431, 6429, 6442, 6435, 6423, 6443, 6422, 6425, 6426, 6430, 491: 6436, 673: 6446, 918: 6438, 6437, 6440, 6419, 923: 6439}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6492, 2849, 688: 2850, 2848}, // 3880 - {478: 6438}, - {74: 2567, 150: 2569, 157: 2597, 2582, 161: 2566, 476: 2608, 2607, 498: 2606, 507: 2592, 509: 6419, 570: 2591, 572: 2605, 649: 2601, 656: 2565, 2713, 713: 6417, 743: 2573, 752: 6418, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 2576, 6425, 6424, 770: 2712, 2574, 777: 6422, 6421, 780: 6423, 783: 2575, 788: 6420, 804: 2583, 814: 6434, 849: 6433, 6427, 854: 6428, 863: 6426, 865: 6430, 867: 6431, 6429, 6432, 925: 6439}, - {2058, 2058}, - {478: 6441}, - {74: 2567, 150: 2569, 157: 2597, 2582, 161: 2566, 476: 2608, 2607, 498: 2606, 507: 2592, 509: 6419, 570: 2591, 572: 2605, 649: 2601, 656: 2565, 2713, 713: 6417, 743: 2573, 752: 6418, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 2576, 6425, 6424, 770: 2712, 2574, 777: 6422, 6421, 780: 6423, 783: 2575, 788: 6420, 804: 2583, 814: 6434, 849: 6433, 6427, 854: 6428, 863: 6426, 865: 6430, 867: 6431, 6429, 6432, 925: 6442}, + {2077, 2077}, + {2078, 2078}, + {2097, 2097, 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 6527}, + {2095, 2095}, + {28: 6525}, // 3885 - {2060, 2060}, - {2: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 10: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 51: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 492: 1071, 503: 1071, 757: 5441, 5440, 5439, 842: 5442, 891: 6444}, - {2: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 10: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 51: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 5813, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 492: 1059, 503: 1059, 1117: 6445}, - {2: 1873, 1873, 1873, 1873, 1873, 1873, 1873, 10: 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 51: 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 492: 4217, 503: 1873, 859: 6446}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 503: 6447, 664: 5817, 2785, 2786, 2784, 922: 5818, 972: 5816}, + {1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 10: 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 59: 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 518: 6514, 672: 1825}, + {270: 6500, 492: 2663, 2662, 515: 2661, 522: 2647, 587: 2646, 2660, 665: 2656, 674: 2771, 682: 2794, 731: 2795, 761: 2628, 770: 2796, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 2631, 2802, 2801, 788: 2770, 2629, 795: 2799, 2800, 2798, 802: 2630, 807: 2797, 829: 2803, 847: 6499}, + {2089, 2089}, + {518: 6501}, + {182: 6505, 244: 6508, 263: 6507, 306: 6511, 318: 6504, 6510, 6509, 494: 6503, 595: 6506, 1071: 6502}, // 3890 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6449, 2785, 2786, 2784, 740: 5830, 922: 5818, 972: 6448}, - {9: 5826, 484: 6452}, - {1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1061, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 51: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 481: 1069, 484: 1061, 491: 1069, 1069, 496: 1069, 501: 1069, 505: 1069, 1069, 528: 1069, 655: 6450, 912: 5819}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 523: 5822, 664: 6451, 2785, 2786, 2784}, - {1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1061, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 51: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 481: 1068, 484: 1061, 491: 1068, 1068, 496: 1068, 501: 1068, 505: 1068, 1068, 528: 1068, 655: 5824, 912: 5823}, + {492: 2663, 2662, 515: 2661, 522: 2647, 587: 2646, 2660, 665: 2656, 674: 2771, 682: 2794, 731: 2795, 761: 2628, 770: 2796, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 2631, 2802, 2801, 788: 2770, 2629, 795: 2799, 2800, 2798, 802: 2630, 807: 2797, 829: 2803, 847: 6513}, + {492: 2663, 2662, 515: 2661, 522: 2647, 587: 2646, 2660, 665: 2656, 674: 2771, 682: 2794, 731: 2795, 761: 2628, 770: 2796, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 2631, 2802, 2801, 788: 2770, 2629, 795: 2799, 2800, 2798, 802: 2630, 807: 2797, 829: 2803, 847: 6512}, + {492: 2086, 2086, 513: 2086, 515: 2086, 522: 2086, 587: 2086, 2086, 665: 2086, 674: 2086, 682: 2086, 761: 2086}, + {492: 2085, 2085, 513: 2085, 515: 2085, 522: 2085, 587: 2085, 2085, 665: 2085, 674: 2085, 682: 2085, 761: 2085}, + {492: 2084, 2084, 513: 2084, 515: 2084, 522: 2084, 587: 2084, 2084, 665: 2084, 674: 2084, 682: 2084, 761: 2084}, // 3895 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 5453, 582: 5448, 664: 3947, 2785, 2786, 2784, 713: 5452, 740: 5451, 802: 5450, 806: 5449, 5455, 856: 5445, 894: 6453}, - {257, 257, 9: 5499, 501: 2745, 795: 2746, 6454}, - {2090, 2090}, - {2093, 2093, 9: 3616}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6515, 2785, 2786, 2784}, + {492: 2083, 2083, 513: 2083, 515: 2083, 522: 2083, 587: 2083, 2083, 665: 2083, 674: 2083, 682: 2083, 761: 2083}, + {492: 2082, 2082, 513: 2082, 515: 2082, 522: 2082, 587: 2082, 2082, 665: 2082, 674: 2082, 682: 2082, 761: 2082}, + {492: 2081, 2081, 513: 2081, 515: 2081, 522: 2081, 587: 2081, 2081, 665: 2081, 674: 2081, 682: 2081, 761: 2081}, + {492: 2080, 2080, 513: 2080, 515: 2080, 522: 2080, 587: 2080, 2080, 665: 2080, 674: 2080, 682: 2080, 761: 2080}, + {492: 2079, 2079, 513: 2079, 515: 2079, 522: 2079, 587: 2079, 2079, 665: 2079, 674: 2079, 682: 2079, 761: 2079}, // 3900 - {2: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 10: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 51: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 567: 4478, 784: 6513}, - {2: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 10: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 51: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 567: 4478, 784: 6504}, - {126: 5577, 572: 5576, 1156: 6500}, - {162: 609, 169: 5631}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 567: 6495, 664: 3947, 2785, 2786, 2784, 740: 3948, 786: 6494}, + {2087, 2087}, + {2088, 2088}, + {182: 6505, 244: 6508, 263: 6507, 306: 6511, 318: 6504, 6510, 6509, 494: 6515, 595: 6506, 1071: 6516}, + {492: 2663, 2662, 513: 6521, 515: 2661, 522: 2647, 587: 2646, 2660, 665: 2656, 674: 2771, 682: 2794, 731: 2795, 761: 2628, 770: 2796, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 2631, 2802, 2801, 788: 2770, 2629, 795: 2799, 2800, 2798, 802: 2630, 807: 2797, 829: 2803, 847: 6522}, + {492: 2663, 2662, 513: 6517, 515: 2661, 522: 2647, 587: 2646, 2660, 665: 2656, 674: 2771, 682: 2794, 731: 2795, 761: 2628, 770: 2796, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 2631, 2802, 2801, 788: 2770, 2629, 795: 2799, 2800, 2798, 802: 2630, 807: 2797, 829: 2803, 847: 6518}, // 3905 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 567: 6491, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 5334, 872: 6490}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 5769, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 5774, 567: 6487, 664: 3517, 2785, 2786, 2784, 742: 5287, 805: 5776, 825: 5777, 5775, 866: 6486}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6482, 786: 6481}, - {2: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 10: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 51: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 567: 4478, 784: 6479}, - {162: 6474}, + {28: 6519}, + {2090, 2090}, + {525: 2823, 755: 6520}, + {2091, 2091}, + {28: 6523}, // 3910 - {167: 6471}, - {2: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 10: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 51: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 567: 4478, 784: 6469}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 3948, 786: 6470}, - {28, 28, 9: 3950}, - {2: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 10: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 51: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 567: 4478, 784: 6472}, + {2092, 2092}, + {525: 2823, 755: 6524}, + {2093, 2093}, + {525: 2823, 755: 6526}, + {2094, 2094}, // 3915 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5030, 2785, 2786, 2784, 890: 6473}, - {55, 55}, - {497: 6475}, - {476: 2608, 2607, 498: 2606, 507: 2592, 570: 2591, 572: 2605, 649: 2601, 657: 2713, 713: 5799, 743: 5797, 752: 5800, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 5798, 5802, 5801, 770: 2712, 5804, 777: 5805, 5803, 780: 5806, 851: 6476}, - {185, 185, 484: 6477}, + {2096, 2096}, + {2104, 2104}, + {518: 6554}, + {80: 2622, 159: 2624, 166: 2652, 2637, 171: 2621, 411: 6550, 492: 2663, 2662, 515: 2661, 522: 2647, 526: 6533, 587: 2646, 2660, 665: 2656, 673: 2620, 2771, 731: 6531, 761: 2628, 770: 6532, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 2631, 6539, 6538, 788: 2770, 2629, 795: 6536, 6537, 6535, 802: 2630, 807: 6534, 822: 2638, 833: 6548, 867: 6547, 6541, 872: 6542, 881: 6540, 883: 6544, 885: 6545, 6543, 6546, 945: 6549}, + {492, 492, 500: 851, 509: 851, 511: 851, 2815, 521: 2816, 523: 2812, 790: 3999, 4000}, // 3920 - {476: 2608, 2607, 498: 2606, 507: 2592, 570: 2591, 572: 2605, 649: 2601, 657: 2713, 713: 5799, 743: 5797, 752: 5800, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 5798, 5802, 5801, 770: 2712, 5804, 777: 5805, 5803, 780: 5806, 851: 6478}, - {184, 184}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6480, 2785, 2786, 2784}, - {1978, 1978}, - {2072, 2072, 9: 3950}, + {494, 494, 500: 852, 509: 852, 511: 852}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 5844, 5839, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 5842, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 5841, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 5846, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 5840, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 5849, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 5847, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 5843, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 514: 3943, 589: 5855, 610: 5854, 667: 3941, 685: 5852, 2849, 688: 2850, 2848, 798: 5856, 853: 5853, 1003: 5857, 1192: 5850}, + {499, 499}, + {498, 498}, + {497, 497}, // 3925 - {1067, 1067, 9: 1067, 164: 6484, 491: 6483}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4780, 2785, 2786, 2784, 791: 6485}, - {2070, 2070}, - {2071, 2071, 9: 4781}, - {2074, 2074, 9: 5778}, + {496, 496}, + {495, 495}, + {493, 493}, + {491, 491}, + {490, 490}, // 3930 - {586: 6488}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 5769, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 5774, 664: 3517, 2785, 2786, 2784, 742: 5287, 805: 5776, 825: 5777, 5775, 866: 6489}, - {2073, 2073, 9: 5778}, - {2076, 2076, 9: 5336}, - {586: 6492}, + {489, 489}, + {488, 488}, + {487, 487}, + {486, 486}, + {485, 485}, // 3935 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 5334, 872: 6493}, - {2075, 2075, 9: 5336}, - {2069, 2069, 9: 3950, 673: 4839, 675: 4838, 916: 6499}, - {586: 6496}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 3948, 786: 6497}, + {484, 484}, + {23: 5342}, + {2102, 2102}, + {518: 6551}, + {494: 6552}, // 3940 - {2069, 2069, 9: 3950, 673: 4839, 675: 4838, 916: 6498}, - {2077, 2077}, - {2078, 2078}, - {2: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 10: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 51: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 567: 4478, 784: 6501}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 3948, 786: 6502}, + {80: 2622, 159: 2624, 166: 2652, 2637, 171: 2621, 492: 2663, 2662, 515: 2661, 522: 2647, 526: 6533, 587: 2646, 2660, 665: 2656, 673: 2620, 2771, 731: 6531, 761: 2628, 770: 6532, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 2631, 6539, 6538, 788: 2770, 2629, 795: 6536, 6537, 6535, 802: 2630, 807: 6534, 822: 2638, 833: 6548, 867: 6547, 6541, 872: 6542, 881: 6540, 883: 6544, 885: 6545, 6543, 6546, 945: 6553}, + {2101, 2101}, + {494: 6555}, + {80: 2622, 159: 2624, 166: 2652, 2637, 171: 2621, 492: 2663, 2662, 515: 2661, 522: 2647, 526: 6533, 587: 2646, 2660, 665: 2656, 673: 2620, 2771, 731: 6531, 761: 2628, 770: 6532, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 2631, 6539, 6538, 788: 2770, 2629, 795: 6536, 6537, 6535, 802: 2630, 807: 6534, 822: 2638, 833: 6548, 867: 6547, 6541, 872: 6542, 881: 6540, 883: 6544, 885: 6545, 6543, 6546, 945: 6556}, + {2103, 2103}, // 3945 - {2069, 2069, 9: 3950, 673: 4839, 675: 4838, 916: 6503}, - {2082, 2082}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6505, 2785, 2786, 2784}, - {475: 6506}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6507}, + {2: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 10: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 59: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 508: 1094, 520: 1094, 775: 5547, 5546, 5545, 860: 5548, 910: 6558}, + {2: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 10: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 59: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 5922, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 508: 1082, 520: 1082, 1140: 6559}, + {2: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 10: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 59: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 508: 4303, 520: 1914, 877: 6560}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 520: 6561, 685: 5926, 2849, 688: 2850, 2848, 942: 5927, 992: 5925}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6563, 2849, 688: 2850, 2848, 759: 5939, 942: 5927, 992: 6562}, // 3950 - {2222, 2222, 84: 4261, 500: 4262, 874: 6509, 887: 6508, 1071: 6510}, - {2221, 2221, 84: 4261, 874: 6512}, - {2220, 2220, 500: 4262, 887: 6511}, - {2083, 2083}, - {2218, 2218}, + {9: 5935, 501: 6566}, + {1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1084, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 59: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 498: 1092, 501: 1084, 507: 1092, 1092, 512: 1092, 519: 1092, 523: 1092, 1092, 544: 1092, 672: 6564, 932: 5928}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 541: 5931, 685: 6565, 2849, 688: 2850, 2848}, + {1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1084, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 59: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 498: 1091, 501: 1084, 507: 1091, 1091, 512: 1091, 519: 1091, 523: 1091, 1091, 544: 1091, 672: 5933, 932: 5932}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 5559, 601: 5554, 685: 4029, 2849, 688: 2850, 2848, 731: 5558, 759: 5557, 820: 5556, 824: 5555, 5561, 874: 5551, 914: 6567}, // 3955 - {2219, 2219}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5434, 2785, 2786, 2784, 813: 6514}, - {2084, 2084}, - {2230, 2230}, - {2: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 10: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 51: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 567: 4870, 790: 6742}, + {273, 273, 9: 5605, 519: 2809, 814: 2810, 6568}, + {2133, 2133}, + {2136, 2136, 9: 3696}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6636, 2849, 688: 2850, 2848}, + {2: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 10: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 59: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 583: 4577, 800: 6634}, // 3960 - {652: 6730}, - {652: 2216}, - {652: 2215}, - {652: 2214}, - {2: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 10: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 51: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 567: 4870, 790: 6707}, + {2: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 10: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 59: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 583: 4577, 800: 6625}, + {133: 5683, 588: 5682, 1181: 6621}, + {172: 631, 179: 5737}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 583: 6616, 685: 4029, 2849, 688: 2850, 2848, 759: 4030, 804: 6615}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 583: 6612, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 5440, 890: 6611}, // 3965 - {18: 6628, 84: 6627, 104: 2110, 145: 2110, 671: 2110, 1345: 6626}, - {507: 6625}, - {2: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 10: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 51: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 567: 4870, 790: 6613}, - {2: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 10: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 51: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 478: 1875, 567: 4870, 573: 1875, 790: 6576}, - {2: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 10: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 51: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 478: 1875, 567: 4870, 790: 6570}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 5875, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 5880, 583: 6608, 685: 3597, 2849, 688: 2850, 2848, 760: 5393, 823: 5882, 843: 5883, 5881, 884: 6607}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 6603, 804: 6602}, + {2: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 10: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 59: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 583: 4577, 800: 6600}, + {172: 6592}, + {177: 6589}, // 3970 - {162: 6565}, - {2: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 10: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 51: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 567: 4870, 790: 6529}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6530}, - {51, 51, 6: 51, 51, 51, 15: 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 73: 6538, 6535, 6541, 6542, 6543, 6536, 6534, 6544, 6540, 6537, 482: 51, 51, 487: 51, 506: 51, 508: 51, 650: 51, 652: 51, 658: 6539, 918: 6533, 1207: 6531, 1301: 6532}, - {406, 406, 6: 4267, 4269, 410, 15: 4286, 2193, 4284, 4223, 4288, 4275, 4304, 4268, 4271, 4270, 4273, 4274, 4276, 4283, 410, 4294, 4295, 4281, 4282, 4287, 4289, 4301, 4300, 4306, 4302, 4299, 4292, 4297, 4298, 4291, 4293, 4296, 4285, 482: 4266, 4303, 487: 2193, 506: 5013, 508: 2193, 650: 2193, 652: 4272, 785: 4277, 797: 4279, 818: 4278, 840: 4280, 843: 4290, 847: 4305, 924: 5653, 1022: 6564}, + {532: 6586}, + {2: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 10: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 59: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 583: 4577, 800: 6584}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4030, 804: 6585}, + {30, 30, 9: 4032}, + {2: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 10: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 59: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 583: 4577, 800: 6587}, // 3975 - {50, 50, 6: 50, 50, 50, 15: 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 73: 6538, 6535, 6541, 6542, 6543, 6536, 6534, 6544, 6540, 6537, 482: 50, 50, 487: 50, 506: 50, 508: 50, 650: 50, 652: 50, 658: 6539, 918: 6563}, - {49, 49, 6: 49, 49, 49, 15: 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 73: 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 482: 49, 49, 487: 49, 506: 49, 508: 49, 650: 49, 652: 49, 658: 49}, - {488: 2064, 2064, 502: 4307, 511: 2064, 663: 6560, 741: 6559}, - {477: 6556, 488: 2064, 2064, 502: 4307, 511: 2064, 741: 6555}, - {488: 2064, 2064, 502: 4307, 511: 2064, 741: 6553}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6374, 2849, 688: 2850, 2848, 911: 6588}, + {57, 57}, + {2: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 10: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 59: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 583: 4577, 800: 6590}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5134, 2849, 688: 2850, 2848, 909: 6591}, + {60, 60}, // 3980 - {42, 42, 6: 42, 42, 42, 15: 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 73: 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 482: 42, 42, 487: 42, 506: 42, 508: 42, 650: 42, 652: 42, 658: 42}, - {75: 6551, 77: 6552, 6549, 658: 6550}, - {488: 2064, 2064, 502: 4307, 511: 2064, 741: 6547}, - {39, 39, 6: 39, 39, 39, 15: 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 73: 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 482: 39, 39, 487: 39, 506: 39, 508: 39, 650: 39, 652: 39, 658: 39}, - {488: 2064, 2064, 502: 4307, 511: 2064, 741: 6545}, + {513: 6593}, + {492: 2663, 2662, 515: 2661, 522: 2647, 587: 2646, 2660, 665: 2656, 674: 2771, 687: 6595, 731: 5905, 761: 5903, 770: 5906, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 5904, 5908, 5907, 788: 2770, 5910, 795: 5911, 5912, 5909, 869: 6594}, + {193, 193, 501: 6598}, + {217: 6596}, + {494: 6597}, // 3985 - {36, 36, 6: 36, 36, 36, 15: 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 73: 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 482: 36, 36, 487: 36, 506: 36, 508: 36, 650: 36, 652: 36, 658: 36}, - {34, 34, 6: 34, 34, 34, 15: 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 73: 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 482: 34, 34, 487: 34, 506: 34, 508: 34, 650: 34, 652: 34, 658: 34}, - {33, 33, 6: 33, 33, 33, 15: 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, 73: 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 482: 33, 33, 487: 33, 506: 33, 508: 33, 650: 33, 652: 33, 658: 33}, - {488: 4082, 4083, 511: 2759, 737: 4079, 767: 4081, 819: 6546}, - {37, 37, 6: 37, 37, 37, 15: 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 73: 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 482: 37, 37, 487: 37, 506: 37, 508: 37, 650: 37, 652: 37, 658: 37}, + {191, 191}, + {492: 2663, 2662, 515: 2661, 522: 2647, 587: 2646, 2660, 665: 2656, 674: 2771, 731: 5905, 761: 5903, 770: 5906, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 5904, 5908, 5907, 788: 2770, 5910, 795: 5911, 5912, 5909, 869: 6599}, + {192, 192}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6601, 2849, 688: 2850, 2848}, + {2020, 2020}, // 3990 - {488: 4082, 4083, 511: 2759, 737: 4079, 767: 4081, 819: 6548}, - {40, 40, 6: 40, 40, 40, 15: 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 73: 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 482: 40, 40, 487: 40, 506: 40, 508: 40, 650: 40, 652: 40, 658: 40}, - {41, 41, 6: 41, 41, 41, 15: 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 73: 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 482: 41, 41, 487: 41, 506: 41, 508: 41, 650: 41, 652: 41, 658: 41}, - {38, 38, 6: 38, 38, 38, 15: 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 73: 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 482: 38, 38, 487: 38, 506: 38, 508: 38, 650: 38, 652: 38, 658: 38}, - {35, 35, 6: 35, 35, 35, 15: 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 73: 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 482: 35, 35, 487: 35, 506: 35, 508: 35, 650: 35, 652: 35, 658: 35}, + {2115, 2115, 9: 4032}, + {1090, 1090, 9: 1090, 174: 6605, 507: 6604}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4884, 2849, 688: 2850, 2848, 809: 6606}, + {2113, 2113}, + {2114, 2114, 9: 4885}, // 3995 - {32, 32, 6: 32, 32, 32, 15: 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, 73: 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 482: 32, 32, 487: 32, 506: 32, 508: 32, 650: 32, 652: 32, 658: 32}, - {488: 4082, 4083, 511: 2759, 737: 4079, 767: 4081, 819: 6554}, - {43, 43, 6: 43, 43, 43, 15: 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 73: 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 482: 43, 43, 487: 43, 506: 43, 508: 43, 650: 43, 652: 43, 658: 43}, - {488: 4082, 4083, 511: 2759, 737: 4079, 767: 4081, 819: 6558}, - {488: 4082, 4083, 511: 2759, 737: 4079, 767: 4081, 819: 6557}, + {2117, 2117, 9: 5884}, + {603: 6609}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 5875, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 5880, 685: 3597, 2849, 688: 2850, 2848, 760: 5393, 823: 5882, 843: 5883, 5881, 884: 6610}, + {2116, 2116, 9: 5884}, + {2119, 2119, 9: 5442}, // 4000 - {44, 44, 6: 44, 44, 44, 15: 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 73: 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 482: 44, 44, 487: 44, 506: 44, 508: 44, 650: 44, 652: 44, 658: 44}, - {45, 45, 6: 45, 45, 45, 15: 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 73: 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 482: 45, 45, 487: 45, 506: 45, 508: 45, 650: 45, 652: 45, 658: 45}, - {488: 4082, 4083, 511: 2759, 737: 4079, 767: 4081, 819: 6562}, - {488: 4082, 4083, 511: 2759, 737: 4079, 767: 4081, 819: 6561}, - {46, 46, 6: 46, 46, 46, 15: 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 73: 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 482: 46, 46, 487: 46, 506: 46, 508: 46, 650: 46, 652: 46, 658: 46}, + {603: 6613}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 5440, 890: 6614}, + {2118, 2118, 9: 5442}, + {2112, 2112, 9: 4032, 691: 4943, 693: 4942, 936: 6620}, + {603: 6617}, // 4005 - {47, 47, 6: 47, 47, 47, 15: 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 73: 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 482: 47, 47, 487: 47, 506: 47, 508: 47, 650: 47, 652: 47, 658: 47}, - {48, 48, 6: 48, 48, 48, 15: 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 73: 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 482: 48, 48, 487: 48, 506: 48, 508: 48, 650: 48, 652: 48, 658: 48}, - {52, 52}, - {497: 6566}, - {476: 2608, 2607, 498: 2606, 507: 2592, 570: 2591, 572: 2605, 649: 2601, 657: 2713, 713: 5799, 743: 5797, 752: 5800, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 5798, 5802, 5801, 770: 2712, 5804, 777: 5805, 5803, 780: 5806, 851: 6567}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4030, 804: 6618}, + {2112, 2112, 9: 4032, 691: 4943, 693: 4942, 936: 6619}, + {2120, 2120}, + {2121, 2121}, + {2: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 10: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 59: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 583: 4577, 800: 6622}, // 4010 - {484: 6568}, - {476: 2608, 2607, 498: 2606, 507: 2592, 570: 2591, 572: 2605, 649: 2601, 657: 2713, 713: 5799, 743: 5797, 752: 5800, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 5798, 5802, 5801, 770: 2712, 5804, 777: 5805, 5803, 780: 5806, 851: 6569}, - {186, 186}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 5769, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 5774, 664: 3517, 2785, 2786, 2784, 742: 5287, 805: 5776, 825: 6572, 5775, 1130: 6573, 1296: 6571}, - {252, 252, 9: 6574}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 4030, 804: 6623}, + {2112, 2112, 9: 4032, 691: 4943, 693: 4942, 936: 6624}, + {2125, 2125}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6626, 2849, 688: 2850, 2848}, + {491: 6627}, // 4015 - {197, 197, 9: 197}, - {196, 196, 9: 196}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 5769, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 5774, 664: 3517, 2785, 2786, 2784, 742: 5287, 805: 5776, 825: 6572, 5775, 1130: 6575}, - {195, 195, 9: 195}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 5350, 895: 5351, 927: 6577}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 6628}, + {2266, 2266, 90: 4347, 517: 4348, 892: 6630, 906: 6629, 1094: 6631}, + {2265, 2265, 90: 4347, 892: 6633}, + {2264, 2264, 517: 4348, 906: 6632}, + {2126, 2126}, // 4020 - {235, 235, 6: 235, 9: 5353, 15: 235, 48: 235, 235, 477: 235, 669: 5397, 965: 5396, 6578}, - {243, 243, 6: 243, 15: 243, 48: 243, 243, 477: 6580, 1013: 6579}, - {218, 218, 6: 218, 15: 6597, 48: 218, 6595, 958: 6596, 6594, 1110: 6593, 6592}, - {132: 6585, 6583, 6584, 6586, 1012: 6582, 1205: 6581}, - {242, 242, 6: 242, 15: 242, 48: 242, 242, 132: 6585, 6583, 6584, 6586, 1012: 6591}, + {2262, 2262}, + {2263, 2263}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5540, 2849, 688: 2850, 2848, 832: 6635}, + {2127, 2127}, + {2274, 2274}, // 4025 - {241, 241, 6: 241, 15: 241, 48: 241, 241, 132: 241, 241, 241, 241}, - {511: 2759, 737: 4079, 767: 6590}, - {511: 2759, 737: 4079, 767: 6589}, - {511: 2759, 737: 4079, 767: 6588}, - {511: 2759, 737: 4079, 767: 6587}, + {2: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 10: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 59: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 583: 4974, 805: 6900}, + {668: 6888}, + {668: 2260}, + {668: 2259}, + {668: 2258}, // 4030 - {236, 236, 6: 236, 15: 236, 48: 236, 236, 132: 236, 236, 236, 236}, - {237, 237, 6: 237, 15: 237, 48: 237, 237, 132: 237, 237, 237, 237}, - {238, 238, 6: 238, 15: 238, 48: 238, 238, 132: 238, 238, 238, 238}, - {239, 239, 6: 239, 15: 239, 48: 239, 239, 132: 239, 239, 239, 239}, - {240, 240, 6: 240, 15: 240, 48: 240, 240, 132: 240, 240, 240, 240}, + {2: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 10: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 59: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 583: 4974, 805: 6865}, + {18: 6783, 90: 6782, 111: 2153, 154: 2153, 687: 2153, 1370: 6781}, + {522: 6780}, + {2: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 10: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 59: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 583: 4974, 805: 6768}, + {2: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 10: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 59: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 494: 1916, 583: 4974, 590: 1916, 805: 6716}, // 4035 - {221, 221, 6: 6609, 48: 6610, 1010: 6608}, - {217, 217, 6: 217, 15: 6597, 48: 217, 6595, 958: 6596, 6607}, - {216, 216, 6: 216, 15: 216, 48: 216, 216}, - {500: 6606, 978: 6605}, - {212, 212, 6: 212, 15: 212, 48: 212, 212, 216: 6601, 482: 6602, 581: 6600}, + {2: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 10: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 59: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 494: 1916, 583: 4974, 805: 6710}, + {172: 6699}, + {532: 6687}, + {2: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 10: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 59: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 583: 4974, 805: 6651}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 6652}, // 4040 - {343: 6598}, - {207, 207, 6: 207, 15: 207, 48: 207, 207, 216: 207, 482: 207, 581: 207, 1197: 6599}, - {208, 208, 6: 208, 15: 208, 48: 208, 208, 216: 208, 482: 208, 581: 208}, - {511: 2759, 737: 4079, 767: 6603}, - {210, 210, 6: 210, 15: 210, 48: 210, 210}, + {53, 53, 6: 53, 53, 53, 15: 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 79: 6660, 6657, 6663, 6664, 6665, 6658, 6656, 6666, 6662, 6659, 496: 53, 499: 53, 53, 514: 53, 524: 53, 667: 53, 53, 675: 6661, 938: 6655, 1232: 6653, 1326: 6654}, + {422, 422, 6: 4353, 4355, 426, 15: 4372, 2236, 4370, 4309, 4374, 4361, 4390, 4354, 4357, 4356, 4359, 4360, 4362, 4369, 426, 4380, 4381, 4391, 4367, 4368, 4373, 4375, 4387, 4386, 4395, 4388, 4385, 4378, 4383, 4384, 4377, 4379, 4382, 4371, 4392, 4393, 496: 4352, 499: 2236, 4389, 514: 2236, 524: 5117, 667: 2236, 4358, 803: 4363, 816: 4365, 837: 4364, 858: 4366, 861: 4376, 865: 4394, 944: 5759, 1044: 6686}, + {52, 52, 6: 52, 52, 52, 15: 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 79: 6660, 6657, 6663, 6664, 6665, 6658, 6656, 6666, 6662, 6659, 496: 52, 499: 52, 52, 514: 52, 524: 52, 667: 52, 52, 675: 6661, 938: 6685}, + {51, 51, 6: 51, 51, 51, 15: 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 79: 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 496: 51, 499: 51, 51, 514: 51, 524: 51, 667: 51, 51, 675: 51}, + {504: 2107, 2107, 518: 4396, 525: 2107, 681: 6682, 758: 6681}, // 4045 - {209, 209, 6: 209, 15: 209, 48: 209, 209}, - {106: 6604}, - {211, 211, 6: 211, 15: 211, 48: 211, 211}, - {214, 214, 6: 214, 15: 214, 48: 214, 214}, - {213, 213, 6: 213, 15: 213, 48: 213, 213}, + {493: 6678, 504: 2107, 2107, 518: 4396, 525: 2107, 758: 6677}, + {504: 2107, 2107, 518: 4396, 525: 2107, 758: 6675}, + {44, 44, 6: 44, 44, 44, 15: 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 79: 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 496: 44, 499: 44, 44, 514: 44, 524: 44, 667: 44, 44, 675: 44}, + {81: 6673, 83: 6674, 6671, 675: 6672}, + {504: 2107, 2107, 518: 4396, 525: 2107, 758: 6669}, // 4050 - {215, 215, 6: 215, 15: 215, 48: 215, 215}, - {253, 253}, - {478: 6612}, - {478: 6611}, - {219, 219}, + {41, 41, 6: 41, 41, 41, 15: 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 79: 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 496: 41, 499: 41, 41, 514: 41, 524: 41, 667: 41, 41, 675: 41}, + {504: 2107, 2107, 518: 4396, 525: 2107, 758: 6667}, + {38, 38, 6: 38, 38, 38, 15: 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 79: 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 496: 38, 499: 38, 38, 514: 38, 524: 38, 667: 38, 38, 675: 38}, + {36, 36, 6: 36, 36, 36, 15: 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 79: 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 496: 36, 499: 36, 36, 514: 36, 524: 36, 667: 36, 36, 675: 36}, + {35, 35, 6: 35, 35, 35, 15: 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 79: 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 496: 35, 499: 35, 35, 514: 35, 524: 35, 667: 35, 35, 675: 35}, // 4055 - {220, 220}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6614, 2785, 2786, 2784}, - {503: 6615}, - {478: 6616}, - {1970, 1970, 17: 1970, 51: 1970, 53: 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 143: 6619, 475: 1970, 507: 6618, 656: 1970, 1046: 6617}, + {504: 4164, 4165, 525: 2823, 755: 4161, 784: 4163, 838: 6668}, + {39, 39, 6: 39, 39, 39, 15: 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 79: 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 496: 39, 499: 39, 39, 514: 39, 524: 39, 667: 39, 39, 675: 39}, + {504: 4164, 4165, 525: 2823, 755: 4161, 784: 4163, 838: 6670}, + {42, 42, 6: 42, 42, 42, 15: 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 79: 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 496: 42, 499: 42, 42, 514: 42, 524: 42, 667: 42, 42, 675: 42}, + {43, 43, 6: 43, 43, 43, 15: 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 79: 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 496: 43, 499: 43, 43, 514: 43, 524: 43, 667: 43, 43, 675: 43}, // 4060 - {2027, 2027, 17: 2027, 51: 2027, 53: 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 475: 2027, 656: 2027, 902: 6624}, - {1969, 1969, 17: 1969, 51: 1969, 53: 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 475: 1969, 656: 1969}, - {208: 6622, 395: 6623, 646: 6621, 654: 6620}, - {1968, 1968, 17: 1968, 51: 1968, 53: 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 475: 1968, 656: 1968}, - {1967, 1967, 17: 1967, 51: 1967, 53: 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 475: 1967, 656: 1967}, + {40, 40, 6: 40, 40, 40, 15: 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 79: 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 496: 40, 499: 40, 40, 514: 40, 524: 40, 667: 40, 40, 675: 40}, + {37, 37, 6: 37, 37, 37, 15: 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 79: 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 496: 37, 499: 37, 37, 514: 37, 524: 37, 667: 37, 37, 675: 37}, + {34, 34, 6: 34, 34, 34, 15: 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 79: 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 496: 34, 499: 34, 34, 514: 34, 524: 34, 667: 34, 34, 675: 34}, + {504: 4164, 4165, 525: 2823, 755: 4161, 784: 4163, 838: 6676}, + {45, 45, 6: 45, 45, 45, 15: 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 79: 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 496: 45, 499: 45, 45, 514: 45, 524: 45, 667: 45, 45, 675: 45}, // 4065 - {1966, 1966, 17: 1966, 51: 1966, 53: 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 475: 1966, 656: 1966}, - {1965, 1965, 17: 1965, 51: 1965, 53: 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 475: 1965, 656: 1965}, - {1982, 1982, 17: 6332, 51: 6308, 53: 6328, 6321, 6311, 6307, 6315, 6319, 6331, 6314, 6320, 6318, 6316, 6329, 6322, 6310, 6330, 6309, 6312, 6313, 6317, 475: 6323, 656: 6333, 898: 6325, 6324, 6327, 6306, 903: 6326}, - {18: 2111, 84: 2111, 104: 2111, 145: 2111, 671: 2111}, - {104: 2106, 145: 6675, 671: 2106, 1347: 6674}, + {504: 4164, 4165, 525: 2823, 755: 4161, 784: 4163, 838: 6680}, + {504: 4164, 4165, 525: 2823, 755: 4161, 784: 4163, 838: 6679}, + {46, 46, 6: 46, 46, 46, 15: 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 79: 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 496: 46, 499: 46, 46, 514: 46, 524: 46, 667: 46, 46, 675: 46}, + {47, 47, 6: 47, 47, 47, 15: 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 79: 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 496: 47, 499: 47, 47, 514: 47, 524: 47, 667: 47, 47, 675: 47}, + {504: 4164, 4165, 525: 2823, 755: 4161, 784: 4163, 838: 6684}, // 4070 - {502: 6670}, - {167: 6629}, - {2: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 10: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 51: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 567: 4870, 790: 6630}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5030, 2785, 2786, 2784, 890: 6631}, - {89: 6635, 93: 6640, 6642, 6636, 6641, 6644, 6638, 6634, 6639, 6643, 6637, 878: 6632, 1112: 6633}, + {504: 4164, 4165, 525: 2823, 755: 4161, 784: 4163, 838: 6683}, + {48, 48, 6: 48, 48, 48, 15: 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 79: 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 496: 48, 499: 48, 48, 514: 48, 524: 48, 667: 48, 48, 675: 48}, + {49, 49, 6: 49, 49, 49, 15: 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 79: 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 496: 49, 499: 49, 49, 514: 49, 524: 49, 667: 49, 49, 675: 49}, + {50, 50, 6: 50, 50, 50, 15: 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 79: 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 496: 50, 499: 50, 50, 514: 50, 524: 50, 667: 50, 50, 675: 50}, + {54, 54}, // 4075 - {2548, 2548, 9: 2548, 89: 2548, 93: 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548}, - {54, 54, 9: 6668, 89: 6635, 93: 6640, 6642, 6636, 6641, 6644, 6638, 6634, 6639, 6643, 6637, 878: 6667}, - {478: 2064, 502: 4307, 741: 6665}, - {478: 2064, 502: 4307, 741: 6663}, - {502: 4307, 511: 2064, 741: 6661}, + {2: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 10: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 59: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 583: 4974, 805: 6688}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6374, 2849, 688: 2850, 2848, 911: 6689}, + {134: 6693, 6692, 897: 6690, 1148: 6691}, + {2603, 2603, 9: 2603, 134: 2603, 2603}, + {59, 59, 9: 6697, 134: 6693, 6692, 897: 6696}, // 4080 - {502: 4307, 511: 2064, 741: 6659}, - {502: 4307, 511: 2064, 741: 6657}, - {478: 2064, 502: 4307, 741: 6655}, - {478: 2064, 502: 4307, 741: 6653}, - {478: 2064, 502: 4307, 741: 6651}, + {518: 4396, 525: 2107, 758: 6694}, + {2599, 2599, 9: 2599, 134: 2599, 2599}, + {525: 2823, 755: 2822, 762: 6695}, + {2600, 2600, 9: 2600, 134: 2600, 2600}, + {2602, 2602, 9: 2602, 134: 2602, 2602}, // 4085 - {478: 2064, 502: 4307, 741: 6649}, - {478: 2064, 502: 4307, 741: 6647}, - {478: 2064, 502: 4307, 741: 6645}, - {478: 6646}, - {2535, 2535, 9: 2535, 89: 2535, 93: 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535}, + {134: 6693, 6692, 897: 6698}, + {2601, 2601, 9: 2601, 134: 2601, 2601}, + {513: 6700, 520: 6701}, + {492: 2663, 2662, 515: 2661, 522: 2647, 587: 2646, 2660, 665: 2656, 674: 2771, 731: 5905, 761: 5903, 770: 5906, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 5904, 5908, 5907, 788: 2770, 5910, 795: 5911, 5912, 5909, 869: 6707}, + {225: 6702}, // 4090 - {478: 6648}, - {2536, 2536, 9: 2536, 89: 2536, 93: 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536}, - {478: 6650}, - {2537, 2537, 9: 2537, 89: 2537, 93: 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537}, - {478: 6652}, + {501: 6703}, + {201: 6704}, + {217: 6705}, + {494: 6706}, + {194, 194}, // 4095 - {2538, 2538, 9: 2538, 89: 2538, 93: 2538, 2538, 2538, 2538, 2538, 2538, 2538, 2538, 2538, 2538}, - {478: 6654}, - {2539, 2539, 9: 2539, 89: 2539, 93: 2539, 2539, 2539, 2539, 2539, 2539, 2539, 2539, 2539, 2539}, - {478: 6656}, - {2540, 2540, 9: 2540, 89: 2540, 93: 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540}, + {501: 6708}, + {492: 2663, 2662, 515: 2661, 522: 2647, 587: 2646, 2660, 665: 2656, 674: 2771, 731: 5905, 761: 5903, 770: 5906, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 5904, 5908, 5907, 788: 2770, 5910, 795: 5911, 5912, 5909, 869: 6709}, + {195, 195}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 5875, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 5880, 685: 3597, 2849, 688: 2850, 2848, 760: 5393, 823: 5882, 843: 6712, 5881, 1155: 6713, 1321: 6711}, + {268, 268, 9: 6714}, // 4100 - {511: 2759, 737: 2758, 745: 6658}, - {2541, 2541, 9: 2541, 89: 2541, 93: 2541, 2541, 2541, 2541, 2541, 2541, 2541, 2541, 2541, 2541}, - {511: 2759, 737: 2758, 745: 6660}, - {2542, 2542, 9: 2542, 89: 2542, 93: 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542}, - {511: 2759, 737: 2758, 745: 6662}, + {206, 206, 9: 206}, + {205, 205, 9: 205}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 5875, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 5880, 685: 3597, 2849, 688: 2850, 2848, 760: 5393, 823: 5882, 843: 6712, 5881, 1155: 6715}, + {204, 204, 9: 204}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 5456, 915: 5457, 947: 6717}, // 4105 - {2543, 2543, 9: 2543, 89: 2543, 93: 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543}, - {478: 6664}, - {2544, 2544, 9: 2544, 89: 2544, 93: 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544}, - {478: 6666}, - {2545, 2545, 9: 2545, 89: 2545, 93: 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545}, + {251, 251, 6: 251, 9: 5459, 15: 251, 51: 251, 251, 251, 251, 251, 493: 251, 683: 5503, 985: 5502, 6718}, + {259, 259, 6: 259, 15: 259, 51: 259, 259, 259, 259, 259, 493: 6720, 1034: 6719}, + {232, 232, 6: 232, 15: 6736, 51: 232, 232, 6735, 6737, 6738, 979: 6734, 1133: 6733, 6732}, + {141: 6725, 6723, 6724, 6726, 1033: 6722, 1230: 6721}, + {258, 258, 6: 258, 15: 258, 51: 258, 258, 258, 258, 258, 141: 6725, 6723, 6724, 6726, 1033: 6731}, // 4110 - {2547, 2547, 9: 2547, 89: 2547, 93: 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547}, - {89: 6635, 93: 6640, 6642, 6636, 6641, 6644, 6638, 6634, 6639, 6643, 6637, 878: 6669}, - {2546, 2546, 9: 2546, 89: 2546, 93: 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546}, - {3: 6672, 401: 6673, 408: 6671}, - {104: 2109, 145: 2109, 671: 2109}, + {257, 257, 6: 257, 15: 257, 51: 257, 257, 257, 257, 257, 141: 257, 257, 257, 257}, + {525: 2823, 755: 4161, 784: 6730}, + {525: 2823, 755: 4161, 784: 6729}, + {525: 2823, 755: 4161, 784: 6728}, + {525: 2823, 755: 4161, 784: 6727}, // 4115 - {104: 2108, 145: 2108, 671: 2108}, - {104: 2107, 145: 2107, 671: 2107}, - {104: 2104, 671: 6679, 1350: 6678}, - {502: 6676}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 6677}, + {252, 252, 6: 252, 15: 252, 51: 252, 252, 252, 252, 252, 141: 252, 252, 252, 252}, + {253, 253, 6: 253, 15: 253, 51: 253, 253, 253, 253, 253, 141: 253, 253, 253, 253}, + {254, 254, 6: 254, 15: 254, 51: 254, 254, 254, 254, 254, 141: 254, 254, 254, 254}, + {255, 255, 6: 255, 15: 255, 51: 255, 255, 255, 255, 255, 141: 255, 255, 255, 255}, + {256, 256, 6: 256, 15: 256, 51: 256, 256, 256, 256, 256, 141: 256, 256, 256, 256}, // 4120 - {104: 2105, 671: 2105}, - {104: 6683}, - {386: 6680}, - {145: 6681, 355: 6682}, - {104: 2103}, + {237, 237, 6: 6760, 51: 237, 6761, 1031: 6759}, + {231, 231, 6: 231, 15: 6736, 51: 231, 231, 6735, 6737, 6738, 979: 6758}, + {230, 230, 6: 230, 15: 230, 51: 230, 230, 230, 230, 230}, + {517: 6757, 998: 6756}, + {225: 6742, 354: 6744, 396: 6743}, // 4125 - {104: 2102}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6685, 1349: 6684}, - {476: 6687, 481: 2100, 1348: 6686}, - {476: 2101, 481: 2101}, - {481: 6693}, + {525: 2823, 755: 4161, 784: 6741}, + {169: 6740, 525: 2823, 755: 4161, 784: 6739}, + {217, 217, 6: 217, 15: 217, 51: 217, 217, 217, 217, 217}, + {216, 216, 6: 216, 15: 216, 51: 216, 216, 216, 216, 216}, + {218, 218, 6: 218, 15: 218, 51: 218, 218, 218, 218, 218}, // 4130 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6689, 2785, 2786, 2784, 1199: 6688}, - {9: 6691, 50: 6690}, - {9: 2098, 50: 2098}, - {481: 2099}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6692, 2785, 2786, 2784}, + {496: 6754, 525: 2823, 755: 6755}, + {599: 6750}, + {222, 222, 6: 222, 15: 222, 51: 222, 222, 222, 222, 222, 374: 6746, 496: 6747, 599: 6745}, + {525: 2823, 755: 4161, 784: 6748}, + {220, 220, 6: 220, 15: 220, 51: 220, 220, 220, 220, 220}, // 4135 - {9: 2097, 50: 2097}, - {476: 2608, 2607, 498: 2606, 572: 2605, 649: 2601, 713: 6697, 752: 6695, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 3906, 6696, 6694, 1209: 6698}, - {2119, 2119, 477: 2119}, - {2118, 2118, 477: 2118, 483: 829, 493: 829, 829}, - {2117, 2117, 477: 2117}, + {219, 219, 6: 219, 15: 219, 51: 219, 219, 219, 219, 219}, + {112: 6749}, + {221, 221, 6: 221, 15: 221, 51: 221, 221, 221, 221, 221}, + {496: 6751, 525: 2823, 755: 6752}, + {224, 224, 6: 224, 15: 224, 51: 224, 224, 224, 224, 224}, // 4140 - {2116, 2116, 477: 2116, 483: 828, 493: 828, 828, 496: 2751, 504: 2752, 2748, 772: 3917, 3918}, - {2096, 2096, 477: 6700, 1346: 6699}, - {2113, 2113}, - {141: 6702, 323: 6701}, - {593: 6705}, + {112: 6753}, + {223, 223, 6: 223, 15: 223, 51: 223, 223, 223, 223, 223}, + {226, 226, 6: 226, 15: 226, 51: 226, 226, 226, 226, 226}, + {225, 225, 6: 225, 15: 225, 51: 225, 225, 225, 225, 225}, + {228, 228, 6: 228, 15: 228, 51: 228, 228, 228, 228, 228}, // 4145 - {593: 6703}, - {911: 6704}, - {2094, 2094}, - {911: 6706}, - {2095, 2095}, + {227, 227, 6: 227, 15: 227, 51: 227, 227, 227, 227, 227}, + {229, 229, 6: 229, 15: 229, 51: 229, 229, 229, 229, 229}, + {234, 234, 51: 6765, 1147: 6764}, + {494: 6763}, + {494: 6762}, // 4150 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5434, 2785, 2786, 2784, 813: 6708}, - {2202, 2202, 16: 2193, 18: 2193, 21: 2193, 482: 4266, 487: 2193, 508: 2193, 6712, 650: 2193, 785: 6711, 797: 6710, 855: 6714, 937: 6713, 1210: 6709}, - {2211, 2211}, - {16: 3862, 18: 4223, 21: 6722, 487: 6721, 508: 3863, 650: 3861, 779: 6720, 785: 6723}, - {2204, 2204, 16: 2204, 18: 2204, 21: 2204, 482: 2204, 487: 2204, 508: 2204, 2204, 650: 2204}, + {235, 235, 51: 235}, + {236, 236, 51: 236}, + {269, 269}, + {532: 6766}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6374, 2849, 688: 2850, 2848, 911: 6767}, // 4155 - {170: 6716}, - {2201, 2201, 16: 2193, 18: 2193, 21: 2193, 482: 4266, 487: 2193, 508: 2193, 6712, 650: 2193, 785: 6711, 797: 6710, 855: 6715}, - {2200, 2200, 16: 2200, 18: 2200, 21: 2200, 482: 2200, 487: 2200, 508: 2200, 2200, 650: 2200}, - {2199, 2199, 16: 2199, 18: 2199, 21: 2199, 482: 2199, 487: 2199, 508: 2199, 2199, 650: 2199}, - {193: 6717}, + {233, 233}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6769, 2849, 688: 2850, 2848}, + {520: 6770}, + {494: 6771}, + {2012, 2012, 17: 2012, 56: 2012, 59: 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 152: 6774, 491: 2012, 522: 6773, 673: 2012, 1069: 6772}, // 4160 - {511: 2759, 737: 2758, 745: 6718}, - {2519, 2519, 16: 2519, 18: 2519, 21: 2519, 186: 5006, 482: 2519, 487: 2519, 508: 2519, 2519, 650: 2519, 1084: 6719}, - {2203, 2203, 16: 2203, 18: 2203, 21: 2203, 482: 2203, 487: 2203, 508: 2203, 2203, 650: 2203}, - {2: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 10: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 51: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 478: 2064, 502: 4307, 533: 2064, 741: 6728}, - {2: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 10: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 51: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 478: 2064, 502: 4307, 533: 2064, 741: 6726}, + {2069, 2069, 17: 2069, 56: 2069, 59: 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 491: 2069, 673: 2069, 922: 6779}, + {2011, 2011, 17: 2011, 56: 2011, 59: 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 491: 2011, 673: 2011}, + {219: 6777, 407: 6778, 663: 6776, 671: 6775}, + {2010, 2010, 17: 2010, 56: 2010, 59: 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 491: 2010, 673: 2010}, + {2009, 2009, 17: 2009, 56: 2009, 59: 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 491: 2009, 673: 2009}, // 4165 - {478: 2064, 502: 4307, 741: 6724}, - {2205, 2205, 16: 2205, 18: 2205, 21: 2205, 482: 2205, 487: 2205, 508: 2205, 2205, 650: 2205}, - {478: 4326, 1044: 6725}, - {2206, 2206, 16: 2206, 18: 2206, 21: 2206, 482: 2206, 487: 2206, 508: 2206, 2206, 650: 2206}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 533: 3515, 664: 3517, 2785, 2786, 2784, 742: 3514, 876: 6727}, + {2008, 2008, 17: 2008, 56: 2008, 59: 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 491: 2008, 673: 2008}, + {2007, 2007, 17: 2007, 56: 2007, 59: 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 491: 2007, 673: 2007}, + {2024, 2024, 17: 6445, 56: 6421, 59: 6441, 6434, 6424, 6420, 6428, 6432, 6444, 6427, 6433, 6431, 6429, 6442, 6435, 6423, 6443, 6422, 6425, 6426, 6430, 491: 6436, 673: 6446, 918: 6438, 6437, 6440, 6419, 923: 6439}, + {18: 2154, 90: 2154, 111: 2154, 154: 2154, 687: 2154}, + {111: 2149, 154: 6833, 687: 2149, 1372: 6832}, // 4170 - {2207, 2207, 16: 2207, 18: 2207, 21: 2207, 482: 2207, 487: 2207, 508: 2207, 2207, 650: 2207}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 533: 3787, 664: 3517, 2785, 2786, 2784, 742: 3786, 811: 6729}, - {2208, 2208, 16: 2208, 18: 2208, 21: 2208, 482: 2208, 487: 2208, 508: 2208, 2208, 650: 2208}, - {2: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 10: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 51: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 567: 4870, 790: 6731}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6732, 2785, 2786, 2784}, + {518: 6828}, + {177: 6784}, + {2: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 10: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 59: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 583: 4974, 805: 6785}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5134, 2849, 688: 2850, 2848, 909: 6786}, + {91: 6790, 99: 6795, 6797, 6791, 6796, 6799, 6793, 6789, 6794, 6800, 6798, 6792, 896: 6787, 1135: 6788}, // 4175 - {85: 4903, 475: 1858, 484: 4902, 862: 6734, 1242: 6733}, - {475: 6735}, - {475: 1857}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6736}, - {476: 6737}, + {2598, 2598, 9: 2598, 91: 2598, 99: 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598}, + {56, 56, 9: 6826, 91: 6790, 99: 6795, 6797, 6791, 6796, 6799, 6793, 6789, 6794, 6800, 6798, 6792, 896: 6825}, + {494: 2107, 518: 4396, 758: 6823}, + {494: 2107, 518: 4396, 758: 6821}, + {518: 4396, 525: 2107, 758: 6819}, // 4180 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 476: 4644, 664: 4169, 2785, 2786, 2784, 748: 4643, 831: 4642, 841: 6738}, - {9: 4653, 50: 6739}, - {1869, 1869, 6: 1869, 19: 1869, 84: 1869, 1869, 1869, 1869, 1869, 90: 1869, 477: 1869, 484: 1869, 500: 1869, 884: 6740}, - {2222, 2222, 6: 4899, 19: 4896, 84: 4261, 4903, 4749, 4456, 4750, 90: 4455, 477: 4898, 484: 4902, 500: 4262, 860: 4900, 862: 4897, 873: 4901, 6509, 883: 4895, 887: 6508, 1071: 6741}, - {2229, 2229}, + {518: 4396, 525: 2107, 758: 6817}, + {518: 4396, 525: 2107, 758: 6815}, + {494: 2107, 518: 4396, 758: 6813}, + {494: 2107, 518: 4396, 758: 6811}, + {494: 2107, 518: 4396, 758: 6809}, // 4185 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6743, 2785, 2786, 2784}, - {476: 6744}, - {236: 4932, 244: 4934, 247: 4933, 1148: 6745}, - {50: 6746}, - {475: 6747}, + {494: 2107, 518: 4396, 758: 6807}, + {494: 2107, 518: 4396, 758: 6805}, + {494: 2107, 518: 4396, 758: 6803}, + {494: 2107, 518: 4396, 758: 6801}, + {494: 6802}, // 4190 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6748}, - {476: 6749}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4169, 2785, 2786, 2784, 748: 4170, 812: 6750}, - {9: 4172, 50: 6751}, - {2231, 2231}, + {2584, 2584, 9: 2584, 91: 2584, 99: 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584}, + {494: 6804}, + {2585, 2585, 9: 2585, 91: 2585, 99: 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585}, + {494: 6806}, + {2586, 2586, 9: 2586, 91: 2586, 99: 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586}, // 4195 - {2334, 2334}, - {2359, 2359}, - {2365, 2365, 477: 6756, 674: 6755}, - {156: 6763, 691: 6762}, - {324: 6758, 333: 6757}, + {494: 6808}, + {2587, 2587, 9: 2587, 91: 2587, 99: 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587}, + {494: 6810}, + {2588, 2588, 9: 2588, 91: 2588, 99: 2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588}, + {494: 6812}, // 4200 - {53: 6761}, - {332: 6759}, - {156: 6760}, - {2362, 2362}, - {2363, 2363}, + {2589, 2589, 9: 2589, 91: 2589, 99: 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589}, + {494: 6814}, + {2590, 2590, 9: 2590, 91: 2590, 99: 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590}, + {525: 2823, 755: 2822, 762: 6816}, + {2591, 2591, 9: 2591, 91: 2591, 99: 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591}, // 4205 - {2364, 2364}, - {2361, 2361, 676: 5509, 929: 6764}, - {2360, 2360}, - {2367, 2367}, - {2366, 2366}, + {525: 2823, 755: 2822, 762: 6818}, + {2592, 2592, 9: 2592, 91: 2592, 99: 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592}, + {525: 2823, 755: 2822, 762: 6820}, + {2593, 2593, 9: 2593, 91: 2593, 99: 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593}, + {494: 6822}, // 4210 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6780, 786: 6779}, - {572: 6769}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6770}, - {491: 6772, 652: 6771}, - {922, 922, 3161, 2991, 3026, 2871, 2907, 3028, 2798, 922, 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 477: 922, 594: 5058, 664: 5057, 2785, 2786, 2784, 861: 6777}, + {2594, 2594, 9: 2594, 91: 2594, 99: 2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594}, + {494: 6824}, + {2595, 2595, 9: 2595, 91: 2595, 99: 2595, 2595, 2595, 2595, 2595, 2595, 2595, 2595, 2595, 2595, 2595}, + {2597, 2597, 9: 2597, 91: 2597, 99: 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597}, + {91: 6790, 99: 6795, 6797, 6791, 6796, 6799, 6793, 6789, 6794, 6800, 6798, 6792, 896: 6827}, // 4215 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4780, 2785, 2786, 2784, 791: 6773}, - {9: 4781, 652: 6774}, - {922, 922, 3161, 2991, 3026, 2871, 2907, 3028, 2798, 922, 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 477: 922, 594: 5058, 664: 5057, 2785, 2786, 2784, 861: 6775}, - {2383, 2383, 9: 5060, 477: 5041, 808: 6776}, - {2391, 2391}, + {2596, 2596, 9: 2596, 91: 2596, 99: 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596}, + {3: 6830, 413: 6831, 420: 6829}, + {111: 2152, 154: 2152, 687: 2152}, + {111: 2151, 154: 2151, 687: 2151}, + {111: 2150, 154: 2150, 687: 2150}, // 4220 - {2383, 2383, 9: 5060, 477: 5041, 808: 6778}, - {2394, 2394}, - {2386, 2386, 9: 3950, 168: 6800, 477: 2386, 654: 6799, 986: 6810}, - {1067, 1067, 9: 1067, 103: 6785, 168: 1067, 477: 1067, 491: 6782, 652: 6781, 654: 1067, 657: 6783, 672: 6784}, - {922, 922, 3161, 2991, 3026, 2871, 2907, 3028, 2798, 922, 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 477: 922, 594: 5058, 664: 5057, 2785, 2786, 2784, 861: 6808}, + {111: 2147, 687: 6837, 1375: 6836}, + {518: 6834}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 6835}, + {111: 2148, 687: 2148}, + {111: 6841}, // 4225 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 4780, 2785, 2786, 2784, 791: 6795}, - {262: 6791}, - {262: 6788}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5938, 2785, 2786, 2784, 881: 6786}, - {2383, 2383, 9: 5940, 477: 5041, 808: 6787}, + {398: 6838}, + {154: 6839, 365: 6840}, + {111: 2146}, + {111: 2145}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 6843, 1374: 6842}, // 4230 - {2388, 2388}, - {475: 6789}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5938, 2785, 2786, 2784, 881: 6790}, - {2389, 2389, 9: 5940}, - {475: 6792}, + {492: 6845, 498: 2143, 1373: 6844}, + {492: 2144, 498: 2144}, + {498: 6851}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6847, 2849, 688: 2850, 2848, 1224: 6846}, + {9: 6849, 58: 6848}, // 4235 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5938, 2785, 2786, 2784, 881: 6793}, - {2383, 2383, 9: 5940, 477: 5041, 808: 6794}, - {2390, 2390}, - {2386, 2386, 9: 4781, 103: 6798, 168: 6800, 477: 2386, 652: 6797, 654: 6799, 986: 6796}, - {2383, 2383, 477: 5041, 808: 6807}, + {9: 2141, 58: 2141}, + {498: 2142}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6850, 2849, 688: 2850, 2848}, + {9: 2140, 58: 2140}, + {492: 2663, 2662, 515: 2661, 588: 2660, 665: 2656, 731: 6855, 770: 6853, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 3988, 6854, 6852, 1234: 6856}, // 4240 - {922, 922, 3161, 2991, 3026, 2871, 2907, 3028, 2798, 922, 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 477: 922, 594: 5058, 664: 5057, 2785, 2786, 2784, 861: 6805}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5938, 2785, 2786, 2784, 881: 6803}, - {103: 6802}, - {103: 6801}, - {2384, 2384, 477: 2384}, + {2162, 2162, 493: 2162}, + {2161, 2161, 493: 2161, 500: 852, 509: 852, 511: 852}, + {2160, 2160, 493: 2160}, + {2159, 2159, 493: 2159, 500: 851, 509: 851, 511: 851, 2815, 521: 2816, 523: 2812, 790: 3999, 4000}, + {2139, 2139, 493: 6858, 1371: 6857}, // 4245 - {2385, 2385, 477: 2385}, - {2383, 2383, 9: 5940, 477: 5041, 808: 6804}, - {2387, 2387}, - {2383, 2383, 9: 5060, 477: 5041, 808: 6806}, - {2392, 2392}, + {2156, 2156}, + {150: 6860, 334: 6859}, + {607: 6863}, + {607: 6861}, + {931: 6862}, // 4250 - {2393, 2393}, - {2383, 2383, 9: 5060, 477: 5041, 808: 6809}, - {2395, 2395}, - {2383, 2383, 477: 5041, 808: 6811}, - {2396, 2396}, + {2137, 2137}, + {931: 6864}, + {2138, 2138}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5540, 2849, 688: 2850, 2848, 832: 6866}, + {2245, 2245, 16: 2236, 18: 2236, 21: 2236, 496: 4352, 499: 2236, 514: 2236, 526: 6870, 667: 2236, 803: 6869, 816: 6868, 873: 6872, 958: 6871, 1235: 6867}, // 4255 - {572: 6817}, - {497: 6815}, - {572: 2398}, - {491: 6816, 572: 2399}, - {572: 2397}, + {2255, 2255}, + {16: 3942, 18: 4309, 21: 6880, 499: 6879, 514: 3943, 667: 3941, 798: 6878, 803: 6881}, + {2247, 2247, 16: 2247, 18: 2247, 21: 2247, 496: 2247, 499: 2247, 514: 2247, 526: 2247, 667: 2247}, + {180: 6874}, + {2244, 2244, 16: 2236, 18: 2236, 21: 2236, 496: 4352, 499: 2236, 514: 2236, 526: 6870, 667: 2236, 803: 6869, 816: 6868, 873: 6873}, // 4260 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6818}, - {491: 5503, 566: 936, 652: 936, 663: 936, 864: 6819}, - {566: 6822, 652: 6821, 663: 6823, 1143: 6820}, - {2404, 2404}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6830, 2785, 2786, 2784}, + {2243, 2243, 16: 2243, 18: 2243, 21: 2243, 496: 2243, 499: 2243, 514: 2243, 526: 2243, 667: 2243}, + {2242, 2242, 16: 2242, 18: 2242, 21: 2242, 496: 2242, 499: 2242, 514: 2242, 526: 2242, 667: 2242}, + {203: 6875}, + {525: 2823, 755: 2822, 762: 6876}, + {2567, 2567, 16: 2567, 18: 2567, 21: 2567, 195: 5110, 496: 2567, 499: 2567, 514: 2567, 526: 2567, 667: 2567, 1107: 6877}, // 4265 - {476: 3923, 844: 6825}, - {476: 3923, 844: 6079, 980: 6824}, - {2401, 2401, 9: 6080}, - {510: 6826}, - {476: 3923, 844: 6827}, + {2246, 2246, 16: 2246, 18: 2246, 21: 2246, 496: 2246, 499: 2246, 514: 2246, 526: 2246, 667: 2246}, + {2: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 10: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 59: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 494: 2107, 518: 4396, 549: 2107, 758: 6886}, + {2: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 10: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 59: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 494: 2107, 518: 4396, 549: 2107, 758: 6884}, + {494: 2107, 518: 4396, 758: 6882}, + {2248, 2248, 16: 2248, 18: 2248, 21: 2248, 496: 2248, 499: 2248, 514: 2248, 526: 2248, 667: 2248}, // 4270 - {89: 6828}, - {511: 2759, 737: 4079, 767: 6829}, - {2402, 2402}, - {566: 6822, 663: 6823, 1143: 6831}, - {2403, 2403}, + {494: 4425, 1067: 6883}, + {2249, 2249, 16: 2249, 18: 2249, 21: 2249, 496: 2249, 499: 2249, 514: 2249, 526: 2249, 667: 2249}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 549: 3595, 685: 3597, 2849, 688: 2850, 2848, 760: 3594, 894: 6885}, + {2250, 2250, 16: 2250, 18: 2250, 21: 2250, 496: 2250, 499: 2250, 514: 2250, 526: 2250, 667: 2250}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 549: 3867, 685: 3597, 2849, 688: 2850, 2848, 760: 3866, 830: 6887}, // 4275 - {680: 6846}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6842, 786: 6841}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5434, 2785, 2786, 2784, 813: 6835}, - {2407, 2407, 653: 6837, 680: 6836, 1056: 6838}, - {478: 6840}, + {2251, 2251, 16: 2251, 18: 2251, 21: 2251, 496: 2251, 499: 2251, 514: 2251, 526: 2251, 667: 2251}, + {2: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 10: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 59: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 583: 4974, 805: 6889}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6890, 2849, 688: 2850, 2848}, + {92: 5007, 491: 1899, 501: 5006, 880: 6892, 1267: 6891}, + {491: 6893}, // 4280 - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6839, 2785, 2786, 2784}, - {2405, 2405}, - {2406, 2406}, - {2409, 2409}, - {9: 3950, 680: 6844}, + {491: 1898}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 6894}, + {492: 6895}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 492: 4743, 685: 4255, 2849, 688: 2850, 2848, 766: 4742, 849: 4741, 859: 6896}, + {9: 4752, 58: 6897}, // 4285 - {2407, 2407, 9: 1067, 653: 6837, 680: 1067, 1056: 6843}, - {2408, 2408}, - {478: 6845}, - {2410, 2410}, - {478: 6847}, + {1910, 1910, 6: 1910, 19: 1910, 90: 1910, 92: 1910, 1910, 1910, 1910, 1910, 493: 1910, 501: 1910, 517: 1910, 903: 6898}, + {2266, 2266, 6: 5003, 19: 5000, 90: 4347, 92: 5007, 4853, 4555, 4854, 4554, 493: 5002, 501: 5006, 517: 4348, 878: 5004, 880: 5001, 891: 5005, 6630, 902: 4999, 906: 6629, 1094: 6899}, + {2273, 2273}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6901, 2849, 688: 2850, 2848}, + {492: 6902}, // 4290 - {2411, 2411}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 663: 6849, 3947, 2785, 2786, 2784, 740: 6850}, - {268: 6852}, - {2413, 2413, 511: 2759, 737: 4079, 767: 6851}, - {2412, 2412}, + {247: 5036, 255: 5038, 258: 5037, 1173: 6903}, + {58: 6904}, + {491: 6905}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 6906}, + {492: 6907}, // 4295 - {511: 2759, 737: 4079, 767: 6853}, - {2414, 2414}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6865, 1158: 6864, 1335: 6863}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 6858, 1164: 6857, 1340: 6856}, - {2418, 2418, 9: 6861}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4255, 2849, 688: 2850, 2848, 766: 4256, 831: 6908}, + {9: 4258, 58: 6909}, + {2275, 2275}, + {2382, 2382}, + {2407, 2407}, // 4300 - {2417, 2417, 9: 2417}, - {653: 6859}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 6860}, - {2415, 2415, 9: 2415}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 6858, 1164: 6862}, + {2413, 2413, 493: 6914, 692: 6913}, + {165: 6921, 709: 6920}, + {335: 6916, 344: 6915}, + {59: 6919}, + {343: 6917}, // 4305 - {2416, 2416, 9: 2416}, - {2422, 2422, 9: 6868}, - {2421, 2421, 9: 2421}, - {653: 6866}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6867}, + {165: 6918}, + {2410, 2410}, + {2411, 2411}, + {2412, 2412}, + {2409, 2409, 694: 5615, 949: 6922}, // 4310 - {2419, 2419, 9: 2419}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6865, 1158: 6869}, - {2420, 2420, 9: 2420}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 2193, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 482: 4266, 487: 2193, 508: 2193, 6712, 650: 2193, 664: 5434, 2785, 2786, 2784, 785: 6711, 797: 6710, 813: 6920, 855: 6714, 937: 6921}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 6910, 2785, 2786, 2784}, + {2408, 2408}, + {2415, 2415}, + {2414, 2414}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 6938, 804: 6937}, + {588: 6927}, // 4315 - {2: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 10: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 51: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 478: 1877, 567: 4478, 573: 1877, 784: 6898}, - {282: 6892, 1244: 6891}, - {167: 6887}, - {2: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 10: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 51: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 567: 4478, 784: 6876}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 3947, 2785, 2786, 2784, 740: 6877}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 6928}, + {507: 6930, 668: 6929}, + {945, 945, 3234, 3056, 3092, 2935, 2972, 3094, 2862, 945, 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 493: 945, 613: 5162, 685: 5161, 2849, 688: 2850, 2848, 879: 6935}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4884, 2849, 688: 2850, 2848, 809: 6931}, + {9: 4885, 668: 6932}, // 4320 - {73: 6538, 6535, 6541, 6542, 6543, 6536, 6534, 6544, 6540, 6537, 6881, 658: 6539, 918: 6880, 992: 6879, 1178: 6878}, - {27, 27, 73: 6538, 6535, 6541, 6542, 6543, 6536, 6534, 6544, 6540, 6537, 6881, 658: 6539, 918: 6880, 992: 6886}, - {26, 26, 73: 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 658: 26}, - {24, 24, 73: 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 658: 24}, - {23, 23, 73: 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 477: 6883, 488: 2064, 2064, 502: 4307, 511: 2064, 658: 23, 741: 6882}, + {945, 945, 3234, 3056, 3092, 2935, 2972, 3094, 2862, 945, 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 493: 945, 613: 5162, 685: 5161, 2849, 688: 2850, 2848, 879: 6933}, + {2431, 2431, 9: 5164, 493: 5145, 826: 6934}, + {2439, 2439}, + {2431, 2431, 9: 5164, 493: 5145, 826: 6936}, + {2442, 2442}, // 4325 - {488: 4082, 4083, 511: 2759, 737: 4079, 767: 4081, 819: 6885}, - {488: 4082, 4083, 511: 2759, 737: 4079, 767: 4081, 819: 6884}, - {21, 21, 73: 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 658: 21}, - {22, 22, 73: 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 658: 22}, - {25, 25, 73: 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 658: 25}, + {2434, 2434, 9: 4032, 178: 6958, 493: 2434, 671: 6957, 1006: 6968}, + {1090, 1090, 9: 1090, 110: 6943, 178: 1090, 493: 1090, 507: 6940, 668: 6939, 671: 1090, 674: 6941, 690: 6942}, + {945, 945, 3234, 3056, 3092, 2935, 2972, 3094, 2862, 945, 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 493: 945, 613: 5162, 685: 5161, 2849, 688: 2850, 2848, 879: 6966}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4884, 2849, 688: 2850, 2848, 809: 6953}, + {273: 6949}, // 4330 - {2: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 10: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 51: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 567: 4478, 784: 6888}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 3405, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 664: 5030, 2785, 2786, 2784, 890: 6889}, - {89: 6635, 93: 6640, 6642, 6636, 6641, 6644, 6638, 6634, 6639, 6643, 6637, 878: 6632, 1112: 6890}, - {53, 53, 9: 6668, 89: 6635, 93: 6640, 6642, 6636, 6641, 6644, 6638, 6634, 6639, 6643, 6637, 878: 6667}, - {249, 249}, + {273: 6946}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6047, 2849, 688: 2850, 2848, 900: 6944}, + {2431, 2431, 9: 6049, 493: 5145, 826: 6945}, + {2436, 2436}, + {491: 6947}, // 4335 - {403: 6893}, - {248, 248, 73: 6894}, - {157: 6895}, - {475: 6896}, - {211: 6897}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6047, 2849, 688: 2850, 2848, 900: 6948}, + {2437, 2437, 9: 6049}, + {491: 6950}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6047, 2849, 688: 2850, 2848, 900: 6951}, + {2431, 2431, 9: 6049, 493: 5145, 826: 6952}, // 4340 - {247, 247}, - {2: 3161, 2991, 3026, 2871, 2907, 3028, 2798, 10: 2844, 2799, 2930, 3045, 3038, 3398, 3393, 2910, 3196, 2912, 2886, 2830, 2833, 2822, 2855, 2914, 2915, 3022, 2909, 3046, 3152, 3151, 2797, 2908, 2911, 2922, 2862, 2866, 2918, 3031, 2877, 2958, 2795, 2796, 2957, 3030, 2794, 3043, 2790, 3003, 51: 3114, 2876, 2879, 3097, 3094, 3086, 3098, 3101, 3102, 3099, 3103, 3104, 3100, 3093, 3105, 3088, 3089, 3092, 3095, 3096, 3106, 3401, 2944, 2880, 3073, 3072, 3074, 3069, 3068, 3075, 3070, 3071, 2872, 2988, 3058, 3122, 3056, 3123, 3165, 3057, 2884, 2952, 3248, 3252, 3240, 3251, 3253, 3243, 3249, 3250, 3254, 3247, 2813, 2947, 3402, 3395, 3391, 2807, 3414, 3055, 3044, 2842, 3397, 3412, 3413, 3411, 3407, 3047, 3048, 3049, 3050, 3051, 3052, 3054, 3403, 2885, 2881, 2973, 2997, 3390, 2999, 2977, 2978, 2979, 2980, 2968, 2815, 2998, 3125, 3040, 2857, 2969, 3119, 2949, 2989, 2852, 2905, 3064, 2926, 2816, 2821, 2832, 2847, 2856, 3059, 2929, 2874, 2971, 2888, 2896, 2802, 2948, 2831, 2851, 3228, 2861, 3108, 3200, 2985, 3159, 2894, 6899, 2924, 3198, 2865, 2873, 2895, 3109, 2806, 2824, 3394, 2845, 2837, 2923, 2858, 3062, 3078, 3006, 3115, 3116, 3080, 2943, 3061, 3117, 3036, 3195, 3145, 3076, 2875, 2976, 3148, 3399, 3034, 2933, 2791, 2817, 2938, 2828, 2829, 2940, 2836, 2846, 2849, 3087, 2899, 3001, 3197, 2967, 2936, 2996, 3039, 2925, 3147, 2883, 3158, 3400, 3035, 3126, 3084, 3127, 2945, 3007, 2805, 3176, 3128, 3131, 2811, 3110, 3132, 3410, 2818, 3009, 3178, 3134, 3005, 2826, 3136, 3018, 3042, 3029, 2827, 3182, 3138, 3168, 3037, 2840, 3067, 3235, 3396, 2850, 2853, 3019, 3065, 3187, 3060, 3188, 3013, 3140, 3139, 3063, 3120, 2950, 3415, 3141, 3142, 2954, 3011, 3143, 3118, 2869, 2870, 2984, 3090, 2986, 3201, 3144, 3032, 3033, 2974, 2878, 3015, 2793, 3210, 3014, 3217, 3218, 3219, 3220, 3222, 3221, 3223, 3224, 3225, 3160, 2891, 3016, 3245, 3244, 2897, 2787, 2788, 3066, 3083, 2800, 3085, 3111, 2792, 2803, 2804, 3129, 3130, 2808, 2995, 2809, 2810, 2982, 3121, 3406, 3133, 2927, 2814, 2819, 2820, 3135, 3137, 2939, 3183, 2941, 2834, 2835, 2951, 2839, 3002, 3229, 2841, 3012, 2946, 2920, 3155, 3020, 3041, 3004, 2935, 3189, 2990, 3008, 3053, 2932, 3021, 2913, 3077, 2916, 2917, 3416, 2953, 2860, 2882, 3162, 3230, 2863, 3024, 3027, 3079, 3113, 3163, 3124, 2963, 2964, 2970, 3193, 3166, 3194, 3167, 3091, 3169, 2994, 2931, 3146, 3025, 2983, 3153, 3150, 3154, 3149, 3202, 3010, 3112, 3023, 3214, 3157, 2992, 2887, 3238, 3226, 2892, 2921, 2928, 2993, 3164, 3000, 3419, 2902, 3171, 3172, 3392, 3173, 3174, 3175, 3231, 3177, 3179, 3180, 3181, 2838, 2987, 3232, 2956, 3184, 2843, 3239, 3420, 3186, 3425, 3424, 3417, 3241, 3242, 3191, 3190, 2859, 3192, 3199, 2962, 2867, 2868, 3107, 2981, 3408, 3409, 3418, 2975, 2903, 3017, 2934, 2937, 3233, 3206, 3207, 3208, 3209, 3234, 3421, 3204, 3205, 2955, 3156, 3422, 3423, 3227, 3211, 3212, 3213, 3246, 3404, 478: 3516, 573: 5333, 664: 3517, 2785, 2786, 2784, 742: 5332, 781: 5350, 895: 5351, 927: 6900}, - {1728, 1728, 6: 1728, 9: 1728, 15: 1728, 48: 1728, 1728, 147: 1728, 476: 6905, 1728, 571: 1728, 669: 1728, 1728}, - {235, 235, 6: 235, 9: 5353, 15: 235, 48: 235, 235, 477: 235, 669: 5397, 965: 5396, 6901}, - {243, 243, 6: 243, 15: 243, 48: 243, 243, 477: 6580, 1013: 6902}, + {2438, 2438}, + {2434, 2434, 9: 4885, 110: 6956, 178: 6958, 493: 2434, 668: 6955, 671: 6957, 1006: 6954}, + {2431, 2431, 493: 5145, 826: 6965}, + {945, 945, 3234, 3056, 3092, 2935, 2972, 3094, 2862, 945, 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 493: 945, 613: 5162, 685: 5161, 2849, 688: 2850, 2848, 879: 6963}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6047, 2849, 688: 2850, 2848, 900: 6961}, // 4345 - {218, 218, 6: 218, 15: 6597, 48: 218, 6595, 958: 6596, 6594, 1110: 6593, 6903}, - {221, 221, 6: 6609, 48: 6610, 1010: 6904}, - {251, 251}, - {50: 6906}, - {147: 6907}, + {110: 6960}, + {110: 6959}, + {2432, 2432, 493: 2432}, + {2433, 2433, 493: 2433}, + {2431, 2431, 9: 6049, 493: 5145, 826: 6962}, // 4350 - {663: 6908}, - {478: 5366, 897: 6909}, - {250, 250}, - {1970, 1970, 17: 1970, 51: 1970, 53: 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 143: 6619, 475: 1970, 507: 6618, 656: 1970, 1046: 6911}, - {2027, 2027, 17: 2027, 51: 2027, 53: 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 475: 2027, 656: 2027, 902: 6912}, + {2435, 2435}, + {2431, 2431, 9: 5164, 493: 5145, 826: 6964}, + {2440, 2440}, + {2441, 2441}, + {2431, 2431, 9: 5164, 493: 5145, 826: 6967}, // 4355 - {1964, 1964, 17: 6332, 51: 6308, 53: 6328, 6321, 6311, 6307, 6315, 6319, 6331, 6314, 6320, 6318, 6316, 6329, 6322, 6310, 6330, 6309, 6312, 6313, 6317, 6914, 475: 6323, 656: 6333, 898: 6325, 6324, 6327, 6306, 903: 6326, 1238: 6913}, - {1979, 1979}, - {183: 6916, 654: 6915}, - {577, 577, 572: 6279, 974: 6918}, - {577, 577, 572: 6279, 974: 6917}, + {2443, 2443}, + {2431, 2431, 493: 5145, 826: 6969}, + {2444, 2444}, + {588: 6975}, + {513: 6973}, // 4360 - {1962, 1962}, - {1963, 1963}, - {16: 1434, 18: 1434, 21: 1434, 167: 5023, 482: 1434, 487: 1434, 508: 1434, 1434, 650: 1434}, - {16: 2193, 18: 2193, 21: 2193, 482: 4266, 487: 2193, 508: 2193, 6712, 650: 2193, 785: 6711, 797: 6710, 855: 6714, 937: 6922}, - {2212, 2212, 16: 2193, 18: 2193, 21: 2193, 482: 4266, 487: 2193, 508: 2193, 6712, 650: 2193, 785: 6711, 797: 6710, 855: 6715}, + {588: 2446}, + {507: 6974, 588: 2447}, + {588: 2445}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 6976}, + {507: 5609, 582: 959, 668: 959, 681: 959, 882: 6977}, // 4365 - {2213, 2213, 16: 2193, 18: 2193, 21: 2193, 482: 4266, 487: 2193, 508: 2193, 6712, 650: 2193, 785: 6711, 797: 6710, 855: 6715}, - {2062, 2062, 2564, 51: 2588, 72: 2711, 74: 2567, 83: 2599, 150: 2569, 157: 2597, 2582, 161: 2566, 175: 2593, 212: 2618, 217: 2724, 220: 2562, 228: 2617, 2584, 2720, 2568, 246: 2596, 251: 2572, 256: 2594, 258: 2563, 261: 2600, 279: 2586, 283: 2585, 290: 2598, 293: 2587, 305: 2577, 476: 2608, 2607, 498: 2606, 500: 2719, 507: 2592, 509: 2616, 528: 2714, 532: 2580, 570: 2591, 572: 2605, 649: 2601, 652: 2723, 656: 2565, 2713, 668: 2560, 672: 2571, 677: 2570, 683: 2615, 690: 2561, 713: 2612, 743: 2573, 752: 2614, 2602, 2603, 2604, 2613, 760: 2611, 2610, 2609, 2576, 2691, 2690, 770: 2712, 2574, 777: 2670, 2702, 780: 2683, 783: 2575, 788: 2634, 804: 2583, 810: 2622, 814: 2717, 849: 2628, 2629, 854: 2632, 858: 2715, 863: 2673, 865: 2685, 867: 2680, 2689, 2692, 2589, 936: 2641, 940: 2578, 978: 2718, 985: 2620, 987: 2621, 2624, 2625, 991: 2627, 993: 2626, 995: 2623, 997: 2630, 2631, 1000: 2590, 2669, 1003: 2637, 1014: 2645, 2638, 2639, 2640, 2646, 2644, 2647, 2648, 1023: 2643, 2642, 1026: 2633, 2595, 2579, 2649, 2661, 2650, 2651, 2652, 2654, 2658, 2655, 2659, 2660, 2653, 2657, 2656, 1043: 2619, 1047: 2635, 1049: 2636, 2581, 1054: 2665, 2663, 1057: 2664, 2662, 1061: 2667, 2668, 2666, 1067: 2708, 2671, 1075: 2722, 2721, 2672, 1082: 2674, 1085: 2675, 2705, 1088: 2709, 1113: 2677, 2678, 1116: 2679, 1118: 2684, 1121: 2681, 2682, 1124: 2707, 2686, 2716, 2688, 2687, 1133: 2693, 1135: 2695, 2694, 2698, 1139: 2699, 1141: 2706, 1144: 2696, 6924, 1149: 2697, 1160: 2700, 2701, 2676, 2704, 1165: 2703}, - {454, 454}, + {582: 6980, 668: 6979, 681: 6981, 1168: 6978}, + {2452, 2452}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6988, 2849, 688: 2850, 2848}, + {492: 4005, 862: 6983}, + {492: 4005, 862: 6188, 1000: 6982}, + // 4370 + {2449, 2449, 9: 6189}, + {527: 6984}, + {492: 4005, 862: 6985}, + {91: 6986}, + {525: 2823, 755: 4161, 784: 6987}, + // 4375 + {2450, 2450}, + {582: 6980, 681: 6981, 1168: 6989}, + {2451, 2451}, + {698: 7004}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 7000, 804: 6999}, + // 4380 + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5540, 2849, 688: 2850, 2848, 832: 6993}, + {2455, 2455, 670: 6995, 698: 6994, 1079: 6996}, + {494: 6998}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6997, 2849, 688: 2850, 2848}, + {2453, 2453}, + // 4385 + {2454, 2454}, + {2457, 2457}, + {9: 4032, 698: 7002}, + {2455, 2455, 9: 1090, 670: 6995, 698: 1090, 1079: 7001}, + {2456, 2456}, + // 4390 + {494: 7003}, + {2458, 2458}, + {494: 7005}, + {2459, 2459}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 681: 7007, 685: 4029, 2849, 688: 2850, 2848, 759: 7008}, + // 4395 + {279: 7010}, + {2461, 2461, 525: 2823, 755: 4161, 784: 7009}, + {2460, 2460}, + {525: 2823, 755: 4161, 784: 7011}, + {2462, 2462}, + // 4400 + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 7023, 1183: 7022, 1360: 7021}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 7016, 1189: 7015, 1365: 7014}, + {2466, 2466, 9: 7019}, + {2465, 2465, 9: 2465}, + {670: 7017}, + // 4405 + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 7018}, + {2463, 2463, 9: 2463}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 7016, 1189: 7020}, + {2464, 2464, 9: 2464}, + {2470, 2470, 9: 7026}, + // 4410 + {2469, 2469, 9: 2469}, + {670: 7024}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 7025}, + {2467, 2467, 9: 2467}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 7023, 1183: 7027}, + // 4415 + {2468, 2468, 9: 2468}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 2236, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 496: 4352, 499: 2236, 514: 2236, 526: 6870, 667: 2236, 685: 5540, 2849, 688: 2850, 2848, 803: 6869, 816: 6868, 832: 7084, 873: 6872, 958: 7085}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 7074, 2849, 688: 2850, 2848}, + {2: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 10: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 59: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 494: 1918, 583: 4577, 590: 1918, 800: 7061}, + {293: 7055, 1269: 7054}, + // 4420 + {532: 7050}, + {177: 7046}, + {2: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 10: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 59: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 583: 4577, 800: 7035}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 4029, 2849, 688: 2850, 2848, 759: 7036}, + {79: 6660, 6657, 6663, 6664, 6665, 6658, 6656, 6666, 6662, 6659, 7040, 675: 6661, 938: 7039, 1013: 7038, 1203: 7037}, + // 4425 + {29, 29, 79: 6660, 6657, 6663, 6664, 6665, 6658, 6656, 6666, 6662, 6659, 7040, 675: 6661, 938: 7039, 1013: 7045}, + {28, 28, 79: 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 675: 28}, + {26, 26, 79: 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 675: 26}, + {25, 25, 79: 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 493: 7042, 504: 2107, 2107, 518: 4396, 525: 2107, 675: 25, 758: 7041}, + {504: 4164, 4165, 525: 2823, 755: 4161, 784: 4163, 838: 7044}, + // 4430 + {504: 4164, 4165, 525: 2823, 755: 4161, 784: 4163, 838: 7043}, + {23, 23, 79: 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 675: 23}, + {24, 24, 79: 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 675: 24}, + {27, 27, 79: 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 675: 27}, + {2: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 10: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 59: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 583: 4577, 800: 7047}, + // 4435 + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 5134, 2849, 688: 2850, 2848, 909: 7048}, + {91: 6790, 99: 6795, 6797, 6791, 6796, 6799, 6793, 6789, 6794, 6800, 6798, 6792, 896: 6787, 1135: 7049}, + {55, 55, 9: 6826, 91: 6790, 99: 6795, 6797, 6791, 6796, 6799, 6793, 6789, 6794, 6800, 6798, 6792, 896: 6825}, + {2: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 10: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 59: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 583: 4577, 800: 7051}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 3485, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 685: 6374, 2849, 688: 2850, 2848, 911: 7052}, + // 4440 + {134: 6693, 6692, 897: 6690, 1148: 7053}, + {58, 58, 9: 6697, 134: 6693, 6692, 897: 6696}, + {265, 265}, + {415: 7056}, + {264, 264, 79: 7057}, + // 4445 + {166: 7058}, + {491: 7059}, + {222: 7060}, + {263, 263}, + {2: 3234, 3056, 3092, 2935, 2972, 3094, 2862, 10: 2908, 2863, 2995, 3111, 3104, 3478, 3473, 2975, 3270, 2977, 2951, 2894, 2897, 2886, 2919, 2979, 2980, 3088, 2974, 3112, 3225, 3224, 3192, 2861, 2973, 2976, 2987, 2926, 2930, 2983, 3097, 2942, 3023, 2859, 2860, 3022, 3096, 2858, 3109, 3193, 3194, 2936, 2854, 3068, 3195, 3196, 3180, 2941, 59: 2944, 3163, 3160, 3152, 3164, 3167, 3168, 3165, 3169, 3170, 3166, 3159, 3171, 3154, 3155, 3158, 3161, 3162, 3172, 3481, 3009, 2945, 3139, 3138, 3140, 3135, 3134, 3141, 3136, 3137, 2937, 3053, 3238, 3124, 3188, 3122, 3189, 3123, 2949, 3017, 3322, 3327, 3314, 3326, 3328, 3317, 3323, 3324, 3325, 3329, 3321, 2877, 3012, 3475, 3482, 3494, 3121, 3471, 2871, 3477, 3492, 3493, 3491, 3487, 3113, 3114, 3115, 3116, 3117, 3118, 3120, 3110, 3483, 2906, 2950, 3334, 3333, 2946, 3038, 3062, 3470, 3064, 3042, 3043, 3044, 3045, 3033, 2879, 3063, 3191, 3106, 2921, 3034, 3185, 3014, 3054, 2916, 2970, 3130, 2991, 2880, 2885, 2896, 2911, 2920, 3125, 2994, 2939, 3036, 2953, 2959, 2961, 2866, 3013, 2895, 2915, 3302, 2925, 3174, 3274, 3050, 3232, 7062, 2989, 3272, 2929, 2938, 2960, 3175, 2870, 2888, 3474, 2909, 2901, 2988, 2922, 3128, 3144, 3072, 3181, 3182, 3146, 3271, 3008, 3127, 3183, 3102, 3269, 3218, 3142, 2940, 3041, 3221, 3479, 3100, 2998, 2855, 2881, 3197, 3003, 2892, 2893, 3005, 2900, 2910, 2913, 3086, 3153, 2964, 3032, 3001, 3061, 3105, 2990, 3220, 2948, 3231, 3480, 3101, 3199, 3150, 3200, 3010, 3073, 2869, 3249, 3201, 2872, 3204, 2875, 3176, 3205, 3490, 2882, 3075, 3251, 3207, 3070, 2890, 3209, 3084, 3108, 3095, 2891, 3256, 3211, 3241, 3103, 2904, 3133, 3309, 3476, 2914, 2917, 3085, 3131, 3261, 3126, 3262, 3079, 3213, 3212, 3129, 3186, 3015, 3495, 3214, 3215, 3019, 3077, 3216, 3184, 2933, 2934, 3049, 3156, 3051, 3275, 3217, 3098, 3099, 3039, 2943, 3081, 2857, 3284, 3080, 3330, 3291, 3292, 3293, 3294, 3296, 3295, 3297, 3298, 3299, 3233, 2956, 3082, 3319, 3318, 2962, 2851, 2852, 3132, 3149, 2864, 3151, 3177, 2856, 2867, 2868, 3202, 3203, 3060, 2873, 2874, 3047, 3187, 3486, 3206, 2992, 2878, 2883, 2884, 3208, 3210, 3004, 3257, 3006, 2898, 2899, 3016, 2903, 3067, 3303, 2905, 3078, 3011, 2985, 3228, 3107, 3069, 3000, 3263, 3055, 3074, 3119, 2997, 3087, 2978, 3143, 2981, 2982, 3066, 3496, 3018, 2924, 2947, 3235, 3304, 2927, 3090, 3093, 3145, 3179, 3236, 3190, 3028, 3029, 3035, 3267, 3239, 3268, 3240, 3157, 3198, 3242, 3059, 2996, 3219, 3091, 3048, 3226, 3223, 3227, 3222, 3276, 3076, 3178, 3089, 3288, 3230, 3057, 2952, 3312, 3300, 2957, 2986, 2993, 3058, 3237, 3065, 3499, 2967, 3244, 3245, 3472, 3246, 3247, 3248, 3305, 3250, 3253, 3252, 3254, 3255, 2902, 3052, 3306, 3021, 3258, 2907, 3313, 3500, 3260, 3331, 3332, 3505, 3504, 3497, 3315, 3316, 3265, 3071, 3264, 2923, 3266, 3273, 3027, 2931, 2932, 3173, 3046, 3488, 3489, 3498, 3040, 2968, 3083, 2999, 3002, 3307, 3280, 3281, 3282, 3283, 3308, 3501, 3278, 3279, 3020, 3229, 3502, 3503, 3301, 3285, 3286, 3287, 3320, 3484, 494: 3596, 590: 5439, 685: 3597, 2849, 688: 2850, 2848, 760: 5438, 799: 5456, 915: 5457, 947: 7063}, + // 4450 + {1768, 1768, 6: 1768, 9: 1768, 15: 1768, 51: 1768, 1768, 1768, 1768, 1768, 156: 1768, 492: 7069, 1768, 589: 1768, 683: 1768, 1768}, + {251, 251, 6: 251, 9: 5459, 15: 251, 51: 251, 251, 251, 251, 251, 493: 251, 683: 5503, 985: 5502, 7064}, + {259, 259, 6: 259, 15: 259, 51: 259, 259, 259, 259, 259, 493: 6720, 1034: 7065}, + {232, 232, 6: 232, 15: 6736, 51: 232, 232, 6735, 6737, 6738, 979: 6734, 1133: 6733, 7066}, + {237, 237, 6: 6760, 51: 237, 6761, 1031: 7067}, + // 4455 + {234, 234, 51: 6765, 1147: 7068}, + {267, 267}, + {58: 7070}, + {156: 7071}, + {681: 7072}, + // 4460 + {494: 5472, 917: 7073}, + {266, 266}, + {2012, 2012, 17: 2012, 56: 2012, 59: 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 152: 6774, 491: 2012, 522: 6773, 673: 2012, 1069: 7075}, + {2069, 2069, 17: 2069, 56: 2069, 59: 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 491: 2069, 673: 2069, 922: 7076}, + {2006, 2006, 17: 6445, 56: 6421, 59: 6441, 6434, 6424, 6420, 6428, 6432, 6444, 6427, 6433, 6431, 6429, 6442, 6435, 6423, 6443, 6422, 6425, 6426, 6430, 7078, 491: 6436, 673: 6446, 918: 6438, 6437, 6440, 6419, 923: 6439, 1263: 7077}, + // 4465 + {2021, 2021}, + {192: 7080, 671: 7079}, + {599, 599, 588: 6392, 994: 7082}, + {599, 599, 588: 6392, 994: 7081}, + {2004, 2004}, + // 4470 + {2005, 2005}, + {16: 1465, 18: 1465, 21: 1465, 177: 5127, 496: 1465, 499: 1465, 514: 1465, 526: 1465, 667: 1465}, + {16: 2236, 18: 2236, 21: 2236, 496: 4352, 499: 2236, 514: 2236, 526: 6870, 667: 2236, 803: 6869, 816: 6868, 873: 6872, 958: 7086}, + {2256, 2256, 16: 2236, 18: 2236, 21: 2236, 496: 4352, 499: 2236, 514: 2236, 526: 6870, 667: 2236, 803: 6869, 816: 6868, 873: 6873}, + {2257, 2257, 16: 2236, 18: 2236, 21: 2236, 496: 4352, 499: 2236, 514: 2236, 526: 6870, 667: 2236, 803: 6869, 816: 6868, 873: 6873}, + // 4475 + {2105, 2105, 2619, 56: 2643, 78: 2769, 80: 2622, 89: 2654, 159: 2624, 166: 2652, 2637, 171: 2621, 184: 2648, 201: 2782, 223: 2673, 230: 2617, 238: 2672, 2639, 2778, 2623, 257: 2651, 262: 2627, 267: 2649, 269: 2618, 272: 2655, 290: 2641, 294: 2640, 301: 2653, 304: 2642, 317: 2632, 492: 2663, 2662, 515: 2661, 517: 2777, 522: 2647, 526: 2671, 544: 2772, 548: 2635, 587: 2646, 2660, 665: 2656, 668: 2781, 673: 2620, 2771, 682: 2615, 690: 2626, 695: 2625, 701: 2670, 708: 2616, 731: 2667, 761: 2628, 770: 2669, 2657, 2658, 2659, 2668, 778: 2666, 2665, 2664, 2631, 2749, 2748, 788: 2770, 2629, 795: 2728, 2741, 2760, 802: 2630, 807: 2690, 822: 2638, 829: 2677, 833: 2775, 867: 2684, 2685, 872: 2688, 876: 2773, 881: 2731, 883: 2743, 885: 2738, 2747, 2750, 2644, 956: 2697, 961: 2633, 998: 2776, 1005: 2675, 1007: 2676, 2679, 2680, 1011: 2682, 2683, 1014: 2681, 1016: 2678, 1018: 2686, 2687, 1021: 2645, 2727, 1024: 2693, 1035: 2701, 2694, 2695, 2696, 2702, 2703, 2700, 2704, 2705, 1045: 2699, 2698, 1048: 2689, 2650, 2634, 2706, 2719, 2707, 2708, 2709, 2711, 2715, 2716, 2712, 2717, 2718, 2710, 2714, 2713, 1066: 2674, 1070: 2691, 1072: 2692, 2636, 1077: 2723, 2721, 1080: 2722, 2720, 1084: 2725, 2726, 2724, 1090: 2766, 2729, 1098: 2780, 2779, 2730, 1105: 2732, 1108: 2733, 2763, 1111: 2767, 1136: 2735, 2736, 1139: 2737, 1141: 2742, 1144: 2739, 2740, 1149: 2765, 2744, 2774, 2746, 2745, 1158: 2751, 1160: 2753, 2752, 2756, 1164: 2757, 1166: 2764, 1169: 2754, 7088, 1174: 2755, 1185: 2758, 2759, 2734, 2762, 1190: 2761}, + {473, 473}, } ) @@ -11484,7 +11739,7 @@ func yylex1(yylex yyLexer, lval *yySymType) (n int) { } func yyParse(yylex yyLexer, parser *Parser) int { - const yyError = 1372 + const yyError = 1397 yyEx, _ := yylex.(yyLexerEx) var yyn int @@ -11716,25 +11971,55 @@ yynewstate: } case 9: { - parser.yyVAL.item = []*ast.PlacementOption{yyS[yypt-0].item.(*ast.PlacementOption)} + parser.yyVAL.item = []*ast.ResourceGroupOption{yyS[yypt-0].item.(*ast.ResourceGroupOption)} } case 10: { - parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.PlacementOption), yyS[yypt-0].item.(*ast.PlacementOption)) + if yyS[yypt-1].item.([]*ast.ResourceGroupOption)[0].Tp == yyS[yypt-0].item.(*ast.ResourceGroupOption).Tp || + (len(yyS[yypt-1].item.([]*ast.ResourceGroupOption)) > 1 && yyS[yypt-1].item.([]*ast.ResourceGroupOption)[1].Tp == yyS[yypt-0].item.(*ast.ResourceGroupOption).Tp) { + yylex.AppendError(yylex.Errorf("Dupliated options specified")) + return 1 + } + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.ResourceGroupOption), yyS[yypt-0].item.(*ast.ResourceGroupOption)) } case 11: { - parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.PlacementOption), yyS[yypt-0].item.(*ast.PlacementOption)) + if yyS[yypt-2].item.([]*ast.ResourceGroupOption)[0].Tp == yyS[yypt-0].item.(*ast.ResourceGroupOption).Tp || + (len(yyS[yypt-2].item.([]*ast.ResourceGroupOption)) > 1 && yyS[yypt-2].item.([]*ast.ResourceGroupOption)[1].Tp == yyS[yypt-0].item.(*ast.ResourceGroupOption).Tp) { + yylex.AppendError(yylex.Errorf("Dupliated options specified")) + return 1 + } + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ResourceGroupOption), yyS[yypt-0].item.(*ast.ResourceGroupOption)) } case 12: { - parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionPrimaryRegion, StrValue: yyS[yypt-0].ident} + parser.yyVAL.item = &ast.ResourceGroupOption{Tp: ast.ResourceRURate, UintValue: yyS[yypt-0].item.(uint64)} } case 13: { - parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionRegions, StrValue: yyS[yypt-0].ident} + parser.yyVAL.item = &ast.ResourceGroupOption{Tp: ast.ResourceBurstableOpiton, BoolValue: true} } case 14: + { + parser.yyVAL.item = []*ast.PlacementOption{yyS[yypt-0].item.(*ast.PlacementOption)} + } + case 15: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.PlacementOption), yyS[yypt-0].item.(*ast.PlacementOption)) + } + case 16: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.PlacementOption), yyS[yypt-0].item.(*ast.PlacementOption)) + } + case 17: + { + parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionPrimaryRegion, StrValue: yyS[yypt-0].ident} + } + case 18: + { + parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionRegions, StrValue: yyS[yypt-0].ident} + } + case 19: { cnt := yyS[yypt-0].item.(uint64) if cnt == 0 { @@ -11743,71 +12028,75 @@ yynewstate: } parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionFollowerCount, UintValue: cnt} } - case 15: + case 20: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionVoterCount, UintValue: yyS[yypt-0].item.(uint64)} } - case 16: + case 21: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionLearnerCount, UintValue: yyS[yypt-0].item.(uint64)} } - case 17: + case 22: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionSchedule, StrValue: yyS[yypt-0].ident} } - case 18: + case 23: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionConstraints, StrValue: yyS[yypt-0].ident} } - case 19: + case 24: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionLeaderConstraints, StrValue: yyS[yypt-0].ident} } - case 20: + case 25: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionFollowerConstraints, StrValue: yyS[yypt-0].ident} } - case 21: + case 26: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionVoterConstraints, StrValue: yyS[yypt-0].ident} } - case 22: + case 27: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionLearnerConstraints, StrValue: yyS[yypt-0].ident} } - case 23: + case 28: + { + parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionSurvivalPreferences, StrValue: yyS[yypt-0].ident} + } + case 29: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionPolicy, StrValue: yyS[yypt-0].ident} } - case 24: + case 30: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionPolicy, StrValue: yyS[yypt-0].ident} } - case 25: + case 31: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionPolicy, StrValue: yyS[yypt-0].ident} } - case 26: + case 32: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionPolicy, StrValue: yyS[yypt-0].ident} } - case 27: + case 33: { parser.yyVAL.item = &ast.AttributesSpec{Default: true} } - case 28: + case 34: { parser.yyVAL.item = &ast.AttributesSpec{Default: false, Attributes: yyS[yypt-0].ident} } - case 29: + case 35: { parser.yyVAL.item = &ast.StatsOptionsSpec{Default: true} } - case 30: + case 36: { parser.yyVAL.item = &ast.StatsOptionsSpec{Default: false, StatsOptions: yyS[yypt-0].ident} } - case 31: + case 37: { if yyS[yypt-0].item != nil { parser.yyVAL.item = &ast.AlterTableSpec{ @@ -11818,19 +12107,19 @@ yynewstate: parser.yyVAL.item = nil } } - case 32: + case 38: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableRemovePartitioning, } } - case 33: + case 39: { ret := yyS[yypt-0].item.(*ast.AlterTableSpec) ret.NoWriteToBinlog = yyS[yypt-1].item.(bool) parser.yyVAL.item = ret } - case 34: + case 40: { partitionMethod := ast.PartitionMethod{Expr: yyS[yypt-1].expr} startOffset := parser.yyVAL.offset @@ -11842,7 +12131,7 @@ yynewstate: Partition: &ast.PartitionOptions{PartitionMethod: partitionMethod}, } } - case 35: + case 41: { partitionMethod := ast.PartitionMethod{Expr: yyS[yypt-1].expr} startOffset := parser.yyVAL.offset @@ -11855,7 +12144,7 @@ yynewstate: Partition: &ast.PartitionOptions{PartitionMethod: partitionMethod}, } } - case 36: + case 42: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTablePartitionAttributes, @@ -11863,7 +12152,7 @@ yynewstate: AttributesSpec: yyS[yypt-0].item.(*ast.AttributesSpec), } } - case 37: + case 43: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTablePartitionOptions, @@ -11871,22 +12160,28 @@ yynewstate: Options: yyS[yypt-0].item.([]*ast.TableOption), } } - case 38: + case 44: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRemoveTTL, + } + } + case 45: { parser.yyVAL.item = []string{} } - case 39: + case 46: { parser.yyVAL.item = yyS[yypt-0].item } - case 40: + case 47: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableOption, Options: yyS[yypt-0].item.([]*ast.TableOption), } } - case 41: + case 48: { tiflashReplicaSpec := &ast.TiFlashReplicaSpec{ Count: yyS[yypt-1].item.(uint64), @@ -11897,7 +12192,7 @@ yynewstate: TiFlashReplica: tiflashReplicaSpec, } } - case 42: + case 49: { op := &ast.AlterTableSpec{ Tp: ast.AlterTableOption, @@ -11909,7 +12204,7 @@ yynewstate: } parser.yyVAL.item = op } - case 43: + case 50: { op := &ast.AlterTableSpec{ Tp: ast.AlterTableOption, @@ -11921,7 +12216,7 @@ yynewstate: } parser.yyVAL.item = op } - case 44: + case 51: { parser.yyVAL.item = &ast.AlterTableSpec{ IfNotExists: yyS[yypt-2].item.(bool), @@ -11930,7 +12225,7 @@ yynewstate: Position: yyS[yypt-0].item.(*ast.ColumnPosition), } } - case 45: + case 52: { tes := yyS[yypt-1].item.([]interface{}) var columnDefs []*ast.ColumnDef @@ -11950,7 +12245,7 @@ yynewstate: NewConstraints: constraints, } } - case 46: + case 53: { constraint := yyS[yypt-0].item.(*ast.Constraint) parser.yyVAL.item = &ast.AlterTableSpec{ @@ -11958,7 +12253,7 @@ yynewstate: Constraint: constraint, } } - case 47: + case 54: { var defs []*ast.PartitionDefinition if yyS[yypt-0].item != nil { @@ -11976,7 +12271,7 @@ yynewstate: PartDefinitions: defs, } } - case 48: + case 55: { noWriteToBinlog := yyS[yypt-2].item.(bool) if noWriteToBinlog { @@ -11990,7 +12285,7 @@ yynewstate: Num: getUint64FromNUM(yyS[yypt-0].item), } } - case 49: + case 56: { noWriteToBinlog := yyS[yypt-0].item.(bool) if noWriteToBinlog { @@ -12009,7 +12304,7 @@ yynewstate: Partition: &ast.PartitionOptions{PartitionMethod: partitionMethod}, } } - case 50: + case 57: { statsSpec := &ast.StatisticsSpec{ StatsName: yyS[yypt-4].ident, @@ -12022,21 +12317,21 @@ yynewstate: Statistics: statsSpec, } } - case 51: + case 58: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableAttributes, AttributesSpec: yyS[yypt-0].item.(*ast.AttributesSpec), } } - case 52: + case 59: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableStatsOptions, StatsOptionsSpec: yyS[yypt-0].item.(*ast.StatsOptionsSpec), } } - case 53: + case 60: { yylex.AppendError(yylex.Errorf("The CHECK PARTITIONING clause is parsed but not implement yet.")) parser.lastErrorAsWarn() @@ -12050,7 +12345,7 @@ yynewstate: } parser.yyVAL.item = ret } - case 54: + case 61: { noWriteToBinlog := yyS[yypt-1].item.(bool) if noWriteToBinlog { @@ -12063,7 +12358,7 @@ yynewstate: Num: getUint64FromNUM(yyS[yypt-0].item), } } - case 55: + case 62: { parser.yyVAL.item = &ast.AlterTableSpec{ IfExists: yyS[yypt-2].item.(bool), @@ -12071,11 +12366,11 @@ yynewstate: OldColumnName: yyS[yypt-1].item.(*ast.ColumnName), } } - case 56: + case 63: { parser.yyVAL.item = &ast.AlterTableSpec{Tp: ast.AlterTableDropPrimaryKey} } - case 57: + case 64: { parser.yyVAL.item = &ast.AlterTableSpec{ IfExists: yyS[yypt-1].item.(bool), @@ -12083,7 +12378,7 @@ yynewstate: PartitionNames: yyS[yypt-0].item.([]model.CIStr), } } - case 58: + case 65: { partitionMethod := ast.PartitionMethod{Expr: yyS[yypt-2].expr} startOffset := parser.yyVAL.offset @@ -12097,7 +12392,7 @@ yynewstate: Partition: &ast.PartitionOptions{PartitionMethod: partitionMethod}, } } - case 59: + case 66: { statsSpec := &ast.StatisticsSpec{ StatsName: yyS[yypt-0].ident, @@ -12108,7 +12403,7 @@ yynewstate: Statistics: statsSpec, } } - case 60: + case 67: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableExchangePartition, @@ -12117,7 +12412,7 @@ yynewstate: WithValidation: yyS[yypt-0].item.(bool), } } - case 61: + case 68: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableTruncatePartition, @@ -12129,7 +12424,7 @@ yynewstate: } parser.yyVAL.item = ret } - case 62: + case 69: { ret := &ast.AlterTableSpec{ NoWriteToBinlog: yyS[yypt-1].item.(bool), @@ -12142,7 +12437,7 @@ yynewstate: } parser.yyVAL.item = ret } - case 63: + case 70: { ret := &ast.AlterTableSpec{ NoWriteToBinlog: yyS[yypt-1].item.(bool), @@ -12155,7 +12450,7 @@ yynewstate: } parser.yyVAL.item = ret } - case 64: + case 71: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableImportPartitionTablespace, @@ -12169,7 +12464,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The IMPORT PARTITION TABLESPACE clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 65: + case 72: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableDiscardPartitionTablespace, @@ -12183,7 +12478,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The DISCARD PARTITION TABLESPACE clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 66: + case 73: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableImportTablespace, @@ -12192,7 +12487,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The IMPORT TABLESPACE clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 67: + case 74: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableDiscardTablespace, @@ -12201,7 +12496,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The DISCARD TABLESPACE clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 68: + case 75: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableRebuildPartition, @@ -12214,7 +12509,7 @@ yynewstate: } parser.yyVAL.item = ret } - case 69: + case 76: { parser.yyVAL.item = &ast.AlterTableSpec{ IfExists: yyS[yypt-1].item.(bool), @@ -12222,7 +12517,7 @@ yynewstate: Name: yyS[yypt-0].ident, } } - case 70: + case 77: { parser.yyVAL.item = &ast.AlterTableSpec{ IfExists: yyS[yypt-1].item.(bool), @@ -12230,26 +12525,26 @@ yynewstate: Name: yyS[yypt-0].ident, } } - case 71: + case 78: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableOrderByColumns, OrderByList: yyS[yypt-0].item.([]*ast.AlterOrderItem), } } - case 72: + case 79: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableDisableKeys, } } - case 73: + case 80: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableEnableKeys, } } - case 74: + case 81: { parser.yyVAL.item = &ast.AlterTableSpec{ IfExists: yyS[yypt-2].item.(bool), @@ -12258,7 +12553,7 @@ yynewstate: Position: yyS[yypt-0].item.(*ast.ColumnPosition), } } - case 75: + case 82: { parser.yyVAL.item = &ast.AlterTableSpec{ IfExists: yyS[yypt-3].item.(bool), @@ -12268,7 +12563,7 @@ yynewstate: Position: yyS[yypt-0].item.(*ast.ColumnPosition), } } - case 76: + case 83: { option := &ast.ColumnOption{Expr: yyS[yypt-0].expr} colDef := &ast.ColumnDef{ @@ -12280,7 +12575,7 @@ yynewstate: NewColumns: []*ast.ColumnDef{colDef}, } } - case 77: + case 84: { option := &ast.ColumnOption{Expr: yyS[yypt-1].expr} colDef := &ast.ColumnDef{ @@ -12292,7 +12587,7 @@ yynewstate: NewColumns: []*ast.ColumnDef{colDef}, } } - case 78: + case 85: { colDef := &ast.ColumnDef{ Name: yyS[yypt-2].item.(*ast.ColumnName), @@ -12302,7 +12597,7 @@ yynewstate: NewColumns: []*ast.ColumnDef{colDef}, } } - case 79: + case 86: { oldColName := &ast.ColumnName{Name: model.NewCIStr(yyS[yypt-2].ident)} newColName := &ast.ColumnName{Name: model.NewCIStr(yyS[yypt-0].ident)} @@ -12312,28 +12607,28 @@ yynewstate: NewColumnName: newColName, } } - case 80: + case 87: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableRenameTable, NewTable: yyS[yypt-0].item.(*ast.TableName), } } - case 81: + case 88: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableRenameTable, NewTable: yyS[yypt-0].item.(*ast.TableName), } } - case 82: + case 89: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableRenameTable, NewTable: yyS[yypt-0].item.(*ast.TableName), } } - case 83: + case 90: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableRenameIndex, @@ -12341,21 +12636,21 @@ yynewstate: ToKey: model.NewCIStr(yyS[yypt-0].ident), } } - case 84: + case 91: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableLock, LockType: yyS[yypt-0].item.(ast.LockType), } } - case 85: + case 92: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableWriteable, Writeable: yyS[yypt-0].item.(bool), } } - case 86: + case 93: { // Parse it and ignore it. Just for compatibility. parser.yyVAL.item = &ast.AlterTableSpec{ @@ -12363,28 +12658,28 @@ yynewstate: Algorithm: yyS[yypt-0].item.(ast.AlgorithmType), } } - case 87: + case 94: { // Parse it and ignore it. Just for compatibility. parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableForce, } } - case 88: + case 95: { // Parse it and ignore it. Just for compatibility. parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableWithValidation, } } - case 89: + case 96: { // Parse it and ignore it. Just for compatibility. parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableWithoutValidation, } } - case 90: + case 97: { // Parse it and ignore it. Just for compatibility. parser.yyVAL.item = &ast.AlterTableSpec{ @@ -12393,7 +12688,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The SECONDARY_LOAD clause is parsed but not implement yet.")) parser.lastErrorAsWarn() } - case 91: + case 98: { // Parse it and ignore it. Just for compatibility. parser.yyVAL.item = &ast.AlterTableSpec{ @@ -12402,7 +12697,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The SECONDARY_UNLOAD VALIDATION clause is parsed but not implement yet.")) parser.lastErrorAsWarn() } - case 92: + case 99: { c := &ast.Constraint{ Name: yyS[yypt-1].ident, @@ -12413,7 +12708,7 @@ yynewstate: Constraint: c, } } - case 93: + case 100: { // Parse it and ignore it. Just for compatibility. c := &ast.Constraint{ @@ -12424,7 +12719,7 @@ yynewstate: Constraint: c, } } - case 94: + case 101: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableIndexInvisible, @@ -12432,19 +12727,19 @@ yynewstate: Visibility: yyS[yypt-0].item.(ast.IndexVisibility), } } - case 95: + case 102: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableCache, } } - case 96: + case 103: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableNoCache, } } - case 97: + case 104: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableReorganizePartition, @@ -12452,7 +12747,7 @@ yynewstate: } parser.yyVAL.item = ret } - case 98: + case 105: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableReorganizePartition, @@ -12461,56 +12756,56 @@ yynewstate: } parser.yyVAL.item = ret } - case 99: + case 106: { parser.yyVAL.item = nil } - case 101: + case 108: { parser.yyVAL.item = true } - case 103: + case 110: { parser.yyVAL.item = true } - case 104: + case 111: { parser.yyVAL.item = false } - case 105: + case 112: { parser.yyVAL.item = model.PrimaryKeyTypeClustered } - case 106: + case 113: { parser.yyVAL.item = model.PrimaryKeyTypeNonClustered } - case 107: + case 114: { parser.yyVAL.item = ast.AlgorithmTypeDefault } - case 108: + case 115: { parser.yyVAL.item = ast.AlgorithmTypeCopy } - case 109: + case 116: { parser.yyVAL.item = ast.AlgorithmTypeInplace } - case 110: + case 117: { parser.yyVAL.item = ast.AlgorithmTypeInstant } - case 111: + case 118: { yylex.AppendError(ErrUnknownAlterAlgorithm.GenWithStackByArgs(yyS[yypt-2].ident)) return 1 } - case 112: + case 119: { parser.yyVAL.item = ast.LockTypeDefault } - case 113: + case 120: { id := strings.ToUpper(yyS[yypt-0].ident) @@ -12525,165 +12820,165 @@ yynewstate: return 1 } } - case 114: + case 121: { parser.yyVAL.item = true } - case 115: + case 122: { parser.yyVAL.item = false } - case 122: + case 129: { parser.yyVAL.item = &ast.ColumnPosition{Tp: ast.ColumnPositionNone} } - case 123: + case 130: { parser.yyVAL.item = &ast.ColumnPosition{Tp: ast.ColumnPositionFirst} } - case 124: + case 131: { parser.yyVAL.item = &ast.ColumnPosition{ Tp: ast.ColumnPositionAfter, RelativeColumn: yyS[yypt-0].item.(*ast.ColumnName), } } - case 125: + case 132: { parser.yyVAL.item = make([]*ast.AlterTableSpec, 0, 1) } - case 127: + case 134: { parser.yyVAL.item = []*ast.AlterTableSpec{yyS[yypt-0].item.(*ast.AlterTableSpec)} } - case 128: + case 135: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.AlterTableSpec), yyS[yypt-0].item.(*ast.AlterTableSpec)) } - case 129: + case 136: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 130: + case 137: { parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) } - case 131: + case 138: { parser.yyVAL.item = nil } - case 132: + case 139: { parser.yyVAL.item = nil } - case 133: + case 140: { parser.yyVAL.item = yyS[yypt-0].ident } - case 135: + case 142: { parser.yyVAL.statement = &ast.RenameTableStmt{ TableToTables: yyS[yypt-0].item.([]*ast.TableToTable), } } - case 136: + case 143: { parser.yyVAL.item = []*ast.TableToTable{yyS[yypt-0].item.(*ast.TableToTable)} } - case 137: + case 144: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableToTable), yyS[yypt-0].item.(*ast.TableToTable)) } - case 138: + case 145: { parser.yyVAL.item = &ast.TableToTable{ OldTable: yyS[yypt-2].item.(*ast.TableName), NewTable: yyS[yypt-0].item.(*ast.TableName), } } - case 139: + case 146: { parser.yyVAL.statement = &ast.RenameUserStmt{ UserToUsers: yyS[yypt-0].item.([]*ast.UserToUser), } } - case 140: + case 147: { parser.yyVAL.item = []*ast.UserToUser{yyS[yypt-0].item.(*ast.UserToUser)} } - case 141: + case 148: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.UserToUser), yyS[yypt-0].item.(*ast.UserToUser)) } - case 142: + case 149: { parser.yyVAL.item = &ast.UserToUser{ OldUser: yyS[yypt-2].item.(*auth.UserIdentity), NewUser: yyS[yypt-0].item.(*auth.UserIdentity), } } - case 143: + case 150: { parser.yyVAL.statement = &ast.RecoverTableStmt{ JobID: yyS[yypt-0].item.(int64), } } - case 144: + case 151: { parser.yyVAL.statement = &ast.RecoverTableStmt{ Table: yyS[yypt-0].item.(*ast.TableName), } } - case 145: + case 152: { parser.yyVAL.statement = &ast.RecoverTableStmt{ Table: yyS[yypt-1].item.(*ast.TableName), JobNum: yyS[yypt-0].item.(int64), } } - case 146: + case 153: { parser.yyVAL.statement = &ast.FlashBackToTimestampStmt{ FlashbackTS: ast.NewValueExpr(yyS[yypt-0].ident, "", ""), } } - case 147: + case 154: { parser.yyVAL.statement = &ast.FlashBackToTimestampStmt{ Tables: yyS[yypt-2].item.([]*ast.TableName), FlashbackTS: ast.NewValueExpr(yyS[yypt-0].ident, "", ""), } } - case 148: + case 155: { parser.yyVAL.statement = &ast.FlashBackToTimestampStmt{ DBName: model.NewCIStr(yyS[yypt-2].ident), FlashbackTS: ast.NewValueExpr(yyS[yypt-0].ident, "", ""), } } - case 149: + case 156: { parser.yyVAL.statement = &ast.FlashBackTableStmt{ Table: yyS[yypt-1].item.(*ast.TableName), NewName: yyS[yypt-0].ident, } } - case 150: + case 157: { parser.yyVAL.ident = "" } - case 151: + case 158: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 152: + case 159: { parser.yyVAL.statement = &ast.FlashBackDatabaseStmt{ DBName: model.NewCIStr(yyS[yypt-1].ident), NewName: yyS[yypt-0].ident, } } - case 153: + case 160: { parser.yyVAL.statement = &ast.SplitRegionStmt{ SplitSyntaxOpt: yyS[yypt-4].item.(*ast.SplitSyntaxOption), @@ -12692,7 +12987,7 @@ yynewstate: SplitOpt: yyS[yypt-0].item.(*ast.SplitOption), } } - case 154: + case 161: { parser.yyVAL.statement = &ast.SplitRegionStmt{ SplitSyntaxOpt: yyS[yypt-6].item.(*ast.SplitSyntaxOption), @@ -12702,7 +12997,7 @@ yynewstate: SplitOpt: yyS[yypt-0].item.(*ast.SplitOption), } } - case 155: + case 162: { parser.yyVAL.item = &ast.SplitOption{ Lower: yyS[yypt-4].item.([]ast.ExprNode), @@ -12710,52 +13005,52 @@ yynewstate: Num: yyS[yypt-0].item.(int64), } } - case 156: + case 163: { parser.yyVAL.item = &ast.SplitOption{ ValueLists: yyS[yypt-0].item.([][]ast.ExprNode), } } - case 157: + case 164: { parser.yyVAL.item = &ast.SplitSyntaxOption{} } - case 158: + case 165: { parser.yyVAL.item = &ast.SplitSyntaxOption{ HasRegionFor: true, } } - case 159: + case 166: { parser.yyVAL.item = &ast.SplitSyntaxOption{ HasPartition: true, } } - case 160: + case 167: { parser.yyVAL.item = &ast.SplitSyntaxOption{ HasRegionFor: true, HasPartition: true, } } - case 161: + case 168: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: yyS[yypt-2].item.([]*ast.TableName), ColumnChoice: yyS[yypt-1].item.(model.ColumnChoice), AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } - case 162: + case 169: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, IndexNames: yyS[yypt-1].item.([]model.CIStr), IndexFlag: true, AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } - case 163: + case 170: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, IndexNames: yyS[yypt-1].item.([]model.CIStr), IndexFlag: true, Incremental: true, AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } - case 164: + case 171: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-4].item.(*ast.TableName)}, PartitionNames: yyS[yypt-2].item.([]model.CIStr), ColumnChoice: yyS[yypt-1].item.(model.ColumnChoice), AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } - case 165: + case 172: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, @@ -12765,7 +13060,7 @@ yynewstate: AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt), } } - case 166: + case 173: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, @@ -12776,7 +13071,7 @@ yynewstate: AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt), } } - case 167: + case 174: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, @@ -12785,7 +13080,7 @@ yynewstate: HistogramOperation: ast.HistogramOperationUpdate, } } - case 168: + case 175: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{yyS[yypt-4].item.(*ast.TableName)}, @@ -12793,7 +13088,7 @@ yynewstate: HistogramOperation: ast.HistogramOperationDrop, } } - case 169: + case 176: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, @@ -12801,7 +13096,7 @@ yynewstate: ColumnChoice: model.ColumnList, AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } - case 170: + case 177: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, @@ -12810,134 +13105,134 @@ yynewstate: ColumnChoice: model.ColumnList, AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } - case 171: + case 178: { parser.yyVAL.item = model.DefaultChoice } - case 172: + case 179: { parser.yyVAL.item = model.AllColumns } - case 173: + case 180: { parser.yyVAL.item = model.PredicateColumns } - case 174: + case 181: { parser.yyVAL.item = []ast.AnalyzeOpt{} } - case 175: + case 182: { parser.yyVAL.item = yyS[yypt-0].item.([]ast.AnalyzeOpt) } - case 176: + case 183: { parser.yyVAL.item = []ast.AnalyzeOpt{yyS[yypt-0].item.(ast.AnalyzeOpt)} } - case 177: + case 184: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.AnalyzeOpt), yyS[yypt-0].item.(ast.AnalyzeOpt)) } - case 178: + case 185: { parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumBuckets, Value: ast.NewValueExpr(yyS[yypt-1].item, "", "")} } - case 179: + case 186: { parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumTopN, Value: ast.NewValueExpr(yyS[yypt-1].item, "", "")} } - case 180: + case 187: { parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptCMSketchDepth, Value: ast.NewValueExpr(yyS[yypt-2].item, "", "")} } - case 181: + case 188: { parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptCMSketchWidth, Value: ast.NewValueExpr(yyS[yypt-2].item, "", "")} } - case 182: + case 189: { parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumSamples, Value: ast.NewValueExpr(yyS[yypt-1].item, "", "")} } - case 183: + case 190: { parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptSampleRate, Value: ast.NewValueExpr(yyS[yypt-1].item, "", "")} } - case 184: + case 191: { parser.yyVAL.item = &ast.Assignment{Column: yyS[yypt-2].item.(*ast.ColumnName), Expr: yyS[yypt-0].expr} } - case 185: + case 192: { parser.yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} } - case 186: + case 193: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.Assignment), yyS[yypt-0].item.(*ast.Assignment)) } - case 187: + case 194: { parser.yyVAL.item = []*ast.Assignment{} } - case 189: + case 196: { parser.yyVAL.statement = &ast.BeginStmt{} } - case 190: + case 197: { parser.yyVAL.statement = &ast.BeginStmt{ Mode: ast.Pessimistic, } } - case 191: + case 198: { parser.yyVAL.statement = &ast.BeginStmt{ Mode: ast.Optimistic, } } - case 192: + case 199: { parser.yyVAL.statement = &ast.BeginStmt{} } - case 193: + case 200: { parser.yyVAL.statement = &ast.BeginStmt{} } - case 194: + case 201: { parser.yyVAL.statement = &ast.BeginStmt{} } - case 195: + case 202: { parser.yyVAL.statement = &ast.BeginStmt{ CausalConsistencyOnly: true, } } - case 196: + case 203: { parser.yyVAL.statement = &ast.BeginStmt{ ReadOnly: true, } } - case 197: + case 204: { parser.yyVAL.statement = &ast.BeginStmt{ ReadOnly: true, AsOf: yyS[yypt-0].item.(*ast.AsOfClause), } } - case 198: + case 205: { parser.yyVAL.statement = &ast.BinlogStmt{Str: yyS[yypt-0].ident} } - case 199: + case 206: { parser.yyVAL.item = []*ast.ColumnDef{yyS[yypt-0].item.(*ast.ColumnDef)} } - case 200: + case 207: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ColumnDef), yyS[yypt-0].item.(*ast.ColumnDef)) } - case 201: + case 208: { colDef := &ast.ColumnDef{Name: yyS[yypt-2].item.(*ast.ColumnName), Tp: yyS[yypt-1].item.(*types.FieldType), Options: yyS[yypt-0].item.([]*ast.ColumnOption)} if !colDef.Validate() { @@ -12946,7 +13241,7 @@ yynewstate: } parser.yyVAL.item = colDef } - case 202: + case 209: { // TODO: check flen 0 tp := types.NewFieldType(mysql.TypeLonglong) @@ -12960,103 +13255,103 @@ yynewstate: } parser.yyVAL.item = colDef } - case 203: + case 210: { parser.yyVAL.item = &ast.ColumnName{Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 204: + case 211: { parser.yyVAL.item = &ast.ColumnName{Table: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 205: + case 212: { parser.yyVAL.item = &ast.ColumnName{Schema: model.NewCIStr(yyS[yypt-4].ident), Table: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 206: + case 213: { parser.yyVAL.item = []*ast.ColumnName{yyS[yypt-0].item.(*ast.ColumnName)} } - case 207: + case 214: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ColumnName), yyS[yypt-0].item.(*ast.ColumnName)) } - case 208: + case 215: { parser.yyVAL.item = []*ast.ColumnName{} } - case 210: + case 217: { parser.yyVAL.item = []model.CIStr{} } - case 211: + case 218: { parser.yyVAL.item = yyS[yypt-1].item } - case 212: + case 219: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 213: + case 220: { parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) } - case 214: + case 221: { parser.yyVAL.item = []*ast.ColumnNameOrUserVar{} } - case 216: + case 223: { parser.yyVAL.item = []*ast.ColumnNameOrUserVar{yyS[yypt-0].item.(*ast.ColumnNameOrUserVar)} } - case 217: + case 224: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ColumnNameOrUserVar), yyS[yypt-0].item.(*ast.ColumnNameOrUserVar)) } - case 218: + case 225: { parser.yyVAL.item = &ast.ColumnNameOrUserVar{ColumnName: yyS[yypt-0].item.(*ast.ColumnName)} } - case 219: + case 226: { parser.yyVAL.item = &ast.ColumnNameOrUserVar{UserVar: yyS[yypt-0].expr.(*ast.VariableExpr)} } - case 220: + case 227: { parser.yyVAL.item = []*ast.ColumnNameOrUserVar{} } - case 221: + case 228: { parser.yyVAL.item = yyS[yypt-1].item.([]*ast.ColumnNameOrUserVar) } - case 222: + case 229: { parser.yyVAL.statement = &ast.CommitStmt{} } - case 223: + case 230: { parser.yyVAL.statement = &ast.CommitStmt{CompletionType: yyS[yypt-0].item.(ast.CompletionType)} } - case 227: + case 234: { parser.yyVAL.ident = "NOT" } - case 228: + case 235: { parser.yyVAL.item = true } - case 229: + case 236: { parser.yyVAL.item = false } - case 230: + case 237: { parser.yyVAL.item = true } - case 232: + case 239: { parser.yyVAL.item = 0 } - case 233: + case 240: { if yyS[yypt-0].item.(bool) { parser.yyVAL.item = 1 @@ -13064,57 +13359,57 @@ yynewstate: parser.yyVAL.item = 2 } } - case 234: + case 241: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionNotNull} } - case 235: + case 242: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionNull} } - case 236: + case 243: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionAutoIncrement} } - case 237: + case 244: { // 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 238: + case 245: { // 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, PrimaryKeyTp: yyS[yypt-0].item.(model.PrimaryKeyType)} } - case 239: + case 246: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} } - case 240: + case 247: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} } - case 241: + case 248: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionDefaultValue, Expr: yyS[yypt-0].expr} } - case 242: + case 249: { parser.yyVAL.item = []*ast.ColumnOption{{Tp: ast.ColumnOptionNotNull}, {Tp: ast.ColumnOptionAutoIncrement}, {Tp: ast.ColumnOptionUniqKey}} } - case 243: + case 250: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionOnUpdate, Expr: yyS[yypt-0].expr} } - case 244: + case 251: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionComment, Expr: ast.NewValueExpr(yyS[yypt-0].ident, "", "")} } - case 245: + case 252: { // See https://dev.mysql.com/doc/refman/5.7/en/create-table.html // The CHECK clause is parsed but ignored by all storage engines. @@ -13141,7 +13436,7 @@ yynewstate: default: } } - case 246: + case 253: { startOffset := parser.startOffset(&yyS[yypt-2]) endOffset := parser.endOffset(&yyS[yypt-1]) @@ -13154,68 +13449,68 @@ yynewstate: Stored: yyS[yypt-0].item.(bool), } } - case 247: + case 254: { parser.yyVAL.item = &ast.ColumnOption{ Tp: ast.ColumnOptionReference, Refer: yyS[yypt-0].item.(*ast.ReferenceDef), } } - case 248: + case 255: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionCollate, StrValue: yyS[yypt-0].ident} } - case 249: + case 256: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionColumnFormat, StrValue: yyS[yypt-0].ident} } - case 250: + case 257: { 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 251: + case 258: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionAutoRandom, AutoRandOpt: yyS[yypt-0].item.(ast.AutoRandomOption)} } - case 252: + case 259: { parser.yyVAL.item = ast.AutoRandomOption{ShardBits: types.UnspecifiedLength, RangeBits: types.UnspecifiedLength} } - case 253: + case 260: { parser.yyVAL.item = ast.AutoRandomOption{ShardBits: int(yyS[yypt-1].item.(uint64)), RangeBits: types.UnspecifiedLength} } - case 254: + case 261: { parser.yyVAL.item = ast.AutoRandomOption{ShardBits: int(yyS[yypt-3].item.(uint64)), RangeBits: int(yyS[yypt-1].item.(uint64))} } - case 258: + case 265: { parser.yyVAL.ident = "DEFAULT" } - case 259: + case 266: { parser.yyVAL.ident = "FIXED" } - case 260: + case 267: { parser.yyVAL.ident = "DYNAMIC" } - case 263: + case 270: { parser.yyVAL.item = false } - case 264: + case 271: { parser.yyVAL.item = false } - case 265: + case 272: { parser.yyVAL.item = true } - case 266: + case 273: { if columnOption, ok := yyS[yypt-0].item.(*ast.ColumnOption); ok { parser.yyVAL.item = []*ast.ColumnOption{columnOption} @@ -13223,7 +13518,7 @@ yynewstate: parser.yyVAL.item = yyS[yypt-0].item } } - case 267: + case 274: { if columnOption, ok := yyS[yypt-0].item.(*ast.ColumnOption); ok { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.ColumnOption), columnOption) @@ -13231,11 +13526,11 @@ yynewstate: parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.ColumnOption), yyS[yypt-0].item.([]*ast.ColumnOption)...) } } - case 268: + case 275: { parser.yyVAL.item = []*ast.ColumnOption{} } - case 270: + case 277: { c := &ast.Constraint{ Tp: ast.ConstraintPrimaryKey, @@ -13254,7 +13549,7 @@ yynewstate: } parser.yyVAL.item = c } - case 271: + case 278: { c := &ast.Constraint{ Tp: ast.ConstraintFulltext, @@ -13267,7 +13562,7 @@ yynewstate: } parser.yyVAL.item = c } - case 272: + case 279: { c := &ast.Constraint{ IfNotExists: yyS[yypt-5].item.(bool), @@ -13287,7 +13582,7 @@ yynewstate: } parser.yyVAL.item = c } - case 273: + case 280: { c := &ast.Constraint{ Tp: ast.ConstraintUniq, @@ -13307,7 +13602,7 @@ yynewstate: } parser.yyVAL.item = c } - case 274: + case 281: { parser.yyVAL.item = &ast.Constraint{ IfNotExists: yyS[yypt-5].item.(bool), @@ -13318,7 +13613,7 @@ yynewstate: IsEmptyIndex: yyS[yypt-4].item.(*ast.NullString).Empty, } } - case 275: + case 282: { parser.yyVAL.item = &ast.Constraint{ Tp: ast.ConstraintCheck, @@ -13326,29 +13621,29 @@ yynewstate: Enforced: yyS[yypt-0].item.(bool), } } - case 276: + case 283: { parser.yyVAL.item = ast.MatchFull } - case 277: + case 284: { parser.yyVAL.item = ast.MatchPartial } - case 278: + case 285: { parser.yyVAL.item = ast.MatchSimple } - case 279: + case 286: { parser.yyVAL.item = ast.MatchNone } - case 280: + case 287: { 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 281: + case 288: { onDeleteUpdate := yyS[yypt-0].item.([2]interface{}) parser.yyVAL.item = &ast.ReferenceDef{ @@ -13359,90 +13654,98 @@ yynewstate: Match: yyS[yypt-1].item.(ast.MatchType), } } - case 282: + case 289: { parser.yyVAL.item = &ast.OnDeleteOpt{ReferOpt: yyS[yypt-0].item.(model.ReferOptionType)} } - case 283: + case 290: { parser.yyVAL.item = &ast.OnUpdateOpt{ReferOpt: yyS[yypt-0].item.(model.ReferOptionType)} } - case 284: + case 291: { parser.yyVAL.item = [2]interface{}{&ast.OnDeleteOpt{}, &ast.OnUpdateOpt{}} } - case 285: + case 292: { parser.yyVAL.item = [2]interface{}{yyS[yypt-0].item, &ast.OnUpdateOpt{}} } - case 286: + case 293: { parser.yyVAL.item = [2]interface{}{&ast.OnDeleteOpt{}, yyS[yypt-0].item} } - case 287: + case 294: { parser.yyVAL.item = [2]interface{}{yyS[yypt-1].item, yyS[yypt-0].item} } - case 288: + case 295: { parser.yyVAL.item = [2]interface{}{yyS[yypt-0].item, yyS[yypt-1].item} } - case 289: + case 296: { parser.yyVAL.item = model.ReferOptionRestrict } - case 290: + case 297: { parser.yyVAL.item = model.ReferOptionCascade } - case 291: + case 298: { parser.yyVAL.item = model.ReferOptionSetNull } - case 292: + case 299: { parser.yyVAL.item = model.ReferOptionNoAction } - case 293: + case 300: { parser.yyVAL.item = model.ReferOptionSetDefault yylex.AppendError(yylex.Errorf("The SET DEFAULT clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 298: + case 305: { parser.yyVAL.expr = yyS[yypt-1].expr.(*ast.FuncCallExpr) } - case 299: + case 306: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-2].ident), } } - case 300: + case 307: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode), } } - case 301: + case 308: { parser.yyVAL.expr = yyS[yypt-1].expr.(*ast.FuncCallExpr) } - case 303: + case 310: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} } - case 304: + case 311: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} } - case 305: + case 312: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP"), Args: []ast.ExprNode{ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)}} } - case 306: + case 313: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_DATE")} + } + case 314: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_DATE")} + } + case 315: { objNameExpr := &ast.TableNameExpr{ Name: yyS[yypt-0].item.(*ast.TableName), @@ -13452,7 +13755,7 @@ yynewstate: Args: []ast.ExprNode{objNameExpr}, } } - case 307: + case 316: { objNameExpr := &ast.TableNameExpr{ Name: yyS[yypt-1].item.(*ast.TableName), @@ -13462,39 +13765,39 @@ yynewstate: Args: []ast.ExprNode{objNameExpr}, } } - case 315: + case 326: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].expr, parser.charset, parser.collation) } - case 316: + case 327: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Plus, V: ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation)} } - case 317: + case 328: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Minus, V: ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation)} } - case 321: + case 332: { parser.yyVAL.item = ast.StatsTypeCardinality } - case 322: + case 333: { parser.yyVAL.item = ast.StatsTypeDependency } - case 323: + case 334: { parser.yyVAL.item = ast.StatsTypeCorrelation } - case 324: + case 335: { parser.yyVAL.item = ast.BindingStatusTypeEnabled } - case 325: + case 336: { parser.yyVAL.item = ast.BindingStatusTypeDisabled } - case 326: + case 337: { parser.yyVAL.statement = &ast.CreateStatisticsStmt{ IfNotExists: yyS[yypt-9].item.(bool), @@ -13504,11 +13807,11 @@ yynewstate: Columns: yyS[yypt-1].item.([]*ast.ColumnName), } } - case 327: + case 338: { parser.yyVAL.statement = &ast.DropStatisticsStmt{StatsName: yyS[yypt-0].ident} } - case 328: + case 339: { var indexOption *ast.IndexOption if yyS[yypt-1].item != nil { @@ -13541,79 +13844,79 @@ yynewstate: LockAlg: indexLockAndAlgorithm, } } - case 329: + case 340: { parser.yyVAL.item = ([]*ast.IndexPartSpecification)(nil) } - case 330: + case 341: { parser.yyVAL.item = yyS[yypt-1].item } - case 331: + case 342: { parser.yyVAL.item = []*ast.IndexPartSpecification{yyS[yypt-0].item.(*ast.IndexPartSpecification)} } - case 332: + case 343: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.IndexPartSpecification), yyS[yypt-0].item.(*ast.IndexPartSpecification)) } - case 333: + case 344: { 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 334: + case 345: { parser.yyVAL.item = &ast.IndexPartSpecification{Expr: yyS[yypt-2].expr, Desc: yyS[yypt-0].item.(bool)} } - case 335: + case 346: { parser.yyVAL.item = nil } - case 336: + case 347: { parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ LockTp: yyS[yypt-0].item.(ast.LockType), AlgorithmTp: ast.AlgorithmTypeDefault, } } - case 337: + case 348: { parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ LockTp: ast.LockTypeDefault, AlgorithmTp: yyS[yypt-0].item.(ast.AlgorithmType), } } - case 338: + case 349: { parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ LockTp: yyS[yypt-1].item.(ast.LockType), AlgorithmTp: yyS[yypt-0].item.(ast.AlgorithmType), } } - case 339: + case 350: { parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ LockTp: yyS[yypt-0].item.(ast.LockType), AlgorithmTp: yyS[yypt-1].item.(ast.AlgorithmType), } } - case 340: + case 351: { parser.yyVAL.item = ast.IndexKeyTypeNone } - case 341: + case 352: { parser.yyVAL.item = ast.IndexKeyTypeUnique } - case 342: + case 353: { parser.yyVAL.item = ast.IndexKeyTypeSpatial } - case 343: + case 354: { parser.yyVAL.item = ast.IndexKeyTypeFullText } - case 344: + case 355: { parser.yyVAL.statement = &ast.AlterDatabaseStmt{ Name: model.NewCIStr(yyS[yypt-1].ident), @@ -13621,7 +13924,7 @@ yynewstate: Options: yyS[yypt-0].item.([]*ast.DatabaseOption), } } - case 345: + case 356: { parser.yyVAL.statement = &ast.AlterDatabaseStmt{ Name: model.NewCIStr(""), @@ -13629,7 +13932,7 @@ yynewstate: Options: yyS[yypt-0].item.([]*ast.DatabaseOption), } } - case 346: + case 357: { parser.yyVAL.statement = &ast.CreateDatabaseStmt{ IfNotExists: yyS[yypt-2].item.(bool), @@ -13637,19 +13940,19 @@ yynewstate: Options: yyS[yypt-0].item.([]*ast.DatabaseOption), } } - case 349: + case 361: { parser.yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionCharset, Value: yyS[yypt-0].ident} } - case 350: + case 362: { parser.yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionCollate, Value: yyS[yypt-0].ident} } - case 351: + case 363: { parser.yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionEncryption, Value: yyS[yypt-0].ident} } - case 352: + case 364: { placementOptions := yyS[yypt-0].item.(*ast.PlacementOption) parser.yyVAL.item = &ast.DatabaseOption{ @@ -13659,7 +13962,7 @@ yynewstate: UintValue: placementOptions.UintValue, } } - case 353: + case 365: { placementOptions := yyS[yypt-0].item.(*ast.PlacementOption) parser.yyVAL.item = &ast.DatabaseOption{ @@ -13669,7 +13972,7 @@ yynewstate: UintValue: placementOptions.UintValue, } } - case 354: + case 366: { tiflashReplicaSpec := &ast.TiFlashReplicaSpec{ Count: yyS[yypt-1].item.(uint64), @@ -13680,19 +13983,19 @@ yynewstate: TiFlashReplica: tiflashReplicaSpec, } } - case 355: + case 367: { parser.yyVAL.item = []*ast.DatabaseOption{} } - case 357: + case 369: { parser.yyVAL.item = []*ast.DatabaseOption{yyS[yypt-0].item.(*ast.DatabaseOption)} } - case 358: + case 370: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.DatabaseOption), yyS[yypt-0].item.(*ast.DatabaseOption)) } - case 359: + case 371: { stmt := yyS[yypt-6].item.(*ast.CreateTableStmt) stmt.Table = yyS[yypt-7].item.(*ast.TableName) @@ -13713,7 +14016,7 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 360: + case 372: { tmp := &ast.CreateTableStmt{ Table: yyS[yypt-2].item.(*ast.TableName), @@ -13730,23 +14033,23 @@ yynewstate: } parser.yyVAL.statement = tmp } - case 361: + case 373: { parser.yyVAL.item = nil } - case 362: + case 374: { parser.yyVAL.item = true } - case 363: + case 375: { parser.yyVAL.item = false } - case 366: + case 378: { parser.yyVAL.item = nil } - case 367: + case 379: { method := yyS[yypt-3].item.(*ast.PartitionMethod) method.Num = yyS[yypt-2].item.(uint64) @@ -13763,7 +14066,7 @@ yynewstate: } parser.yyVAL.item = opt } - case 368: + case 380: { keyAlgorithm, _ := yyS[yypt-3].item.(*ast.PartitionKeyAlgorithm) parser.yyVAL.item = &ast.PartitionMethod{ @@ -13773,7 +14076,7 @@ yynewstate: KeyAlgorithm: keyAlgorithm, } } - case 369: + case 381: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeHash, @@ -13781,11 +14084,11 @@ yynewstate: Expr: yyS[yypt-1].expr.(ast.ExprNode), } } - case 370: + case 382: { parser.yyVAL.item = nil } - case 371: + case 383: { tp := getUint64FromNUM(yyS[yypt-0].item) if tp != 1 && tp != 2 { @@ -13796,7 +14099,7 @@ yynewstate: Type: tp, } } - case 373: + case 385: { partitionInterval, _ := yyS[yypt-0].item.(*ast.PartitionInterval) parser.yyVAL.item = &ast.PartitionMethod{ @@ -13805,7 +14108,7 @@ yynewstate: Interval: partitionInterval, } } - case 374: + case 386: { partitionInterval, _ := yyS[yypt-0].item.(*ast.PartitionInterval) parser.yyVAL.item = &ast.PartitionMethod{ @@ -13814,21 +14117,21 @@ yynewstate: Interval: partitionInterval, } } - case 375: + case 387: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeList, Expr: yyS[yypt-1].expr.(ast.ExprNode), } } - case 376: + case 388: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeList, ColumnNames: yyS[yypt-1].item.([]*ast.ColumnName), } } - case 377: + case 389: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeSystemTime, @@ -13836,24 +14139,24 @@ yynewstate: Unit: yyS[yypt-0].item.(ast.TimeUnitType), } } - case 378: + case 390: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeSystemTime, Limit: yyS[yypt-0].item.(uint64), } } - case 379: + case 391: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeSystemTime, } } - case 380: + case 392: { parser.yyVAL.item = nil } - case 381: + case 393: { partitionInterval := &ast.PartitionInterval{ IntervalExpr: yyS[yypt-4].item.(ast.PartitionIntervalExpr), @@ -13869,35 +14172,35 @@ yynewstate: partitionInterval.SetOriginTextPosition(startOffset) parser.yyVAL.item = partitionInterval } - case 382: + case 394: { parser.yyVAL.item = ast.PartitionIntervalExpr{Expr: yyS[yypt-0].expr, TimeUnit: ast.TimeUnitInvalid} } - case 383: + case 395: { parser.yyVAL.item = ast.PartitionIntervalExpr{Expr: yyS[yypt-1].expr, TimeUnit: yyS[yypt-0].item.(ast.TimeUnitType)} } - case 384: + case 396: { parser.yyVAL.item = false } - case 385: + case 397: { parser.yyVAL.item = true } - case 386: + case 398: { parser.yyVAL.item = false } - case 387: + case 399: { parser.yyVAL.item = true } - case 388: + case 400: { parser.yyVAL.item = ast.PartitionInterval{} // First/LastRangeEnd defaults to nil } - case 389: + case 401: { first := yyS[yypt-8].expr.(ast.ExprNode) last := yyS[yypt-1].expr.(ast.ExprNode) @@ -13906,25 +14209,25 @@ yynewstate: LastRangeEnd: &last, } } - case 390: + case 402: { parser.yyVAL.ident = "" } - case 392: + case 404: { parser.yyVAL.item = nil } - case 393: + case 405: { method := yyS[yypt-1].item.(*ast.PartitionMethod) method.Num = yyS[yypt-0].item.(uint64) parser.yyVAL.item = method } - case 394: + case 406: { parser.yyVAL.item = uint64(0) } - case 395: + case 407: { res := yyS[yypt-0].item.(uint64) if res == 0 { @@ -13933,11 +14236,11 @@ yynewstate: } parser.yyVAL.item = res } - case 396: + case 408: { parser.yyVAL.item = uint64(0) } - case 397: + case 409: { res := yyS[yypt-0].item.(uint64) if res == 0 { @@ -13946,23 +14249,23 @@ yynewstate: } parser.yyVAL.item = res } - case 398: + case 410: { parser.yyVAL.item = nil } - case 399: + case 411: { parser.yyVAL.item = yyS[yypt-1].item.([]*ast.PartitionDefinition) } - case 400: + case 412: { parser.yyVAL.item = []*ast.PartitionDefinition{yyS[yypt-0].item.(*ast.PartitionDefinition)} } - case 401: + case 413: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.PartitionDefinition), yyS[yypt-0].item.(*ast.PartitionDefinition)) } - case 402: + case 414: { parser.yyVAL.item = &ast.PartitionDefinition{ Name: model.NewCIStr(yyS[yypt-3].ident), @@ -13971,80 +14274,80 @@ yynewstate: Sub: yyS[yypt-0].item.([]*ast.SubPartitionDefinition), } } - case 403: + case 415: { parser.yyVAL.item = make([]*ast.SubPartitionDefinition, 0) } - case 404: + case 416: { parser.yyVAL.item = yyS[yypt-1].item } - case 405: + case 417: { parser.yyVAL.item = []*ast.SubPartitionDefinition{yyS[yypt-0].item.(*ast.SubPartitionDefinition)} } - case 406: + case 418: { list := yyS[yypt-2].item.([]*ast.SubPartitionDefinition) parser.yyVAL.item = append(list, yyS[yypt-0].item.(*ast.SubPartitionDefinition)) } - case 407: + case 419: { parser.yyVAL.item = &ast.SubPartitionDefinition{ Name: model.NewCIStr(yyS[yypt-1].ident), Options: yyS[yypt-0].item.([]*ast.TableOption), } } - case 408: + case 420: { parser.yyVAL.item = make([]*ast.TableOption, 0) } - case 409: + case 421: { list := yyS[yypt-1].item.([]*ast.TableOption) parser.yyVAL.item = append(list, yyS[yypt-0].item.(*ast.TableOption)) } - case 410: + case 422: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionComment, StrValue: yyS[yypt-0].ident} } - case 411: + case 423: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: yyS[yypt-0].ident} } - case 412: + case 424: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: yyS[yypt-0].ident} } - case 413: + case 425: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionInsertMethod, StrValue: yyS[yypt-0].ident} } - case 414: + case 426: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionDataDirectory, StrValue: yyS[yypt-0].ident} } - case 415: + case 427: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionIndexDirectory, StrValue: yyS[yypt-0].ident} } - case 416: + case 428: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionMaxRows, UintValue: yyS[yypt-0].item.(uint64)} } - case 417: + case 429: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionMinRows, UintValue: yyS[yypt-0].item.(uint64)} } - case 418: + case 430: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionTablespace, StrValue: yyS[yypt-0].ident} } - case 419: + case 431: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionNodegroup, UintValue: yyS[yypt-0].item.(uint64)} } - case 420: + case 432: { placementOptions := yyS[yypt-0].item.(*ast.PlacementOption) parser.yyVAL.item = &ast.TableOption{ @@ -14054,27 +14357,27 @@ yynewstate: UintValue: placementOptions.UintValue, } } - case 421: + case 433: { parser.yyVAL.item = &ast.PartitionDefinitionClauseNone{} } - case 422: + case 434: { parser.yyVAL.item = &ast.PartitionDefinitionClauseLessThan{ Exprs: []ast.ExprNode{&ast.MaxValueExpr{}}, } } - case 423: + case 435: { parser.yyVAL.item = &ast.PartitionDefinitionClauseLessThan{ Exprs: yyS[yypt-1].item.([]ast.ExprNode), } } - case 424: + case 436: { parser.yyVAL.item = &ast.PartitionDefinitionClauseIn{} } - case 425: + case 437: { exprs := yyS[yypt-1].item.([]ast.ExprNode) values := make([][]ast.ExprNode, 0, len(exprs)) @@ -14087,43 +14390,43 @@ yynewstate: } parser.yyVAL.item = &ast.PartitionDefinitionClauseIn{Values: values} } - case 426: + case 438: { parser.yyVAL.item = &ast.PartitionDefinitionClauseHistory{Current: false} } - case 427: + case 439: { parser.yyVAL.item = &ast.PartitionDefinitionClauseHistory{Current: true} } - case 428: + case 440: { parser.yyVAL.item = ast.OnDuplicateKeyHandlingError } - case 429: + case 441: { parser.yyVAL.item = ast.OnDuplicateKeyHandlingIgnore } - case 430: + case 442: { parser.yyVAL.item = ast.OnDuplicateKeyHandlingReplace } - case 433: + case 445: { parser.yyVAL.item = &ast.CreateTableStmt{} } - case 434: + case 446: { parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 435: + case 447: { parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 436: + case 448: { parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 437: + case 449: { var sel ast.ResultSetNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -14136,7 +14439,7 @@ yynewstate: } parser.yyVAL.item = &ast.CreateTableStmt{Select: sel} } - case 441: + case 453: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -14149,15 +14452,15 @@ yynewstate: } parser.yyVAL.statement = sel } - case 442: + case 454: { parser.yyVAL.item = yyS[yypt-0].item } - case 443: + case 455: { parser.yyVAL.item = yyS[yypt-1].item } - case 444: + case 456: { startOffset := parser.startOffset(&yyS[yypt-1]) selStmt := yyS[yypt-1].statement.(ast.StmtNode) @@ -14182,85 +14485,85 @@ yynewstate: } parser.yyVAL.statement = x } - case 445: + case 457: { parser.yyVAL.item = false } - case 446: + case 458: { parser.yyVAL.item = true } - case 447: + case 459: { parser.yyVAL.item = model.AlgorithmUndefined } - case 448: + case 460: { parser.yyVAL.item = model.AlgorithmUndefined } - case 449: + case 461: { parser.yyVAL.item = model.AlgorithmMerge } - case 450: + case 462: { parser.yyVAL.item = model.AlgorithmTemptable } - case 451: + case 463: { parser.yyVAL.item = &auth.UserIdentity{CurrentUser: true} } - case 452: + case 464: { parser.yyVAL.item = yyS[yypt-0].item } - case 453: + case 465: { parser.yyVAL.item = model.SecurityDefiner } - case 454: + case 466: { parser.yyVAL.item = model.SecurityDefiner } - case 455: + case 467: { parser.yyVAL.item = model.SecurityInvoker } - case 457: + case 469: { parser.yyVAL.item = nil } - case 458: + case 470: { parser.yyVAL.item = yyS[yypt-1].item.([]model.CIStr) } - case 459: + case 471: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 460: + case 472: { parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) } - case 461: + case 473: { parser.yyVAL.item = nil } - case 462: + case 474: { parser.yyVAL.item = model.CheckOptionCascaded } - case 463: + case 475: { parser.yyVAL.item = model.CheckOptionLocal } - case 464: + case 476: { parser.yyVAL.statement = &ast.DoStmt{ Exprs: yyS[yypt-0].item.([]ast.ExprNode), } } - case 465: + case 477: { // Single Table tn := yyS[yypt-6].item.(*ast.TableName) @@ -14288,7 +14591,7 @@ yynewstate: parser.yyVAL.statement = x } - case 466: + case 478: { // Multiple Table x := &ast.DeleteStmt{ @@ -14308,7 +14611,7 @@ yynewstate: } parser.yyVAL.statement = x } - case 467: + case 479: { // Multiple Table x := &ast.DeleteStmt{ @@ -14327,23 +14630,23 @@ yynewstate: } parser.yyVAL.statement = x } - case 470: + case 482: { d := yyS[yypt-0].statement.(*ast.DeleteStmt) d.With = yyS[yypt-1].item.(*ast.WithClause) parser.yyVAL.statement = d } - case 471: + case 483: { d := yyS[yypt-0].statement.(*ast.DeleteStmt) d.With = yyS[yypt-1].item.(*ast.WithClause) parser.yyVAL.statement = d } - case 473: + case 485: { parser.yyVAL.statement = &ast.DropDatabaseStmt{IfExists: yyS[yypt-1].item.(bool), Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 474: + case 486: { var indexLockAndAlgorithm *ast.IndexLockAndAlgorithm if yyS[yypt-0].item != nil { @@ -14354,39 +14657,39 @@ yynewstate: } parser.yyVAL.statement = &ast.DropIndexStmt{IfExists: yyS[yypt-4].item.(bool), IndexName: yyS[yypt-3].ident, Table: yyS[yypt-1].item.(*ast.TableName), LockAlg: indexLockAndAlgorithm} } - case 475: + case 487: { 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 476: + case 488: { parser.yyVAL.item = ast.TemporaryNone } - case 477: + case 489: { parser.yyVAL.item = ast.TemporaryLocal } - case 478: + case 490: { parser.yyVAL.item = ast.TemporaryGlobal } - case 479: + case 491: { parser.yyVAL.statement = &ast.DropTableStmt{Tables: yyS[yypt-1].item.([]*ast.TableName), IsView: true} } - case 480: + case 492: { parser.yyVAL.statement = &ast.DropTableStmt{IfExists: true, Tables: yyS[yypt-1].item.([]*ast.TableName), IsView: true} } - case 481: + case 493: { parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: false, IfExists: false, UserList: yyS[yypt-0].item.([]*auth.UserIdentity)} } - case 482: + case 494: { parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: false, IfExists: true, UserList: yyS[yypt-0].item.([]*auth.UserIdentity)} } - case 483: + case 495: { tmp := make([]*auth.UserIdentity, 0, 10) roleList := yyS[yypt-0].item.([]*auth.RoleIdentity) @@ -14395,7 +14698,7 @@ yynewstate: } parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: true, IfExists: false, UserList: tmp} } - case 484: + case 496: { tmp := make([]*auth.UserIdentity, 0, 10) roleList := yyS[yypt-0].item.([]*auth.RoleIdentity) @@ -14404,11 +14707,11 @@ yynewstate: } parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: true, IfExists: true, UserList: tmp} } - case 485: + case 497: { parser.yyVAL.statement = &ast.DropStatsStmt{Tables: yyS[yypt-0].item.([]*ast.TableName)} } - case 486: + case 498: { yylex.AppendError(ErrWarnDeprecatedSyntaxNoReplacement.FastGenByArgs("DROP STATS ... PARTITION ...")) parser.lastErrorAsWarn() @@ -14417,7 +14720,7 @@ yynewstate: PartitionNames: yyS[yypt-0].item.([]model.CIStr), } } - case 487: + case 499: { yylex.AppendError(ErrWarnDeprecatedSyntax.FastGenByArgs("DROP STATS ... GLOBAL", "DROP STATS ...")) parser.lastErrorAsWarn() @@ -14426,11 +14729,11 @@ yynewstate: IsGlobalStats: true, } } - case 495: + case 507: { parser.yyVAL.statement = nil } - case 496: + case 508: { parser.yyVAL.statement = &ast.TraceStmt{ Stmt: yyS[yypt-0].statement, @@ -14440,7 +14743,7 @@ yynewstate: startOffset := parser.startOffset(&yyS[yypt]) yyS[yypt-0].statement.SetText(parser.lexer.client, string(parser.src[startOffset:])) } - case 497: + case 509: { parser.yyVAL.statement = &ast.TraceStmt{ Stmt: yyS[yypt-0].statement, @@ -14450,7 +14753,7 @@ yynewstate: startOffset := parser.startOffset(&yyS[yypt]) yyS[yypt-0].statement.SetText(parser.lexer.client, string(parser.src[startOffset:])) } - case 498: + case 510: { parser.yyVAL.statement = &ast.TraceStmt{ Stmt: yyS[yypt-0].statement, @@ -14459,7 +14762,7 @@ yynewstate: startOffset := parser.startOffset(&yyS[yypt]) yyS[yypt-0].statement.SetText(parser.lexer.client, string(parser.src[startOffset:])) } - case 499: + case 511: { parser.yyVAL.statement = &ast.TraceStmt{ Stmt: yyS[yypt-0].statement, @@ -14469,7 +14772,7 @@ yynewstate: startOffset := parser.startOffset(&yyS[yypt]) yyS[yypt-0].statement.SetText(parser.lexer.client, string(parser.src[startOffset:])) } - case 503: + case 515: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: &ast.ShowStmt{ @@ -14478,7 +14781,7 @@ yynewstate: }, } } - case 504: + case 516: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: &ast.ShowStmt{ @@ -14488,49 +14791,49 @@ yynewstate: }, } } - case 505: + case 517: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: yyS[yypt-0].statement, Format: "row", } } - case 506: + case 518: { parser.yyVAL.statement = &ast.ExplainForStmt{ Format: "row", ConnectionID: getUint64FromNUM(yyS[yypt-0].item), } } - case 507: + case 519: { parser.yyVAL.statement = &ast.ExplainForStmt{ Format: yyS[yypt-3].ident, ConnectionID: getUint64FromNUM(yyS[yypt-0].item), } } - case 508: + case 520: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: yyS[yypt-0].statement, Format: yyS[yypt-1].ident, } } - case 509: + case 521: { parser.yyVAL.statement = &ast.ExplainForStmt{ Format: yyS[yypt-3].ident, ConnectionID: getUint64FromNUM(yyS[yypt-0].item), } } - case 510: + case 522: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: yyS[yypt-0].statement, Format: yyS[yypt-1].ident, } } - case 511: + case 523: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: yyS[yypt-0].statement, @@ -14538,7 +14841,7 @@ yynewstate: Analyze: true, } } - case 512: + case 524: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: yyS[yypt-0].statement, @@ -14546,7 +14849,7 @@ yynewstate: Analyze: true, } } - case 513: + case 525: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: yyS[yypt-0].statement, @@ -14554,15 +14857,15 @@ yynewstate: Analyze: true, } } - case 521: + case 534: { parser.yyVAL.statement = &ast.SavepointStmt{Name: yyS[yypt-0].ident} } - case 522: + case 535: { parser.yyVAL.statement = &ast.ReleaseSavepointStmt{Name: yyS[yypt-0].ident} } - case 523: + case 536: { stmt := yyS[yypt-3].item.(*ast.BRIEStmt) stmt.Kind = ast.BRIEKindBackup @@ -14570,7 +14873,7 @@ yynewstate: stmt.Options = yyS[yypt-0].item.([]*ast.BRIEOption) parser.yyVAL.statement = stmt } - case 524: + case 537: { stmt := yyS[yypt-3].item.(*ast.BRIEStmt) stmt.Kind = ast.BRIEKindRestore @@ -14578,110 +14881,110 @@ yynewstate: stmt.Options = yyS[yypt-0].item.([]*ast.BRIEOption) parser.yyVAL.statement = stmt } - case 525: + case 538: { parser.yyVAL.item = &ast.BRIEStmt{} } - case 526: + case 539: { parser.yyVAL.item = &ast.BRIEStmt{Schemas: yyS[yypt-0].item.([]string)} } - case 527: + case 540: { parser.yyVAL.item = &ast.BRIEStmt{Tables: yyS[yypt-0].item.([]*ast.TableName)} } - case 528: + case 541: { parser.yyVAL.item = []string{yyS[yypt-0].ident} } - case 529: + case 542: { parser.yyVAL.item = append(yyS[yypt-2].item.([]string), yyS[yypt-0].ident) } - case 530: + case 543: { parser.yyVAL.item = []*ast.BRIEOption{} } - case 531: + case 544: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.BRIEOption), yyS[yypt-0].item.(*ast.BRIEOption)) } - case 532: + case 545: { parser.yyVAL.item = ast.BRIEOptionConcurrency } - case 533: + case 546: { parser.yyVAL.item = ast.BRIEOptionResume } - case 534: + case 547: { parser.yyVAL.item = ast.BRIEOptionSendCreds } - case 535: + case 548: { parser.yyVAL.item = ast.BRIEOptionOnline } - case 536: + case 549: { parser.yyVAL.item = ast.BRIEOptionCheckpoint } - case 537: + case 550: { parser.yyVAL.item = ast.BRIEOptionSkipSchemaFiles } - case 538: + case 551: { parser.yyVAL.item = ast.BRIEOptionStrictFormat } - case 539: + case 552: { parser.yyVAL.item = ast.BRIEOptionCSVNotNull } - case 540: + case 553: { parser.yyVAL.item = ast.BRIEOptionCSVBackslashEscape } - case 541: + case 554: { parser.yyVAL.item = ast.BRIEOptionCSVTrimLastSeparators } - case 542: + case 555: { parser.yyVAL.item = ast.BRIEOptionTiKVImporter } - case 543: + case 556: { parser.yyVAL.item = ast.BRIEOptionCSVSeparator } - case 544: + case 557: { parser.yyVAL.item = ast.BRIEOptionCSVDelimiter } - case 545: + case 558: { parser.yyVAL.item = ast.BRIEOptionCSVNull } - case 546: + case 559: { parser.yyVAL.item = ast.BRIEOptionBackend } - case 547: + case 560: { parser.yyVAL.item = ast.BRIEOptionOnDuplicate } - case 548: + case 561: { parser.yyVAL.item = ast.BRIEOptionOnDuplicate } - case 549: + case 562: { parser.yyVAL.item = &ast.BRIEOption{ Tp: yyS[yypt-2].item.(ast.BRIEOptionType), UintValue: yyS[yypt-0].item.(uint64), } } - case 550: + case 563: { value := uint64(0) if yyS[yypt-0].item.(bool) { @@ -14692,21 +14995,21 @@ yynewstate: UintValue: value, } } - case 551: + case 564: { parser.yyVAL.item = &ast.BRIEOption{ Tp: yyS[yypt-2].item.(ast.BRIEOptionType), StrValue: yyS[yypt-0].ident, } } - case 552: + case 565: { parser.yyVAL.item = &ast.BRIEOption{ Tp: yyS[yypt-2].item.(ast.BRIEOptionType), StrValue: strings.ToLower(yyS[yypt-0].ident), } } - case 553: + case 566: { unit, err := yyS[yypt-1].item.(ast.TimeUnitType).Duration() if err != nil { @@ -14719,35 +15022,35 @@ yynewstate: UintValue: yyS[yypt-2].item.(uint64) * uint64(unit), } } - case 554: + case 567: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionBackupTS, StrValue: yyS[yypt-0].ident, } } - case 555: + case 568: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionBackupTSO, UintValue: yyS[yypt-0].item.(uint64), } } - case 556: + case 569: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionLastBackupTS, StrValue: yyS[yypt-0].ident, } } - case 557: + case 570: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionLastBackupTSO, UintValue: yyS[yypt-0].item.(uint64), } } - case 558: + case 571: { // TODO: check overflow? parser.yyVAL.item = &ast.BRIEOption{ @@ -14755,21 +15058,21 @@ yynewstate: UintValue: yyS[yypt-3].item.(uint64) * 1048576, } } - case 559: + case 572: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionCSVHeader, UintValue: ast.BRIECSVHeaderIsColumns, } } - case 560: + case 573: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionCSVHeader, UintValue: yyS[yypt-0].item.(uint64), } } - case 561: + case 574: { value := uint64(0) if yyS[yypt-0].item.(bool) { @@ -14780,14 +15083,14 @@ yynewstate: UintValue: value, } } - case 562: + case 575: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionChecksum, UintValue: uint64(yyS[yypt-0].item.(ast.BRIEOptionLevel)), } } - case 563: + case 576: { value := uint64(0) if yyS[yypt-0].item.(bool) { @@ -14798,18 +15101,18 @@ yynewstate: UintValue: value, } } - case 564: + case 577: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionAnalyze, UintValue: uint64(yyS[yypt-0].item.(ast.BRIEOptionLevel)), } } - case 565: + case 578: { parser.yyVAL.item = getUint64FromNUM(yyS[yypt-0].item) } - case 566: + case 579: { v, rangeErrMsg := getInt64FromNUM(yyS[yypt-0].item) if len(rangeErrMsg) != 0 { @@ -14818,35 +15121,35 @@ yynewstate: } parser.yyVAL.item = v } - case 568: + case 581: { parser.yyVAL.item = yyS[yypt-0].item.(int64) != 0 } - case 569: + case 582: { parser.yyVAL.item = false } - case 570: + case 583: { parser.yyVAL.item = true } - case 571: + case 584: { parser.yyVAL.item = ast.BRIEOptionLevelOff } - case 572: + case 585: { parser.yyVAL.item = ast.BRIEOptionLevelOptional } - case 573: + case 586: { parser.yyVAL.item = ast.BRIEOptionLevelRequired } - case 574: + case 587: { parser.yyVAL.statement = &ast.PurgeImportStmt{TaskID: getUint64FromNUM(yyS[yypt-0].item)} } - case 575: + case 588: { parser.yyVAL.statement = &ast.CreateImportStmt{ IfNotExists: yyS[yypt-5].item.(bool), @@ -14856,21 +15159,21 @@ yynewstate: Options: yyS[yypt-0].item.([]*ast.BRIEOption), } } - case 576: + case 589: { parser.yyVAL.statement = &ast.StopImportStmt{ IfRunning: yyS[yypt-1].item.(bool), Name: yyS[yypt-0].ident, } } - case 577: + case 590: { parser.yyVAL.statement = &ast.ResumeImportStmt{ IfNotRunning: yyS[yypt-1].item.(bool), Name: yyS[yypt-0].ident, } } - case 578: + case 591: { s := &ast.AlterImportStmt{ Name: yyS[yypt-3].ident, @@ -14882,14 +15185,14 @@ yynewstate: } parser.yyVAL.statement = s } - case 579: + case 592: { parser.yyVAL.statement = &ast.DropImportStmt{ IfExists: yyS[yypt-1].item.(bool), Name: yyS[yypt-0].ident, } } - case 580: + case 593: { parser.yyVAL.statement = &ast.ShowImportStmt{ Name: yyS[yypt-2].ident, @@ -14897,73 +15200,73 @@ yynewstate: TableNames: yyS[yypt-0].item.([]*ast.TableName), } } - case 581: + case 594: { parser.yyVAL.item = false } - case 582: + case 595: { parser.yyVAL.item = true } - case 583: + case 596: { parser.yyVAL.item = false } - case 584: + case 597: { parser.yyVAL.item = true } - case 585: + case 598: { parser.yyVAL.item = false } - case 586: + case 599: { parser.yyVAL.item = true } - case 587: + case 600: { parser.yyVAL.item = ast.ErrorHandleError } - case 588: + case 601: { parser.yyVAL.item = ast.ErrorHandleReplace } - case 589: + case 602: { parser.yyVAL.item = ast.ErrorHandleSkipAll } - case 590: + case 603: { parser.yyVAL.item = ast.ErrorHandleSkipConstraint } - case 591: + case 604: { parser.yyVAL.item = ast.ErrorHandleSkipDuplicate } - case 592: + case 605: { parser.yyVAL.item = ast.ErrorHandleSkipStrict } - case 593: + case 606: { parser.yyVAL.item = nil } - case 594: + case 607: { parser.yyVAL.item = &ast.ImportTruncate{ IsErrorsOnly: false, TableNames: yyS[yypt-0].item.([]*ast.TableName), } } - case 595: + case 608: { parser.yyVAL.item = &ast.ImportTruncate{ IsErrorsOnly: true, TableNames: yyS[yypt-0].item.([]*ast.TableName), } } - case 596: + case 609: { v := yyS[yypt-2].ident v = strings.TrimPrefix(v, "@") @@ -14974,19 +15277,19 @@ yynewstate: Value: yyS[yypt-0].expr, } } - case 597: + case 610: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicOr, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 598: + case 611: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicXor, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 599: + case 612: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicAnd, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 600: + case 613: { expr, ok := yyS[yypt-0].expr.(*ast.ExistsSubqueryExpr) if ok { @@ -14996,7 +15299,7 @@ yynewstate: parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not, V: yyS[yypt-0].expr} } } - case 601: + case 614: { parser.yyVAL.expr = &ast.MatchAgainst{ ColumnNames: yyS[yypt-6].item.([]*ast.ColumnName), @@ -15004,87 +15307,87 @@ yynewstate: Modifier: ast.FulltextSearchModifier(yyS[yypt-1].item.(int)), } } - case 602: + case 615: { parser.yyVAL.expr = &ast.IsTruthExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), True: int64(1)} } - case 603: + case 616: { parser.yyVAL.expr = &ast.IsTruthExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), True: int64(0)} } - case 604: + case 617: { /* 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 606: + case 619: { parser.yyVAL.expr = &ast.MaxValueExpr{} } - case 608: + case 621: { parser.yyVAL.item = ast.FulltextSearchModifierNaturalLanguageMode } - case 609: + case 622: { parser.yyVAL.item = ast.FulltextSearchModifierNaturalLanguageMode } - case 610: + case 623: { parser.yyVAL.item = ast.FulltextSearchModifierNaturalLanguageMode | ast.FulltextSearchModifierWithQueryExpansion } - case 611: + case 624: { parser.yyVAL.item = ast.FulltextSearchModifierBooleanMode } - case 612: + case 625: { parser.yyVAL.item = ast.FulltextSearchModifierWithQueryExpansion } - case 617: + case 630: { parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} } - case 618: + case 631: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) } - case 619: + case 632: { parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} } - case 620: + case 633: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) } - case 621: + case 634: { parser.yyVAL.item = []ast.ExprNode{} } - case 623: + case 636: { parser.yyVAL.item = []ast.ExprNode{} } - case 625: + case 638: { expr := ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) parser.yyVAL.item = []ast.ExprNode{expr} } - case 626: + case 639: { parser.yyVAL.expr = &ast.IsNullExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool)} } - case 627: + case 640: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: yyS[yypt-1].item.(opcode.Op), L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 628: + case 641: { 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 629: + case 642: { v := yyS[yypt-2].ident v = strings.TrimPrefix(v, "@") @@ -15096,101 +15399,101 @@ yynewstate: } parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: yyS[yypt-3].item.(opcode.Op), L: yyS[yypt-4].expr, R: variable} } - case 631: + case 644: { parser.yyVAL.item = opcode.GE } - case 632: + case 645: { parser.yyVAL.item = opcode.GT } - case 633: + case 646: { parser.yyVAL.item = opcode.LE } - case 634: + case 647: { parser.yyVAL.item = opcode.LT } - case 635: + case 648: { parser.yyVAL.item = opcode.NE } - case 636: + case 649: { parser.yyVAL.item = opcode.NE } - case 637: + case 650: { parser.yyVAL.item = opcode.EQ } - case 638: + case 651: { parser.yyVAL.item = opcode.NullEQ } - case 639: + case 652: { parser.yyVAL.item = true } - case 640: + case 653: { parser.yyVAL.item = false } - case 641: + case 654: { parser.yyVAL.item = true } - case 642: + case 655: { parser.yyVAL.item = false } - case 643: + case 656: { parser.yyVAL.item = true } - case 644: + case 657: { parser.yyVAL.item = false } - case 645: + case 658: { parser.yyVAL.item = true } - case 646: + case 659: { parser.yyVAL.item = false } - case 647: + case 660: { parser.yyVAL.item = true } - case 648: + case 661: { parser.yyVAL.item = false } - case 649: + case 662: { parser.yyVAL.item = false } - case 650: + case 663: { parser.yyVAL.item = false } - case 651: + case 664: { parser.yyVAL.item = true } - case 652: + case 665: { parser.yyVAL.expr = &ast.PatternInExpr{Expr: yyS[yypt-4].expr, Not: !yyS[yypt-3].item.(bool), List: yyS[yypt-1].item.([]ast.ExprNode)} } - case 653: + case 666: { 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 654: + case 667: { parser.yyVAL.expr = &ast.BetweenExpr{ Expr: yyS[yypt-4].expr, @@ -15199,7 +15502,7 @@ yynewstate: Not: !yyS[yypt-3].item.(bool), } } - case 655: + case 668: { escape := yyS[yypt-0].ident if len(escape) > 1 { @@ -15215,133 +15518,140 @@ yynewstate: Escape: escape[0], } } - case 656: + case 669: { parser.yyVAL.expr = &ast.PatternRegexpExpr{Expr: yyS[yypt-2].expr, Pattern: yyS[yypt-0].expr, Not: !yyS[yypt-1].item.(bool)} } - case 660: + case 670: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONMemberOf), Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-1].expr}} + } + case 674: { parser.yyVAL.ident = "\\" } - case 661: + case 675: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 662: + case 676: { parser.yyVAL.item = &ast.SelectField{WildCard: &ast.WildCardField{}} } - case 663: + case 677: { wildCard := &ast.WildCardField{Table: model.NewCIStr(yyS[yypt-2].ident)} parser.yyVAL.item = &ast.SelectField{WildCard: wildCard} } - case 664: + case 678: { wildCard := &ast.WildCardField{Schema: model.NewCIStr(yyS[yypt-4].ident), Table: model.NewCIStr(yyS[yypt-2].ident)} parser.yyVAL.item = &ast.SelectField{WildCard: wildCard} } - case 665: + case 679: { expr := yyS[yypt-1].expr asName := yyS[yypt-0].ident parser.yyVAL.item = &ast.SelectField{Expr: expr, AsName: model.NewCIStr(asName)} } - case 666: + case 680: { parser.yyVAL.ident = "" } - case 669: + case 683: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 671: + case 685: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 672: + case 686: { field := yyS[yypt-0].item.(*ast.SelectField) field.Offset = parser.startOffset(&yyS[yypt]) + if field.Expr != nil && field.AsName.O == "" { + endOffset := parser.yylval.offset + field.SetText(parser.lexer.client, strings.TrimSpace(parser.src[field.Offset:endOffset])) + } parser.yyVAL.item = []*ast.SelectField{field} } - case 673: + case 687: { fl := yyS[yypt-2].item.([]*ast.SelectField) - last := fl[len(fl)-1] - if last.Expr != nil && last.AsName.O == "" { - lastEnd := parser.endOffset(&yyS[yypt-1]) - last.SetText(parser.lexer.client, parser.src[last.Offset:lastEnd]) + field := yyS[yypt-0].item.(*ast.SelectField) + field.Offset = parser.startOffset(&yyS[yypt]) + if field.Expr != nil && field.AsName.O == "" { + endOffset := parser.yylval.offset + field.SetText(parser.lexer.client, strings.TrimSpace(parser.src[field.Offset:endOffset])) } - newField := yyS[yypt-0].item.(*ast.SelectField) - newField.Offset = parser.startOffset(&yyS[yypt]) - parser.yyVAL.item = append(fl, newField) + parser.yyVAL.item = append(fl, field) } - case 674: + case 688: { parser.yyVAL.item = &ast.GroupByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} } - case 675: + case 689: { parser.yyVAL.item = nil } - case 676: + case 690: { parser.yyVAL.item = &ast.HavingClause{Expr: yyS[yypt-0].expr} } - case 677: + case 691: { parser.yyVAL.item = nil } - case 679: + case 693: { parser.yyVAL.item = &ast.AsOfClause{ TsExpr: yyS[yypt-0].expr.(ast.ExprNode), } } - case 680: + case 694: { parser.yyVAL.item = false } - case 681: + case 695: { parser.yyVAL.item = true } - case 682: + case 696: { parser.yyVAL.item = false } - case 683: + case 697: { parser.yyVAL.item = true } - case 684: + case 698: { parser.yyVAL.item = false } - case 685: + case 699: { parser.yyVAL.item = true } - case 686: + case 700: { parser.yyVAL.item = &ast.NullString{ String: "", Empty: false, } } - case 687: + case 701: { parser.yyVAL.item = &ast.NullString{ String: yyS[yypt-0].ident, Empty: len(yyS[yypt-0].ident) == 0, } } - case 688: + case 702: { parser.yyVAL.item = nil } - case 689: + case 703: { // Merge the options if yyS[yypt-1].item == nil { @@ -15365,19 +15675,19 @@ yynewstate: parser.yyVAL.item = opt1 } } - case 690: + case 704: { parser.yyVAL.item = &ast.IndexOption{ KeyBlockSize: yyS[yypt-0].item.(uint64), } } - case 691: + case 705: { parser.yyVAL.item = &ast.IndexOption{ Tp: yyS[yypt-0].item.(model.IndexType), } } - case 692: + case 706: { parser.yyVAL.item = &ast.IndexOption{ ParserName: model.NewCIStr(yyS[yypt-0].ident), @@ -15385,75 +15695,75 @@ yynewstate: yylex.AppendError(yylex.Errorf("The WITH PARASER clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 693: + case 707: { parser.yyVAL.item = &ast.IndexOption{ Comment: yyS[yypt-0].ident, } } - case 694: + case 708: { parser.yyVAL.item = &ast.IndexOption{ Visibility: yyS[yypt-0].item.(ast.IndexVisibility), } } - case 695: + case 709: { parser.yyVAL.item = &ast.IndexOption{ PrimaryKeyTp: yyS[yypt-0].item.(model.PrimaryKeyType), } } - case 696: + case 710: { parser.yyVAL.item = []interface{}{yyS[yypt-0].item, nil} } - case 697: + case 711: { parser.yyVAL.item = []interface{}{yyS[yypt-2].item, yyS[yypt-0].item} } - case 698: + case 712: { parser.yyVAL.item = []interface{}{&ast.NullString{String: yyS[yypt-2].ident, Empty: len(yyS[yypt-2].ident) == 0}, yyS[yypt-0].item} } - case 699: + case 713: { parser.yyVAL.item = nil } - case 701: + case 715: { parser.yyVAL.item = yyS[yypt-0].item } - case 702: + case 716: { parser.yyVAL.item = yyS[yypt-0].item } - case 703: + case 717: { parser.yyVAL.item = model.IndexTypeBtree } - case 704: + case 718: { parser.yyVAL.item = model.IndexTypeHash } - case 705: + case 719: { parser.yyVAL.item = model.IndexTypeRtree } - case 706: + case 720: { parser.yyVAL.item = ast.IndexVisibilityVisible } - case 707: + case 721: { parser.yyVAL.item = ast.IndexVisibilityInvisible } - case 1182: + case 1212: { parser.yyVAL.statement = &ast.CallStmt{ Procedure: yyS[yypt-0].expr.(*ast.FuncCallExpr), } } - case 1183: + case 1213: { parser.yyVAL.expr = &ast.FuncCallExpr{ Tp: ast.FuncCallExprTypeGeneric, @@ -15461,7 +15771,7 @@ yynewstate: Args: []ast.ExprNode{}, } } - case 1184: + case 1214: { parser.yyVAL.expr = &ast.FuncCallExpr{ Tp: ast.FuncCallExprTypeGeneric, @@ -15470,7 +15780,7 @@ yynewstate: Args: []ast.ExprNode{}, } } - case 1185: + case 1215: { parser.yyVAL.expr = &ast.FuncCallExpr{ Tp: ast.FuncCallExprTypeGeneric, @@ -15478,7 +15788,7 @@ yynewstate: Args: yyS[yypt-1].item.([]ast.ExprNode), } } - case 1186: + case 1216: { parser.yyVAL.expr = &ast.FuncCallExpr{ Tp: ast.FuncCallExprTypeGeneric, @@ -15487,7 +15797,7 @@ yynewstate: Args: yyS[yypt-1].item.([]ast.ExprNode), } } - case 1187: + case 1217: { x := yyS[yypt-1].item.(*ast.InsertStmt) x.Priority = yyS[yypt-6].item.(mysql.PriorityEnum) @@ -15504,26 +15814,26 @@ yynewstate: x.PartitionNames = yyS[yypt-2].item.([]model.CIStr) parser.yyVAL.statement = x } - case 1190: + case 1220: { parser.yyVAL.item = &ast.InsertStmt{ Columns: yyS[yypt-3].item.([]*ast.ColumnName), Lists: yyS[yypt-0].item.([][]ast.ExprNode), } } - case 1191: + case 1221: { parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 1192: + case 1222: { parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 1193: + case 1223: { parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 1194: + case 1224: { var sel ast.ResultSetNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -15536,23 +15846,23 @@ yynewstate: } parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: sel} } - case 1195: + case 1225: { parser.yyVAL.item = &ast.InsertStmt{Lists: yyS[yypt-0].item.([][]ast.ExprNode)} } - case 1196: + case 1226: { parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 1197: + case 1227: { parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 1198: + case 1228: { parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 1199: + case 1229: { var sel ast.ResultSetNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -15565,66 +15875,66 @@ yynewstate: } parser.yyVAL.item = &ast.InsertStmt{Select: sel} } - case 1200: + case 1230: { parser.yyVAL.item = &ast.InsertStmt{Setlist: yyS[yypt-0].item.([]*ast.Assignment)} } - case 1203: + case 1233: { parser.yyVAL.item = [][]ast.ExprNode{yyS[yypt-0].item.([]ast.ExprNode)} } - case 1204: + case 1234: { parser.yyVAL.item = append(yyS[yypt-2].item.([][]ast.ExprNode), yyS[yypt-0].item.([]ast.ExprNode)) } - case 1205: + case 1235: { parser.yyVAL.item = yyS[yypt-1].item } - case 1206: + case 1236: { parser.yyVAL.item = []ast.ExprNode{} } - case 1208: + case 1238: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) } - case 1209: + case 1239: { parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} } - case 1211: + case 1241: { parser.yyVAL.expr = &ast.DefaultExpr{} } - case 1212: + case 1242: { parser.yyVAL.item = &ast.Assignment{ Column: yyS[yypt-2].item.(*ast.ColumnName), Expr: yyS[yypt-0].expr, } } - case 1213: + case 1243: { parser.yyVAL.item = []*ast.Assignment{} } - case 1214: + case 1244: { parser.yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} } - case 1215: + case 1245: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.Assignment), yyS[yypt-0].item.(*ast.Assignment)) } - case 1216: + case 1246: { parser.yyVAL.item = nil } - case 1217: + case 1247: { parser.yyVAL.item = yyS[yypt-0].item } - case 1218: + case 1248: { x := yyS[yypt-0].item.(*ast.InsertStmt) x.IsReplace = true @@ -15634,31 +15944,31 @@ yynewstate: x.PartitionNames = yyS[yypt-1].item.([]model.CIStr) parser.yyVAL.statement = x } - case 1219: + case 1249: { parser.yyVAL.expr = ast.NewValueExpr(false, parser.charset, parser.collation) } - case 1220: + case 1250: { parser.yyVAL.expr = ast.NewValueExpr(nil, parser.charset, parser.collation) } - case 1221: + case 1251: { parser.yyVAL.expr = ast.NewValueExpr(true, parser.charset, parser.collation) } - case 1222: + case 1252: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1223: + case 1253: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1224: + case 1254: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1226: + case 1256: { // See https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html co, err := charset.GetDefaultCollationLegacy(yyS[yypt-1].ident) @@ -15675,15 +15985,15 @@ yynewstate: } parser.yyVAL.expr = expr } - case 1227: + case 1257: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1228: + case 1258: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1229: + case 1259: { co, err := charset.GetDefaultCollationLegacy(yyS[yypt-1].ident) if err != nil { @@ -15699,7 +16009,7 @@ yynewstate: } parser.yyVAL.expr = expr } - case 1230: + case 1260: { co, err := charset.GetDefaultCollationLegacy(yyS[yypt-1].ident) if err != nil { @@ -15715,12 +16025,12 @@ yynewstate: } parser.yyVAL.expr = expr } - case 1231: + case 1261: { expr := ast.NewValueExpr(yyS[yypt-0].ident, parser.charset, parser.collation) parser.yyVAL.expr = expr } - case 1232: + case 1262: { valExpr := yyS[yypt-1].expr.(ast.ValueExpr) strLit := valExpr.GetString() @@ -15733,31 +16043,31 @@ yynewstate: } parser.yyVAL.expr = expr } - case 1233: + case 1263: { parser.yyVAL.item = []*ast.AlterOrderItem{yyS[yypt-0].item.(*ast.AlterOrderItem)} } - case 1234: + case 1264: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.AlterOrderItem), yyS[yypt-0].item.(*ast.AlterOrderItem)) } - case 1235: + case 1265: { parser.yyVAL.item = &ast.AlterOrderItem{Column: yyS[yypt-1].item.(*ast.ColumnName), Desc: yyS[yypt-0].item.(bool)} } - case 1236: + case 1266: { parser.yyVAL.item = &ast.OrderByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} } - case 1237: + case 1267: { parser.yyVAL.item = []*ast.ByItem{yyS[yypt-0].item.(*ast.ByItem)} } - case 1238: + case 1268: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ByItem), yyS[yypt-0].item.(*ast.ByItem)) } - case 1239: + case 1269: { expr := yyS[yypt-0].expr valueExpr, ok := expr.(ast.ValueExpr) @@ -15769,7 +16079,7 @@ yynewstate: } parser.yyVAL.item = &ast.ByItem{Expr: expr, NullOrder: true} } - case 1240: + case 1270: { expr := yyS[yypt-1].expr valueExpr, ok := expr.(ast.ValueExpr) @@ -15781,55 +16091,55 @@ yynewstate: } parser.yyVAL.item = &ast.ByItem{Expr: expr, Desc: yyS[yypt-0].item.(bool)} } - case 1241: + case 1271: { parser.yyVAL.item = false } - case 1242: + case 1272: { parser.yyVAL.item = true } - case 1243: + case 1273: { parser.yyVAL.item = false // ASC by default } - case 1244: + case 1274: { parser.yyVAL.item = false } - case 1245: + case 1275: { parser.yyVAL.item = true } - case 1246: + case 1276: { parser.yyVAL.item = nil } - case 1248: + case 1278: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Or, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1249: + case 1279: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.And, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1250: + case 1280: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LeftShift, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1251: + case 1281: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.RightShift, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1252: + case 1282: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Plus, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1253: + case 1283: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Minus, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1254: + case 1284: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr("DATE_ADD"), @@ -15840,7 +16150,7 @@ yynewstate: }, } } - case 1255: + case 1285: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr("DATE_SUB"), @@ -15851,7 +16161,7 @@ yynewstate: }, } } - case 1256: + case 1286: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr("DATE_ADD"), @@ -15862,44 +16172,44 @@ yynewstate: }, } } - case 1257: + case 1287: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mul, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1258: + case 1288: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Div, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1259: + case 1289: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1260: + case 1290: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.IntDiv, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1261: + case 1291: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1262: + case 1292: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Xor, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1264: + case 1294: { parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ Name: model.NewCIStr(yyS[yypt-0].ident), }} } - case 1265: + case 1295: { parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ Table: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident), }} } - case 1266: + case 1296: { parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ Schema: model.NewCIStr(yyS[yypt-4].ident), @@ -15907,39 +16217,39 @@ yynewstate: Name: model.NewCIStr(yyS[yypt-0].ident), }} } - case 1271: + case 1301: { parser.yyVAL.expr = &ast.SetCollationExpr{Expr: yyS[yypt-2].expr, Collate: yyS[yypt-0].ident} } - case 1274: + case 1304: { parser.yyVAL.expr = ast.NewParamMarkerExpr(yyS[yypt].offset) } - case 1277: + case 1307: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not2, V: yyS[yypt-0].expr} } - case 1278: + case 1308: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.BitNeg, V: yyS[yypt-0].expr} } - case 1279: + case 1309: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Minus, V: yyS[yypt-0].expr} } - case 1280: + case 1310: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Plus, V: yyS[yypt-0].expr} } - case 1281: + case 1311: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.Concat), Args: []ast.ExprNode{yyS[yypt-2].expr, yyS[yypt-0].expr}} } - case 1282: + case 1312: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not2, V: yyS[yypt-0].expr} } - case 1284: + case 1314: { startOffset := parser.startOffset(&yyS[yypt-1]) endOffset := parser.endOffset(&yyS[yypt]) @@ -15947,23 +16257,23 @@ yynewstate: expr.SetText(parser.lexer.client, parser.src[startOffset:endOffset]) parser.yyVAL.expr = &ast.ParenthesesExpr{Expr: expr} } - case 1285: + case 1315: { values := append(yyS[yypt-3].item.([]ast.ExprNode), yyS[yypt-1].expr) parser.yyVAL.expr = &ast.RowExpr{Values: values} } - case 1286: + case 1316: { values := append(yyS[yypt-3].item.([]ast.ExprNode), yyS[yypt-1].expr) parser.yyVAL.expr = &ast.RowExpr{Values: values} } - case 1287: + case 1317: { sq := yyS[yypt-0].expr.(*ast.SubqueryExpr) sq.Exists = true parser.yyVAL.expr = &ast.ExistsSubqueryExpr{Sel: sq} } - case 1288: + case 1318: { /* * ODBC escape syntax. @@ -15987,7 +16297,7 @@ yynewstate: parser.yyVAL.expr = yyS[yypt-1].expr } } - case 1289: + case 1319: { // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#operator_binary tp := types.NewFieldType(mysql.TypeString) @@ -16000,10 +16310,10 @@ yynewstate: FunctionType: ast.CastBinaryOperator, } } - case 1290: + case 1320: { /* See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_cast */ - tp := yyS[yypt-1].item.(*types.FieldType) + tp := yyS[yypt-2].item.(*types.FieldType) defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.GetType()) if tp.GetFlen() == types.UnspecifiedLength { tp.SetFlen(defaultFlen) @@ -16011,16 +16321,22 @@ yynewstate: 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-3].expr, + Expr: yyS[yypt-4].expr, Tp: tp, FunctionType: ast.CastFunction, ExplicitCharSet: explicitCharset, } } - case 1291: + case 1321: { x := &ast.CaseExpr{WhenClauses: yyS[yypt-2].item.([]*ast.WhenClause)} if yyS[yypt-3].expr != nil { @@ -16031,7 +16347,7 @@ yynewstate: } parser.yyVAL.expr = x } - case 1292: + case 1322: { // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert tp := yyS[yypt-1].item.(*types.FieldType) @@ -16051,7 +16367,7 @@ yynewstate: ExplicitCharSet: explicitCharset, } } - case 1293: + case 1323: { // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert charset1 := ast.NewValueExpr(yyS[yypt-1].ident, "", "") @@ -16060,62 +16376,70 @@ yynewstate: Args: []ast.ExprNode{yyS[yypt-3].expr, charset1}, } } - case 1294: + case 1324: { parser.yyVAL.expr = &ast.DefaultExpr{Name: yyS[yypt-1].expr.(*ast.ColumnNameExpr).Name} } - case 1295: + case 1325: { parser.yyVAL.expr = &ast.ValuesExpr{Column: yyS[yypt-1].expr.(*ast.ColumnNameExpr)} } - case 1296: + case 1326: { expr := ast.NewValueExpr(yyS[yypt-0].ident, parser.charset, parser.collation) parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{yyS[yypt-2].expr, expr}} } - case 1297: + case 1327: { expr := ast.NewValueExpr(yyS[yypt-0].ident, parser.charset, parser.collation) extract := &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{yyS[yypt-2].expr, expr}} parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONUnquote), Args: []ast.ExprNode{extract}} } - case 1300: + case 1328: { parser.yyVAL.item = false } - case 1301: + case 1329: { parser.yyVAL.item = true } - case 1302: + case 1332: { parser.yyVAL.item = false } - case 1304: + case 1333: { parser.yyVAL.item = true } - case 1307: + case 1334: + { + parser.yyVAL.item = false + } + case 1336: { parser.yyVAL.item = true } - case 1350: + case 1339: + { + parser.yyVAL.item = true + } + case 1382: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1351: + case 1383: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1352: + case 1384: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-1].ident)} } - case 1353: + case 1385: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-2].ident)} } - case 1354: + case 1386: { args := []ast.ExprNode{} if yyS[yypt-0].item != nil { @@ -16123,7 +16447,7 @@ yynewstate: } parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-1].ident), Args: args} } - case 1355: + case 1387: { nilVal := ast.NewValueExpr(nil, parser.charset, parser.collation) args := yyS[yypt-1].item.([]ast.ExprNode) @@ -16132,7 +16456,7 @@ yynewstate: Args: append(args, nilVal), } } - case 1356: + case 1388: { charset1 := ast.NewValueExpr(yyS[yypt-1].ident, "", "") args := yyS[yypt-3].item.([]ast.ExprNode) @@ -16141,42 +16465,42 @@ yynewstate: Args: append(args, charset1), } } - case 1357: + case 1389: { expr := ast.NewValueExpr(yyS[yypt-0].ident, "", "") parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.DateLiteral), Args: []ast.ExprNode{expr}} } - case 1358: + case 1390: { expr := ast.NewValueExpr(yyS[yypt-0].ident, "", "") parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimeLiteral), Args: []ast.ExprNode{expr}} } - case 1359: + case 1391: { expr := ast.NewValueExpr(yyS[yypt-0].ident, "", "") parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimestampLiteral), Args: []ast.ExprNode{expr}} } - case 1360: + case 1392: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.InsertFunc), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1361: + case 1393: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-3].expr, R: yyS[yypt-1].expr} } - case 1362: + case 1394: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.PasswordFunc), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1363: + case 1395: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1364: + case 1396: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1365: + case 1397: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), @@ -16187,7 +16511,7 @@ yynewstate: }, } } - case 1366: + case 1398: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), @@ -16198,7 +16522,7 @@ yynewstate: }, } } - case 1367: + case 1399: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), @@ -16209,7 +16533,7 @@ yynewstate: }, } } - case 1368: + case 1400: { timeUnit := &ast.TimeUnitExpr{Unit: yyS[yypt-3].item.(ast.TimeUnitType)} parser.yyVAL.expr = &ast.FuncCallExpr{ @@ -16217,7 +16541,7 @@ yynewstate: Args: []ast.ExprNode{timeUnit, yyS[yypt-1].expr}, } } - case 1369: + case 1401: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), @@ -16227,67 +16551,67 @@ yynewstate: }, } } - case 1370: + case 1402: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}} } - case 1371: + case 1403: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 1372: + case 1404: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 1373: + case 1405: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 1374: + case 1406: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 1375: + case 1407: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.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 1376: + case 1408: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.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 1377: + case 1409: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-3].ident), Args: []ast.ExprNode{yyS[yypt-1].expr}, } } - case 1378: + case 1410: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-1].expr, yyS[yypt-3].expr}, } } - case 1379: + case 1411: { spaceVal := ast.NewValueExpr(" ", parser.charset, parser.collation) direction := &ast.TrimDirectionExpr{Direction: yyS[yypt-3].item.(ast.TrimDirectionType)} @@ -16296,7 +16620,7 @@ yynewstate: Args: []ast.ExprNode{yyS[yypt-1].expr, spaceVal, direction}, } } - case 1380: + case 1412: { direction := &ast.TrimDirectionExpr{Direction: yyS[yypt-4].item.(ast.TrimDirectionType)} parser.yyVAL.expr = &ast.FuncCallExpr{ @@ -16304,63 +16628,63 @@ yynewstate: Args: []ast.ExprNode{yyS[yypt-1].expr, yyS[yypt-3].expr, direction}, } } - case 1381: + case 1413: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-3].ident), Args: []ast.ExprNode{yyS[yypt-1].expr}, } } - case 1382: + case 1414: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.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 1383: + case 1415: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.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 1385: + case 1417: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 1386: + case 1418: { parser.yyVAL.item = ast.GetFormatSelectorDate } - case 1387: + case 1419: { parser.yyVAL.item = ast.GetFormatSelectorDatetime } - case 1388: + case 1420: { parser.yyVAL.item = ast.GetFormatSelectorTime } - case 1389: + case 1421: { parser.yyVAL.item = ast.GetFormatSelectorDatetime } - case 1394: + case 1426: { parser.yyVAL.item = ast.TrimBoth } - case 1395: + case 1427: { parser.yyVAL.item = ast.TrimLeading } - case 1396: + case 1428: { parser.yyVAL.item = ast.TrimTrailing } - case 1397: + case 1429: { objNameExpr := &ast.TableNameExpr{ Name: yyS[yypt-1].item.(*ast.TableName), @@ -16370,7 +16694,7 @@ yynewstate: Args: []ast.ExprNode{objNameExpr}, } } - case 1398: + case 1430: { objNameExpr := &ast.TableNameExpr{ Name: yyS[yypt-3].item.(*ast.TableName), @@ -16381,7 +16705,7 @@ yynewstate: Args: []ast.ExprNode{objNameExpr, valueExpr}, } } - case 1400: + case 1432: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16389,15 +16713,15 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1401: + case 1433: { parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: yyS[yypt-1].item.([]ast.ExprNode), Distinct: false} } - case 1402: + case 1434: { parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1403: + case 1435: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16405,7 +16729,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1404: + case 1436: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16413,7 +16737,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1405: + case 1437: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16421,7 +16745,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1406: + case 1438: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16429,7 +16753,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1407: + case 1439: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16437,7 +16761,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1408: + case 1440: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16445,11 +16769,11 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1409: + case 1441: { parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: yyS[yypt-1].item.([]ast.ExprNode), Distinct: true} } - case 1410: + case 1442: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16457,7 +16781,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1411: + case 1443: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16465,7 +16789,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1412: + case 1444: { args := []ast.ExprNode{ast.NewValueExpr(1, parser.charset, parser.collation)} if yyS[yypt-0].item != nil { @@ -16474,7 +16798,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: args} } } - case 1413: + case 1445: { args := yyS[yypt-4].item.([]ast.ExprNode) args = append(args, yyS[yypt-2].item.(ast.ExprNode)) @@ -16488,7 +16812,7 @@ yynewstate: parser.yyVAL.expr = agg } } - case 1414: + case 1446: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16496,7 +16820,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1415: + case 1447: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16504,7 +16828,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1416: + case 1448: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16512,7 +16836,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1417: + case 1449: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: ast.AggFuncStddevPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16520,7 +16844,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: ast.AggFuncStddevPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1418: + case 1450: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16528,7 +16852,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1419: + case 1451: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: ast.AggFuncVarPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16536,11 +16860,11 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: ast.AggFuncVarPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1420: + case 1452: { parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } - case 1421: + case 1453: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16548,7 +16872,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1422: + case 1454: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16556,7 +16880,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1423: + case 1455: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-6].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16564,7 +16888,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-6].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}} } } - case 1424: + case 1456: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16572,7 +16896,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}} } } - case 1425: + case 1457: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16580,7 +16904,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}} } } - case 1426: + case 1458: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-8].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16588,22 +16912,22 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-8].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}} } } - case 1427: + case 1459: { parser.yyVAL.item = ast.NewValueExpr(",", "", "") } - case 1428: + case 1460: { parser.yyVAL.item = ast.NewValueExpr(yyS[yypt-0].ident, "", "") } - case 1429: + case 1461: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode), } } - case 1430: + case 1462: { var tp ast.FuncCallExprType if isInTokenMap(yyS[yypt-3].ident) { @@ -16618,159 +16942,159 @@ yynewstate: Args: yyS[yypt-1].item.([]ast.ExprNode), } } - case 1431: + case 1463: { parser.yyVAL.item = nil } - case 1432: + case 1464: { parser.yyVAL.item = nil } - case 1433: + case 1465: { expr := ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation) parser.yyVAL.item = expr } - case 1435: + case 1467: { parser.yyVAL.item = ast.TimeUnitSecondMicrosecond } - case 1436: + case 1468: { parser.yyVAL.item = ast.TimeUnitMinuteMicrosecond } - case 1437: + case 1469: { parser.yyVAL.item = ast.TimeUnitMinuteSecond } - case 1438: + case 1470: { parser.yyVAL.item = ast.TimeUnitHourMicrosecond } - case 1439: + case 1471: { parser.yyVAL.item = ast.TimeUnitHourSecond } - case 1440: + case 1472: { parser.yyVAL.item = ast.TimeUnitHourMinute } - case 1441: + case 1473: { parser.yyVAL.item = ast.TimeUnitDayMicrosecond } - case 1442: + case 1474: { parser.yyVAL.item = ast.TimeUnitDaySecond } - case 1443: + case 1475: { parser.yyVAL.item = ast.TimeUnitDayMinute } - case 1444: + case 1476: { parser.yyVAL.item = ast.TimeUnitDayHour } - case 1445: + case 1477: { parser.yyVAL.item = ast.TimeUnitYearMonth } - case 1446: + case 1478: { parser.yyVAL.item = ast.TimeUnitMicrosecond } - case 1447: + case 1479: { parser.yyVAL.item = ast.TimeUnitSecond } - case 1448: + case 1480: { parser.yyVAL.item = ast.TimeUnitMinute } - case 1449: + case 1481: { parser.yyVAL.item = ast.TimeUnitHour } - case 1450: + case 1482: { parser.yyVAL.item = ast.TimeUnitDay } - case 1451: + case 1483: { parser.yyVAL.item = ast.TimeUnitWeek } - case 1452: + case 1484: { parser.yyVAL.item = ast.TimeUnitMonth } - case 1453: + case 1485: { parser.yyVAL.item = ast.TimeUnitQuarter } - case 1454: + case 1486: { parser.yyVAL.item = ast.TimeUnitYear } - case 1455: + case 1487: { parser.yyVAL.item = ast.TimeUnitSecond } - case 1456: + case 1488: { parser.yyVAL.item = ast.TimeUnitMinute } - case 1457: + case 1489: { parser.yyVAL.item = ast.TimeUnitHour } - case 1458: + case 1490: { parser.yyVAL.item = ast.TimeUnitDay } - case 1459: + case 1491: { parser.yyVAL.item = ast.TimeUnitWeek } - case 1460: + case 1492: { parser.yyVAL.item = ast.TimeUnitMonth } - case 1461: + case 1493: { parser.yyVAL.item = ast.TimeUnitQuarter } - case 1462: + case 1494: { parser.yyVAL.item = ast.TimeUnitYear } - case 1463: + case 1495: { parser.yyVAL.expr = nil } - case 1465: + case 1497: { parser.yyVAL.item = []*ast.WhenClause{yyS[yypt-0].item.(*ast.WhenClause)} } - case 1466: + case 1498: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.WhenClause), yyS[yypt-0].item.(*ast.WhenClause)) } - case 1467: + case 1499: { parser.yyVAL.item = &ast.WhenClause{ Expr: yyS[yypt-2].expr, Result: yyS[yypt-0].expr, } } - case 1468: + case 1500: { parser.yyVAL.item = nil } - case 1469: + case 1501: { parser.yyVAL.item = yyS[yypt-0].expr } - case 1470: + case 1502: { tp := types.NewFieldType(mysql.TypeVarString) tp.SetFlen(yyS[yypt-0].item.(int)) // TODO: Flen should be the flen of expression @@ -16782,7 +17106,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1471: + case 1503: { tp := types.NewFieldType(mysql.TypeVarString) tp.SetFlen(yyS[yypt-1].item.(int)) // TODO: Flen should be the flen of expression @@ -16805,7 +17129,7 @@ yynewstate: } parser.yyVAL.item = tp } - case 1472: + case 1504: { tp := types.NewFieldType(mysql.TypeDate) tp.SetCharset(charset.CharsetBin) @@ -16813,7 +17137,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1473: + case 1505: { tp := types.NewFieldType(mysql.TypeYear) tp.SetCharset(charset.CharsetBin) @@ -16821,7 +17145,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1474: + case 1506: { tp := types.NewFieldType(mysql.TypeDatetime) flen, _ := mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDatetime) @@ -16835,7 +17159,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1475: + case 1507: { fopt := yyS[yypt-0].item.(*ast.FloatOpt) tp := types.NewFieldType(mysql.TypeNewDecimal) @@ -16846,7 +17170,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1476: + case 1508: { tp := types.NewFieldType(mysql.TypeDuration) flen, _ := mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDuration) @@ -16860,7 +17184,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1477: + case 1509: { tp := types.NewFieldType(mysql.TypeLonglong) tp.SetCharset(charset.CharsetBin) @@ -16868,7 +17192,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1478: + case 1510: { tp := types.NewFieldType(mysql.TypeLonglong) tp.AddFlag(mysql.UnsignedFlag | mysql.BinaryFlag) @@ -16876,7 +17200,7 @@ yynewstate: tp.SetCollate(charset.CollationBin) parser.yyVAL.item = tp } - case 1479: + case 1511: { tp := types.NewFieldType(mysql.TypeJSON) tp.AddFlag(mysql.BinaryFlag | mysql.ParseToJSONFlag) @@ -16884,7 +17208,7 @@ yynewstate: tp.SetCollate(mysql.DefaultCollationName) parser.yyVAL.item = tp } - case 1480: + case 1512: { tp := types.NewFieldType(mysql.TypeDouble) flen, decimal := mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDouble) @@ -16895,7 +17219,7 @@ yynewstate: tp.SetCollate(charset.CollationBin) parser.yyVAL.item = tp } - case 1481: + case 1513: { tp := types.NewFieldType(mysql.TypeFloat) fopt := yyS[yypt-0].item.(*ast.FloatOpt) @@ -16912,7 +17236,7 @@ yynewstate: tp.SetCollate(charset.CollationBin) parser.yyVAL.item = tp } - case 1482: + case 1514: { var tp *types.FieldType if parser.lexer.GetSQLMode().HasRealAsFloatMode() { @@ -16928,65 +17252,65 @@ yynewstate: tp.SetCollate(charset.CollationBin) parser.yyVAL.item = tp } - case 1483: + case 1515: { parser.yyVAL.item = mysql.LowPriority } - case 1484: + case 1516: { parser.yyVAL.item = mysql.HighPriority } - case 1485: + case 1517: { parser.yyVAL.item = mysql.DelayedPriority } - case 1486: + case 1518: { parser.yyVAL.item = mysql.NoPriority } - case 1488: + case 1520: { parser.yyVAL.item = &ast.TableName{Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 1489: + case 1521: { parser.yyVAL.item = &ast.TableName{Schema: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 1490: + case 1522: { tbl := []*ast.TableName{yyS[yypt-0].item.(*ast.TableName)} parser.yyVAL.item = tbl } - case 1491: + case 1523: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableName), yyS[yypt-0].item.(*ast.TableName)) } - case 1492: + case 1524: { parser.yyVAL.item = &ast.TableName{Name: model.NewCIStr(yyS[yypt-1].ident)} } - case 1493: + case 1525: { parser.yyVAL.item = &ast.TableName{Schema: model.NewCIStr(yyS[yypt-3].ident), Name: model.NewCIStr(yyS[yypt-1].ident)} } - case 1494: + case 1526: { tbl := []*ast.TableName{yyS[yypt-0].item.(*ast.TableName)} parser.yyVAL.item = tbl } - case 1495: + case 1527: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableName), yyS[yypt-0].item.(*ast.TableName)) } - case 1498: + case 1530: { parser.yyVAL.item = false } - case 1499: + case 1531: { parser.yyVAL.item = true } - case 1500: + case 1532: { var sqlText string var sqlVar *ast.VariableExpr @@ -17002,94 +17326,94 @@ yynewstate: SQLVar: sqlVar, } } - case 1501: + case 1533: { parser.yyVAL.item = yyS[yypt-0].ident } - case 1502: + case 1534: { parser.yyVAL.item = yyS[yypt-0].expr } - case 1503: + case 1535: { parser.yyVAL.statement = &ast.ExecuteStmt{Name: yyS[yypt-0].ident} } - case 1504: + case 1536: { parser.yyVAL.statement = &ast.ExecuteStmt{ Name: yyS[yypt-2].ident, UsingVars: yyS[yypt-0].item.([]ast.ExprNode), } } - case 1505: + case 1537: { parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} } - case 1506: + case 1538: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) } - case 1507: + case 1539: { parser.yyVAL.statement = &ast.DeallocateStmt{Name: yyS[yypt-0].ident} } - case 1510: + case 1542: { parser.yyVAL.statement = &ast.RollbackStmt{} } - case 1511: + case 1543: { parser.yyVAL.statement = &ast.RollbackStmt{CompletionType: yyS[yypt-0].item.(ast.CompletionType)} } - case 1512: + case 1544: { parser.yyVAL.statement = &ast.RollbackStmt{SavepointName: yyS[yypt-0].ident} } - case 1513: + case 1545: { parser.yyVAL.statement = &ast.RollbackStmt{SavepointName: yyS[yypt-0].ident} } - case 1514: + case 1546: { parser.yyVAL.item = ast.CompletionTypeChain } - case 1515: + case 1547: { parser.yyVAL.item = ast.CompletionTypeRelease } - case 1516: + case 1548: { parser.yyVAL.item = ast.CompletionTypeDefault } - case 1517: + case 1549: { parser.yyVAL.item = ast.CompletionTypeChain } - case 1518: + case 1550: { parser.yyVAL.item = ast.CompletionTypeDefault } - case 1519: + case 1551: { parser.yyVAL.item = ast.CompletionTypeRelease } - case 1520: + case 1552: { parser.yyVAL.item = ast.CompletionTypeDefault } - case 1521: + case 1553: { parser.yyVAL.statement = &ast.ShutdownStmt{} } - case 1522: + case 1554: { parser.yyVAL.statement = &ast.RestartStmt{} } - case 1523: + case 1555: { parser.yyVAL.statement = &ast.HelpStmt{Topic: yyS[yypt-0].ident} } - case 1524: + case 1556: { st := &ast.SelectStmt{ SelectStmtOpts: yyS[yypt-2].item.(*ast.SelectStmtOpts), @@ -17105,7 +17429,7 @@ yynewstate: } parser.yyVAL.item = st } - case 1525: + case 1557: { st := yyS[yypt-2].item.(*ast.SelectStmt) lastField := st.Fields.Fields[len(st.Fields.Fields)-1] @@ -17117,7 +17441,7 @@ yynewstate: st.Where = yyS[yypt-0].item.(ast.ExprNode) } } - case 1526: + case 1558: { st := yyS[yypt-6].item.(*ast.SelectStmt) st.From = yyS[yypt-4].item.(*ast.TableRefsClause) @@ -17140,11 +17464,11 @@ yynewstate: } parser.yyVAL.item = st } - case 1527: + case 1559: { parser.yyVAL.item = nil } - case 1528: + case 1560: { var repSeed ast.ExprNode if yyS[yypt-0].expr != nil { @@ -17157,7 +17481,7 @@ yynewstate: RepeatableSeed: repSeed, } } - case 1529: + case 1561: { var repSeed ast.ExprNode if yyS[yypt-0].expr != nil { @@ -17168,72 +17492,48 @@ yynewstate: RepeatableSeed: repSeed, } } - case 1530: + case 1562: { parser.yyVAL.item = ast.SampleMethodTypeNone } - case 1531: + case 1563: { parser.yyVAL.item = ast.SampleMethodTypeSystem } - case 1532: + case 1564: { parser.yyVAL.item = ast.SampleMethodTypeBernoulli } - case 1533: + case 1565: { parser.yyVAL.item = ast.SampleMethodTypeTiDBRegion } - case 1534: + case 1566: { parser.yyVAL.item = ast.SampleClauseUnitTypeDefault } - case 1535: + case 1567: { parser.yyVAL.item = ast.SampleClauseUnitTypeRow } - case 1536: + case 1568: { parser.yyVAL.item = ast.SampleClauseUnitTypePercent } - case 1537: + case 1569: { parser.yyVAL.expr = nil } - case 1538: + case 1570: { parser.yyVAL.expr = yyS[yypt-1].expr } - case 1539: + case 1571: { st := yyS[yypt-6].item.(*ast.SelectStmt) if yyS[yypt-1].item != nil { st.LockInfo = yyS[yypt-1].item.(*ast.SelectLockInfo) } - lastField := st.Fields.Fields[len(st.Fields.Fields)-1] - if lastField.Expr != nil && lastField.AsName.O == "" { - src := parser.src - var lastEnd int - if yyS[yypt-5].item != nil { - lastEnd = yyS[yypt-5].offset - 1 - } else if yyS[yypt-4].item != nil { - lastEnd = yyS[yypt-4].offset - 1 - } else if yyS[yypt-3].item != nil { - lastEnd = yyS[yypt-3].offset - 1 - } else if yyS[yypt-2].item != nil { - lastEnd = yyS[yypt-2].offset - 1 - } else if st.LockInfo != nil && st.LockInfo.LockType != ast.SelectLockNone { - lastEnd = yyS[yypt-1].offset - 1 - } else if yyS[yypt-0].item != nil { - lastEnd = yyS[yypt].offset - 1 - } else { - lastEnd = len(src) - if src[lastEnd-1] == ';' { - lastEnd-- - } - } - lastField.SetText(parser.lexer.client, src[lastField.Offset:lastEnd]) - } if yyS[yypt-5].item != nil { st.Where = yyS[yypt-5].item.(ast.ExprNode) } @@ -17251,7 +17551,7 @@ yynewstate: } parser.yyVAL.statement = st } - case 1540: + case 1572: { st := yyS[yypt-5].item.(*ast.SelectStmt) if yyS[yypt-4].item != nil { @@ -17271,7 +17571,7 @@ yynewstate: } parser.yyVAL.statement = st } - case 1541: + case 1573: { st := yyS[yypt-4].item.(*ast.SelectStmt) if yyS[yypt-1].item != nil { @@ -17288,7 +17588,7 @@ yynewstate: } parser.yyVAL.statement = st } - case 1542: + case 1574: { st := &ast.SelectStmt{ Kind: ast.SelectStmtKindTable, @@ -17310,7 +17610,7 @@ yynewstate: } parser.yyVAL.statement = st } - case 1543: + case 1575: { st := &ast.SelectStmt{ Kind: ast.SelectStmtKindValues, @@ -17331,13 +17631,13 @@ yynewstate: } parser.yyVAL.statement = st } - case 1544: + case 1576: { sel := yyS[yypt-0].statement.(*ast.SelectStmt) sel.With = yyS[yypt-1].item.(*ast.WithClause) parser.yyVAL.statement = sel } - case 1545: + case 1577: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -17353,11 +17653,11 @@ yynewstate: } parser.yyVAL.statement = sel } - case 1546: + case 1578: { parser.yyVAL.item = yyS[yypt-0].item } - case 1547: + case 1579: { ws := yyS[yypt-0].item.(*ast.WithClause) ws.IsRecursive = true @@ -17366,20 +17666,20 @@ yynewstate: } parser.yyVAL.item = ws } - case 1548: + case 1580: { ws := yyS[yypt-2].item.(*ast.WithClause) ws.CTEs = append(ws.CTEs, yyS[yypt-0].item.(*ast.CommonTableExpression)) parser.yyVAL.item = ws } - case 1549: + case 1581: { 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 1550: + case 1582: { cte := &ast.CommonTableExpression{} cte.Name = model.NewCIStr(yyS[yypt-3].ident) @@ -17387,37 +17687,37 @@ yynewstate: cte.Query = yyS[yypt-0].expr.(*ast.SubqueryExpr) parser.yyVAL.item = cte } - case 1552: + case 1584: { parser.yyVAL.item = nil } - case 1553: + case 1585: { parser.yyVAL.item = yyS[yypt-0].item.([]ast.WindowSpec) } - case 1554: + case 1586: { parser.yyVAL.item = []ast.WindowSpec{yyS[yypt-0].item.(ast.WindowSpec)} } - case 1555: + case 1587: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.WindowSpec), yyS[yypt-0].item.(ast.WindowSpec)) } - case 1556: + case 1588: { var spec = yyS[yypt-0].item.(ast.WindowSpec) spec.Name = yyS[yypt-2].item.(model.CIStr) parser.yyVAL.item = spec } - case 1557: + case 1589: { parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) } - case 1558: + case 1590: { parser.yyVAL.item = yyS[yypt-1].item.(ast.WindowSpec) } - case 1559: + case 1591: { spec := ast.WindowSpec{Ref: yyS[yypt-3].item.(model.CIStr)} if yyS[yypt-2].item != nil { @@ -17431,138 +17731,138 @@ yynewstate: } parser.yyVAL.item = spec } - case 1560: + case 1592: { parser.yyVAL.item = model.CIStr{} } - case 1562: + case 1594: { parser.yyVAL.item = nil } - case 1563: + case 1595: { parser.yyVAL.item = &ast.PartitionByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} } - case 1564: + case 1596: { parser.yyVAL.item = nil } - case 1565: + case 1597: { parser.yyVAL.item = &ast.OrderByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} } - case 1566: + case 1598: { parser.yyVAL.item = nil } - case 1567: + case 1599: { parser.yyVAL.item = &ast.FrameClause{ Type: yyS[yypt-1].item.(ast.FrameType), Extent: yyS[yypt-0].item.(ast.FrameExtent), } } - case 1568: + case 1600: { parser.yyVAL.item = ast.FrameType(ast.Rows) } - case 1569: + case 1601: { parser.yyVAL.item = ast.FrameType(ast.Ranges) } - case 1570: + case 1602: { parser.yyVAL.item = ast.FrameType(ast.Groups) } - case 1571: + case 1603: { parser.yyVAL.item = ast.FrameExtent{ Start: yyS[yypt-0].item.(ast.FrameBound), End: ast.FrameBound{Type: ast.CurrentRow}, } } - case 1573: + case 1605: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, UnBounded: true} } - case 1574: + case 1606: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)} } - case 1575: + case 1607: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: ast.NewParamMarkerExpr(yyS[yypt].offset)} } - case 1576: + case 1608: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: yyS[yypt-2].expr, Unit: yyS[yypt-1].item.(ast.TimeUnitType)} } - case 1577: + case 1609: { parser.yyVAL.item = ast.FrameBound{Type: ast.CurrentRow} } - case 1578: + case 1610: { parser.yyVAL.item = ast.FrameExtent{Start: yyS[yypt-2].item.(ast.FrameBound), End: yyS[yypt-0].item.(ast.FrameBound)} } - case 1580: + case 1612: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, UnBounded: true} } - case 1581: + case 1613: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)} } - case 1582: + case 1614: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: ast.NewParamMarkerExpr(yyS[yypt].offset)} } - case 1583: + case 1615: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: yyS[yypt-2].expr, Unit: yyS[yypt-1].item.(ast.TimeUnitType)} } - case 1584: + case 1616: { parser.yyVAL.item = nil } - case 1585: + case 1617: { spec := yyS[yypt-0].item.(ast.WindowSpec) parser.yyVAL.item = &spec } - case 1586: + case 1618: { parser.yyVAL.item = yyS[yypt-0].item.(ast.WindowSpec) } - case 1587: + case 1619: { parser.yyVAL.item = ast.WindowSpec{Name: yyS[yypt-0].item.(model.CIStr), OnlyAlias: true} } - case 1589: + case 1621: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1590: + case 1622: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1591: + case 1623: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1592: + case 1624: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1593: + case 1625: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1594: + case 1626: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1595: + case 1627: { args := []ast.ExprNode{yyS[yypt-4].expr} if yyS[yypt-3].item != nil { @@ -17570,7 +17870,7 @@ yynewstate: } parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-6].ident, Args: args, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1596: + case 1628: { args := []ast.ExprNode{yyS[yypt-4].expr} if yyS[yypt-3].item != nil { @@ -17578,23 +17878,23 @@ yynewstate: } parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-6].ident, Args: args, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1597: + case 1629: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: 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 1598: + case 1630: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: 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 1599: + case 1631: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: 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 1600: + case 1632: { parser.yyVAL.item = nil } - case 1601: + case 1633: { args := []ast.ExprNode{ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)} if yyS[yypt-0].item != nil { @@ -17602,7 +17902,7 @@ yynewstate: } parser.yyVAL.item = args } - case 1602: + case 1634: { args := []ast.ExprNode{ast.NewParamMarkerExpr(yyS[yypt-1].offset)} if yyS[yypt-0].item != nil { @@ -17610,43 +17910,43 @@ yynewstate: } parser.yyVAL.item = args } - case 1603: + case 1635: { parser.yyVAL.item = nil } - case 1604: + case 1636: { parser.yyVAL.item = yyS[yypt-0].expr } - case 1605: + case 1637: { parser.yyVAL.item = false } - case 1606: + case 1638: { parser.yyVAL.item = false } - case 1607: + case 1639: { parser.yyVAL.item = true } - case 1608: + case 1640: { parser.yyVAL.item = false } - case 1609: + case 1641: { parser.yyVAL.item = false } - case 1610: + case 1642: { parser.yyVAL.item = true } - case 1611: + case 1643: { parser.yyVAL.item = &ast.TableRefsClause{TableRefs: yyS[yypt-0].item.(*ast.Join)} } - case 1612: + case 1644: { if j, ok := yyS[yypt-0].item.(*ast.Join); ok { // if $1 is Join, use it directly @@ -17655,12 +17955,12 @@ yynewstate: parser.yyVAL.item = &ast.Join{Left: yyS[yypt-0].item.(ast.ResultSetNode), Right: nil} } } - case 1613: + case 1645: { /* 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 1615: + case 1647: { /* * ODBC escape syntax for outer join is { OJ join_table } @@ -17668,7 +17968,7 @@ yynewstate: */ parser.yyVAL.item = yyS[yypt-1].item } - case 1618: + case 1650: { tn := yyS[yypt-5].item.(*ast.TableName) tn.PartitionNames = yyS[yypt-4].item.([]model.CIStr) @@ -17681,66 +17981,66 @@ yynewstate: } parser.yyVAL.item = &ast.TableSource{Source: tn, AsName: yyS[yypt-3].item.(model.CIStr)} } - case 1619: + case 1651: { resultNode := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query parser.yyVAL.item = &ast.TableSource{Source: resultNode, AsName: yyS[yypt-0].item.(model.CIStr)} } - case 1620: + case 1652: { j := yyS[yypt-1].item.(*ast.Join) j.ExplicitParens = true parser.yyVAL.item = yyS[yypt-1].item } - case 1621: + case 1653: { parser.yyVAL.item = []model.CIStr{} } - case 1622: + case 1654: { parser.yyVAL.item = yyS[yypt-1].item } - case 1623: + case 1655: { parser.yyVAL.item = model.CIStr{} } - case 1625: + case 1657: { parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) } - case 1626: + case 1658: { parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) } - case 1627: + case 1659: { parser.yyVAL.item = ast.HintUse } - case 1628: + case 1660: { parser.yyVAL.item = ast.HintIgnore } - case 1629: + case 1661: { parser.yyVAL.item = ast.HintForce } - case 1630: + case 1662: { parser.yyVAL.item = ast.HintForScan } - case 1631: + case 1663: { parser.yyVAL.item = ast.HintForJoin } - case 1632: + case 1664: { parser.yyVAL.item = ast.HintForOrderBy } - case 1633: + case 1665: { parser.yyVAL.item = ast.HintForGroupBy } - case 1634: + case 1666: { parser.yyVAL.item = &ast.IndexHint{ IndexNames: yyS[yypt-1].item.([]model.CIStr), @@ -17748,134 +18048,134 @@ yynewstate: HintScope: yyS[yypt-3].item.(ast.IndexHintScope), } } - case 1635: + case 1667: { var nameList []model.CIStr parser.yyVAL.item = nameList } - case 1636: + case 1668: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 1637: + case 1669: { parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) } - case 1638: + case 1670: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 1639: + case 1671: { parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) } - case 1640: + case 1672: { parser.yyVAL.item = []*ast.IndexHint{yyS[yypt-0].item.(*ast.IndexHint)} } - case 1641: + case 1673: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.IndexHint), yyS[yypt-0].item.(*ast.IndexHint)) } - case 1642: + case 1674: { parser.yyVAL.item = []*ast.IndexHint{} } - case 1644: + case 1676: { parser.yyVAL.item = ast.NewCrossJoin(yyS[yypt-2].item.(ast.ResultSetNode), yyS[yypt-0].item.(ast.ResultSetNode)) } - case 1645: + case 1677: { 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 1646: + case 1678: { 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 1647: + case 1679: { 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 1648: + case 1680: { 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 1649: + case 1681: { parser.yyVAL.item = &ast.Join{Left: yyS[yypt-3].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), NaturalJoin: true} } - case 1650: + case 1682: { 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 1651: + case 1683: { parser.yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), StraightJoin: true} } - case 1652: + case 1684: { 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 1653: + case 1685: { parser.yyVAL.item = ast.LeftJoin } - case 1654: + case 1686: { parser.yyVAL.item = ast.RightJoin } - case 1660: + case 1692: { parser.yyVAL.item = nil } - case 1661: + case 1693: { parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(ast.ValueExpr)} } - case 1662: + case 1694: { parser.yyVAL.item = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1663: + case 1695: { parser.yyVAL.item = ast.NewParamMarkerExpr(yyS[yypt].offset) } - case 1668: + case 1700: { parser.yyVAL.item = ast.NewValueExpr(uint64(1), parser.charset, parser.collation) } - case 1670: + case 1702: { parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(ast.ExprNode)} } - case 1671: + case 1703: { parser.yyVAL.item = &ast.Limit{Offset: yyS[yypt-2].item.(ast.ExprNode), Count: yyS[yypt-0].item.(ast.ExprNode)} } - case 1672: + case 1704: { parser.yyVAL.item = &ast.Limit{Offset: yyS[yypt-0].item.(ast.ExprNode), Count: yyS[yypt-2].item.(ast.ExprNode)} } - case 1673: + case 1705: { parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-2].item.(ast.ExprNode)} } - case 1674: + case 1706: { parser.yyVAL.item = nil } - case 1676: + case 1708: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.TableHints = yyS[yypt-0].item.([]*ast.TableOptimizerHint) parser.yyVAL.item = opt } - case 1677: + case 1709: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true @@ -17887,61 +18187,61 @@ yynewstate: } parser.yyVAL.item = opt } - case 1678: + case 1710: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.Priority = yyS[yypt-0].item.(mysql.PriorityEnum) parser.yyVAL.item = opt } - case 1679: + case 1711: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.SQLSmallResult = true parser.yyVAL.item = opt } - case 1680: + case 1712: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.SQLBigResult = true parser.yyVAL.item = opt } - case 1681: + case 1713: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.SQLBufferResult = true parser.yyVAL.item = opt } - case 1682: + case 1714: { opt := &ast.SelectStmtOpts{} opt.SQLCache = yyS[yypt-0].item.(bool) parser.yyVAL.item = opt } - case 1683: + case 1715: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.CalcFoundRows = true parser.yyVAL.item = opt } - case 1684: + case 1716: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.StraightJoin = true parser.yyVAL.item = opt } - case 1685: + case 1717: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true parser.yyVAL.item = opt } - case 1687: + case 1719: { opts := yyS[yypt-1].item.(*ast.SelectStmtOpts) opt := yyS[yypt-0].item.(*ast.SelectStmtOpts) @@ -17986,7 +18286,7 @@ yynewstate: parser.yyVAL.item = opts } - case 1689: + case 1721: { hints, warns := parser.parseHint(yyS[yypt-0].ident) for _, w := range warns { @@ -17995,31 +18295,31 @@ yynewstate: } parser.yyVAL.item = hints } - case 1690: + case 1722: { parser.yyVAL.item = nil } - case 1692: + case 1724: { parser.yyVAL.item = true } - case 1693: + case 1725: { parser.yyVAL.item = false } - case 1694: + case 1726: { parser.yyVAL.item = &ast.FieldList{Fields: yyS[yypt-0].item.([]*ast.SelectField)} } - case 1695: + case 1727: { parser.yyVAL.item = nil } - case 1697: + case 1729: { parser.yyVAL.item = nil } - case 1698: + case 1730: { x := &ast.SelectIntoOption{ Tp: ast.SelectIntoOutfile, @@ -18034,7 +18334,7 @@ yynewstate: parser.yyVAL.item = x } - case 1699: + case 1731: { rs := yyS[yypt-1].statement.(*ast.SelectStmt) endOffset := parser.endOffset(&yyS[yypt]) @@ -18044,14 +18344,14 @@ yynewstate: rs.SetText(parser.lexer.client, src[yyS[yypt-1].offset:yyS[yypt].offset]) parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} } - case 1700: + case 1732: { rs := yyS[yypt-1].statement.(*ast.SetOprStmt) src := parser.src rs.SetText(parser.lexer.client, src[yyS[yypt-1].offset:yyS[yypt].offset]) parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} } - case 1701: + case 1733: { rs := yyS[yypt-1].statement.(*ast.SelectStmt) endOffset := parser.endOffset(&yyS[yypt]) @@ -18061,7 +18361,7 @@ yynewstate: rs.SetText(parser.lexer.client, src[yyS[yypt-1].offset:yyS[yypt].offset]) parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} } - case 1702: + case 1734: { subQuery := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query isRecursive := true @@ -18084,32 +18384,32 @@ yynewstate: parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} } } - case 1703: + case 1735: { parser.yyVAL.item = nil } - case 1704: + case 1736: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForUpdate, Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1705: + case 1737: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForShare, Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1706: + case 1738: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForUpdateNoWait, Tables: yyS[yypt-1].item.([]*ast.TableName), } } - case 1707: + case 1739: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForUpdateWaitN, @@ -18117,55 +18417,55 @@ yynewstate: Tables: yyS[yypt-2].item.([]*ast.TableName), } } - case 1708: + case 1740: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForShareNoWait, Tables: yyS[yypt-1].item.([]*ast.TableName), } } - case 1709: + case 1741: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForUpdateSkipLocked, Tables: yyS[yypt-2].item.([]*ast.TableName), } } - case 1710: + case 1742: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForShareSkipLocked, Tables: yyS[yypt-2].item.([]*ast.TableName), } } - case 1711: + case 1743: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForShare, Tables: []*ast.TableName{}, } } - case 1712: + case 1744: { parser.yyVAL.item = []*ast.TableName{} } - case 1713: + case 1745: { parser.yyVAL.item = yyS[yypt-0].item.([]*ast.TableName) } - case 1716: + case 1748: { setOpr := yyS[yypt-0].statement.(*ast.SetOprStmt) setOpr.With = yyS[yypt-1].item.(*ast.WithClause) parser.yyVAL.statement = setOpr } - case 1717: + case 1749: { setOpr := yyS[yypt-0].statement.(*ast.SetOprStmt) setOpr.With = yyS[yypt-1].item.(*ast.WithClause) parser.yyVAL.statement = setOpr } - case 1718: + case 1750: { setOprList1 := yyS[yypt-2].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -18182,7 +18482,7 @@ yynewstate: setOpr.SelectList.Selects = append(setOpr.SelectList.Selects, st) parser.yyVAL.statement = setOpr } - case 1719: + case 1751: { setOprList1 := yyS[yypt-2].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -18205,7 +18505,7 @@ yynewstate: setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} parser.yyVAL.statement = setOpr } - case 1720: + case 1752: { setOprList1 := yyS[yypt-3].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -18229,7 +18529,7 @@ yynewstate: setOpr.OrderBy = yyS[yypt-0].item.(*ast.OrderByClause) parser.yyVAL.statement = setOpr } - case 1721: + case 1753: { setOprList1 := yyS[yypt-3].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -18253,7 +18553,7 @@ yynewstate: setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) parser.yyVAL.statement = setOpr } - case 1722: + case 1754: { setOprList1 := yyS[yypt-4].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -18278,7 +18578,7 @@ yynewstate: setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) parser.yyVAL.statement = setOpr } - case 1723: + case 1755: { var setOprList []ast.Node var with *ast.WithClause @@ -18294,7 +18594,7 @@ yynewstate: setOpr.OrderBy = yyS[yypt-0].item.(*ast.OrderByClause) parser.yyVAL.statement = setOpr } - case 1724: + case 1756: { var setOprList []ast.Node var with *ast.WithClause @@ -18310,7 +18610,7 @@ yynewstate: setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) parser.yyVAL.statement = setOpr } - case 1725: + case 1757: { var setOprList []ast.Node var with *ast.WithClause @@ -18327,7 +18627,7 @@ yynewstate: setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) parser.yyVAL.statement = setOpr } - case 1727: + case 1759: { setOprList1 := yyS[yypt-2].item.([]ast.Node) setOprList2 := yyS[yypt-0].item.([]ast.Node) @@ -18343,11 +18643,11 @@ yynewstate: } parser.yyVAL.item = append(setOprList1, setOprList2...) } - case 1728: + case 1760: { parser.yyVAL.item = []ast.Node{yyS[yypt-0].statement.(*ast.SelectStmt)} } - case 1729: + case 1761: { var setOprList []ast.Node switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -18358,7 +18658,7 @@ yynewstate: } parser.yyVAL.item = setOprList } - case 1730: + case 1762: { var tp ast.SetOprType tp = ast.Union @@ -18367,7 +18667,7 @@ yynewstate: } parser.yyVAL.item = &tp } - case 1731: + case 1763: { var tp ast.SetOprType tp = ast.Except @@ -18376,7 +18676,7 @@ yynewstate: } parser.yyVAL.item = &tp } - case 1732: + case 1764: { var tp ast.SetOprType tp = ast.Intersect @@ -18385,7 +18685,7 @@ yynewstate: } parser.yyVAL.item = &tp } - case 1734: + case 1766: { parser.yyVAL.statement = &ast.ChangeStmt{ NodeType: ast.PumpType, @@ -18393,7 +18693,7 @@ yynewstate: NodeID: yyS[yypt-0].ident, } } - case 1735: + case 1767: { parser.yyVAL.statement = &ast.ChangeStmt{ NodeType: ast.DrainerType, @@ -18401,19 +18701,19 @@ yynewstate: NodeID: yyS[yypt-0].ident, } } - case 1736: + case 1768: { parser.yyVAL.statement = &ast.SetStmt{Variables: yyS[yypt-0].item.([]*ast.VariableAssignment)} } - case 1737: + case 1769: { parser.yyVAL.statement = &ast.SetPwdStmt{Password: yyS[yypt-0].ident} } - case 1738: + case 1770: { parser.yyVAL.statement = &ast.SetPwdStmt{User: yyS[yypt-2].item.(*auth.UserIdentity), Password: yyS[yypt-0].ident} } - case 1739: + case 1771: { vars := yyS[yypt-0].item.([]*ast.VariableAssignment) for _, v := range vars { @@ -18421,11 +18721,11 @@ yynewstate: } parser.yyVAL.statement = &ast.SetStmt{Variables: vars} } - case 1740: + case 1772: { parser.yyVAL.statement = &ast.SetStmt{Variables: yyS[yypt-0].item.([]*ast.VariableAssignment)} } - case 1741: + case 1773: { assigns := yyS[yypt-0].item.([]*ast.VariableAssignment) for i := 0; i < len(assigns); i++ { @@ -18436,23 +18736,23 @@ yynewstate: } parser.yyVAL.statement = &ast.SetStmt{Variables: assigns} } - case 1742: + case 1774: { parser.yyVAL.statement = &ast.SetConfigStmt{Type: strings.ToLower(yyS[yypt-3].ident), Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr} } - case 1743: + case 1775: { parser.yyVAL.statement = &ast.SetConfigStmt{Instance: yyS[yypt-3].ident, Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr} } - case 1744: + case 1776: { parser.yyVAL.statement = &ast.SetSessionStatesStmt{SessionStates: yyS[yypt-0].ident} } - case 1745: + case 1777: { parser.yyVAL.statement = yyS[yypt-0].item.(*ast.SetRoleStmt) } - case 1746: + case 1778: { tmp := yyS[yypt-2].item.(*ast.SetRoleStmt) parser.yyVAL.statement = &ast.SetDefaultRoleStmt{ @@ -18461,27 +18761,27 @@ yynewstate: UserList: yyS[yypt-0].item.([]*auth.UserIdentity), } } - case 1747: + case 1779: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleNone, RoleList: nil} } - case 1748: + case 1780: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleAll, RoleList: nil} } - case 1749: + case 1781: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleRegular, RoleList: yyS[yypt-0].item.([]*auth.RoleIdentity)} } - case 1750: + case 1782: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleAllExcept, RoleList: yyS[yypt-0].item.([]*auth.RoleIdentity)} } - case 1752: + case 1784: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleDefault, RoleList: nil} } - case 1753: + case 1785: { if yyS[yypt-0].item != nil { parser.yyVAL.item = yyS[yypt-0].item @@ -18489,7 +18789,7 @@ yynewstate: parser.yyVAL.item = []*ast.VariableAssignment{} } } - case 1754: + case 1786: { if yyS[yypt-0].item != nil { varAssigns := yyS[yypt-0].item.([]*ast.VariableAssignment) @@ -18498,28 +18798,28 @@ yynewstate: parser.yyVAL.item = yyS[yypt-2].item } } - case 1755: + case 1787: { 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 1756: + case 1788: { 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 1757: + case 1789: { 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 1758: + case 1790: { varAssigns := []*ast.VariableAssignment{} asof := yyS[yypt-0].item.(*ast.AsOfClause) @@ -18528,59 +18828,59 @@ yynewstate: } parser.yyVAL.item = varAssigns } - case 1759: + case 1791: { parser.yyVAL.ident = ast.RepeatableRead } - case 1760: + case 1792: { parser.yyVAL.ident = ast.ReadCommitted } - case 1761: + case 1793: { parser.yyVAL.ident = ast.ReadUncommitted } - case 1762: + case 1794: { parser.yyVAL.ident = ast.Serializable } - case 1763: + case 1795: { parser.yyVAL.expr = ast.NewValueExpr("ON", parser.charset, parser.collation) } - case 1764: + case 1796: { parser.yyVAL.expr = ast.NewValueExpr("BINARY", parser.charset, parser.collation) } - case 1769: + case 1801: { parser.yyVAL.ident = yyS[yypt-2].ident + "." + yyS[yypt-0].ident } - case 1771: + case 1803: { parser.yyVAL.ident = yyS[yypt-2].ident + "." + yyS[yypt-0].ident } - case 1772: + case 1804: { parser.yyVAL.ident = yyS[yypt-2].ident + "-" + yyS[yypt-0].ident } - case 1773: + case 1805: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} } - case 1774: + case 1806: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsGlobal: true, IsSystem: true} } - case 1775: + case 1807: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} } - case 1776: + case 1808: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} } - case 1777: + case 1809: { v := strings.ToLower(yyS[yypt-2].ident) var isGlobal bool @@ -18596,27 +18896,27 @@ yynewstate: } parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr, IsGlobal: isGlobal, IsSystem: true} } - case 1778: + case 1810: { v := yyS[yypt-2].ident v = strings.TrimPrefix(v, "@") parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr} } - case 1779: + case 1811: { parser.yyVAL.item = &ast.VariableAssignment{ Name: ast.SetNames, Value: ast.NewValueExpr(yyS[yypt-0].ident, "", ""), } } - case 1780: + case 1812: { parser.yyVAL.item = &ast.VariableAssignment{ Name: ast.SetNames, Value: ast.NewValueExpr(yyS[yypt-2].ident, "", ""), } } - case 1781: + case 1813: { parser.yyVAL.item = &ast.VariableAssignment{ Name: ast.SetNames, @@ -18624,24 +18924,24 @@ yynewstate: ExtendValue: ast.NewValueExpr(yyS[yypt-0].ident, "", ""), } } - case 1782: + case 1814: { v := &ast.DefaultExpr{} parser.yyVAL.item = &ast.VariableAssignment{Name: ast.SetNames, Value: v} } - case 1783: + case 1815: { parser.yyVAL.item = &ast.VariableAssignment{Name: ast.SetCharset, Value: yyS[yypt-0].expr} } - case 1784: + case 1816: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].ident, "", "") } - case 1785: + case 1817: { parser.yyVAL.expr = &ast.DefaultExpr{} } - case 1786: + case 1818: { // Validate input charset name to keep the same behavior as parser of MySQL. cs, err := charset.GetCharsetInfo(yyS[yypt-0].ident) @@ -18653,11 +18953,11 @@ yynewstate: // to keep lower case of input for generated column restore. parser.yyVAL.ident = cs.Name } - case 1787: + case 1819: { parser.yyVAL.ident = charset.CharsetBin } - case 1788: + case 1820: { info, err := charset.GetCollationByName(yyS[yypt-0].ident) if err != nil { @@ -18666,19 +18966,19 @@ yynewstate: } parser.yyVAL.ident = info.Name } - case 1789: + case 1821: { parser.yyVAL.ident = charset.CollationBin } - case 1790: + case 1822: { parser.yyVAL.item = []*ast.VariableAssignment{yyS[yypt-0].item.(*ast.VariableAssignment)} } - case 1791: + case 1823: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.VariableAssignment), yyS[yypt-0].item.(*ast.VariableAssignment)) } - case 1794: + case 1826: { v := strings.ToLower(yyS[yypt-0].ident) var isGlobal bool @@ -18695,89 +18995,89 @@ yynewstate: } parser.yyVAL.expr = &ast.VariableExpr{Name: v, IsGlobal: isGlobal, IsSystem: true, ExplicitScope: explicitScope} } - case 1795: + case 1827: { v := yyS[yypt-0].ident v = strings.TrimPrefix(v, "@") parser.yyVAL.expr = &ast.VariableExpr{Name: v, IsGlobal: false, IsSystem: false} } - case 1796: + case 1828: { parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-0].ident, Hostname: "%"} } - case 1797: + case 1829: { parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-2].ident, Hostname: strings.ToLower(yyS[yypt-0].ident)} } - case 1798: + case 1830: { parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-1].ident, Hostname: strings.ToLower(strings.TrimPrefix(yyS[yypt-0].ident, "@"))} } - case 1799: + case 1831: { parser.yyVAL.item = &auth.UserIdentity{CurrentUser: true} } - case 1800: + case 1832: { parser.yyVAL.item = []*auth.UserIdentity{yyS[yypt-0].item.(*auth.UserIdentity)} } - case 1801: + case 1833: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*auth.UserIdentity), yyS[yypt-0].item.(*auth.UserIdentity)) } - case 1803: + case 1835: { parser.yyVAL.ident = yyS[yypt-1].ident } - case 1807: + case 1839: { parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-2].ident, Hostname: strings.ToLower(yyS[yypt-0].ident)} } - case 1808: + case 1840: { parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-1].ident, Hostname: strings.ToLower(strings.TrimPrefix(yyS[yypt-0].ident, "@"))} } - case 1809: + case 1841: { parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-0].ident, Hostname: "%"} } - case 1810: + case 1842: { parser.yyVAL.item = yyS[yypt-0].item } - case 1811: + case 1843: { parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-0].ident, Hostname: "%"} } - case 1812: + case 1844: { parser.yyVAL.item = yyS[yypt-0].item } - case 1813: + case 1845: { parser.yyVAL.item = []*auth.RoleIdentity{yyS[yypt-0].item.(*auth.RoleIdentity)} } - case 1814: + case 1846: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*auth.RoleIdentity), yyS[yypt-0].item.(*auth.RoleIdentity)) } - case 1815: + case 1847: { parser.yyVAL.item = &ast.LimitSimple{Offset: 0, Count: yyS[yypt-0].item.(uint64)} } - case 1816: + case 1848: { parser.yyVAL.item = &ast.LimitSimple{Offset: yyS[yypt-2].item.(uint64), Count: yyS[yypt-0].item.(uint64)} } - case 1817: + case 1849: { parser.yyVAL.item = &ast.LimitSimple{Offset: yyS[yypt-0].item.(uint64), Count: yyS[yypt-2].item.(uint64)} } - case 1818: + case 1850: { parser.yyVAL.statement = &ast.AdminStmt{Tp: ast.AdminShowDDL} } - case 1819: + case 1851: { stmt := &ast.AdminStmt{Tp: ast.AdminShowDDLJobs} if yyS[yypt-0].item != nil { @@ -18785,7 +19085,7 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1820: + case 1852: { stmt := &ast.AdminStmt{ Tp: ast.AdminShowDDLJobs, @@ -18796,21 +19096,21 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1821: + case 1853: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowNextRowID, Tables: []*ast.TableName{yyS[yypt-1].item.(*ast.TableName)}, } } - case 1822: + case 1854: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCheckTable, Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1823: + case 1855: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCheckIndex, @@ -18818,7 +19118,7 @@ yynewstate: Index: string(yyS[yypt-0].ident), } } - case 1824: + case 1856: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminRecoverIndex, @@ -18826,7 +19126,7 @@ yynewstate: Index: string(yyS[yypt-0].ident), } } - case 1825: + case 1857: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCleanupIndex, @@ -18834,7 +19134,7 @@ yynewstate: Index: string(yyS[yypt-0].ident), } } - case 1826: + case 1858: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCheckIndexRange, @@ -18843,28 +19143,28 @@ yynewstate: HandleRanges: yyS[yypt-0].item.([]ast.HandleRange), } } - case 1827: + case 1859: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminChecksumTable, Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1828: + case 1860: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCancelDDLJobs, JobIDs: yyS[yypt-0].item.([]int64), } } - case 1829: + case 1861: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowDDLJobQueries, JobIDs: yyS[yypt-0].item.([]int64), } } - case 1830: + case 1862: { ret := &ast.AdminStmt{ Tp: ast.AdminShowDDLJobQueriesWithRange, @@ -18873,115 +19173,115 @@ yynewstate: ret.LimitSimple.Offset = yyS[yypt-0].item.(*ast.LimitSimple).Offset parser.yyVAL.statement = ret } - case 1831: + case 1863: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowSlow, ShowSlow: yyS[yypt-0].item.(*ast.ShowSlow), } } - case 1832: + case 1864: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadExprPushdownBlacklist, } } - case 1833: + case 1865: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadOptRuleBlacklist, } } - case 1834: + case 1866: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminPluginEnable, Plugins: yyS[yypt-0].item.([]string), } } - case 1835: + case 1867: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminPluginDisable, Plugins: yyS[yypt-0].item.([]string), } } - case 1836: + case 1868: { parser.yyVAL.statement = &ast.CleanupTableLockStmt{ Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1837: + case 1869: { parser.yyVAL.statement = &ast.RepairTableStmt{ Table: yyS[yypt-1].item.(*ast.TableName), CreateStmt: yyS[yypt-0].statement.(*ast.CreateTableStmt), } } - case 1838: + case 1870: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminFlushBindings, } } - case 1839: + case 1871: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCaptureBindings, } } - case 1840: + case 1872: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminEvolveBindings, } } - case 1841: + case 1873: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadBindings, } } - case 1842: + case 1874: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadStatistics, } } - case 1843: + case 1875: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadStatistics, } } - case 1844: + case 1876: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowTelemetry, } } - case 1845: + case 1877: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminResetTelemetryID, } } - case 1846: + case 1878: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminFlushPlanCache, StatementScope: yyS[yypt-1].item.(ast.StatementScope), } } - case 1847: + case 1879: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowRecent, Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1848: + case 1880: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowTop, @@ -18989,7 +19289,7 @@ yynewstate: Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1849: + case 1881: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowTop, @@ -18997,7 +19297,7 @@ yynewstate: Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1850: + case 1882: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowTop, @@ -19005,27 +19305,27 @@ yynewstate: Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1851: + case 1883: { parser.yyVAL.item = []ast.HandleRange{yyS[yypt-0].item.(ast.HandleRange)} } - case 1852: + case 1884: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.HandleRange), yyS[yypt-0].item.(ast.HandleRange)) } - case 1853: + case 1885: { parser.yyVAL.item = ast.HandleRange{Begin: yyS[yypt-3].item.(int64), End: yyS[yypt-1].item.(int64)} } - case 1854: + case 1886: { parser.yyVAL.item = []int64{yyS[yypt-0].item.(int64)} } - case 1855: + case 1887: { parser.yyVAL.item = append(yyS[yypt-2].item.([]int64), yyS[yypt-0].item.(int64)) } - case 1856: + case 1888: { stmt := yyS[yypt-1].item.(*ast.ShowStmt) if yyS[yypt-0].item != nil { @@ -19037,21 +19337,21 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1857: + case 1889: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateTable, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1858: + case 1890: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateView, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1859: + case 1891: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateDatabase, @@ -19059,21 +19359,28 @@ yynewstate: DBName: yyS[yypt-0].ident, } } - case 1860: + case 1892: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateSequence, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1861: + case 1893: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreatePlacementPolicy, DBName: yyS[yypt-0].ident, } } - case 1862: + case 1894: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowCreateResourceGroup, + ResourceGroupName: yyS[yypt-0].ident, + } + } + case 1895: { // See https://dev.mysql.com/doc/refman/5.7/en/show-create-user.html parser.yyVAL.statement = &ast.ShowStmt{ @@ -19081,14 +19388,14 @@ yynewstate: User: yyS[yypt-0].item.(*auth.UserIdentity), } } - case 1863: + case 1896: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateImport, DBName: yyS[yypt-0].ident, // we reuse DBName of ShowStmt } } - case 1864: + case 1897: { stmt := &ast.ShowStmt{ Tp: ast.ShowRegions, @@ -19100,14 +19407,14 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1865: + case 1898: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowTableNextRowId, Table: yyS[yypt-1].item.(*ast.TableName), } } - case 1866: + case 1899: { stmt := &ast.ShowStmt{ Tp: ast.ShowRegions, @@ -19120,12 +19427,12 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1867: + case 1900: { // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html parser.yyVAL.statement = &ast.ShowStmt{Tp: ast.ShowGrants} } - case 1868: + case 1901: { // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html if yyS[yypt-0].item != nil { @@ -19142,26 +19449,26 @@ yynewstate: } } } - case 1869: + case 1902: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowMasterStatus, } } - case 1870: + case 1903: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowProcessList, Full: yyS[yypt-1].item.(bool), } } - case 1871: + case 1904: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowProfiles, } } - case 1872: + case 1905: { v := &ast.ShowStmt{ Tp: ast.ShowProfile, @@ -19177,37 +19484,37 @@ yynewstate: } parser.yyVAL.statement = v } - case 1873: + case 1906: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowPrivileges, } } - case 1874: + case 1907: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowBuiltins, } } - case 1875: + case 1908: { parser.yyVAL.statement = yyS[yypt-0].item.(*ast.ShowStmt) } - case 1876: + case 1909: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPlacementForDatabase, DBName: yyS[yypt-0].ident, } } - case 1877: + case 1910: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPlacementForTable, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1878: + case 1911: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPlacementForPartition, @@ -19215,90 +19522,90 @@ yynewstate: Partition: model.NewCIStr(yyS[yypt-0].ident), } } - case 1879: + case 1912: { parser.yyVAL.item = nil } - case 1881: + case 1914: { parser.yyVAL.item = []int{yyS[yypt-0].item.(int)} } - case 1882: + case 1915: { l := yyS[yypt-2].item.([]int) l = append(l, yyS[yypt-0].item.(int)) parser.yyVAL.item = l } - case 1883: + case 1916: { parser.yyVAL.item = ast.ProfileTypeCPU } - case 1884: + case 1917: { parser.yyVAL.item = ast.ProfileTypeMemory } - case 1885: + case 1918: { parser.yyVAL.item = ast.ProfileTypeBlockIo } - case 1886: + case 1919: { parser.yyVAL.item = ast.ProfileTypeContextSwitch } - case 1887: + case 1920: { parser.yyVAL.item = ast.ProfileTypePageFaults } - case 1888: + case 1921: { parser.yyVAL.item = ast.ProfileTypeIpc } - case 1889: + case 1922: { parser.yyVAL.item = ast.ProfileTypeSwaps } - case 1890: + case 1923: { parser.yyVAL.item = ast.ProfileTypeSource } - case 1891: + case 1924: { parser.yyVAL.item = ast.ProfileTypeAll } - case 1892: + case 1925: { parser.yyVAL.item = nil } - case 1893: + case 1926: { v := yyS[yypt-0].item.(int64) parser.yyVAL.item = &v } - case 1894: + case 1927: { parser.yyVAL.item = nil } - case 1895: + case 1928: { parser.yyVAL.item = yyS[yypt-0].item.([]*auth.RoleIdentity) } - case 1901: + case 1934: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowEngines} } - case 1902: + case 1935: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowDatabases} } - case 1903: + case 1936: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowConfig} } - case 1904: + case 1937: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowCharset} } - case 1905: + case 1938: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowTables, @@ -19306,28 +19613,28 @@ yynewstate: Full: yyS[yypt-2].item.(bool), } } - case 1906: + case 1939: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowOpenTables, DBName: yyS[yypt-0].ident, } } - case 1907: + case 1940: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowTableStatus, DBName: yyS[yypt-0].ident, } } - case 1908: + case 1941: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowIndex, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1909: + case 1942: { show := &ast.ShowStmt{ Tp: ast.ShowIndex, @@ -19335,7 +19642,7 @@ yynewstate: } parser.yyVAL.item = show } - case 1910: + case 1943: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowColumns, @@ -19344,7 +19651,7 @@ yynewstate: Full: yyS[yypt-3].item.(bool), } } - case 1911: + case 1944: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowColumns, @@ -19354,81 +19661,81 @@ yynewstate: Extended: true, } } - case 1912: + case 1945: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowWarnings, CountWarningsOrErrors: true} } - case 1913: + case 1946: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowWarnings} } - case 1914: + case 1947: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowErrors, CountWarningsOrErrors: true} } - case 1915: + case 1948: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowErrors} } - case 1916: + case 1949: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowVariables, GlobalScope: yyS[yypt-1].item.(bool), } } - case 1917: + case 1950: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowStatus, GlobalScope: yyS[yypt-1].item.(bool), } } - case 1918: + case 1951: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowBindings, GlobalScope: yyS[yypt-1].item.(bool), } } - case 1919: + case 1952: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowCollation, } } - case 1920: + case 1953: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowTriggers, DBName: yyS[yypt-0].ident, } } - case 1921: + case 1954: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowBindingCacheStatus, } } - case 1922: + case 1955: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowProcedureStatus, } } - case 1923: + case 1956: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPumpStatus, } } - case 1924: + case 1957: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowDrainerStatus, } } - case 1925: + case 1958: { // This statement is similar to SHOW PROCEDURE STATUS but for stored functions. // See http://dev.mysql.com/doc/refman/5.7/en/show-function-status.html @@ -19438,193 +19745,193 @@ yynewstate: Tp: ast.ShowProcedureStatus, } } - case 1926: + case 1959: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowEvents, DBName: yyS[yypt-0].ident, } } - case 1927: + case 1960: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPlugins, } } - case 1928: + case 1961: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowSessionStates} } - case 1929: + case 1962: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsExtended} } - case 1930: + case 1963: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsMeta, Table: &ast.TableName{Name: model.NewCIStr("STATS_META"), Schema: model.NewCIStr(mysql.SystemDB)}} } - case 1931: + case 1964: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsHistograms, Table: &ast.TableName{Name: model.NewCIStr("STATS_HISTOGRAMS"), Schema: model.NewCIStr(mysql.SystemDB)}} } - case 1932: + case 1965: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsTopN} } - case 1933: + case 1966: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsBuckets, Table: &ast.TableName{Name: model.NewCIStr("STATS_BUCKETS"), Schema: model.NewCIStr(mysql.SystemDB)}} } - case 1934: + case 1967: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsHealthy} } - case 1935: + case 1968: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsLocked, Table: &ast.TableName{Name: model.NewCIStr("STATS_TABLE_LOCKED"), Schema: model.NewCIStr(mysql.SystemDB)}} } - case 1936: + case 1969: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowHistogramsInFlight} } - case 1937: + case 1970: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowColumnStatsUsage} } - case 1938: + case 1971: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowAnalyzeStatus} } - case 1939: + case 1972: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowBackups} } - case 1940: + case 1973: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowRestores} } - case 1941: + case 1974: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowImports} } - case 1942: + case 1975: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowPlacement} } - case 1943: + case 1976: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowPlacementLabels} } - case 1944: + case 1977: { parser.yyVAL.item = nil } - case 1945: + case 1978: { parser.yyVAL.item = &ast.PatternLikeExpr{ Pattern: yyS[yypt-0].expr, Escape: '\\', } } - case 1946: + case 1979: { parser.yyVAL.item = yyS[yypt-0].expr } - case 1947: + case 1980: { parser.yyVAL.item = false } - case 1948: + case 1981: { parser.yyVAL.item = true } - case 1949: + case 1982: { parser.yyVAL.item = false } - case 1950: + case 1983: { parser.yyVAL.item = ast.StatementScopeSession } - case 1951: + case 1984: { parser.yyVAL.item = ast.StatementScopeGlobal } - case 1952: + case 1985: { parser.yyVAL.item = ast.StatementScopeInstance } - case 1953: + case 1986: { parser.yyVAL.item = ast.StatementScopeSession } - case 1954: + case 1987: { parser.yyVAL.item = false } - case 1955: + case 1988: { parser.yyVAL.item = true } - case 1956: + case 1989: { parser.yyVAL.ident = "" } - case 1957: + case 1990: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 1958: + case 1991: { parser.yyVAL.item = yyS[yypt-0].item.(*ast.TableName) } - case 1959: + case 1992: { tmp := yyS[yypt-0].item.(*ast.FlushStmt) tmp.NoWriteToBinLog = yyS[yypt-1].item.(bool) parser.yyVAL.statement = tmp } - case 1960: + case 1993: { parser.yyVAL.item = []string{yyS[yypt-0].ident} } - case 1961: + case 1994: { parser.yyVAL.item = append(yyS[yypt-2].item.([]string), yyS[yypt-0].ident) } - case 1962: + case 1995: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushPrivileges, } } - case 1963: + case 1996: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushStatus, } } - case 1964: + case 1997: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushTiDBPlugin, Plugins: yyS[yypt-0].item.([]string), } } - case 1965: + case 1998: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushHosts, } } - case 1966: + case 1999: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushLogs, LogType: yyS[yypt-1].item.(ast.LogType), } } - case 1967: + case 2000: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushTables, @@ -19632,69 +19939,69 @@ yynewstate: ReadLock: yyS[yypt-0].item.(bool), } } - case 1968: + case 2001: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushClientErrorsSummary, } } - case 1969: + case 2002: { parser.yyVAL.item = ast.LogTypeDefault } - case 1970: + case 2003: { parser.yyVAL.item = ast.LogTypeBinary } - case 1971: + case 2004: { parser.yyVAL.item = ast.LogTypeEngine } - case 1972: + case 2005: { parser.yyVAL.item = ast.LogTypeError } - case 1973: + case 2006: { parser.yyVAL.item = ast.LogTypeGeneral } - case 1974: + case 2007: { parser.yyVAL.item = ast.LogTypeSlow } - case 1975: + case 2008: { parser.yyVAL.item = false } - case 1976: + case 2009: { parser.yyVAL.item = true } - case 1977: + case 2010: { parser.yyVAL.item = true } - case 1978: + case 2011: { parser.yyVAL.item = []*ast.TableName{} } - case 1980: + case 2013: { parser.yyVAL.item = []*ast.TableName{} } - case 1981: + case 2014: { parser.yyVAL.item = yyS[yypt-0].item } - case 1982: + case 2015: { parser.yyVAL.item = false } - case 1983: + case 2016: { parser.yyVAL.item = true } - case 2058: + case 2094: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -19707,7 +20014,7 @@ yynewstate: } parser.yyVAL.statement = sel } - case 2084: + case 2120: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -19720,7 +20027,7 @@ yynewstate: } parser.yyVAL.statement = sel } - case 2100: + case 2136: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -19733,7 +20040,7 @@ yynewstate: } parser.yyVAL.statement = sel } - case 2102: + case 2138: { if yyS[yypt-0].statement != nil { s := yyS[yypt-0].statement @@ -19743,7 +20050,7 @@ yynewstate: parser.result = append(parser.result, s) } } - case 2103: + case 2139: { if yyS[yypt-0].statement != nil { s := yyS[yypt-0].statement @@ -19753,7 +20060,7 @@ yynewstate: parser.result = append(parser.result, s) } } - case 2104: + case 2140: { cst := yyS[yypt-0].item.(*ast.Constraint) if yyS[yypt-1].item != nil { @@ -19762,7 +20069,7 @@ yynewstate: } parser.yyVAL.item = cst } - case 2109: + case 2145: { if yyS[yypt-0].item != nil { parser.yyVAL.item = []interface{}{yyS[yypt-0].item.(interface{})} @@ -19770,7 +20077,7 @@ yynewstate: parser.yyVAL.item = []interface{}{} } } - case 2110: + case 2146: { if yyS[yypt-0].item != nil { parser.yyVAL.item = append(yyS[yypt-2].item.([]interface{}), yyS[yypt-0].item) @@ -19778,7 +20085,7 @@ yynewstate: parser.yyVAL.item = yyS[yypt-2].item } } - case 2111: + case 2147: { var columnDefs []*ast.ColumnDef var constraints []*ast.Constraint @@ -19787,7 +20094,7 @@ yynewstate: Constraints: constraints, } } - case 2112: + case 2148: { tes := yyS[yypt-1].item.([]interface{}) var columnDefs []*ast.ColumnDef @@ -19805,69 +20112,69 @@ yynewstate: Constraints: constraints, } } - case 2114: + case 2150: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCharset, StrValue: yyS[yypt-0].ident, UintValue: ast.TableOptionCharsetWithoutConvertTo} } - case 2115: + case 2151: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: yyS[yypt-0].ident, UintValue: ast.TableOptionCharsetWithoutConvertTo} } - case 2116: + case 2152: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAutoIncrement, UintValue: yyS[yypt-0].item.(uint64), BoolValue: yyS[yypt-3].item.(bool)} } - case 2117: + case 2153: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAutoIdCache, UintValue: yyS[yypt-0].item.(uint64)} } - case 2118: + case 2154: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAutoRandomBase, UintValue: yyS[yypt-0].item.(uint64), BoolValue: yyS[yypt-3].item.(bool)} } - case 2119: + case 2155: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAvgRowLength, UintValue: yyS[yypt-0].item.(uint64)} } - case 2120: + case 2156: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionConnection, StrValue: yyS[yypt-0].ident} } - case 2121: + case 2157: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCheckSum, UintValue: yyS[yypt-0].item.(uint64)} } - case 2122: + case 2158: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionTableCheckSum, UintValue: yyS[yypt-0].item.(uint64)} } - case 2123: + case 2159: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionPassword, StrValue: yyS[yypt-0].ident} } - case 2124: + case 2160: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCompression, StrValue: yyS[yypt-0].ident} } - case 2125: + case 2161: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionKeyBlockSize, UintValue: yyS[yypt-0].item.(uint64)} } - case 2126: + case 2162: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionDelayKeyWrite, UintValue: yyS[yypt-0].item.(uint64)} } - case 2127: + case 2163: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionRowFormat, UintValue: yyS[yypt-0].item.(uint64)} } - case 2128: + case 2164: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsPersistent} } - case 2129: + case 2165: { n := yyS[yypt-0].item.(uint64) if n != 0 && n != 1 { @@ -19878,13 +20185,13 @@ yynewstate: yylex.AppendError(yylex.Errorf("The STATS_AUTO_RECALC is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 2130: + case 2166: { 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 2131: + case 2167: { // Parse it but will ignore it. // In MySQL, STATS_SAMPLE_PAGES=N(Where 0 1 { @@ -21639,7 +22050,7 @@ yynewstate: OptEnclosed: true, } } - case 2457: + case 2506: { str := yyS[yypt-0].ident if str != "\\" && len(str) > 1 { @@ -21651,7 +22062,7 @@ yynewstate: Value: str, } } - case 2458: + case 2507: { str := yyS[yypt-0].ident if str != "\\" && len(str) > 1 { @@ -21663,104 +22074,104 @@ yynewstate: Value: str, } } - case 2460: + case 2509: { parser.yyVAL.ident = yyS[yypt-0].item.(ast.BinaryLiteral).ToString() } - case 2461: + case 2510: { parser.yyVAL.ident = yyS[yypt-0].item.(ast.BinaryLiteral).ToString() } - case 2462: + case 2511: { parser.yyVAL.item = &ast.LinesClause{Terminated: "\n"} } - case 2463: + case 2512: { parser.yyVAL.item = &ast.LinesClause{Starting: yyS[yypt-1].ident, Terminated: yyS[yypt-0].ident} } - case 2464: + case 2513: { parser.yyVAL.ident = "" } - case 2465: + case 2514: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 2466: + case 2515: { parser.yyVAL.ident = "\n" } - case 2467: + case 2516: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 2468: + case 2517: { parser.yyVAL.item = nil } - case 2469: + case 2518: { parser.yyVAL.item = yyS[yypt-0].item } - case 2470: + case 2519: { l := yyS[yypt-2].item.([]*ast.Assignment) parser.yyVAL.item = append(l, yyS[yypt-0].item.(*ast.Assignment)) } - case 2471: + case 2520: { parser.yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} } - case 2472: + case 2521: { parser.yyVAL.item = &ast.Assignment{ Column: yyS[yypt-2].expr.(*ast.ColumnNameExpr).Name, Expr: yyS[yypt-0].expr, } } - case 2473: + case 2522: { parser.yyVAL.statement = &ast.UnlockTablesStmt{} } - case 2474: + case 2523: { parser.yyVAL.statement = &ast.LockTablesStmt{ TableLocks: yyS[yypt-0].item.([]ast.TableLock), } } - case 2477: + case 2526: { parser.yyVAL.item = ast.TableLock{ Table: yyS[yypt-1].item.(*ast.TableName), Type: yyS[yypt-0].item.(model.TableLockType), } } - case 2478: + case 2527: { parser.yyVAL.item = model.TableLockRead } - case 2479: + case 2528: { parser.yyVAL.item = model.TableLockReadLocal } - case 2480: + case 2529: { parser.yyVAL.item = model.TableLockWrite } - case 2481: + case 2530: { parser.yyVAL.item = model.TableLockWriteLocal } - case 2482: + case 2531: { parser.yyVAL.item = []ast.TableLock{yyS[yypt-0].item.(ast.TableLock)} } - case 2483: + case 2532: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.TableLock), yyS[yypt-0].item.(ast.TableLock)) } - case 2484: + case 2533: { parser.yyVAL.statement = &ast.NonTransactionalDMLStmt{ DryRun: yyS[yypt-1].item.(int), @@ -21769,41 +22180,41 @@ yynewstate: DMLStmt: yyS[yypt-0].statement.(ast.ShardableDMLStmt), } } - case 2488: + case 2538: { parser.yyVAL.item = ast.NoDryRun } - case 2489: + case 2539: { parser.yyVAL.item = ast.DryRunSplitDml } - case 2490: + case 2540: { parser.yyVAL.item = ast.DryRunQuery } - case 2491: + case 2541: { parser.yyVAL.item = (*ast.ColumnName)(nil) } - case 2492: + case 2542: { parser.yyVAL.item = yyS[yypt-0].item.(*ast.ColumnName) } - case 2493: + case 2543: { parser.yyVAL.statement = &ast.KillStmt{ ConnectionID: getUint64FromNUM(yyS[yypt-0].item), TiDBExtension: yyS[yypt-1].item.(bool), } } - case 2494: + case 2544: { parser.yyVAL.statement = &ast.KillStmt{ ConnectionID: getUint64FromNUM(yyS[yypt-0].item), TiDBExtension: yyS[yypt-2].item.(bool), } } - case 2495: + case 2545: { parser.yyVAL.statement = &ast.KillStmt{ ConnectionID: getUint64FromNUM(yyS[yypt-0].item), @@ -21811,47 +22222,70 @@ yynewstate: TiDBExtension: yyS[yypt-2].item.(bool), } } - case 2496: + case 2546: { parser.yyVAL.statement = &ast.KillStmt{ TiDBExtension: yyS[yypt-1].item.(bool), Expr: yyS[yypt-0].expr, } } - case 2497: + case 2547: { parser.yyVAL.item = false } - case 2498: + case 2548: { parser.yyVAL.item = true } - case 2499: + case 2549: { parser.yyVAL.statement = &ast.LoadStatsStmt{ Path: yyS[yypt-0].ident, } } - case 2500: + case 2550: { parser.yyVAL.statement = &ast.LockStatsStmt{ Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 2501: + case 2551: { parser.yyVAL.statement = &ast.UnlockStatsStmt{ Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 2502: + case 2552: { parser.yyVAL.statement = &ast.DropPlacementPolicyStmt{ IfExists: yyS[yypt-1].item.(bool), PolicyName: model.NewCIStr(yyS[yypt-0].ident), } } - case 2503: + case 2553: + { + parser.yyVAL.statement = &ast.CreateResourceGroupStmt{ + IfNotExists: yyS[yypt-2].item.(bool), + ResourceGroupName: model.NewCIStr(yyS[yypt-1].ident), + ResourceGroupOptionList: yyS[yypt-0].item.([]*ast.ResourceGroupOption), + } + } + case 2554: + { + parser.yyVAL.statement = &ast.AlterResourceGroupStmt{ + IfExists: yyS[yypt-2].item.(bool), + ResourceGroupName: model.NewCIStr(yyS[yypt-1].ident), + ResourceGroupOptionList: yyS[yypt-0].item.([]*ast.ResourceGroupOption), + } + } + case 2555: + { + parser.yyVAL.statement = &ast.DropResourceGroupStmt{ + IfExists: yyS[yypt-1].item.(bool), + ResourceGroupName: model.NewCIStr(yyS[yypt-0].ident), + } + } + case 2556: { parser.yyVAL.statement = &ast.CreatePlacementPolicyStmt{ OrReplace: yyS[yypt-5].item.(bool), @@ -21860,7 +22294,7 @@ yynewstate: PlacementOptions: yyS[yypt-0].item.([]*ast.PlacementOption), } } - case 2504: + case 2557: { parser.yyVAL.statement = &ast.AlterPlacementPolicyStmt{ IfExists: yyS[yypt-2].item.(bool), @@ -21868,7 +22302,7 @@ yynewstate: PlacementOptions: yyS[yypt-0].item.([]*ast.PlacementOption), } } - case 2505: + case 2558: { parser.yyVAL.statement = &ast.CreateSequenceStmt{ IfNotExists: yyS[yypt-3].item.(bool), @@ -21877,87 +22311,87 @@ yynewstate: TblOptions: yyS[yypt-0].item.([]*ast.TableOption), } } - case 2506: + case 2559: { parser.yyVAL.item = []*ast.SequenceOption{} } - case 2508: + case 2561: { parser.yyVAL.item = []*ast.SequenceOption{yyS[yypt-0].item.(*ast.SequenceOption)} } - case 2509: + case 2562: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.SequenceOption), yyS[yypt-0].item.(*ast.SequenceOption)) } - case 2510: + case 2563: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceOptionIncrementBy, IntValue: yyS[yypt-0].item.(int64)} } - case 2511: + case 2564: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceOptionIncrementBy, IntValue: yyS[yypt-0].item.(int64)} } - case 2512: + case 2565: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceStartWith, IntValue: yyS[yypt-0].item.(int64)} } - case 2513: + case 2566: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceStartWith, IntValue: yyS[yypt-0].item.(int64)} } - case 2514: + case 2567: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceMinValue, IntValue: yyS[yypt-0].item.(int64)} } - case 2515: + case 2568: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoMinValue} } - case 2516: + case 2569: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoMinValue} } - case 2517: + case 2570: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceMaxValue, IntValue: yyS[yypt-0].item.(int64)} } - case 2518: + case 2571: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoMaxValue} } - case 2519: + case 2572: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoMaxValue} } - case 2520: + case 2573: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceCache, IntValue: yyS[yypt-0].item.(int64)} } - case 2521: + case 2574: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoCache} } - case 2522: + case 2575: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoCache} } - case 2523: + case 2576: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceCycle} } - case 2524: + case 2577: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoCycle} } - case 2525: + case 2578: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoCycle} } - case 2527: + case 2580: { parser.yyVAL.item = yyS[yypt-0].item } - case 2528: + case 2581: { unsigned_num := getUint64FromNUM(yyS[yypt-0].item) if unsigned_num > 9223372036854775808 { @@ -21970,14 +22404,14 @@ yynewstate: parser.yyVAL.item = -int64(unsigned_num) } } - case 2529: + case 2582: { parser.yyVAL.statement = &ast.DropSequenceStmt{ IfExists: yyS[yypt-1].item.(bool), Sequences: yyS[yypt-0].item.([]*ast.TableName), } } - case 2530: + case 2583: { parser.yyVAL.statement = &ast.AlterSequenceStmt{ IfExists: yyS[yypt-2].item.(bool), @@ -21985,27 +22419,27 @@ yynewstate: SeqOptions: yyS[yypt-0].item.([]*ast.SequenceOption), } } - case 2531: + case 2584: { parser.yyVAL.item = []*ast.SequenceOption{yyS[yypt-0].item.(*ast.SequenceOption)} } - case 2532: + case 2585: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.SequenceOption), yyS[yypt-0].item.(*ast.SequenceOption)) } - case 2534: + case 2587: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceRestart} } - case 2535: + case 2588: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceRestartWith, IntValue: yyS[yypt-0].item.(int64)} } - case 2536: + case 2589: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceRestartWith, IntValue: yyS[yypt-0].item.(int64)} } - case 2537: + case 2590: { x := &ast.IndexAdviseStmt{ Path: yyS[yypt-3].ident, @@ -22022,42 +22456,42 @@ yynewstate: } parser.yyVAL.statement = x } - case 2538: + case 2591: { parser.yyVAL.item = uint64(ast.UnspecifiedSize) } - case 2539: + case 2592: { parser.yyVAL.item = getUint64FromNUM(yyS[yypt-0].item) } - case 2540: + case 2593: { parser.yyVAL.item = nil } - case 2541: + case 2594: { parser.yyVAL.item = &ast.MaxIndexNumClause{ PerTable: yyS[yypt-1].item.(uint64), PerDB: yyS[yypt-0].item.(uint64), } } - case 2542: + case 2595: { parser.yyVAL.item = uint64(ast.UnspecifiedSize) } - case 2543: + case 2596: { parser.yyVAL.item = getUint64FromNUM(yyS[yypt-0].item) } - case 2544: + case 2597: { parser.yyVAL.item = uint64(ast.UnspecifiedSize) } - case 2545: + case 2598: { parser.yyVAL.item = getUint64FromNUM(yyS[yypt-0].item) } - case 2546: + case 2599: { // Parse it but will ignore it switch yyS[yypt-0].ident { @@ -22072,19 +22506,19 @@ yynewstate: } parser.yyVAL.ident = yyS[yypt-0].ident } - case 2547: + case 2600: { parser.yyVAL.item = append([]*ast.RowExpr{}, yyS[yypt-0].item.(*ast.RowExpr)) } - case 2548: + case 2601: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.RowExpr), yyS[yypt-0].item.(*ast.RowExpr)) } - case 2549: + case 2602: { parser.yyVAL.item = &ast.RowExpr{Values: yyS[yypt-0].item.([]ast.ExprNode)} } - case 2550: + case 2603: { x := &ast.PlanReplayerStmt{ Stmt: yyS[yypt-0].statement, @@ -22100,7 +22534,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2551: + case 2604: { x := &ast.PlanReplayerStmt{ Stmt: yyS[yypt-0].statement, @@ -22116,7 +22550,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2552: + case 2605: { x := &ast.PlanReplayerStmt{ Stmt: nil, @@ -22136,7 +22570,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2553: + case 2606: { x := &ast.PlanReplayerStmt{ Stmt: nil, @@ -22156,7 +22590,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2554: + case 2607: { x := &ast.PlanReplayerStmt{ Stmt: nil, @@ -22166,7 +22600,7 @@ yynewstate: } parser.yyVAL.statement = x } - case 2555: + case 2608: { x := &ast.PlanReplayerStmt{ Stmt: nil, @@ -22176,7 +22610,7 @@ yynewstate: } parser.yyVAL.statement = x } - case 2556: + case 2609: { x := &ast.PlanReplayerStmt{ Stmt: nil, @@ -22188,6 +22622,36 @@ yynewstate: Limit: nil, } + parser.yyVAL.statement = x + } + case 2610: + { + x := &ast.PlanReplayerStmt{ + Stmt: nil, + Analyze: false, + Capture: true, + SQLDigest: yyS[yypt-1].ident, + PlanDigest: yyS[yypt-0].ident, + Where: nil, + OrderBy: nil, + Limit: nil, + } + + parser.yyVAL.statement = x + } + case 2611: + { + x := &ast.PlanReplayerStmt{ + Stmt: nil, + Analyze: false, + Remove: true, + SQLDigest: yyS[yypt-1].ident, + PlanDigest: yyS[yypt-0].ident, + Where: nil, + OrderBy: nil, + Limit: nil, + } + parser.yyVAL.statement = x } diff --git a/parser/parser.y b/parser/parser.y index 55ee369aa41e4..e0155bc31395f 100644 --- a/parser/parser.y +++ b/parser/parser.y @@ -35,6 +35,7 @@ import ( "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/types" + "github.com/pingcap/tidb/parser/duration" ) %} @@ -53,6 +54,7 @@ import ( identifier "identifier" asof "AS OF" toTimestamp "TO TIMESTAMP" + memberof "MEMBER OF" /*yy:token "_%c" */ underscoreCS "UNDERSCORE_CHARSET" @@ -77,6 +79,7 @@ import ( alter "ALTER" analyze "ANALYZE" and "AND" + array "ARRAY" as "AS" asc "ASC" between "BETWEEN" @@ -373,6 +376,7 @@ import ( deallocate "DEALLOCATE" definer "DEFINER" delayKeyWrite "DELAY_KEY_WRITE" + digest "DIGEST" directory "DIRECTORY" disable "DISABLE" disabled "DISABLED" @@ -457,6 +461,7 @@ import ( maxUpdatesPerHour "MAX_UPDATES_PER_HOUR" maxUserConnections "MAX_USER_CONNECTIONS" mb "MB" + member "MEMBER" memory "MEMORY" merge "MERGE" microsecond "MICROSECOND" @@ -531,11 +536,13 @@ import ( replicas "REPLICAS" replication "REPLICATION" required "REQUIRED" + resource "RESOURCE" respect "RESPECT" restart "RESTART" restore "RESTORE" restores "RESTORES" resume "RESUME" + reuse "REUSE" reverse "REVERSE" role "ROLE" rollback "ROLLBACK" @@ -613,6 +620,9 @@ import ( transaction "TRANSACTION" triggers "TRIGGERS" truncate "TRUNCATE" + ttl "TTL" + ttlEnable "TTL_ENABLE" + ttlJobInterval "TTL_JOB_INTERVAL" unbounded "UNBOUNDED" uncommitted "UNCOMMITTED" undefined "UNDEFINED" @@ -631,6 +641,8 @@ import ( x509 "X509" yearType "YEAR" wait "WAIT" + failedLoginAttempts "FAILED_LOGIN_ATTEMPTS" + passwordLockTime "PASSWORD_LOCK_TIME" /* The following tokens belong to NotKeywordToken. Notice: make sure these tokens are contained in NotKeywordToken. */ addDate "ADDDATE" @@ -641,10 +653,12 @@ import ( bitXor "BIT_XOR" bound "BOUND" briefType "BRIEF" + burstable "BURSTABLE" cast "CAST" copyKwd "COPY" constraints "CONSTRAINTS" curTime "CURTIME" + curDate "CURDATE" dateAdd "DATE_ADD" dateSub "DATE_SUB" dotType "DOT" @@ -695,7 +709,9 @@ import ( subDate "SUBDATE" sum "SUM" substring "SUBSTRING" + survivalPreferences "SURVIVAL_PREFERENCES" target "TARGET" + tidbJson "TIDB_JSON" timestampAdd "TIMESTAMPADD" timestampDiff "TIMESTAMPDIFF" tls "TLS" @@ -718,6 +734,9 @@ import ( voter "VOTER" voterConstraints "VOTER_CONSTRAINTS" voters "VOTERS" + ruRate "RU_PER_SEC" + ioReadBandwidth "IO_READ_BANDWIDTH" + ioWriteBandwidth "IO_WRITE_BANDWIDTH" /* The following tokens belong to TiDBKeyword. Notice: make sure these tokens are contained in TiDBKeyword. */ admin "ADMIN" @@ -864,6 +883,7 @@ import ( AlterImportStmt "ALTER IMPORT statement" AlterInstanceStmt "Alter instance statement" AlterPolicyStmt "Alter Placement Policy statement" + AlterResourceGroupStmt "Alter Resource Group statement" AlterSequenceStmt "Alter sequence statement" AnalyzeTableStmt "Analyze table statement" BeginTransactionStmt "BEGIN TRANSACTION statement" @@ -879,12 +899,14 @@ import ( CreateImportStmt "CREATE IMPORT statement" CreateBindingStmt "CREATE BINDING statement" CreatePolicyStmt "CREATE PLACEMENT POLICY statement" + CreateResourceGroupStmt "CREATE RESOURCE GROUP statement" CreateSequenceStmt "CREATE SEQUENCE statement" CreateStatisticsStmt "CREATE STATISTICS statement" DoStmt "Do statement" DropDatabaseStmt "DROP DATABASE statement" DropImportStmt "DROP IMPORT statement" DropIndexStmt "DROP INDEX statement" + DropResourceGroupStmt "DROP RESOURCE GROUP statement" DropStatisticsStmt "DROP STATISTICS statement" DropStatsStmt "DROP STATS statement" DropTableStmt "DROP TABLE statement" @@ -966,12 +988,13 @@ import ( AdminStmtLimitOpt "Admin show ddl jobs limit option" AllOrPartitionNameList "All or partition name list" AlgorithmClause "Alter table algorithm" - AlterTablePartitionOpt "Alter table partition option" + AlterTableSpecSingleOpt "Alter table single option" AlterTableSpec "Alter table specification" AlterTableSpecList "Alter table specification list" AlterTableSpecListOpt "Alter table specification list optional" AlterSequenceOption "Alter sequence option" AlterSequenceOptionList "Alter sequence option list" + ArrayKwdOpt "Array options" AnalyzeOption "Analyze option" AnalyzeOptionList "Analyze option list" AnalyzeOptionListOpt "Optional analyze option list" @@ -984,7 +1007,6 @@ import ( Boolean "Boolean (0, 1, false, true)" OptionalBraces "optional braces" CastType "Cast function target type" - ClearPasswordExpireOptions "Clear password expire options" ColumnDef "table column definition" ColumnDefList "table column definition list" ColumnName "column name" @@ -1133,7 +1155,6 @@ import ( PartDefValuesOpt "VALUES {LESS THAN {(expr | value_list) | MAXVALUE} | IN {value_list}" PartDefOptionList "PartDefOption list" PartDefOption "COMMENT [=] xxx | TABLESPACE [=] tablespace_name | ENGINE [=] xxx" - PasswordExpire "Single password option for create user statement" 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" @@ -1154,6 +1175,7 @@ import ( 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" @@ -1347,6 +1369,8 @@ import ( PlacementPolicyOption "Anonymous or placement policy option" DirectPlacementOption "Subset of anonymous or direct placement option" PlacementOptionList "Anomymous or direct placement option list" + DirectResourceGroupOption "Subset of anonymous or direct resource group option" + ResourceGroupOptionList "Anomymous or direct resource group option list" AttributesOpt "Attributes options" AllColumnsOrPredicateColumnsOpt "all columns or predicate columns option" StatsOptionsOpt "Stats options" @@ -1360,6 +1384,7 @@ import ( PrimaryOpt "Optional primary keyword" 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" @@ -1412,6 +1437,7 @@ import ( ColumnFormat "Column format" DBName "Database Name" PolicyName "Placement Policy Name" + ResourceGroupName "Resource Group Name" ExplainFormatType "explain format type" FieldAsName "Field alias name" FieldAsNameOpt "Field alias name opt" @@ -1510,7 +1536,7 @@ Start: * See https://dev.mysql.com/doc/refman/5.7/en/alter-table.html *******************************************************************************************/ AlterTableStmt: - "ALTER" IgnoreOptional "TABLE" TableName AlterTableSpecListOpt AlterTablePartitionOpt + "ALTER" IgnoreOptional "TABLE" TableName AlterTableSpecListOpt AlterTableSpecSingleOpt { specs := $5.([]*ast.AlterTableSpec) if $6 != nil { @@ -1566,6 +1592,40 @@ AlterTableStmt: } } +ResourceGroupOptionList: + DirectResourceGroupOption + { + $$ = []*ast.ResourceGroupOption{$1.(*ast.ResourceGroupOption)} + } +| ResourceGroupOptionList DirectResourceGroupOption + { + if $1.([]*ast.ResourceGroupOption)[0].Tp == $2.(*ast.ResourceGroupOption).Tp || + (len($1.([]*ast.ResourceGroupOption)) > 1 && $1.([]*ast.ResourceGroupOption)[1].Tp == $2.(*ast.ResourceGroupOption).Tp) { + yylex.AppendError(yylex.Errorf("Dupliated options specified")) + return 1 + } + $$ = append($1.([]*ast.ResourceGroupOption), $2.(*ast.ResourceGroupOption)) + } +| ResourceGroupOptionList ',' DirectResourceGroupOption + { + if $1.([]*ast.ResourceGroupOption)[0].Tp == $3.(*ast.ResourceGroupOption).Tp || + (len($1.([]*ast.ResourceGroupOption)) > 1 && $1.([]*ast.ResourceGroupOption)[1].Tp == $3.(*ast.ResourceGroupOption).Tp) { + yylex.AppendError(yylex.Errorf("Dupliated options specified")) + return 1 + } + $$ = append($1.([]*ast.ResourceGroupOption), $3.(*ast.ResourceGroupOption)) + } + +DirectResourceGroupOption: + "RU_PER_SEC" EqOpt LengthNum + { + $$ = &ast.ResourceGroupOption{Tp: ast.ResourceRURate, UintValue: $3.(uint64)} + } +| "BURSTABLE" + { + $$ = &ast.ResourceGroupOption{Tp: ast.ResourceBurstableOpiton, BoolValue: true} + } + PlacementOptionList: DirectPlacementOption { @@ -1630,6 +1690,10 @@ DirectPlacementOption: { $$ = &ast.PlacementOption{Tp: ast.PlacementOptionLearnerConstraints, StrValue: $3} } +| "SURVIVAL_PREFERENCES" EqOpt stringLit + { + $$ = &ast.PlacementOption{Tp: ast.PlacementOptionSurvivalPreferences, StrValue: $3} + } PlacementPolicyOption: "PLACEMENT" "POLICY" EqOpt stringLit @@ -1669,7 +1733,8 @@ StatsOptionsOpt: $$ = &ast.StatsOptionsSpec{Default: false, StatsOptions: $3} } -AlterTablePartitionOpt: +// Some spec can only have one, but not in a list +AlterTableSpecSingleOpt: PartitionOpt { if $1 != nil { @@ -1734,6 +1799,12 @@ AlterTablePartitionOpt: Options: $3.([]*ast.TableOption), } } +| "REMOVE" "TTL" + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRemoveTTL, + } + } LocationLabelList: { @@ -3556,6 +3627,14 @@ NowSymOptionFraction: { $$ = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP"), Args: []ast.ExprNode{ast.NewValueExpr($3, parser.charset, parser.collation)}} } +| CurdateSym '(' ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_DATE")} + } +| "CURRENT_DATE" + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_DATE")} + } NextValueForSequence: "NEXT" "VALUE" forKwd TableName @@ -3594,6 +3673,10 @@ NowSym: | "LOCALTIME" | "LOCALTIMESTAMP" +CurdateSym: + builtinCurDate +| "CURRENT_DATE" + SignedLiteral: Literal { @@ -3855,6 +3938,9 @@ DBName: PolicyName: Identifier +ResourceGroupName: + Identifier + DatabaseOption: DefaultKwdOpt CharsetKw EqOpt CharsetName { @@ -4962,6 +5048,7 @@ ExplainFormatType: | "BRIEF" | "VERBOSE" | "TRUE_CARD_COST" +| "TIDB_JSON" SavepointStmt: "SAVEPOINT" Identifier @@ -5751,6 +5838,10 @@ PredicateExpr: { $$ = &ast.PatternRegexpExpr{Expr: $1, Pattern: $3, Not: !$2.(bool)} } +| BitExpr memberof '(' SimpleExpr ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONMemberOf), Args: []ast.ExprNode{$1, $4}} + } | BitExpr RegexpSym: @@ -5813,19 +5904,22 @@ FieldList: { field := $1.(*ast.SelectField) field.Offset = parser.startOffset(&yyS[yypt]) + if field.Expr != nil && field.AsName.O == "" { + endOffset := parser.yylval.offset + field.SetText(parser.lexer.client, strings.TrimSpace(parser.src[field.Offset:endOffset])) + } $$ = []*ast.SelectField{field} } | FieldList ',' Field { fl := $1.([]*ast.SelectField) - last := fl[len(fl)-1] - if last.Expr != nil && last.AsName.O == "" { - lastEnd := parser.endOffset(&yyS[yypt-1]) - last.SetText(parser.lexer.client, parser.src[last.Offset:lastEnd]) + field := $3.(*ast.SelectField) + field.Offset = parser.startOffset(&yyS[yypt]) + if field.Expr != nil && field.AsName.O == "" { + endOffset := parser.yylval.offset + field.SetText(parser.lexer.client, strings.TrimSpace(parser.src[field.Offset:endOffset])) } - newField := $3.(*ast.SelectField) - newField.Offset = parser.startOffset(&yyS[yypt]) - $$ = append(fl, newField) + $$ = append(fl, field) } GroupByClause: @@ -6135,6 +6229,7 @@ UnReservedKeyword: | "REBUILD" | "REDUNDANT" | "REORGANIZE" +| "RESOURCE" | "RESTART" | "ROLE" | "ROLLBACK" @@ -6269,6 +6364,7 @@ UnReservedKeyword: | "ACCOUNT" | "INCREMENTAL" | "CPU" +| "MEMBER" | "MEMORY" | "BLOCK" | "IO" @@ -6391,6 +6487,13 @@ UnReservedKeyword: | "NONCLUSTERED" | "PRESERVE" | "TOKEN_ISSUER" +| "TTL" +| "TTL_ENABLE" +| "TTL_JOB_INTERVAL" +| "FAILED_LOGIN_ATTEMPTS" +| "PASSWORD_LOCK_TIME" +| "DIGEST" +| "REUSE" %prec lowerThanEq TiDBKeyword: "ADMIN" @@ -6449,6 +6552,7 @@ NotKeywordToken: | "CAST" | "COPY" | "CURTIME" +| "CURDATE" | "DATE_ADD" | "DATE_SUB" | "DOT" @@ -6520,10 +6624,16 @@ NotKeywordToken: | "CONSTRAINTS" | "PRIMARY_REGION" | "SCHEDULE" +| "SURVIVAL_PREFERENCES" | "LEADER_CONSTRAINTS" | "FOLLOWER_CONSTRAINTS" | "LEARNER_CONSTRAINTS" | "VOTER_CONSTRAINTS" +| "TIDB_JSON" +| "IO_READ_BANDWIDTH" +| "IO_WRITE_BANDWIDTH" +| "RU_PER_SEC" +| "BURSTABLE" /************************************************************************************ * @@ -7166,7 +7276,7 @@ SimpleExpr: FunctionType: ast.CastBinaryOperator, } } -| builtinCast '(' Expression "AS" CastType ')' +| builtinCast '(' Expression "AS" CastType ArrayKwdOpt ')' { /* See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_cast */ tp := $5.(*types.FieldType) @@ -7177,7 +7287,13 @@ SimpleExpr: 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, @@ -7246,6 +7362,15 @@ SimpleExpr: $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONUnquote), Args: []ast.ExprNode{extract}} } +ArrayKwdOpt: + { + $$ = false + } +| "ARRAY" + { + $$ = true + } + DistinctKwd: "DISTINCT" | "DISTINCTROW" @@ -8556,30 +8681,6 @@ SelectStmt: if $6 != nil { st.LockInfo = $6.(*ast.SelectLockInfo) } - lastField := st.Fields.Fields[len(st.Fields.Fields)-1] - if lastField.Expr != nil && lastField.AsName.O == "" { - src := parser.src - var lastEnd int - if $2 != nil { - lastEnd = yyS[yypt-5].offset - 1 - } else if $3 != nil { - lastEnd = yyS[yypt-4].offset - 1 - } else if $4 != nil { - lastEnd = yyS[yypt-3].offset - 1 - } else if $5 != nil { - lastEnd = yyS[yypt-2].offset - 1 - } else if st.LockInfo != nil && st.LockInfo.LockType != ast.SelectLockNone { - lastEnd = yyS[yypt-1].offset - 1 - } else if $7 != nil { - lastEnd = yyS[yypt].offset - 1 - } else { - lastEnd = len(src) - if src[lastEnd-1] == ';' { - lastEnd-- - } - } - lastField.SetText(parser.lexer.client, src[lastField.Offset:lastEnd]) - } if $2 != nil { st.Where = $2.(ast.ExprNode) } @@ -10671,6 +10772,13 @@ ShowStmt: DBName: $5, } } +| "SHOW" "CREATE" "RESOURCE" "GROUP" ResourceGroupName + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowCreateResourceGroup, + ResourceGroupName: $5, + } + } | "SHOW" "CREATE" "USER" Username { // See https://dev.mysql.com/doc/refman/5.7/en/show-create-user.html @@ -11098,7 +11206,7 @@ ShowTargetFilterable: { $$ = &ast.ShowStmt{Tp: ast.ShowStatsHealthy} } -| "STATS_LOCKED" +| "STATS_LOCKED" { $$ = &ast.ShowStmt{Tp: ast.ShowStatsLocked, Table: &ast.TableName{Name: model.NewCIStr("STATS_TABLE_LOCKED"), Schema: model.NewCIStr(mysql.SystemDB)}} } @@ -11347,6 +11455,7 @@ Statement: | AlterInstanceStmt | AlterSequenceStmt | AlterPolicyStmt +| AlterResourceGroupStmt | AnalyzeTableStmt | BeginTransactionStmt | BinlogStmt @@ -11366,6 +11475,7 @@ Statement: | CreateRoleStmt | CreateBindingStmt | CreatePolicyStmt +| CreateResourceGroupStmt | CreateSequenceStmt | CreateStatisticsStmt | DoStmt @@ -11377,6 +11487,7 @@ Statement: | DropSequenceStmt | DropViewStmt | DropUserStmt +| DropResourceGroupStmt | DropRoleStmt | DropStatisticsStmt | DropStatsStmt @@ -11761,6 +11872,36 @@ TableOption: // Parse it but will ignore it $$ = &ast.TableOption{Tp: ast.TableOptionEncryption, StrValue: $3} } +| "TTL" EqOpt Identifier '+' "INTERVAL" Literal TimeUnit + { + $$ = &ast.TableOption{ + Tp: ast.TableOptionTTL, + ColumnName: &ast.ColumnName{Name: model.NewCIStr($3)}, + Value: ast.NewValueExpr($6, parser.charset, parser.collation), + TimeUnitValue: &ast.TimeUnitExpr{Unit: $7.(ast.TimeUnitType)}, + } + } +| "TTL_ENABLE" EqOpt stringLit + { + onOrOff := strings.ToLower($3) + if onOrOff == "on" { + $$ = &ast.TableOption{Tp: ast.TableOptionTTLEnable, BoolValue: true} + } else if onOrOff == "off" { + $$ = &ast.TableOption{Tp: ast.TableOptionTTLEnable, BoolValue: false} + } else { + yylex.AppendError(yylex.Errorf("The TTL_ENABLE option has to be set 'ON' or 'OFF'")) + return 1 + } + } +| "TTL_JOB_INTERVAL" EqOpt stringLit + { + _, err := duration.ParseDuration($3) + if err != nil { + yylex.AppendError(yylex.Errorf("The TTL_JOB_INTERVAL option is not a valid duration: %s", err.Error())) + return 1 + } + $$ = &ast.TableOption{Tp: ast.TableOptionTTLJobInterval, StrValue: $3} + } ForceOpt: /* empty */ @@ -12634,7 +12775,7 @@ CommaOpt: * https://dev.mysql.com/doc/refman/5.7/en/account-management-sql.html ************************************************************************************/ CreateUserStmt: - "CREATE" "USER" IfNotExists UserSpecList RequireClauseOpt ConnectionOptions PasswordOrLockOptions CommentOrAttributeOption + "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{ @@ -12648,6 +12789,9 @@ CreateUserStmt: if $8 != nil { ret.CommentOrAttributeOption = $8.(*ast.CommentOrAttributeOption) } + if $9 != nil { + ret.ResourceGroupNameOption = $9.(*ast.ResourceGroupNameOption) + } $$ = ret } @@ -12664,7 +12808,7 @@ CreateRoleStmt: /* See http://dev.mysql.com/doc/refman/8.0/en/alter-user.html */ AlterUserStmt: - "ALTER" "USER" IfExists UserSpecList RequireClauseOpt ConnectionOptions PasswordOrLockOptions CommentOrAttributeOption + "ALTER" "USER" IfExists UserSpecList RequireClauseOpt ConnectionOptions PasswordOrLockOptions CommentOrAttributeOption ResourceGroupNameOption { ret := &ast.AlterUserStmt{ IfExists: $3.(bool), @@ -12676,6 +12820,9 @@ AlterUserStmt: if $8 != nil { ret.CommentOrAttributeOption = $8.(*ast.CommentOrAttributeOption) } + if $9 != nil { + ret.ResourceGroupNameOption = $9.(*ast.ResourceGroupNameOption) + } $$ = ret } | "ALTER" "USER" IfExists "USER" '(' ')' "IDENTIFIED" "BY" AuthString @@ -12889,6 +13036,15 @@ CommentOrAttributeOption: $$ = &ast.CommentOrAttributeOption{Type: ast.UserAttributeType, Value: $2} } +ResourceGroupNameOption: + { + $$ = nil + } +| "RESOURCE" "GROUP" ResourceGroupName + { + $$ = &ast.ResourceGroupNameOption{Value: $3} + } + PasswordOrLockOptions: { $$ = []*ast.PasswordOrLockOption{} @@ -12923,49 +13079,76 @@ PasswordOrLockOption: Type: ast.Lock, } } -| PasswordExpire +| "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, } - yylex.AppendError(yylex.Errorf("TiDB does not support PASSWORD EXPIRE, they would be parsed but ignored.")) - parser.lastErrorAsWarn() } -| PasswordExpire "INTERVAL" Int64Num "DAY" +| "PASSWORD" "EXPIRE" "INTERVAL" Int64Num "DAY" { $$ = &ast.PasswordOrLockOption{ Type: ast.PasswordExpireInterval, - Count: $3.(int64), + Count: $4.(int64), } - yylex.AppendError(yylex.Errorf("TiDB does not support PASSWORD EXPIRE, they would be parsed but ignored.")) - parser.lastErrorAsWarn() } -| PasswordExpire "NEVER" +| "PASSWORD" "EXPIRE" "NEVER" { $$ = &ast.PasswordOrLockOption{ Type: ast.PasswordExpireNever, } - yylex.AppendError(yylex.Errorf("TiDB does not support PASSWORD EXPIRE, they would be parsed but ignored.")) - parser.lastErrorAsWarn() } -| PasswordExpire "DEFAULT" +| "PASSWORD" "EXPIRE" "DEFAULT" { $$ = &ast.PasswordOrLockOption{ Type: ast.PasswordExpireDefault, } - yylex.AppendError(yylex.Errorf("TiDB does not support PASSWORD EXPIRE, they would be parsed but ignored.")) - parser.lastErrorAsWarn() } - -PasswordExpire: - "PASSWORD" "EXPIRE" ClearPasswordExpireOptions +| "FAILED_LOGIN_ATTEMPTS" Int64Num { - $$ = nil + $$ = &ast.PasswordOrLockOption{ + Type: ast.FailedLoginAttempts, + Count: $2.(int64), + } } - -ClearPasswordExpireOptions: +| "PASSWORD_LOCK_TIME" Int64Num { - $$ = nil + $$ = &ast.PasswordOrLockOption{ + Type: ast.PasswordLockTime, + Count: $2.(int64), + } + } +| "PASSWORD_LOCK_TIME" "UNBOUNDED" + { + $$ = &ast.PasswordOrLockOption{ + Type: ast.PasswordLockTimeUnbounded, + } } AuthOption: @@ -12996,15 +13179,17 @@ AuthOption: | "IDENTIFIED" "WITH" AuthPlugin "AS" HashString { $$ = &ast.AuthOption{ - AuthPlugin: $3, - HashString: $5, + AuthPlugin: $3, + HashString: $5, + ByHashString: true, } } | "IDENTIFIED" "BY" "PASSWORD" HashString { $$ = &ast.AuthOption{ - AuthPlugin: mysql.AuthNativePassword, - HashString: $4, + AuthPlugin: mysql.AuthNativePassword, + HashString: $4, + ByHashString: true, } } @@ -13089,6 +13274,15 @@ CreateBindingStmt: GlobalScope: $2.(bool), } + $$ = x + } +| "CREATE" GlobalScope "BINDING" "FROM" "HISTORY" "USING" "PLAN" "DIGEST" stringLit + { + x := &ast.CreateBindingStmt{ + GlobalScope: $2.(bool), + PlanDigest: $9, + } + $$ = x } @@ -13130,6 +13324,15 @@ DropBindingStmt: GlobalScope: $2.(bool), } + $$ = x + } +| "DROP" GlobalScope "BINDING" "FOR" "SQL" "DIGEST" stringLit + { + x := &ast.DropBindingStmt{ + GlobalScope: $2.(bool), + SQLDigest: $7, + } + $$ = x } @@ -13164,6 +13367,15 @@ SetBindingStmt: HintedNode: hintedStmt, } + $$ = x + } +| "SET" "BINDING" BindingStatusType "FOR" "SQL" "DIGEST" stringLit + { + x := &ast.SetBindingStmt{ + BindingStatusType: $3.(ast.BindingStatusType), + SQLDigest: $7, + } + $$ = x } @@ -13561,6 +13773,7 @@ LoadDataStmt: "LOAD" "DATA" LocalOpt "INFILE" stringLit DuplicateOpt "INTO" "TABLE" TableName CharsetOpt Fields Lines IgnoreLines ColumnNameOrUserVarListOptWithBrackets LoadDataSetSpecOpt { x := &ast.LoadDataStmt{ + FileLocRef: ast.FileLocServerOrRemote, Path: $5, OnDuplicate: $6.(ast.OnDuplicateKeyHandlingType), Table: $9.(*ast.TableName), @@ -13568,7 +13781,7 @@ LoadDataStmt: IgnoreLines: $13.(uint64), } if $3 != nil { - x.IsLocal = true + 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 { @@ -13865,6 +14078,7 @@ ShardableStmt: DeleteFromStmt | UpdateStmt | InsertIntoStmt +| ReplaceIntoStmt DryRunOptions: { @@ -13968,6 +14182,35 @@ DropPolicyStmt: } } +CreateResourceGroupStmt: + "CREATE" "RESOURCE" "GROUP" IfNotExists ResourceGroupName ResourceGroupOptionList + { + $$ = &ast.CreateResourceGroupStmt{ + IfNotExists: $4.(bool), + ResourceGroupName: model.NewCIStr($5), + ResourceGroupOptionList: $6.([]*ast.ResourceGroupOption), + } + } + +AlterResourceGroupStmt: + "ALTER" "RESOURCE" "GROUP" IfExists ResourceGroupName ResourceGroupOptionList + { + $$ = &ast.AlterResourceGroupStmt{ + IfExists: $4.(bool), + ResourceGroupName: model.NewCIStr($5), + ResourceGroupOptionList: $6.([]*ast.ResourceGroupOption), + } + } + +DropResourceGroupStmt: + "DROP" "RESOURCE" "GROUP" IfExists ResourceGroupName + { + $$ = &ast.DropResourceGroupStmt{ + IfExists: $4.(bool), + ResourceGroupName: model.NewCIStr($5), + } + } + CreatePolicyStmt: "CREATE" OrReplace "PLACEMENT" "POLICY" IfNotExists PolicyName PlacementOptionList { @@ -14294,7 +14537,8 @@ RowStmt: * [ASC | DESC], ... [WITH ROLLUP]] * [LIMIT {[offset,] row_count | row_count OFFSET offset}]} * | 'file_name' - * | LOAD 'file_name'] + * | LOAD 'file_name' + * | CAPTURE `sql_digest` `plan_digest`] *******************************************************************/ PlanReplayerStmt: "PLAN" "REPLAYER" "DUMP" "EXPLAIN" ExplainableStmt @@ -14401,6 +14645,36 @@ PlanReplayerStmt: Limit: nil, } + $$ = x + } +| "PLAN" "REPLAYER" "CAPTURE" stringLit stringLit + { + x := &ast.PlanReplayerStmt{ + Stmt: nil, + Analyze: false, + Capture: true, + SQLDigest: $4, + PlanDigest: $5, + Where: nil, + OrderBy: nil, + Limit: nil, + } + + $$ = x + } +| "PLAN" "REPLAYER" "CAPTURE" "REMOVE" stringLit stringLit + { + x := &ast.PlanReplayerStmt{ + Stmt: nil, + Analyze: false, + Remove: true, + SQLDigest: $5, + PlanDigest: $6, + Where: nil, + OrderBy: nil, + Limit: nil, + } + $$ = x } %% diff --git a/parser/parser_test.go b/parser/parser_test.go index 971adc6b25f8e..2dcfd9b6db52f 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -60,7 +60,7 @@ func TestSimple(t *testing.T) { "delayed", "high_priority", "low_priority", "cumeDist", "denseRank", "firstValue", "lag", "lastValue", "lead", "nthValue", "ntile", "over", "percentRank", "rank", "row", "rows", "rowNumber", "window", "linear", - "match", "until", "placement", "tablesample", + "match", "until", "placement", "tablesample", "failedLoginAttempts", "passwordLockTime", // TODO: support the following keywords // "with", } @@ -98,7 +98,8 @@ func TestSimple(t *testing.T) { "max_connections_per_hour", "max_queries_per_hour", "max_updates_per_hour", "max_user_connections", "event", "reload", "routine", "temporary", "following", "preceding", "unbounded", "respect", "nulls", "current", "last", "against", "expansion", "chain", "error", "general", "nvarchar", "pack_keys", "p", "shard_row_id_bits", "pre_split_regions", - "constraints", "role", "replicas", "policy", "s3", "strict", "running", "stop", "preserve", "placement", "attributes", "attribute", + "constraints", "role", "replicas", "policy", "s3", "strict", "running", "stop", "preserve", "placement", "attributes", "attribute", "resource", + "burstable", } for _, kw := range unreservedKws { src := fmt.Sprintf("SELECT %s FROM tbl;", kw) @@ -666,6 +667,8 @@ func TestDMLStmt(t *testing.T) { {"LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE t1 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t1` FIELDS TERMINATED BY ','"}, {"LOAD DATA LOCAL INFILE '/tmp/t.csv' REPLACE INTO TABLE t1 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' REPLACE INTO TABLE `t1` FIELDS TERMINATED BY ','"}, + {"load data infile 's3://bucket-name/t.csv' into table t", true, "LOAD DATA INFILE 's3://bucket-name/t.csv' INTO TABLE `t`"}, + // select for update/share {"select * from t for update", true, "SELECT * FROM `t` FOR UPDATE"}, {"select * from t for share", true, "SELECT * FROM `t` FOR SHARE"}, @@ -1602,6 +1605,9 @@ func TestBuiltin(t *testing.T) { {"select cast('2000' as year);", true, "SELECT CAST(_UTF8MB4'2000' AS YEAR)"}, {"select cast(time '2000' as year);", true, "SELECT CAST(TIME '2000' AS YEAR)"}, + {"select cast(b as signed array);", true, "SELECT CAST(`b` AS SIGNED ARRAY)"}, + {"select cast(b as char(10) array);", true, "SELECT CAST(`b` AS CHAR(10) ARRAY)"}, + // for last_insert_id {"SELECT last_insert_id();", true, "SELECT LAST_INSERT_ID()"}, {"SELECT last_insert_id(1);", true, "SELECT LAST_INSERT_ID(1)"}, @@ -2144,6 +2150,13 @@ func TestBuiltin(t *testing.T) { {`SELECT a->3 FROM t`, false, ""}, {`SELECT a->>3 FROM t`, false, ""}, + {`SELECT 1 member of (a)`, true, "SELECT 1 MEMBER OF (`a`)"}, + {`SELECT 1 member of a`, false, ""}, + {`SELECT 1 member a`, false, ""}, + {`SELECT 1 not member of a`, false, ""}, + {`SELECT 1 member of (1+1)`, false, ""}, + {`SELECT concat('a') member of (cast(1 as char(1)))`, true, "SELECT CONCAT(_UTF8MB4'a') MEMBER OF (CAST(1 AS CHAR(1)))"}, + // Test that quoted identifier can be a function name. {"SELECT `uuid`()", true, "SELECT UUID()"}, @@ -2497,6 +2510,7 @@ func TestDDL(t *testing.T) { {`create table t (c int) follower_constraints="ww";`, false, ""}, {`create table t (c int) voter_constraints="ww";`, false, ""}, {`create table t (c int) learner_constraints="ww";`, false, ""}, + {`create table t (c int) survival_preference="ww";`, false, ""}, {`create table t (c int) /*T![placement] primary_region="us" */;`, false, ""}, {`create table t (c int) /*T![placement] regions="us,3" */;`, false, ""}, {`create table t (c int) /*T![placement] followers="us,3 */";`, false, ""}, @@ -2813,6 +2827,11 @@ func TestDDL(t *testing.T) { {"create table t (a int default (rand(1)))", true, "CREATE TABLE `t` (`a` INT DEFAULT RAND(1))"}, {"create table t (a int default (((rand()))))", true, "CREATE TABLE `t` (`a` INT DEFAULT RAND())"}, {"create table t (a int default (((rand(1)))))", true, "CREATE TABLE `t` (`a` INT DEFAULT RAND(1))"}, + {"create table t (d date default current_date())", true, "CREATE TABLE `t` (`d` DATE DEFAULT CURRENT_DATE())"}, + {"create table t (d date default current_date)", true, "CREATE TABLE `t` (`d` DATE DEFAULT CURRENT_DATE())"}, + {"create table t (d date default (current_date()))", true, "CREATE TABLE `t` (`d` DATE DEFAULT CURRENT_DATE())"}, + {"create table t (d date default (curdate()))", true, "CREATE TABLE `t` (`d` DATE DEFAULT CURRENT_DATE())"}, + {"create table t (d date default curdate())", true, "CREATE TABLE `t` (`d` DATE DEFAULT CURRENT_DATE())"}, // For table option `ENCRYPTION` {"create table t (a int) encryption = 'n';", true, "CREATE TABLE `t` (`a` INT) ENCRYPTION = 'n'"}, @@ -3234,6 +3253,7 @@ func TestDDL(t *testing.T) { {"create table t (a bigint, b bigint as (a+1) not null);", true, "CREATE TABLE `t` (`a` BIGINT,`b` BIGINT GENERATED ALWAYS AS(`a`+1) VIRTUAL NOT NULL)"}, {"create table t (a bigint, b bigint as (a+1) not null);", true, "CREATE TABLE `t` (`a` BIGINT,`b` BIGINT GENERATED ALWAYS AS(`a`+1) VIRTUAL NOT NULL)"}, {"create table t (a bigint, b bigint as (a+1) not null comment 'ttt');", true, "CREATE TABLE `t` (`a` BIGINT,`b` BIGINT GENERATED ALWAYS AS(`a`+1) VIRTUAL NOT NULL COMMENT 'ttt')"}, + {"create table t(a int, index idx((cast(a as binary(1)))));", true, "CREATE TABLE `t` (`a` INT,INDEX `idx`((CAST(`a` AS BINARY(1)))))"}, {"alter table t add column (f timestamp as (a+1) default '2019-01-01 11:11:11');", false, ""}, {"alter table t modify column f int as (a+1) default 55;", false, ""}, @@ -3625,6 +3645,36 @@ func TestDDL(t *testing.T) { {"alter placement policy if exists x regions = 'us', follower_constraints='yy'", true, "ALTER PLACEMENT POLICY IF EXISTS `x` REGIONS = 'us' FOLLOWER_CONSTRAINTS = 'yy'"}, {"alter placement policy x placement policy y", false, ""}, + // for create resource group + {"create resource group x cpu ='8c'", false, ""}, + {"create resource group x region ='us, 3'", false, ""}, + {"create resource group x cpu='8c', io_read_bandwidth='2GB/s', io_write_bandwidth='200MB/s'", false, ""}, + {"create resource group x ru_per_sec=2000", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 2000"}, + {"create resource group x ru_per_sec=200000", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 200000"}, + {"create resource group x followers=0", false, ""}, + {"create resource group x ru_per_sec=1000, burstable", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000 BURSTABLE"}, + {"create resource group x burstable, ru_per_sec=2000", true, "CREATE RESOURCE GROUP `x` BURSTABLE RU_PER_SEC = 2000"}, + {"create resource group x ru_per_sec=3000 burstable", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 3000 BURSTABLE"}, + {"create resource group x burstable ru_per_sec=4000", true, "CREATE RESOURCE GROUP `x` BURSTABLE RU_PER_SEC = 4000"}, + + {"alter resource group x cpu ='8c'", false, ""}, + {"alter resource group x region ='us, 3'", false, ""}, + {"alter resource group x cpu='8c', io_read_bandwidth='2GB/s', io_write_bandwidth='200MB/s'", false, ""}, + {"alter resource group x ru_per_sec=1000", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000"}, + {"alter resource group x ru_per_sec=2000, BURSTABLE", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 2000 BURSTABLE"}, + {"alter resource group x BURSTABLE, ru_per_sec=3000", true, "ALTER RESOURCE GROUP `x` BURSTABLE RU_PER_SEC = 3000"}, + {"alter resource group x BURSTABLE ru_per_sec=4000", true, "ALTER RESOURCE GROUP `x` BURSTABLE RU_PER_SEC = 4000"}, + {"alter resource group x ru_per_sec=200000 BURSTABLE", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 200000 BURSTABLE"}, + {"alter resource group x followers=0", false, ""}, + + {"drop resource group x;", true, "DROP RESOURCE GROUP `x`"}, + {"drop resource group if exists x;", true, "DROP RESOURCE GROUP IF EXISTS `x`"}, + {"drop resource group x,y", false, ""}, + {"drop resource group if exists x,y", false, ""}, + + {"CREATE ROLE `RESOURCE`", true, "CREATE ROLE `RESOURCE`@`%`"}, + {"CREATE ROLE RESOURCE", false, ""}, + // for table stats options // 1. create table with options {"CREATE TABLE t (a int) STATS_BUCKETS=1", true, "CREATE TABLE `t` (`a` INT) STATS_BUCKETS = 1"}, @@ -3856,6 +3906,44 @@ func TestOptimizerHints(t *testing.T) { require.Len(t, hints[1].Indexes, 1) require.Equal(t, "t4", hints[1].Indexes[0].L) + // 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 + stmt, _, err = p.Parse("select /*+ NO_ORDER_INDEX(T1,T2), no_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, "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) + // Test TIDB_SMJ stmt, _, err = p.Parse("select /*+ TIDB_SMJ(T1,t2), tidb_smj(T3,t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") require.NoError(t, err) @@ -4402,7 +4490,7 @@ func TestPrivilege(t *testing.T) { {`CREATE USER 'ttt' REQUIRE SAN 'DNS:mysql-user, URI:spiffe://example.org/myservice'`, true, "CREATE USER `ttt`@`%` REQUIRE SAN 'DNS:mysql-user, URI:spiffe://example.org/myservice'"}, {`CREATE USER 'ttt' WITH MAX_QUERIES_PER_HOUR 2;`, true, "CREATE USER `ttt`@`%` WITH MAX_QUERIES_PER_HOUR 2"}, {`CREATE USER 'ttt'@'localhost' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 1 MAX_UPDATES_PER_HOUR 10 PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;`, true, "CREATE USER `ttt`@`localhost` REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 1 MAX_UPDATES_PER_HOUR 10 PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK"}, - {`CREATE USER 'u1'@'%' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK ;`, true, "CREATE USER `u1`@`%` IDENTIFIED WITH 'mysql_native_password' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK"}, + {`CREATE USER 'u1'@'%' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK ;`, true, "CREATE USER `u1`@`%` IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK"}, {`CREATE USER 'test'`, true, "CREATE USER `test`@`%`"}, {`CREATE USER test`, true, "CREATE USER `test`@`%`"}, {"CREATE USER `test`", true, "CREATE USER `test`@`%`"}, @@ -4426,6 +4514,11 @@ func TestPrivilege(t *testing.T) { {"create user 'test@localhost' password expire never;", true, "CREATE USER `test@localhost`@`%` PASSWORD EXPIRE NEVER"}, {"create user 'test@localhost' password expire default;", true, "CREATE USER `test@localhost`@`%` PASSWORD EXPIRE DEFAULT"}, {"create user 'test@localhost' password expire interval 3 day;", true, "CREATE USER `test@localhost`@`%` PASSWORD EXPIRE INTERVAL 3 DAY"}, + {"create user 'test@localhost' identified by 'password' failed_login_attempts 3 password_lock_time 3;", true, "CREATE USER `test@localhost`@`%` IDENTIFIED BY 'password' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 3"}, + {"create user 'test@localhost' identified by 'password' failed_login_attempts 3 password_lock_time unbounded;", true, "CREATE USER `test@localhost`@`%` IDENTIFIED BY 'password' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME UNBOUNDED"}, + {"create user 'test@localhost' identified by 'password' failed_login_attempts 3;", true, "CREATE USER `test@localhost`@`%` IDENTIFIED BY 'password' FAILED_LOGIN_ATTEMPTS 3"}, + {"create user 'test@localhost' identified by 'password' password_lock_time 3;", true, "CREATE USER `test@localhost`@`%` IDENTIFIED BY 'password' PASSWORD_LOCK_TIME 3"}, + {"create user 'test@localhost' identified by 'password' password_lock_time unbounded;", true, "CREATE USER `test@localhost`@`%` IDENTIFIED BY 'password' PASSWORD_LOCK_TIME UNBOUNDED"}, {"CREATE USER 'sha_test'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY 'sha_test'", true, "CREATE USER `sha_test`@`localhost` IDENTIFIED WITH 'caching_sha2_password' BY 'sha_test'"}, {"CREATE USER 'sha_test3'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS 0x24412430303524255B03496C662C1055127B3B654A2F04207D01485276703644704B76303247474564416A516662346C5868646D32764C6B514F43585A473779565947514F34", true, "CREATE USER `sha_test3`@`localhost` IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$%[\x03Ilf,\x10U\x12{;eJ/\x04 }\x01HRvp6DpKv02GGEdAjQfb4lXhdm2vLkQOCXZG7yVYGQO4'"}, {"CREATE USER 'sha_test4'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$%[\x03Ilf,\x10U\x12{;eJ/\x04 }\x01HRvp6DpKv02GGEdAjQfb4lXhdm2vLkQOCXZG7yVYGQO4'", true, "CREATE USER `sha_test4`@`localhost` IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$%[\x03Ilf,\x10U\x12{;eJ/\x04 }\x01HRvp6DpKv02GGEdAjQfb4lXhdm2vLkQOCXZG7yVYGQO4'"}, @@ -4443,8 +4536,10 @@ func TestPrivilege(t *testing.T) { {`CREATE USER 'root'@'localhost' IDENTIFIED BY 'new-password'`, true, "CREATE USER `root`@`localhost` IDENTIFIED BY 'new-password'"}, {`CREATE USER 'root'@'localhost' IDENTIFIED BY PASSWORD 'hashstring'`, true, "CREATE USER `root`@`localhost` IDENTIFIED WITH 'mysql_native_password' AS 'hashstring'"}, {`CREATE USER 'root'@'localhost' IDENTIFIED BY 'new-password', 'root'@'127.0.0.1' IDENTIFIED BY PASSWORD 'hashstring'`, true, "CREATE USER `root`@`localhost` IDENTIFIED BY 'new-password', `root`@`127.0.0.1` IDENTIFIED WITH 'mysql_native_password' AS 'hashstring'"}, + {`CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'hashstring' RESOURCE GROUP rg1`, true, "CREATE USER `root`@`127.0.0.1` IDENTIFIED BY 'hashstring' RESOURCE GROUP `rg1`"}, {`ALTER USER IF EXISTS 'root'@'localhost' IDENTIFIED BY 'new-password'`, true, "ALTER USER IF EXISTS `root`@`localhost` IDENTIFIED BY 'new-password'"}, {`ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-password'`, true, "ALTER USER `root`@`localhost` IDENTIFIED BY 'new-password'"}, + {`ALTER USER 'root'@'localhost' RESOURCE GROUP rg2`, true, "ALTER USER `root`@`localhost` RESOURCE GROUP `rg2`"}, {`ALTER USER 'root'@'localhost' IDENTIFIED BY PASSWORD 'hashstring'`, true, "ALTER USER `root`@`localhost` IDENTIFIED WITH 'mysql_native_password' AS 'hashstring'"}, {`ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-password', 'root'@'127.0.0.1' IDENTIFIED BY PASSWORD 'hashstring'`, true, "ALTER USER `root`@`localhost` IDENTIFIED BY 'new-password', `root`@`127.0.0.1` IDENTIFIED WITH 'mysql_native_password' AS 'hashstring'"}, {`ALTER USER USER() IDENTIFIED BY 'new-password'`, true, "ALTER USER USER() IDENTIFIED BY 'new-password'"}, @@ -4991,6 +5086,9 @@ func TestExplain(t *testing.T) { {"EXPLAIN ANALYZE FORMAT = 'binary' SELECT 1", true, "EXPLAIN ANALYZE FORMAT = 'binary' SELECT 1"}, {"EXPLAIN ALTER TABLE t1 ADD INDEX (a)", true, "EXPLAIN FORMAT = 'row' ALTER TABLE `t1` ADD INDEX(`a`)"}, {"EXPLAIN ALTER TABLE t1 ADD a varchar(255)", true, "EXPLAIN FORMAT = 'row' ALTER TABLE `t1` ADD COLUMN `a` VARCHAR(255)"}, + {"EXPLAIN FORMAT = TIDB_JSON FOR CONNECTION 1", true, "EXPLAIN FORMAT = 'TIDB_JSON' FOR CONNECTION 1"}, + {"EXPLAIN FORMAT = tidb_json SELECT 1", true, "EXPLAIN FORMAT = 'tidb_json' SELECT 1"}, + {"EXPLAIN ANALYZE FORMAT = tidb_json SELECT 1", true, "EXPLAIN ANALYZE FORMAT = 'tidb_json' SELECT 1"}, } RunTest(t, table, false) } @@ -5106,6 +5204,12 @@ func TestBinding(t *testing.T) { {"drop session binding for replace into t1 select * from t2 where t1.a=1", true, "DROP SESSION BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t1`.`a`=1"}, {"DROP GLOBAL BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1", true, "DROP GLOBAL BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1"}, {"DROP SESSION BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1", true, "DROP SESSION BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1"}, + {"DROP SESSION BINDING FOR SQL DIGEST 'a'", true, "DROP SESSION BINDING FOR SQL DIGEST 'a'"}, + {"drop global binding for sql digest 's'", true, "DROP GLOBAL BINDING FOR SQL DIGEST 's'"}, + {"create session binding from history using plan digest 'sss'", true, "CREATE SESSION BINDING FROM HISTORY USING PLAN DIGEST 'sss'"}, + {"CREATE GLOBAL BINDING FROM HISTORY USING PLAN DIGEST 'sss'", true, "CREATE GLOBAL BINDING FROM HISTORY USING PLAN DIGEST 'sss'"}, + {"set binding enabled for sql digest '1'", true, "SET BINDING ENABLED FOR SQL DIGEST '1'"}, + {"set binding disabled for sql digest '1'", true, "SET BINDING DISABLED FOR SQL DIGEST '1'"}, } RunTest(t, table, false) @@ -6811,6 +6915,8 @@ func TestPlanReplayer(t *testing.T) { {"PLAN REPLAYER LOAD '/tmp/sdfaalskdjf.zip'", true, "PLAN REPLAYER LOAD '/tmp/sdfaalskdjf.zip'"}, {"PLAN REPLAYER DUMP EXPLAIN 'sql.txt'", true, "PLAN REPLAYER DUMP EXPLAIN 'sql.txt'"}, {"PLAN REPLAYER DUMP EXPLAIN ANALYZE 'sql.txt'", true, "PLAN REPLAYER DUMP EXPLAIN ANALYZE 'sql.txt'"}, + {"PLAN REPLAYER CAPTURE '123' '123'", true, "PLAN REPLAYER CAPTURE '123' '123'"}, + {"PLAN REPLAYER CAPTURE REMOVE '123' '123'", true, "PLAN REPLAYER CAPTURE REMOVE '123' '123'"}, } RunTest(t, table, false) @@ -7006,3 +7112,59 @@ func TestIntervalPartition(t *testing.T) { RunTest(t, table, false) } + +func TestTTLTableOption(t *testing.T) { + table := []testCase{ + // create table with various temporal interval + {"create table t (created_at datetime) TTL = created_at + INTERVAL 3.1415 YEAR", true, "CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 3.1415 YEAR"}, + {"create table t (created_at datetime) TTL = created_at + INTERVAL '1 1:1:1' DAY_SECOND", true, "CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL _UTF8MB4'1 1:1:1' DAY_SECOND"}, + {"create table t (created_at datetime) TTL = created_at + INTERVAL 1 YEAR", true, "CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 1 YEAR"}, + {"create table t (created_at datetime) TTL = created_at + INTERVAL 1 YEAR TTL_ENABLE = 'OFF'", true, "CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'OFF'"}, + {"create table t (created_at datetime) TTL created_at + INTERVAL 1 YEAR TTL_ENABLE 'OFF'", true, "CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'OFF'"}, + {"create table t (created_at datetime) TTL created_at + INTERVAL 1 YEAR TTL_ENABLE 'OFF' TTL_JOB_INTERVAL='8h'", true, "CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'OFF' TTL_JOB_INTERVAL = '8h'"}, + {"create table t (created_at datetime) /*T![ttl] ttl=created_at + INTERVAL 1 YEAR ttl_enable='ON'*/", true, "CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'ON'"}, + + // alter table with various temporal interval + {"alter table t TTL = created_at + INTERVAL 1 MONTH", true, "ALTER TABLE `t` TTL = `created_at` + INTERVAL 1 MONTH"}, + {"alter table t TTL_ENABLE = 'ON'", true, "ALTER TABLE `t` TTL_ENABLE = 'ON'"}, + {"alter table t TTL_ENABLE = 'OFF'", true, "ALTER TABLE `t` TTL_ENABLE = 'OFF'"}, + {"alter table t TTL = created_at + INTERVAL 1 MONTH TTL_ENABLE 'OFF'", true, "ALTER TABLE `t` TTL = `created_at` + INTERVAL 1 MONTH TTL_ENABLE = 'OFF'"}, + {"alter table t TTL = created_at + INTERVAL 1 MONTH TTL_ENABLE 'OFF' TTL_JOB_INTERVAL '1h'", true, "ALTER TABLE `t` TTL = `created_at` + INTERVAL 1 MONTH TTL_ENABLE = 'OFF' TTL_JOB_INTERVAL = '1h'"}, + {"alter table t /*T![ttl] ttl=created_at + INTERVAL 1 YEAR ttl_enable='ON'*/", true, "ALTER TABLE `t` TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'ON'"}, + {"alter table t /*T![ttl] ttl=created_at + INTERVAL 1 YEAR ttl_enable='ON' TTL_JOB_INTERVAL='8h'*/", true, "ALTER TABLE `t` TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'ON' TTL_JOB_INTERVAL = '8h'"}, + {"alter table t /*T![ttl] ttl=created_at + INTERVAL 1 YEAR ttl_enable='ON' TTL_JOB_INTERVAL='8.645124531235h'*/", true, "ALTER TABLE `t` TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'ON' TTL_JOB_INTERVAL = '8.645124531235h'"}, + + // alter table to remove ttl settings + {"alter table t remove ttl", true, "ALTER TABLE `t` REMOVE TTL"}, + + // validate invalid TTL_ENABLE settings + {"create table t (created_at datetime) TTL_ENABLE = 'test_case'", false, ""}, + {"create table t (created_at datetime) /*T![ttl] TTL_ENABLE = 'test_case' */", false, ""}, + {"alter table t /*T![ttl] TTL_ENABLE = 'test_case' */", false, ""}, + + // validate invalid TTL_JOB_INTERVAL settings + {"create table t (created_at datetime) TTL_JOB_INTERVAL = '@monthly'", false, ""}, + {"create table t (created_at datetime) TTL_JOB_INTERVAL = '10hourxx'", false, ""}, + {"create table t (created_at datetime) TTL_JOB_INTERVAL = '10.10.255h'", false, ""}, + } + + RunTest(t, table, false) +} + +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.Equal(t, len(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()) +} diff --git a/parser/reserved_words_test.go b/parser/reserved_words_test.go index f58359a7d20a3..6896167741284 100644 --- a/parser/reserved_words_test.go +++ b/parser/reserved_words_test.go @@ -28,7 +28,7 @@ import ( // needed to connect to MySQL dbsql "database/sql" - "io/ioutil" + gio "io" "os" "testing" @@ -41,7 +41,7 @@ func TestCompareReservedWordsWithMySQL(t *testing.T) { parserFilename := "parser.y" parserFile, err := os.Open(parserFilename) requires.NoError(t, err) - data, err := ioutil.ReadAll(parserFile) + data, err := gio.ReadAll(parserFile) requires.NoError(t, err) content := string(data) diff --git a/parser/tidb/features.go b/parser/tidb/features.go index 296a3d6b37d9b..1bdb511d20f35 100644 --- a/parser/tidb/features.go +++ b/parser/tidb/features.go @@ -28,6 +28,10 @@ const ( FeatureIDForceAutoInc = "force_inc" // FeatureIDPlacement is the `placement rule` feature. FeatureIDPlacement = "placement" + // FeatureIDTTL is the `ttl` feature + FeatureIDTTL = "ttl" + // FeatureIDResourceGroup is the `resource group` feature. + FeatureIDResourceGroup = "resource_group" ) var featureIDs = map[string]struct{}{ @@ -37,6 +41,7 @@ var featureIDs = map[string]struct{}{ FeatureIDClusteredIndex: {}, FeatureIDForceAutoInc: {}, FeatureIDPlacement: {}, + FeatureIDTTL: {}, } // CanParseFeature is used to check if a feature can be parsed. diff --git a/parser/types/field_type.go b/parser/types/field_type.go index efc1c20d0c18f..464ba38a6cb7c 100644 --- a/parser/types/field_type.go +++ b/parser/types/field_type.go @@ -56,6 +56,7 @@ type FieldType struct { // elems is the element list for enum and set type. elems []string elemsIsBinaryLit []bool + array bool // Please keep in mind that jsonFieldType should be updated if you add a new field here. } @@ -71,14 +72,27 @@ func NewFieldType(tp byte) *FieldType { // IsDecimalValid checks whether the decimal is valid. func (ft *FieldType) IsDecimalValid() bool { - if ft.tp == mysql.TypeNewDecimal && (ft.decimal < 0 || ft.decimal > mysql.MaxDecimalScale || ft.flen <= 0 || ft.flen > mysql.MaxDecimalWidth || ft.flen < ft.decimal) { + 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: + 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 } @@ -115,6 +129,7 @@ func (ft *FieldType) GetElems() []string { // SetType sets the type of the FieldType. func (ft *FieldType) SetType(tp byte) { ft.tp = tp + ft.array = false } // SetFlag sets the flag of the FieldType. @@ -149,7 +164,7 @@ func (ft *FieldType) SetFlen(flen int) { // SetFlenUnderLimit sets the length of the field to the value of the argument func (ft *FieldType) SetFlenUnderLimit(flen int) { - if ft.tp == mysql.TypeNewDecimal { + if ft.GetType() == mysql.TypeNewDecimal { ft.flen = mathutil.Min(flen, mysql.MaxDecimalWidth) } else { ft.flen = flen @@ -163,7 +178,7 @@ func (ft *FieldType) SetDecimal(decimal int) { // SetDecimalUnderLimit sets the decimal of the field to the value of the argument func (ft *FieldType) SetDecimalUnderLimit(decimal int) { - if ft.tp == mysql.TypeNewDecimal { + if ft.GetType() == mysql.TypeNewDecimal { ft.decimal = mathutil.Min(decimal, mysql.MaxDecimalScale) } else { ft.decimal = decimal @@ -172,7 +187,7 @@ func (ft *FieldType) SetDecimalUnderLimit(decimal int) { // UpdateFlenAndDecimalUnderLimit updates the length and decimal to the value of the argument func (ft *FieldType) UpdateFlenAndDecimalUnderLimit(old *FieldType, deltaDecimal int, deltaFlen int) { - if ft.tp != mysql.TypeNewDecimal { + if ft.GetType() != mysql.TypeNewDecimal { return } if old.decimal < 0 { @@ -208,6 +223,26 @@ 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 +} + // SetElemWithIsBinaryLit sets the element of the FieldType. func (ft *FieldType) SetElemWithIsBinaryLit(idx int, element string, isBinaryLit bool) { ft.elems[idx] = element @@ -253,7 +288,7 @@ func (ft *FieldType) Equal(other *FieldType) bool { // 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.tp == other.tp) || (ft.tp == mysql.TypeVarchar && other.tp == mysql.TypeVarString) || (ft.tp == mysql.TypeVarString && other.tp == mysql.TypeVarchar) + 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) ignoreDecimal := ft.EvalType() == ETInt || ft.EvalType() == ETString partialEqual := tpEqual && @@ -295,7 +330,7 @@ func (ft *FieldType) PartialEqual(other *FieldType, unsafe bool) bool { // EvalType gets the type in evaluation. func (ft *FieldType) EvalType() EvalType { - switch ft.tp { + switch ft.GetType() { case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong, mysql.TypeBit, mysql.TypeYear: return ETInt @@ -321,7 +356,7 @@ func (ft *FieldType) EvalType() EvalType { // 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.tp == mysql.TypeEnum || ft.tp == mysql.TypeBit || ft.tp == mysql.TypeSet + return ft.GetType() == mysql.TypeEnum || ft.GetType() == mysql.TypeBit || ft.GetType() == mysql.TypeSet } // Init initializes the FieldType data. @@ -334,10 +369,10 @@ func (ft *FieldType) Init(tp byte) { // CompactStr only considers tp/CharsetBin/flen/Deimal. // This is used for showing column type in infoschema. func (ft *FieldType) CompactStr() string { - ts := TypeToStr(ft.tp, ft.charset) + ts := TypeToStr(ft.GetType(), ft.charset) suffix := "" - defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimal(ft.tp) + 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. @@ -349,7 +384,7 @@ func (ft *FieldType) CompactStr() string { displayDecimal = defaultDecimal } - switch ft.tp { + switch ft.GetType() { case mysql.TypeEnum, mysql.TypeSet: // Format is ENUM ('e1', 'e2') or SET ('e1', 'e2') es := make([]string, 0, len(ft.elems)) @@ -393,8 +428,8 @@ func (ft *FieldType) CompactStr() string { func (ft *FieldType) InfoSchemaStr() string { suffix := "" if mysql.HasUnsignedFlag(ft.flag) && - ft.tp != mysql.TypeBit && - ft.tp != mysql.TypeYear { + ft.GetType() != mysql.TypeBit && + ft.GetType() != mysql.TypeYear { suffix = " unsigned" } return ft.CompactStr() + suffix @@ -410,11 +445,11 @@ func (ft *FieldType) String() string { if mysql.HasZerofillFlag(ft.flag) { strs = append(strs, "ZEROFILL") } - if mysql.HasBinaryFlag(ft.flag) && ft.tp != mysql.TypeString { + if mysql.HasBinaryFlag(ft.flag) && ft.GetType() != mysql.TypeString { strs = append(strs, "BINARY") } - if IsTypeChar(ft.tp) || IsTypeBlob(ft.tp) { + if IsTypeChar(ft.GetType()) || IsTypeBlob(ft.GetType()) { if ft.charset != "" && ft.charset != charset.CharsetBin { strs = append(strs, fmt.Sprintf("CHARACTER SET %s", ft.charset)) } @@ -428,12 +463,12 @@ func (ft *FieldType) String() string { // Restore implements Node interface. func (ft *FieldType) Restore(ctx *format.RestoreCtx) error { - ctx.WriteKeyWord(TypeToStr(ft.tp, ft.charset)) + ctx.WriteKeyWord(TypeToStr(ft.GetType(), ft.charset)) precision := UnspecifiedLength scale := UnspecifiedLength - switch ft.tp { + switch ft.GetType() { case mysql.TypeEnum, mysql.TypeSet: ctx.WritePlain("(") for i, e := range ft.elems { @@ -470,7 +505,7 @@ func (ft *FieldType) Restore(ctx *format.RestoreCtx) error { ctx.WriteKeyWord(" BINARY") } - if IsTypeChar(ft.tp) || IsTypeBlob(ft.tp) { + if IsTypeChar(ft.GetType()) || IsTypeBlob(ft.GetType()) { if ft.charset != "" && ft.charset != charset.CharsetBin { ctx.WriteKeyWord(" CHARACTER SET " + ft.charset) } @@ -486,7 +521,7 @@ func (ft *FieldType) Restore(ctx *format.RestoreCtx) error { // RestoreAsCastType is used for write AST back to string. func (ft *FieldType) RestoreAsCastType(ctx *format.RestoreCtx, explicitCharset bool) { switch ft.tp { - case mysql.TypeVarString: + case mysql.TypeVarString, mysql.TypeString: skipWriteBinary := false if ft.charset == charset.CharsetBin && ft.collate == charset.CollationBin { ctx.WriteKeyWord("BINARY") @@ -498,7 +533,7 @@ func (ft *FieldType) RestoreAsCastType(ctx *format.RestoreCtx, explicitCharset b ctx.WritePlainf("(%d)", ft.flen) } if !explicitCharset { - return + break } if !skipWriteBinary && ft.flag&mysql.BinaryFlag != 0 { ctx.WriteKeyWord(" BINARY") @@ -541,6 +576,10 @@ func (ft *FieldType) RestoreAsCastType(ctx *format.RestoreCtx, explicitCharset b case mysql.TypeYear: ctx.WriteKeyWord("YEAR") } + if ft.array { + ctx.WritePlain(" ") + ctx.WriteKeyWord("ARRAY") + } } // FormatAsCastType is used for write AST back to string. @@ -556,7 +595,7 @@ const VarStorageLen = -1 // StorageLength is the length of stored value for the type. func (ft *FieldType) StorageLength() int { - switch ft.tp { + 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, @@ -574,7 +613,7 @@ func (ft *FieldType) StorageLength() int { // 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.tp { + switch ft.GetType() { case mysql.TypeVarchar, mysql.TypeString, mysql.TypeVarString, mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob: return !mysql.HasBinaryFlag(ft.flag) @@ -594,6 +633,7 @@ type jsonFieldType struct { Collate string Elems []string ElemsIsBinaryLit []bool + Array bool } // UnmarshalJSON implements the json.Unmarshaler interface. @@ -609,6 +649,7 @@ func (ft *FieldType) UnmarshalJSON(data []byte) error { ft.collate = r.Collate ft.elems = r.Elems ft.elemsIsBinaryLit = r.ElemsIsBinaryLit + ft.array = r.Array } return err } @@ -624,6 +665,7 @@ func (ft *FieldType) MarshalJSON() ([]byte, error) { r.Collate = ft.collate r.Elems = ft.elems r.ElemsIsBinaryLit = ft.elemsIsBinaryLit + r.Array = ft.array return json.Marshal(r) } diff --git a/planner/cascades/testdata/integration_suite_in.json b/planner/cascades/testdata/integration_suite_in.json index 569cb12860ac3..c5ac4131897cd 100644 --- a/planner/cascades/testdata/integration_suite_in.json +++ b/planner/cascades/testdata/integration_suite_in.json @@ -124,7 +124,7 @@ { "name": "TestMemTableScan", "cases": [ - "select USER, HOST, DB, COMMAND, TIME, STATE, INFO, DIGEST from information_schema.processlist" + "select USER, HOST, DB, COMMAND, TIME, STATE, INFO, `DIGEST` from information_schema.processlist" ] }, { @@ -142,7 +142,7 @@ { "name": "TestCascadePlannerHashedPartTable", "cases": [ - "select * from pt1" + "select * from pt1 order by a" ] }, { diff --git a/planner/cascades/testdata/integration_suite_out.json b/planner/cascades/testdata/integration_suite_out.json index e8d98a41ec557..25d3a20d484af 100644 --- a/planner/cascades/testdata/integration_suite_out.json +++ b/planner/cascades/testdata/integration_suite_out.json @@ -1093,12 +1093,12 @@ "Name": "TestMemTableScan", "Cases": [ { - "SQL": "select USER, HOST, DB, COMMAND, TIME, STATE, INFO, DIGEST from information_schema.processlist", + "SQL": "select USER, HOST, DB, COMMAND, TIME, STATE, INFO, `DIGEST` from information_schema.processlist", "Plan": [ "Projection_3 10000.00 root Column#2, Column#3, Column#4, Column#5, Column#6, Column#7, Column#8, Column#9", "└─MemTableScan_4 10000.00 root table:PROCESSLIST " ], - "Result": [" test Sleep 0 autocommit select USER, HOST, DB, COMMAND, TIME, STATE, INFO, DIGEST from information_schema.processlist 7284ef6cf62f14bccb9fa24aff861b419e9cf59b2c098d3069c7c10bc35d0c14"] + "Result": [" test Sleep 0 autocommit select USER, HOST, DB, COMMAND, TIME, STATE, INFO, `DIGEST` from information_schema.processlist 7284ef6cf62f14bccb9fa24aff861b419e9cf59b2c098d3069c7c10bc35d0c14"] } ] }, @@ -1198,17 +1198,18 @@ "Name": "TestCascadePlannerHashedPartTable", "Cases": [ { - "SQL": "select * from pt1", + "SQL": "select * from pt1 order by a", "Plan": [ - "TableReader_5 10000.00 root partition:all data:TableFullScan_6", - "└─TableFullScan_6 10000.00 cop[tikv] table:pt1 keep order:false, stats:pseudo" + "Sort_11 10000.00 root test.pt1.a", + "└─TableReader_9 10000.00 root partition:all data:TableFullScan_10", + " └─TableFullScan_10 10000.00 cop[tikv] table:pt1 keep order:false, stats:pseudo" ], "Result": [ - "4 40", "1 10", - "5 50", "2 20", - "3 30" + "3 30", + "4 40", + "5 50" ] } ] diff --git a/planner/core/BUILD.bazel b/planner/core/BUILD.bazel index 9db73e6d5fcb8..c0691506207e0 100644 --- a/planner/core/BUILD.bazel +++ b/planner/core/BUILD.bazel @@ -18,6 +18,7 @@ go_library( "handle_cols.go", "hashcode.go", "hints.go", + "indexmerge_path.go", "initialize.go", "logical_plan_builder.go", "logical_plans.go", @@ -49,6 +50,7 @@ go_library( "rule_build_key_info.go", "rule_column_pruning.go", "rule_decorrelate.go", + "rule_derive_topn_from_window.go", "rule_eliminate_projection.go", "rule_generate_column_substitute.go", "rule_inject_extra_projection.go", @@ -137,12 +139,14 @@ go_library( "//util/set", "//util/size", "//util/sqlexec", + "//util/stmtsummary", "//util/stringutil", "//util/texttree", "//util/tracing", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/coprocessor", + "@com_github_pingcap_kvproto//pkg/diagnosticspb", "@com_github_pingcap_tipb//go-tipb", "@com_github_tikv_client_go_v2//kv", "@com_github_tikv_client_go_v2//tikv", @@ -154,7 +158,7 @@ go_library( go_test( name = "core_test", - timeout = "short", + timeout = "moderate", srcs = [ "binary_plan_test.go", "cbo_test.go", @@ -167,6 +171,8 @@ go_test( "find_best_task_test.go", "flat_plan_test.go", "fragment_test.go", + "indexmerge_intersection_test.go", + "indexmerge_path_test.go", "indexmerge_test.go", "integration_partition_test.go", "integration_test.go", @@ -194,8 +200,10 @@ go_test( "plan_to_pb_test.go", "planbuilder_test.go", "point_get_plan_test.go", + "predicate_simplification_test.go", "prepare_test.go", "preprocess_test.go", + "rule_derive_topn_from_window_test.go", "rule_inject_extra_projection_test.go", "rule_join_reorder_dp_test.go", "rule_join_reorder_test.go", diff --git a/planner/core/binary_plan_test.go b/planner/core/binary_plan_test.go index 78022acb63166..95c67990b09be 100644 --- a/planner/core/binary_plan_test.go +++ b/planner/core/binary_plan_test.go @@ -17,7 +17,7 @@ package core_test import ( "encoding/base64" "fmt" - "io/ioutil" + "io" "os" "regexp" "strings" @@ -77,13 +77,6 @@ func simplifyAndCheckBinaryOperator(t *testing.T, pb *tipb.ExplainOperator, with } func TestBinaryPlanInExplainAndSlowLog(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set tidb_cost_model_version=2") - // If we don't set this, it will be false sometimes and the cost in the result will be different. - tk.MustExec("set @@tidb_enable_chunk_rpc=true") - // Prepare the slow log originCfg := config.GetGlobalConfig() newCfg := *originCfg @@ -97,6 +90,12 @@ func TestBinaryPlanInExplainAndSlowLog(t *testing.T) { require.NoError(t, os.Remove(newCfg.Log.SlowQueryFile)) }() require.NoError(t, logutil.InitLogger(newCfg.Log.ToLogConfig())) + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("set tidb_cost_model_version=2") + // If we don't set this, it will be false sometimes and the cost in the result will be different. + tk.MustExec("set @@tidb_enable_chunk_rpc=true") tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) tk.MustExec("set tidb_slow_log_threshold=0;") defer func() { @@ -149,10 +148,6 @@ func TestBinaryPlanInExplainAndSlowLog(t *testing.T) { } func TestBinaryPlanSwitch(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) - originCfg := config.GetGlobalConfig() newCfg := *originCfg f, err := os.CreateTemp("", "tidb-slow-*.log") @@ -165,6 +160,9 @@ func TestBinaryPlanSwitch(t *testing.T) { require.NoError(t, os.Remove(newCfg.Log.SlowQueryFile)) }() require.NoError(t, logutil.InitLogger(newCfg.Log.ToLogConfig())) + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) tk.MustExec("use test") @@ -219,10 +217,6 @@ func TestBinaryPlanSwitch(t *testing.T) { // TestTooLongBinaryPlan asserts that if the binary plan is larger than 1024*1024 bytes, it should be output to slow query but not to stmt summary. func TestTooLongBinaryPlan(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) - originCfg := config.GetGlobalConfig() newCfg := *originCfg f, err := os.CreateTemp("", "tidb-slow-*.log") @@ -235,6 +229,9 @@ func TestTooLongBinaryPlan(t *testing.T) { require.NoError(t, os.Remove(newCfg.Log.SlowQueryFile)) }() require.NoError(t, logutil.InitLogger(newCfg.Log.ToLogConfig())) + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) tk.MustExec("use test") @@ -281,10 +278,6 @@ func TestTooLongBinaryPlan(t *testing.T) { // TestLongBinaryPlan asserts that if the binary plan is smaller than 1024*1024 bytes, it should be output to both slow query and stmt summary. // The size of the binary plan in this test case is designed to be larger than 1024*1024*0.85 bytes but smaller than 1024*1024 bytes. func TestLongBinaryPlan(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) - originCfg := config.GetGlobalConfig() newCfg := *originCfg f, err := os.CreateTemp("", "tidb-slow-*.log") @@ -297,6 +290,10 @@ func TestLongBinaryPlan(t *testing.T) { require.NoError(t, os.Remove(newCfg.Log.SlowQueryFile)) }() require.NoError(t, logutil.InitLogger(newCfg.Log.ToLogConfig())) + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) + tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) tk.MustExec("use test") @@ -336,10 +333,6 @@ func TestLongBinaryPlan(t *testing.T) { } func TestBinaryPlanOfPreparedStmt(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) - originCfg := config.GetGlobalConfig() newCfg := *originCfg f, err := os.CreateTemp("", "tidb-slow-*.log") @@ -352,6 +345,9 @@ func TestBinaryPlanOfPreparedStmt(t *testing.T) { require.NoError(t, os.Remove(newCfg.Log.SlowQueryFile)) }() require.NoError(t, logutil.InitLogger(newCfg.Log.ToLogConfig())) + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) tk.MustExec("use test") @@ -389,10 +385,6 @@ func TestBinaryPlanOfPreparedStmt(t *testing.T) { // TestDecodeBinaryPlan asserts that the result of EXPLAIN ANALYZE FORMAT = 'verbose' is the same as tidb_decode_binary_plan(). func TestDecodeBinaryPlan(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - // Prepare the slow log originCfg := config.GetGlobalConfig() newCfg := *originCfg @@ -406,6 +398,9 @@ func TestDecodeBinaryPlan(t *testing.T) { require.NoError(t, os.Remove(newCfg.Log.SlowQueryFile)) }() require.NoError(t, logutil.InitLogger(newCfg.Log.ToLogConfig())) + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) tk.MustExec("set tidb_slow_log_threshold=0;") defer func() { @@ -499,10 +494,6 @@ func TestInvalidDecodeBinaryPlan(t *testing.T) { } func TestUnnecessaryBinaryPlanInSlowLog(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) - originCfg := config.GetGlobalConfig() newCfg := *originCfg f, err := os.CreateTemp("", "tidb-slow-*.log") @@ -515,13 +506,16 @@ func TestUnnecessaryBinaryPlanInSlowLog(t *testing.T) { require.NoError(t, os.Remove(newCfg.Log.SlowQueryFile)) }() require.NoError(t, logutil.InitLogger(newCfg.Log.ToLogConfig())) + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) tk.MustExec("use test") tk.MustExec("drop table if exists th") tk.MustExec("set global tidb_slow_log_threshold = 1;") tk.MustExec("create table th (i int, a int,b int, c int, index (a)) partition by hash (a) partitions 100;") - slowLogBytes, err := ioutil.ReadAll(f) + slowLogBytes, err := io.ReadAll(f) require.NoError(t, err) require.NotContains(t, string(slowLogBytes), `tidb_decode_binary_plan('')`) } diff --git a/planner/core/cbo_test.go b/planner/core/cbo_test.go index af4aa836d335a..8448a66cd0bf0 100644 --- a/planner/core/cbo_test.go +++ b/planner/core/cbo_test.go @@ -57,6 +57,34 @@ func loadTableStats(fileName string, dom *domain.Domain) error { return nil } +func TestExplainCostTrace(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t (a int)") + tk.MustExec("insert into t values (1)") + + tk.MustExec("set tidb_cost_model_version=2") + tk.MustQuery("explain format='cost_trace' select * from t").Check(testkit.Rows( + `TableReader_5 10000.00 177906.67 ((scan(10000*logrowsize(32)*tikv_scan_factor(40.7))) + (net(10000*rowsize(16)*tidb_kv_net_factor(3.96))))/15.00 root data:TableFullScan_4`, + `└─TableFullScan_4 10000.00 2035000.00 scan(10000*logrowsize(32)*tikv_scan_factor(40.7)) cop[tikv] table:t keep order:false, stats:pseudo`)) + tk.MustQuery("explain analyze format='cost_trace' select * from t").CheckAt([]int{0, 1, 2, 3, 4}, [][]interface{}{ + {"TableReader_5", "10000.00", "177906.67", "((scan(10000*logrowsize(32)*tikv_scan_factor(40.7))) + (net(10000*rowsize(16)*tidb_kv_net_factor(3.96))))/15.00", "1"}, + {"└─TableFullScan_4", "10000.00", "2035000.00", "scan(10000*logrowsize(32)*tikv_scan_factor(40.7))", "1"}, + }) + + tk.MustExec("set tidb_cost_model_version=1") + tk.MustQuery("explain format='cost_trace' select * from t").Check(testkit.Rows( + // cost trace on model ver1 is not supported + `TableReader_5 10000.00 34418.00 N/A root data:TableFullScan_4`, + `└─TableFullScan_4 10000.00 435000.00 N/A cop[tikv] table:t keep order:false, stats:pseudo`, + )) + tk.MustQuery("explain analyze format='cost_trace' select * from t").CheckAt([]int{0, 1, 2, 3, 4}, [][]interface{}{ + {"TableReader_5", "10000.00", "34418.00", "N/A", "1"}, + {"└─TableFullScan_4", "10000.00", "435000.00", "N/A", "1"}, + }) +} + func TestExplainAnalyze(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) diff --git a/planner/core/collect_column_stats_usage.go b/planner/core/collect_column_stats_usage.go index 49fffb149b85d..5cb184136d875 100644 --- a/planner/core/collect_column_stats_usage.go +++ b/planner/core/collect_column_stats_usage.go @@ -17,7 +17,6 @@ package core import ( "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/parser/model" - "github.com/pingcap/tidb/sessionctx/variable" ) const ( @@ -51,7 +50,7 @@ type columnStatsUsageCollector struct { visitedtbls map[int64]struct{} } -func newColumnStatsUsageCollector(collectMode uint64) *columnStatsUsageCollector { +func newColumnStatsUsageCollector(collectMode uint64, enabledPlanCapture bool) *columnStatsUsageCollector { collector := &columnStatsUsageCollector{ collectMode: collectMode, // Pre-allocate a slice to reduce allocation, 8 doesn't have special meaning. @@ -64,7 +63,7 @@ func newColumnStatsUsageCollector(collectMode uint64) *columnStatsUsageCollector if collectMode&collectHistNeededColumns != 0 { collector.histNeededCols = make(map[model.TableItemID]struct{}) } - if variable.EnablePlanReplayerCapture.Load() { + if enabledPlanCapture { collector.collectVisitedTable = true collector.visitedtbls = map[int64]struct{}{} } @@ -300,7 +299,7 @@ func CollectColumnStatsUsage(lp LogicalPlan, predicate, histNeeded bool) ([]mode if histNeeded { mode |= collectHistNeededColumns } - collector := newColumnStatsUsageCollector(mode) + collector := newColumnStatsUsageCollector(mode, lp.SCtx().GetSessionVars().IsPlanReplayerCaptureEnabled()) collector.collectFromPlan(lp) if collector.collectVisitedTable { recordTableRuntimeStats(lp.SCtx(), collector.visitedtbls) diff --git a/planner/core/collect_column_stats_usage_test.go b/planner/core/collect_column_stats_usage_test.go index c6f8cd6933f59..249f210050c56 100644 --- a/planner/core/collect_column_stats_usage_test.go +++ b/planner/core/collect_column_stats_usage_test.go @@ -331,6 +331,11 @@ func TestCollectHistNeededColumns(t *testing.T) { if len(tt.pruneMode) > 0 { s.ctx.GetSessionVars().PartitionPruneMode.Store(tt.pruneMode) } + if s.ctx.GetSessionVars().IsDynamicPartitionPruneEnabled() { + s.ctx.GetSessionVars().StmtCtx.UseDynamicPruneMode = true + } else { + s.ctx.GetSessionVars().StmtCtx.UseDynamicPruneMode = false + } stmt, err := s.p.ParseOneStmt(tt.sql, "", "") require.NoError(t, err, comment) err = Preprocess(context.Background(), s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) diff --git a/planner/core/common_plans.go b/planner/core/common_plans.go index 688e9e6531e18..3ff3bb19eece1 100644 --- a/planner/core/common_plans.go +++ b/planner/core/common_plans.go @@ -250,6 +250,10 @@ const ( OpReloadBindings // OpSetBindingStatus is used to set binding status. OpSetBindingStatus + // OpSQLBindDropByDigest is used to drop SQL binds by digest + OpSQLBindDropByDigest + // OpSetBindingStatusByDigest represents the operation to set SQL binding status by sql digest. + OpSetBindingStatusByDigest ) // SQLBindPlan represents a plan for SQL bind. @@ -265,6 +269,9 @@ type SQLBindPlan struct { Charset string Collation string NewStatus string + Source string // Source indicate how this binding was created, eg: bindinfo.Manual or bindinfo.History + SQLDigest string + PlanDigest string } // Simple represents a simple statement plan which doesn't need any optimization. @@ -544,7 +551,7 @@ type Analyze struct { type LoadData struct { baseSchemaProducer - IsLocal bool + FileLocRef ast.FileLocRefTp OnDuplicate ast.OnDuplicateKeyHandlingType Path string Table *ast.TableName @@ -587,6 +594,11 @@ type PlanReplayer struct { Analyze bool Load bool File string + + Capture bool + Remove bool + SQLDigest string + PlanDigest string } // IndexAdvise represents a index advise plan. @@ -645,6 +657,37 @@ type SelectInto struct { IntoOpt *ast.SelectIntoOption } +// ExplainInfoForEncode store explain info for JSON encode +type ExplainInfoForEncode struct { + ID string `json:"id"` + EstRows string `json:"estRows"` + ActRows string `json:"actRows,omitempty"` + TaskType string `json:"taskType"` + AccessObject string `json:"accessObject,omitempty"` + ExecuteInfo string `json:"executeInfo,omitempty"` + OperatorInfo string `json:"operatorInfo,omitempty"` + EstCost string `json:"estCost,omitempty"` + CostFormula string `json:"costFormula,omitempty"` + MemoryInfo string `json:"memoryInfo,omitempty"` + DiskInfo string `json:"diskInfo,omitempty"` + TotalMemoryConsumed string `json:"totalMemoryConsumed,omitempty"` + SubOperators []*ExplainInfoForEncode `json:"subOperators,omitempty"` +} + +// JSONToString convert json to string +func JSONToString(j []*ExplainInfoForEncode) (string, error) { + byteBuffer := bytes.NewBuffer([]byte{}) + encoder := json.NewEncoder(byteBuffer) + // avoid wrongly embedding + encoder.SetEscapeHTML(false) + encoder.SetIndent("", " ") + err := encoder.Encode(j) + if err != nil { + return "", err + } + return byteBuffer.String(), nil +} + // Explain represents a explain plan. type Explain struct { baseSchemaProducer @@ -702,6 +745,12 @@ func (e *Explain) prepareSchema() error { } case format == types.ExplainFormatTrueCardCost: fieldNames = []string{"id", "estRows", "estCost", "costFormula", "actRows", "task", "access object", "execution info", "operator info", "memory", "disk"} + case format == types.ExplainFormatCostTrace: + if e.Analyze || e.RuntimeStatsColl != nil { + fieldNames = []string{"id", "estRows", "estCost", "costFormula", "actRows", "task", "access object", "execution info", "operator info", "memory", "disk"} + } else { + fieldNames = []string{"id", "estRows", "estCost", "costFormula", "task", "access object", "operator info"} + } case (format == types.ExplainFormatROW || format == types.ExplainFormatBrief) && (e.Analyze || e.RuntimeStatsColl != nil): fieldNames = []string{"id", "estRows", "actRows", "task", "access object", "execution info", "operator info", "memory", "disk"} case format == types.ExplainFormatDOT: @@ -710,6 +759,8 @@ func (e *Explain) prepareSchema() error { fieldNames = []string{"hint"} case format == types.ExplainFormatBinary: fieldNames = []string{"binary plan"} + case format == types.ExplainFormatTiDBJSON: + fieldNames = []string{"TiDB_JSON"} default: return errors.Errorf("explain format '%s' is not supported now", e.Format) } @@ -743,7 +794,8 @@ func (e *Explain) RenderResult() error { } if pp.SCtx().GetSessionVars().CostModelVersion == modelVer2 { // output cost formula and factor costs through warning under model ver2 and true_card_cost mode for cost calibration. - trace, _ := pp.getPlanCostVer2(property.RootTaskType, NewDefaultPlanCostOption()) + cost, _ := pp.getPlanCostVer2(property.RootTaskType, NewDefaultPlanCostOption()) + trace := cost.trace pp.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("cost formula: %v", trace.formula)) data, err := json.Marshal(trace.factorCosts) if err != nil { @@ -770,8 +822,18 @@ func (e *Explain) RenderResult() error { } } + if strings.ToLower(e.Format) == types.ExplainFormatCostTrace { + if pp, ok := e.TargetPlan.(PhysicalPlan); ok { + // trigger getPlanCost again with CostFlagTrace to record all cost formulas + if _, err := getPlanCost(pp, property.RootTaskType, + NewDefaultPlanCostOption().WithCostFlag(CostFlagRecalculate|CostFlagTrace)); err != nil { + return err + } + } + } + switch strings.ToLower(e.Format) { - case types.ExplainFormatROW, types.ExplainFormatBrief, types.ExplainFormatVerbose, types.ExplainFormatTrueCardCost: + case types.ExplainFormatROW, types.ExplainFormatBrief, types.ExplainFormatVerbose, types.ExplainFormatTrueCardCost, types.ExplainFormatCostTrace: if e.Rows == nil || e.Analyze { flat := FlattenPhysicalPlan(e.TargetPlan, true) e.explainFlatPlanInRowFormat(flat) @@ -796,6 +858,21 @@ func (e *Explain) RenderResult() error { flat := FlattenPhysicalPlan(e.TargetPlan, false) str := BinaryPlanStrFromFlatPlan(e.ctx, flat) e.Rows = append(e.Rows, []string{str}) + case types.ExplainFormatTiDBJSON: + flat := FlattenPhysicalPlan(e.TargetPlan, true) + encodes := e.explainFlatPlanInJSONFormat(flat) + if e.Analyze && len(encodes) > 0 && + e.SCtx().GetSessionVars().MemoryDebugModeMinHeapInUse != 0 && + e.SCtx().GetSessionVars().MemoryDebugModeAlarmRatio > 0 { + encodeRoot := encodes[0] + tracker := e.SCtx().GetSessionVars().MemTracker + encodeRoot.TotalMemoryConsumed = tracker.FormatBytes(tracker.MaxConsumed()) + } + if str, err := JSONToString(encodes); err == nil { + e.Rows = append(e.Rows, []string{str}) + } else { + return err + } default: return errors.Errorf("explain format '%s' is not supported now", e.Format) } @@ -816,6 +893,38 @@ func (e *Explain) explainFlatPlanInRowFormat(flat *FlatPhysicalPlan) { } } +func (e *Explain) explainFlatPlanInJSONFormat(flat *FlatPhysicalPlan) (encodes []*ExplainInfoForEncode) { + if flat == nil || len(flat.Main) == 0 || flat.InExplain { + return + } + // flat.Main[0] must be the root node of tree + encodes = append(encodes, e.explainOpRecursivelyInJSONFormat(flat.Main[0], flat.Main)) + + for _, cte := range flat.CTEs { + encodes = append(encodes, e.explainOpRecursivelyInJSONFormat(cte[0], cte)) + } + return +} + +func (e *Explain) explainOpRecursivelyInJSONFormat(flatOp *FlatOperator, flats FlatPlanTree) *ExplainInfoForEncode { + taskTp := "" + if flatOp.IsRoot { + taskTp = "root" + } else { + taskTp = flatOp.ReqType.Name() + "[" + flatOp.StoreType.Name() + "]" + } + explainID := flatOp.Origin.ExplainID().String() + flatOp.Label.String() + textTreeExplainID := texttree.PrettyIdentifier(explainID, flatOp.TextTreeIndent, flatOp.IsLastChild) + + cur := e.prepareOperatorInfoForJSONFormat(flatOp.Origin, taskTp, textTreeExplainID, explainID) + + for _, idx := range flatOp.ChildrenIdx { + cur.SubOperators = append(cur.SubOperators, + e.explainOpRecursivelyInJSONFormat(flats[idx], flats)) + } + return cur +} + func (e *Explain) explainFlatOpInRowFormat(flatOp *FlatOperator) { taskTp := "" if flatOp.IsRoot { @@ -827,11 +936,6 @@ func (e *Explain) explainFlatOpInRowFormat(flatOp *FlatOperator) { flatOp.TextTreeIndent, flatOp.IsLastChild) e.prepareOperatorInfo(flatOp.Origin, taskTp, textTreeExplainID) - if e.ctx != nil && e.ctx.GetSessionVars() != nil && e.ctx.GetSessionVars().StmtCtx != nil { - if optimInfo, ok := e.ctx.GetSessionVars().StmtCtx.OptimInfo[flatOp.Origin.ID()]; ok { - e.ctx.GetSessionVars().StmtCtx.AppendNote(errors.New(optimInfo)) - } - } } func getRuntimeInfoStr(ctx sessionctx.Context, p Plan, runtimeStatsColl *execdetails.RuntimeStatsColl) (actRows, analyzeInfo, memoryInfo, diskInfo string) { @@ -900,24 +1004,49 @@ func (e *Explain) prepareOperatorInfo(p Plan, taskType, id string) { var row []string if e.Analyze || e.RuntimeStatsColl != nil { row = []string{id, estRows} - if strings.ToLower(e.Format) == types.ExplainFormatVerbose || strings.ToLower(e.Format) == types.ExplainFormatTrueCardCost { + if strings.ToLower(e.Format) == types.ExplainFormatVerbose || strings.ToLower(e.Format) == types.ExplainFormatTrueCardCost || strings.ToLower(e.Format) == types.ExplainFormatCostTrace { row = append(row, estCost) } - if strings.ToLower(e.Format) == types.ExplainFormatTrueCardCost { + if strings.ToLower(e.Format) == types.ExplainFormatTrueCardCost || strings.ToLower(e.Format) == types.ExplainFormatCostTrace { row = append(row, costFormula) } actRows, analyzeInfo, memoryInfo, diskInfo := getRuntimeInfoStr(e.ctx, p, e.RuntimeStatsColl) row = append(row, actRows, taskType, accessObject, analyzeInfo, operatorInfo, memoryInfo, diskInfo) } else { row = []string{id, estRows} - if strings.ToLower(e.Format) == types.ExplainFormatVerbose || strings.ToLower(e.Format) == types.ExplainFormatTrueCardCost { + if strings.ToLower(e.Format) == types.ExplainFormatVerbose || strings.ToLower(e.Format) == types.ExplainFormatTrueCardCost || + strings.ToLower(e.Format) == types.ExplainFormatCostTrace { row = append(row, estCost) } + if strings.ToLower(e.Format) == types.ExplainFormatCostTrace { + row = append(row, costFormula) + } row = append(row, taskType, accessObject, operatorInfo) } e.Rows = append(e.Rows, row) } +func (e *Explain) prepareOperatorInfoForJSONFormat(p Plan, taskType, id string, explainID string) *ExplainInfoForEncode { + if p.ExplainID().String() == "_0" { + return nil + } + + estRows, _, _, accessObject, operatorInfo := e.getOperatorInfo(p, id) + jsonRow := &ExplainInfoForEncode{ + ID: explainID, + EstRows: estRows, + TaskType: taskType, + AccessObject: accessObject, + OperatorInfo: operatorInfo, + SubOperators: make([]*ExplainInfoForEncode, 0), + } + + if e.Analyze || e.RuntimeStatsColl != nil { + jsonRow.ActRows, jsonRow.ExecuteInfo, jsonRow.MemoryInfo, jsonRow.DiskInfo = getRuntimeInfoStr(e.ctx, p, e.RuntimeStatsColl) + } + return jsonRow +} + func (e *Explain) getOperatorInfo(p Plan, id string) (string, string, string, string, string) { // For `explain for connection` statement, `e.ExplainRows` will be set. for _, row := range e.ExplainRows { @@ -938,7 +1067,9 @@ func (e *Explain) getOperatorInfo(p Plan, id string) (string, string, string, st if e.ctx != nil && e.ctx.GetSessionVars().CostModelVersion == modelVer2 { costVer2, _ := pp.getPlanCostVer2(property.RootTaskType, NewDefaultPlanCostOption()) estCost = strconv.FormatFloat(costVer2.cost, 'f', 2, 64) - costFormula = costVer2.formula + if costVer2.trace != nil { + costFormula = costVer2.trace.formula + } } else { planCost, _ := getPlanCost(pp, property.RootTaskType, NewDefaultPlanCostOption()) estCost = strconv.FormatFloat(planCost, 'f', 2, 64) @@ -1055,7 +1186,9 @@ func binaryOpFromFlatOp(explainCtx sessionctx.Context, op *FlatOperator, out *ti rootStats, copStats, memTracker, diskTracker := getRuntimeInfo(explainCtx, op.Origin, nil) if rootStats != nil { basic, groups := rootStats.MergeStats() - out.RootBasicExecInfo = basic.String() + if basic != nil { + out.RootBasicExecInfo = basic.String() + } for _, group := range groups { str := group.String() if len(str) > 0 { diff --git a/planner/core/encode.go b/planner/core/encode.go index 4345c80c39fc1..bf02059dafdda 100644 --- a/planner/core/encode.go +++ b/planner/core/encode.go @@ -41,7 +41,7 @@ func EncodeFlatPlan(flat *FlatPhysicalPlan) string { return "" } failpoint.Inject("mockPlanRowCount", func(val failpoint.Value) { - selectPlan := flat.Main.GetSelectPlan() + selectPlan, _ := flat.Main.GetSelectPlan() for _, op := range selectPlan { op.Origin.statsInfo().RowCount = float64(val.(int)) } @@ -262,7 +262,10 @@ type planDigester struct { // NormalizeFlatPlan normalizes a FlatPhysicalPlan and generates plan digest. func NormalizeFlatPlan(flat *FlatPhysicalPlan) (normalized string, digest *parser.Digest) { - selectPlan := flat.Main.GetSelectPlan() + if flat == nil { + return "", parser.NewDigest(nil) + } + selectPlan, selectPlanOffset := flat.Main.GetSelectPlan() if len(selectPlan) == 0 || !selectPlan[0].IsPhysicalPlan { return "", parser.NewDigest(nil) } @@ -274,12 +277,11 @@ func NormalizeFlatPlan(flat *FlatPhysicalPlan) (normalized string, digest *parse }() // assume an operator costs around 30 bytes, preallocate space for them d.buf.Grow(30 * len(selectPlan)) - depthOffset := len(flat.Main) - len(selectPlan) for _, op := range selectPlan { taskTypeInfo := plancodec.EncodeTaskTypeForNormalize(op.IsRoot, op.StoreType) p := op.Origin.(PhysicalPlan) plancodec.NormalizePlanNode( - int(op.Depth-uint32(depthOffset)), + int(op.Depth-uint32(selectPlanOffset)), op.Origin.TP(), taskTypeInfo, p.ExplainNormalizedInfo(), @@ -287,6 +289,9 @@ func NormalizeFlatPlan(flat *FlatPhysicalPlan) (normalized string, digest *parse ) } normalized = d.buf.String() + if len(normalized) == 0 { + return "", parser.NewDigest(nil) + } _, err := d.hasher.Write(d.buf.Bytes()) if err != nil { panic(err) diff --git a/planner/core/exhaust_physical_plans.go b/planner/core/exhaust_physical_plans.go index 768a8c20fc0b5..2e78d7f059b35 100644 --- a/planner/core/exhaust_physical_plans.go +++ b/planner/core/exhaust_physical_plans.go @@ -717,33 +717,78 @@ func (p *LogicalJoin) getIndexJoinByOuterIdx(prop *property.PhysicalProperty, ou } else { innerJoinKeys, outerJoinKeys, _, _ = p.GetJoinKeys() } - ds, isDataSource := innerChild.(*DataSource) - us, isUnionScan := innerChild.(*LogicalUnionScan) - if (!isDataSource && !isUnionScan) || (isDataSource && ds.preferStoreType&preferTiFlash != 0) { + innerChildWrapper := p.extractIndexJoinInnerChildPattern(innerChild) + if innerChildWrapper == nil { return nil } - if isUnionScan { - // The child of union scan may be union all for partition table. - ds, isDataSource = us.Children()[0].(*DataSource) + + var avgInnerRowCnt float64 + if outerChild.statsInfo().RowCount > 0 { + avgInnerRowCnt = p.equalCondOutCnt / outerChild.statsInfo().RowCount + } + joins = p.buildIndexJoinInner2TableScan(prop, innerChildWrapper, innerJoinKeys, outerJoinKeys, outerIdx, avgInnerRowCnt) + if joins != nil { + return + } + return p.buildIndexJoinInner2IndexScan(prop, innerChildWrapper, innerJoinKeys, outerJoinKeys, outerIdx, avgInnerRowCnt) +} + +type indexJoinInnerChildWrapper struct { + ds *DataSource + us *LogicalUnionScan + proj *LogicalProjection + sel *LogicalSelection +} + +func (p *LogicalJoin) extractIndexJoinInnerChildPattern(innerChild LogicalPlan) *indexJoinInnerChildWrapper { + wrapper := &indexJoinInnerChildWrapper{} + switch child := innerChild.(type) { + case *DataSource: + wrapper.ds = child + case *LogicalUnionScan: + wrapper.us = child + ds, isDataSource := wrapper.us.Children()[0].(*DataSource) if !isDataSource { return nil } + wrapper.ds = ds // If one of the union scan children is a TiFlash table, then we can't choose index join. - for _, child := range us.Children() { + for _, child := range wrapper.us.Children() { if ds, ok := child.(*DataSource); ok && ds.preferStoreType&preferTiFlash != 0 { return nil } } + case *LogicalProjection: + if !p.ctx.GetSessionVars().EnableINLJoinInnerMultiPattern { + return nil + } + // For now, we only allow proj with all Column expression can be the inner side of index join + for _, expr := range child.Exprs { + if _, ok := expr.(*expression.Column); !ok { + return nil + } + } + wrapper.proj = child + ds, isDataSource := wrapper.proj.Children()[0].(*DataSource) + if !isDataSource { + return nil + } + wrapper.ds = ds + case *LogicalSelection: + if !p.ctx.GetSessionVars().EnableINLJoinInnerMultiPattern { + return nil + } + wrapper.sel = child + ds, isDataSource := wrapper.sel.Children()[0].(*DataSource) + if !isDataSource { + return nil + } + wrapper.ds = ds } - var avgInnerRowCnt float64 - if outerChild.statsInfo().RowCount > 0 { - avgInnerRowCnt = p.equalCondOutCnt / outerChild.statsInfo().RowCount - } - joins = p.buildIndexJoinInner2TableScan(prop, ds, innerJoinKeys, outerJoinKeys, outerIdx, us, avgInnerRowCnt) - if joins != nil { - return + if wrapper.ds == nil || wrapper.ds.preferStoreType&preferTiFlash != 0 { + return nil } - return p.buildIndexJoinInner2IndexScan(prop, ds, innerJoinKeys, outerJoinKeys, outerIdx, us, avgInnerRowCnt) + return wrapper } func (p *LogicalJoin) getIndexJoinBuildHelper(ds *DataSource, innerJoinKeys []*expression.Column, checkPathValid func(path *util.AccessPath) bool, outerJoinKeys []*expression.Column) (*indexJoinBuildHelper, []int) { @@ -783,8 +828,10 @@ func (p *LogicalJoin) getIndexJoinBuildHelper(ds *DataSource, innerJoinKeys []*e // fetched from the inner side for every tuple from the outer side. This will be // promised to be no worse than building IndexScan as the inner child. func (p *LogicalJoin) buildIndexJoinInner2TableScan( - prop *property.PhysicalProperty, ds *DataSource, innerJoinKeys, outerJoinKeys []*expression.Column, - outerIdx int, us *LogicalUnionScan, avgInnerRowCnt float64) (joins []PhysicalPlan) { + prop *property.PhysicalProperty, wrapper *indexJoinInnerChildWrapper, innerJoinKeys, outerJoinKeys []*expression.Column, + outerIdx int, avgInnerRowCnt float64) (joins []PhysicalPlan) { + ds := wrapper.ds + us := wrapper.us var tblPath *util.AccessPath for _, path := range ds.possibleAccessPaths { if path.IsTablePath() && path.StoreType == kv.TiKV { @@ -806,13 +853,13 @@ func (p *LogicalJoin) buildIndexJoinInner2TableScan( return nil } rangeInfo := helper.buildRangeDecidedByInformation(helper.chosenPath.IdxCols, outerJoinKeys) - innerTask = p.constructInnerTableScanTask(ds, helper.chosenRanges.Range(), outerJoinKeys, us, rangeInfo, false, false, avgInnerRowCnt) + innerTask = p.constructInnerTableScanTask(wrapper, helper.chosenRanges.Range(), outerJoinKeys, rangeInfo, false, false, avgInnerRowCnt) // The index merge join's inner plan is different from index join, so we // should construct another inner plan for it. // Because we can't keep order for union scan, if there is a union scan in inner task, // we can't construct index merge join. if us == nil { - innerTask2 = p.constructInnerTableScanTask(ds, helper.chosenRanges.Range(), outerJoinKeys, us, rangeInfo, true, !prop.IsSortItemEmpty() && prop.SortItems[0].Desc, avgInnerRowCnt) + innerTask2 = p.constructInnerTableScanTask(wrapper, helper.chosenRanges.Range(), outerJoinKeys, rangeInfo, true, !prop.IsSortItemEmpty() && prop.SortItems[0].Desc, avgInnerRowCnt) } ranges = helper.chosenRanges } else { @@ -846,13 +893,13 @@ func (p *LogicalJoin) buildIndexJoinInner2TableScan( } buffer.WriteString("]") rangeInfo := buffer.String() - innerTask = p.constructInnerTableScanTask(ds, ranges, outerJoinKeys, us, rangeInfo, false, false, avgInnerRowCnt) + innerTask = p.constructInnerTableScanTask(wrapper, ranges, outerJoinKeys, rangeInfo, false, false, avgInnerRowCnt) // The index merge join's inner plan is different from index join, so we // should construct another inner plan for it. // Because we can't keep order for union scan, if there is a union scan in inner task, // we can't construct index merge join. if us == nil { - innerTask2 = p.constructInnerTableScanTask(ds, ranges, outerJoinKeys, us, rangeInfo, true, !prop.IsSortItemEmpty() && prop.SortItems[0].Desc, avgInnerRowCnt) + innerTask2 = p.constructInnerTableScanTask(wrapper, ranges, outerJoinKeys, rangeInfo, true, !prop.IsSortItemEmpty() && prop.SortItems[0].Desc, avgInnerRowCnt) } } var ( @@ -880,8 +927,10 @@ func (p *LogicalJoin) buildIndexJoinInner2TableScan( } func (p *LogicalJoin) buildIndexJoinInner2IndexScan( - prop *property.PhysicalProperty, ds *DataSource, innerJoinKeys, outerJoinKeys []*expression.Column, - outerIdx int, us *LogicalUnionScan, avgInnerRowCnt float64) (joins []PhysicalPlan) { + prop *property.PhysicalProperty, wrapper *indexJoinInnerChildWrapper, innerJoinKeys, outerJoinKeys []*expression.Column, + outerIdx int, avgInnerRowCnt float64) (joins []PhysicalPlan) { + ds := wrapper.ds + us := wrapper.us helper, keyOff2IdxOff := p.getIndexJoinBuildHelper(ds, innerJoinKeys, func(path *util.AccessPath) bool { return !path.IsTablePath() }, outerJoinKeys) if helper == nil { return nil @@ -898,7 +947,7 @@ func (p *LogicalJoin) buildIndexJoinInner2IndexScan( maxOneRow = ok && (sf.FuncName.L == ast.EQ) } } - innerTask := p.constructInnerIndexScanTask(ds, helper.chosenPath, helper.chosenRanges.Range(), helper.chosenRemained, outerJoinKeys, us, rangeInfo, false, false, avgInnerRowCnt, maxOneRow) + innerTask := p.constructInnerIndexScanTask(wrapper, helper.chosenPath, helper.chosenRanges.Range(), helper.chosenRemained, outerJoinKeys, rangeInfo, false, false, avgInnerRowCnt, maxOneRow) failpoint.Inject("MockOnlyEnableIndexHashJoin", func(val failpoint.Value) { if val.(bool) && !p.ctx.GetSessionVars().InRestrictedSQL { failpoint.Return(p.constructIndexHashJoin(prop, outerIdx, innerTask, helper.chosenRanges, keyOff2IdxOff, helper.chosenPath, helper.lastColManager)) @@ -913,7 +962,7 @@ func (p *LogicalJoin) buildIndexJoinInner2IndexScan( // Because we can't keep order for union scan, if there is a union scan in inner task, // we can't construct index merge join. if us == nil { - innerTask2 := p.constructInnerIndexScanTask(ds, helper.chosenPath, helper.chosenRanges.Range(), helper.chosenRemained, outerJoinKeys, us, rangeInfo, true, !prop.IsSortItemEmpty() && prop.SortItems[0].Desc, avgInnerRowCnt, maxOneRow) + innerTask2 := p.constructInnerIndexScanTask(wrapper, helper.chosenPath, helper.chosenRanges.Range(), helper.chosenRemained, outerJoinKeys, rangeInfo, true, !prop.IsSortItemEmpty() && prop.SortItems[0].Desc, avgInnerRowCnt, maxOneRow) if innerTask2 != nil { joins = append(joins, p.constructIndexMergeJoin(prop, outerIdx, innerTask2, helper.chosenRanges, keyOff2IdxOff, helper.chosenPath, helper.lastColManager)...) } @@ -968,15 +1017,15 @@ func (ijHelper *indexJoinBuildHelper) buildRangeDecidedByInformation(idxCols []* // constructInnerTableScanTask is specially used to construct the inner plan for PhysicalIndexJoin. func (p *LogicalJoin) constructInnerTableScanTask( - ds *DataSource, + wrapper *indexJoinInnerChildWrapper, ranges ranger.Ranges, outerJoinKeys []*expression.Column, - us *LogicalUnionScan, rangeInfo string, keepOrder bool, desc bool, rowCount float64, ) task { + ds := wrapper.ds // If `ds.tableInfo.GetPartitionInfo() != nil`, // it means the data source is a partition table reader. // If the inner task need to keep order, the partition table reader can't satisfy it. @@ -1038,10 +1087,51 @@ func (p *LogicalJoin) constructInnerTableScanTask( ts.addPushedDownSelection(copTask, selStats) t := copTask.convertToRootTask(ds.ctx) reader := t.p - t.p = p.constructInnerUnionScan(us, reader) + t.p = p.constructInnerByWrapper(wrapper, reader) return t } +func (p *LogicalJoin) constructInnerByWrapper(wrapper *indexJoinInnerChildWrapper, child PhysicalPlan) PhysicalPlan { + if !p.ctx.GetSessionVars().EnableINLJoinInnerMultiPattern { + if wrapper.us != nil { + return p.constructInnerUnionScan(wrapper.us, child) + } + return child + } + if wrapper.us != nil { + return p.constructInnerUnionScan(wrapper.us, child) + } else if wrapper.proj != nil { + return p.constructInnerProj(wrapper.proj, child) + } else if wrapper.sel != nil { + return p.constructInnerSel(wrapper.sel, child) + } + return child +} + +func (p *LogicalJoin) constructInnerSel(sel *LogicalSelection, child PhysicalPlan) PhysicalPlan { + if sel == nil { + return child + } + physicalSel := PhysicalSelection{ + Conditions: sel.Conditions, + }.Init(sel.ctx, sel.stats, sel.blockOffset, nil) + physicalSel.SetChildren(child) + return physicalSel +} + +func (p *LogicalJoin) constructInnerProj(proj *LogicalProjection, child PhysicalPlan) PhysicalPlan { + if proj == nil { + return child + } + physicalProj := PhysicalProjection{ + Exprs: proj.Exprs, + CalculateNoDelay: proj.CalculateNoDelay, + AvoidColumnEvaluator: proj.AvoidColumnEvaluator, + }.Init(proj.ctx, proj.stats, proj.blockOffset, nil) + physicalProj.SetChildren(child) + return physicalProj +} + func (p *LogicalJoin) constructInnerUnionScan(us *LogicalUnionScan, reader PhysicalPlan) PhysicalPlan { if us == nil { return reader @@ -1058,18 +1148,18 @@ func (p *LogicalJoin) constructInnerUnionScan(us *LogicalUnionScan, reader Physi // constructInnerIndexScanTask is specially used to construct the inner plan for PhysicalIndexJoin. func (p *LogicalJoin) constructInnerIndexScanTask( - ds *DataSource, + wrapper *indexJoinInnerChildWrapper, path *util.AccessPath, ranges ranger.Ranges, filterConds []expression.Expression, _ []*expression.Column, - us *LogicalUnionScan, rangeInfo string, keepOrder bool, desc bool, rowCount float64, maxOneRow bool, ) task { + ds := wrapper.ds // If `ds.tableInfo.GetPartitionInfo() != nil`, // it means the data source is a partition table reader. // If the inner task need to keep order, the partition table reader can't satisfy it. @@ -1194,7 +1284,7 @@ func (p *LogicalJoin) constructInnerIndexScanTask( is.addPushedDownSelection(cop, ds, tmpPath, finalStats) t := cop.convertToRootTask(ds.ctx) reader := t.p - t.p = p.constructInnerUnionScan(us, reader) + t.p = p.constructInnerByWrapper(wrapper, reader) return t } @@ -1325,8 +1415,11 @@ func (ijHelper *indexJoinBuildHelper) resetContextForIndex(innerKeys []*expressi if ijHelper.curIdxOff2KeyOff[i] >= 0 { // Don't use the join columns if their collations are unmatched and the new collation is enabled. if collate.NewCollationEnabled() && types.IsString(idxCol.RetType.GetType()) && types.IsString(outerKeys[ijHelper.curIdxOff2KeyOff[i]].RetType.GetType()) { - _, coll := expression.DeriveCollationFromExprs(nil, idxCol, outerKeys[ijHelper.curIdxOff2KeyOff[i]]) - if !collate.CompatibleCollate(idxCol.GetType().GetCollate(), coll) { + et, err := expression.CheckAndDeriveCollationFromExprs(ijHelper.innerPlan.ctx, "equal", types.ETInt, idxCol, outerKeys[ijHelper.curIdxOff2KeyOff[i]]) + if err != nil { + logutil.BgLogger().Error("Unexpected error happened during constructing index join", zap.Stack("stack")) + } + if !collate.CompatibleCollate(idxCol.GetType().GetCollate(), et.Collation) { ijHelper.curIdxOff2KeyOff[i] = -1 } } @@ -1928,7 +2021,7 @@ func (p *LogicalJoin) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]P } }) - if (p.preferJoinType&preferBCJoin) == 0 && p.preferJoinType > 0 { + if (p.preferJoinType&preferBCJoin) == 0 && (p.preferJoinType&preferShuffleJoin) == 0 && p.preferJoinType > 0 { p.SCtx().GetSessionVars().RaiseWarningWhenMPPEnforced("MPP mode may be blocked because you have used hint to specify a join algorithm which is not supported by mpp now.") if prop.IsFlashProp() { return nil, false, nil @@ -1957,6 +2050,21 @@ func (p *LogicalJoin) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]P mppJoins := p.tryToGetMppHashJoin(prop, false) joins = append(joins, mppJoins...) } + } else { + hasMppHints := false + var errMsg string + if (p.preferJoinType & preferShuffleJoin) > 0 { + errMsg = "The join can not push down to the MPP side, the shuffle_join() hint is invalid" + hasMppHints = true + } + if (p.preferJoinType & preferBCJoin) > 0 { + errMsg = "The join can not push down to the MPP side, the broadcast_join() hint is invalid" + hasMppHints = true + } + if hasMppHints { + warning := ErrInternal.GenWithStack(errMsg) + p.ctx.GetSessionVars().StmtCtx.AppendWarning(warning) + } } if prop.IsFlashProp() { return joins, true, nil @@ -2515,7 +2623,7 @@ func (p *baseLogicalPlan) exhaustPhysicalPlans(_ *property.PhysicalProperty) ([] } // canPushToCop checks if it can be pushed to some stores. For TiKV, it only checks datasource. -// For TiFlash, it will check whether the operator is supported, but note that the check might be inaccrute. +// For TiFlash, it will check whether the operator is supported, but note that the check might be inaccrate. func (p *baseLogicalPlan) canPushToCop(storeTp kv.StoreType) bool { return p.canPushToCopImpl(storeTp, false) } @@ -2682,7 +2790,9 @@ func (la *LogicalAggregation) getStreamAggs(prop *property.PhysicalProperty) []P if la.HasDistinct() { // TODO: remove AllowDistinctAggPushDown after the cost estimation of distinct pushdown is implemented. // If AllowDistinctAggPushDown is set to true, we should not consider RootTask. - if !la.ctx.GetSessionVars().AllowDistinctAggPushDown { + if !la.ctx.GetSessionVars().AllowDistinctAggPushDown || !la.canPushToCop(kv.TiKV) { + // if variable doesn't allow DistinctAggPushDown, just produce root task type. + // if variable does allow DistinctAggPushDown, but OP itself can't be pushed down to tikv, just produce root task type. taskTypes = []property.TaskType{property.RootTaskType} } else if !la.distinctArgsMeetsProperty() { continue @@ -2730,8 +2840,11 @@ func (la *LogicalAggregation) checkCanPushDownToMPP() bool { } } if hasUnsupportedDistinct { + warnErr := errors.New("Aggregation can not be pushed to storage layer in mpp mode because it contains agg function with distinct") if la.ctx.GetSessionVars().StmtCtx.InExplainStmt { - la.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("Aggregation can not be pushed to storage layer in mpp mode because it contains agg function with distinct")) + la.ctx.GetSessionVars().StmtCtx.AppendWarning(warnErr) + } else { + la.ctx.GetSessionVars().StmtCtx.AppendExtraWarning(warnErr) } return false } @@ -2831,6 +2944,15 @@ func (la *LogicalAggregation) tryToGetMppHashAggs(prop *property.PhysicalPropert return } +// getHashAggs will generate some kinds of taskType here, which finally converted to different task plan. +// when deciding whether to add a kind of taskType, there is a rule here. [Not is Not, Yes is not Sure] +// eg: which means +// +// 1: when you find something here that block hashAgg to be pushed down to XXX, just skip adding the XXXTaskType. +// 2: when you find nothing here to block hashAgg to be pushed down to XXX, just add the XXXTaskType here. +// for 2, the final result for this physical operator enumeration is chosen or rejected is according to more factors later (hint/variable/partition/virtual-col/cost) +// +// That is to say, the non-complete positive judgement of canPushDownToMPP/canPushDownToTiFlash/canPushDownToTiKV is not that for sure here. func (la *LogicalAggregation) getHashAggs(prop *property.PhysicalProperty) []PhysicalPlan { if !prop.IsSortItemEmpty() { return nil @@ -2844,7 +2966,9 @@ func (la *LogicalAggregation) getHashAggs(prop *property.PhysicalProperty) []Phy canPushDownToMPP := canPushDownToTiFlash && la.ctx.GetSessionVars().IsMPPAllowed() && la.checkCanPushDownToMPP() if la.HasDistinct() { // TODO: remove after the cost estimation of distinct pushdown is implemented. - if !la.ctx.GetSessionVars().AllowDistinctAggPushDown { + if !la.ctx.GetSessionVars().AllowDistinctAggPushDown || !la.canPushToCop(kv.TiKV) { + // if variable doesn't allow DistinctAggPushDown, just produce root task type. + // if variable does allow DistinctAggPushDown, but OP itself can't be pushed down to tikv, just produce root task type. taskTypes = []property.TaskType{property.RootTaskType} } } else if !la.aggHints.preferAggToCop { @@ -2855,6 +2979,21 @@ func (la *LogicalAggregation) getHashAggs(prop *property.PhysicalProperty) []Phy } if canPushDownToMPP { taskTypes = append(taskTypes, property.MppTaskType) + } else { + hasMppHints := false + var errMsg string + if la.aggHints.preferAggType&preferMPP1PhaseAgg > 0 { + errMsg = "The agg can not push down to the MPP side, the MPP_1PHASE_AGG() hint is invalid" + hasMppHints = true + } + if la.aggHints.preferAggType&preferMPP2PhaseAgg > 0 { + errMsg = "The agg can not push down to the MPP side, the MPP_2PHASE_AGG() hint is invalid" + hasMppHints = true + } + if hasMppHints { + warning := ErrInternal.GenWithStack(errMsg) + la.ctx.GetSessionVars().StmtCtx.AppendWarning(warning) + } } if prop.IsFlashProp() { taskTypes = []property.TaskType{prop.TaskTp} diff --git a/planner/core/explain.go b/planner/core/explain.go index 3f4c37e60d131..93d3533bbe3cc 100644 --- a/planner/core/explain.go +++ b/planner/core/explain.go @@ -247,7 +247,13 @@ func (p *PhysicalTableScan) isFullScan() bool { // ExplainInfo implements Plan interface. func (p *PhysicalTableReader) ExplainInfo() string { - return "data:" + p.tablePlan.ExplainID().String() + tablePlanInfo := "data:" + p.tablePlan.ExplainID().String() + + if p.ReadReqType == MPP { + return fmt.Sprintf("MppVersion: %d, %s", p.ctx.GetSessionVars().ChooseMppVersion(), tablePlanInfo) + } + + return tablePlanInfo } // ExplainNormalizedInfo implements Plan interface. @@ -285,8 +291,11 @@ func (p *PhysicalIndexLookUpReader) ExplainInfo() string { } // ExplainInfo implements Plan interface. -func (*PhysicalIndexMergeReader) ExplainInfo() string { - return "" +func (p *PhysicalIndexMergeReader) ExplainInfo() string { + if p.IsIntersectionType { + return "type: intersection" + } + return "type: union" } // ExplainInfo implements Plan interface. @@ -382,6 +391,9 @@ func (p *basePhysicalAgg) explainInfo(normalized bool) string { builder.WriteString(", ") } } + if p.TiFlashFineGrainedShuffleStreamCount > 0 { + builder.WriteString(fmt.Sprintf(", stream_count: %d", p.TiFlashFineGrainedShuffleStreamCount)) + } return builder.String() } @@ -540,6 +552,9 @@ func (p *PhysicalHashJoin) explainInfo(normalized bool) string { buffer.WriteString(", other cond:") buffer.Write(sortedExplainExpressionList(p.OtherConditions)) } + if p.TiFlashFineGrainedShuffleStreamCount > 0 { + buffer.WriteString(fmt.Sprintf(", stream_count: %d", p.TiFlashFineGrainedShuffleStreamCount)) + } return buffer.String() } @@ -796,6 +811,11 @@ func (p *PhysicalExchangeSender) ExplainInfo() string { fmt.Fprintf(buffer, "Broadcast") case tipb.ExchangeType_Hash: fmt.Fprintf(buffer, "HashPartition") + } + if p.CompressionMode != kv.ExchangeCompressionModeNONE { + fmt.Fprintf(buffer, ", Compression: %s", p.CompressionMode.Name()) + } + if p.ExchangeType == tipb.ExchangeType_Hash { fmt.Fprintf(buffer, ", Hash Cols: %s", property.ExplainColumnList(p.HashCols)) } if len(p.Tasks) > 0 { diff --git a/planner/core/expression_rewriter.go b/planner/core/expression_rewriter.go index 2e22a752df310..2e34f8fe5a6f8 100644 --- a/planner/core/expression_rewriter.go +++ b/planner/core/expression_rewriter.go @@ -55,7 +55,7 @@ func evalAstExpr(sctx sessionctx.Context, expr ast.ExprNode) (types.Datum, error if val, ok := expr.(*driver.ValueExpr); ok { return val.Datum, nil } - newExpr, err := rewriteAstExpr(sctx, expr, nil, nil) + newExpr, err := rewriteAstExpr(sctx, expr, nil, nil, false) if err != nil { return types.Datum{}, err } @@ -63,13 +63,14 @@ func evalAstExpr(sctx sessionctx.Context, expr ast.ExprNode) (types.Datum, error } // rewriteAstExpr rewrites ast expression directly. -func rewriteAstExpr(sctx sessionctx.Context, expr ast.ExprNode, schema *expression.Schema, names types.NameSlice) (expression.Expression, error) { +func rewriteAstExpr(sctx sessionctx.Context, expr ast.ExprNode, schema *expression.Schema, names types.NameSlice, allowCastArray bool) (expression.Expression, error) { var is infoschema.InfoSchema // in tests, it may be null if s, ok := sctx.GetInfoSchema().(infoschema.InfoSchema); ok { is = s } b, savedBlockNames := NewPlanBuilder().Init(sctx, is, &hint.BlockHintProcessor{}) + b.allowBuildCastArray = allowCastArray fakePlan := LogicalTableDual{}.Init(sctx, 0) if schema != nil { fakePlan.schema = schema @@ -1183,6 +1184,10 @@ func (er *expressionRewriter) Leave(originInNode ast.Node) (retNode ast.Node, ok er.disableFoldCounter-- } case *ast.FuncCastExpr: + if v.Tp.IsArray() && !er.b.allowBuildCastArray { + er.err = expression.ErrNotSupportedYet.GenWithStackByArgs("Use of CAST( .. AS .. ARRAY) outside of functional index in CREATE(non-SELECT)/ALTER TABLE or in general expressions") + return retNode, false + } arg := er.ctxStack[len(er.ctxStack)-1] er.err = expression.CheckArgsNotMultiColumnRow(arg) if er.err != nil { @@ -1195,7 +1200,11 @@ func (er *expressionRewriter) Leave(originInNode ast.Node) (retNode ast.Node, ok return retNode, false } - castFunction := expression.BuildCastFunction(er.sctx, arg, v.Tp) + castFunction, err := expression.BuildCastFunctionWithCheck(er.sctx, arg, v.Tp) + if err != nil { + er.err = err + return retNode, false + } if v.Tp.EvalType() == types.ETString { castFunction.SetCoercibility(expression.CoercibilityImplicit) if v.Tp.GetCharset() == charset.CharsetASCII { @@ -1550,16 +1559,10 @@ func (er *expressionRewriter) inToExpression(lLen int, not bool, tp *types.Field if c, ok := args[i].(*expression.Constant); ok { var isExceptional bool if expression.MaybeOverOptimized4PlanCache(er.sctx, []expression.Expression{c}) { - if c.GetType().EvalType() == types.ETString { - // To keep the result be compatible with MySQL, refine `int non-constant str constant` - // here and skip this refine operation in all other cases for safety. - er.sctx.GetSessionVars().StmtCtx.SkipPlanCache = true - expression.RemoveMutableConst(er.sctx, []expression.Expression{c}) - } else { - continue + if c.GetType().EvalType() == types.ETInt { + continue // no need to refine it } - } else if er.sctx.GetSessionVars().StmtCtx.SkipPlanCache { - // We should remove the mutable constant for correctness, because its value may be changed. + er.sctx.GetSessionVars().StmtCtx.SetSkipPlanCache(errors.Errorf("skip plan-cache: '%v' may be converted to INT", c.String())) expression.RemoveMutableConst(er.sctx, []expression.Expression{c}) } args[i], isExceptional = expression.RefineComparedConstant(er.sctx, *leftFt, c, opcode.EQ) @@ -2114,7 +2117,7 @@ func (er *expressionRewriter) evalDefaultExpr(v *ast.DefaultExpr) { var val *expression.Constant switch { case isCurrentTimestamp && (col.GetType() == mysql.TypeDatetime || col.GetType() == mysql.TypeTimestamp): - t, err := expression.GetTimeValue(er.sctx, ast.CurrentTimestamp, col.GetType(), col.GetDecimal()) + t, err := expression.GetTimeValue(er.sctx, ast.CurrentTimestamp, col.GetType(), col.GetDecimal(), nil) if err != nil { return } @@ -2169,6 +2172,9 @@ func decodeKeyFromString(ctx sessionctx.Context, s string) string { return s } tbl, _ := is.TableByID(tableID) + if tbl == nil { + tbl, _, _ = is.FindTableByPartitionID(tableID) + } loc := ctx.GetSessionVars().Location() if tablecodec.IsRecordKey(key) { ret, err := decodeRecordKey(key, tableID, tbl, loc) @@ -2185,7 +2191,7 @@ func decodeKeyFromString(ctx sessionctx.Context, s string) string { } return ret } else if tablecodec.IsTableKey(key) { - ret, err := decodeTableKey(key, tableID) + ret, err := decodeTableKey(key, tableID, tbl) if err != nil { sc.AppendWarning(err) return s @@ -2203,6 +2209,10 @@ func decodeRecordKey(key []byte, tableID int64, tbl table.Table, loc *time.Locat } if handle.IsInt() { ret := make(map[string]interface{}) + if tbl != nil && tbl.Meta().Partition != nil { + ret["partition_id"] = tableID + tableID = tbl.Meta().ID + } ret["table_id"] = strconv.FormatInt(tableID, 10) // When the clustered index is enabled, we should show the PK name. if tbl != nil && tbl.Meta().HasClusteredIndex() { @@ -2239,6 +2249,10 @@ func decodeRecordKey(key []byte, tableID int64, tbl table.Table, loc *time.Locat return "", errors.Trace(err) } ret := make(map[string]interface{}) + if tbl.Meta().Partition != nil { + ret["partition_id"] = tableID + tableID = tbl.Meta().ID + } ret["table_id"] = tableID handleRet := make(map[string]interface{}) for colID := range datumMap { @@ -2308,6 +2322,10 @@ func decodeIndexKey(key []byte, tableID int64, tbl table.Table, loc *time.Locati ds = append(ds, d) } ret := make(map[string]interface{}) + if tbl.Meta().Partition != nil { + ret["partition_id"] = tableID + tableID = tbl.Meta().ID + } ret["table_id"] = tableID ret["index_id"] = indexID idxValMap := make(map[string]interface{}, len(targetIndex.Columns)) @@ -2340,8 +2358,13 @@ func decodeIndexKey(key []byte, tableID int64, tbl table.Table, loc *time.Locati return string(retStr), nil } -func decodeTableKey(_ []byte, tableID int64) (string, error) { - ret := map[string]int64{"table_id": tableID} +func decodeTableKey(_ []byte, tableID int64, tbl table.Table) (string, error) { + ret := map[string]int64{} + if tbl != nil && tbl.Meta().GetPartitionInfo() != nil { + ret["partition_id"] = tableID + tableID = tbl.Meta().ID + } + ret["table_id"] = tableID retStr, err := json.Marshal(ret) if err != nil { return "", errors.Trace(err) diff --git a/planner/core/expression_rewriter_test.go b/planner/core/expression_rewriter_test.go index f7da5cd5a59ea..94a63d814c030 100644 --- a/planner/core/expression_rewriter_test.go +++ b/planner/core/expression_rewriter_test.go @@ -71,7 +71,8 @@ func TestDefaultFunction(t *testing.T) { c int default '10', d double default '3.14', e datetime default '20180101', - f datetime default current_timestamp);`) + f datetime default current_timestamp, + g date default current_date);`) tk.MustExec("insert into t1(a, b, c, d) values ('1', '1', 1, 1)") tk.MustExec("set @@timestamp = 1321009871") defer tk.MustExec("set @@timestamp = DEFAULT") @@ -83,8 +84,9 @@ func TestDefaultFunction(t *testing.T) { default(c) as defc, default(d) as defd, default(e) as defe, - default(f) as deff - from t1`).Check(testkit.RowsWithSep("|", "def||10|3.14|2018-01-01 00:00:00|2011-11-11 11:11:11")) + default(f) as deff, + default(g) as defg + from t1`).Check(testkit.RowsWithSep("|", "def||10|3.14|2018-01-01 00:00:00|2011-11-11 11:11:11|2011-11-11")) require.EqualError(t, tk.ExecToErr("select default(x) from t1"), "[planner:1054]Unknown column 'x' in 'field list'") tk.MustQuery("select default(a0) from (select a as a0 from t1) as t0").Check(testkit.Rows("def")) diff --git a/planner/core/find_best_task.go b/planner/core/find_best_task.go index 6f99593514459..f9a4c6e094a81 100644 --- a/planner/core/find_best_task.go +++ b/planner/core/find_best_task.go @@ -20,6 +20,7 @@ import ( "strings" "github.com/pingcap/errors" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/ast" @@ -741,7 +742,7 @@ func (ds *DataSource) skylinePruning(prop *property.PhysicalProperty) []*candida } func (ds *DataSource) getPruningInfo(candidates []*candidatePath, prop *property.PhysicalProperty) string { - if !ds.ctx.GetSessionVars().StmtCtx.InVerboseExplain || len(candidates) == len(ds.possibleAccessPaths) { + if len(candidates) == len(ds.possibleAccessPaths) { return "" } if len(candidates) == 1 && len(candidates[0].path.Ranges) == 0 { @@ -806,7 +807,30 @@ func (ds *DataSource) findBestTask(prop *property.PhysicalProperty, planCounter planCounter.Dec(1) return nil, 1, nil } - + if ds.isForUpdateRead && ds.ctx.GetSessionVars().TxnCtx.IsExplicit { + hasPointGetPath := false + for _, path := range ds.possibleAccessPaths { + if ds.isPointGetPath(path) { + hasPointGetPath = true + break + } + } + tblName := ds.tableInfo.Name + ds.possibleAccessPaths, err = filterPathByIsolationRead(ds.ctx, ds.possibleAccessPaths, tblName, ds.DBName) + if err != nil { + return nil, 1, err + } + if hasPointGetPath { + newPaths := make([]*util.AccessPath, 0) + for _, path := range ds.possibleAccessPaths { + // if the path is the point get range path with for update lock, we should forbid tiflash as it's store path (#39543) + if path.StoreType != kv.TiFlash { + newPaths = append(newPaths, path) + } + } + ds.possibleAccessPaths = newPaths + } + } t = ds.getTask(prop) if t != nil { cntPlan = 1 @@ -865,10 +889,12 @@ func (ds *DataSource) findBestTask(prop *property.PhysicalProperty, planCounter pruningInfo := ds.getPruningInfo(candidates, prop) defer func() { if err == nil && t != nil && !t.invalid() && pruningInfo != "" { - if ds.ctx.GetSessionVars().StmtCtx.OptimInfo == nil { - ds.ctx.GetSessionVars().StmtCtx.OptimInfo = make(map[int]string) + warnErr := errors.New(pruningInfo) + if ds.ctx.GetSessionVars().StmtCtx.InVerboseExplain { + ds.ctx.GetSessionVars().StmtCtx.AppendNote(warnErr) + } else { + ds.ctx.GetSessionVars().StmtCtx.AppendExtraNote(warnErr) } - ds.ctx.GetSessionVars().StmtCtx.OptimInfo[t.plan().ID()] = pruningInfo } }() @@ -902,7 +928,7 @@ func (ds *DataSource) findBestTask(prop *property.PhysicalProperty, planCounter if len(path.Ranges) == 0 { // We should uncache the tableDual plan. if expression.MaybeOverOptimized4PlanCache(ds.ctx, path.AccessConds) { - ds.ctx.GetSessionVars().StmtCtx.SkipPlanCache = true + ds.ctx.GetSessionVars().StmtCtx.SetSkipPlanCache(errors.Errorf("skip plan-cache: get a TableDual plan")) } dual := PhysicalTableDual{}.Init(ds.ctx, ds.stats, ds.blockOffset) dual.SetSchema(ds.schema) @@ -912,11 +938,15 @@ func (ds *DataSource) findBestTask(prop *property.PhysicalProperty, planCounter p: dual, }, cntPlan, nil } + canConvertPointGet := len(path.Ranges) > 0 && path.StoreType == kv.TiKV && ds.isPointGetConvertableSchema() if canConvertPointGet && expression.MaybeOverOptimized4PlanCache(ds.ctx, path.AccessConds) { canConvertPointGet = ds.canConvertToPointGetForPlanCache(path) } + if canConvertPointGet && path.Index != nil && path.Index.MVIndex { + canConvertPointGet = false // cannot use PointGet upon MVIndex + } if canConvertPointGet && !path.IsIntHandlePath { // We simply do not build [batch] point get for prefix indexes. This can be optimized. @@ -1108,6 +1138,8 @@ func (ds *DataSource) convertToIndexMergeScan(prop *property.PhysicalProperty, c } cop.tablePlan = ts cop.idxMergePartPlans = scans + cop.idxMergeIsIntersection = path.IndexMergeIsIntersection + cop.idxMergeAccessMVIndex = path.IndexMergeAccessMVIndex if remainingFilters != nil { cop.rootTaskConds = remainingFilters } @@ -1120,7 +1152,7 @@ func (ds *DataSource) convertToPartialIndexScan(prop *property.PhysicalProperty, is := ds.getOriginalPhysicalIndexScan(prop, path, false, false) // TODO: Consider using isIndexCoveringColumns() to avoid another TableRead indexConds := path.IndexFilters - if indexConds != nil { + if len(indexConds) > 0 { var selectivity float64 if path.CountAfterAccess > 0 { selectivity = path.CountAfterIndex / path.CountAfterAccess @@ -1390,6 +1422,12 @@ func (ds *DataSource) addSelection4PlanCache(task *rootTask, stats *property.Sta // convertToIndexScan converts the DataSource to index scan with idx. func (ds *DataSource) convertToIndexScan(prop *property.PhysicalProperty, candidate *candidatePath, _ *physicalOptimizeOp) (task task, err error) { + if candidate.path.Index.MVIndex { + // MVIndex is special since different index rows may return the same _row_id and this can break some assumptions of IndexReader. + // Currently only support using IndexMerge to access MVIndex instead of IndexReader. + // TODO: make IndexReader support accessing MVIndex directly. + return invalidTask, nil + } if !candidate.path.IsSingleScan { // If it's parent requires single read task, return max cost. if prop.TaskTp == property.CopSingleReadTaskType { @@ -1402,6 +1440,14 @@ func (ds *DataSource) convertToIndexScan(prop *property.PhysicalProperty, if !prop.IsSortItemEmpty() && !candidate.isMatchProp { return invalidTask, nil } + // If we need to keep order for the index scan, we should forbid the non-keep-order index scan when we try to generate the path. + if prop.IsSortItemEmpty() && candidate.path.ForceKeepOrder { + return invalidTask, nil + } + // If we don't need to keep order for the index scan, we should forbid the non-keep-order index scan when we try to generate the path. + if !prop.IsSortItemEmpty() && candidate.path.ForceNoKeepOrder { + return invalidTask, nil + } path := candidate.path is := ds.getOriginalPhysicalIndexScan(prop, path, candidate.isMatchProp, candidate.path.IsSingleScan) cop := &copTask{ @@ -1449,16 +1495,16 @@ func (ds *DataSource) convertToIndexScan(prop *property.PhysicalProperty, } } if candidate.isMatchProp { - if cop.tablePlan != nil && !ds.tableInfo.IsCommonHandle { - col, isNew := cop.tablePlan.(*PhysicalTableScan).appendExtraHandleCol(ds) - cop.extraHandleCol = col - cop.needExtraProj = cop.needExtraProj || isNew - } cop.keepOrder = true // IndexScan on partition table can't keep order. if ds.tableInfo.GetPartitionInfo() != nil { return invalidTask, nil } + if cop.tablePlan != nil && !ds.tableInfo.IsCommonHandle { + col, isNew := cop.tablePlan.(*PhysicalTableScan).appendExtraHandleCol(ds) + cop.extraHandleCol = col + cop.needExtraProj = cop.needExtraProj || isNew + } } if cop.needExtraProj { cop.originSchema = ds.schema @@ -1902,6 +1948,36 @@ func (s *LogicalIndexScan) GetPhysicalIndexScan(_ *expression.Schema, stats *pro return is } +// isPointGetPath indicates whether the conditions are point-get-able. +// eg: create table t(a int, b int,c int unique, primary (a,b)) +// select * from t where a = 1 and b = 1 and c =1; +// the datasource can access by primary key(a,b) or unique key c which are both point-get-able +func (ds *DataSource) isPointGetPath(path *util.AccessPath) bool { + if len(path.Ranges) < 1 { + return false + } + if !path.IsIntHandlePath { + if path.Index == nil { + return false + } + if !path.Index.Unique || path.Index.HasPrefixIndex() { + return false + } + idxColsLen := len(path.Index.Columns) + for _, ran := range path.Ranges { + if len(ran.LowVal) != idxColsLen { + return false + } + } + } + for _, ran := range path.Ranges { + if !ran.IsPointNonNullable(ds.ctx) { + return false + } + } + return true +} + // convertToTableScan converts the DataSource to table scan. func (ds *DataSource) convertToTableScan(prop *property.PhysicalProperty, candidate *candidatePath, _ *physicalOptimizeOp) (task task, err error) { // It will be handled in convertToIndexScan. @@ -1911,30 +1987,38 @@ func (ds *DataSource) convertToTableScan(prop *property.PhysicalProperty, candid if !prop.IsSortItemEmpty() && !candidate.isMatchProp { return invalidTask, nil } + // If we need to keep order for the index scan, we should forbid the non-keep-order index scan when we try to generate the path. + if prop.IsSortItemEmpty() && candidate.path.ForceKeepOrder { + return invalidTask, nil + } + // If we don't need to keep order for the index scan, we should forbid the non-keep-order index scan when we try to generate the path. + if !prop.IsSortItemEmpty() && candidate.path.ForceNoKeepOrder { + return invalidTask, nil + } ts, _ := ds.getOriginalPhysicalTableScan(prop, candidate.path, candidate.isMatchProp) if ts.KeepOrder && ts.StoreType == kv.TiFlash && (ts.Desc || ds.SCtx().GetSessionVars().TiFlashFastScan) { // TiFlash fast mode(https://github.com/pingcap/tidb/pull/35851) does not keep order in TableScan return invalidTask, nil } if ts.StoreType == kv.TiFlash { - for _, col := range ts.schema.Columns { - // In theory, TiFlash does not support virtual expr, but in non-mpp mode, if the cop request only contain table scan, then - // TiDB will fill the virtual column after decoding the cop response(executor.FillVirtualColumnValue), that is to say, the virtual - // columns in Cop request is just a placeholder, so TiFlash can support virtual column in cop request mode. However, virtual column - // with TiDBShard is special, it can be added using create index statement, TiFlash's ddl does not handle create index statement, so - // there is a chance that the TiDBShard's virtual column is not seen by TiFlash, in this case, TiFlash will throw column not found error - if ds.containExprPrefixUk && expression.GcColumnExprIsTidbShard(col.VirtualExpr) { - ds.SCtx().GetSessionVars().RaiseWarningWhenMPPEnforced("MPP mode may be blocked because column `" + col.OrigName + "` is a virtual column which is not supported now.") - return invalidTask, nil + for _, col := range ts.Columns { + if col.IsGenerated() && !col.GeneratedStored { + col.AddFlag(mysql.GeneratedColumnFlag) } } } - if prop.TaskTp == property.MppTaskType { + // In disaggregated tiflash mode, only MPP is allowed, cop and batchCop is deprecated. + // So if prop.TaskTp is RootTaskType, have to use mppTask then convert to rootTask. + isDisaggregatedTiFlash := config.GetGlobalConfig().DisaggregatedTiFlash + isDisaggregatedTiFlashPath := isDisaggregatedTiFlash && ts.StoreType == kv.TiFlash + canMppConvertToRootForDisaggregatedTiFlash := isDisaggregatedTiFlashPath && prop.TaskTp == property.RootTaskType && ds.SCtx().GetSessionVars().IsMPPAllowed() + if prop.TaskTp == property.MppTaskType || canMppConvertToRootForDisaggregatedTiFlash { if ts.KeepOrder { return invalidTask, nil } - if prop.MPPPartitionTp != property.AnyType || ts.isPartition { + if prop.MPPPartitionTp != property.AnyType || (ts.isPartition && !isDisaggregatedTiFlash) { // If ts is a single partition, then this partition table is in static-only prune, then we should not choose mpp execution. + // But in disaggregated tiflash mode, we enable using mpp for static pruning partition table, because cop and batchCop is deprecated. ds.SCtx().GetSessionVars().RaiseWarningWhenMPPEnforced("MPP mode may be blocked because table `" + ds.tableInfo.Name.O + "`is a partition table which is not supported when `@@tidb_partition_prune_mode=static`.") return invalidTask, nil } @@ -1945,8 +2029,9 @@ func (ds *DataSource) convertToTableScan(prop *property.PhysicalProperty, candid } } mppTask := &mppTask{ - p: ts, - partTp: property.AnyType, + p: ts, + partTp: property.AnyType, + tblColHists: ds.TblColHists, } ts.PartitionInfo = PartitionInfo{ PruningConds: pushDownNot(ds.ctx, ds.allConds), @@ -1955,7 +2040,30 @@ func (ds *DataSource) convertToTableScan(prop *property.PhysicalProperty, candid ColumnNames: ds.names, } mppTask = ts.addPushedDownSelectionToMppTask(mppTask, ds.stats.ScaleByExpectCnt(prop.ExpectedCnt)) - return mppTask, nil + task = mppTask + if !mppTask.invalid() { + if prop.TaskTp == property.MppTaskType && len(mppTask.rootTaskConds) > 0 { + // If got filters cannot be pushed down to tiflash, we have to make sure it will be executed in TiDB, + // So have to return a rootTask, but prop requires mppTask, cannot meet this requirement. + task = invalidTask + } else if prop.TaskTp == property.RootTaskType { + // When got here, canMppConvertToRootForDisaggregatedTiFlash is true. + // This is for situations like cannot generate mppTask for some operators. + // Such as when the build side of HashJoin is Projection, + // which cannot pushdown to tiflash(because TiFlash doesn't support some expr in Proj) + // So HashJoin cannot pushdown to tiflash. But we still want TableScan to run on tiflash. + task = mppTask + task = task.convertToRootTask(ds.ctx) + if !task.invalid() { + ds.addSelection4PlanCache(task.(*rootTask), ds.stats.ScaleByExpectCnt(prop.ExpectedCnt), prop) + } + } + } + return task, nil + } + if isDisaggregatedTiFlashPath { + // prop.TaskTp is cop related, just return invalidTask. + return invalidTask, nil } copTask := &copTask{ tablePlan: ts, @@ -2165,10 +2273,8 @@ func (ts *PhysicalTableScan) addPushedDownSelectionToMppTask(mpp *mppTask, stats filterCondition, rootTaskConds := SplitSelCondsWithVirtualColumn(ts.filterCondition) var newRootConds []expression.Expression filterCondition, newRootConds = expression.PushDownExprs(ts.ctx.GetSessionVars().StmtCtx, filterCondition, ts.ctx.GetClient(), ts.StoreType) - rootTaskConds = append(rootTaskConds, newRootConds...) - if len(rootTaskConds) > 0 { - return &mppTask{} - } + mpp.rootTaskConds = append(rootTaskConds, newRootConds...) + ts.filterCondition = filterCondition // Add filter condition to table plan now. if len(ts.filterCondition) > 0 { @@ -2288,6 +2394,7 @@ func (ds *DataSource) getOriginalPhysicalIndexScan(prop *property.PhysicalProper physicalTableID: ds.physicalTableID, tblColHists: ds.TblColHists, pkIsHandleCol: ds.getPKIsHandleCol(), + constColsByCond: path.ConstCols, prop: prop, }.Init(ds.ctx, ds.blockOffset) statsTbl := ds.statisticTable diff --git a/planner/core/flat_plan.go b/planner/core/flat_plan.go index ed283ee7ece93..da200961e821c 100644 --- a/planner/core/flat_plan.go +++ b/planner/core/flat_plan.go @@ -15,6 +15,8 @@ package core import ( + "sort" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/util/texttree" ) @@ -52,23 +54,34 @@ type FlatPhysicalPlan struct { // depth-first traversal plus some special rule for some operators. type FlatPlanTree []*FlatOperator -// GetSelectPlan skips Insert, Delete and Update at the beginning of the FlatPlanTree. +// GetSelectPlan skips Insert, Delete, and Update at the beginning of the FlatPlanTree and the foreign key check/cascade plan at the end of the FlatPlanTree. // Note: // // It returns a reference to the original FlatPlanTree, please avoid modifying the returned value. -// Since you get a part of the original slice, you need to adjust the FlatOperator.Depth and FlatOperator.ChildrenIdx when using them. -func (e FlatPlanTree) GetSelectPlan() FlatPlanTree { +// The second return value is the offset. Because the returned FlatPlanTree is a part of the original slice, you need to minus them by the offset when using the returned FlatOperator.Depth and FlatOperator.ChildrenIdx. +func (e FlatPlanTree) GetSelectPlan() (FlatPlanTree, int) { if len(e) == 0 { - return nil + return nil, 0 } + hasDML := false for i, op := range e { switch op.Origin.(type) { case *Insert, *Delete, *Update: + hasDML = true default: - return e[i:] + if hasDML { + for j := i; j < len(e); j++ { + switch e[j].Origin.(type) { + case *FKCheck, *FKCascade: + // The later plans are belong to foreign key check/cascade plans, doesn't belong to select plan, just skip it. + return e[i:j], i + } + } + } + return e[i:], i } } - return nil + return nil, 0 } // FlatOperator is a simplified operator. @@ -348,26 +361,29 @@ func (f *FlatPhysicalPlan) flattenRecursively(p Plan, info *operatorCtx, target if plan.SelectPlan != nil { childCtx.isRoot = true childCtx.label = Empty - childCtx.isLastChild = true + childCtx.isLastChild = len(plan.FKChecks) == 0 && len(plan.FKCascades) == 0 target, childIdx = f.flattenRecursively(plan.SelectPlan, childCtx, target) childIdxs = append(childIdxs, childIdx) } + target, childIdxs = f.flattenForeignKeyChecksAndCascades(childCtx, target, childIdxs, plan.FKChecks, plan.FKCascades, true) case *Update: if plan.SelectPlan != nil { childCtx.isRoot = true childCtx.label = Empty - childCtx.isLastChild = true + childCtx.isLastChild = len(plan.FKChecks) == 0 && len(plan.FKCascades) == 0 target, childIdx = f.flattenRecursively(plan.SelectPlan, childCtx, target) childIdxs = append(childIdxs, childIdx) } + target, childIdxs = f.flattenForeignKeyChecksAndCascadesMap(childCtx, target, childIdxs, plan.FKChecks, plan.FKCascades) case *Delete: if plan.SelectPlan != nil { childCtx.isRoot = true childCtx.label = Empty - childCtx.isLastChild = true + childCtx.isLastChild = len(plan.FKChecks) == 0 && len(plan.FKCascades) == 0 target, childIdx = f.flattenRecursively(plan.SelectPlan, childCtx, target) childIdxs = append(childIdxs, childIdx) } + target, childIdxs = f.flattenForeignKeyChecksAndCascadesMap(childCtx, target, childIdxs, plan.FKChecks, plan.FKCascades) case *Execute: f.InExecute = true if plan.Plan != nil { @@ -393,6 +409,13 @@ func (f *FlatPhysicalPlan) flattenRecursively(p Plan, info *operatorCtx, target target, childIdx = f.flattenRecursively(plan.TargetPlan, initInfo, target) childIdxs = append(childIdxs, childIdx) } + case *FKCascade: + for i, child := range plan.CascadePlans { + childCtx.label = Empty + childCtx.isLastChild = i == len(plan.CascadePlans)-1 + target, childIdx = f.flattenRecursively(child, childCtx, target) + childIdxs = append(childIdxs, childIdx) + } } if flat != nil { flat.ChildrenIdx = childIdxs @@ -401,6 +424,50 @@ func (f *FlatPhysicalPlan) flattenRecursively(p Plan, info *operatorCtx, target return target, idx } +func (f *FlatPhysicalPlan) flattenForeignKeyChecksAndCascadesMap(childCtx *operatorCtx, target FlatPlanTree, childIdxs []int, fkChecksMap map[int64][]*FKCheck, fkCascadesMap map[int64][]*FKCascade) (FlatPlanTree, []int) { + tids := make([]int64, 0, len(fkChecksMap)) + for tid := range fkChecksMap { + tids = append(tids, tid) + } + // Sort by table id for explain result stable. + sort.Slice(tids, func(i, j int) bool { + return tids[i] < tids[j] + }) + for i, tid := range tids { + target, childIdxs = f.flattenForeignKeyChecksAndCascades(childCtx, target, childIdxs, fkChecksMap[tid], nil, len(fkCascadesMap) == 0 && i == len(tids)-1) + } + tids = tids[:0] + for tid := range fkCascadesMap { + tids = append(tids, tid) + } + sort.Slice(tids, func(i, j int) bool { + return tids[i] < tids[j] + }) + for i, tid := range tids { + target, childIdxs = f.flattenForeignKeyChecksAndCascades(childCtx, target, childIdxs, nil, fkCascadesMap[tid], i == len(tids)-1) + } + return target, childIdxs +} + +func (f *FlatPhysicalPlan) flattenForeignKeyChecksAndCascades(childCtx *operatorCtx, target FlatPlanTree, childIdxs []int, fkChecks []*FKCheck, fkCascades []*FKCascade, isLast bool) (FlatPlanTree, []int) { + var childIdx int + for i, fkCheck := range fkChecks { + childCtx.isRoot = true + childCtx.label = Empty + childCtx.isLastChild = isLast && len(fkCascades) == 0 && i == len(fkChecks)-1 + target, childIdx = f.flattenRecursively(fkCheck, childCtx, target) + childIdxs = append(childIdxs, childIdx) + } + for i, fkCascade := range fkCascades { + childCtx.isRoot = true + childCtx.label = Empty + childCtx.isLastChild = isLast && i == len(fkCascades)-1 + target, childIdx = f.flattenRecursively(fkCascade, childCtx, target) + childIdxs = append(childIdxs, childIdx) + } + return target, childIdxs +} + func (f *FlatPhysicalPlan) flattenCTERecursively(cteDef *CTEDefinition, info *operatorCtx, target FlatPlanTree) FlatPlanTree { flat := f.flattenSingle(cteDef, info) if flat != nil { diff --git a/planner/core/foreign_key.go b/planner/core/foreign_key.go index 6ee715380f8ba..f6cec0fa8f069 100644 --- a/planner/core/foreign_key.go +++ b/planner/core/foreign_key.go @@ -15,6 +15,7 @@ package core import ( + "fmt" "unsafe" "github.com/pingcap/errors" @@ -27,6 +28,7 @@ import ( // FKCheck indicates the foreign key constraint checker. type FKCheck struct { + basePhysicalPlan FK *model.FKInfo ReferredFK *model.ReferredFKInfo Tbl table.Table @@ -42,12 +44,17 @@ type FKCheck struct { // FKCascade indicates the foreign key constraint cascade behaviour. type FKCascade struct { + basePhysicalPlan Tp FKCascadeType ReferredFK *model.ReferredFKInfo ChildTable table.Table FK *model.FKInfo FKCols []*model.ColumnInfo FKIdx *model.IndexInfo + // CascadePlans contains the child cascade plan. + // CascadePlans will be filled during execution, so only `explain analyze` statement result contains the cascade plan, + // `explain` statement result doesn't contain the cascade plan. + CascadePlans []Plan } // FKCascadeType indicates in which (delete/update) statements. @@ -63,6 +70,30 @@ const ( emptyFkCascadeSize = int64(unsafe.Sizeof(FKCascade{})) ) +// AccessObject implements dataAccesser interface. +func (f *FKCheck) AccessObject() AccessObject { + if f.Idx == nil { + return OtherAccessObject(fmt.Sprintf("table:%s", f.Tbl.Meta().Name)) + } + return OtherAccessObject(fmt.Sprintf("table:%s, index:%s", f.Tbl.Meta().Name, f.Idx.Meta().Name)) +} + +// OperatorInfo implements dataAccesser interface. +func (f *FKCheck) OperatorInfo(normalized bool) string { + if f.FK != nil { + return fmt.Sprintf("foreign_key:%s, check_exist", f.FK.Name) + } + if f.ReferredFK != nil { + return fmt.Sprintf("foreign_key:%s, check_not_exist", f.ReferredFK.ChildFKName) + } + return "" +} + +// ExplainInfo implement Plan interface. +func (f *FKCheck) ExplainInfo() string { + return f.AccessObject().String() + ", " + f.OperatorInfo(false) +} + // MemoryUsage return the memory usage of FKCheck func (f *FKCheck) MemoryUsage() (sum int64) { if f == nil { @@ -76,6 +107,30 @@ func (f *FKCheck) MemoryUsage() (sum int64) { return } +// AccessObject implements dataAccesser interface. +func (f *FKCascade) AccessObject() AccessObject { + if f.FKIdx == nil { + return OtherAccessObject(fmt.Sprintf("table:%s", f.ChildTable.Meta().Name)) + } + return OtherAccessObject(fmt.Sprintf("table:%s, index:%s", f.ChildTable.Meta().Name, f.FKIdx.Name)) +} + +// OperatorInfo implements dataAccesser interface. +func (f *FKCascade) OperatorInfo(normalized bool) string { + switch f.Tp { + case FKCascadeOnDelete: + return fmt.Sprintf("foreign_key:%s, on_delete:%s", f.FK.Name, model.ReferOptionType(f.FK.OnDelete).String()) + case FKCascadeOnUpdate: + return fmt.Sprintf("foreign_key:%s, on_update:%s", f.FK.Name, model.ReferOptionType(f.FK.OnUpdate).String()) + } + return "" +} + +// ExplainInfo implement Plan interface. +func (f *FKCascade) ExplainInfo() string { + return f.AccessObject().String() + ", " + f.OperatorInfo(false) +} + // MemoryUsage return the memory usage of FKCascade func (f *FKCascade) MemoryUsage() (sum int64) { if f == nil { @@ -94,7 +149,18 @@ func (p *Insert) buildOnInsertFKTriggers(ctx sessionctx.Context, is infoschema.I fkCascades := make([]*FKCascade, 0, len(tblInfo.ForeignKeys)) updateCols := p.buildOnDuplicateUpdateColumns() if len(updateCols) > 0 { - referredFKChecks, referredFKCascades, err := buildOnUpdateReferredFKTriggers(is, dbName, tblInfo, updateCols) + referredFKChecks, referredFKCascades, err := buildOnUpdateReferredFKTriggers(ctx, is, dbName, tblInfo, updateCols) + if err != nil { + return err + } + if len(referredFKChecks) > 0 { + fkChecks = append(fkChecks, referredFKChecks...) + } + if len(referredFKCascades) > 0 { + fkCascades = append(fkCascades, referredFKCascades...) + } + } else if p.IsReplace { + referredFKChecks, referredFKCascades, err := p.buildOnReplaceReferredFKTriggers(ctx, is, dbName, tblInfo) if err != nil { return err } @@ -110,7 +176,7 @@ func (p *Insert) buildOnInsertFKTriggers(ctx sessionctx.Context, is infoschema.I continue } failedErr := ErrNoReferencedRow2.FastGenByArgs(fk.String(dbName, tblInfo.Name.L)) - fkCheck, err := buildFKCheckOnModifyChildTable(is, fk, failedErr) + fkCheck, err := buildFKCheckOnModifyChildTable(ctx, is, fk, failedErr) if err != nil { return err } @@ -131,6 +197,25 @@ func (p *Insert) buildOnDuplicateUpdateColumns() map[string]struct{} { return m } +func (p *Insert) buildOnReplaceReferredFKTriggers(ctx sessionctx.Context, is infoschema.InfoSchema, dbName string, tblInfo *model.TableInfo) ([]*FKCheck, []*FKCascade, error) { + referredFKs := is.GetTableReferredForeignKeys(dbName, tblInfo.Name.L) + fkChecks := make([]*FKCheck, 0, len(referredFKs)) + fkCascades := make([]*FKCascade, 0, len(referredFKs)) + for _, referredFK := range referredFKs { + fkCheck, fkCascade, err := buildOnDeleteOrUpdateFKTrigger(ctx, is, referredFK, FKCascadeOnDelete) + if err != nil { + return nil, nil, err + } + if fkCheck != nil { + fkChecks = append(fkChecks, fkCheck) + } + if fkCascade != nil { + fkCascades = append(fkCascades, fkCascade) + } + } + return fkChecks, fkCascades, nil +} + func (updt *Update) buildOnUpdateFKTriggers(ctx sessionctx.Context, is infoschema.InfoSchema, tblID2table map[int64]table.Table) error { if !ctx.GetSessionVars().ForeignKeyChecks { return nil @@ -149,7 +234,7 @@ func (updt *Update) buildOnUpdateFKTriggers(ctx sessionctx.Context, is infoschem if len(updateCols) == 0 { continue } - referredFKChecks, referredFKCascades, err := buildOnUpdateReferredFKTriggers(is, dbInfo.Name.L, tblInfo, updateCols) + referredFKChecks, referredFKCascades, err := buildOnUpdateReferredFKTriggers(ctx, is, dbInfo.Name.L, tblInfo, updateCols) if err != nil { return err } @@ -159,7 +244,7 @@ func (updt *Update) buildOnUpdateFKTriggers(ctx sessionctx.Context, is infoschem if len(referredFKCascades) > 0 { fkCascades[tid] = append(fkCascades[tid], referredFKCascades...) } - childFKChecks, err := buildOnUpdateChildFKChecks(is, dbInfo.Name.L, tblInfo, updateCols) + childFKChecks, err := buildOnUpdateChildFKChecks(ctx, is, dbInfo.Name.L, tblInfo, updateCols) if err != nil { return err } @@ -186,7 +271,7 @@ func (del *Delete) buildOnDeleteFKTriggers(ctx sessionctx.Context, is infoschema } referredFKs := is.GetTableReferredForeignKeys(dbInfo.Name.L, tblInfo.Name.L) for _, referredFK := range referredFKs { - fkCheck, fkCascade, err := buildOnDeleteOrUpdateFKTrigger(is, referredFK, FKCascadeOnDelete) + fkCheck, fkCascade, err := buildOnDeleteOrUpdateFKTrigger(ctx, is, referredFK, FKCascadeOnDelete) if err != nil { return err } @@ -203,7 +288,7 @@ func (del *Delete) buildOnDeleteFKTriggers(ctx sessionctx.Context, is infoschema return nil } -func buildOnUpdateReferredFKTriggers(is infoschema.InfoSchema, dbName string, tblInfo *model.TableInfo, updateCols map[string]struct{}) ([]*FKCheck, []*FKCascade, error) { +func buildOnUpdateReferredFKTriggers(ctx sessionctx.Context, is infoschema.InfoSchema, dbName string, tblInfo *model.TableInfo, updateCols map[string]struct{}) ([]*FKCheck, []*FKCascade, error) { referredFKs := is.GetTableReferredForeignKeys(dbName, tblInfo.Name.L) fkChecks := make([]*FKCheck, 0, len(referredFKs)) fkCascades := make([]*FKCascade, 0, len(referredFKs)) @@ -211,7 +296,7 @@ func buildOnUpdateReferredFKTriggers(is infoschema.InfoSchema, dbName string, tb if !isMapContainAnyCols(updateCols, referredFK.Cols...) { continue } - fkCheck, fkCascade, err := buildOnDeleteOrUpdateFKTrigger(is, referredFK, FKCascadeOnUpdate) + fkCheck, fkCascade, err := buildOnDeleteOrUpdateFKTrigger(ctx, is, referredFK, FKCascadeOnUpdate) if err != nil { return nil, nil, err } @@ -225,7 +310,7 @@ func buildOnUpdateReferredFKTriggers(is infoschema.InfoSchema, dbName string, tb return fkChecks, fkCascades, nil } -func buildOnUpdateChildFKChecks(is infoschema.InfoSchema, dbName string, tblInfo *model.TableInfo, updateCols map[string]struct{}) ([]*FKCheck, error) { +func buildOnUpdateChildFKChecks(ctx sessionctx.Context, is infoschema.InfoSchema, dbName string, tblInfo *model.TableInfo, updateCols map[string]struct{}) ([]*FKCheck, error) { fkChecks := make([]*FKCheck, 0, len(tblInfo.ForeignKeys)) for _, fk := range tblInfo.ForeignKeys { if fk.Version < 1 { @@ -235,7 +320,7 @@ func buildOnUpdateChildFKChecks(is infoschema.InfoSchema, dbName string, tblInfo continue } failedErr := ErrNoReferencedRow2.FastGenByArgs(fk.String(dbName, tblInfo.Name.L)) - fkCheck, err := buildFKCheckOnModifyChildTable(is, fk, failedErr) + fkCheck, err := buildFKCheckOnModifyChildTable(ctx, is, fk, failedErr) if err != nil { return nil, err } @@ -280,7 +365,7 @@ func (updt *Update) buildTbl2UpdateColumns() map[int64]map[string]struct{} { return tblID2UpdateColumns } -func buildOnDeleteOrUpdateFKTrigger(is infoschema.InfoSchema, referredFK *model.ReferredFKInfo, tp FKCascadeType) (*FKCheck, *FKCascade, error) { +func buildOnDeleteOrUpdateFKTrigger(ctx sessionctx.Context, is infoschema.InfoSchema, referredFK *model.ReferredFKInfo, tp FKCascadeType) (*FKCheck, *FKCascade, error) { childTable, err := is.TableByName(referredFK.ChildSchema, referredFK.ChildTable) if err != nil { return nil, nil, nil @@ -302,10 +387,10 @@ func buildOnDeleteOrUpdateFKTrigger(is infoschema.InfoSchema, referredFK *model. } switch fkReferOption { case model.ReferOptionCascade, model.ReferOptionSetNull: - fkCascade, err := buildFKCascade(tp, referredFK, childTable, fk) + fkCascade, err := buildFKCascade(ctx, tp, referredFK, childTable, fk) return nil, fkCascade, err default: - fkCheck, err := buildFKCheckForReferredFK(childTable, fk, referredFK) + fkCheck, err := buildFKCheckForReferredFK(ctx, childTable, fk, referredFK) return fkCheck, nil, err } } @@ -320,12 +405,12 @@ func isMapContainAnyCols(colsMap map[string]struct{}, cols ...model.CIStr) bool return false } -func buildFKCheckOnModifyChildTable(is infoschema.InfoSchema, fk *model.FKInfo, failedErr error) (*FKCheck, error) { +func buildFKCheckOnModifyChildTable(ctx sessionctx.Context, is infoschema.InfoSchema, fk *model.FKInfo, failedErr error) (*FKCheck, error) { referTable, err := is.TableByName(fk.RefSchema, fk.RefTable) if err != nil { return nil, nil } - fkCheck, err := buildFKCheck(referTable, fk.RefCols, failedErr) + fkCheck, err := buildFKCheck(ctx, referTable, fk.RefCols, failedErr) if err != nil { return nil, err } @@ -334,21 +419,9 @@ func buildFKCheckOnModifyChildTable(is infoschema.InfoSchema, fk *model.FKInfo, return fkCheck, nil } -func buildFKCheckOnModifyReferTable(is infoschema.InfoSchema, referredFK *model.ReferredFKInfo) (*FKCheck, error) { - childTable, err := is.TableByName(referredFK.ChildSchema, referredFK.ChildTable) - if err != nil { - return nil, nil - } - fk := model.FindFKInfoByName(childTable.Meta().ForeignKeys, referredFK.ChildFKName.L) - if fk == nil || fk.Version < 1 { - return nil, nil - } - return buildFKCheckForReferredFK(childTable, fk, referredFK) -} - -func buildFKCheckForReferredFK(childTable table.Table, fk *model.FKInfo, referredFK *model.ReferredFKInfo) (*FKCheck, error) { +func buildFKCheckForReferredFK(ctx sessionctx.Context, childTable table.Table, fk *model.FKInfo, referredFK *model.ReferredFKInfo) (*FKCheck, error) { failedErr := ErrRowIsReferenced2.GenWithStackByArgs(fk.String(referredFK.ChildSchema.L, referredFK.ChildTable.L)) - fkCheck, err := buildFKCheck(childTable, fk.Cols, failedErr) + fkCheck, err := buildFKCheck(ctx, childTable, fk.Cols, failedErr) if err != nil { return nil, err } @@ -357,21 +430,21 @@ func buildFKCheckForReferredFK(childTable table.Table, fk *model.FKInfo, referre return fkCheck, nil } -func buildFKCheck(tbl table.Table, cols []model.CIStr, failedErr error) (*FKCheck, error) { +func buildFKCheck(ctx sessionctx.Context, tbl table.Table, cols []model.CIStr, failedErr error) (*FKCheck, error) { tblInfo := tbl.Meta() if tblInfo.PKIsHandle && len(cols) == 1 { refColInfo := model.FindColumnInfo(tblInfo.Columns, cols[0].L) if refColInfo != nil && mysql.HasPriKeyFlag(refColInfo.GetFlag()) { - return &FKCheck{ + return FKCheck{ Tbl: tbl, IdxIsPrimaryKey: true, IdxIsExclusive: true, FailedErr: failedErr, - }, nil + }.Init(ctx), nil } } - referTbIdxInfo := model.FindIndexByColumns(tblInfo, cols...) + referTbIdxInfo := model.FindIndexByColumns(tblInfo, tblInfo.Indices, cols...) if referTbIdxInfo == nil { return nil, failedErr } @@ -385,16 +458,16 @@ func buildFKCheck(tbl table.Table, cols []model.CIStr, failedErr error) (*FKChec return nil, failedErr } - return &FKCheck{ + return FKCheck{ Tbl: tbl, Idx: tblIdx, IdxIsExclusive: len(cols) == len(referTbIdxInfo.Columns), IdxIsPrimaryKey: referTbIdxInfo.Primary && tblInfo.IsCommonHandle, FailedErr: failedErr, - }, nil + }.Init(ctx), nil } -func buildFKCascade(tp FKCascadeType, referredFK *model.ReferredFKInfo, childTable table.Table, fk *model.FKInfo) (*FKCascade, error) { +func buildFKCascade(ctx sessionctx.Context, tp FKCascadeType, referredFK *model.ReferredFKInfo, childTable table.Table, fk *model.FKInfo) (*FKCascade, error) { cols := make([]*model.ColumnInfo, len(fk.Cols)) childTableColumns := childTable.Meta().Columns for i, c := range fk.Cols { @@ -404,20 +477,20 @@ func buildFKCascade(tp FKCascadeType, referredFK *model.ReferredFKInfo, childTab } cols[i] = col } - fkCascade := &FKCascade{ + fkCascade := FKCascade{ Tp: tp, ReferredFK: referredFK, ChildTable: childTable, FK: fk, FKCols: cols, - } + }.Init(ctx) if childTable.Meta().PKIsHandle && len(cols) == 1 { refColInfo := model.FindColumnInfo(childTableColumns, cols[0].Name.L) if refColInfo != nil && mysql.HasPriKeyFlag(refColInfo.GetFlag()) { return fkCascade, nil } } - indexForFK := model.FindIndexByColumns(childTable.Meta(), fk.Cols...) + indexForFK := model.FindIndexByColumns(childTable.Meta(), childTable.Meta().Indices, fk.Cols...) if indexForFK == nil { return nil, errors.Errorf("Missing index for '%s' foreign key columns in the table '%s'", fk.Name, childTable.Meta().Name) } diff --git a/planner/core/fragment.go b/planner/core/fragment.go index 5dfa93186826f..1a4f5e6c61f9b 100644 --- a/planner/core/fragment.go +++ b/planner/core/fragment.go @@ -16,10 +16,12 @@ package core import ( "context" + "sync/atomic" "time" "unsafe" "github.com/pingcap/errors" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" @@ -79,29 +81,47 @@ type tasksAndFrags struct { } type mppTaskGenerator struct { - ctx sessionctx.Context - startTS uint64 - is infoschema.InfoSchema - frags []*Fragment - cache map[int]tasksAndFrags + ctx sessionctx.Context + startTS uint64 + mppQueryID kv.MPPQueryID + is infoschema.InfoSchema + frags []*Fragment + cache map[int]tasksAndFrags } // GenerateRootMPPTasks generate all mpp tasks and return root ones. -func GenerateRootMPPTasks(ctx sessionctx.Context, startTs uint64, sender *PhysicalExchangeSender, is infoschema.InfoSchema) ([]*Fragment, error) { +func GenerateRootMPPTasks(ctx sessionctx.Context, startTs uint64, mppQueryID kv.MPPQueryID, sender *PhysicalExchangeSender, is infoschema.InfoSchema) ([]*Fragment, error) { g := &mppTaskGenerator{ - ctx: ctx, - startTS: startTs, - is: is, - cache: make(map[int]tasksAndFrags), + ctx: ctx, + startTS: startTs, + mppQueryID: mppQueryID, + is: is, + cache: make(map[int]tasksAndFrags), } return g.generateMPPTasks(sender) } +// AllocMPPTaskID allocates task id for mpp tasks. It will reset the task id when the query finished. +func AllocMPPTaskID(ctx sessionctx.Context) int64 { + mppQueryInfo := &ctx.GetSessionVars().StmtCtx.MPPQueryInfo + return mppQueryInfo.AllocatedMPPTaskID.Add(1) +} + +var mppQueryID uint64 = 1 + +// AllocMPPQueryID allocates local query id for mpp queries. +func AllocMPPQueryID() uint64 { + return atomic.AddUint64(&mppQueryID, 1) +} + func (e *mppTaskGenerator) generateMPPTasks(s *PhysicalExchangeSender) ([]*Fragment, error) { - logutil.BgLogger().Info("Mpp will generate tasks", zap.String("plan", ToString(s))) + mppVersion := e.ctx.GetSessionVars().ChooseMppVersion() + logutil.BgLogger().Info("Mpp will generate tasks", zap.String("plan", ToString(s)), zap.Int64("mpp-version", mppVersion.ToInt64())) tidbTask := &kv.MPPTask{ - StartTs: e.startTS, - ID: -1, + StartTs: e.startTS, + MppQueryID: e.mppQueryID, + ID: -1, + MppVersion: mppVersion, } _, frags, err := e.generateMPPTasksForExchangeSender(s) if err != nil { @@ -118,6 +138,8 @@ type mppAddr struct { addr string } +var _ kv.MPPTaskMeta = &mppAddr{} + func (m *mppAddr) GetAddress() string { return m.addr } @@ -132,10 +154,12 @@ func (e *mppTaskGenerator) constructMPPTasksByChildrenTasks(tasks []*kv.MPPTask) _, ok := addressMap[addr] if !ok { mppTask := &kv.MPPTask{ - Meta: &mppAddr{addr: addr}, - ID: e.ctx.GetSessionVars().AllocMPPTaskID(e.startTS), - StartTs: e.startTS, - TableID: -1, + Meta: &mppAddr{addr: addr}, + ID: AllocMPPTaskID(e.ctx), + MppQueryID: e.mppQueryID, + StartTs: e.startTS, + TableID: -1, + MppVersion: e.ctx.GetSessionVars().ChooseMppVersion(), } newTasks = append(newTasks, mppTask) addressMap[addr] = struct{}{} @@ -357,17 +381,30 @@ func (e *mppTaskGenerator) constructMPPTasksImpl(ctx context.Context, ts *Physic var allPartitionsIDs []int64 var err error splitedRanges, _ := distsql.SplitRangesAcrossInt64Boundary(ts.Ranges, false, false, ts.Table.IsCommonHandle) + // True when: + // 0. Is disaggregated tiflash. because in non-disaggregated tiflash, we dont use mpp for static pruning. + // 1. Is partition table. + // 2. Dynamic prune is not used. + var isDisaggregatedTiFlashStaticPrune bool if ts.Table.GetPartitionInfo() != nil { + isDisaggregatedTiFlashStaticPrune = config.GetGlobalConfig().DisaggregatedTiFlash && + !e.ctx.GetSessionVars().StmtCtx.UseDynamicPartitionPrune() + tmp, _ := e.is.TableByID(ts.Table.ID) tbl := tmp.(table.PartitionedTable) - var partitions []table.PhysicalTable - partitions, err = partitionPruning(e.ctx, tbl, ts.PartitionInfo.PruningConds, ts.PartitionInfo.PartitionNames, ts.PartitionInfo.Columns, ts.PartitionInfo.ColumnNames) - if err != nil { - return nil, errors.Trace(err) + if !isDisaggregatedTiFlashStaticPrune { + var partitions []table.PhysicalTable + partitions, err = partitionPruning(e.ctx, tbl, ts.PartitionInfo.PruningConds, ts.PartitionInfo.PartitionNames, ts.PartitionInfo.Columns, ts.PartitionInfo.ColumnNames) + if err != nil { + return nil, errors.Trace(err) + } + req, allPartitionsIDs, err = e.constructMPPBuildTaskReqForPartitionedTable(ts, splitedRanges, partitions) + } else { + singlePartTbl := tbl.GetPartition(ts.physicalTableID) + req, err = e.constructMPPBuildTaskForNonPartitionTable(singlePartTbl.GetPhysicalID(), ts.Table.IsCommonHandle, splitedRanges) } - req, allPartitionsIDs, err = e.constructMPPBuildTaskReqForPartitionedTable(ts, splitedRanges, partitions) } else { - req, err = e.constructMPPBuildTaskForNonPartitionTable(ts, splitedRanges) + req, err = e.constructMPPBuildTaskForNonPartitionTable(ts.Table.ID, ts.Table.IsCommonHandle, splitedRanges) } if err != nil { return nil, errors.Trace(err) @@ -378,14 +415,23 @@ func (e *mppTaskGenerator) constructMPPTasksImpl(ctx context.Context, ts *Physic logutil.BgLogger().Warn("MPP store fail ttl is invalid", zap.Error(err)) ttl = 30 * time.Second } - metas, err := e.ctx.GetMPPClient().ConstructMPPTasks(ctx, req, e.ctx.GetSessionVars().MPPStoreLastFailTime, ttl) + metas, err := e.ctx.GetMPPClient().ConstructMPPTasks(ctx, req, ttl) if err != nil { return nil, errors.Trace(err) } tasks := make([]*kv.MPPTask, 0, len(metas)) for _, meta := range metas { - task := &kv.MPPTask{Meta: meta, ID: e.ctx.GetSessionVars().AllocMPPTaskID(e.startTS), StartTs: e.startTS, TableID: ts.Table.ID, PartitionTableIDs: allPartitionsIDs} + task := &kv.MPPTask{ + Meta: meta, + ID: AllocMPPTaskID(e.ctx), + MppVersion: e.ctx.GetSessionVars().ChooseMppVersion(), + StartTs: e.startTS, + MppQueryID: e.mppQueryID, + TableID: ts.Table.ID, + PartitionTableIDs: allPartitionsIDs, + IsDisaggregatedTiFlashStaticPrune: isDisaggregatedTiFlashStaticPrune, + } tasks = append(tasks, task) } return tasks, nil @@ -406,16 +452,16 @@ func (e *mppTaskGenerator) constructMPPBuildTaskReqForPartitionedTable(ts *Physi return nil, nil, errors.Trace(err) } partitionIDAndRanges[i].ID = pid - partitionIDAndRanges[i].KeyRanges = kvRanges + partitionIDAndRanges[i].KeyRanges = kvRanges.FirstPartitionRange() allPartitionsIDs[i] = pid } return &kv.MPPBuildTasksRequest{PartitionIDAndRanges: partitionIDAndRanges}, allPartitionsIDs, nil } -func (e *mppTaskGenerator) constructMPPBuildTaskForNonPartitionTable(ts *PhysicalTableScan, splitedRanges []*ranger.Range) (*kv.MPPBuildTasksRequest, error) { - kvRanges, err := distsql.TableHandleRangesToKVRanges(e.ctx.GetSessionVars().StmtCtx, []int64{ts.Table.ID}, ts.Table.IsCommonHandle, splitedRanges, nil) +func (e *mppTaskGenerator) constructMPPBuildTaskForNonPartitionTable(tid int64, isCommonHandle bool, splitedRanges []*ranger.Range) (*kv.MPPBuildTasksRequest, error) { + kvRanges, err := distsql.TableHandleRangesToKVRanges(e.ctx.GetSessionVars().StmtCtx, []int64{tid}, isCommonHandle, splitedRanges, nil) if err != nil { return nil, errors.Trace(err) } - return &kv.MPPBuildTasksRequest{KeyRanges: kvRanges}, nil + return &kv.MPPBuildTasksRequest{KeyRanges: kvRanges.FirstPartitionRange()}, nil } diff --git a/planner/core/hints.go b/planner/core/hints.go index f67a66b1df001..baf9f91330d20 100644 --- a/planner/core/hints.go +++ b/planner/core/hints.go @@ -35,7 +35,7 @@ func GenHintsFromFlatPlan(flat *FlatPhysicalPlan) []*ast.TableOptimizerHint { nodeTp = utilhint.TypeDelete } var hints []*ast.TableOptimizerHint - selectPlan := flat.Main.GetSelectPlan() + selectPlan, _ := flat.Main.GetSelectPlan() if len(selectPlan) == 0 || !selectPlan[0].IsPhysicalPlan { return nil } diff --git a/planner/core/indexmerge_intersection_test.go b/planner/core/indexmerge_intersection_test.go new file mode 100644 index 0000000000000..8b352f3b5cead --- /dev/null +++ b/planner/core/indexmerge_intersection_test.go @@ -0,0 +1,178 @@ +// 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, +// 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 core_test + +import ( + "regexp" + "testing" + + "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/testkit/testdata" + "github.com/stretchr/testify/require" +) + +func TestSPMForIntersectionIndexMerge(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, c int, d int, e int, index ia(a), index ib(b), index ic(c), index id(d), index ie(e))") + require.False(t, tk.HasPlan("select * from t where a = 10 and b = 20 and c > 30 and d is null and e in (0, 100)", "IndexMerge")) + require.True(t, + tk.HasPlan("select /*+ use_index_merge(t, ia, ib, ic, id, ie) */ * from t where a = 10 and b = 20 and c > 30 and d is null and e in (0, 100)", + "IndexMerge", + ), + ) + tk.MustExec(` +create global binding for + select * from t where a = 10 and b = 20 and c > 30 and d is null and e in (0, 100) +using + select /*+ use_index_merge(t, ia, ib, ic, id, ie) */ * from t where a = 10 and b = 20 and c > 30 and d is null and e in (0, 100) +`) + require.True(t, tk.HasPlan("select * from t where a = 10 and b = 20 and c > 30 and d is null and e in (0, 100)", "IndexMerge")) +} + +func TestPlanCacheForIntersectionIndexMerge(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, c int, d int, e int, index ia(a), index ib(b), index ic(c), index id(d), index ie(e))") + tk.MustExec("prepare stmt from 'select /*+ use_index_merge(t, ia, ib, ic, id, ie) */ * from t where a = 10 and b = ? and c > ? and d is null and e in (0, 100)'") + tk.MustExec("set @a=1, @b=3") + tk.MustQuery("execute stmt using @a,@b").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt using @a,@b").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + tk.MustExec("set @a=100, @b=500") + tk.MustQuery("execute stmt using @a,@b").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @a,@b").Check(testkit.Rows()) + require.True(t, tk.HasPlanForLastExecution("IndexMerge")) +} + +func TestHintForIntersectionIndexMerge(t *testing.T) { + store, domain := testkit.CreateMockStoreAndDomain(t) + handle := domain.StatsHandle() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t1(a int, b int, c int, d int, e int, index ia(a), index ibc(b, c),index ic(c), index id(d), index ie(e))" + + "partition by range(c) (" + + "partition p0 values less than (10)," + + "partition p1 values less than (20)," + + "partition p2 values less than (30)," + + "partition p3 values less than (maxvalue))") + tk.MustExec("insert into t1 values (10, 20, 5, 5, 3), (20, 20, 50, 5, 200), (20, 20, 10, 5, 5), (10, 30, 5, 3, 1)") + tk.MustExec("create definer='root'@'localhost' view vh as " + + "select /*+ use_index_merge(t1, ia, ibc, id) */ * from t1 where a = 10 and b = 20 and c < 30 and d in (2,5)") + tk.MustExec("create definer='root'@'localhost' view v as " + + "select * from t1 where a = 10 and b = 20 and c < 30 and d in (2,5)") + tk.MustExec("create definer='root'@'localhost' view v1 as " + + "select * from t1 where a = 10 and b = 20") + tk.MustExec("create table t2(a int, b int, c int, d int, e int, index ia(a), index ibc(b, c), index id(d), index ie(e))" + + "partition by range columns (c, d) (" + + "partition p0 values less than (10, 20)," + + "partition p1 values less than (30, 40)," + + "partition p2 values less than (50, 60)," + + "partition p3 values less than (maxvalue, maxvalue))") + tk.MustExec("insert into t2 values (10, 20, 5, 5, 3), (20, 20, 20, 5, 100), (100, 30, 5, 3, 100)") + tk.MustExec("create table t3(a int, b int, c int, d int, e int, index ia(a), index ibc(b, c), index id(d), index ie(e))" + + "partition by hash (e) partitions 5") + tk.MustExec("insert into t3 values (10, 20, 5, 5, 3), (20, 20, 20, 5, 100), (10, 30, 5, 3, 100)") + tk.MustExec("create table t4(a int, b int, c int, d int, e int, index ia(a), index ibc(b, c), index id(d), index ie(e))" + + "partition by list (d) (" + + "partition p0 values in (1,2,3,4,5)," + + "partition p1 values in (6,7,8,9,10)," + + "partition p2 values in (11,12,13,14,15)," + + "partition p3 values in (16,17,18,19,20))") + tk.MustExec("insert into t4 values (30, 20, 5, 8, 100), (20, 20, 20, 3, 2), (10, 30, 5, 3, 100)") + tk.MustExec("create table t5(" + + "s1 varchar(20) collate utf8mb4_bin," + + "s2 varchar(30) collate ascii_bin," + + "s3 varchar(50) collate utf8_unicode_ci," + + "s4 varchar(20) collate gbk_chinese_ci," + + "index is1(s1), index is2(s2), index is3(s3), index is4(s4))") + tk.MustExec("insert into t5 values ('Abc', 'zzzz', 'aa', 'ccc'), ('abc', 'zzzz', 'CCC', 'ccc')") + tk.MustExec("create table t6(" + + "s1 varchar(20) collate utf8mb4_bin," + + "s2 varchar(30) collate ascii_bin," + + "s3 varchar(50) collate utf8_unicode_ci," + + "s4 varchar(20) collate gbk_chinese_ci," + + "primary key (s1, s2(10)) nonclustered," + + "index is1(s1), index is2(s2), index is3(s3), index is4(s4))") + tk.MustExec("insert into t6 values ('Abc', 'zzzz', 'A啊A', 'Cdaa'), ('Abc', 'zczz', 'A啊', 'Cda')") + tk.MustExec("create table t7(" + + "a tinyint unsigned," + + "b bit(3)," + + "c float," + + "d decimal(10,3)," + + "e datetime," + + "f timestamp(5)," + + "g year," + + "primary key (d) nonclustered," + + "index ia(a), unique index ib(b), index ic(c), index ie(e), index iff(f), index ig(g))") + tk.MustExec("insert into t7 values (100, 6, 12.2, 56, '2022-11-22 17:00', '2022-12-21 00:00', 2021)," + + "(20, 7, 12.4, 30, '2022-12-22 17:00', '2016-12-21 00:00', 2021)") + tk.MustExec("create table t8(" + + "s1 mediumtext collate utf8mb4_general_ci," + + "s2 varbinary(20)," + + "s3 tinyblob," + + "s4 enum('测试', 'aA', '??') collate gbk_chinese_ci," + + "s5 set('^^^', 'tEsT', '2') collate utf8_general_ci," + + "primary key (s1(10)) nonclustered," + + "unique index is2(s2(20)), index is3(s3(20)), index is4(s4), index is5(s5))") + tk.MustExec("insert into t8 values('啊aabbccdd', 'abcc', 'cccc', 'aa', '2,test')," + + "('啊aabb', 'abcdc', 'aaaa', '??', '2')") + + require.NoError(t, handle.HandleDDLEvent(<-handle.DDLEventCh())) + require.Nil(t, handle.Update(domain.InfoSchema())) + tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic'") + tk.MustExec("analyze table t1,t2,t3,t4") + require.Nil(t, handle.Update(domain.InfoSchema())) + + var ( + input []string + output []struct { + SQL string + Plan []string + Result []string + } + ) + planSuiteData := core.GetIndexMergeSuiteData() + planSuiteData.LoadTestCases(t, &input, &output) + + matchSetStmt, err := regexp.Compile("^set") + require.NoError(t, err) + for i, ts := range input { + testdata.OnRecord(func() { + output[i].SQL = ts + }) + ok := matchSetStmt.MatchString(ts) + if ok { + tk.MustExec(ts) + continue + } + testdata.OnRecord(func() { + output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + ts).Rows()) + output[i].Result = testdata.ConvertRowsToStrings(tk.MustQuery(ts).Sort().Rows()) + }) + tk.MustQuery("explain format = 'brief' " + ts).Check(testkit.Rows(output[i].Plan...)) + tk.MustQuery(ts).Sort().Check(testkit.Rows(output[i].Result...)) + // Expect no warnings. + tk.MustQuery("show warnings").Check(testkit.Rows()) + } +} diff --git a/planner/core/indexmerge_path.go b/planner/core/indexmerge_path.go new file mode 100644 index 0000000000000..ab67a1634f1f9 --- /dev/null +++ b/planner/core/indexmerge_path.go @@ -0,0 +1,892 @@ +// 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, +// 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 core + +import ( + "math" + "strings" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/charset" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/planner/util" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/ranger" + "go.uber.org/zap" +) + +// generateIndexMergePath generates IndexMerge AccessPaths on this DataSource. +func (ds *DataSource) generateIndexMergePath() error { + var warningMsg string + stmtCtx := ds.ctx.GetSessionVars().StmtCtx + defer func() { + if len(ds.indexMergeHints) > 0 && warningMsg != "" { + ds.indexMergeHints = nil + stmtCtx.AppendWarning(errors.Errorf(warningMsg)) + logutil.BgLogger().Debug(warningMsg) + } + }() + + // Consider the IndexMergePath. Now, we just generate `IndexMergePath` in DNF case. + // Use allConds instread of pushedDownConds, + // because we want to use IndexMerge even if some expr cannot be pushed to TiKV. + // We will create new Selection for exprs that cannot be pushed in convertToIndexMergeScan. + indexMergeConds := make([]expression.Expression, 0, len(ds.allConds)) + for _, expr := range ds.allConds { + indexMergeConds = append(indexMergeConds, expression.PushDownNot(ds.ctx, expr)) + } + + sessionAndStmtPermission := (ds.ctx.GetSessionVars().GetEnableIndexMerge() || len(ds.indexMergeHints) > 0) && !stmtCtx.NoIndexMergeHint + if !sessionAndStmtPermission { + warningMsg = "IndexMerge is inapplicable or disabled. Got no_index_merge hint or tidb_enable_index_merge is off." + return nil + } + + if ds.tableInfo.TempTableType == model.TempTableLocal { + warningMsg = "IndexMerge is inapplicable or disabled. Cannot use IndexMerge on temporary table." + return nil + } + + regularPathCount := len(ds.possibleAccessPaths) + var err error + if warningMsg, err = ds.generateIndexMerge4NormalIndex(regularPathCount, indexMergeConds); err != nil { + return err + } + if err := ds.generateIndexMerge4MVIndex(regularPathCount, indexMergeConds); err != nil { + return err + } + + // If without hints, it means that `enableIndexMerge` is true + if len(ds.indexMergeHints) == 0 { + return nil + } + // If len(indexMergeHints) > 0, then add warnings if index-merge hints cannot work. + if regularPathCount == len(ds.possibleAccessPaths) { + if warningMsg == "" { + warningMsg = "IndexMerge is inapplicable" + } + return nil + } + + // If len(indexMergeHints) > 0 and some index-merge paths were added, then prune all other non-index-merge paths. + ds.possibleAccessPaths = ds.possibleAccessPaths[regularPathCount:] + minRowCount := ds.possibleAccessPaths[0].CountAfterAccess + for _, path := range ds.possibleAccessPaths { + if minRowCount < path.CountAfterAccess { + minRowCount = path.CountAfterAccess + } + } + if ds.stats.RowCount > minRowCount { + ds.stats = ds.tableStats.ScaleByExpectCnt(minRowCount) + } + return nil +} + +// getIndexMergeOrPath generates all possible IndexMergeOrPaths. +func (ds *DataSource) generateIndexMergeOrPaths(filters []expression.Expression) error { + usedIndexCount := len(ds.possibleAccessPaths) + for i, cond := range filters { + sf, ok := cond.(*expression.ScalarFunction) + if !ok || sf.FuncName.L != ast.LogicOr { + continue + } + var partialPaths = make([]*util.AccessPath, 0, usedIndexCount) + dnfItems := expression.FlattenDNFConditions(sf) + for _, item := range dnfItems { + cnfItems := expression.SplitCNFItems(item) + itemPaths := ds.accessPathsForConds(cnfItems, usedIndexCount) + if len(itemPaths) == 0 { + partialPaths = nil + break + } + partialPath, err := ds.buildIndexMergePartialPath(itemPaths) + if err != nil { + return err + } + if partialPath == nil { + partialPaths = nil + break + } + partialPaths = append(partialPaths, partialPath) + } + // If all of the partialPaths use the same index, we will not use the indexMerge. + singlePath := true + for i := len(partialPaths) - 1; i >= 1; i-- { + if partialPaths[i].Index != partialPaths[i-1].Index { + singlePath = false + break + } + } + if singlePath { + continue + } + if len(partialPaths) > 1 { + possiblePath := ds.buildIndexMergeOrPath(filters, partialPaths, i) + if possiblePath == nil { + return nil + } + + accessConds := make([]expression.Expression, 0, len(partialPaths)) + for _, p := range partialPaths { + indexCondsForP := p.AccessConds[:] + indexCondsForP = append(indexCondsForP, p.IndexFilters...) + if len(indexCondsForP) > 0 { + accessConds = append(accessConds, expression.ComposeCNFCondition(ds.ctx, indexCondsForP...)) + } + } + accessDNF := expression.ComposeDNFCondition(ds.ctx, accessConds...) + sel, _, err := ds.tableStats.HistColl.Selectivity(ds.ctx, []expression.Expression{accessDNF}, nil) + if err != nil { + logutil.BgLogger().Debug("something wrong happened, use the default selectivity", zap.Error(err)) + sel = SelectionFactor + } + possiblePath.CountAfterAccess = sel * ds.tableStats.RowCount + ds.possibleAccessPaths = append(ds.possibleAccessPaths, possiblePath) + } + } + return nil +} + +// isInIndexMergeHints returns true if the input index name is not excluded by the IndexMerge hints, which means either +// (1) there's no IndexMerge hint, (2) there's IndexMerge hint but no specified index names, or (3) the input index +// name is specified in the IndexMerge hints. +func (ds *DataSource) isInIndexMergeHints(name string) bool { + if len(ds.indexMergeHints) == 0 { + return true + } + for _, hint := range ds.indexMergeHints { + if hint.indexHint == nil || len(hint.indexHint.IndexNames) == 0 { + return true + } + for _, hintName := range hint.indexHint.IndexNames { + if strings.EqualFold(strings.ToLower(name), strings.ToLower(hintName.String())) { + return true + } + } + } + return false +} + +// indexMergeHintsHasSpecifiedIdx returns true if there's IndexMerge hint, and it has specified index names. +func (ds *DataSource) indexMergeHintsHasSpecifiedIdx() bool { + for _, hint := range ds.indexMergeHints { + if hint.indexHint == nil || len(hint.indexHint.IndexNames) == 0 { + continue + } + if len(hint.indexHint.IndexNames) > 0 { + return true + } + } + return false +} + +// indexMergeHintsHasSpecifiedIdx return true if the input index name is specified in the IndexMerge hint. +func (ds *DataSource) isSpecifiedInIndexMergeHints(name string) bool { + for _, hint := range ds.indexMergeHints { + if hint.indexHint == nil || len(hint.indexHint.IndexNames) == 0 { + continue + } + for _, hintName := range hint.indexHint.IndexNames { + if strings.EqualFold(strings.ToLower(name), strings.ToLower(hintName.String())) { + return true + } + } + } + return false +} + +// accessPathsForConds generates all possible index paths for conditions. +func (ds *DataSource) accessPathsForConds(conditions []expression.Expression, usedIndexCount int) []*util.AccessPath { + var results = make([]*util.AccessPath, 0, usedIndexCount) + for i := 0; i < usedIndexCount; i++ { + path := &util.AccessPath{} + if ds.possibleAccessPaths[i].IsTablePath() { + if !ds.isInIndexMergeHints("primary") { + continue + } + if ds.tableInfo.IsCommonHandle { + path.IsCommonHandlePath = true + path.Index = ds.possibleAccessPaths[i].Index + } else { + path.IsIntHandlePath = true + } + err := ds.deriveTablePathStats(path, conditions, true) + if err != nil { + logutil.BgLogger().Debug("can not derive statistics of a path", zap.Error(err)) + continue + } + var unsignedIntHandle bool + if path.IsIntHandlePath && ds.tableInfo.PKIsHandle { + if pkColInfo := ds.tableInfo.GetPkColInfo(); pkColInfo != nil { + unsignedIntHandle = mysql.HasUnsignedFlag(pkColInfo.GetFlag()) + } + } + // If the path contains a full range, ignore it. + if ranger.HasFullRange(path.Ranges, unsignedIntHandle) { + continue + } + // If we have point or empty range, just remove other possible paths. + if len(path.Ranges) == 0 || path.OnlyPointRange(ds.SCtx()) { + if len(results) == 0 { + results = append(results, path) + } else { + results[0] = path + results = results[:1] + } + break + } + } else { + path.Index = ds.possibleAccessPaths[i].Index + if !ds.isInIndexMergeHints(path.Index.Name.L) { + continue + } + err := ds.fillIndexPath(path, conditions) + if err != nil { + logutil.BgLogger().Debug("can not derive statistics of a path", zap.Error(err)) + continue + } + ds.deriveIndexPathStats(path, conditions, true) + // If the path contains a full range, ignore it. + if ranger.HasFullRange(path.Ranges, false) { + continue + } + // If we have empty range, or point range on unique index, just remove other possible paths. + if len(path.Ranges) == 0 || (path.OnlyPointRange(ds.SCtx()) && path.Index.Unique) { + if len(results) == 0 { + results = append(results, path) + } else { + results[0] = path + results = results[:1] + } + break + } + } + results = append(results, path) + } + return results +} + +// buildIndexMergePartialPath chooses the best index path from all possible paths. +// Now we choose the index with minimal estimate row count. +func (ds *DataSource) buildIndexMergePartialPath(indexAccessPaths []*util.AccessPath) (*util.AccessPath, error) { + if len(indexAccessPaths) == 1 { + return indexAccessPaths[0], nil + } + + minEstRowIndex := 0 + minEstRow := math.MaxFloat64 + for i := 0; i < len(indexAccessPaths); i++ { + rc := indexAccessPaths[i].CountAfterAccess + if len(indexAccessPaths[i].IndexFilters) > 0 { + rc = indexAccessPaths[i].CountAfterIndex + } + if rc < minEstRow { + minEstRowIndex = i + minEstRow = rc + } + } + return indexAccessPaths[minEstRowIndex], nil +} + +// buildIndexMergeOrPath generates one possible IndexMergePath. +func (ds *DataSource) buildIndexMergeOrPath(filters []expression.Expression, partialPaths []*util.AccessPath, current int) *util.AccessPath { + indexMergePath := &util.AccessPath{PartialIndexPaths: partialPaths} + indexMergePath.TableFilters = append(indexMergePath.TableFilters, filters[:current]...) + indexMergePath.TableFilters = append(indexMergePath.TableFilters, filters[current+1:]...) + var addCurrentFilter bool + for _, path := range partialPaths { + // If any partial path contains table filters, we need to keep the whole DNF filter in the Selection. + if len(path.TableFilters) > 0 { + addCurrentFilter = true + } + // If any partial path's index filter cannot be pushed to TiKV, we should keep the whole DNF filter. + if len(path.IndexFilters) != 0 && !expression.CanExprsPushDown(ds.ctx.GetSessionVars().StmtCtx, path.IndexFilters, ds.ctx.GetClient(), kv.TiKV) { + addCurrentFilter = true + // Clear IndexFilter, the whole filter will be put in indexMergePath.TableFilters. + path.IndexFilters = nil + } + if len(path.TableFilters) != 0 && !expression.CanExprsPushDown(ds.ctx.GetSessionVars().StmtCtx, path.TableFilters, ds.ctx.GetClient(), kv.TiKV) { + addCurrentFilter = true + path.TableFilters = nil + } + } + if addCurrentFilter { + indexMergePath.TableFilters = append(indexMergePath.TableFilters, filters[current]) + } + return indexMergePath +} + +// generateIndexMergeAndPaths generates IndexMerge paths for `AND` (a.k.a. intersection type IndexMerge) +func (ds *DataSource) generateIndexMergeAndPaths(normalPathCnt int) *util.AccessPath { + // For now, we only consider intersection type IndexMerge when the index names are specified in the hints. + if !ds.indexMergeHintsHasSpecifiedIdx() { + return nil + } + + // 1. Collect partial paths from normal paths. + var partialPaths []*util.AccessPath + for i := 0; i < normalPathCnt; i++ { + originalPath := ds.possibleAccessPaths[i] + // No need to consider table path as a partial path. + if ds.possibleAccessPaths[i].IsTablePath() { + continue + } + if !ds.isSpecifiedInIndexMergeHints(originalPath.Index.Name.L) { + continue + } + // If the path contains a full range, ignore it. + if ranger.HasFullRange(originalPath.Ranges, false) { + continue + } + newPath := originalPath.Clone() + partialPaths = append(partialPaths, newPath) + } + if len(partialPaths) < 2 { + return nil + } + + // 2. Collect filters that can't be covered by the partial paths and deduplicate them. + finalFilters := make([]expression.Expression, 0) + partialFilters := make([]expression.Expression, 0, len(partialPaths)) + hashCodeSet := make(map[string]struct{}) + for _, path := range partialPaths { + // Classify filters into coveredConds and notCoveredConds. + coveredConds := make([]expression.Expression, 0, len(path.AccessConds)+len(path.IndexFilters)) + notCoveredConds := make([]expression.Expression, 0, len(path.IndexFilters)+len(path.TableFilters)) + // AccessConds can be covered by partial path. + coveredConds = append(coveredConds, path.AccessConds...) + for i, cond := range path.IndexFilters { + // IndexFilters can be covered by partial path if it can be pushed down to TiKV. + if !expression.CanExprsPushDown(ds.ctx.GetSessionVars().StmtCtx, []expression.Expression{cond}, ds.ctx.GetClient(), kv.TiKV) { + path.IndexFilters = append(path.IndexFilters[:i], path.IndexFilters[i+1:]...) + notCoveredConds = append(notCoveredConds, cond) + } else { + coveredConds = append(coveredConds, cond) + } + } + // TableFilters can't be covered by partial path. + notCoveredConds = append(notCoveredConds, path.TableFilters...) + + // Record covered filters in hashCodeSet. + // Note that we only record filters that not appear in the notCoveredConds. It's possible that a filter appear + // in both coveredConds and notCoveredConds (e.g. because of prefix index). So we need this extra check to + // avoid wrong deduplication. + notCoveredHashCodeSet := make(map[string]struct{}) + for _, cond := range notCoveredConds { + hashCode := string(cond.HashCode(ds.ctx.GetSessionVars().StmtCtx)) + notCoveredHashCodeSet[hashCode] = struct{}{} + } + for _, cond := range coveredConds { + hashCode := string(cond.HashCode(ds.ctx.GetSessionVars().StmtCtx)) + if _, ok := notCoveredHashCodeSet[hashCode]; !ok { + hashCodeSet[hashCode] = struct{}{} + } + } + + finalFilters = append(finalFilters, notCoveredConds...) + partialFilters = append(partialFilters, coveredConds...) + } + + // Remove covered filters from finalFilters and deduplicate finalFilters. + dedupedFinalFilters := make([]expression.Expression, 0, len(finalFilters)) + for _, cond := range finalFilters { + hashCode := string(cond.HashCode(ds.ctx.GetSessionVars().StmtCtx)) + if _, ok := hashCodeSet[hashCode]; !ok { + dedupedFinalFilters = append(dedupedFinalFilters, cond) + hashCodeSet[hashCode] = struct{}{} + } + } + + // 3. Estimate the row count after partial paths. + sel, _, err := ds.tableStats.HistColl.Selectivity(ds.ctx, partialFilters, nil) + if err != nil { + logutil.BgLogger().Debug("something wrong happened, use the default selectivity", zap.Error(err)) + sel = SelectionFactor + } + + indexMergePath := &util.AccessPath{ + PartialIndexPaths: partialPaths, + IndexMergeIsIntersection: true, + TableFilters: dedupedFinalFilters, + CountAfterAccess: sel * ds.tableStats.RowCount, + } + return indexMergePath +} + +func (ds *DataSource) generateIndexMerge4NormalIndex(regularPathCount int, indexMergeConds []expression.Expression) (string, error) { + isPossibleIdxMerge := len(indexMergeConds) > 0 && // have corresponding access conditions, and + len(ds.possibleAccessPaths) > 1 // have multiple index paths + if !isPossibleIdxMerge { + return "IndexMerge is inapplicable or disabled. No available filter or available index.", nil + } + + // We current do not consider `IndexMergePath`: + // 1. If there is an index path. + // 2. TODO: If there exists exprs that cannot be pushed down. This is to avoid wrongly estRow of Selection added by rule_predicate_push_down. + stmtCtx := ds.ctx.GetSessionVars().StmtCtx + needConsiderIndexMerge := true + if len(ds.indexMergeHints) == 0 { + for i := 1; i < len(ds.possibleAccessPaths); i++ { + if len(ds.possibleAccessPaths[i].AccessConds) != 0 { + needConsiderIndexMerge = false + break + } + } + if needConsiderIndexMerge { + // PushDownExprs() will append extra warnings, which is annoying. So we reset warnings here. + warnings := stmtCtx.GetWarnings() + extraWarnings := stmtCtx.GetExtraWarnings() + _, remaining := expression.PushDownExprs(stmtCtx, indexMergeConds, ds.ctx.GetClient(), kv.UnSpecified) + stmtCtx.SetWarnings(warnings) + stmtCtx.SetExtraWarnings(extraWarnings) + if len(remaining) > 0 { + needConsiderIndexMerge = false + } + } + } + + if !needConsiderIndexMerge { + return "IndexMerge is inapplicable or disabled. ", nil // IndexMerge is inapplicable + } + + // 1. Generate possible IndexMerge paths for `OR`. + err := ds.generateIndexMergeOrPaths(indexMergeConds) + if err != nil { + return "", err + } + // 2. Generate possible IndexMerge paths for `AND`. + indexMergeAndPath := ds.generateIndexMergeAndPaths(regularPathCount) + if indexMergeAndPath != nil { + ds.possibleAccessPaths = append(ds.possibleAccessPaths, indexMergeAndPath) + } + return "", nil +} + +// generateIndexMergeOnDNF4MVIndex generates IndexMerge paths for MVIndex upon DNF filters. +/* + select * from t where ((1 member of (a) and b=1) or (2 member of (a) and b=2)) and (c > 10) + IndexMerge(OR) + IndexRangeScan(a, b, [1 1, 1 1]) + IndexRangeScan(a, b, [2 2, 2 2]) + Selection(c > 10) + TableRowIdScan(t) + Two limitations now: + 1). all filters in the DNF have to be used as access-filters: ((1 member of (a)) or (2 member of (a)) or b > 10) cannot be used to access the MVIndex. + 2). cannot support json_contains: (json_contains(a, '[1, 2]') or json_contains(a, '[3, 4]')) is not supported since a single IndexMerge cannot represent this SQL. +*/ +func (ds *DataSource) generateIndexMergeOnDNF4MVIndex(normalPathCnt int, filters []expression.Expression) (mvIndexPaths []*util.AccessPath, err error) { + for idx := 0; idx < normalPathCnt; idx++ { + if !isMVIndexPath(ds.possibleAccessPaths[idx]) { + continue // not a MVIndex path + } + + idxCols, ok := ds.prepareCols4MVIndex(ds.possibleAccessPaths[idx].Index) + if !ok { + continue + } + + for current, filter := range filters { + sf, ok := filter.(*expression.ScalarFunction) + if !ok || sf.FuncName.L != ast.LogicOr { + continue + } + dnfFilters := expression.FlattenDNFConditions(sf) // [(1 member of (a) and b=1), (2 member of (a) and b=2)] + + // build partial paths for each dnf filter + cannotFit := false + var partialPaths []*util.AccessPath + for _, dnfFilter := range dnfFilters { + mvIndexFilters := []expression.Expression{dnfFilter} + if sf, ok := dnfFilter.(*expression.ScalarFunction); ok && sf.FuncName.L == ast.LogicAnd { + mvIndexFilters = expression.FlattenCNFConditions(sf) // (1 member of (a) and b=1) --> [(1 member of (a)), b=1] + } + + accessFilters, remainingFilters := ds.collectFilters4MVIndex(mvIndexFilters, idxCols) + if len(accessFilters) == 0 || len(remainingFilters) > 0 { // limitation 1 + cannotFit = true + break + } + paths, isIntersection, ok, err := ds.buildPartialPaths4MVIndex(accessFilters, idxCols, ds.possibleAccessPaths[idx].Index) + if err != nil { + return nil, err + } + if isIntersection || !ok { // limitation 2 + cannotFit = true + break + } + partialPaths = append(partialPaths, paths...) + } + if cannotFit { + continue + } + + var remainingFilters []expression.Expression + remainingFilters = append(remainingFilters, filters[:current]...) + remainingFilters = append(remainingFilters, filters[current+1:]...) + + indexMergePath := ds.buildPartialPathUp4MVIndex(partialPaths, false, remainingFilters) + mvIndexPaths = append(mvIndexPaths, indexMergePath) + } + } + return +} + +// generateIndexMergeJSONMVIndexPath generates paths for (json_member_of / json_overlaps / json_contains) on multi-valued index. +/* + 1. select * from t where 1 member of (a) + IndexMerge(AND) + IndexRangeScan(a, [1,1]) + TableRowIdScan(t) + 2. select * from t where json_contains(a, '[1, 2, 3]') + IndexMerge(AND) + IndexRangeScan(a, [1,1]) + IndexRangeScan(a, [2,2]) + IndexRangeScan(a, [3,3]) + TableRowIdScan(t) + 3. select * from t where json_overlap(a, '[1, 2, 3]') + IndexMerge(OR) + IndexRangeScan(a, [1,1]) + IndexRangeScan(a, [2,2]) + IndexRangeScan(a, [3,3]) + TableRowIdScan(t) +*/ +func (ds *DataSource) generateIndexMerge4MVIndex(normalPathCnt int, filters []expression.Expression) error { + dnfMVIndexPaths, err := ds.generateIndexMergeOnDNF4MVIndex(normalPathCnt, filters) + if err != nil { + return err + } + ds.possibleAccessPaths = append(ds.possibleAccessPaths, dnfMVIndexPaths...) + + for idx := 0; idx < normalPathCnt; idx++ { + if !isMVIndexPath(ds.possibleAccessPaths[idx]) { + continue // not a MVIndex path + } + + idxCols, ok := ds.prepareCols4MVIndex(ds.possibleAccessPaths[idx].Index) + if !ok { + continue + } + + accessFilters, remainingFilters := ds.collectFilters4MVIndex(filters, idxCols) + if len(accessFilters) == 0 { // cannot use any filter on this MVIndex + continue + } + + partialPaths, isIntersection, ok, err := ds.buildPartialPaths4MVIndex(accessFilters, idxCols, ds.possibleAccessPaths[idx].Index) + if err != nil { + return err + } + if !ok { + continue + } + + ds.possibleAccessPaths = append(ds.possibleAccessPaths, ds.buildPartialPathUp4MVIndex(partialPaths, isIntersection, remainingFilters)) + } + return nil +} + +// buildPartialPathUp4MVIndex builds these partial paths up to a complete index merge path. +func (ds *DataSource) buildPartialPathUp4MVIndex(partialPaths []*util.AccessPath, isIntersection bool, remainingFilters []expression.Expression) *util.AccessPath { + indexMergePath := &util.AccessPath{PartialIndexPaths: partialPaths, IndexMergeAccessMVIndex: true} + indexMergePath.IndexMergeIsIntersection = isIntersection + indexMergePath.TableFilters = remainingFilters + + // TODO: use a naive estimation strategy here now for simplicity, make it more accurate. + minEstRows, maxEstRows := math.MaxFloat64, -1.0 + for _, p := range indexMergePath.PartialIndexPaths { + minEstRows = math.Min(minEstRows, p.CountAfterAccess) + maxEstRows = math.Max(maxEstRows, p.CountAfterAccess) + } + if indexMergePath.IndexMergeIsIntersection { + indexMergePath.CountAfterAccess = minEstRows + } else { + indexMergePath.CountAfterAccess = maxEstRows + } + return indexMergePath +} + +// buildPartialPaths4MVIndex builds partial paths by using these accessFilters upon this MVIndex. +// The accessFilters must be corresponding to these idxCols. +// OK indicates whether it builds successfully. These partial paths should be ignored if ok==false. +func (ds *DataSource) buildPartialPaths4MVIndex(accessFilters []expression.Expression, + idxCols []*expression.Column, mvIndex *model.IndexInfo) ( + partialPaths []*util.AccessPath, isIntersection bool, ok bool, err error) { + var virColID = -1 + for i := range idxCols { + if idxCols[i].VirtualExpr != nil { + virColID = i + break + } + } + if virColID == -1 { // unexpected, no vir-col on this MVIndex + return nil, false, false, nil + } + if len(accessFilters) <= virColID { // no filter related to the vir-col, build a partial path directly. + partialPath, ok, err := ds.buildPartialPath4MVIndex(accessFilters, idxCols, mvIndex) + return []*util.AccessPath{partialPath}, false, ok, err + } + + virCol := idxCols[virColID] + jsonType := virCol.GetType().ArrayType() + targetJSONPath, ok := unwrapJSONCast(virCol.VirtualExpr) + if !ok { + return nil, false, false, nil + } + + // extract values related to this vir-col, for example, extract [1, 2] from `json_contains(j, '[1, 2]')` + var virColVals []expression.Expression + sf, ok := accessFilters[virColID].(*expression.ScalarFunction) + if !ok { + return nil, false, false, nil + } + switch sf.FuncName.L { + case ast.JSONMemberOf: // (1 member of a->'$.zip') + v, ok := unwrapJSONCast(sf.GetArgs()[0]) // cast(1 as json) --> 1 + if !ok { + return nil, false, false, nil + } + virColVals = append(virColVals, v) + case ast.JSONContains: // (json_contains(a->'$.zip', '[1, 2, 3]') + isIntersection = true + virColVals, ok = jsonArrayExpr2Exprs(ds.ctx, sf.GetArgs()[1], jsonType) + if !ok || len(virColVals) == 0 { // json_contains(JSON, '[]') is TRUE + return nil, false, false, nil + } + case ast.JSONOverlaps: // (json_overlaps(a->'$.zip', '[1, 2, 3]') + var jsonPathIdx int + if sf.GetArgs()[0].Equal(ds.ctx, targetJSONPath) { + jsonPathIdx = 0 // (json_overlaps(a->'$.zip', '[1, 2, 3]') + } else if sf.GetArgs()[1].Equal(ds.ctx, targetJSONPath) { + jsonPathIdx = 1 // (json_overlaps('[1, 2, 3]', a->'$.zip') + } else { + return nil, false, false, nil + } + var ok bool + virColVals, ok = jsonArrayExpr2Exprs(ds.ctx, sf.GetArgs()[1-jsonPathIdx], jsonType) + if !ok || len(virColVals) == 0 { // forbid empty array for safety + return nil, false, false, nil + } + default: + return nil, false, false, nil + } + + for _, v := range virColVals { + // rewrite json functions to EQ to calculate range, `(1 member of j)` -> `j=1`. + eq, err := expression.NewFunction(ds.ctx, ast.EQ, types.NewFieldType(mysql.TypeTiny), virCol, v) + if err != nil { + return nil, false, false, err + } + accessFilters[virColID] = eq + + partialPath, ok, err := ds.buildPartialPath4MVIndex(accessFilters, idxCols, mvIndex) + if !ok || err != nil { + return nil, false, ok, err + } + partialPaths = append(partialPaths, partialPath) + } + return partialPaths, isIntersection, true, nil +} + +// buildPartialPath4MVIndex builds a partial path on this MVIndex with these accessFilters. +func (ds *DataSource) buildPartialPath4MVIndex(accessFilters []expression.Expression, idxCols []*expression.Column, mvIndex *model.IndexInfo) (*util.AccessPath, bool, error) { + partialPath := &util.AccessPath{Index: mvIndex} + partialPath.Ranges = ranger.FullRange() + for i := 0; i < len(idxCols); i++ { + partialPath.IdxCols = append(partialPath.IdxCols, idxCols[i]) + partialPath.IdxColLens = append(partialPath.IdxColLens, mvIndex.Columns[i].Length) + partialPath.FullIdxCols = append(partialPath.FullIdxCols, idxCols[i]) + partialPath.FullIdxColLens = append(partialPath.FullIdxColLens, mvIndex.Columns[i].Length) + } + if err := ds.detachCondAndBuildRangeForPath(partialPath, accessFilters); err != nil { + return nil, false, err + } + if len(partialPath.AccessConds) != len(accessFilters) || len(partialPath.TableFilters) > 0 { + // not all filters are used in this case. + return nil, false, nil + } + return partialPath, true, nil +} + +func (ds *DataSource) prepareCols4MVIndex(mvIndex *model.IndexInfo) (idxCols []*expression.Column, ok bool) { + var virColNum = 0 + for i := range mvIndex.Columns { + colOffset := mvIndex.Columns[i].Offset + colMeta := ds.table.Meta().Cols()[colOffset] + var col *expression.Column + for _, c := range ds.TblCols { + if c.ID == colMeta.ID { + col = c + break + } + } + if col == nil { // unexpected, no vir-col on this MVIndex + return nil, false + } + if col.GetType().IsArray() { + virColNum++ + col = col.Clone().(*expression.Column) + col.RetType = col.GetType().ArrayType() // use the underlying type directly: JSON-ARRAY(INT) --> INT + col.RetType.SetCharset(charset.CharsetBin) + col.RetType.SetCollate(charset.CollationBin) + } + idxCols = append(idxCols, col) + } + if virColNum != 1 { // assume only one vir-col in the MVIndex + return nil, false + } + return idxCols, true +} + +// collectFilters4MVIndex splits these filters into 2 parts where accessFilters can be used to access this index directly. +// For idx(x, cast(a as array), z), `x=1 and (2 member of a) and z=1 and x+z>0` is splitted to: +// accessFilters: `x=1 and (2 member of a) and z=1`, remaining: `x+z>0`. +func (ds *DataSource) collectFilters4MVIndex(filters []expression.Expression, idxCols []*expression.Column) (accessFilters, remainingFilters []expression.Expression) { + usedAsAccess := make([]bool, len(filters)) + for _, col := range idxCols { + found := false + for i, f := range filters { + if usedAsAccess[i] { + continue + } + if ds.checkFilter4MVIndexColumn(f, col) { + accessFilters = append(accessFilters, f) + usedAsAccess[i] = true + found = true + break + } + } + if !found { + break + } + } + for i := range usedAsAccess { + if !usedAsAccess[i] { + remainingFilters = append(remainingFilters, filters[i]) + } + } + return accessFilters, remainingFilters +} + +// checkFilter4MVIndexColumn checks whether this filter can be used as an accessFilter to access the MVIndex column. +func (ds *DataSource) checkFilter4MVIndexColumn(filter expression.Expression, idxCol *expression.Column) bool { + sf, ok := filter.(*expression.ScalarFunction) + if !ok { + return false + } + if idxCol.VirtualExpr != nil { // the virtual column on the MVIndex + targetJSONPath, ok := unwrapJSONCast(idxCol.VirtualExpr) + if !ok { + return false + } + switch sf.FuncName.L { + case ast.JSONMemberOf: // (1 member of a) + return targetJSONPath.Equal(ds.ctx, sf.GetArgs()[1]) + case ast.JSONContains: // json_contains(a, '1') + return targetJSONPath.Equal(ds.ctx, sf.GetArgs()[0]) + case ast.JSONOverlaps: // json_overlaps(a, '1') or json_overlaps('1', a) + return targetJSONPath.Equal(ds.ctx, sf.GetArgs()[0]) || + targetJSONPath.Equal(ds.ctx, sf.GetArgs()[1]) + default: + return false + } + } else { + if sf.FuncName.L != ast.EQ { // only support EQ now + return false + } + args := sf.GetArgs() + var argCol *expression.Column + var argConst *expression.Constant + if c, isCol := args[0].(*expression.Column); isCol { + if con, isCon := args[1].(*expression.Constant); isCon { + argCol, argConst = c, con + } + } else if c, isCol := args[1].(*expression.Column); isCol { + if con, isCon := args[0].(*expression.Constant); isCon { + argCol, argConst = c, con + } + } + if argCol == nil || argConst == nil { + return false + } + if argCol.Equal(ds.ctx, idxCol) { + return true + } + } + return false +} + +// jsonArrayExpr2Exprs converts a JsonArray expression to expression list: cast('[1, 2, 3]' as JSON) --> []expr{1, 2, 3} +func jsonArrayExpr2Exprs(sctx sessionctx.Context, jsonArrayExpr expression.Expression, targetType *types.FieldType) ([]expression.Expression, bool) { + if !expression.IsInmutableExpr(jsonArrayExpr) || jsonArrayExpr.GetType().EvalType() != types.ETJson { + return nil, false + } + + jsonArray, isNull, err := jsonArrayExpr.EvalJSON(sctx, chunk.Row{}) + if isNull || err != nil { + return nil, false + } + if jsonArray.TypeCode != types.JSONTypeCodeArray { + single, ok := jsonValue2Expr(jsonArray, targetType) // '1' -> []expr{1} + if ok { + return []expression.Expression{single}, true + } + return nil, false + } + var exprs []expression.Expression + for i := 0; i < jsonArray.GetElemCount(); i++ { // '[1, 2, 3]' -> []expr{1, 2, 3} + expr, ok := jsonValue2Expr(jsonArray.ArrayGetElem(i), targetType) + if !ok { + return nil, false + } + exprs = append(exprs, expr) + } + return exprs, true +} + +func jsonValue2Expr(v types.BinaryJSON, targetType *types.FieldType) (expression.Expression, bool) { + datum, err := expression.ConvertJSON2Tp(v, targetType) + if err != nil { + return nil, false + } + return &expression.Constant{ + Value: types.NewDatum(datum), + RetType: targetType, + }, true +} + +func unwrapJSONCast(expr expression.Expression) (expression.Expression, bool) { + if expr == nil { + return nil, false + } + sf, ok := expr.(*expression.ScalarFunction) + if !ok { + return nil, false + } + if sf == nil || sf.FuncName.L != ast.Cast || sf.GetType().EvalType() != types.ETJson { + return nil, false + } + return sf.GetArgs()[0], true +} + +func isMVIndexPath(path *util.AccessPath) bool { + return !path.IsTablePath() && path.Index != nil && path.Index.MVIndex +} diff --git a/planner/core/indexmerge_path_test.go b/planner/core/indexmerge_path_test.go new file mode 100644 index 0000000000000..f5a02cd7ca513 --- /dev/null +++ b/planner/core/indexmerge_path_test.go @@ -0,0 +1,427 @@ +// 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, +// 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 core_test + +import ( + "context" + "fmt" + "math/rand" + "strings" + "testing" + + "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/testkit/testdata" + "github.com/stretchr/testify/require" +) + +func TestAnalyzeMVIndex(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(`create table t(a int, b int, c int, j json, +index(a), index(b), +index idx(a, b, (cast(j as signed array)), c), +index idx2(a, b, (cast(j->'$.str' as char(10) array)), c))`) + + tk.MustExec("set tidb_analyze_version=2") + tk.MustExec("analyze table t") + tk.MustQuery("show warnings").Sort().Check(testkit.Rows( + "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t", + "Warning 1105 analyzing multi-valued indexes is not supported, skip idx", + "Warning 1105 analyzing multi-valued indexes is not supported, skip idx2")) + tk.MustExec("analyze table t index idx") + tk.MustQuery("show warnings").Sort().Check(testkit.Rows( + "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t", + "Warning 1105 The version 2 would collect all statistics not only the selected indexes", + "Warning 1105 analyzing multi-valued indexes is not supported, skip idx", + "Warning 1105 analyzing multi-valued indexes is not supported, skip idx2")) + + tk.MustExec("set tidb_analyze_version=1") + tk.MustExec("analyze table t") + tk.MustQuery("show warnings").Sort().Check(testkit.Rows( + "Warning 1105 analyzing multi-valued indexes is not supported, skip idx", + "Warning 1105 analyzing multi-valued indexes is not supported, skip idx2")) + tk.MustExec("analyze table t index idx") + tk.MustQuery("show warnings").Sort().Check(testkit.Rows( + "Warning 1105 analyzing multi-valued indexes is not supported, skip idx")) + tk.MustExec("analyze table t index a") + tk.MustQuery("show warnings").Sort().Check(testkit.Rows()) + tk.MustExec("analyze table t index a, idx, idx2") + tk.MustQuery("show warnings").Sort().Check(testkit.Rows( + "Warning 1105 analyzing multi-valued indexes is not supported, skip idx", + "Warning 1105 analyzing multi-valued indexes is not supported, skip idx2")) +} + +func TestIndexMergeJSONMemberOf(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(`create table t( +a int, j0 json, j1 json, +index j0_0((cast(j0->'$.path0' as signed array))), +index j0_1((cast(j0->'$.path1' as signed array))), +index j0_string((cast(j0->'$.path_string' as char(10) array))), +index j0_date((cast(j0->'$.path_date' as date array))), +index j1((cast(j1 as signed array))))`) + + var input []string + var output []struct { + SQL string + Plan []string + } + planSuiteData := core.GetIndexMergeSuiteData() + planSuiteData.LoadTestCases(t, &input, &output) + + for i, query := range input { + testdata.OnRecord(func() { + output[i].SQL = query + }) + result := tk.MustQuery("explain format = 'brief' " + query) + testdata.OnRecord(func() { + output[i].Plan = testdata.ConvertRowsToStrings(result.Rows()) + }) + result.Check(testkit.Rows(output[i].Plan...)) + } +} + +func TestDNFOnMVIndex(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(`create table t(a int, b int, c int, j json, +index idx1((cast(j as signed array))), +index idx2(a, b, (cast(j as signed array)), c))`) + + var input []string + var output []struct { + SQL string + Plan []string + } + planSuiteData := core.GetIndexMergeSuiteData() + planSuiteData.LoadTestCases(t, &input, &output) + + for i, query := range input { + testdata.OnRecord(func() { + output[i].SQL = query + }) + result := tk.MustQuery("explain format = 'brief' " + query) + testdata.OnRecord(func() { + output[i].Plan = testdata.ConvertRowsToStrings(result.Rows()) + }) + result.Check(testkit.Rows(output[i].Plan...)) + } +} + +func TestCompositeMVIndex(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(`create table t(a int, b int , c int, j json, +index idx(a, b, (cast(j as signed array)), c), +index idx2(a, b, (cast(j->'$.str' as char(10) array)), c))`) + + var input []string + var output []struct { + SQL string + Plan []string + } + planSuiteData := core.GetIndexMergeSuiteData() + planSuiteData.LoadTestCases(t, &input, &output) + + for i, query := range input { + testdata.OnRecord(func() { + output[i].SQL = query + }) + result := tk.MustQuery("explain format = 'brief' " + query) + testdata.OnRecord(func() { + output[i].Plan = testdata.ConvertRowsToStrings(result.Rows()) + }) + result.Check(testkit.Rows(output[i].Plan...)) + } +} + +func TestMVIndexSelection(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(`create table t(a int, j json, +index i_int((cast(j->'$.int' as signed array))))`) + + var input []string + var output []struct { + SQL string + Plan []string + } + planSuiteData := core.GetIndexMergeSuiteData() + planSuiteData.LoadTestCases(t, &input, &output) + + for i, query := range input { + testdata.OnRecord(func() { + output[i].SQL = query + }) + result := tk.MustQuery("explain format = 'brief' " + query) + testdata.OnRecord(func() { + output[i].Plan = testdata.ConvertRowsToStrings(result.Rows()) + }) + result.Check(testkit.Rows(output[i].Plan...)) + } +} + +func TestMVIndexIndexMergePlanCache(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(`create table t(j json, index kj((cast(j as signed array))))`) + + tk.MustExec("prepare st from 'select /*+ use_index_merge(t, kj) */ * from t where (1 member of (j))'") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 skip plan-cache: query accesses generated columns is un-cacheable")) + tk.MustExec("execute st") + tk.MustExec("execute st") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) +} + +func TestMVIndexPointGet(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(`create table t(j json, unique kj((cast(j as signed array))))`) + + for _, sql := range []string{ + "select j from t where j=1", + "select j from t where j=1 or j=2", + "select j from t where j in (1, 2)", + } { + plan := tk.MustQuery("explain " + sql).Rows() + hasPointGet := false + for _, line := range plan { + if strings.Contains(strings.ToLower(line[0].(string)), "point") { + hasPointGet = true + } + } + require.True(t, !hasPointGet) // no point-get plan + } +} + +func TestEnforceMVIndex(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(`create table t(a int, j json, index kj((cast(j as signed array))))`) + + var input []string + var output []struct { + SQL string + Plan []string + Err string + } + planSuiteData := core.GetIndexMergeSuiteData() + planSuiteData.LoadTestCases(t, &input, &output) + + for i, query := range input { + testdata.OnRecord(func() { + output[i].SQL = query + }) + rs, err := tk.Exec("explain format = 'brief' " + query) + if err != nil { + testdata.OnRecord(func() { + output[i].Err = err.Error() + output[i].Plan = nil + }) + require.Equal(t, output[i].Err, err.Error()) + } else { + result := tk.ResultSetToResultWithCtx(context.Background(), rs, "") + testdata.OnRecord(func() { + output[i].Err = "" + output[i].Plan = testdata.ConvertRowsToStrings(result.Rows()) + }) + result.Check(testkit.Rows(output[i].Plan...)) + } + } +} + +func TestMVIndexInvisible(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustExec(`create table t(a int, j json, index kj((cast(j as signed array))))`) + tk.MustQuery(`explain format='brief' select /*+ use_index(t, kj) */ * from t where (1 member of (j))`).Check(testkit.Rows( + `Selection 8000.00 root json_memberof(cast(1, json BINARY), test.t.j)`, + `└─IndexMerge 10.00 root type: union`, + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo", + ` └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo`)) + + tk.MustExec(`ALTER TABLE t ALTER INDEX kj INVISIBLE`) + tk.MustQuery(`explain format='brief' select /*+ use_index(t, kj) */ * from t where (1 member of (j))`).Check(testkit.Rows( + "Selection 8000.00 root json_memberof(cast(1, json BINARY), test.t.j)", + "└─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo")) + tk.MustQuery(`explain format='brief' select /*+ use_index_merge(t, kj) */ * from t where (1 member of (j))`).Check(testkit.Rows( + "Selection 8000.00 root json_memberof(cast(1, json BINARY), test.t.j)", + "└─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo")) + + tk.MustExec(`ALTER TABLE t ALTER INDEX kj VISIBLE`) + tk.MustQuery(`explain format='brief' select /*+ use_index(t, kj) */ * from t where (1 member of (j))`).Check(testkit.Rows( + `Selection 8000.00 root json_memberof(cast(1, json BINARY), test.t.j)`, + `└─IndexMerge 10.00 root type: union`, + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo", + ` └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo`)) +} + +func TestMVIndexFullScan(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustExec(`create table t(j json, index kj((cast(j as signed array))))`) + tk.MustExec(`insert into t values ('[1]')`) + tk.MustExec(`insert into t values ('[1, 2]')`) + tk.MustExec(`insert into t values ('[]')`) + tk.MustExec(`insert into t values (NULL)`) + + tk.MustQuery(`select /*+ use_index_merge(t, kj) */ count(*) from t`).Check(testkit.Rows("4")) + tk.MustQuery(`select /*+ use_index_merge(t, kj) */ count(*) from t where (1 member of (j))`).Check(testkit.Rows("2")) + tk.MustQuery(`select /*+ use_index_merge(t, kj) */ count(*) from t where json_contains((j), '[1]')`).Check(testkit.Rows("2")) + tk.MustQuery(`select /*+ use_index_merge(t, kj) */ count(*) from t where json_overlaps((j), '[1]')`).Check(testkit.Rows("2")) + + // Forbid IndexMerge+IndexFullScan since IndexFullScan on MVIndex cannot read all rows some cases. + tk.MustGetErrMsg(`select /*+ use_index(t, kj) */ count(*) from t`, "[planner:1815]Internal : Can't find a proper physical plan for this query") +} + +func TestMVIndexEmptyArray(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(`create table t(j json, index kj((cast(j as signed array))))`) + tk.MustExec(`insert into t values ('[1]')`) + tk.MustExec(`insert into t values ('[1, 2]')`) + tk.MustExec(`insert into t values ('[]')`) + tk.MustExec(`insert into t values (NULL)`) + + for _, cond := range []string{ + "json_contains(j, '[]')", + "json_contains(j, '[1]')", + "json_contains(j, '[1, 2]')", + "json_contains(j, '[1, 10]')", + "json_overlaps(j, '[]')", + "json_overlaps(j, '[1]')", + "json_overlaps(j, '[1, 2]')", + "json_overlaps(j, '[1, 10]')", + } { + tk.MustQuery(fmt.Sprintf("select /*+ use_index_merge(t) */ * from t where %v", cond)).Sort().Check( + tk.MustQuery(fmt.Sprintf("select /*+ ignore_index(t, kj) */ * from t where %v", cond)).Sort().Rows()) + } +} + +func TestMVIndexRandom(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + for _, testCase := range []struct { + indexType string + insertValOpts randMVIndexValOpts + queryValsOpts randMVIndexValOpts + }{ + {"signed", randMVIndexValOpts{"signed", 0, 3}, randMVIndexValOpts{"signed", 0, 3}}, + {"unsigned", randMVIndexValOpts{"unsigned", 0, 3}, randMVIndexValOpts{"unsigned", 0, 3}}, // unsigned-index + unsigned-values + {"char(3)", randMVIndexValOpts{"string", 3, 3}, randMVIndexValOpts{"string", 3, 3}}, + {"char(3)", randMVIndexValOpts{"string", 3, 3}, randMVIndexValOpts{"string", 1, 3}}, + {"char(3)", randMVIndexValOpts{"string", 3, 3}, randMVIndexValOpts{"string", 5, 3}}, + {"date", randMVIndexValOpts{"date", 0, 3}, randMVIndexValOpts{"date", 0, 3}}, + } { + tk.MustExec("drop table if exists t") + tk.MustExec(fmt.Sprintf(`create table t(a int, j json, index kj((cast(j as %v array))))`, testCase.indexType)) + + nRows := 20 + rows := make([]string, 0, nRows) + for i := 0; i < nRows; i++ { + va, v1, v2 := rand.Intn(testCase.insertValOpts.distinct), randMVIndexValue(testCase.insertValOpts), randMVIndexValue(testCase.insertValOpts) + if testCase.indexType == "date" { + rows = append(rows, fmt.Sprintf(`(%v, json_array(cast(%v as date), cast(%v as date)))`, va, v1, v2)) + } else { + rows = append(rows, fmt.Sprintf(`(%v, '[%v, %v]')`, va, v1, v2)) + } + } + tk.MustExec(fmt.Sprintf("insert into t values %v", strings.Join(rows, ", "))) + + nQueries := 20 + for i := 0; i < nQueries; i++ { + conds := randMVIndexConds(rand.Intn(3)+1, testCase.queryValsOpts) + r1 := tk.MustQuery("select /*+ ignore_index(t, kj) */ * from t where " + conds).Sort() + tk.MustQuery("select /*+ use_index_merge(t, kj) */ * from t where " + conds).Sort().Check(r1.Rows()) + } + } +} + +func randMVIndexConds(nConds int, valOpts randMVIndexValOpts) string { + var conds string + for i := 0; i < nConds; i++ { + if i > 0 { + if rand.Intn(5) < 1 { // OR + conds += " OR " + } else { // AND + conds += " AND " + } + } + cond := randMVIndexCond(rand.Intn(4), valOpts) + conds += cond + } + return conds +} + +func randMVIndexCond(condType int, valOpts randMVIndexValOpts) string { + switch condType { + case 0: // member_of + return fmt.Sprintf(`(%v member of (j))`, randMVIndexValue(valOpts)) + case 1: // json_contains + return fmt.Sprintf(`json_contains(j, '%v')`, randArray(valOpts)) + case 2: // json_overlaps + return fmt.Sprintf(`json_overlaps(j, '%v')`, randArray(valOpts)) + default: // others + return fmt.Sprintf(`a < %v`, rand.Intn(valOpts.distinct)) + } +} + +func randArray(opts randMVIndexValOpts) string { + n := rand.Intn(5) // n can be 0 + var vals []string + for i := 0; i < n; i++ { + vals = append(vals, randMVIndexValue(opts)) + } + return "[" + strings.Join(vals, ", ") + "]" +} + +type randMVIndexValOpts struct { + valType string // INT, UNSIGNED, STR, DATE + maxStrLen int + distinct int +} + +func randMVIndexValue(opts randMVIndexValOpts) string { + switch strings.ToLower(opts.valType) { + case "signed": + return fmt.Sprintf("%v", rand.Intn(opts.distinct)-(opts.distinct/2)) + case "unsigned": + return fmt.Sprintf("%v", rand.Intn(opts.distinct)) + case "string": + return fmt.Sprintf(`"%v"`, strings.Repeat(fmt.Sprintf("%v", rand.Intn(opts.distinct)), rand.Intn(opts.maxStrLen)+1)) + case "date": + return fmt.Sprintf(`"2000-01-%v"`, rand.Intn(opts.distinct)+1) + } + return "" +} diff --git a/planner/core/initialize.go b/planner/core/initialize.go index bb2fc22b60546..4a096b7b49204 100644 --- a/planner/core/initialize.go +++ b/planner/core/initialize.go @@ -597,3 +597,17 @@ func (p PhysicalCTETable) Init(ctx sessionctx.Context, stats *property.StatsInfo p.stats = stats return &p } + +// Init initializes FKCheck. +func (p FKCheck) Init(ctx sessionctx.Context) *FKCheck { + p.basePhysicalPlan = newBasePhysicalPlan(ctx, plancodec.TypeForeignKeyCheck, &p, 0) + p.stats = &property.StatsInfo{} + return &p +} + +// Init initializes FKCascade +func (p FKCascade) Init(ctx sessionctx.Context) *FKCascade { + p.basePhysicalPlan = newBasePhysicalPlan(ctx, plancodec.TypeForeignKeyCascade, &p, 0) + p.stats = &property.StatsInfo{} + return &p +} diff --git a/planner/core/integration_partition_test.go b/planner/core/integration_partition_test.go index 7823f18474ad1..b17dcf6c72812 100644 --- a/planner/core/integration_partition_test.go +++ b/planner/core/integration_partition_test.go @@ -1458,12 +1458,12 @@ func TestRangeColumnsExpr(t *testing.T) { "TableReader 1.14 root partition:p5,p12 data:Selection", "└─Selection 1.14 cop[tikv] in(rce.t.a, 4, 14), in(rce.t.b, NULL, 10)", " └─TableFullScan 21.00 cop[tikv] table:t keep order:false")) - tk.MustQuery(`select * from tref where a in (4,14) and b in (null,10)`).Check(testkit.Rows( - "4 10 3", - "14 10 4")) - tk.MustQuery(`select * from t where a in (4,14) and b in (null,10)`).Check(testkit.Rows( - "4 10 3", - "14 10 4")) + tk.MustQuery(`select * from tref where a in (4,14) and b in (null,10)`).Sort().Check(testkit.Rows( + "14 10 4", + "4 10 3")) + tk.MustQuery(`select * from t where a in (4,14) and b in (null,10)`).Sort().Check(testkit.Rows( + "14 10 4", + "4 10 3")) tk.MustQuery(`explain format = 'brief' select * from t where a in (4,14) and (b in (11,10) OR b is null)`).Check(testkit.Rows( "TableReader 3.43 root partition:p1,p5,p6,p11,p12 data:Selection", "└─Selection 3.43 cop[tikv] in(rce.t.a, 4, 14), or(in(rce.t.b, 11, 10), isnull(rce.t.b))", @@ -1619,3 +1619,79 @@ func TestPartitionRangeColumnPruning(t *testing.T) { tk.MustQuery(`select * from t1 where a = 'a' AND c = 'd'`).Check(testkit.Rows("a d")) tk.MustExec(`drop table t1`) } + +func TestPartitionProcessorWithUninitializedTable(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(" create table q1(a int, b int, key (a)) partition by range (a) (partition p0 values less than (10), partition p1 values less than (20));") + tk.MustExec(" create table q2(a int, b int, key (a)) partition by range (a) (partition p0 values less than (10), partition p1 values less than (20));") + + rows := [][]interface{}{ + {"HashJoin"}, + {"├─PartitionUnion(Build)"}, + {"│ ├─TableReader"}, + {"│ │ └─TableFullScan"}, + {"│ └─TableReader"}, + {"│ └─TableFullScan"}, + {"└─PartitionUnion(Probe)"}, + {" ├─TableReader"}, + {" │ └─TableFullScan"}, + {" └─TableReader"}, + {" └─TableFullScan"}, + } + tk.MustQuery("explain format=brief select * from q1,q2").CheckAt([]int{0}, rows) + + tk.MustExec("analyze table q1") + tk.MustQuery("explain format=brief select * from q1,q2").CheckAt([]int{0}, rows) + + tk.MustExec("analyze table q2") + rows = [][]interface{}{ + {"HashJoin"}, + {"├─TableReader(Build)"}, + {"│ └─TableFullScan"}, + {"└─TableReader(Probe)"}, + {" └─TableFullScan"}, + } + tk.MustQuery("explain format=brief select * from q1,q2").CheckAt([]int{0}, rows) +} + +func TestEstimationForTopNPushToDynamicPartition(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("set tidb_cost_model_version=2") + tk.MustExec("drop table if exists tlist") + tk.MustExec(`set tidb_enable_list_partition = 1`) + tk.MustExec(`create table trange (a int, b int, c int, index ia(a), primary key (b) clustered) + partition by range(b) ( + partition p1 values less than(100), + partition p2 values less than(200), + partition p3 values less than maxvalue);`) + tk.MustExec(`create table tlist (a int, b int, c int, index ia(a), primary key (b) clustered) + partition by list (b) ( + partition p0 values in (0, 1, 2), + partition p1 values in (3, 4, 5));`) + tk.MustExec(`create table thash (a int, b int, c int, index ia(a), primary key (b) clustered) + partition by hash(b) partitions 4;`) + tk.MustExec(`create table t (a int, b int, c int, index ia(a), primary key (b) clustered);`) + tk.MustExec(`analyze table trange;`) + tk.MustExec(`analyze table tlist;`) + tk.MustExec(`analyze table thash;`) + tk.MustExec(`analyze table t;`) + + var input []string + var output []struct { + SQL string + Plan []string + } + integrationPartitionSuiteData := core.GetIntegrationPartitionSuiteData() + integrationPartitionSuiteData.LoadTestCases(t, &input, &output) + for i, tt := range input { + testdata.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) + } +} diff --git a/planner/core/integration_test.go b/planner/core/integration_test.go index cc92541f3bea0..f6cce8454e945 100644 --- a/planner/core/integration_test.go +++ b/planner/core/integration_test.go @@ -1231,9 +1231,9 @@ func TestAggPushDownEngine(t *testing.T) { tk.MustExec("set @@session.tidb_isolation_read_engines = 'tiflash'") tk.MustQuery("explain format = 'brief' select approx_count_distinct(a) from t").Check(testkit.Rows( - "HashAgg 1.00 root funcs:approx_count_distinct(Column#4)->Column#3", - "└─TableReader 1.00 root data:HashAgg", - " └─HashAgg 1.00 batchCop[tiflash] funcs:approx_count_distinct(test.t.a)->Column#4", + "StreamAgg 1.00 root funcs:approx_count_distinct(Column#5)->Column#3", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:approx_count_distinct(test.t.a)->Column#5", " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo")) tk.MustExec("set @@session.tidb_isolation_read_engines = 'tikv'") @@ -1280,6 +1280,27 @@ func TestIssue15110(t *testing.T) { tk.MustExec("explain format = 'brief' SELECT count(*) FROM crm_rd_150m dataset_48 WHERE (CASE WHEN (month(dataset_48.customer_first_date)) <= 30 THEN '新客' ELSE NULL END) IS NOT NULL;") } +func TestIssue40910(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec(`create table t(a int, b int, index idx_a(a), index idx_b(b));`) + + tk.MustExec("select * from t where a > 1 and a < 10 order by b;") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) + tk.MustExec("create session binding for select * from t where a > 1 and a < 10 order by b using select /*+ use_index(t, idx_a) */ * from t where a > 1 and a < 10 order by b;") + tk.MustExec("select * from t where a > 1 and a < 10 order by b;") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) + + tk.MustExec("select /*+ use_index(t, idx_b) */ * from t where a > 1 and a < 10 order by b;") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) + + tk.MustExec("select /*+ use_index(t, idx_b) */ * from t where a > 1 and a < 10 order by b;") + tk.MustQuery("show warnings").Check(testkit.Rows( + "Warning 1105 The system ignores the hints in the current query and uses the hints specified in the bindSQL: SELECT /*+ use_index(`t` `idx_a`)*/ * FROM `test`.`t` WHERE `a` > 1 AND `a` < 10 ORDER BY `b`")) +} + func TestReadFromStorageHint(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -1324,13 +1345,102 @@ func TestReadFromStorageHint(t *testing.T) { } } -func TestViewHint(t *testing.T) { +func TestKeepOrderHint(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set tidb_cost_model_version=2") + tk.MustExec("drop table if exists t, t1, th") tk.MustExec("drop view if exists v, v1") + tk.MustExec("create table t(a int, b int, primary key(a));") + tk.MustExec("create table t1(a int, b int, index idx_a(a));") + tk.MustExec("create table th (a int, key(a)) partition by hash(a) partitions 4;") + tk.MustExec("create definer='root'@'localhost' view v as select * from t1 where a<10 order by a limit 1;") + tk.MustExec("create definer='root'@'localhost' view v1 as select * from t where a<10 order by a limit 1;") + + // If the optimizer can not generate the keep order plan, it will report error + err := tk.ExecToErr("explain select /*+ order_index(t1, idx_a) */ * from t1 where a<10 limit 1;") + require.EqualError(t, err, "[planner:1815]Internal : Can't find a proper physical plan for this query") + + err = tk.ExecToErr("explain select /*+ order_index(t, primary) */ * from t where a<10 limit 1;") + require.EqualError(t, err, "[planner:1815]Internal : Can't find a proper physical plan for this query") + + // The partition table can not keep order + tk.MustExec("analyze table th;") + err = tk.ExecToErr("select a from th where a<1 order by a limit 1;") + require.NoError(t, err) + + err = tk.ExecToErr("select /*+ order_index(th, a) */ a from th where a<1 order by a limit 1;") + require.EqualError(t, err, "[planner:1815]Internal : Can't find a proper physical plan for this query") + + var input []string + var output []struct { + SQL string + Plan []string + Warn []string + } + integrationSuiteData := core.GetIntegrationSuiteData() + integrationSuiteData.LoadTestCases(t, &input, &output) + for i, tt := range input { + testdata.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + output[i].Warn = testdata.ConvertSQLWarnToStrings(tk.Session().GetSessionVars().StmtCtx.GetWarnings()) + }) + res := tk.MustQuery(tt) + res.Check(testkit.Rows(output[i].Plan...)) + require.Equal(t, output[i].Warn, testdata.ConvertSQLWarnToStrings(tk.Session().GetSessionVars().StmtCtx.GetWarnings())) + } +} + +func TestKeepOrderHintWithBinding(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("set tidb_cost_model_version=2") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(a int, b int, index idx_a(a));") + + // create binding for order_index hint + tk.MustExec("select * from t1 where a<10 order by a limit 1;") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) + tk.MustExec("create global binding for select * from t1 where a<10 order by a limit 1 using select /*+ order_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;") + tk.MustExec("select * from t1 where a<10 order by a limit 1;") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) + res := tk.MustQuery("show global bindings").Rows() + require.Equal(t, res[0][0], "select * from `test` . `t1` where `a` < ? order by `a` limit ?") + require.Equal(t, res[0][1], "SELECT /*+ order_index(`t1` `idx_a`)*/ * FROM `test`.`t1` WHERE `a` < 10 ORDER BY `a` LIMIT 1") + + tk.MustExec("drop global binding for select * from t1 where a<10 order by a limit 1;") + tk.MustExec("select * from t1 where a<10 order by a limit 1;") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) + res = tk.MustQuery("show global bindings").Rows() + require.Equal(t, len(res), 0) + + // create binding for no_order_index hint + tk.MustExec("create global binding for select * from t1 where a<10 order by a limit 1 using select /*+ no_order_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;") + tk.MustExec("select * from t1 where a<10 order by a limit 1;") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) + res = tk.MustQuery("show global bindings").Rows() + require.Equal(t, res[0][0], "select * from `test` . `t1` where `a` < ? order by `a` limit ?") + require.Equal(t, res[0][1], "SELECT /*+ no_order_index(`t1` `idx_a`)*/ * FROM `test`.`t1` WHERE `a` < 10 ORDER BY `a` LIMIT 1") + + tk.MustExec("drop global binding for select * from t1 where a<10 order by a limit 1;") + tk.MustExec("select * from t1 where a<10 order by a limit 1;") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) + res = tk.MustQuery("show global bindings").Rows() + require.Equal(t, len(res), 0) +} + +func TestViewHint(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("set tidb_cost_model_version=2") + tk.MustExec("drop view if exists v, v1, v2") tk.MustExec("drop table if exists t, t1, t2") tk.MustExec("create table t(a int, b int);") tk.MustExec("create table t1(a int, b int);") @@ -1363,10 +1473,49 @@ func TestViewHintScope(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("set tidb_cost_model_version=2") + tk.MustExec("drop view if exists v, v1, v2, v3, v4") + tk.MustExec("drop table if exists t, t1, t2, t3, t4") + tk.MustExec("create table t(a int, b int);") + tk.MustExec("create table t1(a int, b int);") + tk.MustExec("create table t2(a int, b int);") + tk.MustExec("create table t3(a int, b int)") + tk.MustExec("create table t4(a int, b int, index idx_a(a), index idx_b(b))") + tk.MustExec("create definer='root'@'localhost' view v as select t.a, t.b from t join (select count(*) as a from t1 join t2 join t3 where t1.b=t2.b and t2.a = t3.a group by t2.a) tt on t.a = tt.a;") + tk.MustExec("create definer='root'@'localhost' view v1 as select t.a, t.b from t join (select count(*) as a from t1 join v on t1.b=v.b group by v.a) tt on t.a = tt.a;") + tk.MustExec("create definer='root'@'localhost' view v2 as select t.a, t.b from t join (select count(*) as a from t1 join v1 on t1.b=v1.b group by v1.a) tt on t.a = tt.a;") + tk.MustExec("create definer='root'@'localhost' view v3 as select /*+ merge_join(t) */ t.a, t.b from t join (select /*+ stream_agg() */ count(*) as a from t1 join v1 on t1.b=v1.b group by v1.a) tt on t.a = tt.a;") + tk.MustExec("create definer='root'@'localhost' view v4 as select * from t4 where a > 2 and b > 3;") + + var input []string + var output []struct { + SQL string + Plan []string + Warn []string + } + integrationSuiteData := core.GetIntegrationSuiteData() + integrationSuiteData.LoadTestCases(t, &input, &output) + for i, tt := range input { + testdata.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + output[i].Warn = testdata.ConvertSQLWarnToStrings(tk.Session().GetSessionVars().StmtCtx.GetWarnings()) + }) + res := tk.MustQuery(tt) + res.Check(testkit.Rows(output[i].Plan...)) + require.Equal(t, output[i].Warn, testdata.ConvertSQLWarnToStrings(tk.Session().GetSessionVars().StmtCtx.GetWarnings())) + } +} + +func TestViewHintWithBinding(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("set tidb_cost_model_version=2") tk.MustExec("drop view if exists v, v1") - tk.MustExec("drop table if exists t, t1, t2") + tk.MustExec("drop table if exists t, t1, t2, t3") tk.MustExec("create table t(a int, b int);") tk.MustExec("create table t1(a int, b int);") tk.MustExec("create table t2(a int, b int);") @@ -1375,6 +1524,67 @@ func TestViewHintScope(t *testing.T) { tk.MustExec("create definer='root'@'localhost' view v1 as select t.a, t.b from t join (select count(*) as a from t1 join v on t1.b=v.b group by v.a) tt on t.a = tt.a;") tk.MustExec("create definer='root'@'localhost' view v2 as select t.a, t.b from t join (select count(*) as a from t1 join v1 on t1.b=v1.b group by v1.a) tt on t.a = tt.a;") + tk.MustExec("select * from v2") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) + tk.MustExec("create global binding for select * from v2 using select /*+ qb_name(qb_v_2, v2.v1@sel_2 .v@sel_2 .@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v2. v1@sel_2 .v@sel_2 .@sel_1), merge_join(t@qb_v_1) */ * from v2;") + tk.MustExec("select * from v2") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) + res := tk.MustQuery("show global bindings").Rows() + require.Equal(t, res[0][0], "select * from `test` . `v2`") + require.Equal(t, res[0][1], "SELECT /*+ qb_name(`qb_v_2` , `v2`. `v1`@`sel_2`. `v`@`sel_2`. ``@`sel_2`) merge_join(`t1`@`qb_v_2`) stream_agg(@`qb_v_2`) qb_name(`qb_v_1` , `v2`. `v1`@`sel_2`. `v`@`sel_2`. ``@`sel_1`) merge_join(`t`@`qb_v_1`)*/ * FROM `test`.`v2`") + + tk.MustExec("drop global binding for select * from v2") + tk.MustExec("select * from v2") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) + res = tk.MustQuery("show global bindings").Rows() + require.Equal(t, len(res), 0) +} + +func TestAllViewHintType(t *testing.T) { + store := testkit.CreateMockStore(t, withMockTiFlash(2)) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("set tidb_cost_model_version=2") + tk.MustExec("set @@session.tidb_allow_mpp=ON") + tk.MustExec("set @@session.tidb_isolation_read_engines='tiflash, tikv'") + tk.MustExec("drop view if exists v, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12") + tk.MustExec("drop table if exists t, t1, t2, t4, t3, t5") + tk.MustExec("create table t(a int not null, b int, index idx_a(a));") + tk.MustExec("create table t1(a int not null, b int, index idx_a(a));") + tk.MustExec("create table t2(a int, b int, index idx_a(a));") + tk.MustExec("create table t3(a int, b int, index idx_a(a));") + tk.MustExec("create table t4(a int, b int, index idx_a(a));") + tk.MustExec("create table t5(a int, b int, index idx_a(a), index idx_b(b));") + + // Create virtual tiflash replica info. + dom := domain.GetDomain(tk.Session()) + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + require.True(t, exists) + for _, tblInfo := range db.Tables { + if tblInfo.Name.L == "t" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + + tk.MustExec("create definer='root'@'localhost' view v as select t.a, t.b from t join t1 on t.a = t1.a;") + tk.MustExec("create definer='root'@'localhost' view v1 as select t2.a, t2.b from t2 join t3 join v where t2.b = t3.b and t3.a = v.a;") + tk.MustExec("create definer='root'@'localhost' view v2 as select t.a, t.b from t join (select count(*) as a from t1 join v1 on t1.b=v1.b group by v1.a) tt on t.a = tt.a;") + tk.MustExec("create definer='root'@'localhost' view v3 as select * from t5 where a > 1 and b < 2;") + tk.MustExec("create definer='root'@'localhost' view v4 as select * from t5 where a > 1 or b < 2;") + tk.MustExec("create definer='root'@'localhost' view v5 as SELECT * FROM t WHERE EXISTS (SELECT 1 FROM t1 WHERE t1.b = t.b);") + tk.MustExec("create definer='root'@'localhost' view v6 as select * from t1 where t1.a < (select sum(t2.a) from t2 where t2.b = t1.b);") + tk.MustExec("create definer='root'@'localhost' view v7 as WITH CTE AS (SELECT * FROM t WHERE t.a < 60) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;") + tk.MustExec("create definer='root'@'localhost' view v8 as WITH CTE1 AS (SELECT b FROM t1), CTE2 AS (WITH CTE3 AS (SELECT a FROM t2), CTE4 AS (SELECT a FROM t3) SELECT CTE3.a FROM CTE3, CTE4) SELECT b FROM CTE1, CTE2 union select * from CTE1;") + tk.MustExec("create definer='root'@'localhost' view v9 as select sum(a) from t;") + tk.MustExec("create definer='root'@'localhost' view v10 as SELECT * FROM t WHERE a > 10 ORDER BY b LIMIT 1;") + tk.MustExec("create definer='root'@'localhost' view v11 as select a, sum(b) from t group by a") + tk.MustExec("create definer='root'@'localhost' view v12 as select t.a, t.b from t join t t1 on t.a = t1.a;") + var input []string var output []struct { SQL string @@ -2251,7 +2461,7 @@ func TestIssue16837(t *testing.T) { tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int,b int,c int,d int,e int,unique key idx_ab(a,b),unique key(c),unique key(d))") tk.MustQuery("explain format = 'brief' select /*+ use_index_merge(t,c,idx_ab) */ * from t where a = 1 or (e = 1 and c = 1)").Check(testkit.Rows( - "IndexMerge 0.01 root ", + "IndexMerge 0.01 root type: union", "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_ab(a, b) range:[1,1], keep order:false, stats:pseudo", "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:c(c) range:[1,1], keep order:false, stats:pseudo", "└─Selection(Probe) 0.01 cop[tikv] or(eq(test.t.a, 1), and(eq(test.t.e, 1), eq(test.t.c, 1)))", @@ -2492,7 +2702,7 @@ func TestIssue16407(t *testing.T) { tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int,b char(100),key(a),key(b(10)))") tk.MustQuery("explain format = 'brief' select /*+ use_index_merge(t) */ * from t where a=10 or b='x'").Check(testkit.Rows( - "IndexMerge 0.04 root ", + "IndexMerge 0.04 root type: union", "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:a(a) range:[10,10], keep order:false, stats:pseudo", "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:b(b) range:[\"x\",\"x\"], keep order:false, stats:pseudo", "└─Selection(Probe) 0.04 cop[tikv] or(eq(test.t.a, 10), eq(test.t.b, \"x\"))", @@ -2837,7 +3047,7 @@ func TestTimeToSecPushDownToTiFlash(t *testing.T) { } rows := [][]interface{}{ - {"TableReader_9", "10000.00", "root", " data:ExchangeSender_8"}, + {"TableReader_9", "10000.00", "root", " MppVersion: 1, data:ExchangeSender_8"}, {"└─ExchangeSender_8", "10000.00", "mpp[tiflash]", " ExchangeType: PassThrough"}, {" └─Projection_4", "10000.00", "mpp[tiflash]", " time_to_sec(test.t.a)->Column#3"}, {" └─TableFullScan_7", "10000.00", "mpp[tiflash]", "table:t", "keep order:false, stats:pseudo"}, @@ -2871,7 +3081,7 @@ func TestRightShiftPushDownToTiFlash(t *testing.T) { } rows := [][]interface{}{ - {"TableReader_9", "root", "data:ExchangeSender_8"}, + {"TableReader_9", "root", "MppVersion: 1, data:ExchangeSender_8"}, {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, {" └─Projection_4", "mpp[tiflash]", "rightshift(test.t.a, test.t.b)->Column#4"}, {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, @@ -3277,6 +3487,10 @@ func TestScalarFunctionPushDown(t *testing.T) { tk.MustQuery("explain analyze select /*+read_from_storage(tikv[t])*/ * from t where ascii(e);"). CheckAt([]int{0, 3, 6}, rows) + rows[1][2] = "eq(json_valid(test.t.c), 1)" + tk.MustQuery("explain analyze select /*+read_from_storage(tikv[t])*/ * from t where json_valid(c)=1;"). + CheckAt([]int{0, 3, 6}, rows) + rows[1][2] = "json_contains(cast(test.t.c, json BINARY), cast(\"1\", json BINARY))" tk.MustQuery("explain analyze select /*+read_from_storage(tikv[t])*/ * from t where json_contains(c, '1');"). CheckAt([]int{0, 3, 6}, rows) @@ -3319,7 +3533,7 @@ func TestReverseUTF8PushDownToTiFlash(t *testing.T) { } rows := [][]interface{}{ - {"TableReader_9", "root", "data:ExchangeSender_8"}, + {"TableReader_9", "root", "MppVersion: 1, data:ExchangeSender_8"}, {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, {" └─Projection_4", "mpp[tiflash]", "reverse(test.t.a)->Column#3"}, {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, @@ -3353,7 +3567,7 @@ func TestReversePushDownToTiFlash(t *testing.T) { } rows := [][]interface{}{ - {"TableReader_9", "root", "data:ExchangeSender_8"}, + {"TableReader_9", "root", "MppVersion: 1, data:ExchangeSender_8"}, {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, {" └─Projection_4", "mpp[tiflash]", "reverse(test.t.a)->Column#3"}, {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, @@ -3387,7 +3601,7 @@ func TestSpacePushDownToTiFlash(t *testing.T) { } rows := [][]interface{}{ - {"TableReader_9", "root", "data:ExchangeSender_8"}, + {"TableReader_9", "root", "MppVersion: 1, data:ExchangeSender_8"}, {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, {" └─Projection_4", "mpp[tiflash]", "space(test.t.a)->Column#3"}, {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, @@ -4810,6 +5024,64 @@ func TestMppJoinExchangeColumnPrune(t *testing.T) { } } +func TestMppFineGrainedJoinAndAgg(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists tt") + tk.MustExec("create table t (c1 int, c2 int, c3 int NOT NULL, c4 int NOT NULL, c5 int)") + tk.MustExec("create table tt (b1 int)") + tk.MustExec("analyze table t") + tk.MustExec("analyze table tt") + + instances := []string{ + "tiflash,127.0.0.1:3933,127.0.0.1:7777,,", + "tikv,127.0.0.1:11080,127.0.0.1:10080,,", + } + fpName := "github.com/pingcap/tidb/infoschema/mockStoreServerInfo" + fpExpr := `return("` + strings.Join(instances, ";") + `")` + require.NoError(t, failpoint.Enable(fpName, fpExpr)) + defer func() { require.NoError(t, failpoint.Disable(fpName)) }() + fpName2 := "github.com/pingcap/tidb/planner/core/mockTiFlashStreamCountUsingMinLogicalCores" + require.NoError(t, failpoint.Enable(fpName2, `return("8")`)) + defer func() { require.NoError(t, failpoint.Disable(fpName2)) }() + + // Create virtual tiflash replica info. + dom := domain.GetDomain(tk.Session()) + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + require.True(t, exists) + for _, tblInfo := range db.Tables { + if tblInfo.Name.L == "t" || tblInfo.Name.L == "tt" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + + tk.MustExec("set @@tidb_allow_mpp=1;") + tk.MustExec("set @@session.tidb_broadcast_join_threshold_size = 1") + tk.MustExec("set @@session.tidb_broadcast_join_threshold_count = 1") + + var input []string + var output []struct { + SQL string + Plan []string + } + integrationSuiteData := core.GetIntegrationSuiteData() + integrationSuiteData.LoadTestCases(t, &input, &output) + for i, tt := range input { + testdata.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + res := tk.MustQuery(tt) + res.Check(testkit.Rows(output[i].Plan...)) + } +} + func TestMppAggTopNWithJoin(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -4936,7 +5208,7 @@ func TestIndexMergeTableFilter(t *testing.T) { tk.MustExec("insert into t values(10,1,1,10)") tk.MustQuery("explain format = 'brief' select /*+ use_index_merge(t) */ * from t where a=10 or (b=10 and c=10)").Check(testkit.Rows( - "IndexMerge 0.02 root ", + "IndexMerge 0.02 root type: union", "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:a(a) range:[10,10], keep order:false, stats:pseudo", "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:b(b) range:[10,10], keep order:false, stats:pseudo", "└─Selection(Probe) 0.02 cop[tikv] or(eq(test.t.a, 10), and(eq(test.t.b, 10), eq(test.t.c, 10)))", @@ -4946,7 +5218,7 @@ func TestIndexMergeTableFilter(t *testing.T) { "10 1 1 10", )) tk.MustQuery("explain format = 'brief' select /*+ use_index_merge(t) */ * from t where (a=10 and d=10) or (b=10 and c=10)").Check(testkit.Rows( - "IndexMerge 0.00 root ", + "IndexMerge 0.00 root type: union", "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:a(a) range:[10,10], keep order:false, stats:pseudo", "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:b(b) range:[10,10], keep order:false, stats:pseudo", "└─Selection(Probe) 0.00 cop[tikv] or(and(eq(test.t.a, 10), eq(test.t.d, 10)), and(eq(test.t.b, 10), eq(test.t.c, 10)))", @@ -5597,36 +5869,36 @@ func TestIssue29221(t *testing.T) { tk.MustExec("set @@session.sql_select_limit=3;") tk.MustQuery("explain format = 'brief' select * from t where a = 1 or b = 1;").Check(testkit.Rows( "Limit 3.00 root offset:0, count:3", - "└─IndexMerge 3.00 root ", + "└─IndexMerge 3.00 root type: union", " ├─IndexRangeScan(Build) 1.50 cop[tikv] table:t, index:idx_a(a) range:[1,1], keep order:false, stats:pseudo", " ├─IndexRangeScan(Build) 1.50 cop[tikv] table:t, index:idx_b(b) range:[1,1], keep order:false, stats:pseudo", " └─TableRowIDScan(Probe) 3.00 cop[tikv] table:t keep order:false, stats:pseudo")) tk.MustQuery("explain format = 'brief' select /*+ use_index_merge(t) */ * from t where a = 1 or b = 1;").Check(testkit.Rows( "Limit 3.00 root offset:0, count:3", - "└─IndexMerge 3.00 root ", + "└─IndexMerge 3.00 root type: union", " ├─IndexRangeScan(Build) 1.50 cop[tikv] table:t, index:idx_a(a) range:[1,1], keep order:false, stats:pseudo", " ├─IndexRangeScan(Build) 1.50 cop[tikv] table:t, index:idx_b(b) range:[1,1], keep order:false, stats:pseudo", " └─TableRowIDScan(Probe) 3.00 cop[tikv] table:t keep order:false, stats:pseudo")) tk.MustExec("set @@session.sql_select_limit=18446744073709551615;") tk.MustQuery("explain format = 'brief' select * from t where a = 1 or b = 1;").Check(testkit.Rows( - "IndexMerge 19.99 root ", + "IndexMerge 19.99 root type: union", "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_a(a) range:[1,1], keep order:false, stats:pseudo", "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_b(b) range:[1,1], keep order:false, stats:pseudo", "└─TableRowIDScan(Probe) 19.99 cop[tikv] table:t keep order:false, stats:pseudo")) tk.MustQuery("explain format = 'brief' select * from t where a = 1 or b = 1 limit 3;").Check(testkit.Rows( "Limit 3.00 root offset:0, count:3", - "└─IndexMerge 3.00 root ", + "└─IndexMerge 3.00 root type: union", " ├─IndexRangeScan(Build) 1.50 cop[tikv] table:t, index:idx_a(a) range:[1,1], keep order:false, stats:pseudo", " ├─IndexRangeScan(Build) 1.50 cop[tikv] table:t, index:idx_b(b) range:[1,1], keep order:false, stats:pseudo", " └─TableRowIDScan(Probe) 3.00 cop[tikv] table:t keep order:false, stats:pseudo")) tk.MustQuery("explain format = 'brief' select /*+ use_index_merge(t) */ * from t where a = 1 or b = 1;").Check(testkit.Rows( - "IndexMerge 19.99 root ", + "IndexMerge 19.99 root type: union", "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_a(a) range:[1,1], keep order:false, stats:pseudo", "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_b(b) range:[1,1], keep order:false, stats:pseudo", "└─TableRowIDScan(Probe) 19.99 cop[tikv] table:t keep order:false, stats:pseudo")) tk.MustQuery("explain format = 'brief' select /*+ use_index_merge(t) */ * from t where a = 1 or b = 1 limit 3;").Check(testkit.Rows( "Limit 3.00 root offset:0, count:3", - "└─IndexMerge 3.00 root ", + "└─IndexMerge 3.00 root type: union", " ├─IndexRangeScan(Build) 1.50 cop[tikv] table:t, index:idx_a(a) range:[1,1], keep order:false, stats:pseudo", " ├─IndexRangeScan(Build) 1.50 cop[tikv] table:t, index:idx_b(b) range:[1,1], keep order:false, stats:pseudo", " └─TableRowIDScan(Probe) 3.00 cop[tikv] table:t keep order:false, stats:pseudo")) @@ -5693,62 +5965,6 @@ func TestIssue29503(t *testing.T) { require.Len(t, res.Rows(), 2) } -func TestIndexJoinCost(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set tidb_cost_model_version=2") - tk.MustExec(`drop table if exists t_outer, t_inner_pk, t_inner_idx`) - tk.MustExec(`create table t_outer (a int)`) - tk.MustExec(`create table t_inner_pk (a int primary key)`) - tk.MustExec(`create table t_inner_idx (a int, b int, key(a))`) - - // Default RPC encoding may cause statistics explain result differ and then the test unstable. - tk.MustExec("set @@tidb_enable_chunk_rpc = on") - - tk.MustQuery(`explain format=verbose select /*+ TIDB_INLJ(t_outer, t_inner_pk) */ * from t_outer, t_inner_pk where t_outer.a=t_inner_pk.a`).Check(testkit.Rows( // IndexJoin with inner TableScan - `IndexJoin_11 12487.50 11918182.35 root inner join, inner:TableReader_8, outer key:test.t_outer.a, inner key:test.t_inner_pk.a, equal cond:eq(test.t_outer.a, test.t_inner_pk.a)`, - `├─TableReader_18(Build) 9990.00 211131.09 root data:Selection_17`, - `│ └─Selection_17 9990.00 2534000.00 cop[tikv] not(isnull(test.t_outer.a))`, - `│ └─TableFullScan_16 10000.00 2035000.00 cop[tikv] table:t_outer keep order:false, stats:pseudo`, - `└─TableReader_8(Probe) 9990.00 10.25 root data:TableRangeScan_7`, - ` └─TableRangeScan_7 9990.00 122.10 cop[tikv] table:t_inner_pk range: decided by [test.t_outer.a], keep order:false, stats:pseudo`)) - tk.MustQuery(`explain format=verbose select /*+ TIDB_INLJ(t_outer, t_inner_idx) */ t_inner_idx.a from t_outer, t_inner_idx where t_outer.a=t_inner_idx.a`).Check(testkit.Rows( // IndexJoin with inner IndexScan - `IndexJoin_10 12487.50 11918207.26 root inner join, inner:IndexReader_9, outer key:test.t_outer.a, inner key:test.t_inner_idx.a, equal cond:eq(test.t_outer.a, test.t_inner_idx.a)`, - `├─TableReader_20(Build) 9990.00 211131.09 root data:Selection_19`, - `│ └─Selection_19 9990.00 2534000.00 cop[tikv] not(isnull(test.t_outer.a))`, - `│ └─TableFullScan_18 10000.00 2035000.00 cop[tikv] table:t_outer keep order:false, stats:pseudo`, - `└─IndexReader_9(Probe) 12487.50 23.02 root index:Selection_8`, - ` └─Selection_8 12487.50 266.14 cop[tikv] not(isnull(test.t_inner_idx.a))`, - ` └─IndexRangeScan_7 12500.00 203.70 cop[tikv] table:t_inner_idx, index:a(a) range: decided by [eq(test.t_inner_idx.a, test.t_outer.a)], keep order:false, stats:pseudo`)) - tk.MustQuery(`explain format=verbose select /*+ TIDB_INLJ(t_outer, t_inner_idx) */ * from t_outer, t_inner_idx where t_outer.a=t_inner_idx.a`).Check(testkit.Rows( // IndexJoin with inner IndexLookup - `IndexJoin_11 12487.50 11922930.69 root inner join, inner:IndexLookUp_10, outer key:test.t_outer.a, inner key:test.t_inner_idx.a, equal cond:eq(test.t_outer.a, test.t_inner_idx.a)`, - `├─TableReader_23(Build) 9990.00 211131.09 root data:Selection_22`, - `│ └─Selection_22 9990.00 2534000.00 cop[tikv] not(isnull(test.t_outer.a))`, - `│ └─TableFullScan_21 10000.00 2035000.00 cop[tikv] table:t_outer keep order:false, stats:pseudo`, - `└─IndexLookUp_10(Probe) 12487.50 2443.84 root `, - ` ├─Selection_9(Build) 12487.50 317.07 cop[tikv] not(isnull(test.t_inner_idx.a))`, - ` │ └─IndexRangeScan_7 12500.00 254.63 cop[tikv] table:t_inner_idx, index:a(a) range: decided by [eq(test.t_inner_idx.a, test.t_outer.a)], keep order:false, stats:pseudo`, - ` └─TableRowIDScan_8(Probe) 12487.50 284.13 cop[tikv] table:t_inner_idx keep order:false, stats:pseudo`)) - - tk.MustQuery("explain format=verbose select /*+ inl_hash_join(t_outer, t_inner_idx) */ t_inner_idx.a from t_outer, t_inner_idx where t_outer.a=t_inner_idx.a").Check(testkit.Rows( - `IndexHashJoin_12 12487.50 11918207.26 root inner join, inner:IndexReader_9, outer key:test.t_outer.a, inner key:test.t_inner_idx.a, equal cond:eq(test.t_outer.a, test.t_inner_idx.a)`, - `├─TableReader_20(Build) 9990.00 211131.09 root data:Selection_19`, - `│ └─Selection_19 9990.00 2534000.00 cop[tikv] not(isnull(test.t_outer.a))`, - `│ └─TableFullScan_18 10000.00 2035000.00 cop[tikv] table:t_outer keep order:false, stats:pseudo`, - `└─IndexReader_9(Probe) 12487.50 23.02 root index:Selection_8`, - ` └─Selection_8 12487.50 266.14 cop[tikv] not(isnull(test.t_inner_idx.a))`, - ` └─IndexRangeScan_7 12500.00 203.70 cop[tikv] table:t_inner_idx, index:a(a) range: decided by [eq(test.t_inner_idx.a, test.t_outer.a)], keep order:false, stats:pseudo`)) - tk.MustQuery("explain format=verbose select /*+ inl_merge_join(t_outer, t_inner_idx) */ t_inner_idx.a from t_outer, t_inner_idx where t_outer.a=t_inner_idx.a").Check(testkit.Rows( - `IndexMergeJoin_17 12487.50 11918207.26 root inner join, inner:IndexReader_15, outer key:test.t_outer.a, inner key:test.t_inner_idx.a`, - `├─TableReader_20(Build) 9990.00 211131.09 root data:Selection_19`, - `│ └─Selection_19 9990.00 2534000.00 cop[tikv] not(isnull(test.t_outer.a))`, - `│ └─TableFullScan_18 10000.00 2035000.00 cop[tikv] table:t_outer keep order:false, stats:pseudo`, - `└─IndexReader_15(Probe) 12487.50 23.02 root index:Selection_14`, - ` └─Selection_14 12487.50 266.14 cop[tikv] not(isnull(test.t_inner_idx.a))`, - ` └─IndexRangeScan_13 12500.00 203.70 cop[tikv] table:t_inner_idx, index:a(a) range: decided by [eq(test.t_inner_idx.a, test.t_outer.a)], keep order:true, stats:pseudo`)) -} - func TestHeuristicIndexSelection(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -6587,7 +6803,7 @@ func TestIssue31202(t *testing.T) { tbl.Meta().TiFlashReplica = &model.TiFlashReplicaInfo{Count: 1, Available: true} tk.MustQuery("explain format = 'brief' select * from t31202;").Check(testkit.Rows( - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─TableFullScan 10000.00 mpp[tiflash] table:t31202 keep order:false, stats:pseudo")) @@ -6649,7 +6865,7 @@ func TestAggPushToCopForCachedTable(t *testing.T) { tk.MustExec("alter table t32157 cache") tk.MustQuery("explain format = 'brief' select /*+AGG_TO_COP()*/ count(*) from t32157 ignore index(primary) where process_code = 'GDEP0071'").Check(testkit.Rows( - "HashAgg 1.00 root funcs:count(1)->Column#8]\n" + + "StreamAgg 1.00 root funcs:count(1)->Column#8]\n" + "[└─UnionScan 10.00 root eq(test.t32157.process_code, \"GDEP0071\")]\n" + "[ └─TableReader 10.00 root data:Selection]\n" + "[ └─Selection 10.00 cop[tikv] eq(test.t32157.process_code, \"GDEP0071\")]\n" + @@ -6768,6 +6984,7 @@ func TestTiFlashPartitionTableScan(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set tidb_cost_model_version=1") tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic'") tk.MustExec("set @@tidb_isolation_read_engines = 'tiflash'") tk.MustExec("set @@tidb_enforce_mpp = on") @@ -7121,7 +7338,7 @@ func TestRepeatPushDownToTiFlash(t *testing.T) { } rows := [][]interface{}{ - {"TableReader_9", "root", "data:ExchangeSender_8"}, + {"TableReader_9", "root", "MppVersion: 1, data:ExchangeSender_8"}, {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, {" └─Projection_4", "mpp[tiflash]", "repeat(cast(test.t.a, var_string(20)), test.t.b)->Column#4"}, {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, @@ -7150,7 +7367,7 @@ func TestIssue36194(t *testing.T) { } tk.MustQuery("explain format = 'brief' select /*+ read_from_storage(tiflash[t]) */ * from t where a + 1 > 20 limit 100;;").Check(testkit.Rows( "Limit 100.00 root offset:0, count:100", - "└─TableReader 100.00 root data:ExchangeSender", + "└─TableReader 100.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 100.00 mpp[tiflash] ExchangeType: PassThrough", " └─Limit 100.00 mpp[tiflash] offset:0, count:100", " └─Selection 100.00 mpp[tiflash] gt(plus(test.t.a, 1), 20)", @@ -7173,7 +7390,7 @@ func TestGetFormatPushDownToTiFlash(t *testing.T) { tbl.Meta().TiFlashReplica = &model.TiFlashReplicaInfo{Count: 1, Available: true} tk.MustQuery("explain format = 'brief' select GET_FORMAT(DATE, location) from t;").Check(testkit.Rows( - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 10000.00 mpp[tiflash] get_format(DATE, test.t.location)->Column#3", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo")) @@ -7254,7 +7471,7 @@ func TestLeftShiftPushDownToTiFlash(t *testing.T) { } rows := [][]interface{}{ - {"TableReader_9", "root", "data:ExchangeSender_8"}, + {"TableReader_9", "root", "MppVersion: 1, data:ExchangeSender_8"}, {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, {" └─Projection_4", "mpp[tiflash]", "leftshift(test.t.a, test.t.b)->Column#4"}, {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, @@ -7293,7 +7510,7 @@ func TestHexIntOrStrPushDownToTiFlash(t *testing.T) { tbl.Meta().TiFlashReplica = &model.TiFlashReplicaInfo{Count: 1, Available: true} rows := [][]interface{}{ - {"TableReader_9", "root", "data:ExchangeSender_8"}, + {"TableReader_9", "root", "MppVersion: 1, data:ExchangeSender_8"}, {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, {" └─Projection_4", "mpp[tiflash]", "hex(test.t.a)->Column#4"}, {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, @@ -7301,7 +7518,7 @@ func TestHexIntOrStrPushDownToTiFlash(t *testing.T) { tk.MustQuery("explain select hex(a) from t;").CheckAt([]int{0, 2, 4}, rows) rows = [][]interface{}{ - {"TableReader_9", "root", "data:ExchangeSender_8"}, + {"TableReader_9", "root", "MppVersion: 1, data:ExchangeSender_8"}, {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, {" └─Projection_4", "mpp[tiflash]", "hex(test.t.b)->Column#4"}, {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, @@ -7326,7 +7543,7 @@ func TestBinPushDownToTiFlash(t *testing.T) { tbl.Meta().TiFlashReplica = &model.TiFlashReplicaInfo{Count: 1, Available: true} rows := [][]interface{}{ - {"TableReader_9", "root", "data:ExchangeSender_8"}, + {"TableReader_9", "root", "MppVersion: 1, data:ExchangeSender_8"}, {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, {" └─Projection_4", "mpp[tiflash]", "bin(test.t.a)->Column#3"}, {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, @@ -7360,7 +7577,7 @@ func TestEltPushDownToTiFlash(t *testing.T) { } rows := [][]interface{}{ - {"TableReader_9", "root", "data:ExchangeSender_8"}, + {"TableReader_9", "root", "MppVersion: 1, data:ExchangeSender_8"}, {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, {" └─Projection_4", "mpp[tiflash]", "elt(test.t.a, test.t.b)->Column#4"}, {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, @@ -7368,6 +7585,105 @@ func TestEltPushDownToTiFlash(t *testing.T) { tk.MustQuery("explain select elt(a, b) from t;").CheckAt([]int{0, 2, 4}, rows) } +func TestRegexpInstrPushDownToTiFlash(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists test.t;") + tk.MustExec("create table test.t (expr varchar(30), pattern varchar(30), pos int, occur int, ret_op int, match_type varchar(30));") + tk.MustExec("insert into test.t values ('123', '12.', 1, 1, 0, ''), ('aBb', 'bb', 1, 1, 0, 'i'), ('ab\nabc', '^abc$', 1, 1, 0, 'm');") + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_enforce_mpp=1") + tk.MustExec("set @@tidb_isolation_read_engines = 'tiflash'") + + // Create virtual tiflash replica info. + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + require.True(t, exists) + for _, tblInfo := range db.Tables { + if tblInfo.Name.L == "t" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + + rows := [][]interface{}{ + {"TableReader_9", "root", "MppVersion: 1, data:ExchangeSender_8"}, + {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, + {" └─Projection_4", "mpp[tiflash]", "regexp_instr(test.t.expr, test.t.pattern, 1, 1, 0, test.t.match_type)->Column#8"}, + {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, + } + tk.MustQuery("explain select regexp_instr(expr, pattern, 1, 1, 0, match_type) as res from test.t;").CheckAt([]int{0, 2, 4}, rows) +} + +func TestRegexpSubstrPushDownToTiFlash(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists test.t;") + tk.MustExec("create table test.t (expr varchar(30), pattern varchar(30), pos int, occur int, match_type varchar(30));") + tk.MustExec("insert into test.t values ('123', '12.', 1, 1, ''), ('aBb', 'bb', 1, 1, 'i'), ('ab\nabc', '^abc$', 1, 1, 'm');") + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_enforce_mpp=1") + tk.MustExec("set @@tidb_isolation_read_engines = 'tiflash'") + + // Create virtual tiflash replica info. + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + require.True(t, exists) + for _, tblInfo := range db.Tables { + if tblInfo.Name.L == "t" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + + rows := [][]interface{}{ + {"TableReader_9", "root", "MppVersion: 1, data:ExchangeSender_8"}, + {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, + {" └─Projection_4", "mpp[tiflash]", "regexp_substr(test.t.expr, test.t.pattern, 1, 1, test.t.match_type)->Column#7"}, + {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, + } + tk.MustQuery("explain select regexp_substr(expr, pattern, 1, 1, match_type) as res from test.t;").CheckAt([]int{0, 2, 4}, rows) +} + +func TestRegexpReplacePushDownToTiFlash(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists test.t;") + tk.MustExec("create table test.t (expr varchar(30), pattern varchar(30), repl varchar(30), pos int, occur int, match_type varchar(30));") + tk.MustExec("insert into test.t values ('123', '12.', '233', 1, 1, ''), ('aBb', 'bb', 'bc', 1, 1, 'i'), ('ab\nabc', '^abc$', 'd', 1, 1, 'm');") + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_enforce_mpp=1") + tk.MustExec("set @@tidb_isolation_read_engines = 'tiflash'") + + // Create virtual tiflash replica info. + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + require.True(t, exists) + for _, tblInfo := range db.Tables { + if tblInfo.Name.L == "t" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + + rows := [][]interface{}{ + {"TableReader_9", "root", "MppVersion: 1, data:ExchangeSender_8"}, + {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, + {" └─Projection_4", "mpp[tiflash]", "regexp_replace(test.t.expr, test.t.pattern, test.t.repl, 1, 1, test.t.match_type)->Column#8"}, + {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, + } + tk.MustQuery("explain select regexp_replace(expr, pattern, repl, 1, 1, match_type) as res from test.t;").CheckAt([]int{0, 2, 4}, rows) +} + func TestCastTimeAsDurationToTiFlash(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) @@ -7397,7 +7713,7 @@ func TestCastTimeAsDurationToTiFlash(t *testing.T) { } rows := [][]interface{}{ - {"TableReader_9", "root", "data:ExchangeSender_8"}, + {"TableReader_9", "root", "MppVersion: 1, data:ExchangeSender_8"}, {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, {" └─Projection_4", "mpp[tiflash]", "cast(test.t.a, time BINARY)->Column#4, cast(test.t.b, time BINARY)->Column#5"}, {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, @@ -7405,6 +7721,72 @@ func TestCastTimeAsDurationToTiFlash(t *testing.T) { tk.MustQuery("explain select cast(a as time), cast(b as time) from t;").CheckAt([]int{0, 2, 4}, rows) } +func TestUnhexPushDownToTiFlash(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b varchar(20));") + tk.MustExec("insert into t values(6162, '7469666C617368');") + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_enforce_mpp=1;") + tk.MustExec("set @@tidb_isolation_read_engines = 'tiflash'") + + tbl, err := dom.InfoSchema().TableByName(model.CIStr{O: "test", L: "test"}, model.CIStr{O: "t", L: "t"}) + require.NoError(t, err) + // Set the hacked TiFlash replica for explain tests. + tbl.Meta().TiFlashReplica = &model.TiFlashReplicaInfo{Count: 1, Available: true} + + rows := [][]interface{}{ + {"TableReader_9", "root", "MppVersion: 1, data:ExchangeSender_8"}, + {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, + {" └─Projection_4", "mpp[tiflash]", "unhex(cast(test.t.a, var_string(20)))->Column#4"}, + {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, + } + tk.MustQuery("explain select unhex(a) from t;").CheckAt([]int{0, 2, 4}, rows) + + rows = [][]interface{}{ + {"TableReader_9", "root", "MppVersion: 1, data:ExchangeSender_8"}, + {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, + {" └─Projection_4", "mpp[tiflash]", "unhex(test.t.b)->Column#4"}, + {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, + } + tk.MustQuery("explain select unhex(b) from t;").CheckAt([]int{0, 2, 4}, rows) +} + +func TestLeastGretestStringPushDownToTiFlash(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a varchar(20), b varchar(20))") + tk.MustExec("insert into t values('123', '234')") + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_enforce_mpp=1") + tk.MustExec("set @@tidb_isolation_read_engines = 'tiflash'") + + tbl, err := dom.InfoSchema().TableByName(model.CIStr{O: "test", L: "test"}, model.CIStr{O: "t", L: "t"}) + require.NoError(t, err) + // Set the hacked TiFlash replica for explain tests. + tbl.Meta().TiFlashReplica = &model.TiFlashReplicaInfo{Count: 1, Available: true} + + rows := [][]interface{}{ + {"TableReader_9", "root", "MppVersion: 1, data:ExchangeSender_8"}, + {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, + {" └─Projection_4", "mpp[tiflash]", "least(test.t.a, test.t.b)->Column#4"}, + {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, + } + tk.MustQuery("explain select least(a, b) from t;").CheckAt([]int{0, 2, 4}, rows) + + rows = [][]interface{}{ + {"TableReader_9", "root", "MppVersion: 1, data:ExchangeSender_8"}, + {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, + {" └─Projection_4", "mpp[tiflash]", "greatest(test.t.a, test.t.b)->Column#4"}, + {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, + } + tk.MustQuery("explain select greatest(a, b) from t;").CheckAt([]int{0, 2, 4}, rows) +} + func TestPartitionTableFallBackStatic(t *testing.T) { store, _ := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) @@ -7508,6 +7890,50 @@ func TestEnableTiFlashReadForWriteStmt(t *testing.T) { checkMpp(rs) } +func TestPointGetWithSelectLock(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(a int, b int, primary key(a, b));") + tk.MustExec("create table t1(c int unique, d int);") + tbl, err := dom.InfoSchema().TableByName(model.CIStr{O: "test", L: "test"}, model.CIStr{O: "t", L: "t"}) + require.NoError(t, err) + // Set the hacked TiFlash replica for explain tests. + tbl.Meta().TiFlashReplica = &model.TiFlashReplicaInfo{Count: 1, Available: true} + tbl1, err := dom.InfoSchema().TableByName(model.CIStr{O: "test", L: "test"}, model.CIStr{O: "t1", L: "t1"}) + require.NoError(t, err) + // Set the hacked TiFlash replica for explain tests. + tbl1.Meta().TiFlashReplica = &model.TiFlashReplicaInfo{Count: 1, Available: true} + + sqls := []string{ + "explain select a, b from t where (a = 1 and b = 2) or (a =2 and b = 1) for update;", + "explain select a, b from t where a = 1 and b = 2 for update;", + "explain select c, d from t1 where c = 1 for update;", + "explain select c, d from t1 where c = 1 and d = 1 for update;", + "explain select c, d from t1 where (c = 1 or c = 2 )and d = 1 for update;", + "explain select c, d from t1 where c in (1,2,3,4) for update;", + } + tk.MustExec("set @@tidb_enable_tiflash_read_for_write_stmt = on;") + tk.MustExec("set @@tidb_isolation_read_engines='tidb,tiflash';") + tk.MustExec("begin;") + // assert point get / batch point get can't work with tiflash in interaction txn + for _, sql := range sqls { + err = tk.ExecToErr(sql) + require.Error(t, err) + } + // assert point get / batch point get can work with tikv in interaction txn + tk.MustExec("set @@tidb_isolation_read_engines='tidb,tikv,tiflash';") + for _, sql := range sqls { + tk.MustQuery(sql) + } + tk.MustExec("commit") + // assert point get / batch point get can work with tiflash in auto commit + tk.MustExec("set @@tidb_isolation_read_engines='tidb,tiflash';") + for _, sql := range sqls { + tk.MustQuery(sql) + } +} + func TestTableRangeFallback(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -7632,7 +8058,8 @@ func TestPlanCacheForTableRangeFallback(t *testing.T) { tk.MustExec("prepare stmt from 'select * from t where a in (?, ?, ?, ?, ?) and b > 1'") tk.MustExec("set @a=10, @b=20, @c=30, @d=40, @e=50") tk.MustExec("execute stmt using @a, @b, @c, @d, @e") - tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 Memory capacity of 10 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen")) + tk.MustQuery("show warnings").Sort().Check(testkit.Rows("Warning 1105 Memory capacity of 10 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen", + "Warning 1105 skip plan-cache: in-list is too long")) tk.MustExec("execute stmt using @a, @b, @c, @d, @e") // The plan with range fallback is not cached. tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) @@ -7679,7 +8106,8 @@ func TestPlanCacheForIndexRangeFallback(t *testing.T) { tk.MustExec("prepare stmt2 from 'select * from t where a in (?, ?, ?, ?, ?) and b in (?, ?, ?, ?, ?)'") tk.MustExec("set @a='aa', @b='bb', @c='cc', @d='dd', @e='ee', @f='ff', @g='gg', @h='hh', @i='ii', @j='jj'") tk.MustExec("execute stmt2 using @a, @b, @c, @d, @e, @f, @g, @h, @i, @j") - tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 Memory capacity of 1330 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen")) + tk.MustQuery("show warnings").Sort().Check(testkit.Rows("Warning 1105 Memory capacity of 1330 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen", + "Warning 1105 skip plan-cache: in-list is too long")) tk.MustExec("execute stmt2 using @a, @b, @c, @d, @e, @f, @g, @h, @i, @j") tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) } @@ -7835,7 +8263,8 @@ func TestPlanCacheForIndexJoinRangeFallback(t *testing.T) { tk.MustExec("prepare stmt2 from 'select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.d where t1.b in (?, ?, ?, ?, ?)'") tk.MustExec("set @a='a', @b='b', @c='c', @d='d', @e='e'") tk.MustExec("execute stmt2 using @a, @b, @c, @d, @e") - tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 Memory capacity of 1275 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen")) + tk.MustQuery("show warnings").Sort().Check(testkit.Rows("Warning 1105 Memory capacity of 1275 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen", + "Warning 1105 skip plan-cache: in-list is too long")) tk.MustExec("execute stmt2 using @a, @b, @c, @d, @e") tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) } @@ -7917,10 +8346,10 @@ func TestNullConditionForPrefixIndex(t *testing.T) { ps := []*util.ProcessInfo{tkProcess} tk.Session().SetSessionManager(&testkit.MockSessionManager{PS: ps}) tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Check(testkit.Rows( - "HashAgg_12 1.00 root funcs:count(Column#6)->Column#5", - "└─IndexReader_13 1.00 root index:HashAgg_6", - " └─HashAgg_6 1.00 cop[tikv] funcs:count(1)->Column#6", - " └─IndexRangeScan_11 99.90 cop[tikv] table:t1, index:idx2(c1, c2) range:[\"0xfff\" -inf,\"0xfff\" +inf], keep order:false, stats:pseudo")) + "StreamAgg_18 1.00 root funcs:count(Column#7)->Column#5", + "└─IndexReader_19 1.00 root index:StreamAgg_9", + " └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#7", + " └─IndexRangeScan_17 99.90 cop[tikv] table:t1, index:idx2(c1, c2) range:[\"0xfff\" -inf,\"0xfff\" +inf], keep order:false, stats:pseudo")) } func TestAutoIncrementCheckWithCheckConstraint(t *testing.T) { @@ -7933,3 +8362,72 @@ func TestAutoIncrementCheckWithCheckConstraint(t *testing.T) { KEY idx_autoinc_id (id) )`) } + +func TestMppVersion(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a bigint, b bigint)") + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_enforce_mpp=1") + tk.MustExec("set @@tidb_isolation_read_engines = 'tiflash'") + + // Create virtual tiflash replica info. + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + require.True(t, exists) + for _, tblInfo := range db.Tables { + if tblInfo.Name.L == "t" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + + var input []string + var output []struct { + SQL string + Plan []string + Warn []string + } + integrationSuiteData := core.GetIntegrationSuiteData() + integrationSuiteData.LoadTestCases(t, &input, &output) + for i, tt := range input { + setStmt := strings.HasPrefix(tt, "set") + testdata.OnRecord(func() { + output[i].SQL = tt + if !setStmt { + output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + output[i].Warn = testdata.ConvertSQLWarnToStrings(tk.Session().GetSessionVars().StmtCtx.GetWarnings()) + } + }) + if setStmt { + tk.MustExec(tt) + } else { + tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) + require.Equal(t, output[i].Warn, testdata.ConvertSQLWarnToStrings(tk.Session().GetSessionVars().StmtCtx.GetWarnings())) + } + } +} + +// https://github.com/pingcap/tidb/issues/36888. +func TestIssue36888(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("CREATE TABLE t0(c0 INT);") + tk.MustExec("CREATE TABLE t1(c0 INT);") + + tk.MustExec("INSERT INTO t0 VALUES (NULL);") + tk.MustQuery("SELECT t0.c0 FROM t0 LEFT JOIN t1 ON t0.c0>=t1.c0 WHERE (CONCAT_WS(t0.c0, t1.c0) IS NULL);").Check(testkit.Rows("")) +} + +// https://github.com/pingcap/tidb/issues/40285. +func TestIssue40285(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("CREATE TABLE t(col1 enum('p5', '9a33x') NOT NULL DEFAULT 'p5',col2 tinyblob DEFAULT NULL) ENGINE = InnoDB DEFAULT CHARSET = latin1 COLLATE = latin1_bin;") + tk.MustQuery("(select last_value(col1) over () as r0 from t) union all (select col2 as r0 from t);") +} diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 18edbd52be994..ee095b31f8e0a 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -115,6 +115,10 @@ const ( HintIgnoreIndex = "ignore_index" // HintForceIndex make optimizer to use this index even if it thinks a table scan is more efficient. HintForceIndex = "force_index" + // HintOrderIndex is hint enforce using some indexes and keep the index's order. + HintOrderIndex = "order_index" + // HintNoOrderIndex is hint enforce using some indexes and not keep the index's order. + HintNoOrderIndex = "no_order_index" // HintAggToCop is hint enforce pushing aggregation to coprocessor. HintAggToCop = "agg_to_cop" // HintReadFromStorage is hint enforce some tables read from specific type of storage. @@ -159,7 +163,7 @@ func (a *aggOrderByResolver) Enter(inNode ast.Node) (ast.Node, bool) { a.exprDepth++ if n, ok := inNode.(*driver.ParamMarkerExpr); ok { if a.exprDepth == 1 { - _, isNull, isExpectedType := getUintFromNode(a.ctx, n) + _, isNull, isExpectedType := getUintFromNode(a.ctx, n, false) // For constant uint expression in top level, it should be treated as position expression. if !isNull && isExpectedType { return expression.ConstructPositionExpr(n), true @@ -1027,6 +1031,7 @@ func (b *PlanBuilder) coalesceCommonColumns(p *LogicalJoin, leftPlan, rightPlan func (b *PlanBuilder) buildSelection(ctx context.Context, p LogicalPlan, where ast.ExprNode, aggMapper map[*ast.AggregateFuncExpr]int) (LogicalPlan, error) { b.optFlag |= flagPredicatePushDown + b.optFlag |= flagDeriveTopNFromWindow if b.curClause != havingClause { b.curClause = whereClause } @@ -1557,7 +1562,9 @@ func (*PlanBuilder) setUnionFlen(resultTp *types.FieldType, cols []expression.Ex childTp := cols[i].GetType() childTpCharLen := 1 if isBinary { - childTpCharLen = charset.CharacterSetInfos[childTp.GetCharset()].Maxlen + if charsetInfo, ok := charset.CharacterSetInfos[childTp.GetCharset()]; ok { + childTpCharLen = charsetInfo.Maxlen + } } resultTp.SetFlen(mathutil.Max(resultTp.GetFlen(), childTpCharLen*childTp.GetFlen())) } @@ -1722,7 +1729,9 @@ func (b *PlanBuilder) buildSemiJoinForSetOperator( if err != nil { return nil, err } - if leftCol.RetType.GetType() != rightCol.RetType.GetType() { + _, leftArgIsColumn := eqCond.(*expression.ScalarFunction).GetArgs()[0].(*expression.Column) + _, rightArgIsColumn := eqCond.(*expression.ScalarFunction).GetArgs()[1].(*expression.Column) + if leftCol.RetType.GetType() != rightCol.RetType.GetType() || !leftArgIsColumn || !rightArgIsColumn { joinPlan.OtherConditions = append(joinPlan.OtherConditions, eqCond) } else { joinPlan.EqualConditions = append(joinPlan.EqualConditions, eqCond.(*expression.ScalarFunction)) @@ -1980,7 +1989,7 @@ CheckReferenced: // getUintFromNode gets uint64 value from ast.Node. // For ordinary statement, node should be uint64 constant value. // For prepared statement, node is string. We should convert it to uint64. -func getUintFromNode(ctx sessionctx.Context, n ast.Node) (uVal uint64, isNull bool, isExpectedType bool) { +func getUintFromNode(ctx sessionctx.Context, n ast.Node, mustInt64orUint64 bool) (uVal uint64, isNull bool, isExpectedType bool) { var val interface{} switch v := n.(type) { case *driver.ValueExpr: @@ -1989,6 +1998,11 @@ func getUintFromNode(ctx sessionctx.Context, n ast.Node) (uVal uint64, isNull bo if !v.InExecute { return 0, false, true } + if mustInt64orUint64 { + if expected, _ := CheckParamTypeInt64orUint64(v); !expected { + return 0, false, false + } + } param, err := expression.ParamMarkerExpression(ctx, v, false) if err != nil { return 0, false, false @@ -2022,17 +2036,32 @@ func getUintFromNode(ctx sessionctx.Context, n ast.Node) (uVal uint64, isNull bo return 0, false, false } +// CheckParamTypeInt64orUint64 check param type for plan cache limit, only allow int64 and uint64 now +// eg: set @a = 1; +func CheckParamTypeInt64orUint64(param *driver.ParamMarkerExpr) (bool, uint64) { + val := param.GetValue() + switch v := val.(type) { + case int64: + if v >= 0 { + return true, uint64(v) + } + case uint64: + return true, v + } + return false, 0 +} + func extractLimitCountOffset(ctx sessionctx.Context, limit *ast.Limit) (count uint64, offset uint64, err error) { var isExpectedType bool if limit.Count != nil { - count, _, isExpectedType = getUintFromNode(ctx, limit.Count) + count, _, isExpectedType = getUintFromNode(ctx, limit.Count, true) if !isExpectedType { return 0, 0, ErrWrongArguments.GenWithStackByArgs("LIMIT") } } if limit.Offset != nil { - offset, _, isExpectedType = getUintFromNode(ctx, limit.Offset) + offset, _, isExpectedType = getUintFromNode(ctx, limit.Offset, true) if !isExpectedType { return 0, 0, ErrWrongArguments.GenWithStackByArgs("LIMIT") } @@ -2813,7 +2842,7 @@ func (g *gbyResolver) Enter(inNode ast.Node) (ast.Node, bool) { case *driver.ParamMarkerExpr: g.isParam = true if g.exprDepth == 1 { - _, isNull, isExpectedType := getUintFromNode(g.ctx, n) + _, isNull, isExpectedType := getUintFromNode(g.ctx, n, false) // For constant uint expression in top level, it should be treated as position expression. if !isNull && isExpectedType { return expression.ConstructPositionExpr(n), true @@ -3589,7 +3618,7 @@ func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLev // Set warning for the hint that requires the table name. switch hint.HintName.L { case TiDBMergeJoin, HintSMJ, TiDBIndexNestedLoopJoin, HintINLJ, HintINLHJ, HintINLMJ, - TiDBHashJoin, HintHJ, HintUseIndex, HintIgnoreIndex, HintForceIndex, HintIndexMerge, HintLeading: + TiDBHashJoin, HintHJ, HintUseIndex, HintIgnoreIndex, HintForceIndex, HintOrderIndex, HintNoOrderIndex, HintIndexMerge, HintLeading: if len(hint.Tables) == 0 { b.pushHintWithoutTableWarning(hint) continue @@ -3625,40 +3654,23 @@ func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLev aggHints.preferAggType |= preferStreamAgg case HintAggToCop: aggHints.preferAggToCop = true - case HintUseIndex: + case HintUseIndex, HintIgnoreIndex, HintForceIndex, HintOrderIndex, HintNoOrderIndex: dbName := hint.Tables[0].DBName if dbName.L == "" { dbName = model.NewCIStr(b.ctx.GetSessionVars().CurrentDB) } - indexHintList = append(indexHintList, indexHintInfo{ - dbName: dbName, - tblName: hint.Tables[0].TableName, - partitions: hint.Tables[0].PartitionList, - indexHint: &ast.IndexHint{ - IndexNames: hint.Indexes, - HintType: ast.HintUse, - HintScope: ast.HintForScan, - }, - }) - case HintIgnoreIndex: - dbName := hint.Tables[0].DBName - if dbName.L == "" { - dbName = model.NewCIStr(b.ctx.GetSessionVars().CurrentDB) - } - indexHintList = append(indexHintList, indexHintInfo{ - dbName: dbName, - tblName: hint.Tables[0].TableName, - partitions: hint.Tables[0].PartitionList, - indexHint: &ast.IndexHint{ - IndexNames: hint.Indexes, - HintType: ast.HintIgnore, - HintScope: ast.HintForScan, - }, - }) - case HintForceIndex: - dbName := hint.Tables[0].DBName - if dbName.L == "" { - dbName = model.NewCIStr(b.ctx.GetSessionVars().CurrentDB) + var hintType ast.IndexHintType + switch hint.HintName.L { + case HintUseIndex: + hintType = ast.HintUse + case HintIgnoreIndex: + hintType = ast.HintIgnore + case HintForceIndex: + hintType = ast.HintForce + case HintOrderIndex: + hintType = ast.HintOrderIndex + case HintNoOrderIndex: + hintType = ast.HintNoOrderIndex } indexHintList = append(indexHintList, indexHintInfo{ dbName: dbName, @@ -3666,7 +3678,7 @@ func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLev partitions: hint.Tables[0].PartitionList, indexHint: &ast.IndexHint{ IndexNames: hint.Indexes, - HintType: ast.HintForce, + HintType: hintType, HintScope: ast.HintForScan, }, }) @@ -4437,8 +4449,7 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as // Because of the nested views, so we should check the left table list in hint when build the data source from the view inside the current view. currentQBNameMap4View[qbName] = viewQBNameHintTable[1:] currentViewHints[qbName] = b.hintProcessor.QbHints4View[qbName] - delete(b.hintProcessor.QbNameMap4View, qbName) - delete(b.hintProcessor.QbHints4View, qbName) + b.hintProcessor.QbNameUsed4View[qbName] = struct{}{} } } return b.BuildDataSourceFromView(ctx, dbName, tableInfo, currentQBNameMap4View, currentViewHints) @@ -4453,30 +4464,39 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as } if tableInfo.GetPartitionInfo() != nil { - h := domain.GetDomain(b.ctx).StatsHandle() - tblStats := h.GetTableStats(tableInfo) - isDynamicEnabled := b.ctx.GetSessionVars().IsDynamicPartitionPruneEnabled() - globalStatsReady := tblStats.IsInitialized() - // If dynamic partition prune isn't enabled or global stats is not ready, we won't enable dynamic prune mode in query - usePartitionProcessor := !isDynamicEnabled || !globalStatsReady - - failpoint.Inject("forceDynamicPrune", func(val failpoint.Value) { - if val.(bool) { - if isDynamicEnabled { - usePartitionProcessor = false - } - } - }) - - if usePartitionProcessor { + // If `UseDynamicPruneMode` already been false, then we don't need to check whether execute `flagPartitionProcessor` + // otherwise we need to check global stats initialized for each partition table + if !b.ctx.GetSessionVars().IsDynamicPartitionPruneEnabled() { b.optFlag = b.optFlag | flagPartitionProcessor - b.ctx.GetSessionVars().StmtCtx.UseDynamicPruneMode = false - if isDynamicEnabled { - b.ctx.GetSessionVars().StmtCtx.AppendWarning( - fmt.Errorf("disable dynamic pruning due to %s has no global stats", tableInfo.Name.String())) + } else { + if !b.ctx.GetSessionVars().StmtCtx.UseDynamicPruneMode { + b.optFlag = b.optFlag | flagPartitionProcessor + } else { + h := domain.GetDomain(b.ctx).StatsHandle() + tblStats := h.GetTableStats(tableInfo) + isDynamicEnabled := b.ctx.GetSessionVars().IsDynamicPartitionPruneEnabled() + globalStatsReady := tblStats.IsInitialized() + // If dynamic partition prune isn't enabled or global stats is not ready, we won't enable dynamic prune mode in query + usePartitionProcessor := !isDynamicEnabled || !globalStatsReady + + failpoint.Inject("forceDynamicPrune", func(val failpoint.Value) { + if val.(bool) { + if isDynamicEnabled { + usePartitionProcessor = false + } + } + }) + + if usePartitionProcessor { + b.optFlag = b.optFlag | flagPartitionProcessor + b.ctx.GetSessionVars().StmtCtx.UseDynamicPruneMode = false + if isDynamicEnabled { + b.ctx.GetSessionVars().StmtCtx.AppendWarning( + fmt.Errorf("disable dynamic pruning due to %s has no global stats", tableInfo.Name.String())) + } + } } } - pt := tbl.(table.PartitionedTable) // check partition by name. if len(tn.PartitionNames) > 0 { @@ -4495,11 +4515,15 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as return nil, ErrPartitionClauseOnNonpartitioned } - // Skip storage engine check for CreateView. - if b.capFlag&canExpandAST == 0 { - possiblePaths, err = filterPathByIsolationRead(b.ctx, possiblePaths, tblName, dbName) - if err != nil { - return nil, err + // remain tikv access path to generate point get acceess path if existed + // see detail in issue: https://github.com/pingcap/tidb/issues/39543 + if !(b.isForUpdateRead && b.ctx.GetSessionVars().TxnCtx.IsExplicit) { + // Skip storage engine check for CreateView. + if b.capFlag&canExpandAST == 0 { + possiblePaths, err = filterPathByIsolationRead(b.ctx, possiblePaths, tblName, dbName) + if err != nil { + return nil, err + } } } @@ -4651,7 +4675,10 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as if i < len(columns) { if columns[i].IsGenerated() && !columns[i].GeneratedStored { var err error + originVal := b.allowBuildCastArray + b.allowBuildCastArray = true expr, _, err = b.rewrite(ctx, columns[i].GeneratedExpr, ds, nil, true) + b.allowBuildCastArray = originVal if err != nil { return nil, err } @@ -5019,7 +5046,6 @@ func (b *PlanBuilder) BuildDataSourceFromView(ctx context.Context, dbName model. for qbName, viewQbNameHint := range qbNameMap4View { // Check whether the view hint belong the current view or its nested views. selectOffset := -1 - qbNameMap4View[qbName] = viewQbNameHint if len(viewQbNameHint) == 0 { selectOffset = 1 } else if len(viewQbNameHint) == 1 && viewQbNameHint[0].TableName.L == "" { @@ -5042,6 +5068,7 @@ func (b *PlanBuilder) BuildDataSourceFromView(ctx context.Context, dbName model. hintProcessor.QbNameMap4View = qbNameMap4View hintProcessor.QbHints4View = viewHints + hintProcessor.QbNameUsed4View = make(map[string]struct{}) hintProcessor.QbHints = currentQbHints hintProcessor.QbNameMap = currentQbNameMap @@ -5050,6 +5077,7 @@ func (b *PlanBuilder) BuildDataSourceFromView(ctx context.Context, dbName model. b.hintProcessor = hintProcessor b.ctx.GetSessionVars().PlannerSelectBlockAsName = make([]ast.HintTable, hintProcessor.MaxSelectStmtOffset()+1) defer func() { + b.hintProcessor.HandleUnusedViewHints() b.hintProcessor = originHintProcessor b.ctx.GetSessionVars().PlannerSelectBlockAsName = originPlannerSelectBlockAsName }() @@ -5713,7 +5741,10 @@ func (b *PlanBuilder) buildUpdateLists(ctx context.Context, tableList []*ast.Tab } } + o := b.allowBuildCastArray + b.allowBuildCastArray = true newExpr, np, err = b.rewriteWithPreprocess(ctx, assign.Expr, p, nil, nil, false, rewritePreprocess(assign)) + b.allowBuildCastArray = o if err != nil { return nil, nil, false, err } @@ -6176,7 +6207,7 @@ func (b *PlanBuilder) buildWindowFunctionFrameBound(_ context.Context, spec *ast if bound.Type == ast.CurrentRow { return bound, nil } - numRows, _, _ := getUintFromNode(b.ctx, boundClause.Expr) + numRows, _, _ := getUintFromNode(b.ctx, boundClause.Expr, false) bound.Num = numRows return bound, nil } @@ -6492,7 +6523,7 @@ func (b *PlanBuilder) checkOriginWindowFrameBound(bound *ast.FrameBound, spec *a if bound.Unit != ast.TimeUnitInvalid { return ErrWindowRowsIntervalUse.GenWithStackByArgs(getWindowName(spec.Name.O)) } - _, isNull, isExpectedType := getUintFromNode(b.ctx, bound.Expr) + _, isNull, isExpectedType := getUintFromNode(b.ctx, bound.Expr, false) if isNull || !isExpectedType { return ErrWindowFrameIllegal.GenWithStackByArgs(getWindowName(spec.Name.O)) } diff --git a/planner/core/logical_plan_test.go b/planner/core/logical_plan_test.go index 7458c7307c19c..82786703338f4 100644 --- a/planner/core/logical_plan_test.go +++ b/planner/core/logical_plan_test.go @@ -863,7 +863,7 @@ func TestValidate(t *testing.T) { err: ErrUnknownColumn, }, { - sql: "select * from t t1 use index(e)", + sql: "select * from t t1 use index(x)", err: ErrKeyDoesNotExist, }, { diff --git a/planner/core/logical_plans.go b/planner/core/logical_plans.go index 8a9cfcf62e41c..f6bb7284e9afc 100644 --- a/planner/core/logical_plans.go +++ b/planner/core/logical_plans.go @@ -1878,15 +1878,16 @@ func ExtractCorColumnsBySchema4PhysicalPlan(p PhysicalPlan, schema *expression.S // ShowContents stores the contents for the `SHOW` statement. type ShowContents struct { - Tp ast.ShowStmtType // Databases/Tables/Columns/.... - DBName string - Table *ast.TableName // Used for showing columns. - Partition model.CIStr // Use for showing partition - Column *ast.ColumnName // Used for `desc table column`. - IndexName model.CIStr - Flag int // Some flag parsed from sql, such as FULL. - User *auth.UserIdentity // Used for show grants. - Roles []*auth.RoleIdentity // Used for show grants. + Tp ast.ShowStmtType // Databases/Tables/Columns/.... + DBName string + Table *ast.TableName // Used for showing columns. + Partition model.CIStr // Use for showing partition + Column *ast.ColumnName // Used for `desc table column`. + IndexName model.CIStr + ResourceGroupName string // Used for showing resource group + Flag int // Some flag parsed from sql, such as FULL. + User *auth.UserIdentity // Used for show grants. + Roles []*auth.RoleIdentity // Used for show grants. CountWarningsOrErrors bool // Used for showing count(*) warnings | errors diff --git a/planner/core/main_test.go b/planner/core/main_test.go index 8bd3264684fb7..dc321fcd92921 100644 --- a/planner/core/main_test.go +++ b/planner/core/main_test.go @@ -50,6 +50,8 @@ func TestMain(m *testing.M) { testDataMap.LoadTestSuiteData("testdata", "join_reorder_suite") testDataMap.LoadTestSuiteData("testdata", "flat_plan_suite") testDataMap.LoadTestSuiteData("testdata", "binary_plan_suite") + testDataMap.LoadTestSuiteData("testdata", "json_plan_suite") + testDataMap.LoadTestSuiteData("testdata", "derive_topn_from_window") indexMergeSuiteData = testDataMap["index_merge_suite"] planSuiteUnexportedData = testDataMap["plan_suite_unexported"] @@ -130,3 +132,15 @@ func GetFlatPlanSuiteData() testdata.TestData { func GetBinaryPlanSuiteData() testdata.TestData { return testDataMap["binary_plan_suite"] } + +func GetIndexMergeSuiteData() testdata.TestData { + return testDataMap["index_merge_suite"] +} + +func GetJSONPlanSuiteData() testdata.TestData { + return testDataMap["json_plan_suite"] +} + +func GetDerivedTopNSuiteData() testdata.TestData { + return testDataMap["derive_topn_from_window"] +} diff --git a/planner/core/memtable_predicate_extractor.go b/planner/core/memtable_predicate_extractor.go index 1b8d953518b49..dc9feed44c2a8 100644 --- a/planner/core/memtable_predicate_extractor.go +++ b/planner/core/memtable_predicate_extractor.go @@ -83,10 +83,14 @@ func (extractHelper) extractColInConsExpr(extractCols map[int64]*types.FieldName results := make([]types.Datum, 0, len(args[1:])) for _, arg := range args[1:] { constant, ok := arg.(*expression.Constant) - if !ok || constant.DeferredExpr != nil || constant.ParamMarker != nil { + if !ok || constant.DeferredExpr != nil { return "", nil } - results = append(results, constant.Value) + v := constant.Value + if constant.ParamMarker != nil { + v = constant.ParamMarker.GetUserVar() + } + results = append(results, v) } return name.ColName.L, results } @@ -117,10 +121,14 @@ func (extractHelper) extractColBinaryOpConsExpr(extractCols map[int64]*types.Fie // SELECT * FROM t1 WHERE c='rhs' // SELECT * FROM t1 WHERE 'lhs'=c constant, ok := args[1-colIdx].(*expression.Constant) - if !ok || constant.DeferredExpr != nil || constant.ParamMarker != nil { + if !ok || constant.DeferredExpr != nil { return "", nil } - return name.ColName.L, []types.Datum{constant.Value} + v := constant.Value + if constant.ParamMarker != nil { + v = constant.ParamMarker.GetUserVar() + } + return name.ColName.L, []types.Datum{v} } // extract the OR expression, e.g: @@ -202,6 +210,7 @@ func (helper extractHelper) extractCol( for _, expr := range predicates { fn, ok := expr.(*expression.ScalarFunction) if !ok { + remained = append(remained, expr) continue } var colName string @@ -1393,39 +1402,100 @@ type StatementsSummaryExtractor struct { // Digests represents digest applied to, and we should apply all digest if there is no digest specified. // e.g: SELECT * FROM STATEMENTS_SUMMARY WHERE digest='8019af26debae8aa7642c501dbc43212417b3fb14e6aec779f709976b7e521be' Digests set.StringSet - // Enable is true means the executor should use digest to locate statement summary. - // Enable is false, means the executor should keep the behavior compatible with before. - Enable bool + + // Coarse time range predicate extracted from the where clause as: + // SELECT ... WHERE summary_begin_time <= endTime AND summary_end_time >= startTime + // + // N.B. it's only used by v2, so we should keep predicates not changed when extracting time range, or it will + // affect the correctness with v1. + CoarseTimeRange *TimeRange } // Extract implements the MemTablePredicateExtractor Extract interface func (e *StatementsSummaryExtractor) Extract( - _ sessionctx.Context, + sctx sessionctx.Context, schema *expression.Schema, names []*types.FieldName, predicates []expression.Expression, ) (remained []expression.Expression) { // Extract the `digest` column remained, skip, digests := e.extractCol(schema, names, predicates, "digest", false) - e.SkipRequest = skip - if e.SkipRequest { + if skip { + e.SkipRequest = true return nil } - if digests.Count() > 0 { - e.Enable = true + if !digests.Empty() { e.Digests = digests } + + tr := e.findCoarseTimeRange(sctx, schema, names, remained) + if tr == nil { + return remained + } + + if tr.StartTime.After(tr.EndTime) { + e.SkipRequest = true + return nil + } + e.CoarseTimeRange = tr return remained } -func (e *StatementsSummaryExtractor) explainInfo(_ *PhysicalMemTable) string { +func (e *StatementsSummaryExtractor) explainInfo(p *PhysicalMemTable) string { if e.SkipRequest { return "skip_request: true" } - if !e.Enable { - return "" + buf := bytes.NewBuffer(nil) + if !e.Digests.Empty() { + buf.WriteString(fmt.Sprintf("digests: [%s], ", extractStringFromStringSet(e.Digests))) + } + if e.CoarseTimeRange != nil && p.ctx.GetSessionVars() != nil && p.ctx.GetSessionVars().StmtCtx != nil { + stmtCtx := p.ctx.GetSessionVars().StmtCtx + startTime := e.CoarseTimeRange.StartTime.In(stmtCtx.TimeZone) + endTime := e.CoarseTimeRange.EndTime.In(stmtCtx.TimeZone) + startTimeStr := types.NewTime(types.FromGoTime(startTime), mysql.TypeDatetime, types.MaxFsp).String() + endTimeStr := types.NewTime(types.FromGoTime(endTime), mysql.TypeDatetime, types.MaxFsp).String() + buf.WriteString(fmt.Sprintf("start_time:%v, end_time:%v, ", startTimeStr, endTimeStr)) + } + // remove the last ", " in the message info + s := buf.String() + if len(s) > 2 { + return s[:len(s)-2] + } + return s +} + +func (e *StatementsSummaryExtractor) findCoarseTimeRange( + sctx sessionctx.Context, + schema *expression.Schema, + names []*types.FieldName, + predicates []expression.Expression, +) *TimeRange { + tz := sctx.GetSessionVars().StmtCtx.TimeZone + _, _, endTime := e.extractTimeRange(sctx, schema, names, predicates, "summary_begin_time", tz) + _, startTime, _ := e.extractTimeRange(sctx, schema, names, predicates, "summary_end_time", tz) + return e.buildTimeRange(startTime, endTime) +} + +func (e *StatementsSummaryExtractor) buildTimeRange(start, end int64) *TimeRange { + const defaultStatementsDuration = time.Hour + var startTime, endTime time.Time + if start == 0 && end == 0 { + return nil + } + if start != 0 { + startTime = e.convertToTime(start) + } + if end != 0 { + endTime = e.convertToTime(end) + } + if start == 0 { + startTime = endTime.Add(-defaultStatementsDuration) + } + if end == 0 { + endTime = startTime.Add(defaultStatementsDuration) } - return fmt.Sprintf("digests: [%s]", extractStringFromStringSet(e.Digests)) + return &TimeRange{StartTime: startTime, EndTime: endTime} } // TikvRegionPeersExtractor is used to extract some predicates of cluster table. diff --git a/planner/core/memtable_predicate_extractor_test.go b/planner/core/memtable_predicate_extractor_test.go index 97d55b09ed8ec..ecf7c47218ab9 100644 --- a/planner/core/memtable_predicate_extractor_test.go +++ b/planner/core/memtable_predicate_extractor_test.go @@ -25,10 +25,14 @@ import ( "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/parser" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/planner" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/hint" "github.com/pingcap/tidb/util/set" "github.com/stretchr/testify/require" @@ -1749,3 +1753,112 @@ PARTITION BY RANGE COLUMNS ( id ) ( require.Equal(t, ca.tableIDs, tableids) } } + +func TestExtractorInPreparedStmt(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + + var cases = []struct { + prepared string + userVars []interface{} + params []interface{} + checker func(extractor plannercore.MemTablePredicateExtractor) + }{ + { + prepared: "select * from information_schema.TIKV_REGION_STATUS where table_id = ?", + userVars: []interface{}{1}, + params: []interface{}{1}, + checker: func(extractor plannercore.MemTablePredicateExtractor) { + rse := extractor.(*plannercore.TiKVRegionStatusExtractor) + tableids := rse.GetTablesID() + slices.Sort(tableids) + require.Equal(t, []int64{1}, tableids) + }, + }, + { + prepared: "select * from information_schema.TIKV_REGION_STATUS where table_id = ? or table_id = ?", + userVars: []interface{}{1, 2}, + params: []interface{}{1, 2}, + checker: func(extractor plannercore.MemTablePredicateExtractor) { + rse := extractor.(*plannercore.TiKVRegionStatusExtractor) + tableids := rse.GetTablesID() + slices.Sort(tableids) + require.Equal(t, []int64{1, 2}, tableids) + }, + }, + { + prepared: "select * from information_schema.TIKV_REGION_STATUS where table_id in (?,?)", + userVars: []interface{}{1, 2}, + params: []interface{}{1, 2}, + checker: func(extractor plannercore.MemTablePredicateExtractor) { + rse := extractor.(*plannercore.TiKVRegionStatusExtractor) + tableids := rse.GetTablesID() + slices.Sort(tableids) + require.Equal(t, []int64{1, 2}, tableids) + }, + }, + { + prepared: "select * from information_schema.COLUMNS where table_name like ?", + userVars: []interface{}{`"a%"`}, + params: []interface{}{"a%"}, + checker: func(extractor plannercore.MemTablePredicateExtractor) { + rse := extractor.(*plannercore.ColumnsTableExtractor) + require.EqualValues(t, []string{"a%"}, rse.TableNamePatterns) + }, + }, + { + prepared: "select * from information_schema.tidb_hot_regions_history where update_time>=?", + userVars: []interface{}{"cast('2019-10-10 10:10:10' as datetime)"}, + params: []interface{}{func() types.Time { + tt, err := types.ParseTimestamp(tk.Session().GetSessionVars().StmtCtx, "2019-10-10 10:10:10") + require.NoError(t, err) + return tt + }()}, + checker: func(extractor plannercore.MemTablePredicateExtractor) { + rse := extractor.(*plannercore.HotRegionsHistoryTableExtractor) + require.Equal(t, timestamp(t, "2019-10-10 10:10:10"), rse.StartTime) + }, + }, + } + + // text protocol + parser := parser.New() + for _, ca := range cases { + tk.MustExec(fmt.Sprintf("prepare stmt from '%s'", ca.prepared)) + setStmt := "set " + exec := "execute stmt using " + for i, uv := range ca.userVars { + name := fmt.Sprintf("@a%d", i) + setStmt += fmt.Sprintf("%s=%v", name, uv) + exec += name + if i != len(ca.userVars)-1 { + setStmt += "," + exec += "," + } + } + tk.MustExec(setStmt) + stmt, err := parser.ParseOneStmt(exec, "", "") + require.NoError(t, err) + plan, _, err := planner.OptimizeExecStmt(context.Background(), tk.Session(), stmt.(*ast.ExecuteStmt), dom.InfoSchema()) + require.NoError(t, err) + extractor := plan.(*plannercore.Execute).Plan.(*plannercore.PhysicalMemTable).Extractor + ca.checker(extractor) + } + + // binary protocol + for _, ca := range cases { + id, _, _, err := tk.Session().PrepareStmt(ca.prepared) + require.NoError(t, err) + prepStmt, err := tk.Session().GetSessionVars().GetPreparedStmtByID(id) + require.NoError(t, err) + params := expression.Args2Expressions4Test(ca.params...) + execStmt := &ast.ExecuteStmt{ + BinaryArgs: params, + PrepStmt: prepStmt, + } + plan, _, err := planner.OptimizeExecStmt(context.Background(), tk.Session(), execStmt, dom.InfoSchema()) + require.NoError(t, err) + extractor := plan.(*plannercore.Execute).Plan.(*plannercore.PhysicalMemTable).Extractor + ca.checker(extractor) + } +} diff --git a/planner/core/mock.go b/planner/core/mock.go index e96c10ca20d13..93d389352e3af 100644 --- a/planner/core/mock.go +++ b/planner/core/mock.go @@ -73,7 +73,7 @@ func MockSignedTable() *model.TableInfo { Unique: true, }, { - Name: model.NewCIStr("e"), + Name: model.NewCIStr("x"), Columns: []*model.IndexColumn{ { Name: model.NewCIStr("e"), @@ -401,9 +401,13 @@ func MockContext() sessionctx.Context { ctx.Store = &mock.Store{ Client: &mock.Client{}, } + initStatsCtx := mock.NewContext() + initStatsCtx.Store = &mock.Store{ + Client: &mock.Client{}, + } ctx.GetSessionVars().CurrentDB = "test" do := domain.NewMockDomain() - if err := do.CreateStatsHandle(ctx); err != nil { + if err := do.CreateStatsHandle(ctx, initStatsCtx); err != nil { panic(fmt.Sprintf("create mock context panic: %+v", err)) } domain.BindDomain(ctx, do) diff --git a/planner/core/optimizer.go b/planner/core/optimizer.go index fe3219fcdaf21..bef9d7f9991c6 100644 --- a/planner/core/optimizer.go +++ b/planner/core/optimizer.go @@ -16,11 +16,17 @@ package core import ( "context" + "fmt" "math" + "runtime" + "strconv" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/kvproto/pkg/diagnosticspb" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/expression/aggregation" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/lock" @@ -35,6 +41,7 @@ import ( "github.com/pingcap/tidb/types" utilhint "github.com/pingcap/tidb/util/hint" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/mathutil" "github.com/pingcap/tidb/util/set" "github.com/pingcap/tidb/util/tracing" "github.com/pingcap/tipb/go-tipb" @@ -68,6 +75,7 @@ const ( flagPartitionProcessor flagCollectPredicateColumnsPoint flagPushDownAgg + flagDeriveTopNFromWindow flagPushDownTopN flagSyncWaitStatsLoadPoint flagJoinReOrder @@ -90,6 +98,7 @@ var optRuleList = []logicalOptRule{ &partitionProcessor{}, &collectPredicateColumnsPoint{}, &aggregationPushDownSolver{}, + &deriveTopNFromWindow{}, &pushDownTopNOptimizer{}, &syncWaitStatsLoadPoint{}, &joinReOrderSolver{}, @@ -295,7 +304,7 @@ func DoOptimize(ctx context.Context, sctx sessionctx.Context, flag uint64, logic if err != nil { return nil, 0, err } - finalPlan, err := postOptimize(sctx, physical) + finalPlan, err := postOptimize(ctx, sctx, physical) if err != nil { return nil, 0, err } @@ -375,7 +384,7 @@ func mergeContinuousSelections(p PhysicalPlan) { } } -func postOptimize(sctx sessionctx.Context, plan PhysicalPlan) (PhysicalPlan, error) { +func postOptimize(ctx context.Context, sctx sessionctx.Context, plan PhysicalPlan) (PhysicalPlan, error) { // some cases from update optimize will require avoiding projection elimination. // see comments ahead of call of DoOptimize in function of buildUpdate(). err := prunePhysicalColumns(sctx, plan) @@ -387,9 +396,9 @@ func postOptimize(sctx sessionctx.Context, plan PhysicalPlan) (PhysicalPlan, err mergeContinuousSelections(plan) plan = eliminateUnionScanAndLock(sctx, plan) plan = enableParallelApply(sctx, plan) - handleFineGrainedShuffle(sctx, plan) - checkPlanCacheable(sctx, plan) + handleFineGrainedShuffle(ctx, sctx, plan) propagateProbeParents(plan, nil) + countStarRewrite(plan) return plan, nil } @@ -531,12 +540,126 @@ func prunePhysicalColumnsInternal(sctx sessionctx.Context, plan PhysicalPlan) er return nil } +/* +* +The countStarRewriter is used to rewrite + + count(*) -> count(not null column) + +**Only for TiFlash** +Attention: +Since count(*) is directly translated into count(1) during grammar parsing, +the rewritten pattern actually matches count(constant) + +Pattern: +PhysicalAggregation: count(constant) + + | + TableFullScan: TiFlash + +Optimize: +Table + + + +Query: select count(*) from table +ColumnPruningRule: datasource pick row_id +countStarRewrite: datasource pick k1 instead of row_id + + rewrite count(*) -> count(k1) + +Rewritten Query: select count(k1) from table +*/ +func countStarRewrite(plan PhysicalPlan) { + countStarRewriteInternal(plan) + if tableReader, ok := plan.(*PhysicalTableReader); ok { + countStarRewrite(tableReader.tablePlan) + } else { + for _, child := range plan.Children() { + countStarRewrite(child) + } + } +} + +func countStarRewriteInternal(plan PhysicalPlan) { + // match pattern any agg(count(constant)) -> tablefullscan(tiflash) + var physicalAgg *basePhysicalAgg + switch x := plan.(type) { + case *PhysicalHashAgg: + physicalAgg = x.getPointer() + case *PhysicalStreamAgg: + physicalAgg = x.getPointer() + default: + return + } + if len(physicalAgg.GroupByItems) > 0 || len(physicalAgg.children) != 1 { + return + } + for _, aggFunc := range physicalAgg.AggFuncs { + if aggFunc.Name != "count" || len(aggFunc.Args) != 1 || aggFunc.HasDistinct { + return + } + if _, ok := aggFunc.Args[0].(*expression.Constant); !ok { + return + } + } + physicalTableScan, ok := physicalAgg.Children()[0].(*PhysicalTableScan) + if !ok || !physicalTableScan.isFullScan() || physicalTableScan.StoreType != kv.TiFlash || len(physicalTableScan.schema.Columns) != 1 { + return + } + // rewrite datasource and agg args + rewriteTableScanAndAggArgs(physicalTableScan, physicalAgg.AggFuncs) +} + +// rewriteTableScanAndAggArgs Pick the narrowest and not null column from table +// If there is no not null column in Data Source, the row_id or pk column will be retained +func rewriteTableScanAndAggArgs(physicalTableScan *PhysicalTableScan, aggFuncs []*aggregation.AggFuncDesc) { + var resultColumnInfo *model.ColumnInfo + var resultColumn *expression.Column + + resultColumnInfo = physicalTableScan.Columns[0] + resultColumn = physicalTableScan.schema.Columns[0] + // prefer not null column from table + for _, columnInfo := range physicalTableScan.Table.Columns { + if columnInfo.FieldType.IsVarLengthType() { + continue + } + if mysql.HasNotNullFlag(columnInfo.GetFlag()) { + if columnInfo.GetFlen() < resultColumnInfo.GetFlen() { + resultColumnInfo = columnInfo + resultColumn = &expression.Column{ + UniqueID: physicalTableScan.ctx.GetSessionVars().AllocPlanColumnID(), + ID: resultColumnInfo.ID, + RetType: resultColumnInfo.FieldType.Clone(), + OrigName: fmt.Sprintf("%s.%s.%s", physicalTableScan.DBName.L, physicalTableScan.Table.Name.L, resultColumnInfo.Name), + } + } + } + } + // table scan (row_id) -> (not null column) + physicalTableScan.Columns[0] = resultColumnInfo + physicalTableScan.schema.Columns[0] = resultColumn + // agg arg count(1) -> count(not null column) + arg := resultColumn.Clone() + for _, aggFunc := range aggFuncs { + constExpr, ok := aggFunc.Args[0].(*expression.Constant) + if !ok { + return + } + // count(null) shouldn't be rewritten + if constExpr.Value.IsNull() { + continue + } + aggFunc.Args[0] = arg + } +} + // Only for MPP(Window<-[Sort]<-ExchangeReceiver<-ExchangeSender). // TiFlashFineGrainedShuffleStreamCount: // < 0: fine grained shuffle is disabled. // > 0: use TiFlashFineGrainedShuffleStreamCount as stream count. -// == 0: use TiFlashMaxThreads as stream count when it's greater than 0. Otherwise use DefStreamCountWhenMaxThreadsNotSet. -func handleFineGrainedShuffle(sctx sessionctx.Context, plan PhysicalPlan) { +// == 0: use TiFlashMaxThreads as stream count when it's greater than 0. Otherwise set status as uninitialized. +func handleFineGrainedShuffle(ctx context.Context, sctx sessionctx.Context, plan PhysicalPlan) { streamCount := sctx.GetSessionVars().TiFlashFineGrainedShuffleStreamCount if streamCount < 0 { return @@ -544,22 +667,27 @@ func handleFineGrainedShuffle(sctx sessionctx.Context, plan PhysicalPlan) { if streamCount == 0 { if sctx.GetSessionVars().TiFlashMaxThreads > 0 { streamCount = sctx.GetSessionVars().TiFlashMaxThreads - } else { - streamCount = variable.DefStreamCountWhenMaxThreadsNotSet } } - setupFineGrainedShuffle(uint64(streamCount), plan) + // use two separate cluster info to avoid grpc calls cost + tiflashServerCountInfo := tiflashClusterInfo{unInitialized, 0} + streamCountInfo := tiflashClusterInfo{unInitialized, 0} + if streamCount != 0 { + streamCountInfo.itemStatus = initialized + streamCountInfo.itemValue = uint64(streamCount) + } + setupFineGrainedShuffle(ctx, sctx, &streamCountInfo, &tiflashServerCountInfo, plan) } -func setupFineGrainedShuffle(streamCount uint64, plan PhysicalPlan) { +func setupFineGrainedShuffle(ctx context.Context, sctx sessionctx.Context, streamCountInfo *tiflashClusterInfo, tiflashServerCountInfo *tiflashClusterInfo, plan PhysicalPlan) { if tableReader, ok := plan.(*PhysicalTableReader); ok { if _, isExchangeSender := tableReader.tablePlan.(*PhysicalExchangeSender); isExchangeSender { helper := fineGrainedShuffleHelper{shuffleTarget: unknown, plans: make([]*basePhysicalPlan, 1)} - setupFineGrainedShuffleInternal(tableReader.tablePlan, &helper, streamCount) + setupFineGrainedShuffleInternal(ctx, sctx, tableReader.tablePlan, &helper, streamCountInfo, tiflashServerCountInfo) } } else { for _, child := range plan.Children() { - setupFineGrainedShuffle(streamCount, child) + setupFineGrainedShuffle(ctx, sctx, streamCountInfo, tiflashServerCountInfo, child) } } } @@ -570,16 +698,32 @@ const ( unknown shuffleTarget = iota window joinBuild + hashAgg ) type fineGrainedShuffleHelper struct { shuffleTarget shuffleTarget plans []*basePhysicalPlan + joinKeysCount int +} + +type tiflashClusterInfoStatus uint8 + +const ( + unInitialized tiflashClusterInfoStatus = iota + initialized + failed +) + +type tiflashClusterInfo struct { + itemStatus tiflashClusterInfoStatus + itemValue uint64 } func (h *fineGrainedShuffleHelper) clear() { h.shuffleTarget = unknown h.plans = h.plans[:0] + h.joinKeysCount = 0 } func (h *fineGrainedShuffleHelper) updateTarget(t shuffleTarget, p *basePhysicalPlan) { @@ -587,14 +731,159 @@ func (h *fineGrainedShuffleHelper) updateTarget(t shuffleTarget, p *basePhysical h.plans = append(h.plans, p) } -func setupFineGrainedShuffleInternal(plan PhysicalPlan, helper *fineGrainedShuffleHelper, streamCount uint64) { +// calculateTiFlashStreamCountUsingMinLogicalCores uses minimal logical cpu cores among tiflash servers, and divide by 2 +// return false, 0 if any err happens +func calculateTiFlashStreamCountUsingMinLogicalCores(ctx context.Context, sctx sessionctx.Context, serversInfo []infoschema.ServerInfo) (bool, uint64) { + failpoint.Inject("mockTiFlashStreamCountUsingMinLogicalCores", func(val failpoint.Value) { + intVal, err := strconv.Atoi(val.(string)) + if err == nil { + failpoint.Return(true, uint64(intVal)) + } else { + failpoint.Return(false, 0) + } + }) + rows, err := infoschema.FetchClusterServerInfoWithoutPrivilegeCheck(ctx, sctx, serversInfo, diagnosticspb.ServerInfoType_HardwareInfo, false) + if err != nil { + return false, 0 + } + var initialMaxCores uint64 = 10000 + var minLogicalCores uint64 = initialMaxCores // set to a large enough value here + for _, row := range rows { + if row[4].GetString() == "cpu-logical-cores" { + logicalCpus, err := strconv.Atoi(row[5].GetString()) + if err == nil && logicalCpus > 0 { + minLogicalCores = mathutil.Min(minLogicalCores, uint64(logicalCpus)) + } + } + } + // No need to check len(serersInfo) == serverCount here, since missing some servers' info won't affect the correctness + if minLogicalCores > 1 && minLogicalCores != initialMaxCores { + if runtime.GOARCH == "amd64" { + // In most x86-64 platforms, `Thread(s) per core` is 2 + return true, minLogicalCores / 2 + } + // ARM cpus don't implement Hyper-threading. + return true, minLogicalCores + // Other platforms are too rare to consider + } + + return false, 0 +} + +func checkFineGrainedShuffleForJoinAgg(ctx context.Context, sctx sessionctx.Context, streamCountInfo *tiflashClusterInfo, tiflashServerCountInfo *tiflashClusterInfo, exchangeColCount int, splitLimit uint64) (applyFlag bool, streamCount uint64) { + switch (*streamCountInfo).itemStatus { + case unInitialized: + streamCount = 4 // assume 8c node in cluster as minimal, stream count is 8 / 2 = 4 + case initialized: + streamCount = (*streamCountInfo).itemValue + case failed: + return false, 0 // probably won't reach this path + } + + var tiflashServerCount uint64 = 0 + switch (*tiflashServerCountInfo).itemStatus { + case unInitialized: + serversInfo, err := infoschema.GetTiFlashServerInfo(sctx) + if err != nil { + (*tiflashServerCountInfo).itemStatus = failed + (*tiflashServerCountInfo).itemValue = 0 + if (*streamCountInfo).itemStatus == unInitialized { + setDefaultStreamCount(streamCountInfo) + } + return false, 0 + } + tiflashServerCount = uint64(len(serversInfo)) + (*tiflashServerCountInfo).itemStatus = initialized + (*tiflashServerCountInfo).itemValue = tiflashServerCount + case initialized: + tiflashServerCount = (*tiflashServerCountInfo).itemValue + case failed: + return false, 0 + } + + // if already exceeds splitLimit, no need to fetch actual logical cores + if tiflashServerCount*uint64(exchangeColCount)*streamCount > splitLimit { + return false, 0 + } + + // if streamCount already initialized, and can pass splitLimit check + if (*streamCountInfo).itemStatus == initialized { + return true, streamCount + } + + serversInfo, err := infoschema.GetTiFlashServerInfo(sctx) + if err != nil { + (*tiflashServerCountInfo).itemStatus = failed + (*tiflashServerCountInfo).itemValue = 0 + return false, 0 + } + flag, temStreamCount := calculateTiFlashStreamCountUsingMinLogicalCores(ctx, sctx, serversInfo) + if !flag { + setDefaultStreamCount(streamCountInfo) + (*tiflashServerCountInfo).itemStatus = failed + return false, 0 + } + streamCount = temStreamCount + (*streamCountInfo).itemStatus = initialized + (*streamCountInfo).itemValue = streamCount + applyFlag = tiflashServerCount*uint64(exchangeColCount)*streamCount <= splitLimit + return applyFlag, streamCount +} + +func inferFineGrainedShuffleStreamCountForWindow(ctx context.Context, sctx sessionctx.Context, streamCountInfo *tiflashClusterInfo, tiflashServerCountInfo *tiflashClusterInfo) (streamCount uint64) { + switch (*streamCountInfo).itemStatus { + case unInitialized: + if (*tiflashServerCountInfo).itemStatus == failed { + setDefaultStreamCount(streamCountInfo) + streamCount = (*streamCountInfo).itemValue + break + } + + serversInfo, err := infoschema.GetTiFlashServerInfo(sctx) + if err != nil { + setDefaultStreamCount(streamCountInfo) + streamCount = (*streamCountInfo).itemValue + (*tiflashServerCountInfo).itemStatus = failed + break + } + + if (*tiflashServerCountInfo).itemStatus == unInitialized { + (*tiflashServerCountInfo).itemStatus = initialized + (*tiflashServerCountInfo).itemValue = uint64(len(serversInfo)) + } + + flag, temStreamCount := calculateTiFlashStreamCountUsingMinLogicalCores(ctx, sctx, serversInfo) + if !flag { + setDefaultStreamCount(streamCountInfo) + streamCount = (*streamCountInfo).itemValue + (*tiflashServerCountInfo).itemStatus = failed + break + } + streamCount = temStreamCount + (*streamCountInfo).itemStatus = initialized + (*streamCountInfo).itemValue = streamCount + case initialized: + streamCount = (*streamCountInfo).itemValue + case failed: + setDefaultStreamCount(streamCountInfo) + streamCount = (*streamCountInfo).itemValue + } + return streamCount +} + +func setDefaultStreamCount(streamCountInfo *tiflashClusterInfo) { + (*streamCountInfo).itemStatus = initialized + (*streamCountInfo).itemValue = variable.DefStreamCountWhenMaxThreadsNotSet +} + +func setupFineGrainedShuffleInternal(ctx context.Context, sctx sessionctx.Context, plan PhysicalPlan, helper *fineGrainedShuffleHelper, streamCountInfo *tiflashClusterInfo, tiflashServerCountInfo *tiflashClusterInfo) { switch x := plan.(type) { case *PhysicalWindow: // Do not clear the plans because window executor will keep the data partition. // For non hash partition window function, there will be a passthrough ExchangeSender to collect data, // which will break data partition. helper.updateTarget(window, &x.basePhysicalPlan) - setupFineGrainedShuffleInternal(x.children[0], helper, streamCount) + setupFineGrainedShuffleInternal(ctx, sctx, x.children[0], helper, streamCountInfo, tiflashServerCountInfo) case *PhysicalSort: if x.IsPartialSort { // Partial sort will keep the data partition. @@ -603,72 +892,89 @@ func setupFineGrainedShuffleInternal(plan PhysicalPlan, helper *fineGrainedShuff // Global sort will break the data partition. helper.clear() } - setupFineGrainedShuffleInternal(x.children[0], helper, streamCount) + setupFineGrainedShuffleInternal(ctx, sctx, x.children[0], helper, streamCountInfo, tiflashServerCountInfo) case *PhysicalSelection: helper.plans = append(helper.plans, &x.basePhysicalPlan) - setupFineGrainedShuffleInternal(x.children[0], helper, streamCount) + setupFineGrainedShuffleInternal(ctx, sctx, x.children[0], helper, streamCountInfo, tiflashServerCountInfo) case *PhysicalProjection: helper.plans = append(helper.plans, &x.basePhysicalPlan) - setupFineGrainedShuffleInternal(x.children[0], helper, streamCount) + setupFineGrainedShuffleInternal(ctx, sctx, x.children[0], helper, streamCountInfo, tiflashServerCountInfo) case *PhysicalExchangeReceiver: helper.plans = append(helper.plans, &x.basePhysicalPlan) - setupFineGrainedShuffleInternal(x.children[0], helper, streamCount) + setupFineGrainedShuffleInternal(ctx, sctx, x.children[0], helper, streamCountInfo, tiflashServerCountInfo) case *PhysicalHashAgg: - // HashAgg is not implemented for now. - helper.clear() - setupFineGrainedShuffleInternal(x.children[0], helper, streamCount) + // Todo: allow hash aggregation's output still benefits from fine grained shuffle + aggHelper := fineGrainedShuffleHelper{shuffleTarget: hashAgg, plans: []*basePhysicalPlan{}} + aggHelper.plans = append(aggHelper.plans, &x.basePhysicalPlan) + setupFineGrainedShuffleInternal(ctx, sctx, x.children[0], &aggHelper, streamCountInfo, tiflashServerCountInfo) case *PhysicalHashJoin: child0 := x.children[0] child1 := x.children[1] - if x.InnerChildIdx == 0 { - // Child0 is build side. - child0Helper := fineGrainedShuffleHelper{shuffleTarget: joinBuild, plans: []*basePhysicalPlan{}} - setupFineGrainedShuffleInternal(child0, &child0Helper, streamCount) - - // HashJoin is not implemented for now. - helper.clear() - setupFineGrainedShuffleInternal(child1, helper, streamCount) - } else { + buildChild := child0 + probChild := child1 + joinKeys := x.LeftJoinKeys + if x.InnerChildIdx != 0 { // Child1 is build side. - child1Helper := fineGrainedShuffleHelper{shuffleTarget: joinBuild, plans: []*basePhysicalPlan{}} - setupFineGrainedShuffleInternal(child1, &child1Helper, streamCount) - - // HashJoin is not implemented for now. - helper.clear() - setupFineGrainedShuffleInternal(child0, helper, streamCount) + buildChild = child1 + joinKeys = x.RightJoinKeys + probChild = child0 } + if len(joinKeys) > 0 { // Not cross join + buildHelper := fineGrainedShuffleHelper{shuffleTarget: joinBuild, plans: []*basePhysicalPlan{}} + buildHelper.plans = append(buildHelper.plans, &x.basePhysicalPlan) + buildHelper.joinKeysCount = len(joinKeys) + setupFineGrainedShuffleInternal(ctx, sctx, buildChild, &buildHelper, streamCountInfo, tiflashServerCountInfo) + } else { + buildHelper := fineGrainedShuffleHelper{shuffleTarget: unknown, plans: []*basePhysicalPlan{}} + setupFineGrainedShuffleInternal(ctx, sctx, buildChild, &buildHelper, streamCountInfo, tiflashServerCountInfo) + } + // don't apply fine grained shuffle for probe side + helper.clear() + setupFineGrainedShuffleInternal(ctx, sctx, probChild, helper, streamCountInfo, tiflashServerCountInfo) case *PhysicalExchangeSender: if x.ExchangeType == tipb.ExchangeType_Hash { - if helper.shuffleTarget == window { - // Set up stream count for all plans based on shuffle target type. - // Currently, only enable fine grained shuffle if the shuffle target is window. + // Set up stream count for all plans based on shuffle target type. + var exchangeColCount = x.Schema().Len() + switch helper.shuffleTarget { + case window: + streamCount := inferFineGrainedShuffleStreamCountForWindow(ctx, sctx, streamCountInfo, tiflashServerCountInfo) x.TiFlashFineGrainedShuffleStreamCount = streamCount for _, p := range helper.plans { p.TiFlashFineGrainedShuffleStreamCount = streamCount } + case hashAgg: + applyFlag, streamCount := checkFineGrainedShuffleForJoinAgg(ctx, sctx, streamCountInfo, tiflashServerCountInfo, exchangeColCount, 1200) // 1200: performance test result + if applyFlag { + x.TiFlashFineGrainedShuffleStreamCount = streamCount + for _, p := range helper.plans { + p.TiFlashFineGrainedShuffleStreamCount = streamCount + } + } + case joinBuild: + // Support hashJoin only when shuffle hash keys equals to join keys due to tiflash implementations + if len(x.HashCols) != helper.joinKeysCount { + break + } + applyFlag, streamCount := checkFineGrainedShuffleForJoinAgg(ctx, sctx, streamCountInfo, tiflashServerCountInfo, exchangeColCount, 600) // 600: performance test result + if applyFlag { + x.TiFlashFineGrainedShuffleStreamCount = streamCount + for _, p := range helper.plans { + p.TiFlashFineGrainedShuffleStreamCount = streamCount + } + } } } // exchange sender will break the data partition. helper.clear() - setupFineGrainedShuffleInternal(x.children[0], helper, streamCount) + setupFineGrainedShuffleInternal(ctx, sctx, x.children[0], helper, streamCountInfo, tiflashServerCountInfo) default: for _, child := range x.Children() { childHelper := fineGrainedShuffleHelper{shuffleTarget: unknown, plans: []*basePhysicalPlan{}} - setupFineGrainedShuffleInternal(child, &childHelper, streamCount) + setupFineGrainedShuffleInternal(ctx, sctx, child, &childHelper, streamCountInfo, tiflashServerCountInfo) } } } -// checkPlanCacheable used to check whether a plan can be cached. Plans that -// meet the following characteristics cannot be cached: -// 1. Use the TiFlash engine. -// Todo: make more careful check here. -func checkPlanCacheable(sctx sessionctx.Context, plan PhysicalPlan) { - if sctx.GetSessionVars().StmtCtx.UseCache && useTiFlash(plan) { - sctx.GetSessionVars().StmtCtx.SkipPlanCache = true - } -} - // propagateProbeParents doesn't affect the execution plan, it only sets the probeParents field of a PhysicalPlan. // It's for handling the inconsistency between row count in the statsInfo and the recorded actual row count. Please // see comments in PhysicalPlan for details. @@ -705,26 +1011,6 @@ func propagateProbeParents(plan PhysicalPlan, probeParents []PhysicalPlan) { } } -// useTiFlash used to check whether the plan use the TiFlash engine. -func useTiFlash(p PhysicalPlan) bool { - switch x := p.(type) { - case *PhysicalTableReader: - switch x.StoreType { - case kv.TiFlash: - return true - default: - return false - } - default: - if len(p.Children()) > 0 { - for _, plan := range p.Children() { - return useTiFlash(plan) - } - } - } - return false -} - func enableParallelApply(sctx sessionctx.Context, plan PhysicalPlan) PhysicalPlan { if !sctx.GetSessionVars().EnableParallelApply { return plan diff --git a/planner/core/optimizer_test.go b/planner/core/optimizer_test.go index 0f9dc0a4050c4..59afdf9e9afba 100644 --- a/planner/core/optimizer_test.go +++ b/planner/core/optimizer_test.go @@ -16,8 +16,10 @@ package core import ( "reflect" + "strings" "testing" + "github.com/pingcap/failpoint" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" @@ -163,7 +165,7 @@ func TestHandleFineGrainedShuffle(t *testing.T) { sctx.GetSessionVars().TiFlashFineGrainedShuffleStreamCount = expStreamCount start := func(p PhysicalPlan, expStreamCount int64, expChildCount int, curChildCount int) { - handleFineGrainedShuffle(sctx, tableReader) + handleFineGrainedShuffle(nil, sctx, tableReader) check(p, expStreamCount, expChildCount, curChildCount) clear(plans) } @@ -289,6 +291,111 @@ func TestHandleFineGrainedShuffle(t *testing.T) { tableScan1 = &PhysicalTableScan{} hashSender1.children = []PhysicalPlan{tableScan1} start(partWindow, expStreamCount, 3, 0) + + instances := []string{ + "tiflash,127.0.0.1:3933,127.0.0.1:7777,,", + "tikv,127.0.0.1:11080,127.0.0.1:10080,,", + } + fpName := "github.com/pingcap/tidb/infoschema/mockStoreServerInfo" + fpExpr := `return("` + strings.Join(instances, ";") + `")` + require.NoError(t, failpoint.Enable(fpName, fpExpr)) + defer func() { require.NoError(t, failpoint.Disable(fpName)) }() + fpName2 := "github.com/pingcap/tidb/planner/core/mockTiFlashStreamCountUsingMinLogicalCores" + require.NoError(t, failpoint.Enable(fpName2, `return("8")`)) + sctx.GetSessionVars().TiFlashFineGrainedShuffleStreamCount = 0 + + col0 := &expression.Column{ + UniqueID: sctx.GetSessionVars().AllocPlanColumnID(), + RetType: types.NewFieldType(mysql.TypeLonglong), + } + cond, err := expression.NewFunction(sctx, ast.EQ, types.NewFieldType(mysql.TypeTiny), col0, col0) + require.True(t, err == nil) + sf, isSF := cond.(*expression.ScalarFunction) + require.True(t, isSF) + var partitionCols = make([]*property.MPPPartitionColumn, 0, 1) + partitionCols = append(partitionCols, &property.MPPPartitionColumn{ + Col: col0, + CollateID: property.GetCollateIDByNameForPartition(col0.GetType().GetCollate()), + }) + + // HashAgg(x) <- ExchangeReceiver <- ExchangeSender + tableReader.tablePlan = passSender + hashAgg = &PhysicalHashAgg{} + passSender.children = []PhysicalPlan{hashAgg} + hashAgg.children = []PhysicalPlan{recv} + recv.children = []PhysicalPlan{hashSender} + hashSender.children = []PhysicalPlan{tableScan} + tableScan.Schema().Columns = append(tableScan.Schema().Columns, col0) + start(hashAgg, 8, 3, 0) + + // Join(x) <- ExchangeReceiver <- ExchangeSender + // <- ExchangeReceiver <- ExchangeSender + tableReader.tablePlan = passSender + hashJoin = &PhysicalHashJoin{} + hashJoin.EqualConditions = append(hashJoin.EqualConditions, sf) + hashJoin.RightJoinKeys = append(hashJoin.RightJoinKeys, col0) + hashJoin.InnerChildIdx = 1 + passSender.children = []PhysicalPlan{hashJoin} + recv = &PhysicalExchangeReceiver{} + recv1 = &PhysicalExchangeReceiver{} + tableScan = &PhysicalTableScan{} + tableScan1 = &PhysicalTableScan{} + hashSender = &PhysicalExchangeSender{ + ExchangeType: tipb.ExchangeType_Hash, + } + hashSender1 = &PhysicalExchangeSender{ + ExchangeType: tipb.ExchangeType_Hash, + } + hashJoin.children = []PhysicalPlan{recv, recv1} + recv.children = []PhysicalPlan{hashSender} + recv1.children = []PhysicalPlan{hashSender1} + hashSender.children = []PhysicalPlan{tableScan} + hashSender1.children = []PhysicalPlan{tableScan1} + hashSender1.HashCols = partitionCols + tableScan1.Schema().Columns = append(tableScan1.Schema().Columns, col0) + handleFineGrainedShuffle(nil, sctx, tableReader) + require.Equal(t, uint64(8), hashJoin.TiFlashFineGrainedShuffleStreamCount) + require.Equal(t, uint64(8), recv1.TiFlashFineGrainedShuffleStreamCount) + require.Equal(t, uint64(8), hashSender1.TiFlashFineGrainedShuffleStreamCount) + require.Equal(t, uint64(0), recv.TiFlashFineGrainedShuffleStreamCount) + require.Equal(t, uint64(0), hashSender.TiFlashFineGrainedShuffleStreamCount) + clear(plans) + + require.NoError(t, failpoint.Disable(fpName2)) + require.NoError(t, failpoint.Enable(fpName2, `return("8000")`)) + // HashAgg(x) <- ExchangeReceiver <- ExchangeSender, exceed splitLimit + tableReader.tablePlan = passSender + hashAgg = &PhysicalHashAgg{} + passSender.children = []PhysicalPlan{hashAgg} + hashAgg.children = []PhysicalPlan{recv} + recv.children = []PhysicalPlan{hashSender} + hashSender.children = []PhysicalPlan{tableScan} + tableScan.Schema().Columns = append(tableScan.Schema().Columns, col0) + start(hashAgg, 0, 3, 0) + + // exceed splitLimit + // Join(x) <- ExchangeReceiver <- ExchangeSender + // <- ExchangeReceiver <- ExchangeSender + tableReader.tablePlan = passSender + hashJoin = &PhysicalHashJoin{} + hashJoin.EqualConditions = append(hashJoin.EqualConditions, sf) + hashJoin.LeftJoinKeys = append(hashJoin.LeftJoinKeys, col0) + hashJoin.InnerChildIdx = 1 + passSender.children = []PhysicalPlan{hashJoin} + recv1 = &PhysicalExchangeReceiver{} + tableScan1 = &PhysicalTableScan{} + hashSender1 = &PhysicalExchangeSender{ + ExchangeType: tipb.ExchangeType_Hash, + } + hashJoin.children = []PhysicalPlan{recv, recv1} + recv.children = []PhysicalPlan{hashSender} + recv1.children = []PhysicalPlan{hashSender1} + hashSender.children = []PhysicalPlan{tableScan} + hashSender1.children = []PhysicalPlan{tableScan1} + hashSender1.HashCols = partitionCols + tableScan1.Schema().Columns = append(tableScan1.Schema().Columns, col0) + start(hashJoin, 0, 3, 0) + require.NoError(t, failpoint.Disable(fpName2)) } // Test for core.prunePhysicalColumns() diff --git a/planner/core/partition_pruner_test.go b/planner/core/partition_pruner_test.go index 5f07340f626e1..166f251b53fc3 100644 --- a/planner/core/partition_pruner_test.go +++ b/planner/core/partition_pruner_test.go @@ -312,15 +312,15 @@ func TestListPartitionPruner(t *testing.T) { for i, tt := range input { testdata.OnRecord(func() { output[i].SQL = tt - output[i].Result = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + output[i].Result = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Sort().Rows()) output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + tt).Rows()) }) tk.MustQuery("explain format = 'brief' " + tt).Check(testkit.Rows(output[i].Plan...)) - result := tk.MustQuery(tt) + result := tk.MustQuery(tt).Sort() result.Check(testkit.Rows(output[i].Result...)) // If the query doesn't specified the partition, compare the result with normal table if !strings.Contains(tt, "partition(") { - result.Check(tk2.MustQuery(tt).Rows()) + result.Check(tk.MustQuery(tt).Sort().Rows()) valid = true } require.True(t, valid) @@ -393,7 +393,7 @@ func TestListColumnsPartitionPruner(t *testing.T) { indexPlanTree := testdata.ConvertRowsToStrings(indexPlan.Rows()) testdata.OnRecord(func() { output[i].SQL = tt.SQL - output[i].Result = testdata.ConvertRowsToStrings(tk.MustQuery(tt.SQL).Rows()) + output[i].Result = testdata.ConvertRowsToStrings(tk.MustQuery(tt.SQL).Sort().Rows()) // Test for table without index. output[i].Plan = planTree // Test for table with index. @@ -408,14 +408,14 @@ func TestListColumnsPartitionPruner(t *testing.T) { checkPrunePartitionInfo(t, tt.SQL, tt.Pruner, indexPlanTree) // compare the result. - result := tk.MustQuery(tt.SQL) + result := tk.MustQuery(tt.SQL).Sort() idxResult := tk1.MustQuery(tt.SQL) - result.Check(idxResult.Rows()) + result.Check(idxResult.Sort().Rows()) result.Check(testkit.Rows(output[i].Result...)) // If the query doesn't specified the partition, compare the result with normal table if !strings.Contains(tt.SQL, "partition(") { - result.Check(tk2.MustQuery(tt.SQL).Rows()) + result.Check(tk2.MustQuery(tt.SQL).Sort().Rows()) valid = true } } diff --git a/planner/core/physical_plan_test.go b/planner/core/physical_plan_test.go index 3e41ae2d182d2..a8a7a1918cfc0 100644 --- a/planner/core/physical_plan_test.go +++ b/planner/core/physical_plan_test.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/infoschema" @@ -813,9 +814,11 @@ func TestMPPHints(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set tidb_cost_model_version=2") - tk.MustExec("create table t (a int, b int, c int)") + tk.MustExec("create table t (a int, b int, c int, index idx_a(a), index idx_b(b))") tk.MustExec("alter table t set tiflash replica 1") tk.MustExec("set @@session.tidb_allow_mpp=ON") + tk.MustExec("create definer='root'@'localhost' view v as select a, sum(b) from t group by a, c;") + tk.MustExec("create definer='root'@'localhost' view v1 as select t1.a from t t1, t t2 where t1.a=t2.a;") tb := external.GetTableByName(t, tk, "test", "t") err := domain.GetDomain(tk.Session()).DDL().UpdateTableReplicaInfo(tk.Session(), tb.Meta().ID, true) require.NoError(t, err) @@ -824,6 +827,7 @@ func TestMPPHints(t *testing.T) { var output []struct { SQL string Plan []string + Warn []string } planSuiteData := core.GetPlanSuiteData() @@ -833,11 +837,101 @@ func TestMPPHints(t *testing.T) { testdata.OnRecord(func() { output[i].SQL = ts output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + ts).Rows()) + output[i].Warn = testdata.ConvertSQLWarnToStrings(tk.Session().GetSessionVars().StmtCtx.GetWarnings()) }) tk.MustQuery("explain format = 'brief' " + ts).Check(testkit.Rows(output[i].Plan...)) + require.Equal(t, output[i].Warn, testdata.ConvertSQLWarnToStrings(tk.Session().GetSessionVars().StmtCtx.GetWarnings())) } } +func TestMPPHintsScope(t *testing.T) { + store := testkit.CreateMockStore(t, withMockTiFlash(2)) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("set tidb_cost_model_version=2") + tk.MustExec("create table t (a int, b int, c int, index idx_a(a), index idx_b(b))") + tk.MustExec("select /*+ MPP_1PHASE_AGG() */ a, sum(b) from t group by a, c") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1815 The agg can not push down to the MPP side, the MPP_1PHASE_AGG() hint is invalid")) + tk.MustExec("select /*+ MPP_2PHASE_AGG() */ a, sum(b) from t group by a, c") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1815 The agg can not push down to the MPP side, the MPP_2PHASE_AGG() hint is invalid")) + tk.MustExec("select /*+ shuffle_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1815 The join can not push down to the MPP side, the shuffle_join() hint is invalid")) + tk.MustExec("select /*+ broadcast_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1815 The join can not push down to the MPP side, the broadcast_join() hint is invalid")) + tk.MustExec("alter table t set tiflash replica 1") + tb := external.GetTableByName(t, tk, "test", "t") + err := domain.GetDomain(tk.Session()).DDL().UpdateTableReplicaInfo(tk.Session(), tb.Meta().ID, true) + require.NoError(t, err) + tk.MustExec("set @@session.tidb_allow_mpp=true") + tk.MustExec("explain select /*+ MPP_1PHASE_AGG() */ a, sum(b) from t group by a, c") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustExec("explain select /*+ MPP_2PHASE_AGG() */ a, sum(b) from t group by a, c") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustExec("explain select /*+ shuffle_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustExec("explain select /*+ broadcast_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a") + tk.MustQuery("show warnings").Check(testkit.Rows()) + + tk.MustExec("set @@session.tidb_allow_mpp=false") + tk.MustExec("explain select /*+ MPP_1PHASE_AGG() */ a, sum(b) from t group by a, c") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1815 The agg can not push down to the MPP side, the MPP_1PHASE_AGG() hint is invalid")) + tk.MustExec("explain select /*+ MPP_2PHASE_AGG() */ a, sum(b) from t group by a, c") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1815 The agg can not push down to the MPP side, the MPP_2PHASE_AGG() hint is invalid")) + tk.MustExec("explain select /*+ shuffle_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1815 The join can not push down to the MPP side, the shuffle_join() hint is invalid")) + tk.MustExec("explain select /*+ broadcast_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1815 The join can not push down to the MPP side, the broadcast_join() hint is invalid")) +} + +func TestMPPHintsWithBinding(t *testing.T) { + store := testkit.CreateMockStore(t, withMockTiFlash(2)) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("set tidb_cost_model_version=2") + tk.MustExec("create table t (a int, b int, c int)") + tk.MustExec("alter table t set tiflash replica 1") + tk.MustExec("set @@session.tidb_allow_mpp=ON") + tb := external.GetTableByName(t, tk, "test", "t") + err := domain.GetDomain(tk.Session()).DDL().UpdateTableReplicaInfo(tk.Session(), tb.Meta().ID, true) + require.NoError(t, err) + + tk.MustExec("explain select a, sum(b) from t group by a, c") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) + tk.MustExec("create global binding for select a, sum(b) from t group by a, c using select /*+ read_from_storage(tiflash[t]), MPP_1PHASE_AGG() */ a, sum(b) from t group by a, c;") + tk.MustExec("explain select a, sum(b) from t group by a, c") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) + res := tk.MustQuery("show global bindings").Rows() + require.Equal(t, res[0][0], "select `a` , sum ( `b` ) from `test` . `t` group by `a` , `c`") + require.Equal(t, res[0][1], "SELECT /*+ read_from_storage(tiflash[`t`]) MPP_1PHASE_AGG()*/ `a`,sum(`b`) FROM `test`.`t` GROUP BY `a`,`c`") + tk.MustExec("create global binding for select a, sum(b) from t group by a, c using select /*+ read_from_storage(tiflash[t]), MPP_2PHASE_AGG() */ a, sum(b) from t group by a, c;") + tk.MustExec("explain select a, sum(b) from t group by a, c") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) + res = tk.MustQuery("show global bindings").Rows() + require.Equal(t, res[0][0], "select `a` , sum ( `b` ) from `test` . `t` group by `a` , `c`") + require.Equal(t, res[0][1], "SELECT /*+ read_from_storage(tiflash[`t`]) MPP_2PHASE_AGG()*/ `a`,sum(`b`) FROM `test`.`t` GROUP BY `a`,`c`") + tk.MustExec("drop global binding for select a, sum(b) from t group by a, c;") + res = tk.MustQuery("show global bindings").Rows() + require.Equal(t, len(res), 0) + + tk.MustExec("explain select * from t t1, t t2 where t1.a=t2.a") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) + tk.MustExec("create global binding for select * from t t1, t t2 where t1.a=t2.a using select /*+ read_from_storage(tiflash[t1, t2]), shuffle_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a") + tk.MustExec("explain select * from t t1, t t2 where t1.a=t2.a") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) + res = tk.MustQuery("show global bindings").Rows() + require.Equal(t, res[0][0], "select * from ( `test` . `t` as `t1` ) join `test` . `t` as `t2` where `t1` . `a` = `t2` . `a`") + require.Equal(t, res[0][1], "SELECT /*+ read_from_storage(tiflash[`t1`, `t2`]) shuffle_join(`t1`, `t2`)*/ * FROM (`test`.`t` AS `t1`) JOIN `test`.`t` AS `t2` WHERE `t1`.`a` = `t2`.`a`") + tk.MustExec("create global binding for select * from t t1, t t2 where t1.a=t2.a using select /*+ read_from_storage(tiflash[t1, t2]), broadcast_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a;") + tk.MustExec("explain select * from t t1, t t2 where t1.a=t2.a") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) + res = tk.MustQuery("show global bindings").Rows() + require.Equal(t, res[0][0], "select * from ( `test` . `t` as `t1` ) join `test` . `t` as `t2` where `t1` . `a` = `t2` . `a`") + require.Equal(t, res[0][1], "SELECT /*+ read_from_storage(tiflash[`t1`, `t2`]) broadcast_join(`t1`, `t2`)*/ * FROM (`test`.`t` AS `t1`) JOIN `test`.`t` AS `t2` WHERE `t1`.`a` = `t2`.`a`") + tk.MustExec("drop global binding for select * from t t1, t t2 where t1.a=t2.a;") + res = tk.MustQuery("show global bindings").Rows() + require.Equal(t, len(res), 0) +} + func TestHintScope(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -2412,7 +2506,7 @@ func TestPhysicalPlanMemoryTrace(t *testing.T) { ls.ByItems = append(ls.ByItems, &util.ByItems{}) require.Greater(t, ls.MemoryUsage(), size) - //PhysicalProperty + // PhysicalProperty pp := property.PhysicalProperty{} size = pp.MemoryUsage() pp.MPPPartitionCols = append(pp.MPPPartitionCols, &property.MPPPartitionColumn{}) @@ -2460,3 +2554,148 @@ func TestNoDecorrelateHint(t *testing.T) { tk.MustQuery("show warnings").Check(testkit.Rows(output[i].Warning...)) } } + +func TestCountStarForTikv(t *testing.T) { + var ( + input []string + output []struct { + SQL string + Plan []string + Warning []string + } + ) + planSuiteData := core.GetPlanSuiteData() + planSuiteData.LoadTestCases(t, &input, &output) + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("set tidb_cost_model_version=1") + tk.MustExec("create table t (a int(11) not null, b varchar(10) not null, c date not null, d char(1) not null, e bigint not null, f datetime not null, g bool not null, h bool )") + tk.MustExec("create table t_pick_row_id (a char(20) not null)") + + // tikv + for i, ts := range input { + testdata.OnRecord(func() { + output[i].SQL = ts + output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + ts).Rows()) + }) + tk.MustQuery("explain format = 'brief' " + ts).Check(testkit.Rows(output[i].Plan...)) + } +} + +func TestCountStarForTiFlash(t *testing.T) { + var ( + input []string + output []struct { + SQL string + Plan []string + Warning []string + } + ) + planSuiteData := core.GetPlanSuiteData() + planSuiteData.LoadTestCases(t, &input, &output) + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("set tidb_cost_model_version=1") + tk.MustExec("create table t (a int(11) not null, b varchar(10) not null, c date not null, d char(1) not null, e bigint not null, f datetime not null, g bool not null, h bool )") + tk.MustExec("create table t_pick_row_id (a char(20) not null)") + + // tiflash + dom := domain.GetDomain(tk.Session()) + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + require.True(t, exists) + for _, tblInfo := range db.Tables { + tableName := tblInfo.Name.L + if tableName == "t" || tableName == "t_pick_row_id" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_enforce_mpp=1;") + for i, ts := range input { + testdata.OnRecord(func() { + output[i].SQL = ts + output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + ts).Rows()) + }) + tk.MustQuery("explain format = 'brief' " + ts).Check(testkit.Rows(output[i].Plan...)) + } +} + +func TestHashAggPushdownToTiFlashCompute(t *testing.T) { + var ( + input []string + output []struct { + SQL string + Plan []string + Warning []string + } + ) + planSuiteData := core.GetPlanSuiteData() + planSuiteData.LoadTestCases(t, &input, &output) + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists tbl_15;") + tk.MustExec(`create table tbl_15 (col_89 text (473) collate utf8mb4_bin , + col_90 timestamp default '1976-04-03' , + col_91 tinyint unsigned not null , + col_92 tinyint , + col_93 double not null , + col_94 datetime not null default '1970-06-08' , + col_95 datetime default '2028-02-13' , + col_96 int unsigned not null default 2532480521 , + col_97 char (168) default '') partition by hash (col_91) partitions 4;`) + + tk.MustExec("drop table if exists tbl_16;") + tk.MustExec(`create table tbl_16 (col_98 text (246) not null , + col_99 decimal (30 ,19) , + col_100 mediumint unsigned , + col_101 text (410) collate utf8mb4_bin , + col_102 date not null , + col_103 timestamp not null default '2003-08-27' , + col_104 text (391) not null , + col_105 date default '2010-10-24' , + col_106 text (9) not null,primary key (col_100, col_98(5), col_103), + unique key idx_23 (col_100, col_106 (3), col_101 (3))) partition by hash (col_100) partitions 2;`) + + config.UpdateGlobal(func(conf *config.Config) { + conf.DisaggregatedTiFlash = true + }) + defer config.UpdateGlobal(func(conf *config.Config) { + conf.DisaggregatedTiFlash = false + }) + + dom := domain.GetDomain(tk.Session()) + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + require.True(t, exists) + for _, tblInfo := range db.Tables { + tableName := tblInfo.Name.L + if tableName == "tbl_15" || tableName == "tbl_16" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_enforce_mpp=1;") + tk.MustExec("set @@tidb_partition_prune_mode = 'static';") + tk.MustExec("set @@tidb_isolation_read_engines = 'tiflash';") + + for i, ts := range input { + testdata.OnRecord(func() { + output[i].SQL = ts + output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + ts).Rows()) + }) + tk.MustQuery("explain format = 'brief' " + ts).Check(testkit.Rows(output[i].Plan...)) + } +} diff --git a/planner/core/physical_plan_trace_test.go b/planner/core/physical_plan_trace_test.go index 1e2ad927e0c54..5390fc20af0bd 100644 --- a/planner/core/physical_plan_trace_test.go +++ b/planner/core/physical_plan_trace_test.go @@ -61,7 +61,7 @@ func TestPhysicalOptimizeWithTraceEnabled(t *testing.T) { "Limit_20", "IndexReader_21", "Limit_14", - "HashAgg_9", + "StreamAgg_10", "Projection_8", }, }, diff --git a/planner/core/physical_plans.go b/planner/core/physical_plans.go index bdb08b7438b5a..da0a1e2b0ddf7 100644 --- a/planner/core/physical_plans.go +++ b/planner/core/physical_plans.go @@ -327,7 +327,7 @@ func (p *PhysicalIndexReader) Clone() (PhysicalPlan, error) { if cloned.IndexPlans, err = clonePhysicalPlan(p.IndexPlans); err != nil { return nil, err } - cloned.OutputColumns = cloneCols(p.OutputColumns) + cloned.OutputColumns = util.CloneCols(p.OutputColumns) return cloned, err } @@ -548,6 +548,12 @@ func (p *PhysicalIndexLookUpReader) MemoryUsage() (sum int64) { type PhysicalIndexMergeReader struct { physicalSchemaProducer + // IsIntersectionType means whether it's intersection type or union type. + // Intersection type is for expressions connected by `AND` and union type is for `OR`. + IsIntersectionType bool + // AccessMVIndex indicates whether this IndexMergeReader access a MVIndex. + AccessMVIndex bool + // PartialPlans flats the partialPlans to construct executor pb. PartialPlans [][]PhysicalPlan // TablePlans flats the tablePlan to construct executor pb. @@ -673,7 +679,12 @@ type PhysicalIndexScan struct { // tblColHists contains all columns before pruning, which are used to calculate row-size tblColHists *statistics.HistColl pkIsHandleCol *expression.Column - prop *property.PhysicalProperty + + // constColsByCond records the constant part of the index columns caused by the access conds. + // e.g. the index is (a, b, c) and there's filter a = 1 and b = 2, then the column a and b are const part. + constColsByCond []bool + + prop *property.PhysicalProperty } // Clone implements PhysicalPlan interface. @@ -685,18 +696,18 @@ func (p *PhysicalIndexScan) Clone() (PhysicalPlan, error) { return nil, err } cloned.physicalSchemaProducer = *base - cloned.AccessCondition = cloneExprs(p.AccessCondition) + cloned.AccessCondition = util.CloneExprs(p.AccessCondition) if p.Table != nil { cloned.Table = p.Table.Clone() } if p.Index != nil { cloned.Index = p.Index.Clone() } - cloned.IdxCols = cloneCols(p.IdxCols) + cloned.IdxCols = util.CloneCols(p.IdxCols) cloned.IdxColLens = make([]int, len(p.IdxColLens)) copy(cloned.IdxColLens, p.IdxColLens) - cloned.Ranges = cloneRanges(p.Ranges) - cloned.Columns = cloneColInfos(p.Columns) + cloned.Ranges = util.CloneRanges(p.Ranges) + cloned.Columns = util.CloneColInfos(p.Columns) if p.dataSourceSchema != nil { cloned.dataSourceSchema = p.dataSourceSchema.Clone() } @@ -836,13 +847,13 @@ func (ts *PhysicalTableScan) Clone() (PhysicalPlan, error) { return nil, err } clonedScan.physicalSchemaProducer = *prod - clonedScan.AccessCondition = cloneExprs(ts.AccessCondition) - clonedScan.filterCondition = cloneExprs(ts.filterCondition) + clonedScan.AccessCondition = util.CloneExprs(ts.AccessCondition) + clonedScan.filterCondition = util.CloneExprs(ts.filterCondition) if ts.Table != nil { clonedScan.Table = ts.Table.Clone() } - clonedScan.Columns = cloneColInfos(ts.Columns) - clonedScan.Ranges = cloneRanges(ts.Ranges) + clonedScan.Columns = util.CloneColInfos(ts.Columns) + clonedScan.Ranges = util.CloneRanges(ts.Ranges) clonedScan.TableAsName = ts.TableAsName if ts.Hist != nil { clonedScan.Hist = ts.Hist.Copy() @@ -993,7 +1004,7 @@ func (p *PhysicalProjection) Clone() (PhysicalPlan, error) { return nil, err } cloned.basePhysicalPlan = *base - cloned.Exprs = cloneExprs(p.Exprs) + cloned.Exprs = util.CloneExprs(p.Exprs) return cloned, err } @@ -1154,16 +1165,16 @@ func (p *basePhysicalJoin) cloneWithSelf(newSelf PhysicalPlan) (*basePhysicalJoi } cloned.physicalSchemaProducer = *base cloned.JoinType = p.JoinType - cloned.LeftConditions = cloneExprs(p.LeftConditions) - cloned.RightConditions = cloneExprs(p.RightConditions) - cloned.OtherConditions = cloneExprs(p.OtherConditions) + cloned.LeftConditions = util.CloneExprs(p.LeftConditions) + cloned.RightConditions = util.CloneExprs(p.RightConditions) + cloned.OtherConditions = util.CloneExprs(p.OtherConditions) cloned.InnerChildIdx = p.InnerChildIdx - cloned.OuterJoinKeys = cloneCols(p.OuterJoinKeys) - cloned.InnerJoinKeys = cloneCols(p.InnerJoinKeys) - cloned.LeftJoinKeys = cloneCols(p.LeftJoinKeys) - cloned.RightJoinKeys = cloneCols(p.RightJoinKeys) - cloned.LeftNAJoinKeys = cloneCols(p.LeftNAJoinKeys) - cloned.RightNAJoinKeys = cloneCols(p.RightNAJoinKeys) + cloned.OuterJoinKeys = util.CloneCols(p.OuterJoinKeys) + cloned.InnerJoinKeys = util.CloneCols(p.InnerJoinKeys) + cloned.LeftJoinKeys = util.CloneCols(p.LeftJoinKeys) + cloned.RightJoinKeys = util.CloneCols(p.RightJoinKeys) + cloned.LeftNAJoinKeys = util.CloneCols(p.LeftNAJoinKeys) + cloned.RightNAJoinKeys = util.CloneCols(p.RightNAJoinKeys) for _, d := range p.DefaultValues { cloned.DefaultValues = append(cloned.DefaultValues, *d.Clone()) } @@ -1492,7 +1503,8 @@ type PhysicalExchangeSender struct { ExchangeType tipb.ExchangeType HashCols []*property.MPPPartitionColumn // Tasks is the mpp task for current PhysicalExchangeSender. - Tasks []*kv.MPPTask + Tasks []*kv.MPPTask + CompressionMode kv.ExchangeCompressionMode } // Clone implment PhysicalPlan interface. @@ -1505,6 +1517,7 @@ func (p *PhysicalExchangeSender) Clone() (PhysicalPlan, error) { np.basePhysicalPlan = *base np.ExchangeType = p.ExchangeType np.HashCols = p.HashCols + np.CompressionMode = p.CompressionMode return np, nil } @@ -1669,7 +1682,7 @@ func (p *basePhysicalAgg) cloneWithSelf(newSelf PhysicalPlan) (*basePhysicalAgg, for _, aggDesc := range p.AggFuncs { cloned.AggFuncs = append(cloned.AggFuncs, aggDesc.Clone()) } - cloned.GroupByItems = cloneExprs(p.GroupByItems) + cloned.GroupByItems = util.CloneExprs(p.GroupByItems) return cloned, nil } @@ -1744,6 +1757,10 @@ type PhysicalHashAgg struct { basePhysicalAgg } +func (p *PhysicalHashAgg) getPointer() *basePhysicalAgg { + return &p.basePhysicalAgg +} + // Clone implements PhysicalPlan interface. func (p *PhysicalHashAgg) Clone() (PhysicalPlan, error) { cloned := new(PhysicalHashAgg) @@ -1778,6 +1795,10 @@ type PhysicalStreamAgg struct { basePhysicalAgg } +func (p *PhysicalStreamAgg) getPointer() *basePhysicalAgg { + return &p.basePhysicalAgg +} + // Clone implements PhysicalPlan interface. func (p *PhysicalStreamAgg) Clone() (PhysicalPlan, error) { cloned := new(PhysicalStreamAgg) @@ -1939,7 +1960,7 @@ func (p *PhysicalSelection) Clone() (PhysicalPlan, error) { return nil, err } cloned.basePhysicalPlan = *base - cloned.Conditions = cloneExprs(p.Conditions) + cloned.Conditions = util.CloneExprs(p.Conditions) return cloned, nil } diff --git a/planner/core/plan.go b/planner/core/plan.go index 78d18c59ff7f0..9ffb859aef769 100644 --- a/planner/core/plan.go +++ b/planner/core/plan.go @@ -197,7 +197,7 @@ func optimizeByShuffle4StreamAgg(pp *PhysicalStreamAgg, ctx sessionctx.Context) Tails: []PhysicalPlan{tail}, DataSources: []PhysicalPlan{dataSource}, SplitterType: PartitionHashSplitterType, - ByItemArrays: [][]expression.Expression{cloneExprs(pp.GroupByItems)}, + ByItemArrays: [][]expression.Expression{util.CloneExprs(pp.GroupByItems)}, }.Init(ctx, pp.statsInfo(), pp.SelectBlockOffset(), reqProp) return shuffle } @@ -277,6 +277,9 @@ type LogicalPlan interface { // pushDownTopN will push down the topN or limit operator during logical optimization. pushDownTopN(topN *LogicalTopN, opt *logicalOptimizeOp) LogicalPlan + // deriveTopN derives an implicit TopN from a filter on row_number window function.. + deriveTopN(opt *logicalOptimizeOp) LogicalPlan + // recursiveDeriveStats derives statistic info between plans. recursiveDeriveStats(colGroups [][]*expression.Column) (*property.StatsInfo, error) @@ -368,6 +371,9 @@ type PhysicalPlan interface { // Stats returns the StatsInfo of the plan. Stats() *property.StatsInfo + // SetStats sets basePlan.stats inside the basePhysicalPlan. + SetStats(s *property.StatsInfo) + // ExplainNormalizedInfo returns operator normalized information for generating digest. ExplainNormalizedInfo() string @@ -815,6 +821,11 @@ func (p *basePlan) Stats() *property.StatsInfo { return p.stats } +// SetStats sets basePlan.stats +func (p *basePlan) SetStats(s *property.StatsInfo) { + p.stats = s +} + // basePlanSize is the size of basePlan. const basePlanSize = int64(unsafe.Sizeof(basePlan{})) diff --git a/planner/core/plan_cache.go b/planner/core/plan_cache.go index e58e8b6d91708..7e8d691aaa1ae 100644 --- a/planner/core/plan_cache.go +++ b/planner/core/plan_cache.go @@ -42,7 +42,7 @@ import ( "go.uber.org/zap" ) -func planCachePreprocess(ctx context.Context, sctx sessionctx.Context, isGeneralPlanCache bool, is infoschema.InfoSchema, stmt *PlanCacheStmt, params []expression.Expression) error { +func planCachePreprocess(ctx context.Context, sctx sessionctx.Context, isNonPrepared bool, is infoschema.InfoSchema, stmt *PlanCacheStmt, params []expression.Expression) error { vars := sctx.GetSessionVars() stmtAst := stmt.PreparedAst vars.StmtCtx.StmtType = stmtAst.StmtType @@ -100,8 +100,8 @@ func planCachePreprocess(ctx context.Context, sctx sessionctx.Context, isGeneral // So we need to clear the current session's plan cache. // And update lastUpdateTime to the newest one. expiredTimeStamp4PC := domain.GetDomain(sctx).ExpiredTimeStamp4PC() - if stmtAst.UseCache && expiredTimeStamp4PC.Compare(vars.LastUpdateTime4PC) > 0 { - sctx.GetPlanCache(isGeneralPlanCache).DeleteAll() + if stmt.StmtCacheable && expiredTimeStamp4PC.Compare(vars.LastUpdateTime4PC) > 0 { + sctx.GetPlanCache(isNonPrepared).DeleteAll() stmtAst.CachedPlan = nil vars.LastUpdateTime4PC = expiredTimeStamp4PC } @@ -111,11 +111,15 @@ func planCachePreprocess(ctx context.Context, sctx sessionctx.Context, isGeneral // GetPlanFromSessionPlanCache is the entry point of Plan Cache. // It tries to get a valid cached plan from this session's plan cache. // If there is no such a plan, it'll call the optimizer to generate a new one. -// isGeneralPlanCache indicates whether to use the general plan cache or the prepared plan cache. +// isNonPrepared indicates whether to use the non-prepared plan cache or the prepared plan cache. func GetPlanFromSessionPlanCache(ctx context.Context, sctx sessionctx.Context, - isGeneralPlanCache bool, is infoschema.InfoSchema, stmt *PlanCacheStmt, + isNonPrepared bool, is infoschema.InfoSchema, stmt *PlanCacheStmt, params []expression.Expression) (plan Plan, names []*types.FieldName, err error) { - if err := planCachePreprocess(ctx, sctx, isGeneralPlanCache, is, stmt, params); err != nil { + if v := ctx.Value("____GetPlanFromSessionPlanCacheErr"); v != nil { // for testing + return nil, nil, errors.New("____GetPlanFromSessionPlanCacheErr") + } + + if err := planCachePreprocess(ctx, sctx, isNonPrepared, is, stmt, params); err != nil { return nil, nil, err } @@ -123,17 +127,25 @@ func GetPlanFromSessionPlanCache(ctx context.Context, sctx sessionctx.Context, sessVars := sctx.GetSessionVars() stmtCtx := sessVars.StmtCtx stmtAst := stmt.PreparedAst - stmtCtx.UseCache = stmtAst.UseCache + stmtCtx.UseCache = stmt.StmtCacheable + if !stmt.StmtCacheable { + stmtCtx.SetSkipPlanCache(errors.Errorf("skip plan-cache: %s", stmt.UncacheableReason)) + } var bindSQL string - var ignorePlanCache = false + if stmtCtx.UseCache { + var ignoreByBinding bool + bindSQL, ignoreByBinding = GetBindSQL4PlanCache(sctx, stmt) + if ignoreByBinding { + stmtCtx.SetSkipPlanCache(errors.Errorf("skip plan-cache: ignore plan cache by binding")) + } + } // In rc or for update read, we need the latest schema version to decide whether we need to // rebuild the plan. So we set this value in rc or for update read. In other cases, let it be 0. var latestSchemaVersion int64 - if stmtAst.UseCache { - bindSQL, ignorePlanCache = GetBindSQL4PlanCache(sctx, stmt) + if stmtCtx.UseCache { if sctx.GetSessionVars().IsIsolation(ast.ReadCommitted) || stmt.ForUpdateRead { // In Rc or ForUpdateRead, we should check if the information schema has been changed since // last time. If it changed, we should rebuild the plan. Here, we use a different and more @@ -146,28 +158,29 @@ func GetPlanFromSessionPlanCache(ctx context.Context, sctx sessionctx.Context, } } - paramNum, paramTypes := parseParamTypes(sctx, params) + paramTypes := parseParamTypes(sctx, params) - if stmtAst.UseCache && stmtAst.CachedPlan != nil && !ignorePlanCache { // for point query plan - if plan, names, ok, err := getPointQueryPlan(stmtAst, sessVars, stmtCtx); ok { + if stmtCtx.UseCache && stmtAst.CachedPlan != nil { // for point query plan + if plan, names, ok, err := getCachedPointPlan(stmtAst, sessVars, stmtCtx); ok { return plan, names, err } } - - if stmtAst.UseCache && !ignorePlanCache { // for general plans - if plan, names, ok, err := getGeneralPlan(sctx, isGeneralPlanCache, cacheKey, bindSQL, is, stmt, - paramTypes); err != nil || ok { + limitCountAndOffset, paramErr := ExtractLimitFromAst(stmt.PreparedAst.Stmt, sctx) + if paramErr != nil { + return nil, nil, paramErr + } + if stmtCtx.UseCache { // for non-point plans + if plan, names, ok, err := getCachedPlan(sctx, isNonPrepared, cacheKey, bindSQL, is, stmt, + paramTypes, limitCountAndOffset); err != nil || ok { return plan, names, err } } - return generateNewPlan(ctx, sctx, isGeneralPlanCache, is, stmt, ignorePlanCache, cacheKey, - latestSchemaVersion, paramNum, paramTypes, bindSQL) + return generateNewPlan(ctx, sctx, isNonPrepared, is, stmt, cacheKey, latestSchemaVersion, paramTypes, bindSQL, limitCountAndOffset) } // parseParamTypes get parameters' types in PREPARE statement -func parseParamTypes(sctx sessionctx.Context, params []expression.Expression) (paramNum int, paramTypes []*types.FieldType) { - paramNum = len(params) +func parseParamTypes(sctx sessionctx.Context, params []expression.Expression) (paramTypes []*types.FieldType) { for _, param := range params { if c, ok := param.(*expression.Constant); ok { // from binary protocol paramTypes = append(paramTypes, c.GetType()) @@ -185,7 +198,7 @@ func parseParamTypes(sctx sessionctx.Context, params []expression.Expression) (p return } -func getPointQueryPlan(stmt *ast.Prepared, sessVars *variable.SessionVars, stmtCtx *stmtctx.StatementContext) (Plan, +func getCachedPointPlan(stmt *ast.Prepared, sessVars *variable.SessionVars, stmtCtx *stmtctx.StatementContext) (Plan, []*types.FieldName, bool, error) { // short path for point-get plans // Rewriting the expression in the select.where condition will convert its @@ -209,13 +222,13 @@ func getPointQueryPlan(stmt *ast.Prepared, sessVars *variable.SessionVars, stmtC return plan, names, true, nil } -func getGeneralPlan(sctx sessionctx.Context, isGeneralPlanCache bool, cacheKey kvcache.Key, bindSQL string, - is infoschema.InfoSchema, stmt *PlanCacheStmt, paramTypes []*types.FieldType) (Plan, +func getCachedPlan(sctx sessionctx.Context, isNonPrepared bool, cacheKey kvcache.Key, bindSQL string, + is infoschema.InfoSchema, stmt *PlanCacheStmt, paramTypes []*types.FieldType, limitParams []uint64) (Plan, []*types.FieldName, bool, error) { sessVars := sctx.GetSessionVars() stmtCtx := sessVars.StmtCtx - candidate, exist := sctx.GetPlanCache(isGeneralPlanCache).Get(cacheKey, paramTypes) + candidate, exist := sctx.GetPlanCache(isNonPrepared).Get(cacheKey, paramTypes, limitParams) if !exist { return nil, nil, false, nil } @@ -227,7 +240,7 @@ func getGeneralPlan(sctx sessionctx.Context, isGeneralPlanCache bool, cacheKey k if !unionScan && tableHasDirtyContent(sctx, tblInfo) { // TODO we can inject UnionScan into cached plan to avoid invalidating it, though // rebuilding the filters in UnionScan is pretty trivial. - sctx.GetPlanCache(isGeneralPlanCache).Delete(cacheKey) + sctx.GetPlanCache(isNonPrepared).Delete(cacheKey) return nil, nil, false, nil } } @@ -253,9 +266,9 @@ func getGeneralPlan(sctx sessionctx.Context, isGeneralPlanCache bool, cacheKey k // generateNewPlan call the optimizer to generate a new plan for current statement // and try to add it to cache -func generateNewPlan(ctx context.Context, sctx sessionctx.Context, isGeneralPlanCache bool, is infoschema.InfoSchema, stmt *PlanCacheStmt, - ignorePlanCache bool, cacheKey kvcache.Key, latestSchemaVersion int64, paramNum int, - paramTypes []*types.FieldType, bindSQL string) (Plan, []*types.FieldName, error) { +func generateNewPlan(ctx context.Context, sctx sessionctx.Context, isNonPrepared bool, is infoschema.InfoSchema, + stmt *PlanCacheStmt, cacheKey kvcache.Key, latestSchemaVersion int64, paramTypes []*types.FieldType, + bindSQL string, limitParams []uint64) (Plan, []*types.FieldName, error) { stmtAst := stmt.PreparedAst sessVars := sctx.GetSessionVars() stmtCtx := sessVars.StmtCtx @@ -272,11 +285,13 @@ func generateNewPlan(ctx context.Context, sctx sessionctx.Context, isGeneralPlan return nil, nil, err } - // We only cache the tableDual plan when the number of parameters are zero. - if containTableDual(p) && paramNum > 0 { - stmtCtx.SkipPlanCache = true + // check whether this plan is cacheable. + if stmtCtx.UseCache { + checkPlanCacheability(sctx, p, len(paramTypes), len(limitParams)) } - if stmtAst.UseCache && !stmtCtx.SkipPlanCache && !ignorePlanCache { + + // put this plan into the plan cache. + if stmtCtx.UseCache { // rebuild key to exclude kv.TiFlash when stmt is not read only if _, isolationReadContainTiFlash := sessVars.IsolationReadEngines[kv.TiFlash]; isolationReadContainTiFlash && !IsReadOnly(stmtAst.Stmt, sessVars) { delete(sessVars.IsolationReadEngines, kv.TiFlash) @@ -286,16 +301,64 @@ func generateNewPlan(ctx context.Context, sctx sessionctx.Context, isGeneralPlan } sessVars.IsolationReadEngines[kv.TiFlash] = struct{}{} } - cached := NewPlanCacheValue(p, names, stmtCtx.TblInfo2UnionScan, paramTypes) + cached := NewPlanCacheValue(p, names, stmtCtx.TblInfo2UnionScan, paramTypes, limitParams) stmt.NormalizedPlan, stmt.PlanDigest = NormalizePlan(p) stmtCtx.SetPlan(p) stmtCtx.SetPlanDigest(stmt.NormalizedPlan, stmt.PlanDigest) - sctx.GetPlanCache(isGeneralPlanCache).Put(cacheKey, cached, paramTypes) + sctx.GetPlanCache(isNonPrepared).Put(cacheKey, cached, paramTypes, limitParams) } sessVars.FoundInPlanCache = false return p, names, err } +// checkPlanCacheability checks whether this plan is cacheable and set to skip plan cache if it's uncacheable. +func checkPlanCacheability(sctx sessionctx.Context, p Plan, paramNum int, limitParamNum int) { + stmtCtx := sctx.GetSessionVars().StmtCtx + var pp PhysicalPlan + switch x := p.(type) { + case *Insert: + pp = x.SelectPlan + case *Update: + pp = x.SelectPlan + case *Delete: + pp = x.SelectPlan + case PhysicalPlan: + pp = x + default: + stmtCtx.SetSkipPlanCache(errors.Errorf("skip plan-cache: unexpected un-cacheable plan %v", p.ExplainID().String())) + return + } + if pp == nil { // simple DML statements + return + } + + if useTiFlash(pp) { + stmtCtx.SetSkipPlanCache(errors.Errorf("skip plan-cache: TiFlash plan is un-cacheable")) + return + } + + // We only cache the tableDual plan when the number of parameters are zero. + if containTableDual(pp) && paramNum > 0 { + stmtCtx.SetSkipPlanCache(errors.New("skip plan-cache: get a TableDual plan")) + return + } + + if containShuffleOperator(pp) { + stmtCtx.SetSkipPlanCache(errors.New("skip plan-cache: get a Shuffle plan")) + return + } + + if accessMVIndexWithIndexMerge(pp) { + stmtCtx.SetSkipPlanCache(errors.New("skip plan-cache: the plan with IndexMerge accessing Multi-Valued Index is un-cacheable")) + return + } + + // before cache the param limit plan, check switch + if limitParamNum != 0 && !sctx.GetSessionVars().EnablePlanCacheForParamLimit { + stmtCtx.SetSkipPlanCache(errors.New("skip plan-cache: the switch 'tidb_enable_plan_cache_for_param_limit' is off")) + } +} + // RebuildPlan4CachedPlan will rebuild this plan under current user parameters. func RebuildPlan4CachedPlan(p Plan) error { sc := p.SCtx().GetSessionVars().StmtCtx @@ -636,7 +699,7 @@ func CheckPreparedPriv(sctx sessionctx.Context, stmt *PlanCacheStmt, is infosche // short paths for these executions, currently "point select" and "point update" func tryCachePointPlan(_ context.Context, sctx sessionctx.Context, stmt *PlanCacheStmt, _ infoschema.InfoSchema, p Plan) error { - if !sctx.GetSessionVars().StmtCtx.UseCache || sctx.GetSessionVars().StmtCtx.SkipPlanCache { + if !sctx.GetSessionVars().StmtCtx.UseCache { return nil } var ( @@ -665,22 +728,63 @@ func tryCachePointPlan(_ context.Context, sctx sessionctx.Context, return err } -func containTableDual(p Plan) bool { +func containTableDual(p PhysicalPlan) bool { _, isTableDual := p.(*PhysicalTableDual) if isTableDual { return true } - physicalPlan, ok := p.(PhysicalPlan) - if !ok { - return false - } childContainTableDual := false - for _, child := range physicalPlan.Children() { + for _, child := range p.Children() { childContainTableDual = childContainTableDual || containTableDual(child) } return childContainTableDual } +func containShuffleOperator(p PhysicalPlan) bool { + if _, isShuffle := p.(*PhysicalShuffle); isShuffle { + return true + } + if _, isShuffleRecv := p.(*PhysicalShuffleReceiverStub); isShuffleRecv { + return true + } + return false +} + +func accessMVIndexWithIndexMerge(p PhysicalPlan) bool { + if idxMerge, ok := p.(*PhysicalIndexMergeReader); ok { + if idxMerge.AccessMVIndex { + return true + } + } + + for _, c := range p.Children() { + if accessMVIndexWithIndexMerge(c) { + return true + } + } + return false +} + +// useTiFlash used to check whether the plan use the TiFlash engine. +func useTiFlash(p PhysicalPlan) bool { + switch x := p.(type) { + case *PhysicalTableReader: + switch x.StoreType { + case kv.TiFlash: + return true + default: + return false + } + default: + if len(p.Children()) > 0 { + for _, plan := range p.Children() { + return useTiFlash(plan) + } + } + } + return false +} + // GetBindSQL4PlanCache used to get the bindSQL for plan cache to build the plan cache key. func GetBindSQL4PlanCache(sctx sessionctx.Context, stmt *PlanCacheStmt) (string, bool) { useBinding := sctx.GetSessionVars().UsePlanBaselines diff --git a/planner/core/plan_cache_lru.go b/planner/core/plan_cache_lru.go index 413dd37e8f5a2..7379ec5411a37 100644 --- a/planner/core/plan_cache_lru.go +++ b/planner/core/plan_cache_lru.go @@ -51,9 +51,6 @@ type LRUPlanCache struct { lruList *list.List // lock make cache thread safe lock sync.Mutex - - // pickFromBucket get one element from bucket. The LRUPlanCache can not work if it is nil - pickFromBucket func(map[*list.Element]struct{}, []*types.FieldType) (*list.Element, bool) // onEvict will be called if any eviction happened, only for test use now onEvict func(kvcache.Key, kvcache.Value) @@ -67,21 +64,19 @@ type LRUPlanCache struct { // NewLRUPlanCache creates a PCLRUCache object, whose capacity is "capacity". // NOTE: "capacity" should be a positive value. -func NewLRUPlanCache(capacity uint, guard float64, quota uint64, - pickFromBucket func(map[*list.Element]struct{}, []*types.FieldType) (*list.Element, bool), sctx sessionctx.Context) *LRUPlanCache { +func NewLRUPlanCache(capacity uint, guard float64, quota uint64, sctx sessionctx.Context) *LRUPlanCache { if capacity < 1 { capacity = 100 logutil.BgLogger().Info("capacity of LRU cache is less than 1, will use default value(100) init cache") } return &LRUPlanCache{ - capacity: capacity, - size: 0, - buckets: make(map[string]map[*list.Element]struct{}, 1), //Generally one query has one plan - lruList: list.New(), - pickFromBucket: pickFromBucket, - quota: quota, - guard: guard, - sctx: sctx, + capacity: capacity, + size: 0, + buckets: make(map[string]map[*list.Element]struct{}, 1), //Generally one query has one plan + lruList: list.New(), + quota: quota, + guard: guard, + sctx: sctx, } } @@ -94,13 +89,17 @@ func strHashKey(key kvcache.Key, deepCopy bool) string { } // Get tries to find the corresponding value according to the given key. -func (l *LRUPlanCache) Get(key kvcache.Key, paramTypes []*types.FieldType) (value kvcache.Value, ok bool) { +func (l *LRUPlanCache) Get(key kvcache.Key, paramTypes []*types.FieldType, limitParams []uint64) (value kvcache.Value, ok bool) { l.lock.Lock() defer l.lock.Unlock() bucket, bucketExist := l.buckets[strHashKey(key, false)] if bucketExist { - if element, exist := l.pickFromBucket(bucket, paramTypes); exist { + matchOpts := &planCacheMatchOpts{ + paramTypes: paramTypes, + limitOffsetAndCount: limitParams, + } + if element, exist := l.pickFromBucket(bucket, matchOpts); exist { l.lruList.MoveToFront(element) return element.Value.(*planCacheEntry).PlanValue, true } @@ -109,14 +108,18 @@ func (l *LRUPlanCache) Get(key kvcache.Key, paramTypes []*types.FieldType) (valu } // Put puts the (key, value) pair into the LRU Cache. -func (l *LRUPlanCache) Put(key kvcache.Key, value kvcache.Value, paramTypes []*types.FieldType) { +func (l *LRUPlanCache) Put(key kvcache.Key, value kvcache.Value, paramTypes []*types.FieldType, limitParams []uint64) { l.lock.Lock() defer l.lock.Unlock() hash := strHashKey(key, true) bucket, bucketExist := l.buckets[hash] if bucketExist { - if element, exist := l.pickFromBucket(bucket, paramTypes); exist { + matchOpts := &planCacheMatchOpts{ + paramTypes: paramTypes, + limitOffsetAndCount: limitParams, + } + if element, exist := l.pickFromBucket(bucket, matchOpts); exist { l.updateInstanceMetric(&planCacheEntry{PlanKey: key, PlanValue: value}, element.Value.(*planCacheEntry)) element.Value.(*planCacheEntry).PlanValue = value l.lruList.MoveToFront(element) @@ -252,16 +255,44 @@ func (l *LRUPlanCache) memoryControl() { } // PickPlanFromBucket pick one plan from bucket -func PickPlanFromBucket(bucket map[*list.Element]struct{}, paramTypes []*types.FieldType) (*list.Element, bool) { +func (l *LRUPlanCache) pickFromBucket(bucket map[*list.Element]struct{}, matchOpts *planCacheMatchOpts) (*list.Element, bool) { for k := range bucket { plan := k.Value.(*planCacheEntry).PlanValue.(*PlanCacheValue) - if plan.ParamTypes.CheckTypesCompatibility4PC(paramTypes) { - return k, true + // check param types' compatibility + ok1 := plan.matchOpts.paramTypes.CheckTypesCompatibility4PC(matchOpts.paramTypes) + if !ok1 { + continue + } + + // check limit offset and key if equal and check switch if enabled + ok2 := checkUint64SliceIfEqual(plan.matchOpts.limitOffsetAndCount, matchOpts.limitOffsetAndCount) + if !ok2 { + continue + } + if len(plan.matchOpts.limitOffsetAndCount) > 0 && !l.sctx.GetSessionVars().EnablePlanCacheForParamLimit { + // offset and key slice matched, but it is a plan with param limit and the switch is disabled + continue } + return k, true } return nil, false } +func checkUint64SliceIfEqual(a, b []uint64) bool { + if (a == nil && b != nil) || (a != nil && b == nil) { + return false + } + if len(a) != len(b) { + return false + } + for i := range a { + if a[i] != b[i] { + return false + } + } + return true +} + // updateInstanceMetric update the memory usage and plan num for show in grafana func (l *LRUPlanCache) updateInstanceMetric(in, out *planCacheEntry) { updateInstancePlanNum(in, out) diff --git a/planner/core/plan_cache_lru_test.go b/planner/core/plan_cache_lru_test.go index 74b6b2c92c3bb..e3d6c43c9310b 100644 --- a/planner/core/plan_cache_lru_test.go +++ b/planner/core/plan_cache_lru_test.go @@ -40,18 +40,20 @@ func randomPlanCacheValue(types []*types.FieldType) *PlanCacheValue { &PhysicalIndexLookUpReader{}, &PhysicalApply{}, &PhysicalApply{}, &PhysicalLimit{}} random := rand.New(rand.NewSource(time.Now().UnixNano())) return &PlanCacheValue{ - Plan: plans[random.Int()%len(plans)], - ParamTypes: types, + Plan: plans[random.Int()%len(plans)], + matchOpts: planCacheMatchOpts{paramTypes: types}, } } func TestLRUPCPut(t *testing.T) { // test initialize - lruA := NewLRUPlanCache(0, 0, 0, PickPlanFromBucket, MockContext()) + mockCtx := MockContext() + mockCtx.GetSessionVars().EnablePlanCacheForParamLimit = true + lruA := NewLRUPlanCache(0, 0, 0, mockCtx) require.Equal(t, lruA.capacity, uint(100)) maxMemDroppedKv := make(map[kvcache.Key]kvcache.Value) - lru := NewLRUPlanCache(3, 0, 0, PickPlanFromBucket, MockContext()) + lru := NewLRUPlanCache(3, 0, 0, mockCtx) lru.onEvict = func(key kvcache.Key, value kvcache.Value) { maxMemDroppedKv[key] = value } @@ -65,14 +67,20 @@ func TestLRUPCPut(t *testing.T) { {types.NewFieldType(mysql.TypeFloat), types.NewFieldType(mysql.TypeLong)}, {types.NewFieldType(mysql.TypeFloat), types.NewFieldType(mysql.TypeInt24)}, } + limitParams := [][]uint64{ + {1}, {2}, {3}, {4}, {5}, + } // one key corresponding to multi values for i := 0; i < 5; i++ { keys[i] = &planCacheKey{database: strconv.FormatInt(int64(1), 10)} vals[i] = &PlanCacheValue{ - ParamTypes: pTypes[i], + matchOpts: planCacheMatchOpts{ + paramTypes: pTypes[i], + limitOffsetAndCount: limitParams[i], + }, } - lru.Put(keys[i], vals[i], pTypes[i]) + lru.Put(keys[i], vals[i], pTypes[i], limitParams[i]) } require.Equal(t, lru.size, lru.capacity) require.Equal(t, uint(3), lru.size) @@ -103,7 +111,11 @@ func TestLRUPCPut(t *testing.T) { bucket, exist := lru.buckets[string(hack.String(keys[i].Hash()))] require.True(t, exist) - element, exist := lru.pickFromBucket(bucket, pTypes[i]) + matchOpts := &planCacheMatchOpts{ + paramTypes: pTypes[i], + limitOffsetAndCount: limitParams[i], + } + element, exist := lru.pickFromBucket(bucket, matchOpts) require.NotNil(t, element) require.True(t, exist) require.Equal(t, root, element) @@ -121,7 +133,9 @@ func TestLRUPCPut(t *testing.T) { } func TestLRUPCGet(t *testing.T) { - lru := NewLRUPlanCache(3, 0, 0, PickPlanFromBucket, MockContext()) + mockCtx := MockContext() + mockCtx.GetSessionVars().EnablePlanCacheForParamLimit = true + lru := NewLRUPlanCache(3, 0, 0, mockCtx) keys := make([]*planCacheKey, 5) vals := make([]*PlanCacheValue, 5) @@ -131,22 +145,30 @@ func TestLRUPCGet(t *testing.T) { {types.NewFieldType(mysql.TypeFloat), types.NewFieldType(mysql.TypeLong)}, {types.NewFieldType(mysql.TypeFloat), types.NewFieldType(mysql.TypeInt24)}, } + limitParams := [][]uint64{ + {1}, {2}, {3}, {4}, {5}, + } // 5 bucket for i := 0; i < 5; i++ { keys[i] = &planCacheKey{database: strconv.FormatInt(int64(i%4), 10)} - vals[i] = &PlanCacheValue{ParamTypes: pTypes[i]} - lru.Put(keys[i], vals[i], pTypes[i]) + vals[i] = &PlanCacheValue{ + matchOpts: planCacheMatchOpts{ + paramTypes: pTypes[i], + limitOffsetAndCount: limitParams[i], + }, + } + lru.Put(keys[i], vals[i], pTypes[i], limitParams[i]) } // test for non-existent elements for i := 0; i < 2; i++ { - value, exists := lru.Get(keys[i], pTypes[i]) + value, exists := lru.Get(keys[i], pTypes[i], limitParams[i]) require.False(t, exists) require.Nil(t, value) } for i := 2; i < 5; i++ { - value, exists := lru.Get(keys[i], pTypes[i]) + value, exists := lru.Get(keys[i], pTypes[i], limitParams[i]) require.True(t, exists) require.NotNil(t, value) require.Equal(t, vals[i], value) @@ -167,7 +189,9 @@ func TestLRUPCGet(t *testing.T) { } func TestLRUPCDelete(t *testing.T) { - lru := NewLRUPlanCache(3, 0, 0, PickPlanFromBucket, MockContext()) + mockCtx := MockContext() + mockCtx.GetSessionVars().EnablePlanCacheForParamLimit = true + lru := NewLRUPlanCache(3, 0, 0, mockCtx) keys := make([]*planCacheKey, 3) vals := make([]*PlanCacheValue, 3) @@ -175,28 +199,36 @@ func TestLRUPCDelete(t *testing.T) { {types.NewFieldType(mysql.TypeFloat), types.NewFieldType(mysql.TypeEnum)}, {types.NewFieldType(mysql.TypeFloat), types.NewFieldType(mysql.TypeDate)}, } + limitParams := [][]uint64{ + {1}, {2}, {3}, + } for i := 0; i < 3; i++ { keys[i] = &planCacheKey{database: strconv.FormatInt(int64(i), 10)} - vals[i] = &PlanCacheValue{ParamTypes: pTypes[i]} - lru.Put(keys[i], vals[i], pTypes[i]) + vals[i] = &PlanCacheValue{ + matchOpts: planCacheMatchOpts{ + paramTypes: pTypes[i], + limitOffsetAndCount: limitParams[i], + }, + } + lru.Put(keys[i], vals[i], pTypes[i], []uint64{}) } require.Equal(t, 3, int(lru.size)) lru.Delete(keys[1]) - value, exists := lru.Get(keys[1], pTypes[1]) + value, exists := lru.Get(keys[1], pTypes[1], limitParams[1]) require.False(t, exists) require.Nil(t, value) require.Equal(t, 2, int(lru.size)) - _, exists = lru.Get(keys[0], pTypes[0]) + _, exists = lru.Get(keys[0], pTypes[0], limitParams[0]) require.True(t, exists) - _, exists = lru.Get(keys[2], pTypes[2]) + _, exists = lru.Get(keys[2], pTypes[2], limitParams[2]) require.True(t, exists) } func TestLRUPCDeleteAll(t *testing.T) { - lru := NewLRUPlanCache(3, 0, 0, PickPlanFromBucket, MockContext()) + lru := NewLRUPlanCache(3, 0, 0, MockContext()) keys := make([]*planCacheKey, 3) vals := make([]*PlanCacheValue, 3) @@ -206,15 +238,19 @@ func TestLRUPCDeleteAll(t *testing.T) { } for i := 0; i < 3; i++ { keys[i] = &planCacheKey{database: strconv.FormatInt(int64(i), 10)} - vals[i] = &PlanCacheValue{ParamTypes: pTypes[i]} - lru.Put(keys[i], vals[i], pTypes[i]) + vals[i] = &PlanCacheValue{ + matchOpts: planCacheMatchOpts{ + paramTypes: pTypes[i], + }, + } + lru.Put(keys[i], vals[i], pTypes[i], []uint64{}) } require.Equal(t, 3, int(lru.size)) lru.DeleteAll() for i := 0; i < 3; i++ { - value, exists := lru.Get(keys[i], pTypes[i]) + value, exists := lru.Get(keys[i], pTypes[i], []uint64{}) require.False(t, exists) require.Nil(t, value) require.Equal(t, 0, int(lru.size)) @@ -223,7 +259,7 @@ func TestLRUPCDeleteAll(t *testing.T) { func TestLRUPCSetCapacity(t *testing.T) { maxMemDroppedKv := make(map[kvcache.Key]kvcache.Value) - lru := NewLRUPlanCache(5, 0, 0, PickPlanFromBucket, MockContext()) + lru := NewLRUPlanCache(5, 0, 0, MockContext()) lru.onEvict = func(key kvcache.Key, value kvcache.Value) { maxMemDroppedKv[key] = value } @@ -241,8 +277,11 @@ func TestLRUPCSetCapacity(t *testing.T) { // one key corresponding to multi values for i := 0; i < 5; i++ { keys[i] = &planCacheKey{database: strconv.FormatInt(int64(1), 10)} - vals[i] = &PlanCacheValue{ParamTypes: pTypes[i]} - lru.Put(keys[i], vals[i], pTypes[i]) + vals[i] = &PlanCacheValue{ + matchOpts: planCacheMatchOpts{ + paramTypes: pTypes[i], + }} + lru.Put(keys[i], vals[i], pTypes[i], []uint64{}) } require.Equal(t, lru.size, lru.capacity) require.Equal(t, uint(5), lru.size) @@ -285,19 +324,19 @@ func TestLRUPCSetCapacity(t *testing.T) { } func TestIssue37914(t *testing.T) { - lru := NewLRUPlanCache(3, 0.1, 1, PickPlanFromBucket, MockContext()) + lru := NewLRUPlanCache(3, 0.1, 1, MockContext()) pTypes := []*types.FieldType{types.NewFieldType(mysql.TypeFloat), types.NewFieldType(mysql.TypeDouble)} key := &planCacheKey{database: strconv.FormatInt(int64(1), 10)} - val := &PlanCacheValue{ParamTypes: pTypes} + val := &PlanCacheValue{matchOpts: planCacheMatchOpts{paramTypes: pTypes}} require.NotPanics(t, func() { - lru.Put(key, val, pTypes) + lru.Put(key, val, pTypes, []uint64{}) }) } func TestIssue38244(t *testing.T) { - lru := NewLRUPlanCache(3, 0, 0, PickPlanFromBucket, MockContext()) + lru := NewLRUPlanCache(3, 0, 0, MockContext()) require.Equal(t, uint(3), lru.capacity) keys := make([]*planCacheKey, 5) @@ -312,8 +351,8 @@ func TestIssue38244(t *testing.T) { // one key corresponding to multi values for i := 0; i < 5; i++ { keys[i] = &planCacheKey{database: strconv.FormatInt(int64(i), 10)} - vals[i] = &PlanCacheValue{ParamTypes: pTypes[i]} - lru.Put(keys[i], vals[i], pTypes[i]) + vals[i] = &PlanCacheValue{matchOpts: planCacheMatchOpts{paramTypes: pTypes[i]}} + lru.Put(keys[i], vals[i], pTypes[i], []uint64{}) } require.Equal(t, lru.size, lru.capacity) require.Equal(t, uint(3), lru.size) @@ -324,7 +363,7 @@ func TestLRUPlanCacheMemoryUsage(t *testing.T) { pTypes := []*types.FieldType{types.NewFieldType(mysql.TypeFloat), types.NewFieldType(mysql.TypeDouble)} ctx := MockContext() ctx.GetSessionVars().EnablePreparedPlanCacheMemoryMonitor = true - lru := NewLRUPlanCache(3, 0, 0, PickPlanFromBucket, ctx) + lru := NewLRUPlanCache(3, 0, 0, ctx) evict := make(map[kvcache.Key]kvcache.Value) lru.onEvict = func(key kvcache.Key, value kvcache.Value) { evict[key] = value @@ -334,7 +373,7 @@ func TestLRUPlanCacheMemoryUsage(t *testing.T) { for i := 0; i < 3; i++ { k := randomPlanCacheKey() v := randomPlanCacheValue(pTypes) - lru.Put(k, v, pTypes) + lru.Put(k, v, pTypes, []uint64{}) res += k.MemoryUsage() + v.MemoryUsage() require.Equal(t, lru.MemoryUsage(), res) } @@ -342,7 +381,7 @@ func TestLRUPlanCacheMemoryUsage(t *testing.T) { p := &PhysicalTableScan{} k := &planCacheKey{database: "3"} v := &PlanCacheValue{Plan: p} - lru.Put(k, v, pTypes) + lru.Put(k, v, pTypes, []uint64{}) res += k.MemoryUsage() + v.MemoryUsage() for kk, vv := range evict { res -= kk.(*planCacheKey).MemoryUsage() + vv.(*PlanCacheValue).MemoryUsage() diff --git a/planner/core/plan_cache_param.go b/planner/core/plan_cache_param.go index a1e4b5a3f6703..9094edec621c0 100644 --- a/planner/core/plan_cache_param.go +++ b/planner/core/plan_cache_param.go @@ -15,6 +15,7 @@ package core import ( + "context" "errors" "strings" "sync" @@ -54,7 +55,7 @@ func (pr *paramReplacer) Enter(in ast.Node) (out ast.Node, skipChildren bool) { switch n := in.(type) { case *driver.ValueExpr: pr.params = append(pr.params, n) - // offset is used as order in general plan cache. + // offset is used as order in non-prepared plan cache. param := ast.NewParamMarkerExpr(len(pr.params) - 1) return param, true } @@ -70,7 +71,7 @@ func (pr *paramReplacer) Reset() { pr.params = nil } // ParameterizeAST parameterizes this StmtNode. // e.g. `select * from t where a<10 and b<23` --> `select * from t where a `select * from t where a<10 and b<23`. -func RestoreASTWithParams(_ sessionctx.Context, stmt ast.StmtNode, params []*driver.ValueExpr) error { +func RestoreASTWithParams(ctx context.Context, _ sessionctx.Context, stmt ast.StmtNode, params []*driver.ValueExpr) error { + if v := ctx.Value("____RestoreASTWithParamsErr"); v != nil { + return errors.New("____RestoreASTWithParamsErr") + } + pr := paramRestorerPool.Get().(*paramRestorer) defer func() { pr.Reset() diff --git a/planner/core/plan_cache_param_test.go b/planner/core/plan_cache_param_test.go index 5c65b89767a60..ee4a8e9ae65c5 100644 --- a/planner/core/plan_cache_param_test.go +++ b/planner/core/plan_cache_param_test.go @@ -15,6 +15,7 @@ package core import ( + "context" "strings" "testing" @@ -61,7 +62,7 @@ func TestParameterize(t *testing.T) { for _, c := range cases { stmt, err := parser.New().ParseOneStmt(c.sql, "", "") require.Nil(t, err) - paramSQL, params, err := ParameterizeAST(sctx, stmt) + paramSQL, params, err := ParameterizeAST(context.Background(), sctx, stmt) require.Nil(t, err) require.Equal(t, c.paramSQL, paramSQL) require.Equal(t, len(c.params), len(params)) @@ -69,7 +70,7 @@ func TestParameterize(t *testing.T) { require.Equal(t, c.params[i], params[i].Datum.GetValue()) } - err = RestoreASTWithParams(sctx, stmt, params) + err = RestoreASTWithParams(context.Background(), sctx, stmt, params) require.Nil(t, err) var buf strings.Builder rCtx := format.NewRestoreCtx(format.DefaultRestoreFlags, &buf) diff --git a/planner/core/plan_cache_test.go b/planner/core/plan_cache_test.go index d1f51bc296c07..44f56721dd62c 100644 --- a/planner/core/plan_cache_test.go +++ b/planner/core/plan_cache_test.go @@ -15,6 +15,7 @@ package core_test import ( + "context" "errors" "fmt" "math/rand" @@ -77,11 +78,101 @@ func TestInitLRUWithSystemVar(t *testing.T) { tk.MustQuery("select @@session.tidb_prepared_plan_cache_size").Check(testkit.Rows("1")) sessionVar := tk.Session().GetSessionVars() - lru := plannercore.NewLRUPlanCache(uint(sessionVar.PreparedPlanCacheSize), 0, 0, plannercore.PickPlanFromBucket, tk.Session()) + lru := plannercore.NewLRUPlanCache(uint(sessionVar.PreparedPlanCacheSize), 0, 0, tk.Session()) require.NotNil(t, lru) } -func TestGeneralPlanCacheBasically(t *testing.T) { +func TestIssue40296(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec(`create database test_40296`) + tk.MustExec(`use test_40296`) + tk.MustExec(`CREATE TABLE IDT_MULTI15880STROBJSTROBJ ( + COL1 enum('aa','bb','cc','dd','ff','gg','kk','ll','mm','ee') DEFAULT NULL, + COL2 decimal(20,0) DEFAULT NULL, + COL3 date DEFAULT NULL, + KEY U_M_COL4 (COL1,COL2), + KEY U_M_COL5 (COL3,COL2))`) + tk.MustExec(`insert into IDT_MULTI15880STROBJSTROBJ values("ee", -9605492323393070105, "0850-03-15")`) + tk.MustExec(`set session tidb_enable_non_prepared_plan_cache=on`) + tk.MustQuery(`select * from IDT_MULTI15880STROBJSTROBJ where col1 in ("dd", "dd") or col2 = 9923875910817805958 or col3 = "9994-11-11"`).Check( + testkit.Rows()) + tk.MustQuery(`select * from IDT_MULTI15880STROBJSTROBJ where col1 in ("aa", "aa") or col2 = -9605492323393070105 or col3 = "0005-06-22"`).Check( + testkit.Rows("ee -9605492323393070105 0850-03-15")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) // unary operator '-' is not supported now. +} + +func TestNonPreparedPlanCacheWithExplain(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec(`use test`) + tk.MustExec("create table t(a int)") + tk.MustExec("set tidb_enable_non_prepared_plan_cache=1") + tk.MustExec("select * from t where a=1") // cache this plan + + tk.MustQuery("explain select * from t where a=2").Check(testkit.Rows( + `Selection_8 10.00 root eq(test.t.a, 2)`, + `└─TableReader_7 10.00 root data:Selection_6`, + ` └─Selection_6 10.00 cop[tikv] eq(test.t.a, 2)`, + ` └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo`)) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + tk.MustQuery("explain format=verbose select * from t where a=2").Check(testkit.Rows( + `Selection_8 10.00 169474.57 root eq(test.t.a, 2)`, + `└─TableReader_7 10.00 168975.57 root data:Selection_6`, + ` └─Selection_6 10.00 2534000.00 cop[tikv] eq(test.t.a, 2)`, + ` └─TableFullScan_5 10000.00 2035000.00 cop[tikv] table:t keep order:false, stats:pseudo`)) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + tk.MustQuery("explain analyze select * from t where a=2").CheckAt([]int{0, 1, 2, 3}, [][]interface{}{ + {"Selection_8", "10.00", "0", "root"}, + {"└─TableReader_7", "10.00", "0", "root"}, + {" └─Selection_6", "10.00", "0", "cop[tikv]"}, + {" └─TableFullScan_5", "10000.00", "0", "cop[tikv]"}, + }) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) +} + +func TestNonPreparedPlanCacheFallback(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec(`use test`) + tk.MustExec(`create table t (a int)`) + for i := 0; i < 5; i++ { + tk.MustExec(fmt.Sprintf("insert into t values (%v)", i)) + } + tk.MustExec("set tidb_enable_non_prepared_plan_cache=1") + + // inject a fault to GeneratePlanCacheStmtWithAST + ctx := context.WithValue(context.Background(), "____GeneratePlanCacheStmtWithASTErr", struct{}{}) + tk.MustQueryWithContext(ctx, "select * from t where a in (1, 2)").Sort().Check(testkit.Rows("1", "2")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) // cannot generate PlanCacheStmt + tk.MustQueryWithContext(ctx, "select * from t where a in (1, 3)").Sort().Check(testkit.Rows("1", "3")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) // cannot generate PlanCacheStmt + tk.MustQuery("select * from t where a in (1, 2)").Sort().Check(testkit.Rows("1", "2")) + tk.MustQuery("select * from t where a in (1, 3)").Sort().Check(testkit.Rows("1", "3")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) // no error + + // inject a fault to GetPlanFromSessionPlanCache + tk.MustQuery("select * from t where a=1").Check(testkit.Rows("1")) // cache this plan + tk.MustQuery("select * from t where a=2").Check(testkit.Rows("2")) // plan from cache + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + ctx = context.WithValue(context.Background(), "____GetPlanFromSessionPlanCacheErr", struct{}{}) + tk.MustQueryWithContext(ctx, "select * from t where a=3").Check(testkit.Rows("3")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) // fallback to the normal opt-path + tk.MustQueryWithContext(ctx, "select * from t where a=4").Check(testkit.Rows("4")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) // fallback to the normal opt-path + tk.MustQueryWithContext(context.Background(), "select * from t where a=0").Check(testkit.Rows("0")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) // use the cached plan if no error + + // inject a fault to RestoreASTWithParams + ctx = context.WithValue(context.Background(), "____GetPlanFromSessionPlanCacheErr", struct{}{}) + ctx = context.WithValue(ctx, "____RestoreASTWithParamsErr", struct{}{}) + _, err := tk.ExecWithContext(ctx, "select * from t where a=1") + require.NotNil(t, err) +} + +func TestNonPreparedPlanCacheBasically(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) tk.MustExec(`use test`) @@ -101,11 +192,11 @@ func TestGeneralPlanCacheBasically(t *testing.T) { } for _, query := range queries { - tk.MustExec(`set tidb_enable_general_plan_cache=0`) + tk.MustExec(`set tidb_enable_non_prepared_plan_cache=0`) resultNormal := tk.MustQuery(query).Sort() tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("0")) - tk.MustExec(`set tidb_enable_general_plan_cache=1`) + tk.MustExec(`set tidb_enable_non_prepared_plan_cache=1`) tk.MustQuery(query) // first process tk.MustQuery(query).Sort().Check(resultNormal.Rows()) // equal to the result without plan-cache tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) // this plan is from plan-cache @@ -150,6 +241,111 @@ func TestIssue38533(t *testing.T) { tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) } +func TestInvalidRange(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t (a int, key(a))") + tk.MustExec("prepare st from 'select * from t where a>? and a 123 + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 skip plan-cache: '123' may be converted to INT")) + + tk.MustExec("prepare stmt from 'select * from t where a=? and a=?'") + tk.MustExec("set @a=1, @b=1") + tk.MustExec("execute stmt using @a, @b") // a=1 and a=1 -> a=1 + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 skip plan-cache: some parameters may be overwritten")) +} + +func TestIssue40224(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t (a int, key(a))") + tk.MustExec("prepare st from 'select a from t where a in (?, ?)'") + tk.MustExec("set @a=1.0, @b=2.0") + tk.MustExec("execute st using @a, @b") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 skip plan-cache: '1.0' may be converted to INT")) + tk.MustExec("execute st using @a, @b") + tkProcess := tk.Session().ShowProcess() + ps := []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&testkit.MockSessionManager{PS: ps}) + tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).CheckAt([]int{0}, + [][]interface{}{ + {"IndexReader_6"}, + {"└─IndexRangeScan_5"}, // range scan not full scan + }) + + tk.MustExec("set @a=1, @b=2") + tk.MustExec("execute st using @a, @b") + tk.MustQuery("show warnings").Check(testkit.Rows()) // no warning for INT values + tk.MustExec("execute st using @a, @b") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) // cacheable for INT + tk.MustExec("execute st using @a, @b") + tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).CheckAt([]int{0}, + [][]interface{}{ + {"IndexReader_6"}, + {"└─IndexRangeScan_5"}, // range scan not full scan + }) +} + +func TestIssue40225(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t (a int, key(a))") + tk.MustExec("prepare st from 'select * from t where a INT) since plan-cache is totally disabled. + + tk.MustExec("prepare st from 'select * from t where a>?'") + tk.MustExec("set @a=1") + tk.MustExec("execute st using @a") + tk.MustExec("execute st using @a") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + tk.MustExec("create binding for select * from t where a>1 using select /*+ ignore_plan_cache() */ * from t where a>1") + tk.MustExec("execute st using @a") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) + tk.MustExec("execute st using @a") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) +} + +func TestIssue40679(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t (a int, key(a));") + tk.MustExec("prepare st from 'select * from t use index(a) where a < ?'") + tk.MustExec("set @a1=1.1") + tk.MustExec("execute st using @a1") + + tkProcess := tk.Session().ShowProcess() + ps := []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&testkit.MockSessionManager{PS: ps}) + rows := tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Rows() + require.True(t, strings.Contains(rows[1][0].(string), "RangeScan")) // RangeScan not FullScan + + tk.MustExec("execute st using @a1") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 skip plan-cache: '1.1' may be converted to INT")) +} + +func TestIssue38335(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(`CREATE TABLE PK_LP9463 ( + COL1 mediumint NOT NULL DEFAULT '77' COMMENT 'NUMERIC PK', + COL2 varchar(20) COLLATE utf8mb4_bin DEFAULT NULL, + COL4 datetime DEFAULT NULL, + COL3 bigint DEFAULT NULL, + COL5 float DEFAULT NULL, + PRIMARY KEY (COL1))`) + tk.MustExec(` +INSERT INTO PK_LP9463 VALUES (-7415279,'笚綷想摻癫梒偆荈湩窐曋繾鏫蘌憬稁渣½隨苆','1001-11-02 05:11:33',-3745331437675076296,-3.21618e38), +(-7153863,'鯷氤衡椻闍饑堀鱟垩啵緬氂哨笂序鉲秼摀巽茊','6800-06-20 23:39:12',-7871155140266310321,-3.04829e38), +(77,'娥藨潰眤徕菗柢礥蕶浠嶲憅榩椻鍙鑜堋ᛀ暵氎','4473-09-13 01:18:59',4076508026242316746,-1.9525e38), +(16614,'阖旕雐盬皪豧篣哙舄糗悄蟊鯴瞶珧赺潴嶽簤彉','2745-12-29 00:29:06',-4242415439257105874,2.71063e37)`) + tk.MustExec(`prepare stmt from 'SELECT *, rank() OVER (PARTITION BY col2 ORDER BY COL1) FROM PK_LP9463 WHERE col1 != ? AND col1 < ?'`) + tk.MustExec(`set @a=-8414766051197, @b=-8388608`) + tk.MustExec(`execute stmt using @a,@b`) + tk.MustExec(`set @a=16614, @b=16614`) + rows := tk.MustQuery(`execute stmt using @a,@b`).Sort() + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("0")) + tk.MustQuery(`SELECT *, rank() OVER (PARTITION BY col2 ORDER BY COL1) FROM PK_LP9463 WHERE col1 != 16614 and col1 < 16614`).Sort().Check(rows.Rows()) +} + +func TestIssue41032(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(`CREATE TABLE PK_SIGNED_10087 ( + COL1 mediumint(8) unsigned NOT NULL, + COL2 varchar(20) DEFAULT NULL, + COL4 datetime DEFAULT NULL, + COL3 bigint(20) DEFAULT NULL, + COL5 float DEFAULT NULL, + PRIMARY KEY (COL1) )`) + tk.MustExec(`insert into PK_SIGNED_10087 values(0, "痥腜蟿鮤枓欜喧檕澙姭袐裄钭僇剕焍哓閲疁櫘", "0017-11-14 05:40:55", -4504684261333179273, 7.97449e37)`) + tk.MustExec(`prepare stmt from 'SELECT/*+ HASH_JOIN(t1, t2) */ t2.* FROM PK_SIGNED_10087 t1 JOIN PK_SIGNED_10087 t2 ON t1.col1 = t2.col1 WHERE t2.col1 >= ? AND t1.col1 >= ?;'`) + tk.MustExec(`set @a=0, @b=0`) + tk.MustQuery(`execute stmt using @a,@b`).Check(testkit.Rows("0 痥腜蟿鮤枓欜喧檕澙姭袐裄钭僇剕焍哓閲疁櫘 0017-11-14 05:40:55 -4504684261333179273 79744900000000000000000000000000000000")) + tk.MustExec(`set @a=8950167, @b=16305982`) + tk.MustQuery(`execute stmt using @a,@b`).Check(testkit.Rows()) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) +} + +func TestPlanCacheWithLimit(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int primary key, b int)") + + testCases := []struct { + sql string + params []int + }{ + {"prepare stmt from 'select * from t limit ?'", []int{1}}, + {"prepare stmt from 'select * from t limit 1, ?'", []int{1}}, + {"prepare stmt from 'select * from t limit ?, 1'", []int{1}}, + {"prepare stmt from 'select * from t limit ?, ?'", []int{1, 2}}, + {"prepare stmt from 'delete from t order by a limit ?'", []int{1}}, + {"prepare stmt from 'insert into t select * from t order by a desc limit ?'", []int{1}}, + {"prepare stmt from 'insert into t select * from t order by a desc limit ?, ?'", []int{1, 2}}, + {"prepare stmt from 'update t set a = 1 limit ?'", []int{1}}, + {"prepare stmt from '(select * from t order by a limit ?) union (select * from t order by a desc limit ?)'", []int{1, 2}}, + {"prepare stmt from 'select * from t where a = ? limit ?, ?'", []int{1, 1, 1}}, + {"prepare stmt from 'select * from t where a in (?, ?) limit ?, ?'", []int{1, 2, 1, 1}}, + } + + for idx, testCase := range testCases { + tk.MustExec(testCase.sql) + var using []string + for i, p := range testCase.params { + tk.MustExec(fmt.Sprintf("set @a%d = %d", i, p)) + using = append(using, fmt.Sprintf("@a%d", i)) + } + + tk.MustExec("execute stmt using " + strings.Join(using, ", ")) + tk.MustExec("execute stmt using " + strings.Join(using, ", ")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + if idx < 9 { + // none point get plan + tk.MustExec("set @a0 = 6") + tk.MustExec("execute stmt using " + strings.Join(using, ", ")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) + } + } + + tk.MustExec("prepare stmt from 'select * from t limit ?'") + tk.MustExec("set @a = 10001") + tk.MustExec("execute stmt using @a") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 skip plan-cache: limit count more than 10000")) +} diff --git a/planner/core/plan_cache_utils.go b/planner/core/plan_cache_utils.go index 0abecafaf7ec8..3271392d62e97 100644 --- a/planner/core/plan_cache_utils.go +++ b/planner/core/plan_cache_utils.go @@ -64,17 +64,23 @@ func (e *paramMarkerExtractor) Leave(in ast.Node) (ast.Node, bool) { } // GeneratePlanCacheStmtWithAST generates the PlanCacheStmt structure for this AST. -func GeneratePlanCacheStmtWithAST(ctx context.Context, sctx sessionctx.Context, stmt ast.StmtNode) (*PlanCacheStmt, Plan, int, error) { +// paramSQL is the corresponding parameterized sql like 'select * from t where a?'. +// paramStmt is the Node of paramSQL. +func GeneratePlanCacheStmtWithAST(ctx context.Context, sctx sessionctx.Context, paramSQL string, paramStmt ast.StmtNode) (*PlanCacheStmt, Plan, int, error) { + if v := ctx.Value("____GeneratePlanCacheStmtWithASTErr"); v != nil { // for testing + return nil, nil, 0, errors.New("____GeneratePlanCacheStmtWithASTErr") + } + vars := sctx.GetSessionVars() var extractor paramMarkerExtractor - stmt.Accept(&extractor) + paramStmt.Accept(&extractor) // DDL Statements can not accept parameters - if _, ok := stmt.(ast.DDLNode); ok && len(extractor.markers) > 0 { + if _, ok := paramStmt.(ast.DDLNode); ok && len(extractor.markers) > 0 { return nil, nil, 0, ErrPrepareDDL } - switch stmt.(type) { + switch paramStmt.(type) { case *ast.LoadDataStmt, *ast.PrepareStmt, *ast.ExecuteStmt, *ast.DeallocateStmt, *ast.NonTransactionalDMLStmt: return nil, nil, 0, ErrUnsupportedPs } @@ -86,7 +92,7 @@ func GeneratePlanCacheStmtWithAST(ctx context.Context, sctx sessionctx.Context, } ret := &PreprocessorReturn{} - err := Preprocess(ctx, sctx, stmt, InPrepare, WithPreprocessorReturn(ret)) + err := Preprocess(ctx, sctx, paramStmt, InPrepare, WithPreprocessorReturn(ret)) if err != nil { return nil, nil, 0, err } @@ -103,8 +109,8 @@ func GeneratePlanCacheStmtWithAST(ctx context.Context, sctx sessionctx.Context, } prepared := &ast.Prepared{ - Stmt: stmt, - StmtType: ast.GetStmtLabel(stmt), + Stmt: paramStmt, + StmtType: ast.GetStmtLabel(paramStmt), Params: extractor.markers, SchemaVersion: ret.InfoSchema.SchemaMetaVersion(), } @@ -113,12 +119,18 @@ func GeneratePlanCacheStmtWithAST(ctx context.Context, sctx sessionctx.Context, var ( normalizedSQL4PC, digest4PC string selectStmtNode ast.StmtNode + cacheable bool + reason string ) if !vars.EnablePreparedPlanCache { - prepared.UseCache = false + cacheable = false + reason = "plan cache is disabled" } else { - prepared.UseCache = CacheableWithCtx(sctx, stmt, ret.InfoSchema) - selectStmtNode, normalizedSQL4PC, digest4PC, err = ExtractSelectAndNormalizeDigest(stmt, vars.CurrentDB) + cacheable, reason = CacheableWithCtx(sctx, paramStmt, ret.InfoSchema) + if !cacheable { + sctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("skip plan-cache: " + reason)) + } + selectStmtNode, normalizedSQL4PC, digest4PC, err = ExtractSelectAndNormalizeDigest(paramStmt, vars.CurrentDB) if err != nil || selectStmtNode == nil { normalizedSQL4PC = "" digest4PC = "" @@ -134,7 +146,7 @@ func GeneratePlanCacheStmtWithAST(ctx context.Context, sctx sessionctx.Context, var p Plan destBuilder, _ := NewPlanBuilder().Init(sctx, ret.InfoSchema, &hint.BlockHintProcessor{}) - p, err = destBuilder.Build(ctx, stmt) + p, err = destBuilder.Build(ctx, paramStmt) if err != nil { return nil, nil, 0, err } @@ -142,7 +154,7 @@ func GeneratePlanCacheStmtWithAST(ctx context.Context, sctx sessionctx.Context, preparedObj := &PlanCacheStmt{ PreparedAst: prepared, StmtDB: vars.CurrentDB, - StmtText: stmt.Text(), + StmtText: paramSQL, VisitInfos: destBuilder.GetVisitInfo(), NormalizedSQL: normalizedSQL, SQLDigest: digest, @@ -150,6 +162,8 @@ func GeneratePlanCacheStmtWithAST(ctx context.Context, sctx sessionctx.Context, SnapshotTSEvaluator: ret.SnapshotTSEvaluator, NormalizedSQL4PC: normalizedSQL4PC, SQLDigest4PC: digest4PC, + StmtCacheable: cacheable, + UncacheableReason: reason, } if err = CheckPreparedPriv(sctx, preparedObj, ret.InfoSchema); err != nil { return nil, nil, 0, err @@ -157,21 +171,6 @@ func GeneratePlanCacheStmtWithAST(ctx context.Context, sctx sessionctx.Context, return preparedObj, p, ParamCount, nil } -func getValidPlanFromCache(sctx sessionctx.Context, isGeneralPlanCache bool, key kvcache.Key, paramTypes []*types.FieldType) (*PlanCacheValue, bool) { - cache := sctx.GetPlanCache(isGeneralPlanCache) - val, exist := cache.Get(key, paramTypes) - if !exist { - return nil, exist - } - candidate := val.(*PlanCacheValue) - return candidate, true -} - -func putPlanIntoCache(sctx sessionctx.Context, isGeneralPlanCache bool, key kvcache.Key, plan *PlanCacheValue, paramTypes []*types.FieldType) { - cache := sctx.GetPlanCache(isGeneralPlanCache) - cache.Put(key, plan, paramTypes) -} - // planCacheKey is used to access Plan Cache. We put some variables that do not affect the plan into planCacheKey, such as the sql text. // Put the parameters that may affect the plan in planCacheValue. // However, due to some compatibility reasons, we will temporarily keep some system variable-related values in planCacheKey. @@ -252,6 +251,14 @@ func (key *planCacheKey) MemoryUsage() (sum int64) { return } +type planCacheMatchOpts struct { + // paramTypes stores all parameters' FieldType, some different parameters may share same plan + paramTypes FieldSlice + // limitOffsetAndCount stores all the offset and key parameters extract from limit statement + // only used for cache and pick plan with parameters in limit + limitOffsetAndCount []uint64 +} + // SetPstmtIDSchemaVersion implements PstmtCacheKeyMutator interface to change pstmtID and schemaVersion of cacheKey. // so we can reuse Key instead of new every time. func SetPstmtIDSchemaVersion(key kvcache.Key, stmtText string, schemaVersion int64, isolationReadEngines map[kv.StoreType]struct{}) { @@ -342,12 +349,14 @@ type PlanCacheValue struct { Plan Plan OutPutNames []*types.FieldName TblInfo2UnionScan map[*model.TableInfo]bool - ParamTypes FieldSlice memoryUsage int64 + + // matchOpts stores some fields help to choose a suitable plan + matchOpts planCacheMatchOpts } func (v *PlanCacheValue) varTypesUnchanged(txtVarTps []*types.FieldType) bool { - return v.ParamTypes.CheckTypesCompatibility4PC(txtVarTps) + return v.matchOpts.paramTypes.CheckTypesCompatibility4PC(txtVarTps) } // unKnownMemoryUsage represent the memory usage of uncounted structure, maybe need implement later @@ -376,13 +385,13 @@ func (v *PlanCacheValue) MemoryUsage() (sum int64) { sum = unKnownMemoryUsage } - sum += size.SizeOfInterface + size.SizeOfSlice*2 + int64(cap(v.OutPutNames)+cap(v.ParamTypes))*size.SizeOfPointer + + sum += size.SizeOfInterface + size.SizeOfSlice*2 + int64(cap(v.OutPutNames)+cap(v.matchOpts.paramTypes))*size.SizeOfPointer + size.SizeOfMap + int64(len(v.TblInfo2UnionScan))*(size.SizeOfPointer+size.SizeOfBool) + size.SizeOfInt64*2 for _, name := range v.OutPutNames { sum += name.MemoryUsage() } - for _, ft := range v.ParamTypes { + for _, ft := range v.matchOpts.paramTypes { sum += ft.MemoryUsage() } v.memoryUsage = sum @@ -391,7 +400,7 @@ func (v *PlanCacheValue) MemoryUsage() (sum int64) { // NewPlanCacheValue creates a SQLCacheValue. func NewPlanCacheValue(plan Plan, names []*types.FieldName, srcMap map[*model.TableInfo]bool, - paramTypes []*types.FieldType) *PlanCacheValue { + paramTypes []*types.FieldType, limitParams []uint64) *PlanCacheValue { dstMap := make(map[*model.TableInfo]bool) for k, v := range srcMap { dstMap[k] = v @@ -404,17 +413,27 @@ func NewPlanCacheValue(plan Plan, names []*types.FieldName, srcMap map[*model.Ta Plan: plan, OutPutNames: names, TblInfo2UnionScan: dstMap, - ParamTypes: userParamTypes, + matchOpts: planCacheMatchOpts{ + paramTypes: userParamTypes, + limitOffsetAndCount: limitParams, + }, } } // PlanCacheStmt store prepared ast from PrepareExec and other related fields type PlanCacheStmt struct { - PreparedAst *ast.Prepared - StmtDB string // which DB the statement will be processed over - VisitInfos []visitInfo - ColumnInfos interface{} - Executor interface{} + PreparedAst *ast.Prepared + StmtDB string // which DB the statement will be processed over + VisitInfos []visitInfo + ColumnInfos interface{} + // Executor is only used for point get scene. + // Notice that we should only cache the PointGetExecutor that have a snapshot with MaxTS in it. + // If the current plan is not PointGet or does not use MaxTS optimization, this value should be nil here. + Executor interface{} + + StmtCacheable bool // Whether this stmt is cacheable. + UncacheableReason string // Why this stmt is uncacheable. + NormalizedSQL string NormalizedPlan string SQLDigest *parser.Digest @@ -447,3 +466,69 @@ func GetPreparedStmt(stmt *ast.ExecuteStmt, vars *variable.SessionVars) (*PlanCa } return nil, ErrStmtNotFound } + +type limitExtractor struct { + cacheable bool // For safety considerations, check if limit count less than 10000 + offsetAndCount []uint64 + unCacheableReason string + paramTypeErr error +} + +// Enter implements Visitor interface. +func (checker *limitExtractor) Enter(in ast.Node) (out ast.Node, skipChildren bool) { + switch node := in.(type) { + case *ast.Limit: + if node.Count != nil { + if count, isParamMarker := node.Count.(*driver.ParamMarkerExpr); isParamMarker { + typeExpected, val := CheckParamTypeInt64orUint64(count) + if typeExpected { + if val > 10000 { + checker.cacheable = false + checker.unCacheableReason = "limit count more than 10000" + return in, true + } + checker.offsetAndCount = append(checker.offsetAndCount, val) + } else { + checker.paramTypeErr = ErrWrongArguments.GenWithStackByArgs("LIMIT") + return in, true + } + } + } + if node.Offset != nil { + if offset, isParamMarker := node.Offset.(*driver.ParamMarkerExpr); isParamMarker { + typeExpected, val := CheckParamTypeInt64orUint64(offset) + if typeExpected { + checker.offsetAndCount = append(checker.offsetAndCount, val) + } else { + checker.paramTypeErr = ErrWrongArguments.GenWithStackByArgs("LIMIT") + return in, true + } + } + } + } + return in, false +} + +// Leave implements Visitor interface. +func (checker *limitExtractor) Leave(in ast.Node) (out ast.Node, ok bool) { + return in, checker.cacheable +} + +// ExtractLimitFromAst extract limit offset and count from ast for plan cache key encode +func ExtractLimitFromAst(node ast.Node, sctx sessionctx.Context) ([]uint64, error) { + if node == nil { + return nil, nil + } + checker := limitExtractor{ + cacheable: true, + offsetAndCount: []uint64{}, + } + node.Accept(&checker) + if checker.paramTypeErr != nil { + return nil, checker.paramTypeErr + } + if sctx != nil && !checker.cacheable { + sctx.GetSessionVars().StmtCtx.SetSkipPlanCache(errors.New("skip plan-cache: " + checker.unCacheableReason)) + } + return checker.offsetAndCount, nil +} diff --git a/planner/core/plan_cacheable_checker.go b/planner/core/plan_cacheable_checker.go index 0e4e28250ad4c..3da0f285cd9bf 100644 --- a/planner/core/plan_cacheable_checker.go +++ b/planner/core/plan_cacheable_checker.go @@ -15,6 +15,8 @@ package core import ( + "fmt" + "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser/ast" @@ -27,20 +29,21 @@ import ( // Cacheable checks whether the input ast is cacheable with empty session context, which is mainly for testing. func Cacheable(node ast.Node, is infoschema.InfoSchema) bool { - return CacheableWithCtx(nil, node, is) + c, _ := CacheableWithCtx(nil, node, is) + return c } // CacheableWithCtx checks whether the input ast is cacheable. // Handle "ignore_plan_cache()" hint // If there are multiple hints, only one will take effect -func CacheableWithCtx(sctx sessionctx.Context, node ast.Node, is infoschema.InfoSchema) bool { +func CacheableWithCtx(sctx sessionctx.Context, node ast.Node, is infoschema.InfoSchema) (bool, string) { _, isSelect := node.(*ast.SelectStmt) _, isUpdate := node.(*ast.UpdateStmt) _, isInsert := node.(*ast.InsertStmt) _, isDelete := node.(*ast.DeleteStmt) _, isSetOpr := node.(*ast.SetOprStmt) if !(isSelect || isUpdate || isInsert || isDelete || isSetOpr) { - return false + return false, "not a SELECT/UPDATE/INSERT/DELETE/SET statement" } checker := cacheableChecker{ sctx: sctx, @@ -48,7 +51,7 @@ func CacheableWithCtx(sctx sessionctx.Context, node ast.Node, is infoschema.Info schema: is, } node.Accept(&checker) - return checker.cacheable + return checker.cacheable, checker.reason } // cacheableChecker checks whether a query's plan can be cached, querys that: @@ -61,6 +64,7 @@ type cacheableChecker struct { sctx sessionctx.Context cacheable bool schema infoschema.InfoSchema + reason string // reason why cannot use plan-cache } // Enter implements Visitor interface. @@ -70,6 +74,7 @@ func (checker *cacheableChecker) Enter(in ast.Node) (out ast.Node, skipChildren for _, hints := range node.TableHints { if hints.HintName.L == HintIgnorePlanCache { checker.cacheable = false + checker.reason = "ignore plan cache by hint" return in, true } } @@ -77,6 +82,7 @@ func (checker *cacheableChecker) Enter(in ast.Node) (out ast.Node, skipChildren for _, hints := range node.TableHints { if hints.HintName.L == HintIgnorePlanCache { checker.cacheable = false + checker.reason = "ignore plan cache by hint" return in, true } } @@ -84,21 +90,40 @@ func (checker *cacheableChecker) Enter(in ast.Node) (out ast.Node, skipChildren for _, hints := range node.TableHints { if hints.HintName.L == HintIgnorePlanCache { checker.cacheable = false + checker.reason = "ignore plan cache by hint" + return in, true + } + } + case *ast.InsertStmt: + if node.Select == nil { + // do not cache insert-values-stmt like 'insert into t values (...)' since + // no performance benefit and to save memory. + checker.cacheable = false + checker.reason = "ignore insert-values-stmt" + return in, true + } + for _, hints := range node.TableHints { + if hints.HintName.L == HintIgnorePlanCache { + checker.cacheable = false + checker.reason = "ignore plan cache by hint" return in, true } } case *ast.VariableExpr, *ast.ExistsSubqueryExpr, *ast.SubqueryExpr: checker.cacheable = false + checker.reason = "query has sub-queries is un-cacheable" return in, true case *ast.FuncCallExpr: if _, found := expression.UnCacheableFunctions[node.FnName.L]; found { checker.cacheable = false + checker.reason = fmt.Sprintf("query has '%v' is un-cacheable", node.FnName.L) return in, true } case *ast.OrderByClause: for _, item := range node.Items { if _, isParamMarker := item.Expr.(*driver.ParamMarkerExpr); isParamMarker { checker.cacheable = false + checker.reason = "query has 'order by ?' is un-cacheable" return in, true } } @@ -106,25 +131,29 @@ func (checker *cacheableChecker) Enter(in ast.Node) (out ast.Node, skipChildren for _, item := range node.Items { if _, isParamMarker := item.Expr.(*driver.ParamMarkerExpr); isParamMarker { checker.cacheable = false + checker.reason = "query has 'group by ?' is un-cacheable" return in, true } } case *ast.Limit: if node.Count != nil { - if _, isParamMarker := node.Count.(*driver.ParamMarkerExpr); isParamMarker { + if _, isParamMarker := node.Count.(*driver.ParamMarkerExpr); isParamMarker && !checker.sctx.GetSessionVars().EnablePlanCacheForParamLimit { checker.cacheable = false + checker.reason = "query has 'limit ?' is un-cacheable" return in, true } } if node.Offset != nil { - if _, isParamMarker := node.Offset.(*driver.ParamMarkerExpr); isParamMarker { + if _, isParamMarker := node.Offset.(*driver.ParamMarkerExpr); isParamMarker && !checker.sctx.GetSessionVars().EnablePlanCacheForParamLimit { checker.cacheable = false + checker.reason = "query has 'limit ?, 10' is un-cacheable" return in, true } } case *ast.FrameBound: if _, ok := node.Expr.(*driver.ParamMarkerExpr); ok { checker.cacheable = false + checker.reason = "query has ? in window function frames is un-cacheable" return in, true } case *ast.TableName: @@ -138,14 +167,17 @@ func (checker *cacheableChecker) Enter(in ast.Node) (out ast.Node, skipChildren } */ checker.cacheable = false + checker.reason = "query accesses partitioned tables is un-cacheable" return in, true } if hasGeneratedCol(checker.schema, node) { checker.cacheable = false + checker.reason = "query accesses generated columns is un-cacheable" return in, true } if isTempTable(checker.schema, node) { checker.cacheable = false + checker.reason = "query accesses temporary tables is un-cacheable" return in, true } } @@ -158,16 +190,16 @@ func (checker *cacheableChecker) Leave(in ast.Node) (out ast.Node, ok bool) { return in, checker.cacheable } -// GeneralPlanCacheable checks whether the input ast is cacheable for general plan cache with empty session context, which is mainly for testing. -func GeneralPlanCacheable(node ast.Node, is infoschema.InfoSchema) bool { - return GeneralPlanCacheableWithCtx(nil, node, is) +// NonPreparedPlanCacheable checks whether the input ast is cacheable for non-prepared plan cache with empty session context, which is mainly for testing. +func NonPreparedPlanCacheable(node ast.Node, is infoschema.InfoSchema) bool { + return NonPreparedPlanCacheableWithCtx(nil, node, is) } -// GeneralPlanCacheableWithCtx checks whether the input ast is cacheable for general plan cache. +// NonPreparedPlanCacheableWithCtx checks whether the input ast is cacheable for non-prepared plan cache. // Only support: select {field} from {single-table} where {cond} and {cond} ... // {cond}: {col} {op} {val} // {op}: >, <, = -func GeneralPlanCacheableWithCtx(sctx sessionctx.Context, node ast.Node, is infoschema.InfoSchema) bool { +func NonPreparedPlanCacheableWithCtx(sctx sessionctx.Context, node ast.Node, is infoschema.InfoSchema) bool { selectStmt, isSelect := node.(*ast.SelectStmt) if !isSelect { // only support select statement now return false @@ -189,7 +221,7 @@ func GeneralPlanCacheableWithCtx(sctx sessionctx.Context, node ast.Node, is info } tableRefs := from.TableRefs if tableRefs.Right != nil { - // We don't support the join for the general plan cache now. + // We don't support the join for the non-prepared plan cache now. return false } switch x := tableRefs.Left.(type) { @@ -200,7 +232,7 @@ func GeneralPlanCacheableWithCtx(sctx sessionctx.Context, node ast.Node, is info } } - checker := generalPlanCacheableChecker{ + checker := nonPreparedPlanCacheableChecker{ sctx: sctx, cacheable: true, schema: is, @@ -209,46 +241,45 @@ func GeneralPlanCacheableWithCtx(sctx sessionctx.Context, node ast.Node, is info return checker.cacheable } -// generalPlanCacheableChecker checks whether a query's plan can be cached for general plan cache. +// nonPreparedPlanCacheableChecker checks whether a query's plan can be cached for non-prepared plan cache. // NOTE: we can add more rules in the future. -type generalPlanCacheableChecker struct { +type nonPreparedPlanCacheableChecker struct { sctx sessionctx.Context cacheable bool schema infoschema.InfoSchema } // Enter implements Visitor interface. -func (checker *generalPlanCacheableChecker) Enter(in ast.Node) (out ast.Node, skipChildren bool) { +func (checker *nonPreparedPlanCacheableChecker) Enter(in ast.Node) (out ast.Node, skipChildren bool) { switch node := in.(type) { + case *ast.SelectStmt, *ast.FieldList, *ast.SelectField, *ast.TableRefsClause, *ast.Join, + *ast.TableSource, *ast.ColumnNameExpr, *ast.ColumnName, *driver.ValueExpr, *ast.PatternInExpr: + return in, !checker.cacheable // skip child if un-cacheable case *ast.BinaryOperationExpr: - if _, found := expression.GeneralPlanCacheableOp[node.Op.String()]; !found { + if _, found := expression.NonPreparedPlanCacheableOp[node.Op.String()]; !found { checker.cacheable = false - return in, true } - case *ast.FuncCallExpr: - checker.cacheable = false - return in, true + return in, !checker.cacheable case *ast.TableName: if checker.schema != nil { if isPartitionTable(checker.schema, node) { checker.cacheable = false - return in, true } if hasGeneratedCol(checker.schema, node) { checker.cacheable = false - return in, true } if isTempTable(checker.schema, node) { checker.cacheable = false - return in, true } } + return in, !checker.cacheable } - return in, false + checker.cacheable = false // unexpected cases + return in, !checker.cacheable } // Leave implements Visitor interface. -func (checker *generalPlanCacheableChecker) Leave(in ast.Node) (out ast.Node, ok bool) { +func (checker *nonPreparedPlanCacheableChecker) Leave(in ast.Node) (out ast.Node, ok bool) { return in, checker.cacheable } diff --git a/planner/core/plan_cacheable_checker_test.go b/planner/core/plan_cacheable_checker_test.go index a32294e34c54c..fc09b7b536530 100644 --- a/planner/core/plan_cacheable_checker_test.go +++ b/planner/core/plan_cacheable_checker_test.go @@ -26,11 +26,14 @@ import ( "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/testkit" driver "github.com/pingcap/tidb/types/parser_driver" + "github.com/pingcap/tidb/util/mock" "github.com/stretchr/testify/require" ) func TestCacheable(t *testing.T) { store := testkit.CreateMockStore(t) + mockCtx := mock.NewContext() + mockCtx.GetSessionVars().EnablePlanCacheForParamLimit = true tk := testkit.NewTestKit(t, store) @@ -53,7 +56,9 @@ func TestCacheable(t *testing.T) { tableRefsClause := &ast.TableRefsClause{TableRefs: &ast.Join{Left: &ast.TableSource{Source: tbl}}} // test InsertStmt - stmt = &ast.InsertStmt{Table: tableRefsClause} + stmt = &ast.InsertStmt{Table: tableRefsClause} // insert-values-stmt + require.False(t, core.Cacheable(stmt, is)) + stmt = &ast.InsertStmt{Table: tableRefsClause, Select: &ast.SelectStmt{}} // insert-select-stmt require.True(t, core.Cacheable(stmt, is)) // test DeleteStmt @@ -85,7 +90,8 @@ func TestCacheable(t *testing.T) { TableRefs: tableRefsClause, Limit: limitStmt, } - require.False(t, core.Cacheable(stmt, is)) + c, _ := core.CacheableWithCtx(mockCtx, stmt, is) + require.True(t, c) limitStmt = &ast.Limit{ Offset: &driver.ParamMarkerExpr{}, @@ -94,14 +100,16 @@ func TestCacheable(t *testing.T) { TableRefs: tableRefsClause, Limit: limitStmt, } - require.False(t, core.Cacheable(stmt, is)) + c, _ = core.CacheableWithCtx(mockCtx, stmt, is) + require.True(t, c) limitStmt = &ast.Limit{} stmt = &ast.DeleteStmt{ TableRefs: tableRefsClause, Limit: limitStmt, } - require.True(t, core.Cacheable(stmt, is)) + c, _ = core.CacheableWithCtx(mockCtx, stmt, is) + require.True(t, c) stmt.(*ast.DeleteStmt).TableHints = append(stmt.(*ast.DeleteStmt).TableHints, &ast.TableOptimizerHint{ HintName: model.NewCIStr(core.HintIgnorePlanCache), @@ -137,7 +145,8 @@ func TestCacheable(t *testing.T) { TableRefs: tableRefsClause, Limit: limitStmt, } - require.False(t, core.Cacheable(stmt, is)) + c, _ = core.CacheableWithCtx(mockCtx, stmt, is) + require.True(t, c) limitStmt = &ast.Limit{ Offset: &driver.ParamMarkerExpr{}, @@ -146,14 +155,16 @@ func TestCacheable(t *testing.T) { TableRefs: tableRefsClause, Limit: limitStmt, } - require.False(t, core.Cacheable(stmt, is)) + c, _ = core.CacheableWithCtx(mockCtx, stmt, is) + require.True(t, c) limitStmt = &ast.Limit{} stmt = &ast.UpdateStmt{ TableRefs: tableRefsClause, Limit: limitStmt, } - require.True(t, core.Cacheable(stmt, is)) + c, _ = core.CacheableWithCtx(mockCtx, stmt, is) + require.True(t, c) stmt.(*ast.UpdateStmt).TableHints = append(stmt.(*ast.UpdateStmt).TableHints, &ast.TableOptimizerHint{ HintName: model.NewCIStr(core.HintIgnorePlanCache), @@ -186,7 +197,8 @@ func TestCacheable(t *testing.T) { stmt = &ast.SelectStmt{ Limit: limitStmt, } - require.False(t, core.Cacheable(stmt, is)) + c, _ = core.CacheableWithCtx(mockCtx, stmt, is) + require.True(t, c) limitStmt = &ast.Limit{ Offset: &driver.ParamMarkerExpr{}, @@ -194,13 +206,15 @@ func TestCacheable(t *testing.T) { stmt = &ast.SelectStmt{ Limit: limitStmt, } - require.False(t, core.Cacheable(stmt, is)) + c, _ = core.CacheableWithCtx(mockCtx, stmt, is) + require.True(t, c) limitStmt = &ast.Limit{} stmt = &ast.SelectStmt{ Limit: limitStmt, } - require.True(t, core.Cacheable(stmt, is)) + c, _ = core.CacheableWithCtx(mockCtx, stmt, is) + require.True(t, c) paramExpr := &driver.ParamMarkerExpr{} orderByClause := &ast.OrderByClause{Items: []*ast.ByItem{{Expr: paramExpr}}} @@ -247,7 +261,7 @@ func TestCacheable(t *testing.T) { require.True(t, core.Cacheable(stmt, is)) } -func TestGeneralPlanCacheable(t *testing.T) { +func TestNonPreparedPlanCacheable(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -297,12 +311,12 @@ func TestGeneralPlanCacheable(t *testing.T) { for _, q := range unsupported { stmt, err := p.ParseOneStmt(q, charset, collation) require.NoError(t, err) - require.False(t, core.GeneralPlanCacheable(stmt, is)) + require.False(t, core.NonPreparedPlanCacheable(stmt, is)) } for _, q := range supported { stmt, err := p.ParseOneStmt(q, charset, collation) require.NoError(t, err) - require.True(t, core.GeneralPlanCacheable(stmt, is)) + require.True(t, core.NonPreparedPlanCacheable(stmt, is)) } } diff --git a/planner/core/plan_cost_ver2.go b/planner/core/plan_cost_ver2.go index 81a59e904ed41..dfecbd0761fff 100644 --- a/planner/core/plan_cost_ver2.go +++ b/planner/core/plan_cost_ver2.go @@ -17,7 +17,7 @@ package core import ( "fmt" "math" - "strings" + "strconv" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" @@ -30,6 +30,11 @@ import ( "github.com/pingcap/tipb/go-tipb" ) +// GetPlanCost returns the cost of this plan. +func GetPlanCost(p PhysicalPlan, taskType property.TaskType, option *PlanCostOption) (float64, error) { + return getPlanCost(p, taskType, option) +} + func getPlanCost(p PhysicalPlan, taskType property.TaskType, option *PlanCostOption) (float64, error) { if p.SCtx().GetSessionVars().CostModelVersion == modelVer2 { planCost, err := p.getPlanCostVer2(taskType, option) @@ -57,7 +62,7 @@ func (p *basePhysicalPlan) getPlanCostVer2(taskType property.TaskType, option *P p.planCostVer2 = sumCostVer2(childCosts...) } p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } // getPlanCostVer2 returns the plan-cost of this sub-plan, which is: @@ -79,7 +84,7 @@ func (p *PhysicalSelection) getPlanCostVer2(taskType property.TaskType, option * p.planCostVer2 = sumCostVer2(filterCost, childCost) p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } // getPlanCostVer2 returns the plan-cost of this sub-plan, which is: @@ -103,7 +108,7 @@ func (p *PhysicalProjection) getPlanCostVer2(taskType property.TaskType, option p.planCostVer2 = sumCostVer2(childCost, divCostVer2(projCost, concurrency)) p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } // getPlanCostVer2 returns the plan-cost of this sub-plan, which is: @@ -120,7 +125,7 @@ func (p *PhysicalIndexScan) getPlanCostVer2(taskType property.TaskType, option * p.planCostVer2 = scanCostVer2(option, rows, rowSize, scanFactor) p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } // getPlanCostVer2 returns the plan-cost of this sub-plan, which is: @@ -149,7 +154,7 @@ func (p *PhysicalTableScan) getPlanCostVer2(taskType property.TaskType, option * } p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } // getPlanCostVer2 returns the plan-cost of this sub-plan, which is: @@ -174,7 +179,7 @@ func (p *PhysicalIndexReader) getPlanCostVer2(taskType property.TaskType, option p.planCostVer2 = divCostVer2(sumCostVer2(childCost, netCost), concurrency) p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } // getPlanCostVer2 returns the plan-cost of this sub-plan, which is: @@ -209,7 +214,7 @@ func (p *PhysicalTableReader) getPlanCostVer2(taskType property.TaskType, option !hasCostFlag(option.CostFlag, CostFlagRecalculate) { // show the real cost in explain-statements p.planCostVer2 = divCostVer2(p.planCostVer2, 1000000000) } - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } // getPlanCostVer2 returns the plan-cost of this sub-plan, which is: @@ -251,11 +256,10 @@ func (p *PhysicalIndexLookUpReader) getPlanCostVer2(taskType property.TaskType, } tableSideCost := divCostVer2(sumCostVer2(tableNetCost, tableChildCost), distConcurrency) - // double-read: assume at least 1 row to double-read to avoid 0 double-read cost. - doubleReadRows := math.Max(indexRows, 1) + doubleReadRows := indexRows doubleReadCPUCost := newCostVer2(option, cpuFactor, indexRows*cpuFactor.Value, - "double-read-cpu(%v*%v)", doubleReadRows, cpuFactor) + func() string { return fmt.Sprintf("double-read-cpu(%v*%v)", doubleReadRows, cpuFactor) }) batchSize := float64(p.ctx.GetSessionVars().IndexLookupSize) taskPerBatch := 32.0 // TODO: remove this magic number doubleReadTasks := doubleReadRows / batchSize * taskPerBatch @@ -271,7 +275,7 @@ func (p *PhysicalIndexLookUpReader) getPlanCostVer2(taskType property.TaskType, } p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } // getPlanCostVer2 returns the plan-cost of this sub-plan, which is: @@ -316,7 +320,7 @@ func (p *PhysicalIndexMergeReader) getPlanCostVer2(taskType property.TaskType, o p.planCostVer2 = sumCostVer2(tableSideCost, sumIndexSideCost) p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } // getPlanCostVer2 returns the plan-cost of this sub-plan, which is: @@ -351,15 +355,15 @@ func (p *PhysicalSort) getPlanCostVer2(taskType property.TaskType, option *PlanC if !spill { sortMemCost = newCostVer2(option, memFactor, rows*rowSize*memFactor.Value, - "sortMem(%v*%v*%v)", rows, rowSize, memFactor) + func() string { return fmt.Sprintf("sortMem(%v*%v*%v)", rows, rowSize, memFactor) }) sortDiskCost = zeroCostVer2 } else { sortMemCost = newCostVer2(option, memFactor, float64(memQuota)*memFactor.Value, - "sortMem(%v*%v)", memQuota, memFactor) + func() string { return fmt.Sprintf("sortMem(%v*%v)", memQuota, memFactor) }) sortDiskCost = newCostVer2(option, diskFactor, rows*rowSize*diskFactor.Value, - "sortDisk(%v*%v*%v)", rows, rowSize, diskFactor) + func() string { return fmt.Sprintf("sortDisk(%v*%v*%v)", rows, rowSize, diskFactor) }) } childCost, err := p.children[0].getPlanCostVer2(taskType, option) @@ -369,7 +373,7 @@ func (p *PhysicalSort) getPlanCostVer2(taskType property.TaskType, option *PlanC p.planCostVer2 = sumCostVer2(childCost, sortCPUCost, sortMemCost, sortDiskCost) p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } // getPlanCostVer2 returns the plan-cost of this sub-plan, which is: @@ -390,7 +394,7 @@ func (p *PhysicalTopN) getPlanCostVer2(taskType property.TaskType, option *PlanC topNCPUCost := orderCostVer2(option, rows, N, p.ByItems, cpuFactor) topNMemCost := newCostVer2(option, memFactor, N*rowSize*memFactor.Value, - "topMem(%v*%v*%v)", N, rowSize, memFactor) + func() string { return fmt.Sprintf("topMem(%v*%v*%v)", N, rowSize, memFactor) }) childCost, err := p.children[0].getPlanCostVer2(taskType, option) if err != nil { @@ -399,7 +403,7 @@ func (p *PhysicalTopN) getPlanCostVer2(taskType property.TaskType, option *PlanC p.planCostVer2 = sumCostVer2(childCost, topNCPUCost, topNMemCost) p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } // getPlanCostVer2 returns the plan-cost of this sub-plan, which is: @@ -422,7 +426,7 @@ func (p *PhysicalStreamAgg) getPlanCostVer2(taskType property.TaskType, option * p.planCostVer2 = sumCostVer2(childCost, aggCost, groupCost) p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } // getPlanCostVer2 returns the plan-cost of this sub-plan, which is: @@ -441,17 +445,20 @@ func (p *PhysicalHashAgg) getPlanCostVer2(taskType property.TaskType, option *Pl aggCost := aggCostVer2(option, inputRows, p.AggFuncs, cpuFactor) groupCost := groupCostVer2(option, inputRows, p.GroupByItems, cpuFactor) - hashBuildCost := hashBuildCostVer2(option, outputRows, outputRowSize, p.GroupByItems, cpuFactor, memFactor) - hashProbeCost := hashProbeCostVer2(option, inputRows, p.GroupByItems, cpuFactor) + hashBuildCost := hashBuildCostVer2(option, outputRows, outputRowSize, float64(len(p.GroupByItems)), cpuFactor, memFactor) + hashProbeCost := hashProbeCostVer2(option, inputRows, float64(len(p.GroupByItems)), cpuFactor) + startCost := newCostVer2(option, cpuFactor, + 10*3*cpuFactor.Value, // 10rows * 3func * cpuFactor + func() string { return fmt.Sprintf("cpu(10*3*%v)", cpuFactor) }) childCost, err := p.children[0].getPlanCostVer2(taskType, option) if err != nil { return zeroCostVer2, err } - p.planCostVer2 = sumCostVer2(childCost, divCostVer2(sumCostVer2(aggCost, groupCost, hashBuildCost, hashProbeCost), concurrency)) + p.planCostVer2 = sumCostVer2(startCost, childCost, divCostVer2(sumCostVer2(aggCost, groupCost, hashBuildCost, hashProbeCost), concurrency)) p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } // getPlanCostVer2 returns the plan-cost of this sub-plan, which is: @@ -481,7 +488,7 @@ func (p *PhysicalMergeJoin) getPlanCostVer2(taskType property.TaskType, option * p.planCostVer2 = sumCostVer2(leftChildCost, rightChildCost, filterCost, groupCost) p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } // getPlanCostVer2 returns the plan-cost of this sub-plan, which is: @@ -509,10 +516,10 @@ func (p *PhysicalHashJoin) getPlanCostVer2(taskType property.TaskType, option *P memFactor := getTaskMemFactorVer2(p, taskType) buildFilterCost := filterCostVer2(option, buildRows, buildFilters, cpuFactor) - buildHashCost := hashBuildCostVer2(option, buildRows, buildRowSize, cols2Exprs(buildKeys), cpuFactor, memFactor) + buildHashCost := hashBuildCostVer2(option, buildRows, buildRowSize, float64(len(buildKeys)), cpuFactor, memFactor) probeFilterCost := filterCostVer2(option, probeRows, probeFilters, cpuFactor) - probeHashCost := hashProbeCostVer2(option, probeRows, cols2Exprs(probeKeys), cpuFactor) + probeHashCost := hashProbeCostVer2(option, probeRows, float64(len(probeKeys)), cpuFactor) buildChildCost, err := build.getPlanCostVer2(taskType, option) if err != nil { @@ -527,29 +534,31 @@ func (p *PhysicalHashJoin) getPlanCostVer2(taskType property.TaskType, option *P p.planCostVer2 = sumCostVer2(buildChildCost, probeChildCost, divCostVer2(sumCostVer2(buildHashCost, buildFilterCost, probeHashCost, probeFilterCost), mppConcurrency)) } else { // TiDB HashJoin - p.planCostVer2 = sumCostVer2(buildChildCost, probeChildCost, buildHashCost, buildFilterCost, + startCost := newCostVer2(option, cpuFactor, + 10*3*cpuFactor.Value, // 10rows * 3func * cpuFactor + func() string { return fmt.Sprintf("cpu(10*3*%v)", cpuFactor) }) + p.planCostVer2 = sumCostVer2(startCost, buildChildCost, probeChildCost, buildHashCost, buildFilterCost, divCostVer2(sumCostVer2(probeFilterCost, probeHashCost), tidbConcurrency)) } p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } -// getPlanCostVer2 returns the plan-cost of this sub-plan, which is: -// plan-cost = build-child-cost + build-filter-cost + -// (probe-cost + probe-filter-cost) / concurrency -// probe-cost = probe-child-cost * build-rows / batchRatio -func (p *PhysicalIndexJoin) getPlanCostVer2(taskType property.TaskType, option *PlanCostOption) (costVer2, error) { +func (p *PhysicalIndexJoin) getIndexJoinCostVer2(taskType property.TaskType, option *PlanCostOption, indexJoinType int) (costVer2, error) { if p.planCostInit && !hasCostFlag(option.CostFlag, CostFlagRecalculate) { return p.planCostVer2, nil } build, probe := p.children[1-p.InnerChildIdx], p.children[p.InnerChildIdx] buildRows := getCardinality(build, option.CostFlag) + buildRowSize := getAvgRowSize(build.Stats(), build.Schema().Columns) probeRowsOne := getCardinality(probe, option.CostFlag) probeRowsTot := probeRowsOne * buildRows + probeRowSize := getAvgRowSize(probe.Stats(), probe.Schema().Columns) buildFilters, probeFilters := p.LeftConditions, p.RightConditions probeConcurrency := float64(p.ctx.GetSessionVars().IndexLookupJoinConcurrency()) cpuFactor := getTaskCPUFactorVer2(p, taskType) + memFactor := getTaskMemFactorVer2(p, taskType) requestFactor := getTaskRequestFactorVer2(p, taskType) buildFilterCost := filterCostVer2(option, buildRows, buildFilters, cpuFactor) @@ -557,33 +566,65 @@ func (p *PhysicalIndexJoin) getPlanCostVer2(taskType property.TaskType, option * if err != nil { return zeroCostVer2, err } + buildTaskCost := newCostVer2(option, cpuFactor, + buildRows*10*cpuFactor.Value, + func() string { return fmt.Sprintf("cpu(%v*10*%v)", buildRows, cpuFactor) }) + startCost := newCostVer2(option, cpuFactor, + 10*3*cpuFactor.Value, + func() string { return fmt.Sprintf("cpu(10*3*%v)", cpuFactor) }) probeFilterCost := filterCostVer2(option, probeRowsTot, probeFilters, cpuFactor) probeChildCost, err := probe.getPlanCostVer2(taskType, option) if err != nil { return zeroCostVer2, err } + + var hashTableCost costVer2 + switch indexJoinType { + case 1: // IndexHashJoin + hashTableCost = hashBuildCostVer2(option, buildRows, buildRowSize, float64(len(p.RightJoinKeys)), cpuFactor, memFactor) + case 2: // IndexMergeJoin + hashTableCost = newZeroCostVer2(traceCost(option)) + default: // IndexJoin + hashTableCost = hashBuildCostVer2(option, probeRowsTot, probeRowSize, float64(len(p.LeftJoinKeys)), cpuFactor, memFactor) + } + // IndexJoin executes a batch of rows at a time, so the actual cost of this part should be // `innerCostPerBatch * numberOfBatches` instead of `innerCostPerRow * numberOfOuterRow`. // Use an empirical value batchRatio to handle this now. // TODO: remove this empirical value. - batchRatio := 1024.0 + batchRatio := 6.0 probeCost := divCostVer2(mulCostVer2(probeChildCost, buildRows), batchRatio) - doubleReadCost := doubleReadCostVer2(option, buildRows/batchRatio, requestFactor) - p.planCostVer2 = sumCostVer2(buildChildCost, buildFilterCost, divCostVer2(sumCostVer2(probeCost, probeFilterCost, doubleReadCost), probeConcurrency)) + // Double Read Cost + doubleReadCost := newZeroCostVer2(traceCost(option)) + if p.ctx.GetSessionVars().IndexJoinDoubleReadPenaltyCostRate > 0 { + batchSize := float64(p.ctx.GetSessionVars().IndexJoinBatchSize) + taskPerBatch := 1024.0 // TODO: remove this magic number + doubleReadTasks := buildRows / batchSize * taskPerBatch + doubleReadCost = doubleReadCostVer2(option, doubleReadTasks, requestFactor) + doubleReadCost = mulCostVer2(doubleReadCost, p.ctx.GetSessionVars().IndexJoinDoubleReadPenaltyCostRate) + } + + p.planCostVer2 = sumCostVer2(startCost, buildChildCost, buildFilterCost, buildTaskCost, divCostVer2(sumCostVer2(doubleReadCost, probeCost, probeFilterCost, hashTableCost), probeConcurrency)) p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil +} + +// getPlanCostVer2 returns the plan-cost of this sub-plan, which is: +// plan-cost = build-child-cost + build-filter-cost + +// (probe-cost + probe-filter-cost) / concurrency +// probe-cost = probe-child-cost * build-rows / batchRatio +func (p *PhysicalIndexJoin) getPlanCostVer2(taskType property.TaskType, option *PlanCostOption) (costVer2, error) { + return p.getIndexJoinCostVer2(taskType, option, 0) } func (p *PhysicalIndexHashJoin) getPlanCostVer2(taskType property.TaskType, option *PlanCostOption) (costVer2, error) { - // TODO: distinguish IndexHashJoin with IndexJoin - return p.PhysicalIndexJoin.getPlanCostVer2(taskType, option) + return p.getIndexJoinCostVer2(taskType, option, 1) } func (p *PhysicalIndexMergeJoin) getPlanCostVer2(taskType property.TaskType, option *PlanCostOption) (costVer2, error) { - // TODO: distinguish IndexMergeJoin with IndexJoin - return p.PhysicalIndexJoin.getPlanCostVer2(taskType, option) + return p.getIndexJoinCostVer2(taskType, option, 2) } // getPlanCostVer2 returns the plan-cost of this sub-plan, which is: @@ -614,7 +655,7 @@ func (p *PhysicalApply) getPlanCostVer2(taskType property.TaskType, option *Plan p.planCostVer2 = sumCostVer2(buildChildCost, buildFilterCost, probeCost, probeFilterCost) p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } // getPlanCostVer2 calculates the cost of the plan if it has not been calculated yet and returns the cost. @@ -635,7 +676,7 @@ func (p *PhysicalUnionAll) getPlanCostVer2(taskType property.TaskType, option *P } p.planCostVer2 = divCostVer2(sumCostVer2(childCosts...), concurrency) p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } // getPlanCostVer2 returns the plan-cost of this sub-plan, which is: @@ -665,7 +706,7 @@ func (p *PhysicalExchangeReceiver) getPlanCostVer2(taskType property.TaskType, o p.planCostVer2 = sumCostVer2(childCost, netCost) p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } // getPlanCostVer2 returns the plan-cost of this sub-plan, which is: @@ -684,7 +725,7 @@ func (p *PointGetPlan) getPlanCostVer2(taskType property.TaskType, option *PlanC p.planCostVer2 = netCostVer2(option, 1, rowSize, netFactor) p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } // getPlanCostVer2 returns the plan-cost of this sub-plan, which is: @@ -704,41 +745,44 @@ func (p *BatchPointGetPlan) getPlanCostVer2(taskType property.TaskType, option * p.planCostVer2 = netCostVer2(option, rows, rowSize, netFactor) p.planCostInit = true - return p.planCostVer2.label(p), nil + return p.planCostVer2, nil } func scanCostVer2(option *PlanCostOption, rows, rowSize float64, scanFactor costVer2Factor) costVer2 { + if rowSize < 1 { + rowSize = 1 + } return newCostVer2(option, scanFactor, // rows * log(row-size) * scanFactor, log2 from experiments - rows*math.Log2(math.Max(1, rowSize))*scanFactor.Value, - "scan(%v*logrowsize(%v)*%v)", rows, rowSize, scanFactor) + rows*math.Log2(rowSize)*scanFactor.Value, + func() string { return fmt.Sprintf("scan(%v*logrowsize(%v)*%v)", rows, rowSize, scanFactor) }) } func netCostVer2(option *PlanCostOption, rows, rowSize float64, netFactor costVer2Factor) costVer2 { return newCostVer2(option, netFactor, rows*rowSize*netFactor.Value, - "net(%v*rowsize(%v)*%v)", rows, rowSize, netFactor) + func() string { return fmt.Sprintf("net(%v*rowsize(%v)*%v)", rows, rowSize, netFactor) }) } func filterCostVer2(option *PlanCostOption, rows float64, filters []expression.Expression, cpuFactor costVer2Factor) costVer2 { numFuncs := numFunctions(filters) return newCostVer2(option, cpuFactor, rows*numFuncs*cpuFactor.Value, - "cpu(%v*filters(%v)*%v)", rows, numFuncs, cpuFactor) + func() string { return fmt.Sprintf("cpu(%v*filters(%v)*%v)", rows, numFuncs, cpuFactor) }) } func aggCostVer2(option *PlanCostOption, rows float64, aggFuncs []*aggregation.AggFuncDesc, cpuFactor costVer2Factor) costVer2 { return newCostVer2(option, cpuFactor, // TODO: consider types of agg-funcs rows*float64(len(aggFuncs))*cpuFactor.Value, - "agg(%v*aggs(%v)*%v)", rows, len(aggFuncs), cpuFactor) + func() string { return fmt.Sprintf("agg(%v*aggs(%v)*%v)", rows, len(aggFuncs), cpuFactor) }) } func groupCostVer2(option *PlanCostOption, rows float64, groupItems []expression.Expression, cpuFactor costVer2Factor) costVer2 { numFuncs := numFunctions(groupItems) return newCostVer2(option, cpuFactor, rows*numFuncs*cpuFactor.Value, - "group(%v*cols(%v)*%v)", rows, numFuncs, cpuFactor) + func() string { return fmt.Sprintf("group(%v*cols(%v)*%v)", rows, numFuncs, cpuFactor) }) } func numFunctions(exprs []expression.Expression) float64 { @@ -762,35 +806,35 @@ func orderCostVer2(option *PlanCostOption, rows, N float64, byItems []*util.ByIt } exprCost := newCostVer2(option, cpuFactor, rows*float64(numFuncs)*cpuFactor.Value, - "exprCPU(%v*%v*%v)", rows, numFuncs, cpuFactor) + func() string { return fmt.Sprintf("exprCPU(%v*%v*%v)", rows, numFuncs, cpuFactor) }) orderCost := newCostVer2(option, cpuFactor, rows*math.Log2(N)*cpuFactor.Value, - "orderCPU(%v*log(%v)*%v)", rows, N, cpuFactor) + func() string { return fmt.Sprintf("orderCPU(%v*log(%v)*%v)", rows, N, cpuFactor) }) return sumCostVer2(exprCost, orderCost) } -func hashBuildCostVer2(option *PlanCostOption, buildRows, buildRowSize float64, keys []expression.Expression, cpuFactor, memFactor costVer2Factor) costVer2 { +func hashBuildCostVer2(option *PlanCostOption, buildRows, buildRowSize, nKeys float64, cpuFactor, memFactor costVer2Factor) costVer2 { // TODO: 1) consider types of keys, 2) dedicated factor for build-probe hash table hashKeyCost := newCostVer2(option, cpuFactor, - buildRows*float64(len(keys))*cpuFactor.Value, - "hashkey(%v*%v*%v)", buildRows, len(keys), cpuFactor) + buildRows*nKeys*cpuFactor.Value, + func() string { return fmt.Sprintf("hashkey(%v*%v*%v)", buildRows, nKeys, cpuFactor) }) hashMemCost := newCostVer2(option, memFactor, buildRows*buildRowSize*memFactor.Value, - "hashmem(%v*%v*%v)", buildRows, buildRowSize, memFactor) + func() string { return fmt.Sprintf("hashmem(%v*%v*%v)", buildRows, buildRowSize, memFactor) }) hashBuildCost := newCostVer2(option, cpuFactor, buildRows*cpuFactor.Value, - "hashbuild(%v*%v)", buildRows, cpuFactor) + func() string { return fmt.Sprintf("hashbuild(%v*%v)", buildRows, cpuFactor) }) return sumCostVer2(hashKeyCost, hashMemCost, hashBuildCost) } -func hashProbeCostVer2(option *PlanCostOption, probeRows float64, keys []expression.Expression, cpuFactor costVer2Factor) costVer2 { +func hashProbeCostVer2(option *PlanCostOption, probeRows, nKeys float64, cpuFactor costVer2Factor) costVer2 { // TODO: 1) consider types of keys, 2) dedicated factor for build-probe hash table hashKeyCost := newCostVer2(option, cpuFactor, - probeRows*float64(len(keys))*cpuFactor.Value, - "hashkey(%v*%v*%v)", probeRows, len(keys), cpuFactor) + probeRows*nKeys*cpuFactor.Value, + func() string { return fmt.Sprintf("hashkey(%v*%v*%v)", probeRows, nKeys, cpuFactor) }) hashProbeCost := newCostVer2(option, cpuFactor, probeRows*cpuFactor.Value, - "hashprobe(%v*%v)", probeRows, cpuFactor) + func() string { return fmt.Sprintf("hashprobe(%v*%v)", probeRows, cpuFactor) }) return sumCostVer2(hashKeyCost, hashProbeCost) } @@ -798,7 +842,7 @@ func hashProbeCostVer2(option *PlanCostOption, probeRows float64, keys []express func doubleReadCostVer2(option *PlanCostOption, numTasks float64, requestFactor costVer2Factor) costVer2 { return newCostVer2(option, requestFactor, numTasks*requestFactor.Value, - "doubleRead(tasks(%v)*%v)", numTasks, requestFactor) + func() string { return fmt.Sprintf("doubleRead(tasks(%v)*%v)", numTasks, requestFactor) }) } type costVer2Factor struct { @@ -958,19 +1002,14 @@ func cols2Exprs(cols []*expression.Column) []expression.Expression { return exprs } -type costVer2 struct { - cost float64 - trace bool // Whether to trace the cost calculation. +type costTrace struct { factorCosts map[string]float64 // map[factorName]cost, used to calibrate the cost model formula string // It used to trace the cost calculation. } -func (c costVer2) label(p PhysicalPlan) costVer2 { - if !c.trace { - return c - } - c.formula = p.ExplainID().String() - return c +type costVer2 struct { + cost float64 + trace *costTrace } func traceCost(option *PlanCostOption) bool { @@ -982,65 +1021,63 @@ func traceCost(option *PlanCostOption) bool { func newZeroCostVer2(trace bool) (ret costVer2) { if trace { - ret.trace = true - ret.factorCosts = make(map[string]float64) - ret.formula = "0" + ret.trace = &costTrace{make(map[string]float64), ""} } return } -func newCostVer2(option *PlanCostOption, factor costVer2Factor, cost float64, - formulaFormat string, formulaArgs ...any) costVer2 { - ret := newZeroCostVer2(traceCost(option)) +func newCostVer2(option *PlanCostOption, factor costVer2Factor, cost float64, lazyFormula func() string) (ret costVer2) { ret.cost = cost - if ret.trace { - ret.factorCosts[factor.Name] = cost - ret.formula = fmt.Sprintf(formulaFormat, formulaArgs...) + if traceCost(option) { + ret.trace = &costTrace{make(map[string]float64), ""} + ret.trace.factorCosts[factor.Name] = cost + ret.trace.formula = lazyFormula() } return ret } -func sumCostVer2(costs ...costVer2) costVer2 { +func sumCostVer2(costs ...costVer2) (ret costVer2) { if len(costs) == 0 { - return newZeroCostVer2(false) + return } - ret := newZeroCostVer2(costs[0].trace) - var subFormulas []string - for _, c := range costs { + for i, c := range costs { ret.cost += c.cost - if ret.trace { - for factor, factorCost := range c.factorCosts { - ret.factorCosts[factor] += factorCost + if c.trace != nil { + if i == 0 { // init + ret.trace = &costTrace{make(map[string]float64), ""} } - subFormulas = append(subFormulas, fmt.Sprintf("(%v)", c.formula)) + for factor, factorCost := range c.trace.factorCosts { + ret.trace.factorCosts[factor] += factorCost + } + if ret.trace.formula != "" { + ret.trace.formula += " + " + } + ret.trace.formula += "(" + c.trace.formula + ")" } } - if ret.trace { - ret.formula = strings.Join(subFormulas, " + ") - } return ret } -func divCostVer2(cost costVer2, denominator float64) costVer2 { - ret := newZeroCostVer2(cost.trace) +func divCostVer2(cost costVer2, denominator float64) (ret costVer2) { ret.cost = cost.cost / denominator - if ret.trace { - for f, c := range cost.factorCosts { - ret.factorCosts[f] = c / denominator + if cost.trace != nil { + ret.trace = &costTrace{make(map[string]float64), ""} + for f, c := range cost.trace.factorCosts { + ret.trace.factorCosts[f] = c / denominator } - ret.formula = fmt.Sprintf("(%v)/%v", cost.formula, denominator) + ret.trace.formula = "(" + cost.trace.formula + ")/" + strconv.FormatFloat(denominator, 'f', 2, 64) } return ret } -func mulCostVer2(cost costVer2, scale float64) costVer2 { - ret := newZeroCostVer2(cost.trace) +func mulCostVer2(cost costVer2, scale float64) (ret costVer2) { ret.cost = cost.cost * scale - if ret.trace { - for f, c := range cost.factorCosts { - ret.factorCosts[f] = c * scale + if cost.trace != nil { + ret.trace = &costTrace{make(map[string]float64), ""} + for f, c := range cost.trace.factorCosts { + ret.trace.factorCosts[f] = c * scale } - ret.formula = fmt.Sprintf("(%v)*%v", cost.formula, scale) + ret.trace.formula = "(" + cost.trace.formula + ")*" + strconv.FormatFloat(scale, 'f', 2, 64) } return ret } diff --git a/planner/core/plan_cost_ver2_test.go b/planner/core/plan_cost_ver2_test.go index 27b5b913980e4..259fcdf870132 100644 --- a/planner/core/plan_cost_ver2_test.go +++ b/planner/core/plan_cost_ver2_test.go @@ -15,6 +15,7 @@ package core_test import ( + "context" "encoding/json" "fmt" "math" @@ -22,6 +23,11 @@ import ( "strings" "testing" + "github.com/pingcap/tidb/parser" + "github.com/pingcap/tidb/planner" + "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/planner/property" + "github.com/pingcap/tidb/sessiontxn" "github.com/pingcap/tidb/testkit" "github.com/stretchr/testify/require" ) @@ -134,7 +140,6 @@ func TestCostModelShowFormula(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec(`create table t (a int)`) - tk.MustExec("insert into t values (1), (2), (3)") tk.MustExec("set @@tidb_cost_model_version=2") tk.MustExecToErr("explain format='true_card_cost' select * from t") // 'true_card_cost' must work with 'explain analyze' @@ -144,9 +149,9 @@ func TestCostModelShowFormula(t *testing.T) { actual = append(actual, []interface{}{row[0], row[3]}) // id,costFormula } require.Equal(t, actual, [][]interface{}{ - {"TableReader_7", "((Selection_6) + (net(2*rowsize(16)*tidb_kv_net_factor(3.96))))/15"}, - {"└─Selection_6", "(cpu(3*filters(1)*tikv_cpu_factor(49.9))) + (TableFullScan_5)"}, - {" └─TableFullScan_5", "scan(3*logrowsize(32)*tikv_scan_factor(40.7))"}, + {"TableReader_7", "(((cpu(0*filters(1)*tikv_cpu_factor(49.9))) + (scan(0*logrowsize(32)*tikv_scan_factor(40.7)))) + (net(0*rowsize(16)*tidb_kv_net_factor(3.96))))/15.00"}, + {"└─Selection_6", "(cpu(0*filters(1)*tikv_cpu_factor(49.9))) + (scan(0*logrowsize(32)*tikv_scan_factor(40.7)))"}, + {" └─TableFullScan_5", "scan(0*logrowsize(32)*tikv_scan_factor(40.7))"}, }) } @@ -157,6 +162,7 @@ func TestCostModelVer2ScanRowSize(t *testing.T) { tk.MustExec(`create table t (pk int, a int, b int, c int, d int, primary key(pk), index ab(a, b), index abc(a, b, c))`) tk.MustExec("insert into t values (1, 1, 1, 1, 1)") tk.MustExec(`set @@tidb_cost_model_version=2`) + tk.MustExec("set global tidb_enable_collect_execution_info=1;") cases := []struct { query string @@ -242,3 +248,64 @@ func TestCostModelTraceVer2(t *testing.T) { require.True(t, ok) } } + +func TestIndexJoinPenaltyCost(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(`create table t1 (a int, key(a))`) + tk.MustExec(`create table t2 (a int, key(a))`) + + // default value 0 + tk.MustQuery("select @@tidb_index_join_double_read_penalty_cost_rate").Check(testkit.Rows("0")) + //tk.MustQuery("select global @@tidb_index_join_double_read_penalty_cost_rate").Check(testkit.Rows("0")) + + rs1 := tk.MustQuery("explain format='verbose' select /*+ tidb_inlj(t1, t2) */ * from t1, t2 where t1.a=t2.a").Rows() + cost1, err := strconv.ParseFloat(rs1[0][2].(string), 64) + require.Nil(t, err) + + tk.MustExec("set tidb_index_join_double_read_penalty_cost_rate=0.5") + rs2 := tk.MustQuery("explain format='verbose' select /*+ tidb_inlj(t1, t2) */ * from t1, t2 where t1.a=t2.a").Rows() + cost2, err := strconv.ParseFloat(rs2[0][2].(string), 64) + require.Nil(t, err) + + tk.MustExec("set tidb_index_join_double_read_penalty_cost_rate=1") + rs3 := tk.MustQuery("explain format='verbose' select /*+ tidb_inlj(t1, t2) */ * from t1, t2 where t1.a=t2.a").Rows() + cost3, err := strconv.ParseFloat(rs3[0][2].(string), 64) + require.Nil(t, err) + + require.Greater(t, cost2, cost1) + require.Greater(t, cost3, cost2) +} + +func BenchmarkGetPlanCost(b *testing.B) { + store := testkit.CreateMockStore(b) + tk := testkit.NewTestKit(b, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int);") + + p := parser.New() + sql := "select sum(t1.b), t1.a from t t1, t t2 where t1.a>0 and t2.a>10 and t1.b=t2.b group by t1.a order by t1.a limit 5" + stmt, err := p.ParseOneStmt(sql, "", "") + if err != nil { + b.Fatal(err) + } + sctx := tk.Session() + sctx.GetSessionVars().CostModelVersion = 2 + is := sessiontxn.GetTxnManager(sctx).GetTxnInfoSchema() + plan, _, err := planner.Optimize(context.TODO(), sctx, stmt, is) + if err != nil { + b.Fatal(err) + } + phyPlan := plan.(core.PhysicalPlan) + _, err = core.GetPlanCost(phyPlan, property.RootTaskType, core.NewDefaultPlanCostOption().WithCostFlag(core.CostFlagRecalculate)) + if err != nil { + b.Fatal(err) + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, _ = core.GetPlanCost(phyPlan, property.RootTaskType, core.NewDefaultPlanCostOption().WithCostFlag(core.CostFlagRecalculate)) + } +} diff --git a/planner/core/plan_replayer_capture_test.go b/planner/core/plan_replayer_capture_test.go index 2e88f090bd784..6778cdba20bbf 100644 --- a/planner/core/plan_replayer_capture_test.go +++ b/planner/core/plan_replayer_capture_test.go @@ -35,7 +35,6 @@ func TestPlanReplayerCaptureRecordJsonStats(t *testing.T) { tk.MustExec("use test") tk.MustExec("create table t1(a int)") tk.MustExec("create table t2(a int)") - tk.MustExec("SET global tidb_enable_plan_replayer_capture = ON;") tk.MustExec("analyze table t1") tk.MustExec("analyze table t2") testcases := []struct { @@ -68,6 +67,7 @@ func getTableStats(sql string, t *testing.T, ctx sessionctx.Context, dom *domain err = core.Preprocess(context.Background(), ctx, stmt, core.WithPreprocessorReturn(&core.PreprocessorReturn{InfoSchema: dom.InfoSchema()})) require.NoError(t, err) sctx := core.MockContext() + sctx.GetSessionVars().EnablePlanReplayerCapture = true builder, _ := core.NewPlanBuilder().Init(sctx, dom.InfoSchema(), &hint.BlockHintProcessor{}) domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(dom.InfoSchema()) plan, err := builder.Build(context.TODO(), stmt) diff --git a/planner/core/plan_stats.go b/planner/core/plan_stats.go index 9bea8edb8b0ba..eaf3cf3120a0f 100644 --- a/planner/core/plan_stats.go +++ b/planner/core/plan_stats.go @@ -18,12 +18,10 @@ import ( "context" "time" - "github.com/pingcap/errors" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/util/logutil" @@ -66,7 +64,10 @@ func (syncWaitStatsLoadPoint) optimize(_ context.Context, plan LogicalPlan, _ *l if plan.SCtx().GetSessionVars().InRestrictedSQL { return plan, nil } - _, err := SyncWaitStatsLoad(plan) + if plan.SCtx().GetSessionVars().StmtCtx.IsSyncStatsFailed { + return plan, nil + } + err := SyncWaitStatsLoad(plan) return plan, err } @@ -91,37 +92,36 @@ func RequestLoadStats(ctx sessionctx.Context, neededHistItems []model.TableItemI var timeout = time.Duration(waitTime) err := domain.GetDomain(ctx).StatsHandle().SendLoadRequests(stmtCtx, neededHistItems, timeout) if err != nil { - logutil.BgLogger().Warn("SendLoadRequests failed", zap.Error(err)) stmtCtx.IsSyncStatsFailed = true - return handleTimeout(stmtCtx) + if variable.StatsLoadPseudoTimeout.Load() { + logutil.BgLogger().Warn("RequestLoadStats failed", zap.Error(err)) + stmtCtx.AppendWarning(err) + return nil + } + logutil.BgLogger().Error("RequestLoadStats failed", zap.Error(err)) + return err } return nil } // SyncWaitStatsLoad sync-wait for stats load until timeout -func SyncWaitStatsLoad(plan LogicalPlan) (bool, error) { +func SyncWaitStatsLoad(plan LogicalPlan) error { stmtCtx := plan.SCtx().GetSessionVars().StmtCtx - if stmtCtx.StatsLoad.Fallback { - return false, nil - } - success := domain.GetDomain(plan.SCtx()).StatsHandle().SyncWaitStatsLoad(stmtCtx) - if success { - return true, nil - } - logutil.BgLogger().Warn("SyncWaitStatsLoad failed") - stmtCtx.IsSyncStatsFailed = true - err := handleTimeout(stmtCtx) - return false, err -} - -func handleTimeout(stmtCtx *stmtctx.StatementContext) error { - err := errors.New("Timeout when sync-load full stats for needed columns") - if variable.StatsLoadPseudoTimeout.Load() { - stmtCtx.AppendWarning(err) - stmtCtx.StatsLoad.Fallback = true + if len(stmtCtx.StatsLoad.NeededItems) <= 0 { return nil } - return err + err := domain.GetDomain(plan.SCtx()).StatsHandle().SyncWaitStatsLoad(stmtCtx) + if err != nil { + stmtCtx.IsSyncStatsFailed = true + if variable.StatsLoadPseudoTimeout.Load() { + logutil.BgLogger().Warn("SyncWaitStatsLoad failed", zap.Error(err)) + stmtCtx.AppendWarning(err) + return nil + } + logutil.BgLogger().Error("SyncWaitStatsLoad failed", zap.Error(err)) + return err + } + return nil } // collectSyncIndices will collect the indices which includes following conditions: diff --git a/planner/core/plan_test.go b/planner/core/plan_test.go index a31844f5fe722..6bfe3f6e04dea 100644 --- a/planner/core/plan_test.go +++ b/planner/core/plan_test.go @@ -16,6 +16,7 @@ package core_test import ( "bytes" + "encoding/json" "fmt" "strings" "testing" @@ -24,6 +25,7 @@ import ( "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" @@ -109,6 +111,14 @@ func TestNormalizedPlan(t *testing.T) { tk.MustExec("create table t2 (a int key,b int,c int, index (b));") tk.MustExec("create table t3 (a int key,b int) partition by hash(a) partitions 2;") tk.MustExec("create table t4 (a int, b int, index(a)) partition by range(a) (partition p0 values less than (10),partition p1 values less than MAXVALUE);") + tk.MustExec("set @@global.tidb_enable_foreign_key=1") + tk.MustExec("set @@foreign_key_checks=1") + tk.MustExec("create table t5 (id int key, id2 int, id3 int, unique index idx2(id2), index idx3(id3));") + tk.MustExec("create table t6 (id int, id2 int, id3 int, index idx_id(id), index idx_id2(id2), " + + "foreign key fk_1 (id) references t5(id) ON UPDATE CASCADE ON DELETE CASCADE, " + + "foreign key fk_2 (id2) references t5(id2) ON UPDATE CASCADE, " + + "foreign key fk_3 (id3) references t5(id3) ON DELETE CASCADE);") + tk.MustExec("insert into t5 values (1,1,1), (2,2,2)") var input []string var output []struct { SQL string @@ -130,6 +140,8 @@ func TestNormalizedPlan(t *testing.T) { newNormalized, newDigest := core.NormalizeFlatPlan(flat) require.Equal(t, normalized, newNormalized) require.Equal(t, digest, newDigest) + // Test for GenHintsFromFlatPlan won't panic. + core.GenHintsFromFlatPlan(flat) normalizedPlan, err := plancodec.DecodeNormalizedPlan(normalized) normalizedPlanRows := getPlanRows(normalizedPlan) @@ -1015,6 +1027,17 @@ func TestIssue34863(t *testing.T) { tk.MustQuery("select count(o.c_id) from c right join o on c.c_id=o.c_id;").Check(testkit.Rows("5")) } +func TestIssue40857(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t;") + tk.MustExec("CREATE TABLE t (c1 mediumint(9) DEFAULT '-4747160',c2 year(4) NOT NULL DEFAULT '2075',c3 double DEFAULT '1.1559030660251948',c4 enum('wbv4','eli','d8ym','m3gsx','lz7td','o','d1k7l','y1x','xcxq','bj','n7') DEFAULT 'xcxq',c5 int(11) DEFAULT '255080866',c6 tinyint(1) DEFAULT '1',PRIMARY KEY (c2),KEY `c4d86d54-091c-4307-957b-b164c9652b7f` (c6,c4) );") + tk.MustExec("insert into t values (-4747160, 2075, 722.5719203870632, 'xcxq', 1576824797, 1);") + tk.MustExec("select /*+ stream_agg() */ bit_or(t.c5) as r0 from t where t.c3 in (select c6 from t where not(t.c6 <> 1) and not(t.c3 in(9263.749352636818))) group by t.c1;") + require.Empty(t, tk.Session().LastMessage()) +} + func TestCloneFineGrainedShuffleStreamCount(t *testing.T) { window := &core.PhysicalWindow{} newPlan, err := window.Clone() @@ -1100,3 +1123,46 @@ func TestOuterJoinOnNull(t *testing.T) { tk.MustQuery("SELECT ((NOT ('i'))AND(t2.c0)) IS NULL FROM t2 RIGHT JOIN t3 ON t3.c0;").Check(testkit.Rows("1")) tk.MustQuery("SELECT * FROM t2 RIGHT JOIN t3 ON t2.c0 WHERE ((NOT ('i'))AND(t2.c0)) IS NULL;").Check(testkit.Rows(" 1")) } + +func TestJSONPlanInExplain(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(id int, key(id))") + tk.MustExec("create table t2(id int, key(id))") + + var input []string + var output []struct { + SQL string + JSONPlan []*core.ExplainInfoForEncode + } + planSuiteData := core.GetJSONPlanSuiteData() + planSuiteData.LoadTestCases(t, &input, &output) + + for i, test := range input { + resJSON := tk.MustQuery(test).Rows() + var res []*core.ExplainInfoForEncode + require.NoError(t, json.Unmarshal([]byte(resJSON[0][0].(string)), &res)) + for j, expect := range output[i].JSONPlan { + require.Equal(t, expect.ID, res[j].ID) + require.Equal(t, expect.EstRows, res[j].EstRows) + require.Equal(t, expect.ActRows, res[j].ActRows) + require.Equal(t, expect.TaskType, res[j].TaskType) + require.Equal(t, expect.AccessObject, res[j].AccessObject) + require.Equal(t, expect.OperatorInfo, res[j].OperatorInfo) + } + } +} + +func TestIssue40535(t *testing.T) { + store := testkit.CreateMockStore(t) + var cfg kv.InjectionConfig + tk := testkit.NewTestKit(t, kv.NewInjectedStore(store, &cfg)) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t1; drop table if exists t2;") + tk.MustExec("CREATE TABLE `t1`(`c1` bigint(20) NOT NULL DEFAULT '-2312745469307452950', `c2` datetime DEFAULT '5316-02-03 06:54:49', `c3` tinyblob DEFAULT NULL, PRIMARY KEY (`c1`) /*T![clustered_index] CLUSTERED */) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;") + tk.MustExec("CREATE TABLE `t2`(`c1` set('kn8pu','7et','vekx6','v3','liwrh','q14','1met','nnd5i','5o0','8cz','l') DEFAULT '7et,vekx6,liwrh,q14,1met', `c2` float DEFAULT '1.683167', KEY `k1` (`c2`,`c1`), KEY `k2` (`c2`)) ENGINE=InnoDB DEFAULT CHARSET=gbk COLLATE=gbk_chinese_ci;") + tk.MustExec("(select /*+ agg_to_cop()*/ locate(t1.c3, t1.c3) as r0, t1.c3 as r1 from t1 where not( IsNull(t1.c1)) order by r0,r1) union all (select concat_ws(',', t2.c2, t2.c1) as r0, t2.c1 as r1 from t2 order by r0, r1) order by 1 limit 273;") + require.Empty(t, tk.Session().LastMessage()) +} diff --git a/planner/core/plan_to_pb.go b/planner/core/plan_to_pb.go index a68fdae38f5de..61edd9471a20c 100644 --- a/planner/core/plan_to_pb.go +++ b/planner/core/plan_to_pb.go @@ -60,7 +60,13 @@ func (p *PhysicalHashAgg) ToPB(ctx sessionctx.Context, storeType kv.StoreType) ( } executorID = p.ExplainID().String() } - return &tipb.Executor{Tp: tipb.ExecType_TypeAggregation, Aggregation: aggExec, ExecutorId: &executorID}, nil + return &tipb.Executor{ + Tp: tipb.ExecType_TypeAggregation, + Aggregation: aggExec, + ExecutorId: &executorID, + FineGrainedShuffleStreamCount: p.TiFlashFineGrainedShuffleStreamCount, + FineGrainedShuffleBatchSize: ctx.GetSessionVars().TiFlashFineGrainedShuffleBatchSize, + }, nil } // ToPB implements PhysicalPlan ToPB interface. @@ -303,6 +309,7 @@ func (e *PhysicalExchangeSender) ToPB(ctx sessionctx.Context, storeType kv.Store Child: child, Types: hashColTypes, AllFieldTypes: allFieldTypes, + Compression: e.CompressionMode.ToTipbCompressionMode(), } executorID := e.ExplainID().String() return &tipb.Executor{ @@ -370,7 +377,7 @@ func (p *PhysicalIndexScan) ToPB(_ sessionctx.Context, _ kv.StoreType) (*tipb.Ex idxExec := &tipb.IndexScan{ TableId: p.Table.ID, IndexId: p.Index.ID, - Columns: util.ColumnsToProto(columns, p.Table.PKIsHandle), + Columns: util.ColumnsToProto(columns, p.Table.PKIsHandle, true), Desc: p.Desc, PrimaryColumnIds: pkColIds, } @@ -492,7 +499,13 @@ func (p *PhysicalHashJoin) ToPB(ctx sessionctx.Context, storeType kv.StoreType) } executorID := p.ExplainID().String() - return &tipb.Executor{Tp: tipb.ExecType_TypeJoin, Join: join, ExecutorId: &executorID}, nil + return &tipb.Executor{ + Tp: tipb.ExecType_TypeJoin, + Join: join, + ExecutorId: &executorID, + FineGrainedShuffleStreamCount: p.TiFlashFineGrainedShuffleStreamCount, + FineGrainedShuffleBatchSize: ctx.GetSessionVars().TiFlashFineGrainedShuffleBatchSize, + }, nil } // ToPB converts FrameBound to tipb structure. diff --git a/planner/core/plan_to_pb_test.go b/planner/core/plan_to_pb_test.go index 9ea55a23babdd..cb108678629f2 100644 --- a/planner/core/plan_to_pb_test.go +++ b/planner/core/plan_to_pb_test.go @@ -35,16 +35,16 @@ func TestColumnToProto(t *testing.T) { col := &model.ColumnInfo{ FieldType: *tp, } - pc := util.ColumnToProto(col) + pc := util.ColumnToProto(col, false) expect := &tipb.ColumnInfo{ColumnId: 0, Tp: 3, Collation: 83, ColumnLen: 11, Decimal: 0, Flag: 10, Elems: []string(nil), DefaultVal: []uint8(nil), PkHandle: false, XXX_unrecognized: []uint8(nil)} require.Equal(t, expect, pc) cols := []*model.ColumnInfo{col, col} - pcs := util.ColumnsToProto(cols, false) + pcs := util.ColumnsToProto(cols, false, false) for _, v := range pcs { require.Equal(t, int32(10), v.GetFlag()) } - pcs = util.ColumnsToProto(cols, true) + pcs = util.ColumnsToProto(cols, true, false) for _, v := range pcs { require.Equal(t, int32(10), v.GetFlag()) } @@ -56,19 +56,19 @@ func TestColumnToProto(t *testing.T) { col1 := &model.ColumnInfo{ FieldType: *tp, } - pc = util.ColumnToProto(col1) + pc = util.ColumnToProto(col1, false) require.Equal(t, int32(8), pc.Collation) collate.SetNewCollationEnabledForTest(true) - pc = util.ColumnToProto(col) + pc = util.ColumnToProto(col, false) expect = &tipb.ColumnInfo{ColumnId: 0, Tp: 3, Collation: -83, ColumnLen: 11, Decimal: 0, Flag: 10, Elems: []string(nil), DefaultVal: []uint8(nil), PkHandle: false, XXX_unrecognized: []uint8(nil)} require.Equal(t, expect, pc) - pcs = util.ColumnsToProto(cols, true) + pcs = util.ColumnsToProto(cols, true, false) for _, v := range pcs { require.Equal(t, int32(-83), v.Collation) } - pc = util.ColumnToProto(col1) + pc = util.ColumnToProto(col1, false) require.Equal(t, int32(-8), pc.Collation) tp = types.NewFieldType(mysql.TypeEnum) @@ -77,6 +77,6 @@ func TestColumnToProto(t *testing.T) { col2 := &model.ColumnInfo{ FieldType: *tp, } - pc = util.ColumnToProto(col2) + pc = util.ColumnToProto(col2, false) require.Len(t, pc.Elems, 2) } diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index 4036823813bfb..37d4ac0a9276b 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -65,6 +65,7 @@ import ( "github.com/pingcap/tidb/util/sem" "github.com/pingcap/tidb/util/set" "github.com/pingcap/tidb/util/sqlexec" + "github.com/pingcap/tidb/util/stmtsummary" "github.com/tikv/client-go/v2/tikv" "go.uber.org/zap" ) @@ -576,6 +577,9 @@ type PlanBuilder struct { // disableSubQueryPreprocessing indicates whether to pre-process uncorrelated sub-queries in rewriting stage. disableSubQueryPreprocessing bool + + // allowBuildCastArray indicates whether allow cast(... as ... array). + allowBuildCastArray bool } type handleColHelper struct { @@ -696,6 +700,14 @@ func (p PlanBuilderOptNoExecution) Apply(builder *PlanBuilder) { builder.disableSubQueryPreprocessing = true } +// PlanBuilderOptAllowCastArray means the plan builder should allow build cast(... as ... array). +type PlanBuilderOptAllowCastArray struct{} + +// Apply implements the interface PlanBuilderOpt. +func (p PlanBuilderOptAllowCastArray) Apply(builder *PlanBuilder) { + builder.allowBuildCastArray = true +} + // NewPlanBuilder creates a new PlanBuilder. func NewPlanBuilder(opts ...PlanBuilderOpt) *PlanBuilder { builder := &PlanBuilder{ @@ -979,24 +991,43 @@ func (b *PlanBuilder) buildSet(ctx context.Context, v *ast.SetStmt) (Plan, error } func (b *PlanBuilder) buildDropBindPlan(v *ast.DropBindingStmt) (Plan, error) { - p := &SQLBindPlan{ - SQLBindOp: OpSQLBindDrop, - NormdOrigSQL: parser.Normalize(utilparser.RestoreWithDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB, v.OriginNode.Text())), - IsGlobal: v.GlobalScope, - Db: utilparser.GetDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB), - } - if v.HintedNode != nil { - p.BindSQL = utilparser.RestoreWithDefaultDB(v.HintedNode, b.ctx.GetSessionVars().CurrentDB, v.HintedNode.Text()) + var p *SQLBindPlan + if v.OriginNode != nil { + p = &SQLBindPlan{ + SQLBindOp: OpSQLBindDrop, + NormdOrigSQL: parser.Normalize(utilparser.RestoreWithDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB, v.OriginNode.Text())), + IsGlobal: v.GlobalScope, + Db: utilparser.GetDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB), + } + if v.HintedNode != nil { + p.BindSQL = utilparser.RestoreWithDefaultDB(v.HintedNode, b.ctx.GetSessionVars().CurrentDB, v.HintedNode.Text()) + } + } else { + p = &SQLBindPlan{ + SQLBindOp: OpSQLBindDropByDigest, + IsGlobal: v.GlobalScope, + SQLDigest: v.SQLDigest, + } } b.visitInfo = appendVisitInfo(b.visitInfo, mysql.SuperPriv, "", "", "", nil) return p, nil } func (b *PlanBuilder) buildSetBindingStatusPlan(v *ast.SetBindingStmt) (Plan, error) { - p := &SQLBindPlan{ - SQLBindOp: OpSetBindingStatus, - NormdOrigSQL: parser.Normalize(utilparser.RestoreWithDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB, v.OriginNode.Text())), - Db: utilparser.GetDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB), + var p *SQLBindPlan + if v.OriginNode != nil { + p = &SQLBindPlan{ + SQLBindOp: OpSetBindingStatus, + NormdOrigSQL: parser.Normalize(utilparser.RestoreWithDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB, v.OriginNode.Text())), + Db: utilparser.GetDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB), + } + } else if v.SQLDigest != "" { + p = &SQLBindPlan{ + SQLBindOp: OpSetBindingStatusByDigest, + SQLDigest: v.SQLDigest, + } + } else { + return nil, errors.New("sql digest is empty") } switch v.BindingStatusType { case ast.BindingStatusTypeEnabled: @@ -1030,7 +1061,78 @@ func checkHintedSQL(sql, charset, collation, db string) error { return nil } +func fetchRecordFromClusterStmtSummary(sctx sessionctx.Context, planDigest string) ([]chunk.Row, error) { + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBindInfo) + exec, _ := sctx.(sqlexec.SQLExecutor) + fields := "stmt_type, schema_name, digest_text, sample_user, prepared, query_sample_text, charset, collation, plan_hint, plan_digest" + sql := fmt.Sprintf("select %s from information_schema.cluster_statements_summary where plan_digest = '%s' union distinct ", fields, planDigest) + + fmt.Sprintf("select %s from information_schema.cluster_statements_summary_history where plan_digest = '%s' ", fields, planDigest) + + "order by length(plan_digest) desc" + rs, err := exec.ExecuteInternal(ctx, sql) + if rs == nil { + return nil, errors.New("can't find any records for '" + planDigest + "' in statement summary") + } + if err != nil { + return nil, err + } + + var rows []chunk.Row + defer terror.Call(rs.Close) + if rows, err = sqlexec.DrainRecordSet(ctx, rs, 8); err != nil { + return nil, err + } + return rows, nil +} + +func (b *PlanBuilder) buildCreateBindPlanFromPlanDigest(v *ast.CreateBindingStmt) (Plan, error) { + if v.PlanDigest == "" { + return nil, errors.New("plan digest is empty") + } + rows, err := fetchRecordFromClusterStmtSummary(b.ctx, v.PlanDigest) + if err != nil { + return nil, err + } + bindableStmt := stmtsummary.GetBindableStmtFromCluster(rows) + if bindableStmt == nil { + return nil, errors.New("can't find any plans for '" + v.PlanDigest + "'") + } + + parser4binding := parser.New() + originNode, err := parser4binding.ParseOneStmt(bindableStmt.Query, bindableStmt.Charset, bindableStmt.Collation) + if err != nil { + return nil, errors.Errorf("binding failed: %v", err) + } + if err = hint.CheckBindingFromHistoryBindable(originNode, bindableStmt.PlanHint); err != nil { + return nil, err + } + bindSQL := bindinfo.GenerateBindSQL(context.TODO(), originNode, bindableStmt.PlanHint, true, bindableStmt.Schema) + var hintNode ast.StmtNode + hintNode, err = parser4binding.ParseOneStmt(bindSQL, bindableStmt.Charset, bindableStmt.Collation) + if err != nil { + return nil, errors.Errorf("binding failed: %v", err) + } + normdOrigSQL, sqlDigestWithDB := parser.NormalizeDigest(utilparser.RestoreWithDefaultDB(originNode, bindableStmt.Schema, bindableStmt.Query)) + p := &SQLBindPlan{ + SQLBindOp: OpSQLBindCreate, + NormdOrigSQL: normdOrigSQL, + BindSQL: utilparser.RestoreWithDefaultDB(hintNode, bindableStmt.Schema, hintNode.Text()), + IsGlobal: v.GlobalScope, + BindStmt: hintNode, + Db: utilparser.GetDefaultDB(originNode, bindableStmt.Schema), + Charset: bindableStmt.Charset, + Collation: bindableStmt.Collation, + Source: bindinfo.History, + SQLDigest: sqlDigestWithDB.String(), + PlanDigest: v.PlanDigest, + } + b.visitInfo = appendVisitInfo(b.visitInfo, mysql.SuperPriv, "", "", "", nil) + return p, nil +} + func (b *PlanBuilder) buildCreateBindPlan(v *ast.CreateBindingStmt) (Plan, error) { + if v.OriginNode == nil { + return b.buildCreateBindPlanFromPlanDigest(v) + } charSet, collation := b.ctx.GetSessionVars().GetCharsetInfo() // Because we use HintedNode.Restore instead of HintedNode.Text, so we need do some check here @@ -1042,15 +1144,18 @@ func (b *PlanBuilder) buildCreateBindPlan(v *ast.CreateBindingStmt) (Plan, error return nil, err } + normdOrigSQL, sqlDigestWithDB := parser.NormalizeDigest(utilparser.RestoreWithDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB, v.OriginNode.Text())) p := &SQLBindPlan{ SQLBindOp: OpSQLBindCreate, - NormdOrigSQL: parser.Normalize(utilparser.RestoreWithDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB, v.OriginNode.Text())), + NormdOrigSQL: normdOrigSQL, BindSQL: utilparser.RestoreWithDefaultDB(v.HintedNode, b.ctx.GetSessionVars().CurrentDB, v.HintedNode.Text()), IsGlobal: v.GlobalScope, BindStmt: v.HintedNode, Db: utilparser.GetDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB), Charset: charSet, Collation: collation, + Source: bindinfo.Manual, + SQLDigest: sqlDigestWithDB.String(), } b.visitInfo = appendVisitInfo(b.visitInfo, mysql.SuperPriv, "", "", "", nil) return p, nil @@ -1111,7 +1216,8 @@ func (b *PlanBuilder) detectSelectWindow(sel *ast.SelectStmt) bool { } func getPathByIndexName(paths []*util.AccessPath, idxName model.CIStr, tblInfo *model.TableInfo) *util.AccessPath { - var primaryIdxPath *util.AccessPath + var primaryIdxPath, indexPrefixPath *util.AccessPath + prefixMatches := 0 for _, path := range paths { if path.StoreType == kv.TiFlash { continue @@ -1123,10 +1229,19 @@ func getPathByIndexName(paths []*util.AccessPath, idxName model.CIStr, tblInfo * if path.Index.Name.L == idxName.L { return path } + if strings.HasPrefix(path.Index.Name.L, idxName.L) { + indexPrefixPath = path + prefixMatches++ + } } if isPrimaryIndex(idxName) && tblInfo.HasClusteredIndex() { return primaryIdxPath } + + // Return only unique prefix matches + if prefixMatches == 1 { + return indexPrefixPath + } return nil } @@ -1305,6 +1420,12 @@ func getPossibleAccessPaths(ctx sessionctx.Context, tableHints *tableHintInfo, i // our cost estimation is not reliable. hasUseOrForce = true path.Forced = true + if hint.HintType == ast.HintOrderIndex { + path.ForceKeepOrder = true + } + if hint.HintType == ast.HintNoOrderIndex { + path.ForceNoKeepOrder = true + } available = append(available, path) } } @@ -1314,10 +1435,6 @@ func getPossibleAccessPaths(ctx sessionctx.Context, tableHints *tableHintInfo, i } available = removeIgnoredPaths(available, ignored, tblInfo) - if staleread.IsStmtStaleness(ctx) { - // skip tiflash if the statement is for stale read until tiflash support stale read - available = removeTiflashDuringStaleRead(available) - } // If we have got "FORCE" or "USE" index hint but got no available index, // we have to use table scan. @@ -1336,6 +1453,7 @@ func filterPathByIsolationRead(ctx sessionctx.Context, paths []*util.AccessPath, availableEngine := map[kv.StoreType]struct{}{} var availableEngineStr string for i := len(paths) - 1; i >= 0; i-- { + // availableEngineStr is for warning message. if _, ok := availableEngine[paths[i].StoreType]; !ok { availableEngine[paths[i].StoreType] = struct{}{} if availableEngineStr != "" { @@ -2182,12 +2300,16 @@ func getColOffsetForAnalyze(colsInfo []*model.ColumnInfo, colID int64) int { // in tblInfo.Indices, index.Columns[i].Offset is set according to tblInfo.Columns. Since we decode row samples according to colsInfo rather than tbl.Columns // in the execution phase of ANALYZE, we need to modify index.Columns[i].Offset according to colInfos. // TODO: find a better way to find indexed columns in ANALYZE rather than use IndexColumn.Offset -func getModifiedIndexesInfoForAnalyze(tblInfo *model.TableInfo, allColumns bool, colsInfo []*model.ColumnInfo) []*model.IndexInfo { +func getModifiedIndexesInfoForAnalyze(sctx sessionctx.Context, tblInfo *model.TableInfo, allColumns bool, colsInfo []*model.ColumnInfo) []*model.IndexInfo { idxsInfo := make([]*model.IndexInfo, 0, len(tblInfo.Indices)) for _, originIdx := range tblInfo.Indices { if originIdx.State != model.StatePublic { continue } + if originIdx.MVIndex { + sctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("analyzing multi-valued indexes is not supported, skip %s", originIdx.Name.L)) + continue + } if allColumns { // If all the columns need to be analyzed, we don't need to modify IndexColumn.Offset. idxsInfo = append(idxsInfo, originIdx) @@ -2263,7 +2385,7 @@ func (b *PlanBuilder) buildAnalyzeFullSamplingTask( execColsInfo = colsInfo } allColumns := len(tbl.TableInfo.Columns) == len(execColsInfo) - indexes := getModifiedIndexesInfoForAnalyze(tbl.TableInfo, allColumns, execColsInfo) + indexes := getModifiedIndexesInfoForAnalyze(b.ctx, tbl.TableInfo, allColumns, execColsInfo) handleCols := BuildHandleColsForAnalyze(b.ctx, tbl.TableInfo, allColumns, execColsInfo) newTask := AnalyzeColumnsTask{ HandleCols: handleCols, @@ -2493,6 +2615,10 @@ func (b *PlanBuilder) buildAnalyzeTable(as *ast.AnalyzeTableStmt, opts map[ast.A commonHandleInfo = idx continue } + if idx.MVIndex { + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("analyzing multi-valued indexes is not supported, skip %s", idx.Name.L)) + continue + } for i, id := range physicalIDs { if id == tbl.TableInfo.ID { id = -1 @@ -2586,6 +2712,10 @@ func (b *PlanBuilder) buildAnalyzeIndex(as *ast.AnalyzeTableStmt, opts map[ast.A if idx == nil || idx.State != model.StatePublic { return nil, ErrAnalyzeMissIndex.GenWithStackByArgs(idxName.O, tblInfo.Name.O) } + if idx.MVIndex { + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("analyzing multi-valued indexes is not supported, skip %s", idx.Name.L)) + continue + } for i, id := range physicalIDs { if id == tblInfo.ID { id = -1 @@ -2628,6 +2758,11 @@ func (b *PlanBuilder) buildAnalyzeAllIndex(as *ast.AnalyzeTableStmt, opts map[as } for _, idx := range tblInfo.Indices { if idx.State == model.StatePublic { + if idx.MVIndex { + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("analyzing multi-valued indexes is not supported, skip %s", idx.Name.L)) + continue + } + for i, id := range physicalIDs { if id == tblInfo.ID { id = -1 @@ -3051,6 +3186,7 @@ func (b *PlanBuilder) buildShow(ctx context.Context, show *ast.ShowStmt) (Plan, Partition: show.Partition, Column: show.Column, IndexName: show.IndexName, + ResourceGroupName: show.ResourceGroupName, Flag: show.Flag, User: show.User, Roles: show.Roles, @@ -3480,7 +3616,10 @@ func (b *PlanBuilder) resolveGeneratedColumns(ctx context.Context, columns []*ta } colExpr := mockPlan.Schema().Columns[idx] + originalVal := b.allowBuildCastArray + b.allowBuildCastArray = true expr, _, err := b.rewrite(ctx, column.GeneratedExpr, mockPlan, nil, true) + b.allowBuildCastArray = originalVal if err != nil { return igc, err } @@ -4024,7 +4163,7 @@ func (b *PlanBuilder) buildLoadData(ctx context.Context, ld *ast.LoadDataStmt) ( return nil, ErrNotSupportedYet.GenWithStackByArgs("load data with empty field terminator") } p := LoadData{ - IsLocal: ld.IsLocal, + FileLocRef: ld.FileLocRef, OnDuplicate: ld.OnDuplicate, Path: ld.Path, Table: ld.Table, @@ -4402,6 +4541,14 @@ func (b *PlanBuilder) buildDDL(ctx context.Context, node ast.DDLNode) (Plan, err } b.visitInfo = appendVisitInfo(b.visitInfo, mysql.UpdatePriv, mysql.SystemDB, "stats_extended", "", authErr) + } else if spec.Tp == ast.AlterTableAddConstraint { + if b.ctx.GetSessionVars().User != nil && spec.Constraint != nil && + spec.Constraint.Tp == ast.ConstraintForeignKey && spec.Constraint.Refer != nil { + authErr = ErrTableaccessDenied.GenWithStackByArgs("REFERENCES", b.ctx.GetSessionVars().User.AuthUsername, + b.ctx.GetSessionVars().User.AuthHostname, spec.Constraint.Refer.Table.Name.L) + b.visitInfo = appendVisitInfo(b.visitInfo, mysql.ReferencesPriv, spec.Constraint.Refer.Table.Schema.L, + spec.Constraint.Refer.Table.Name.L, "", authErr) + } } } case *ast.AlterSequenceStmt: @@ -4580,9 +4727,39 @@ func (b *PlanBuilder) buildDDL(ctx context.Context, node ast.DDLNode) (Plan, err } b.visitInfo = appendVisitInfo(b.visitInfo, mysql.InsertPriv, v.TableToTables[0].NewTable.Schema.L, v.TableToTables[0].NewTable.Name.L, "", authErr) - case *ast.RecoverTableStmt, *ast.FlashBackTableStmt, *ast.FlashBackDatabaseStmt: - // Recover table command can only be executed by administrator. - b.visitInfo = appendVisitInfo(b.visitInfo, mysql.SuperPriv, "", "", "", nil) + case *ast.RecoverTableStmt: + if v.Table == nil { + b.visitInfo = appendVisitInfo(b.visitInfo, mysql.SuperPriv, "", "", "", nil) + } else { + if b.ctx.GetSessionVars().User != nil { + authErr = ErrTableaccessDenied.GenWithStackByArgs("CREATE", b.ctx.GetSessionVars().User.AuthUsername, + b.ctx.GetSessionVars().User.AuthHostname, v.Table.Name.L) + } + b.visitInfo = appendVisitInfo(b.visitInfo, mysql.CreatePriv, v.Table.Schema.L, v.Table.Name.L, "", authErr) + if b.ctx.GetSessionVars().User != nil { + authErr = ErrTableaccessDenied.GenWithStackByArgs("DROP", b.ctx.GetSessionVars().User.AuthUsername, + b.ctx.GetSessionVars().User.AuthHostname, v.Table.Name.L) + } + b.visitInfo = appendVisitInfo(b.visitInfo, mysql.DropPriv, v.Table.Schema.L, v.Table.Name.L, "", authErr) + } + case *ast.FlashBackTableStmt: + if b.ctx.GetSessionVars().User != nil { + authErr = ErrTableaccessDenied.GenWithStackByArgs("CREATE", b.ctx.GetSessionVars().User.AuthUsername, + b.ctx.GetSessionVars().User.AuthHostname, v.Table.Name.L) + } + b.visitInfo = appendVisitInfo(b.visitInfo, mysql.CreatePriv, v.Table.Schema.L, v.Table.Name.L, "", authErr) + if b.ctx.GetSessionVars().User != nil { + authErr = ErrTableaccessDenied.GenWithStackByArgs("DROP", b.ctx.GetSessionVars().User.AuthUsername, + b.ctx.GetSessionVars().User.AuthHostname, v.Table.Name.L) + } + b.visitInfo = appendVisitInfo(b.visitInfo, mysql.DropPriv, v.Table.Schema.L, v.Table.Name.L, "", authErr) + case *ast.FlashBackDatabaseStmt: + if b.ctx.GetSessionVars().User != nil { + authErr = ErrDBaccessDenied.GenWithStackByArgs(b.ctx.GetSessionVars().User.AuthUsername, + b.ctx.GetSessionVars().User.AuthHostname, v.DBName.L) + } + b.visitInfo = appendVisitInfo(b.visitInfo, mysql.CreatePriv, v.DBName.L, "", "", authErr) + b.visitInfo = appendVisitInfo(b.visitInfo, mysql.DropPriv, v.DBName.L, "", "", authErr) case *ast.FlashBackToTimestampStmt: // Flashback cluster can only be executed by user with `super` privilege. b.visitInfo = appendVisitInfo(b.visitInfo, mysql.SuperPriv, "", "", "", nil) @@ -4606,6 +4783,9 @@ func (b *PlanBuilder) buildDDL(ctx context.Context, node ast.DDLNode) (Plan, err case *ast.DropPlacementPolicyStmt, *ast.CreatePlacementPolicyStmt, *ast.AlterPlacementPolicyStmt: err := ErrSpecificAccessDenied.GenWithStackByArgs("SUPER or PLACEMENT_ADMIN") b.visitInfo = appendDynamicVisitInfo(b.visitInfo, "PLACEMENT_ADMIN", false, err) + case *ast.CreateResourceGroupStmt, *ast.DropResourceGroupStmt, *ast.AlterResourceGroupStmt: + err := ErrSpecificAccessDenied.GenWithStackByArgs("SUPER or RESOURCE_GROUP_ADMIN") + b.visitInfo = appendDynamicVisitInfo(b.visitInfo, "RESOURCE_GROUP_ADMIN", false, err) } p := &DDL{Statement: node} return p, nil @@ -4886,6 +5066,8 @@ func buildShowSchema(s *ast.ShowStmt, isView bool, isSequence bool) (schema *exp } case ast.ShowCreatePlacementPolicy: names = []string{"Policy", "Create Policy"} + case ast.ShowCreateResourceGroup: + names = []string{"Resource_Group", "Create Resource Group"} case ast.ShowCreateUser: if s.User != nil { names = []string{fmt.Sprintf("CREATE USER for %s", s.User)} @@ -4966,8 +5148,8 @@ func buildShowSchema(s *ast.ShowStmt, isView bool, isSequence bool) (schema *exp names = []string{"Privilege", "Context", "Comment"} ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar} case ast.ShowBindings: - names = []string{"Original_sql", "Bind_sql", "Default_db", "Status", "Create_time", "Update_time", "Charset", "Collation", "Source"} - ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeDatetime, mysql.TypeDatetime, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar} + names = []string{"Original_sql", "Bind_sql", "Default_db", "Status", "Create_time", "Update_time", "Charset", "Collation", "Source", "Sql_digest", "Plan_digest"} + ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeDatetime, mysql.TypeDatetime, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar} case ast.ShowBindingCacheStatus: names = []string{"bindings_in_cache", "bindings_in_table", "memory_usage", "memory_quota"} ftypes = []byte{mysql.TypeLonglong, mysql.TypeLonglong, mysql.TypeVarchar, mysql.TypeVarchar} @@ -5015,7 +5197,8 @@ func buildShowSchema(s *ast.ShowStmt, isView bool, isSequence bool) (schema *exp } func (b *PlanBuilder) buildPlanReplayer(pc *ast.PlanReplayerStmt) Plan { - p := &PlanReplayer{ExecStmt: pc.Stmt, Analyze: pc.Analyze, Load: pc.Load, File: pc.File} + p := &PlanReplayer{ExecStmt: pc.Stmt, Analyze: pc.Analyze, Load: pc.Load, File: pc.File, + Capture: pc.Capture, Remove: pc.Remove, SQLDigest: pc.SQLDigest, PlanDigest: pc.PlanDigest} schema := newColumnsWithNames(1) schema.Append(buildColumnWithName("", "File_token", mysql.TypeVarchar, 128)) p.SetSchema(schema.col2Schema()) diff --git a/planner/core/planbuilder_test.go b/planner/core/planbuilder_test.go index 13494433f0fbe..8ad1d5c49c0e2 100644 --- a/planner/core/planbuilder_test.go +++ b/planner/core/planbuilder_test.go @@ -91,6 +91,11 @@ func TestGetPathByIndexName(t *testing.T) { require.NotNil(t, path) require.Equal(t, accessPath[1], path) + // "id" is a prefix of "idx" + path = getPathByIndexName(accessPath, model.NewCIStr("id"), tblInfo) + require.NotNil(t, path) + require.Equal(t, accessPath[1], path) + path = getPathByIndexName(accessPath, model.NewCIStr("primary"), tblInfo) require.NotNil(t, path) require.Equal(t, accessPath[0], path) diff --git a/planner/core/point_get_plan.go b/planner/core/point_get_plan.go index de69438257f4e..e80fd32fc3414 100644 --- a/planner/core/point_get_plan.go +++ b/planner/core/point_get_plan.go @@ -22,6 +22,7 @@ import ( "unsafe" "github.com/pingcap/errors" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" @@ -608,7 +609,7 @@ func getLockWaitTime(ctx sessionctx.Context, lockInfo *ast.SelectLockInfo) (lock // autocommit to 0. If autocommit is enabled, the rows matching the specification are not locked. // See https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html sessVars := ctx.GetSessionVars() - if !sessVars.IsAutocommit() || sessVars.InTxn() { + if !sessVars.IsAutocommit() || sessVars.InTxn() || config.GetGlobalConfig().PessimisticTxn.PessimisticAutoCommit.Load() { lock = true waitTime = sessVars.LockWaitTimeout if lockInfo.LockType == ast.SelectLockForUpdateWaitN { @@ -730,7 +731,7 @@ func newBatchPointGetPlan( } } for _, idxInfo := range tbl.Indices { - if !idxInfo.Unique || idxInfo.State != model.StatePublic || idxInfo.Invisible || + if !idxInfo.Unique || idxInfo.State != model.StatePublic || idxInfo.Invisible || idxInfo.MVIndex || !indexIsAvailableByHints(idxInfo, indexHints) { continue } @@ -1098,7 +1099,7 @@ func tryPointGetPlan(ctx sessionctx.Context, selStmt *ast.SelectStmt, check bool var err error for _, idxInfo := range tbl.Indices { - if !idxInfo.Unique || idxInfo.State != model.StatePublic || idxInfo.Invisible || + if !idxInfo.Unique || idxInfo.State != model.StatePublic || idxInfo.Invisible || idxInfo.MVIndex || !indexIsAvailableByHints(idxInfo, tblName.IndexHints) { continue } @@ -1354,7 +1355,7 @@ func getNameValuePairs(ctx sessionctx.Context, tbl *model.TableInfo, tblName mod case *driver.ValueExpr: d = x.Datum case *driver.ParamMarkerExpr: - con, err = expression.ParamMarkerExpression(ctx, x, true) + con, err = expression.ParamMarkerExpression(ctx, x, false) if err != nil { return nil, false } @@ -1368,7 +1369,7 @@ func getNameValuePairs(ctx sessionctx.Context, tbl *model.TableInfo, tblName mod case *driver.ValueExpr: d = x.Datum case *driver.ParamMarkerExpr: - con, err = expression.ParamMarkerExpression(ctx, x, true) + con, err = expression.ParamMarkerExpression(ctx, x, false) if err != nil { return nil, false } @@ -1687,10 +1688,12 @@ func buildPointDeletePlan(ctx sessionctx.Context, pointPlan PhysicalPlan, dbName var err error is := sessiontxn.GetTxnManager(ctx).GetTxnInfoSchema() t, _ := is.TableByID(tbl.ID) - tblID2Table := map[int64]table.Table{tbl.ID: t} - err = delPlan.buildOnDeleteFKTriggers(ctx, is, tblID2Table) - if err != nil { - return nil + if t != nil { + tblID2Table := map[int64]table.Table{tbl.ID: t} + err = delPlan.buildOnDeleteFKTriggers(ctx, is, tblID2Table) + if err != nil { + return nil + } } return delPlan } @@ -1895,12 +1898,7 @@ func getPartitionExpr(ctx sessionctx.Context, tbl *model.TableInfo) *tables.Part } // PartitionExpr don't need columns and names for hash partition. - partitionExpr, err := partTable.PartitionExpr() - if err != nil { - return nil - } - - return partitionExpr + return partTable.PartitionExpr() } func getHashPartitionColumnName(ctx sessionctx.Context, tbl *model.TableInfo) *ast.ColumnName { @@ -1917,10 +1915,7 @@ func getHashPartitionColumnName(ctx sessionctx.Context, tbl *model.TableInfo) *a return nil } // PartitionExpr don't need columns and names for hash partition. - partitionExpr, err := table.(partitionTable).PartitionExpr() - if err != nil { - return nil - } + partitionExpr := table.(partitionTable).PartitionExpr() expr := partitionExpr.OrigExpr col, ok := expr.(*ast.ColumnNameExpr) if !ok { diff --git a/planner/core/point_get_plan_test.go b/planner/core/point_get_plan_test.go index 7801631325f37..812151afc26ec 100644 --- a/planner/core/point_get_plan_test.go +++ b/planner/core/point_get_plan_test.go @@ -189,7 +189,7 @@ func TestGetExtraColumn(t *testing.T) { tk.MustQuery(`explain format='brief' select t.*, _tidb_rowid from t where a = 1`).Check(testkit.Rows(`Point_Get 1.00 root table:t, index:idx(a) `)) tk.MustExec(`commit`) tk.MustQuery(`explain format='brief' select count(_tidb_rowid) from t where a=1`).Check(testkit.Rows( - `HashAgg 1.00 root funcs:count(test.t._tidb_rowid)->Column#4`, + `StreamAgg 1.00 root funcs:count(test.t._tidb_rowid)->Column#4`, `└─Point_Get 1.00 root table:t, index:idx(a) `)) tk.MustQuery(`explain format='brief' select *, date_format(b, "") from t where a =1 for update`).Check(testkit.Rows( `Projection 1.00 root test.t.a, test.t.b, date_format(cast(test.t.b, datetime BINARY), )->Column#4`, diff --git a/planner/core/predicate_simplification_test.go b/planner/core/predicate_simplification_test.go new file mode 100644 index 0000000000000..673c793d41013 --- /dev/null +++ b/planner/core/predicate_simplification_test.go @@ -0,0 +1,63 @@ +// Copyright 2023 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 core_test + +import ( + "context" + "fmt" + "testing" + + "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/parser" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/planner" + "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/sessiontxn" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/testkit/testdata" + "github.com/stretchr/testify/require" +) + +// Test redundant conditions in single table and join predicates. +func TestRemoveRedundantPredicates(t *testing.T) { + store := testkit.CreateMockStore(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("set tidb_cost_model_version=2") + tk.MustExec("set tidb_opt_limit_push_down_threshold=0") + var input []string + var output []struct { + SQL string + Best string + } + planSuiteData := core.GetPlanSuiteData() + planSuiteData.LoadTestCases(t, &input, &output) + p := parser.New() + is := infoschema.MockInfoSchema([]*model.TableInfo{core.MockSignedTable(), core.MockUnsignedTable()}) + for i, tt := range input { + comment := fmt.Sprintf("case: %v, sql: %s", i, tt) + stmt, err := p.ParseOneStmt(tt, "", "") + require.NoError(t, err, comment) + require.NoError(t, sessiontxn.NewTxn(context.Background(), tk.Session())) + p, _, err := planner.Optimize(context.TODO(), tk.Session(), stmt, is) + require.NoError(t, err) + testdata.OnRecord(func() { + output[i].SQL = tt + output[i].Best = core.ToString(p) + }) + require.Equal(t, output[i].Best, core.ToString(p), comment) + } +} diff --git a/planner/core/prepare_test.go b/planner/core/prepare_test.go index 2cb5cca6ab4d6..c217cafbdb242 100644 --- a/planner/core/prepare_test.go +++ b/planner/core/prepare_test.go @@ -60,7 +60,7 @@ func TestPointGetPreparedPlan4PlanCache(t *testing.T) { pspk1Id, _, _, err := tk1.Session().PrepareStmt("select * from t where a = ?") require.NoError(t, err) - tk1.Session().GetSessionVars().PreparedStmts[pspk1Id].(*core.PlanCacheStmt).PreparedAst.UseCache = false + tk1.Session().GetSessionVars().PreparedStmts[pspk1Id].(*core.PlanCacheStmt).StmtCacheable = false ctx := context.Background() // first time plan generated @@ -1339,7 +1339,7 @@ func TestPlanCacheSwitchDB(t *testing.T) { // DB is not specified se2, err := session.CreateSession4TestWithOpt(store, &session.Opt{ - PreparedPlanCache: core.NewLRUPlanCache(100, 0.1, math.MaxUint64, core.PickPlanFromBucket, tk.Session()), + PreparedPlanCache: core.NewLRUPlanCache(100, 0.1, math.MaxUint64, tk.Session()), }) require.NoError(t, err) tk2 := testkit.NewTestKitWithSession(t, store, se2) @@ -1373,7 +1373,6 @@ func TestPlanCacheSwitchDB(t *testing.T) { } func TestPlanCacheHitInfo(t *testing.T) { - t.Skip("unstable, skip it and fix it before 20210705") store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) tk.MustExec(`set tidb_enable_prepared_plan_cache=1`) @@ -1940,7 +1939,7 @@ func TestPlanCachePointGetAndTableDual(t *testing.T) { tk.MustQuery("execute s0 using @a0, @b0, @a0").Check(testkit.Rows()) tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) tk.MustQuery("execute s0 using @a0, @a0, @b0").Check(testkit.Rows("0000 7777 1")) - tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) tk.MustExec("create table t1(c1 varchar(20), c2 varchar(20), c3 bigint(20), primary key(c1, c2))") tk.MustExec("insert into t1 values('0000','7777',1)") diff --git a/planner/core/preprocess.go b/planner/core/preprocess.go index d059139bd7159..c5a2a9999db90 100644 --- a/planner/core/preprocess.go +++ b/planner/core/preprocess.go @@ -298,16 +298,21 @@ func (p *preprocessor) Enter(in ast.Node) (out ast.Node, skipChildren bool) { p.checkNonUniqTableAlias(node) case *ast.CreateBindingStmt: p.stmtTp = TypeCreate - EraseLastSemicolon(node.OriginNode) - EraseLastSemicolon(node.HintedNode) - p.checkBindGrammar(node.OriginNode, node.HintedNode, p.sctx.GetSessionVars().CurrentDB) + if node.OriginNode != nil { + // if node.PlanDigest is not empty, this binding will be created from history, the node.OriginNode and node.HintedNode should be nil + EraseLastSemicolon(node.OriginNode) + EraseLastSemicolon(node.HintedNode) + p.checkBindGrammar(node.OriginNode, node.HintedNode, p.sctx.GetSessionVars().CurrentDB) + } return in, true case *ast.DropBindingStmt: p.stmtTp = TypeDrop - EraseLastSemicolon(node.OriginNode) - if node.HintedNode != nil { - EraseLastSemicolon(node.HintedNode) - p.checkBindGrammar(node.OriginNode, node.HintedNode, p.sctx.GetSessionVars().CurrentDB) + if node.OriginNode != nil { + EraseLastSemicolon(node.OriginNode) + if node.HintedNode != nil { + EraseLastSemicolon(node.HintedNode) + p.checkBindGrammar(node.OriginNode, node.HintedNode, p.sctx.GetSessionVars().CurrentDB) + } } return in, true case *ast.RecoverTableStmt: @@ -1825,15 +1830,14 @@ func tryLockMDLAndUpdateSchemaIfNecessary(sctx sessionctx.Context, dbName model. } domainSchema := domain.GetDomain(sctx).InfoSchema() domainSchemaVer := domainSchema.SchemaMetaVersion() - if !skipLock { - sctx.GetSessionVars().GetRelatedTableForMDL().Store(tableInfo.ID, domainSchemaVer) - } - var err error tbl, err = domainSchema.TableByName(dbName, tableInfo.Name) if err != nil { return nil, err } + if !skipLock { + sctx.GetSessionVars().GetRelatedTableForMDL().Store(tbl.Meta().ID, domainSchemaVer) + } // Check the table change, if adding new public index or modify a column, we need to handle them. if !sctx.GetSessionVars().IsPessimisticReadConsistency() { var copyTableInfo *model.TableInfo diff --git a/planner/core/rule_aggregation_push_down.go b/planner/core/rule_aggregation_push_down.go index c9326929b550f..24aef4161a8ec 100644 --- a/planner/core/rule_aggregation_push_down.go +++ b/planner/core/rule_aggregation_push_down.go @@ -405,6 +405,12 @@ func (a *aggregationPushDownSolver) pushAggCrossUnion(agg *LogicalAggregation, u if err != nil { return nil, err } + // Update mode of new generated firstRow as other agg funcs. + if len(agg.AggFuncs) != 0 { + firstRow.Mode = agg.AggFuncs[0].Mode + } else { + firstRow.Mode = aggregation.Partial1Mode + } newAgg.AggFuncs = append(newAgg.AggFuncs, firstRow) } tmpSchema := expression.NewSchema(newAgg.GetGroupByCols()...) diff --git a/planner/core/rule_column_pruning.go b/planner/core/rule_column_pruning.go index 5eac4a88e88bd..34a5259abbd32 100644 --- a/planner/core/rule_column_pruning.go +++ b/planner/core/rule_column_pruning.go @@ -339,19 +339,7 @@ func (ds *DataSource) PruneColumns(parentUsedCols []*expression.Column, opt *log if ds.schema.Len() == 0 { var handleCol *expression.Column var handleColInfo *model.ColumnInfo - if ds.table.Type().IsClusterTable() && len(originColumns) > 0 { - // use the first line. - handleCol = originSchemaColumns[0] - handleColInfo = originColumns[0] - } else { - if ds.handleCols != nil { - handleCol = ds.handleCols.GetCol(0) - handleColInfo = handleCol.ToInfo() - } else { - handleCol = ds.newExtraHandleSchemaCol() - handleColInfo = model.NewExtraHandleColInfo() - } - } + handleCol, handleColInfo = preferKeyColumnFromTable(ds, originSchemaColumns, originColumns) ds.Columns = append(ds.Columns, handleColInfo) ds.schema.Append(handleCol) } @@ -658,3 +646,23 @@ func appendItemPruneTraceStep(p LogicalPlan, itemType string, prunedObjects []fm } opt.appendStepToCurrent(p.ID(), p.TP(), reason, action) } + +func preferKeyColumnFromTable(dataSource *DataSource, originColumns []*expression.Column, + originSchemaColumns []*model.ColumnInfo) (*expression.Column, *model.ColumnInfo) { + var resultColumnInfo *model.ColumnInfo + var resultColumn *expression.Column + if dataSource.table.Type().IsClusterTable() && len(originColumns) > 0 { + // use the first column. + resultColumnInfo = originSchemaColumns[0] + resultColumn = originColumns[0] + } else { + if dataSource.handleCols != nil { + resultColumn = dataSource.handleCols.GetCol(0) + resultColumnInfo = resultColumn.ToInfo() + } else { + resultColumn = dataSource.newExtraHandleSchemaCol() + resultColumnInfo = model.NewExtraHandleColInfo() + } + } + return resultColumn, resultColumnInfo +} diff --git a/planner/core/rule_derive_topn_from_window.go b/planner/core/rule_derive_topn_from_window.go new file mode 100644 index 0000000000000..cd60cca1c08e0 --- /dev/null +++ b/planner/core/rule_derive_topn_from_window.go @@ -0,0 +1,122 @@ +// Copyright 2023 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 core + +import ( + "context" + "fmt" + + "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/planner/util" +) + +// deriveTopNFromWindow pushes down the topN or limit. In the future we will remove the limit from `requiredProperty` in CBO phase. +type deriveTopNFromWindow struct { +} + +func appendDerivedTopNTrace(topN LogicalPlan, opt *logicalOptimizeOp) { + child := topN.Children()[0] + action := func() string { + return fmt.Sprintf("%v_%v top N added below %v_%v ", topN.TP(), topN.ID(), child.TP(), child.ID()) + } + reason := func() string { + return fmt.Sprintf("%v filter on row number", topN.TP()) + } + opt.appendStepToCurrent(topN.ID(), topN.TP(), reason, action) +} + +/* + Check the following pattern of filter over row number window function: + - Filter is simple condition of row_number < value or row_number <= value + - The window function is a simple row number + - With default frame: rows between current row and current row. Check is not necessary since + current row is only frame applicable to row number + - No partition + - Child is a data source. +*/ +func windowIsTopN(p *LogicalSelection) (bool, uint64) { + // Check if child is window function. + child, isLogicalWindow := p.Children()[0].(*LogicalWindow) + if !isLogicalWindow { + return false, 0 + } + + if len(p.Conditions) != 1 { + return false, 0 + } + + // Check if filter is column < constant or column <= constant. If it is in this form find column and constant. + column, limitValue := expression.FindUpperBound(p.Conditions[0]) + if column == nil || limitValue <= 0 { + return false, 0 + } + + // Check if filter on window function + windowColumns := child.GetWindowResultColumns() + if len(windowColumns) != 1 || !(column.Equal(p.ctx, windowColumns[0])) { + return false, 0 + } + + grandChild := child.Children()[0] + _, isDataSource := grandChild.(*DataSource) + if !isDataSource { + return false, 0 + } + if len(child.WindowFuncDescs) == 1 && child.WindowFuncDescs[0].Name == "row_number" && len(child.PartitionBy) == 0 && + child.Frame.Type == ast.Rows && child.Frame.Start.Type == ast.CurrentRow && child.Frame.End.Type == ast.CurrentRow { + return true, uint64(limitValue) + } + return false, 0 +} + +func (s *deriveTopNFromWindow) optimize(_ context.Context, p LogicalPlan, opt *logicalOptimizeOp) (LogicalPlan, error) { + return p.deriveTopN(opt), nil +} + +func (s *baseLogicalPlan) deriveTopN(opt *logicalOptimizeOp) LogicalPlan { + p := s.self + for i, child := range p.Children() { + newChild := child.deriveTopN(opt) + p.SetChild(i, newChild) + } + return p +} + +func (s *LogicalSelection) deriveTopN(opt *logicalOptimizeOp) LogicalPlan { + p := s.self.(*LogicalSelection) + windowIsTopN, limitValue := windowIsTopN(p) + if windowIsTopN { + child := p.Children()[0].(*LogicalWindow) + grandChild := child.Children()[0].(*DataSource) + // Build order by for derived Limit + byItems := make([]*util.ByItems, 0, len(child.OrderBy)) + for _, col := range child.OrderBy { + byItems = append(byItems, &util.ByItems{Expr: col.Col, Desc: col.Desc}) + } + // Build derived Limit + derivedTopN := LogicalTopN{Count: limitValue, ByItems: byItems}.Init(grandChild.ctx, grandChild.blockOffset) + derivedTopN.SetChildren(grandChild) + /* return datasource->topN->window */ + child.SetChildren(derivedTopN) + appendDerivedTopNTrace(child, opt) + return child + } + return p +} + +func (*deriveTopNFromWindow) name() string { + return "derive_topn_from_window" +} diff --git a/planner/core/rule_derive_topn_from_window_test.go b/planner/core/rule_derive_topn_from_window_test.go new file mode 100644 index 0000000000000..c241523457e42 --- /dev/null +++ b/planner/core/rule_derive_topn_from_window_test.go @@ -0,0 +1,85 @@ +// Copyright 2023 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 core_test + +import ( + "testing" + + plannercore "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/testkit/testdata" +) + +// Rule should bot be applied +func TestPushDerivedTopnNegative(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists employee") + tk.MustExec("create table t(a int, b int)") + tk.MustExec("insert into t values(1,1)") + tk.MustExec("insert into t values(2,1)") + tk.MustExec("insert into t values(3,2)") + tk.MustExec("insert into t values(4,2)") + tk.MustExec("insert into t values(5,2)") + var input Input + var output []struct { + SQL string + Plan []string + } + suiteData := plannercore.GetDerivedTopNSuiteData() + suiteData.LoadTestCases(t, &input, &output) + for i, sql := range input { + plan := tk.MustQuery("explain format = 'brief' " + sql) + testdata.OnRecord(func() { + output[i].SQL = sql + output[i].Plan = testdata.ConvertRowsToStrings(plan.Rows()) + }) + plan.Check(testkit.Rows(output[i].Plan...)) + } +} + +// Rule should be applied +func TestPushDerivedTopnPositive(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists employee") + tk.MustExec("create table t(a int, b int)") + tk.MustExec("insert into t values(1,1)") + tk.MustExec("insert into t values(2,1)") + tk.MustExec("insert into t values(3,2)") + tk.MustExec("insert into t values(4,2)") + tk.MustExec("insert into t values(5,2)") + var input Input + var output []struct { + SQL string + Plan []string + Res []string + } + suiteData := plannercore.GetDerivedTopNSuiteData() + suiteData.LoadTestCases(t, &input, &output) + for i, sql := range input { + plan := tk.MustQuery("explain format = 'brief' " + sql) + res := tk.MustQuery(sql) + testdata.OnRecord(func() { + output[i].SQL = sql + output[i].Plan = testdata.ConvertRowsToStrings(plan.Rows()) + output[i].Res = testdata.ConvertRowsToStrings(res.Rows()) + }) + plan.Check(testkit.Rows(output[i].Plan...)) + res.Check(testkit.Rows(output[i].Res...)) + } +} diff --git a/planner/core/rule_generate_column_substitute.go b/planner/core/rule_generate_column_substitute.go index c796f99af62c5..88039392bf1a3 100644 --- a/planner/core/rule_generate_column_substitute.go +++ b/planner/core/rule_generate_column_substitute.go @@ -15,12 +15,11 @@ package core import ( + "bytes" "context" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/parser/ast" - "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" ) @@ -37,13 +36,13 @@ type ExprColumnMap map[expression.Expression]*expression.Column // For example: select a+1 from t order by a+1, with a virtual generate column c as (a+1) and // an index on c. We need to replace a+1 with c so that we can use the index on c. // See also https://dev.mysql.com/doc/refman/8.0/en/generated-column-index-optimizations.html -func (gc *gcSubstituter) optimize(ctx context.Context, lp LogicalPlan, _ *logicalOptimizeOp) (LogicalPlan, error) { +func (gc *gcSubstituter) optimize(ctx context.Context, lp LogicalPlan, opt *logicalOptimizeOp) (LogicalPlan, error) { exprToColumn := make(ExprColumnMap) collectGenerateColumn(lp, exprToColumn) if len(exprToColumn) == 0 { return lp, nil } - return gc.substitute(ctx, lp, exprToColumn), nil + return gc.substitute(ctx, lp, exprToColumn, opt), nil } // collectGenerateColumn collect the generate column and save them to a map from their expressions to themselves. @@ -74,18 +73,33 @@ func collectGenerateColumn(lp LogicalPlan, exprToColumn ExprColumnMap) { } } -func tryToSubstituteExpr(expr *expression.Expression, sctx sessionctx.Context, candidateExpr expression.Expression, tp types.EvalType, schema *expression.Schema, col *expression.Column) { - if (*expr).Equal(sctx, candidateExpr) && candidateExpr.GetType().EvalType() == tp && +func tryToSubstituteExpr(expr *expression.Expression, lp LogicalPlan, candidateExpr expression.Expression, tp types.EvalType, schema *expression.Schema, col *expression.Column, opt *logicalOptimizeOp) { + if (*expr).Equal(lp.SCtx(), candidateExpr) && candidateExpr.GetType().EvalType() == tp && schema.ColumnIndex(col) != -1 { *expr = col + appendSubstituteColumnStep(lp, candidateExpr, col, opt) } } -func substituteExpression(cond expression.Expression, sctx *stmtctx.StatementContext, sessionCtx sessionctx.Context, exprToColumn ExprColumnMap, schema *expression.Schema) { +func appendSubstituteColumnStep(lp LogicalPlan, candidateExpr expression.Expression, col *expression.Column, opt *logicalOptimizeOp) { + reason := func() string { return "" } + action := func() string { + buffer := bytes.NewBufferString("expression:") + buffer.WriteString(candidateExpr.String()) + buffer.WriteString(" substituted by") + buffer.WriteString(" column:") + buffer.WriteString(col.String()) + return buffer.String() + } + opt.appendStepToCurrent(lp.ID(), lp.TP(), reason, action) +} + +func substituteExpression(cond expression.Expression, lp LogicalPlan, exprToColumn ExprColumnMap, schema *expression.Schema, opt *logicalOptimizeOp) { sf, ok := cond.(*expression.ScalarFunction) if !ok { return } + sctx := lp.SCtx().GetSessionVars().StmtCtx defer func() { // If the argument is not changed, hash code doesn't need to recount again. // But we always do it to keep the code simple and stupid. @@ -96,10 +110,10 @@ func substituteExpression(cond expression.Expression, sctx *stmtctx.StatementCon switch sf.FuncName.L { case ast.EQ, ast.LT, ast.LE, ast.GT, ast.GE: for candidateExpr, column := range exprToColumn { - tryToSubstituteExpr(&sf.GetArgs()[1], sessionCtx, candidateExpr, sf.GetArgs()[0].GetType().EvalType(), schema, column) + tryToSubstituteExpr(&sf.GetArgs()[1], lp, candidateExpr, sf.GetArgs()[0].GetType().EvalType(), schema, column, opt) } for candidateExpr, column := range exprToColumn { - tryToSubstituteExpr(&sf.GetArgs()[0], sessionCtx, candidateExpr, sf.GetArgs()[1].GetType().EvalType(), schema, column) + tryToSubstituteExpr(&sf.GetArgs()[0], lp, candidateExpr, sf.GetArgs()[1].GetType().EvalType(), schema, column, opt) } case ast.In: expr = &sf.GetArgs()[0] @@ -115,43 +129,42 @@ func substituteExpression(cond expression.Expression, sctx *stmtctx.StatementCon } if canSubstitute { for candidateExpr, column := range exprToColumn { - tryToSubstituteExpr(expr, sessionCtx, candidateExpr, tp, schema, column) + tryToSubstituteExpr(expr, lp, candidateExpr, tp, schema, column, opt) } } case ast.Like: expr = &sf.GetArgs()[0] tp = sf.GetArgs()[1].GetType().EvalType() for candidateExpr, column := range exprToColumn { - tryToSubstituteExpr(expr, sessionCtx, candidateExpr, tp, schema, column) + tryToSubstituteExpr(expr, lp, candidateExpr, tp, schema, column, opt) } case ast.LogicOr, ast.LogicAnd: - substituteExpression(sf.GetArgs()[0], sctx, sessionCtx, exprToColumn, schema) - substituteExpression(sf.GetArgs()[1], sctx, sessionCtx, exprToColumn, schema) + substituteExpression(sf.GetArgs()[0], lp, exprToColumn, schema, opt) + substituteExpression(sf.GetArgs()[1], lp, exprToColumn, schema, opt) case ast.UnaryNot: - substituteExpression(sf.GetArgs()[0], sctx, sessionCtx, exprToColumn, schema) + substituteExpression(sf.GetArgs()[0], lp, exprToColumn, schema, opt) } } -func (gc *gcSubstituter) substitute(ctx context.Context, lp LogicalPlan, exprToColumn ExprColumnMap) LogicalPlan { - sctx := lp.SCtx().GetSessionVars().StmtCtx +func (gc *gcSubstituter) substitute(ctx context.Context, lp LogicalPlan, exprToColumn ExprColumnMap, opt *logicalOptimizeOp) LogicalPlan { var tp types.EvalType switch x := lp.(type) { case *LogicalSelection: for _, cond := range x.Conditions { - substituteExpression(cond, sctx, lp.SCtx(), exprToColumn, x.Schema()) + substituteExpression(cond, lp, exprToColumn, x.Schema(), opt) } case *LogicalProjection: for i := range x.Exprs { tp = x.Exprs[i].GetType().EvalType() for candidateExpr, column := range exprToColumn { - tryToSubstituteExpr(&x.Exprs[i], lp.SCtx(), candidateExpr, tp, x.children[0].Schema(), column) + tryToSubstituteExpr(&x.Exprs[i], lp, candidateExpr, tp, x.children[0].Schema(), column, opt) } } case *LogicalSort: for i := range x.ByItems { tp = x.ByItems[i].Expr.GetType().EvalType() for candidateExpr, column := range exprToColumn { - tryToSubstituteExpr(&x.ByItems[i].Expr, lp.SCtx(), candidateExpr, tp, x.Schema(), column) + tryToSubstituteExpr(&x.ByItems[i].Expr, lp, candidateExpr, tp, x.Schema(), column, opt) } } case *LogicalAggregation: @@ -162,6 +175,7 @@ func (gc *gcSubstituter) substitute(ctx context.Context, lp LogicalPlan, exprToC if aggFunc.Args[i].Equal(lp.SCtx(), candidateExpr) && candidateExpr.GetType().EvalType() == tp && x.Schema().ColumnIndex(column) != -1 { aggFunc.Args[i] = column + appendSubstituteColumnStep(lp, candidateExpr, column, opt) } } } @@ -172,12 +186,13 @@ func (gc *gcSubstituter) substitute(ctx context.Context, lp LogicalPlan, exprToC if x.GroupByItems[i].Equal(lp.SCtx(), candidateExpr) && candidateExpr.GetType().EvalType() == tp && x.Schema().ColumnIndex(column) != -1 { x.GroupByItems[i] = column + appendSubstituteColumnStep(lp, candidateExpr, column, opt) } } } } for _, child := range lp.Children() { - gc.substitute(ctx, child, exprToColumn) + gc.substitute(ctx, child, exprToColumn, opt) } return lp } diff --git a/planner/core/rule_partition_processor.go b/planner/core/rule_partition_processor.go index d188854686491..5982bcb32d6ba 100644 --- a/planner/core/rule_partition_processor.go +++ b/planner/core/rule_partition_processor.go @@ -110,7 +110,7 @@ func (s *partitionProcessor) rewriteDataSource(lp LogicalPlan, opt *logicalOptim // partitionTable is for those tables which implement partition. type partitionTable interface { - PartitionExpr() (*tables.PartitionExpr, error) + PartitionExpr() *tables.PartitionExpr } func generateHashPartitionExpr(ctx sessionctx.Context, pi *model.PartitionInfo, columns []*expression.Column, names types.NameSlice) (expression.Expression, error) { @@ -288,7 +288,8 @@ func (s *partitionProcessor) pruneHashPartition(ctx sessionctx.Context, tbl tabl // please see https://github.com/pingcap/tidb/issues/22635 for more details. func (s *partitionProcessor) reconstructTableColNames(ds *DataSource) ([]*types.FieldName, error) { names := make([]*types.FieldName, 0, len(ds.TblCols)) - colsInfo := ds.table.FullHiddenColsAndVisibleCols() + // Use DeletableCols to get all the columns. + colsInfo := ds.table.DeletableCols() colsInfoMap := make(map[int64]*table.Column, len(colsInfo)) for _, c := range colsInfo { colsInfoMap[c.ID] = c @@ -594,13 +595,11 @@ func (l *listPartitionPruner) findUsedListPartitions(conds []expression.Expressi func (s *partitionProcessor) findUsedListPartitions(ctx sessionctx.Context, tbl table.Table, partitionNames []model.CIStr, conds []expression.Expression) ([]int, error) { pi := tbl.Meta().Partition - partExpr, err := tbl.(partitionTable).PartitionExpr() - if err != nil { - return nil, err - } + partExpr := tbl.(partitionTable).PartitionExpr() listPruner := newListPartitionPruner(ctx, tbl, partitionNames, s, conds, partExpr.ForListPruning) var used map[int]struct{} + var err error if partExpr.ForListPruning.ColPrunes == nil { used, err = listPruner.findUsedListPartitions(conds) } else { @@ -825,10 +824,7 @@ func intersectionRange(start, end, newStart, newEnd int) (int, int) { func (s *partitionProcessor) pruneRangePartition(ctx sessionctx.Context, pi *model.PartitionInfo, tbl table.PartitionedTable, conds []expression.Expression, columns []*expression.Column, names types.NameSlice) (partitionRangeOR, error) { - partExpr, err := tbl.(partitionTable).PartitionExpr() - if err != nil { - return nil, err - } + partExpr := tbl.(partitionTable).PartitionExpr() // Partition by range columns. if len(pi.Columns) > 0 { diff --git a/planner/core/rule_topn_push_down.go b/planner/core/rule_topn_push_down.go index 5dacac7579caa..2b4998049911a 100644 --- a/planner/core/rule_topn_push_down.go +++ b/planner/core/rule_topn_push_down.go @@ -136,6 +136,20 @@ func (p *LogicalProjection) pushDownTopN(topN *LogicalTopN, opt *logicalOptimize topN.ByItems = append(topN.ByItems[:i], topN.ByItems[i+1:]...) } } + + // if topN.ByItems contains a column(with ID=0) generated by projection, projection will prevent the optimizer from pushing topN down. + for _, by := range topN.ByItems { + cols := expression.ExtractColumns(by.Expr) + for _, col := range cols { + if col.ID == 0 && p.Schema().Contains(col) { + // check whether the column is generated by projection + if !p.children[0].Schema().Contains(col) { + p.children[0] = p.children[0].pushDownTopN(nil, opt) + return topN.setChild(p, opt) + } + } + } + } } p.children[0] = p.children[0].pushDownTopN(topN, opt) return p diff --git a/planner/core/stats.go b/planner/core/stats.go index 6fe03f87d6a80..96065fccf12b5 100644 --- a/planner/core/stats.go +++ b/planner/core/stats.go @@ -22,9 +22,6 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/parser/ast" - "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/planner/property" "github.com/pingcap/tidb/planner/util" @@ -343,35 +340,37 @@ func (ds *DataSource) derivePathStatsAndTryHeuristics() error { if selected != nil { ds.possibleAccessPaths[0] = selected ds.possibleAccessPaths = ds.possibleAccessPaths[:1] - if ds.ctx.GetSessionVars().StmtCtx.InVerboseExplain { - var tableName string - if ds.TableAsName.O == "" { - tableName = ds.tableInfo.Name.O + var tableName string + if ds.TableAsName.O == "" { + tableName = ds.tableInfo.Name.O + } else { + tableName = ds.TableAsName.O + } + var sb strings.Builder + if selected.IsTablePath() { + // TODO: primary key / handle / real name? + sb.WriteString(fmt.Sprintf("handle of %s is selected since the path only has point ranges", tableName)) + } else { + if selected.Index.Unique { + sb.WriteString("unique ") + } + sb.WriteString(fmt.Sprintf("index %s of %s is selected since the path", selected.Index.Name.O, tableName)) + if isRefinedPath { + sb.WriteString(" only fetches limited number of rows") } else { - tableName = ds.TableAsName.O + sb.WriteString(" only has point ranges") } - if selected.IsTablePath() { - // TODO: primary key / handle / real name? - ds.ctx.GetSessionVars().StmtCtx.AppendNote(fmt.Errorf("handle of %s is selected since the path only has point ranges", tableName)) + if selected.IsSingleScan { + sb.WriteString(" with single scan") } else { - var sb strings.Builder - if selected.Index.Unique { - sb.WriteString("unique ") - } - sb.WriteString(fmt.Sprintf("index %s of %s is selected since the path", selected.Index.Name.O, tableName)) - if isRefinedPath { - sb.WriteString(" only fetches limited number of rows") - } else { - sb.WriteString(" only has point ranges") - } - if selected.IsSingleScan { - sb.WriteString(" with single scan") - } else { - sb.WriteString(" with double scan") - } - ds.ctx.GetSessionVars().StmtCtx.AppendNote(errors.New(sb.String())) + sb.WriteString(" with double scan") } } + if ds.ctx.GetSessionVars().StmtCtx.InVerboseExplain { + ds.ctx.GetSessionVars().StmtCtx.AppendNote(errors.New(sb.String())) + } else { + ds.ctx.GetSessionVars().StmtCtx.AppendExtraNote(errors.New(sb.String())) + } } return nil } @@ -409,95 +408,13 @@ func (ds *DataSource) DeriveStats(_ []*property.StatsInfo, _ *expression.Schema, return nil, err } - // Consider the IndexMergePath. Now, we just generate `IndexMergePath` in DNF case. - // Use allConds instread of pushedDownConds, - // because we want to use IndexMerge even if some expr cannot be pushed to TiKV. - // We will create new Selection for exprs that cannot be pushed in convertToIndexMergeScan. - indexMergeConds := make([]expression.Expression, 0, len(ds.allConds)) - for _, expr := range ds.allConds { - indexMergeConds = append(indexMergeConds, expression.PushDownNot(ds.ctx, expr)) - } - - stmtCtx := ds.ctx.GetSessionVars().StmtCtx - isPossibleIdxMerge := len(indexMergeConds) > 0 && len(ds.possibleAccessPaths) > 1 - sessionAndStmtPermission := (ds.ctx.GetSessionVars().GetEnableIndexMerge() || len(ds.indexMergeHints) > 0) && !stmtCtx.NoIndexMergeHint - // We current do not consider `IndexMergePath`: - // 1. If there is an index path. - // 2. TODO: If there exists exprs that cannot be pushed down. This is to avoid wrongly estRow of Selection added by rule_predicate_push_down. - needConsiderIndexMerge := true - if len(ds.indexMergeHints) == 0 { - for i := 1; i < len(ds.possibleAccessPaths); i++ { - if len(ds.possibleAccessPaths[i].AccessConds) != 0 { - needConsiderIndexMerge = false - break - } - } - if needConsiderIndexMerge { - // PushDownExprs() will append extra warnings, which is annoying. So we reset warnings here. - warnings := stmtCtx.GetWarnings() - _, remaining := expression.PushDownExprs(stmtCtx, indexMergeConds, ds.ctx.GetClient(), kv.UnSpecified) - stmtCtx.SetWarnings(warnings) - if len(remaining) != 0 { - needConsiderIndexMerge = false - } - } + if err := ds.generateIndexMergePath(); err != nil { + return nil, err } - if isPossibleIdxMerge && sessionAndStmtPermission && needConsiderIndexMerge && ds.tableInfo.TempTableType != model.TempTableLocal { - err := ds.generateAndPruneIndexMergePath(indexMergeConds, ds.indexMergeHints != nil) - if err != nil { - return nil, err - } - } else if len(ds.indexMergeHints) > 0 { - ds.indexMergeHints = nil - var msg string - if !isPossibleIdxMerge { - msg = "No available filter or available index." - } else if !sessionAndStmtPermission { - msg = "Got no_index_merge hint or tidb_enable_index_merge is off." - } else if ds.tableInfo.TempTableType == model.TempTableLocal { - msg = "Cannot use IndexMerge on temporary table." - } - msg = fmt.Sprintf("IndexMerge is inapplicable or disabled. %s", msg) - stmtCtx.AppendWarning(errors.Errorf(msg)) - logutil.BgLogger().Debug(msg) - } return ds.stats, nil } -func (ds *DataSource) generateAndPruneIndexMergePath(indexMergeConds []expression.Expression, needPrune bool) error { - regularPathCount := len(ds.possibleAccessPaths) - err := ds.generateIndexMergeOrPaths(indexMergeConds) - if err != nil { - return err - } - // If without hints, it means that `enableIndexMerge` is true - if len(ds.indexMergeHints) == 0 { - return nil - } - // With hints and without generated IndexMerge paths - if regularPathCount == len(ds.possibleAccessPaths) { - ds.indexMergeHints = nil - ds.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("IndexMerge is inapplicable")) - return nil - } - // Do not need to consider the regular paths in find_best_task(). - // So we can use index merge's row count as DataSource's row count. - if needPrune { - ds.possibleAccessPaths = ds.possibleAccessPaths[regularPathCount:] - minRowCount := ds.possibleAccessPaths[0].CountAfterAccess - for _, path := range ds.possibleAccessPaths { - if minRowCount < path.CountAfterAccess { - minRowCount = path.CountAfterAccess - } - } - if ds.stats.RowCount > minRowCount { - ds.stats = ds.tableStats.ScaleByExpectCnt(minRowCount) - } - } - return nil -} - // DeriveStats implements LogicalPlan DeriveStats interface. func (ts *LogicalTableScan) DeriveStats(_ []*property.StatsInfo, _ *expression.Schema, _ []*expression.Schema, _ [][]*expression.Column) (_ *property.StatsInfo, err error) { ts.Source.initStats(nil) @@ -550,210 +467,6 @@ func (is *LogicalIndexScan) DeriveStats(_ []*property.StatsInfo, selfSchema *exp return is.stats, nil } -// getIndexMergeOrPath generates all possible IndexMergeOrPaths. -func (ds *DataSource) generateIndexMergeOrPaths(filters []expression.Expression) error { - usedIndexCount := len(ds.possibleAccessPaths) - for i, cond := range filters { - sf, ok := cond.(*expression.ScalarFunction) - if !ok || sf.FuncName.L != ast.LogicOr { - continue - } - var partialPaths = make([]*util.AccessPath, 0, usedIndexCount) - dnfItems := expression.FlattenDNFConditions(sf) - for _, item := range dnfItems { - cnfItems := expression.SplitCNFItems(item) - itemPaths := ds.accessPathsForConds(cnfItems, usedIndexCount) - if len(itemPaths) == 0 { - partialPaths = nil - break - } - partialPath, err := ds.buildIndexMergePartialPath(itemPaths) - if err != nil { - return err - } - if partialPath == nil { - partialPaths = nil - break - } - partialPaths = append(partialPaths, partialPath) - } - // If all of the partialPaths use the same index, we will not use the indexMerge. - singlePath := true - for i := len(partialPaths) - 1; i >= 1; i-- { - if partialPaths[i].Index != partialPaths[i-1].Index { - singlePath = false - break - } - } - if singlePath { - continue - } - if len(partialPaths) > 1 { - possiblePath := ds.buildIndexMergeOrPath(filters, partialPaths, i) - if possiblePath == nil { - return nil - } - - accessConds := make([]expression.Expression, 0, len(partialPaths)) - for _, p := range partialPaths { - indexCondsForP := p.AccessConds[:] - indexCondsForP = append(indexCondsForP, p.IndexFilters...) - if len(indexCondsForP) > 0 { - accessConds = append(accessConds, expression.ComposeCNFCondition(ds.ctx, indexCondsForP...)) - } - } - accessDNF := expression.ComposeDNFCondition(ds.ctx, accessConds...) - sel, _, err := ds.tableStats.HistColl.Selectivity(ds.ctx, []expression.Expression{accessDNF}, nil) - if err != nil { - logutil.BgLogger().Debug("something wrong happened, use the default selectivity", zap.Error(err)) - sel = SelectionFactor - } - possiblePath.CountAfterAccess = sel * ds.tableStats.RowCount - ds.possibleAccessPaths = append(ds.possibleAccessPaths, possiblePath) - } - } - return nil -} - -// isInIndexMergeHints checks whether current index or primary key is in IndexMerge hints. -func (ds *DataSource) isInIndexMergeHints(name string) bool { - if len(ds.indexMergeHints) == 0 { - return true - } - for _, hint := range ds.indexMergeHints { - if hint.indexHint == nil || len(hint.indexHint.IndexNames) == 0 { - return true - } - for _, hintName := range hint.indexHint.IndexNames { - if strings.EqualFold(strings.ToLower(name), strings.ToLower(hintName.String())) { - return true - } - } - } - return false -} - -// accessPathsForConds generates all possible index paths for conditions. -func (ds *DataSource) accessPathsForConds(conditions []expression.Expression, usedIndexCount int) []*util.AccessPath { - var results = make([]*util.AccessPath, 0, usedIndexCount) - for i := 0; i < usedIndexCount; i++ { - path := &util.AccessPath{} - if ds.possibleAccessPaths[i].IsTablePath() { - if !ds.isInIndexMergeHints("primary") { - continue - } - if ds.tableInfo.IsCommonHandle { - path.IsCommonHandlePath = true - path.Index = ds.possibleAccessPaths[i].Index - } else { - path.IsIntHandlePath = true - } - err := ds.deriveTablePathStats(path, conditions, true) - if err != nil { - logutil.BgLogger().Debug("can not derive statistics of a path", zap.Error(err)) - continue - } - var unsignedIntHandle bool - if path.IsIntHandlePath && ds.tableInfo.PKIsHandle { - if pkColInfo := ds.tableInfo.GetPkColInfo(); pkColInfo != nil { - unsignedIntHandle = mysql.HasUnsignedFlag(pkColInfo.GetFlag()) - } - } - // If the path contains a full range, ignore it. - if ranger.HasFullRange(path.Ranges, unsignedIntHandle) { - continue - } - // If we have point or empty range, just remove other possible paths. - if len(path.Ranges) == 0 || path.OnlyPointRange(ds.SCtx()) { - if len(results) == 0 { - results = append(results, path) - } else { - results[0] = path - results = results[:1] - } - break - } - } else { - path.Index = ds.possibleAccessPaths[i].Index - if !ds.isInIndexMergeHints(path.Index.Name.L) { - continue - } - err := ds.fillIndexPath(path, conditions) - if err != nil { - logutil.BgLogger().Debug("can not derive statistics of a path", zap.Error(err)) - continue - } - ds.deriveIndexPathStats(path, conditions, true) - // If the path contains a full range, ignore it. - if ranger.HasFullRange(path.Ranges, false) { - continue - } - // If we have empty range, or point range on unique index, just remove other possible paths. - if len(path.Ranges) == 0 || (path.OnlyPointRange(ds.SCtx()) && path.Index.Unique) { - if len(results) == 0 { - results = append(results, path) - } else { - results[0] = path - results = results[:1] - } - break - } - } - results = append(results, path) - } - return results -} - -// buildIndexMergePartialPath chooses the best index path from all possible paths. -// Now we choose the index with minimal estimate row count. -func (ds *DataSource) buildIndexMergePartialPath(indexAccessPaths []*util.AccessPath) (*util.AccessPath, error) { - if len(indexAccessPaths) == 1 { - return indexAccessPaths[0], nil - } - - minEstRowIndex := 0 - minEstRow := math.MaxFloat64 - for i := 0; i < len(indexAccessPaths); i++ { - rc := indexAccessPaths[i].CountAfterAccess - if len(indexAccessPaths[i].IndexFilters) > 0 { - rc = indexAccessPaths[i].CountAfterIndex - } - if rc < minEstRow { - minEstRowIndex = i - minEstRow = rc - } - } - return indexAccessPaths[minEstRowIndex], nil -} - -// buildIndexMergeOrPath generates one possible IndexMergePath. -func (ds *DataSource) buildIndexMergeOrPath(filters []expression.Expression, partialPaths []*util.AccessPath, current int) *util.AccessPath { - indexMergePath := &util.AccessPath{PartialIndexPaths: partialPaths} - indexMergePath.TableFilters = append(indexMergePath.TableFilters, filters[:current]...) - indexMergePath.TableFilters = append(indexMergePath.TableFilters, filters[current+1:]...) - var addCurrentFilter bool - for _, path := range partialPaths { - // If any partial path contains table filters, we need to keep the whole DNF filter in the Selection. - if len(path.TableFilters) > 0 { - addCurrentFilter = true - } - // If any partial path's index filter cannot be pushed to TiKV, we should keep the whole DNF filter. - if len(path.IndexFilters) != 0 && !expression.CanExprsPushDown(ds.ctx.GetSessionVars().StmtCtx, path.IndexFilters, ds.ctx.GetClient(), kv.TiKV) { - addCurrentFilter = true - // Clear IndexFilter, the whole filter will be put in indexMergePath.TableFilters. - path.IndexFilters = nil - } - if len(path.TableFilters) != 0 && !expression.CanExprsPushDown(ds.ctx.GetSessionVars().StmtCtx, path.TableFilters, ds.ctx.GetClient(), kv.TiKV) { - addCurrentFilter = true - path.TableFilters = nil - } - } - if addCurrentFilter { - indexMergePath.TableFilters = append(indexMergePath.TableFilters, filters[current]) - } - return indexMergePath -} - // DeriveStats implement LogicalPlan DeriveStats interface. func (p *LogicalSelection) DeriveStats(childStats []*property.StatsInfo, _ *expression.Schema, _ []*expression.Schema, _ [][]*expression.Column) (*property.StatsInfo, error) { if p.stats != nil { diff --git a/planner/core/task.go b/planner/core/task.go index 11d502568d3ae..553bc64b9a6b9 100644 --- a/planner/core/task.go +++ b/planner/core/task.go @@ -24,11 +24,13 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/charset" + "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/planner/property" "github.com/pingcap/tidb/planner/util" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/statistics" + "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/collate" @@ -80,8 +82,12 @@ type copTask struct { tblColHists *statistics.HistColl // tblCols stores the original columns of DataSource before being pruned, it // is used to compute average row width when computing scan cost. - tblCols []*expression.Column - idxMergePartPlans []PhysicalPlan + tblCols []*expression.Column + + idxMergePartPlans []PhysicalPlan + idxMergeIsIntersection bool + idxMergeAccessMVIndex bool + // rootTaskConds stores select conditions containing virtual columns. // These conditions can't push to TiKV, so we have to add a selection for rootTask rootTaskConds []expression.Expression @@ -680,8 +686,10 @@ func (t *copTask) convertToRootTaskImpl(ctx sessionctx.Context) *rootTask { newTask := &rootTask{} if t.idxMergePartPlans != nil { p := PhysicalIndexMergeReader{ - partialPlans: t.idxMergePartPlans, - tablePlan: t.tablePlan, + partialPlans: t.idxMergePartPlans, + tablePlan: t.tablePlan, + IsIntersectionType: t.idxMergeIsIntersection, + AccessMVIndex: t.idxMergeAccessMVIndex, }.Init(ctx, t.idxMergePartPlans[0].SelectBlockOffset()) p.PartitionInfo = t.partitionInfo setTableScanToTableRowIDScan(p.tablePlan) @@ -955,6 +963,10 @@ func (p *PhysicalTopN) attach2Task(tasks ...task) task { } needPushDown := len(cols) > 0 if copTask, ok := t.(*copTask); ok && needPushDown && p.canPushDown(copTask.getStoreType()) && len(copTask.rootTaskConds) == 0 { + newTask, changed := p.pushTopNDownToDynamicPartition(copTask) + if changed { + return newTask + } // If all columns in topN are from index plan, we push it to index plan, otherwise we finish the index plan and // push it to table plan. var pushedDownTopN *PhysicalTopN @@ -974,6 +986,175 @@ func (p *PhysicalTopN) attach2Task(tasks ...task) task { return attachPlan2Task(p, rootTask) } +// pushTopNDownToDynamicPartition is a temp solution for partition table. It actually does the same thing as DataSource's isMatchProp. +// We need to support a more enhanced read strategy in the execution phase. So that we can achieve Limit(TiDB)->Reader(TiDB)->Limit(TiKV/TiFlash)->Scan(TiKV/TiFlash). +// Before that is done, we use this logic to provide a way to keep the order property when reading from TiKV, so that we can use the orderliness of index to speed up the query. +// Here we can change the execution plan to TopN(TiDB)->Reader(TiDB)->Limit(TiKV)->Scan(TiKV).(TiFlash is not supported). +func (p *PhysicalTopN) pushTopNDownToDynamicPartition(copTsk *copTask) (task, bool) { + if copTsk.getStoreType() != kv.TiKV { + return nil, false + } + copTsk = copTsk.copy().(*copTask) + if len(copTsk.rootTaskConds) > 0 { + return nil, false + } + colsProp, ok := GetPropByOrderByItems(p.ByItems) + if !ok { + return nil, false + } + allSameOrder, isDesc := colsProp.AllSameOrder() + if !allSameOrder { + return nil, false + } + checkIndexMatchProp := func(idxCols []*expression.Column, idxColLens []int, constColsByCond []bool, colsProp *property.PhysicalProperty) bool { + // If the number of the by-items is bigger than the index columns. We cannot push down since it must not keep order. + if len(idxCols) < len(colsProp.SortItems) { + return false + } + idxPos := 0 + for _, byItem := range colsProp.SortItems { + found := false + for ; idxPos < len(idxCols); idxPos++ { + if idxColLens[idxPos] == types.UnspecifiedLength && idxCols[idxPos].Equal(p.SCtx(), byItem.Col) { + found = true + idxPos++ + break + } + if len(constColsByCond) == 0 || idxPos > len(constColsByCond) || !constColsByCond[idxPos] { + found = false + break + } + } + if !found { + return false + } + } + return true + } + var ( + selOnIdxScan *PhysicalSelection + selOnTblScan *PhysicalSelection + selSelectivity float64 + + idxScan *PhysicalIndexScan + tblScan *PhysicalTableScan + tblInfo *model.TableInfo + err error + ) + if copTsk.indexPlan != nil { + copTsk.indexPlan, err = copTsk.indexPlan.Clone() + if err != nil { + return nil, false + } + finalIdxScanPlan := copTsk.indexPlan + for len(finalIdxScanPlan.Children()) > 0 && finalIdxScanPlan.Children()[0] != nil { + selOnIdxScan, _ = finalIdxScanPlan.(*PhysicalSelection) + finalIdxScanPlan = finalIdxScanPlan.Children()[0] + } + idxScan = finalIdxScanPlan.(*PhysicalIndexScan) + tblInfo = idxScan.Table + } + if copTsk.tablePlan != nil { + copTsk.tablePlan, err = copTsk.tablePlan.Clone() + if err != nil { + return nil, false + } + finalTblScanPlan := copTsk.tablePlan + for len(finalTblScanPlan.Children()) > 0 { + selOnTblScan, _ = finalTblScanPlan.(*PhysicalSelection) + finalTblScanPlan = finalTblScanPlan.Children()[0] + } + tblScan = finalTblScanPlan.(*PhysicalTableScan) + tblInfo = tblScan.Table + } + + // Note that we only need to care about one Selection at most. + if selOnIdxScan != nil && idxScan.statsInfo().RowCount > 0 { + selSelectivity = selOnIdxScan.statsInfo().RowCount / idxScan.statsInfo().RowCount + } + if idxScan == nil && selOnTblScan != nil && tblScan.statsInfo().RowCount > 0 { + selSelectivity = selOnTblScan.statsInfo().RowCount / tblScan.statsInfo().RowCount + } + + pi := tblInfo.GetPartitionInfo() + if pi == nil { + return nil, false + } + + if !copTsk.indexPlanFinished { + // If indexPlan side isn't finished, there's no selection on the table side. + + propMatched := checkIndexMatchProp(idxScan.IdxCols, idxScan.IdxColLens, idxScan.constColsByCond, colsProp) + if !propMatched { + return nil, false + } + idxScan.Desc = isDesc + childProfile := copTsk.plan().statsInfo() + newCount := p.Offset + p.Count + stats := deriveLimitStats(childProfile, float64(newCount)) + pushedLimit := PhysicalLimit{ + Count: newCount, + }.Init(p.SCtx(), stats, p.SelectBlockOffset()) + pushedLimit.SetSchema(copTsk.indexPlan.Schema()) + copTsk = attachPlan2Task(pushedLimit, copTsk).(*copTask) + + // A similar but simplified logic compared the ExpectedCnt handling logic in getOriginalPhysicalIndexScan. + child := pushedLimit.Children()[0] + // The row count of the direct child of Limit should be adjusted to be no larger than the Limit.Count. + child.SetStats(child.statsInfo().ScaleByExpectCnt(float64(newCount))) + // The Limit->Selection->IndexScan case: + // adjust the row count of IndexScan according to the selectivity of the Selection. + if selSelectivity > 0 && selSelectivity < 1 { + scaledRowCount := child.Stats().RowCount / selSelectivity + idxScan.SetStats(idxScan.Stats().ScaleByExpectCnt(scaledRowCount)) + } + } else if copTsk.indexPlan == nil { + if tblScan.HandleCols == nil { + return nil, false + } + + if tblScan.HandleCols.IsInt() { + pk := tblScan.HandleCols.GetCol(0) + if len(colsProp.SortItems) != 1 || !colsProp.SortItems[0].Col.Equal(p.SCtx(), pk) { + return nil, false + } + } else { + idxCols, idxColLens := expression.IndexInfo2PrefixCols(tblScan.Columns, tblScan.Schema().Columns, tables.FindPrimaryIndex(tblScan.Table)) + matched := checkIndexMatchProp(idxCols, idxColLens, nil, colsProp) + if !matched { + return nil, false + } + } + tblScan.Desc = isDesc + // SplitRangesAcrossInt64Boundary needs the KeepOrder flag. See that func and the struct tableResultHandler for more details. + tblScan.KeepOrder = true + childProfile := copTsk.plan().statsInfo() + newCount := p.Offset + p.Count + stats := deriveLimitStats(childProfile, float64(newCount)) + pushedLimit := PhysicalLimit{ + Count: newCount, + }.Init(p.SCtx(), stats, p.SelectBlockOffset()) + pushedLimit.SetSchema(copTsk.tablePlan.Schema()) + copTsk = attachPlan2Task(pushedLimit, copTsk).(*copTask) + + // A similar but simplified logic compared the ExpectedCnt handling logic in getOriginalPhysicalTableScan. + child := pushedLimit.Children()[0] + // The row count of the direct child of Limit should be adjusted to be no larger than the Limit.Count. + child.SetStats(child.statsInfo().ScaleByExpectCnt(float64(newCount))) + // The Limit->Selection->TableScan case: + // adjust the row count of IndexScan according to the selectivity of the Selection. + if selSelectivity > 0 && selSelectivity < 1 { + scaledRowCount := child.Stats().RowCount / selSelectivity + tblScan.SetStats(tblScan.Stats().ScaleByExpectCnt(scaledRowCount)) + } + } else { + return nil, false + } + + rootTask := copTsk.convertToRootTask(p.ctx) + return attachPlan2Task(p, rootTask), true +} + func (p *PhysicalProjection) attach2Task(tasks ...task) task { t := tasks[0].copy() if cop, ok := t.(*copTask); ok { @@ -1018,6 +1199,12 @@ func (p *PhysicalUnionAll) attach2MppTasks(tasks ...task) task { func (p *PhysicalUnionAll) attach2Task(tasks ...task) task { for _, t := range tasks { if _, ok := t.(*mppTask); ok { + if p.TP() == plancodec.TypePartitionUnion { + // In attach2MppTasks(), will attach PhysicalUnion to mppTask directly. + // But PartitionUnion cannot pushdown to tiflash, so here disable PartitionUnion pushdown to tiflash explicitly. + // For now, return invalidTask immediately, we can refine this by letting childTask of PartitionUnion convert to rootTask. + return invalidTask + } return p.attach2MppTasks(tasks...) } } @@ -1094,12 +1281,17 @@ func CheckAggCanPushCop(sctx sessionctx.Context, aggFuncs []*aggregation.AggFunc ret = false } - if !ret && sc.InExplainStmt { + if !ret { storageName := storeType.Name() if storeType == kv.UnSpecified { storageName = "storage layer" } - sc.AppendWarning(errors.New("Aggregation can not be pushed to " + storageName + " because " + reason)) + warnErr := errors.New("Aggregation can not be pushed to " + storageName + " because " + reason) + if sc.InExplainStmt { + sc.AppendWarning(warnErr) + } else { + sc.AppendExtraWarning(warnErr) + } } return ret } @@ -1592,14 +1784,18 @@ func (p *PhysicalStreamAgg) attach2Task(tasks ...task) task { t := tasks[0].copy() if cop, ok := t.(*copTask); ok { // We should not push agg down across double read, since the data of second read is ordered by handle instead of index. - // The `extraHandleCol` is added if the double read needs to keep order. So we just use it to decided - // whether the following plan is double read with order reserved. - if cop.extraHandleCol != nil || len(cop.rootTaskConds) > 0 { + // We use (cop.indexPlan != nil && cop.tablePlan != nil && cop.keepOrder) to decided whether the following plan is double + // read with order reserved. + if (cop.indexPlan != nil && cop.tablePlan != nil && cop.keepOrder) || len(cop.rootTaskConds) > 0 { t = cop.convertToRootTask(p.ctx) attachPlan2Task(p, t) } else { - copTaskType := cop.getStoreType() - partialAgg, finalAgg := p.newPartialAggregate(copTaskType, false) + storeType := cop.getStoreType() + // TiFlash doesn't support Stream Aggregation + if storeType == kv.TiFlash && len(p.GroupByItems) > 0 { + return invalidTask + } + partialAgg, finalAgg := p.newPartialAggregate(storeType, false) if partialAgg != nil { if cop.tablePlan != nil { cop.finishIndexPlan() @@ -1914,6 +2110,19 @@ type mppTask struct { partTp property.MPPPartitionType hashCols []*property.MPPPartitionColumn + + // rootTaskConds record filters of TableScan that cannot be pushed down to TiFlash. + + // For logical plan like: HashAgg -> Selection -> TableScan, if filters in Selection cannot be pushed to TiFlash. + // Planner will generate physical plan like: PhysicalHashAgg -> PhysicalSelection -> TableReader -> PhysicalTableScan(cop tiflash) + // Because planner will make mppTask invalid directly then use copTask directly. + + // But in DisaggregatedTiFlash mode, cop and batchCop protocol is disabled, so we have to consider this situation for mppTask. + // When generating PhysicalTableScan, if prop.TaskTp is RootTaskType, mppTask will be converted to rootTask, + // and filters in rootTaskConds will be added in a Selection which will be executed in TiDB. + // So physical plan be like: PhysicalHashAgg -> PhysicalSelection -> TableReader -> ExchangeSender -> PhysicalTableScan(mpp tiflash) + rootTaskConds []expression.Expression + tblColHists *statistics.HistColl } func (t *mppTask) count() float64 { @@ -1993,6 +2202,32 @@ func (t *mppTask) convertToRootTaskImpl(ctx sessionctx.Context) *rootTask { rt := &rootTask{ p: p, } + + if len(t.rootTaskConds) > 0 { + // Some Filter cannot be pushed down to TiFlash, need to add Selection in rootTask, + // so this Selection will be executed in TiDB. + _, isTableScan := t.p.(*PhysicalTableScan) + _, isSelection := t.p.(*PhysicalSelection) + if isSelection { + _, isTableScan = t.p.Children()[0].(*PhysicalTableScan) + } + if !isTableScan { + // Need to make sure oriTaskPlan is TableScan, because rootTaskConds is part of TableScan.FilterCondition. + // It's only for TableScan. This is ensured by converting mppTask to rootTask just after TableScan is built, + // so no other operators are added into this mppTask. + logutil.BgLogger().Error("expect Selection or TableScan for mppTask.p", zap.String("mppTask.p", t.p.TP())) + return invalidTask + } + selectivity, _, err := t.tblColHists.Selectivity(ctx, t.rootTaskConds, nil) + if err != nil { + logutil.BgLogger().Debug("calculate selectivity failed, use selection factor", zap.Error(err)) + selectivity = SelectionFactor + } + sel := PhysicalSelection{Conditions: t.rootTaskConds}.Init(ctx, rt.p.statsInfo().Scale(selectivity), rt.p.SelectBlockOffset()) + sel.fromDataSource = true + sel.SetChildren(rt.p) + rt.p = sel + } return rt } @@ -2044,6 +2279,14 @@ func (t *mppTask) enforceExchangerImpl(prop *property.PhysicalProperty) *mppTask ExchangeType: prop.MPPPartitionTp.ToExchangeType(), HashCols: prop.MPPPartitionCols, }.Init(ctx, t.p.statsInfo()) + + if ctx.GetSessionVars().ChooseMppVersion() >= kv.MppVersionV1 { + // Use compress when exchange type is `Hash` + if sender.ExchangeType == tipb.ExchangeType_Hash { + sender.CompressionMode = ctx.GetSessionVars().ChooseMppExchangeCompressionMode() + } + } + sender.SetChildren(t.p) receiver := PhysicalExchangeReceiver{}.Init(ctx, t.p.statsInfo()) receiver.SetChildren(sender) diff --git a/planner/core/testdata/analyze_suite_out.json b/planner/core/testdata/analyze_suite_out.json index 4d902fec467a5..b10e0b2c69e6a 100644 --- a/planner/core/testdata/analyze_suite_out.json +++ b/planner/core/testdata/analyze_suite_out.json @@ -286,7 +286,7 @@ "Name": "TestTiFlashCostModel", "Cases": [ [ - "TableReader_11 10000.00 root data:ExchangeSender_10", + "TableReader_11 10000.00 root MppVersion: 1, data:ExchangeSender_10", "└─ExchangeSender_10 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─TableFullScan_9 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ], @@ -298,7 +298,7 @@ "Batch_Point_Get_5 2.00 root table:t handle:[1 2], keep order:false, desc:false" ], [ - "TableReader_10 2.00 root data:ExchangeSender_9", + "TableReader_10 2.00 root MppVersion: 1, data:ExchangeSender_9", "└─ExchangeSender_9 2.00 mpp[tiflash] ExchangeType: PassThrough", " └─TableRangeScan_8 2.00 mpp[tiflash] table:t range:[1,1], [2,2], keep order:false, stats:pseudo" ] @@ -383,7 +383,7 @@ "└─Apply 10.00 root CARTESIAN left outer semi join, other cond:eq(test.t.c, Column#21)", " ├─IndexReader(Build) 10.00 root index:IndexFullScan", " │ └─IndexFullScan 10.00 cop[tikv] table:t, index:idx(c, b, a) keep order:false", - " └─HashAgg(Probe) 10.00 root funcs:count(1)->Column#21", + " └─StreamAgg(Probe) 10.00 root funcs:count(1)->Column#21", " └─HashJoin 10.00 root inner join, equal:[eq(test.t.a, test.t.a)]", " ├─IndexReader(Build) 10.00 root index:Selection", " │ └─Selection 10.00 cop[tikv] eq(test.t.a, test.t.a), not(isnull(test.t.a))", @@ -411,7 +411,7 @@ { "SQL": "explain format = 'brief' select max(e) from t where a='T3382' and b='ECO' and c='TOPIC' and d='23660fa1ace9455cb7f3ee831e14a342'", "Plan": [ - "HashAgg 1.00 root funcs:max(test.t.e)->Column#7", + "StreamAgg 1.00 root funcs:max(test.t.e)->Column#7", "└─TopN 0.00 root test.t.e:desc, offset:0, count:1", " └─IndexLookUp 0.00 root ", " ├─IndexRangeScan(Build) 0.01 cop[tikv] table:t, index:idx1(d, a) range:[\"23660fa1ace9455cb7f3ee831e14a342\" \"T3382\",\"23660fa1ace9455cb7f3ee831e14a342\" \"T3382\"], keep order:false", @@ -435,7 +435,7 @@ "Cases": [ "IndexReader(Index(t.e)[[NULL,+inf]]->StreamAgg)->StreamAgg", "IndexReader(Index(t.e)[[-inf,10]]->StreamAgg)->StreamAgg", - "IndexReader(Index(t.e)[[-inf,50]]->HashAgg)->HashAgg", + "IndexReader(Index(t.e)[[-inf,50]]->StreamAgg)->StreamAgg", "IndexReader(Index(t.b_c)[[NULL,+inf]]->Sel([gt(test.t.c, 1)])->StreamAgg)->StreamAgg", "IndexLookUp(Index(t.e)[[1,1]], Table(t))->HashAgg", "TableReader(Table(t)->Sel([gt(test.t.e, 1)])->HashAgg)->HashAgg", diff --git a/planner/core/testdata/binary_plan_suite_out.json b/planner/core/testdata/binary_plan_suite_out.json index 203f11acf364f..a361c5ca0b23f 100644 --- a/planner/core/testdata/binary_plan_suite_out.json +++ b/planner/core/testdata/binary_plan_suite_out.json @@ -123,7 +123,7 @@ "operator_info": "data:TableFullScan_16" } ], - "cost": 975351.9825195674, + "cost": 976848.9825195674, "est_rows": 100000000, "act_rows": 8, "task_type": 1, @@ -131,7 +131,7 @@ "operator_info": "CARTESIAN inner join" } ], - "cost": 998975351.9825196, + "cost": 998976848.9825196, "est_rows": 100000000, "act_rows": 8, "task_type": 1, @@ -139,7 +139,7 @@ "operator_info": "cast(test.t.a, decimal(10,0) BINARY)->Column#8" } ], - "cost": 1996975363.5625196, + "cost": 1996978357.5625196, "est_rows": 1, "act_rows": 1, "task_type": 1, @@ -283,7 +283,7 @@ "operator_info": "data:Selection_33" } ], - "cost": 1798740.0717058014, + "cost": 1800237.0717058014, "est_rows": 12487.5, "task_type": 1, "store_type": 1, diff --git a/planner/core/testdata/derive_topn_from_window_in.json b/planner/core/testdata/derive_topn_from_window_in.json new file mode 100644 index 0000000000000..4274631e34a13 --- /dev/null +++ b/planner/core/testdata/derive_topn_from_window_in.json @@ -0,0 +1,29 @@ +[ + { + "name": "TestPushDerivedTopnNegative", + "cases":[ + "select row_number() over (partition by a) from t -- pattern missing filter on row number", + "select * from (select rank() over () as rank_order from t) DT where rank_order <= 3 -- rank not supported in pattern yet", + "select * from (select row_number() over (partition by a) as rownumber from t) DT where rownumber <= 3 -- pattern is applicable but partition by is not supported yet", + "select * from (select row_number() over () as rownumber1, row_number() over (partition by a) as rownumber2 from t) DT where rownumber1 <= 3 -- pattern not applicable with multiple window functions", + "select * from (select b, row_number() over () as rownumber from t) DT where rownumber <= 3 and b > 5 -- pattern is not applicable with complex filter on top of window", + "select * from (select b, row_number() over () as rownumber from t) DT where rownumber > 3 -- pattern is not applicable with filter is not < or <=", + "select * from (select a,b, row_number() over () as rownumber from t) DT where a > b -- pattern is not applicable with filter is not < or <=", + "select * from (select a,b, row_number() over () as rownumber from t) DT where a <= 3 -- pattern is not applicable with filter is not on row number", + "select * from (select a,b, row_number() over () as rownumber from t) DT where 3 >= rownumber -- pattern is not applicable with filter is not < or <=", + "select * from (select a,b, row_number() over () as rownumber from t) DT where rownumber <= -4 -- pattern is not applicable with filter constant negative", + "select * from (select row_number() over () as rownumber from t) DT where rownumber <= 3 and rownumber >= 2 -- pattern is not applicable with complex filter" + ] + }, + { + "name": "TestPushDerivedTopnPositive", + "cases":[ + "select * from (select a,b, row_number() over (order by a) as rownumber from t) DT where rownumber <= 3.5 -- pattern is applicable with N rounded down to an integer", + "select * from (select row_number() over (order by a) as rownumber from t) DT where rownumber <= 3 -- pattern is applicable", + "select * from (select row_number() over (order by a) as rownumber from t) DT where rownumber < 3 -- pattern is applicable", + "select * from (select row_number() over(rows between 1 preceding and 1 following) as rownumber from t) DT where rownumber <= 3 -- pattern is applicable", + "select * from (select a,row_number() over (order by a desc) as rownumber,b from t) DT where rownumber <= 3 -- pattern is applicable", + "select count(*) from (select * from (select a,row_number() over (order by b) as rownumber,b from t) DT1 where rownumber <= 1) DT2 -- pattern is applicable" + ] + } +] diff --git a/planner/core/testdata/derive_topn_from_window_out.json b/planner/core/testdata/derive_topn_from_window_out.json new file mode 100644 index 0000000000000..0bc6265075ca0 --- /dev/null +++ b/planner/core/testdata/derive_topn_from_window_out.json @@ -0,0 +1,214 @@ +[ + { + "Name": "TestPushDerivedTopnNegative", + "Cases": [ + { + "SQL": "select row_number() over (partition by a) from t -- pattern missing filter on row number", + "Plan": [ + "Projection 10000.00 root Column#5", + "└─Shuffle 10000.00 root execution info: concurrency:5, data sources:[TableReader]", + " └─Window 10000.00 root row_number()->Column#5 over(partition by test.t.a rows between current row and current row)", + " └─Sort 10000.00 root test.t.a", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from (select rank() over () as rank_order from t) DT where rank_order <= 3 -- rank not supported in pattern yet", + "Plan": [ + "Projection 8000.00 root Column#5", + "└─Selection 8000.00 root le(Column#5, 3)", + " └─Window 10000.00 root rank()->Column#5 over()", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from (select row_number() over (partition by a) as rownumber from t) DT where rownumber <= 3 -- pattern is applicable but partition by is not supported yet", + "Plan": [ + "Projection 8000.00 root Column#5", + "└─Selection 8000.00 root le(Column#5, 3)", + " └─Shuffle 10000.00 root execution info: concurrency:5, data sources:[TableReader]", + " └─Window 10000.00 root row_number()->Column#5 over(partition by test.t.a rows between current row and current row)", + " └─Sort 10000.00 root test.t.a", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from (select row_number() over () as rownumber1, row_number() over (partition by a) as rownumber2 from t) DT where rownumber1 <= 3 -- pattern not applicable with multiple window functions", + "Plan": [ + "Projection 8000.00 root Column#7, Column#6", + "└─Selection 8000.00 root le(Column#7, 3)", + " └─Window 10000.00 root row_number()->Column#7 over(rows between current row and current row)", + " └─Shuffle 10000.00 root execution info: concurrency:5, data sources:[TableReader]", + " └─Window 10000.00 root row_number()->Column#6 over(partition by test.t.a rows between current row and current row)", + " └─Sort 10000.00 root test.t.a", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from (select b, row_number() over () as rownumber from t) DT where rownumber <= 3 and b > 5 -- pattern is not applicable with complex filter on top of window", + "Plan": [ + "Selection 8000.00 root gt(test.t.b, 5), le(Column#5, 3)", + "└─Window 10000.00 root row_number()->Column#5 over(rows between current row and current row)", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from (select b, row_number() over () as rownumber from t) DT where rownumber > 3 -- pattern is not applicable with filter is not < or <=", + "Plan": [ + "Selection 8000.00 root gt(Column#5, 3)", + "└─Window 10000.00 root row_number()->Column#5 over(rows between current row and current row)", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from (select a,b, row_number() over () as rownumber from t) DT where a > b -- pattern is not applicable with filter is not < or <=", + "Plan": [ + "Selection 8000.00 root gt(test.t.a, test.t.b)", + "└─Window 10000.00 root row_number()->Column#5 over(rows between current row and current row)", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from (select a,b, row_number() over () as rownumber from t) DT where a <= 3 -- pattern is not applicable with filter is not on row number", + "Plan": [ + "Selection 8000.00 root le(test.t.a, 3)", + "└─Window 10000.00 root row_number()->Column#5 over(rows between current row and current row)", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from (select a,b, row_number() over () as rownumber from t) DT where 3 >= rownumber -- pattern is not applicable with filter is not < or <=", + "Plan": [ + "Selection 8000.00 root ge(3, Column#5)", + "└─Window 10000.00 root row_number()->Column#5 over(rows between current row and current row)", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from (select a,b, row_number() over () as rownumber from t) DT where rownumber <= -4 -- pattern is not applicable with filter constant negative", + "Plan": [ + "Selection 8000.00 root le(Column#5, -4)", + "└─Window 10000.00 root row_number()->Column#5 over(rows between current row and current row)", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from (select row_number() over () as rownumber from t) DT where rownumber <= 3 and rownumber >= 2 -- pattern is not applicable with complex filter", + "Plan": [ + "Projection 8000.00 root Column#5", + "└─Selection 8000.00 root ge(Column#5, 2), le(Column#5, 3)", + " └─Window 10000.00 root row_number()->Column#5 over(rows between current row and current row)", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestPushDerivedTopnPositive", + "Cases": [ + { + "SQL": "select * from (select a,b, row_number() over (order by a) as rownumber from t) DT where rownumber <= 3.5 -- pattern is applicable with N rounded down to an integer", + "Plan": [ + "Window 3.00 root row_number()->Column#5 over(order by test.t.a rows between current row and current row)", + "└─TopN 3.00 root test.t.a, offset:0, count:3", + " └─TableReader 3.00 root data:TopN", + " └─TopN 3.00 cop[tikv] test.t.a, offset:0, count:3", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Res": [ + "1 1 1", + "2 1 2", + "3 2 3" + ] + }, + { + "SQL": "select * from (select row_number() over (order by a) as rownumber from t) DT where rownumber <= 3 -- pattern is applicable", + "Plan": [ + "Projection 3.00 root Column#5", + "└─Window 3.00 root row_number()->Column#5 over(order by test.t.a rows between current row and current row)", + " └─TopN 3.00 root test.t.a, offset:0, count:3", + " └─TableReader 3.00 root data:TopN", + " └─TopN 3.00 cop[tikv] test.t.a, offset:0, count:3", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Res": [ + "1", + "2", + "3" + ] + }, + { + "SQL": "select * from (select row_number() over (order by a) as rownumber from t) DT where rownumber < 3 -- pattern is applicable", + "Plan": [ + "Projection 2.00 root Column#5", + "└─Window 2.00 root row_number()->Column#5 over(order by test.t.a rows between current row and current row)", + " └─TopN 2.00 root test.t.a, offset:0, count:2", + " └─TableReader 2.00 root data:TopN", + " └─TopN 2.00 cop[tikv] test.t.a, offset:0, count:2", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Res": [ + "1", + "2" + ] + }, + { + "SQL": "select * from (select row_number() over(rows between 1 preceding and 1 following) as rownumber from t) DT where rownumber <= 3 -- pattern is applicable", + "Plan": [ + "Projection 3.00 root Column#5", + "└─Window 3.00 root row_number()->Column#5 over(rows between current row and current row)", + " └─Limit 3.00 root offset:0, count:3", + " └─TableReader 3.00 root data:Limit", + " └─Limit 3.00 cop[tikv] offset:0, count:3", + " └─TableFullScan 3.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Res": [ + "1", + "2", + "3" + ] + }, + { + "SQL": "select * from (select a,row_number() over (order by a desc) as rownumber,b from t) DT where rownumber <= 3 -- pattern is applicable", + "Plan": [ + "Projection 3.00 root test.t.a, Column#5, test.t.b", + "└─Window 3.00 root row_number()->Column#5 over(order by test.t.a desc rows between current row and current row)", + " └─TopN 3.00 root test.t.a:desc, offset:0, count:3", + " └─TableReader 3.00 root data:TopN", + " └─TopN 3.00 cop[tikv] test.t.a:desc, offset:0, count:3", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Res": [ + "5 1 2", + "4 2 2", + "3 3 2" + ] + }, + { + "SQL": "select count(*) from (select * from (select a,row_number() over (order by b) as rownumber,b from t) DT1 where rownumber <= 1) DT2 -- pattern is applicable", + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#6", + "└─Window 1.00 root row_number()->Column#5 over(order by test.t.b rows between current row and current row)", + " └─TopN 1.00 root test.t.b, offset:0, count:1", + " └─TableReader 1.00 root data:TopN", + " └─TopN 1.00 cop[tikv] test.t.b, offset:0, count:1", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Res": [ + "1" + ] + } + ] + } +] diff --git a/planner/core/testdata/enforce_mpp_suite_out.json b/planner/core/testdata/enforce_mpp_suite_out.json index e1e3242fb55b5..483291bfabd22 100644 --- a/planner/core/testdata/enforce_mpp_suite_out.json +++ b/planner/core/testdata/enforce_mpp_suite_out.json @@ -31,30 +31,30 @@ { "SQL": "explain format='verbose' select count(*) from t where a=1", "Plan": [ - "HashAgg_14 1.00 154.90 root funcs:count(Column#5)->Column#4", - "└─IndexReader_15 1.00 124.64 root index:HashAgg_6", - " └─HashAgg_6 1.00 1837.90 cop[tikv] funcs:count(1)->Column#5", - " └─IndexRangeScan_13 10.00 1628.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" + "StreamAgg_24 1.00 193.81 root funcs:count(Column#6)->Column#4", + "└─IndexReader_25 1.00 143.91 root index:StreamAgg_9", + " └─StreamAgg_9 1.00 2127.00 cop[tikv] funcs:count(1)->Column#6", + " └─IndexRangeScan_23 10.00 1628.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" ], "Warn": null }, { "SQL": "explain format='verbose' select /*+ read_from_storage(tikv[t]) */ count(*) from t where a=1", "Plan": [ - "HashAgg_12 1.00 154.90 root funcs:count(Column#5)->Column#4", - "└─IndexReader_13 1.00 124.64 root index:HashAgg_6", - " └─HashAgg_6 1.00 1837.90 cop[tikv] funcs:count(1)->Column#5", - " └─IndexRangeScan_11 10.00 1628.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" + "StreamAgg_17 1.00 193.81 root funcs:count(Column#6)->Column#4", + "└─IndexReader_18 1.00 143.91 root index:StreamAgg_9", + " └─StreamAgg_9 1.00 2127.00 cop[tikv] funcs:count(1)->Column#6", + " └─IndexRangeScan_16 10.00 1628.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" ], "Warn": null }, { "SQL": "explain format='verbose' select /*+ read_from_storage(tiflash[t]) */ count(*) from t where a=1", "Plan": [ - "HashAgg_8 1.00 63718.81 root funcs:count(1)->Column#4", - "└─TableReader_17 10.00 63508.91 root data:Selection_16", - " └─Selection_16 10.00 952000.00 cop[tiflash] eq(test.t.a, 1)", - " └─TableFullScan_15 10000.00 928000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + "StreamAgg_10 1.00 64007.91 root funcs:count(1)->Column#4", + "└─TableReader_24 10.00 63508.91 root data:Selection_23", + " └─Selection_23 10.00 952000.00 cop[tiflash] eq(test.t.a, 1)", + " └─TableFullScan_22 10000.00 928000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null }, @@ -71,32 +71,30 @@ { "SQL": "explain format='verbose' select count(*) from t where a=1", "Plan": [ - "HashAgg_16 1.00 154.90 root funcs:count(Column#5)->Column#4", - "└─IndexReader_17 1.00 124.64 root index:HashAgg_7", - " └─HashAgg_7 1.00 1837.90 cop[tikv] funcs:count(1)->Column#5", - " └─IndexRangeScan_15 10.00 1628.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" + "StreamAgg_31 1.00 193.81 root funcs:count(Column#7)->Column#4", + "└─IndexReader_32 1.00 143.91 root index:StreamAgg_11", + " └─StreamAgg_11 1.00 2127.00 cop[tikv] funcs:count(1)->Column#7", + " └─IndexRangeScan_30 10.00 1628.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" ], "Warn": null }, { "SQL": "explain format='verbose' select /*+ read_from_storage(tikv[t]) */ count(*) from t where a=1", "Plan": [ - "HashAgg_14 1.00 154.90 root funcs:count(Column#5)->Column#4", - "└─IndexReader_15 1.00 124.64 root index:HashAgg_7", - " └─HashAgg_7 1.00 1837.90 cop[tikv] funcs:count(1)->Column#5", - " └─IndexRangeScan_13 10.00 1628.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" + "StreamAgg_19 1.00 193.81 root funcs:count(Column#6)->Column#4", + "└─IndexReader_20 1.00 143.91 root index:StreamAgg_11", + " └─StreamAgg_11 1.00 2127.00 cop[tikv] funcs:count(1)->Column#6", + " └─IndexRangeScan_18 10.00 1628.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" ], "Warn": null }, { "SQL": "explain format='verbose' select /*+ read_from_storage(tiflash[t]) */ count(*) from t where a=1", "Plan": [ - "HashAgg_22 1.00 63498.78 root funcs:count(Column#6)->Column#4", - "└─TableReader_24 1.00 63468.52 root data:ExchangeSender_23", - " └─ExchangeSender_23 1.00 952010.16 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg_10 1.00 952010.16 mpp[tiflash] funcs:count(1)->Column#6", - " └─Selection_21 10.00 952000.00 mpp[tiflash] eq(test.t.a, 1)", - " └─TableFullScan_20 10000.00 928000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + "StreamAgg_12 1.00 64007.91 root funcs:count(1)->Column#4", + "└─TableReader_31 10.00 63508.91 root data:Selection_30", + " └─Selection_30 10.00 952000.00 cop[tiflash] eq(test.t.a, 1)", + " └─TableFullScan_29 10000.00 928000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null }, @@ -108,32 +106,30 @@ { "SQL": "explain format='verbose' select count(*) from t where a=1", "Plan": [ - "HashAgg_16 1.00 154.90 root funcs:count(Column#5)->Column#4", - "└─IndexReader_17 1.00 124.64 root index:HashAgg_7", - " └─HashAgg_7 1.00 1837.90 cop[tikv] funcs:count(1)->Column#5", - " └─IndexRangeScan_15 10.00 1628.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" + "StreamAgg_31 1.00 193.81 root funcs:count(Column#7)->Column#4", + "└─IndexReader_32 1.00 143.91 root index:StreamAgg_11", + " └─StreamAgg_11 1.00 2127.00 cop[tikv] funcs:count(1)->Column#7", + " └─IndexRangeScan_30 10.00 1628.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" ], "Warn": null }, { "SQL": "explain format='verbose' select /*+ read_from_storage(tikv[t]) */ count(*) from t where a=1", "Plan": [ - "HashAgg_14 1.00 154.90 root funcs:count(Column#5)->Column#4", - "└─IndexReader_15 1.00 124.64 root index:HashAgg_7", - " └─HashAgg_7 1.00 1837.90 cop[tikv] funcs:count(1)->Column#5", - " └─IndexRangeScan_13 10.00 1628.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" + "StreamAgg_19 1.00 193.81 root funcs:count(Column#6)->Column#4", + "└─IndexReader_20 1.00 143.91 root index:StreamAgg_11", + " └─StreamAgg_11 1.00 2127.00 cop[tikv] funcs:count(1)->Column#6", + " └─IndexRangeScan_18 10.00 1628.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" ], "Warn": null }, { "SQL": "explain format='verbose' select /*+ read_from_storage(tiflash[t]) */ count(*) from t where a=1", "Plan": [ - "HashAgg_22 1.00 63498.78 root funcs:count(Column#6)->Column#4", - "└─TableReader_24 1.00 63468.52 root data:ExchangeSender_23", - " └─ExchangeSender_23 1.00 952010.16 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg_10 1.00 952010.16 mpp[tiflash] funcs:count(1)->Column#6", - " └─Selection_21 10.00 952000.00 mpp[tiflash] eq(test.t.a, 1)", - " └─TableFullScan_20 10000.00 928000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + "StreamAgg_12 1.00 64007.91 root funcs:count(1)->Column#4", + "└─TableReader_31 10.00 63508.91 root data:Selection_30", + " └─Selection_30 10.00 952000.00 cop[tiflash] eq(test.t.a, 1)", + " └─TableFullScan_29 10000.00 928000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null }, @@ -145,22 +141,20 @@ { "SQL": "explain format='verbose' select count(*) from t where a=1", "Plan": [ - "HashAgg_25 1.00 30.26 root funcs:count(Column#6)->Column#4", - "└─TableReader_27 1.00 0.00 root data:ExchangeSender_26", - " └─ExchangeSender_26 1.00 952010.16 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg_10 1.00 952010.16 mpp[tiflash] funcs:count(1)->Column#6", - " └─Selection_24 10.00 952000.00 mpp[tiflash] eq(test.t.a, 1)", - " └─TableFullScan_23 10000.00 928000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + "StreamAgg_31 1.00 193.81 root funcs:count(Column#7)->Column#4", + "└─IndexReader_32 1.00 143.91 root index:StreamAgg_11", + " └─StreamAgg_11 1.00 2127.00 cop[tikv] funcs:count(1)->Column#7", + " └─IndexRangeScan_30 10.00 1628.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" ], "Warn": null }, { "SQL": "explain format='verbose' select /*+ read_from_storage(tikv[t]) */ count(*) from t where a=1", "Plan": [ - "HashAgg_14 1.00 154.90 root funcs:count(Column#5)->Column#4", - "└─IndexReader_15 1.00 124.64 root index:HashAgg_7", - " └─HashAgg_7 1.00 1837.90 cop[tikv] funcs:count(1)->Column#5", - " └─IndexRangeScan_13 10.00 1628.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" + "StreamAgg_19 1.00 193.81 root funcs:count(Column#6)->Column#4", + "└─IndexReader_20 1.00 143.91 root index:StreamAgg_11", + " └─StreamAgg_11 1.00 2127.00 cop[tikv] funcs:count(1)->Column#6", + " └─IndexRangeScan_18 10.00 1628.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" ], "Warn": [ "MPP mode may be blocked because you have set a hint to read table `t` from TiKV." @@ -169,12 +163,11 @@ { "SQL": "explain format='verbose' select /*+ read_from_storage(tiflash[t]) */ count(*) from t where a=1", "Plan": [ - "HashAgg_22 1.00 30.26 root funcs:count(Column#6)->Column#4", - "└─TableReader_24 1.00 0.00 root data:ExchangeSender_23", - " └─ExchangeSender_23 1.00 952010.16 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg_10 1.00 952010.16 mpp[tiflash] funcs:count(1)->Column#6", - " └─Selection_21 10.00 952000.00 mpp[tiflash] eq(test.t.a, 1)", - " └─TableFullScan_20 10000.00 928000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + "StreamAgg_27 1.00 49.90 root funcs:count(Column#7)->Column#4", + "└─TableReader_28 1.00 0.00 root data:StreamAgg_11", + " └─StreamAgg_11 1.00 1427024.00 batchCop[tiflash] funcs:count(1)->Column#7", + " └─Selection_26 10.00 1427000.00 batchCop[tiflash] eq(test.t.a, 1)", + " └─TableFullScan_25 10000.00 928000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null } @@ -191,9 +184,9 @@ { "SQL": "explain format = 'brief' select count(*) from t where a=1 -- 1. no replica", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#7)->Column#6", - "└─IndexReader 1.00 root index:HashAgg", - " └─HashAgg 1.00 cop[tikv] funcs:count(1)->Column#7", + "StreamAgg 1.00 root funcs:count(Column#8)->Column#6", + "└─IndexReader 1.00 root index:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#8", " └─IndexRangeScan 10.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" ], "Warn": [ @@ -208,10 +201,10 @@ { "SQL": "explain select count(*) from t where a=1 -- 2. replica not ready", "Plan": [ - "HashAgg_12 1.00 root funcs:count(Column#7)->Column#6", - "└─IndexReader_13 1.00 root index:HashAgg_6", - " └─HashAgg_6 1.00 cop[tikv] funcs:count(1)->Column#7", - " └─IndexRangeScan_11 10.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" + "StreamAgg_17 1.00 root funcs:count(Column#8)->Column#6", + "└─IndexReader_18 1.00 root index:StreamAgg_9", + " └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#8", + " └─IndexRangeScan_16 10.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" ], "Warn": [ "MPP mode may be blocked because tiflash replicas of table `t` not ready." @@ -230,10 +223,10 @@ { "SQL": "explain select count(*) from t where a=1 -- 3. isolation_engine not match", "Plan": [ - "HashAgg_12 1.00 root funcs:count(Column#7)->Column#6", - "└─IndexReader_13 1.00 root index:HashAgg_6", - " └─HashAgg_6 1.00 cop[tikv] funcs:count(1)->Column#7", - " └─IndexRangeScan_11 10.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" + "StreamAgg_17 1.00 root funcs:count(Column#8)->Column#6", + "└─IndexReader_18 1.00 root index:StreamAgg_9", + " └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#8", + " └─IndexRangeScan_16 10.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" ], "Warn": [ "MPP mode may be blocked because 'tidb_isolation_read_engines'(value: 'tikv') not match, need 'tiflash'." @@ -247,9 +240,9 @@ { "SQL": "explain format = 'brief' select /*+ read_from_storage(tikv[t]) */ count(*) from t where a=1 -- 4. hint use tikv", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#7)->Column#6", - "└─IndexReader 1.00 root index:HashAgg", - " └─HashAgg 1.00 cop[tikv] funcs:count(1)->Column#7", + "StreamAgg 1.00 root funcs:count(Column#8)->Column#6", + "└─IndexReader 1.00 root index:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#8", " └─IndexRangeScan 10.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" ], "Warn": [ @@ -259,7 +252,7 @@ { "SQL": "explain format = 'brief' SELECT a, ROW_NUMBER() OVER (ORDER BY a) FROM t; -- 5. window unsupported", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Window 10000.00 mpp[tiflash] row_number()->Column#7 over(order by test.t.a rows between current row and current row)", " └─Sort 10000.00 mpp[tiflash] test.t.a", @@ -287,7 +280,7 @@ { "SQL": "EXPLAIN format = 'brief' SELECT count(b) from t where a=1; -- 7. agg func has virtual column", "Plan": [ - "HashAgg 1.00 root funcs:count(test.t.b)->Column#6", + "StreamAgg 1.00 root funcs:count(test.t.b)->Column#6", "└─TableReader 10.00 root data:Selection", " └─Selection 10.00 cop[tiflash] eq(test.t.a, 1)", " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" @@ -334,7 +327,7 @@ { "SQL": "EXPLAIN format = 'brief' SELECT count(a) from t where c=1; -- 11. type not supported", "Plan": [ - "HashAgg 1.00 root funcs:count(test.t.a)->Column#6", + "StreamAgg 1.00 root funcs:count(test.t.a)->Column#6", "└─TableReader 10.00 root data:Selection", " └─Selection 10.00 cop[tikv] eq(test.t.c, 1)", " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" @@ -350,7 +343,7 @@ { "SQL": "EXPLAIN format = 'brief' SELECT count(a) from t where d=1; -- 11.1. type not supported", "Plan": [ - "HashAgg 1.00 root funcs:count(test.t.a)->Column#6", + "StreamAgg 1.00 root funcs:count(test.t.a)->Column#6", "└─TableReader 10.00 root data:Selection", " └─Selection 10.00 cop[tikv] eq(test.t.d, 1)", " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" @@ -381,11 +374,11 @@ { "SQL": "EXPLAIN SELECT count(*) from t where a=1; -- 1. static partition prune", "Plan": [ - "HashAgg_19 1.00 root funcs:count(Column#5)->Column#4", - "└─TableReader_20 1.00 root data:HashAgg_9", - " └─HashAgg_9 1.00 batchCop[tiflash] funcs:count(1)->Column#5", - " └─Selection_18 10.00 batchCop[tiflash] eq(test.t.a, 1)", - " └─TableFullScan_17 10000.00 batchCop[tiflash] table:t, partition:p0 keep order:false, stats:pseudo" + "StreamAgg_32 1.00 root funcs:count(Column#6)->Column#4", + "└─TableReader_33 1.00 root data:StreamAgg_13", + " └─StreamAgg_13 1.00 batchCop[tiflash] funcs:count(1)->Column#6", + " └─Selection_31 10.00 batchCop[tiflash] eq(test.t.a, 1)", + " └─TableFullScan_30 10000.00 batchCop[tiflash] table:t, partition:p0 keep order:false, stats:pseudo" ], "Warn": [ "MPP mode may be blocked because table `t`is a partition table which is not supported when `@@tidb_partition_prune_mode=static`." @@ -415,7 +408,7 @@ "SQL": "EXPLAIN SELECT count(*) from t group by b; -- 1. new collation FIXME", "Plan": [ "HashAgg_24 8000.00 root group by:test.t.b, funcs:count(Column#7)->Column#4", - "└─TableReader_26 8000.00 root data:ExchangeSender_25", + "└─TableReader_26 8000.00 root MppVersion: 1, data:ExchangeSender_25", " └─ExchangeSender_25 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg_11 8000.00 mpp[tiflash] group by:test.t.b, funcs:count(1)->Column#7", " └─TableFullScan_21 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -429,7 +422,7 @@ { "SQL": "EXPLAIN SELECT * from t t1 join t t2 on t1.b=t2.b; -- 2. new collation FIXME", "Plan": [ - "TableReader_34 12487.50 root data:ExchangeSender_33", + "TableReader_34 12487.50 root MppVersion: 1, data:ExchangeSender_33", "└─ExchangeSender_33 12487.50 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin_32 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.b, test.t.b)]", " ├─ExchangeReceiver_15(Build) 9990.00 mpp[tiflash] ", @@ -553,7 +546,7 @@ { "SQL": "EXPLAIN SELECT * from t join s; -- can use mpp", "Plan": [ - "TableReader_27 100000000.00 root data:ExchangeSender_26", + "TableReader_27 100000000.00 root MppVersion: 1, data:ExchangeSender_26", "└─ExchangeSender_26 100000000.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin_25 100000000.00 mpp[tiflash] CARTESIAN inner join", " ├─ExchangeReceiver_13(Build) 10000.00 mpp[tiflash] ", @@ -571,7 +564,7 @@ { "SQL": "EXPLAIN SELECT * from t join s; -- can use mpp", "Plan": [ - "TableReader_27 100000000.00 root data:ExchangeSender_26", + "TableReader_27 100000000.00 root MppVersion: 1, data:ExchangeSender_26", "└─ExchangeSender_26 100000000.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin_25 100000000.00 mpp[tiflash] CARTESIAN inner join", " ├─ExchangeReceiver_13(Build) 10000.00 mpp[tiflash] ", @@ -589,7 +582,7 @@ { "SQL": "explain select a from t where t.a>1 or t.a in (select a from t); -- 7. left outer semi join", "Plan": [ - "TableReader_51 8000.00 root data:ExchangeSender_50", + "TableReader_51 8000.00 root MppVersion: 1, data:ExchangeSender_50", "└─ExchangeSender_50 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_8 8000.00 mpp[tiflash] test.t.a", " └─Selection_49 8000.00 mpp[tiflash] or(gt(test.t.a, 1), Column#3)", @@ -604,7 +597,7 @@ { "SQL": "explain select a from t where t.a>1 or t.a not in (select a from t); -- now it's supported -- 8. anti left outer semi join", "Plan": [ - "TableReader_51 8000.00 root data:ExchangeSender_50", + "TableReader_51 8000.00 root MppVersion: 1, data:ExchangeSender_50", "└─ExchangeSender_50 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_8 8000.00 mpp[tiflash] test.t.a", " └─Selection_49 8000.00 mpp[tiflash] or(gt(test.t.a, 1), Column#3)", @@ -644,7 +637,7 @@ "SQL": "EXPLAIN select count(*) from c, o where c.c_id=o.c_id; -- 1. test agg push down, scalar aggregate", "Plan": [ "HashAgg_13 1.00 root funcs:count(Column#7)->Column#6", - "└─TableReader_35 9990.00 root data:ExchangeSender_34", + "└─TableReader_35 9990.00 root MppVersion: 1, data:ExchangeSender_34", " └─ExchangeSender_34 9990.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin_14 9990.00 mpp[tiflash] inner join, equal:[eq(test.c.c_id, test.o.c_id)]", " ├─ExchangeReceiver_33(Build) 8000.00 mpp[tiflash] ", @@ -652,7 +645,7 @@ " │ └─Projection_28 8000.00 mpp[tiflash] Column#7, test.o.c_id", " │ └─HashAgg_29 8000.00 mpp[tiflash] group by:test.o.c_id, funcs:sum(Column#8)->Column#7, funcs:firstrow(test.o.c_id)->test.o.c_id", " │ └─ExchangeReceiver_31 8000.00 mpp[tiflash] ", - " │ └─ExchangeSender_30 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.o.c_id, collate: binary]", + " │ └─ExchangeSender_30 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.o.c_id, collate: binary]", " │ └─HashAgg_20 8000.00 mpp[tiflash] group by:test.o.c_id, funcs:count(1)->Column#8", " │ └─TableFullScan_27 10000.00 mpp[tiflash] table:o keep order:false, stats:pseudo", " └─Selection_18(Probe) 9990.00 mpp[tiflash] not(isnull(test.c.c_id))", @@ -663,20 +656,20 @@ { "SQL": "EXPLAIN select o.o_id, count(*) from c, o where c.c_id=o.c_id group by o.o_id; -- 2. test agg push down, group by non-join column", "Plan": [ - "TableReader_78 8000.00 root data:ExchangeSender_77", + "TableReader_78 8000.00 root MppVersion: 1, data:ExchangeSender_77", "└─ExchangeSender_77 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_10 8000.00 mpp[tiflash] test.o.o_id, Column#6", " └─Projection_76 8000.00 mpp[tiflash] Column#6, test.o.o_id", " └─HashAgg_75 8000.00 mpp[tiflash] group by:test.o.o_id, funcs:count(Column#7)->Column#6, funcs:firstrow(Column#8)->test.o.o_id", " └─ExchangeReceiver_71 9990.00 mpp[tiflash] ", - " └─ExchangeSender_70 9990.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.o.o_id, collate: binary]", + " └─ExchangeSender_70 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.o.o_id, collate: binary]", " └─HashJoin_69 9990.00 mpp[tiflash] inner join, equal:[eq(test.c.c_id, test.o.c_id)]", " ├─ExchangeReceiver_34(Build) 8000.00 mpp[tiflash] ", " │ └─ExchangeSender_33 8000.00 mpp[tiflash] ExchangeType: Broadcast", " │ └─Projection_29 8000.00 mpp[tiflash] Column#7, Column#8, test.o.o_id, test.o.c_id", " │ └─HashAgg_30 8000.00 mpp[tiflash] group by:test.o.c_id, test.o.o_id, funcs:sum(Column#9)->Column#7, funcs:firstrow(test.o.o_id)->Column#8, funcs:firstrow(test.o.o_id)->test.o.o_id, funcs:firstrow(test.o.c_id)->test.o.c_id", " │ └─ExchangeReceiver_32 8000.00 mpp[tiflash] ", - " │ └─ExchangeSender_31 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.o.o_id, collate: binary], [name: test.o.c_id, collate: binary]", + " │ └─ExchangeSender_31 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.o.o_id, collate: binary], [name: test.o.c_id, collate: binary]", " │ └─HashAgg_21 8000.00 mpp[tiflash] group by:test.o.c_id, test.o.o_id, funcs:count(1)->Column#9", " │ └─TableFullScan_28 10000.00 mpp[tiflash] table:o keep order:false, stats:pseudo", " └─Selection_19(Probe) 9990.00 mpp[tiflash] not(isnull(test.c.c_id))", @@ -687,20 +680,20 @@ { "SQL": "EXPLAIN select o.c_id, count(*) from c, o where c.c_id=o.c_id group by o.c_id; -- 3. test agg push down, group by join column", "Plan": [ - "TableReader_78 8000.00 root data:ExchangeSender_77", + "TableReader_78 8000.00 root MppVersion: 1, data:ExchangeSender_77", "└─ExchangeSender_77 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_10 8000.00 mpp[tiflash] test.o.c_id, Column#6", " └─Projection_76 8000.00 mpp[tiflash] Column#6, test.o.c_id", " └─HashAgg_75 8000.00 mpp[tiflash] group by:test.o.c_id, funcs:count(Column#7)->Column#6, funcs:firstrow(Column#8)->test.o.c_id", " └─ExchangeReceiver_71 9990.00 mpp[tiflash] ", - " └─ExchangeSender_70 9990.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.o.c_id, collate: binary]", + " └─ExchangeSender_70 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.o.c_id, collate: binary]", " └─HashJoin_69 9990.00 mpp[tiflash] inner join, equal:[eq(test.c.c_id, test.o.c_id)]", " ├─ExchangeReceiver_34(Build) 8000.00 mpp[tiflash] ", " │ └─ExchangeSender_33 8000.00 mpp[tiflash] ExchangeType: Broadcast", " │ └─Projection_29 8000.00 mpp[tiflash] Column#7, Column#8, test.o.c_id", " │ └─HashAgg_30 8000.00 mpp[tiflash] group by:test.o.c_id, funcs:sum(Column#9)->Column#7, funcs:firstrow(test.o.c_id)->Column#8, funcs:firstrow(test.o.c_id)->test.o.c_id", " │ └─ExchangeReceiver_32 8000.00 mpp[tiflash] ", - " │ └─ExchangeSender_31 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.o.c_id, collate: binary]", + " │ └─ExchangeSender_31 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.o.c_id, collate: binary]", " │ └─HashAgg_21 8000.00 mpp[tiflash] group by:test.o.c_id, funcs:count(1)->Column#9", " │ └─TableFullScan_28 10000.00 mpp[tiflash] table:o keep order:false, stats:pseudo", " └─Selection_19(Probe) 9990.00 mpp[tiflash] not(isnull(test.c.c_id))", @@ -721,17 +714,17 @@ { "SQL": "EXPLAIN select count(distinct c) from t group by d;", "Plan": [ - "TableReader_56 8000.00 root data:ExchangeSender_55", + "TableReader_56 8000.00 root MppVersion: 1, data:ExchangeSender_55", "└─ExchangeSender_55 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_51 8000.00 mpp[tiflash] Column#7", " └─HashAgg_52 8000.00 mpp[tiflash] group by:test.t.d, funcs:sum(Column#18)->Column#7", " └─ExchangeReceiver_54 8000.00 mpp[tiflash] ", - " └─ExchangeSender_53 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.d, collate: binary]", + " └─ExchangeSender_53 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.d, collate: binary]", " └─HashAgg_50 8000.00 mpp[tiflash] group by:test.t.d, funcs:count(test.t.c)->Column#18", " └─Projection_37 8000.00 mpp[tiflash] test.t.c, test.t.d", " └─HashAgg_38 8000.00 mpp[tiflash] group by:test.t.c, test.t.d, funcs:firstrow(test.t.c)->test.t.c, funcs:firstrow(test.t.d)->test.t.d", " └─ExchangeReceiver_40 8000.00 mpp[tiflash] ", - " └─ExchangeSender_39 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.d, collate: binary], [name: test.t.c, collate: binary]", + " └─ExchangeSender_39 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.d, collate: binary], [name: test.t.c, collate: binary]", " └─HashAgg_36 8000.00 mpp[tiflash] group by:test.t.c, test.t.d, ", " └─TableFullScan_26 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ], @@ -740,19 +733,19 @@ { "SQL": "EXPLAIN select count(distinct c), count(a) from t group by d;", "Plan": [ - "TableReader_57 8000.00 root data:ExchangeSender_56", + "TableReader_57 8000.00 root MppVersion: 1, data:ExchangeSender_56", "└─ExchangeSender_56 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_8 8000.00 mpp[tiflash] Column#7, cast(Column#10, bigint(21) BINARY)->Column#8", " └─Projection_52 8000.00 mpp[tiflash] Column#7, Column#10", " └─HashAgg_53 8000.00 mpp[tiflash] group by:test.t.d, funcs:sum(Column#27)->Column#7, funcs:sum(Column#28)->Column#10", " └─ExchangeReceiver_55 8000.00 mpp[tiflash] ", - " └─ExchangeSender_54 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.d, collate: binary]", + " └─ExchangeSender_54 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.d, collate: binary]", " └─HashAgg_51 8000.00 mpp[tiflash] group by:Column#31, funcs:count(Column#29)->Column#27, funcs:sum(Column#30)->Column#28", " └─Projection_58 8000.00 mpp[tiflash] test.t.c, cast(Column#9, decimal(20,0) BINARY)->Column#30, test.t.d", " └─Projection_38 8000.00 mpp[tiflash] test.t.c, Column#9, test.t.d", " └─HashAgg_39 8000.00 mpp[tiflash] group by:test.t.c, test.t.d, funcs:firstrow(test.t.c)->test.t.c, funcs:sum(Column#21)->Column#9, funcs:firstrow(test.t.d)->test.t.d", " └─ExchangeReceiver_41 8000.00 mpp[tiflash] ", - " └─ExchangeSender_40 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.d, collate: binary], [name: test.t.c, collate: binary]", + " └─ExchangeSender_40 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.d, collate: binary], [name: test.t.c, collate: binary]", " └─HashAgg_37 8000.00 mpp[tiflash] group by:test.t.c, test.t.d, funcs:count(test.t.a)->Column#21", " └─TableFullScan_27 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ], @@ -761,18 +754,18 @@ { "SQL": "EXPLAIN select count(distinct c) from t group by b+d;", "Plan": [ - "TableReader_56 8000.00 root data:ExchangeSender_55", + "TableReader_56 8000.00 root MppVersion: 1, data:ExchangeSender_55", "└─ExchangeSender_55 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_51 8000.00 mpp[tiflash] Column#7", " └─HashAgg_52 8000.00 mpp[tiflash] group by:Column#28, funcs:sum(Column#29)->Column#7", " └─ExchangeReceiver_54 8000.00 mpp[tiflash] ", - " └─ExchangeSender_53 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#28, collate: binary]", + " └─ExchangeSender_53 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#28, collate: binary]", " └─HashAgg_50 8000.00 mpp[tiflash] group by:Column#35, funcs:count(Column#34)->Column#29", " └─Projection_58 8000.00 mpp[tiflash] test.t.c, plus(test.t.b, cast(test.t.d, bigint(10) BINARY))->Column#35", " └─Projection_37 8000.00 mpp[tiflash] test.t.c, test.t.b, test.t.d", " └─HashAgg_38 8000.00 mpp[tiflash] group by:Column#20, test.t.c, funcs:firstrow(test.t.c)->test.t.c, funcs:firstrow(Column#22)->test.t.b, funcs:firstrow(Column#23)->test.t.d", " └─ExchangeReceiver_40 8000.00 mpp[tiflash] ", - " └─ExchangeSender_39 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c, collate: binary]", + " └─ExchangeSender_39 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c, collate: binary]", " └─HashAgg_36 8000.00 mpp[tiflash] group by:Column#32, Column#33, funcs:firstrow(Column#30)->Column#22, funcs:firstrow(Column#31)->Column#23", " └─Projection_57 10000.00 mpp[tiflash] test.t.b, test.t.d, plus(test.t.b, cast(test.t.d, bigint(10) BINARY))->Column#32, test.t.c", " └─TableFullScan_26 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -782,18 +775,18 @@ { "SQL": "EXPLAIN select count(distinct c) from t group by b+d, a+b;", "Plan": [ - "TableReader_56 8000.00 root data:ExchangeSender_55", + "TableReader_56 8000.00 root MppVersion: 1, data:ExchangeSender_55", "└─ExchangeSender_55 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_51 8000.00 mpp[tiflash] Column#7", " └─HashAgg_52 8000.00 mpp[tiflash] group by:Column#42, Column#43, funcs:sum(Column#44)->Column#7", " └─ExchangeReceiver_54 8000.00 mpp[tiflash] ", - " └─ExchangeSender_53 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#42, collate: binary], [name: Column#43, collate: binary]", + " └─ExchangeSender_53 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#42, collate: binary], [name: Column#43, collate: binary]", " └─HashAgg_50 8000.00 mpp[tiflash] group by:Column#53, Column#54, funcs:count(Column#52)->Column#44", " └─Projection_58 8000.00 mpp[tiflash] test.t.c, plus(test.t.b, cast(test.t.d, bigint(10) BINARY))->Column#53, plus(test.t.a, test.t.b)->Column#54", " └─Projection_37 8000.00 mpp[tiflash] test.t.c, test.t.b, test.t.d, test.t.a, test.t.b", " └─HashAgg_38 8000.00 mpp[tiflash] group by:Column#29, Column#30, test.t.c, funcs:firstrow(test.t.c)->test.t.c, funcs:firstrow(Column#32)->test.t.b, funcs:firstrow(Column#33)->test.t.d, funcs:firstrow(Column#34)->test.t.a, funcs:firstrow(Column#35)->test.t.b", " └─ExchangeReceiver_40 8000.00 mpp[tiflash] ", - " └─ExchangeSender_39 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c, collate: binary]", + " └─ExchangeSender_39 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c, collate: binary]", " └─HashAgg_36 8000.00 mpp[tiflash] group by:Column#49, Column#50, Column#51, funcs:firstrow(Column#45)->Column#32, funcs:firstrow(Column#46)->Column#33, funcs:firstrow(Column#47)->Column#34, funcs:firstrow(Column#48)->Column#35", " └─Projection_57 10000.00 mpp[tiflash] test.t.b, test.t.d, test.t.a, test.t.b, plus(test.t.b, cast(test.t.d, bigint(10) BINARY))->Column#49, plus(test.t.a, test.t.b)->Column#50, test.t.c", " └─TableFullScan_26 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -803,19 +796,19 @@ { "SQL": "EXPLAIN select count(distinct c), count(*) from t group by date_format(d,'%Y');", "Plan": [ - "TableReader_57 8000.00 root data:ExchangeSender_56", + "TableReader_57 8000.00 root MppVersion: 1, data:ExchangeSender_56", "└─ExchangeSender_56 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_8 8000.00 mpp[tiflash] Column#7, cast(Column#10, bigint(21) BINARY)->Column#8", " └─Projection_52 8000.00 mpp[tiflash] Column#7, Column#10", " └─HashAgg_53 8000.00 mpp[tiflash] group by:Column#33, funcs:sum(Column#34)->Column#7, funcs:sum(Column#35)->Column#10", " └─ExchangeReceiver_55 8000.00 mpp[tiflash] ", - " └─ExchangeSender_54 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#33, collate: utf8mb4_bin]", + " └─ExchangeSender_54 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#33, collate: utf8mb4_bin]", " └─HashAgg_51 8000.00 mpp[tiflash] group by:Column#41, funcs:count(Column#39)->Column#34, funcs:sum(Column#40)->Column#35", " └─Projection_59 8000.00 mpp[tiflash] test.t.c, cast(Column#9, decimal(20,0) BINARY)->Column#40, date_format(test.t.d, %Y)->Column#41", " └─Projection_38 8000.00 mpp[tiflash] test.t.c, Column#9, test.t.d", " └─HashAgg_39 8000.00 mpp[tiflash] group by:Column#23, test.t.c, funcs:firstrow(test.t.c)->test.t.c, funcs:sum(Column#25)->Column#9, funcs:firstrow(Column#26)->test.t.d", " └─ExchangeReceiver_41 8000.00 mpp[tiflash] ", - " └─ExchangeSender_40 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c, collate: binary]", + " └─ExchangeSender_40 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c, collate: binary]", " └─HashAgg_37 8000.00 mpp[tiflash] group by:Column#37, Column#38, funcs:count(1)->Column#25, funcs:firstrow(Column#36)->Column#26", " └─Projection_58 10000.00 mpp[tiflash] test.t.d, date_format(test.t.d, %Y)->Column#37, test.t.c", " └─TableFullScan_27 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -825,19 +818,19 @@ { "SQL": "EXPLAIN select date_format(d,'%Y') as df, sum(a), count(b), count(distinct c) from t group by date_format(d,'%Y');", "Plan": [ - "TableReader_57 8000.00 root data:ExchangeSender_56", + "TableReader_57 8000.00 root MppVersion: 1, data:ExchangeSender_56", "└─ExchangeSender_56 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_8 8000.00 mpp[tiflash] date_format(test.t.d, %Y)->Column#10, Column#7, cast(Column#14, bigint(21) BINARY)->Column#8, Column#9", " └─Projection_52 8000.00 mpp[tiflash] Column#7, Column#14, Column#9, test.t.d", " └─HashAgg_53 8000.00 mpp[tiflash] group by:Column#45, funcs:sum(Column#46)->Column#7, funcs:sum(Column#47)->Column#14, funcs:sum(Column#48)->Column#9, funcs:firstrow(Column#49)->test.t.d", " └─ExchangeReceiver_55 8000.00 mpp[tiflash] ", - " └─ExchangeSender_54 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#45, collate: utf8mb4_bin]", + " └─ExchangeSender_54 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#45, collate: utf8mb4_bin]", " └─HashAgg_51 8000.00 mpp[tiflash] group by:Column#59, funcs:sum(Column#55)->Column#46, funcs:sum(Column#56)->Column#47, funcs:count(Column#57)->Column#48, funcs:firstrow(Column#58)->Column#49", " └─Projection_59 8000.00 mpp[tiflash] Column#12, cast(Column#13, decimal(20,0) BINARY)->Column#56, test.t.c, test.t.d, date_format(test.t.d, %Y)->Column#59", " └─Projection_38 8000.00 mpp[tiflash] Column#12, Column#13, test.t.c, test.t.d", " └─HashAgg_39 8000.00 mpp[tiflash] group by:Column#30, test.t.c, funcs:sum(Column#31)->Column#12, funcs:sum(Column#32)->Column#13, funcs:firstrow(test.t.c)->test.t.c, funcs:firstrow(Column#34)->test.t.d", " └─ExchangeReceiver_41 8000.00 mpp[tiflash] ", - " └─ExchangeSender_40 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c, collate: binary]", + " └─ExchangeSender_40 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c, collate: binary]", " └─HashAgg_37 8000.00 mpp[tiflash] group by:Column#53, Column#54, funcs:sum(Column#50)->Column#31, funcs:count(Column#51)->Column#32, funcs:firstrow(Column#52)->Column#34", " └─Projection_58 10000.00 mpp[tiflash] cast(test.t.a, decimal(10,0) BINARY)->Column#50, test.t.b, test.t.d, date_format(test.t.d, %Y)->Column#53, test.t.c", " └─TableFullScan_27 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -847,19 +840,19 @@ { "SQL": "EXPLAIN select d, count(distinct c), sum(a), max(b), count(*) from t group by d;", "Plan": [ - "TableReader_57 8000.00 root data:ExchangeSender_56", + "TableReader_57 8000.00 root MppVersion: 1, data:ExchangeSender_56", "└─ExchangeSender_56 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_8 8000.00 mpp[tiflash] test.t.d, Column#7, Column#8, Column#9, cast(Column#14, bigint(21) BINARY)->Column#10", " └─Projection_52 8000.00 mpp[tiflash] Column#7, Column#8, Column#9, Column#14, test.t.d", " └─HashAgg_53 8000.00 mpp[tiflash] group by:test.t.d, funcs:sum(Column#45)->Column#7, funcs:sum(Column#46)->Column#8, funcs:max(Column#47)->Column#9, funcs:sum(Column#48)->Column#14, funcs:firstrow(test.t.d)->test.t.d", " └─ExchangeReceiver_55 8000.00 mpp[tiflash] ", - " └─ExchangeSender_54 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.d, collate: binary]", + " └─ExchangeSender_54 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.d, collate: binary]", " └─HashAgg_51 8000.00 mpp[tiflash] group by:Column#58, funcs:count(Column#54)->Column#45, funcs:sum(Column#55)->Column#46, funcs:max(Column#56)->Column#47, funcs:sum(Column#57)->Column#48", " └─Projection_59 8000.00 mpp[tiflash] test.t.c, Column#11, Column#12, cast(Column#13, decimal(20,0) BINARY)->Column#57, test.t.d", " └─Projection_38 8000.00 mpp[tiflash] test.t.c, Column#11, Column#12, Column#13, test.t.d", " └─HashAgg_39 8000.00 mpp[tiflash] group by:test.t.c, test.t.d, funcs:firstrow(test.t.c)->test.t.c, funcs:sum(Column#31)->Column#11, funcs:max(Column#32)->Column#12, funcs:sum(Column#33)->Column#13, funcs:firstrow(test.t.d)->test.t.d", " └─ExchangeReceiver_41 8000.00 mpp[tiflash] ", - " └─ExchangeSender_40 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.d, collate: binary], [name: test.t.c, collate: binary]", + " └─ExchangeSender_40 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.d, collate: binary], [name: test.t.c, collate: binary]", " └─HashAgg_37 8000.00 mpp[tiflash] group by:Column#52, Column#53, funcs:sum(Column#50)->Column#31, funcs:max(Column#51)->Column#32, funcs:count(1)->Column#33", " └─Projection_58 10000.00 mpp[tiflash] cast(test.t.a, decimal(10,0) BINARY)->Column#50, test.t.b, test.t.d, test.t.c", " └─TableFullScan_27 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -869,19 +862,19 @@ { "SQL": "EXPLAIN select date_format(d,'%Y') as df, count(distinct c) from t group by date_format(d,'%Y');", "Plan": [ - "TableReader_56 8000.00 root data:ExchangeSender_55", + "TableReader_56 8000.00 root MppVersion: 1, data:ExchangeSender_55", "└─ExchangeSender_55 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_7 8000.00 mpp[tiflash] date_format(test.t.d, %Y)->Column#8, Column#7", " └─Projection_51 8000.00 mpp[tiflash] Column#7, test.t.d", " └─HashAgg_52 8000.00 mpp[tiflash] group by:Column#28, funcs:sum(Column#29)->Column#7, funcs:firstrow(Column#30)->test.t.d", " └─ExchangeReceiver_54 8000.00 mpp[tiflash] ", - " └─ExchangeSender_53 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#28, collate: utf8mb4_bin]", + " └─ExchangeSender_53 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#28, collate: utf8mb4_bin]", " └─HashAgg_50 8000.00 mpp[tiflash] group by:Column#36, funcs:count(Column#34)->Column#29, funcs:firstrow(Column#35)->Column#30", " └─Projection_58 8000.00 mpp[tiflash] test.t.c, test.t.d, date_format(test.t.d, %Y)->Column#36", " └─Projection_37 8000.00 mpp[tiflash] test.t.c, test.t.d", " └─HashAgg_38 8000.00 mpp[tiflash] group by:Column#19, test.t.c, funcs:firstrow(test.t.c)->test.t.c, funcs:firstrow(Column#21)->test.t.d", " └─ExchangeReceiver_40 8000.00 mpp[tiflash] ", - " └─ExchangeSender_39 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c, collate: binary]", + " └─ExchangeSender_39 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c, collate: binary]", " └─HashAgg_36 8000.00 mpp[tiflash] group by:Column#32, Column#33, funcs:firstrow(Column#31)->Column#21", " └─Projection_57 10000.00 mpp[tiflash] test.t.d, date_format(test.t.d, %Y)->Column#32, test.t.c", " └─TableFullScan_26 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -891,19 +884,19 @@ { "SQL": "EXPLAIN select date_format(d,'%Y') as df, a, count(b), count(distinct c) from t group by date_format(d,'%Y'), a;", "Plan": [ - "TableReader_57 8000.00 root data:ExchangeSender_56", + "TableReader_57 8000.00 root MppVersion: 1, data:ExchangeSender_56", "└─ExchangeSender_56 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_8 8000.00 mpp[tiflash] date_format(test.t.d, %Y)->Column#9, test.t.a, cast(Column#12, bigint(21) BINARY)->Column#7, Column#8", " └─Projection_52 8000.00 mpp[tiflash] Column#12, Column#8, test.t.a, test.t.d", " └─HashAgg_53 8000.00 mpp[tiflash] group by:Column#43, test.t.a, funcs:sum(Column#44)->Column#12, funcs:sum(Column#45)->Column#8, funcs:firstrow(test.t.a)->test.t.a, funcs:firstrow(Column#47)->test.t.d", " └─ExchangeReceiver_55 8000.00 mpp[tiflash] ", - " └─ExchangeSender_54 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary]", + " └─ExchangeSender_54 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", " └─HashAgg_51 8000.00 mpp[tiflash] group by:Column#56, Column#57, funcs:sum(Column#53)->Column#44, funcs:count(Column#54)->Column#45, funcs:firstrow(Column#55)->Column#47", " └─Projection_59 8000.00 mpp[tiflash] cast(Column#11, decimal(20,0) BINARY)->Column#53, test.t.c, test.t.d, date_format(test.t.d, %Y)->Column#56, test.t.a", " └─Projection_38 8000.00 mpp[tiflash] Column#11, test.t.c, test.t.a, test.t.d", " └─HashAgg_39 8000.00 mpp[tiflash] group by:Column#28, test.t.a, test.t.c, funcs:sum(Column#29)->Column#11, funcs:firstrow(test.t.c)->test.t.c, funcs:firstrow(test.t.a)->test.t.a, funcs:firstrow(Column#32)->test.t.d", " └─ExchangeReceiver_41 8000.00 mpp[tiflash] ", - " └─ExchangeSender_40 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.c, collate: binary]", + " └─ExchangeSender_40 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.c, collate: binary]", " └─HashAgg_37 8000.00 mpp[tiflash] group by:Column#50, Column#51, Column#52, funcs:count(Column#48)->Column#29, funcs:firstrow(Column#49)->Column#32", " └─Projection_58 10000.00 mpp[tiflash] test.t.b, test.t.d, date_format(test.t.d, %Y)->Column#50, test.t.a, test.t.c", " └─TableFullScan_27 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -913,19 +906,19 @@ { "SQL": "EXPLAIN select date_format(d,'%Y') as df, a, count(b), avg(distinct c) from t group by date_format(d,'%Y'), a;", "Plan": [ - "TableReader_57 8000.00 root data:ExchangeSender_56", + "TableReader_57 8000.00 root MppVersion: 1, data:ExchangeSender_56", "└─ExchangeSender_56 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_8 8000.00 mpp[tiflash] date_format(test.t.d, %Y)->Column#9, test.t.a, cast(Column#12, bigint(21) BINARY)->Column#7, Column#8", " └─Projection_52 8000.00 mpp[tiflash] Column#12, div(Column#8, cast(case(eq(Column#46, 0), 1, Column#46), decimal(20,0) BINARY))->Column#8, test.t.a, test.t.d", " └─HashAgg_53 8000.00 mpp[tiflash] group by:Column#47, test.t.a, funcs:sum(Column#48)->Column#12, funcs:sum(Column#49)->Column#46, funcs:sum(Column#50)->Column#8, funcs:firstrow(test.t.a)->test.t.a, funcs:firstrow(Column#52)->test.t.d", " └─ExchangeReceiver_55 8000.00 mpp[tiflash] ", - " └─ExchangeSender_54 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary]", + " └─ExchangeSender_54 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", " └─HashAgg_51 8000.00 mpp[tiflash] group by:Column#62, Column#63, funcs:sum(Column#58)->Column#48, funcs:count(Column#59)->Column#49, funcs:sum(Column#60)->Column#50, funcs:firstrow(Column#61)->Column#52", " └─Projection_59 8000.00 mpp[tiflash] cast(Column#11, decimal(20,0) BINARY)->Column#58, test.t.c, cast(test.t.c, decimal(20,0) BINARY)->Column#60, test.t.d, date_format(test.t.d, %Y)->Column#62, test.t.a", " └─Projection_38 8000.00 mpp[tiflash] Column#11, test.t.c, test.t.a, test.t.d", " └─HashAgg_39 8000.00 mpp[tiflash] group by:Column#28, test.t.a, test.t.c, funcs:sum(Column#29)->Column#11, funcs:firstrow(test.t.c)->test.t.c, funcs:firstrow(test.t.a)->test.t.a, funcs:firstrow(Column#32)->test.t.d", " └─ExchangeReceiver_41 8000.00 mpp[tiflash] ", - " └─ExchangeSender_40 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.c, collate: binary]", + " └─ExchangeSender_40 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.c, collate: binary]", " └─HashAgg_37 8000.00 mpp[tiflash] group by:Column#55, Column#56, Column#57, funcs:count(Column#53)->Column#29, funcs:firstrow(Column#54)->Column#32", " └─Projection_58 10000.00 mpp[tiflash] test.t.b, test.t.d, date_format(test.t.d, %Y)->Column#55, test.t.a, test.t.c", " └─TableFullScan_27 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -962,7 +955,7 @@ { "SQL": "EXPLAIN select count(b), count(distinct c) from t; -- single distinct func but no group key, bail out", "Plan": [ - "TableReader_34 1.00 root data:ExchangeSender_33", + "TableReader_34 1.00 root MppVersion: 1, data:ExchangeSender_33", "└─ExchangeSender_33 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_27 1.00 mpp[tiflash] Column#7, Column#8", " └─HashAgg_28 1.00 mpp[tiflash] funcs:sum(Column#13)->Column#7, funcs:sum(Column#14)->Column#8", @@ -970,7 +963,7 @@ " └─ExchangeSender_31 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg_28 1.00 mpp[tiflash] funcs:sum(Column#12)->Column#13, funcs:count(distinct test.t.c)->Column#14", " └─ExchangeReceiver_30 1.00 mpp[tiflash] ", - " └─ExchangeSender_29 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c, collate: binary]", + " └─ExchangeSender_29 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c, collate: binary]", " └─HashAgg_26 1.00 mpp[tiflash] group by:test.t.c, funcs:count(test.t.b)->Column#12", " └─TableFullScan_13 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ], @@ -989,7 +982,7 @@ { "SQL": "EXPLAIN select count(distinct b) from t;", "Plan": [ - "TableReader_34 1.00 root data:ExchangeSender_33", + "TableReader_34 1.00 root MppVersion: 1, data:ExchangeSender_33", "└─ExchangeSender_33 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_27 1.00 mpp[tiflash] Column#7", " └─HashAgg_28 1.00 mpp[tiflash] funcs:sum(Column#9)->Column#7", @@ -997,7 +990,7 @@ " └─ExchangeSender_31 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg_28 1.00 mpp[tiflash] funcs:count(distinct test.t.b)->Column#9", " └─ExchangeReceiver_30 1.00 mpp[tiflash] ", - " └─ExchangeSender_29 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.b, collate: binary]", + " └─ExchangeSender_29 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.b, collate: binary]", " └─HashAgg_26 1.00 mpp[tiflash] group by:test.t.b, ", " └─TableFullScan_13 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ], @@ -1006,7 +999,7 @@ { "SQL": "EXPLAIN select count(distinct c) from t;", "Plan": [ - "TableReader_34 1.00 root data:ExchangeSender_33", + "TableReader_34 1.00 root MppVersion: 1, data:ExchangeSender_33", "└─ExchangeSender_33 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_27 1.00 mpp[tiflash] Column#7", " └─HashAgg_28 1.00 mpp[tiflash] funcs:sum(Column#9)->Column#7", @@ -1014,7 +1007,7 @@ " └─ExchangeSender_31 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg_28 1.00 mpp[tiflash] funcs:count(distinct test.t.c)->Column#9", " └─ExchangeReceiver_30 1.00 mpp[tiflash] ", - " └─ExchangeSender_29 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c, collate: binary]", + " └─ExchangeSender_29 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c, collate: binary]", " └─HashAgg_26 1.00 mpp[tiflash] group by:test.t.c, ", " └─TableFullScan_13 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ], @@ -1023,7 +1016,7 @@ { "SQL": "EXPLAIN select count(distinct e) from t;", "Plan": [ - "TableReader_34 1.00 root data:ExchangeSender_33", + "TableReader_34 1.00 root MppVersion: 1, data:ExchangeSender_33", "└─ExchangeSender_33 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_27 1.00 mpp[tiflash] Column#7", " └─HashAgg_28 1.00 mpp[tiflash] funcs:sum(Column#9)->Column#7", @@ -1031,7 +1024,7 @@ " └─ExchangeSender_31 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg_28 1.00 mpp[tiflash] funcs:count(distinct test.t.e)->Column#9", " └─ExchangeReceiver_30 1.00 mpp[tiflash] ", - " └─ExchangeSender_29 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.e, collate: utf8mb4_general_ci]", + " └─ExchangeSender_29 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.e, collate: utf8mb4_general_ci]", " └─HashAgg_26 1.00 mpp[tiflash] group by:test.t.e, ", " └─TableFullScan_13 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ], @@ -1040,7 +1033,7 @@ { "SQL": "EXPLAIN select count(distinct a,b,c,e) from t;", "Plan": [ - "TableReader_34 1.00 root data:ExchangeSender_33", + "TableReader_34 1.00 root MppVersion: 1, data:ExchangeSender_33", "└─ExchangeSender_33 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_27 1.00 mpp[tiflash] Column#7", " └─HashAgg_28 1.00 mpp[tiflash] funcs:sum(Column#9)->Column#7", @@ -1048,7 +1041,7 @@ " └─ExchangeSender_31 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg_28 1.00 mpp[tiflash] funcs:count(distinct test.t.a, test.t.b, test.t.c, test.t.e)->Column#9", " └─ExchangeReceiver_30 1.00 mpp[tiflash] ", - " └─ExchangeSender_29 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.b, collate: binary], [name: test.t.c, collate: binary], [name: test.t.e, collate: utf8mb4_general_ci]", + " └─ExchangeSender_29 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.b, collate: binary], [name: test.t.c, collate: binary], [name: test.t.e, collate: utf8mb4_general_ci]", " └─HashAgg_26 1.00 mpp[tiflash] group by:test.t.a, test.t.b, test.t.c, test.t.e, ", " └─TableFullScan_13 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ], @@ -1057,7 +1050,7 @@ { "SQL": "EXPLAIN select count(distinct c), count(a), count(*) from t;", "Plan": [ - "TableReader_34 1.00 root data:ExchangeSender_33", + "TableReader_34 1.00 root MppVersion: 1, data:ExchangeSender_33", "└─ExchangeSender_33 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_27 1.00 mpp[tiflash] Column#7, Column#8, Column#9", " └─HashAgg_28 1.00 mpp[tiflash] funcs:sum(Column#17)->Column#7, funcs:sum(Column#18)->Column#8, funcs:sum(Column#19)->Column#9", @@ -1065,7 +1058,7 @@ " └─ExchangeSender_31 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg_28 1.00 mpp[tiflash] funcs:count(distinct test.t.c)->Column#17, funcs:sum(Column#15)->Column#18, funcs:sum(Column#16)->Column#19", " └─ExchangeReceiver_30 1.00 mpp[tiflash] ", - " └─ExchangeSender_29 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c, collate: binary]", + " └─ExchangeSender_29 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c, collate: binary]", " └─HashAgg_26 1.00 mpp[tiflash] group by:test.t.c, funcs:count(test.t.a)->Column#15, funcs:count(1)->Column#16", " └─TableFullScan_13 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ], @@ -1074,7 +1067,7 @@ { "SQL": "EXPLAIN select sum(b), count(a), count(*), count(distinct c) from t;", "Plan": [ - "TableReader_34 1.00 root data:ExchangeSender_33", + "TableReader_34 1.00 root MppVersion: 1, data:ExchangeSender_33", "└─ExchangeSender_33 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_27 1.00 mpp[tiflash] Column#7, Column#8, Column#9, Column#10", " └─HashAgg_28 1.00 mpp[tiflash] funcs:sum(Column#21)->Column#7, funcs:sum(Column#22)->Column#8, funcs:sum(Column#23)->Column#9, funcs:sum(Column#24)->Column#10", @@ -1082,7 +1075,7 @@ " └─ExchangeSender_31 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg_28 1.00 mpp[tiflash] funcs:sum(Column#18)->Column#21, funcs:sum(Column#19)->Column#22, funcs:sum(Column#20)->Column#23, funcs:count(distinct test.t.c)->Column#24", " └─ExchangeReceiver_30 1.00 mpp[tiflash] ", - " └─ExchangeSender_29 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c, collate: binary]", + " └─ExchangeSender_29 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c, collate: binary]", " └─HashAgg_26 1.00 mpp[tiflash] group by:Column#27, funcs:sum(Column#25)->Column#18, funcs:count(Column#26)->Column#19, funcs:count(1)->Column#20", " └─Projection_35 10000.00 mpp[tiflash] cast(test.t.b, decimal(20,0) BINARY)->Column#25, test.t.a, test.t.c", " └─TableFullScan_13 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -1092,7 +1085,7 @@ { "SQL": "EXPLAIN select sum(b+a), count(*), count(distinct c), count(a) from t having count(distinct c) > 2;", "Plan": [ - "TableReader_41 0.80 root data:ExchangeSender_40", + "TableReader_41 0.80 root MppVersion: 1, data:ExchangeSender_40", "└─ExchangeSender_40 0.80 mpp[tiflash] ExchangeType: PassThrough", " └─Selection_39 0.80 mpp[tiflash] gt(Column#9, 2)", " └─Projection_31 1.00 mpp[tiflash] Column#7, Column#8, Column#9, Column#10", @@ -1101,7 +1094,7 @@ " └─ExchangeSender_35 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg_32 1.00 mpp[tiflash] funcs:sum(Column#22)->Column#25, funcs:sum(Column#23)->Column#26, funcs:count(distinct test.t.c)->Column#27, funcs:sum(Column#24)->Column#28", " └─ExchangeReceiver_34 1.00 mpp[tiflash] ", - " └─ExchangeSender_33 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c, collate: binary]", + " └─ExchangeSender_33 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c, collate: binary]", " └─HashAgg_30 1.00 mpp[tiflash] group by:Column#31, funcs:sum(Column#29)->Column#22, funcs:count(1)->Column#23, funcs:count(Column#30)->Column#24", " └─Projection_42 10000.00 mpp[tiflash] cast(plus(test.t.b, test.t.a), decimal(20,0) BINARY)->Column#29, test.t.a, test.t.c", " └─TableFullScan_17 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -1111,7 +1104,7 @@ { "SQL": "EXPLAIN select sum(b+a), count(*), count(a) from t having count(distinct c) > 2;", "Plan": [ - "TableReader_41 0.80 root data:ExchangeSender_40", + "TableReader_41 0.80 root MppVersion: 1, data:ExchangeSender_40", "└─ExchangeSender_40 0.80 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_7 0.80 mpp[tiflash] Column#7, Column#8, Column#9", " └─Selection_39 0.80 mpp[tiflash] gt(Column#10, 2)", @@ -1121,7 +1114,7 @@ " └─ExchangeSender_35 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg_32 1.00 mpp[tiflash] funcs:sum(Column#21)->Column#24, funcs:sum(Column#22)->Column#25, funcs:sum(Column#23)->Column#26, funcs:count(distinct test.t.c)->Column#27", " └─ExchangeReceiver_34 1.00 mpp[tiflash] ", - " └─ExchangeSender_33 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c, collate: binary]", + " └─ExchangeSender_33 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c, collate: binary]", " └─HashAgg_30 1.00 mpp[tiflash] group by:Column#30, funcs:sum(Column#28)->Column#21, funcs:count(1)->Column#22, funcs:count(Column#29)->Column#23", " └─Projection_42 10000.00 mpp[tiflash] cast(plus(test.t.b, test.t.a), decimal(20,0) BINARY)->Column#28, test.t.a, test.t.c", " └─TableFullScan_17 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -1131,7 +1124,7 @@ { "SQL": "EXPLAIN select sum(b+a), max(b), count(distinct c), count(*) from t having count(a) > 2;", "Plan": [ - "TableReader_41 0.80 root data:ExchangeSender_40", + "TableReader_41 0.80 root MppVersion: 1, data:ExchangeSender_40", "└─ExchangeSender_40 0.80 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_7 0.80 mpp[tiflash] Column#7, Column#8, Column#9, Column#10", " └─Selection_39 0.80 mpp[tiflash] gt(Column#11, 2)", @@ -1141,7 +1134,7 @@ " └─ExchangeSender_35 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg_32 1.00 mpp[tiflash] funcs:sum(Column#25)->Column#29, funcs:max(Column#26)->Column#30, funcs:count(distinct test.t.c)->Column#31, funcs:sum(Column#27)->Column#32, funcs:sum(Column#28)->Column#33", " └─ExchangeReceiver_34 1.00 mpp[tiflash] ", - " └─ExchangeSender_33 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c, collate: binary]", + " └─ExchangeSender_33 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c, collate: binary]", " └─HashAgg_30 1.00 mpp[tiflash] group by:Column#37, funcs:sum(Column#34)->Column#25, funcs:max(Column#35)->Column#26, funcs:count(1)->Column#27, funcs:count(Column#36)->Column#28", " └─Projection_42 10000.00 mpp[tiflash] cast(plus(test.t.b, test.t.a), decimal(20,0) BINARY)->Column#34, test.t.b, test.t.a, test.t.c", " └─TableFullScan_17 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -1151,7 +1144,7 @@ { "SQL": "EXPLAIN select sum(b), count(distinct a, b, e), count(a+b) from t;", "Plan": [ - "TableReader_34 1.00 root data:ExchangeSender_33", + "TableReader_34 1.00 root MppVersion: 1, data:ExchangeSender_33", "└─ExchangeSender_33 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_27 1.00 mpp[tiflash] Column#7, Column#8, Column#9", " └─HashAgg_28 1.00 mpp[tiflash] funcs:sum(Column#17)->Column#7, funcs:sum(Column#18)->Column#8, funcs:sum(Column#19)->Column#9", @@ -1159,7 +1152,7 @@ " └─ExchangeSender_31 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg_28 1.00 mpp[tiflash] funcs:sum(Column#15)->Column#17, funcs:count(distinct test.t.a, test.t.b, test.t.e)->Column#18, funcs:sum(Column#16)->Column#19", " └─ExchangeReceiver_30 1.00 mpp[tiflash] ", - " └─ExchangeSender_29 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.b, collate: binary], [name: test.t.e, collate: utf8mb4_general_ci]", + " └─ExchangeSender_29 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.b, collate: binary], [name: test.t.e, collate: utf8mb4_general_ci]", " └─HashAgg_26 1.00 mpp[tiflash] group by:Column#22, Column#23, Column#24, funcs:sum(Column#20)->Column#15, funcs:count(Column#21)->Column#16", " └─Projection_35 10000.00 mpp[tiflash] cast(test.t.b, decimal(20,0) BINARY)->Column#20, plus(test.t.a, test.t.b)->Column#21, test.t.a, test.t.b, test.t.e", " └─TableFullScan_13 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -1182,7 +1175,7 @@ { "SQL": "EXPLAIN select count(distinct c+a), count(a) from t;", "Plan": [ - "TableReader_30 1.00 root data:ExchangeSender_29", + "TableReader_30 1.00 root MppVersion: 1, data:ExchangeSender_29", "└─ExchangeSender_29 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_25 1.00 mpp[tiflash] Column#7, Column#8", " └─HashAgg_26 1.00 mpp[tiflash] funcs:count(distinct Column#11)->Column#7, funcs:sum(Column#12)->Column#8", @@ -1197,7 +1190,7 @@ { "SQL": "EXPLAIN select sum(b), count(distinct c+a, b, e), count(a+b) from t;", "Plan": [ - "TableReader_30 1.00 root data:ExchangeSender_29", + "TableReader_30 1.00 root MppVersion: 1, data:ExchangeSender_29", "└─ExchangeSender_29 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_25 1.00 mpp[tiflash] Column#7, Column#8, Column#9", " └─HashAgg_26 1.00 mpp[tiflash] funcs:sum(Column#13)->Column#7, funcs:count(distinct Column#14, test.t.b, test.t.e)->Column#8, funcs:sum(Column#15)->Column#9", diff --git a/planner/core/testdata/expression_rewriter_suite_out.json b/planner/core/testdata/expression_rewriter_suite_out.json index b7f5a31f7a46a..72b86884a1412 100644 --- a/planner/core/testdata/expression_rewriter_suite_out.json +++ b/planner/core/testdata/expression_rewriter_suite_out.json @@ -7,10 +7,9 @@ "Plan": [ "HashJoin 2.25 root inner join, equal:[eq(test.t1.a, test.t2.a) eq(test.t1.b, test.t2.b)]", "├─HashAgg(Build) 1.69 root group by:test.t2.a, test.t2.b, funcs:firstrow(test.t2.a)->test.t2.a, funcs:firstrow(test.t2.b)->test.t2.b", - "│ └─TableReader 1.69 root data:HashAgg", - "│ └─HashAgg 1.69 cop[tikv] group by:test.t2.a, test.t2.b, ", - "│ └─Selection 2.25 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ └─TableFullScan 4.00 cop[tikv] table:t2 keep order:false", + "│ └─TableReader 2.25 root data:Selection", + "│ └─Selection 2.25 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ └─TableFullScan 4.00 cop[tikv] table:t2 keep order:false", "└─TableReader(Probe) 2.25 root data:Selection", " └─Selection 2.25 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", " └─TableFullScan 4.00 cop[tikv] table:t1 keep order:false" @@ -37,15 +36,13 @@ "Plan": [ "HashJoin 1.69 root inner join, equal:[eq(test.t2.a, test.t1.a) eq(test.t2.b, Column#7)]", "├─HashAgg(Build) 1.69 root group by:test.t2.a, test.t2.b, funcs:firstrow(test.t2.a)->test.t2.a, funcs:firstrow(test.t2.b)->test.t2.b", - "│ └─TableReader 1.69 root data:HashAgg", - "│ └─HashAgg 1.69 cop[tikv] group by:test.t2.a, test.t2.b, ", - "│ └─Selection 2.25 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ └─TableFullScan 4.00 cop[tikv] table:t2 keep order:false", - "└─HashAgg(Probe) 2.25 root group by:test.t1.a, funcs:count(Column#14)->Column#7, funcs:firstrow(test.t1.a)->test.t1.a", - " └─TableReader 2.25 root data:HashAgg", - " └─HashAgg 2.25 cop[tikv] group by:test.t1.a, funcs:count(1)->Column#14", - " └─Selection 3.00 cop[tikv] not(isnull(test.t1.a))", - " └─TableFullScan 4.00 cop[tikv] table:t1 keep order:false" + "│ └─TableReader 2.25 root data:Selection", + "│ └─Selection 2.25 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ └─TableFullScan 4.00 cop[tikv] table:t2 keep order:false", + "└─HashAgg(Probe) 2.25 root group by:test.t1.a, funcs:count(1)->Column#7, funcs:firstrow(test.t1.a)->test.t1.a", + " └─TableReader 3.00 root data:Selection", + " └─Selection 3.00 cop[tikv] not(isnull(test.t1.a))", + " └─TableFullScan 4.00 cop[tikv] table:t1 keep order:false" ], "Res": [ "1" @@ -57,10 +54,9 @@ "HashJoin 2.40 root CARTESIAN anti semi join, other cond:eq(Column#7, test.t2.b), eq(test.t1.a, test.t2.a)", "├─TableReader(Build) 4.00 root data:TableFullScan", "│ └─TableFullScan 4.00 cop[tikv] table:t2 keep order:false", - "└─HashAgg(Probe) 3.00 root group by:test.t1.a, funcs:count(Column#12)->Column#7, funcs:firstrow(test.t1.a)->test.t1.a", - " └─TableReader 3.00 root data:HashAgg", - " └─HashAgg 3.00 cop[tikv] group by:test.t1.a, funcs:count(1)->Column#12", - " └─TableFullScan 4.00 cop[tikv] table:t1 keep order:false" + "└─HashAgg(Probe) 3.00 root group by:test.t1.a, funcs:count(1)->Column#7, funcs:firstrow(test.t1.a)->test.t1.a", + " └─TableReader 4.00 root data:TableFullScan", + " └─TableFullScan 4.00 cop[tikv] table:t1 keep order:false" ], "Res": [ "4" @@ -73,9 +69,9 @@ "Cases": [ { "Plan": [ - "HashAgg 1.00 root funcs:bit_or(Column#5)->Column#4", - "└─TableReader 1.00 root data:HashAgg", - " └─HashAgg 1.00 cop[tikv] funcs:bit_or(cast(mul(cast(test.t.a, double BINARY), cast(test.t.b, double BINARY)), bigint(20) BINARY))->Column#5", + "StreamAgg 1.00 root funcs:bit_or(Column#6)->Column#4", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:bit_or(cast(mul(cast(test.t.a, double BINARY), cast(test.t.b, double BINARY)), bigint(20) BINARY))->Column#6", " └─TableFullScan 1.00 cop[tikv] table:t keep order:false" ] } diff --git a/planner/core/testdata/index_merge_suite_in.json b/planner/core/testdata/index_merge_suite_in.json index 55c9c1cca1f7c..d660364305397 100644 --- a/planner/core/testdata/index_merge_suite_in.json +++ b/planner/core/testdata/index_merge_suite_in.json @@ -1,4 +1,105 @@ [ + { + "name": "TestEnforceMVIndex", + "cases": [ + "select /*+ use_index(t, kj) */ * from t", + "select /*+ use_index(t, kj) */ a from t", + "select /*+ use_index(t, kj) */ * from t where a<10", + "select /*+ use_index(t, kj) */ * from t where (1 member of (j))", + "select /*+ use_index(t, kj) */ * from t where (1 member of (j)) and a=10", + "select /*+ use_index(t, kj) */ * from t where (1 member of (j)) or a=10", + "select /*+ use_index_merge(t, kj) */ * from t", + "select /*+ use_index_merge(t, kj) */ a from t", + "select /*+ use_index_merge(t, kj) */ * from t where a<10", + "select /*+ use_index_merge(t, kj) */ * from t where (1 member of (j)) or a=10" + ] + }, + { + "name": "TestIndexMergeJSONMemberOf", + "cases": [ + "select /*+ use_index_merge(t, j0_0) */ * from t where (1 member of (j0->'$.path0'))", + "select /*+ use_index_merge(t, j0_1) */ * from t where (1 member of (j0->'$.path1')) and a<10", + "select /*+ use_index_merge(t, j0_1) */ * from t where (1 member of (j0->'$.XXX')) and a<10", + "select /*+ use_index_merge(t, j0_1) */ * from t where (1 member of (j0->'$.path1')) and (2 member of (j1)) and a<10", + "select /*+ use_index(t, j0_0) */ * from t where (1 member of (j0->'$.path0'))", + "select /*+ use_index(t, j0_1) */ * from t where (1 member of (j0->'$.path1')) and a<10", + "select * from t use index(j0_0) where (1 member of (j0->'$.path0'))", + "select * from t use index(j0_1) where (1 member of (j0->'$.path1')) and a<10", + "select * from t force index(j0_0) where (1 member of (j0->'$.path0'))", + "select * from t force index(j0_1) where (1 member of (j0->'$.path1')) and a<10", + "select /*+ use_index_merge(t, j1) */ * from t where (1 member of (j0->'$.path1')) and (2 member of (j1)) and a<10", + "select /*+ use_index_merge(t, j0_0) */ * from t where json_contains((j0->'$.path0'), '[1, 2, 3]')", + "select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps((j0->'$.path0'), '[1, 2, 3]')", + "select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps('[1, 2, 3]', (j0->'$.path0'))", + "select /*+ use_index_merge(t, j0_0) */ * from t where json_contains((j0->'$.path0'), '[1, 2, 3]') and a<10", + "select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps((j0->'$.path0'), '[1, 2, 3]') and a<10", + "select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps('[1, 2, 3]', (j0->'$.path0')) and a<10", + "select /*+ use_index_merge(t, j0_0) */ * from t where json_contains((j0->'$.path0'), '1')", + "select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps((j0->'$.path0'), '1')", + "select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps('1', (j0->'$.path0'))", + "select /*+ use_index_merge(t, j0_0) */ * from t where json_contains((j0->'$.path0'), '1') and a<10", + "select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps((j0->'$.path0'), '1') and a<10", + "select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps('1', (j0->'$.path0')) and a<10", + "select /*+ use_index_merge(t, j0_string) */ * from t where (\"a\" member of (j0->'$.path_string'))", + "select /*+ use_index_merge(t, j0_string) */ * from t where (\"a\" member of (j0->'$.path_string')) and a<10", + "select /*+ use_index_merge(t, j0_string) */ * from t where json_contains((j0->'$.path_string'), '[\"a\", \"b\", \"c\"]')", + "select /*+ use_index_merge(t, j0_string) */ * from t where json_contains((j0->'$.path_string'), '[\"a\", \"b\", \"c\"]') and a<10", + "select /*+ use_index_merge(t, j0_string) */ * from t where json_overlaps((j0->'$.path_string'), '[\"a\", \"b\", \"c\"]')", + "select /*+ use_index_merge(t, j0_string) */ * from t where json_overlaps((j0->'$.path_string'), '[\"a\", \"b\", \"c\"]') and a<10", + "select /*+ use_index_merge(t, j0_date) */ * from t where (\"2023-01-01\" member of (j0->'$.path_date'))", + "select /*+ use_index_merge(t, j0_date) */ * from t where (\"2023-01-01\" member of (j0->'$.path_date')) and a<10", + "select /*+ use_index_merge(t, j0_date) */ * from t where json_contains((j0->'$.path_date'), json_array(cast('2023-01-01' as date), cast('2023-01-02' as date), cast('2023-01-03' as date)))", + "select /*+ use_index_merge(t, j0_date) */ * from t where json_contains((j0->'$.path_date'), json_array(cast('2023-01-01' as date), cast('2023-01-02' as date), cast('2023-01-03' as date))) and a<10", + "select /*+ use_index_merge(t, j0_date) */ * from t where json_overlaps((j0->'$.path_date'), json_array(cast('2023-01-01' as date), cast('2023-01-02' as date), cast('2023-01-03' as date)))", + "select /*+ use_index_merge(t, j0_date) */ * from t where json_overlaps((j0->'$.path_date'), json_array(cast('2023-01-01' as date), cast('2023-01-02' as date), cast('2023-01-03' as date))) and a<10" + ] + }, + { + "name": "TestCompositeMVIndex", + "cases": [ + "select /*+ use_index_merge(t, idx) */ * from t where a=1 and b=2 and (3 member of (j)) and c=4", + "select /*+ use_index_merge(t, idx) */ * from t where a=1 and b=2 and (3 member of (j))", + "select /*+ use_index_merge(t, idx) */ * from t where a=1 and b=2", + "select /*+ use_index_merge(t, idx) */ * from t where a=1", + "select /*+ use_index_merge(t, idx2) */ * from t where a=1 and b=2 and ('3' member of (j->'$.str')) and c=4", + "select /*+ use_index_merge(t, idx2) */ * from t where a=1 and b=2 and ('3' member of (j->'$.str'))", + "select /*+ use_index_merge(t, idx2) */ * from t where a=1 and b=2", + "select /*+ use_index_merge(t, idx2) */ * from t where a=1", + "select /*+ use_index(t, idx) */ * from t where a=1 and b=2 and (3 member of (j)) and c=4", + "select * from t use index(idx) where a=1 and b=2 and (3 member of (j))", + "select /*+ use_index(t, idx) */ * from t where a=1 and b=2", + "select * from t use index(idx) where a=1", + "select * from t force index(idx) where a=1 and b=2 and (3 member of (j))", + "select * from t force index(idx) where a=1" + ] + }, + { + "name": "TestDNFOnMVIndex", + "cases": [ + "select /*+ use_index_merge(t, idx1) */ * from t where (1 member of (j)) or (2 member of (j))", + "select /*+ use_index_merge(t, idx1) */ * from t where ((1 member of (j)) or (2 member of (j))) and (a > 10)", + "select /*+ use_index_merge(t, idx1) */ * from t where (json_overlaps(j, '[1, 2]')) or (json_overlaps(j, '[3, 4]'))", + "select /*+ use_index_merge(t, idx1) */ * from t where ((json_overlaps(j, '[1, 2]')) or (json_overlaps(j, '[3, 4]'))) and (a > 10)", + "select /*+ use_index_merge(t, idx1) */ * from t where (json_contains(j, '[1, 2]')) or (json_contains(j, '[3, 4]'))", + "select /*+ use_index_merge(t, idx2) */ * from t where (a=1 and b=2 and (3 member of (j))) or (a=11 and b=12 and (13 member of (j)))", + "select /*+ use_index_merge(t, idx2) */ * from t where (a=1 and b=2 and (3 member of (j))) or (a=11 and b=12 and (13 member of (j)) and c=14)", + "select /*+ use_index_merge(t, idx2) */ * from t where ((a=1 and b=2 and (3 member of (j))) or (a=11 and b=12 and (13 member of (j)))) and (c > 10)" + ] + }, + { + "name": "TestMVIndexSelection", + "cases": [ + "select (j->'$.int') from t where (1 member of (j->'$.int'))", + "select * from t where (1 member of (j->'$.int'))", + "select * from t where (1 member of (j->'$.int')) and a<10", + "select (j->'$.int') from t where json_contains((j->'$.int'), '[1, 2, 3]')", + "select * from t where json_contains((j->'$.int'), '[1, 2, 3]')", + "select * from t where json_contains((j->'$.int'), '[1, 2, 3]') and a<10", + "select (j->'$.int') from t where json_overlaps((j->'$.int'), '[1, 2, 3]')", + "select * from t where json_overlaps((j->'$.int'), '[1, 2, 3]')", + "select * from t where json_overlaps((j->'$.int'), '[1, 2, 3]') and a<10" + ] + }, { "name": "TestIndexMergePathGeneration", "cases": [ @@ -9,5 +110,35 @@ "select * from t where (c < 1 or f > 2) and (c > 5 or f < 7) and (c < 1 or g > 2)", "select * from t where (c < 1 or f > 2) and (c > 5 or f < 7) and (e < 1 or f > 2)" ] + }, + { + "name": "TestHintForIntersectionIndexMerge", + "cases": [ + "set @@tidb_partition_prune_mode = 'dynamic'", + "select * from vh", + "select /*+ qb_name(v, v), use_index_merge(@v t1, ia, ibc, id) */ * from v", + "select /*+ qb_name(v, v@sel_1), use_index_merge(@v t1, ia, ibc, id) */ * from v", + "select /*+ qb_name(v, v@sel_1 .@sel_1), use_index_merge(@v t1, ia, ibc, id) */ * from v", + "select /*+ qb_name(v, v1@sel_1 .@sel_1), use_index_merge(@v t1, ia, ibc, id) */ * from v1 where c < 30 and d in (2,5)", + "select /*+ use_index_merge(t2, ia, ibc, id, ie) */ * from t2 where a > 10 and b = 20 and c < 35 and d < 45 and e = 100", + "select /*+ use_index_merge(t3, ia, ibc, id, ie) */ * from t3 where a > 10 and b = 20 and c < 35 and d < 45 and e = 100", + "select /*+ use_index_merge(t4, ia, ibc, id, ie) */ * from t4 where a > 10 and b = 20 and c < 35 and d in (1,3,8,9) and e = 100", + "select /*+ use_index_merge(t5, is1, is2, is3, is4) */ * from t5 where s1 = 'Abc' and s2 > 'zzz' and s3 < 'B啊a' and s4 = 'CcC'", + "select /*+ use_index_merge(t6, primary, is3, is4) */ * from t6 where s1 = 'Abc' and s2 > 'zzz' and s3 = 'A啊a' and s4 not like 'Cd_'", + "select /*+ use_index_merge(t7, primary,ia,ib,ic,ie,iff,ig) */ * from t7 where a = 100 and b > 5 and c < 12.3 and d > 54.321 and e = '2022-11-22 17:00' and f > '2020-6-23 10:00' and g < 2025", + "select /*+ use_index_merge(t8, primary,is2,is3,is4,is5) */ * from t8 where s1 like '啊A%' and s2 > 'abc' and s3 > 'cba' and s4 in ('aA', '??') and s5 = 'test,2'", + "select (select /*+ use_index_merge(t1,ia,ibc,ic) */ a from t1 where t1.a > 10 and t1.b = 20 and t1.c = t2.a) from t2", + "select (select /*+ use_index_merge(t1,ia,ibc,ic) */ a from t1 where t1.a > 10 and t1.b = 20 and t1.c > t2.a) from t2", + "select (select /*+ use_index_merge(t1,ia,ibc,ic) */ a from t1 where t1.a > 10 and t1.b = 20 and t1.e > t2.a) from t2", + "set @@tidb_partition_prune_mode = 'static'", + "select * from vh", + "select /*+ qb_name(v, v), use_index_merge(@v t1, ia, ibc, id) */ * from v", + "select /*+ qb_name(v, v@sel_1), use_index_merge(@v t1, ia, ibc, id) */ * from v", + "select /*+ qb_name(v, v@sel_1 .@sel_1), use_index_merge(@v t1, ia, ibc, id) */ * from v", + "select /*+ qb_name(v, v@sel_1 .@sel_1), use_index_merge(@v t1, ia, ibc, id) */ * from v", + "select /*+ use_index_merge(t2, ia, ibc, id, ie) */ * from t2 where a > 10 and b = 20 and c < 35 and d < 45 and e = 100", + "select /*+ use_index_merge(t3, ia, ibc, id, ie) */ * from t3 where a > 10 and b = 20 and c < 35 and d < 45 and e = 100", + "select /*+ use_index_merge(t4, ia, ibc, id, ie) */ * from t4 where a > 10 and b = 20 and c < 35 and d in (1,3,8,9) and e = 100" + ] } -] \ No newline at end of file +] diff --git a/planner/core/testdata/index_merge_suite_out.json b/planner/core/testdata/index_merge_suite_out.json index 4fdd67789e205..2c66948aca057 100644 --- a/planner/core/testdata/index_merge_suite_out.json +++ b/planner/core/testdata/index_merge_suite_out.json @@ -1,4 +1,757 @@ [ + { + "Name": "TestEnforceMVIndex", + "Cases": [ + { + "SQL": "select /*+ use_index(t, kj) */ * from t", + "Plan": null, + "Err": "[planner:1815]Internal : Can't find a proper physical plan for this query" + }, + { + "SQL": "select /*+ use_index(t, kj) */ a from t", + "Plan": null, + "Err": "[planner:1815]Internal : Can't find a proper physical plan for this query" + }, + { + "SQL": "select /*+ use_index(t, kj) */ * from t where a<10", + "Plan": null, + "Err": "[planner:1815]Internal : Can't find a proper physical plan for this query" + }, + { + "SQL": "select /*+ use_index(t, kj) */ * from t where (1 member of (j))", + "Plan": [ + "Selection 8000.00 root json_memberof(cast(1, json BINARY), test.t.j)", + "└─IndexMerge 10.00 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Err": "" + }, + { + "SQL": "select /*+ use_index(t, kj) */ * from t where (1 member of (j)) and a=10", + "Plan": [ + "Selection 8.00 root json_memberof(cast(1, json BINARY), test.t.j)", + "└─IndexMerge 0.01 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo", + " └─Selection(Probe) 0.01 cop[tikv] eq(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Err": "" + }, + { + "SQL": "select /*+ use_index(t, kj) */ * from t where (1 member of (j)) or a=10", + "Plan": null, + "Err": "[planner:1815]Internal : Can't find a proper physical plan for this query" + }, + { + "SQL": "select /*+ use_index_merge(t, kj) */ * from t", + "Plan": [ + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Err": "" + }, + { + "SQL": "select /*+ use_index_merge(t, kj) */ a from t", + "Plan": [ + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Err": "" + }, + { + "SQL": "select /*+ use_index_merge(t, kj) */ * from t where a<10", + "Plan": [ + "TableReader 3323.33 root data:Selection", + "└─Selection 3323.33 cop[tikv] lt(test.t.a, 10)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Err": "" + }, + { + "SQL": "select /*+ use_index_merge(t, kj) */ * from t where (1 member of (j)) or a=10", + "Plan": [ + "Selection 8000.00 root or(json_memberof(cast(1, json BINARY), test.t.j), eq(test.t.a, 10))", + "└─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Err": "" + } + ] + }, + { + "Name": "TestIndexMergeJSONMemberOf", + "Cases": [ + { + "SQL": "select /*+ use_index_merge(t, j0_0) */ * from t where (1 member of (j0->'$.path0'))", + "Plan": [ + "Selection 8.00 root json_memberof(cast(1, json BINARY), json_extract(test.t.j0, \"$.path0\"))", + "└─IndexMerge 10.00 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_1) */ * from t where (1 member of (j0->'$.path1')) and a<10", + "Plan": [ + "Selection 8.00 root json_memberof(cast(1, json BINARY), json_extract(test.t.j0, \"$.path1\"))", + "└─IndexMerge 3.32 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_1(cast(json_extract(`j0`, _utf8mb4'$.path1') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " └─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_1) */ * from t where (1 member of (j0->'$.XXX')) and a<10", + "Plan": [ + "Selection 2658.67 root json_memberof(cast(1, json BINARY), json_extract(test.t.j0, \"$.XXX\"))", + "└─TableReader 3323.33 root data:Selection", + " └─Selection 3323.33 cop[tikv] lt(test.t.a, 10)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_1) */ * from t where (1 member of (j0->'$.path1')) and (2 member of (j1)) and a<10", + "Plan": [ + "Selection 8.00 root json_memberof(cast(1, json BINARY), json_extract(test.t.j0, \"$.path1\")), json_memberof(cast(2, json BINARY), test.t.j1)", + "└─IndexMerge 3.32 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_1(cast(json_extract(`j0`, _utf8mb4'$.path1') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " └─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index(t, j0_0) */ * from t where (1 member of (j0->'$.path0'))", + "Plan": [ + "Selection 8000.00 root json_memberof(cast(1, json BINARY), json_extract(test.t.j0, \"$.path0\"))", + "└─IndexMerge 10.00 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index(t, j0_1) */ * from t where (1 member of (j0->'$.path1')) and a<10", + "Plan": [ + "Selection 2658.67 root json_memberof(cast(1, json BINARY), json_extract(test.t.j0, \"$.path1\"))", + "└─IndexMerge 3.32 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_1(cast(json_extract(`j0`, _utf8mb4'$.path1') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " └─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t use index(j0_0) where (1 member of (j0->'$.path0'))", + "Plan": [ + "Selection 8000.00 root json_memberof(cast(1, json BINARY), json_extract(test.t.j0, \"$.path0\"))", + "└─IndexMerge 10.00 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t use index(j0_1) where (1 member of (j0->'$.path1')) and a<10", + "Plan": [ + "Selection 2658.67 root json_memberof(cast(1, json BINARY), json_extract(test.t.j0, \"$.path1\"))", + "└─IndexMerge 3.32 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_1(cast(json_extract(`j0`, _utf8mb4'$.path1') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " └─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t force index(j0_0) where (1 member of (j0->'$.path0'))", + "Plan": [ + "Selection 8000.00 root json_memberof(cast(1, json BINARY), json_extract(test.t.j0, \"$.path0\"))", + "└─IndexMerge 10.00 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t force index(j0_1) where (1 member of (j0->'$.path1')) and a<10", + "Plan": [ + "Selection 2658.67 root json_memberof(cast(1, json BINARY), json_extract(test.t.j0, \"$.path1\"))", + "└─IndexMerge 3.32 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_1(cast(json_extract(`j0`, _utf8mb4'$.path1') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " └─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j1) */ * from t where (1 member of (j0->'$.path1')) and (2 member of (j1)) and a<10", + "Plan": [ + "Selection 8.00 root json_memberof(cast(1, json BINARY), json_extract(test.t.j0, \"$.path1\")), json_memberof(cast(2, json BINARY), test.t.j1)", + "└─IndexMerge 3.32 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_1(cast(json_extract(`j0`, _utf8mb4'$.path1') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " └─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_0) */ * from t where json_contains((j0->'$.path0'), '[1, 2, 3]')", + "Plan": [ + "IndexMerge 10.00 root type: intersection", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[2,2], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[3,3], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps((j0->'$.path0'), '[1, 2, 3]')", + "Plan": [ + "Selection 8.00 root json_overlaps(json_extract(test.t.j0, \"$.path0\"), cast(\"[1, 2, 3]\", json BINARY))", + "└─IndexMerge 10.00 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[2,2], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[3,3], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps('[1, 2, 3]', (j0->'$.path0'))", + "Plan": [ + "Selection 8.00 root json_overlaps(cast(\"[1, 2, 3]\", json BINARY), json_extract(test.t.j0, \"$.path0\"))", + "└─IndexMerge 10.00 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[2,2], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[3,3], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_0) */ * from t where json_contains((j0->'$.path0'), '[1, 2, 3]') and a<10", + "Plan": [ + "IndexMerge 3.32 root type: intersection", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[2,2], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[3,3], keep order:false, stats:pseudo", + "└─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps((j0->'$.path0'), '[1, 2, 3]') and a<10", + "Plan": [ + "Selection 8.00 root json_overlaps(json_extract(test.t.j0, \"$.path0\"), cast(\"[1, 2, 3]\", json BINARY))", + "└─IndexMerge 3.32 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[2,2], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[3,3], keep order:false, stats:pseudo", + " └─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps('[1, 2, 3]', (j0->'$.path0')) and a<10", + "Plan": [ + "Selection 8.00 root json_overlaps(cast(\"[1, 2, 3]\", json BINARY), json_extract(test.t.j0, \"$.path0\"))", + "└─IndexMerge 3.32 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[2,2], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[3,3], keep order:false, stats:pseudo", + " └─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_0) */ * from t where json_contains((j0->'$.path0'), '1')", + "Plan": [ + "IndexMerge 10.00 root type: intersection", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps((j0->'$.path0'), '1')", + "Plan": [ + "Selection 8.00 root json_overlaps(json_extract(test.t.j0, \"$.path0\"), cast(\"1\", json BINARY))", + "└─IndexMerge 10.00 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps('1', (j0->'$.path0'))", + "Plan": [ + "Selection 8.00 root json_overlaps(cast(\"1\", json BINARY), json_extract(test.t.j0, \"$.path0\"))", + "└─IndexMerge 10.00 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_0) */ * from t where json_contains((j0->'$.path0'), '1') and a<10", + "Plan": [ + "IndexMerge 3.32 root type: intersection", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo", + "└─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps((j0->'$.path0'), '1') and a<10", + "Plan": [ + "Selection 8.00 root json_overlaps(json_extract(test.t.j0, \"$.path0\"), cast(\"1\", json BINARY))", + "└─IndexMerge 3.32 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " └─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps('1', (j0->'$.path0')) and a<10", + "Plan": [ + "Selection 8.00 root json_overlaps(cast(\"1\", json BINARY), json_extract(test.t.j0, \"$.path0\"))", + "└─IndexMerge 3.32 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " └─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_string) */ * from t where (\"a\" member of (j0->'$.path_string'))", + "Plan": [ + "Selection 8.00 root json_memberof(cast(\"a\", json BINARY), json_extract(test.t.j0, \"$.path_string\"))", + "└─IndexMerge 10.00 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x61,0x61], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_string) */ * from t where (\"a\" member of (j0->'$.path_string')) and a<10", + "Plan": [ + "Selection 8.00 root json_memberof(cast(\"a\", json BINARY), json_extract(test.t.j0, \"$.path_string\"))", + "└─IndexMerge 3.32 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x61,0x61], keep order:false, stats:pseudo", + " └─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_string) */ * from t where json_contains((j0->'$.path_string'), '[\"a\", \"b\", \"c\"]')", + "Plan": [ + "IndexMerge 10.00 root type: intersection", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x61,0x61], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x62,0x62], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x63,0x63], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_string) */ * from t where json_contains((j0->'$.path_string'), '[\"a\", \"b\", \"c\"]') and a<10", + "Plan": [ + "IndexMerge 3.32 root type: intersection", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x61,0x61], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x62,0x62], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x63,0x63], keep order:false, stats:pseudo", + "└─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_string) */ * from t where json_overlaps((j0->'$.path_string'), '[\"a\", \"b\", \"c\"]')", + "Plan": [ + "Selection 8.00 root json_overlaps(json_extract(test.t.j0, \"$.path_string\"), cast(\"[\"a\", \"b\", \"c\"]\", json BINARY))", + "└─IndexMerge 10.00 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x61,0x61], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x62,0x62], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x63,0x63], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_string) */ * from t where json_overlaps((j0->'$.path_string'), '[\"a\", \"b\", \"c\"]') and a<10", + "Plan": [ + "Selection 8.00 root json_overlaps(json_extract(test.t.j0, \"$.path_string\"), cast(\"[\"a\", \"b\", \"c\"]\", json BINARY))", + "└─IndexMerge 3.32 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x61,0x61], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x62,0x62], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x63,0x63], keep order:false, stats:pseudo", + " └─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_date) */ * from t where (\"2023-01-01\" member of (j0->'$.path_date'))", + "Plan": [ + "Selection 8.00 root json_memberof(cast(\"2023-01-01\", json BINARY), json_extract(test.t.j0, \"$.path_date\"))", + "└─IndexMerge 10.00 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-01,2023-01-01], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_date) */ * from t where (\"2023-01-01\" member of (j0->'$.path_date')) and a<10", + "Plan": [ + "Selection 8.00 root json_memberof(cast(\"2023-01-01\", json BINARY), json_extract(test.t.j0, \"$.path_date\"))", + "└─IndexMerge 3.32 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-01,2023-01-01], keep order:false, stats:pseudo", + " └─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_date) */ * from t where json_contains((j0->'$.path_date'), json_array(cast('2023-01-01' as date), cast('2023-01-02' as date), cast('2023-01-03' as date)))", + "Plan": [ + "IndexMerge 10.00 root type: intersection", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-01,2023-01-01], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-02,2023-01-02], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-03,2023-01-03], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_date) */ * from t where json_contains((j0->'$.path_date'), json_array(cast('2023-01-01' as date), cast('2023-01-02' as date), cast('2023-01-03' as date))) and a<10", + "Plan": [ + "IndexMerge 3.32 root type: intersection", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-01,2023-01-01], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-02,2023-01-02], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-03,2023-01-03], keep order:false, stats:pseudo", + "└─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_date) */ * from t where json_overlaps((j0->'$.path_date'), json_array(cast('2023-01-01' as date), cast('2023-01-02' as date), cast('2023-01-03' as date)))", + "Plan": [ + "Selection 8.00 root json_overlaps(json_extract(test.t.j0, \"$.path_date\"), json_array(cast(2023-01-01, json BINARY), cast(2023-01-02, json BINARY), cast(2023-01-03, json BINARY)))", + "└─IndexMerge 10.00 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-01,2023-01-01], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-02,2023-01-02], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-03,2023-01-03], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, j0_date) */ * from t where json_overlaps((j0->'$.path_date'), json_array(cast('2023-01-01' as date), cast('2023-01-02' as date), cast('2023-01-03' as date))) and a<10", + "Plan": [ + "Selection 8.00 root json_overlaps(json_extract(test.t.j0, \"$.path_date\"), json_array(cast(2023-01-01, json BINARY), cast(2023-01-02, json BINARY), cast(2023-01-03, json BINARY)))", + "└─IndexMerge 3.32 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-01,2023-01-01], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-02,2023-01-02], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-03,2023-01-03], keep order:false, stats:pseudo", + " └─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestCompositeMVIndex", + "Cases": [ + { + "SQL": "select /*+ use_index_merge(t, idx) */ * from t where a=1 and b=2 and (3 member of (j)) and c=4", + "Plan": [ + "Selection 0.00 root json_memberof(cast(3, json BINARY), test.t.j)", + "└─IndexMerge 0.00 root type: union", + " ├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:idx(a, b, cast(`j` as signed array), c) range:[1 2 3 4,1 2 3 4], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, idx) */ * from t where a=1 and b=2 and (3 member of (j))", + "Plan": [ + "Selection 0.08 root json_memberof(cast(3, json BINARY), test.t.j)", + "└─IndexMerge 0.00 root type: union", + " ├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:idx(a, b, cast(`j` as signed array), c) range:[1 2 3,1 2 3], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, idx) */ * from t where a=1 and b=2", + "Plan": [ + "IndexMerge 0.10 root type: union", + "├─IndexRangeScan(Build) 0.10 cop[tikv] table:t, index:idx(a, b, cast(`j` as signed array), c) range:[1 2,1 2], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 0.10 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, idx) */ * from t where a=1", + "Plan": [ + "IndexMerge 10.00 root type: union", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx(a, b, cast(`j` as signed array), c) range:[1,1], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, idx2) */ * from t where a=1 and b=2 and ('3' member of (j->'$.str')) and c=4", + "Plan": [ + "Selection 0.00 root json_memberof(cast(\"3\", json BINARY), json_extract(test.t.j, \"$.str\"))", + "└─IndexMerge 0.00 root type: union", + " ├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:idx2(a, b, cast(json_extract(`j`, _utf8mb4'$.str') as char(10) array), c) range:[1 2 0x33 4,1 2 0x33 4], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, idx2) */ * from t where a=1 and b=2 and ('3' member of (j->'$.str'))", + "Plan": [ + "Selection 0.08 root json_memberof(cast(\"3\", json BINARY), json_extract(test.t.j, \"$.str\"))", + "└─IndexMerge 0.00 root type: union", + " ├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:idx2(a, b, cast(json_extract(`j`, _utf8mb4'$.str') as char(10) array), c) range:[1 2 0x33,1 2 0x33], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, idx2) */ * from t where a=1 and b=2", + "Plan": [ + "IndexMerge 0.10 root type: union", + "├─IndexRangeScan(Build) 0.10 cop[tikv] table:t, index:idx(a, b, cast(`j` as signed array), c) range:[1 2,1 2], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 0.10 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, idx2) */ * from t where a=1", + "Plan": [ + "IndexMerge 10.00 root type: union", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx(a, b, cast(`j` as signed array), c) range:[1,1], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index(t, idx) */ * from t where a=1 and b=2 and (3 member of (j)) and c=4", + "Plan": [ + "Selection 0.00 root json_memberof(cast(3, json BINARY), test.t.j)", + "└─IndexMerge 0.00 root type: union", + " ├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:idx(a, b, cast(`j` as signed array), c) range:[1 2 3 4,1 2 3 4], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t use index(idx) where a=1 and b=2 and (3 member of (j))", + "Plan": [ + "Selection 0.08 root json_memberof(cast(3, json BINARY), test.t.j)", + "└─IndexMerge 0.00 root type: union", + " ├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:idx(a, b, cast(`j` as signed array), c) range:[1 2 3,1 2 3], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index(t, idx) */ * from t where a=1 and b=2", + "Plan": [ + "IndexMerge 0.10 root type: union", + "├─IndexRangeScan(Build) 0.10 cop[tikv] table:t, index:idx(a, b, cast(`j` as signed array), c) range:[1 2,1 2], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 0.10 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t use index(idx) where a=1", + "Plan": [ + "IndexMerge 10.00 root type: union", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx(a, b, cast(`j` as signed array), c) range:[1,1], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t force index(idx) where a=1 and b=2 and (3 member of (j))", + "Plan": [ + "Selection 0.08 root json_memberof(cast(3, json BINARY), test.t.j)", + "└─IndexMerge 0.00 root type: union", + " ├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:idx(a, b, cast(`j` as signed array), c) range:[1 2 3,1 2 3], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t force index(idx) where a=1", + "Plan": [ + "IndexMerge 10.00 root type: union", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx(a, b, cast(`j` as signed array), c) range:[1,1], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestDNFOnMVIndex", + "Cases": [ + { + "SQL": "select /*+ use_index_merge(t, idx1) */ * from t where (1 member of (j)) or (2 member of (j))", + "Plan": [ + "Selection 8.00 root or(json_memberof(cast(1, json BINARY), test.t.j), json_memberof(cast(2, json BINARY), test.t.j))", + "└─IndexMerge 10.00 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[2,2], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, idx1) */ * from t where ((1 member of (j)) or (2 member of (j))) and (a > 10)", + "Plan": [ + "Selection 8.00 root or(json_memberof(cast(1, json BINARY), test.t.j), json_memberof(cast(2, json BINARY), test.t.j))", + "└─IndexMerge 3.33 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[2,2], keep order:false, stats:pseudo", + " └─Selection(Probe) 3.33 cop[tikv] gt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, idx1) */ * from t where (json_overlaps(j, '[1, 2]')) or (json_overlaps(j, '[3, 4]'))", + "Plan": [ + "Selection 8.00 root or(json_overlaps(test.t.j, cast(\"[1, 2]\", json BINARY)), json_overlaps(test.t.j, cast(\"[3, 4]\", json BINARY)))", + "└─IndexMerge 10.00 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[2,2], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[3,3], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[4,4], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, idx1) */ * from t where ((json_overlaps(j, '[1, 2]')) or (json_overlaps(j, '[3, 4]'))) and (a > 10)", + "Plan": [ + "Selection 8.00 root or(json_overlaps(test.t.j, cast(\"[1, 2]\", json BINARY)), json_overlaps(test.t.j, cast(\"[3, 4]\", json BINARY)))", + "└─IndexMerge 3.33 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[2,2], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[3,3], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[4,4], keep order:false, stats:pseudo", + " └─Selection(Probe) 3.33 cop[tikv] gt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, idx1) */ * from t where (json_contains(j, '[1, 2]')) or (json_contains(j, '[3, 4]'))", + "Plan": [ + "TableReader 9600.00 root data:Selection", + "└─Selection 9600.00 cop[tikv] or(json_contains(test.t.j, cast(\"[1, 2]\", json BINARY)), json_contains(test.t.j, cast(\"[3, 4]\", json BINARY)))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, idx2) */ * from t where (a=1 and b=2 and (3 member of (j))) or (a=11 and b=12 and (13 member of (j)))", + "Plan": [ + "Selection 0.00 root or(and(eq(test.t.a, 1), and(eq(test.t.b, 2), json_memberof(cast(3, json BINARY), test.t.j))), and(eq(test.t.a, 11), and(eq(test.t.b, 12), json_memberof(cast(13, json BINARY), test.t.j))))", + "└─IndexMerge 0.00 root type: union", + " ├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:idx2(a, b, cast(`j` as signed array), c) range:[1 2 3,1 2 3], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:idx2(a, b, cast(`j` as signed array), c) range:[11 12 13,11 12 13], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, idx2) */ * from t where (a=1 and b=2 and (3 member of (j))) or (a=11 and b=12 and (13 member of (j)) and c=14)", + "Plan": [ + "Selection 0.00 root or(and(eq(test.t.a, 1), and(eq(test.t.b, 2), json_memberof(cast(3, json BINARY), test.t.j))), and(and(eq(test.t.a, 11), eq(test.t.b, 12)), and(json_memberof(cast(13, json BINARY), test.t.j), eq(test.t.c, 14))))", + "└─IndexMerge 0.00 root type: union", + " ├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:idx2(a, b, cast(`j` as signed array), c) range:[1 2 3,1 2 3], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:idx2(a, b, cast(`j` as signed array), c) range:[11 12 13 14,11 12 13 14], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ use_index_merge(t, idx2) */ * from t where ((a=1 and b=2 and (3 member of (j))) or (a=11 and b=12 and (13 member of (j)))) and (c > 10)", + "Plan": [ + "Selection 0.00 root or(and(eq(test.t.a, 1), and(eq(test.t.b, 2), json_memberof(cast(3, json BINARY), test.t.j))), and(eq(test.t.a, 11), and(eq(test.t.b, 12), json_memberof(cast(13, json BINARY), test.t.j))))", + "└─IndexMerge 0.00 root type: union", + " ├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:idx2(a, b, cast(`j` as signed array), c) range:[1 2 3,1 2 3], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:idx2(a, b, cast(`j` as signed array), c) range:[11 12 13,11 12 13], keep order:false, stats:pseudo", + " └─Selection(Probe) 0.00 cop[tikv] gt(test.t.c, 10)", + " └─TableRowIDScan 0.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestMVIndexSelection", + "Cases": [ + { + "SQL": "select (j->'$.int') from t where (1 member of (j->'$.int'))", + "Plan": [ + "Projection 8000.00 root json_extract(test.t.j, $.int)->Column#5", + "└─Selection 8000.00 root json_memberof(cast(1, json BINARY), json_extract(test.t.j, \"$.int\"))", + " └─IndexMerge 10.00 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t where (1 member of (j->'$.int'))", + "Plan": [ + "Selection 8000.00 root json_memberof(cast(1, json BINARY), json_extract(test.t.j, \"$.int\"))", + "└─IndexMerge 10.00 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t where (1 member of (j->'$.int')) and a<10", + "Plan": [ + "Selection 2658.67 root json_memberof(cast(1, json BINARY), json_extract(test.t.j, \"$.int\"))", + "└─IndexMerge 3.32 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " └─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select (j->'$.int') from t where json_contains((j->'$.int'), '[1, 2, 3]')", + "Plan": [ + "Projection 8000.00 root json_extract(test.t.j, $.int)->Column#5", + "└─IndexMerge 10.00 root type: intersection", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[2,2], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[3,3], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t where json_contains((j->'$.int'), '[1, 2, 3]')", + "Plan": [ + "IndexMerge 10.00 root type: intersection", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[1,1], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[2,2], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[3,3], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t where json_contains((j->'$.int'), '[1, 2, 3]') and a<10", + "Plan": [ + "IndexMerge 3.32 root type: intersection", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[1,1], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[2,2], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[3,3], keep order:false, stats:pseudo", + "└─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select (j->'$.int') from t where json_overlaps((j->'$.int'), '[1, 2, 3]')", + "Plan": [ + "Projection 8000.00 root json_extract(test.t.j, $.int)->Column#5", + "└─Selection 8000.00 root json_overlaps(json_extract(test.t.j, \"$.int\"), cast(\"[1, 2, 3]\", json BINARY))", + " └─IndexMerge 10.00 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[2,2], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[3,3], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t where json_overlaps((j->'$.int'), '[1, 2, 3]')", + "Plan": [ + "Selection 8000.00 root json_overlaps(json_extract(test.t.j, \"$.int\"), cast(\"[1, 2, 3]\", json BINARY))", + "└─IndexMerge 10.00 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[2,2], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[3,3], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t where json_overlaps((j->'$.int'), '[1, 2, 3]') and a<10", + "Plan": [ + "Selection 2658.67 root json_overlaps(json_extract(test.t.j, \"$.int\"), cast(\"[1, 2, 3]\", json BINARY))", + "└─IndexMerge 3.32 root type: union", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[1,1], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[2,2], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[3,3], keep order:false, stats:pseudo", + " └─Selection(Probe) 3.32 cop[tikv] lt(test.t.a, 10)", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + } + ] + }, { "Name": "TestIndexMergePathGeneration", "Cases": [ @@ -9,5 +762,427 @@ "[{Idxs:[c_d_e,f],TbFilters:[or(gt(test.t.c, 5), lt(test.t.f, 7)),or(lt(test.t.c, 1), gt(test.t.g, 2))]},{Idxs:[c_d_e,f],TbFilters:[or(lt(test.t.c, 1), gt(test.t.f, 2)),or(lt(test.t.c, 1), gt(test.t.g, 2))]},{Idxs:[c_d_e,g],TbFilters:[or(lt(test.t.c, 1), gt(test.t.f, 2)),or(gt(test.t.c, 5), lt(test.t.f, 7))]}]", "[{Idxs:[c_d_e,f],TbFilters:[or(gt(test.t.c, 5), lt(test.t.f, 7)),or(lt(test.t.e, 1), gt(test.t.f, 2))]},{Idxs:[c_d_e,f],TbFilters:[or(lt(test.t.c, 1), gt(test.t.f, 2)),or(lt(test.t.e, 1), gt(test.t.f, 2))]}]" ] + }, + { + "Name": "TestHintForIntersectionIndexMerge", + "Cases": [ + { + "SQL": "set @@tidb_partition_prune_mode = 'dynamic'", + "Plan": null, + "Result": null + }, + { + "SQL": "select * from vh", + "Plan": [ + "IndexMerge 0.97 root partition:p0,p1,p2 type: intersection", + "├─IndexRangeScan(Build) 2.00 cop[tikv] table:t1, index:ia(a) range:[10,10], keep order:false", + "├─IndexRangeScan(Build) 2.60 cop[tikv] table:t1, index:ibc(b, c) range:[20 -inf,20 30), keep order:false", + "├─IndexRangeScan(Build) 3.00 cop[tikv] table:t1, index:id(d) range:[2,2], [5,5], keep order:false", + "└─TableRowIDScan(Probe) 0.97 cop[tikv] table:t1 keep order:false" + ], + "Result": [ + "10 20 5 5 3" + ] + }, + { + "SQL": "select /*+ qb_name(v, v), use_index_merge(@v t1, ia, ibc, id) */ * from v", + "Plan": [ + "IndexMerge 0.97 root partition:p0,p1,p2 type: intersection", + "├─IndexRangeScan(Build) 2.00 cop[tikv] table:t1, index:ia(a) range:[10,10], keep order:false", + "├─IndexRangeScan(Build) 2.60 cop[tikv] table:t1, index:ibc(b, c) range:[20 -inf,20 30), keep order:false", + "├─IndexRangeScan(Build) 3.00 cop[tikv] table:t1, index:id(d) range:[2,2], [5,5], keep order:false", + "└─TableRowIDScan(Probe) 0.97 cop[tikv] table:t1 keep order:false" + ], + "Result": [ + "10 20 5 5 3" + ] + }, + { + "SQL": "select /*+ qb_name(v, v@sel_1), use_index_merge(@v t1, ia, ibc, id) */ * from v", + "Plan": [ + "IndexMerge 0.97 root partition:p0,p1,p2 type: intersection", + "├─IndexRangeScan(Build) 2.00 cop[tikv] table:t1, index:ia(a) range:[10,10], keep order:false", + "├─IndexRangeScan(Build) 2.60 cop[tikv] table:t1, index:ibc(b, c) range:[20 -inf,20 30), keep order:false", + "├─IndexRangeScan(Build) 3.00 cop[tikv] table:t1, index:id(d) range:[2,2], [5,5], keep order:false", + "└─TableRowIDScan(Probe) 0.97 cop[tikv] table:t1 keep order:false" + ], + "Result": [ + "10 20 5 5 3" + ] + }, + { + "SQL": "select /*+ qb_name(v, v@sel_1 .@sel_1), use_index_merge(@v t1, ia, ibc, id) */ * from v", + "Plan": [ + "IndexMerge 0.97 root partition:p0,p1,p2 type: intersection", + "├─IndexRangeScan(Build) 2.00 cop[tikv] table:t1, index:ia(a) range:[10,10], keep order:false", + "├─IndexRangeScan(Build) 2.60 cop[tikv] table:t1, index:ibc(b, c) range:[20 -inf,20 30), keep order:false", + "├─IndexRangeScan(Build) 3.00 cop[tikv] table:t1, index:id(d) range:[2,2], [5,5], keep order:false", + "└─TableRowIDScan(Probe) 0.97 cop[tikv] table:t1 keep order:false" + ], + "Result": [ + "10 20 5 5 3" + ] + }, + { + "SQL": "select /*+ qb_name(v, v1@sel_1 .@sel_1), use_index_merge(@v t1, ia, ibc, id) */ * from v1 where c < 30 and d in (2,5)", + "Plan": [ + "IndexMerge 0.97 root partition:p0,p1,p2 type: intersection", + "├─IndexRangeScan(Build) 2.00 cop[tikv] table:t1, index:ia(a) range:[10,10], keep order:false", + "├─IndexRangeScan(Build) 2.60 cop[tikv] table:t1, index:ibc(b, c) range:[20 -inf,20 30), keep order:false", + "├─IndexRangeScan(Build) 3.00 cop[tikv] table:t1, index:id(d) range:[2,2], [5,5], keep order:false", + "└─TableRowIDScan(Probe) 0.97 cop[tikv] table:t1 keep order:false" + ], + "Result": [ + "10 20 5 5 3" + ] + }, + { + "SQL": "select /*+ use_index_merge(t2, ia, ibc, id, ie) */ * from t2 where a > 10 and b = 20 and c < 35 and d < 45 and e = 100", + "Plan": [ + "IndexMerge 0.89 root partition:p0,p1,p2 type: intersection", + "├─IndexRangeScan(Build) 2.00 cop[tikv] table:t2, index:ia(a) range:(10,+inf], keep order:false", + "├─IndexRangeScan(Build) 2.00 cop[tikv] table:t2, index:ibc(b, c) range:[20 -inf,20 35), keep order:false", + "├─IndexRangeScan(Build) 3.00 cop[tikv] table:t2, index:id(d) range:[-inf,45), keep order:false", + "├─IndexRangeScan(Build) 2.00 cop[tikv] table:t2, index:ie(e) range:[100,100], keep order:false", + "└─TableRowIDScan(Probe) 0.89 cop[tikv] table:t2 keep order:false" + ], + "Result": [ + "20 20 20 5 100" + ] + }, + { + "SQL": "select /*+ use_index_merge(t3, ia, ibc, id, ie) */ * from t3 where a > 10 and b = 20 and c < 35 and d < 45 and e = 100", + "Plan": [ + "IndexMerge 0.44 root partition:p0 type: intersection", + "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t3, index:ia(a) range:(10,+inf], keep order:false", + "├─IndexRangeScan(Build) 2.00 cop[tikv] table:t3, index:ibc(b, c) range:[20 -inf,20 35), keep order:false", + "├─IndexRangeScan(Build) 3.00 cop[tikv] table:t3, index:id(d) range:[-inf,45), keep order:false", + "├─IndexRangeScan(Build) 2.00 cop[tikv] table:t3, index:ie(e) range:[100,100], keep order:false", + "└─TableRowIDScan(Probe) 0.44 cop[tikv] table:t3 keep order:false" + ], + "Result": [ + "20 20 20 5 100" + ] + }, + { + "SQL": "select /*+ use_index_merge(t4, ia, ibc, id, ie) */ * from t4 where a > 10 and b = 20 and c < 35 and d in (1,3,8,9) and e = 100", + "Plan": [ + "IndexMerge 0.89 root partition:p0,p1 type: intersection", + "├─IndexRangeScan(Build) 2.00 cop[tikv] table:t4, index:ia(a) range:(10,+inf], keep order:false", + "├─IndexRangeScan(Build) 2.00 cop[tikv] table:t4, index:ibc(b, c) range:[20 -inf,20 35), keep order:false", + "├─IndexRangeScan(Build) 3.00 cop[tikv] table:t4, index:id(d) range:[1,1], [3,3], [8,8], [9,9], keep order:false", + "├─IndexRangeScan(Build) 2.00 cop[tikv] table:t4, index:ie(e) range:[100,100], keep order:false", + "└─TableRowIDScan(Probe) 0.89 cop[tikv] table:t4 keep order:false" + ], + "Result": [ + "30 20 5 8 100" + ] + }, + { + "SQL": "select /*+ use_index_merge(t5, is1, is2, is3, is4) */ * from t5 where s1 = 'Abc' and s2 > 'zzz' and s3 < 'B啊a' and s4 = 'CcC'", + "Plan": [ + "IndexMerge 0.00 root type: intersection", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t5, index:is1(s1) range:[\"Abc\",\"Abc\"], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 3333.33 cop[tikv] table:t5, index:is2(s2) range:(\"zzz\",+inf], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t5, index:is3(s3) range:[-inf,\"B啊a\"), keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t5, index:is4(s4) range:[\"CcC\",\"CcC\"], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 0.00 cop[tikv] table:t5 keep order:false, stats:pseudo" + ], + "Result": [ + "Abc zzzz aa ccc" + ] + }, + { + "SQL": "select /*+ use_index_merge(t6, primary, is3, is4) */ * from t6 where s1 = 'Abc' and s2 > 'zzz' and s3 = 'A啊a' and s4 not like 'Cd_'", + "Plan": [ + "IndexMerge 0.03 root type: intersection", + "├─IndexRangeScan(Build) 33.33 cop[tikv] table:t6, index:PRIMARY(s1, s2) range:(\"Abc\" \"zzz\",\"Abc\" +inf], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t6, index:is3(s3) range:[\"A啊a\",\"A啊a\"], keep order:false, stats:pseudo", + "└─Selection(Probe) 0.03 cop[tikv] gt(test.t6.s2, \"zzz\"), not(like(test.t6.s4, \"Cd_\", 92))", + " └─TableRowIDScan 0.03 cop[tikv] table:t6 keep order:false, stats:pseudo" + ], + "Result": [ + "Abc zzzz A啊A Cdaa" + ] + }, + { + "SQL": "select /*+ use_index_merge(t7, primary,ia,ib,ic,ie,iff,ig) */ * from t7 where a = 100 and b > 5 and c < 12.3 and d > 54.321 and e = '2022-11-22 17:00' and f > '2020-6-23 10:00' and g < 2025", + "Plan": [ + "IndexMerge 0.00 root type: intersection", + "├─IndexRangeScan(Build) 3333.33 cop[tikv] table:t7, index:PRIMARY(d) range:(54.321,+inf], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t7, index:ia(a) range:[100,100], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 3333.33 cop[tikv] table:t7, index:ib(b) range:(\"0x05\",+inf], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t7, index:ic(c) range:[-inf,12.3), keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t7, index:ie(e) range:[2022-11-22 17:00:00,2022-11-22 17:00:00], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 3333.33 cop[tikv] table:t7, index:iff(f) range:(2020-06-23 10:00:00.00000,+inf], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t7, index:ig(g) range:[-inf,2025), keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 0.00 cop[tikv] table:t7 keep order:false, stats:pseudo" + ], + "Result": [ + "100 \u0006 12.2 56.000 2022-11-22 17:00:00 2022-12-21 00:00:00.00000 2021" + ] + }, + { + "SQL": "select /*+ use_index_merge(t8, primary,is2,is3,is4,is5) */ * from t8 where s1 like '啊A%' and s2 > 'abc' and s3 > 'cba' and s4 in ('aA', '??') and s5 = 'test,2'", + "Plan": [ + "Selection 1.42 root eq(test.t8.s5, \"test,2\")", + "└─IndexMerge 0.59 root type: intersection", + " ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:t8, index:is2(s2) range:(0x616263,+inf], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:t8, index:is3(s3) range:(0x636261,+inf], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 20.00 cop[tikv] table:t8, index:is4(s4) range:[\"aA\",\"aA\"], [\"??\",\"??\"], keep order:false, stats:pseudo", + " └─Selection(Probe) 0.59 cop[tikv] gt(test.t8.s3, \"cba\"), like(test.t8.s1, \"啊A%\", 92)", + " └─TableRowIDScan 2.22 cop[tikv] table:t8 keep order:false, stats:pseudo" + ], + "Result": [ + "啊aabbccdd abcc cccc aA tEsT,2" + ] + }, + { + "SQL": "select (select /*+ use_index_merge(t1,ia,ibc,ic) */ a from t1 where t1.a > 10 and t1.b = 20 and t1.c = t2.a) from t2", + "Plan": [ + "Projection 3.00 root test.t1.a", + "└─Apply 3.00 root CARTESIAN left outer join", + " ├─IndexReader(Build) 3.00 root partition:all index:IndexFullScan", + " │ └─IndexFullScan 3.00 cop[tikv] table:t2, index:ia(a) keep order:false", + " └─MaxOneRow(Probe) 3.00 root ", + " └─IndexMerge 1.50 root partition:all type: intersection", + " ├─IndexRangeScan(Build) 6.00 cop[tikv] table:t1, index:ia(a) range:(10,+inf], keep order:false", + " ├─IndexRangeScan(Build) 4.00 cop[tikv] table:t1, index:ibc(b, c) range: decided by [eq(test.t1.b, 20) eq(test.t1.c, test.t2.a)], keep order:false", + " └─TableRowIDScan(Probe) 1.50 cop[tikv] table:t1 keep order:false" + ], + "Result": [ + "20", + "", + "" + ] + }, + { + "SQL": "select (select /*+ use_index_merge(t1,ia,ibc,ic) */ a from t1 where t1.a > 10 and t1.b = 20 and t1.c > t2.a) from t2", + "Plan": [ + "Projection 3.00 root test.t1.a", + "└─Apply 3.00 root CARTESIAN left outer join", + " ├─IndexReader(Build) 3.00 root partition:all index:IndexFullScan", + " │ └─IndexFullScan 3.00 cop[tikv] table:t2, index:ia(a) keep order:false", + " └─MaxOneRow(Probe) 3.00 root ", + " └─IndexMerge 3.60 root partition:all type: intersection", + " ├─IndexRangeScan(Build) 6.00 cop[tikv] table:t1, index:ia(a) range:(10,+inf], keep order:false", + " ├─Selection(Build) 7.20 cop[tikv] gt(test.t1.c, test.t2.a)", + " │ └─IndexRangeScan 9.00 cop[tikv] table:t1, index:ibc(b, c) range:[20,20], keep order:false", + " └─TableRowIDScan(Probe) 3.60 cop[tikv] table:t1 keep order:false" + ], + "Result": [ + "20", + "20", + "" + ] + }, + { + "SQL": "select (select /*+ use_index_merge(t1,ia,ibc,ic) */ a from t1 where t1.a > 10 and t1.b = 20 and t1.e > t2.a) from t2", + "Plan": [ + "Projection 3.00 root test.t1.a", + "└─Apply 3.00 root CARTESIAN left outer join", + " ├─IndexReader(Build) 3.00 root partition:all index:IndexFullScan", + " │ └─IndexFullScan 3.00 cop[tikv] table:t2, index:ia(a) keep order:false", + " └─MaxOneRow(Probe) 3.00 root ", + " └─IndexMerge 3.60 root partition:all type: intersection", + " ├─IndexRangeScan(Build) 6.00 cop[tikv] table:t1, index:ia(a) range:(10,+inf], keep order:false", + " ├─IndexRangeScan(Build) 9.00 cop[tikv] table:t1, index:ibc(b, c) range:[20,20], keep order:false", + " └─Selection(Probe) 3.60 cop[tikv] gt(test.t1.e, test.t2.a)", + " └─TableRowIDScan 4.50 cop[tikv] table:t1 keep order:false" + ], + "Result": [ + "20", + "20", + "20" + ] + }, + { + "SQL": "set @@tidb_partition_prune_mode = 'static'", + "Plan": null, + "Result": null + }, + { + "SQL": "select * from vh", + "Plan": [ + "PartitionUnion 0.50 root ", + "├─IndexMerge 0.50 root type: intersection", + "│ ├─IndexRangeScan(Build) 2.00 cop[tikv] table:t1, partition:p0, index:ia(a) range:[10,10], keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p0, index:ibc(b, c) range:[20 -inf,20 30), keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p0, index:id(d) range:[2,2], [5,5], keep order:false", + "│ └─TableRowIDScan(Probe) 0.50 cop[tikv] table:t1, partition:p0 keep order:false", + "├─IndexMerge 1.00 root type: intersection", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:ia(a) range:[10,10], keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:ibc(b, c) range:[20 -inf,20 30), keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:id(d) range:[2,2], [5,5], keep order:false", + "│ └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t1, partition:p1 keep order:false", + "└─IndexMerge 0.00 root type: intersection", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, partition:p2, index:ia(a) range:[10,10], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 33.23 cop[tikv] table:t1, partition:p2, index:ibc(b, c) range:[20 -inf,20 30), keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 20.00 cop[tikv] table:t1, partition:p2, index:id(d) range:[2,2], [5,5], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo" + ], + "Result": [ + "10 20 5 5 3" + ] + }, + { + "SQL": "select /*+ qb_name(v, v), use_index_merge(@v t1, ia, ibc, id) */ * from v", + "Plan": [ + "PartitionUnion 0.50 root ", + "├─IndexMerge 0.50 root type: intersection", + "│ ├─IndexRangeScan(Build) 2.00 cop[tikv] table:t1, partition:p0, index:ia(a) range:[10,10], keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p0, index:ibc(b, c) range:[20 -inf,20 30), keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p0, index:id(d) range:[2,2], [5,5], keep order:false", + "│ └─TableRowIDScan(Probe) 0.50 cop[tikv] table:t1, partition:p0 keep order:false", + "├─IndexMerge 1.00 root type: intersection", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:ia(a) range:[10,10], keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:ibc(b, c) range:[20 -inf,20 30), keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:id(d) range:[2,2], [5,5], keep order:false", + "│ └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t1, partition:p1 keep order:false", + "└─IndexMerge 0.00 root type: intersection", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, partition:p2, index:ia(a) range:[10,10], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 33.23 cop[tikv] table:t1, partition:p2, index:ibc(b, c) range:[20 -inf,20 30), keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 20.00 cop[tikv] table:t1, partition:p2, index:id(d) range:[2,2], [5,5], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo" + ], + "Result": [ + "10 20 5 5 3" + ] + }, + { + "SQL": "select /*+ qb_name(v, v@sel_1), use_index_merge(@v t1, ia, ibc, id) */ * from v", + "Plan": [ + "PartitionUnion 0.50 root ", + "├─IndexMerge 0.50 root type: intersection", + "│ ├─IndexRangeScan(Build) 2.00 cop[tikv] table:t1, partition:p0, index:ia(a) range:[10,10], keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p0, index:ibc(b, c) range:[20 -inf,20 30), keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p0, index:id(d) range:[2,2], [5,5], keep order:false", + "│ └─TableRowIDScan(Probe) 0.50 cop[tikv] table:t1, partition:p0 keep order:false", + "├─IndexMerge 1.00 root type: intersection", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:ia(a) range:[10,10], keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:ibc(b, c) range:[20 -inf,20 30), keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:id(d) range:[2,2], [5,5], keep order:false", + "│ └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t1, partition:p1 keep order:false", + "└─IndexMerge 0.00 root type: intersection", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, partition:p2, index:ia(a) range:[10,10], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 33.23 cop[tikv] table:t1, partition:p2, index:ibc(b, c) range:[20 -inf,20 30), keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 20.00 cop[tikv] table:t1, partition:p2, index:id(d) range:[2,2], [5,5], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo" + ], + "Result": [ + "10 20 5 5 3" + ] + }, + { + "SQL": "select /*+ qb_name(v, v@sel_1 .@sel_1), use_index_merge(@v t1, ia, ibc, id) */ * from v", + "Plan": [ + "PartitionUnion 0.50 root ", + "├─IndexMerge 0.50 root type: intersection", + "│ ├─IndexRangeScan(Build) 2.00 cop[tikv] table:t1, partition:p0, index:ia(a) range:[10,10], keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p0, index:ibc(b, c) range:[20 -inf,20 30), keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p0, index:id(d) range:[2,2], [5,5], keep order:false", + "│ └─TableRowIDScan(Probe) 0.50 cop[tikv] table:t1, partition:p0 keep order:false", + "├─IndexMerge 1.00 root type: intersection", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:ia(a) range:[10,10], keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:ibc(b, c) range:[20 -inf,20 30), keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:id(d) range:[2,2], [5,5], keep order:false", + "│ └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t1, partition:p1 keep order:false", + "└─IndexMerge 0.00 root type: intersection", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, partition:p2, index:ia(a) range:[10,10], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 33.23 cop[tikv] table:t1, partition:p2, index:ibc(b, c) range:[20 -inf,20 30), keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 20.00 cop[tikv] table:t1, partition:p2, index:id(d) range:[2,2], [5,5], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo" + ], + "Result": [ + "10 20 5 5 3" + ] + }, + { + "SQL": "select /*+ qb_name(v, v@sel_1 .@sel_1), use_index_merge(@v t1, ia, ibc, id) */ * from v", + "Plan": [ + "PartitionUnion 0.50 root ", + "├─IndexMerge 0.50 root type: intersection", + "│ ├─IndexRangeScan(Build) 2.00 cop[tikv] table:t1, partition:p0, index:ia(a) range:[10,10], keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p0, index:ibc(b, c) range:[20 -inf,20 30), keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p0, index:id(d) range:[2,2], [5,5], keep order:false", + "│ └─TableRowIDScan(Probe) 0.50 cop[tikv] table:t1, partition:p0 keep order:false", + "├─IndexMerge 1.00 root type: intersection", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:ia(a) range:[10,10], keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:ibc(b, c) range:[20 -inf,20 30), keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:id(d) range:[2,2], [5,5], keep order:false", + "│ └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t1, partition:p1 keep order:false", + "└─IndexMerge 0.00 root type: intersection", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, partition:p2, index:ia(a) range:[10,10], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 33.23 cop[tikv] table:t1, partition:p2, index:ibc(b, c) range:[20 -inf,20 30), keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 20.00 cop[tikv] table:t1, partition:p2, index:id(d) range:[2,2], [5,5], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo" + ], + "Result": [ + "10 20 5 5 3" + ] + }, + { + "SQL": "select /*+ use_index_merge(t2, ia, ibc, id, ie) */ * from t2 where a > 10 and b = 20 and c < 35 and d < 45 and e = 100", + "Plan": [ + "PartitionUnion 1.25 root ", + "├─IndexMerge 0.25 root type: intersection", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t2, partition:p0, index:ia(a) range:(10,+inf], keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t2, partition:p0, index:ibc(b, c) range:[20 -inf,20 35), keep order:false", + "│ ├─IndexRangeScan(Build) 2.00 cop[tikv] table:t2, partition:p0, index:id(d) range:[-inf,45), keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t2, partition:p0, index:ie(e) range:[100,100], keep order:false", + "│ └─TableRowIDScan(Probe) 0.25 cop[tikv] table:t2, partition:p0 keep order:false", + "├─IndexMerge 1.00 root type: intersection", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t2, partition:p1, index:ia(a) range:(10,+inf], keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t2, partition:p1, index:ibc(b, c) range:[20 -inf,20 35), keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t2, partition:p1, index:id(d) range:[-inf,45), keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t2, partition:p1, index:ie(e) range:[100,100], keep order:false", + "│ └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t2, partition:p1 keep order:false", + "└─IndexMerge 0.00 root type: intersection", + " ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:t2, partition:p2, index:ia(a) range:(10,+inf], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 33.23 cop[tikv] table:t2, partition:p2, index:ibc(b, c) range:[20 -inf,20 35), keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t2, partition:p2, index:id(d) range:[-inf,45), keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t2, partition:p2, index:ie(e) range:[100,100], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo" + ], + "Result": [ + "20 20 20 5 100" + ] + }, + { + "SQL": "select /*+ use_index_merge(t3, ia, ibc, id, ie) */ * from t3 where a > 10 and b = 20 and c < 35 and d < 45 and e = 100", + "Plan": [ + "IndexMerge 0.50 root type: intersection", + "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t3, partition:p0, index:ia(a) range:(10,+inf], keep order:false", + "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t3, partition:p0, index:ibc(b, c) range:[20 -inf,20 35), keep order:false", + "├─IndexRangeScan(Build) 2.00 cop[tikv] table:t3, partition:p0, index:id(d) range:[-inf,45), keep order:false", + "├─IndexRangeScan(Build) 2.00 cop[tikv] table:t3, partition:p0, index:ie(e) range:[100,100], keep order:false", + "└─TableRowIDScan(Probe) 0.50 cop[tikv] table:t3, partition:p0 keep order:false" + ], + "Result": [ + "20 20 20 5 100" + ] + }, + { + "SQL": "select /*+ use_index_merge(t4, ia, ibc, id, ie) */ * from t4 where a > 10 and b = 20 and c < 35 and d in (1,3,8,9) and e = 100", + "Plan": [ + "PartitionUnion 1.25 root ", + "├─IndexMerge 0.25 root type: intersection", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t4, partition:p0, index:ia(a) range:(10,+inf], keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t4, partition:p0, index:ibc(b, c) range:[20 -inf,20 35), keep order:false", + "│ ├─IndexRangeScan(Build) 2.00 cop[tikv] table:t4, partition:p0, index:id(d) range:[1,1], [3,3], [8,8], [9,9], keep order:false", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t4, partition:p0, index:ie(e) range:[100,100], keep order:false", + "│ └─TableRowIDScan(Probe) 0.25 cop[tikv] table:t4, partition:p0 keep order:false", + "└─IndexMerge 1.00 root type: intersection", + " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t4, partition:p1, index:ia(a) range:(10,+inf], keep order:false", + " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t4, partition:p1, index:ibc(b, c) range:[20 -inf,20 35), keep order:false", + " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t4, partition:p1, index:id(d) range:[1,1], [3,3], [8,8], [9,9], keep order:false", + " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t4, partition:p1, index:ie(e) range:[100,100], keep order:false", + " └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t4, partition:p1 keep order:false" + ], + "Result": [ + "30 20 5 8 100" + ] + } + ] } ] diff --git a/planner/core/testdata/integration_partition_suite_in.json b/planner/core/testdata/integration_partition_suite_in.json index a31a8531437d8..6a8f2fc0af486 100644 --- a/planner/core/testdata/integration_partition_suite_in.json +++ b/planner/core/testdata/integration_partition_suite_in.json @@ -149,5 +149,34 @@ "explain format='brief' select a from tcollist limit 10", "explain format='brief' select a from tcollist order by a limit 10" ] + }, + { + "name": "TestEstimationForTopNPushToDynamicPartition", + "cases": [ + "explain format='brief' select a from t use index (ia) where a > 10 order by a limit 10", + "explain format='brief' select a from trange use index (ia) where a > 10 order by a limit 10", + "explain format='brief' select a from tlist use index (ia) where a > 10 order by a limit 10", + "explain format='brief' select a from thash use index (ia) where a > 10 order by a limit 10", + "explain format='brief' select * from t use index (ia) where a > 10 order by a limit 10", + "explain format='brief' select * from trange use index (ia) where a > 10 order by a limit 10", + "explain format='brief' select * from tlist use index (ia) where a > 10 order by a limit 10", + "explain format='brief' select * from thash use index (ia) where a > 10 order by a limit 10", + "explain format='brief' select * from t use index (ia) where a + 1 > 10 order by a limit 10", + "explain format='brief' select * from trange use index (ia) where a + 1 > 10 order by a limit 10", + "explain format='brief' select * from tlist use index (ia) where a + 1 > 10 order by a limit 10", + "explain format='brief' select * from thash use index (ia) where a + 1 > 10 order by a limit 10", + "explain format='brief' select a from t use index (ia) where a > 10 and c = 10 order by a limit 10", + "explain format='brief' select a from trange use index (ia) where a > 10 and c = 10 order by a limit 10", + "explain format='brief' select a from tlist use index (ia) where a > 10 and c = 10 order by a limit 10", + "explain format='brief' select a from thash use index (ia) where a > 10 and c = 10 order by a limit 10", + "explain format='brief' select a from t use index () where b > 10 order by b limit 10", + "explain format='brief' select a from trange use index () where b > 10 order by b limit 10", + "explain format='brief' select a from tlist use index () where b > 10 order by b limit 10", + "explain format='brief' select a from thash use index () where b > 10 order by b limit 10", + "explain format='brief' select a from t use index () where a > 10 order by b limit 10", + "explain format='brief' select a from trange use index () where a > 10 order by b limit 10", + "explain format='brief' select a from tlist use index () where a > 10 order by b limit 10", + "explain format='brief' select a from thash use index () where a > 10 order by b limit 10" + ] } ] diff --git a/planner/core/testdata/integration_partition_suite_out.json b/planner/core/testdata/integration_partition_suite_out.json index e496996969211..9e9999cd9d4ba 100644 --- a/planner/core/testdata/integration_partition_suite_out.json +++ b/planner/core/testdata/integration_partition_suite_out.json @@ -1157,5 +1157,260 @@ ] } ] + }, + { + "Name": "TestEstimationForTopNPushToDynamicPartition", + "Cases": [ + { + "SQL": "explain format='brief' select a from t use index (ia) where a > 10 order by a limit 10", + "Plan": [ + "Limit 10.00 root offset:0, count:10", + "└─IndexReader 10.00 root index:Limit", + " └─Limit 10.00 cop[tikv] offset:0, count:10", + " └─IndexRangeScan 10.00 cop[tikv] table:t, index:ia(a) range:(10,+inf], keep order:true, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select a from trange use index (ia) where a > 10 order by a limit 10", + "Plan": [ + "TopN 10.00 root test.trange.a, offset:0, count:10", + "└─IndexReader 10.00 root partition:all index:Limit", + " └─Limit 10.00 cop[tikv] offset:0, count:10", + " └─IndexRangeScan 10.00 cop[tikv] table:trange, index:ia(a) range:(10,+inf], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select a from tlist use index (ia) where a > 10 order by a limit 10", + "Plan": [ + "TopN 10.00 root test.tlist.a, offset:0, count:10", + "└─IndexReader 10.00 root partition:all index:Limit", + " └─Limit 10.00 cop[tikv] offset:0, count:10", + " └─IndexRangeScan 10.00 cop[tikv] table:tlist, index:ia(a) range:(10,+inf], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select a from thash use index (ia) where a > 10 order by a limit 10", + "Plan": [ + "TopN 10.00 root test.thash.a, offset:0, count:10", + "└─IndexReader 10.00 root partition:all index:Limit", + " └─Limit 10.00 cop[tikv] offset:0, count:10", + " └─IndexRangeScan 10.00 cop[tikv] table:thash, index:ia(a) range:(10,+inf], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select * from t use index (ia) where a > 10 order by a limit 10", + "Plan": [ + "IndexLookUp 10.00 root limit embedded(offset:0, count:10)", + "├─Limit(Build) 10.00 cop[tikv] offset:0, count:10", + "│ └─IndexRangeScan 10.00 cop[tikv] table:t, index:ia(a) range:(10,+inf], keep order:true, stats:pseudo", + "└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select * from trange use index (ia) where a > 10 order by a limit 10", + "Plan": [ + "TopN 10.00 root test.trange.a, offset:0, count:10", + "└─IndexLookUp 10.00 root partition:all ", + " ├─Limit(Build) 10.00 cop[tikv] offset:0, count:10", + " │ └─IndexRangeScan 10.00 cop[tikv] table:trange, index:ia(a) range:(10,+inf], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:trange keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select * from tlist use index (ia) where a > 10 order by a limit 10", + "Plan": [ + "TopN 10.00 root test.tlist.a, offset:0, count:10", + "└─IndexLookUp 10.00 root partition:all ", + " ├─Limit(Build) 10.00 cop[tikv] offset:0, count:10", + " │ └─IndexRangeScan 10.00 cop[tikv] table:tlist, index:ia(a) range:(10,+inf], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:tlist keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select * from thash use index (ia) where a > 10 order by a limit 10", + "Plan": [ + "TopN 10.00 root test.thash.a, offset:0, count:10", + "└─IndexLookUp 10.00 root partition:all ", + " ├─Limit(Build) 10.00 cop[tikv] offset:0, count:10", + " │ └─IndexRangeScan 10.00 cop[tikv] table:thash, index:ia(a) range:(10,+inf], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:thash keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select * from t use index (ia) where a + 1 > 10 order by a limit 10", + "Plan": [ + "IndexLookUp 10.00 root limit embedded(offset:0, count:10)", + "├─Limit(Build) 10.00 cop[tikv] offset:0, count:10", + "│ └─Selection 10.00 cop[tikv] gt(plus(test.t.a, 1), 10)", + "│ └─IndexFullScan 12.50 cop[tikv] table:t, index:ia(a) keep order:true, stats:pseudo", + "└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select * from trange use index (ia) where a + 1 > 10 order by a limit 10", + "Plan": [ + "TopN 10.00 root test.trange.a, offset:0, count:10", + "└─IndexLookUp 10.00 root partition:all ", + " ├─Limit(Build) 10.00 cop[tikv] offset:0, count:10", + " │ └─Selection 10.00 cop[tikv] gt(plus(test.trange.a, 1), 10)", + " │ └─IndexFullScan 12.50 cop[tikv] table:trange, index:ia(a) keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:trange keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select * from tlist use index (ia) where a + 1 > 10 order by a limit 10", + "Plan": [ + "TopN 10.00 root test.tlist.a, offset:0, count:10", + "└─IndexLookUp 10.00 root partition:all ", + " ├─Limit(Build) 10.00 cop[tikv] offset:0, count:10", + " │ └─Selection 10.00 cop[tikv] gt(plus(test.tlist.a, 1), 10)", + " │ └─IndexFullScan 12.50 cop[tikv] table:tlist, index:ia(a) keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:tlist keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select * from thash use index (ia) where a + 1 > 10 order by a limit 10", + "Plan": [ + "TopN 10.00 root test.thash.a, offset:0, count:10", + "└─IndexLookUp 10.00 root partition:all ", + " ├─Limit(Build) 10.00 cop[tikv] offset:0, count:10", + " │ └─Selection 10.00 cop[tikv] gt(plus(test.thash.a, 1), 10)", + " │ └─IndexFullScan 12.50 cop[tikv] table:thash, index:ia(a) keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10.00 cop[tikv] table:thash keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select a from t use index (ia) where a > 10 and c = 10 order by a limit 10", + "Plan": [ + "Projection 3.33 root test.t.a", + "└─Limit 3.33 root offset:0, count:10", + " └─Projection 3.33 root test.t.a, test.t.c", + " └─IndexLookUp 3.33 root ", + " ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:t, index:ia(a) range:(10,+inf], keep order:true, stats:pseudo", + " └─Selection(Probe) 3.33 cop[tikv] eq(test.t.c, 10)", + " └─TableRowIDScan 3333.33 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select a from trange use index (ia) where a > 10 and c = 10 order by a limit 10", + "Plan": [ + "Projection 3.33 root test.trange.a", + "└─TopN 3.33 root test.trange.a, offset:0, count:10", + " └─IndexLookUp 3.33 root partition:all ", + " ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:trange, index:ia(a) range:(10,+inf], keep order:false, stats:pseudo", + " └─TopN(Probe) 3.33 cop[tikv] test.trange.a, offset:0, count:10", + " └─Selection 3.33 cop[tikv] eq(test.trange.c, 10)", + " └─TableRowIDScan 3333.33 cop[tikv] table:trange keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select a from tlist use index (ia) where a > 10 and c = 10 order by a limit 10", + "Plan": [ + "Projection 3.33 root test.tlist.a", + "└─TopN 3.33 root test.tlist.a, offset:0, count:10", + " └─IndexLookUp 3.33 root partition:all ", + " ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:tlist, index:ia(a) range:(10,+inf], keep order:false, stats:pseudo", + " └─TopN(Probe) 3.33 cop[tikv] test.tlist.a, offset:0, count:10", + " └─Selection 3.33 cop[tikv] eq(test.tlist.c, 10)", + " └─TableRowIDScan 3333.33 cop[tikv] table:tlist keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select a from thash use index (ia) where a > 10 and c = 10 order by a limit 10", + "Plan": [ + "Projection 3.33 root test.thash.a", + "└─TopN 3.33 root test.thash.a, offset:0, count:10", + " └─IndexLookUp 3.33 root partition:all ", + " ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:thash, index:ia(a) range:(10,+inf], keep order:false, stats:pseudo", + " └─TopN(Probe) 3.33 cop[tikv] test.thash.a, offset:0, count:10", + " └─Selection 3.33 cop[tikv] eq(test.thash.c, 10)", + " └─TableRowIDScan 3333.33 cop[tikv] table:thash keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select a from t use index () where b > 10 order by b limit 10", + "Plan": [ + "Projection 10.00 root test.t.a", + "└─Limit 10.00 root offset:0, count:10", + " └─TableReader 10.00 root data:Limit", + " └─Limit 10.00 cop[tikv] offset:0, count:10", + " └─TableRangeScan 10.00 cop[tikv] table:t range:(10,+inf], keep order:true, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select a from trange use index () where b > 10 order by b limit 10", + "Plan": [ + "Projection 10.00 root test.trange.a", + "└─TopN 10.00 root test.trange.b, offset:0, count:10", + " └─TableReader 10.00 root partition:all data:Limit", + " └─Limit 10.00 cop[tikv] offset:0, count:10", + " └─TableRangeScan 10.00 cop[tikv] table:trange range:(10,+inf], keep order:true, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select a from tlist use index () where b > 10 order by b limit 10", + "Plan": [ + "Projection 10.00 root test.tlist.a", + "└─TopN 10.00 root test.tlist.b, offset:0, count:10", + " └─TableReader 10.00 root partition:all data:Limit", + " └─Limit 10.00 cop[tikv] offset:0, count:10", + " └─TableRangeScan 10.00 cop[tikv] table:tlist range:(10,+inf], keep order:true, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select a from thash use index () where b > 10 order by b limit 10", + "Plan": [ + "Projection 10.00 root test.thash.a", + "└─TopN 10.00 root test.thash.b, offset:0, count:10", + " └─TableReader 10.00 root partition:all data:Limit", + " └─Limit 10.00 cop[tikv] offset:0, count:10", + " └─TableRangeScan 10.00 cop[tikv] table:thash range:(10,+inf], keep order:true, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select a from t use index () where a > 10 order by b limit 10", + "Plan": [ + "Projection 10.00 root test.t.a", + "└─Limit 10.00 root offset:0, count:10", + " └─TableReader 10.00 root data:Limit", + " └─Limit 10.00 cop[tikv] offset:0, count:10", + " └─Selection 10.00 cop[tikv] gt(test.t.a, 10)", + " └─TableFullScan 30.00 cop[tikv] table:t keep order:true, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select a from trange use index () where a > 10 order by b limit 10", + "Plan": [ + "Projection 10.00 root test.trange.a", + "└─TopN 10.00 root test.trange.b, offset:0, count:10", + " └─TableReader 10.00 root partition:all data:Limit", + " └─Limit 10.00 cop[tikv] offset:0, count:10", + " └─Selection 10.00 cop[tikv] gt(test.trange.a, 10)", + " └─TableFullScan 30.00 cop[tikv] table:trange keep order:true, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select a from tlist use index () where a > 10 order by b limit 10", + "Plan": [ + "Projection 10.00 root test.tlist.a", + "└─TopN 10.00 root test.tlist.b, offset:0, count:10", + " └─TableReader 10.00 root partition:all data:Limit", + " └─Limit 10.00 cop[tikv] offset:0, count:10", + " └─Selection 10.00 cop[tikv] gt(test.tlist.a, 10)", + " └─TableFullScan 30.00 cop[tikv] table:tlist keep order:true, stats:pseudo" + ] + }, + { + "SQL": "explain format='brief' select a from thash use index () where a > 10 order by b limit 10", + "Plan": [ + "Projection 10.00 root test.thash.a", + "└─TopN 10.00 root test.thash.b, offset:0, count:10", + " └─TableReader 10.00 root partition:all data:Limit", + " └─Limit 10.00 cop[tikv] offset:0, count:10", + " └─Selection 10.00 cop[tikv] gt(test.thash.a, 10)", + " └─TableFullScan 30.00 cop[tikv] table:thash keep order:true, stats:pseudo" + ] + } + ] } ] diff --git a/planner/core/testdata/integration_suite_in.json b/planner/core/testdata/integration_suite_in.json index db677ac97d23c..d475004ffe96b 100644 --- a/planner/core/testdata/integration_suite_in.json +++ b/planner/core/testdata/integration_suite_in.json @@ -653,12 +653,66 @@ "desc format = 'brief' select /*+ read_from_storage(tiflash[t, ttt], tikv[tt]) */ * from ttt" ] }, + { + "name": "TestKeepOrderHint", + "cases": [ + "explain select /*+ order_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;", + "explain select /*+ order_index(t, primary) */ * from t where a<10 order by a limit 1;", + "explain select /*+ no_order_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;", + "explain select /*+ no_order_index(t, primary) */ * from t where a<10 order by a limit 1;", + "explain select /*+ no_order_index(t1, idx_a) */ * from t1 where a<10 limit 1;", + "explain select /*+ no_order_index(t, primary) */ * from t where a<10 limit 1;", + + // The index doesn't exist + "explain select /*+ order_index(t1, idx_b) */ * from t1 where b<10 order by b limit 1;", + "explain select /*+ order_index(t, idx_b) */ * from t where b<10 order by b limit 1;", + "explain select /*+ no_order_index(t1, idx_b) */ * from t1 where b<10 order by b limit 1;", + "explain select /*+ no_order_index(t, idx_b) */ * from t where b<10 order by b limit 1;", + + // Use the order_index/ no_order_index with the use_index/ ignore_index/ force_index hint at the same time + "explain select /*+ order_index(t1, idx_a) use_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;", + "explain select /*+ order_index(t1, idx_a) */ * from t1 use index(idx_a) where a<10 order by a limit 1;", + "explain select /*+ order_index(t1, idx_a) force_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;", + "explain select /*+ order_index(t1, idx_a) */ * from t1 force index(idx_a) where a<10 order by a limit 1;", + "explain select /*+ order_index(t1, idx_a) ignore_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;", + + "explain select /*+ order_index(t, primary) use_index(t, primary) */ * from t where a<10 order by a limit 1;", + "explain select /*+ order_index(t, primary) */ * from t use index(primary) where a<10 order by a limit 1;", + "explain select /*+ order_index(t, primary) force_index(t, primary) */ * from t where a<10 order by a limit 1;", + "explain select /*+ order_index(t, primary) */ * from t force index(primary) where a<10 order by a limit 1;", + "explain select /*+ order_index(t, primary) ignore_index(t, primary) */ * from t where a<10 order by a limit 1;", + + "explain select /*+ no_order_index(t, primary) use_index(t, primary) */ * from t where a<10 order by a limit 1;", + "explain select /*+ no_order_index(t, primary) */ * from t use index(primary) where a<10 order by a limit 1;", + "explain select /*+ no_order_index(t, primary) force_index(t, primary) */ * from t where a<10 order by a limit 1;", + "explain select /*+ no_order_index(t, primary) */ * from t force index(primary) where a<10 order by a limit 1;", + "explain select /*+ no_order_index(t, primary) ignore_index(t, primary) */ * from t where a<10 order by a limit 1;", + + "explain select /*+ no_order_index(t1, idx_a) use_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;", + "explain select /*+ no_order_index(t1, idx_a) */ * from t1 use index(idx_a) where a<10 order by a limit 1;", + "explain select /*+ no_order_index(t1, idx_a) force_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;", + "explain select /*+ no_order_index(t1, idx_a) */ * from t1 force index(idx_a) where a<10 order by a limit 1;", + "explain select /*+ no_order_index(t1, idx_a) ignore_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;", + + // Use the order_index/ no_order_index with the use_view hint at the same time + "explain select /*+ qb_name(qb, v) order_index(t1@qb, idx_a) */ * from v", + "explain select /*+ qb_name(qb, v1) order_index(t@qb, primary) */ * from v1", + "explain select /*+ qb_name(qb, v) no_order_index(t1@qb, idx_a) */ * from v", + "explain select /*+ qb_name(qb, v1) no_order_index(t@qb, primary) */ * from v1", + + // Use the order_index/ no_order_index with CTE at the same time + "explain WITH CTE AS (select /*+ order_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "explain WITH CTE AS (select /*+ order_index(t, primary) */ * from t where a<10 order by a limit 1) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "explain WITH CTE AS (select /*+ no_order_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "explain WITH CTE AS (select /*+ no_order_index(t, primary) */ * from t where a<10 order by a limit 1) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;" + ] + }, { "name": "TestViewHint", "cases": [ // Hint for view v "explain format = 'brief' select /*+ qb_name(qb_v_2, v@sel_1 .@sel_2), merge_join(t1@qb_v_2) */ * from v;", - "explain format = 'brief' select /*+ qb_name(qb_v_2, v@sel_1 .@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v@sel_1 .@sel1), merge_join(t@qb_v_1) */ * from v;", + "explain format = 'brief' select /*+ qb_name(qb_v_2, v@sel_1 .@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v@sel_1 .@sel_1), merge_join(t@qb_v_1) */ * from v;", "explain format = 'brief' select /*+ qb_name(qb_v_2, v1@sel_1 . v@sel_2 .@sel_2), merge_join(t1@qb_v_2) */ * from v1;", "explain format = 'brief' select /*+ qb_name(qb_v_2, v1@sel_1 . v@sel_2 .@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v1@sel_1 . v@sel_2 .@sel_1), merge_join(t@qb_v_1) */ * from v1;", "explain format = 'brief' select /*+ qb_name(qb_v_2, v2@sel_1 . v1@sel_2 . v@sel_2 .@sel_2), merge_join(t1@qb_v_2) */ * from v2;", @@ -667,12 +721,12 @@ // Hint for view v1 "explain format = 'brief' select /*+ qb_name(qb_v1_2, v1@sel_1 .@sel_2), merge_join(t1@qb_v1_2) */ * from v1;", "explain format = 'brief' select /*+ qb_name(qb_v1_2, v1@sel_1 .@sel_2), merge_join(t1@qb_v1_2), stream_agg(@qb_v1_2), qb_name(qb_v1_1, v1@sel_1 .@sel_1), merge_join(t@qb_v1_1) */ * from v1;", - "explain format = 'brief' select /*+ qb_name(qb_v1_2, v2@sel_1 . v1@sel_1 .@sel_2), merge_join(t1@qb_v1_2) */ * from v2;", - "explain format = 'brief' select /*+ qb_name(qb_v1_2, v2@sel_1 . v1@sel_1 .@sel_2), merge_join(t1@qb_v1_2), stream_agg(@qb_v1_2), qb_name(qb_v1_1, v2@sel_1 . v1@sel_1 .@sel_1), merge_join(t@qb_v1_1) */ * from v2;", + "explain format = 'brief' select /*+ qb_name(qb_v1_2, v2@sel_1 . v1@sel_2 .@sel_2), merge_join(t1@qb_v1_2) */ * from v2;", + "explain format = 'brief' select /*+ qb_name(qb_v1_2, v2@sel_1 . v1@sel_2 .@sel_2), merge_join(t1@qb_v1_2), stream_agg(@qb_v1_2), qb_name(qb_v1_1, v2@sel_1 . v1@sel_2 .@sel_1), merge_join(t@qb_v1_1) */ * from v2;", // Hint for view v2 "explain format = 'brief' select /*+ qb_name(qb_v2_2, v2@sel_1 .@sel_2), merge_join(t1@qb_v2_2) */ * from v2;", - "explain format = 'brief' select /*+ qb_name(qb_v2_2, v2@sel_1 .@sel_2), merge_join(t1@qb_v2_2), stream_agg(@qb_v2_2), qb_name(qb_v2_1, v1@sel_1 .@sel_1), merge_join(t@qb_v2_1) */ * from v2;" + "explain format = 'brief' select /*+ qb_name(qb_v2_2, v2@sel_1 .@sel_2), merge_join(t1@qb_v2_2), stream_agg(@qb_v2_2), qb_name(qb_v2_1, v2), merge_join(t@qb_v2_1) */ * from v2;" ] }, { @@ -684,7 +738,6 @@ "explain format = 'brief' select /*+ qb_name(qb_v, v2@sel_1 .v1@sel_2 .v@sel_2 .@sel_2), qb_name(qb_v, v2@sel_1 .v1@sel_2 .v@sel_2 .@sel_1), merge_join(t1@qb_v) */ * from v2;", // Set the unappeared view name - // TODO: add the warning for the unused the view hints "explain format = 'brief' select /*+ qb_name(qb_v1_2, v@sel_1 .@sel_2), merge_join(t1@qb_v1_2) */ * from v1;", "explain format = 'brief' select /*+ qb_name(qb_v1_2, v2@sel_1 . v@sel_1 .@sel_2), merge_join(t1@qb_v1_2) */ * from v2;", @@ -694,18 +747,17 @@ // Tht view hint isn't set in the first query block. "explain format = 'brief' select * from (select /*+ qb_name(qb_v_2, v@sel_1 .@sel_2), merge_join(t1@qb_v_2) */ * from v) t;", - "explain format = 'brief' select * from (select /*+ qb_name(qb_v_2, v@sel_1 .@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v@sel_1 .@sel1), merge_join(t@qb_v_1) */ * from v) t;", + "explain format = 'brief' select * from (select /*+ qb_name(qb_v_2, v.@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v@sel_1 .@sel1), merge_join(t@qb_v_1) */ * from v) t;", "explain format = 'brief' select * from (select /*+ qb_name(qb_v_2, v1@sel_1 . v@sel_2 .@sel_2), merge_join(t1@qb_v_2) */ * from v1) t;", - "explain format = 'brief' select * from (select /*+ qb_name(qb_v_2, v1@sel_1 . v@sel_2 .@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v1@sel_1 . v@sel_2 .@sel_1), merge_join(t@qb_v_1) */ * from v1) t;", + "explain format = 'brief' select * from (select /*+ qb_name(qb_v_2, v1.v@sel_2 .@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v1@sel_1 . v@sel_2 .@sel_1), merge_join(t@qb_v_1) */ * from v1) t;", - // TODO: add the warning when the view hints don't set in the first query block - "explain format = 'brief' select /*+ qb_name(qb_v_2, v@sel_1 .@sel_2) */ * from (select /*+ merge_join(t1@qb_v_2) */ * from v) t;", - "explain format = 'brief' select /*+ qb_name(qb_v_2, v@sel_1 .@sel_2), qb_name(qb_v_1, v@sel_1 .@sel1) */ * from (select /*+ merge_join(t1@qb_v_2), stream_agg(@qb_v_2), merge_join(t@qb_v_1) */ * from v) t;", - "explain format = 'brief' select /*+ qb_name(qb_v_2, v1@sel_1 . v@sel_2 .@sel_2) */ * from (select /*+ merge_join(t1@qb_v_2) */ * from v1) t;", - "explain format = 'brief' select /*+ qb_name(qb_v_2, v1@sel_1 . v@sel_2 .@sel_2), qb_name(qb_v_1, v1@sel_1 . v@sel_2 .@sel_1) */ * from (select /*+ merge_join(t1@qb_v_2), stream_agg(@qb_v_2), merge_join(t@qb_v_1) */ * from v1) t;", + "explain format = 'brief' select /*+ qb_name(qb_v_2, v@sel_2 .@sel_2) */ * from (select /*+ merge_join(t1@qb_v_2) */ * from v) t;", + "explain format = 'brief' select /*+ qb_name(qb_v_2, v@sel_2 .@sel_2), qb_name(qb_v_1, v@sel_2 .@sel1) */ * from (select /*+ merge_join(t1@qb_v_2), stream_agg(@qb_v_2), merge_join(t@qb_v_1) */ * from v) t;", + "explain format = 'brief' select /*+ qb_name(qb_v_2, v1@sel_2 . v@sel_2 .@sel_2) */ * from (select /*+ merge_join(t1@qb_v_2) */ * from v1) t;", + "explain format = 'brief' select /*+ qb_name(qb_v_2, v1@sel_2 . v@sel_2 .@sel_2), qb_name(qb_v_1, v1@sel_2 . v@sel_2 .@sel_1) */ * from (select /*+ merge_join(t1@qb_v_2), stream_agg(@qb_v_2), merge_join(t@qb_v_1) */ * from v1) t;", // Define more tables in one view hint - "explain format = 'brief' select /*+ qb_name(qb_v1_2, v2@sel_1 . v1@sel_1 .@sel_2), qb_name(qb_v1_1, v2@sel_1 . v1@sel_1 .@sel_1), merge_join(t1@qb_v1_2, t@qb_v1_1) */ * from v2;", + "explain format = 'brief' select /*+ qb_name(qb_v1_2, v2. v1@sel_2 .@sel_2), qb_name(qb_v1_1, v2@sel_1 . v1@sel_2 .@sel_1), merge_join(t1@qb_v1_2, t@qb_v1_1), merge_join(t1@qb_v1_2) */ * from v2;", "explain format = 'brief' select /*+ qb_name(qb_v_2, v2@sel_1 . v1@sel_2 . v@sel_2 .@sel_2), qb_name(qb_v_1, v2@sel_1 . v1@sel_2 . v@sel_2 .@sel_1), merge_join(t1@qb_v_2, t3@qb_v_2) */ * from v2;", "explain format = 'brief' select /*+ qb_name(qb_v_2, v2@sel_1 . v1@sel_2 . v@sel_2 .@sel_2), qb_name(qb_v_1, v2@sel_1 . v1@sel_2 . v@sel_2 .@sel_1), merge_join(@qb_v_2 t1, t3) */ * from v2;", @@ -717,7 +769,85 @@ // Use the query block before define it "explain format = 'brief' select /*+ merge_join(t1@qb_v_2), qb_name(qb_v_2, v@sel_1 .@sel_2) */ * from v;", - "explain format = 'brief' select /*+ merge_join(t@qb_v_1), stream_agg(@qb_v_2), qb_name(qb_v_2, v@sel_1 .@sel_2), qb_name(qb_v_1, v@sel_1 .@sel1) */ * from v;" + "explain format = 'brief' select /*+ merge_join(t@qb_v_1), stream_agg(@qb_v_2), qb_name(qb_v_2, v@sel_1 .@sel_2), qb_name(qb_v_1, v@sel_1 .@sel_1) */ * from v;", + + // The view contains the hint when creation + "explain format = 'brief' select /*+ qb_name(qb_v3_2, v3@sel_1 .@sel_2), merge_join(t1@qb_v3_2) */ * from v3;", + "explain format = 'brief' select /*+ qb_name(qb_v3_2, v3@sel_1 .@sel_2), merge_join(t1@qb_v3_2), hash_agg(@qb_v3_2), qb_name(qb_v3_1, v3@sel_1 .@sel_1), hash_join(t@qb_v3_1) */ * from v3;", + + // The view is in the CTE + "explain with d1 as (\n select a from (\n select a from (\n select /*+ qb_name(qb, v4) use_index(t4@qb, idx_a) */ a from v4 where a < 10\n ) as t0 where a < 9\n ) as t1 where a < 8\n), d2 as (select /*+ qb_name(qb2, v4) use_index(t4@qb2, idx_b) */ a from v4 where b < 10)\n\nselect * from (select * from d1) as t0 join (select * from d2) as t1;", + "explain with d1 as (\n select a from (\n select a from (\n select a from v4 where a < 10\n ) as t0 where a < 9\n ) as t1 where a < 8\n), d2 as (select a from v4 where b < 10)\n\nselect /*+ qb_name(qb, v4@sel_4) use_index(t4@qb, idx_a) qb_name(qb2, v4@sel_5) use_index(t4@qb, idx_b) */ * from (select * from d1) as t0 join (select * from d2) as t1;", + "explain with d1 as (\n select a from (\n select a from (\n select /*+ qb_name(qb, v5) use_index(t4@qb, idx_a) */ a from v4 where a < 10\n ) as t0 where a < 9\n ) as t1 where a < 8\n), d2 as (select /*+ qb_name(qb2, v4) use_index(t4@qb2, idx_b) */ a from v4 where b < 10)\n\nselect * from (select * from d1) as t0 join (select * from d2) as t1;" + ] + }, + { + "name": "TestAllViewHintType", + "cases": [ + // leading hint + // join nodes in the same view + "explain format = 'brief' select /*+ qb_name(qb_v1, v1), leading(@qb_v1 v, t2) */ * from v1;", + "explain format = 'brief' select /*+ qb_name(qb_v1, v1), leading(v@qb_v1, t2@qb_v1) */ * from v1;", + "explain format = 'brief' select /*+ qb_name(qb_v1, v1), leading(@qb_v1 t3, t2) */ * from v1;", + "explain format = 'brief' select /*+ qb_name(qb_v1, v1), leading(t3@qb_v1, t2@qb_v1) */ * from v1;", + + // join node across view + "explain format = 'brief' select /*+ qb_name(qb_v1, v1), qb_name(qb_v, v1.v), leading(t2@qb_v1, t@qb_v) */ * from v1;", + + // hash_join hint + "explain format = 'brief' select /*+ qb_name(qb_v1, v1), hash_join(@qb_v1 v, t2) */ * from v1;", + "explain format = 'brief' select /*+ qb_name(qb_v1, v1), hash_join(t2@qb_v1, t3@qb_v1) */ * from v1;", + + // hash join build hint + "explain format = 'brief' select /*+ qb_name(qb_v1, v1), hash_join_build(@qb_v1 v) */ * from v1;", + "explain format = 'brief' select /*+ qb_name(qb_v1, v1), hash_join_build(t2@qb_v1) */ * from v1;", + + // hash join probe hint + "explain format = 'brief' select /*+ qb_name(qb_v1, v1), hash_join_build(@qb_v1 v) */ * from v1;", + "explain format = 'brief' select /*+ qb_name(qb_v1, v1), hash_join_build(t2@qb_v1) */ * from v1;", + + // merge join hint + "explain format = 'brief' select /*+ qb_name(qb_v1, v1), merge_join(@qb_v1 v) */ * from v1;", + "explain format = 'brief' select /*+ qb_name(qb_v1, v1), merge_join(t2@qb_v1) */ * from v1;", + + // index join hint + "explain format = 'brief' select /*+ qb_name(qb_v, v), INL_JOIN(@qb_v t) */ * from v;", + "explain format = 'brief' select /*+ qb_name(qb_v, v), INL_JOIN(t@qb_v) */ * from v;", + + // agg hint + "explain format = 'brief' select /*+ qb_name(qb_v2, v2.@sel_2), hash_agg(@qb_v2) */ * from v2;", + "explain format = 'brief' select /*+ qb_name(qb_v2, v2.@sel_2), stream_agg(@qb_v2) */ * from v2;", + + // index hint + "explain format = 'brief' select /*+ qb_name(qb_v3, v3), use_index(t5@qb_v3, idx_a) */ * from v3;", + "explain format = 'brief' select /*+ qb_name(qb_v3, v3), use_index(@qb_v3 t5, idx_b) */ * from v3;", + "explain format = 'brief' select /*+ qb_name(qb_v3, v3), force_index(t5@qb_v3, idx_a) */ * from v3;", + "explain format = 'brief' select /*+ qb_name(qb_v3, v3), force_index(@qb_v3 t5, idx_b) */ * from v3;", + "explain format = 'brief' select /*+ qb_name(qb_v3, v3), ignore_index(t5@qb_v3, idx_a) */ * from v3;", + "explain format = 'brief' select /*+ qb_name(qb_v3, v3), ignore_index(@qb_v3 t5, idx_b) */ * from v3;", + "explain format = 'brief' select /*+ qb_name(qb_v4, v4), use_index_merge(t5@qb_v4, idx_a, idx_b) */ * from v4;", + "explain format = 'brief' select /*+ qb_name(qb_v4, v4), use_index_merge(@qb_v4 t5, idx_b, idx_a) */ * from v4;", + + // read from storage + "explain format = 'brief' select /*+ qb_name(qb_v, v), READ_FROM_STORAGE(TIFLASH[t@qb_v], TIKV[t1@qb_v]) */ * from v;", + + // subquery hint + "explain format = 'brief' select /*+ qb_name(qb_v5, v5.@sel_2), SEMI_JOIN_REWRITE(@qb_v5) */ * from v5;", + "explain format = 'brief' select /*+ qb_name(qb_v6, v6.@sel_2), NO_DECORRELATE(@qb_v6) */ * from v6;", + + // cte hint + "explain format = 'brief' select /*+ qb_name(qb_v7, v7), merge(@qb_v7) */ * from v7;", + "explain format = 'brief' select /*+ qb_name(qb_v8, v8), merge(@qb_v8) */ * from v8;", + + // agg to cop hint + "explain format = 'brief' select /*+ qb_name(qb_v9, v9), AGG_TO_COP(@qb_v9) */ * from v9;", + "explain format = 'brief' select /*+ qb_name(qb_v10, v10), LIMIT_TO_COP(@qb_v10) */ * from v10;", + + // MPP hint + "explain format = 'brief' select /*+ qb_name(qb, v11) read_from_storage(tiflash[t@qb]), MPP_1PHASE_AGG(@qb) */ * from v11;", + "explain format = 'brief' select /*+ qb_name(qb, v11) read_from_storage(tiflash[t@qb]), MPP_2PHASE_AGG(@qb) */ * from v11;", + "explain format = 'brief' select /*+ qb_name(qb, v12) read_from_storage(tiflash[t1@qb, t@qb]), shuffle_join(t1@qb, t@qb) */ * from v12;", + "explain format = 'brief' select /*+ qb_name(qb, v12) read_from_storage(tiflash[t1@qb, t@qb]), broadcast_join(t1@qb, t@qb) */ * from v12;" ] }, { @@ -884,6 +1014,27 @@ "desc format = 'brief' select * from tt t1 where exists (select * from t t2 where t1.b1 = t2.c3 and t2.c1 < t2.c2)" ] }, + { + "name": "TestMppFineGrainedJoinAndAgg", + "cases": [ + "desc format = 'brief' select * from tt t1 where exists (select * from t t2 where t1.b1 = t2.c3 and t2.c1 < t2.c2)", + "desc format = 'brief' select count(*) from tt group by b1" + ] + }, + { + "name": "TestMppVersion", + "cases": [ + "desc format = 'brief' select count(*) as cnt from t group by a, b", + "set mpp_exchange_compression_mode = UNSPECIFIED", + "desc format = 'brief' select count(*) as cnt from t group by a, b", + "set mpp_version = 0", + "set mpp_exchange_compression_mode = fast", + "desc format = 'brief' select count(*) as cnt from t group by a, b", + "set mpp_version = -1", + "set mpp_exchange_compression_mode = high_compression", + "desc format = 'brief' select count(*) as cnt from t group by a, b" + ] + }, { "name": "TestPushDownAggForMPP", "cases": [ diff --git a/planner/core/testdata/integration_suite_out.json b/planner/core/testdata/integration_suite_out.json index fcace6da5904c..51f5275c778a0 100644 --- a/planner/core/testdata/integration_suite_out.json +++ b/planner/core/testdata/integration_suite_out.json @@ -175,12 +175,12 @@ "Plan": [ "HashAgg 2.00 root group by:Column#5, funcs:firstrow(Column#5)->Column#5", "└─Union 2.00 root ", - " ├─HashAgg 1.00 root funcs:max(test.t.a)->Column#2", + " ├─StreamAgg 1.00 root funcs:max(test.t.a)->Column#2", " │ └─Limit 1.00 root offset:0, count:1", " │ └─TableReader 1.00 root data:Limit", " │ └─Limit 1.00 cop[tikv] offset:0, count:1", " │ └─TableFullScan 1.00 cop[tikv] table:t keep order:true, desc, stats:pseudo", - " └─HashAgg 1.00 root funcs:min(test.t.a)->Column#4", + " └─StreamAgg 1.00 root funcs:min(test.t.a)->Column#4", " └─Limit 1.00 root offset:0, count:1", " └─TableReader 1.00 root data:Limit", " └─Limit 1.00 cop[tikv] offset:0, count:1", @@ -191,12 +191,12 @@ "SQL": "explain format = 'brief' select min(a), max(a) from cluster_index_t", "Plan": [ "HashJoin 1.00 root CARTESIAN inner join", - "├─HashAgg(Build) 1.00 root funcs:max(test.cluster_index_t.a)->Column#5", + "├─StreamAgg(Build) 1.00 root funcs:max(test.cluster_index_t.a)->Column#5", "│ └─Limit 1.00 root offset:0, count:1", "│ └─TableReader 1.00 root data:Limit", "│ └─Limit 1.00 cop[tikv] offset:0, count:1", "│ └─TableFullScan 1.00 cop[tikv] table:cluster_index_t keep order:true, desc, stats:pseudo", - "└─HashAgg(Probe) 1.00 root funcs:min(test.cluster_index_t.a)->Column#4", + "└─StreamAgg(Probe) 1.00 root funcs:min(test.cluster_index_t.a)->Column#4", " └─Limit 1.00 root offset:0, count:1", " └─TableReader 1.00 root data:Limit", " └─Limit 1.00 cop[tikv] offset:0, count:1", @@ -207,12 +207,12 @@ "SQL": "explain format = 'brief' select min(b), max(b) from cluster_index_t where a = 1", "Plan": [ "HashJoin 1.00 root CARTESIAN inner join", - "├─HashAgg(Build) 1.00 root funcs:max(test.cluster_index_t.b)->Column#5", + "├─StreamAgg(Build) 1.00 root funcs:max(test.cluster_index_t.b)->Column#5", "│ └─Limit 1.00 root offset:0, count:1", "│ └─TableReader 1.00 root data:Limit", "│ └─Limit 1.00 cop[tikv] offset:0, count:1", "│ └─TableRangeScan 1.00 cop[tikv] table:cluster_index_t range:[1,1], keep order:true, desc, stats:pseudo", - "└─HashAgg(Probe) 1.00 root funcs:min(test.cluster_index_t.b)->Column#4", + "└─StreamAgg(Probe) 1.00 root funcs:min(test.cluster_index_t.b)->Column#4", " └─Limit 1.00 root offset:0, count:1", " └─TableReader 1.00 root data:Limit", " └─Limit 1.00 cop[tikv] offset:0, count:1", @@ -222,9 +222,9 @@ { "SQL": "explain format = 'brief' select min(a), max(a) from cluster_index_t where b = 1", "Plan": [ - "HashAgg 1.00 root funcs:min(Column#6)->Column#4, funcs:max(Column#7)->Column#5", - "└─TableReader 1.00 root data:HashAgg", - " └─HashAgg 1.00 cop[tikv] funcs:min(test.cluster_index_t.a)->Column#6, funcs:max(test.cluster_index_t.a)->Column#7", + "StreamAgg 1.00 root funcs:min(Column#8)->Column#4, funcs:max(Column#9)->Column#5", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:min(test.cluster_index_t.a)->Column#8, funcs:max(test.cluster_index_t.a)->Column#9", " └─Selection 10.00 cop[tikv] eq(test.cluster_index_t.b, 1)", " └─TableFullScan 10000.00 cop[tikv] table:cluster_index_t keep order:false, stats:pseudo" ] @@ -232,9 +232,9 @@ { "SQL": "explain format = 'brief' select min(b), max(b) from cluster_index_t where b = 1", "Plan": [ - "HashAgg 1.00 root funcs:min(Column#6)->Column#4, funcs:max(Column#7)->Column#5", - "└─TableReader 1.00 root data:HashAgg", - " └─HashAgg 1.00 cop[tikv] funcs:min(test.cluster_index_t.b)->Column#6, funcs:max(test.cluster_index_t.b)->Column#7", + "StreamAgg 1.00 root funcs:min(Column#8)->Column#4, funcs:max(Column#9)->Column#5", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:min(test.cluster_index_t.b)->Column#8, funcs:max(test.cluster_index_t.b)->Column#9", " └─Selection 10.00 cop[tikv] eq(test.cluster_index_t.b, 1)", " └─TableFullScan 10000.00 cop[tikv] table:cluster_index_t keep order:false, stats:pseudo" ] @@ -339,7 +339,7 @@ { "SQL": "explain format = 'brief' select /*+ USE_INDEX_MERGE(t, a, b) */ * from t where a = 1 or b = 2", "Plan": [ - "IndexMerge 2.00 root ", + "IndexMerge 2.00 root type: union", "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false, stats:pseudo", "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:b(b) range:[2,2], keep order:false, stats:pseudo", "└─TableRowIDScan(Probe) 2.00 cop[tikv] table:t keep order:false, stats:pseudo" @@ -348,7 +348,7 @@ { "SQL": "explain format = 'brief' select /*+ USE_INDEX_MERGE(t, A, B) */ * from t where a = 1 or b = 2", "Plan": [ - "IndexMerge 2.00 root ", + "IndexMerge 2.00 root type: union", "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false, stats:pseudo", "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:b(b) range:[2,2], keep order:false, stats:pseudo", "└─TableRowIDScan(Probe) 2.00 cop[tikv] table:t keep order:false, stats:pseudo" @@ -386,7 +386,7 @@ { "SQL": "explain format = 'brief' select /*+ USE_INDEX_MERGE(t, a, c) */ * from t where b = 1 and (a = 1 or c = 1)", "Plan": [ - "IndexMerge 0.02 root ", + "IndexMerge 0.02 root type: union", "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false, stats:pseudo", "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:c(c) range:[1,1], keep order:false, stats:pseudo", "└─Selection(Probe) 0.02 cop[tikv] eq(test.t.b, 1)", @@ -942,7 +942,7 @@ "SQL": "select /*+ use_index_merge(t partition(p0)) */ * from t where t.b = 1 or t.c = \"8\"", "Plan": [ "PartitionUnion 59.97 root ", - "├─IndexMerge 19.99 root ", + "├─IndexMerge 19.99 root type: union", "│ ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, partition:p0, index:b(b) range:[1,1], keep order:false, stats:pseudo", "│ ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, partition:p0, index:c(c) range:[\"8\",\"8\"], keep order:false, stats:pseudo", "│ └─TableRowIDScan(Probe) 19.99 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", @@ -959,11 +959,11 @@ "SQL": "select /*+ use_index_merge(t partition(p0, p1) primary, b) */ * from t where t.a = 1 or t.b = 2", "Plan": [ "PartitionUnion 33.00 root ", - "├─IndexMerge 11.00 root ", + "├─IndexMerge 11.00 root type: union", "│ ├─TableRangeScan(Build) 1.00 cop[tikv] table:t, partition:p0 range:[1,1], keep order:false, stats:pseudo", "│ ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, partition:p0, index:b(b) range:[2,2], keep order:false, stats:pseudo", "│ └─TableRowIDScan(Probe) 11.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", - "├─IndexMerge 11.00 root ", + "├─IndexMerge 11.00 root type: union", "│ ├─TableRangeScan(Build) 1.00 cop[tikv] table:t, partition:p1 range:[1,1], keep order:false, stats:pseudo", "│ ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, partition:p1, index:b(b) range:[2,2], keep order:false, stats:pseudo", "│ └─TableRowIDScan(Probe) 11.00 cop[tikv] table:t, partition:p1 keep order:false, stats:pseudo", @@ -1094,7 +1094,7 @@ { "SQL": "select /*+ use_index_merge(t1 primary, c) */ * from t1 where t1.a >= 1 or t1.c = 2.2", "Plan": [ - "IndexMerge 3.00 root ", + "IndexMerge 3.00 root type: union", "├─TableRangeScan(Build) 3.00 cop[tikv] table:t1 range:[1,+inf], keep order:false", "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, index:c(c) range:[2.2000000000,2.2000000000], keep order:false", "└─TableRowIDScan(Probe) 3.00 cop[tikv] table:t1 keep order:false" @@ -1108,7 +1108,7 @@ { "SQL": "select /*+ use_index_merge(t1 primary, c) */ * from t1 where t1.a = 1 and t1.b = '111' or t1.c = 3.3", "Plan": [ - "IndexMerge 1.67 root ", + "IndexMerge 1.67 root type: union", "├─TableRangeScan(Build) 1.00 cop[tikv] table:t1 range:[1 \"111\",1 \"111\"], keep order:false", "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, index:c(c) range:[3.3000000000,3.3000000000], keep order:false", "└─TableRowIDScan(Probe) 1.67 cop[tikv] table:t1 keep order:false" @@ -1338,7 +1338,7 @@ { "SQL": "select * from pt where id = 4 or c < 7", "Plan": [ - "IndexMerge_11 3330.01 root partition:all ", + "IndexMerge_11 3330.01 root partition:all type: union", "├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:pt, index:i_id(id) range:[4,4], keep order:false, stats:pseudo", "├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:pt, index:i_c(c) range:[-inf,7), keep order:false, stats:pseudo", "└─TableRowIDScan_10(Probe) 3330.01 cop[tikv] table:pt keep order:false, stats:pseudo" @@ -1347,7 +1347,7 @@ { "SQL": "select * from pt where id > 4 or c = 7", "Plan": [ - "IndexMerge_11 3340.00 root partition:all ", + "IndexMerge_11 3340.00 root partition:all type: union", "├─IndexRangeScan_8(Build) 3333.33 cop[tikv] table:pt, index:i_id(id) range:(4,+inf], keep order:false, stats:pseudo", "├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:pt, index:i_c(c) range:[7,7], keep order:false, stats:pseudo", "└─TableRowIDScan_10(Probe) 3340.00 cop[tikv] table:pt keep order:false, stats:pseudo" @@ -1487,7 +1487,7 @@ "SQL": "explain format = 'brief' SELECT /*+ use_index_merge(t1)*/ COUNT(*) FROM t1 WHERE (key4=42 AND key6 IS NOT NULL) OR (key1=4 AND key3=6)", "Plan": [ "StreamAgg 1.00 root funcs:count(1)->Column#10", - "└─IndexMerge 0.02 root ", + "└─IndexMerge 0.02 root type: union", " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, index:i4(key4) range:[42,42], keep order:false, stats:pseudo", " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, index:i1(key1) range:[4,4], keep order:false, stats:pseudo", " └─Selection(Probe) 0.02 cop[tikv] or(and(eq(test.t1.key4, 42), not(isnull(test.t1.key6))), and(eq(test.t1.key1, 4), eq(test.t1.key3, 6)))", @@ -1502,8 +1502,8 @@ { "SQL": "explain format = 'brief' SELECT t1.pk FROM t1 INNER JOIN t2 ON t1.col1 = t2.pk INNER JOIN t3 ON t1.col3 = t3.pk WHERE t2.col1 IN ('a' , 'b') AND t3.keycol = 'c' AND t1.col2 = 'a' AND t1.col1 != 'abcdef' AND t1.col1 != 'aaaaaa'", "Plan": [ - "IndexJoin 13.81 root inner join, inner:IndexLookUp, outer key:test.t1.col1, inner key:test.t2.pk, equal cond:eq(test.t1.col1, test.t2.pk)", - "├─IndexJoin(Build) 12.50 root inner join, inner:IndexLookUp, outer key:test.t3.pk, inner key:test.t1.col3, equal cond:eq(test.t3.pk, test.t1.col3)", + "IndexHashJoin 13.81 root inner join, inner:IndexLookUp, outer key:test.t1.col1, inner key:test.t2.pk, equal cond:eq(test.t1.col1, test.t2.pk)", + "├─IndexHashJoin(Build) 12.50 root inner join, inner:IndexLookUp, outer key:test.t3.pk, inner key:test.t1.col3, equal cond:eq(test.t3.pk, test.t1.col3)", "│ ├─IndexLookUp(Build) 10.00 root ", "│ │ ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t3, index:keycol(keycol, pad1, pad2) range:[\"c\",\"c\"], keep order:false, stats:pseudo", "│ │ └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t3 keep order:false, stats:pseudo", @@ -1522,8 +1522,8 @@ { "SQL": "explain format = 'brief' SELECT t1.pk FROM t1 LEFT JOIN t2 ON t1.col1 = t2.pk LEFT JOIN t3 ON t1.col3 = t3.pk WHERE t2.col1 IN ('a' , 'b') AND t3.keycol = 'c' AND t1.col2 = 'a' AND t1.col1 != 'abcdef' AND t1.col1 != 'aaaaaa'", "Plan": [ - "IndexJoin 13.81 root inner join, inner:IndexLookUp, outer key:test.t1.col1, inner key:test.t2.pk, equal cond:eq(test.t1.col1, test.t2.pk)", - "├─IndexJoin(Build) 12.50 root inner join, inner:IndexLookUp, outer key:test.t3.pk, inner key:test.t1.col3, equal cond:eq(test.t3.pk, test.t1.col3)", + "IndexHashJoin 13.81 root inner join, inner:IndexLookUp, outer key:test.t1.col1, inner key:test.t2.pk, equal cond:eq(test.t1.col1, test.t2.pk)", + "├─IndexHashJoin(Build) 12.50 root inner join, inner:IndexLookUp, outer key:test.t3.pk, inner key:test.t1.col3, equal cond:eq(test.t3.pk, test.t1.col3)", "│ ├─IndexLookUp(Build) 10.00 root ", "│ │ ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t3, index:keycol(keycol, pad1, pad2) range:[\"c\",\"c\"], keep order:false, stats:pseudo", "│ │ └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t3 keep order:false, stats:pseudo", @@ -1723,7 +1723,7 @@ { "SQL": "select count(*) from t join (select t.id, t.value v1 from t join t t1 on t.id = t1.id order by t.value limit 1) v on v.id = t.id and v.v1 = t.value;", "Plan": [ - "HashAgg 1.00 root funcs:count(1)->Column#10", + "StreamAgg 1.00 root funcs:count(1)->Column#10", "└─HashJoin 1.00 root inner join, equal:[eq(test.t.id, test.t.id) eq(test.t.value, test.t.value)]", " ├─Selection(Build) 0.80 root not(isnull(test.t.id)), not(isnull(test.t.value))", " │ └─TopN 1.00 root test.t.value, offset:0, count:1", @@ -1754,21 +1754,21 @@ { "SQL": "select count(1) from s1", "Plan": [ - "HashAgg 1.00 root funcs:count(1)->Column#1", + "StreamAgg 1.00 root funcs:count(1)->Column#1", "└─TableDual 1.00 root rows:1" ] }, { "SQL": "select count(*) from s1", "Plan": [ - "HashAgg 1.00 root funcs:count(1)->Column#1", + "StreamAgg 1.00 root funcs:count(1)->Column#1", "└─TableDual 1.00 root rows:1" ] }, { "SQL": "select sum(1) from s1", "Plan": [ - "HashAgg 1.00 root funcs:sum(1)->Column#1", + "StreamAgg 1.00 root funcs:sum(1)->Column#1", "└─TableDual 1.00 root rows:1" ] }, @@ -1777,9 +1777,9 @@ "Plan": [ "HashAgg 2.00 root group by:Column#3, funcs:firstrow(Column#3)->Column#3", "└─Union 2.00 root ", - " ├─HashAgg 1.00 root funcs:count(1)->Column#1", + " ├─StreamAgg 1.00 root funcs:count(1)->Column#1", " │ └─TableDual 1.00 root rows:1", - " └─HashAgg 1.00 root funcs:count(1)->Column#2", + " └─StreamAgg 1.00 root funcs:count(1)->Column#2", " └─TableDual 1.00 root rows:1" ] } @@ -1969,7 +1969,8 @@ " └─TableRangeScan_8 3333.33 923531.15 cop[tikv] table:t range:(1,+inf], keep order:false, stats:pseudo" ], "Warnings": [ - "Note 1105 [t] remain after pruning paths for t given Prop{SortItems: [], TaskTp: rootTask}" + "Note 1105 [t] remain after pruning paths for t given Prop{SortItems: [], TaskTp: rootTask}", + "Note 1105 [t,f,f_g] remain after pruning paths for t given Prop{SortItems: [{test.t.f asc}], TaskTp: rootTask}" ] }, { @@ -2014,7 +2015,8 @@ " └─TableRowIDScan_12(Probe) 10.00 2770.59 cop[tikv] table:t keep order:false, stats:pseudo" ], "Warnings": [ - "Note 1105 [t,g] remain after pruning paths for t given Prop{SortItems: [], TaskTp: rootTask}" + "Note 1105 [t,g] remain after pruning paths for t given Prop{SortItems: [], TaskTp: rootTask}", + "Note 1105 [t,f_g,g] remain after pruning paths for t given Prop{SortItems: [{test.t.f asc}], TaskTp: rootTask}" ] }, { @@ -2026,6 +2028,7 @@ "└─TableRowIDScan_13(Probe) 10.00 2770.59 cop[tikv] table:t keep order:false, stats:pseudo" ], "Warnings": [ + "Note 1105 [t] remain after pruning paths for t given Prop{SortItems: [], TaskTp: rootTask}", "Note 1105 [t,c_d_e] remain after pruning paths for t given Prop{SortItems: [{test.t.c asc} {test.t.e asc}], TaskTp: rootTask}" ] } @@ -2211,7 +2214,7 @@ "Plan": [ "Projection 15.99 root 1->Column#5", "└─Selection 15.99 root or(eq(test.t1.c1, \"de\"), and(eq(test.t1.c2, \"10\"), eq(from_base64(to_base64(test.t1.c1)), \"ab\")))", - " └─IndexMerge 19.99 root ", + " └─IndexMerge 19.99 root type: union", " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, index:c1(c1) range:[\"de\",\"de\"], keep order:false, stats:pseudo", " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, index:c2(c2) range:[\"10\",\"10\"], keep order:false, stats:pseudo", " └─TableRowIDScan(Probe) 19.99 cop[tikv] table:t1 keep order:false, stats:pseudo" @@ -2225,7 +2228,7 @@ "Plan": [ "Projection 17.99 root 1->Column#5", "└─Selection 0.04 root or(eq(test.t1.c1, \"ab\"), and(eq(test.t1.c2, \"10\"), eq(char_length(left(test.t1.c1, 10)), 10)))", - " └─IndexMerge 19.99 root ", + " └─IndexMerge 19.99 root type: union", " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, index:c1(c1) range:[\"ab\",\"ab\"], keep order:false, stats:pseudo", " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, index:c2(c2) range:[\"10\",\"10\"], keep order:false, stats:pseudo", " └─TableRowIDScan(Probe) 19.99 cop[tikv] table:t1 keep order:false, stats:pseudo" @@ -2239,7 +2242,7 @@ "Plan": [ "Projection 15.99 root 1->Column#6", "└─Selection 15.99 root or(eq(test.tt1.c1, \"de\"), and(eq(test.tt1.c2, \"10\"), eq(from_base64(to_base64(test.tt1.c3)), \"10\")))", - " └─IndexMerge 19.99 root ", + " └─IndexMerge 19.99 root type: union", " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:tt1, index:idx_0(c1) range:[\"de\",\"de\"], keep order:false, stats:pseudo", " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:tt1, index:idx_1(c2, c3) range:[\"10\",\"10\"], keep order:false, stats:pseudo", " └─TableRowIDScan(Probe) 19.99 cop[tikv] table:tt1 keep order:false, stats:pseudo" @@ -2253,7 +2256,7 @@ "Plan": [ "Projection 2.40 root 1->Column#3", "└─Selection 2.40 root or(eq(test.tt2.c1, -3896405), and(in(test.tt2.pk, 1, 53330), istrue_with_null(cast(to_base64(left(cast(test.tt2.pk, var_string(20)), 5)), double BINARY))))", - " └─IndexMerge 3.00 root ", + " └─IndexMerge 3.00 root type: union", " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:tt2, index:c1(c1) range:[-3896405,-3896405], keep order:false, stats:pseudo", " ├─TableRangeScan(Build) 2.00 cop[tikv] table:tt2 range:[1,1], [53330,53330], keep order:false, stats:pseudo", " └─TableRowIDScan(Probe) 3.00 cop[tikv] table:tt2 keep order:false, stats:pseudo" @@ -2267,7 +2270,7 @@ "Plan": [ "Projection 5098.44 root 1->Column#5", "└─Selection 2825.66 root or(lt(test.tt3.c1, -10), and(lt(test.tt3.c2, 10), eq(reverse(cast(test.tt3.c3, var_string(20))), \"2\")))", - " └─IndexMerge 5542.21 root ", + " └─IndexMerge 5542.21 root type: union", " ├─IndexRangeScan(Build) 3323.33 cop[tikv] table:tt3, index:c1(c1) range:[-inf,-10), keep order:false, stats:pseudo", " ├─IndexRangeScan(Build) 3323.33 cop[tikv] table:tt3, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo", " └─TableRowIDScan(Probe) 5542.21 cop[tikv] table:tt3 keep order:false, stats:pseudo" @@ -2302,7 +2305,7 @@ " ├─TableReader(Build) 10000.00 root data:TableFullScan", " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", " └─StreamAgg(Probe) 10000.00 root funcs:min(test.t1.c1)->Column#8, funcs:sum(0)->Column#9, funcs:count(1)->Column#10", - " └─IndexMerge 63.35 root ", + " └─IndexMerge 63.35 root type: union", " ├─Selection(Build) 10000.00 cop[tikv] eq(10, test.t2.c3)", " │ └─TableRangeScan 10000.00 cop[tikv] table:t1 range:[10,10], keep order:false, stats:pseudo", " ├─Selection(Build) 80000.00 cop[tikv] eq(1, test.t2.c3)", @@ -2324,7 +2327,7 @@ " ├─TableReader(Build) 10000.00 root data:TableFullScan", " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", " └─StreamAgg(Probe) 10000.00 root funcs:min(test.t1.c1)->Column#8, funcs:sum(0)->Column#9, funcs:count(1)->Column#10", - " └─IndexMerge 63.35 root ", + " └─IndexMerge 63.35 root type: union", " ├─Selection(Build) 10000.00 cop[tikv] eq(10, test.t2.c3)", " │ └─TableRangeScan 10000.00 cop[tikv] table:t1 range:[10,10], keep order:false, stats:pseudo", " ├─Selection(Build) 80000.00 cop[tikv] eq(1, test.t2.c3)", @@ -2344,8 +2347,8 @@ " └─Apply 10000.00 root CARTESIAN inner join, other cond:or(and(lt(test.t2.c1, Column#8), if(ne(Column#9, 0), NULL, 1)), or(eq(Column#10, 0), if(isnull(test.t2.c1), NULL, 0)))", " ├─TableReader(Build) 10000.00 root data:TableFullScan", " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - " └─HashAgg(Probe) 10000.00 root funcs:min(test.t1.c1)->Column#8, funcs:sum(0)->Column#9, funcs:count(1)->Column#10", - " └─IndexMerge 30263.46 root ", + " └─StreamAgg(Probe) 10000.00 root funcs:min(test.t1.c1)->Column#8, funcs:sum(0)->Column#9, funcs:count(1)->Column#10", + " └─IndexMerge 30263.46 root type: union", " ├─Selection(Build) 33333.33 cop[tikv] eq(test.t1.c1, test.t2.c3)", " │ └─TableRangeScan 33333333.33 cop[tikv] table:t1 range:[10,+inf], keep order:false, stats:pseudo", " ├─Selection(Build) 80000.00 cop[tikv] eq(1, test.t2.c3)", @@ -2367,7 +2370,7 @@ " │ └─TableFullScan 10000.00 cop[tikv] table:tt1 keep order:true, stats:pseudo", " └─StreamAgg(Probe) 10000.00 root funcs:min(Column#14)->Column#9, funcs:sum(Column#15)->Column#10, funcs:count(1)->Column#11", " └─Projection 11.05 root test.tt2.c_decimal, cast(isnull(test.tt2.c_decimal), decimal(20,0) BINARY)->Column#15", - " └─IndexMerge 11.05 root ", + " └─IndexMerge 11.05 root type: union", " ├─Selection(Build) 10.00 cop[tikv] eq(test.tt1.c_int, test.tt2.c_int)", " │ └─IndexRangeScan 10000.00 cop[tikv] table:tt2, index:c_decimal(c_decimal) range:[9.060000,9.060000], keep order:false, stats:pseudo", " ├─Selection(Build) 33233.33 cop[tikv] eq(test.tt1.c_int, test.tt2.c_int)", @@ -2390,7 +2393,7 @@ " │ └─TableFullScan 10000.00 cop[tikv] table:tt1 keep order:true, stats:pseudo", " └─StreamAgg(Probe) 10000.00 root funcs:max(Column#14)->Column#9, funcs:sum(Column#15)->Column#10, funcs:count(1)->Column#11", " └─Projection 17.91 root test.tt2.c_decimal, cast(isnull(test.tt2.c_decimal), decimal(20,0) BINARY)->Column#15", - " └─IndexMerge 17.91 root ", + " └─IndexMerge 17.91 root type: union", " ├─Selection(Build) 10000.00 cop[tikv] lt(7, test.tt1.c_decimal)", " │ └─TableRangeScan 10000.00 cop[tikv] table:tt2 range:[7,7], keep order:false, stats:pseudo", " ├─Selection(Build) 33333.33 cop[tikv] eq(test.tt1.c_int, test.tt2.c_int)", @@ -2413,9 +2416,9 @@ { "SQL": "explain format = 'brief' select count(*) from t31240;", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#5)->Column#4", - "└─TableReader 1.00 root data:HashAgg", - " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#5", + "StreamAgg 1.00 root funcs:count(Column#6)->Column#4", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:count(test.t31240._tidb_rowid)->Column#6", " └─TableFullScan 10000.00 batchCop[tiflash] table:t31240 keep order:false, stats:pseudo" ] }, @@ -2426,9 +2429,9 @@ { "SQL": "explain format = 'brief' select count(*) from t31240;", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#5)->Column#4", - "└─TableReader 1.00 root data:HashAgg", - " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#5", + "StreamAgg 1.00 root funcs:count(Column#6)->Column#4", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:count(test.t31240._tidb_rowid)->Column#6", " └─TableFullScan 10000.00 batchCop[tiflash] table:t31240 keep order:false, stats:pseudo" ] } @@ -2485,19 +2488,19 @@ { "SQL": "explain format = 'verbose' select count(*) from t3", "Plan": [ - "HashAgg_12 1.00 77.75 root funcs:count(Column#6)->Column#4", - "└─IndexReader_13 1.00 47.49 root index:HashAgg_5", - " └─HashAgg_5 1.00 680.68 cop[tikv] funcs:count(1)->Column#6", - " └─IndexFullScan_11 3.00 610.50 cop[tikv] table:t3, index:c(b) keep order:false" + "StreamAgg_20 1.00 102.69 root funcs:count(Column#9)->Column#4", + "└─IndexReader_21 1.00 52.79 root index:StreamAgg_8", + " └─StreamAgg_8 1.00 760.20 cop[tikv] funcs:count(1)->Column#9", + " └─IndexFullScan_19 3.00 610.50 cop[tikv] table:t3, index:c(b) keep order:false" ] }, { "SQL": "explain format = 'verbose' select count(*) from t2", "Plan": [ - "HashAgg_14 1.00 82.51 root funcs:count(Column#5)->Column#4", - "└─TableReader_15 1.00 52.25 root data:HashAgg_6", - " └─HashAgg_6 1.00 752.10 cop[tikv] funcs:count(1)->Column#5", - " └─TableFullScan_12 3.00 681.92 cop[tikv] table:t2 keep order:false" + "StreamAgg_26 1.00 107.45 root funcs:count(Column#7)->Column#4", + "└─TableReader_27 1.00 57.55 root data:StreamAgg_10", + " └─StreamAgg_10 1.00 831.62 cop[tikv] funcs:count(1)->Column#7", + " └─TableFullScan_24 3.00 681.92 cop[tikv] table:t2 keep order:false" ] }, { @@ -2537,7 +2540,7 @@ { "SQL": "explain format = 'verbose' select count(*) from t2 group by a", "Plan": [ - "HashAgg_8 3.00 209.09 root group by:test.t2.a, funcs:count(1)->Column#4", + "HashAgg_8 3.00 1706.09 root group by:test.t2.a, funcs:count(1)->Column#4", "└─TableReader_17 3.00 58.13 root data:TableFullScan_16", " └─TableFullScan_16 3.00 681.92 cop[tikv] table:t2 keep order:false" ] @@ -2545,37 +2548,34 @@ { "SQL": "explain format = 'verbose' select count(*) from t3 where b = 0", "Plan": [ - "HashAgg_12 1.00 45.24 root funcs:count(Column#5)->Column#4", - "└─IndexReader_13 1.00 14.98 root index:HashAgg_6", - " └─HashAgg_6 1.00 193.06 cop[tikv] funcs:count(1)->Column#5", - " └─IndexRangeScan_11 0.00 162.80 cop[tikv] table:t3, index:c(b) range:[0,0], keep order:false" + "StreamAgg_10 1.00 64.98 root funcs:count(1)->Column#4", + "└─IndexReader_15 0.00 15.08 root index:IndexRangeScan_14", + " └─IndexRangeScan_14 0.00 162.80 cop[tikv] table:t3, index:c(b) range:[0,0], keep order:false" ] }, { "SQL": "explain format = 'verbose' select /*+ use_index(t3, c) */ count(a) from t3 where b = 0", "Plan": [ - "HashAgg_13 1.00 1981.96 root funcs:count(Column#6)->Column#4", - "└─IndexLookUp_14 1.00 1951.70 root ", - " ├─IndexRangeScan_11(Build) 0.00 203.50 cop[tikv] table:t3, index:c(b) range:[0,0], keep order:false", - " └─HashAgg_7(Probe) 1.00 257.57 cop[tikv] funcs:count(test.t3.a)->Column#6", - " └─TableRowIDScan_12 0.00 227.31 cop[tikv] table:t3 keep order:false" + "StreamAgg_10 1.00 2001.63 root funcs:count(test.t3.a)->Column#4", + "└─IndexLookUp_17 0.00 1951.73 root ", + " ├─IndexRangeScan_15(Build) 0.00 203.50 cop[tikv] table:t3, index:c(b) range:[0,0], keep order:false", + " └─TableRowIDScan_16(Probe) 0.00 227.31 cop[tikv] table:t3 keep order:false" ] }, { "SQL": "explain format = 'verbose' select count(*) from t2 where a = 0", "Plan": [ - "HashAgg_17 1.00 89.83 root funcs:count(Column#5)->Column#4", - "└─TableReader_18 1.00 59.57 root data:HashAgg_7", - " └─HashAgg_7 1.00 861.88 cop[tikv] funcs:count(1)->Column#5", - " └─Selection_14 0.00 831.62 cop[tikv] eq(test.t2.a, 0)", - " └─TableFullScan_13 3.00 681.92 cop[tikv] table:t2 keep order:false" + "StreamAgg_12 1.00 109.57 root funcs:count(1)->Column#4", + "└─TableReader_21 0.00 59.67 root data:Selection_20", + " └─Selection_20 0.00 831.62 cop[tikv] eq(test.t2.a, 0)", + " └─TableFullScan_19 3.00 681.92 cop[tikv] table:t2 keep order:false" ] }, { "SQL": "explain format = 'verbose' select count(*) from t3 t join t3 on t.a = t3.b", "Plan": [ - "HashAgg_9 1.00 552.41 root funcs:count(1)->Column#7", - "└─HashJoin_22 3.00 482.23 root inner join, equal:[eq(test.t3.a, test.t3.b)]", + "StreamAgg_10 1.00 2128.93 root funcs:count(1)->Column#7", + "└─HashJoin_40 3.00 1979.23 root inner join, equal:[eq(test.t3.a, test.t3.b)]", " ├─IndexReader_28(Build) 3.00 45.23 root index:IndexFullScan_27", " │ └─IndexFullScan_27 3.00 488.40 cop[tikv] table:t3, index:c(b) keep order:false", " └─TableReader_26(Probe) 3.00 68.11 root data:Selection_25", @@ -2586,27 +2586,26 @@ { "SQL": "explain format = 'verbose' select /*+ read_from_storage(tiflash[t1, t2]) */ count(*) from t1 join t2 on t1.a = t2.a", "Plan": [ - "HashAgg_34 1.00 61928.14 root funcs:count(Column#8)->Column#7", - "└─TableReader_36 1.00 61897.88 root data:ExchangeSender_35", - " └─ExchangeSender_35 1.00 928450.64 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg_13 1.00 928450.64 mpp[tiflash] funcs:count(1)->Column#8", - " └─HashJoin_33 3.00 928447.20 mpp[tiflash] inner join, equal:[eq(test.t1.a, test.t2.a)]", - " ├─ExchangeReceiver_22(Build) 3.00 464290.40 mpp[tiflash] ", - " │ └─ExchangeSender_21 3.00 464146.40 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection_20 3.00 464146.40 mpp[tiflash] not(isnull(test.t1.a))", - " │ └─TableFullScan_19 3.00 464139.20 mpp[tiflash] table:t1 keep order:false", - " └─Selection_24(Probe) 3.00 464146.40 mpp[tiflash] not(isnull(test.t2.a))", - " └─TableFullScan_23 3.00 464139.20 mpp[tiflash] table:t2 keep order:false" + "StreamAgg_15 1.00 62053.22 root funcs:count(1)->Column#7", + "└─TableReader_41 3.00 61903.52 root MppVersion: 1, data:ExchangeSender_40", + " └─ExchangeSender_40 3.00 928447.20 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin_37 3.00 928447.20 mpp[tiflash] inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─ExchangeReceiver_22(Build) 3.00 464290.40 mpp[tiflash] ", + " │ └─ExchangeSender_21 3.00 464146.40 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection_20 3.00 464146.40 mpp[tiflash] not(isnull(test.t1.a))", + " │ └─TableFullScan_19 3.00 464139.20 mpp[tiflash] table:t1 keep order:false", + " └─Selection_24(Probe) 3.00 464146.40 mpp[tiflash] not(isnull(test.t2.a))", + " └─TableFullScan_23 3.00 464139.20 mpp[tiflash] table:t2 keep order:false" ] }, { "SQL": "explain format = 'verbose' select /*+ read_from_storage(tiflash[t1, t2]) */ count(*) from t1 join t2 on t1.a = t2.a join t3 on t1.b = t3.b", "Plan": [ - "HashAgg_14 1.00 70137.12 root funcs:count(1)->Column#10", - "└─HashJoin_27 3.00 70066.94 root inner join, equal:[eq(test.t1.b, test.t3.b)]", + "StreamAgg_15 1.00 71713.64 root funcs:count(1)->Column#10", + "└─HashJoin_59 3.00 71563.94 root inner join, equal:[eq(test.t1.b, test.t3.b)]", " ├─IndexReader_47(Build) 3.00 45.23 root index:IndexFullScan_46", " │ └─IndexFullScan_46 3.00 488.40 cop[tikv] table:t3, index:c(b) keep order:false", - " └─TableReader_39(Probe) 3.00 69652.83 root data:ExchangeSender_38", + " └─TableReader_39(Probe) 3.00 69652.83 root MppVersion: 1, data:ExchangeSender_38", " └─ExchangeSender_38 3.00 1044634.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin_29 3.00 1044634.00 mpp[tiflash] inner join, equal:[eq(test.t1.a, test.t2.a)]", " ├─ExchangeReceiver_35(Build) 3.00 580476.40 mpp[tiflash] ", @@ -2620,20 +2619,19 @@ { "SQL": "explain format = 'verbose' select (2) in (select /*+ read_from_storage(tiflash[t1]) */ count(*) from t1) from (select t.b < (select /*+ read_from_storage(tiflash[t2]) */ t.b from t2 limit 1 ) from t3 t) t", "Plan": [ - "HashJoin_19 3.00 160743.93 root CARTESIAN left outer semi join", - "├─Selection_38(Build) 0.80 31024.18 root eq(2, Column#18)", - "│ └─HashAgg_52 1.00 30974.28 root funcs:count(Column#31)->Column#18", - "│ └─TableReader_54 1.00 30944.02 root data:ExchangeSender_53", - "│ └─ExchangeSender_53 1.00 464142.64 mpp[tiflash] ExchangeType: PassThrough", - "│ └─HashAgg_43 1.00 464142.64 mpp[tiflash] funcs:count(1)->Column#31", - "│ └─TableFullScan_51 3.00 464139.20 mpp[tiflash] table:t1 keep order:false", + "HashJoin_19 3.00 162261.76 root CARTESIAN left outer semi join", + "├─Selection_38(Build) 0.80 31045.01 root eq(2, Column#18)", + "│ └─StreamAgg_56 1.00 30995.11 root funcs:count(Column#32)->Column#18", + "│ └─TableReader_57 1.00 30945.21 root data:StreamAgg_44", + "│ └─StreamAgg_44 1.00 464146.40 batchCop[tiflash] funcs:count(test.t1._tidb_rowid)->Column#32", + "│ └─TableFullScan_55 3.00 464139.20 batchCop[tiflash] table:t1 keep order:false", "└─Projection_20(Probe) 3.00 129648.62 root 1->Column#28", " └─Apply_22 3.00 129648.32 root CARTESIAN left outer join", " ├─IndexReader_26(Build) 3.00 53.37 root index:IndexFullScan_25", " │ └─IndexFullScan_25 3.00 610.50 cop[tikv] table:t, index:c(b) keep order:false", " └─Projection_27(Probe) 3.00 43198.32 root 1->Column#26", " └─Limit_30 3.00 43198.22 root offset:0, count:1", - " └─TableReader_37 3.00 43198.22 root data:ExchangeSender_36", + " └─TableReader_37 3.00 43198.22 root MppVersion: 1, data:ExchangeSender_36", " └─ExchangeSender_36 3.00 647920.44 mpp[tiflash] ExchangeType: PassThrough", " └─Limit_35 3.00 647920.44 mpp[tiflash] offset:0, count:1", " └─TableFullScan_34 3.00 647920.44 mpp[tiflash] table:t2 keep order:false" @@ -2642,8 +2640,8 @@ { "SQL": "explain format = 'verbose' select /*+ merge_join(t1), read_from_storage(tiflash[t1, t2]) */ count(*) from t1 join t2 on t1.a = t2.a", "Plan": [ - "HashAgg_11 1.00 62478.44 root funcs:count(1)->Column#7", - "└─MergeJoin_16 3.00 62408.26 root inner join, left key:test.t1.a, right key:test.t2.a", + "StreamAgg_14 1.00 62557.96 root funcs:count(1)->Column#7", + "└─MergeJoin_26 3.00 62408.26 root inner join, left key:test.t1.a, right key:test.t2.a", " ├─Sort_24(Build) 3.00 31202.63 root test.t2.a", " │ └─TableReader_23 3.00 30955.77 root data:Selection_22", " │ └─Selection_22 3.00 464146.40 cop[tiflash] not(isnull(test.t2.a))", @@ -2903,7 +2901,7 @@ { "SQL": "explain format = 'brief' select max(a) from t", "Plan": [ - "HashAgg 1.00 root funcs:max(test.t.a)->Column#3", + "StreamAgg 1.00 root funcs:max(test.t.a)->Column#3", "└─TopN 1.00 root test.t.a:desc, offset:0, count:1", " └─TableReader 1.00 root data:TopN", " └─TopN 1.00 batchCop[tiflash] test.t.a:desc, offset:0, count:1", @@ -2913,7 +2911,7 @@ { "SQL": "explain format = 'brief' select min(a) from t", "Plan": [ - "HashAgg 1.00 root funcs:min(test.t.a)->Column#3", + "StreamAgg 1.00 root funcs:min(test.t.a)->Column#3", "└─Limit 1.00 root offset:0, count:1", " └─TableReader 1.00 root data:Limit", " └─Limit 1.00 cop[tiflash] offset:0, count:1", @@ -2928,7 +2926,7 @@ { "SQL": "explain format = 'brief' select max(a) from t", "Plan": [ - "HashAgg 1.00 root funcs:max(test.t.a)->Column#3", + "StreamAgg 1.00 root funcs:max(test.t.a)->Column#3", "└─TopN 1.00 root test.t.a:desc, offset:0, count:1", " └─TableReader 1.00 root data:TopN", " └─TopN 1.00 batchCop[tiflash] test.t.a:desc, offset:0, count:1", @@ -2938,7 +2936,7 @@ { "SQL": "explain format = 'brief' select min(a) from t", "Plan": [ - "HashAgg 1.00 root funcs:min(test.t.a)->Column#3", + "StreamAgg 1.00 root funcs:min(test.t.a)->Column#3", "└─TopN 1.00 root test.t.a, offset:0, count:1", " └─TableReader 1.00 root data:TopN", " └─TopN 1.00 batchCop[tiflash] test.t.a, offset:0, count:1", @@ -2953,322 +2951,301 @@ { "SQL": "explain format = 'brief' select count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", - " └─HashJoin 8.00 mpp[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", - " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", - " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", - " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", - " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 8.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 mpp[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t, d1_t, d2_t, d3_t where fact_t.d1_k = d1_t.d1_k and fact_t.d2_k = d2_t.d2_k and fact_t.d3_k = d3_t.d3_k", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#18)->Column#17", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#18", - " └─HashJoin 8.00 mpp[tiflash] inner join, equal:[eq(test.fact_t.d3_k, test.d3_t.d3_k)]", + "StreamAgg 1.00 root funcs:count(1)->Column#17", + "└─TableReader 8.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 mpp[tiflash] inner join, equal:[eq(test.fact_t.d3_k, test.d3_t.d3_k)]", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d3_t.d3_k))", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d3_t keep order:false", + " └─HashJoin(Probe) 8.00 mpp[tiflash] inner join, equal:[eq(test.fact_t.d2_k, test.d2_t.d2_k)]", " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d3_t.d3_k))", - " │ └─TableFullScan 2.00 mpp[tiflash] table:d3_t keep order:false", - " └─HashJoin(Probe) 8.00 mpp[tiflash] inner join, equal:[eq(test.fact_t.d2_k, test.d2_t.d2_k)]", + " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d2_t.d2_k))", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d2_t keep order:false", + " └─HashJoin(Probe) 8.00 mpp[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d2_t.d2_k))", - " │ └─TableFullScan 2.00 mpp[tiflash] table:d2_t keep order:false", - " └─HashJoin(Probe) 8.00 mpp[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", - " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", - " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", - " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.d1_k)), not(isnull(test.fact_t.d2_k)), not(isnull(test.fact_t.d3_k))", - " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" + " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.d1_k)), not(isnull(test.fact_t.d2_k)), not(isnull(test.fact_t.d3_k))", + " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", - " └─HashJoin 8.00 mpp[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", - " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", - " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", - " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", - " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 8.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 mpp[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", - " └─HashJoin 8.00 mpp[tiflash] left outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", - " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", - " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", - " └─TableFullScan(Probe) 8.00 mpp[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 8.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 mpp[tiflash] left outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", + " └─TableFullScan(Probe) 8.00 mpp[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", - " └─HashJoin 8.00 mpp[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", - " ├─ExchangeReceiver(Build) 8.00 mpp[tiflash] ", - " │ └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 8.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", - " │ └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false", - " └─TableFullScan(Probe) 2.00 mpp[tiflash] table:d1_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 8.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 mpp[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─ExchangeReceiver(Build) 8.00 mpp[tiflash] ", + " │ └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 8.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", + " │ └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false", + " └─TableFullScan(Probe) 2.00 mpp[tiflash] table:d1_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > d1_t.value", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", - " └─HashJoin 8.00 mpp[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)], other cond:gt(test.fact_t.col1, test.d1_t.value)", - " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", - " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", - " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", - " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 8.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 mpp[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)], other cond:gt(test.fact_t.col1, test.d1_t.value)", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > 10", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", - " └─HashJoin 8.00 mpp[tiflash] left outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], left cond:[gt(test.fact_t.col1, 10)]", - " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", - " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", - " └─TableFullScan(Probe) 8.00 mpp[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 8.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 mpp[tiflash] left outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], left cond:[gt(test.fact_t.col1, 10)]", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", + " └─TableFullScan(Probe) 8.00 mpp[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col2 > 10 and fact_t.col1 > d1_t.value", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", - " └─HashJoin 8.00 mpp[tiflash] left outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], left cond:[gt(test.fact_t.col2, 10)], other cond:gt(test.fact_t.col1, test.d1_t.value)", - " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", - " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", - " └─TableFullScan(Probe) 8.00 mpp[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 8.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 mpp[tiflash] left outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], left cond:[gt(test.fact_t.col2, 10)], other cond:gt(test.fact_t.col1, test.d1_t.value)", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", + " └─TableFullScan(Probe) 8.00 mpp[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k and d1_t.value > 10", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", - " └─HashJoin 8.00 mpp[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], right cond:gt(test.d1_t.value, 10)", - " ├─ExchangeReceiver(Build) 8.00 mpp[tiflash] ", - " │ └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 8.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", - " │ └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false", - " └─TableFullScan(Probe) 2.00 mpp[tiflash] table:d1_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 8.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 mpp[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], right cond:gt(test.d1_t.value, 10)", + " ├─ExchangeReceiver(Build) 8.00 mpp[tiflash] ", + " │ └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 8.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", + " │ └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false", + " └─TableFullScan(Probe) 2.00 mpp[tiflash] table:d1_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k and d1_t.value > 10 and fact_t.col1 > d1_t.value", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", - " └─HashJoin 8.00 mpp[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], right cond:gt(test.d1_t.value, 10), other cond:gt(test.fact_t.col1, test.d1_t.value)", - " ├─ExchangeReceiver(Build) 8.00 mpp[tiflash] ", - " │ └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 8.00 mpp[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", - " │ └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false", - " └─TableFullScan(Probe) 2.00 mpp[tiflash] table:d1_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 8.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 mpp[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], right cond:gt(test.d1_t.value, 10), other cond:gt(test.fact_t.col1, test.d1_t.value)", + " ├─ExchangeReceiver(Build) 8.00 mpp[tiflash] ", + " │ └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 8.00 mpp[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", + " │ └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false", + " └─TableFullScan(Probe) 2.00 mpp[tiflash] table:d1_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t where exists (select 1 from d1_t where d1_k = fact_t.d1_k)", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#13)->Column#12", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#13", - " └─HashJoin 6.40 mpp[tiflash] semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", - " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", - " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", - " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", - " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#12", + "└─TableReader 6.40 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 6.40 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 6.40 mpp[tiflash] semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t where exists (select 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#13)->Column#12", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#13", - " └─HashJoin 6.40 mpp[tiflash] semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], other cond:gt(test.d1_t.value, test.fact_t.col1)", - " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", - " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", - " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", - " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#12", + "└─TableReader 6.40 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 6.40 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 6.40 mpp[tiflash] semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], other cond:gt(test.d1_t.value, test.fact_t.col1)", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t where exists (select /*+ SEMI_JOIN_REWRITE() */ 1 from d1_t where d1_k = fact_t.d1_k)", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#17)->Column#12", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#17", - " └─HashJoin 8.00 mpp[tiflash] inner join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", - " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Projection 2.00 mpp[tiflash] test.d1_t.d1_k", - " │ └─HashAgg 2.00 mpp[tiflash] group by:test.d1_t.d1_k, funcs:firstrow(test.d1_t.d1_k)->test.d1_t.d1_k", - " │ └─ExchangeReceiver 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", - " │ └─HashAgg 2.00 mpp[tiflash] group by:test.d1_t.d1_k, ", - " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", - " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", - " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", - " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#12", + "└─TableReader 8.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 mpp[tiflash] inner join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Projection 2.00 mpp[tiflash] test.d1_t.d1_k", + " │ └─HashAgg 2.00 mpp[tiflash] group by:test.d1_t.d1_k, funcs:firstrow(test.d1_t.d1_k)->test.d1_t.d1_k", + " │ └─ExchangeReceiver 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", + " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t where exists (select /*+ SEMI_JOIN_REWRITE() */ 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#13)->Column#12", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#13", - " └─HashJoin 6.40 mpp[tiflash] semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], other cond:gt(test.d1_t.value, test.fact_t.col1)", - " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", - " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", - " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", - " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#12", + "└─TableReader 6.40 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 6.40 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 6.40 mpp[tiflash] semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], other cond:gt(test.d1_t.value, test.fact_t.col1)", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t where not exists (select 1 from d1_t where d1_k = fact_t.d1_k)", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#13)->Column#12", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#13", - " └─HashJoin 6.40 mpp[tiflash] anti semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", - " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", - " └─TableFullScan(Probe) 8.00 mpp[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#12", + "└─TableReader 6.40 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 6.40 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 6.40 mpp[tiflash] anti semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", + " └─TableFullScan(Probe) 8.00 mpp[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t where not exists (select 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#13)->Column#12", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#13", - " └─HashJoin 6.40 mpp[tiflash] anti semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], other cond:gt(test.d1_t.value, test.fact_t.col1)", - " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", - " └─TableFullScan(Probe) 8.00 mpp[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#12", + "└─TableReader 6.40 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 6.40 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 6.40 mpp[tiflash] anti semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], other cond:gt(test.d1_t.value, test.fact_t.col1)", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", + " └─TableFullScan(Probe) 8.00 mpp[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t join d1_t on fact_t.d1_k > d1_t.d1_k", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", - " └─HashJoin 16.00 mpp[tiflash] CARTESIAN inner join, other cond:gt(test.fact_t.d1_k, test.d1_t.d1_k)", - " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", - " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", - " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", - " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 16.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 16.00 mpp[tiflash] CARTESIAN inner join, other cond:gt(test.fact_t.d1_k, test.d1_t.d1_k)", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t left join d1_t on fact_t.d1_k > d1_t.d1_k", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", - " └─HashJoin 16.00 mpp[tiflash] CARTESIAN left outer join, other cond:gt(test.fact_t.d1_k, test.d1_t.d1_k)", - " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", - " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", - " └─TableFullScan(Probe) 8.00 mpp[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 16.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 16.00 mpp[tiflash] CARTESIAN left outer join, other cond:gt(test.fact_t.d1_k, test.d1_t.d1_k)", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", + " └─TableFullScan(Probe) 8.00 mpp[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k > d1_t.d1_k", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", - " └─HashJoin 16.00 mpp[tiflash] CARTESIAN right outer join, other cond:gt(test.fact_t.d1_k, test.d1_t.d1_k)", - " ├─ExchangeReceiver(Build) 8.00 mpp[tiflash] ", - " │ └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 8.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", - " │ └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false", - " └─TableFullScan(Probe) 2.00 mpp[tiflash] table:d1_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 16.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 16.00 mpp[tiflash] CARTESIAN right outer join, other cond:gt(test.fact_t.d1_k, test.d1_t.d1_k)", + " ├─ExchangeReceiver(Build) 8.00 mpp[tiflash] ", + " │ └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 8.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", + " │ └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false", + " └─TableFullScan(Probe) 2.00 mpp[tiflash] table:d1_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t where d1_k not in (select d1_k from d1_t)", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", - " └─HashJoin 6.40 mpp[tiflash] CARTESIAN anti semi join, other cond:eq(test.fact_t.d1_k, test.d1_t.d1_k)", - " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", - " └─TableFullScan(Probe) 8.00 mpp[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 6.40 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 6.40 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 6.40 mpp[tiflash] CARTESIAN anti semi join, other cond:eq(test.fact_t.d1_k, test.d1_t.d1_k)", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", + " └─TableFullScan(Probe) 8.00 mpp[tiflash] table:fact_t keep order:false" ] } ] @@ -3279,7 +3256,7 @@ { "SQL": "explain format = 'brief' select * from test.t t1 where t1.a>1 or t1.a in (select a from test.t); -- left semi", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] test.t.a, test.t.b", " └─Selection 8000.00 mpp[tiflash] or(gt(test.t.a, 1), Column#7)", @@ -3294,7 +3271,7 @@ { "SQL": "explain format = 'brief' select * from test.t t1 where t1.a>1 or t1.a in (select a from test.t where b1 or t1.a not in (select a from test.t); -- left anti", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] test.t.a, test.t.b", " └─Selection 8000.00 mpp[tiflash] or(gt(test.t.a, 1), Column#7)", @@ -3324,7 +3301,7 @@ { "SQL": "explain format = 'brief' select * from test.t t1 where t1.a>1 or t1.a not in (select a from test.t where b1 or t1.b in (select a from test.t); -- cartesian left semi", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] test.t.a, test.t.b", " └─Selection 8000.00 mpp[tiflash] or(gt(test.t.a, 1), Column#7)", @@ -3354,7 +3331,7 @@ { "SQL": "explain format = 'brief' select * from test.t t1 where t1.a>1 or t1.a in (select b from test.t where b1 or t1.b not in (select a from test.t); -- cartesian left anti", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] test.t.a, test.t.b", " └─Selection 8000.00 mpp[tiflash] or(gt(test.t.a, 1), Column#7)", @@ -3384,7 +3361,7 @@ { "SQL": "explain format = 'brief' select * from test.t t1 where t1.a>1 or t1.b not in (select a from test.t where bColumn#7", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#8", - " └─HashJoin 2.00 mpp[tiflash] left outer join, equal:[eq(test.a.id, test.b.id)]", - " ├─ExchangeReceiver(Build) 3.00 mpp[tiflash] ", - " │ └─ExchangeSender 3.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 3.00 mpp[tiflash] not(isnull(test.b.id))", - " │ └─TableFullScan 3.00 mpp[tiflash] table:b keep order:false", - " └─TableFullScan(Probe) 2.00 mpp[tiflash] table:a keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#7", + "└─TableReader 2.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 2.00 mpp[tiflash] left outer join, equal:[eq(test.a.id, test.b.id)]", + " ├─ExchangeReceiver(Build) 3.00 mpp[tiflash] ", + " │ └─ExchangeSender 3.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 3.00 mpp[tiflash] not(isnull(test.b.id))", + " │ └─TableFullScan 3.00 mpp[tiflash] table:b keep order:false", + " └─TableFullScan(Probe) 2.00 mpp[tiflash] table:a keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from b right join a on a.id = b.id", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#8)->Column#7", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#8", - " └─HashJoin 2.00 mpp[tiflash] right outer join, equal:[eq(test.b.id, test.a.id)]", - " ├─ExchangeReceiver(Build) 3.00 mpp[tiflash] ", - " │ └─ExchangeSender 3.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─Selection 3.00 mpp[tiflash] not(isnull(test.b.id))", - " │ └─TableFullScan 3.00 mpp[tiflash] table:b keep order:false", - " └─TableFullScan(Probe) 2.00 mpp[tiflash] table:a keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#7", + "└─TableReader 2.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 2.00 mpp[tiflash] right outer join, equal:[eq(test.b.id, test.a.id)]", + " ├─ExchangeReceiver(Build) 3.00 mpp[tiflash] ", + " │ └─ExchangeSender 3.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 3.00 mpp[tiflash] not(isnull(test.b.id))", + " │ └─TableFullScan 3.00 mpp[tiflash] table:b keep order:false", + " └─TableFullScan(Probe) 2.00 mpp[tiflash] table:a keep order:false" ] } ] @@ -3552,35 +3527,33 @@ { "SQL": "explain format = 'brief' select count(*) from a left join b on a.id = b.id", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#8)->Column#7", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#8", - " └─HashJoin 2.00 mpp[tiflash] left outer join, equal:[eq(test.a.id, test.b.id)]", - " ├─ExchangeReceiver(Build) 3.00 mpp[tiflash] ", - " │ └─ExchangeSender 3.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.b.id, collate: binary]", - " │ └─Selection 3.00 mpp[tiflash] not(isnull(test.b.id))", - " │ └─TableFullScan 3.00 mpp[tiflash] table:b keep order:false", - " └─ExchangeReceiver(Probe) 2.00 mpp[tiflash] ", - " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.a.id, collate: binary]", - " └─TableFullScan 2.00 mpp[tiflash] table:a keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#7", + "└─TableReader 2.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 2.00 mpp[tiflash] left outer join, equal:[eq(test.a.id, test.b.id)]", + " ├─ExchangeReceiver(Build) 3.00 mpp[tiflash] ", + " │ └─ExchangeSender 3.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.b.id, collate: binary]", + " │ └─Selection 3.00 mpp[tiflash] not(isnull(test.b.id))", + " │ └─TableFullScan 3.00 mpp[tiflash] table:b keep order:false", + " └─ExchangeReceiver(Probe) 2.00 mpp[tiflash] ", + " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.a.id, collate: binary]", + " └─TableFullScan 2.00 mpp[tiflash] table:a keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from b right join a on a.id = b.id", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#8)->Column#7", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#8", - " └─HashJoin 2.00 mpp[tiflash] right outer join, equal:[eq(test.b.id, test.a.id)]", - " ├─ExchangeReceiver(Build) 3.00 mpp[tiflash] ", - " │ └─ExchangeSender 3.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.b.id, collate: binary]", - " │ └─Selection 3.00 mpp[tiflash] not(isnull(test.b.id))", - " │ └─TableFullScan 3.00 mpp[tiflash] table:b keep order:false", - " └─ExchangeReceiver(Probe) 2.00 mpp[tiflash] ", - " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.a.id, collate: binary]", - " └─TableFullScan 2.00 mpp[tiflash] table:a keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#7", + "└─TableReader 2.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 2.00 mpp[tiflash] right outer join, equal:[eq(test.b.id, test.a.id)]", + " ├─ExchangeReceiver(Build) 3.00 mpp[tiflash] ", + " │ └─ExchangeSender 3.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.b.id, collate: binary]", + " │ └─Selection 3.00 mpp[tiflash] not(isnull(test.b.id))", + " │ └─TableFullScan 3.00 mpp[tiflash] table:b keep order:false", + " └─ExchangeReceiver(Probe) 2.00 mpp[tiflash] ", + " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.a.id, collate: binary]", + " └─TableFullScan 2.00 mpp[tiflash] table:a keep order:false" ] } ] @@ -3591,35 +3564,33 @@ { "SQL": "explain format = 'brief' select count(*) from a left join b on a.id = b.id", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#8)->Column#7", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#8", - " └─HashJoin 2.00 mpp[tiflash] left outer join, equal:[eq(test.a.id, test.b.id)]", - " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.a.id, collate: binary]", - " │ └─TableFullScan 2.00 mpp[tiflash] table:a keep order:false", - " └─ExchangeReceiver(Probe) 3.00 mpp[tiflash] ", - " └─ExchangeSender 3.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.b.id, collate: binary]", - " └─Selection 3.00 mpp[tiflash] not(isnull(test.b.id))", - " └─TableFullScan 3.00 mpp[tiflash] table:b keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#7", + "└─TableReader 2.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 2.00 mpp[tiflash] left outer join, equal:[eq(test.a.id, test.b.id)]", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.a.id, collate: binary]", + " │ └─TableFullScan 2.00 mpp[tiflash] table:a keep order:false", + " └─ExchangeReceiver(Probe) 3.00 mpp[tiflash] ", + " └─ExchangeSender 3.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.b.id, collate: binary]", + " └─Selection 3.00 mpp[tiflash] not(isnull(test.b.id))", + " └─TableFullScan 3.00 mpp[tiflash] table:b keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from b right join a on a.id = b.id", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#8)->Column#7", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#8", - " └─HashJoin 2.00 mpp[tiflash] right outer join, equal:[eq(test.b.id, test.a.id)]", - " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.a.id, collate: binary]", - " │ └─TableFullScan 2.00 mpp[tiflash] table:a keep order:false", - " └─ExchangeReceiver(Probe) 3.00 mpp[tiflash] ", - " └─ExchangeSender 3.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.b.id, collate: binary]", - " └─Selection 3.00 mpp[tiflash] not(isnull(test.b.id))", - " └─TableFullScan 3.00 mpp[tiflash] table:b keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#7", + "└─TableReader 2.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 2.00 mpp[tiflash] right outer join, equal:[eq(test.b.id, test.a.id)]", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.a.id, collate: binary]", + " │ └─TableFullScan 2.00 mpp[tiflash] table:a keep order:false", + " └─ExchangeReceiver(Probe) 3.00 mpp[tiflash] ", + " └─ExchangeSender 3.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.b.id, collate: binary]", + " └─Selection 3.00 mpp[tiflash] not(isnull(test.b.id))", + " └─TableFullScan 3.00 mpp[tiflash] table:b keep order:false" ] } ] @@ -3631,16 +3602,16 @@ "SQL": "explain format = 'brief' select count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", "Plan": [ "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", " └─HashJoin 32.00 mpp[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", - " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", + " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", " │ └─Selection 4.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", " │ └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false", " └─ExchangeReceiver(Probe) 16.00 mpp[tiflash] ", - " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", + " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", " └─Selection 16.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", " └─TableFullScan 16.00 mpp[tiflash] table:fact_t keep order:false" ] @@ -3649,30 +3620,30 @@ "SQL": "explain format = 'brief' select count(*) from fact_t, d1_t, d2_t, d3_t where fact_t.d1_k = d1_t.d1_k and fact_t.d2_k = d2_t.d2_k and fact_t.d3_k = d3_t.d3_k", "Plan": [ "HashAgg 1.00 root funcs:count(Column#18)->Column#17", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#18", " └─HashJoin 128.00 mpp[tiflash] inner join, equal:[eq(test.fact_t.d3_k, test.d3_t.d3_k)]", " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", - " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d3_t.d3_k, collate: binary]", + " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d3_t.d3_k, collate: binary]", " │ └─Selection 4.00 mpp[tiflash] not(isnull(test.d3_t.d3_k))", " │ └─TableFullScan 4.00 mpp[tiflash] table:d3_t keep order:false", " └─ExchangeReceiver(Probe) 64.00 mpp[tiflash] ", - " └─ExchangeSender 64.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.fact_t.d3_k, collate: binary]", + " └─ExchangeSender 64.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.fact_t.d3_k, collate: binary]", " └─HashJoin 64.00 mpp[tiflash] inner join, equal:[eq(test.fact_t.d2_k, test.d2_t.d2_k)]", " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", - " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d2_t.d2_k, collate: binary]", + " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d2_t.d2_k, collate: binary]", " │ └─Selection 4.00 mpp[tiflash] not(isnull(test.d2_t.d2_k))", " │ └─TableFullScan 4.00 mpp[tiflash] table:d2_t keep order:false", " └─ExchangeReceiver(Probe) 32.00 mpp[tiflash] ", - " └─ExchangeSender 32.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.fact_t.d2_k, collate: binary]", + " └─ExchangeSender 32.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.fact_t.d2_k, collate: binary]", " └─HashJoin 32.00 mpp[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", - " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", + " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", " │ └─Selection 4.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", " │ └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false", " └─ExchangeReceiver(Probe) 16.00 mpp[tiflash] ", - " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", + " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", " └─Selection 16.00 mpp[tiflash] not(isnull(test.fact_t.d1_k)), not(isnull(test.fact_t.d2_k)), not(isnull(test.fact_t.d3_k))", " └─TableFullScan 16.00 mpp[tiflash] table:fact_t keep order:false" ] @@ -3681,16 +3652,16 @@ "SQL": "explain format = 'brief' select count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", "Plan": [ "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", " └─HashJoin 32.00 mpp[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", - " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", + " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", " │ └─Selection 4.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", " │ └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false", " └─ExchangeReceiver(Probe) 16.00 mpp[tiflash] ", - " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", + " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", " └─Selection 16.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", " └─TableFullScan 16.00 mpp[tiflash] table:fact_t keep order:false" ] @@ -3699,26 +3670,26 @@ "SQL": "explain format = 'brief' select count(*) from fact_t, d1_t, d2_t, d3_t where fact_t.d1_k = d1_t.d1_k and fact_t.d1_k = d2_t.value and fact_t.d1_k = d3_t.value", "Plan": [ "HashAgg 1.00 root funcs:count(Column#18)->Column#17", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#18", " └─HashJoin 128.00 mpp[tiflash] inner join, equal:[eq(test.fact_t.d1_k, test.d3_t.value)]", " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", - " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d3_t.value, collate: binary]", + " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d3_t.value, collate: binary]", " │ └─Selection 4.00 mpp[tiflash] not(isnull(test.d3_t.value))", " │ └─TableFullScan 4.00 mpp[tiflash] table:d3_t keep order:false", " └─HashJoin(Probe) 64.00 mpp[tiflash] inner join, equal:[eq(test.fact_t.d1_k, test.d2_t.value)]", " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", - " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d2_t.value, collate: binary]", + " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d2_t.value, collate: binary]", " │ └─Selection 4.00 mpp[tiflash] not(isnull(test.d2_t.value))", " │ └─TableFullScan 4.00 mpp[tiflash] table:d2_t keep order:false", " └─HashJoin(Probe) 32.00 mpp[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", - " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", + " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", " │ └─Selection 4.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", " │ └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false", " └─ExchangeReceiver(Probe) 16.00 mpp[tiflash] ", - " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", + " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", " └─Selection 16.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", " └─TableFullScan 16.00 mpp[tiflash] table:fact_t keep order:false" ] @@ -3727,16 +3698,16 @@ "SQL": "explain format = 'brief' select count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k", "Plan": [ "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", " └─HashJoin 32.00 mpp[tiflash] left outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", - " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", + " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", " │ └─Selection 4.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", " │ └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false", " └─ExchangeReceiver(Probe) 16.00 mpp[tiflash] ", - " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", + " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", " └─TableFullScan 16.00 mpp[tiflash] table:fact_t keep order:false" ] }, @@ -3744,15 +3715,15 @@ "SQL": "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k", "Plan": [ "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", " └─HashJoin 32.00 mpp[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", - " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", + " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", " │ └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false", " └─ExchangeReceiver(Probe) 16.00 mpp[tiflash] ", - " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", + " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", " └─Selection 16.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", " └─TableFullScan 16.00 mpp[tiflash] table:fact_t keep order:false" ] @@ -3761,16 +3732,16 @@ "SQL": "explain format = 'brief' select count(*) from fact_t join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > d1_t.value", "Plan": [ "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", " └─HashJoin 32.00 mpp[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)], other cond:gt(test.fact_t.col1, test.d1_t.value)", " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", - " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", + " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", " │ └─Selection 4.00 mpp[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", " │ └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false", " └─ExchangeReceiver(Probe) 16.00 mpp[tiflash] ", - " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", + " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", " └─Selection 16.00 mpp[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", " └─TableFullScan 16.00 mpp[tiflash] table:fact_t keep order:false" ] @@ -3779,16 +3750,16 @@ "SQL": "explain format = 'brief' select count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > 10", "Plan": [ "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", " └─HashJoin 32.00 mpp[tiflash] left outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], left cond:[gt(test.fact_t.col1, 10)]", " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", - " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", + " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", " │ └─Selection 4.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", " │ └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false", " └─ExchangeReceiver(Probe) 16.00 mpp[tiflash] ", - " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", + " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", " └─TableFullScan 16.00 mpp[tiflash] table:fact_t keep order:false" ] }, @@ -3796,23 +3767,23 @@ "SQL": "explain format = 'brief' select count(*) from (select case when t1.col1 is null then t2.col1 + 5 else 10 end as col1, t2.d1_k as d1_k from fact_t t1 right join fact_t t2 on t1.d1_k = t2.d1_k) fact_t join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > 5", "Plan": [ "HashAgg 1.00 root funcs:count(Column#22)->Column#19", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#22", " └─HashJoin 204.80 mpp[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", - " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", + " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", " │ └─Selection 4.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", " │ └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false", " └─Projection(Probe) 102.40 mpp[tiflash] test.fact_t.d1_k", " └─Selection 102.40 mpp[tiflash] gt(case(isnull(test.fact_t.col1), plus(test.fact_t.col1, 5), 10), 5)", " └─HashJoin 128.00 mpp[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.fact_t.d1_k)]", " ├─ExchangeReceiver(Build) 16.00 mpp[tiflash] ", - " │ └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", + " │ └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", " │ └─Selection 16.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", " │ └─TableFullScan 16.00 mpp[tiflash] table:t1 keep order:false", " └─ExchangeReceiver(Probe) 16.00 mpp[tiflash] ", - " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", + " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", " └─Selection 16.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", " └─TableFullScan 16.00 mpp[tiflash] table:t2 keep order:false" ] @@ -3821,16 +3792,16 @@ "SQL": "explain format = 'brief' select count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col2 > 10 and fact_t.col1 > d1_t.value", "Plan": [ "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", " └─HashJoin 32.00 mpp[tiflash] left outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], left cond:[gt(test.fact_t.col2, 10)], other cond:gt(test.fact_t.col1, test.d1_t.value)", " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", - " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", + " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", " │ └─Selection 4.00 mpp[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", " │ └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false", " └─ExchangeReceiver(Probe) 16.00 mpp[tiflash] ", - " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", + " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", " └─TableFullScan 16.00 mpp[tiflash] table:fact_t keep order:false" ] }, @@ -3838,15 +3809,15 @@ "SQL": "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k and d1_t.value > 10", "Plan": [ "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", " └─HashJoin 32.00 mpp[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], right cond:gt(test.d1_t.value, 10)", " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", - " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", + " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", " │ └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false", " └─ExchangeReceiver(Probe) 16.00 mpp[tiflash] ", - " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", + " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", " └─Selection 16.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", " └─TableFullScan 16.00 mpp[tiflash] table:fact_t keep order:false" ] @@ -3855,85 +3826,81 @@ "SQL": "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k and d1_t.value > 10 and fact_t.col1 > d1_t.value", "Plan": [ "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", " └─HashJoin 32.00 mpp[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], right cond:gt(test.d1_t.value, 10), other cond:gt(test.fact_t.col1, test.d1_t.value)", " ├─ExchangeReceiver(Build) 16.00 mpp[tiflash] ", - " │ └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", + " │ └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", " │ └─Selection 16.00 mpp[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", " │ └─TableFullScan 16.00 mpp[tiflash] table:fact_t keep order:false", " └─ExchangeReceiver(Probe) 4.00 mpp[tiflash] ", - " └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", + " └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", " └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t where exists (select 1 from d1_t where d1_k = fact_t.d1_k)", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#13)->Column#12", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#13", - " └─HashJoin 12.80 mpp[tiflash] semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", - " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", - " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", - " │ └─Selection 4.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", - " │ └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false", - " └─ExchangeReceiver(Probe) 16.00 mpp[tiflash] ", - " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", - " └─Selection 16.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", - " └─TableFullScan 16.00 mpp[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#12", + "└─TableReader 12.80 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 12.80 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 12.80 mpp[tiflash] semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", + " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", + " │ └─Selection 4.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false", + " └─ExchangeReceiver(Probe) 16.00 mpp[tiflash] ", + " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", + " └─Selection 16.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 16.00 mpp[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t where exists (select 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#13)->Column#12", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#13", - " └─HashJoin 12.80 mpp[tiflash] semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], other cond:gt(test.d1_t.value, test.fact_t.col1)", - " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", - " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", - " │ └─Selection 4.00 mpp[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", - " │ └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false", - " └─ExchangeReceiver(Probe) 16.00 mpp[tiflash] ", - " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", - " └─Selection 16.00 mpp[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", - " └─TableFullScan 16.00 mpp[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#12", + "└─TableReader 12.80 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 12.80 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 12.80 mpp[tiflash] semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], other cond:gt(test.d1_t.value, test.fact_t.col1)", + " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", + " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", + " │ └─Selection 4.00 mpp[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", + " │ └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false", + " └─ExchangeReceiver(Probe) 16.00 mpp[tiflash] ", + " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", + " └─Selection 16.00 mpp[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 16.00 mpp[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t where not exists (select 1 from d1_t where d1_k = fact_t.d1_k)", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#13)->Column#12", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#13", - " └─HashJoin 12.80 mpp[tiflash] anti semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", - " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", - " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", - " │ └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false", - " └─ExchangeReceiver(Probe) 16.00 mpp[tiflash] ", - " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", - " └─TableFullScan 16.00 mpp[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#12", + "└─TableReader 12.80 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 12.80 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 12.80 mpp[tiflash] anti semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", + " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", + " │ └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false", + " └─ExchangeReceiver(Probe) 16.00 mpp[tiflash] ", + " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", + " └─TableFullScan 16.00 mpp[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t where not exists (select 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#13)->Column#12", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#13", - " └─HashJoin 12.80 mpp[tiflash] anti semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], other cond:gt(test.d1_t.value, test.fact_t.col1)", - " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", - " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", - " │ └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false", - " └─ExchangeReceiver(Probe) 16.00 mpp[tiflash] ", - " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", - " └─TableFullScan 16.00 mpp[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#12", + "└─TableReader 12.80 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 12.80 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 12.80 mpp[tiflash] anti semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], other cond:gt(test.d1_t.value, test.fact_t.col1)", + " ├─ExchangeReceiver(Build) 4.00 mpp[tiflash] ", + " │ └─ExchangeSender 4.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", + " │ └─TableFullScan 4.00 mpp[tiflash] table:d1_t keep order:false", + " └─ExchangeReceiver(Probe) 16.00 mpp[tiflash] ", + " └─ExchangeSender 16.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.fact_t.d1_k, collate: binary]", + " └─TableFullScan 16.00 mpp[tiflash] table:fact_t keep order:false" ] } ] @@ -3944,22 +3911,22 @@ { "SQL": "explain format = 'brief' select v from t3 as a left join (select t1.v1, t1.v2, t1.v1 + t1.v2 as v from t1 left join t2 on t1.v1 = t2.v1 and t1.v2 = t2.v2) b on a.v1 = b.v1 and a.v2 = b.v2", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#13", " └─HashJoin 1.00 mpp[tiflash] left outer join, equal:[eq(test.t3.v1, test.t1.v1) eq(test.t3.v2, test.t1.v2)]", " ├─ExchangeReceiver(Build) 1.00 mpp[tiflash] ", - " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#23, collate: binary], [name: Column#24, collate: binary]", + " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#23, collate: binary], [name: Column#24, collate: binary]", " │ └─Projection 1.00 mpp[tiflash] test.t3.v1, test.t3.v2, cast(test.t3.v1, decimal(20,2))->Column#23, cast(test.t3.v2, decimal(20,2))->Column#24", " │ └─TableFullScan 1.00 mpp[tiflash] table:a keep order:false", " └─Projection(Probe) 2.00 mpp[tiflash] test.t1.v1, test.t1.v2, plus(test.t1.v1, test.t1.v2)->Column#13", " └─HashJoin 2.00 mpp[tiflash] left outer join, equal:[eq(test.t1.v1, test.t2.v1) eq(test.t1.v2, test.t2.v2)]", " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.v1, collate: binary], [name: test.t1.v2, collate: binary]", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.v1, collate: binary], [name: test.t1.v2, collate: binary]", " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.t1.v1)), not(isnull(test.t1.v2))", " │ └─TableFullScan 2.00 mpp[tiflash] table:t1 keep order:false", " └─ExchangeReceiver(Probe) 8.00 mpp[tiflash] ", - " └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#15, collate: binary], [name: Column#16, collate: binary]", + " └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#15, collate: binary], [name: Column#16, collate: binary]", " └─Projection 8.00 mpp[tiflash] test.t2.v1, test.t2.v2, cast(test.t2.v1, decimal(20,2))->Column#15, cast(test.t2.v2, decimal(20,2))->Column#16", " └─Selection 8.00 mpp[tiflash] not(isnull(test.t2.v1)), not(isnull(test.t2.v2))", " └─TableFullScan 8.00 mpp[tiflash] table:t2 keep order:false" @@ -3968,19 +3935,19 @@ { "SQL": "explain format = 'brief' select count(*), t2.v1, t2.v2 from t1 left join t2 on t1.v1 = t2.v1 and t1.v2 = t2.v2 group by t2.v1, t2.v2", "Plan": [ - "TableReader 2.00 root data:ExchangeSender", + "TableReader 2.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 2.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 2.00 mpp[tiflash] Column#9, test.t2.v1, test.t2.v2", " └─HashAgg 2.00 mpp[tiflash] group by:test.t2.v1, test.t2.v2, funcs:sum(Column#22)->Column#9, funcs:firstrow(test.t2.v1)->test.t2.v1, funcs:firstrow(test.t2.v2)->test.t2.v2", " └─ExchangeReceiver 2.00 mpp[tiflash] ", - " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t2.v1, collate: binary], [name: test.t2.v2, collate: binary]", + " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t2.v1, collate: binary], [name: test.t2.v2, collate: binary]", " └─HashAgg 2.00 mpp[tiflash] group by:test.t2.v1, test.t2.v2, funcs:count(1)->Column#22", " └─HashJoin 2.00 mpp[tiflash] left outer join, equal:[eq(test.t1.v1, test.t2.v1) eq(test.t1.v2, test.t2.v2)]", " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.v1, collate: binary], [name: test.t1.v2, collate: binary]", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.v1, collate: binary], [name: test.t1.v2, collate: binary]", " │ └─TableFullScan 2.00 mpp[tiflash] table:t1 keep order:false", " └─ExchangeReceiver(Probe) 8.00 mpp[tiflash] ", - " └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#14, collate: binary], [name: Column#15, collate: binary]", + " └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#14, collate: binary], [name: Column#15, collate: binary]", " └─Projection 8.00 mpp[tiflash] test.t2.v1, test.t2.v2, cast(test.t2.v1, decimal(20,2))->Column#14, cast(test.t2.v2, decimal(20,2))->Column#15", " └─Selection 8.00 mpp[tiflash] not(isnull(test.t2.v1)), not(isnull(test.t2.v2))", " └─TableFullScan 8.00 mpp[tiflash] table:t2 keep order:false" @@ -3989,21 +3956,20 @@ { "SQL": "explain format = 'brief' select count(*), t2.v1, t2.v2 from t3 left join t2 on t3.v1 = t2.v1 and t3.v2 = t2.v2 group by t2.v1, t2.v2", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#9, test.t2.v1, test.t2.v2", - " └─HashAgg 1.00 mpp[tiflash] group by:test.t2.v1, test.t2.v2, funcs:sum(Column#16)->Column#9, funcs:firstrow(test.t2.v1)->test.t2.v1, funcs:firstrow(test.t2.v2)->test.t2.v2", + " └─HashAgg 1.00 mpp[tiflash] group by:test.t2.v1, test.t2.v2, funcs:count(1)->Column#9, funcs:firstrow(test.t2.v1)->test.t2.v1, funcs:firstrow(test.t2.v2)->test.t2.v2", " └─ExchangeReceiver 1.00 mpp[tiflash] ", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t2.v1, collate: binary], [name: test.t2.v2, collate: binary]", - " └─HashAgg 1.00 mpp[tiflash] group by:test.t2.v1, test.t2.v2, funcs:count(1)->Column#16", - " └─HashJoin 1.00 mpp[tiflash] left outer join, equal:[eq(test.t3.v1, test.t2.v1) eq(test.t3.v2, test.t2.v2)]", - " ├─ExchangeReceiver(Build) 1.00 mpp[tiflash] ", - " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t3.v1, collate: binary], [name: test.t3.v2, collate: binary]", - " │ └─TableFullScan 1.00 mpp[tiflash] table:t3 keep order:false", - " └─ExchangeReceiver(Probe) 8.00 mpp[tiflash] ", - " └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t2.v1, collate: binary], [name: test.t2.v2, collate: binary]", - " └─Selection 8.00 mpp[tiflash] not(isnull(test.t2.v1)), not(isnull(test.t2.v2))", - " └─TableFullScan 8.00 mpp[tiflash] table:t2 keep order:false" + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t2.v1, collate: binary], [name: test.t2.v2, collate: binary]", + " └─HashJoin 1.00 mpp[tiflash] left outer join, equal:[eq(test.t3.v1, test.t2.v1) eq(test.t3.v2, test.t2.v2)]", + " ├─ExchangeReceiver(Build) 1.00 mpp[tiflash] ", + " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t3.v1, collate: binary], [name: test.t3.v2, collate: binary]", + " │ └─TableFullScan 1.00 mpp[tiflash] table:t3 keep order:false", + " └─ExchangeReceiver(Probe) 8.00 mpp[tiflash] ", + " └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t2.v1, collate: binary], [name: test.t2.v2, collate: binary]", + " └─Selection 8.00 mpp[tiflash] not(isnull(test.t2.v1)), not(isnull(test.t2.v2))", + " └─TableFullScan 8.00 mpp[tiflash] table:t2 keep order:false" ] } ] @@ -4059,15 +4025,15 @@ { "SQL": "explain format = 'brief' select * from table_1 a, table_1 b where a.value = b.value", "Plan": [ - "TableReader 2.00 root data:ExchangeSender", + "TableReader 2.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 2.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 2.00 mpp[tiflash] inner join, equal:[eq(test.table_1.value, test.table_1.value)]", " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.table_1.value, collate: utf8mb4_general_ci]", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.table_1.value, collate: utf8mb4_general_ci]", " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.table_1.value))", " │ └─TableFullScan 2.00 mpp[tiflash] table:a keep order:false", " └─ExchangeReceiver(Probe) 2.00 mpp[tiflash] ", - " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.table_1.value, collate: utf8mb4_general_ci]", + " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.table_1.value, collate: utf8mb4_general_ci]", " └─Selection 2.00 mpp[tiflash] not(isnull(test.table_1.value))", " └─TableFullScan 2.00 mpp[tiflash] table:b keep order:false" ] @@ -4075,15 +4041,15 @@ { "SQL": "explain format = 'brief' select * from table_1 a, table_2 b where a.value = b.value", "Plan": [ - "TableReader 2.00 root data:ExchangeSender", + "TableReader 2.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 2.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 2.00 mpp[tiflash] inner join, equal:[eq(test.table_1.value, test.table_2.value)]", " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.table_1.value, collate: utf8mb4_bin]", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.table_1.value, collate: utf8mb4_bin]", " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.table_1.value))", " │ └─TableFullScan 2.00 mpp[tiflash] table:a keep order:false", " └─ExchangeReceiver(Probe) 2.00 mpp[tiflash] ", - " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.table_2.value, collate: utf8mb4_bin]", + " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.table_2.value, collate: utf8mb4_bin]", " └─Selection 2.00 mpp[tiflash] not(isnull(test.table_2.value))", " └─TableFullScan 2.00 mpp[tiflash] table:b keep order:false" ] @@ -4091,20 +4057,20 @@ { "SQL": "explain format = 'brief' select * from table_1 a, table_2 b, table_1 c where a.value = b.value and b.value = c.value", "Plan": [ - "TableReader 2.00 root data:ExchangeSender", + "TableReader 2.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 2.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 2.00 mpp[tiflash] inner join, equal:[eq(test.table_2.value, test.table_1.value)]", " ├─HashJoin(Build) 2.00 mpp[tiflash] inner join, equal:[eq(test.table_1.value, test.table_2.value)]", " │ ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.table_1.value, collate: utf8mb4_bin]", + " │ │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.table_1.value, collate: utf8mb4_bin]", " │ │ └─Selection 2.00 mpp[tiflash] not(isnull(test.table_1.value))", " │ │ └─TableFullScan 2.00 mpp[tiflash] table:a keep order:false", " │ └─ExchangeReceiver(Probe) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.table_2.value, collate: utf8mb4_bin]", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.table_2.value, collate: utf8mb4_bin]", " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.table_2.value))", " │ └─TableFullScan 2.00 mpp[tiflash] table:b keep order:false", " └─ExchangeReceiver(Probe) 2.00 mpp[tiflash] ", - " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.table_1.value, collate: utf8mb4_bin]", + " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.table_1.value, collate: utf8mb4_bin]", " └─Selection 2.00 mpp[tiflash] not(isnull(test.table_1.value))", " └─TableFullScan 2.00 mpp[tiflash] table:c keep order:false" ] @@ -4112,22 +4078,22 @@ { "SQL": "explain format = 'brief' select * from table_1 a, table_2 b, table_1 c where a.value = b.value and a.value = c.value", "Plan": [ - "TableReader 2.00 root data:ExchangeSender", + "TableReader 2.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 2.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 2.00 mpp[tiflash] inner join, equal:[eq(test.table_1.value, test.table_1.value)]", " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.table_1.value, collate: utf8mb4_general_ci]", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.table_1.value, collate: utf8mb4_general_ci]", " │ └─HashJoin 2.00 mpp[tiflash] inner join, equal:[eq(test.table_1.value, test.table_2.value)]", " │ ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", - " │ │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.table_1.value, collate: utf8mb4_bin]", + " │ │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.table_1.value, collate: utf8mb4_bin]", " │ │ └─Selection 2.00 mpp[tiflash] not(isnull(test.table_1.value))", " │ │ └─TableFullScan 2.00 mpp[tiflash] table:a keep order:false", " │ └─ExchangeReceiver(Probe) 2.00 mpp[tiflash] ", - " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.table_2.value, collate: utf8mb4_bin]", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.table_2.value, collate: utf8mb4_bin]", " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.table_2.value))", " │ └─TableFullScan 2.00 mpp[tiflash] table:b keep order:false", " └─ExchangeReceiver(Probe) 2.00 mpp[tiflash] ", - " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.table_1.value, collate: utf8mb4_general_ci]", + " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.table_1.value, collate: utf8mb4_general_ci]", " └─Selection 2.00 mpp[tiflash] not(isnull(test.table_1.value))", " └─TableFullScan 2.00 mpp[tiflash] table:c keep order:false" ] @@ -4135,24 +4101,24 @@ { "SQL": "explain format = 'brief' select /*+ agg_to_cop() */ count(*), value from table_1 group by value", "Plan": [ - "TableReader 2.00 root data:ExchangeSender", + "TableReader 2.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 2.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 2.00 mpp[tiflash] Column#4, test.table_1.value", " └─HashAgg 2.00 mpp[tiflash] group by:test.table_1.value, funcs:count(1)->Column#4, funcs:firstrow(test.table_1.value)->test.table_1.value", " └─ExchangeReceiver 2.00 mpp[tiflash] ", - " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.table_1.value, collate: utf8mb4_general_ci]", + " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.table_1.value, collate: utf8mb4_general_ci]", " └─TableFullScan 2.00 mpp[tiflash] table:table_1 keep order:false" ] }, { "SQL": "explain format = 'brief' select /*+ agg_to_cop() */ count(*), value from table_2 group by value", "Plan": [ - "TableReader 2.00 root data:ExchangeSender", + "TableReader 2.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 2.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 2.00 mpp[tiflash] Column#4, test.table_2.value", " └─HashAgg 2.00 mpp[tiflash] group by:test.table_2.value, funcs:count(1)->Column#4, funcs:firstrow(test.table_2.value)->test.table_2.value", " └─ExchangeReceiver 2.00 mpp[tiflash] ", - " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.table_2.value, collate: utf8mb4_bin]", + " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.table_2.value, collate: utf8mb4_bin]", " └─TableFullScan 2.00 mpp[tiflash] table:table_2 keep order:false" ] } @@ -4164,7 +4130,7 @@ { "SQL": "explain format = 'brief' select /*+ broadcast_join(a,b) */ * from table_1 a, table_1 b where a.id = b.id", "Plan": [ - "TableReader 2.00 root data:ExchangeSender", + "TableReader 2.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 2.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 2.00 mpp[tiflash] inner join, equal:[eq(test.table_1.id, test.table_1.id)]", " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", @@ -4176,7 +4142,7 @@ { "SQL": "explain format = 'brief' select /*+ broadcast_join(a,b) */ * from table_1 a, table_1 b where a.value = b.value", "Plan": [ - "TableReader 2.00 root data:ExchangeSender", + "TableReader 2.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 2.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 2.00 mpp[tiflash] inner join, equal:[eq(test.table_1.value, test.table_1.value)]", " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", @@ -4195,14 +4161,14 @@ { "SQL": "explain format = 'brief' select /*+ avg_to_cop() */ id, avg(value+1),avg(value) from table_1 group by id", "Plan": [ - "TableReader 2.00 root data:ExchangeSender", + "TableReader 2.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 2.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 2.00 mpp[tiflash] test.table_1.id, Column#4, Column#5", " └─Projection 2.00 mpp[tiflash] div(Column#4, cast(case(eq(Column#25, 0), 1, Column#25), decimal(20,0) BINARY))->Column#4, div(Column#5, cast(case(eq(Column#26, 0), 1, Column#26), decimal(20,0) BINARY))->Column#5, test.table_1.id", " └─HashAgg 2.00 mpp[tiflash] group by:Column#39, funcs:count(Column#34)->Column#25, funcs:sum(Column#35)->Column#4, funcs:count(Column#36)->Column#26, funcs:sum(Column#37)->Column#5, funcs:firstrow(Column#38)->test.table_1.id", " └─Projection 2.00 mpp[tiflash] plus(test.table_1.value, 1)->Column#34, plus(test.table_1.value, 1)->Column#35, test.table_1.value, test.table_1.value, test.table_1.id, test.table_1.id", " └─ExchangeReceiver 2.00 mpp[tiflash] ", - " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.table_1.id, collate: binary]", + " └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.table_1.id, collate: binary]", " └─TableFullScan 2.00 mpp[tiflash] table:table_1 keep order:false" ] } @@ -4236,9 +4202,9 @@ { "SQL": "desc format = 'brief' select /*+ read_from_storage(tiflash[t]) */ sum(a) from t", "Plan": [ - "HashAgg 1.00 root funcs:sum(Column#5)->Column#4", - "└─TableReader 1.00 root data:HashAgg", - " └─HashAgg 1.00 batchCop[tiflash] funcs:sum(Column#7)->Column#5", + "StreamAgg 1.00 root funcs:sum(Column#6)->Column#4", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:sum(Column#7)->Column#6", " └─Projection 10000.00 batchCop[tiflash] cast(test.t.a, decimal(10,0) BINARY)->Column#7", " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ], @@ -4247,9 +4213,9 @@ { "SQL": "desc format = 'brief' select /*+ read_from_storage(tiflash[t]) */ sum(a+1) from t", "Plan": [ - "HashAgg 1.00 root funcs:sum(Column#5)->Column#4", - "└─TableReader 1.00 root data:HashAgg", - " └─HashAgg 1.00 batchCop[tiflash] funcs:sum(Column#7)->Column#5", + "StreamAgg 1.00 root funcs:sum(Column#6)->Column#4", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:sum(Column#7)->Column#6", " └─Projection 10000.00 batchCop[tiflash] cast(plus(test.t.a, 1), decimal(20,0) BINARY)->Column#7", " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ], @@ -4258,9 +4224,9 @@ { "SQL": "desc format = 'brief' select /*+ read_from_storage(tiflash[t]) */ sum(isnull(a)) from t", "Plan": [ - "HashAgg 1.00 root funcs:sum(Column#5)->Column#4", - "└─TableReader 1.00 root data:HashAgg", - " └─HashAgg 1.00 batchCop[tiflash] funcs:sum(Column#7)->Column#5", + "StreamAgg 1.00 root funcs:sum(Column#6)->Column#4", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:sum(Column#7)->Column#6", " └─Projection 10000.00 batchCop[tiflash] cast(isnull(test.t.a), decimal(20,0) BINARY)->Column#7", " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ], @@ -4356,854 +4322,519 @@ ] }, { - "Name": "TestViewHint", + "Name": "TestKeepOrderHint", "Cases": [ { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v@sel_1 .@sel_2), merge_join(t1@qb_v_2) */ * from v;", + "SQL": "explain select /*+ order_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9990.00 root inner join, equal:[eq(test.t.a, Column#10)]", - "├─HashAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#10", - "│ └─MergeJoin 12487.50 root inner join, left key:test.t1.b, right key:test.t2.b", - "│ ├─Sort(Build) 9990.00 root test.t2.b", - "│ │ └─TableReader 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ └─Sort(Probe) 9990.00 root test.t1.b", - "│ └─TableReader 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "Limit_12 1.00 root offset:0, count:1", + "└─Projection_17 1.00 root test.t1.a, test.t1.b", + " └─IndexLookUp_16 1.00 root ", + " ├─Limit_15(Build) 1.00 cop[tikv] offset:0, count:1", + " │ └─IndexRangeScan_13 1.00 cop[tikv] table:t1, index:idx_a(a) range:[-inf,10), keep order:true, stats:pseudo", + " └─TableRowIDScan_14(Probe) 1.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v@sel_1 .@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v@sel_1 .@sel1), merge_join(t@qb_v_1) */ * from v;", + "SQL": "explain select /*+ order_index(t, primary) */ * from t where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9990.00 root inner join, equal:[eq(test.t.a, Column#10)]", - "├─StreamAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#10", - "│ └─Sort 12487.50 root test.t2.a", - "│ └─MergeJoin 12487.50 root inner join, left key:test.t1.b, right key:test.t2.b", - "│ ├─Sort(Build) 9990.00 root test.t2.b", - "│ │ └─TableReader 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ └─Sort(Probe) 9990.00 root test.t1.b", - "│ └─TableReader 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "Limit_11 1.00 root offset:0, count:1", + "└─TableReader_15 1.00 root data:Limit_14", + " └─Limit_14 1.00 cop[tikv] offset:0, count:1", + " └─TableRangeScan_13 333.33 cop[tikv] table:t range:[-inf,10), keep order:true, stats:pseudo" ], "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v1@sel_1 . v@sel_2 .@sel_2), merge_join(t1@qb_v_2) */ * from v1;", + "SQL": "explain select /*+ no_order_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#17)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#17", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#16)]", - "│ ├─HashAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#16", - "│ │ └─MergeJoin 12487.50 root inner join, left key:test.t1.b, right key:test.t2.b", - "│ │ ├─Sort(Build) 9990.00 root test.t2.b", - "│ │ │ └─TableReader 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ │ └─Sort(Probe) 9990.00 root test.t1.b", - "│ │ └─TableReader 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TopN_9 1.00 root test.t1.a, offset:0, count:1", + "└─IndexLookUp_16 1.00 root ", + " ├─TopN_15(Build) 1.00 cop[tikv] test.t1.a, offset:0, count:1", + " │ └─IndexRangeScan_13 3323.33 cop[tikv] table:t1, index:idx_a(a) range:[-inf,10), keep order:false, stats:pseudo", + " └─TableRowIDScan_14(Probe) 1.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v1@sel_1 . v@sel_2 .@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v1@sel_1 . v@sel_2 .@sel_1), merge_join(t@qb_v_1) */ * from v1;", + "SQL": "explain select /*+ no_order_index(t, primary) */ * from t where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#17)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#17", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t1.b, test.t.b)]", - "│ ├─MergeJoin(Build) 9980.01 root inner join, left key:test.t.a, right key:Column#16", - "│ │ ├─Sort(Build) 7992.00 root Column#16", - "│ │ │ └─StreamAgg 7992.00 root group by:test.t2.a, funcs:count(1)->Column#16", - "│ │ │ └─Sort 12487.50 root test.t2.a", - "│ │ │ └─MergeJoin 12487.50 root inner join, left key:test.t1.b, right key:test.t2.b", - "│ │ │ ├─Sort(Build) 9990.00 root test.t2.b", - "│ │ │ │ └─TableReader 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ │ │ └─Sort(Probe) 9990.00 root test.t1.b", - "│ │ │ └─TableReader 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ └─Sort(Probe) 9980.01 root test.t.a", - "│ │ └─TableReader 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TopN_8 1.00 root test.t.a, offset:0, count:1", + "└─TableReader_15 1.00 root data:TopN_14", + " └─TopN_14 1.00 cop[tikv] test.t.a, offset:0, count:1", + " └─TableRangeScan_13 3333.33 cop[tikv] table:t range:[-inf,10), keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v2@sel_1 . v1@sel_2 . v@sel_2 .@sel_2), merge_join(t1@qb_v_2) */ * from v2;", + "SQL": "explain select /*+ no_order_index(t1, idx_a) */ * from t1 where a<10 limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#24)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#24", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#23)]", - "│ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#23", - "│ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#22)]", - "│ │ ├─HashAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#22", - "│ │ │ └─MergeJoin 12487.50 root inner join, left key:test.t1.b, right key:test.t2.b", - "│ │ │ ├─Sort(Build) 9990.00 root test.t2.b", - "│ │ │ │ └─TableReader 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ │ │ └─Sort(Probe) 9990.00 root test.t1.b", - "│ │ │ └─TableReader 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "IndexLookUp_13 1.00 root limit embedded(offset:0, count:1)", + "├─Limit_12(Build) 1.00 cop[tikv] offset:0, count:1", + "│ └─IndexRangeScan_10 1.00 cop[tikv] table:t1, index:idx_a(a) range:[-inf,10), keep order:false, stats:pseudo", + "└─TableRowIDScan_11(Probe) 1.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v2@sel_1 . v1@sel_2 . v@sel_2 .@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v2@sel_1 . v1@sel_2 . v@sel_2 .@sel_1), merge_join(t@qb_v_1) */ * from v2;", + "SQL": "explain select /*+ no_order_index(t, primary) */ * from t where a<10 limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#24)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#24", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#23)]", - "│ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#23", - "│ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t1.b, test.t.b)]", - "│ │ ├─MergeJoin(Build) 9980.01 root inner join, left key:test.t.a, right key:Column#22", - "│ │ │ ├─Sort(Build) 7992.00 root Column#22", - "│ │ │ │ └─StreamAgg 7992.00 root group by:test.t2.a, funcs:count(1)->Column#22", - "│ │ │ │ └─Sort 12487.50 root test.t2.a", - "│ │ │ │ └─MergeJoin 12487.50 root inner join, left key:test.t1.b, right key:test.t2.b", - "│ │ │ │ ├─Sort(Build) 9990.00 root test.t2.b", - "│ │ │ │ │ └─TableReader 9990.00 root data:Selection", - "│ │ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", - "│ │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ │ │ │ └─Sort(Probe) 9990.00 root test.t1.b", - "│ │ │ │ └─TableReader 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ │ └─Sort(Probe) 9980.01 root test.t.a", - "│ │ │ └─TableReader 9980.01 root data:Selection", - "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "│ │ └─TableReader(Probe) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "Limit_8 1.00 root offset:0, count:1", + "└─TableReader_12 1.00 root data:Limit_11", + " └─Limit_11 1.00 cop[tikv] offset:0, count:1", + " └─TableRangeScan_10 333.33 cop[tikv] table:t range:[-inf,10), keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1_2, v1@sel_1 .@sel_2), merge_join(t1@qb_v1_2) */ * from v1;", + "SQL": "explain select /*+ order_index(t1, idx_b) */ * from t1 where b<10 order by b limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#17)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#17", - "│ └─MergeJoin 12475.01 root inner join, left key:test.t1.b, right key:test.t.b", - "│ ├─Sort(Build) 9980.01 root test.t.b", - "│ │ └─HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#16)]", - "│ │ ├─HashAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#16", - "│ │ │ └─HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t2.b)]", - "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ │ └─TableReader(Probe) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "│ └─Sort(Probe) 9990.00 root test.t1.b", - "│ └─TableReader 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TopN_8 1.00 root test.t1.b, offset:0, count:1", + "└─TableReader_16 1.00 root data:TopN_15", + " └─TopN_15 1.00 cop[tikv] test.t1.b, offset:0, count:1", + " └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 10)", + " └─TableFullScan_13 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], - "Warn": null + "Warn": [ + "[planner:1176]Key 'idx_b' doesn't exist in table 't1'" + ] }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1_2, v1@sel_1 .@sel_2), merge_join(t1@qb_v1_2), stream_agg(@qb_v1_2), qb_name(qb_v1_1, v1@sel_1 .@sel_1), merge_join(t@qb_v1_1) */ * from v1;", + "SQL": "explain select /*+ order_index(t, idx_b) */ * from t where b<10 order by b limit 1;", "Plan": [ - "MergeJoin 9980.01 root inner join, left key:test.t.a, right key:Column#17", - "├─Sort(Build) 7984.01 root Column#17", - "│ └─StreamAgg 7984.01 root group by:test.t.a, funcs:count(1)->Column#17", - "│ └─Sort 12475.01 root test.t.a", - "│ └─MergeJoin 12475.01 root inner join, left key:test.t1.b, right key:test.t.b", - "│ ├─Sort(Build) 9980.01 root test.t.b", - "│ │ └─HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#16)]", - "│ │ ├─HashAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#16", - "│ │ │ └─HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t2.b)]", - "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ │ └─TableReader(Probe) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "│ └─Sort(Probe) 9990.00 root test.t1.b", - "│ └─TableReader 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─Sort(Probe) 9990.00 root test.t.a", - " └─TableReader 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TopN_8 1.00 root test.t.b, offset:0, count:1", + "└─TableReader_16 1.00 root data:TopN_15", + " └─TopN_15 1.00 cop[tikv] test.t.b, offset:0, count:1", + " └─Selection_14 3323.33 cop[tikv] lt(test.t.b, 10)", + " └─TableFullScan_13 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], - "Warn": null + "Warn": [ + "[planner:1176]Key 'idx_b' doesn't exist in table 't'" + ] }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1_2, v2@sel_1 . v1@sel_1 .@sel_2), merge_join(t1@qb_v1_2) */ * from v2;", + "SQL": "explain select /*+ no_order_index(t1, idx_b) */ * from t1 where b<10 order by b limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#24)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#24", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#23)]", - "│ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#23", - "│ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#22)]", - "│ │ ├─HashAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#22", - "│ │ │ └─HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t2.b)]", - "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ │ └─TableReader(Probe) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TopN_8 1.00 root test.t1.b, offset:0, count:1", + "└─TableReader_16 1.00 root data:TopN_15", + " └─TopN_15 1.00 cop[tikv] test.t1.b, offset:0, count:1", + " └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 10)", + " └─TableFullScan_13 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1176]Key 'idx_b' doesn't exist in table 't1'" + ] + }, + { + "SQL": "explain select /*+ no_order_index(t, idx_b) */ * from t where b<10 order by b limit 1;", + "Plan": [ + "TopN_8 1.00 root test.t.b, offset:0, count:1", + "└─TableReader_16 1.00 root data:TopN_15", + " └─TopN_15 1.00 cop[tikv] test.t.b, offset:0, count:1", + " └─Selection_14 3323.33 cop[tikv] lt(test.t.b, 10)", + " └─TableFullScan_13 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1176]Key 'idx_b' doesn't exist in table 't'" + ] + }, + { + "SQL": "explain select /*+ order_index(t1, idx_a) use_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;", + "Plan": [ + "Limit_12 1.00 root offset:0, count:1", + "└─Projection_19 1.00 root test.t1.a, test.t1.b", + " └─IndexLookUp_18 1.00 root ", + " ├─Limit_17(Build) 1.00 cop[tikv] offset:0, count:1", + " │ └─IndexRangeScan_13 1.00 cop[tikv] table:t1, index:idx_a(a) range:[-inf,10), keep order:true, stats:pseudo", + " └─TableRowIDScan_14(Probe) 1.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1_2, v2@sel_1 . v1@sel_1 .@sel_2), merge_join(t1@qb_v1_2), stream_agg(@qb_v1_2), qb_name(qb_v1_1, v2@sel_1 . v1@sel_1 .@sel_1), merge_join(t@qb_v1_1) */ * from v2;", + "SQL": "explain select /*+ order_index(t1, idx_a) */ * from t1 use index(idx_a) where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#24)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#24", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#23)]", - "│ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#23", - "│ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#22)]", - "│ │ ├─HashAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#22", - "│ │ │ └─HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t2.b)]", - "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ │ └─TableReader(Probe) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "Limit_12 1.00 root offset:0, count:1", + "└─Projection_19 1.00 root test.t1.a, test.t1.b", + " └─IndexLookUp_18 1.00 root ", + " ├─Limit_17(Build) 1.00 cop[tikv] offset:0, count:1", + " │ └─IndexRangeScan_13 1.00 cop[tikv] table:t1, index:idx_a(a) range:[-inf,10), keep order:true, stats:pseudo", + " └─TableRowIDScan_14(Probe) 1.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v2_2, v2@sel_1 .@sel_2), merge_join(t1@qb_v2_2) */ * from v2;", + "SQL": "explain select /*+ order_index(t1, idx_a) force_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#24)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#24", - "│ └─MergeJoin 12475.01 root inner join, left key:test.t1.b, right key:test.t.b", - "│ ├─Sort(Build) 9980.01 root test.t.b", - "│ │ └─HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#23)]", - "│ │ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#23", - "│ │ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#22)]", - "│ │ │ ├─HashAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#22", - "│ │ │ │ └─HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t2.b)]", - "│ │ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ │ │ └─TableReader(Probe) 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "│ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "│ └─Sort(Probe) 9990.00 root test.t1.b", - "│ └─TableReader 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "Limit_12 1.00 root offset:0, count:1", + "└─Projection_19 1.00 root test.t1.a, test.t1.b", + " └─IndexLookUp_18 1.00 root ", + " ├─Limit_17(Build) 1.00 cop[tikv] offset:0, count:1", + " │ └─IndexRangeScan_13 1.00 cop[tikv] table:t1, index:idx_a(a) range:[-inf,10), keep order:true, stats:pseudo", + " └─TableRowIDScan_14(Probe) 1.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v2_2, v2@sel_1 .@sel_2), merge_join(t1@qb_v2_2), stream_agg(@qb_v2_2), qb_name(qb_v2_1, v1@sel_1 .@sel_1), merge_join(t@qb_v2_1) */ * from v2;", + "SQL": "explain select /*+ order_index(t1, idx_a) */ * from t1 force index(idx_a) where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#24)]", - "├─StreamAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#24", - "│ └─Sort 12475.01 root test.t.a", - "│ └─MergeJoin 12475.01 root inner join, left key:test.t1.b, right key:test.t.b", - "│ ├─Sort(Build) 9980.01 root test.t.b", - "│ │ └─HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#23)]", - "│ │ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#23", - "│ │ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#22)]", - "│ │ │ ├─HashAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#22", - "│ │ │ │ └─HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t2.b)]", - "│ │ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ │ │ └─TableReader(Probe) 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "│ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "│ └─Sort(Probe) 9990.00 root test.t1.b", - "│ └─TableReader 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "Limit_12 1.00 root offset:0, count:1", + "└─Projection_19 1.00 root test.t1.a, test.t1.b", + " └─IndexLookUp_18 1.00 root ", + " ├─Limit_17(Build) 1.00 cop[tikv] offset:0, count:1", + " │ └─IndexRangeScan_13 1.00 cop[tikv] table:t1, index:idx_a(a) range:[-inf,10), keep order:true, stats:pseudo", + " └─TableRowIDScan_14(Probe) 1.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warn": null - } - ] - }, - { - "Name": "TestViewHintScope", - "Cases": [ + }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v, v@sel_1 .@sel_2), qb_name(qb_v, v@sel_1 .@sel_1), merge_join(t1@qb_v) */ * from v;", + "SQL": "explain select /*+ order_index(t1, idx_a) ignore_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#13)]", - "├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#13", - "│ └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t2.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ └─MergeJoin(Probe) 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", - "│ ├─Sort(Build) 9980.01 root test.t2.b", - "│ │ └─TableReader 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ └─Sort(Probe) 9990.00 root test.t1.b", - "│ └─TableReader 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TopN_8 1.00 root test.t1.a, offset:0, count:1", + "└─TableReader_16 1.00 root data:TopN_15", + " └─TopN_15 1.00 cop[tikv] test.t1.a, offset:0, count:1", + " └─Selection_14 3323.33 cop[tikv] lt(test.t1.a, 10)", + " └─TableFullScan_13 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], - "Warn": [ - "Duplicate query block name qb_v for view's query block hint, only the first one is effective" - ] + "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v, v1@sel_1 .v@sel_2 .@sel_2), qb_name(qb_v, v1@sel_1 .v@sel_2 .@sel_1), merge_join(t1@qb_v) */ * from v1;", + "SQL": "explain select /*+ order_index(t, primary) use_index(t, primary) */ * from t where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#20)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#20", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#19)]", - "│ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#19", - "│ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t2.a)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ │ └─MergeJoin(Probe) 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", - "│ │ ├─Sort(Build) 9980.01 root test.t2.b", - "│ │ │ └─TableReader 9980.01 root data:Selection", - "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ │ └─Sort(Probe) 9990.00 root test.t1.b", - "│ │ └─TableReader 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "Limit_11 1.00 root offset:0, count:1", + "└─TableReader_16 1.00 root data:Limit_15", + " └─Limit_15 1.00 cop[tikv] offset:0, count:1", + " └─TableRangeScan_13 333.33 cop[tikv] table:t range:[-inf,10), keep order:true, stats:pseudo" ], - "Warn": [ - "Duplicate query block name qb_v for view's query block hint, only the first one is effective" - ] + "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v, v2@sel_1 .v1@sel_2 .v@sel_2 .@sel_2), qb_name(qb_v, v2@sel_1 .v1@sel_2 .v@sel_2 .@sel_1), merge_join(t1@qb_v) */ * from v2;", + "SQL": "explain select /*+ order_index(t, primary) */ * from t use index(primary) where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#27)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#27", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#26)]", - "│ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#26", - "│ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#25)]", - "│ │ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#25", - "│ │ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t2.a)]", - "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ │ │ └─MergeJoin(Probe) 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", - "│ │ │ ├─Sort(Build) 9980.01 root test.t2.b", - "│ │ │ │ └─TableReader 9980.01 root data:Selection", - "│ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ │ │ └─Sort(Probe) 9990.00 root test.t1.b", - "│ │ │ └─TableReader 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "Limit_11 1.00 root offset:0, count:1", + "└─TableReader_16 1.00 root data:Limit_15", + " └─Limit_15 1.00 cop[tikv] offset:0, count:1", + " └─TableRangeScan_13 333.33 cop[tikv] table:t range:[-inf,10), keep order:true, stats:pseudo" ], - "Warn": [ - "Duplicate query block name qb_v for view's query block hint, only the first one is effective" - ] + "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1_2, v@sel_1 .@sel_2), merge_join(t1@qb_v1_2) */ * from v1;", + "SQL": "explain select /*+ order_index(t, primary) force_index(t, primary) */ * from t where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#20)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#20", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#19)]", - "│ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#19", - "│ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "Limit_11 1.00 root offset:0, count:1", + "└─TableReader_16 1.00 root data:Limit_15", + " └─Limit_15 1.00 cop[tikv] offset:0, count:1", + " └─TableRangeScan_13 333.33 cop[tikv] table:t range:[-inf,10), keep order:true, stats:pseudo" ], "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1_2, v2@sel_1 . v@sel_1 .@sel_2), merge_join(t1@qb_v1_2) */ * from v2;", + "SQL": "explain select /*+ order_index(t, primary) */ * from t force index(primary) where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#27)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#27", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#26)]", - "│ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#26", - "│ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#25)]", - "│ │ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#25", - "│ │ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", - "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", - "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "Limit_11 1.00 root offset:0, count:1", + "└─TableReader_16 1.00 root data:Limit_15", + " └─Limit_15 1.00 cop[tikv] offset:0, count:1", + " └─TableRangeScan_13 333.33 cop[tikv] table:t range:[-inf,10), keep order:true, stats:pseudo" ], "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v2_2, vv@sel_1 .@sel_2), merge_join(t1@qb_v2_2) */ * from v2 vv;", + "SQL": "explain select /*+ order_index(t, primary) ignore_index(t, primary) */ * from t where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#27)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#27", - "│ └─MergeJoin 12475.01 root inner join, left key:test.t1.b, right key:test.t.b", - "│ ├─Sort(Build) 9980.01 root test.t.b", - "│ │ └─HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#26)]", - "│ │ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#26", - "│ │ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#25)]", - "│ │ │ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#25", - "│ │ │ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", - "│ │ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ │ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", - "│ │ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ │ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "│ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "│ └─Sort(Probe) 9990.00 root test.t1.b", - "│ └─TableReader 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "Limit_11 1.00 root offset:0, count:1", + "└─TableReader_15 1.00 root data:Limit_14", + " └─Limit_14 1.00 cop[tikv] offset:0, count:1", + " └─TableRangeScan_13 333.33 cop[tikv] table:t range:[-inf,10), keep order:true, stats:pseudo" ], "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v2_2, v2@sel_1 .@sel_2), merge_join(t1@qb_v2_2) */ * from v2 vv;", + "SQL": "explain select /*+ no_order_index(t, primary) use_index(t, primary) */ * from t where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#27)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#27", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#26)]", - "│ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#26", - "│ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#25)]", - "│ │ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#25", - "│ │ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", - "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", - "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TopN_8 1.00 root test.t.a, offset:0, count:1", + "└─TableReader_16 1.00 root data:TopN_15", + " └─TopN_15 1.00 cop[tikv] test.t.a, offset:0, count:1", + " └─TableRangeScan_13 3333.33 cop[tikv] table:t range:[-inf,10), keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "explain format = 'brief' select * from (select /*+ qb_name(qb_v_2, v@sel_1 .@sel_2), merge_join(t1@qb_v_2) */ * from v) t;", + "SQL": "explain select /*+ no_order_index(t, primary) */ * from t use index(primary) where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#13)]", - "├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#13", - "│ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TopN_8 1.00 root test.t.a, offset:0, count:1", + "└─TableReader_16 1.00 root data:TopN_15", + " └─TopN_15 1.00 cop[tikv] test.t.a, offset:0, count:1", + " └─TableRangeScan_13 3333.33 cop[tikv] table:t range:[-inf,10), keep order:false, stats:pseudo" ], - "Warn": [ - "The qb_name hint for view only supports to be defined in the first query block", - "Hint merge_join(`t1`@`qb_v_2`) is ignored due to unknown query block name" - ] + "Warn": null }, { - "SQL": "explain format = 'brief' select * from (select /*+ qb_name(qb_v_2, v@sel_1 .@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v@sel_1 .@sel1), merge_join(t@qb_v_1) */ * from v) t;", + "SQL": "explain select /*+ no_order_index(t, primary) force_index(t, primary) */ * from t where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#13)]", - "├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#13", - "│ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TopN_8 1.00 root test.t.a, offset:0, count:1", + "└─TableReader_16 1.00 root data:TopN_15", + " └─TopN_15 1.00 cop[tikv] test.t.a, offset:0, count:1", + " └─TableRangeScan_13 3333.33 cop[tikv] table:t range:[-inf,10), keep order:false, stats:pseudo" ], - "Warn": [ - "The qb_name hint for view only supports to be defined in the first query block", - "The qb_name hint for view only supports to be defined in the first query block", - "Hint merge_join(`t1`@`qb_v_2`) is ignored due to unknown query block name", - "Hint stream_agg(@`qb_v_2`) is ignored due to unknown query block name", - "Hint merge_join(`t`@`qb_v_1`) is ignored due to unknown query block name" - ] + "Warn": null }, { - "SQL": "explain format = 'brief' select * from (select /*+ qb_name(qb_v_2, v1@sel_1 . v@sel_2 .@sel_2), merge_join(t1@qb_v_2) */ * from v1) t;", + "SQL": "explain select /*+ no_order_index(t, primary) */ * from t force index(primary) where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#20)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#20", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#19)]", - "│ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#19", - "│ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TopN_8 1.00 root test.t.a, offset:0, count:1", + "└─TableReader_16 1.00 root data:TopN_15", + " └─TopN_15 1.00 cop[tikv] test.t.a, offset:0, count:1", + " └─TableRangeScan_13 3333.33 cop[tikv] table:t range:[-inf,10), keep order:false, stats:pseudo" ], - "Warn": [ - "The qb_name hint for view only supports to be defined in the first query block", - "Hint merge_join(`t1`@`qb_v_2`) is ignored due to unknown query block name" - ] + "Warn": null }, { - "SQL": "explain format = 'brief' select * from (select /*+ qb_name(qb_v_2, v1@sel_1 . v@sel_2 .@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v1@sel_1 . v@sel_2 .@sel_1), merge_join(t@qb_v_1) */ * from v1) t;", + "SQL": "explain select /*+ no_order_index(t, primary) ignore_index(t, primary) */ * from t where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#20)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#20", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#19)]", - "│ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#19", - "│ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TopN_8 1.00 root test.t.a, offset:0, count:1", + "└─TableReader_15 1.00 root data:TopN_14", + " └─TopN_14 1.00 cop[tikv] test.t.a, offset:0, count:1", + " └─TableRangeScan_13 3333.33 cop[tikv] table:t range:[-inf,10), keep order:false, stats:pseudo" ], - "Warn": [ - "The qb_name hint for view only supports to be defined in the first query block", - "The qb_name hint for view only supports to be defined in the first query block", - "Hint merge_join(`t1`@`qb_v_2`) is ignored due to unknown query block name", - "Hint stream_agg(@`qb_v_2`) is ignored due to unknown query block name", - "Hint merge_join(`t`@`qb_v_1`) is ignored due to unknown query block name" - ] + "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v@sel_1 .@sel_2) */ * from (select /*+ merge_join(t1@qb_v_2) */ * from v) t;", + "SQL": "explain select /*+ no_order_index(t1, idx_a) use_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#13)]", - "├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#13", - "│ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TopN_9 1.00 root test.t1.a, offset:0, count:1", + "└─IndexLookUp_18 1.00 root ", + " ├─TopN_17(Build) 1.00 cop[tikv] test.t1.a, offset:0, count:1", + " │ └─IndexRangeScan_13 3323.33 cop[tikv] table:t1, index:idx_a(a) range:[-inf,10), keep order:false, stats:pseudo", + " └─TableRowIDScan_14(Probe) 1.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], - "Warn": [ - "Hint merge_join(`t1`@`qb_v_2`) is ignored due to unknown query block name" - ] + "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v@sel_1 .@sel_2), qb_name(qb_v_1, v@sel_1 .@sel1) */ * from (select /*+ merge_join(t1@qb_v_2), stream_agg(@qb_v_2), merge_join(t@qb_v_1) */ * from v) t;", + "SQL": "explain select /*+ no_order_index(t1, idx_a) */ * from t1 use index(idx_a) where a<10 order by a limit 1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#13)]", - "├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#13", - "│ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "TopN_9 1.00 root test.t1.a, offset:0, count:1", + "└─IndexLookUp_18 1.00 root ", + " ├─TopN_17(Build) 1.00 cop[tikv] test.t1.a, offset:0, count:1", + " │ └─IndexRangeScan_13 3323.33 cop[tikv] table:t1, index:idx_a(a) range:[-inf,10), keep order:false, stats:pseudo", + " └─TableRowIDScan_14(Probe) 1.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain select /*+ no_order_index(t1, idx_a) force_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;", + "Plan": [ + "TopN_9 1.00 root test.t1.a, offset:0, count:1", + "└─IndexLookUp_18 1.00 root ", + " ├─TopN_17(Build) 1.00 cop[tikv] test.t1.a, offset:0, count:1", + " │ └─IndexRangeScan_13 3323.33 cop[tikv] table:t1, index:idx_a(a) range:[-inf,10), keep order:false, stats:pseudo", + " └─TableRowIDScan_14(Probe) 1.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain select /*+ no_order_index(t1, idx_a) */ * from t1 force index(idx_a) where a<10 order by a limit 1;", + "Plan": [ + "TopN_9 1.00 root test.t1.a, offset:0, count:1", + "└─IndexLookUp_18 1.00 root ", + " ├─TopN_17(Build) 1.00 cop[tikv] test.t1.a, offset:0, count:1", + " │ └─IndexRangeScan_13 3323.33 cop[tikv] table:t1, index:idx_a(a) range:[-inf,10), keep order:false, stats:pseudo", + " └─TableRowIDScan_14(Probe) 1.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain select /*+ no_order_index(t1, idx_a) ignore_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;", + "Plan": [ + "TopN_8 1.00 root test.t1.a, offset:0, count:1", + "└─TableReader_16 1.00 root data:TopN_15", + " └─TopN_15 1.00 cop[tikv] test.t1.a, offset:0, count:1", + " └─Selection_14 3323.33 cop[tikv] lt(test.t1.a, 10)", + " └─TableFullScan_13 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain select /*+ qb_name(qb, v) order_index(t1@qb, idx_a) */ * from v", + "Plan": [ + "Limit_14 1.00 root offset:0, count:1", + "└─Projection_19 1.00 root test.t1.a, test.t1.b", + " └─IndexLookUp_18 1.00 root ", + " ├─Limit_17(Build) 1.00 cop[tikv] offset:0, count:1", + " │ └─IndexRangeScan_15 1.00 cop[tikv] table:t1, index:idx_a(a) range:[-inf,10), keep order:true, stats:pseudo", + " └─TableRowIDScan_16(Probe) 1.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain select /*+ qb_name(qb, v1) order_index(t@qb, primary) */ * from v1", + "Plan": [ + "Limit_13 1.00 root offset:0, count:1", + "└─TableReader_17 1.00 root data:Limit_16", + " └─Limit_16 1.00 cop[tikv] offset:0, count:1", + " └─TableRangeScan_15 333.33 cop[tikv] table:t range:[-inf,10), keep order:true, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain select /*+ qb_name(qb, v) no_order_index(t1@qb, idx_a) */ * from v", + "Plan": [ + "TopN_11 1.00 root test.t1.a, offset:0, count:1", + "└─IndexLookUp_18 1.00 root ", + " ├─TopN_17(Build) 1.00 cop[tikv] test.t1.a, offset:0, count:1", + " │ └─IndexRangeScan_15 3323.33 cop[tikv] table:t1, index:idx_a(a) range:[-inf,10), keep order:false, stats:pseudo", + " └─TableRowIDScan_16(Probe) 1.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain select /*+ qb_name(qb, v1) no_order_index(t@qb, primary) */ * from v1", + "Plan": [ + "TopN_10 1.00 root test.t.a, offset:0, count:1", + "└─TableReader_17 1.00 root data:TopN_16", + " └─TopN_16 1.00 cop[tikv] test.t.a, offset:0, count:1", + " └─TableRangeScan_15 3333.33 cop[tikv] table:t range:[-inf,10), keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain WITH CTE AS (select /*+ order_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "Plan": [ + "HashAgg_30 2.00 root group by:Column#8, Column#9, funcs:firstrow(Column#8)->Column#8, funcs:firstrow(Column#9)->Column#9", + "└─Union_31 1.28 root ", + " ├─Selection_33 0.64 root lt(test.t1.a, 18)", + " │ └─CTEFullScan_34 0.80 root CTE:cte data:CTE_0", + " └─Selection_36 0.64 root gt(test.t1.b, 1)", + " └─CTEFullScan_37 0.80 root CTE:cte data:CTE_0", + "CTE_0 0.80 root Non-Recursive CTE", + "└─Selection_18(Seed Part) 0.80 root or(lt(test.t1.a, 18), gt(test.t1.b, 1))", + " └─Limit_24 1.00 root offset:0, count:1", + " └─Projection_29 1.00 root test.t1.a, test.t1.b", + " └─IndexLookUp_28 1.00 root ", + " ├─Limit_27(Build) 1.00 cop[tikv] offset:0, count:1", + " │ └─IndexRangeScan_25 1.00 cop[tikv] table:t1, index:idx_a(a) range:[-inf,10), keep order:true, stats:pseudo", + " └─TableRowIDScan_26(Probe) 1.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain WITH CTE AS (select /*+ order_index(t, primary) */ * from t where a<10 order by a limit 1) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "Plan": [ + "HashAgg_28 2.00 root group by:Column#7, Column#8, funcs:firstrow(Column#7)->Column#7, funcs:firstrow(Column#8)->Column#8", + "└─Union_29 1.28 root ", + " ├─Selection_31 0.64 root lt(test.t.a, 18)", + " │ └─CTEFullScan_32 0.80 root CTE:cte data:CTE_0", + " └─Selection_34 0.64 root gt(test.t.b, 1)", + " └─CTEFullScan_35 0.80 root CTE:cte data:CTE_0", + "CTE_0 0.80 root Non-Recursive CTE", + "└─Selection_18(Seed Part) 0.80 root or(lt(test.t.a, 18), gt(test.t.b, 1))", + " └─Limit_23 1.00 root offset:0, count:1", + " └─TableReader_27 1.00 root data:Limit_26", + " └─Limit_26 1.00 cop[tikv] offset:0, count:1", + " └─TableRangeScan_25 333.33 cop[tikv] table:t range:[-inf,10), keep order:true, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain WITH CTE AS (select /*+ no_order_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "Plan": [ + "HashAgg_29 2.00 root group by:Column#8, Column#9, funcs:firstrow(Column#8)->Column#8, funcs:firstrow(Column#9)->Column#9", + "└─Union_30 1.28 root ", + " ├─Selection_32 0.64 root lt(test.t1.a, 18)", + " │ └─CTEFullScan_33 0.80 root CTE:cte data:CTE_0", + " └─Selection_35 0.64 root gt(test.t1.b, 1)", + " └─CTEFullScan_36 0.80 root CTE:cte data:CTE_0", + "CTE_0 0.80 root Non-Recursive CTE", + "└─Selection_18(Seed Part) 0.80 root or(lt(test.t1.a, 18), gt(test.t1.b, 1))", + " └─TopN_21 1.00 root test.t1.a, offset:0, count:1", + " └─IndexLookUp_28 1.00 root ", + " ├─TopN_27(Build) 1.00 cop[tikv] test.t1.a, offset:0, count:1", + " │ └─IndexRangeScan_25 3323.33 cop[tikv] table:t1, index:idx_a(a) range:[-inf,10), keep order:false, stats:pseudo", + " └─TableRowIDScan_26(Probe) 1.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain WITH CTE AS (select /*+ no_order_index(t, primary) */ * from t where a<10 order by a limit 1) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "Plan": [ + "HashAgg_28 2.00 root group by:Column#7, Column#8, funcs:firstrow(Column#7)->Column#7, funcs:firstrow(Column#8)->Column#8", + "└─Union_29 1.28 root ", + " ├─Selection_31 0.64 root lt(test.t.a, 18)", + " │ └─CTEFullScan_32 0.80 root CTE:cte data:CTE_0", + " └─Selection_34 0.64 root gt(test.t.b, 1)", + " └─CTEFullScan_35 0.80 root CTE:cte data:CTE_0", + "CTE_0 0.80 root Non-Recursive CTE", + "└─Selection_18(Seed Part) 0.80 root or(lt(test.t.a, 18), gt(test.t.b, 1))", + " └─TopN_20 1.00 root test.t.a, offset:0, count:1", + " └─TableReader_27 1.00 root data:TopN_26", + " └─TopN_26 1.00 cop[tikv] test.t.a, offset:0, count:1", + " └─TableRangeScan_25 3333.33 cop[tikv] table:t range:[-inf,10), keep order:false, stats:pseudo" + ], + "Warn": null + } + ] + }, + { + "Name": "TestViewHint", + "Cases": [ + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v@sel_1 .@sel_2), merge_join(t1@qb_v_2) */ * from v;", + "Plan": [ + "HashJoin 9990.00 root inner join, equal:[eq(test.t.a, Column#10)]", + "├─HashAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#10", + "│ └─MergeJoin 12487.50 root inner join, left key:test.t1.b, right key:test.t2.b", + "│ ├─Sort(Build) 9990.00 root test.t2.b", + "│ │ └─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ └─Sort(Probe) 9990.00 root test.t1.b", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", "└─TableReader(Probe) 9990.00 root data:Selection", " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], - "Warn": [ - "Hint merge_join(`t1`@`qb_v_2`) is ignored due to unknown query block name", - "Hint stream_agg(@`qb_v_2`) is ignored due to unknown query block name", - "Hint merge_join(`t`@`qb_v_1`) is ignored due to unknown query block name" - ] + "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v1@sel_1 . v@sel_2 .@sel_2) */ * from (select /*+ merge_join(t1@qb_v_2) */ * from v1) t;", + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v@sel_1 .@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v@sel_1 .@sel_1), merge_join(t@qb_v_1) */ * from v;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#20)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#20", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#19)]", - "│ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#19", - "│ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "MergeJoin 9990.00 root inner join, left key:test.t.a, right key:Column#10", + "├─Sort(Build) 7992.00 root Column#10", + "│ └─StreamAgg 7992.00 root group by:test.t2.a, funcs:count(1)->Column#10", + "│ └─Sort 12487.50 root test.t2.a", + "│ └─MergeJoin 12487.50 root inner join, left key:test.t1.b, right key:test.t2.b", + "│ ├─Sort(Build) 9990.00 root test.t2.b", + "│ │ └─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ └─Sort(Probe) 9990.00 root test.t1.b", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─Sort(Probe) 9990.00 root test.t.a", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v1@sel_1 . v@sel_2 .@sel_2), merge_join(t1@qb_v_2) */ * from v1;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#17)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#17", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#16)]", + "│ ├─HashAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#16", + "│ │ └─MergeJoin 12487.50 root inner join, left key:test.t1.b, right key:test.t2.b", + "│ │ ├─Sort(Build) 9990.00 root test.t2.b", + "│ │ │ └─TableReader 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ └─Sort(Probe) 9990.00 root test.t1.b", + "│ │ └─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", "│ ├─TableReader(Build) 9990.00 root data:Selection", "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", @@ -5215,65 +4846,58 @@ " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], - "Warn": [ - "Hint merge_join(`t1`@`qb_v_2`) is ignored due to unknown query block name" - ] + "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v1@sel_1 . v@sel_2 .@sel_2), qb_name(qb_v_1, v1@sel_1 . v@sel_2 .@sel_1) */ * from (select /*+ merge_join(t1@qb_v_2), stream_agg(@qb_v_2), merge_join(t@qb_v_1) */ * from v1) t;", + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v1@sel_1 . v@sel_2 .@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v1@sel_1 . v@sel_2 .@sel_1), merge_join(t@qb_v_1) */ * from v1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#20)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#20", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#19)]", - "│ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#19", - "│ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#17)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#17", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t1.b, test.t.b)]", + "│ ├─MergeJoin(Build) 9980.01 root inner join, left key:test.t.a, right key:Column#16", + "│ │ ├─Sort(Build) 7992.00 root Column#16", + "│ │ │ └─StreamAgg 7992.00 root group by:test.t2.a, funcs:count(1)->Column#16", + "│ │ │ └─Sort 12487.50 root test.t2.a", + "│ │ │ └─MergeJoin 12487.50 root inner join, left key:test.t1.b, right key:test.t2.b", + "│ │ │ ├─Sort(Build) 9990.00 root test.t2.b", + "│ │ │ │ └─TableReader 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ │ └─Sort(Probe) 9990.00 root test.t1.b", + "│ │ │ └─TableReader 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ └─Sort(Probe) 9980.01 root test.t.a", + "│ │ └─TableReader 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", "└─TableReader(Probe) 9990.00 root data:Selection", " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], - "Warn": [ - "Hint merge_join(`t1`@`qb_v_2`) is ignored due to unknown query block name", - "Hint stream_agg(@`qb_v_2`) is ignored due to unknown query block name", - "Hint merge_join(`t`@`qb_v_1`) is ignored due to unknown query block name" - ] + "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1_2, v2@sel_1 . v1@sel_1 .@sel_2), qb_name(qb_v1_1, v2@sel_1 . v1@sel_1 .@sel_1), merge_join(t1@qb_v1_2, t@qb_v1_1) */ * from v2;", + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v2@sel_1 . v1@sel_2 . v@sel_2 .@sel_2), merge_join(t1@qb_v_2) */ * from v2;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#27)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#27", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#26)]", - "│ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#26", - "│ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#25)]", - "│ │ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#25", - "│ │ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", - "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", - "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#24)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#24", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#23)]", + "│ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#23", + "│ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#22)]", + "│ │ ├─HashAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#22", + "│ │ │ └─MergeJoin 12487.50 root inner join, left key:test.t1.b, right key:test.t2.b", + "│ │ │ ├─Sort(Build) 9990.00 root test.t2.b", + "│ │ │ │ └─TableReader 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ │ └─Sort(Probe) 9990.00 root test.t1.b", + "│ │ │ └─TableReader 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", "│ │ ├─TableReader(Build) 9990.00 root data:Selection", "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", @@ -5292,41 +4916,36 @@ " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], - "Warn": [ - "Hint merge_join(`t1`@`qb_v1_2`, `t`@`qb_v1_1`) is ignored due to unknown query block name" - ] + "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v2@sel_1 . v1@sel_2 . v@sel_2 .@sel_2), qb_name(qb_v_1, v2@sel_1 . v1@sel_2 . v@sel_2 .@sel_1), merge_join(t1@qb_v_2, t3@qb_v_2) */ * from v2;", + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v2@sel_1 . v1@sel_2 . v@sel_2 .@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v2@sel_1 . v1@sel_2 . v@sel_2 .@sel_1), merge_join(t@qb_v_1) */ * from v2;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#27)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#27", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#26)]", - "│ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#26", - "│ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#25)]", - "│ │ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#25", - "│ │ │ └─MergeJoin 15593.77 root inner join, left key:test.t2.a, right key:test.t3.a", - "│ │ │ ├─Sort(Build) 9990.00 root test.t3.a", - "│ │ │ │ └─TableReader 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ │ │ └─Sort(Probe) 12475.01 root test.t2.a", - "│ │ │ └─MergeJoin 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", - "│ │ │ ├─Sort(Build) 9980.01 root test.t2.b", - "│ │ │ │ └─TableReader 9980.01 root data:Selection", - "│ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ │ │ └─Sort(Probe) 9990.00 root test.t1.b", - "│ │ │ └─TableReader 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#24)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#24", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#23)]", + "│ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#23", + "│ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t1.b, test.t.b)]", + "│ │ ├─MergeJoin(Build) 9980.01 root inner join, left key:test.t.a, right key:Column#22", + "│ │ │ ├─Sort(Build) 7992.00 root Column#22", + "│ │ │ │ └─StreamAgg 7992.00 root group by:test.t2.a, funcs:count(1)->Column#22", + "│ │ │ │ └─Sort 12487.50 root test.t2.a", + "│ │ │ │ └─MergeJoin 12487.50 root inner join, left key:test.t1.b, right key:test.t2.b", + "│ │ │ │ ├─Sort(Build) 9990.00 root test.t2.b", + "│ │ │ │ │ └─TableReader 9990.00 root data:Selection", + "│ │ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + "│ │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ │ │ └─Sort(Probe) 9990.00 root test.t1.b", + "│ │ │ │ └─TableReader 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ │ └─Sort(Probe) 9980.01 root test.t.a", + "│ │ │ └─TableReader 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ │ └─TableReader(Probe) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", "│ ├─TableReader(Build) 9990.00 root data:Selection", "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", @@ -5341,36 +4960,91 @@ "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v2@sel_1 . v1@sel_2 . v@sel_2 .@sel_2), qb_name(qb_v_1, v2@sel_1 . v1@sel_2 . v@sel_2 .@sel_1), merge_join(@qb_v_2 t1, t3) */ * from v2;", + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1_2, v1@sel_1 .@sel_2), merge_join(t1@qb_v1_2) */ * from v1;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#27)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#27", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#26)]", - "│ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#26", - "│ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#25)]", - "│ │ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#25", - "│ │ │ └─MergeJoin 15593.77 root inner join, left key:test.t2.a, right key:test.t3.a", - "│ │ │ ├─Sort(Build) 9990.00 root test.t3.a", - "│ │ │ │ └─TableReader 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ │ │ └─Sort(Probe) 12475.01 root test.t2.a", - "│ │ │ └─MergeJoin 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", - "│ │ │ ├─Sort(Build) 9980.01 root test.t2.b", - "│ │ │ │ └─TableReader 9980.01 root data:Selection", - "│ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ │ │ └─Sort(Probe) 9990.00 root test.t1.b", - "│ │ │ └─TableReader 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#17)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#17", + "│ └─MergeJoin 12475.01 root inner join, left key:test.t1.b, right key:test.t.b", + "│ ├─Sort(Build) 9980.01 root test.t.b", + "│ │ └─HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#16)]", + "│ │ ├─HashAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#16", + "│ │ │ └─HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t2.b)]", + "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ │ └─TableReader(Probe) 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─Sort(Probe) 9990.00 root test.t1.b", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1_2, v1@sel_1 .@sel_2), merge_join(t1@qb_v1_2), stream_agg(@qb_v1_2), qb_name(qb_v1_1, v1@sel_1 .@sel_1), merge_join(t@qb_v1_1) */ * from v1;", + "Plan": [ + "MergeJoin 9980.01 root inner join, left key:test.t.a, right key:Column#17", + "├─Sort(Build) 7984.01 root Column#17", + "│ └─StreamAgg 7984.01 root group by:test.t.a, funcs:count(1)->Column#17", + "│ └─Sort 12475.01 root test.t.a", + "│ └─MergeJoin 12475.01 root inner join, left key:test.t1.b, right key:test.t.b", + "│ ├─Sort(Build) 9980.01 root test.t.b", + "│ │ └─HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#16)]", + "│ │ ├─HashAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#16", + "│ │ │ └─HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t2.b)]", + "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ │ └─TableReader(Probe) 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─Sort(Probe) 9990.00 root test.t1.b", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─Sort(Probe) 9990.00 root test.t.a", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1_2, v2@sel_1 . v1@sel_2 .@sel_2), merge_join(t1@qb_v1_2) */ * from v2;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#24)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#24", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#23)]", + "│ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#23", + "│ │ └─MergeJoin 12475.01 root inner join, left key:test.t1.b, right key:test.t.b", + "│ │ ├─Sort(Build) 9980.01 root test.t.b", + "│ │ │ └─HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#22)]", + "│ │ │ ├─HashAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#22", + "│ │ │ │ └─HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t2.b)]", + "│ │ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ │ │ └─TableReader(Probe) 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ │ └─Sort(Probe) 9990.00 root test.t1.b", + "│ │ └─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", "│ ├─TableReader(Build) 9990.00 root data:Selection", "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", @@ -5385,7 +5059,132 @@ "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v .@sel_2), merge_join(t1@qb_v_2) */ * from v;", + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1_2, v2@sel_1 . v1@sel_2 .@sel_2), merge_join(t1@qb_v1_2), stream_agg(@qb_v1_2), qb_name(qb_v1_1, v2@sel_1 . v1@sel_2 .@sel_1), merge_join(t@qb_v1_1) */ * from v2;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#24)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#24", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t1.b, test.t.b)]", + "│ ├─MergeJoin(Build) 9980.01 root inner join, left key:test.t.a, right key:Column#23", + "│ │ ├─Sort(Build) 7984.01 root Column#23", + "│ │ │ └─StreamAgg 7984.01 root group by:test.t.a, funcs:count(1)->Column#23", + "│ │ │ └─Sort 12475.01 root test.t.a", + "│ │ │ └─MergeJoin 12475.01 root inner join, left key:test.t1.b, right key:test.t.b", + "│ │ │ ├─Sort(Build) 9980.01 root test.t.b", + "│ │ │ │ └─HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#22)]", + "│ │ │ │ ├─HashAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#22", + "│ │ │ │ │ └─HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t2.b)]", + "│ │ │ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ │ │ │ └─TableReader(Probe) 9990.00 root data:Selection", + "│ │ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + "│ │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ │ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ │ │ └─Sort(Probe) 9990.00 root test.t1.b", + "│ │ │ └─TableReader 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ └─Sort(Probe) 9980.01 root test.t.a", + "│ │ └─TableReader 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v2_2, v2@sel_1 .@sel_2), merge_join(t1@qb_v2_2) */ * from v2;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#24)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#24", + "│ └─MergeJoin 12475.01 root inner join, left key:test.t1.b, right key:test.t.b", + "│ ├─Sort(Build) 9980.01 root test.t.b", + "│ │ └─HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#23)]", + "│ │ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#23", + "│ │ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#22)]", + "│ │ │ ├─HashAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#22", + "│ │ │ │ └─HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t2.b)]", + "│ │ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ │ │ └─TableReader(Probe) 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─Sort(Probe) 9990.00 root test.t1.b", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v2_2, v2@sel_1 .@sel_2), merge_join(t1@qb_v2_2), stream_agg(@qb_v2_2), qb_name(qb_v2_1, v2), merge_join(t@qb_v2_1) */ * from v2;", + "Plan": [ + "MergeJoin 9980.01 root inner join, left key:test.t.a, right key:Column#24", + "├─Sort(Build) 7984.01 root Column#24", + "│ └─StreamAgg 7984.01 root group by:test.t.a, funcs:count(1)->Column#24", + "│ └─Sort 12475.01 root test.t.a", + "│ └─MergeJoin 12475.01 root inner join, left key:test.t1.b, right key:test.t.b", + "│ ├─Sort(Build) 9980.01 root test.t.b", + "│ │ └─HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#23)]", + "│ │ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#23", + "│ │ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#22)]", + "│ │ │ ├─HashAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#22", + "│ │ │ │ └─HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t2.b)]", + "│ │ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ │ │ └─TableReader(Probe) 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─Sort(Probe) 9990.00 root test.t1.b", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─Sort(Probe) 9990.00 root test.t.a", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + } + ] + }, + { + "Name": "TestViewHintScope", + "Cases": [ + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v, v@sel_1 .@sel_2), qb_name(qb_v, v@sel_1 .@sel_1), merge_join(t1@qb_v) */ * from v;", "Plan": [ "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#13)]", "├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#13", @@ -5406,142 +5205,1506 @@ " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], + "Warn": [ + "Duplicate query block name qb_v for view's query block hint, only the first one is effective" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v, v1@sel_1 .v@sel_2 .@sel_2), qb_name(qb_v, v1@sel_1 .v@sel_2 .@sel_1), merge_join(t1@qb_v) */ * from v1;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#20)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#20", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#19)]", + "│ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#19", + "│ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t2.a)]", + "│ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ │ └─MergeJoin(Probe) 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", + "│ │ ├─Sort(Build) 9980.01 root test.t2.b", + "│ │ │ └─TableReader 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ └─Sort(Probe) 9990.00 root test.t1.b", + "│ │ └─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "Duplicate query block name qb_v for view's query block hint, only the first one is effective" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v, v2@sel_1 .v1@sel_2 .v@sel_2 .@sel_2), qb_name(qb_v, v2@sel_1 .v1@sel_2 .v@sel_2 .@sel_1), merge_join(t1@qb_v) */ * from v2;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#27)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#27", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#26)]", + "│ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#26", + "│ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#25)]", + "│ │ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#25", + "│ │ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t2.a)]", + "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ │ │ └─MergeJoin(Probe) 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", + "│ │ │ ├─Sort(Build) 9980.01 root test.t2.b", + "│ │ │ │ └─TableReader 9980.01 root data:Selection", + "│ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ │ └─Sort(Probe) 9990.00 root test.t1.b", + "│ │ │ └─TableReader 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "Duplicate query block name qb_v for view's query block hint, only the first one is effective" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1_2, v@sel_1 .@sel_2), merge_join(t1@qb_v1_2) */ * from v1;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#20)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#20", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#19)]", + "│ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#19", + "│ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", + "│ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + "│ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "The qb_name hint qb_v1_2 is unused, please check whether the table list in the qb_name hint qb_v1_2 is correct" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1_2, v2@sel_1 . v@sel_1 .@sel_2), merge_join(t1@qb_v1_2) */ * from v2;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#27)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#27", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#26)]", + "│ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#26", + "│ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#25)]", + "│ │ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#25", + "│ │ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", + "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "The qb_name hint qb_v1_2 is unused, please check whether the table list in the qb_name hint qb_v1_2 is correct" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v2_2, vv@sel_1 .@sel_2), merge_join(t1@qb_v2_2) */ * from v2 vv;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#27)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#27", + "│ └─MergeJoin 12475.01 root inner join, left key:test.t1.b, right key:test.t.b", + "│ ├─Sort(Build) 9980.01 root test.t.b", + "│ │ └─HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#26)]", + "│ │ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#26", + "│ │ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#25)]", + "│ │ │ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#25", + "│ │ │ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", + "│ │ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ │ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + "│ │ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ │ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─Sort(Probe) 9990.00 root test.t1.b", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v2_2, v2@sel_1 .@sel_2), merge_join(t1@qb_v2_2) */ * from v2 vv;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#27)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#27", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#26)]", + "│ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#26", + "│ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#25)]", + "│ │ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#25", + "│ │ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", + "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "The qb_name hint qb_v2_2 is unused, please check whether the table list in the qb_name hint qb_v2_2 is correct" + ] + }, + { + "SQL": "explain format = 'brief' select * from (select /*+ qb_name(qb_v_2, v@sel_1 .@sel_2), merge_join(t1@qb_v_2) */ * from v) t;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#13)]", + "├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#13", + "│ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "The qb_name hint qb_v_2 is unused, please check whether the table list in the qb_name hint qb_v_2 is correct" + ] + }, + { + "SQL": "explain format = 'brief' select * from (select /*+ qb_name(qb_v_2, v.@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v@sel_1 .@sel1), merge_join(t@qb_v_1) */ * from v) t;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#13)]", + "├─StreamAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#13", + "│ └─Sort 15593.77 root test.t2.a", + "│ └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t2.a)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ └─MergeJoin(Probe) 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", + "│ ├─Sort(Build) 9980.01 root test.t2.b", + "│ │ └─TableReader 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ └─Sort(Probe) 9990.00 root test.t1.b", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "The qb_name hint qb_v_1 is unused, please check whether the table list in the qb_name hint qb_v_1 is correct" + ] + }, + { + "SQL": "explain format = 'brief' select * from (select /*+ qb_name(qb_v_2, v1@sel_1 . v@sel_2 .@sel_2), merge_join(t1@qb_v_2) */ * from v1) t;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#20)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#20", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#19)]", + "│ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#19", + "│ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", + "│ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + "│ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "The qb_name hint qb_v_2 is unused, please check whether the table list in the qb_name hint qb_v_2 is correct" + ] + }, + { + "SQL": "explain format = 'brief' select * from (select /*+ qb_name(qb_v_2, v1.v@sel_2 .@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v1@sel_1 . v@sel_2 .@sel_1), merge_join(t@qb_v_1) */ * from v1) t;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#20)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#20", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#19)]", + "│ ├─StreamAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#19", + "│ │ └─Sort 15593.77 root test.t2.a", + "│ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t2.a)]", + "│ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ │ └─MergeJoin(Probe) 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", + "│ │ ├─Sort(Build) 9980.01 root test.t2.b", + "│ │ │ └─TableReader 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ └─Sort(Probe) 9990.00 root test.t1.b", + "│ │ └─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "The qb_name hint qb_v_1 is unused, please check whether the table list in the qb_name hint qb_v_1 is correct" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v@sel_2 .@sel_2) */ * from (select /*+ merge_join(t1@qb_v_2) */ * from v) t;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#13)]", + "├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#13", + "│ └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t2.a)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ └─MergeJoin(Probe) 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", + "│ ├─Sort(Build) 9980.01 root test.t2.b", + "│ │ └─TableReader 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ └─Sort(Probe) 9990.00 root test.t1.b", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v@sel_2 .@sel_2), qb_name(qb_v_1, v@sel_2 .@sel1) */ * from (select /*+ merge_join(t1@qb_v_2), stream_agg(@qb_v_2), merge_join(t@qb_v_1) */ * from v) t;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#13)]", + "├─StreamAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#13", + "│ └─Sort 15593.77 root test.t2.a", + "│ └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t2.a)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ └─MergeJoin(Probe) 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", + "│ ├─Sort(Build) 9980.01 root test.t2.b", + "│ │ └─TableReader 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ └─Sort(Probe) 9990.00 root test.t1.b", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "The qb_name hint qb_v_1 is unused, please check whether the table list in the qb_name hint qb_v_1 is correct" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v1@sel_2 . v@sel_2 .@sel_2) */ * from (select /*+ merge_join(t1@qb_v_2) */ * from v1) t;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#20)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#20", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#19)]", + "│ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#19", + "│ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t2.a)]", + "│ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ │ └─MergeJoin(Probe) 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", + "│ │ ├─Sort(Build) 9980.01 root test.t2.b", + "│ │ │ └─TableReader 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ └─Sort(Probe) 9990.00 root test.t1.b", + "│ │ └─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v1@sel_2 . v@sel_2 .@sel_2), qb_name(qb_v_1, v1@sel_2 . v@sel_2 .@sel_1) */ * from (select /*+ merge_join(t1@qb_v_2), stream_agg(@qb_v_2), merge_join(t@qb_v_1) */ * from v1) t;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#20)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#20", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t1.b, test.t.b)]", + "│ ├─MergeJoin(Build) 9980.01 root inner join, left key:test.t.a, right key:Column#19", + "│ │ ├─Sort(Build) 7984.01 root Column#19", + "│ │ │ └─StreamAgg 7984.01 root group by:test.t2.a, funcs:count(1)->Column#19", + "│ │ │ └─Sort 15593.77 root test.t2.a", + "│ │ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t2.a)]", + "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ │ │ └─MergeJoin(Probe) 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", + "│ │ │ ├─Sort(Build) 9980.01 root test.t2.b", + "│ │ │ │ └─TableReader 9980.01 root data:Selection", + "│ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ │ └─Sort(Probe) 9990.00 root test.t1.b", + "│ │ │ └─TableReader 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ └─Sort(Probe) 9980.01 root test.t.a", + "│ │ └─TableReader 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1_2, v2. v1@sel_2 .@sel_2), qb_name(qb_v1_1, v2@sel_1 . v1@sel_2 .@sel_1), merge_join(t1@qb_v1_2, t@qb_v1_1), merge_join(t1@qb_v1_2) */ * from v2;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#27)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#27", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#26)]", + "│ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#26", + "│ │ └─MergeJoin 12475.01 root inner join, left key:test.t1.b, right key:test.t.b", + "│ │ ├─Sort(Build) 9980.01 root test.t.b", + "│ │ │ └─HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#25)]", + "│ │ │ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#25", + "│ │ │ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", + "│ │ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ │ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + "│ │ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ │ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ │ └─Sort(Probe) 9990.00 root test.t1.b", + "│ │ └─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "Only one query block name is allowed in a view hint, otherwise the hint will be invalid" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v2@sel_1 . v1@sel_2 . v@sel_2 .@sel_2), qb_name(qb_v_1, v2@sel_1 . v1@sel_2 . v@sel_2 .@sel_1), merge_join(t1@qb_v_2, t3@qb_v_2) */ * from v2;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#27)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#27", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#26)]", + "│ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#26", + "│ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#25)]", + "│ │ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#25", + "│ │ │ └─MergeJoin 15593.77 root inner join, left key:test.t2.a, right key:test.t3.a", + "│ │ │ ├─Sort(Build) 9990.00 root test.t3.a", + "│ │ │ │ └─TableReader 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ │ │ └─Sort(Probe) 12475.01 root test.t2.a", + "│ │ │ └─MergeJoin 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", + "│ │ │ ├─Sort(Build) 9980.01 root test.t2.b", + "│ │ │ │ └─TableReader 9980.01 root data:Selection", + "│ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ │ └─Sort(Probe) 9990.00 root test.t1.b", + "│ │ │ └─TableReader 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v2@sel_1 . v1@sel_2 . v@sel_2 .@sel_2), qb_name(qb_v_1, v2@sel_1 . v1@sel_2 . v@sel_2 .@sel_1), merge_join(@qb_v_2 t1, t3) */ * from v2;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#27)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#27", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#26)]", + "│ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#26", + "│ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#25)]", + "│ │ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#25", + "│ │ │ └─MergeJoin 15593.77 root inner join, left key:test.t2.a, right key:test.t3.a", + "│ │ │ ├─Sort(Build) 9990.00 root test.t3.a", + "│ │ │ │ └─TableReader 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ │ │ └─Sort(Probe) 12475.01 root test.t2.a", + "│ │ │ └─MergeJoin 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", + "│ │ │ ├─Sort(Build) 9980.01 root test.t2.b", + "│ │ │ │ └─TableReader 9980.01 root data:Selection", + "│ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ │ └─Sort(Probe) 9990.00 root test.t1.b", + "│ │ │ └─TableReader 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v .@sel_2), merge_join(t1@qb_v_2) */ * from v;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#13)]", + "├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#13", + "│ └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t2.a)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ └─MergeJoin(Probe) 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", + "│ ├─Sort(Build) 9980.01 root test.t2.b", + "│ │ └─TableReader 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ └─Sort(Probe) 9990.00 root test.t1.b", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_1, v@sel_1), merge_join(t@qb_v_1) */ * from v;", + "Plan": [ + "MergeJoin 9980.01 root inner join, left key:test.t.a, right key:Column#13", + "├─Sort(Build) 7984.01 root Column#13", + "│ └─HashAgg 7984.01 root group by:test.t2.a, funcs:count(1)->Column#13", + "│ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─Sort(Probe) 9990.00 root test.t.a", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v1 .v@sel_2 .@sel_2), merge_join(t1@qb_v_2) */ * from v1;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#20)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#20", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#19)]", + "│ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#19", + "│ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t2.a)]", + "│ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ │ └─MergeJoin(Probe) 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", + "│ │ ├─Sort(Build) 9980.01 root test.t2.b", + "│ │ │ └─TableReader 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ └─Sort(Probe) 9990.00 root test.t1.b", + "│ │ └─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_1, v1 .v@sel_2), merge_join(t@qb_v_1) */ * from v1;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#20)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#20", + "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t1.b, test.t.b)]", + "│ ├─MergeJoin(Build) 9980.01 root inner join, left key:test.t.a, right key:Column#19", + "│ │ ├─Sort(Build) 7984.01 root Column#19", + "│ │ │ └─HashAgg 7984.01 root group by:test.t2.a, funcs:count(1)->Column#19", + "│ │ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", + "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ └─Sort(Probe) 9980.01 root test.t.a", + "│ │ └─TableReader 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ merge_join(t1@qb_v_2), qb_name(qb_v_2, v@sel_1 .@sel_2) */ * from v;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#13)]", + "├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#13", + "│ └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t2.a)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ └─MergeJoin(Probe) 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", + "│ ├─Sort(Build) 9980.01 root test.t2.b", + "│ │ └─TableReader 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ └─Sort(Probe) 9990.00 root test.t1.b", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ merge_join(t@qb_v_1), stream_agg(@qb_v_2), qb_name(qb_v_2, v@sel_1 .@sel_2), qb_name(qb_v_1, v@sel_1 .@sel_1) */ * from v;", + "Plan": [ + "MergeJoin 9980.01 root inner join, left key:test.t.a, right key:Column#13", + "├─Sort(Build) 7984.01 root Column#13", + "│ └─StreamAgg 7984.01 root group by:test.t2.a, funcs:count(1)->Column#13", + "│ └─Sort 15593.77 root test.t2.a", + "│ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─Sort(Probe) 9990.00 root test.t.a", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v3_2, v3@sel_1 .@sel_2), merge_join(t1@qb_v3_2) */ * from v3;", + "Plan": [ + "MergeJoin 9980.01 root inner join, left key:test.t.a, right key:Column#27", + "├─Sort(Build) 7984.01 root Column#27", + "│ └─StreamAgg 7984.01 root group by:test.t.a, funcs:count(1)->Column#27", + "│ └─Sort 12475.01 root test.t.a", + "│ └─MergeJoin 12475.01 root inner join, left key:test.t1.b, right key:test.t.b", + "│ ├─Sort(Build) 9980.01 root test.t.b", + "│ │ └─HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#26)]", + "│ │ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#26", + "│ │ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#25)]", + "│ │ │ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#25", + "│ │ │ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", + "│ │ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ │ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + "│ │ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ │ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─Sort(Probe) 9990.00 root test.t1.b", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─Sort(Probe) 9990.00 root test.t.a", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v3_2, v3@sel_1 .@sel_2), merge_join(t1@qb_v3_2), hash_agg(@qb_v3_2), qb_name(qb_v3_1, v3@sel_1 .@sel_1), hash_join(t@qb_v3_1) */ * from v3;", + "Plan": [ + "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#27)]", + "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#27", + "│ └─MergeJoin 12475.01 root inner join, left key:test.t1.b, right key:test.t.b", + "│ ├─Sort(Build) 9980.01 root test.t.b", + "│ │ └─HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#26)]", + "│ │ ├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#26", + "│ │ │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#25)]", + "│ │ │ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#25", + "│ │ │ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", + "│ │ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ │ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + "│ │ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ │ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ │ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ │ └─TableReader(Probe) 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─Sort(Probe) 9990.00 root test.t1.b", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]Join hints are conflict, you can only specify one type of join", + "[planner:1815]Optimizer aggregation hints are conflicted" + ] + }, + { + "SQL": "explain with d1 as (\n select a from (\n select a from (\n select /*+ qb_name(qb, v4) use_index(t4@qb, idx_a) */ a from v4 where a < 10\n ) as t0 where a < 9\n ) as t1 where a < 8\n), d2 as (select /*+ qb_name(qb2, v4) use_index(t4@qb2, idx_b) */ a from v4 where b < 10)\n\nselect * from (select * from d1) as t0 join (select * from d2) as t1;", + "Plan": [ + "HashJoin_41 6944.44 root CARTESIAN inner join", + "├─IndexLookUp_50(Build) 83.33 root ", + "│ ├─IndexRangeScan_47(Build) 250.00 cop[tikv] table:t4, index:idx_b(b) range:(3,10), keep order:false, stats:pseudo", + "│ └─Selection_49(Probe) 83.33 cop[tikv] gt(test.t4.a, 2)", + "│ └─TableRowIDScan_48 250.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + "└─IndexLookUp_46(Probe) 83.33 root ", + " ├─IndexRangeScan_43(Build) 250.00 cop[tikv] table:t4, index:idx_a(a) range:(2,8), keep order:false, stats:pseudo", + " └─Selection_45(Probe) 83.33 cop[tikv] gt(test.t4.b, 3)", + " └─TableRowIDScan_44 250.00 cop[tikv] table:t4 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain with d1 as (\n select a from (\n select a from (\n select a from v4 where a < 10\n ) as t0 where a < 9\n ) as t1 where a < 8\n), d2 as (select a from v4 where b < 10)\n\nselect /*+ qb_name(qb, v4@sel_4) use_index(t4@qb, idx_a) qb_name(qb2, v4@sel_5) use_index(t4@qb, idx_b) */ * from (select * from d1) as t0 join (select * from d2) as t1;", + "Plan": [ + "HashJoin_41 6944.44 root CARTESIAN inner join", + "├─TableReader_53(Build) 83.33 root data:Selection_52", + "│ └─Selection_52 83.33 cop[tikv] gt(test.t4.a, 2), gt(test.t4.b, 3), lt(test.t4.b, 10)", + "│ └─TableFullScan_51 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + "└─IndexLookUp_46(Probe) 83.33 root ", + " ├─IndexRangeScan_43(Build) 250.00 cop[tikv] table:t4, index:idx_a(a) range:(2,8), keep order:false, stats:pseudo", + " └─Selection_45(Probe) 83.33 cop[tikv] gt(test.t4.b, 3)", + " └─TableRowIDScan_44 250.00 cop[tikv] table:t4 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain with d1 as (\n select a from (\n select a from (\n select /*+ qb_name(qb, v5) use_index(t4@qb, idx_a) */ a from v4 where a < 10\n ) as t0 where a < 9\n ) as t1 where a < 8\n), d2 as (select /*+ qb_name(qb2, v4) use_index(t4@qb2, idx_b) */ a from v4 where b < 10)\n\nselect * from (select * from d1) as t0 join (select * from d2) as t1;", + "Plan": [ + "HashJoin_41 6944.44 root CARTESIAN inner join", + "├─IndexLookUp_57(Build) 83.33 root ", + "│ ├─IndexRangeScan_54(Build) 250.00 cop[tikv] table:t4, index:idx_b(b) range:(3,10), keep order:false, stats:pseudo", + "│ └─Selection_56(Probe) 83.33 cop[tikv] gt(test.t4.a, 2)", + "│ └─TableRowIDScan_55 250.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + "└─TableReader_45(Probe) 83.33 root data:Selection_44", + " └─Selection_44 83.33 cop[tikv] gt(test.t4.a, 2), gt(test.t4.b, 3), lt(test.t4.a, 10), lt(test.t4.a, 8), lt(test.t4.a, 9)", + " └─TableFullScan_43 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" + ], + "Warn": [ + "The qb_name hint qb is unused, please check whether the table list in the qb_name hint qb is correct" + ] + } + ] + }, + { + "Name": "TestAllViewHintType", + "Cases": [ + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1, v1), leading(@qb_v1 v, t2) */ * from v1;", + "Plan": [ + "HashJoin 19492.21 root inner join, equal:[eq(test.t.a, test.t1.a)]", + "├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:false, stats:pseudo", + "└─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t3.a, test.t.a)]", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t2.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1, v1), leading(v@qb_v1, t2@qb_v1) */ * from v1;", + "Plan": [ + "HashJoin 19492.21 root inner join, equal:[eq(test.t.a, test.t1.a)]", + "├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:false, stats:pseudo", + "└─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t3.a, test.t.a)]", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t2.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1, v1), leading(@qb_v1 t3, t2) */ * from v1;", + "Plan": [ + "HashJoin 19492.21 root inner join, equal:[eq(test.t.a, test.t1.a)]", + "├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:false, stats:pseudo", + "└─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t3.a, test.t.a)]", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t2.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1, v1), leading(t3@qb_v1, t2@qb_v1) */ * from v1;", + "Plan": [ + "HashJoin 19492.21 root inner join, equal:[eq(test.t.a, test.t1.a)]", + "├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:false, stats:pseudo", + "└─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t3.a, test.t.a)]", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t2.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1, v1), qb_name(qb_v, v1.v), leading(t2@qb_v1, t@qb_v) */ * from v1;", + "Plan": [ + "HashJoin 19492.21 root inner join, equal:[eq(test.t.a, test.t1.a)]", + "├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:false, stats:pseudo", + "└─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t3.a, test.t.a)]", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t2.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warn": [ + "Only one query block name is allowed in a view hint, otherwise the hint will be invalid" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1, v1), hash_join(@qb_v1 v, t2) */ * from v1;", + "Plan": [ + "HashJoin 19492.21 root inner join, equal:[eq(test.t3.a, test.t.a)]", + "├─MergeJoin(Build) 12500.00 root inner join, left key:test.t.a, right key:test.t1.a", + "│ ├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ │ └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo", + "│ └─IndexReader(Probe) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:t, index:idx_a(a) keep order:true, stats:pseudo", + "└─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1, v1), hash_join(t2@qb_v1, t3@qb_v1) */ * from v1;", + "Plan": [ + "HashJoin 19492.21 root inner join, equal:[eq(test.t.a, test.t3.a)]", + "├─MergeJoin(Build) 12500.00 root inner join, left key:test.t.a, right key:test.t1.a", + "│ ├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ │ └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo", + "│ └─IndexReader(Probe) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:t, index:idx_a(a) keep order:true, stats:pseudo", + "└─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1, v1), hash_join_build(@qb_v1 v) */ * from v1;", + "Plan": [ + "HashJoin 19492.21 root inner join, equal:[eq(test.t3.a, test.t.a)]", + "├─MergeJoin(Build) 12500.00 root inner join, left key:test.t.a, right key:test.t1.a", + "│ ├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ │ └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo", + "│ └─IndexReader(Probe) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:t, index:idx_a(a) keep order:true, stats:pseudo", + "└─Projection(Probe) 12475.01 root test.t2.a, test.t2.b, test.t3.a", + " └─HashJoin 12475.01 root inner join, equal:[eq(test.t3.b, test.t2.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1, v1), hash_join_build(t2@qb_v1) */ * from v1;", + "Plan": [ + "HashJoin 19492.21 root inner join, equal:[eq(test.t.a, test.t3.a)]", + "├─MergeJoin(Build) 12500.00 root inner join, left key:test.t.a, right key:test.t1.a", + "│ ├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ │ └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo", + "│ └─IndexReader(Probe) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:t, index:idx_a(a) keep order:true, stats:pseudo", + "└─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9980.01 root data:Selection", + " └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1, v1), hash_join_build(@qb_v1 v) */ * from v1;", + "Plan": [ + "HashJoin 19492.21 root inner join, equal:[eq(test.t3.a, test.t.a)]", + "├─MergeJoin(Build) 12500.00 root inner join, left key:test.t.a, right key:test.t1.a", + "│ ├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ │ └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo", + "│ └─IndexReader(Probe) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:t, index:idx_a(a) keep order:true, stats:pseudo", + "└─Projection(Probe) 12475.01 root test.t2.a, test.t2.b, test.t3.a", + " └─HashJoin 12475.01 root inner join, equal:[eq(test.t3.b, test.t2.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1, v1), hash_join_build(t2@qb_v1) */ * from v1;", + "Plan": [ + "HashJoin 19492.21 root inner join, equal:[eq(test.t.a, test.t3.a)]", + "├─MergeJoin(Build) 12500.00 root inner join, left key:test.t.a, right key:test.t1.a", + "│ ├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ │ └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo", + "│ └─IndexReader(Probe) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:t, index:idx_a(a) keep order:true, stats:pseudo", + "└─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9980.01 root data:Selection", + " └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1, v1), merge_join(@qb_v1 v) */ * from v1;", + "Plan": [ + "MergeJoin 19492.21 root inner join, left key:test.t3.a, right key:test.t.a", + "├─MergeJoin(Build) 12500.00 root inner join, left key:test.t.a, right key:test.t1.a", + "│ ├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ │ └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo", + "│ └─IndexReader(Probe) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:t, index:idx_a(a) keep order:true, stats:pseudo", + "└─Sort(Probe) 12475.01 root test.t3.a", + " └─Projection 12475.01 root test.t2.a, test.t2.b, test.t3.a", + " └─HashJoin 12475.01 root inner join, equal:[eq(test.t3.b, test.t2.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v1, v1), merge_join(t2@qb_v1) */ * from v1;", + "Plan": [ + "HashJoin 19492.21 root inner join, equal:[eq(test.t.a, test.t3.a)]", + "├─MergeJoin(Build) 12500.00 root inner join, left key:test.t.a, right key:test.t1.a", + "│ ├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ │ └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo", + "│ └─IndexReader(Probe) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:t, index:idx_a(a) keep order:true, stats:pseudo", + "└─MergeJoin(Probe) 12475.01 root inner join, left key:test.t2.b, right key:test.t3.b", + " ├─Sort(Build) 9980.01 root test.t3.b", + " │ └─TableReader 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─Sort(Probe) 9990.00 root test.t2.b", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v, v), INL_JOIN(@qb_v t) */ * from v;", + "Plan": [ + "IndexJoin 12500.00 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t.a, equal cond:eq(test.t1.a, test.t.a)", + "├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:false, stats:pseudo", + "└─IndexLookUp(Probe) 12500.00 root ", + " ├─IndexRangeScan(Build) 12500.00 cop[tikv] table:t, index:idx_a(a) range: decided by [eq(test.t.a, test.t1.a)], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 12500.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v, v), INL_JOIN(t@qb_v) */ * from v;", + "Plan": [ + "IndexJoin 12500.00 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t.a, equal cond:eq(test.t1.a, test.t.a)", + "├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:false, stats:pseudo", + "└─IndexLookUp(Probe) 12500.00 root ", + " ├─IndexRangeScan(Build) 12500.00 cop[tikv] table:t, index:idx_a(a) range: decided by [eq(test.t.a, test.t1.a)], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 12500.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v2, v2.@sel_2), hash_agg(@qb_v2) */ * from v2;", + "Plan": [ + "HashJoin 9990.00 root inner join, equal:[eq(test.t.a, Column#19)]", + "├─HashAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#19", + "│ └─HashJoin 24365.26 root inner join, equal:[eq(test.t.a, test.t1.a)]", + "│ ├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ │ └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 19492.21 root inner join, equal:[eq(test.t3.a, test.t.a)]", + "│ ├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t2.b)]", + "│ ├─TableReader(Build) 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v2, v2.@sel_2), stream_agg(@qb_v2) */ * from v2;", + "Plan": [ + "HashJoin 9990.00 root inner join, equal:[eq(test.t.a, Column#19)]", + "├─StreamAgg(Build) 7992.00 root group by:test.t2.a, funcs:count(1)->Column#19", + "│ └─Sort 24365.26 root test.t2.a", + "│ └─HashJoin 24365.26 root inner join, equal:[eq(test.t.a, test.t1.a)]", + "│ ├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ │ └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 19492.21 root inner join, equal:[eq(test.t3.a, test.t.a)]", + "│ ├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + "│ ├─TableReader(Build) 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t2.b)]", + "│ ├─TableReader(Build) 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v3, v3), use_index(t5@qb_v3, idx_a) */ * from v3;", + "Plan": [ + "IndexLookUp 1107.78 root ", + "├─IndexRangeScan(Build) 3333.33 cop[tikv] table:t5, index:idx_a(a) range:(1,+inf], keep order:false, stats:pseudo", + "└─Selection(Probe) 1107.78 cop[tikv] lt(test.t5.b, 2)", + " └─TableRowIDScan 3333.33 cop[tikv] table:t5 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v3, v3), use_index(@qb_v3 t5, idx_b) */ * from v3;", + "Plan": [ + "IndexLookUp 1107.78 root ", + "├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t5, index:idx_b(b) range:[-inf,2), keep order:false, stats:pseudo", + "└─Selection(Probe) 1107.78 cop[tikv] gt(test.t5.a, 1)", + " └─TableRowIDScan 3323.33 cop[tikv] table:t5 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v3, v3), force_index(t5@qb_v3, idx_a) */ * from v3;", + "Plan": [ + "IndexLookUp 1107.78 root ", + "├─IndexRangeScan(Build) 3333.33 cop[tikv] table:t5, index:idx_a(a) range:(1,+inf], keep order:false, stats:pseudo", + "└─Selection(Probe) 1107.78 cop[tikv] lt(test.t5.b, 2)", + " └─TableRowIDScan 3333.33 cop[tikv] table:t5 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v3, v3), force_index(@qb_v3 t5, idx_b) */ * from v3;", + "Plan": [ + "IndexLookUp 1107.78 root ", + "├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t5, index:idx_b(b) range:[-inf,2), keep order:false, stats:pseudo", + "└─Selection(Probe) 1107.78 cop[tikv] gt(test.t5.a, 1)", + " └─TableRowIDScan 3323.33 cop[tikv] table:t5 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v3, v3), ignore_index(t5@qb_v3, idx_a) */ * from v3;", + "Plan": [ + "TableReader 1107.78 root data:Selection", + "└─Selection 1107.78 cop[tikv] gt(test.t5.a, 1), lt(test.t5.b, 2)", + " └─TableFullScan 10000.00 cop[tikv] table:t5 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v3, v3), ignore_index(@qb_v3 t5, idx_b) */ * from v3;", + "Plan": [ + "TableReader 1107.78 root data:Selection", + "└─Selection 1107.78 cop[tikv] gt(test.t5.a, 1), lt(test.t5.b, 2)", + " └─TableFullScan 10000.00 cop[tikv] table:t5 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v4, v4), use_index_merge(t5@qb_v4, idx_a, idx_b) */ * from v4;", + "Plan": [ + "IndexMerge 5548.89 root type: union", + "├─IndexRangeScan(Build) 3333.33 cop[tikv] table:t5, index:idx_a(a) range:(1,+inf], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t5, index:idx_b(b) range:[-inf,2), keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 5548.89 cop[tikv] table:t5 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v4, v4), use_index_merge(@qb_v4 t5, idx_b, idx_a) */ * from v4;", + "Plan": [ + "IndexMerge 5548.89 root type: union", + "├─IndexRangeScan(Build) 3333.33 cop[tikv] table:t5, index:idx_a(a) range:(1,+inf], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t5, index:idx_b(b) range:[-inf,2), keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 5548.89 cop[tikv] table:t5 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v, v), READ_FROM_STORAGE(TIFLASH[t@qb_v], TIKV[t1@qb_v]) */ * from v;", + "Plan": [ + "HashJoin 12500.00 root inner join, equal:[eq(test.t.a, test.t1.a)]", + "├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v5, v5.@sel_2), SEMI_JOIN_REWRITE(@qb_v5) */ * from v5;", + "Plan": [ + "HashJoin 9990.00 root inner join, equal:[eq(test.t.b, test.t1.b)]", + "├─HashAgg(Build) 7992.00 root group by:test.t1.b, funcs:firstrow(test.t1.b)->test.t1.b", + "│ └─TableReader 7992.00 root data:HashAgg", + "│ └─HashAgg 7992.00 cop[tikv] group by:test.t1.b, ", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tiflash] not(isnull(test.t.b))", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v6, v6.@sel_2), NO_DECORRELATE(@qb_v6) */ * from v6;", + "Plan": [ + "Projection 10000.00 root test.t1.a, test.t1.b", + "└─Apply 10000.00 root CARTESIAN inner join, other cond:lt(cast(test.t1.a, decimal(10,0) BINARY), Column#7)", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─MaxOneRow(Probe) 10000.00 root ", + " └─StreamAgg 10000.00 root funcs:sum(Column#9)->Column#7", + " └─TableReader 10000.00 root data:StreamAgg", + " └─StreamAgg 10000.00 cop[tikv] funcs:sum(test.t2.a)->Column#9", + " └─Selection 100000.00 cop[tikv] eq(test.t2.b, test.t1.b)", + " └─TableFullScan 100000000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v7, v7), merge(@qb_v7) */ * from v7;", + "Plan": [ + "TableReader 3544.89 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 3544.89 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 3544.89 mpp[tiflash] Column#14, Column#15", + " └─HashAgg 3544.89 mpp[tiflash] group by:Column#14, Column#15, funcs:firstrow(Column#14)->Column#14, funcs:firstrow(Column#15)->Column#15", + " └─ExchangeReceiver 3544.89 mpp[tiflash] ", + " └─ExchangeSender 3544.89 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#14, collate: binary], [name: Column#15, collate: binary]", + " └─HashAgg 3544.89 mpp[tiflash] group by:Column#14, Column#15, ", + " └─Union 4431.11 mpp[tiflash] ", + " ├─Projection 3323.33 mpp[tiflash] cast(test.t.a, int(11) BINARY)->Column#14, test.t.b", + " │ └─Selection 3323.33 mpp[tiflash] lt(test.t.a, 18), lt(test.t.a, 60)", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─Projection 1107.78 mpp[tiflash] cast(test.t.a, int(11) BINARY)->Column#14, test.t.b", + " └─Selection 1107.78 mpp[tiflash] gt(test.t.b, 1), lt(test.t.a, 60)", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v8, v8), merge(@qb_v8) */ * from v8;", + "Plan": [ + "HashAgg 16000.00 root group by:Column#21, funcs:firstrow(Column#21)->Column#21", + "└─Union 1000000010000.00 root ", + " ├─HashJoin 1000000000000.00 root CARTESIAN inner join", + " │ ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " │ └─CTEFullScan(Probe) 100000000.00 root CTE:cte2 data:CTE_1", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "CTE_1 100000000.00 root Non-Recursive CTE", + "└─HashJoin(Seed Part) 100000000.00 root CARTESIAN inner join", + " ├─CTEFullScan(Build) 10000.00 root CTE:cte4 data:CTE_3", + " └─CTEFullScan(Probe) 10000.00 root CTE:cte3 data:CTE_2", + "CTE_3 10000.00 root Non-Recursive CTE", + "└─IndexReader(Seed Part) 10000.00 root index:IndexFullScan", + " └─IndexFullScan 10000.00 cop[tikv] table:t3, index:idx_a(a) keep order:false, stats:pseudo", + "CTE_2 10000.00 root Non-Recursive CTE", + "└─IndexReader(Seed Part) 10000.00 root index:IndexFullScan", + " └─IndexFullScan 10000.00 cop[tikv] table:t2, index:idx_a(a) keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v9, v9), AGG_TO_COP(@qb_v9) */ * from v9;", + "Plan": [ + "StreamAgg 1.00 root funcs:sum(Column#7)->Column#4", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:sum(Column#9)->Column#7", + " └─Projection 10000.00 batchCop[tiflash] cast(test.t.a, decimal(10,0) BINARY)->Column#9", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ], "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_1, v@sel_1), merge_join(t@qb_v_1) */ * from v;", + "SQL": "explain format = 'brief' select /*+ qb_name(qb_v10, v10), LIMIT_TO_COP(@qb_v10) */ * from v10;", "Plan": [ - "MergeJoin 9980.01 root inner join, left key:test.t.a, right key:Column#13", - "├─Sort(Build) 7984.01 root Column#13", - "│ └─HashAgg 7984.01 root group by:test.t2.a, funcs:count(1)->Column#13", - "│ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─Sort(Probe) 9990.00 root test.t.a", - " └─TableReader 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TopN 1.00 root test.t.b, offset:0, count:1", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", + " └─TopN 1.00 mpp[tiflash] test.t.b, offset:0, count:1", + " └─Selection 3333.33 mpp[tiflash] gt(test.t.a, 10)", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_2, v1 .v@sel_2 .@sel_2), merge_join(t1@qb_v_2) */ * from v1;", + "SQL": "explain format = 'brief' select /*+ qb_name(qb, v11) read_from_storage(tiflash[t@qb]), MPP_1PHASE_AGG(@qb) */ * from v11;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#20)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#20", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t.a, Column#19)]", - "│ ├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#19", - "│ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t2.a)]", - "│ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ │ └─MergeJoin(Probe) 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", - "│ │ ├─Sort(Build) 9980.01 root test.t2.b", - "│ │ │ └─TableReader 9980.01 root data:Selection", - "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ │ └─Sort(Probe) 9990.00 root test.t1.b", - "│ │ └─TableReader 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 mpp[tiflash] test.t.a, Column#4", + " └─Projection 8000.00 mpp[tiflash] Column#4, test.t.a", + " └─HashAgg 8000.00 mpp[tiflash] group by:Column#9, funcs:sum(Column#7)->Column#4, funcs:firstrow(Column#8)->test.t.a", + " └─Projection 10000.00 mpp[tiflash] cast(test.t.b, decimal(10,0) BINARY)->Column#7, test.t.a, test.t.a", + " └─ExchangeReceiver 10000.00 mpp[tiflash] ", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ qb_name(qb_v_1, v1 .v@sel_2), merge_join(t@qb_v_1) */ * from v1;", + "SQL": "explain format = 'brief' select /*+ qb_name(qb, v11) read_from_storage(tiflash[t@qb]), MPP_2PHASE_AGG(@qb) */ * from v11;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#20)]", - "├─HashAgg(Build) 7984.01 root group by:test.t.a, funcs:count(1)->Column#20", - "│ └─HashJoin 12475.01 root inner join, equal:[eq(test.t1.b, test.t.b)]", - "│ ├─MergeJoin(Build) 9980.01 root inner join, left key:test.t.a, right key:Column#19", - "│ │ ├─Sort(Build) 7984.01 root Column#19", - "│ │ │ └─HashAgg 7984.01 root group by:test.t2.a, funcs:count(1)->Column#19", - "│ │ │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", - "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ │ │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", - "│ │ │ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ │ │ └─TableReader(Probe) 9980.01 root data:Selection", - "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ │ └─Sort(Probe) 9980.01 root test.t.a", - "│ │ └─TableReader 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 mpp[tiflash] test.t.a, Column#4", + " └─Projection 8000.00 mpp[tiflash] Column#4, test.t.a", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, funcs:sum(Column#9)->Column#4, funcs:firstrow(test.t.a)->test.t.a", + " └─ExchangeReceiver 8000.00 mpp[tiflash] ", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " └─HashAgg 8000.00 mpp[tiflash] group by:Column#12, funcs:sum(Column#11)->Column#9", + " └─Projection 10000.00 mpp[tiflash] cast(test.t.b, decimal(10,0) BINARY)->Column#11, test.t.a", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ merge_join(t1@qb_v_2), qb_name(qb_v_2, v@sel_1 .@sel_2) */ * from v;", + "SQL": "explain format = 'brief' select /*+ qb_name(qb, v12) read_from_storage(tiflash[t1@qb, t@qb]), shuffle_join(t1@qb, t@qb) */ * from v12;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#13)]", - "├─HashAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#13", - "│ └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t2.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ └─MergeJoin(Probe) 12475.01 root inner join, left key:test.t1.b, right key:test.t2.b", - "│ ├─Sort(Build) 9980.01 root test.t2.b", - "│ │ └─TableReader 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ └─Sort(Probe) 9990.00 root test.t1.b", - "│ └─TableReader 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 12500.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 12500.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 12500.00 mpp[tiflash] test.t.a, test.t.b", + " └─HashJoin 12500.00 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 10000.00 mpp[tiflash] ", + " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 10000.00 mpp[tiflash] ", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "explain format = 'brief' select /*+ merge_join(t@qb_v_1), stream_agg(@qb_v_2), qb_name(qb_v_2, v@sel_1 .@sel_2), qb_name(qb_v_1, v@sel_1 .@sel1) */ * from v;", + "SQL": "explain format = 'brief' select /*+ qb_name(qb, v12) read_from_storage(tiflash[t1@qb, t@qb]), broadcast_join(t1@qb, t@qb) */ * from v12;", "Plan": [ - "HashJoin 9980.01 root inner join, equal:[eq(test.t.a, Column#13)]", - "├─StreamAgg(Build) 7984.01 root group by:test.t2.a, funcs:count(1)->Column#13", - "│ └─Sort 15593.77 root test.t2.a", - "│ └─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t3.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 12500.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 12500.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 12500.00 mpp[tiflash] test.t.a, test.t.b", + " └─HashJoin 12500.00 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 10000.00 mpp[tiflash] ", + " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─TableFullScan(Probe) 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" ], "Warn": null } @@ -5616,7 +6779,7 @@ { "SQL": "explain format = 'brief' select * from t where t.a = 1", "Result": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─TableRangeScan 1.00 mpp[tiflash] table:t range:[1,1], keep order:false, stats:pseudo" ] @@ -5624,7 +6787,7 @@ { "SQL": "explain format = 'brief' select * from t where t.a in (1, 2)", "Result": [ - "TableReader 2.00 root data:ExchangeSender", + "TableReader 2.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 2.00 mpp[tiflash] ExchangeType: PassThrough", " └─TableRangeScan 2.00 mpp[tiflash] table:t range:[1,1], [2,2], keep order:false, stats:pseudo" ] @@ -5637,7 +6800,7 @@ { "SQL": "explain format = 'brief' select * from t", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ], @@ -5646,7 +6809,7 @@ { "SQL": "explain format = 'brief' select * from t use index();", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ], @@ -5655,7 +6818,7 @@ { "SQL": "explain format = 'brief' select /*+ use_index(t, idx)*/ * from t", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ], @@ -5666,7 +6829,7 @@ { "SQL": "explain format = 'brief' select /*+ use_index(t)*/ * from t", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ], @@ -5955,7 +7118,7 @@ { "SQL": "desc format = 'brief' select i * 2 from t", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 10000.00 mpp[tiflash] mul(test.t.i, 2)->Column#13", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -5964,7 +7127,7 @@ { "SQL": "desc format = 'brief' select DATE_FORMAT(t, '%Y-%m-%d %H') as date from t", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 10000.00 mpp[tiflash] date_format(test.t.t, %Y-%m-%d %H)->Column#13", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -5991,7 +7154,7 @@ "SQL": "desc format = 'brief' select /*+ hash_agg()*/ count(b) from (select id + 1 as b from t)A", "Plan": [ "HashAgg 1.00 root funcs:count(Column#17)->Column#14", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(Column#19)->Column#17", " └─Projection 10000.00 mpp[tiflash] plus(test.t.id, 1)->Column#19", @@ -6002,9 +7165,9 @@ "SQL": "desc format = 'brief' select /*+ hash_agg()*/ count(*) from (select id + 1 as b from t)A", "Plan": [ "HashAgg 1.00 root funcs:count(Column#16)->Column#14", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#16", + " └─HashAgg 1.00 mpp[tiflash] funcs:count(test.t._tidb_rowid)->Column#16", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] }, @@ -6012,7 +7175,7 @@ "SQL": "desc format = 'brief' select /*+ hash_agg()*/ sum(b) from (select id + 1 as b from t)A", "Plan": [ "HashAgg 1.00 root funcs:sum(Column#17)->Column#14", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:sum(Column#19)->Column#17", " └─Projection 10000.00 mpp[tiflash] cast(plus(test.t.id, 1), decimal(20,0) BINARY)->Column#19", @@ -6022,39 +7185,36 @@ { "SQL": "desc format = 'brief' select /*+ stream_agg()*/ count(b) from (select id + 1 as b from t)A", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#18)->Column#14", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(Column#19)->Column#18", - " └─Projection 10000.00 mpp[tiflash] plus(test.t.id, 1)->Column#19", - " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + "StreamAgg 1.00 root funcs:count(Column#16)->Column#14", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:count(Column#19)->Column#16", + " └─Projection 10000.00 batchCop[tiflash] plus(test.t.id, 1)->Column#19", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ] }, { "SQL": "desc format = 'brief' select /*+ stream_agg()*/ count(*) from (select id + 1 as b from t)A", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#17)->Column#14", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#17", - " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + "StreamAgg 1.00 root funcs:count(Column#15)->Column#14", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:count(test.t._tidb_rowid)->Column#15", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ] }, { "SQL": "desc format = 'brief' select /*+ stream_agg()*/ sum(b) from (select id + 1 as b from t)A", "Plan": [ - "HashAgg 1.00 root funcs:sum(Column#18)->Column#14", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:sum(Column#19)->Column#18", - " └─Projection 10000.00 mpp[tiflash] cast(plus(test.t.id, 1), decimal(20,0) BINARY)->Column#19", - " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + "StreamAgg 1.00 root funcs:sum(Column#16)->Column#14", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:sum(Column#19)->Column#16", + " └─Projection 10000.00 batchCop[tiflash] cast(plus(test.t.id, 1), decimal(20,0) BINARY)->Column#19", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ] }, { "SQL": "desc format = 'brief' select * from (select id-2 as b from t) B join (select id-2 as b from t) A on A.b=B.b", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 10000.00 mpp[tiflash] inner join, equal:[eq(Column#13, Column#26)]", " ├─ExchangeReceiver(Build) 8000.00 mpp[tiflash] ", @@ -6071,7 +7231,7 @@ "SQL": "desc format = 'brief' select * from t join (select id-2 as b from t) A on A.b=t.id", "Plan": [ "HashJoin 10000.00 root inner join, equal:[eq(test.t.id, Column#25)]", - "├─TableReader(Build) 8000.00 root data:ExchangeSender", + "├─TableReader(Build) 8000.00 root MppVersion: 1, data:ExchangeSender", "│ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", "│ └─Projection 8000.00 mpp[tiflash] minus(test.t.id, 2)->Column#25", "│ └─Selection 8000.00 mpp[tiflash] not(isnull(minus(test.t.id, 2)))", @@ -6085,7 +7245,7 @@ "SQL": "desc format = 'brief' select * from t left join (select id-2 as b from t) A on A.b=t.id", "Plan": [ "HashJoin 10000.00 root left outer join, equal:[eq(test.t.id, Column#25)]", - "├─TableReader(Build) 8000.00 root data:ExchangeSender", + "├─TableReader(Build) 8000.00 root MppVersion: 1, data:ExchangeSender", "│ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", "│ └─Projection 8000.00 mpp[tiflash] minus(test.t.id, 2)->Column#25", "│ └─Selection 8000.00 mpp[tiflash] not(isnull(minus(test.t.id, 2)))", @@ -6098,7 +7258,7 @@ "SQL": "desc format = 'brief' select * from t right join (select id-2 as b from t) A on A.b=t.id", "Plan": [ "HashJoin 12487.50 root right outer join, equal:[eq(test.t.id, Column#25)]", - "├─TableReader(Build) 10000.00 root data:ExchangeSender", + "├─TableReader(Build) 10000.00 root MppVersion: 1, data:ExchangeSender", "│ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", "│ └─Projection 10000.00 mpp[tiflash] minus(test.t.id, 2)->Column#25", "│ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", @@ -6110,7 +7270,7 @@ { "SQL": "desc format = 'brief' select A.b, B.b from (select id-2 as b from t) B join (select id-2 as b from t) A on A.b=B.b", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 10000.00 mpp[tiflash] Column#26, Column#13", " └─HashJoin 10000.00 mpp[tiflash] inner join, equal:[eq(Column#13, Column#26)]", @@ -6127,7 +7287,7 @@ { "SQL": "desc format = 'brief' select A.id from t as A where exists (select 1 from t where t.id=A.id)", "Plan": [ - "TableReader 7992.00 root data:ExchangeSender", + "TableReader 7992.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 7992.00 mpp[tiflash] semi join, equal:[eq(test.t.id, test.t.id)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", @@ -6141,7 +7301,7 @@ { "SQL": "desc format = 'brief' select A.id from t as A where not exists (select 1 from t where t.id=A.id)", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 8000.00 mpp[tiflash] anti semi join, equal:[eq(test.t.id, test.t.id)]", " ├─ExchangeReceiver(Build) 10000.00 mpp[tiflash] ", @@ -6153,7 +7313,7 @@ { "SQL": "desc format = 'brief' SELECT FROM_UNIXTIME(name,'%Y-%m-%d') FROM t;", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 10000.00 mpp[tiflash] from_unixtime(cast(test.t.name, decimal(65,6) BINARY), %Y-%m-%d)->Column#13", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -6179,7 +7339,7 @@ "Plan": [ "HashAgg 1.00 root funcs:count(Column#7)->Column#6", "└─TableReader 1.00 root data:HashAgg", - " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#7", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(test.t._tidb_rowid)->Column#7", " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ] }, @@ -6208,7 +7368,7 @@ "Plan": [ "StreamAgg 1.00 root funcs:count(Column#7)->Column#6", "└─TableReader 1.00 root data:StreamAgg", - " └─StreamAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#7", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:count(test.t._tidb_rowid)->Column#7", " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ] }, @@ -6327,7 +7487,7 @@ "SQL": "desc format = 'brief' select /*+ hash_agg()*/ count(b) from (select id + 1 as b from t)A", "Plan": [ "HashAgg 1.00 root funcs:count(Column#9)->Column#6", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(Column#11)->Column#9", " └─Projection 10000.00 mpp[tiflash] plus(test.t.id, 1)->Column#11", @@ -6338,9 +7498,9 @@ "SQL": "desc format = 'brief' select /*+ hash_agg()*/ count(*) from (select id + 1 as b from t)A", "Plan": [ "HashAgg 1.00 root funcs:count(Column#8)->Column#6", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#8", + " └─HashAgg 1.00 mpp[tiflash] funcs:count(test.t._tidb_rowid)->Column#8", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] }, @@ -6348,7 +7508,7 @@ "SQL": "desc format = 'brief' select /*+ hash_agg()*/ sum(b) from (select id + 1 as b from t)A", "Plan": [ "HashAgg 1.00 root funcs:sum(Column#9)->Column#6", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:sum(Column#11)->Column#9", " └─Projection 10000.00 mpp[tiflash] cast(plus(test.t.id, 1), decimal(20,0) BINARY)->Column#11", @@ -6358,39 +7518,36 @@ { "SQL": "desc format = 'brief' select /*+ stream_agg()*/ count(b) from (select id + 1 as b from t)A", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#10)->Column#6", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(Column#11)->Column#10", - " └─Projection 10000.00 mpp[tiflash] plus(test.t.id, 1)->Column#11", - " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + "StreamAgg 1.00 root funcs:count(Column#8)->Column#6", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:count(Column#11)->Column#8", + " └─Projection 10000.00 batchCop[tiflash] plus(test.t.id, 1)->Column#11", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ] }, { "SQL": "desc format = 'brief' select /*+ stream_agg()*/ count(*) from (select id + 1 as b from t)A", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#9)->Column#6", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#9", - " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + "StreamAgg 1.00 root funcs:count(Column#7)->Column#6", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:count(test.t._tidb_rowid)->Column#7", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ] }, { "SQL": "desc format = 'brief' select /*+ stream_agg()*/ sum(b) from (select id + 1 as b from t)A", "Plan": [ - "HashAgg 1.00 root funcs:sum(Column#10)->Column#6", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:sum(Column#11)->Column#10", - " └─Projection 10000.00 mpp[tiflash] cast(plus(test.t.id, 1), decimal(20,0) BINARY)->Column#11", - " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + "StreamAgg 1.00 root funcs:sum(Column#8)->Column#6", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:sum(Column#11)->Column#8", + " └─Projection 10000.00 batchCop[tiflash] cast(plus(test.t.id, 1), decimal(20,0) BINARY)->Column#11", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ] }, { "SQL": "desc format = 'brief' select B.b+A.b from (select id-2 as b from t) B join (select id-2 as b from t) A on A.b=B.b", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 10000.00 mpp[tiflash] plus(Column#5, Column#10)->Column#11", " └─HashJoin 10000.00 mpp[tiflash] inner join, equal:[eq(Column#5, Column#10)]", @@ -6407,7 +7564,7 @@ { "SQL": "desc format = 'brief' select * from t join (select id-2 as b from t) A on A.b=t.id", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 10000.00 mpp[tiflash] inner join, equal:[eq(test.t.id, Column#9)]", " ├─ExchangeReceiver(Build) 8000.00 mpp[tiflash] ", @@ -6422,7 +7579,7 @@ { "SQL": "desc format = 'brief' select * from t left join (select id-2 as b from t) A on A.b=t.id", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 10000.00 mpp[tiflash] left outer join, equal:[eq(test.t.id, Column#9)]", " ├─ExchangeReceiver(Build) 8000.00 mpp[tiflash] ", @@ -6436,7 +7593,7 @@ { "SQL": "desc format = 'brief' select * from t right join (select id-2 as b from t) A on A.b=t.id", "Plan": [ - "TableReader 12487.50 root data:ExchangeSender", + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 12487.50 mpp[tiflash] right outer join, equal:[eq(test.t.id, Column#9)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", @@ -6450,7 +7607,7 @@ { "SQL": "desc format = 'brief' select A.b, B.b from (select id-2 as b from t) B join (select id-2 as b from t) A on A.b=B.b", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 10000.00 mpp[tiflash] Column#10, Column#5", " └─HashJoin 10000.00 mpp[tiflash] inner join, equal:[eq(Column#5, Column#10)]", @@ -6467,7 +7624,7 @@ { "SQL": "desc format = 'brief' select id from t as A where exists (select 1 from t where t.id=A.id)", "Plan": [ - "TableReader 7992.00 root data:ExchangeSender", + "TableReader 7992.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 7992.00 mpp[tiflash] semi join, equal:[eq(test.t.id, test.t.id)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", @@ -6481,7 +7638,7 @@ { "SQL": "desc format = 'brief' select id from t as A where not exists (select 1 from t where t.id=A.id)", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 8000.00 mpp[tiflash] anti semi join, equal:[eq(test.t.id, test.t.id)]", " ├─ExchangeReceiver(Build) 10000.00 mpp[tiflash] ", @@ -6494,13 +7651,13 @@ "SQL": "desc format = 'brief' select b*2, id from (select avg(value+2) as b, id from t group by id) C order by id", "Plan": [ "Sort 8000.00 root test.t.id", - "└─TableReader 8000.00 root data:ExchangeSender", + "└─TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] mul(Column#5, 2)->Column#6, test.t.id", " └─Projection 8000.00 mpp[tiflash] div(Column#5, cast(case(eq(Column#20, 0), 1, Column#20), decimal(20,0) BINARY))->Column#5, test.t.id", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:sum(Column#21)->Column#20, funcs:sum(Column#22)->Column#5, funcs:firstrow(test.t.id)->test.t.id", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#26, funcs:count(Column#24)->Column#21, funcs:sum(Column#25)->Column#22", " └─Projection 10000.00 mpp[tiflash] plus(test.t.value, 2)->Column#24, plus(test.t.value, 2)->Column#25, test.t.id", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -6509,7 +7666,7 @@ { "SQL": "desc format = 'brief' SELECT FROM_UNIXTIME(name,'%Y-%m-%d') FROM t;", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 10000.00 mpp[tiflash] from_unixtime(cast(test.t.name, decimal(65,6) BINARY), %Y-%m-%d)->Column#5", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -6523,13 +7680,13 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg()*/ count(*) c, id from t group by id having id >c", "Plan": [ - "TableReader 6400.00 root data:ExchangeSender", + "TableReader 6400.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: PassThrough", " └─Selection 6400.00 mpp[tiflash] gt(test.t.id, Column#5)", " └─Projection 8000.00 mpp[tiflash] Column#5, test.t.id", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:sum(Column#12)->Column#5, funcs:firstrow(test.t.id)->test.t.id", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:count(1)->Column#12", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] @@ -6537,7 +7694,7 @@ { "SQL": "desc format = 'brief' select * from t where id < 2", "Plan": [ - "TableReader 3323.33 root data:ExchangeSender", + "TableReader 3323.33 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 3323.33 mpp[tiflash] ExchangeType: PassThrough", " └─Selection 3323.33 mpp[tiflash] lt(test.t.id, 2)", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -6552,7 +7709,7 @@ "SQL": "explain format = 'brief' select count(*) from (select a , b from t union all select a , b from t1) tt", "Plan": [ "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", " └─Union 20000.00 mpp[tiflash] ", @@ -6566,7 +7723,7 @@ "SQL": "explain format = 'brief' select count(*) from (select a , b from t union all select a , b from t1 union all select a, b from t where false) tt", "Plan": [ "HashAgg 1.00 root funcs:count(Column#16)->Column#15", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#16", " └─Union 20000.00 mpp[tiflash] ", @@ -6580,7 +7737,7 @@ "SQL": "explain format = 'brief' select count(*) from (select a , b from t union all select a , c from t1) tt", "Plan": [ "HashAgg 1.00 root funcs:count(Column#14)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#14", " └─Union 20000.00 mpp[tiflash] ", @@ -6595,7 +7752,7 @@ "SQL": "explain format = 'brief' select count(*) from (select a , b from t union all select a , c from t1 where false) tt", "Plan": [ "HashAgg 1.00 root funcs:count(Column#14)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#14", " └─Union 10000.00 mpp[tiflash] ", @@ -6607,7 +7764,7 @@ { "SQL": "explain format = 'brief' select count(*) from (select a , b from t where false union all select a , c from t1 where false) tt", "Plan": [ - "HashAgg 1.00 root funcs:count(1)->Column#11", + "StreamAgg 1.00 root funcs:count(1)->Column#11", "└─Union 0.00 root ", " ├─Projection 0.00 root test.t.a, cast(test.t.b, double BINARY)->Column#10", " │ └─TableDual 0.00 root rows:0", @@ -6623,17 +7780,17 @@ { "SQL": "desc format = 'brief' select t1.c1, t1.c2, t2.c1, t2.c2, t2.c3 from t t1 join t t2 on t1.c1 + 1 = t2.c2 - 10 and t1.c1 * 3 = t2.c3 / 2", "Plan": [ - "TableReader 12500.00 root data:ExchangeSender", + "TableReader 12500.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 12500.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 12500.00 mpp[tiflash] test.t.c1, test.t.c2, test.t.c1, test.t.c2, test.t.c3", " └─HashJoin 12500.00 mpp[tiflash] inner join, equal:[eq(Column#13, Column#14) eq(Column#15, Column#16)]", " ├─ExchangeReceiver(Build) 10000.00 mpp[tiflash] ", - " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#23, collate: binary], [name: Column#24, collate: binary]", + " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#23, collate: binary], [name: Column#24, collate: binary]", " │ └─Projection 10000.00 mpp[tiflash] test.t.c1, test.t.c2, Column#13, Column#15, cast(Column#13, decimal(13,8) BINARY)->Column#23, cast(Column#15, decimal(10,5) BINARY)->Column#24", " │ └─Projection 10000.00 mpp[tiflash] test.t.c1, test.t.c2, mul(test.t.c1, 3)->Column#13, plus(test.t.c1, 1)->Column#15", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 10000.00 mpp[tiflash] ", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#14, collate: binary], [name: Column#16, collate: binary]", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#14, collate: binary], [name: Column#16, collate: binary]", " └─Projection 10000.00 mpp[tiflash] test.t.c1, test.t.c2, test.t.c3, div(test.t.c3, 2)->Column#14, minus(test.t.c2, 10)->Column#16", " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" ] @@ -6641,27 +7798,27 @@ { "SQL": "desc format = 'brief' select * from (select c1, c2, c5, count(*) c from t group by c1, c2, c5) t1 join (select c1, c2, c3, count(*) c from t group by c1, c2, c3) t2 on t1.c1 = t2.c2 and t1.c2 = t2.c3 and t1.c5 = t2.c1", "Plan": [ - "TableReader 7976.02 root data:ExchangeSender", + "TableReader 7976.02 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 7976.02 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 7976.02 mpp[tiflash] test.t.c1, test.t.c2, test.t.c5, Column#7, test.t.c1, test.t.c2, test.t.c3, Column#14", " └─HashJoin 7976.02 mpp[tiflash] inner join, equal:[eq(test.t.c1, test.t.c2) eq(test.t.c2, test.t.c3) eq(test.t.c5, test.t.c1)]", " ├─ExchangeReceiver(Build) 7976.02 mpp[tiflash] ", - " │ └─ExchangeSender 7976.02 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c1, collate: binary], [name: Column#58, collate: binary], [name: test.t.c5, collate: binary]", + " │ └─ExchangeSender 7976.02 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c1, collate: binary], [name: Column#58, collate: binary], [name: test.t.c5, collate: binary]", " │ └─Projection 7976.02 mpp[tiflash] Column#7, test.t.c1, test.t.c2, test.t.c5, cast(test.t.c2, decimal(10,5))->Column#58", " │ └─Projection 7976.02 mpp[tiflash] Column#7, test.t.c1, test.t.c2, test.t.c5", " │ └─HashAgg 7976.02 mpp[tiflash] group by:test.t.c1, test.t.c2, test.t.c5, funcs:sum(Column#15)->Column#7, funcs:firstrow(test.t.c1)->test.t.c1, funcs:firstrow(test.t.c2)->test.t.c2, funcs:firstrow(test.t.c5)->test.t.c5", " │ └─ExchangeReceiver 7976.02 mpp[tiflash] ", - " │ └─ExchangeSender 7976.02 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c1, collate: binary], [name: test.t.c2, collate: binary], [name: test.t.c5, collate: binary]", + " │ └─ExchangeSender 7976.02 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c1, collate: binary], [name: test.t.c2, collate: binary], [name: test.t.c5, collate: binary]", " │ └─HashAgg 7976.02 mpp[tiflash] group by:test.t.c1, test.t.c2, test.t.c5, funcs:count(1)->Column#15", " │ └─Selection 9970.03 mpp[tiflash] not(isnull(test.t.c1)), not(isnull(test.t.c2)), not(isnull(test.t.c5))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 7984.01 mpp[tiflash] ", - " └─ExchangeSender 7984.01 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c2, collate: binary], [name: Column#59, collate: binary], [name: Column#60, collate: binary]", + " └─ExchangeSender 7984.01 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c2, collate: binary], [name: Column#59, collate: binary], [name: Column#60, collate: binary]", " └─Projection 7984.01 mpp[tiflash] Column#14, test.t.c1, test.t.c2, test.t.c3, cast(test.t.c3, decimal(10,5))->Column#59, cast(test.t.c1, decimal(40,20))->Column#60", " └─Projection 7984.01 mpp[tiflash] Column#14, test.t.c1, test.t.c2, test.t.c3", " └─HashAgg 7984.01 mpp[tiflash] group by:test.t.c1, test.t.c2, test.t.c3, funcs:sum(Column#23)->Column#14, funcs:firstrow(test.t.c1)->test.t.c1, funcs:firstrow(test.t.c2)->test.t.c2, funcs:firstrow(test.t.c3)->test.t.c3", " └─ExchangeReceiver 7984.01 mpp[tiflash] ", - " └─ExchangeSender 7984.01 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c2, collate: binary], [name: test.t.c3, collate: binary], [name: test.t.c1, collate: binary]", + " └─ExchangeSender 7984.01 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c2, collate: binary], [name: test.t.c3, collate: binary], [name: test.t.c1, collate: binary]", " └─HashAgg 7984.01 mpp[tiflash] group by:test.t.c1, test.t.c2, test.t.c3, funcs:count(1)->Column#23", " └─Selection 9980.01 mpp[tiflash] not(isnull(test.t.c1)), not(isnull(test.t.c2))", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -6670,15 +7827,15 @@ { "SQL": "desc format = 'brief' select * from t t1 join t t2 on t1.c1 = t2.c2 and t1.c2 = t2.c2 and t1.c3 = t2.c3 and t1.c4 = t2.c4 and t1.c5 = t2.c5", "Plan": [ - "TableReader 12462.54 root data:ExchangeSender", + "TableReader 12462.54 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 12462.54 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 12462.54 mpp[tiflash] inner join, equal:[eq(test.t.c1, test.t.c2) eq(test.t.c2, test.t.c2) eq(test.t.c3, test.t.c3) eq(test.t.c4, test.t.c4) eq(test.t.c5, test.t.c5)]", " ├─ExchangeReceiver(Build) 9970.03 mpp[tiflash] ", - " │ └─ExchangeSender 9970.03 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c1, collate: binary], [name: test.t.c2, collate: binary], [name: test.t.c3, collate: binary], [name: test.t.c4, collate: binary], [name: test.t.c5, collate: binary]", + " │ └─ExchangeSender 9970.03 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c1, collate: binary], [name: test.t.c2, collate: binary], [name: test.t.c3, collate: binary], [name: test.t.c4, collate: binary], [name: test.t.c5, collate: binary]", " │ └─Selection 9970.03 mpp[tiflash] not(isnull(test.t.c1)), not(isnull(test.t.c2)), not(isnull(test.t.c5))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 9980.01 mpp[tiflash] ", - " └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c2, collate: binary], [name: test.t.c2, collate: binary], [name: test.t.c3, collate: binary], [name: test.t.c4, collate: binary], [name: test.t.c5, collate: binary]", + " └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c2, collate: binary], [name: test.t.c2, collate: binary], [name: test.t.c3, collate: binary], [name: test.t.c4, collate: binary], [name: test.t.c5, collate: binary]", " └─Selection 9980.01 mpp[tiflash] not(isnull(test.t.c2)), not(isnull(test.t.c5))", " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" ] @@ -6686,17 +7843,17 @@ { "SQL": "desc format = 'brief' select * from t t1 join t t2 on t1.c1 = t2.c2 and t1.c2 = t2.c3 and t1.c3 = t2.c1 and t1.c4 = t2.c3 and t1.c1 = t2.c5", "Plan": [ - "TableReader 12462.54 root data:ExchangeSender", + "TableReader 12462.54 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 12462.54 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 12462.54 mpp[tiflash] test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5, test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5", " └─HashJoin 12462.54 mpp[tiflash] inner join, equal:[eq(test.t.c2, test.t.c1) eq(test.t.c3, test.t.c2) eq(test.t.c1, test.t.c3) eq(test.t.c3, test.t.c4) eq(test.t.c5, test.t.c1)]", " ├─ExchangeReceiver(Build) 9970.03 mpp[tiflash] ", - " │ └─ExchangeSender 9970.03 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c2, collate: binary], [name: Column#18, collate: binary], [name: Column#20, collate: binary], [name: test.t.c3, collate: binary], [name: test.t.c5, collate: binary]", + " │ └─ExchangeSender 9970.03 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c2, collate: binary], [name: Column#18, collate: binary], [name: Column#20, collate: binary], [name: test.t.c3, collate: binary], [name: test.t.c5, collate: binary]", " │ └─Projection 9970.03 mpp[tiflash] test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5, cast(test.t.c3, decimal(10,5))->Column#18, cast(test.t.c1, decimal(10,5))->Column#20", " │ └─Selection 9970.03 mpp[tiflash] not(isnull(test.t.c1)), not(isnull(test.t.c2)), not(isnull(test.t.c5))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 9980.01 mpp[tiflash] ", - " └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c1, collate: binary], [name: Column#19, collate: binary], [name: Column#21, collate: binary], [name: test.t.c4, collate: binary], [name: Column#22, collate: binary]", + " └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c1, collate: binary], [name: Column#19, collate: binary], [name: Column#21, collate: binary], [name: test.t.c4, collate: binary], [name: Column#22, collate: binary]", " └─Projection 9980.01 mpp[tiflash] test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5, cast(test.t.c2, decimal(10,5))->Column#19, cast(test.t.c3, decimal(10,5))->Column#21, cast(test.t.c1, decimal(40,20))->Column#22", " └─Selection 9980.01 mpp[tiflash] not(isnull(test.t.c1)), not(isnull(test.t.c2))", " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" @@ -6705,17 +7862,17 @@ { "SQL": "desc format = 'brief' select * from t t1 join t t2 on t1.c1 + t1.c2 = t2.c2 / t2.c3", "Plan": [ - "TableReader 12500.00 root data:ExchangeSender", + "TableReader 12500.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 12500.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 12500.00 mpp[tiflash] test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5, test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5", " └─HashJoin 12500.00 mpp[tiflash] inner join, equal:[eq(Column#13, Column#14)]", " ├─ExchangeReceiver(Build) 10000.00 mpp[tiflash] ", - " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#18, collate: binary]", + " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#18, collate: binary]", " │ └─Projection 10000.00 mpp[tiflash] test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5, Column#13, cast(Column#13, decimal(17,9) BINARY)->Column#18", " │ └─Projection 10000.00 mpp[tiflash] test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5, plus(test.t.c1, test.t.c2)->Column#13", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 10000.00 mpp[tiflash] ", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#14, collate: binary]", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#14, collate: binary]", " └─Projection 10000.00 mpp[tiflash] test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5, div(test.t.c2, test.t.c3)->Column#14", " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" ] @@ -6723,17 +7880,17 @@ { "SQL": "desc format = 'brief' select * from t t1 where exists (select * from t t2 where t1.c1 = t2.c2 and t1.c2 = t2.c3 and t1.c3 = t2.c1 and t1.c4 = t2.c3 and t1.c1 = t2.c5)", "Plan": [ - "TableReader 7984.01 root data:ExchangeSender", + "TableReader 7984.01 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 7984.01 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 7984.01 mpp[tiflash] test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5", " └─HashJoin 7984.01 mpp[tiflash] semi join, equal:[eq(test.t.c1, test.t.c2) eq(test.t.c2, test.t.c3) eq(test.t.c3, test.t.c1) eq(test.t.c4, test.t.c3) eq(test.t.c1, test.t.c5)]", " ├─ExchangeReceiver(Build) 9970.03 mpp[tiflash] ", - " │ └─ExchangeSender 9970.03 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c2, collate: binary], [name: Column#19, collate: binary], [name: Column#21, collate: binary], [name: test.t.c3, collate: binary], [name: test.t.c5, collate: binary]", + " │ └─ExchangeSender 9970.03 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c2, collate: binary], [name: Column#19, collate: binary], [name: Column#21, collate: binary], [name: test.t.c3, collate: binary], [name: test.t.c5, collate: binary]", " │ └─Projection 9970.03 mpp[tiflash] test.t.c1, test.t.c2, test.t.c3, test.t.c5, cast(test.t.c3, decimal(10,5))->Column#19, cast(test.t.c1, decimal(10,5))->Column#21", " │ └─Selection 9970.03 mpp[tiflash] not(isnull(test.t.c1)), not(isnull(test.t.c2)), not(isnull(test.t.c5))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 9980.01 mpp[tiflash] ", - " └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c1, collate: binary], [name: Column#18, collate: binary], [name: Column#20, collate: binary], [name: test.t.c4, collate: binary], [name: Column#22, collate: binary]", + " └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c1, collate: binary], [name: Column#18, collate: binary], [name: Column#20, collate: binary], [name: test.t.c4, collate: binary], [name: Column#22, collate: binary]", " └─Projection 9980.01 mpp[tiflash] test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5, cast(test.t.c2, decimal(10,5))->Column#18, cast(test.t.c3, decimal(10,5))->Column#20, cast(test.t.c1, decimal(40,20))->Column#22", " └─Selection 9980.01 mpp[tiflash] not(isnull(test.t.c1)), not(isnull(test.t.c2))", " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" @@ -6742,29 +7899,29 @@ { "SQL": "desc format = 'brief' select * from t t1 left join t t2 on t1.c1 = t2.c2 join t t3 on t2.c5 = t3.c3 right join t t4 on t3.c3 = t4.c4 ", "Plan": [ - "TableReader 19492.21 root data:ExchangeSender", + "TableReader 19492.21 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 19492.21 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 19492.21 mpp[tiflash] test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5, test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5, test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5, test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5", " └─HashJoin 19492.21 mpp[tiflash] right outer join, equal:[eq(test.t.c3, test.t.c4)]", " ├─ExchangeReceiver(Build) 10000.00 mpp[tiflash] ", - " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#29, collate: binary]", + " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#29, collate: binary]", " │ └─Projection 10000.00 mpp[tiflash] test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5, cast(test.t.c4, decimal(40,20))->Column#29", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t4 keep order:false, stats:pseudo", " └─Projection(Probe) 15593.77 mpp[tiflash] test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5, test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5, test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5", " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t.c5, test.t.c3)]", " ├─ExchangeReceiver(Build) 10000.00 mpp[tiflash] ", - " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#25, collate: binary]", + " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#25, collate: binary]", " │ └─Projection 10000.00 mpp[tiflash] test.t.c1, test.t.c2, test.t.c3, test.t.c4, test.t.c5, cast(test.t.c3, decimal(40,20))->Column#25", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 12475.01 mpp[tiflash] ", - " └─ExchangeSender 12475.01 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c5, collate: binary]", + " └─ExchangeSender 12475.01 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c5, collate: binary]", " └─HashJoin 12475.01 mpp[tiflash] inner join, equal:[eq(test.t.c2, test.t.c1)]", " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", - " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c2, collate: binary]", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c2, collate: binary]", " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t.c2)), not(isnull(test.t.c5))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 9990.00 mpp[tiflash] ", - " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c1, collate: binary]", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c1, collate: binary]", " └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.c1))", " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" ] @@ -6772,25 +7929,25 @@ { "SQL": "desc format = 'brief' SELECT STRAIGHT_JOIN t1 . col_varchar_64 , t1 . col_char_64_not_null FROM tt AS t1 INNER JOIN( tt AS t2 JOIN tt AS t3 ON(t3 . col_decimal_30_10_key = t2 . col_tinyint)) ON(t3 . col_varchar_64 = t2 . col_varchar_key) WHERE t3 . col_varchar_64 = t1 . col_char_64_not_null GROUP BY 1 , 2", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] test.tt.col_varchar_64, test.tt.col_char_64_not_null", " └─HashAgg 8000.00 mpp[tiflash] group by:test.tt.col_char_64_not_null, test.tt.col_varchar_64, funcs:firstrow(test.tt.col_varchar_64)->test.tt.col_varchar_64, funcs:firstrow(test.tt.col_char_64_not_null)->test.tt.col_char_64_not_null", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.tt.col_varchar_64, collate: utf8mb4_bin], [name: test.tt.col_char_64_not_null, collate: utf8mb4_bin]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.tt.col_varchar_64, collate: utf8mb4_bin], [name: test.tt.col_char_64_not_null, collate: utf8mb4_bin]", " └─HashAgg 8000.00 mpp[tiflash] group by:test.tt.col_char_64_not_null, test.tt.col_varchar_64, ", " └─HashJoin 15609.38 mpp[tiflash] inner join, equal:[eq(test.tt.col_char_64_not_null, test.tt.col_varchar_64)]", " ├─ExchangeReceiver(Build) 10000.00 mpp[tiflash] ", - " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.tt.col_char_64_not_null, collate: utf8mb4_bin]", + " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.tt.col_char_64_not_null, collate: utf8mb4_bin]", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", " └─HashJoin(Probe) 12487.50 mpp[tiflash] inner join, equal:[eq(test.tt.col_varchar_key, test.tt.col_varchar_64) eq(Column#19, test.tt.col_decimal_30_10_key)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", - " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.tt.col_varchar_key, collate: utf8mb4_bin]", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.tt.col_varchar_key, collate: utf8mb4_bin]", " │ └─Projection 9990.00 mpp[tiflash] test.tt.col_varchar_key, cast(test.tt.col_tinyint, decimal(3,0) BINARY)->Column#19", " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.tt.col_varchar_key))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 9990.00 mpp[tiflash] ", - " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.tt.col_varchar_64, collate: utf8mb4_bin]", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.tt.col_varchar_64, collate: utf8mb4_bin]", " └─Selection 9990.00 mpp[tiflash] not(isnull(test.tt.col_varchar_64))", " └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo" ] @@ -6803,19 +7960,136 @@ { "SQL": "desc format = 'brief' select * from tt t1 where exists (select * from t t2 where t1.b1 = t2.c3 and t2.c1 < t2.c2)", "Plan": [ - "TableReader 7992.00 root data:ExchangeSender", + "TableReader 7992.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 7992.00 mpp[tiflash] semi join, equal:[eq(test.tt.b1, test.t.c3)]", " ├─ExchangeReceiver(Build) 8000.00 mpp[tiflash] ", - " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c3, collate: binary]", + " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c3, collate: binary]", + " │ └─Projection 8000.00 mpp[tiflash] test.t.c3", + " │ └─Selection 8000.00 mpp[tiflash] lt(test.t.c1, test.t.c2)", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 9990.00 mpp[tiflash] ", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.tt.b1, collate: binary]", + " └─Selection 9990.00 mpp[tiflash] not(isnull(test.tt.b1))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestMppFineGrainedJoinAndAgg", + "Cases": [ + { + "SQL": "desc format = 'brief' select * from tt t1 where exists (select * from t t2 where t1.b1 = t2.c3 and t2.c1 < t2.c2)", + "Plan": [ + "TableReader 7992.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 7992.00 mpp[tiflash] semi join, equal:[eq(test.tt.b1, test.t.c3)], stream_count: 8", + " ├─ExchangeReceiver(Build) 8000.00 mpp[tiflash] stream_count: 8", + " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.c3, collate: binary], stream_count: 8", " │ └─Projection 8000.00 mpp[tiflash] test.t.c3", " │ └─Selection 8000.00 mpp[tiflash] lt(test.t.c1, test.t.c2)", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 9990.00 mpp[tiflash] ", - " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.tt.b1, collate: binary]", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.tt.b1, collate: binary]", " └─Selection 9990.00 mpp[tiflash] not(isnull(test.tt.b1))", " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" ] + }, + { + "SQL": "desc format = 'brief' select count(*) from tt group by b1", + "Plan": [ + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 mpp[tiflash] Column#3", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.tt.b1, funcs:sum(Column#7)->Column#3, stream_count: 8", + " └─ExchangeReceiver 8000.00 mpp[tiflash] stream_count: 8", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.tt.b1, collate: binary], stream_count: 8", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.tt.b1, funcs:count(1)->Column#7", + " └─TableFullScan 10000.00 mpp[tiflash] table:tt keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestMppVersion", + "Cases": [ + { + "SQL": "desc format = 'brief' select count(*) as cnt from t group by a, b", + "Plan": [ + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 mpp[tiflash] Column#4", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, test.t.b, funcs:sum(Column#8)->Column#4", + " └─ExchangeReceiver 8000.00 mpp[tiflash] ", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.b, collate: binary]", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, test.t.b, funcs:count(1)->Column#8", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "set mpp_exchange_compression_mode = UNSPECIFIED", + "Plan": null, + "Warnings": null + }, + { + "SQL": "desc format = 'brief' select count(*) as cnt from t group by a, b", + "Plan": [ + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 mpp[tiflash] Column#4", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, test.t.b, funcs:sum(Column#8)->Column#4", + " └─ExchangeReceiver 8000.00 mpp[tiflash] ", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.b, collate: binary]", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, test.t.b, funcs:count(1)->Column#8", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "set mpp_version = 0", + "Plan": null, + "Warnings": null + }, + { + "SQL": "set mpp_exchange_compression_mode = fast", + "Plan": null, + "Warnings": null + }, + { + "SQL": "desc format = 'brief' select count(*) as cnt from t group by a, b", + "Plan": [ + "TableReader 8000.00 root MppVersion: 0, data:ExchangeSender", + "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 mpp[tiflash] Column#4", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, test.t.b, funcs:sum(Column#8)->Column#4", + " └─ExchangeReceiver 8000.00 mpp[tiflash] ", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.b, collate: binary]", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, test.t.b, funcs:count(1)->Column#8", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "set mpp_version = -1", + "Plan": null, + "Warnings": null + }, + { + "SQL": "set mpp_exchange_compression_mode = high_compression", + "Plan": null, + "Warnings": null + }, + { + "SQL": "desc format = 'brief' select count(*) as cnt from t group by a, b", + "Plan": [ + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 mpp[tiflash] Column#4", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, test.t.b, funcs:sum(Column#8)->Column#4", + " └─ExchangeReceiver 8000.00 mpp[tiflash] ", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: HIGH_COMPRESSION, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.b, collate: binary]", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, test.t.b, funcs:count(1)->Column#8", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ] } ] }, @@ -6826,7 +8100,7 @@ "SQL": "desc format = 'brief' select /*+ hash_agg()*/ count(b) from (select id + 1 as b from t)A", "Plan": [ "HashAgg 1.00 root funcs:count(Column#8)->Column#5", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(Column#10)->Column#8", " └─Projection 10000.00 mpp[tiflash] plus(test.t.id, 1)->Column#10", @@ -6837,9 +8111,9 @@ "SQL": "desc format = 'brief' select /*+ hash_agg()*/ count(*) from (select id+1 from t)A", "Plan": [ "HashAgg 1.00 root funcs:count(Column#7)->Column#5", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#7", + " └─HashAgg 1.00 mpp[tiflash] funcs:count(test.t._tidb_rowid)->Column#7", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] }, @@ -6847,7 +8121,7 @@ "SQL": "desc format = 'brief' select /*+ hash_agg()*/ sum(b) from (select id + 1 as b from t)A", "Plan": [ "HashAgg 1.00 root funcs:sum(Column#8)->Column#5", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:sum(Column#10)->Column#8", " └─Projection 10000.00 mpp[tiflash] cast(plus(test.t.id, 1), decimal(20,0) BINARY)->Column#10", @@ -6857,22 +8131,21 @@ { "SQL": "desc format = 'brief' select count(*) from t", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#6)->Column#4", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#6", - " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + "StreamAgg 1.00 root funcs:count(Column#7)->Column#4", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:count(test.t._tidb_rowid)->Column#7", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ] }, { "SQL": "desc format = 'brief' select count(*), id from t group by id", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#4, test.t.id", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:sum(Column#11)->Column#4, funcs:firstrow(test.t.id)->test.t.id", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:count(1)->Column#11", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] @@ -6880,13 +8153,13 @@ { "SQL": "desc format = 'brief' select count(*), id + 1 from t group by id + 1", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#4, plus(test.t.id, 1)->Column#5", " └─Projection 8000.00 mpp[tiflash] Column#4, test.t.id", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#16, funcs:sum(Column#17)->Column#4, funcs:firstrow(Column#18)->test.t.id", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#16, collate: binary]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#16, collate: binary]", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#20, funcs:count(1)->Column#17, funcs:firstrow(Column#19)->Column#18", " └─Projection 10000.00 mpp[tiflash] test.t.id, plus(test.t.id, 1)->Column#20", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -6895,18 +8168,18 @@ { "SQL": "desc format = 'brief' select * from t join ( select count(*), id from t group by id) as A on A.id = t.id", "Plan": [ - "TableReader 9990.00 root data:ExchangeSender", + "TableReader 9990.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 9990.00 mpp[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", " ├─Projection(Build) 7992.00 mpp[tiflash] Column#7, test.t.id", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, funcs:sum(Column#8)->Column#7, funcs:firstrow(test.t.id)->test.t.id", " │ └─ExchangeReceiver 7992.00 mpp[tiflash] ", - " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, funcs:count(1)->Column#8", " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 9990.00 mpp[tiflash] ", - " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] @@ -6916,9 +8189,9 @@ "Plan": [ "HashJoin 1.25 root inner join, equal:[eq(test.t.id, Column#7)]", "├─HashAgg(Build) 1.00 root funcs:count(Column#11)->Column#7", - "│ └─TableReader 1.00 root data:ExchangeSender", + "│ └─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "│ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - "│ └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#11", + "│ └─HashAgg 1.00 mpp[tiflash] funcs:count(test.t._tidb_rowid)->Column#11", "│ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", "└─TableReader(Probe) 9990.00 root data:Selection", " └─Selection 9990.00 cop[tiflash] not(isnull(test.t.id))", @@ -6928,12 +8201,12 @@ { "SQL": "desc format = 'brief' select avg(value) as b,id from t group by id", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] div(Column#4, cast(case(eq(Column#17, 0), 1, Column#17), decimal(20,0) BINARY))->Column#4, test.t.id", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:sum(Column#18)->Column#17, funcs:sum(Column#19)->Column#4, funcs:firstrow(test.t.id)->test.t.id", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:count(test.t.value)->Column#18, funcs:sum(test.t.value)->Column#19", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] @@ -6942,13 +8215,13 @@ "SQL": "desc format = 'brief' select /*+hash_agg()*/ sum(b) from (select avg(value) as b, id from t group by id)A", "Plan": [ "HashAgg 1.00 root funcs:sum(Column#18)->Column#5", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:sum(Column#4)->Column#18", " └─Projection 8000.00 mpp[tiflash] div(Column#4, cast(case(eq(Column#15, 0), 1, Column#15), decimal(20,0) BINARY))->Column#4", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:sum(Column#16)->Column#15, funcs:sum(Column#17)->Column#4", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:count(test.t.value)->Column#16, funcs:sum(test.t.value)->Column#17", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] @@ -6956,14 +8229,14 @@ { "SQL": "desc format = 'brief' select id from t group by id having avg(value)>0", "Plan": [ - "TableReader 6400.00 root data:ExchangeSender", + "TableReader 6400.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 6400.00 mpp[tiflash] test.t.id", " └─Selection 6400.00 mpp[tiflash] gt(Column#4, 0)", " └─Projection 8000.00 mpp[tiflash] div(Column#4, cast(case(eq(Column#18, 0), 1, Column#18), decimal(20,0) BINARY))->Column#4, test.t.id", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:sum(Column#19)->Column#18, funcs:sum(Column#20)->Column#4, funcs:firstrow(test.t.id)->test.t.id", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:count(test.t.value)->Column#19, funcs:sum(test.t.value)->Column#20", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] @@ -6971,13 +8244,13 @@ { "SQL": "desc format = 'brief' select avg(value),id from t group by id having avg(value)>0", "Plan": [ - "TableReader 6400.00 root data:ExchangeSender", + "TableReader 6400.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: PassThrough", " └─Selection 6400.00 mpp[tiflash] gt(Column#4, 0)", " └─Projection 8000.00 mpp[tiflash] div(Column#4, cast(case(eq(Column#19, 0), 1, Column#19), decimal(20,0) BINARY))->Column#4, test.t.id", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:sum(Column#20)->Column#19, funcs:sum(Column#21)->Column#4, funcs:firstrow(test.t.id)->test.t.id", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:count(test.t.value)->Column#20, funcs:sum(test.t.value)->Column#21", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] @@ -6985,13 +8258,13 @@ { "SQL": "desc format = 'brief' select avg(value) +1,id from t group by id", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] plus(Column#4, 1)->Column#5, test.t.id", " └─Projection 8000.00 mpp[tiflash] div(Column#4, cast(case(eq(Column#19, 0), 1, Column#19), decimal(20,0) BINARY))->Column#4, test.t.id", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:sum(Column#20)->Column#19, funcs:sum(Column#21)->Column#4, funcs:firstrow(test.t.id)->test.t.id", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:count(test.t.value)->Column#20, funcs:sum(test.t.value)->Column#21", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] @@ -6999,18 +8272,18 @@ { "SQL": "desc format = 'brief' select sum(b) from (select t.id, t1.id as b from t join t t1 on t.id=t1.id)A group by id", "Plan": [ - "TableReader 7992.00 root data:ExchangeSender", + "TableReader 7992.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 7992.00 mpp[tiflash] Column#7", " └─HashAgg 7992.00 mpp[tiflash] group by:Column#12, funcs:sum(Column#11)->Column#7", " └─Projection 12487.50 mpp[tiflash] cast(test.t.id, decimal(10,0) BINARY)->Column#11, test.t.id", " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", - " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 9990.00 mpp[tiflash] ", - " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" ] @@ -7018,13 +8291,13 @@ { "SQL": "desc format = 'brief' select * from (select id from t group by id) C join (select sum(b),id from (select t.id, t1.id as b from t join (select id, count(*) as c from t group by id) t1 on t.id=t1.id)A group by id)B on C.id=b.id", "Plan": [ - "TableReader 7992.00 root data:ExchangeSender", + "TableReader 7992.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 7992.00 mpp[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", " ├─Projection(Build) 7992.00 mpp[tiflash] test.t.id", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, funcs:firstrow(test.t.id)->test.t.id", " │ └─ExchangeReceiver 7992.00 mpp[tiflash] ", - " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, ", " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", @@ -7035,12 +8308,12 @@ " ├─Projection(Build) 7992.00 mpp[tiflash] test.t.id, Column#13", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, funcs:firstrow(test.t.id)->test.t.id, funcs:sum(Column#17)->Column#13", " │ └─ExchangeReceiver 7992.00 mpp[tiflash] ", - " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, funcs:count(1)->Column#17", " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 9990.00 mpp[tiflash] ", - " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] @@ -7048,12 +8321,12 @@ { "SQL": "desc format = 'brief' select count(distinct value),id from t group by id", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#4, test.t.id", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:count(distinct test.t.value)->Column#4, funcs:firstrow(test.t.id)->test.t.id", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, test.t.value, ", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] @@ -7069,18 +8342,18 @@ { "SQL": "desc format = 'brief' select * from t join ( select count(distinct value), id from t group by id) as A on A.id = t.id", "Plan": [ - "TableReader 9990.00 root data:ExchangeSender", + "TableReader 9990.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 9990.00 mpp[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", " ├─Projection(Build) 7992.00 mpp[tiflash] Column#7, test.t.id", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, funcs:count(distinct test.t.value)->Column#7, funcs:firstrow(test.t.id)->test.t.id", " │ └─ExchangeReceiver 7992.00 mpp[tiflash] ", - " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, test.t.value, ", " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 9990.00 mpp[tiflash] ", - " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] @@ -7088,19 +8361,19 @@ { "SQL": "desc format = 'brief' select * from t join ( select count(1/value), id from t group by id) as A on A.id = t.id", "Plan": [ - "TableReader 9990.00 root data:ExchangeSender", + "TableReader 9990.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 9990.00 mpp[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", " ├─Projection(Build) 7992.00 mpp[tiflash] Column#7, test.t.id", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, funcs:sum(Column#8)->Column#7, funcs:firstrow(test.t.id)->test.t.id", " │ └─ExchangeReceiver 7992.00 mpp[tiflash] ", - " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " │ └─HashAgg 7992.00 mpp[tiflash] group by:Column#19, funcs:count(Column#18)->Column#8", " │ └─Projection 9990.00 mpp[tiflash] div(1, test.t.value)->Column#18, test.t.id", " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 9990.00 mpp[tiflash] ", - " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] @@ -7108,7 +8381,7 @@ { "SQL": "desc format = 'brief' select /*+hash_agg()*/ sum(id) from (select value, id from t where id > value group by id, value)A group by value /*the exchange should have only one partition column: test.t.value*/", "Plan": [ - "TableReader 6400.00 root data:ExchangeSender", + "TableReader 6400.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 6400.00 mpp[tiflash] Column#4", " └─HashAgg 6400.00 mpp[tiflash] group by:Column#21, funcs:sum(Column#20)->Column#4", @@ -7116,7 +8389,7 @@ " └─Projection 6400.00 mpp[tiflash] test.t.id, test.t.value", " └─HashAgg 6400.00 mpp[tiflash] group by:test.t.id, test.t.value, funcs:firstrow(test.t.id)->test.t.id, funcs:firstrow(test.t.value)->test.t.value", " └─ExchangeReceiver 6400.00 mpp[tiflash] ", - " └─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.value, collate: binary]", + " └─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.value, collate: binary]", " └─HashAgg 6400.00 mpp[tiflash] group by:test.t.id, test.t.value, ", " └─Selection 8000.00 mpp[tiflash] gt(cast(test.t.id, decimal(10,0) BINARY), test.t.value)", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -7125,7 +8398,7 @@ { "SQL": "desc format = 'brief' select /*+hash_agg()*/ sum(B.value) from t as B where B.id+1 > (select count(*) from t where t.id= B.id and t.value=B.value) group by B.id /*the exchange should have only one partition column: test.t.id*/", "Plan": [ - "TableReader 6400.00 root data:ExchangeSender", + "TableReader 6400.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 6400.00 mpp[tiflash] Column#8", " └─HashAgg 6400.00 mpp[tiflash] group by:test.t.id, funcs:sum(test.t.value)->Column#8", @@ -7134,19 +8407,19 @@ " ├─Projection(Build) 7984.01 mpp[tiflash] Column#7, test.t.id, test.t.value", " │ └─HashAgg 7984.01 mpp[tiflash] group by:test.t.id, test.t.value, funcs:sum(Column#24)->Column#7, funcs:firstrow(test.t.id)->test.t.id, funcs:firstrow(test.t.value)->test.t.value", " │ └─ExchangeReceiver 7984.01 mpp[tiflash] ", - " │ └─ExchangeSender 7984.01 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " │ └─ExchangeSender 7984.01 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " │ └─HashAgg 7984.01 mpp[tiflash] group by:test.t.id, test.t.value, funcs:count(1)->Column#24", " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t.id)), not(isnull(test.t.value))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 10000.00 mpp[tiflash] ", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " └─TableFullScan 10000.00 mpp[tiflash] table:B keep order:false, stats:pseudo" ] }, { "SQL": "desc format = 'brief' select count(distinct value) from t", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#4", " └─HashAgg 1.00 mpp[tiflash] funcs:sum(Column#6)->Column#4", @@ -7154,7 +8427,7 @@ " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(distinct test.t.value)->Column#6", " └─ExchangeReceiver 1.00 mpp[tiflash] ", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.value, collate: binary]", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.value, collate: binary]", " └─HashAgg 1.00 mpp[tiflash] group by:test.t.value, ", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] @@ -7162,7 +8435,7 @@ { "SQL": "desc format = 'brief' select count(distinct x ) from (select count(distinct value) x from t) t", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5", " └─HashAgg 1.00 mpp[tiflash] funcs:count(distinct Column#4)->Column#5", @@ -7172,7 +8445,7 @@ " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(distinct test.t.value)->Column#7", " └─ExchangeReceiver 1.00 mpp[tiflash] ", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.value, collate: binary]", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.value, collate: binary]", " └─HashAgg 1.00 mpp[tiflash] group by:test.t.value, ", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] @@ -7180,7 +8453,7 @@ { "SQL": "desc format = 'brief' select count(distinct value), count(value), avg(value) from t", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#4, Column#5, div(Column#6, cast(case(eq(Column#15, 0), 1, Column#15), decimal(20,0) BINARY))->Column#6", " └─HashAgg 1.00 mpp[tiflash] funcs:sum(Column#19)->Column#4, funcs:sum(Column#20)->Column#5, funcs:sum(Column#21)->Column#15, funcs:sum(Column#22)->Column#6", @@ -7188,7 +8461,7 @@ " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(distinct test.t.value)->Column#19, funcs:sum(Column#16)->Column#20, funcs:sum(Column#17)->Column#21, funcs:sum(Column#18)->Column#22", " └─ExchangeReceiver 1.00 mpp[tiflash] ", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.value, collate: binary]", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.value, collate: binary]", " └─HashAgg 1.00 mpp[tiflash] group by:test.t.value, funcs:count(test.t.value)->Column#16, funcs:count(test.t.value)->Column#17, funcs:sum(test.t.value)->Column#18", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] @@ -7201,7 +8474,7 @@ { "SQL": "desc format = 'brief' select * from t join ( select count(*), id from t group by id) as A on A.id = t.id", "Plan": [ - "TableReader 9990.00 root data:ExchangeSender", + "TableReader 9990.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 9990.00 mpp[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", " ├─ExchangeReceiver(Build) 7992.00 mpp[tiflash] ", @@ -7209,7 +8482,7 @@ " │ └─Projection 7992.00 mpp[tiflash] Column#7, test.t.id", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, funcs:sum(Column#8)->Column#7, funcs:firstrow(test.t.id)->test.t.id", " │ └─ExchangeReceiver 7992.00 mpp[tiflash] ", - " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, funcs:count(1)->Column#8", " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", @@ -7220,7 +8493,7 @@ { "SQL": "desc format = 'brief' select * from t join ( select count(*)+id as v from t group by id) as A on A.v = t.id", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 8000.00 mpp[tiflash] inner join, equal:[eq(test.t.id, Column#8)]", " ├─ExchangeReceiver(Build) 6400.00 mpp[tiflash] ", @@ -7230,7 +8503,7 @@ " │ └─Projection 8000.00 mpp[tiflash] Column#7, test.t.id", " │ └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:sum(Column#11)->Column#7, funcs:firstrow(test.t.id)->test.t.id", " │ └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " │ └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:count(1)->Column#11", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.id))", @@ -7240,7 +8513,7 @@ { "SQL": "desc format = 'brief' select * from t join ( select count(*) as v, id from t group by value,id having value+v <10) as A on A.id = t.id", "Plan": [ - "TableReader 7992.00 root data:ExchangeSender", + "TableReader 7992.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 7992.00 mpp[tiflash] test.t.id, test.t.value, Column#7, test.t.id", " └─HashJoin 7992.00 mpp[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", @@ -7250,7 +8523,7 @@ " │ └─Projection 7992.00 mpp[tiflash] Column#7, test.t.id, test.t.value", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, test.t.value, funcs:sum(Column#10)->Column#7, funcs:firstrow(test.t.id)->test.t.id, funcs:firstrow(test.t.value)->test.t.value", " │ └─ExchangeReceiver 7992.00 mpp[tiflash] ", - " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.value, collate: binary], [name: test.t.id, collate: binary]", + " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.value, collate: binary], [name: test.t.id, collate: binary]", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, test.t.value, funcs:count(1)->Column#10", " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", @@ -7263,9 +8536,9 @@ "Plan": [ "HashJoin 1.25 root inner join, equal:[eq(test.t.id, Column#7)]", "├─HashAgg(Build) 1.00 root funcs:count(Column#10)->Column#7", - "│ └─TableReader 1.00 root data:ExchangeSender", + "│ └─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "│ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", - "│ └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#10", + "│ └─HashAgg 1.00 mpp[tiflash] funcs:count(test.t._tidb_rowid)->Column#10", "│ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", "└─TableReader(Probe) 9990.00 root data:Selection", " └─Selection 9990.00 cop[tiflash] not(isnull(test.t.id))", @@ -7275,13 +8548,13 @@ { "SQL": "desc format = 'brief' select sum(b) from (select t.id, t1.id as b from t join t t1 on t.id=t1.id)A group by id", "Plan": [ - "TableReader 7992.00 root data:ExchangeSender", + "TableReader 7992.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 7992.00 mpp[tiflash] Column#7", " └─HashAgg 7992.00 mpp[tiflash] group by:Column#12, funcs:sum(Column#11)->Column#7", " └─Projection 12487.50 mpp[tiflash] cast(test.t.id, decimal(10,0) BINARY)->Column#11, test.t.id", " └─ExchangeReceiver 12487.50 mpp[tiflash] ", - " └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", @@ -7294,7 +8567,7 @@ { "SQL": "desc format = 'brief' select * from (select id from t group by id) C join (select sum(value),id from t group by id)B on C.id=B.id", "Plan": [ - "TableReader 7992.00 root data:ExchangeSender", + "TableReader 7992.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 7992.00 mpp[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", " ├─ExchangeReceiver(Build) 7992.00 mpp[tiflash] ", @@ -7302,14 +8575,14 @@ " │ └─Projection 7992.00 mpp[tiflash] test.t.id", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, funcs:firstrow(test.t.id)->test.t.id", " │ └─ExchangeReceiver 7992.00 mpp[tiflash] ", - " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, ", " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", " └─Projection(Probe) 7992.00 mpp[tiflash] Column#7, test.t.id", " └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, funcs:sum(Column#9)->Column#7, funcs:firstrow(test.t.id)->test.t.id", " └─ExchangeReceiver 7992.00 mpp[tiflash] ", - " └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, funcs:sum(test.t.value)->Column#9", " └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -7318,7 +8591,7 @@ { "SQL": "desc format = 'brief' select * from (select id from t group by id) C join (select sum(b),id from (select t.id, t1.id as b from t join (select id, count(*) as c from t group by id) t1 on t.id=t1.id)A group by id)B on C.id=b.id", "Plan": [ - "TableReader 7992.00 root data:ExchangeSender", + "TableReader 7992.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 7992.00 mpp[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", " ├─ExchangeReceiver(Build) 7992.00 mpp[tiflash] ", @@ -7326,7 +8599,7 @@ " │ └─Projection 7992.00 mpp[tiflash] test.t.id", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, funcs:firstrow(test.t.id)->test.t.id", " │ └─ExchangeReceiver 7992.00 mpp[tiflash] ", - " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, ", " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", @@ -7334,14 +8607,14 @@ " └─HashAgg 7992.00 mpp[tiflash] group by:Column#34, funcs:sum(Column#32)->Column#11, funcs:firstrow(Column#33)->test.t.id", " └─Projection 9990.00 mpp[tiflash] cast(test.t.id, decimal(10,0) BINARY)->Column#32, test.t.id, test.t.id", " └─ExchangeReceiver 9990.00 mpp[tiflash] ", - " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " └─HashJoin 9990.00 mpp[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", " ├─ExchangeReceiver(Build) 7992.00 mpp[tiflash] ", " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: Broadcast", " │ └─Projection 7992.00 mpp[tiflash] test.t.id, Column#13", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, funcs:firstrow(test.t.id)->test.t.id, funcs:sum(Column#16)->Column#13", " │ └─ExchangeReceiver 7992.00 mpp[tiflash] ", - " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, funcs:count(1)->Column#16", " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", @@ -7353,7 +8626,7 @@ "SQL": "desc format = 'brief' select * from t join t t1 on t.id = t1.id order by t.value limit 1", "Plan": [ "TopN 1.00 root test.t.value, offset:0, count:1", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─TopN 1.00 mpp[tiflash] test.t.value, offset:0, count:1", " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", @@ -7371,7 +8644,7 @@ "Projection 1.00 root test.t.id, test.t.value, test.t.id, test.t.value", "└─TopN 1.00 root Column#8, offset:0, count:1", " └─Projection 1.00 root test.t.id, test.t.value, test.t.id, test.t.value, mod(test.t.value, 100)->Column#8", - " └─TableReader 1.00 root data:ExchangeSender", + " └─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] test.t.id, test.t.value, test.t.id, test.t.value", " └─TopN 1.00 mpp[tiflash] Column#7, offset:0, count:1", @@ -7388,9 +8661,9 @@ { "SQL": "desc format = 'brief' select count(*) from (select t.id, t.value v1 from t join t t1 on t.id = t1.id order by t.value limit 20) v group by v.v1", "Plan": [ - "HashAgg 20.00 root group by:test.t.value, funcs:count(1)->Column#7", + "StreamAgg 20.00 root group by:test.t.value, funcs:count(1)->Column#7", "└─TopN 20.00 root test.t.value, offset:0, count:20", - " └─TableReader 20.00 root data:ExchangeSender", + " └─TableReader 20.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 20.00 mpp[tiflash] ExchangeType: PassThrough", " └─TopN 20.00 mpp[tiflash] test.t.value, offset:0, count:20", " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", @@ -7406,7 +8679,7 @@ "SQL": "desc format = 'brief' select * from t join t t1 on t.id = t1.id limit 1", "Plan": [ "Limit 1.00 root offset:0, count:1", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Limit 1.00 mpp[tiflash] offset:0, count:1", " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", @@ -7422,7 +8695,7 @@ "SQL": "desc format = 'brief' select * from t join t t1 on t.id = t1.id limit 1", "Plan": [ "Limit 1.00 root offset:0, count:1", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Limit 1.00 mpp[tiflash] offset:0, count:1", " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", @@ -7439,7 +8712,7 @@ "Plan": [ "HashAgg 20.00 root group by:test.t.value, funcs:count(1)->Column#7", "└─Limit 20.00 root offset:0, count:20", - " └─TableReader 20.00 root data:ExchangeSender", + " └─TableReader 20.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 20.00 mpp[tiflash] ExchangeType: PassThrough", " └─Limit 20.00 mpp[tiflash] offset:0, count:20", " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", @@ -7459,7 +8732,7 @@ { "SQL": "desc format='brief' select /*+ use_index_merge(t) */ * from t where a =1 or (b=1 and b+2>1)", "Plan": [ - "IndexMerge 8.00 root ", + "IndexMerge 8.00 root type: union", "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false", "├─Selection(Build) 1.00 cop[tikv] 1", "│ └─IndexRangeScan 1.00 cop[tikv] table:t, index:b(b) range:[1,1], keep order:false", @@ -7470,7 +8743,7 @@ { "SQL": "desc format='brief' select /*+ use_index_merge(t) */ * from t where a =1 or (b=1 and length(b)=1)", "Plan": [ - "IndexMerge 8.00 root ", + "IndexMerge 8.00 root type: union", "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false", "├─Selection(Build) 1.00 cop[tikv] 1", "│ └─IndexRangeScan 1.00 cop[tikv] table:t, index:b(b) range:[1,1], keep order:false", @@ -7481,7 +8754,7 @@ { "SQL": "desc format='brief' select /*+ use_index_merge(t) */ * from t where (a=1 and length(a)=1) or (b=1 and length(b)=1)", "Plan": [ - "IndexMerge 8.00 root ", + "IndexMerge 8.00 root type: union", "├─Selection(Build) 1.00 cop[tikv] 1", "│ └─IndexRangeScan 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false", "├─Selection(Build) 1.00 cop[tikv] 1", @@ -7493,7 +8766,7 @@ { "SQL": "desc format='brief' select /*+ use_index_merge(t) */ * from t where (a=1 and length(b)=1) or (b=1 and length(a)=1)", "Plan": [ - "IndexMerge 0.29 root ", + "IndexMerge 0.29 root type: union", "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false", "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:b(b) range:[1,1], keep order:false", "└─Selection(Probe) 0.29 cop[tikv] or(and(eq(test.t.a, 1), eq(length(cast(test.t.b, var_string(20))), 1)), and(eq(test.t.b, 1), eq(length(cast(test.t.a, var_string(20))), 1)))", @@ -7566,12 +8839,12 @@ "└─HashJoin 9990.00 root CARTESIAN inner join, other cond:or(ge(test.ts.col_char_64_not_null, Column#25), if(ne(Column#26, 0), NULL, 0))", " ├─Selection(Build) 0.80 root ne(Column#27, 0)", " │ └─HashAgg 1.00 root funcs:min(Column#36)->Column#25, funcs:sum(Column#37)->Column#26, funcs:count(Column#38)->Column#27", - " │ └─TableReader 1.00 root data:ExchangeSender", + " │ └─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " │ └─HashAgg 1.00 mpp[tiflash] funcs:min(Column#42)->Column#36, funcs:sum(Column#43)->Column#37, funcs:count(1)->Column#38", " │ └─Projection 10000.00 mpp[tiflash] test.ts.col_varchar_64, cast(isnull(test.ts.col_varchar_64), decimal(20,0) BINARY)->Column#43", " │ └─TableFullScan 10000.00 mpp[tiflash] table:SUBQUERY4_t1 keep order:false, stats:pseudo", - " └─TableReader(Probe) 12487.50 root data:ExchangeSender", + " └─TableReader(Probe) 12487.50 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.ts.col_varchar_64, test.ts.col_varchar_key)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", @@ -7591,7 +8864,7 @@ "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(col_0, col_1, id) from ts", "Plan": [ "HashAgg 1.00 root funcs:group_concat(Column#7 separator \",\")->Column#5", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(Column#9, Column#10, Column#11 separator \",\")->Column#7", " └─Projection 10000.00 mpp[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#11", @@ -7604,7 +8877,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0, col_1, id) from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(distinct Column#6, Column#7, Column#8 separator \",\")->Column#5", @@ -7621,7 +8894,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(col_0, col_1, id order by col_0) from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(Column#6, Column#7, Column#8 order by Column#9 separator \",\")->Column#5", @@ -7637,7 +8910,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0, col_1, id order by col_0) from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(distinct Column#6, Column#7, Column#8 order by Column#9 separator \",\")->Column#5", @@ -7654,7 +8927,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(col_0, col_1, id order by col_0),count(*),min(col_1) from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5, Column#6, Column#7", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(Column#8, Column#9, Column#10 order by Column#11 separator \",\")->Column#5, funcs:count(1)->Column#6, funcs:min(Column#12)->Column#7", @@ -7670,7 +8943,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0, col_1, id order by col_0),count(*),max(col_0) from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5, Column#6, Column#7", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(distinct Column#12, Column#13, Column#14 order by Column#15 separator \",\")->Column#5, funcs:sum(Column#16)->Column#6, funcs:max(Column#17)->Column#7", @@ -7687,13 +8960,13 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(col_0, col_1, id) from ts group by col_2", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#13, funcs:group_concat(Column#10, Column#11, Column#12 separator \",\")->Column#5", " └─Projection 10000.00 mpp[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#12, test.ts.col_2", " └─ExchangeReceiver 10000.00 mpp[tiflash] ", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -7703,13 +8976,13 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0, col_1, id) from ts group by col_2", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#9, funcs:group_concat(distinct Column#6, Column#7, Column#8 separator \",\")->Column#5", " └─Projection 8000.00 mpp[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#8, test.ts.col_2", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", " └─HashAgg 8000.00 mpp[tiflash] group by:test.ts.col_0, test.ts.col_1, test.ts.col_2, test.ts.id, ", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" ], @@ -7720,13 +8993,13 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(col_0, col_1, id order by col_0) from ts group by col_2", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#10, funcs:group_concat(Column#6, Column#7, Column#8 order by Column#9 separator \",\")->Column#5", " └─Projection 10000.00 mpp[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#8, test.ts.col_0, test.ts.col_2", " └─ExchangeReceiver 10000.00 mpp[tiflash] ", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -7736,13 +9009,13 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0, col_1, id order by col_0) from ts group by col_2", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#10, funcs:group_concat(distinct Column#6, Column#7, Column#8 order by Column#9 separator \",\")->Column#5", " └─Projection 8000.00 mpp[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#8, test.ts.col_0, test.ts.col_2", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", " └─HashAgg 8000.00 mpp[tiflash] group by:test.ts.col_0, test.ts.col_1, test.ts.col_2, test.ts.id, ", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" ], @@ -7753,13 +9026,13 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(col_1, id order by col_0) from ts group by col_2", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#9, funcs:group_concat(Column#6, Column#7 order by Column#8 separator \",\")->Column#5", " └─Projection 10000.00 mpp[tiflash] test.ts.col_1, cast(test.ts.id, var_string(20))->Column#7, test.ts.col_0, test.ts.col_2", " └─ExchangeReceiver 10000.00 mpp[tiflash] ", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -7769,13 +9042,13 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_1, id order by col_0) from ts group by col_2", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#9, funcs:group_concat(distinct Column#6, Column#7 order by Column#8 separator \",\")->Column#5", " └─Projection 8000.00 mpp[tiflash] test.ts.col_1, cast(test.ts.id, var_string(20))->Column#7, test.ts.col_0, test.ts.col_2", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", " └─HashAgg 8000.00 mpp[tiflash] group by:test.ts.col_1, test.ts.col_2, test.ts.id, funcs:firstrow(test.ts.col_0)->test.ts.col_0", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" ], @@ -7786,13 +9059,13 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(col_0, col_1, id order by col_0),count(*),min(col_0),avg(id) from ts group by col_2", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#11, 0), 1, Column#11), decimal(20,0) BINARY))->Column#8", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#20, funcs:group_concat(Column#13, Column#14, Column#15 order by Column#16 separator \",\")->Column#5, funcs:count(1)->Column#6, funcs:min(Column#17)->Column#7, funcs:count(Column#18)->Column#11, funcs:sum(Column#19)->Column#8", " └─Projection 10000.00 mpp[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#15, test.ts.col_0, test.ts.col_0, test.ts.id, cast(test.ts.id, decimal(10,0) BINARY)->Column#19, test.ts.col_2", " └─ExchangeReceiver 10000.00 mpp[tiflash] ", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -7802,13 +9075,13 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0, col_1, id order by col_0),count(*),max(col_1),avg(id) from ts group by col_2", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#19, 0), 1, Column#19), decimal(20,0) BINARY))->Column#8", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#32, funcs:group_concat(distinct Column#25, Column#26, Column#27 order by Column#28 separator \",\")->Column#5, funcs:count(1)->Column#6, funcs:max(Column#29)->Column#7, funcs:count(Column#30)->Column#19, funcs:sum(Column#31)->Column#8", " └─Projection 10000.00 mpp[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#27, test.ts.col_0, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(10,0) BINARY)->Column#31, test.ts.col_2", " └─ExchangeReceiver 10000.00 mpp[tiflash] ", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -7818,7 +9091,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(col_0, col_1, id order by col_0),count(distinct id),min(col_0),avg(id) from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#10, 0), 1, Column#10), decimal(20,0) BINARY))->Column#8", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(Column#11, Column#12, Column#13 order by Column#14 separator \",\")->Column#5, funcs:count(Column#15)->Column#6, funcs:min(Column#16)->Column#7, funcs:count(Column#17)->Column#10, funcs:sum(Column#18)->Column#8", @@ -7834,7 +9107,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0, col_1, id order by col_0),count(distinct id),max(col_1),avg(id) from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#14, 0), 1, Column#14), decimal(20,0) BINARY))->Column#8", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(distinct Column#26, Column#27, Column#28 order by Column#29 separator \",\")->Column#5, funcs:sum(Column#30)->Column#6, funcs:max(Column#31)->Column#7, funcs:sum(Column#32)->Column#14, funcs:sum(Column#33)->Column#8", @@ -7852,13 +9125,13 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(col_0, col_1, id),count(distinct id),min(col_0),avg(id) from ts group by col_2", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#26, 0), 1, Column#26), decimal(20,0) BINARY))->Column#8", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#40, funcs:group_concat(Column#33, Column#34, Column#35 separator \",\")->Column#5, funcs:count(Column#36)->Column#6, funcs:min(Column#37)->Column#7, funcs:count(Column#38)->Column#26, funcs:sum(Column#39)->Column#8", " └─Projection 10000.00 mpp[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#35, test.ts.id, test.ts.col_0, test.ts.id, cast(test.ts.id, decimal(10,0) BINARY)->Column#39, test.ts.col_2", " └─ExchangeReceiver 10000.00 mpp[tiflash] ", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -7868,13 +9141,13 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0, col_1, id),count(distinct id),max(col_1),avg(id) from ts group by col_2", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#19, 0), 1, Column#19), decimal(20,0) BINARY))->Column#8", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#32, funcs:group_concat(distinct Column#25, Column#26, Column#27 separator \",\")->Column#5, funcs:count(Column#28)->Column#6, funcs:max(Column#29)->Column#7, funcs:count(Column#30)->Column#19, funcs:sum(Column#31)->Column#8", " └─Projection 10000.00 mpp[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#27, test.ts.id, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(10,0) BINARY)->Column#31, test.ts.col_2", " └─ExchangeReceiver 10000.00 mpp[tiflash] ", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -7885,7 +9158,7 @@ "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(col_0, col_1, id),count(distinct id),min(col_0),avg(id) from ts", "Plan": [ "HashAgg 1.00 root funcs:group_concat(Column#14 separator \",\")->Column#5, funcs:count(Column#15)->Column#6, funcs:min(Column#16)->Column#7, funcs:avg(Column#17, Column#18)->Column#8", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(Column#24, Column#25, Column#26 separator \",\")->Column#14, funcs:count(Column#27)->Column#15, funcs:min(Column#28)->Column#16, funcs:count(Column#29)->Column#17, funcs:sum(Column#30)->Column#18", " └─Projection 10000.00 mpp[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#26, test.ts.id, test.ts.col_0, test.ts.id, cast(test.ts.id, decimal(10,0) BINARY)->Column#30", @@ -7898,7 +9171,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0, col_1, id),count(distinct id),max(col_1),avg(id) from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#14, 0), 1, Column#14), decimal(20,0) BINARY))->Column#8", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(distinct Column#26, Column#27, Column#28 separator \",\")->Column#5, funcs:sum(Column#29)->Column#6, funcs:max(Column#30)->Column#7, funcs:sum(Column#31)->Column#14, funcs:sum(Column#32)->Column#8", @@ -7916,13 +9189,13 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(col_0, col_1, id),count(distinct id),group_concat(col_0 order by 1),avg(id) from ts group by col_2", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#17, 0), 1, Column#17), decimal(20,0) BINARY))->Column#8", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#29, funcs:group_concat(Column#21, Column#22, Column#23 separator \",\")->Column#5, funcs:count(Column#24)->Column#6, funcs:group_concat(Column#25 order by Column#26 separator \",\")->Column#7, funcs:count(Column#27)->Column#17, funcs:sum(Column#28)->Column#8", " └─Projection 10000.00 mpp[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#23, test.ts.id, test.ts.col_0, test.ts.col_0, test.ts.id, cast(test.ts.id, decimal(10,0) BINARY)->Column#28, test.ts.col_2", " └─ExchangeReceiver 10000.00 mpp[tiflash] ", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -7932,13 +9205,13 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0),count(distinct id),group_concat(col_1, id order by 1,2),avg(id) from ts group by col_2", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#13, 0), 1, Column#13), decimal(20,0) BINARY))->Column#8", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#24, funcs:group_concat(distinct Column#16 separator \",\")->Column#5, funcs:count(Column#17)->Column#6, funcs:group_concat(Column#18, Column#19 order by Column#20, Column#21 separator \",\")->Column#7, funcs:count(Column#22)->Column#13, funcs:sum(Column#23)->Column#8", " └─Projection 10000.00 mpp[tiflash] test.ts.col_0, test.ts.id, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#19, test.ts.col_1, test.ts.id, test.ts.id, cast(test.ts.id, decimal(10,0) BINARY)->Column#23, test.ts.col_2", " └─ExchangeReceiver 10000.00 mpp[tiflash] ", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -7948,7 +9221,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(col_0, id),count(distinct id),group_concat(col_1, id order by 1,2),min(col_0),avg(id) from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5, Column#6, Column#7, Column#8, div(Column#9, cast(case(eq(Column#15, 0), 1, Column#15), decimal(20,0) BINARY))->Column#9", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(Column#18, Column#19 separator \",\")->Column#5, funcs:count(Column#20)->Column#6, funcs:group_concat(Column#21, Column#22 order by Column#23, Column#24 separator \",\")->Column#7, funcs:min(Column#25)->Column#8, funcs:count(Column#26)->Column#15, funcs:sum(Column#27)->Column#9", @@ -7964,7 +9237,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0, col_1, id),count(distinct id),group_concat(col_1, id order by 1,2),max(col_1),avg(id) from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5, Column#6, Column#7, Column#8, div(Column#9, cast(case(eq(Column#12, 0), 1, Column#12), decimal(20,0) BINARY))->Column#9", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(distinct Column#14, Column#15, Column#16 separator \",\")->Column#5, funcs:count(Column#17)->Column#6, funcs:group_concat(Column#18, Column#19 order by Column#20, Column#21 separator \",\")->Column#7, funcs:max(Column#22)->Column#8, funcs:count(Column#23)->Column#12, funcs:sum(Column#24)->Column#9", @@ -7980,7 +9253,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0, col_1, id),count(distinct col_2),group_concat(col_1, id),max(col_1),avg(id) from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5, Column#6, Column#7, Column#8, div(Column#9, cast(case(eq(Column#15, 0), 1, Column#15), decimal(20,0) BINARY))->Column#9", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(distinct Column#29, Column#30, Column#31 separator \",\")->Column#5, funcs:count(distinct Column#32)->Column#6, funcs:group_concat(Column#33 separator \",\")->Column#7, funcs:max(Column#34)->Column#8, funcs:sum(Column#35)->Column#15, funcs:sum(Column#36)->Column#9", @@ -7998,13 +9271,13 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0, col_1, id),count(distinct col_2),group_concat(col_1, id),max(col_1),avg(id) from ts group by col_0", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5, Column#6, Column#7, Column#8, div(Column#9, cast(case(eq(Column#20, 0), 1, Column#20), decimal(20,0) BINARY))->Column#9", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#35, funcs:group_concat(distinct Column#26, Column#27, Column#28 separator \",\")->Column#5, funcs:count(distinct Column#29)->Column#6, funcs:group_concat(Column#30, Column#31 separator \",\")->Column#7, funcs:max(Column#32)->Column#8, funcs:count(Column#33)->Column#20, funcs:sum(Column#34)->Column#9", " └─Projection 10000.00 mpp[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#28, test.ts.col_2, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#31, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(10,0) BINARY)->Column#34, test.ts.col_0", " └─ExchangeReceiver 10000.00 mpp[tiflash] ", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_0, collate: utf8mb4_bin]", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.ts.col_0, collate: utf8mb4_bin]", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -8014,7 +9287,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,'GG') from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(distinct Column#10, Column#11 separator \",\")->Column#5", @@ -8033,7 +9306,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,'01') from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(distinct Column#10, Column#11 separator \",\")->Column#5", @@ -8050,7 +9323,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,1) from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(distinct Column#10, Column#11 separator \",\")->Column#5", @@ -8067,7 +9340,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,0) from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(distinct Column#8, Column#9 separator \",\")->Column#5", @@ -8084,13 +9357,13 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,10) from ts group by '010'", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5", " └─HashAgg 1.00 mpp[tiflash] group by:Column#17, funcs:group_concat(distinct Column#15, Column#16 separator \",\")->Column#5", " └─Projection 1.00 mpp[tiflash] cast(Column#13, var_string(20))->Column#15, cast(Column#14, var_string(20))->Column#16, Column#12", " └─ExchangeReceiver 1.00 mpp[tiflash] ", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#12, collate: binary]", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#12, collate: binary]", " └─HashAgg 1.00 mpp[tiflash] group by:0, 1, 10, ", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" ], @@ -8101,13 +9374,13 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,0) from ts group by '011'", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5", " └─HashAgg 1.00 mpp[tiflash] group by:Column#14, funcs:group_concat(distinct Column#12, Column#13 separator \",\")->Column#5", " └─Projection 1.00 mpp[tiflash] cast(Column#11, var_string(20))->Column#12, cast(Column#11, var_string(20))->Column#13, Column#10", " └─ExchangeReceiver 1.00 mpp[tiflash] ", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#10, collate: binary]", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#10, collate: binary]", " └─HashAgg 1.00 mpp[tiflash] group by:0, 1, ", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" ], @@ -8118,13 +9391,13 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,'GG') from ts group by 'GG'", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5", " └─HashAgg 1.00 mpp[tiflash] group by:Column#17, funcs:group_concat(distinct Column#15, Column#16 separator \",\")->Column#5", " └─Projection 1.00 mpp[tiflash] cast(Column#13, var_string(20))->Column#15, Column#14, Column#12", " └─ExchangeReceiver 1.00 mpp[tiflash] ", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#12, collate: binary]", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#12, collate: binary]", " └─HashAgg 1.00 mpp[tiflash] group by:\"GG\", 0, 1, ", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" ], @@ -8141,7 +9414,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 'GG','GG') from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(distinct Column#7, Column#7 separator \",\")->Column#5", @@ -8157,7 +9430,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 'Gg','GG') from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(distinct Column#8, Column#9 separator \",\")->Column#5", @@ -8173,7 +9446,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 'GG-10','GG') from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(distinct Column#8, Column#9 separator \",\")->Column#5", @@ -8189,7 +9462,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct '1200-01-01 00:00:00.023',1200) from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(distinct Column#10, Column#11 separator \",\")->Column#5", @@ -8208,12 +9481,12 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(col_0, col_0) from ts group by id", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5", " └─HashAgg 8000.00 mpp[tiflash] group by:test.ts.id, funcs:group_concat(test.ts.col_0, test.ts.col_0 separator \",\")->Column#5", " └─ExchangeReceiver 10000.00 mpp[tiflash] ", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.id, collate: binary]", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.ts.id, collate: binary]", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -8223,13 +9496,13 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(col_0, col_0,id) from ts group by id", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#13, funcs:group_concat(Column#10, Column#11, Column#12 separator \",\")->Column#5", " └─Projection 10000.00 mpp[tiflash] test.ts.col_0, test.ts.col_0, cast(test.ts.id, var_string(20))->Column#12, test.ts.id", " └─ExchangeReceiver 10000.00 mpp[tiflash] ", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.id, collate: binary]", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.ts.id, collate: binary]", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -8239,7 +9512,7 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0 order by id<10) from ts", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5", " └─HashAgg 1.00 mpp[tiflash] funcs:group_concat(distinct test.ts.col_0 order by Column#7 separator \",\")->Column#5", @@ -8256,12 +9529,12 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0 order by id<10) from ts group by col_1", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5", " └─HashAgg 8000.00 mpp[tiflash] group by:test.ts.col_1, funcs:group_concat(distinct test.ts.col_0 order by Column#8 separator \",\")->Column#5", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_1, collate: utf8mb4_bin]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.ts.col_1, collate: utf8mb4_bin]", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#10, Column#11, funcs:firstrow(Column#9)->Column#8", " └─Projection 10000.00 mpp[tiflash] lt(test.ts.id, 10)->Column#9, test.ts.col_1, test.ts.col_0", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" @@ -8273,13 +9546,13 @@ { "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0>10 order by id<10) from ts group by col_1", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#17, funcs:group_concat(distinct Column#15 order by Column#16 separator \",\")->Column#5", " └─Projection 8000.00 mpp[tiflash] cast(Column#10, var_string(20))->Column#15, Column#11, test.ts.col_1", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_1, collate: utf8mb4_bin]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.ts.col_1, collate: utf8mb4_bin]", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#13, Column#14, funcs:firstrow(Column#12)->Column#11", " └─Projection 10000.00 mpp[tiflash] lt(test.ts.id, 10)->Column#12, test.ts.col_1, gt(cast(test.ts.col_0, double BINARY), 10)->Column#14", " └─TableFullScan 10000.00 mpp[tiflash] table:ts keep order:false, stats:pseudo" @@ -8314,12 +9587,12 @@ "Plan": [ "Projection 8000.00 root Column#5", "└─Sort 8000.00 root test.t.id", - " └─TableReader 8000.00 root data:ExchangeSender", + " └─TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5, test.t.id", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, test.t.name, funcs:sum(Column#7)->Column#5, funcs:firstrow(test.t.id)->test.t.id", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.name, collate: utf8mb4_bin], [name: test.t.id, collate: binary]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.name, collate: utf8mb4_bin], [name: test.t.id, collate: binary]", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, test.t.name, funcs:count(1)->Column#7", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] @@ -8328,12 +9601,12 @@ "SQL": "desc format = 'brief' select count(*) from (select * from t order by id)a group by name order by 1", "Plan": [ "Sort 8000.00 root Column#5", - "└─TableReader 8000.00 root data:ExchangeSender", + "└─TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.name, funcs:sum(Column#8)->Column#5", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.name, collate: utf8mb4_bin]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.name, collate: utf8mb4_bin]", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.name, funcs:count(1)->Column#8", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] @@ -8342,14 +9615,14 @@ "SQL": "desc format = 'brief' select count(*) from (select id,name from t group by id,name order by id,name)a group by name order by 1", "Plan": [ "Sort 8000.00 root Column#5", - "└─TableReader 8000.00 root data:ExchangeSender", + "└─TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.name, funcs:count(1)->Column#5", " └─Projection 8000.00 mpp[tiflash] test.t.id, test.t.name", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, test.t.name, funcs:firstrow(test.t.id)->test.t.id, funcs:firstrow(test.t.name)->test.t.name", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.name, collate: utf8mb4_bin]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.name, collate: utf8mb4_bin]", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, test.t.name, ", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] @@ -8358,7 +9631,7 @@ "SQL": "desc format = 'brief' select * from (select id from t group by id order by id)a join t on a.id=t.id order by 1", "Plan": [ "Sort 9990.00 root test.t.id", - "└─TableReader 9990.00 root data:ExchangeSender", + "└─TableReader 9990.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 9990.00 mpp[tiflash] test.t.id, test.t.id, test.t.value, test.t.name", " └─HashJoin 9990.00 mpp[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", @@ -8367,7 +9640,7 @@ " │ └─Projection 7992.00 mpp[tiflash] test.t.id", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, funcs:firstrow(test.t.id)->test.t.id", " │ └─ExchangeReceiver 7992.00 mpp[tiflash] ", - " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.id, collate: binary]", " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.id, ", " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", @@ -8379,7 +9652,7 @@ "SQL": "desc format = 'brief' select * from (select * from t order by id)a join t on a.id=t.id order by 1", "Plan": [ "Sort 12487.50 root test.t.id", - "└─TableReader 12487.50 root data:ExchangeSender", + "└─TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 12487.50 mpp[tiflash] test.t.id, test.t.value, test.t.name, test.t.id, test.t.value, test.t.name", " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", @@ -8394,7 +9667,7 @@ { "SQL": "desc format = 'brief' select * from ((select id from t order by 1) union all (select id+1 from t order by 1))c", "Plan": [ - "TableReader 20000.00 root data:ExchangeSender", + "TableReader 20000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 20000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Union 20000.00 mpp[tiflash] ", " ├─Projection 10000.00 mpp[tiflash] cast(test.t.id, bigint(20) BINARY)->Column#10", @@ -8406,7 +9679,7 @@ { "SQL": "desc format = 'brief' select * from ((select count(*) from (select id,name from t order by id)a group by name,id order by id) union all (select id+1 from t order by 1))c", "Plan": [ - "TableReader 18000.00 root data:ExchangeSender", + "TableReader 18000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 18000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Union 18000.00 mpp[tiflash] ", " ├─Projection 8000.00 mpp[tiflash] cast(Column#12, bigint(21) BINARY)->Column#12", @@ -8414,7 +9687,7 @@ " │ └─Projection 8000.00 mpp[tiflash] Column#5, test.t.id", " │ └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, test.t.name, funcs:sum(Column#19)->Column#5, funcs:firstrow(test.t.id)->test.t.id", " │ └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.name, collate: utf8mb4_bin], [name: test.t.id, collate: binary]", + " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.name, collate: utf8mb4_bin], [name: test.t.id, collate: binary]", " │ └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, test.t.name, funcs:count(1)->Column#19", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", " └─Projection 10000.00 mpp[tiflash] cast(Column#11, bigint(21) BINARY)->Column#12", @@ -8426,7 +9699,7 @@ "SQL": "desc format = 'brief' select * from (select * from t order by id)a order by name", "Plan": [ "Sort 10000.00 root test.t.name", - "└─TableReader 10000.00 root data:ExchangeSender", + "└─TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ] @@ -8440,7 +9713,7 @@ "SQL": "explain format = 'brief' select sum(ps_supplycost) from partsupp, supplier where ps_suppkey = s_suppkey;", "Plan": [ "HashAgg 1.00 root funcs:sum(Column#15)->Column#14", - "└─TableReader 1.00 root data:ExchangeSender", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:sum(test.partsupp.ps_supplycost)->Column#15", " └─Projection 12500.00 mpp[tiflash] test.partsupp.ps_supplycost", @@ -8459,7 +9732,7 @@ { "SQL": "explain format = 'brief' select * from rp_t where a = 1 or a = 20", "Plan": [ - "TableReader 20.00 root partition:p0,p3 data:ExchangeSender", + "TableReader 20.00 root partition:p0,p3 MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 20.00 mpp[tiflash] ExchangeType: PassThrough", " └─Selection 20.00 mpp[tiflash] or(eq(test.rp_t.a, 1), eq(test.rp_t.a, 20))", " └─TableFullScan 10000.00 mpp[tiflash] table:rp_t keep order:false, stats:pseudo, PartitionTableScan:true" @@ -8468,7 +9741,7 @@ { "SQL": "explain format = 'brief' select * from hp_t where a = 1 or a = 20", "Plan": [ - "TableReader 20.00 root partition:p0,p1 data:ExchangeSender", + "TableReader 20.00 root partition:p0,p1 MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 20.00 mpp[tiflash] ExchangeType: PassThrough", " └─Selection 20.00 mpp[tiflash] or(eq(test.hp_t.a, 1), eq(test.hp_t.a, 20))", " └─TableFullScan 10000.00 mpp[tiflash] table:hp_t keep order:false, stats:pseudo, PartitionTableScan:true" @@ -8478,7 +9751,7 @@ "SQL": "explain format = 'brief' select count(*) from rp_t where a = 1 or a = 20", "Plan": [ "HashAgg 1.00 root funcs:count(Column#5)->Column#3", - "└─TableReader 1.00 root partition:p0,p3 data:ExchangeSender", + "└─TableReader 1.00 root partition:p0,p3 MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#5", " └─Selection 20.00 mpp[tiflash] or(eq(test.rp_t.a, 1), eq(test.rp_t.a, 20))", @@ -8489,7 +9762,7 @@ "SQL": "explain format = 'brief' select count(*) from hp_t where a = 1 or a = 20", "Plan": [ "HashAgg 1.00 root funcs:count(Column#5)->Column#3", - "└─TableReader 1.00 root partition:p0,p1 data:ExchangeSender", + "└─TableReader 1.00 root partition:p0,p1 MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#5", " └─Selection 20.00 mpp[tiflash] or(eq(test.hp_t.a, 1), eq(test.hp_t.a, 20))", @@ -8504,30 +9777,30 @@ { "SQL": "explain format = 'brief' select row_number() over w1 from t1 window w1 as (partition by c1 order by c1);", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 10000.00 mpp[tiflash] Column#5, stream_count: 8", " └─Window 10000.00 mpp[tiflash] row_number()->Column#5 over(partition by test.t1.c1 order by test.t1.c1 rows between current row and current row), stream_count: 8", " └─Sort 10000.00 mpp[tiflash] test.t1.c1, test.t1.c1, stream_count: 8", " └─ExchangeReceiver 10000.00 mpp[tiflash] stream_count: 8", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.c1, collate: binary], stream_count: 8", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.c1, collate: binary], stream_count: 8", " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" ] }, { "SQL": "explain format = 'brief' select row_number() over w1, rank() over w2 from t1 window w1 as (partition by c1 order by c1), w2 as (partition by c2);", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 10000.00 mpp[tiflash] Column#7, Column#6, stream_count: 8", " └─Window 10000.00 mpp[tiflash] row_number()->Column#7 over(partition by test.t1.c1 order by test.t1.c1 rows between current row and current row), stream_count: 8", " └─Sort 10000.00 mpp[tiflash] test.t1.c1, test.t1.c1, stream_count: 8", " └─ExchangeReceiver 10000.00 mpp[tiflash] stream_count: 8", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.c1, collate: binary], stream_count: 8", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.c1, collate: binary], stream_count: 8", " └─Window 10000.00 mpp[tiflash] rank()->Column#6 over(partition by test.t1.c2), stream_count: 8", " └─Sort 10000.00 mpp[tiflash] test.t1.c2, stream_count: 8", " └─ExchangeReceiver 10000.00 mpp[tiflash] stream_count: 8", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.c2, collate: binary], stream_count: 8", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.c2, collate: binary], stream_count: 8", " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" ] }, @@ -8536,34 +9809,34 @@ "Plan": [ "Projection 10.00 root Column#7, Column#6", "└─TopN 10.00 root Column#7, Column#6, offset:0, count:10", - " └─TableReader 10.00 root data:ExchangeSender", + " └─TableReader 10.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 10.00 mpp[tiflash] ExchangeType: PassThrough", " └─TopN 10.00 mpp[tiflash] Column#7, Column#6, offset:0, count:10", " └─Window 10000.00 mpp[tiflash] row_number()->Column#7 over(partition by test.t1.c1 order by test.t1.c1 rows between current row and current row), stream_count: 8", " └─Sort 10000.00 mpp[tiflash] test.t1.c1, test.t1.c1, stream_count: 8", " └─ExchangeReceiver 10000.00 mpp[tiflash] stream_count: 8", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.c1, collate: binary], stream_count: 8", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.c1, collate: binary], stream_count: 8", " └─Window 10000.00 mpp[tiflash] rank()->Column#6 over(partition by test.t1.c2), stream_count: 8", " └─Sort 10000.00 mpp[tiflash] test.t1.c2, stream_count: 8", " └─ExchangeReceiver 10000.00 mpp[tiflash] stream_count: 8", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.c2, collate: binary], stream_count: 8", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.c2, collate: binary], stream_count: 8", " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" ] }, { "SQL": "explain format = 'brief' select row_number() over w1, count(c2) from t1 group by c1 having c1 > 10 window w1 as (partition by c2 order by c2);", "Plan": [ - "TableReader 2666.67 root data:ExchangeSender", + "TableReader 2666.67 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 2666.67 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 2666.67 mpp[tiflash] Column#6, Column#4, stream_count: 8", " └─Window 2666.67 mpp[tiflash] row_number()->Column#6 over(partition by test.t1.c2 order by test.t1.c2 rows between current row and current row), stream_count: 8", " └─Sort 2666.67 mpp[tiflash] test.t1.c2, test.t1.c2, stream_count: 8", " └─ExchangeReceiver 2666.67 mpp[tiflash] stream_count: 8", - " └─ExchangeSender 2666.67 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.c2, collate: binary], stream_count: 8", + " └─ExchangeSender 2666.67 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.c2, collate: binary], stream_count: 8", " └─Projection 2666.67 mpp[tiflash] Column#4, test.t1.c2", " └─HashAgg 2666.67 mpp[tiflash] group by:test.t1.c1, funcs:sum(Column#9)->Column#4, funcs:firstrow(Column#10)->test.t1.c2", " └─ExchangeReceiver 2666.67 mpp[tiflash] ", - " └─ExchangeSender 2666.67 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.c1, collate: binary]", + " └─ExchangeSender 2666.67 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.c1, collate: binary]", " └─HashAgg 2666.67 mpp[tiflash] group by:test.t1.c1, funcs:count(test.t1.c2)->Column#9, funcs:firstrow(test.t1.c2)->Column#10", " └─Selection 3333.33 mpp[tiflash] gt(test.t1.c1, 10)", " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" @@ -8572,17 +9845,17 @@ { "SQL": "explain format = 'brief' select row_number() over w1, count(c1) from t1 group by c2 having c2 > 10 window w1 as (partition by c1 order by c2);", "Plan": [ - "TableReader 2666.67 root data:ExchangeSender", + "TableReader 2666.67 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 2666.67 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 2666.67 mpp[tiflash] Column#6, Column#4, stream_count: 8", " └─Window 2666.67 mpp[tiflash] row_number()->Column#6 over(partition by test.t1.c1 order by test.t1.c2 rows between current row and current row), stream_count: 8", " └─Sort 2666.67 mpp[tiflash] test.t1.c1, test.t1.c2, stream_count: 8", " └─ExchangeReceiver 2666.67 mpp[tiflash] stream_count: 8", - " └─ExchangeSender 2666.67 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.c1, collate: binary], stream_count: 8", + " └─ExchangeSender 2666.67 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.c1, collate: binary], stream_count: 8", " └─Projection 2666.67 mpp[tiflash] Column#4, test.t1.c1, test.t1.c2", " └─HashAgg 2666.67 mpp[tiflash] group by:test.t1.c2, funcs:sum(Column#9)->Column#4, funcs:firstrow(Column#10)->test.t1.c1, funcs:firstrow(test.t1.c2)->test.t1.c2", " └─ExchangeReceiver 2666.67 mpp[tiflash] ", - " └─ExchangeSender 2666.67 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.c2, collate: binary]", + " └─ExchangeSender 2666.67 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.c2, collate: binary]", " └─HashAgg 2666.67 mpp[tiflash] group by:test.t1.c2, funcs:count(test.t1.c1)->Column#9, funcs:firstrow(test.t1.c1)->Column#10", " └─Selection 3333.33 mpp[tiflash] gt(test.t1.c2, 10)", " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" @@ -8591,13 +9864,13 @@ { "SQL": "explain format = 'brief' select row_number() over w1 from t1 a join t1 b on a.c1 = b.c2 window w1 as (partition by a.c1);", "Plan": [ - "TableReader 12487.50 root data:ExchangeSender", + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 12487.50 mpp[tiflash] Column#8, stream_count: 8", " └─Window 12487.50 mpp[tiflash] row_number()->Column#8 over(partition by test.t1.c1 rows between current row and current row), stream_count: 8", " └─Sort 12487.50 mpp[tiflash] test.t1.c1, stream_count: 8", " └─ExchangeReceiver 12487.50 mpp[tiflash] stream_count: 8", - " └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.c1, collate: binary], stream_count: 8", + " └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.c1, collate: binary], stream_count: 8", " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t1.c1, test.t1.c2)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", @@ -8610,13 +9883,13 @@ { "SQL": "explain format = 'brief' select row_number() over w1 from t1 where c1 < 100 window w1 as (partition by c1 order by c1);", "Plan": [ - "TableReader 3323.33 root data:ExchangeSender", + "TableReader 3323.33 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 3323.33 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 3323.33 mpp[tiflash] Column#5, stream_count: 8", " └─Window 3323.33 mpp[tiflash] row_number()->Column#5 over(partition by test.t1.c1 order by test.t1.c1 rows between current row and current row), stream_count: 8", " └─Sort 3323.33 mpp[tiflash] test.t1.c1, test.t1.c1, stream_count: 8", " └─ExchangeReceiver 3323.33 mpp[tiflash] stream_count: 8", - " └─ExchangeSender 3323.33 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.c1, collate: binary], stream_count: 8", + " └─ExchangeSender 3323.33 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.c1, collate: binary], stream_count: 8", " └─Selection 3323.33 mpp[tiflash] lt(test.t1.c1, 100)", " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" ] @@ -8624,7 +9897,7 @@ { "SQL": "explain format = 'brief' select * from t1;", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" ] @@ -8632,7 +9905,7 @@ { "SQL": "explain format = 'brief' select row_number() over w1 from t1 window w1 as (order by c1);", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 10000.00 mpp[tiflash] Column#5", " └─Window 10000.00 mpp[tiflash] row_number()->Column#5 over(order by test.t1.c1 rows between current row and current row)", @@ -8645,7 +9918,7 @@ { "SQL": "explain format = 'brief' select row_number() over w1, count(c2) from t1 group by c1 having c1 > 10 window w1 as (partition by c1 order by c2);", "Plan": [ - "TableReader 2666.67 root data:ExchangeSender", + "TableReader 2666.67 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 2666.67 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 2666.67 mpp[tiflash] Column#6, Column#4", " └─Window 2666.67 mpp[tiflash] row_number()->Column#6 over(partition by test.t1.c1 order by test.t1.c2 rows between current row and current row)", @@ -8653,7 +9926,7 @@ " └─Projection 2666.67 mpp[tiflash] Column#4, test.t1.c1, test.t1.c2", " └─HashAgg 2666.67 mpp[tiflash] group by:test.t1.c1, funcs:sum(Column#9)->Column#4, funcs:firstrow(test.t1.c1)->test.t1.c1, funcs:firstrow(Column#11)->test.t1.c2", " └─ExchangeReceiver 2666.67 mpp[tiflash] ", - " └─ExchangeSender 2666.67 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.c1, collate: binary]", + " └─ExchangeSender 2666.67 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.c1, collate: binary]", " └─HashAgg 2666.67 mpp[tiflash] group by:test.t1.c1, funcs:count(test.t1.c2)->Column#9, funcs:firstrow(test.t1.c2)->Column#11", " └─Selection 3333.33 mpp[tiflash] gt(test.t1.c1, 10)", " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" @@ -8839,9 +10112,9 @@ { "SQL": "select count(1) from t1 where c1 = '0xfff' and c2 is not null", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#6)->Column#5", - "└─IndexReader 1.00 root index:HashAgg", - " └─HashAgg 1.00 cop[tikv] funcs:count(1)->Column#6", + "StreamAgg 1.00 root funcs:count(Column#7)->Column#5", + "└─IndexReader 1.00 root index:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#7", " └─IndexRangeScan 99.90 cop[tikv] table:t1, index:idx2(c1, c2) range:[\"0xfff\" -inf,\"0xfff\" +inf], keep order:false, stats:pseudo" ], "Result": [ @@ -8875,9 +10148,9 @@ { "SQL": "select count(1) from t1 where c1 >= '0xfff' and c2 is null", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#6)->Column#5", - "└─IndexReader 1.00 root index:HashAgg", - " └─HashAgg 1.00 cop[tikv] funcs:count(1)->Column#6", + "StreamAgg 1.00 root funcs:count(Column#7)->Column#5", + "└─IndexReader 1.00 root index:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#7", " └─Selection 3.33 cop[tikv] isnull(test.t1.c2)", " └─IndexRangeScan 3333.33 cop[tikv] table:t1, index:idx2(c1, c2) range:[\"0xfff\",+inf], keep order:false, stats:pseudo" ], @@ -8888,12 +10161,11 @@ { "SQL": "select count(1) from t1 where c1 = '0xfff' and (c2 + 1) is not null", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#9)->Column#5", - "└─IndexLookUp 1.00 root ", + "StreamAgg 1.00 root funcs:count(1)->Column#5", + "└─IndexLookUp 8.00 root ", " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, index:idx1(c1) range:[\"0xfff\",\"0xfff\"], keep order:false, stats:pseudo", - " └─HashAgg(Probe) 1.00 cop[tikv] funcs:count(1)->Column#9", - " └─Selection 8.00 cop[tikv] not(isnull(plus(cast(test.t1.c2, double BINARY), 1)))", - " └─TableRowIDScan 10.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + " └─Selection(Probe) 8.00 cop[tikv] not(isnull(plus(cast(test.t1.c2, double BINARY), 1)))", + " └─TableRowIDScan 10.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Result": [ "3" @@ -8902,12 +10174,11 @@ { "SQL": "select count(1) from t1 where c1 = '0xfff' and (c2 + 1) is null", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#9)->Column#5", - "└─IndexLookUp 1.00 root ", + "StreamAgg 1.00 root funcs:count(1)->Column#5", + "└─IndexLookUp 8.00 root ", " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, index:idx1(c1) range:[\"0xfff\",\"0xfff\"], keep order:false, stats:pseudo", - " └─HashAgg(Probe) 1.00 cop[tikv] funcs:count(1)->Column#9", - " └─Selection 8.00 cop[tikv] isnull(plus(cast(test.t1.c2, double BINARY), 1))", - " └─TableRowIDScan 10.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + " └─Selection(Probe) 8.00 cop[tikv] isnull(plus(cast(test.t1.c2, double BINARY), 1))", + " └─TableRowIDScan 10.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Result": [ "1" @@ -8982,9 +10253,9 @@ { "SQL": "select count(1) from t2 use index(idx) where b is null", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#5)->Column#4", - "└─IndexReader 1.00 root index:HashAgg", - " └─HashAgg 1.00 cop[tikv] funcs:count(1)->Column#5", + "StreamAgg 1.00 root funcs:count(Column#6)->Column#4", + "└─IndexReader 1.00 root index:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#6", " └─IndexRangeScan 10.00 cop[tikv] table:t2, index:idx(b) range:[NULL,NULL], keep order:false, stats:pseudo" ], "Result": [ @@ -9037,4 +10308,4 @@ } ] } -] +] \ No newline at end of file diff --git a/planner/core/testdata/join_reorder_suite_out.json b/planner/core/testdata/join_reorder_suite_out.json index 7289fbd043d00..58336dc72da14 100644 --- a/planner/core/testdata/join_reorder_suite_out.json +++ b/planner/core/testdata/join_reorder_suite_out.json @@ -5399,7 +5399,7 @@ { "SQL": "select /*+ straight_join() */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", "Plan": [ - "TableReader 15593.77 root data:ExchangeSender", + "TableReader 15593.77 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t2.b, test.t3.b)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", @@ -5419,7 +5419,7 @@ { "SQL": "select /*+ leading(t2) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", "Plan": [ - "TableReader 15593.77 root data:ExchangeSender", + "TableReader 15593.77 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 15593.77 mpp[tiflash] test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t2.b, test.t3.b)]", @@ -5440,7 +5440,7 @@ { "SQL": "select /*+ leading(t3) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", "Plan": [ - "TableReader 15593.77 root data:ExchangeSender", + "TableReader 15593.77 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 15593.77 mpp[tiflash] test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t2.a, test.t1.a)]", @@ -5461,7 +5461,7 @@ { "SQL": "select /*+ leading(t2, t3) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", "Plan": [ - "TableReader 15593.77 root data:ExchangeSender", + "TableReader 15593.77 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 15593.77 mpp[tiflash] test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t2.a, test.t1.a)]", @@ -5482,7 +5482,7 @@ { "SQL": "select /*+ leading(t3, t2) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", "Plan": [ - "TableReader 15593.77 root data:ExchangeSender", + "TableReader 15593.77 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 15593.77 mpp[tiflash] test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t2.a, test.t1.a)]", @@ -5503,7 +5503,7 @@ { "SQL": "select /*+ leading(t3, t1) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", "Plan": [ - "TableReader 124625374.88 root data:ExchangeSender", + "TableReader 124625374.88 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 124625374.88 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 124625374.88 mpp[tiflash] test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", " └─HashJoin 124625374.88 mpp[tiflash] inner join, equal:[eq(test.t1.a, test.t2.a) eq(test.t3.b, test.t2.b)]", @@ -5524,7 +5524,7 @@ { "SQL": "select /*+ leading(t1, t2) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "TableReader 24365.26 root data:ExchangeSender", + "TableReader 24365.26 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 24365.26 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 24365.26 mpp[tiflash] test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", " └─HashJoin 24365.26 mpp[tiflash] inner join, equal:[eq(test.t2.b, test.t3.b)]", @@ -5557,7 +5557,7 @@ { "SQL": "select /*+ leading(t2, t3) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "TableReader 24365.26 root data:ExchangeSender", + "TableReader 24365.26 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 24365.26 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 24365.26 mpp[tiflash] test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", " └─HashJoin 24365.26 mpp[tiflash] left outer join, equal:[eq(test.t.a, test.t1.a)]", @@ -5588,7 +5588,7 @@ { "SQL": "select /*+ leading(t4, t3, t2, t, t1) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "TableReader 24365.26 root data:ExchangeSender", + "TableReader 24365.26 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 24365.26 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 24365.26 mpp[tiflash] test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", " └─HashJoin 24365.26 mpp[tiflash] inner join, equal:[eq(test.t2.b, test.t3.b)]", @@ -5621,7 +5621,7 @@ { "SQL": "select /*+ leading(t4, t3, t2, t) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "TableReader 24365.26 root data:ExchangeSender", + "TableReader 24365.26 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 24365.26 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 24365.26 mpp[tiflash] test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", " └─HashJoin 24365.26 mpp[tiflash] inner join, equal:[eq(test.t2.b, test.t3.b)]", @@ -5654,7 +5654,7 @@ { "SQL": "select /*+ leading(t3, t2, t) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "TableReader 24365.26 root data:ExchangeSender", + "TableReader 24365.26 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 24365.26 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 24365.26 mpp[tiflash] test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", " └─HashJoin 24365.26 mpp[tiflash] left outer join, equal:[eq(test.t.a, test.t1.a)]", @@ -5685,14 +5685,14 @@ { "SQL": "select /*+ leading(t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", "Plan": [ - "TableReader 15609.38 root data:ExchangeSender", + "TableReader 15609.38 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 15609.38 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 15609.38 mpp[tiflash] left outer join, equal:[eq(test.t2.b, test.t1.b)]", " ├─ExchangeReceiver(Build) 10000.00 mpp[tiflash] ", - " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t2.b, collate: binary]", + " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t2.b, collate: binary]", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 12487.50 mpp[tiflash] ", - " └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.b, collate: binary]", + " └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.b, collate: binary]", " └─HashJoin 12487.50 mpp[tiflash] left outer join, equal:[eq(test.t1.a, test.t3.a)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", @@ -5706,14 +5706,14 @@ { "SQL": "select /*+ leading(t2, t1, t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", "Plan": [ - "TableReader 15609.38 root data:ExchangeSender", + "TableReader 15609.38 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 15609.38 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 15609.38 mpp[tiflash] left outer join, equal:[eq(test.t2.b, test.t1.b)]", " ├─ExchangeReceiver(Build) 10000.00 mpp[tiflash] ", - " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t2.b, collate: binary]", + " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t2.b, collate: binary]", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 12487.50 mpp[tiflash] ", - " └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.b, collate: binary]", + " └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.b, collate: binary]", " └─HashJoin 12487.50 mpp[tiflash] left outer join, equal:[eq(test.t1.a, test.t3.a)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", @@ -5730,14 +5730,14 @@ { "SQL": "select /*+ leading(t2, t3) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", "Plan": [ - "TableReader 19492.21 root data:ExchangeSender", + "TableReader 19492.21 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 19492.21 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 19492.21 mpp[tiflash] left outer join, equal:[eq(test.t2.b, test.t1.b)]", " ├─ExchangeReceiver(Build) 10000.00 mpp[tiflash] ", - " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t2.b, collate: binary]", + " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t2.b, collate: binary]", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 15593.77 mpp[tiflash] ", - " └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.b, collate: binary]", + " └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.b, collate: binary]", " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t3.b, test.t4.b)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", @@ -5759,14 +5759,14 @@ { "SQL": "select /*+ leading(t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", "Plan": [ - "TableReader 19492.21 root data:ExchangeSender", + "TableReader 19492.21 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 19492.21 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 19492.21 mpp[tiflash] left outer join, equal:[eq(test.t2.b, test.t1.b)]", " ├─ExchangeReceiver(Build) 10000.00 mpp[tiflash] ", - " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t2.b, collate: binary]", + " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t2.b, collate: binary]", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 15593.77 mpp[tiflash] ", - " └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.b, collate: binary]", + " └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.b, collate: binary]", " └─Projection 15593.77 mpp[tiflash] test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t3.a, test.t1.a)]", " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", @@ -5786,12 +5786,12 @@ { "SQL": "select /*+ leading(t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", "Plan": [ - "TableReader 30426.12 root data:ExchangeSender", + "TableReader 30426.12 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 30426.12 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 30426.12 mpp[tiflash] test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", " └─HashJoin 30426.12 mpp[tiflash] left outer join, equal:[eq(test.t2.b, test.t1.b)]", " ├─ExchangeReceiver(Build) 15593.77 mpp[tiflash] ", - " │ └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t2.b, collate: binary]", + " │ └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t2.b, collate: binary]", " │ └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t5.b, test.t6.b)]", " │ ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", " │ │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", @@ -5805,7 +5805,7 @@ " │ └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t2.a))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 15593.77 mpp[tiflash] ", - " └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.b, collate: binary]", + " └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.b, collate: binary]", " └─Projection 15593.77 mpp[tiflash] test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t3.a, test.t1.a)]", " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", @@ -5825,12 +5825,12 @@ { "SQL": "select /*+ leading(t3, t4) leading(t5, t6) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", "Plan": [ - "TableReader 30426.12 root data:ExchangeSender", + "TableReader 30426.12 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 30426.12 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 30426.12 mpp[tiflash] test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", " └─HashJoin 30426.12 mpp[tiflash] left outer join, equal:[eq(test.t2.b, test.t1.b)]", " ├─ExchangeReceiver(Build) 15593.77 mpp[tiflash] ", - " │ └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t2.b, collate: binary]", + " │ └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t2.b, collate: binary]", " │ └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t5.b, test.t6.b)]", " │ ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", " │ │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", @@ -5844,7 +5844,7 @@ " │ └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t2.a))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 15593.77 mpp[tiflash] ", - " └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.b, collate: binary]", + " └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.b, collate: binary]", " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t3.b, test.t4.b)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", @@ -5865,12 +5865,12 @@ { "SQL": "select /*+ leading(t5, t6, t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", "Plan": [ - "TableReader 30426.12 root data:ExchangeSender", + "TableReader 30426.12 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 30426.12 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 30426.12 mpp[tiflash] test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", " └─HashJoin 30426.12 mpp[tiflash] left outer join, equal:[eq(test.t2.b, test.t1.b)]", " ├─ExchangeReceiver(Build) 15593.77 mpp[tiflash] ", - " │ └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t2.b, collate: binary]", + " │ └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t2.b, collate: binary]", " │ └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t5.b, test.t6.b)]", " │ ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", " │ │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", @@ -5884,7 +5884,7 @@ " │ └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t2.a))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 15593.77 mpp[tiflash] ", - " └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.b, collate: binary]", + " └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.b, collate: binary]", " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t3.b, test.t4.b)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", @@ -5906,11 +5906,11 @@ { "SQL": "select /*+ leading(t1, t2) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "TableReader 24389.65 root data:ExchangeSender", + "TableReader 24389.65 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 24389.65 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 24389.65 mpp[tiflash] right outer join, equal:[eq(test.t.a, test.t1.a)]", " ├─ExchangeReceiver(Build) 12487.50 mpp[tiflash] ", - " │ └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary]", + " │ └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", " │ └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t4.a, test.t.a)]", " │ ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", " │ │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", @@ -5919,7 +5919,7 @@ " │ └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 15609.38 mpp[tiflash] ", - " └─ExchangeSender 15609.38 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.a, collate: binary]", + " └─ExchangeSender 15609.38 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.a, collate: binary]", " └─HashJoin 15609.38 mpp[tiflash] inner join, equal:[eq(test.t2.b, test.t3.b)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", @@ -5938,12 +5938,12 @@ { "SQL": "select /*+ leading(t2, t3) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "TableReader 24389.65 root data:ExchangeSender", + "TableReader 24389.65 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 24389.65 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 24389.65 mpp[tiflash] test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", " └─HashJoin 24389.65 mpp[tiflash] right outer join, equal:[eq(test.t.a, test.t1.a)]", " ├─ExchangeReceiver(Build) 12487.50 mpp[tiflash] ", - " │ └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary]", + " │ └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", " │ └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t4.a, test.t.a)]", " │ ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", " │ │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", @@ -5952,7 +5952,7 @@ " │ └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 15609.38 mpp[tiflash] ", - " └─ExchangeSender 15609.38 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.a, collate: binary]", + " └─ExchangeSender 15609.38 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.a, collate: binary]", " └─HashJoin 15609.38 mpp[tiflash] inner join, equal:[eq(test.t2.b, test.t1.b)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", @@ -5971,11 +5971,11 @@ { "SQL": "select /*+ leading(t1, t3) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "TableReader 24389.65 root data:ExchangeSender", + "TableReader 24389.65 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 24389.65 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 24389.65 mpp[tiflash] right outer join, equal:[eq(test.t.a, test.t1.a)]", " ├─ExchangeReceiver(Build) 12487.50 mpp[tiflash] ", - " │ └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary]", + " │ └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", " │ └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t4.a, test.t.a)]", " │ ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", " │ │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", @@ -5984,7 +5984,7 @@ " │ └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 15609.38 mpp[tiflash] ", - " └─ExchangeSender 15609.38 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.a, collate: binary]", + " └─ExchangeSender 15609.38 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t1.a, collate: binary]", " └─HashJoin 15609.38 mpp[tiflash] inner join, equal:[eq(test.t2.b, test.t3.b)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", @@ -6005,7 +6005,7 @@ { "SQL": "select /*+ leading(t3) */ * from t2 right join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", "Plan": [ - "TableReader 15593.77 root data:ExchangeSender", + "TableReader 15593.77 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 15593.77 mpp[tiflash] right outer join, equal:[eq(test.t2.b, test.t1.b)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", @@ -6024,7 +6024,7 @@ { "SQL": "select /*+ leading(t2, t1, t3) */ * from t2 right join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", "Plan": [ - "TableReader 15593.77 root data:ExchangeSender", + "TableReader 15593.77 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 15593.77 mpp[tiflash] left outer join, equal:[eq(test.t1.a, test.t3.a)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", @@ -6043,7 +6043,7 @@ { "SQL": "select /*+ leading(t2, t3) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", "Plan": [ - "TableReader 19492.21 root data:ExchangeSender", + "TableReader 19492.21 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 19492.21 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 19492.21 mpp[tiflash] test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", " └─HashJoin 19492.21 mpp[tiflash] inner join, equal:[eq(test.t3.b, test.t4.b)]", @@ -6071,7 +6071,7 @@ { "SQL": "select /*+ leading(t3, t4) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", "Plan": [ - "TableReader 19492.21 root data:ExchangeSender", + "TableReader 19492.21 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 19492.21 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 19492.21 mpp[tiflash] test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", " └─HashJoin 19492.21 mpp[tiflash] right outer join, equal:[eq(test.t2.b, test.t1.b)]", @@ -6097,7 +6097,7 @@ { "SQL": "select /*+ leading(t3, t4) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", "Plan": [ - "TableReader 30456.57 root data:ExchangeSender", + "TableReader 30456.57 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 30456.57 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 30456.57 mpp[tiflash] test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", " └─HashJoin 30456.57 mpp[tiflash] inner join, equal:[eq(test.t5.b, test.t6.b)]", @@ -6133,7 +6133,7 @@ { "SQL": "select /*+ leading(t3, t4) leading(t5, t6) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", "Plan": [ - "TableReader 30456.57 root data:ExchangeSender", + "TableReader 30456.57 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 30456.57 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 30456.57 mpp[tiflash] test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", " └─HashJoin 30456.57 mpp[tiflash] inner join, equal:[eq(test.t5.b, test.t6.b)]", @@ -6171,7 +6171,7 @@ { "SQL": "select /*+ leading(t3, t4, t5, t6) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", "Plan": [ - "TableReader 243165526.37 root data:ExchangeSender", + "TableReader 243165526.37 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 243165526.37 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 243165526.37 mpp[tiflash] test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", " └─HashJoin 243165526.37 mpp[tiflash] inner join, equal:[eq(test.t3.a, test.t1.a) eq(test.t2.b, test.t1.b)]", @@ -6296,8 +6296,8 @@ "Plan": [ "Projection 1.00 root test.t1.a, Column#14", "└─Apply 1.00 root CARTESIAN left outer join", - " ├─HashAgg(Build) 1.00 root funcs:min(test.t1.a)->Column#10, funcs:firstrow(test.t1.a)->test.t1.a", - " │ └─IndexJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + " ├─StreamAgg(Build) 1.00 root funcs:min(test.t1.a)->Column#10, funcs:firstrow(test.t1.a)->test.t1.a", + " │ └─IndexHashJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", " │ ├─IndexReader(Build) 3.00 root index:IndexFullScan", " │ │ └─IndexFullScan 3.00 cop[tikv] table:t3, index:a(a) keep order:false", " │ └─IndexReader(Probe) 3.75 root index:Selection", @@ -6429,7 +6429,7 @@ "SQL": "select /*+ straight_join() */ t1.a, (select min(t2.a) from t2) from t1 join t3 on t1.a = t3.a;", "Plan": [ "Projection 3.75 root test.t1.a, ->Column#14", - "└─IndexJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + "└─IndexHashJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", " ├─IndexReader(Build) 3.00 root index:IndexFullScan", " │ └─IndexFullScan 3.00 cop[tikv] table:t3, index:a(a) keep order:false", " └─IndexReader(Probe) 3.75 root index:Selection", @@ -6915,8 +6915,8 @@ "Plan": [ "Projection 1.00 root test.t1.a, Column#14", "└─Apply 1.00 root CARTESIAN left outer join", - " ├─HashAgg(Build) 1.00 root funcs:min(test.t1.a)->Column#10, funcs:firstrow(test.t1.a)->test.t1.a", - " │ └─IndexJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + " ├─StreamAgg(Build) 1.00 root funcs:min(test.t1.a)->Column#10, funcs:firstrow(test.t1.a)->test.t1.a", + " │ └─IndexHashJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", " │ ├─IndexReader(Build) 3.00 root index:IndexFullScan", " │ │ └─IndexFullScan 3.00 cop[tikv] table:t3, index:a(a) keep order:false", " │ └─IndexReader(Probe) 3.75 root index:Selection", @@ -6935,8 +6935,8 @@ "Plan": [ "Projection 1.00 root test.t1.a, Column#14", "└─Apply 1.00 root CARTESIAN left outer join", - " ├─HashAgg(Build) 1.00 root funcs:min(test.t1.a)->Column#10, funcs:firstrow(test.t1.a)->test.t1.a", - " │ └─IndexJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + " ├─StreamAgg(Build) 1.00 root funcs:min(test.t1.a)->Column#10, funcs:firstrow(test.t1.a)->test.t1.a", + " │ └─IndexHashJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", " │ ├─IndexReader(Build) 3.00 root index:IndexFullScan", " │ │ └─IndexFullScan 3.00 cop[tikv] table:t3, index:a(a) keep order:false", " │ └─IndexReader(Probe) 3.75 root index:Selection", @@ -6957,8 +6957,8 @@ "Plan": [ "Projection 1.00 root test.t1.a, Column#14", "└─Apply 1.00 root CARTESIAN left outer join", - " ├─HashAgg(Build) 1.00 root funcs:min(test.t1.a)->Column#10, funcs:firstrow(test.t1.a)->test.t1.a", - " │ └─IndexJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + " ├─StreamAgg(Build) 1.00 root funcs:min(test.t1.a)->Column#10, funcs:firstrow(test.t1.a)->test.t1.a", + " │ └─IndexHashJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", " │ ├─IndexReader(Build) 3.00 root index:IndexFullScan", " │ │ └─IndexFullScan 3.00 cop[tikv] table:t3, index:a(a) keep order:false", " │ └─IndexReader(Probe) 3.75 root index:Selection", @@ -6979,8 +6979,8 @@ "Plan": [ "Projection 1.00 root test.t1.a, Column#14", "└─Apply 1.00 root CARTESIAN left outer join", - " ├─HashAgg(Build) 1.00 root funcs:min(test.t1.a)->Column#10, funcs:firstrow(test.t1.a)->test.t1.a", - " │ └─IndexJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + " ├─StreamAgg(Build) 1.00 root funcs:min(test.t1.a)->Column#10, funcs:firstrow(test.t1.a)->test.t1.a", + " │ └─IndexHashJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", " │ ├─IndexReader(Build) 3.00 root index:IndexFullScan", " │ │ └─IndexFullScan 3.00 cop[tikv] table:t3, index:a(a) keep order:false", " │ └─IndexReader(Probe) 3.75 root index:Selection", @@ -7002,8 +7002,8 @@ "Plan": [ "Projection 1.00 root test.t1.a, Column#14", "└─Apply 1.00 root CARTESIAN left outer join", - " ├─HashAgg(Build) 1.00 root funcs:min(test.t1.a)->Column#10, funcs:firstrow(test.t1.a)->test.t1.a", - " │ └─IndexJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + " ├─StreamAgg(Build) 1.00 root funcs:min(test.t1.a)->Column#10, funcs:firstrow(test.t1.a)->test.t1.a", + " │ └─IndexHashJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", " │ ├─IndexReader(Build) 3.00 root index:IndexFullScan", " │ │ └─IndexFullScan 3.00 cop[tikv] table:t3, index:a(a) keep order:false", " │ └─IndexReader(Probe) 3.75 root index:Selection", @@ -7024,8 +7024,8 @@ "Plan": [ "Projection 1.00 root test.t1.a, Column#14", "└─Apply 1.00 root CARTESIAN left outer join", - " ├─HashAgg(Build) 1.00 root funcs:min(test.t1.a)->Column#10, funcs:firstrow(test.t1.a)->test.t1.a", - " │ └─IndexJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + " ├─StreamAgg(Build) 1.00 root funcs:min(test.t1.a)->Column#10, funcs:firstrow(test.t1.a)->test.t1.a", + " │ └─IndexHashJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", " │ ├─IndexReader(Build) 3.00 root index:IndexFullScan", " │ │ └─IndexFullScan 3.00 cop[tikv] table:t3, index:a(a) keep order:false", " │ └─IndexReader(Probe) 3.75 root index:Selection", @@ -7046,14 +7046,13 @@ "SQL": "select /*+ leading(t4, t3@sel_2) */ * from t1 join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a = (select max(t3.a) from t3 where t1.b = t3.b)", "Plan": [ "HashJoin 4.69 root inner join, equal:[eq(test.t1.b, test.t4.b)]", - "├─IndexJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", - "│ ├─IndexJoin(Build) 3.00 root inner join, inner:IndexLookUp, outer key:Column#13, inner key:test.t1.a, equal cond:eq(Column#13, test.t1.a), eq(test.t3.b, test.t1.b)", + "├─IndexHashJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", + "│ ├─IndexHashJoin(Build) 3.00 root inner join, inner:IndexLookUp, outer key:Column#13, inner key:test.t1.a, equal cond:eq(Column#13, test.t1.a), eq(test.t3.b, test.t1.b)", "│ │ ├─Selection(Build) 2.40 root not(isnull(Column#13))", - "│ │ │ └─HashAgg 3.00 root group by:test.t3.b, funcs:max(Column#20)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", - "│ │ │ └─TableReader 3.00 root data:HashAgg", - "│ │ │ └─HashAgg 3.00 cop[tikv] group by:test.t3.b, funcs:max(test.t3.a)->Column#20", - "│ │ │ └─Selection 3.00 cop[tikv] not(isnull(test.t3.b))", - "│ │ │ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", + "│ │ │ └─HashAgg 3.00 root group by:test.t3.b, funcs:max(test.t3.a)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", + "│ │ │ └─TableReader 3.00 root data:Selection", + "│ │ │ └─Selection 3.00 cop[tikv] not(isnull(test.t3.b))", + "│ │ │ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", "│ │ └─IndexLookUp(Probe) 3.00 root ", "│ │ ├─Selection(Build) 3.00 cop[tikv] not(isnull(test.t1.a))", "│ │ │ └─IndexRangeScan 3.01 cop[tikv] table:t1, index:a(a) range: decided by [eq(test.t1.a, Column#13)], keep order:false, stats:pseudo", @@ -7076,14 +7075,13 @@ "SQL": "select /*+ leading(t4) */ * from t1 join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a = (select max(t3.a) from t3 where t1.b = t3.b)", "Plan": [ "Projection 4.69 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t4.a, test.t4.b", - "└─IndexJoin 4.69 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", + "└─IndexHashJoin 4.69 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", " ├─HashJoin(Build) 3.75 root inner join, equal:[eq(test.t1.b, test.t3.b) eq(test.t1.a, Column#13)]", " │ ├─Selection(Build) 2.40 root not(isnull(Column#13))", - " │ │ └─HashAgg 3.00 root group by:test.t3.b, funcs:max(Column#18)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", - " │ │ └─TableReader 3.00 root data:HashAgg", - " │ │ └─HashAgg 3.00 cop[tikv] group by:test.t3.b, funcs:max(test.t3.a)->Column#18", - " │ │ └─Selection 3.00 cop[tikv] not(isnull(test.t3.b))", - " │ │ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", + " │ │ └─HashAgg 3.00 root group by:test.t3.b, funcs:max(test.t3.a)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", + " │ │ └─TableReader 3.00 root data:Selection", + " │ │ └─Selection 3.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", " │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t4.b, test.t1.b)]", " │ ├─TableReader(Build) 9980.01 root data:Selection", " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", @@ -7102,14 +7100,13 @@ "SQL": "select /*+ leading(t3@sel_2) */ * from t1 join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a = (select max(t3.a) from t3 where t1.b = t3.b)", "Plan": [ "HashJoin 4.69 root inner join, equal:[eq(test.t1.b, test.t4.b)]", - "├─IndexJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", - "│ ├─IndexJoin(Build) 3.00 root inner join, inner:IndexLookUp, outer key:Column#13, inner key:test.t1.a, equal cond:eq(Column#13, test.t1.a), eq(test.t3.b, test.t1.b)", + "├─IndexHashJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", + "│ ├─IndexHashJoin(Build) 3.00 root inner join, inner:IndexLookUp, outer key:Column#13, inner key:test.t1.a, equal cond:eq(Column#13, test.t1.a), eq(test.t3.b, test.t1.b)", "│ │ ├─Selection(Build) 2.40 root not(isnull(Column#13))", - "│ │ │ └─HashAgg 3.00 root group by:test.t3.b, funcs:max(Column#20)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", - "│ │ │ └─TableReader 3.00 root data:HashAgg", - "│ │ │ └─HashAgg 3.00 cop[tikv] group by:test.t3.b, funcs:max(test.t3.a)->Column#20", - "│ │ │ └─Selection 3.00 cop[tikv] not(isnull(test.t3.b))", - "│ │ │ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", + "│ │ │ └─HashAgg 3.00 root group by:test.t3.b, funcs:max(test.t3.a)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", + "│ │ │ └─TableReader 3.00 root data:Selection", + "│ │ │ └─Selection 3.00 cop[tikv] not(isnull(test.t3.b))", + "│ │ │ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", "│ │ └─IndexLookUp(Probe) 3.00 root ", "│ │ ├─Selection(Build) 3.00 cop[tikv] not(isnull(test.t1.a))", "│ │ │ └─IndexRangeScan 3.01 cop[tikv] table:t1, index:a(a) range: decided by [eq(test.t1.a, Column#13)], keep order:false, stats:pseudo", @@ -7131,14 +7128,13 @@ "SQL": "select /*+ leading(t3@sel_2, t2) */ * from t1 join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a = (select max(t3.a) from t3 where t1.b = t3.b)", "Plan": [ "HashJoin 4.69 root inner join, equal:[eq(test.t1.b, test.t4.b)]", - "├─IndexJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", - "│ ├─IndexJoin(Build) 3.00 root inner join, inner:IndexLookUp, outer key:Column#13, inner key:test.t1.a, equal cond:eq(Column#13, test.t1.a), eq(test.t3.b, test.t1.b)", + "├─IndexHashJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", + "│ ├─IndexHashJoin(Build) 3.00 root inner join, inner:IndexLookUp, outer key:Column#13, inner key:test.t1.a, equal cond:eq(Column#13, test.t1.a), eq(test.t3.b, test.t1.b)", "│ │ ├─Selection(Build) 2.40 root not(isnull(Column#13))", - "│ │ │ └─HashAgg 3.00 root group by:test.t3.b, funcs:max(Column#20)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", - "│ │ │ └─TableReader 3.00 root data:HashAgg", - "│ │ │ └─HashAgg 3.00 cop[tikv] group by:test.t3.b, funcs:max(test.t3.a)->Column#20", - "│ │ │ └─Selection 3.00 cop[tikv] not(isnull(test.t3.b))", - "│ │ │ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", + "│ │ │ └─HashAgg 3.00 root group by:test.t3.b, funcs:max(test.t3.a)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", + "│ │ │ └─TableReader 3.00 root data:Selection", + "│ │ │ └─Selection 3.00 cop[tikv] not(isnull(test.t3.b))", + "│ │ │ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", "│ │ └─IndexLookUp(Probe) 3.00 root ", "│ │ ├─Selection(Build) 3.00 cop[tikv] not(isnull(test.t1.a))", "│ │ │ └─IndexRangeScan 3.01 cop[tikv] table:t1, index:a(a) range: decided by [eq(test.t1.a, Column#13)], keep order:false, stats:pseudo", @@ -7161,14 +7157,13 @@ "SQL": "select /*+ leading(t4, t3@sel_2) */ * from t1 join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a > (select min(t3.a) from t3 where t1.b = t3.b)", "Plan": [ "HashJoin 4.69 root inner join, equal:[eq(test.t1.b, test.t4.b)]", - "├─IndexJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", + "├─IndexHashJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", "│ ├─HashJoin(Build) 3.00 root inner join, equal:[eq(test.t3.b, test.t1.b)], other cond:gt(test.t1.a, Column#13)", "│ │ ├─Selection(Build) 2.40 root not(isnull(Column#13))", - "│ │ │ └─HashAgg 3.00 root group by:test.t3.b, funcs:min(Column#17)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", - "│ │ │ └─TableReader 3.00 root data:HashAgg", - "│ │ │ └─HashAgg 3.00 cop[tikv] group by:test.t3.b, funcs:min(test.t3.a)->Column#17", - "│ │ │ └─Selection 3.00 cop[tikv] not(isnull(test.t3.b))", - "│ │ │ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", + "│ │ │ └─HashAgg 3.00 root group by:test.t3.b, funcs:min(test.t3.a)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", + "│ │ │ └─TableReader 3.00 root data:Selection", + "│ │ │ └─Selection 3.00 cop[tikv] not(isnull(test.t3.b))", + "│ │ │ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", "│ │ └─TableReader(Probe) 9980.01 root data:Selection", "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", @@ -7189,14 +7184,13 @@ "SQL": "select /*+ leading(t4) */ * from t1 join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a > (select min(t3.a) from t3 where t1.b = t3.b)", "Plan": [ "Projection 4.69 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t4.a, test.t4.b", - "└─IndexJoin 4.69 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", + "└─IndexHashJoin 4.69 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", " ├─HashJoin(Build) 3.75 root inner join, equal:[eq(test.t1.b, test.t3.b)], other cond:gt(test.t1.a, Column#13)", " │ ├─Selection(Build) 2.40 root not(isnull(Column#13))", - " │ │ └─HashAgg 3.00 root group by:test.t3.b, funcs:min(Column#18)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", - " │ │ └─TableReader 3.00 root data:HashAgg", - " │ │ └─HashAgg 3.00 cop[tikv] group by:test.t3.b, funcs:min(test.t3.a)->Column#18", - " │ │ └─Selection 3.00 cop[tikv] not(isnull(test.t3.b))", - " │ │ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", + " │ │ └─HashAgg 3.00 root group by:test.t3.b, funcs:min(test.t3.a)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", + " │ │ └─TableReader 3.00 root data:Selection", + " │ │ └─Selection 3.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", " │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t4.b, test.t1.b)]", " │ ├─TableReader(Build) 9980.01 root data:Selection", " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", @@ -7215,14 +7209,13 @@ "SQL": "select /*+ leading(t3@sel_2) */ * from t1 join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a > (select min(t3.a) from t3 where t1.b = t3.b)", "Plan": [ "HashJoin 4.69 root inner join, equal:[eq(test.t1.b, test.t4.b)]", - "├─IndexJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", + "├─IndexHashJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", "│ ├─HashJoin(Build) 3.00 root inner join, equal:[eq(test.t3.b, test.t1.b)], other cond:gt(test.t1.a, Column#13)", "│ │ ├─Selection(Build) 2.40 root not(isnull(Column#13))", - "│ │ │ └─HashAgg 3.00 root group by:test.t3.b, funcs:min(Column#17)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", - "│ │ │ └─TableReader 3.00 root data:HashAgg", - "│ │ │ └─HashAgg 3.00 cop[tikv] group by:test.t3.b, funcs:min(test.t3.a)->Column#17", - "│ │ │ └─Selection 3.00 cop[tikv] not(isnull(test.t3.b))", - "│ │ │ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", + "│ │ │ └─HashAgg 3.00 root group by:test.t3.b, funcs:min(test.t3.a)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", + "│ │ │ └─TableReader 3.00 root data:Selection", + "│ │ │ └─Selection 3.00 cop[tikv] not(isnull(test.t3.b))", + "│ │ │ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", "│ │ └─TableReader(Probe) 9980.01 root data:Selection", "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", @@ -7242,14 +7235,13 @@ "SQL": "select /*+ leading(t3@sel_2, t2) */ * from t1 join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a > (select min(t3.a) from t3 where t1.b = t3.b)", "Plan": [ "HashJoin 4.69 root inner join, equal:[eq(test.t1.b, test.t4.b)]", - "├─IndexJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", + "├─IndexHashJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", "│ ├─HashJoin(Build) 3.00 root inner join, equal:[eq(test.t3.b, test.t1.b)], other cond:gt(test.t1.a, Column#13)", "│ │ ├─Selection(Build) 2.40 root not(isnull(Column#13))", - "│ │ │ └─HashAgg 3.00 root group by:test.t3.b, funcs:min(Column#17)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", - "│ │ │ └─TableReader 3.00 root data:HashAgg", - "│ │ │ └─HashAgg 3.00 cop[tikv] group by:test.t3.b, funcs:min(test.t3.a)->Column#17", - "│ │ │ └─Selection 3.00 cop[tikv] not(isnull(test.t3.b))", - "│ │ │ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", + "│ │ │ └─HashAgg 3.00 root group by:test.t3.b, funcs:min(test.t3.a)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", + "│ │ │ └─TableReader 3.00 root data:Selection", + "│ │ │ └─Selection 3.00 cop[tikv] not(isnull(test.t3.b))", + "│ │ │ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", "│ │ └─TableReader(Probe) 9980.01 root data:Selection", "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", @@ -7270,7 +7262,7 @@ "SQL": "select /*+ leading(t4) */ * from t1 join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a in (select t3.a from t3)", "Plan": [ "Projection 5.86 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t4.a, test.t4.b", - "└─IndexJoin 5.86 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", + "└─IndexHashJoin 5.86 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", " ├─HashJoin(Build) 4.69 root inner join, equal:[eq(test.t1.a, test.t3.a)]", " │ ├─StreamAgg(Build) 3.00 root group by:test.t3.a, funcs:firstrow(test.t3.a)->test.t3.a", " │ │ └─IndexReader 3.00 root index:StreamAgg", @@ -7293,8 +7285,8 @@ { "SQL": "select /*+ leading(t3@sel_2) */ * from t1 join t2 on t1.a=t2.a where t1.a in (select t3.a from t3)", "Plan": [ - "IndexJoin 4.69 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", - "├─IndexJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + "IndexHashJoin 4.69 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", + "├─IndexHashJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", "│ ├─StreamAgg(Build) 3.00 root group by:test.t3.a, funcs:firstrow(test.t3.a)->test.t3.a", "│ │ └─IndexReader 3.00 root index:StreamAgg", "│ │ └─StreamAgg 3.00 cop[tikv] group by:test.t3.a, ", @@ -7313,8 +7305,8 @@ { "SQL": "select /*+ leading(t2, t3@sel_2) */ * from t1 join t2 on t1.a=t2.a where t1.a in (select t3.a from t3)", "Plan": [ - "IndexJoin 4.69 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", - "├─IndexJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + "IndexHashJoin 4.69 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", + "├─IndexHashJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", "│ ├─StreamAgg(Build) 3.00 root group by:test.t3.a, funcs:firstrow(test.t3.a)->test.t3.a", "│ │ └─IndexReader 3.00 root index:StreamAgg", "│ │ └─StreamAgg 3.00 cop[tikv] group by:test.t3.a, ", @@ -7335,8 +7327,8 @@ { "SQL": "select /*+ leading(t1, t3@sel_2) */ * from t1 join t2 on t1.a=t2.a where t1.a in (select t3.a from t3)", "Plan": [ - "IndexJoin 4.69 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", - "├─IndexJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + "IndexHashJoin 4.69 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", + "├─IndexHashJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", "│ ├─StreamAgg(Build) 3.00 root group by:test.t3.a, funcs:firstrow(test.t3.a)->test.t3.a", "│ │ └─IndexReader 3.00 root index:StreamAgg", "│ │ └─StreamAgg 3.00 cop[tikv] group by:test.t3.a, ", @@ -7357,8 +7349,8 @@ { "SQL": "select /*+ leading(t3@sel_2, t2) */ * from t1 join t2 on t1.a=t2.a where t1.a in (select t3.a from t3)", "Plan": [ - "IndexJoin 4.69 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", - "├─IndexJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + "IndexHashJoin 4.69 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", + "├─IndexHashJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", "│ ├─StreamAgg(Build) 3.00 root group by:test.t3.a, funcs:firstrow(test.t3.a)->test.t3.a", "│ │ └─IndexReader 3.00 root index:StreamAgg", "│ │ └─StreamAgg 3.00 cop[tikv] group by:test.t3.a, ", @@ -7379,8 +7371,8 @@ { "SQL": "select /*+ leading(t3@sel_2, t1) */ * from t1 join t2 on t1.a=t2.a where t1.a in (select t3.a from t3)", "Plan": [ - "IndexJoin 4.69 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", - "├─IndexJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + "IndexHashJoin 4.69 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", + "├─IndexHashJoin(Build) 3.75 root inner join, inner:IndexLookUp, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", "│ ├─StreamAgg(Build) 3.00 root group by:test.t3.a, funcs:firstrow(test.t3.a)->test.t3.a", "│ │ └─IndexReader 3.00 root index:StreamAgg", "│ │ └─StreamAgg 3.00 cop[tikv] group by:test.t3.a, ", @@ -7726,7 +7718,7 @@ "SQL": "select /*+ leading(t1) */ t1.a, (select min(t2.a) from t2) from t1 join t3 on t1.a = t3.a;", "Plan": [ "Projection 3.75 root test.t1.a, ->Column#14", - "└─IndexJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + "└─IndexHashJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", " ├─IndexReader(Build) 3.00 root index:IndexFullScan", " │ └─IndexFullScan 3.00 cop[tikv] table:t3, index:a(a) keep order:false", " └─IndexReader(Probe) 3.75 root index:Selection", @@ -7739,7 +7731,7 @@ "SQL": "select /*+ leading(t1, t2@sel_2) */ t1.a, (select min(t2.a) from t2) from t1 join t3 on t1.a = t3.a;", "Plan": [ "Projection 3.75 root test.t1.a, ->Column#14", - "└─IndexJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + "└─IndexHashJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", " ├─IndexReader(Build) 3.00 root index:IndexFullScan", " │ └─IndexFullScan 3.00 cop[tikv] table:t3, index:a(a) keep order:false", " └─IndexReader(Probe) 3.75 root index:Selection", @@ -7755,7 +7747,7 @@ "SQL": "select /*+ leading(t1, t3) */ t1.a, (select min(t2.a) from t2) from t1 join t3 on t1.a = t3.a;", "Plan": [ "Projection 3.75 root test.t1.a, ->Column#14", - "└─IndexJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + "└─IndexHashJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", " ├─IndexReader(Build) 3.00 root index:IndexFullScan", " │ └─IndexFullScan 3.00 cop[tikv] table:t3, index:a(a) keep order:false", " └─IndexReader(Probe) 3.75 root index:Selection", @@ -7768,7 +7760,7 @@ "SQL": "select /*+ leading(t2@sel_2, t1) */ t1.a, (select min(t2.a) from t2) from t1 join t3 on t1.a = t3.a;", "Plan": [ "Projection 3.75 root test.t1.a, ->Column#14", - "└─IndexJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + "└─IndexHashJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", " ├─IndexReader(Build) 3.00 root index:IndexFullScan", " │ └─IndexFullScan 3.00 cop[tikv] table:t3, index:a(a) keep order:false", " └─IndexReader(Probe) 3.75 root index:Selection", @@ -7784,7 +7776,7 @@ "SQL": "select /*+ leading(t2@sel_2, t3) */ t1.a, (select min(t2.a) from t2) from t1 join t3 on t1.a = t3.a;", "Plan": [ "Projection 3.75 root test.t1.a, ->Column#14", - "└─IndexJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + "└─IndexHashJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", " ├─IndexReader(Build) 3.00 root index:IndexFullScan", " │ └─IndexFullScan 3.00 cop[tikv] table:t3, index:a(a) keep order:false", " └─IndexReader(Probe) 3.75 root index:Selection", @@ -7800,7 +7792,7 @@ "SQL": "select /*+ leading(t1, t2@sel_2) */ t1.a, (select min(t2.a) from t2) from t1 join t3 on t1.a = t3.a;", "Plan": [ "Projection 3.75 root test.t1.a, ->Column#14", - "└─IndexJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + "└─IndexHashJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", " ├─IndexReader(Build) 3.00 root index:IndexFullScan", " │ └─IndexFullScan 3.00 cop[tikv] table:t3, index:a(a) keep order:false", " └─IndexReader(Probe) 3.75 root index:Selection", @@ -7816,7 +7808,7 @@ "SQL": "select /*+ leading(t3, t2@sel_2) */ t1.a, (select min(t2.a) from t2) from t1 join t3 on t1.a = t3.a;", "Plan": [ "Projection 3.75 root test.t1.a, ->Column#14", - "└─IndexJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", + "└─IndexHashJoin 3.75 root inner join, inner:IndexReader, outer key:test.t3.a, inner key:test.t1.a, equal cond:eq(test.t3.a, test.t1.a)", " ├─IndexReader(Build) 3.00 root index:IndexFullScan", " │ └─IndexFullScan 3.00 cop[tikv] table:t3, index:a(a) keep order:false", " └─IndexReader(Probe) 3.75 root index:Selection", diff --git a/planner/core/testdata/json_plan_suite_in.json b/planner/core/testdata/json_plan_suite_in.json new file mode 100644 index 0000000000000..9d006cc16396b --- /dev/null +++ b/planner/core/testdata/json_plan_suite_in.json @@ -0,0 +1,12 @@ +[ + { + "name": "TestJSONPlanInExplain", + "cases": [ + "explain format = tidb_json update t2 set id = 1 where id =2", + "explain format = tidb_json insert into t1 values(1)", + "explain format = tidb_json select count(*) from t1", + "explain format = tidb_json select * from t1", + "explain analyze format = tidb_json select * from t1, t2 where t1.id = t2.id" + ] + } +] diff --git a/planner/core/testdata/json_plan_suite_out.json b/planner/core/testdata/json_plan_suite_out.json new file mode 100644 index 0000000000000..10ba3c93ad7fb --- /dev/null +++ b/planner/core/testdata/json_plan_suite_out.json @@ -0,0 +1,165 @@ +[ + { + "Name": "TestJSONPlanInExplain", + "Cases": [ + { + "SQL": "explain format = tidb_json update t2 set id = 1 where id =2", + "JSONPlan": [ + { + "id": "Update_4", + "estRows": "N/A", + "taskType": "root", + "operatorInfo": "N/A", + "subOperators": [ + { + "id": "IndexReader_7", + "estRows": "10.00", + "taskType": "root", + "operatorInfo": "index:IndexRangeScan_6", + "subOperators": [ + { + "id": "IndexRangeScan_6", + "estRows": "10.00", + "taskType": "cop[tikv]", + "accessObject": "table:t2, index:id(id)", + "operatorInfo": "range:[2,2], keep order:false, stats:pseudo" + } + ] + } + ] + } + ] + }, + { + "SQL": "explain format = tidb_json insert into t1 values(1)", + "JSONPlan": [ + { + "id": "Insert_1", + "estRows": "N/A", + "taskType": "root", + "operatorInfo": "N/A" + } + ] + }, + { + "SQL": "explain format = tidb_json select count(*) from t1", + "JSONPlan": [ + { + "id": "HashAgg_12", + "estRows": "1.00", + "taskType": "root", + "operatorInfo": "funcs:count(Column#5)->Column#3", + "subOperators": [ + { + "id": "TableReader_13", + "estRows": "1.00", + "taskType": "root", + "operatorInfo": "data:HashAgg_5", + "subOperators": [ + { + "id": "HashAgg_5", + "estRows": "1.00", + "taskType": "cop[tikv]", + "operatorInfo": "funcs:count(test.t1._tidb_rowid)->Column#5", + "subOperators": [ + { + "id": "TableFullScan_10", + "estRows": "10000.00", + "taskType": "cop[tikv]", + "accessObject": "table:t1", + "operatorInfo": "keep order:false, stats:pseudo" + } + ] + } + ] + } + ] + } + ] + }, + { + "SQL": "explain format = tidb_json select * from t1", + "JSONPlan": [ + { + "id": "IndexReader_7", + "estRows": "10000.00", + "taskType": "root", + "operatorInfo": "index:IndexFullScan_6", + "subOperators": [ + { + "id": "IndexFullScan_6", + "estRows": "10000.00", + "taskType": "cop[tikv]", + "accessObject": "table:t1, index:id(id)", + "operatorInfo": "keep order:false, stats:pseudo" + } + ] + } + ] + }, + { + "SQL": "explain analyze format = tidb_json select * from t1, t2 where t1.id = t2.id", + "JSONPlan": [ + { + "id": "MergeJoin_8", + "estRows": "12487.50", + "actRows": "0", + "taskType": "root", + "executeInfo": "time:3.5ms, loops:1", + "operatorInfo": "inner join, left key:test.t1.id, right key:test.t2.id", + "memoryInfo": "760 Bytes", + "diskInfo": "0 Bytes", + "subOperators": [ + { + "id": "IndexReader_36(Build)", + "estRows": "9990.00", + "actRows": "0", + "taskType": "root", + "executeInfo": "time:3.47ms, loops:1, cop_task: {num: 1, max: 3.38ms, proc_keys: 0, tot_proc: 3ms, rpc_num: 1, rpc_time: 3.34ms, copr_cache_hit_ratio: 0.00, distsql_concurrency: 15}", + "operatorInfo": "index:IndexFullScan_35", + "memoryInfo": "171 Bytes", + "diskInfo": "N/A", + "subOperators": [ + { + "id": "IndexFullScan_35", + "estRows": "9990.00", + "actRows": "0", + "taskType": "cop[tikv]", + "accessObject": "table:t2, index:id(id)", + "executeInfo": "tikv_task:{time:3.3ms, loops:0}", + "operatorInfo": "keep order:true, stats:pseudo", + "memoryInfo": "N/A", + "diskInfo": "N/A" + } + ] + }, + { + "id": "IndexReader_34(Probe)", + "estRows": "9990.00", + "actRows": "0", + "taskType": "root", + "executeInfo": "time:14µs, loops:1, cop_task: {num: 1, max: 772.9µs, proc_keys: 0, rpc_num: 1, rpc_time: 735.7µs, copr_cache_hit_ratio: 0.00, distsql_concurrency: 15}", + "operatorInfo": "index:IndexFullScan_33", + "memoryInfo": "166 Bytes", + "diskInfo": "N/A", + "subOperators": [ + { + "id": "IndexFullScan_33", + "estRows": "9990.00", + "actRows": "0", + "taskType": "cop[tikv]", + "accessObject": "table:t1, index:id(id)", + "executeInfo": "tikv_task:{time:168.4µs, loops:0}", + "operatorInfo": "keep order:true, stats:pseudo", + "memoryInfo": "N/A", + "diskInfo": "N/A" + } + ] + } + ] + } + ] + } + ] + } +] diff --git a/planner/core/testdata/partition_pruner_out.json b/planner/core/testdata/partition_pruner_out.json index 7b454564bece9..e4647840aa220 100644 --- a/planner/core/testdata/partition_pruner_out.json +++ b/planner/core/testdata/partition_pruner_out.json @@ -802,7 +802,7 @@ "1" ], "Plan": [ - "HashAgg 1.00 root funcs:count(1)->Column#9", + "StreamAgg 1.00 root funcs:count(1)->Column#9", "└─HashJoin 4.00 root inner join, equal:[eq(test_partition.t6.b, test_partition.t5.b)]", " ├─IndexReader(Build) 4.00 root partition:p0,p1 index:Selection", " │ └─Selection 4.00 cop[tikv] not(isnull(test_partition.t5.b))", @@ -818,7 +818,7 @@ "1" ], "Plan": [ - "HashAgg 1.00 root funcs:count(1)->Column#9", + "StreamAgg 1.00 root funcs:count(1)->Column#9", "└─IndexJoin 4.00 root inner join, inner:IndexReader, outer key:test_partition.t6.b, inner key:test_partition.t5.b, equal cond:eq(test_partition.t6.b, test_partition.t5.b)", " ├─IndexReader(Build) 4.00 root partition:p0 index:Selection", " │ └─Selection 4.00 cop[tikv] not(isnull(test_partition.t6.b))", @@ -834,7 +834,7 @@ "1" ], "Plan": [ - "HashAgg 1.00 root funcs:count(1)->Column#9", + "StreamAgg 1.00 root funcs:count(1)->Column#9", "└─IndexHashJoin 4.00 root inner join, inner:IndexReader, outer key:test_partition.t6.b, inner key:test_partition.t5.b, equal cond:eq(test_partition.t6.b, test_partition.t5.b)", " ├─IndexReader(Build) 4.00 root partition:p0 index:Selection", " │ └─Selection 4.00 cop[tikv] not(isnull(test_partition.t6.b))", @@ -847,9 +847,9 @@ { "SQL": "select * from t7 where a is null or a > 0 order by a;", "Result": [ - "", "1", - "2" + "2", + "" ], "Plan": [ "Sort 3343.33 root test_partition.t7.a", @@ -866,8 +866,8 @@ { "SQL": "select * from t1 order by id,a", "Result": [ - " 10 ", "1 1 1", + "10 10 10", "2 2 2", "3 3 3", "4 4 4", @@ -876,7 +876,7 @@ "7 7 7", "8 8 8", "9 9 9", - "10 10 10" + " 10 " ], "Plan": [ "Sort 10000.00 root test_partition.t1.id, test_partition.t1.a", @@ -934,16 +934,16 @@ "2" ], "Plan": [ - "HashAgg 1.00 root funcs:count(Column#6)->Column#5", - "└─TableReader 1.00 root partition:p0 data:HashAgg", - " └─HashAgg 1.00 cop[tikv] funcs:count(1)->Column#6", + "StreamAgg 1.00 root funcs:count(Column#7)->Column#5", + "└─TableReader 1.00 root partition:p0 data:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#7", " └─Selection 19.99 cop[tikv] or(eq(test_partition.t1.a, 1), eq(test_partition.t1.b, 2))", " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "IndexPlan": [ - "HashAgg 1.00 root funcs:count(Column#7)->Column#5", - "└─IndexReader 1.00 root partition:p0 index:HashAgg", - " └─HashAgg 1.00 cop[tikv] funcs:count(1)->Column#7", + "StreamAgg 1.00 root funcs:count(Column#10)->Column#5", + "└─IndexReader 1.00 root partition:p0 index:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#10", " └─Selection 19.99 cop[tikv] or(eq(test_partition_1.t1.a, 1), eq(test_partition_1.t1.b, 2))", " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" ] @@ -1341,8 +1341,8 @@ { "SQL": "select * from t1 where a = 1 or true order by id,a", "Result": [ - " 10 ", "1 1 1", + "10 10 10", "2 2 2", "3 3 3", "4 4 4", @@ -1351,7 +1351,7 @@ "7 7 7", "8 8 8", "9 9 9", - "10 10 10" + " 10 " ], "Plan": [ "Sort 10000.00 root test_partition.t1.id, test_partition.t1.a", @@ -1646,7 +1646,7 @@ ], "IndexPlan": [ "Sort 199.80 root test_partition_1.t1.a", - "└─IndexJoin 199.80 root inner join, inner:IndexReader, outer key:test_partition_1.t2.b, inner key:test_partition_1.t1.a, equal cond:eq(test_partition_1.t2.b, test_partition_1.t1.a)", + "└─IndexHashJoin 199.80 root inner join, inner:IndexReader, outer key:test_partition_1.t2.b, inner key:test_partition_1.t1.a, equal cond:eq(test_partition_1.t2.b, test_partition_1.t1.a)", " ├─HashAgg(Build) 159.84 root group by:test_partition_1.t2.b, funcs:firstrow(test_partition_1.t2.b)->test_partition_1.t2.b", " │ └─IndexReader 159.84 root partition:p0 index:HashAgg", " │ └─HashAgg 159.84 cop[tikv] group by:test_partition_1.t2.b, ", @@ -1676,7 +1676,7 @@ ], "IndexPlan": [ "Sort 199.80 root test_partition_1.t1.a", - "└─IndexJoin 199.80 root inner join, inner:IndexReader, outer key:test_partition_1.t1.b, inner key:test_partition_1.t1.a, equal cond:eq(test_partition_1.t1.b, test_partition_1.t1.a)", + "└─IndexHashJoin 199.80 root inner join, inner:IndexReader, outer key:test_partition_1.t1.b, inner key:test_partition_1.t1.a, equal cond:eq(test_partition_1.t1.b, test_partition_1.t1.a)", " ├─HashAgg(Build) 159.84 root group by:test_partition_1.t1.b, funcs:firstrow(test_partition_1.t1.b)->test_partition_1.t1.b", " │ └─IndexReader 159.84 root partition:p0 index:HashAgg", " │ └─HashAgg 159.84 cop[tikv] group by:test_partition_1.t1.b, ", @@ -1877,7 +1877,7 @@ " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "IndexPlan": [ - "HashAgg 1.00 root funcs:count(1)->Column#9", + "StreamAgg 1.00 root funcs:count(1)->Column#9", "└─IndexHashJoin 0.41 root inner join, inner:IndexReader, outer key:test_partition_1.t2.b, inner key:test_partition_1.t1.b, equal cond:eq(test_partition_1.t2.b, test_partition_1.t1.b)", " ├─IndexReader(Build) 0.80 root partition:p0 index:Selection", " │ └─Selection 0.80 cop[tikv] not(isnull(test_partition_1.t2.b))", @@ -1973,13 +1973,13 @@ "SQL": "select * from t1 where a < 3 or b > 4", "Result": [ "1 1 1", + "10 10 10", "2 2 2", "5 5 5", "6 6 6", "7 7 7", "8 8 8", - "9 9 9", - "10 10 10" + "9 9 9" ], "Plan": [ "TableReader 5548.89 root partition:p0,p1 data:Selection", @@ -2059,11 +2059,11 @@ "SQL": "select * from t1 where (a<=1 and b<=1) or (a >=6 and b>=6)", "Result": [ "1 1 1", + "10 10 10", "6 6 6", "7 7 7", "8 8 8", - "9 9 9", - "10 10 10" + "9 9 9" ], "Plan": [ "TableReader 2092.85 root partition:p0,p1 data:Selection", @@ -2080,6 +2080,7 @@ "SQL": "select * from t1 where a <= 100 and b <= 100", "Result": [ "1 1 1", + "10 10 10", "2 2 2", "3 3 3", "4 4 4", @@ -2087,8 +2088,7 @@ "6 6 6", "7 7 7", "8 8 8", - "9 9 9", - "10 10 10" + "9 9 9" ], "Plan": [ "TableReader 1104.45 root partition:p0,p1 data:Selection", @@ -2126,10 +2126,10 @@ { "SQL": "select * from t1 left join t2 on true where (t1.a <=1 or t1.a <= 3 and (t1.b >=3 and t1.b <= 5)) and (t2.a >= 6 and t2.a <= 8) and t2.b>=7 and t2.id>=7 order by t1.id,t1.a", "Result": [ - "1 1 1 8 8 8", "1 1 1 7 7 7", - "3 3 3 8 8 8", - "3 3 3 7 7 7" + "1 1 1 8 8 8", + "3 3 3 7 7 7", + "3 3 3 8 8 8" ], "Plan": [ "Sort 93855.70 root test_partition.t1.id, test_partition.t1.a", @@ -2326,8 +2326,8 @@ { "SQL": "select * from t1 where a = 3 or true order by id,a", "Result": [ - " 10 ", "1 1 1", + "10 10 10", "2 2 2", "3 3 3", "4 4 4", @@ -2336,7 +2336,7 @@ "7 7 7", "8 8 8", "9 9 9", - "10 10 10" + " 10 " ], "Plan": [ "Sort 10000.00 root test_partition.t1.id, test_partition.t1.a", @@ -2463,6 +2463,7 @@ "SQL": "select * from t1 where (a >= 1 and a <= 6) or (a>=3 and b >=3)", "Result": [ "1 1 1", + "10 10 10", "2 2 2", "3 3 3", "4 4 4", @@ -2470,8 +2471,7 @@ "6 6 6", "7 7 7", "8 8 8", - "9 9 9", - "10 10 10" + "9 9 9" ], "Plan": [ "TableReader 1333.33 root partition:p0,p1 data:Selection", @@ -2664,7 +2664,7 @@ ], "IndexPlan": [ "Sort 249.75 root test_partition_1.t1.a", - "└─IndexJoin 249.75 root inner join, inner:IndexReader, outer key:test_partition_1.t2.b, inner key:test_partition_1.t1.a, equal cond:eq(test_partition_1.t2.b, test_partition_1.t1.a)", + "└─IndexHashJoin 249.75 root inner join, inner:IndexReader, outer key:test_partition_1.t2.b, inner key:test_partition_1.t1.a, equal cond:eq(test_partition_1.t2.b, test_partition_1.t1.a)", " ├─HashAgg(Build) 199.80 root group by:test_partition_1.t2.b, funcs:firstrow(test_partition_1.t2.b)->test_partition_1.t2.b", " │ └─IndexReader 199.80 root partition:p0 index:HashAgg", " │ └─HashAgg 199.80 cop[tikv] group by:test_partition_1.t2.b, ", @@ -2695,7 +2695,7 @@ ], "IndexPlan": [ "Sort 249.75 root test_partition_1.t1.a", - "└─IndexJoin 249.75 root inner join, inner:IndexReader, outer key:test_partition_1.t1.b, inner key:test_partition_1.t1.a, equal cond:eq(test_partition_1.t1.b, test_partition_1.t1.a)", + "└─IndexHashJoin 249.75 root inner join, inner:IndexReader, outer key:test_partition_1.t1.b, inner key:test_partition_1.t1.a, equal cond:eq(test_partition_1.t1.b, test_partition_1.t1.a)", " ├─HashAgg(Build) 199.80 root group by:test_partition_1.t1.b, funcs:firstrow(test_partition_1.t1.b)->test_partition_1.t1.b", " │ └─IndexReader 199.80 root partition:p0 index:HashAgg", " │ └─HashAgg 199.80 cop[tikv] group by:test_partition_1.t1.b, ", @@ -2789,7 +2789,7 @@ "2" ], "Plan": [ - "HashAgg 1.00 root funcs:count(1)->Column#9", + "StreamAgg 1.00 root funcs:count(1)->Column#9", "└─HashJoin 7.81 root inner join, equal:[eq(test_partition.t1.b, test_partition.t2.b)]", " ├─TableReader(Build) 6.25 root partition:p0,p1 data:Selection", " │ └─Selection 6.25 cop[tikv] ge(test_partition.t2.a, 1), ge(test_partition.t2.b, 1), le(test_partition.t2.a, 6), le(test_partition.t2.b, 6), not(isnull(test_partition.t2.b))", @@ -2799,7 +2799,7 @@ " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "IndexPlan": [ - "HashAgg 1.00 root funcs:count(1)->Column#9", + "StreamAgg 1.00 root funcs:count(1)->Column#9", "└─HashJoin 7.81 root inner join, equal:[eq(test_partition_1.t1.b, test_partition_1.t2.b)]", " ├─IndexReader(Build) 6.25 root partition:p0,p1 index:Selection", " │ └─Selection 6.25 cop[tikv] ge(test_partition_1.t2.b, 1), le(test_partition_1.t2.b, 6), not(isnull(test_partition_1.t2.b))", @@ -2815,7 +2815,7 @@ "2" ], "Plan": [ - "HashAgg 1.00 root funcs:count(1)->Column#9", + "StreamAgg 1.00 root funcs:count(1)->Column#9", "└─HashJoin 7.81 root inner join, equal:[eq(test_partition.t2.b, test_partition.t1.b)]", " ├─TableReader(Build) 6.25 root partition:p0,p1 data:Selection", " │ └─Selection 6.25 cop[tikv] ge(test_partition.t1.a, 1), ge(test_partition.t1.b, 1), le(test_partition.t1.a, 6), le(test_partition.t1.b, 6), not(isnull(test_partition.t1.b))", @@ -2825,7 +2825,7 @@ " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "IndexPlan": [ - "HashAgg 1.00 root funcs:count(1)->Column#9", + "StreamAgg 1.00 root funcs:count(1)->Column#9", "└─HashJoin 7.81 root inner join, equal:[eq(test_partition_1.t2.b, test_partition_1.t1.b)]", " ├─IndexReader(Build) 6.25 root partition:p0,p1 index:Selection", " │ └─Selection 6.25 cop[tikv] ge(test_partition_1.t1.b, 1), le(test_partition_1.t1.b, 6), not(isnull(test_partition_1.t1.b))", diff --git a/planner/core/testdata/plan_normalized_suite_in.json b/planner/core/testdata/plan_normalized_suite_in.json index f79b7a1ed3733..81c65932f82a3 100644 --- a/planner/core/testdata/plan_normalized_suite_in.json +++ b/planner/core/testdata/plan_normalized_suite_in.json @@ -29,7 +29,14 @@ "select * from t3 where a=4", "select * from t3 where a=30", "select * from t4 where a=10", - "select * from t4 where a=20" + "select * from t4 where a=20", + "update t6 set id=id+1, id3=id2+1 where id = 1", + "insert into t6 values (1,1,1)", + "delete from t6", + "delete from t5 where id > 1", + "update t5 set id=id+1, id2=id2+1 where id = 1", + "update t5 set id=id+1, id2=id2+1, id3=id3+1 where id = 1", + "insert into t5 values (1,1,1) on duplicate key update id = 100, id3=100" ] }, { diff --git a/planner/core/testdata/plan_normalized_suite_out.json b/planner/core/testdata/plan_normalized_suite_out.json index 0fc4fba15e766..0f4218ba2649a 100644 --- a/planner/core/testdata/plan_normalized_suite_out.json +++ b/planner/core/testdata/plan_normalized_suite_out.json @@ -231,6 +231,52 @@ " ├─IndexRangeScan cop table:t4, partition:?, index:a(a), range:[?,?], keep order:false", " └─TableRowIDScan cop table:t4, partition:?, keep order:false" ] + }, + { + "SQL": "update t6 set id=id+1, id3=id2+1 where id = 1", + "Plan": [ + " IndexLookUp root ", + " ├─IndexRangeScan cop table:t6, index:idx_id(id), range:[?,?], keep order:false", + " └─TableRowIDScan cop table:t6, keep order:false" + ] + }, + { + "SQL": "insert into t6 values (1,1,1)", + "Plan": [ + "" + ] + }, + { + "SQL": "delete from t6", + "Plan": [ + " TableReader root ", + " └─TableFullScan cop table:t6, range:[?,?], keep order:false" + ] + }, + { + "SQL": "delete from t5 where id > 1", + "Plan": [ + " TableReader root ", + " └─TableRangeScan cop table:t5, range:[?,?], keep order:false" + ] + }, + { + "SQL": "update t5 set id=id+1, id2=id2+1 where id = 1", + "Plan": [ + " Point_Get root table:t5, handle:?" + ] + }, + { + "SQL": "update t5 set id=id+1, id2=id2+1, id3=id3+1 where id = 1", + "Plan": [ + " Point_Get root table:t5, handle:?" + ] + }, + { + "SQL": "insert into t5 values (1,1,1) on duplicate key update id = 100, id3=100", + "Plan": [ + "" + ] } ] }, diff --git a/planner/core/testdata/plan_suite_in.json b/planner/core/testdata/plan_suite_in.json index d718be8d6dfb4..fdabafeb9c211 100644 --- a/planner/core/testdata/plan_suite_in.json +++ b/planner/core/testdata/plan_suite_in.json @@ -2,10 +2,70 @@ { "name": "TestMPPHints", "cases": [ + "select /*+ MPP_1PHASE_AGG() */ a, sum(b) from t group by a, c", + "select /*+ MPP_2PHASE_AGG() */ a, sum(b) from t group by a, c", + "select /*+ shuffle_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", + "select /*+ broadcast_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", + + // READ_FROM_STORAGE hint "select /*+ read_from_storage(tiflash[t]), MPP_1PHASE_AGG() */ a, sum(b) from t group by a, c", "select /*+ read_from_storage(tiflash[t]), MPP_2PHASE_AGG() */ a, sum(b) from t group by a, c", "select /*+ read_from_storage(tiflash[t1, t2]), shuffle_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", - "select /*+ read_from_storage(tiflash[t1, t2]), broadcast_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a" + "select /*+ read_from_storage(tiflash[t1, t2]), broadcast_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", + + // Join hint + "select /*+ read_from_storage(tiflash[t1, t2]), shuffle_join(t1, t2), hash_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", + "select /*+ read_from_storage(tiflash[t1, t2]), broadcast_join(t1, t2), hash_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", + + "select /*+ read_from_storage(tiflash[t1, t2]), shuffle_join(t1, t2), hash_join_build(t1) */ * from t t1, t t2 where t1.a=t2.a", + "select /*+ read_from_storage(tiflash[t1, t2]), broadcast_join(t1, t2), hash_join_build(t2) */ * from t t1, t t2 where t1.a=t2.a", + + "select /*+ read_from_storage(tiflash[t1, t2]), shuffle_join(t1, t2), hash_join_probe(t1) */ * from t t1, t t2 where t1.a=t2.a", + "select /*+ read_from_storage(tiflash[t1, t2]), broadcast_join(t1, t2), hash_join_probe(t2) */ * from t t1, t t2 where t1.a=t2.a", + + "select /*+ read_from_storage(tiflash[t1, t2]), shuffle_join(t1, t2), merge_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", + "select /*+ read_from_storage(tiflash[t1, t2]), broadcast_join(t1, t2), merge_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", + + "select /*+ read_from_storage(tiflash[t1, t2]), shuffle_join(t1, t2), INL_JOIN(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", + "select /*+ read_from_storage(tiflash[t1, t2]), broadcast_join(t1, t2), INL_JOIN(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", + + // AGG hint + "select /*+ read_from_storage(tiflash[t]), MPP_1PHASE_AGG(), hash_agg() */ a, sum(b) from t group by a, c", + "select /*+ read_from_storage(tiflash[t]), MPP_2PHASE_AGG(), stream_agg() */ a, sum(b) from t group by a, c", + + // Index hint + "select /*+ read_from_storage(tiflash[t]), MPP_1PHASE_AGG(), use_index(t, idx_a) */ a, sum(b) from t where a > 1 group by a, c", + "select /*+ read_from_storage(tiflash[t]), MPP_1PHASE_AGG(), ignore_index(t, idx_a) */ a, sum(b) from t where a > 1 group by a, c", + "select /*+ read_from_storage(tiflash[t]), MPP_2PHASE_AGG(), force_index(t, idx_b) */ a, sum(b) from t where b < 2 group by a, c", + "select /*+ read_from_storage(tiflash[t]), MPP_2PHASE_AGG(), index_merge(t, idx_b, idx_a) */ a, sum(b) from t where b < 2 or a > 2 group by a, c", + + // Join Order hint + "select /*+ read_from_storage(tiflash[t1, t2, t3]), shuffle_join(t1, t2, t3), straight_join() */ * from t t1, t t2, t t3 where t1.a=t2.a and t2.b=t3.b", + "select /*+ read_from_storage(tiflash[t1, t2, t3]), shuffle_join(t1, t2, t3), leading(t3, t1) */ * from t t1, t t2, t t3 where t1.a=t2.a and t2.b=t3.b", + "select /*+ read_from_storage(tiflash[t1, t2, t3]), broadcast_join(t1, t2, t3), straight_join() */ * from t t2, t t1, t t3 where t1.a=t2.a and t2.b=t3.b", + "select /*+ read_from_storage(tiflash[t1, t2, t3]), broadcast_join(t1, t2, t3), leading(t2, t3) */ * from t t1, t t2, t t3 where t1.a=t2.a and t2.b=t3.b", + + // View Hint + "select /*+ qb_name(qb, v), MPP_1PHASE_AGG(@qb) */ * from v", + "select /*+ qb_name(qb, v), MPP_2PHASE_AGG(@qb) */ * from v", + "select /*+ qb_name(qb, v1), shuffle_join(t1@qb, t2@qb) */ * from v1", + "select /*+ qb_name(qb, v1), broadcast_join(t1@qb, t2@qb) */ * from v1", + + // Subquery hint + "SELECT /*+ shuffle_join(t) */ * FROM t WHERE EXISTS (SELECT /*+ SEMI_JOIN_REWRITE */ 1 FROM t t1 WHERE t1.b = t.b);", + "SELECT /*+ broadcast_join(t) */ * FROM t WHERE EXISTS (SELECT /*+ SEMI_JOIN_REWRITE */ 1 FROM t t1 WHERE t1.b = t.b);", + "select * from t t1 where t1.a < (select /*+ MPP_1PHASE_AGG() */ sum(t2.a) from t t2 where t2.b = t1.b);", + "select * from t t1 where t1.a < (select /*+ MPP_2PHASE_AGG() */ sum(t2.a) from t t2 where t2.b = t1.b);", + + // CTE + "WITH CTE AS (SELECT /*+ MPP_1PHASE_AGG() */ count(*) as a, b FROM t WHERE t.a < 60 group by b) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "WITH CTE AS (SELECT /*+ MPP_2PHASE_AGG() */ count(*) as a, b FROM t WHERE t.a < 60 group by b) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "WITH CTE AS (SELECT /*+ shuffle_join(t1, t) */ t.a, t.b FROM t join t t1 where t.a = t1.a) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "WITH CTE AS (SELECT /*+ broadcast_join(t1, t) */ t.a, t.b FROM t join t t1 where t.a = t1.a) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "WITH CTE AS (SELECT /*+ MERGE(), MPP_1PHASE_AGG() */ count(*) as a, b FROM t WHERE t.a < 60 group by b) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "WITH CTE AS (SELECT /*+ MERGE(), MPP_2PHASE_AGG() */ count(*) as a, b FROM t WHERE t.a < 60 group by b) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "WITH CTE AS (SELECT /*+ MERGE(), shuffle_join(t1, t) */ t.a, t.b FROM t join t t1 where t.a = t1.a) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "WITH CTE AS (SELECT /*+ MERGE(), broadcast_join(t1, t) */ t.a, t.b FROM t join t t1 where t.a = t1.a) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;" ] }, { @@ -1094,5 +1154,61 @@ "SELECT ta.NAME FROM ta WHERE EXISTS (select /*+ no_decorrelate() */ 1 from tb where ta.code = tb.code and tb.NAME LIKE 'chad9%') AND (select /*+ no_decorrelate() */ max(id) from tc where ta.name=tc.name and tc.name like 'chad99%') > 100 and (select /*+ no_decorrelate() */ max(id) from td where ta.id=td.id and td.name like 'chad999%') > 100" ] + }, + { + "name": "TestCountStarForTikv", + "cases": [ + "select count(*) from t", + "select count(1), count(3.1415), count(0), count(null) from t -- shouldn't be rewritten", + "select count(*) from t where a=1", + "select count(*) from t_pick_row_id", + "select t.b, t.c from (select count(*) as c from t) a, t where a.c=t.a -- shouldn't be rewritten", + "select * from t out where out.a > (select count(*) from t inn where inn.a = out.b) -- shouldn't be rewritten", + "select count(*) from t t1, t t2 where t1.a=t2.e -- shouldn't be rewritten", + "select count(distinct 1) from t -- shouldn't be rewritten", + "select count(1), count(a), count(b) from t -- shouldn't be rewritten", + "select a, count(*) from t group by a -- shouldn't be rewritten", + "select sum(a) from t -- sum shouldn't be rewritten" + ] + }, + { + "name": "TestCountStarForTiFlash", + "cases": [ + "select count(*) from t", + "select count(1), count(3.1415), count(0), count(null) from t -- every count but count(null) can be rewritten", + "select count(*) from t where a=1", + "select count(*) from t_pick_row_id", + "select t.b, t.c from (select count(*) as c from t) a, t where a.c=t.a -- test recursive", + "select * from t out where out.a > (select count(*) from t inn where inn.a = out.b) -- shouldn't be rewritten for correlated sub query", + "select count(*) from t t1, t t2 where t1.a=t2.e -- shouldn't be rewritten when join under agg", + "select count(distinct 1) from t -- shouldn't be rewritten", + "select count(1), count(a), count(b) from t -- keep count(1)", + "select a, count(*) from t group by a -- shouldn't be rewritten", + "select sum(a) from t -- sum shouldn't be rewritten" + ] + }, + { + "name": "TestHashAggPushdownToTiFlashCompute", + "cases": [ + "select /*+ agg_to_cop() hash_agg() */ avg( distinct tbl_15.col_96 ) as r0 , min( tbl_15.col_92 ) as r1 , sum( distinct tbl_15.col_91 ) as r2 , max( tbl_15.col_92 ) as r3 from tbl_15 where tbl_15.col_94 != '2033-01-09' and tbl_15.col_93 > 7623.679908049186 order by r0,r1,r2,r3 limit 79 ;", + "select /*+ agg_to_cop() hash_agg() */ count(1) from tbl_15 ;", + "select /*+ agg_to_cop() stream_agg() */ avg( tbl_16.col_100 ) as r0 from tbl_16 where tbl_16.col_100 in ( 10672141 ) or tbl_16.col_104 in ( 'yfEG1t!*b' ,'C1*bqx_qyO' ,'vQ^yUpKHr&j#~' ) group by tbl_16.col_100 order by r0 limit 20 ;" + ] + }, + { + "name": "TestRemoveRedundantPredicates", + "cases":[ + "select f from t use index() where f = 1 and f = 1 -- simple redundancy of exact condition", + "select f from t use index() where f = 1 and f = 2 -- unsatisfiable condition", + "select f from t use index() where f = 1 and f in (1,2,3) -- intersection of in and =", + "select f from t use index() where f = 1 and f <> 1 -- intersection of = and <>", + "select f from t use index() where f not in (1,2,3) and f = 3 -- intersection of not in list and =", + "select f from t use index() where f <> 3 and f <> 3 -- intersection of two not in values.", + "select t1.f /* merge_join(t1, t2) */ from t t1, t t2 where t1.a=t2.a and t1.a=t2.a -- exact redundancy in joins", + "select f from t use index() where f in (1,2,3) and f <> 2 -- intersection of in and <>. Not done yet see issue 39676", + "select f from t use index() where f in (1,2,3) and f in (3,4,5) -- intersection of two in. Not done yet", + "select f from t use index() where f not in (1,2,3) and f not in (3,4,5) -- intersection of two not in. Not done yet", + "select f from t use index() where f not in (1,2,3) and f in (1,2,3) -- intersection of in and not in. Not done yet" + ] } ] diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index b4da9d119f28f..2394a0e9e669c 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -2,55 +2,121 @@ { "Name": "TestMPPHints", "Cases": [ + { + "SQL": "select /*+ MPP_1PHASE_AGG() */ a, sum(b) from t group by a, c", + "Plan": [ + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 mpp[tiflash] test.t.a, Column#5", + " └─Projection 8000.00 mpp[tiflash] Column#5, test.t.a", + " └─HashAgg 8000.00 mpp[tiflash] group by:Column#10, Column#11, funcs:sum(Column#8)->Column#5, funcs:firstrow(Column#9)->test.t.a", + " └─Projection 10000.00 mpp[tiflash] cast(test.t.b, decimal(10,0) BINARY)->Column#8, test.t.a, test.t.a, test.t.c", + " └─ExchangeReceiver 10000.00 mpp[tiflash] ", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.c, collate: binary]", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "select /*+ MPP_2PHASE_AGG() */ a, sum(b) from t group by a, c", + "Plan": [ + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 mpp[tiflash] test.t.a, Column#5", + " └─Projection 8000.00 mpp[tiflash] Column#5, test.t.a", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, test.t.c, funcs:sum(Column#10)->Column#5, funcs:firstrow(test.t.a)->test.t.a", + " └─ExchangeReceiver 8000.00 mpp[tiflash] ", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.c, collate: binary]", + " └─HashAgg 8000.00 mpp[tiflash] group by:Column#13, Column#14, funcs:sum(Column#12)->Column#10", + " └─Projection 10000.00 mpp[tiflash] cast(test.t.b, decimal(10,0) BINARY)->Column#12, test.t.a, test.t.c", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "select /*+ shuffle_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", + "Plan": [ + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 9990.00 mpp[tiflash] ", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "select /*+ broadcast_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", + "Plan": [ + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" + ], + "Warn": null + }, { "SQL": "select /*+ read_from_storage(tiflash[t]), MPP_1PHASE_AGG() */ a, sum(b) from t group by a, c", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] test.t.a, Column#5", " └─Projection 8000.00 mpp[tiflash] Column#5, test.t.a", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#10, Column#11, funcs:sum(Column#8)->Column#5, funcs:firstrow(Column#9)->test.t.a", " └─Projection 10000.00 mpp[tiflash] cast(test.t.b, decimal(10,0) BINARY)->Column#8, test.t.a, test.t.a, test.t.c", " └─ExchangeReceiver 10000.00 mpp[tiflash] ", - " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.c, collate: binary]", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.c, collate: binary]", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" - ] + ], + "Warn": null }, { "SQL": "select /*+ read_from_storage(tiflash[t]), MPP_2PHASE_AGG() */ a, sum(b) from t group by a, c", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] test.t.a, Column#5", " └─Projection 8000.00 mpp[tiflash] Column#5, test.t.a", " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, test.t.c, funcs:sum(Column#10)->Column#5, funcs:firstrow(test.t.a)->test.t.a", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.c, collate: binary]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.c, collate: binary]", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#13, Column#14, funcs:sum(Column#12)->Column#10", " └─Projection 10000.00 mpp[tiflash] cast(test.t.b, decimal(10,0) BINARY)->Column#12, test.t.a, test.t.c", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" - ] + ], + "Warn": null }, { "SQL": "select /*+ read_from_storage(tiflash[t1, t2]), shuffle_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", "Plan": [ - "TableReader 12487.50 root data:ExchangeSender", + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", - " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary]", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 9990.00 mpp[tiflash] ", - " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary]", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", " └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" - ] + ], + "Warn": null }, { "SQL": "select /*+ read_from_storage(tiflash[t1, t2]), broadcast_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", "Plan": [ - "TableReader 12487.50 root data:ExchangeSender", + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", @@ -59,6 +125,732 @@ " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t1, t2]), shuffle_join(t1, t2), hash_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", + "Plan": [ + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]Join hints are conflict, you can only specify one type of join" + ] + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t1, t2]), broadcast_join(t1, t2), hash_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", + "Plan": [ + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]Join hints are conflict, you can only specify one type of join" + ] + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t1, t2]), shuffle_join(t1, t2), hash_join_build(t1) */ * from t t1, t t2 where t1.a=t2.a", + "Plan": [ + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]Join hints are conflict, you can only specify one type of join" + ] + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t1, t2]), broadcast_join(t1, t2), hash_join_build(t2) */ * from t t1, t t2 where t1.a=t2.a", + "Plan": [ + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]Join hints are conflict, you can only specify one type of join" + ] + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t1, t2]), shuffle_join(t1, t2), hash_join_probe(t1) */ * from t t1, t t2 where t1.a=t2.a", + "Plan": [ + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]Join hints are conflict, you can only specify one type of join" + ] + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t1, t2]), broadcast_join(t1, t2), hash_join_probe(t2) */ * from t t1, t t2 where t1.a=t2.a", + "Plan": [ + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]Join hints are conflict, you can only specify one type of join" + ] + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t1, t2]), shuffle_join(t1, t2), merge_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", + "Plan": [ + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]Join hints are conflict, you can only specify one type of join" + ] + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t1, t2]), broadcast_join(t1, t2), merge_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", + "Plan": [ + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]Join hints are conflict, you can only specify one type of join" + ] + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t1, t2]), shuffle_join(t1, t2), INL_JOIN(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", + "Plan": [ + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]Join hints are conflict, you can only specify one type of join" + ] + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t1, t2]), broadcast_join(t1, t2), INL_JOIN(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", + "Plan": [ + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]Join hints are conflict, you can only specify one type of join" + ] + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t]), MPP_1PHASE_AGG(), hash_agg() */ a, sum(b) from t group by a, c", + "Plan": [ + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 mpp[tiflash] test.t.a, Column#5", + " └─Projection 8000.00 mpp[tiflash] Column#5, test.t.a", + " └─HashAgg 8000.00 mpp[tiflash] group by:Column#10, Column#11, funcs:sum(Column#8)->Column#5, funcs:firstrow(Column#9)->test.t.a", + " └─Projection 10000.00 mpp[tiflash] cast(test.t.b, decimal(10,0) BINARY)->Column#8, test.t.a, test.t.a, test.t.c", + " └─ExchangeReceiver 10000.00 mpp[tiflash] ", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.c, collate: binary]", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t]), MPP_2PHASE_AGG(), stream_agg() */ a, sum(b) from t group by a, c", + "Plan": [ + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 mpp[tiflash] test.t.a, Column#5", + " └─Projection 8000.00 mpp[tiflash] Column#5, test.t.a", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, test.t.c, funcs:sum(Column#6)->Column#5, funcs:firstrow(test.t.a)->test.t.a", + " └─ExchangeReceiver 8000.00 mpp[tiflash] ", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.c, collate: binary]", + " └─HashAgg 8000.00 mpp[tiflash] group by:Column#10, Column#9, funcs:sum(Column#8)->Column#6", + " └─Projection 10000.00 mpp[tiflash] cast(test.t.b, decimal(10,0) BINARY)->Column#8, test.t.a, test.t.c", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t]), MPP_1PHASE_AGG(), use_index(t, idx_a) */ a, sum(b) from t where a > 1 group by a, c", + "Plan": [ + "Projection 2666.67 root test.t.a, Column#5", + "└─HashAgg 2666.67 root group by:test.t.a, test.t.c, funcs:sum(Column#7)->Column#5, funcs:firstrow(test.t.a)->test.t.a", + " └─IndexLookUp 2666.67 root ", + " ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:t, index:idx_a(a) range:(1,+inf], keep order:false, stats:pseudo", + " └─HashAgg(Probe) 2666.67 cop[tikv] group by:test.t.a, test.t.c, funcs:sum(test.t.b)->Column#7", + " └─TableRowIDScan 3333.33 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]No available path for table test.t with the store type tiflash of the hint /*+ read_from_storage */, please check the status of the table replica and variable value of tidb_isolation_read_engines(map[0:{} 1:{} 2:{}])", + "[planner:1815]The agg can not push down to the MPP side, the MPP_1PHASE_AGG() hint is invalid" + ] + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t]), MPP_1PHASE_AGG(), ignore_index(t, idx_a) */ a, sum(b) from t where a > 1 group by a, c", + "Plan": [ + "TableReader 2666.67 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 2666.67 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 2666.67 mpp[tiflash] test.t.a, Column#5", + " └─Projection 2666.67 mpp[tiflash] Column#5, test.t.a", + " └─HashAgg 2666.67 mpp[tiflash] group by:Column#10, Column#11, funcs:sum(Column#8)->Column#5, funcs:firstrow(Column#9)->test.t.a", + " └─Projection 3333.33 mpp[tiflash] cast(test.t.b, decimal(10,0) BINARY)->Column#8, test.t.a, test.t.a, test.t.c", + " └─ExchangeReceiver 3333.33 mpp[tiflash] ", + " └─ExchangeSender 3333.33 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.c, collate: binary]", + " └─Selection 3333.33 mpp[tiflash] gt(test.t.a, 1)", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t]), MPP_2PHASE_AGG(), force_index(t, idx_b) */ a, sum(b) from t where b < 2 group by a, c", + "Plan": [ + "Projection 2658.67 root test.t.a, Column#5", + "└─HashAgg 2658.67 root group by:test.t.a, test.t.c, funcs:sum(Column#7)->Column#5, funcs:firstrow(test.t.a)->test.t.a", + " └─IndexLookUp 2658.67 root ", + " ├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t, index:idx_b(b) range:[-inf,2), keep order:false, stats:pseudo", + " └─HashAgg(Probe) 2658.67 cop[tikv] group by:test.t.a, test.t.c, funcs:sum(test.t.b)->Column#7", + " └─TableRowIDScan 3323.33 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]No available path for table test.t with the store type tiflash of the hint /*+ read_from_storage */, please check the status of the table replica and variable value of tidb_isolation_read_engines(map[0:{} 1:{} 2:{}])", + "[planner:1815]The agg can not push down to the MPP side, the MPP_2PHASE_AGG() hint is invalid" + ] + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t]), MPP_2PHASE_AGG(), index_merge(t, idx_b, idx_a) */ a, sum(b) from t where b < 2 or a > 2 group by a, c", + "Plan": [ + "TableReader 4439.11 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 4439.11 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 4439.11 mpp[tiflash] test.t.a, Column#5", + " └─Projection 4439.11 mpp[tiflash] Column#5, test.t.a", + " └─HashAgg 4439.11 mpp[tiflash] group by:test.t.a, test.t.c, funcs:sum(Column#13)->Column#5, funcs:firstrow(test.t.a)->test.t.a", + " └─ExchangeReceiver 4439.11 mpp[tiflash] ", + " └─ExchangeSender 4439.11 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.c, collate: binary]", + " └─HashAgg 4439.11 mpp[tiflash] group by:Column#16, Column#17, funcs:sum(Column#15)->Column#13", + " └─Projection 5548.89 mpp[tiflash] cast(test.t.b, decimal(10,0) BINARY)->Column#15, test.t.a, test.t.c", + " └─Selection 5548.89 mpp[tiflash] or(lt(test.t.b, 2), gt(test.t.a, 2))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "[parser:8061]Optimizer hint index_merge is not supported by TiDB and is ignored" + ] + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t1, t2, t3]), shuffle_join(t1, t2, t3), straight_join() */ * from t t1, t t2, t t3 where t1.a=t2.a and t2.b=t3.b", + "Plan": [ + "TableReader 15593.77 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t.b, test.t.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.b, collate: binary]", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 12475.01 mpp[tiflash] ", + " └─ExchangeSender 12475.01 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.b, collate: binary]", + " └─HashJoin 12475.01 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 9990.00 mpp[tiflash] ", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t1, t2, t3]), shuffle_join(t1, t2, t3), leading(t3, t1) */ * from t t1, t t2, t t3 where t1.a=t2.a and t2.b=t3.b", + "Plan": [ + "TableReader 15593.77 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t.b, test.t.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.b, collate: binary]", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 12475.01 mpp[tiflash] ", + " └─ExchangeSender 12475.01 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.b, collate: binary]", + " └─HashJoin 12475.01 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 9990.00 mpp[tiflash] ", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]leading hint is inapplicable, check the join type or the join algorithm hint", + "[planner:1815]leading hint is inapplicable, check the join type or the join algorithm hint" + ] + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t1, t2, t3]), broadcast_join(t1, t2, t3), straight_join() */ * from t t2, t t1, t t3 where t1.a=t2.a and t2.b=t3.b", + "Plan": [ + "TableReader 15593.77 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t.b, test.t.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "select /*+ read_from_storage(tiflash[t1, t2, t3]), broadcast_join(t1, t2, t3), leading(t2, t3) */ * from t t1, t t2, t t3 where t1.a=t2.a and t2.b=t3.b", + "Plan": [ + "TableReader 15593.77 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t.b, test.t.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]leading hint is inapplicable, check the join type or the join algorithm hint", + "[planner:1815]leading hint is inapplicable, check the join type or the join algorithm hint" + ] + }, + { + "SQL": "select /*+ qb_name(qb, v), MPP_1PHASE_AGG(@qb) */ * from v", + "Plan": [ + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 mpp[tiflash] test.t.a, Column#5", + " └─Projection 8000.00 mpp[tiflash] Column#5, test.t.a", + " └─HashAgg 8000.00 mpp[tiflash] group by:Column#10, Column#11, funcs:sum(Column#8)->Column#5, funcs:firstrow(Column#9)->test.t.a", + " └─Projection 10000.00 mpp[tiflash] cast(test.t.b, decimal(10,0) BINARY)->Column#8, test.t.a, test.t.a, test.t.c", + " └─ExchangeReceiver 10000.00 mpp[tiflash] ", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.c, collate: binary]", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "select /*+ qb_name(qb, v), MPP_2PHASE_AGG(@qb) */ * from v", + "Plan": [ + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 mpp[tiflash] test.t.a, Column#5", + " └─Projection 8000.00 mpp[tiflash] Column#5, test.t.a", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, test.t.c, funcs:sum(Column#10)->Column#5, funcs:firstrow(test.t.a)->test.t.a", + " └─ExchangeReceiver 8000.00 mpp[tiflash] ", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.c, collate: binary]", + " └─HashAgg 8000.00 mpp[tiflash] group by:Column#13, Column#14, funcs:sum(Column#12)->Column#10", + " └─Projection 10000.00 mpp[tiflash] cast(test.t.b, decimal(10,0) BINARY)->Column#12, test.t.a, test.t.c", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "select /*+ qb_name(qb, v1), shuffle_join(t1@qb, t2@qb) */ * from v1", + "Plan": [ + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 12487.50 mpp[tiflash] test.t.a", + " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 9990.00 mpp[tiflash] ", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "select /*+ qb_name(qb, v1), broadcast_join(t1@qb, t2@qb) */ * from v1", + "Plan": [ + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 12487.50 mpp[tiflash] test.t.a", + " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "SELECT /*+ shuffle_join(t) */ * FROM t WHERE EXISTS (SELECT /*+ SEMI_JOIN_REWRITE */ 1 FROM t t1 WHERE t1.b = t.b);", + "Plan": [ + "TableReader 7992.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 7992.00 mpp[tiflash] semi join, equal:[eq(test.t.b, test.t.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]There are no matching table names for (t) in optimizer hint /*+ SHUFFLE_JOIN(t) */ or /*+ SHUFFLE_JOIN(t) */. Maybe you can use the table alias name", + "[parser:1064]Optimizer hint syntax error at line 1 column 109 near \"\" " + ] + }, + { + "SQL": "SELECT /*+ broadcast_join(t) */ * FROM t WHERE EXISTS (SELECT /*+ SEMI_JOIN_REWRITE */ 1 FROM t t1 WHERE t1.b = t.b);", + "Plan": [ + "TableReader 7992.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 7992.00 mpp[tiflash] semi join, equal:[eq(test.t.b, test.t.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]There are no matching table names for (t) in optimizer hint /*+ BROADCAST_JOIN(t) */ or /*+ TIDB_BCJ(t) */. Maybe you can use the table alias name", + "[parser:1064]Optimizer hint syntax error at line 1 column 111 near \"\" " + ] + }, + { + "SQL": "select * from t t1 where t1.a < (select /*+ MPP_1PHASE_AGG() */ sum(t2.a) from t t2 where t2.b = t1.b);", + "Plan": [ + "TableReader 9990.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 9990.00 mpp[tiflash] test.t.a, test.t.b, test.t.c", + " └─HashJoin 9990.00 mpp[tiflash] inner join, equal:[eq(test.t.b, test.t.b)], other cond:lt(cast(test.t.a, decimal(10,0) BINARY), Column#9)", + " ├─ExchangeReceiver(Build) 7992.00 mpp[tiflash] ", + " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Projection 7992.00 mpp[tiflash] Column#9, test.t.b", + " │ └─HashAgg 7992.00 mpp[tiflash] group by:Column#26, funcs:sum(Column#24)->Column#9, funcs:firstrow(Column#25)->test.t.b", + " │ └─Projection 9990.00 mpp[tiflash] cast(test.t.a, decimal(10,0) BINARY)->Column#24, test.t.b, test.t.b", + " │ └─ExchangeReceiver 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.b, collate: binary]", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "select * from t t1 where t1.a < (select /*+ MPP_2PHASE_AGG() */ sum(t2.a) from t t2 where t2.b = t1.b);", + "Plan": [ + "TableReader 9990.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 9990.00 mpp[tiflash] test.t.a, test.t.b, test.t.c", + " └─HashJoin 9990.00 mpp[tiflash] inner join, equal:[eq(test.t.b, test.t.b)], other cond:lt(cast(test.t.a, decimal(10,0) BINARY), Column#9)", + " ├─ExchangeReceiver(Build) 7992.00 mpp[tiflash] ", + " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Projection 7992.00 mpp[tiflash] Column#9, test.t.b", + " │ └─HashAgg 7992.00 mpp[tiflash] group by:test.t.b, funcs:sum(Column#13)->Column#9, funcs:firstrow(test.t.b)->test.t.b", + " │ └─ExchangeReceiver 7992.00 mpp[tiflash] ", + " │ └─ExchangeSender 7992.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.b, collate: binary]", + " │ └─HashAgg 7992.00 mpp[tiflash] group by:Column#29, funcs:sum(Column#28)->Column#13", + " │ └─Projection 9990.00 mpp[tiflash] cast(test.t.a, decimal(10,0) BINARY)->Column#28, test.t.b", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "WITH CTE AS (SELECT /*+ MPP_1PHASE_AGG() */ count(*) as a, b FROM t WHERE t.a < 60 group by b) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "Plan": [ + "HashAgg 3403.09 root group by:Column#10, Column#11, funcs:firstrow(Column#10)->Column#10, funcs:firstrow(Column#11)->Column#11", + "└─Union 3403.09 root ", + " ├─Selection 1701.55 root lt(Column#6, 18)", + " │ └─CTEFullScan 2126.93 root CTE:cte data:CTE_0", + " └─Selection 1701.55 root gt(test.t.b, 1)", + " └─CTEFullScan 2126.93 root CTE:cte data:CTE_0", + "CTE_0 2126.93 root Non-Recursive CTE", + "└─TableReader(Seed Part) 2126.93 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 2126.93 mpp[tiflash] ExchangeType: PassThrough", + " └─Selection 2126.93 mpp[tiflash] or(lt(Column#5, 18), gt(test.t.b, 1))", + " └─Projection 2658.67 mpp[tiflash] Column#5, test.t.b", + " └─HashAgg 2658.67 mpp[tiflash] group by:test.t.b, funcs:count(1)->Column#5, funcs:firstrow(test.t.b)->test.t.b", + " └─ExchangeReceiver 3323.33 mpp[tiflash] ", + " └─ExchangeSender 3323.33 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.b, collate: binary]", + " └─Selection 3323.33 mpp[tiflash] lt(test.t.a, 60)", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "WITH CTE AS (SELECT /*+ MPP_2PHASE_AGG() */ count(*) as a, b FROM t WHERE t.a < 60 group by b) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "Plan": [ + "HashAgg 3403.09 root group by:Column#10, Column#11, funcs:firstrow(Column#10)->Column#10, funcs:firstrow(Column#11)->Column#11", + "└─Union 3403.09 root ", + " ├─Selection 1701.55 root lt(Column#6, 18)", + " │ └─CTEFullScan 2126.93 root CTE:cte data:CTE_0", + " └─Selection 1701.55 root gt(test.t.b, 1)", + " └─CTEFullScan 2126.93 root CTE:cte data:CTE_0", + "CTE_0 2126.93 root Non-Recursive CTE", + "└─TableReader(Seed Part) 2126.93 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 2126.93 mpp[tiflash] ExchangeType: PassThrough", + " └─Selection 2126.93 mpp[tiflash] or(lt(Column#5, 18), gt(test.t.b, 1))", + " └─Projection 2658.67 mpp[tiflash] Column#5, test.t.b", + " └─HashAgg 2658.67 mpp[tiflash] group by:test.t.b, funcs:sum(Column#22)->Column#5, funcs:firstrow(test.t.b)->test.t.b", + " └─ExchangeReceiver 2658.67 mpp[tiflash] ", + " └─ExchangeSender 2658.67 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.b, collate: binary]", + " └─HashAgg 2658.67 mpp[tiflash] group by:test.t.b, funcs:count(1)->Column#22", + " └─Selection 3323.33 mpp[tiflash] lt(test.t.a, 60)", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "WITH CTE AS (SELECT /*+ shuffle_join(t1, t) */ t.a, t.b FROM t join t t1 where t.a = t1.a) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "Plan": [ + "HashAgg 7095.48 root group by:Column#13, Column#14, funcs:firstrow(Column#13)->Column#13, funcs:firstrow(Column#14)->Column#14", + "└─Union 11086.68 root ", + " ├─Selection 5543.34 root lt(test.t.a, 18)", + " │ └─CTEFullScan 6929.18 root CTE:cte data:CTE_0", + " └─Selection 5543.34 root gt(test.t.b, 1)", + " └─CTEFullScan 6929.18 root CTE:cte data:CTE_0", + "CTE_0 6929.18 root Non-Recursive CTE", + "└─TableReader(Seed Part) 6929.18 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 6929.18 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 6929.18 mpp[tiflash] test.t.a, test.t.b", + " └─HashJoin 6929.18 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)], other cond:or(lt(test.t.a, 18), gt(test.t.b, 1))", + " ├─ExchangeReceiver(Build) 5543.34 mpp[tiflash] ", + " │ └─ExchangeSender 5543.34 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " │ └─Selection 5543.34 mpp[tiflash] not(isnull(test.t.a)), or(lt(test.t.a, 18), gt(test.t.b, 1))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 9990.00 mpp[tiflash] ", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "WITH CTE AS (SELECT /*+ broadcast_join(t1, t) */ t.a, t.b FROM t join t t1 where t.a = t1.a) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "Plan": [ + "HashAgg 7095.48 root group by:Column#13, Column#14, funcs:firstrow(Column#13)->Column#13, funcs:firstrow(Column#14)->Column#14", + "└─Union 11086.68 root ", + " ├─Selection 5543.34 root lt(test.t.a, 18)", + " │ └─CTEFullScan 6929.18 root CTE:cte data:CTE_0", + " └─Selection 5543.34 root gt(test.t.b, 1)", + " └─CTEFullScan 6929.18 root CTE:cte data:CTE_0", + "CTE_0 6929.18 root Non-Recursive CTE", + "└─TableReader(Seed Part) 6929.18 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 6929.18 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 6929.18 mpp[tiflash] test.t.a, test.t.b", + " └─HashJoin 6929.18 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)], other cond:or(lt(test.t.a, 18), gt(test.t.b, 1))", + " ├─ExchangeReceiver(Build) 5543.34 mpp[tiflash] ", + " │ └─ExchangeSender 5543.34 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 5543.34 mpp[tiflash] not(isnull(test.t.a)), or(lt(test.t.a, 18), gt(test.t.b, 1))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "WITH CTE AS (SELECT /*+ MERGE(), MPP_1PHASE_AGG() */ count(*) as a, b FROM t WHERE t.a < 60 group by b) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "Plan": [ + "TableReader 3013.16 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 3013.16 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 3013.16 mpp[tiflash] Column#20, Column#21", + " └─HashAgg 3013.16 mpp[tiflash] group by:Column#20, Column#21, funcs:firstrow(Column#20)->Column#20, funcs:firstrow(Column#21)->Column#21", + " └─ExchangeReceiver 3013.16 mpp[tiflash] ", + " └─ExchangeSender 3013.16 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#20, collate: binary], [name: Column#21, collate: binary]", + " └─Union 3013.16 mpp[tiflash] ", + " ├─Projection 2126.93 mpp[tiflash] cast(Column#12, bigint(21) BINARY)->Column#20, test.t.b", + " │ └─Selection 2126.93 mpp[tiflash] lt(Column#12, 18)", + " │ └─Projection 2658.67 mpp[tiflash] Column#12, test.t.b", + " │ └─HashAgg 2658.67 mpp[tiflash] group by:test.t.b, funcs:count(1)->Column#12, funcs:firstrow(test.t.b)->test.t.b", + " │ └─ExchangeReceiver 3323.33 mpp[tiflash] ", + " │ └─ExchangeSender 3323.33 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.b, collate: binary]", + " │ └─Selection 3323.33 mpp[tiflash] lt(test.t.a, 60)", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─Projection 886.22 mpp[tiflash] cast(Column#20, bigint(21) BINARY)->Column#20, Column#21", + " └─Projection 886.22 mpp[tiflash] Column#19, test.t.b", + " └─HashAgg 886.22 mpp[tiflash] group by:test.t.b, funcs:count(1)->Column#19, funcs:firstrow(test.t.b)->test.t.b", + " └─ExchangeReceiver 1107.78 mpp[tiflash] ", + " └─ExchangeSender 1107.78 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.b, collate: binary]", + " └─Selection 1107.78 mpp[tiflash] gt(test.t.b, 1), lt(test.t.a, 60)", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "WITH CTE AS (SELECT /*+ MERGE(), MPP_2PHASE_AGG() */ count(*) as a, b FROM t WHERE t.a < 60 group by b) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "Plan": [ + "TableReader 3013.16 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 3013.16 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 3013.16 mpp[tiflash] Column#20, Column#21", + " └─HashAgg 3013.16 mpp[tiflash] group by:Column#20, Column#21, funcs:firstrow(Column#20)->Column#20, funcs:firstrow(Column#21)->Column#21", + " └─ExchangeReceiver 3013.16 mpp[tiflash] ", + " └─ExchangeSender 3013.16 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#20, collate: binary], [name: Column#21, collate: binary]", + " └─Union 3013.16 mpp[tiflash] ", + " ├─Projection 2126.93 mpp[tiflash] cast(Column#12, bigint(21) BINARY)->Column#20, test.t.b", + " │ └─Selection 2126.93 mpp[tiflash] lt(Column#12, 18)", + " │ └─Projection 2658.67 mpp[tiflash] Column#12, test.t.b", + " │ └─HashAgg 2658.67 mpp[tiflash] group by:test.t.b, funcs:sum(Column#32)->Column#12, funcs:firstrow(test.t.b)->test.t.b", + " │ └─ExchangeReceiver 2658.67 mpp[tiflash] ", + " │ └─ExchangeSender 2658.67 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.b, collate: binary]", + " │ └─HashAgg 2658.67 mpp[tiflash] group by:test.t.b, funcs:count(1)->Column#32", + " │ └─Selection 3323.33 mpp[tiflash] lt(test.t.a, 60)", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─Projection 886.22 mpp[tiflash] cast(Column#20, bigint(21) BINARY)->Column#20, Column#21", + " └─Projection 886.22 mpp[tiflash] Column#19, test.t.b", + " └─HashAgg 886.22 mpp[tiflash] group by:test.t.b, funcs:sum(Column#46)->Column#19, funcs:firstrow(test.t.b)->test.t.b", + " └─ExchangeReceiver 886.22 mpp[tiflash] ", + " └─ExchangeSender 886.22 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.b, collate: binary]", + " └─HashAgg 886.22 mpp[tiflash] group by:test.t.b, funcs:count(1)->Column#46", + " └─Selection 1107.78 mpp[tiflash] gt(test.t.b, 1), lt(test.t.a, 60)", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "WITH CTE AS (SELECT /*+ MERGE(), shuffle_join(t1, t) */ t.a, t.b FROM t join t t1 where t.a = t1.a) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "Plan": [ + "TableReader 5322.67 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 5322.67 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 5322.67 mpp[tiflash] Column#29, Column#30", + " └─HashAgg 5322.67 mpp[tiflash] group by:Column#29, Column#30, funcs:firstrow(Column#29)->Column#29, funcs:firstrow(Column#30)->Column#30", + " └─ExchangeReceiver 5322.67 mpp[tiflash] ", + " └─ExchangeSender 5322.67 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#29, collate: binary], [name: Column#30, collate: binary]", + " └─HashAgg 5322.67 mpp[tiflash] group by:Column#29, Column#30, ", + " └─Union 8316.67 mpp[tiflash] ", + " ├─Projection 4154.17 mpp[tiflash] test.t.a, test.t.b", + " │ └─HashJoin 4154.17 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " │ ├─ExchangeReceiver(Build) 3323.33 mpp[tiflash] ", + " │ │ └─ExchangeSender 3323.33 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " │ │ └─Selection 3323.33 mpp[tiflash] lt(test.t.a, 18), not(isnull(test.t.a))", + " │ │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " │ └─ExchangeReceiver(Probe) 3323.33 mpp[tiflash] ", + " │ └─ExchangeSender 3323.33 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " │ └─Selection 3323.33 mpp[tiflash] lt(test.t.a, 18), not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Projection 4162.50 mpp[tiflash] test.t.a, test.t.b", + " └─HashJoin 4162.50 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 3330.00 mpp[tiflash] ", + " │ └─ExchangeSender 3330.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " │ └─Selection 3330.00 mpp[tiflash] gt(test.t.b, 1), not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 9990.00 mpp[tiflash] ", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]There are no matching table names for (t1, t) in optimizer hint /*+ SHUFFLE_JOIN(t1, t, t1, t) */ or /*+ SHUFFLE_JOIN(t1, t, t1, t) */. Maybe you can use the table alias name", + "[planner:1815]There are no matching table names for (t1, t, t1, t) in optimizer hint /*+ SHUFFLE_JOIN(t1, t, t1, t, t1, t) */ or /*+ SHUFFLE_JOIN(t1, t, t1, t, t1, t) */. Maybe you can use the table alias name" + ] + }, + { + "SQL": "WITH CTE AS (SELECT /*+ MERGE(), broadcast_join(t1, t) */ t.a, t.b FROM t join t t1 where t.a = t1.a) SELECT * FROM CTE WHERE CTE.a <18 union select * from cte where cte.b > 1;", + "Plan": [ + "TableReader 5322.67 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 5322.67 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 5322.67 mpp[tiflash] Column#29, Column#30", + " └─HashAgg 5322.67 mpp[tiflash] group by:Column#29, Column#30, funcs:firstrow(Column#29)->Column#29, funcs:firstrow(Column#30)->Column#30", + " └─ExchangeReceiver 5322.67 mpp[tiflash] ", + " └─ExchangeSender 5322.67 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#29, collate: binary], [name: Column#30, collate: binary]", + " └─HashAgg 5322.67 mpp[tiflash] group by:Column#29, Column#30, ", + " └─Union 8316.67 mpp[tiflash] ", + " ├─Projection 4154.17 mpp[tiflash] test.t.a, test.t.b", + " │ └─HashJoin 4154.17 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " │ ├─ExchangeReceiver(Build) 3323.33 mpp[tiflash] ", + " │ │ └─ExchangeSender 3323.33 mpp[tiflash] ExchangeType: Broadcast", + " │ │ └─Selection 3323.33 mpp[tiflash] lt(test.t.a, 18), not(isnull(test.t.a))", + " │ │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " │ └─Selection(Probe) 3323.33 mpp[tiflash] lt(test.t.a, 18), not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Projection 4162.50 mpp[tiflash] test.t.a, test.t.b", + " └─HashJoin 4162.50 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver(Build) 3330.00 mpp[tiflash] ", + " │ └─ExchangeSender 3330.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 3330.00 mpp[tiflash] gt(test.t.b, 1), not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" + ], + "Warn": [ + "[planner:1815]There are no matching table names for (t1, t) in optimizer hint /*+ BROADCAST_JOIN(t1, t, t1, t) */ or /*+ TIDB_BCJ(t1, t, t1, t) */. Maybe you can use the table alias name", + "[planner:1815]There are no matching table names for (t1, t, t1, t) in optimizer hint /*+ BROADCAST_JOIN(t1, t, t1, t, t1, t) */ or /*+ TIDB_BCJ(t1, t, t1, t, t1, t) */. Maybe you can use the table alias name" ] } ] @@ -546,7 +1338,7 @@ }, { "SQL": "select * from t t1 join t t2 on t1.b = t2.a order by t1.a", - "Best": "LeftHashJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.b,test.t.a)->Sort" + "Best": "IndexJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.b,test.t.a)" }, { "SQL": "select * from t t1 join t t2 on t1.b = t2.a order by t1.a limit 1", @@ -963,7 +1755,7 @@ }, { "SQL": "select sum(e), avg(e + c) from t where c = 1 group by e", - "Best": "IndexReader(Index(t.c_d_e)[[1,1]]->HashAgg)->HashAgg" + "Best": "IndexReader(Index(t.c_d_e)[[1,1]])->Projection->HashAgg" }, { "SQL": "select sum(e), avg(b + c) from t where c = 1 and e = 1 group by d", @@ -1257,15 +2049,15 @@ "Cases": [ { "SQL": "select max(a) from t;", - "Best": "TableReader(Table(t)->Limit)->Limit->HashAgg" + "Best": "TableReader(Table(t)->Limit)->Limit->StreamAgg" }, { "SQL": "select min(a) from t;", - "Best": "TableReader(Table(t)->Limit)->Limit->HashAgg" + "Best": "TableReader(Table(t)->Limit)->Limit->StreamAgg" }, { "SQL": "select min(c_str) from t;", - "Best": "IndexReader(Index(t.c_d_e_str)[[-inf,+inf]]->Limit)->Limit->HashAgg" + "Best": "IndexReader(Index(t.c_d_e_str)[[-inf,+inf]]->Limit)->Limit->StreamAgg" }, { "SQL": "select max(a), b from t;", @@ -1273,23 +2065,23 @@ }, { "SQL": "select max(a+1) from t;", - "Best": "IndexReader(Index(t.f)[[NULL,+inf]]->TopN([plus(test.t.a, 1) true],0,1))->Projection->TopN([Column#40 true],0,1)->Projection->Projection->HashAgg" + "Best": "IndexReader(Index(t.f)[[NULL,+inf]]->TopN([plus(test.t.a, 1) true],0,1))->Projection->TopN([Column#40 true],0,1)->Projection->Projection->StreamAgg" }, { "SQL": "select max(a), min(a) from t;", - "Best": "LeftHashJoin{TableReader(Table(t)->Limit)->Limit->HashAgg->TableReader(Table(t)->Limit)->Limit->HashAgg}" + "Best": "RightHashJoin{TableReader(Table(t)->Limit)->Limit->StreamAgg->TableReader(Table(t)->Limit)->Limit->StreamAgg}" }, { "SQL": "select max(a), min(a) from t where a > 10", - "Best": "LeftHashJoin{TableReader(Table(t)->Limit)->Limit->HashAgg->TableReader(Table(t)->Limit)->Limit->HashAgg}" + "Best": "RightHashJoin{TableReader(Table(t)->Limit)->Limit->StreamAgg->TableReader(Table(t)->Limit)->Limit->StreamAgg}" }, { "SQL": "select max(d), min(d) from t where c = 1 and d > 10", - "Best": "LeftHashJoin{IndexReader(Index(t.c_d_e)[(1 10,1 +inf]]->Limit)->Limit->HashAgg->IndexReader(Index(t.c_d_e)[(1 10,1 +inf]]->Limit)->Limit->HashAgg}" + "Best": "LeftHashJoin{IndexReader(Index(t.c_d_e)[(1 10,1 +inf]]->Limit)->Limit->StreamAgg->IndexReader(Index(t.c_d_e)[(1 10,1 +inf]]->Limit)->Limit->StreamAgg}" }, { "SQL": "select max(a), max(c), min(f) from t", - "Best": "LeftHashJoin{LeftHashJoin{TableReader(Table(t)->Limit)->Limit->HashAgg->IndexReader(Index(t.c_d_e)[[NULL,+inf]]->Limit)->Limit->HashAgg}->IndexReader(Index(t.f)[[NULL,+inf]]->Limit)->Limit->HashAgg}" + "Best": "LeftHashJoin{RightHashJoin{TableReader(Table(t)->Limit)->Limit->StreamAgg->IndexReader(Index(t.c_d_e)[[NULL,+inf]]->Limit)->Limit->StreamAgg}->IndexReader(Index(t.f)[[NULL,+inf]]->Limit)->Limit->StreamAgg}" }, { "SQL": "select max(a), max(b) from t", @@ -1309,7 +2101,7 @@ }, { "SQL": "select max(a) from (select t1.a from t t1 join t t2 on t1.a=t2.a) t", - "Best": "MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)->Limit->HashAgg" + "Best": "MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)->Limit->StreamAgg" } ] }, @@ -1588,7 +2380,7 @@ "Cases": [ { "SQL": "select t1.a, (select count(t2.a) from t t2 where t2.g in (select t3.d from t t3 where t3.c = t1.a)) as agg_col from t t1;", - "Best": "Apply{IndexReader(Index(t.f)[[NULL,+inf]])->IndexJoin{IndexReader(Index(t.c_d_e)[[NULL,+inf]]->HashAgg)->HashAgg->IndexReader(Index(t.g)[[NULL,NULL]])}(test.t.d,test.t.g)}->HashAgg" + "Best": "Apply{IndexReader(Index(t.f)[[NULL,+inf]])->IndexHashJoin{IndexReader(Index(t.c_d_e)[[NULL,+inf]]->HashAgg)->HashAgg->IndexReader(Index(t.g)[[NULL,NULL]])}(test.t.d,test.t.g)}->HashAgg" } ] }, @@ -3403,7 +4195,7 @@ { "SQL": "select * from employee where deptid>1", "Plan": [ - "TableReader 3333.33 root data:ExchangeSender", + "TableReader 3333.33 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 3333.33 mpp[tiflash] ExchangeType: PassThrough", " └─Selection 3333.33 mpp[tiflash] gt(test.employee.deptid, 1)", " └─TableFullScan 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" @@ -3412,7 +4204,7 @@ { "SQL": "select deptid+5, empid*10 from employee where deptid>1", "Plan": [ - "TableReader 3333.33 root data:ExchangeSender", + "TableReader 3333.33 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 3333.33 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 3333.33 mpp[tiflash] plus(test.employee.deptid, 5)->Column#5, mul(test.employee.empid, 10)->Column#6", " └─Selection 3333.33 mpp[tiflash] gt(test.employee.deptid, 1)", @@ -3422,12 +4214,12 @@ { "SQL": "select count(*) from employee group by deptid+1", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#5", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#12, funcs:sum(Column#13)->Column#5", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#12, collate: binary]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#12, collate: binary]", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#14, funcs:count(1)->Column#13", " └─Projection 10000.00 mpp[tiflash] plus(test.employee.deptid, 1)->Column#14", " └─TableFullScan 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" @@ -3436,7 +4228,7 @@ { "SQL": "select count(distinct deptid) a from employee", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5", " └─HashAgg 1.00 mpp[tiflash] funcs:sum(Column#7)->Column#5", @@ -3444,7 +4236,7 @@ " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(distinct test.employee.deptid)->Column#7", " └─ExchangeReceiver 1.00 mpp[tiflash] ", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary]", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary]", " └─HashAgg 1.00 mpp[tiflash] group by:test.employee.deptid, ", " └─TableFullScan 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ] @@ -3452,7 +4244,7 @@ { "SQL": "select * from employee join employee e1 using(deptid)", "Plan": [ - "TableReader 12487.50 root data:ExchangeSender", + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 12487.50 mpp[tiflash] test.employee.deptid, test.employee.empid, test.employee.salary, test.employee.empid, test.employee.salary", " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.employee.deptid, test.employee.deptid)]", @@ -3467,7 +4259,7 @@ { "SQL": "select count(distinct a) from (select count(distinct deptid) a from employee) x", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#6", " └─HashAgg 1.00 mpp[tiflash] funcs:count(distinct Column#5)->Column#6", @@ -3477,7 +4269,7 @@ " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(distinct test.employee.deptid)->Column#8", " └─ExchangeReceiver 1.00 mpp[tiflash] ", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary]", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary]", " └─HashAgg 1.00 mpp[tiflash] group by:test.employee.deptid, ", " └─TableFullScan 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ] @@ -3485,12 +4277,12 @@ { "SQL": "select count(a) from (select count(distinct deptid) a, count(distinct empid) b from employee) x group by b+1", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#7", " └─HashAgg 1.00 mpp[tiflash] group by:Column#12, funcs:sum(Column#13)->Column#7", " └─ExchangeReceiver 1.00 mpp[tiflash] ", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#12, collate: binary]", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#12, collate: binary]", " └─HashAgg 1.00 mpp[tiflash] group by:Column#15, funcs:count(Column#14)->Column#13", " └─Projection 1.00 mpp[tiflash] Column#5, plus(Column#6, 1)->Column#15", " └─Projection 1.00 mpp[tiflash] Column#5, Column#6", @@ -3504,7 +4296,7 @@ { "SQL": "select count(a) from (select count(distinct deptid) a, count(distinct empid) b from employee) x group by b", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#7", " └─HashAgg 1.00 mpp[tiflash] group by:Column#6, funcs:count(Column#5)->Column#7", @@ -3519,7 +4311,7 @@ { "SQL": "select * from employee join (select count(distinct deptid) a, count(distinct empid) b from employee) e1", "Plan": [ - "TableReader 10000.00 root data:ExchangeSender", + "TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 10000.00 mpp[tiflash] CARTESIAN inner join", " ├─ExchangeReceiver(Build) 1.00 mpp[tiflash] ", @@ -3536,7 +4328,7 @@ { "SQL": "select * from employee e1 join (select count(distinct deptid) a from employee) e2 on e1.deptid = e2.a", "Plan": [ - "TableReader 1.25 root data:ExchangeSender", + "TableReader 1.25 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.25 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 1.25 mpp[tiflash] inner join, equal:[eq(test.employee.deptid, Column#9)]", " ├─ExchangeReceiver(Build) 1.00 mpp[tiflash] ", @@ -3547,7 +4339,7 @@ " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " │ └─HashAgg 1.00 mpp[tiflash] funcs:count(distinct test.employee.deptid)->Column#10", " │ └─ExchangeReceiver 1.00 mpp[tiflash] ", - " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary]", + " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary]", " │ └─HashAgg 1.00 mpp[tiflash] group by:test.employee.deptid, ", " │ └─TableFullScan 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo", " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.employee.deptid))", @@ -3557,7 +4349,7 @@ { "SQL": "select * from (select count(distinct deptid) a from employee) e1 join employee e2 on e1.a = e2.deptid", "Plan": [ - "TableReader 1.25 root data:ExchangeSender", + "TableReader 1.25 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.25 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.25 mpp[tiflash] Column#5, test.employee.empid, test.employee.deptid, test.employee.salary", " └─HashJoin 1.25 mpp[tiflash] inner join, equal:[eq(test.employee.deptid, Column#5)]", @@ -3569,7 +4361,7 @@ " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " │ └─HashAgg 1.00 mpp[tiflash] funcs:count(distinct test.employee.deptid)->Column#10", " │ └─ExchangeReceiver 1.00 mpp[tiflash] ", - " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary]", + " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary]", " │ └─HashAgg 1.00 mpp[tiflash] group by:test.employee.deptid, ", " │ └─TableFullScan 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo", " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.employee.deptid))", @@ -3579,7 +4371,7 @@ { "SQL": "select * from (select count(distinct deptid) a from employee) e1 join (select count(distinct deptid) b from employee) e2 on e1.a=e2.b", "Plan": [ - "TableReader 1.00 root data:ExchangeSender", + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 1.00 mpp[tiflash] inner join, equal:[eq(Column#5, Column#10)]", " ├─ExchangeReceiver(Build) 1.00 mpp[tiflash] ", @@ -3590,7 +4382,7 @@ " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " │ └─HashAgg 1.00 mpp[tiflash] funcs:count(distinct test.employee.deptid)->Column#11", " │ └─ExchangeReceiver 1.00 mpp[tiflash] ", - " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary]", + " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary]", " │ └─HashAgg 1.00 mpp[tiflash] group by:test.employee.deptid, ", " │ └─TableFullScan 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo", " └─Projection(Probe) 1.00 mpp[tiflash] Column#10", @@ -3599,7 +4391,7 @@ " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(distinct test.employee.deptid)->Column#12", " └─ExchangeReceiver 1.00 mpp[tiflash] ", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary]", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary]", " └─HashAgg 1.00 mpp[tiflash] group by:test.employee.deptid, ", " └─TableFullScan 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ] @@ -3607,7 +4399,7 @@ { "SQL": "select * from employee e1 join employee e2 on e1.deptid = e2.deptid", "Plan": [ - "TableReader 12487.50 root data:ExchangeSender", + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.employee.deptid, test.employee.deptid)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", @@ -3621,7 +4413,7 @@ { "SQL": "select * from (select deptid+1 d, count(empid) a from employee group by d) e1 join employee e2 on e1.d = e2.deptid", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#6, Column#5, test.employee.empid, test.employee.deptid, test.employee.salary", " └─HashJoin 8000.00 mpp[tiflash] inner join, equal:[eq(test.employee.deptid, Column#6)]", @@ -3632,7 +4424,7 @@ " │ └─Projection 8000.00 mpp[tiflash] Column#5, test.employee.deptid", " │ └─HashAgg 8000.00 mpp[tiflash] group by:Column#13, funcs:sum(Column#14)->Column#5, funcs:firstrow(Column#15)->test.employee.deptid", " │ └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#13, collate: binary]", + " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#13, collate: binary]", " │ └─HashAgg 8000.00 mpp[tiflash] group by:Column#27, funcs:count(Column#25)->Column#14, funcs:firstrow(Column#26)->Column#15", " │ └─Projection 10000.00 mpp[tiflash] test.employee.empid, test.employee.deptid, plus(test.employee.deptid, 1)->Column#27", " │ └─TableFullScan 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo", @@ -3643,7 +4435,7 @@ { "SQL": "select * from employee e1 join (select deptid+1 d, count(empid) a from employee group by d) e2 on e1.deptid = e2.d", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 8000.00 mpp[tiflash] inner join, equal:[eq(test.employee.deptid, Column#10)]", " ├─ExchangeReceiver(Build) 6400.00 mpp[tiflash] ", @@ -3653,7 +4445,7 @@ " │ └─Projection 8000.00 mpp[tiflash] Column#9, test.employee.deptid", " │ └─HashAgg 8000.00 mpp[tiflash] group by:Column#13, funcs:sum(Column#14)->Column#9, funcs:firstrow(Column#15)->test.employee.deptid", " │ └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#13, collate: binary]", + " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#13, collate: binary]", " │ └─HashAgg 8000.00 mpp[tiflash] group by:Column#27, funcs:count(Column#25)->Column#14, funcs:firstrow(Column#26)->Column#15", " │ └─Projection 10000.00 mpp[tiflash] test.employee.empid, test.employee.deptid, plus(test.employee.deptid, 1)->Column#27", " │ └─TableFullScan 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo", @@ -3664,7 +4456,7 @@ { "SQL": "select * from (select deptid+1 d, count(empid) a from employee group by d) e1 join (select deptid+1 d, count(empid) a from employee group by d) e2 on e1.d = e2.d", "Plan": [ - "TableReader 6400.00 root data:ExchangeSender", + "TableReader 6400.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 6400.00 mpp[tiflash] inner join, equal:[eq(Column#6, Column#12)]", " ├─ExchangeReceiver(Build) 6400.00 mpp[tiflash] ", @@ -3674,7 +4466,7 @@ " │ └─Projection 8000.00 mpp[tiflash] Column#5, test.employee.deptid", " │ └─HashAgg 8000.00 mpp[tiflash] group by:Column#17, funcs:sum(Column#18)->Column#5, funcs:firstrow(Column#19)->test.employee.deptid", " │ └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#17, collate: binary]", + " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#17, collate: binary]", " │ └─HashAgg 8000.00 mpp[tiflash] group by:Column#43, funcs:count(Column#41)->Column#18, funcs:firstrow(Column#42)->Column#19", " │ └─Projection 10000.00 mpp[tiflash] test.employee.empid, test.employee.deptid, plus(test.employee.deptid, 1)->Column#43", " │ └─TableFullScan 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo", @@ -3683,7 +4475,7 @@ " └─Projection 8000.00 mpp[tiflash] Column#11, test.employee.deptid", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#20, funcs:sum(Column#21)->Column#11, funcs:firstrow(Column#22)->test.employee.deptid", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#20, collate: binary]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#20, collate: binary]", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#46, funcs:count(Column#44)->Column#21, funcs:firstrow(Column#45)->Column#22", " └─Projection 10000.00 mpp[tiflash] test.employee.empid, test.employee.deptid, plus(test.employee.deptid, 1)->Column#46", " └─TableFullScan 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" @@ -3702,7 +4494,7 @@ "Plan": [ "Projection 1.25 root Column#5, test.employee.empid, test.employee.deptid, test.employee.salary", "└─HashJoin 1.25 root inner join, equal:[eq(test.employee.deptid, Column#5)]", - " ├─TableReader(Build) 1.00 root data:ExchangeSender", + " ├─TableReader(Build) 1.00 root MppVersion: 1, data:ExchangeSender", " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " │ └─Projection 1.00 mpp[tiflash] Column#5", " │ └─HashAgg 1.00 mpp[tiflash] funcs:sum(Column#12)->Column#5", @@ -3710,7 +4502,7 @@ " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " │ └─HashAgg 1.00 mpp[tiflash] funcs:count(distinct test.employee.deptid)->Column#12", " │ └─ExchangeReceiver 1.00 mpp[tiflash] ", - " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary]", + " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary]", " │ └─HashAgg 1.00 mpp[tiflash] group by:test.employee.deptid, ", " │ └─TableFullScan 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo", " └─TableReader(Probe) 9990.00 root data:Selection", @@ -3722,7 +4514,7 @@ "SQL": "select * from (select count(distinct deptid) a from employee) e1 join (select count(distinct deptid) b from employee) e2 on e1.a=e2.b", "Plan": [ "HashJoin 1.00 root inner join, equal:[eq(Column#5, Column#10)]", - "├─TableReader(Build) 1.00 root data:ExchangeSender", + "├─TableReader(Build) 1.00 root MppVersion: 1, data:ExchangeSender", "│ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", "│ └─Projection 1.00 mpp[tiflash] Column#10", "│ └─HashAgg 1.00 mpp[tiflash] funcs:sum(Column#16)->Column#10", @@ -3730,10 +4522,10 @@ "│ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", "│ └─HashAgg 1.00 mpp[tiflash] funcs:count(distinct test.employee.deptid)->Column#16", "│ └─ExchangeReceiver 1.00 mpp[tiflash] ", - "│ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary]", + "│ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary]", "│ └─HashAgg 1.00 mpp[tiflash] group by:test.employee.deptid, ", "│ └─TableFullScan 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo", - "└─TableReader(Probe) 1.00 root data:ExchangeSender", + "└─TableReader(Probe) 1.00 root MppVersion: 1, data:ExchangeSender", " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 mpp[tiflash] Column#5", " └─HashAgg 1.00 mpp[tiflash] funcs:sum(Column#15)->Column#5", @@ -3741,7 +4533,7 @@ " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 mpp[tiflash] funcs:count(distinct test.employee.deptid)->Column#15", " └─ExchangeReceiver 1.00 mpp[tiflash] ", - " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary]", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary]", " └─HashAgg 1.00 mpp[tiflash] group by:test.employee.deptid, ", " └─TableFullScan 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ] @@ -3749,15 +4541,15 @@ { "SQL": "select * from employee e1 join employee e2 on e1.deptid = e2.deptid", "Plan": [ - "TableReader 12487.50 root data:ExchangeSender", + "TableReader 12487.50 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.employee.deptid, test.employee.deptid)]", " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", - " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary]", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary]", " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.employee.deptid))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:e1 keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 9990.00 mpp[tiflash] ", - " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary]", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary]", " └─Selection 9990.00 mpp[tiflash] not(isnull(test.employee.deptid))", " └─TableFullScan 10000.00 mpp[tiflash] table:e2 keep order:false, stats:pseudo" ] @@ -3765,23 +4557,23 @@ { "SQL": "select * from (select deptid+1 d, count(empid) a from employee group by d) e1 join employee e2 on e1.d = e2.deptid", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] Column#6, Column#5, test.employee.empid, test.employee.deptid, test.employee.salary", " └─HashJoin 8000.00 mpp[tiflash] inner join, equal:[eq(test.employee.deptid, Column#6)]", " ├─ExchangeReceiver(Build) 6400.00 mpp[tiflash] ", - " │ └─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#6, collate: binary]", + " │ └─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#6, collate: binary]", " │ └─Projection 6400.00 mpp[tiflash] plus(test.employee.deptid, 1)->Column#6, Column#5", " │ └─Selection 6400.00 mpp[tiflash] not(isnull(plus(test.employee.deptid, 1)))", " │ └─Projection 8000.00 mpp[tiflash] Column#5, test.employee.deptid", " │ └─HashAgg 8000.00 mpp[tiflash] group by:Column#13, funcs:sum(Column#14)->Column#5, funcs:firstrow(Column#15)->test.employee.deptid", " │ └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#13, collate: binary]", + " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#13, collate: binary]", " │ └─HashAgg 8000.00 mpp[tiflash] group by:Column#29, funcs:count(Column#27)->Column#14, funcs:firstrow(Column#28)->Column#15", " │ └─Projection 10000.00 mpp[tiflash] test.employee.empid, test.employee.deptid, plus(test.employee.deptid, 1)->Column#29", " │ └─TableFullScan 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 9990.00 mpp[tiflash] ", - " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#26, collate: binary]", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#26, collate: binary]", " └─Projection 9990.00 mpp[tiflash] test.employee.empid, test.employee.deptid, test.employee.salary, cast(test.employee.deptid, bigint(20))->Column#26", " └─Selection 9990.00 mpp[tiflash] not(isnull(test.employee.deptid))", " └─TableFullScan 10000.00 mpp[tiflash] table:e2 keep order:false, stats:pseudo" @@ -3790,23 +4582,23 @@ { "SQL": "select * from employee e1 join (select deptid+1 d, count(empid) a from employee group by d) e2 on e1.deptid = e2.d", "Plan": [ - "TableReader 8000.00 root data:ExchangeSender", + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 mpp[tiflash] test.employee.empid, test.employee.deptid, test.employee.salary, Column#10, Column#9", " └─HashJoin 8000.00 mpp[tiflash] inner join, equal:[eq(test.employee.deptid, Column#10)]", " ├─ExchangeReceiver(Build) 6400.00 mpp[tiflash] ", - " │ └─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#10, collate: binary]", + " │ └─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#10, collate: binary]", " │ └─Projection 6400.00 mpp[tiflash] plus(test.employee.deptid, 1)->Column#10, Column#9", " │ └─Selection 6400.00 mpp[tiflash] not(isnull(plus(test.employee.deptid, 1)))", " │ └─Projection 8000.00 mpp[tiflash] Column#9, test.employee.deptid", " │ └─HashAgg 8000.00 mpp[tiflash] group by:Column#13, funcs:sum(Column#14)->Column#9, funcs:firstrow(Column#15)->test.employee.deptid", " │ └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#13, collate: binary]", + " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#13, collate: binary]", " │ └─HashAgg 8000.00 mpp[tiflash] group by:Column#29, funcs:count(Column#27)->Column#14, funcs:firstrow(Column#28)->Column#15", " │ └─Projection 10000.00 mpp[tiflash] test.employee.empid, test.employee.deptid, plus(test.employee.deptid, 1)->Column#29", " │ └─TableFullScan 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 9990.00 mpp[tiflash] ", - " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#26, collate: binary]", + " └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#26, collate: binary]", " └─Projection 9990.00 mpp[tiflash] test.employee.empid, test.employee.deptid, test.employee.salary, cast(test.employee.deptid, bigint(20))->Column#26", " └─Selection 9990.00 mpp[tiflash] not(isnull(test.employee.deptid))", " └─TableFullScan 10000.00 mpp[tiflash] table:e1 keep order:false, stats:pseudo" @@ -3815,28 +4607,28 @@ { "SQL": "select * from (select deptid+1 d, count(empid) a from employee group by d) e1 join (select deptid+1 d, count(empid) a from employee group by d) e2 on e1.d = e2.d", "Plan": [ - "TableReader 6400.00 root data:ExchangeSender", + "TableReader 6400.00 root MppVersion: 1, data:ExchangeSender", "└─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin 6400.00 mpp[tiflash] inner join, equal:[eq(Column#6, Column#12)]", " ├─ExchangeReceiver(Build) 6400.00 mpp[tiflash] ", - " │ └─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#6, collate: binary]", + " │ └─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#6, collate: binary]", " │ └─Projection 6400.00 mpp[tiflash] plus(test.employee.deptid, 1)->Column#6, Column#5", " │ └─Selection 6400.00 mpp[tiflash] not(isnull(plus(test.employee.deptid, 1)))", " │ └─Projection 8000.00 mpp[tiflash] Column#5, test.employee.deptid", " │ └─HashAgg 8000.00 mpp[tiflash] group by:Column#17, funcs:sum(Column#18)->Column#5, funcs:firstrow(Column#19)->test.employee.deptid", " │ └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#17, collate: binary]", + " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#17, collate: binary]", " │ └─HashAgg 8000.00 mpp[tiflash] group by:Column#43, funcs:count(Column#41)->Column#18, funcs:firstrow(Column#42)->Column#19", " │ └─Projection 10000.00 mpp[tiflash] test.employee.empid, test.employee.deptid, plus(test.employee.deptid, 1)->Column#43", " │ └─TableFullScan 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo", " └─ExchangeReceiver(Probe) 6400.00 mpp[tiflash] ", - " └─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#12, collate: binary]", + " └─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#12, collate: binary]", " └─Projection 6400.00 mpp[tiflash] plus(test.employee.deptid, 1)->Column#12, Column#11", " └─Selection 6400.00 mpp[tiflash] not(isnull(plus(test.employee.deptid, 1)))", " └─Projection 8000.00 mpp[tiflash] Column#11, test.employee.deptid", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#20, funcs:sum(Column#21)->Column#11, funcs:firstrow(Column#22)->test.employee.deptid", " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#20, collate: binary]", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#20, collate: binary]", " └─HashAgg 8000.00 mpp[tiflash] group by:Column#46, funcs:count(Column#44)->Column#21, funcs:firstrow(Column#45)->Column#22", " └─Projection 10000.00 mpp[tiflash] test.employee.empid, test.employee.deptid, plus(test.employee.deptid, 1)->Column#46", " └─TableFullScan 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" @@ -5935,7 +6727,7 @@ "└─Apply 10000.00 root CARTESIAN inner join", " ├─TableReader(Build) 10000.00 root data:TableFullScan", " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashAgg(Probe) 10000.00 root funcs:max(Column#14)->Column#8, funcs:count(distinct Column#15)->Column#9, funcs:sum(Column#16)->Column#10, funcs:count(1)->Column#11", + " └─StreamAgg(Probe) 10000.00 root funcs:max(Column#14)->Column#8, funcs:count(distinct Column#15)->Column#9, funcs:sum(Column#16)->Column#10, funcs:count(1)->Column#11", " └─Projection 10000.00 root test.t2.b, test.t2.b, cast(isnull(test.t2.b), decimal(20,0) BINARY)->Column#16", " └─TableReader 10000.00 root data:TableRangeScan", " └─TableRangeScan 10000.00 cop[tikv] table:t2 range: decided by [eq(test.t2.a, test.t1.b)], keep order:false, stats:pseudo" @@ -5953,7 +6745,7 @@ "└─Apply 10000.00 root CARTESIAN inner join", " ├─TableReader(Build) 10000.00 root data:TableFullScan", " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashAgg(Probe) 10000.00 root funcs:max(Column#14)->Column#8, funcs:count(distinct Column#15)->Column#9, funcs:sum(Column#16)->Column#10, funcs:count(1)->Column#11", + " └─StreamAgg(Probe) 10000.00 root funcs:max(Column#14)->Column#8, funcs:count(distinct Column#15)->Column#9, funcs:sum(Column#16)->Column#10, funcs:count(1)->Column#11", " └─Projection 10000.00 root test.t2.b, test.t2.b, cast(isnull(test.t2.b), decimal(20,0) BINARY)->Column#16", " └─TableReader 10000.00 root data:TableRangeScan", " └─TableRangeScan 10000.00 cop[tikv] table:t2 range: decided by [eq(test.t2.a, test.t1.b)], keep order:false, stats:pseudo" @@ -5971,7 +6763,7 @@ "└─Apply 10000.00 root CARTESIAN inner join", " ├─TableReader(Build) 10000.00 root data:TableFullScan", " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashAgg(Probe) 10000.00 root funcs:max(Column#19)->Column#8, funcs:sum(Column#20)->Column#9, funcs:count(1)->Column#10", + " └─StreamAgg(Probe) 10000.00 root funcs:max(Column#19)->Column#8, funcs:sum(Column#20)->Column#9, funcs:count(1)->Column#10", " └─Projection 10000.00 root test.t2.b, cast(isnull(test.t2.b), decimal(20,0) BINARY)->Column#20", " └─TableReader 10000.00 root data:TableRangeScan", " └─TableRangeScan 10000.00 cop[tikv] table:t2 range: decided by [eq(test.t2.a, test.t1.b)], keep order:false, stats:pseudo" @@ -5989,7 +6781,7 @@ "└─Apply 10000.00 root CARTESIAN inner join", " ├─TableReader(Build) 10000.00 root data:TableFullScan", " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashAgg(Probe) 10000.00 root funcs:max(Column#19)->Column#8, funcs:sum(Column#20)->Column#9, funcs:count(1)->Column#10", + " └─StreamAgg(Probe) 10000.00 root funcs:max(Column#19)->Column#8, funcs:sum(Column#20)->Column#9, funcs:count(1)->Column#10", " └─Projection 10000.00 root test.t2.b, cast(isnull(test.t2.b), decimal(20,0) BINARY)->Column#20", " └─TableReader 10000.00 root data:TableRangeScan", " └─TableRangeScan 10000.00 cop[tikv] table:t2 range: decided by [eq(test.t2.a, test.t1.b)], keep order:false, stats:pseudo" @@ -6159,9 +6951,9 @@ " ├─TableReader(Build) 10000.00 root data:TableFullScan", " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", " └─MaxOneRow(Probe) 10000.00 root ", - " └─HashAgg 10000.00 root funcs:count(Column#11)->Column#10", - " └─TableReader 10000.00 root data:HashAgg", - " └─HashAgg 10000.00 cop[tikv] funcs:count(test.t3.a)->Column#11", + " └─StreamAgg 10000.00 root funcs:count(Column#12)->Column#10", + " └─TableReader 10000.00 root data:StreamAgg", + " └─StreamAgg 10000.00 cop[tikv] funcs:count(test.t3.a)->Column#12", " └─Selection 100000.00 cop[tikv] eq(test.t3.b, test.t1.b)", " └─TableFullScan 100000000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" ], @@ -6234,9 +7026,9 @@ " │ └─Selection 250.00 cop[tikv] like(test.ta.name, \"chad999%\", 92)", " │ └─TableFullScan 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo", " └─MaxOneRow(Probe) 250.00 root ", - " └─HashAgg 250.00 root funcs:sum(Column#33)->Column#18", + " └─StreamAgg 250.00 root funcs:sum(Column#33)->Column#18", " └─Projection 1998.00 root cast(test.tb.code, decimal(10,0) BINARY)->Column#33", - " └─IndexJoin 1998.00 root semi join, inner:IndexLookUp, outer key:test.tb.name, inner key:test.tc.name, equal cond:eq(test.tb.name, test.tc.name)", + " └─IndexHashJoin 1998.00 root semi join, inner:IndexLookUp, outer key:test.tb.name, inner key:test.tc.name, equal cond:eq(test.tb.name, test.tc.name)", " ├─IndexLookUp(Build) 2497.50 root ", " │ ├─IndexRangeScan(Build) 2500.00 cop[tikv] table:tb, index:idx_tb_id(id) range: decided by [eq(test.ta.id, test.tb.id)], keep order:false, stats:pseudo", " │ └─Selection(Probe) 2497.50 cop[tikv] not(isnull(test.tb.name))", @@ -6280,7 +7072,7 @@ " │ └─Selection 250.00 cop[tikv] like(test.ta.name, \"chad999%\", 92)", " │ └─TableFullScan 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo", " └─MaxOneRow(Probe) 250.00 root ", - " └─HashAgg 250.00 root funcs:sum(Column#22)->Column#18", + " └─StreamAgg 250.00 root funcs:sum(Column#22)->Column#18", " └─Projection 2500.00 root cast(test.tb.code, decimal(10,0) BINARY)->Column#22", " └─Apply 2500.00 root CARTESIAN semi join", " ├─IndexLookUp(Build) 2500.00 root ", @@ -6323,7 +7115,7 @@ " │ └─TableRowIDScan(Probe) 10.00 cop[tikv] table:ta keep order:false, stats:pseudo", " └─Selection(Probe) 8.00 root gt(Column#9, 900)", " └─MaxOneRow 10.00 root ", - " └─HashAgg 10.00 root funcs:max(test.tb.code)->Column#9", + " └─StreamAgg 10.00 root funcs:max(test.tb.code)->Column#9", " └─TopN 10.00 root test.tb.code:desc, offset:0, count:1", " └─IndexLookUp 10.00 root ", " ├─IndexRangeScan(Build) 100.00 cop[tikv] table:tb, index:idx_tb_id(id) range: decided by [eq(test.ta.id, test.tb.id)], keep order:false, stats:pseudo", @@ -6368,7 +7160,7 @@ "Projection 249.75 root test.ta.name", "└─Apply 249.75 root CARTESIAN inner join", " ├─Apply(Build) 249.75 root CARTESIAN inner join", - " │ ├─IndexJoin(Build) 249.75 root inner join, inner:IndexLookUp, outer key:test.tb.code, inner key:test.ta.code, equal cond:eq(test.tb.code, test.ta.code)", + " │ ├─IndexHashJoin(Build) 249.75 root inner join, inner:IndexLookUp, outer key:test.tb.code, inner key:test.ta.code, equal cond:eq(test.tb.code, test.ta.code)", " │ │ ├─HashAgg(Build) 199.80 root group by:test.tb.code, funcs:firstrow(test.tb.code)->test.tb.code", " │ │ │ └─TableReader 249.75 root data:Selection", " │ │ │ └─Selection 249.75 cop[tikv] like(test.tb.name, \"chad9%\", 92), not(isnull(test.tb.code))", @@ -6438,5 +7230,424 @@ "Warning": null } ] + }, + { + "Name": "TestCountStarForTikv", + "Cases": [ + { + "SQL": "select count(*) from t", + "Plan": [ + "StreamAgg 1.00 root funcs:count(Column#12)->Column#10", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#12", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select count(1), count(3.1415), count(0), count(null) from t -- shouldn't be rewritten", + "Plan": [ + "StreamAgg 1.00 root funcs:count(Column#18)->Column#10, funcs:count(Column#19)->Column#11, funcs:count(Column#20)->Column#12, funcs:count(Column#21)->Column#13", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#18, funcs:count(3.1415)->Column#19, funcs:count(0)->Column#20, funcs:count(NULL)->Column#21", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select count(*) from t where a=1", + "Plan": [ + "StreamAgg 1.00 root funcs:count(Column#12)->Column#10", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#12", + " └─Selection 10.00 cop[tikv] eq(test.t.a, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select count(*) from t_pick_row_id", + "Plan": [ + "StreamAgg 1.00 root funcs:count(Column#5)->Column#3", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#5", + " └─TableFullScan 10000.00 cop[tikv] table:t_pick_row_id keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select t.b, t.c from (select count(*) as c from t) a, t where a.c=t.a -- shouldn't be rewritten", + "Plan": [ + "HashJoin 1.25 root inner join, equal:[eq(test.t.a, Column#10)]", + "├─StreamAgg(Build) 1.00 root funcs:count(Column#21)->Column#10", + "│ └─TableReader 1.00 root data:StreamAgg", + "│ └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#21", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select * from t out where out.a > (select count(*) from t inn where inn.a = out.b) -- shouldn't be rewritten", + "Plan": [ + "Projection 10000.00 root test.t.a, test.t.b, test.t.c, test.t.d, test.t.e, test.t.f, test.t.g, test.t.h", + "└─Apply 10000.00 root CARTESIAN inner join, other cond:gt(test.t.a, Column#19)", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:out keep order:false, stats:pseudo", + " └─StreamAgg(Probe) 10000.00 root funcs:count(Column#21)->Column#19", + " └─TableReader 10000.00 root data:StreamAgg", + " └─StreamAgg 10000.00 cop[tikv] funcs:count(1)->Column#21", + " └─Selection 80000000.00 cop[tikv] eq(cast(test.t.a, double BINARY), cast(test.t.b, double BINARY))", + " └─TableFullScan 100000000.00 cop[tikv] table:inn keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select count(*) from t t1, t t2 where t1.a=t2.e -- shouldn't be rewritten", + "Plan": [ + "HashAgg 1.00 root funcs:count(1)->Column#19", + "└─HashJoin 12500.00 root inner join, equal:[eq(test.t.a, test.t.e)]", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select count(distinct 1) from t -- shouldn't be rewritten", + "Plan": [ + "StreamAgg 1.00 root funcs:count(distinct 1)->Column#10", + "└─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select count(1), count(a), count(b) from t -- shouldn't be rewritten", + "Plan": [ + "StreamAgg 1.00 root funcs:count(Column#16)->Column#10, funcs:count(Column#17)->Column#11, funcs:count(Column#18)->Column#12", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#16, funcs:count(test.t.a)->Column#17, funcs:count(test.t.b)->Column#18", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select a, count(*) from t group by a -- shouldn't be rewritten", + "Plan": [ + "Projection 8000.00 root test.t.a, Column#10", + "└─HashAgg 8000.00 root group by:test.t.a, funcs:count(1)->Column#10, funcs:firstrow(test.t.a)->test.t.a", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select sum(a) from t -- sum shouldn't be rewritten", + "Plan": [ + "StreamAgg 1.00 root funcs:sum(Column#12)->Column#10", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:sum(test.t.a)->Column#12", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warning": null + } + ] + }, + { + "Name": "TestCountStarForTiFlash", + "Cases": [ + { + "SQL": "select count(*) from t", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#10", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 mpp[tiflash] funcs:count(test.t.d)->Column#12", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select count(1), count(3.1415), count(0), count(null) from t -- every count but count(null) can be rewritten", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#18)->Column#10, funcs:count(Column#19)->Column#11, funcs:count(Column#20)->Column#12, funcs:count(Column#21)->Column#13", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 mpp[tiflash] funcs:count(test.t.d)->Column#18, funcs:count(test.t.d)->Column#19, funcs:count(test.t.d)->Column#20, funcs:count(NULL)->Column#21", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select count(*) from t where a=1", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#10", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#12", + " └─Selection 10.00 mpp[tiflash] eq(test.t.a, 1)", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select count(*) from t_pick_row_id", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#5)->Column#3", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 mpp[tiflash] funcs:count(test.t_pick_row_id._tidb_rowid)->Column#5", + " └─TableFullScan 10000.00 mpp[tiflash] table:t_pick_row_id keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select t.b, t.c from (select count(*) as c from t) a, t where a.c=t.a -- test recursive", + "Plan": [ + "HashJoin 1.25 root inner join, equal:[eq(test.t.a, Column#10)]", + "├─HashAgg(Build) 1.00 root funcs:count(Column#22)->Column#10", + "│ └─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", + "│ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", + "│ └─HashAgg 1.00 mpp[tiflash] funcs:count(test.t.d)->Column#22", + "│ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select * from t out where out.a > (select count(*) from t inn where inn.a = out.b) -- shouldn't be rewritten for correlated sub query", + "Plan": [ + "Projection 10000.00 root test.t.a, test.t.b, test.t.c, test.t.d, test.t.e, test.t.f, test.t.g, test.t.h", + "└─Apply 10000.00 root CARTESIAN inner join, other cond:gt(test.t.a, Column#19)", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tiflash] table:out keep order:false, stats:pseudo", + " └─HashAgg(Probe) 10000.00 root funcs:count(Column#21)->Column#19", + " └─TableReader 10000.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashAgg 10000.00 mpp[tiflash] funcs:count(1)->Column#21", + " └─Selection 80000000.00 mpp[tiflash] eq(cast(test.t.a, double BINARY), cast(test.t.b, double BINARY))", + " └─TableFullScan 100000000.00 mpp[tiflash] table:inn keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select count(*) from t t1, t t2 where t1.a=t2.e -- shouldn't be rewritten when join under agg", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#20)->Column#19", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#20", + " └─HashJoin 12500.00 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t.e)]", + " ├─ExchangeReceiver(Build) 10000.00 mpp[tiflash] ", + " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─TableFullScan(Probe) 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select count(distinct 1) from t -- shouldn't be rewritten", + "Plan": [ + "TableReader 1.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 1.00 mpp[tiflash] Column#10", + " └─HashAgg 1.00 mpp[tiflash] funcs:count(distinct Column#12)->Column#10", + " └─ExchangeReceiver 1.00 mpp[tiflash] ", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 mpp[tiflash] group by:1, ", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select count(1), count(a), count(b) from t -- keep count(1)", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#16)->Column#10, funcs:count(Column#17)->Column#11, funcs:count(Column#18)->Column#12", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 mpp[tiflash] funcs:count(1)->Column#16, funcs:count(test.t.a)->Column#17, funcs:count(test.t.b)->Column#18", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select a, count(*) from t group by a -- shouldn't be rewritten", + "Plan": [ + "TableReader 8000.00 root MppVersion: 1, data:ExchangeSender", + "└─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 mpp[tiflash] test.t.a, Column#10", + " └─Projection 8000.00 mpp[tiflash] Column#10, test.t.a", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, funcs:count(1)->Column#10, funcs:firstrow(test.t.a)->test.t.a", + " └─ExchangeReceiver 10000.00 mpp[tiflash] ", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select sum(a) from t -- sum shouldn't be rewritten", + "Plan": [ + "HashAgg 1.00 root funcs:sum(Column#12)->Column#10", + "└─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 mpp[tiflash] funcs:sum(Column#15)->Column#12", + " └─Projection 10000.00 mpp[tiflash] cast(test.t.a, decimal(10,0) BINARY)->Column#15", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warning": null + } + ] + }, + { + "Name": "TestHashAggPushdownToTiFlashCompute", + "Cases": [ + { + "SQL": "select /*+ agg_to_cop() hash_agg() */ avg( distinct tbl_15.col_96 ) as r0 , min( tbl_15.col_92 ) as r1 , sum( distinct tbl_15.col_91 ) as r2 , max( tbl_15.col_92 ) as r3 from tbl_15 where tbl_15.col_94 != '2033-01-09' and tbl_15.col_93 > 7623.679908049186 order by r0,r1,r2,r3 limit 79 ;", + "Plan": [ + "Limit 1.00 root offset:0, count:79", + "└─Sort 1.00 root Column#11, Column#12, Column#13, Column#14", + " └─HashAgg 1.00 root funcs:avg(distinct Column#89)->Column#11, funcs:min(Column#90)->Column#12, funcs:sum(distinct Column#91)->Column#13, funcs:max(Column#92)->Column#14", + " └─Projection 7100.44 root cast(test.tbl_15.col_96, decimal(10,0) UNSIGNED BINARY)->Column#89, Column#15, cast(test.tbl_15.col_91, decimal(3,0) UNSIGNED BINARY)->Column#91, Column#16", + " └─PartitionUnion 7100.44 root ", + " ├─TableReader 1775.11 root MppVersion: 1, data:ExchangeSender", + " │ └─ExchangeSender 1775.11 mpp[tiflash] ExchangeType: PassThrough", + " │ └─HashAgg 1775.11 mpp[tiflash] group by:test.tbl_15.col_91, test.tbl_15.col_96, funcs:firstrow(test.tbl_15.col_96)->test.tbl_15.col_96, funcs:min(Column#18)->Column#15, funcs:firstrow(test.tbl_15.col_91)->test.tbl_15.col_91, funcs:max(Column#20)->Column#16, funcs:firstrow(test.tbl_15.col_96)->test.tbl_15.col_96, funcs:firstrow(test.tbl_15.col_91)->test.tbl_15.col_91", + " │ └─ExchangeReceiver 1775.11 mpp[tiflash] ", + " │ └─ExchangeSender 1775.11 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.tbl_15.col_96, collate: binary], [name: test.tbl_15.col_91, collate: binary]", + " │ └─HashAgg 1775.11 mpp[tiflash] group by:test.tbl_15.col_91, test.tbl_15.col_96, funcs:min(test.tbl_15.col_92)->Column#18, funcs:max(test.tbl_15.col_92)->Column#20", + " │ └─Selection 2218.89 mpp[tiflash] gt(test.tbl_15.col_93, 7623.679908049186), ne(test.tbl_15.col_94, 2033-01-09 00:00:00.000000)", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:tbl_15, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 1775.11 root MppVersion: 1, data:ExchangeSender", + " │ └─ExchangeSender 1775.11 mpp[tiflash] ExchangeType: PassThrough", + " │ └─HashAgg 1775.11 mpp[tiflash] group by:test.tbl_15.col_91, test.tbl_15.col_96, funcs:firstrow(test.tbl_15.col_96)->test.tbl_15.col_96, funcs:min(Column#30)->Column#15, funcs:firstrow(test.tbl_15.col_91)->test.tbl_15.col_91, funcs:max(Column#32)->Column#16, funcs:firstrow(test.tbl_15.col_96)->test.tbl_15.col_96, funcs:firstrow(test.tbl_15.col_91)->test.tbl_15.col_91", + " │ └─ExchangeReceiver 1775.11 mpp[tiflash] ", + " │ └─ExchangeSender 1775.11 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.tbl_15.col_96, collate: binary], [name: test.tbl_15.col_91, collate: binary]", + " │ └─HashAgg 1775.11 mpp[tiflash] group by:test.tbl_15.col_91, test.tbl_15.col_96, funcs:min(test.tbl_15.col_92)->Column#30, funcs:max(test.tbl_15.col_92)->Column#32", + " │ └─Selection 2218.89 mpp[tiflash] gt(test.tbl_15.col_93, 7623.679908049186), ne(test.tbl_15.col_94, 2033-01-09 00:00:00.000000)", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:tbl_15, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 1775.11 root MppVersion: 1, data:ExchangeSender", + " │ └─ExchangeSender 1775.11 mpp[tiflash] ExchangeType: PassThrough", + " │ └─HashAgg 1775.11 mpp[tiflash] group by:test.tbl_15.col_91, test.tbl_15.col_96, funcs:firstrow(test.tbl_15.col_96)->test.tbl_15.col_96, funcs:min(Column#42)->Column#15, funcs:firstrow(test.tbl_15.col_91)->test.tbl_15.col_91, funcs:max(Column#44)->Column#16, funcs:firstrow(test.tbl_15.col_96)->test.tbl_15.col_96, funcs:firstrow(test.tbl_15.col_91)->test.tbl_15.col_91", + " │ └─ExchangeReceiver 1775.11 mpp[tiflash] ", + " │ └─ExchangeSender 1775.11 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.tbl_15.col_96, collate: binary], [name: test.tbl_15.col_91, collate: binary]", + " │ └─HashAgg 1775.11 mpp[tiflash] group by:test.tbl_15.col_91, test.tbl_15.col_96, funcs:min(test.tbl_15.col_92)->Column#42, funcs:max(test.tbl_15.col_92)->Column#44", + " │ └─Selection 2218.89 mpp[tiflash] gt(test.tbl_15.col_93, 7623.679908049186), ne(test.tbl_15.col_94, 2033-01-09 00:00:00.000000)", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:tbl_15, partition:p2 keep order:false, stats:pseudo", + " └─TableReader 1775.11 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 1775.11 mpp[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1775.11 mpp[tiflash] group by:test.tbl_15.col_91, test.tbl_15.col_96, funcs:firstrow(test.tbl_15.col_96)->test.tbl_15.col_96, funcs:min(Column#54)->Column#15, funcs:firstrow(test.tbl_15.col_91)->test.tbl_15.col_91, funcs:max(Column#56)->Column#16, funcs:firstrow(test.tbl_15.col_96)->test.tbl_15.col_96, funcs:firstrow(test.tbl_15.col_91)->test.tbl_15.col_91", + " └─ExchangeReceiver 1775.11 mpp[tiflash] ", + " └─ExchangeSender 1775.11 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.tbl_15.col_96, collate: binary], [name: test.tbl_15.col_91, collate: binary]", + " └─HashAgg 1775.11 mpp[tiflash] group by:test.tbl_15.col_91, test.tbl_15.col_96, funcs:min(test.tbl_15.col_92)->Column#54, funcs:max(test.tbl_15.col_92)->Column#56", + " └─Selection 2218.89 mpp[tiflash] gt(test.tbl_15.col_93, 7623.679908049186), ne(test.tbl_15.col_94, 2033-01-09 00:00:00.000000)", + " └─TableFullScan 10000.00 mpp[tiflash] table:tbl_15, partition:p3 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ agg_to_cop() hash_agg() */ count(1) from tbl_15 ;", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─PartitionUnion 4.00 root ", + " ├─HashAgg 1.00 root funcs:count(Column#13)->Column#12", + " │ └─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", + " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", + " │ └─HashAgg 1.00 mpp[tiflash] funcs:count(test.tbl_15.col_91)->Column#13", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:tbl_15, partition:p0 keep order:false, stats:pseudo", + " ├─HashAgg 1.00 root funcs:count(Column#14)->Column#12", + " │ └─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", + " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", + " │ └─HashAgg 1.00 mpp[tiflash] funcs:count(test.tbl_15.col_91)->Column#14", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:tbl_15, partition:p1 keep order:false, stats:pseudo", + " ├─HashAgg 1.00 root funcs:count(Column#15)->Column#12", + " │ └─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", + " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", + " │ └─HashAgg 1.00 mpp[tiflash] funcs:count(test.tbl_15.col_91)->Column#15", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:tbl_15, partition:p2 keep order:false, stats:pseudo", + " └─HashAgg 1.00 root funcs:count(Column#16)->Column#12", + " └─TableReader 1.00 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 mpp[tiflash] funcs:count(test.tbl_15.col_91)->Column#16", + " └─TableFullScan 10000.00 mpp[tiflash] table:tbl_15, partition:p3 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ agg_to_cop() stream_agg() */ avg( tbl_16.col_100 ) as r0 from tbl_16 where tbl_16.col_100 in ( 10672141 ) or tbl_16.col_104 in ( 'yfEG1t!*b' ,'C1*bqx_qyO' ,'vQ^yUpKHr&j#~' ) group by tbl_16.col_100 order by r0 limit 20 ;", + "Plan": [ + "TopN 20.00 root Column#10, offset:0, count:20", + "└─HashAgg 63.95 root group by:test.tbl_16.col_100, funcs:avg(Column#11, Column#12)->Column#10", + " └─PartitionUnion 63.95 root ", + " ├─StreamAgg 31.98 root group by:Column#22, funcs:count(Column#19)->Column#11, funcs:sum(Column#20)->Column#12, funcs:firstrow(Column#21)->test.tbl_16.col_100", + " │ └─Projection 39.97 root test.tbl_16.col_100, cast(test.tbl_16.col_100, decimal(8,0) UNSIGNED BINARY)->Column#20, test.tbl_16.col_100, test.tbl_16.col_100", + " │ └─Sort 39.97 root test.tbl_16.col_100", + " │ └─TableReader 39.97 root MppVersion: 1, data:ExchangeSender", + " │ └─ExchangeSender 39.97 mpp[tiflash] ExchangeType: PassThrough", + " │ └─Selection 39.97 mpp[tiflash] or(eq(test.tbl_16.col_100, 10672141), in(test.tbl_16.col_104, \"yfEG1t!*b\", \"C1*bqx_qyO\", \"vQ^yUpKHr&j#~\"))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:tbl_16, partition:p0 keep order:false, stats:pseudo", + " └─StreamAgg 31.98 root group by:Column#26, funcs:count(Column#23)->Column#11, funcs:sum(Column#24)->Column#12, funcs:firstrow(Column#25)->test.tbl_16.col_100", + " └─Projection 39.97 root test.tbl_16.col_100, cast(test.tbl_16.col_100, decimal(8,0) UNSIGNED BINARY)->Column#24, test.tbl_16.col_100, test.tbl_16.col_100", + " └─Sort 39.97 root test.tbl_16.col_100", + " └─TableReader 39.97 root MppVersion: 1, data:ExchangeSender", + " └─ExchangeSender 39.97 mpp[tiflash] ExchangeType: PassThrough", + " └─Selection 39.97 mpp[tiflash] or(eq(test.tbl_16.col_100, 10672141), in(test.tbl_16.col_104, \"yfEG1t!*b\", \"C1*bqx_qyO\", \"vQ^yUpKHr&j#~\"))", + " └─TableFullScan 10000.00 mpp[tiflash] table:tbl_16, partition:p1 keep order:false, stats:pseudo" + ], + "Warning": null + } + ] + }, + { + "Name": "TestRemoveRedundantPredicates", + "Cases": [ + { + "SQL": "select f from t use index() where f = 1 and f = 1 -- simple redundancy of exact condition", + "Best": "TableReader(Table(t)->Sel([eq(test.t.f, 1)]))" + }, + { + "SQL": "select f from t use index() where f = 1 and f = 2 -- unsatisfiable condition", + "Best": "Dual" + }, + { + "SQL": "select f from t use index() where f = 1 and f in (1,2,3) -- intersection of in and =", + "Best": "TableReader(Table(t)->Sel([eq(test.t.f, 1)]))" + }, + { + "SQL": "select f from t use index() where f = 1 and f <> 1 -- intersection of = and <>", + "Best": "Dual" + }, + { + "SQL": "select f from t use index() where f not in (1,2,3) and f = 3 -- intersection of not in list and =", + "Best": "Dual" + }, + { + "SQL": "select f from t use index() where f <> 3 and f <> 3 -- intersection of two not in values.", + "Best": "TableReader(Table(t)->Sel([ne(test.t.f, 3)]))" + }, + { + "SQL": "select t1.f /* merge_join(t1, t2) */ from t t1, t t2 where t1.a=t2.a and t1.a=t2.a -- exact redundancy in joins", + "Best": "MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)" + }, + { + "SQL": "select f from t use index() where f in (1,2,3) and f <> 2 -- intersection of in and <>. Not done yet see issue 39676", + "Best": "TableReader(Table(t)->Sel([in(test.t.f, 1, 2, 3) ne(test.t.f, 2)]))" + }, + { + "SQL": "select f from t use index() where f in (1,2,3) and f in (3,4,5) -- intersection of two in. Not done yet", + "Best": "TableReader(Table(t)->Sel([in(test.t.f, 1, 2, 3) in(test.t.f, 3, 4, 5)]))" + }, + { + "SQL": "select f from t use index() where f not in (1,2,3) and f not in (3,4,5) -- intersection of two not in. Not done yet", + "Best": "TableReader(Table(t)->Sel([not(in(test.t.f, 1, 2, 3)) not(in(test.t.f, 3, 4, 5))]))" + }, + { + "SQL": "select f from t use index() where f not in (1,2,3) and f in (1,2,3) -- intersection of in and not in. Not done yet", + "Best": "TableReader(Table(t)->Sel([not(in(test.t.f, 1, 2, 3)) in(test.t.f, 1, 2, 3)]))" + } + ] } ] diff --git a/planner/core/testdata/window_push_down_suite_out.json b/planner/core/testdata/window_push_down_suite_out.json index 0b587eb83ce39..f01f4e3cb2d3c 100644 --- a/planner/core/testdata/window_push_down_suite_out.json +++ b/planner/core/testdata/window_push_down_suite_out.json @@ -10,7 +10,7 @@ { "SQL": "explain select *, row_number() over () FROM employee -- 1. empty partition", "Plan": [ - "TableReader_21 10000.00 root data:ExchangeSender_20", + "TableReader_21 10000.00 root MppVersion: 1, data:ExchangeSender_20", "└─ExchangeSender_20 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Window_19 10000.00 mpp[tiflash] row_number()->Column#6 over(rows between current row and current row)", " └─ExchangeReceiver_12 10000.00 mpp[tiflash] ", @@ -22,7 +22,7 @@ { "SQL": "explain select *, row_number() over (order by salary) FROM employee -- 1.1 empty partition with sort", "Plan": [ - "TableReader_23 10000.00 root data:ExchangeSender_22", + "TableReader_23 10000.00 root MppVersion: 1, data:ExchangeSender_22", "└─ExchangeSender_22 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Window_21 10000.00 mpp[tiflash] row_number()->Column#6 over(order by test.employee.salary rows between current row and current row)", " └─Sort_13 10000.00 mpp[tiflash] test.employee.salary", @@ -35,12 +35,12 @@ { "SQL": "explain select *, row_number() over (partition by deptid) FROM employee -- 2. column partition key", "Plan": [ - "TableReader_24 10000.00 root data:ExchangeSender_23", + "TableReader_24 10000.00 root MppVersion: 1, data:ExchangeSender_23", "└─ExchangeSender_23 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Window_22 10000.00 mpp[tiflash] row_number()->Column#6 over(partition by test.employee.deptid rows between current row and current row), stream_count: 8", " └─Sort_13 10000.00 mpp[tiflash] test.employee.deptid, stream_count: 8", " └─ExchangeReceiver_12 10000.00 mpp[tiflash] stream_count: 8", - " └─ExchangeSender_11 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary], stream_count: 8", + " └─ExchangeSender_11 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary], stream_count: 8", " └─TableFullScan_10 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ], "Warn": null @@ -48,13 +48,13 @@ { "SQL": "explain select *, row_number() over (partition by deptid+1) FROM employee -- 3. expression partition key", "Plan": [ - "TableReader_30 10000.00 root data:ExchangeSender_29", + "TableReader_30 10000.00 root MppVersion: 1, data:ExchangeSender_29", "└─ExchangeSender_29 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_7 10000.00 mpp[tiflash] test.employee.empid, test.employee.deptid, test.employee.salary, Column#7, stream_count: 8", " └─Window_28 10000.00 mpp[tiflash] row_number()->Column#7 over(partition by Column#6 rows between current row and current row), stream_count: 8", " └─Sort_14 10000.00 mpp[tiflash] Column#6, stream_count: 8", " └─ExchangeReceiver_13 10000.00 mpp[tiflash] stream_count: 8", - " └─ExchangeSender_12 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#6, collate: binary], stream_count: 8", + " └─ExchangeSender_12 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#6, collate: binary], stream_count: 8", " └─Projection_10 10000.00 mpp[tiflash] test.employee.empid, test.employee.deptid, test.employee.salary, plus(test.employee.deptid, 1)->Column#6", " └─TableFullScan_11 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ], @@ -63,12 +63,12 @@ { "SQL": "explain select *, row_number() over (partition by deptid ORDER BY salary desc) FROM employee -- 3.1 with sort key", "Plan": [ - "TableReader_24 10000.00 root data:ExchangeSender_23", + "TableReader_24 10000.00 root MppVersion: 1, data:ExchangeSender_23", "└─ExchangeSender_23 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Window_22 10000.00 mpp[tiflash] row_number()->Column#6 over(partition by test.employee.deptid order by test.employee.salary desc rows between current row and current row), stream_count: 8", " └─Sort_13 10000.00 mpp[tiflash] test.employee.deptid, test.employee.salary:desc, stream_count: 8", " └─ExchangeReceiver_12 10000.00 mpp[tiflash] stream_count: 8", - " └─ExchangeSender_11 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary], stream_count: 8", + " └─ExchangeSender_11 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary], stream_count: 8", " └─TableFullScan_10 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ], "Warn": null @@ -76,12 +76,12 @@ { "SQL": "explain select *, rank() over w, dense_rank() over w from employee window w as (partition by deptid) -- 4. same kinds, multi function, same window", "Plan": [ - "TableReader_24 10000.00 root data:ExchangeSender_23", + "TableReader_24 10000.00 root MppVersion: 1, data:ExchangeSender_23", "└─ExchangeSender_23 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Window_22 10000.00 mpp[tiflash] rank()->Column#7, dense_rank()->Column#8 over(partition by test.employee.deptid), stream_count: 8", " └─Sort_13 10000.00 mpp[tiflash] test.employee.deptid, stream_count: 8", " └─ExchangeReceiver_12 10000.00 mpp[tiflash] stream_count: 8", - " └─ExchangeSender_11 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary], stream_count: 8", + " └─ExchangeSender_11 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary], stream_count: 8", " └─TableFullScan_10 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ], "Warn": null @@ -89,14 +89,14 @@ { "SQL": "explain select *, row_number() over w, rank() over w from employee window w as (partition by deptid) -- 5. different kinds, multi functions, same window", "Plan": [ - "TableReader_36 10000.00 root data:ExchangeSender_35", + "TableReader_36 10000.00 root MppVersion: 1, data:ExchangeSender_35", "└─ExchangeSender_35 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_9 10000.00 mpp[tiflash] test.employee.empid, test.employee.deptid, test.employee.salary, Column#8, Column#7, stream_count: 8", " └─Window_34 10000.00 mpp[tiflash] row_number()->Column#8 over(partition by test.employee.deptid rows between current row and current row), stream_count: 8", " └─Window_12 10000.00 mpp[tiflash] rank()->Column#7 over(partition by test.employee.deptid), stream_count: 8", " └─Sort_17 10000.00 mpp[tiflash] test.employee.deptid, stream_count: 8", " └─ExchangeReceiver_16 10000.00 mpp[tiflash] stream_count: 8", - " └─ExchangeSender_15 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary], stream_count: 8", + " └─ExchangeSender_15 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary], stream_count: 8", " └─TableFullScan_14 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ], "Warn": null @@ -104,7 +104,7 @@ { "SQL": "explain select *, rank() over () FROM (select *, row_number() over () a from employee) tmp -- 6. multi window from sub query", "Plan": [ - "TableReader_35 10000.00 root data:ExchangeSender_34", + "TableReader_35 10000.00 root MppVersion: 1, data:ExchangeSender_34", "└─ExchangeSender_34 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Window_33 10000.00 mpp[tiflash] rank()->Column#8 over()", " └─Window_14 10000.00 mpp[tiflash] row_number()->Column#6 over(rows between current row and current row)", @@ -117,12 +117,12 @@ { "SQL": "explain select *, rank() over (partition by deptid) FROM (select *, row_number() over () a from employee) tmp -- 6.1 multi window from sub query", "Plan": [ - "TableReader_36 10000.00 root data:ExchangeSender_35", + "TableReader_36 10000.00 root MppVersion: 1, data:ExchangeSender_35", "└─ExchangeSender_35 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Window_34 10000.00 mpp[tiflash] rank()->Column#8 over(partition by test.employee.deptid), stream_count: 8", " └─Sort_20 10000.00 mpp[tiflash] test.employee.deptid, stream_count: 8", " └─ExchangeReceiver_19 10000.00 mpp[tiflash] stream_count: 8", - " └─ExchangeSender_18 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary], stream_count: 8", + " └─ExchangeSender_18 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary], stream_count: 8", " └─Window_14 10000.00 mpp[tiflash] row_number()->Column#6 over(rows between current row and current row)", " └─ExchangeReceiver_17 10000.00 mpp[tiflash] ", " └─ExchangeSender_16 10000.00 mpp[tiflash] ExchangeType: PassThrough", @@ -163,7 +163,7 @@ { "SQL": "explain select *, row_number() over () FROM employee -- 1. pure window functions", "Plan": [ - "TableReader_21 10000.00 root data:ExchangeSender_20", + "TableReader_21 10000.00 root MppVersion: 1, data:ExchangeSender_20", "└─ExchangeSender_20 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Window_19 10000.00 mpp[tiflash] row_number()->Column#6 over(rows between current row and current row)", " └─ExchangeReceiver_12 10000.00 mpp[tiflash] ", @@ -175,7 +175,7 @@ { "SQL": "explain select *, rank() over () FROM employee", "Plan": [ - "TableReader_21 10000.00 root data:ExchangeSender_20", + "TableReader_21 10000.00 root MppVersion: 1, data:ExchangeSender_20", "└─ExchangeSender_20 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Window_19 10000.00 mpp[tiflash] rank()->Column#6 over()", " └─ExchangeReceiver_12 10000.00 mpp[tiflash] ", @@ -187,7 +187,7 @@ { "SQL": "explain select *, dense_rank() over () FROM employee", "Plan": [ - "TableReader_21 10000.00 root data:ExchangeSender_20", + "TableReader_21 10000.00 root MppVersion: 1, data:ExchangeSender_20", "└─ExchangeSender_20 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Window_19 10000.00 mpp[tiflash] dense_rank()->Column#6 over()", " └─ExchangeReceiver_12 10000.00 mpp[tiflash] ", @@ -199,7 +199,7 @@ { "SQL": "explain select *, lead(empid) over () FROM employee", "Plan": [ - "TableReader_21 10000.00 root data:ExchangeSender_20", + "TableReader_21 10000.00 root MppVersion: 1, data:ExchangeSender_20", "└─ExchangeSender_20 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Window_19 10000.00 mpp[tiflash] lead(test.employee.empid)->Column#6 over()", " └─ExchangeReceiver_12 10000.00 mpp[tiflash] ", @@ -211,7 +211,7 @@ { "SQL": "explain select *, lag(empid) over () FROM employee", "Plan": [ - "TableReader_21 10000.00 root data:ExchangeSender_20", + "TableReader_21 10000.00 root MppVersion: 1, data:ExchangeSender_20", "└─ExchangeSender_20 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Window_19 10000.00 mpp[tiflash] lag(test.employee.empid)->Column#6 over()", " └─ExchangeReceiver_12 10000.00 mpp[tiflash] ", @@ -283,12 +283,12 @@ { "SQL": "explain select *, row_number() over (partition by empid order by salary RANGE between 1 preceding and 1 following) FROM employee -- 3. range frame", "Plan": [ - "TableReader_24 10000.00 root data:ExchangeSender_23", + "TableReader_24 10000.00 root MppVersion: 1, data:ExchangeSender_23", "└─ExchangeSender_23 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Window_22 10000.00 mpp[tiflash] row_number()->Column#6 over(partition by test.employee.empid order by test.employee.salary rows between current row and current row), stream_count: 8", " └─Sort_13 10000.00 mpp[tiflash] test.employee.empid, test.employee.salary, stream_count: 8", " └─ExchangeReceiver_12 10000.00 mpp[tiflash] stream_count: 8", - " └─ExchangeSender_11 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.empid, collate: binary], stream_count: 8", + " └─ExchangeSender_11 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.empid, collate: binary], stream_count: 8", " └─TableFullScan_10 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ], "Warn": [ @@ -322,7 +322,7 @@ { "SQL": "explain select *, row_number() over () from (select count(distinct empid) from employee) t", "Plan": [ - "TableReader_61 1.00 root data:ExchangeSender_60", + "TableReader_61 1.00 root MppVersion: 1, data:ExchangeSender_60", "└─ExchangeSender_60 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Window_59 1.00 mpp[tiflash] row_number()->Column#7 over(rows between current row and current row)", " └─Projection_15 1.00 mpp[tiflash] Column#5", @@ -331,7 +331,7 @@ " └─ExchangeSender_19 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg_16 1.00 mpp[tiflash] funcs:count(distinct test.employee.empid)->Column#8", " └─ExchangeReceiver_18 1.00 mpp[tiflash] ", - " └─ExchangeSender_17 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.empid, collate: binary]", + " └─ExchangeSender_17 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.empid, collate: binary]", " └─HashAgg_12 1.00 mpp[tiflash] group by:test.employee.empid, ", " └─TableFullScan_14 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ], @@ -340,13 +340,13 @@ { "SQL": "explain select *, row_number() over () from (select count(empid) from employee group by deptid) t", "Plan": [ - "TableReader_84 8000.00 root data:ExchangeSender_83", + "TableReader_84 8000.00 root MppVersion: 1, data:ExchangeSender_83", "└─ExchangeSender_83 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Window_82 8000.00 mpp[tiflash] row_number()->Column#7 over(rows between current row and current row)", " └─Projection_21 8000.00 mpp[tiflash] Column#5", " └─HashAgg_22 8000.00 mpp[tiflash] group by:test.employee.deptid, funcs:sum(Column#8)->Column#5", " └─ExchangeReceiver_24 8000.00 mpp[tiflash] ", - " └─ExchangeSender_23 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary]", + " └─ExchangeSender_23 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary]", " └─HashAgg_13 8000.00 mpp[tiflash] group by:test.employee.deptid, funcs:count(test.employee.empid)->Column#8", " └─TableFullScan_20 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ], @@ -355,19 +355,19 @@ { "SQL": "explain select *, row_number() over (partition by a) from (select count(distinct empid) a from employee) t", "Plan": [ - "TableReader_49 1.00 root data:ExchangeSender_48", + "TableReader_49 1.00 root MppVersion: 1, data:ExchangeSender_48", "└─ExchangeSender_48 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Window_47 1.00 mpp[tiflash] row_number()->Column#7 over(partition by Column#5 rows between current row and current row), stream_count: 8", " └─Sort_22 1.00 mpp[tiflash] Column#5, stream_count: 8", " └─ExchangeReceiver_21 1.00 mpp[tiflash] stream_count: 8", - " └─ExchangeSender_20 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#5, collate: binary], stream_count: 8", + " └─ExchangeSender_20 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#5, collate: binary], stream_count: 8", " └─Projection_14 1.00 mpp[tiflash] Column#5", " └─HashAgg_15 1.00 mpp[tiflash] funcs:sum(Column#8)->Column#5", " └─ExchangeReceiver_19 1.00 mpp[tiflash] ", " └─ExchangeSender_18 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg_15 1.00 mpp[tiflash] funcs:count(distinct test.employee.empid)->Column#8", " └─ExchangeReceiver_17 1.00 mpp[tiflash] ", - " └─ExchangeSender_16 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.empid, collate: binary]", + " └─ExchangeSender_16 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.empid, collate: binary]", " └─HashAgg_12 1.00 mpp[tiflash] group by:test.employee.empid, ", " └─TableFullScan_13 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ], @@ -376,14 +376,14 @@ { "SQL": "explain select *, row_number() over (partition by deptid) from (select count(empid), deptid from employee group by deptid) t", "Plan": [ - "TableReader_61 8000.00 root data:ExchangeSender_60", + "TableReader_61 8000.00 root MppVersion: 1, data:ExchangeSender_60", "└─ExchangeSender_60 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Window_59 8000.00 mpp[tiflash] row_number()->Column#7 over(partition by test.employee.deptid rows between current row and current row)", " └─Sort_24 8000.00 mpp[tiflash] test.employee.deptid", " └─Projection_20 8000.00 mpp[tiflash] Column#5, test.employee.deptid", " └─HashAgg_21 8000.00 mpp[tiflash] group by:test.employee.deptid, funcs:sum(Column#8)->Column#5, funcs:firstrow(test.employee.deptid)->test.employee.deptid", " └─ExchangeReceiver_23 8000.00 mpp[tiflash] ", - " └─ExchangeSender_22 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary]", + " └─ExchangeSender_22 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary]", " └─HashAgg_13 8000.00 mpp[tiflash] group by:test.employee.deptid, funcs:count(test.employee.empid)->Column#8", " └─TableFullScan_19 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ], @@ -392,7 +392,7 @@ { "SQL": "explain select count(distinct empid) from (select *, row_number() over () from employee) t", "Plan": [ - "TableReader_35 1.00 root data:ExchangeSender_34", + "TableReader_35 1.00 root MppVersion: 1, data:ExchangeSender_34", "└─ExchangeSender_34 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_33 1.00 mpp[tiflash] Column#7", " └─HashAgg_32 1.00 mpp[tiflash] funcs:count(distinct test.employee.empid)->Column#7", @@ -406,7 +406,7 @@ { "SQL": "explain select count(distinct empid) from (select *, row_number() over (partition by deptid) from employee) t", "Plan": [ - "TableReader_49 1.00 root data:ExchangeSender_48", + "TableReader_49 1.00 root MppVersion: 1, data:ExchangeSender_48", "└─ExchangeSender_48 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_42 1.00 mpp[tiflash] Column#7", " └─HashAgg_43 1.00 mpp[tiflash] funcs:sum(Column#9)->Column#7", @@ -414,12 +414,12 @@ " └─ExchangeSender_46 1.00 mpp[tiflash] ExchangeType: PassThrough", " └─HashAgg_43 1.00 mpp[tiflash] funcs:count(distinct test.employee.empid)->Column#9", " └─ExchangeReceiver_45 1.00 mpp[tiflash] ", - " └─ExchangeSender_44 1.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.empid, collate: binary]", - " └─HashAgg_41 1.00 mpp[tiflash] group by:test.employee.empid, ", + " └─ExchangeSender_44 1.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.empid, collate: binary]", + " └─HashAgg_41 1.00 mpp[tiflash] group by:test.employee.empid, , stream_count: 8", " └─Window_27 10000.00 mpp[tiflash] row_number()->Column#6 over(partition by test.employee.deptid rows between current row and current row), stream_count: 8", " └─Sort_18 10000.00 mpp[tiflash] test.employee.deptid, stream_count: 8", " └─ExchangeReceiver_17 10000.00 mpp[tiflash] stream_count: 8", - " └─ExchangeSender_16 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary], stream_count: 8", + " └─ExchangeSender_16 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary], stream_count: 8", " └─TableFullScan_15 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ], "Warn": null @@ -427,7 +427,7 @@ { "SQL": "explain select count(empid) from (select *, row_number() over () a from employee) t group by a", "Plan": [ - "TableReader_52 10000.00 root data:ExchangeSender_51", + "TableReader_52 10000.00 root MppVersion: 1, data:ExchangeSender_51", "└─ExchangeSender_51 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_46 10000.00 mpp[tiflash] Column#7", " └─HashAgg_44 10000.00 mpp[tiflash] group by:Column#6, funcs:count(test.employee.empid)->Column#7", @@ -441,17 +441,17 @@ { "SQL": "explain select count(empid) from (select *, row_number() over (partition by deptid) a from employee) t group by a", "Plan": [ - "TableReader_54 10000.00 root data:ExchangeSender_53", + "TableReader_54 10000.00 root MppVersion: 1, data:ExchangeSender_53", "└─ExchangeSender_53 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_49 10000.00 mpp[tiflash] Column#7", " └─HashAgg_50 10000.00 mpp[tiflash] group by:Column#6, funcs:sum(Column#10)->Column#7", " └─ExchangeReceiver_52 10000.00 mpp[tiflash] ", - " └─ExchangeSender_51 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#6, collate: binary]", - " └─HashAgg_47 10000.00 mpp[tiflash] group by:Column#6, funcs:count(test.employee.empid)->Column#10", + " └─ExchangeSender_51 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#6, collate: binary]", + " └─HashAgg_47 10000.00 mpp[tiflash] group by:Column#6, funcs:count(test.employee.empid)->Column#10, stream_count: 8", " └─Window_36 10000.00 mpp[tiflash] row_number()->Column#6 over(partition by test.employee.deptid rows between current row and current row), stream_count: 8", " └─Sort_21 10000.00 mpp[tiflash] test.employee.deptid, stream_count: 8", " └─ExchangeReceiver_20 10000.00 mpp[tiflash] stream_count: 8", - " └─ExchangeSender_19 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary], stream_count: 8", + " └─ExchangeSender_19 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary], stream_count: 8", " └─TableFullScan_18 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ], "Warn": null @@ -459,7 +459,7 @@ { "SQL": "explain select row_number() over w2, row_number() over w1 from employee window w2 as (order by deptid), w1 as (partition by deptid);", "Plan": [ - "TableReader_37 10000.00 root data:ExchangeSender_36", + "TableReader_37 10000.00 root MppVersion: 1, data:ExchangeSender_36", "└─ExchangeSender_36 10000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_10 10000.00 mpp[tiflash] Column#8, Column#7", " └─Window_35 10000.00 mpp[tiflash] row_number()->Column#8 over(order by test.employee.deptid rows between current row and current row)", @@ -469,7 +469,7 @@ " └─Window_13 10000.00 mpp[tiflash] row_number()->Column#7 over(partition by test.employee.deptid rows between current row and current row), stream_count: 8", " └─Sort_17 10000.00 mpp[tiflash] test.employee.deptid, stream_count: 8", " └─ExchangeReceiver_16 10000.00 mpp[tiflash] stream_count: 8", - " └─ExchangeSender_15 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary], stream_count: 8", + " └─ExchangeSender_15 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary], stream_count: 8", " └─TableFullScan_14 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ], "Warn": null diff --git a/planner/core/util.go b/planner/core/util.go index 14b7df23710d6..5dc8d93d92efe 100644 --- a/planner/core/util.go +++ b/planner/core/util.go @@ -23,7 +23,6 @@ import ( "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/ranger" "github.com/pingcap/tidb/util/set" "github.com/pingcap/tidb/util/size" "golang.org/x/exp/slices" @@ -396,38 +395,6 @@ func tableHasDirtyContent(ctx sessionctx.Context, tableInfo *model.TableInfo) bo return false } -func cloneExprs(exprs []expression.Expression) []expression.Expression { - cloned := make([]expression.Expression, 0, len(exprs)) - for _, e := range exprs { - cloned = append(cloned, e.Clone()) - } - return cloned -} - -func cloneCols(cols []*expression.Column) []*expression.Column { - cloned := make([]*expression.Column, 0, len(cols)) - for _, c := range cols { - cloned = append(cloned, c.Clone().(*expression.Column)) - } - return cloned -} - -func cloneColInfos(cols []*model.ColumnInfo) []*model.ColumnInfo { - cloned := make([]*model.ColumnInfo, 0, len(cols)) - for _, c := range cols { - cloned = append(cloned, c.Clone()) - } - return cloned -} - -func cloneRanges(ranges []*ranger.Range) []*ranger.Range { - cloned := make([]*ranger.Range, 0, len(ranges)) - for _, r := range ranges { - cloned = append(cloned, r.Clone()) - } - return cloned -} - func clonePhysicalPlan(plans []PhysicalPlan) ([]PhysicalPlan, error) { cloned := make([]PhysicalPlan, 0, len(plans)) for _, p := range plans { diff --git a/planner/funcdep/fd_graph.go b/planner/funcdep/fd_graph.go index 2d6bfb540dc06..14eef66e47b22 100644 --- a/planner/funcdep/fd_graph.go +++ b/planner/funcdep/fd_graph.go @@ -912,10 +912,7 @@ func (s *FDSet) AddFrom(fds *FDSet) { s.AddLaxFunctionalDependency(fd.from, fd.to) } } - for i := range fds.ncEdges { - fd := fds.ncEdges[i] - s.ncEdges = append(s.ncEdges, fd) - } + s.ncEdges = append(s.ncEdges, fds.ncEdges...) s.NotNullCols.UnionWith(fds.NotNullCols) if s.HashCodeToUniqueID == nil { s.HashCodeToUniqueID = fds.HashCodeToUniqueID diff --git a/planner/optimize.go b/planner/optimize.go index 747dd5541596a..1ccd1c52f307b 100644 --- a/planner/optimize.go +++ b/planner/optimize.go @@ -73,23 +73,30 @@ func matchSQLBinding(sctx sessionctx.Context, stmtNode ast.StmtNode) (bindRecord return bindRecord, scope, true } -// getPlanFromGeneralPlanCache tries to get an available cached plan from the General Plan Cache for this stmt. -func getPlanFromGeneralPlanCache(ctx context.Context, sctx sessionctx.Context, stmt ast.StmtNode, is infoschema.InfoSchema) (core.Plan, types.NameSlice, bool, error) { +// getPlanFromNonPreparedPlanCache tries to get an available cached plan from the NonPrepared Plan Cache for this stmt. +func getPlanFromNonPreparedPlanCache(ctx context.Context, sctx sessionctx.Context, stmt ast.StmtNode, is infoschema.InfoSchema) (p core.Plan, ns types.NameSlice, ok bool, err error) { if sctx.GetSessionVars().StmtCtx.InPreparedPlanBuilding || // already in cached plan rebuilding phase - !core.GeneralPlanCacheableWithCtx(sctx, stmt, is) { + !core.NonPreparedPlanCacheableWithCtx(sctx, stmt, is) { return nil, nil, false, nil } - paramSQL, params, err := core.ParameterizeAST(sctx, stmt) + paramSQL, params, err := core.ParameterizeAST(ctx, sctx, stmt) if err != nil { return nil, nil, false, err } - val := sctx.GetSessionVars().GetGeneralPlanCacheStmt(paramSQL) + defer func() { + if err != nil { + // keep the stmt unchanged if err so that it can fallback to the normal optimization path. + // TODO: add metrics + err = core.RestoreASTWithParams(ctx, sctx, stmt, params) + } + }() + val := sctx.GetSessionVars().GetNonPreparedPlanCacheStmt(paramSQL) if val == nil { - cachedStmt, _, _, err := core.GeneratePlanCacheStmtWithAST(ctx, sctx, stmt) + cachedStmt, _, _, err := core.GeneratePlanCacheStmtWithAST(ctx, sctx, paramSQL, stmt) if err != nil { return nil, nil, false, err } - sctx.GetSessionVars().AddGeneralPlanCacheStmt(paramSQL, cachedStmt) + sctx.GetSessionVars().AddNonPreparedPlanCacheStmt(paramSQL, cachedStmt) val = cachedStmt } cachedStmt := val.(*core.PlanCacheStmt) @@ -176,11 +183,11 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in node = stmtNode } - // try to get Plan from the General Plan Cache - if sctx.GetSessionVars().EnableGeneralPlanCache && + // try to get Plan from the NonPrepared Plan Cache + if sctx.GetSessionVars().EnableNonPreparedPlanCache && isStmtNode && !useBinding { // TODO: support binding - cachedPlan, names, ok, err := getPlanFromGeneralPlanCache(ctx, sctx, stmtNode, is) + cachedPlan, names, ok, err := getPlanFromNonPreparedPlanCache(ctx, sctx, stmtNode, is) if err != nil { return nil, nil, err } @@ -208,6 +215,13 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in hint.BindHint(stmtNode, binding.Hint) curStmtHints, _, curWarns := handleStmtHints(binding.Hint.GetFirstTableHints()) sessVars.StmtCtx.StmtHints = curStmtHints + // update session var by hint /set_var/ + for name, val := range sessVars.StmtCtx.StmtHints.SetVars { + err := sessVars.SetStmtVar(name, val) + if err != nil { + sessVars.StmtCtx.AppendWarning(err) + } + } plan, curNames, cost, err := optimize(ctx, sctx, node, is) if err != nil { binding.Status = bindinfo.Invalid @@ -234,6 +248,11 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in sessVars.FoundInBinding = true if sessVars.StmtCtx.InVerboseExplain { sessVars.StmtCtx.AppendNote(errors.Errorf("Using the bindSQL: %v", chosenBinding.BindSQL)) + } else { + sessVars.StmtCtx.AppendExtraNote(errors.Errorf("Using the bindSQL: %v", chosenBinding.BindSQL)) + } + if len(tableHints) > 0 { + sessVars.StmtCtx.AppendWarning(errors.Errorf("The system ignores the hints in the current query and uses the hints specified in the bindSQL: %v", chosenBinding.BindSQL)) } } // Restore the hint to avoid changing the stmt node. @@ -289,6 +308,25 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in return bestPlan, names, nil } +// OptimizeForForeignKeyCascade does optimization and creates a Plan for foreign key cascade. +// The node must be prepared first. +// Compare to Optimize, OptimizeForForeignKeyCascade only build plan by StmtNode, +// doesn't consider plan cache and plan binding, also doesn't do privilege check. +func OptimizeForForeignKeyCascade(ctx context.Context, sctx sessionctx.Context, node ast.StmtNode, is infoschema.InfoSchema) (core.Plan, error) { + builder := planBuilderPool.Get().(*core.PlanBuilder) + defer planBuilderPool.Put(builder.ResetForReuse()) + hintProcessor := &hint.BlockHintProcessor{Ctx: sctx} + builder.Init(sctx, is, hintProcessor) + p, err := builder.Build(ctx, node) + if err != nil { + return nil, err + } + if err := core.CheckTableLock(sctx, is, builder.GetVisitInfo()); err != nil { + return nil, err + } + return p, nil +} + func allowInReadOnlyMode(sctx sessionctx.Context, node ast.Node) (bool, error) { pm := privilege.GetPrivilegeManager(sctx) if pm == nil { @@ -356,6 +394,7 @@ func optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in // build logical plan hintProcessor := &hint.BlockHintProcessor{Ctx: sctx} node.Accept(hintProcessor) + defer hintProcessor.HandleUnusedViewHints() builder := planBuilderPool.Get().(*core.PlanBuilder) defer planBuilderPool.Put(builder.ResetForReuse()) builder.Init(sctx, is, hintProcessor) @@ -416,7 +455,7 @@ func OptimizeExecStmt(ctx context.Context, sctx sessionctx.Context, if !ok { return nil, nil, errors.Errorf("invalid result plan type, should be Execute") } - plan, names, err := core.GetPlanFromSessionPlanCache(ctx, sctx, execAst.FromGeneralStmt, is, exec.PrepStmt, exec.Params) + plan, names, err := core.GetPlanFromSessionPlanCache(ctx, sctx, false, is, exec.PrepStmt, exec.Params) if err != nil { return nil, nil, err } @@ -547,12 +586,14 @@ func handleEvolveTasks(ctx context.Context, sctx sessionctx.Context, br *bindinf return } charset, collation := sctx.GetSessionVars().GetCharsetInfo() + _, sqlDigestWithDB := parser.NormalizeDigest(utilparser.RestoreWithDefaultDB(stmtNode, br.Db, br.OriginalSQL)) binding := bindinfo.Binding{ BindSQL: bindSQL, Status: bindinfo.PendingVerify, Charset: charset, Collation: collation, Source: bindinfo.Evolve, + SQLDigest: sqlDigestWithDB.String(), } globalHandle := domain.GetDomain(sctx).BindHandle() globalHandle.AddEvolvePlanTask(br.OriginalSQL, br.Db, binding) diff --git a/planner/util/BUILD.bazel b/planner/util/BUILD.bazel index aae63a58c8fcb..50f4512126508 100644 --- a/planner/util/BUILD.bazel +++ b/planner/util/BUILD.bazel @@ -4,6 +4,7 @@ go_library( name = "util", srcs = [ "byitem.go", + "misc.go", "path.go", ], importpath = "github.com/pingcap/tidb/planner/util", @@ -18,6 +19,7 @@ go_library( "//util/collate", "//util/ranger", "//util/size", + "@org_golang_x_exp//slices", ], ) diff --git a/planner/util/misc.go b/planner/util/misc.go new file mode 100644 index 0000000000000..bd67cbbe17b5c --- /dev/null +++ b/planner/util/misc.go @@ -0,0 +1,61 @@ +// 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, +// 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 util + +import ( + "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/util/ranger" +) + +// CloneExprs uses Expression.Clone to clone a slice of Expression. +func CloneExprs(exprs []expression.Expression) []expression.Expression { + cloned := make([]expression.Expression, 0, len(exprs)) + for _, e := range exprs { + cloned = append(cloned, e.Clone()) + } + return cloned +} + +// CloneCols uses (*Column).Clone to clone a slice of *Column. +func CloneCols(cols []*expression.Column) []*expression.Column { + cloned := make([]*expression.Column, 0, len(cols)) + for _, c := range cols { + if c == nil { + cloned = append(cloned, nil) + continue + } + cloned = append(cloned, c.Clone().(*expression.Column)) + } + return cloned +} + +// CloneColInfos uses (*ColumnInfo).Clone to clone a slice of *ColumnInfo. +func CloneColInfos(cols []*model.ColumnInfo) []*model.ColumnInfo { + cloned := make([]*model.ColumnInfo, 0, len(cols)) + for _, c := range cols { + cloned = append(cloned, c.Clone()) + } + return cloned +} + +// CloneRanges uses (*Range).Clone to clone a slice of *Range. +func CloneRanges(ranges []*ranger.Range) []*ranger.Range { + cloned := make([]*ranger.Range, 0, len(ranges)) + for _, r := range ranges { + cloned = append(cloned, r.Clone()) + } + return cloned +} diff --git a/planner/util/path.go b/planner/util/path.go index c283c6ffb3278..68b11bbf5751f 100644 --- a/planner/util/path.go +++ b/planner/util/path.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/ranger" + "golang.org/x/exp/slices" ) // AccessPath indicates the way we access a table: by using single index, or by using multiple indexes, @@ -49,6 +50,12 @@ type AccessPath struct { // PartialIndexPaths store all index access paths. // If there are extra filters, store them in TableFilters. PartialIndexPaths []*AccessPath + // IndexMergeIsIntersection means whether it's intersection type or union type IndexMerge path. + // It's only valid for a IndexMerge path. + // Intersection type is for expressions connected by `AND` and union type is for `OR`. + IndexMergeIsIntersection bool + // IndexMergeAccessMVIndex indicates whether this IndexMerge path accesses a MVIndex. + IndexMergeAccessMVIndex bool StoreType kv.StoreType @@ -58,7 +65,9 @@ type AccessPath struct { IsIntHandlePath bool IsCommonHandlePath bool // Forced means this path is generated by `use/force index()`. - Forced bool + Forced bool + ForceKeepOrder bool + ForceNoKeepOrder bool // IsSingleScan indicates whether the path is a single index/table scan or table access after index scan. IsSingleScan bool @@ -66,6 +75,43 @@ type AccessPath struct { IsUkShardIndexPath bool } +// Clone returns a deep copy of the original AccessPath. +// Note that we rely on the Expression.Clone(), (*IndexInfo).Clone() and (*Range).Clone() in this method, so there are +// some fields like FieldType are not deep-copied. +func (path *AccessPath) Clone() *AccessPath { + ret := &AccessPath{ + Index: path.Index.Clone(), + FullIdxCols: CloneCols(path.FullIdxCols), + FullIdxColLens: slices.Clone(path.FullIdxColLens), + IdxCols: CloneCols(path.IdxCols), + IdxColLens: slices.Clone(path.IdxColLens), + ConstCols: slices.Clone(path.ConstCols), + Ranges: CloneRanges(path.Ranges), + CountAfterAccess: path.CountAfterAccess, + CountAfterIndex: path.CountAfterIndex, + AccessConds: CloneExprs(path.AccessConds), + EqCondCount: path.EqCondCount, + EqOrInCondCount: path.EqOrInCondCount, + IndexFilters: CloneExprs(path.IndexFilters), + TableFilters: CloneExprs(path.TableFilters), + IndexMergeIsIntersection: path.IndexMergeIsIntersection, + PartialIndexPaths: nil, + StoreType: path.StoreType, + IsDNFCond: path.IsDNFCond, + IsIntHandlePath: path.IsIntHandlePath, + IsCommonHandlePath: path.IsCommonHandlePath, + Forced: path.Forced, + ForceKeepOrder: path.ForceKeepOrder, + ForceNoKeepOrder: path.ForceNoKeepOrder, + IsSingleScan: path.IsSingleScan, + IsUkShardIndexPath: path.IsUkShardIndexPath, + } + for _, partialPath := range path.PartialIndexPaths { + ret.PartialIndexPaths = append(ret.PartialIndexPaths, partialPath.Clone()) + } + return ret +} + // IsTablePath returns true if it's IntHandlePath or CommonHandlePath. func (path *AccessPath) IsTablePath() bool { return path.IsIntHandlePath || path.IsCommonHandlePath diff --git a/privilege/BUILD.bazel b/privilege/BUILD.bazel index ec4d5d50cbe89..d85b91614612e 100644 --- a/privilege/BUILD.bazel +++ b/privilege/BUILD.bazel @@ -9,6 +9,7 @@ go_library( "//parser/auth", "//parser/mysql", "//sessionctx", + "//sessionctx/variable", "//types", ], ) diff --git a/privilege/privilege.go b/privilege/privilege.go index b557ce2f1ca8b..3229c1e3bb26f 100644 --- a/privilege/privilege.go +++ b/privilege/privilege.go @@ -15,11 +15,10 @@ package privilege import ( - "crypto/tls" - "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" ) @@ -29,6 +28,16 @@ func (k keyType) String() string { return "privilege-key" } +// VerificationInfo records some information returned by Manager.ConnectionVerification +type VerificationInfo struct { + // InSandBoxMode indicates that the session will enter sandbox mode, and only execute statement for resetting password. + InSandBoxMode bool + // FailedDueToWrongPassword indicates that the verification failed due to wrong password. + FailedDueToWrongPassword bool + // ResourceGroupName records the resource group name for the user. + ResourceGroupName string +} + // Manager is the interface for providing privilege related operations. type Manager interface { // ShowGrants shows granted privileges for user. @@ -58,9 +67,18 @@ type Manager interface { // RequestDynamicVerificationWithUser verifies a DYNAMIC privilege for a specific user. RequestDynamicVerificationWithUser(privName string, grantable bool, user *auth.UserIdentity) bool + // VerifyAccountAutoLockInMemory automatically unlock when the time comes. + VerifyAccountAutoLockInMemory(user string, host string) (bool, error) + + // IsAccountAutoLockEnabled verifies whether the account has enabled Failed-Login Tracking and Temporary Account Locking. + IsAccountAutoLockEnabled(user string, host string) bool + // ConnectionVerification verifies user privilege for connection. // Requires exact match on user name and host name. - ConnectionVerification(user *auth.UserIdentity, authUser, authHost string, auth, salt []byte, tlsState *tls.ConnectionState) error + ConnectionVerification(user *auth.UserIdentity, authUser, authHost string, auth, salt []byte, sessionVars *variable.SessionVars) (VerificationInfo, error) + + // AuthSuccess records auth success state + AuthSuccess(authUser, authHost string) // GetAuthWithoutVerification uses to get auth name without verification. // Requires exact match on user name and host name. @@ -69,6 +87,9 @@ type Manager interface { // MatchIdentity matches an identity MatchIdentity(user, host string, skipNameResolve bool) (string, string, bool) + // MatchUserResourceGroupName matches a user with specified resource group name + MatchUserResourceGroupName(resourceGroupName string) (string, bool) + // DBIsVisible returns true is the database is visible to current user. DBIsVisible(activeRole []*auth.RoleIdentity, db string) bool @@ -91,7 +112,10 @@ type Manager interface { // IsDynamicPrivilege returns if a privilege is in the list of privileges. IsDynamicPrivilege(privNameInUpper string) bool - // Get the authentication plugin for a user + // GetAuthPluginForConnection gets the authentication plugin used in connection establishment. + GetAuthPluginForConnection(user, host string) (string, error) + + // GetAuthPlugin gets the authentication plugin for the account identified by the user and host GetAuthPlugin(user, host string) (string, error) } diff --git a/privilege/privileges/BUILD.bazel b/privilege/privileges/BUILD.bazel index 57ed2f9001afb..25f85025647ab 100644 --- a/privilege/privileges/BUILD.bazel +++ b/privilege/privileges/BUILD.bazel @@ -21,6 +21,7 @@ go_library( "//parser/terror", "//privilege", "//sessionctx", + "//sessionctx/sessionstates", "//sessionctx/variable", "//types", "//util", @@ -28,6 +29,7 @@ go_library( "//util/dbterror", "//util/hack", "//util/logutil", + "//util/mathutil", "//util/sem", "//util/sqlexec", "//util/stringutil", @@ -65,6 +67,7 @@ go_test( "//privilege", "//session", "//sessionctx", + "//sessionctx/sessionstates", "//sessionctx/variable", "//testkit", "//testkit/testsetup", diff --git a/privilege/privileges/cache.go b/privilege/privileges/cache.go index 086231e4773a4..9159777340b67 100644 --- a/privilege/privileges/cache.go +++ b/privilege/privileges/cache.go @@ -66,7 +66,7 @@ const ( References_priv,Alter_priv,Execute_priv,Index_priv,Create_view_priv,Show_view_priv, Create_role_priv,Drop_role_priv,Create_tmp_table_priv,Lock_tables_priv,Create_routine_priv, Alter_routine_priv,Event_priv,Shutdown_priv,Reload_priv,File_priv,Config_priv,Repl_client_priv,Repl_slave_priv, - Account_locked,Plugin,Token_issuer,User_attributes FROM mysql.user` + Account_locked,Plugin,Token_issuer,User_attributes,password_expired,password_last_changed,password_lifetime FROM mysql.user` sqlLoadGlobalGrantsTable = `SELECT HIGH_PRIORITY Host,User,Priv,With_Grant_Option FROM mysql.global_grants` ) @@ -92,16 +92,31 @@ type baseRecord struct { hostIPNet *net.IPNet } +// MetadataInfo is the User_attributes->>"$.metadata". +type MetadataInfo struct { + Email string +} + +// UserAttributesInfo is the 'User_attributes' in privilege cache. +type UserAttributesInfo struct { + MetadataInfo + PasswordLocking +} + // UserRecord is used to represent a user record in privilege cache. type UserRecord struct { baseRecord + UserAttributesInfo AuthenticationString string Privileges mysql.PrivilegeType AccountLocked bool // A role record when this field is true AuthPlugin string AuthTokenIssuer string - Email string + PasswordExpired bool + PasswordLastChanged time.Time + PasswordLifeTime int64 + ResourceGroup string } // NewUserRecord return a UserRecord, only use for unit test. @@ -656,15 +671,6 @@ func (p *MySQLPrivilege) decodeUserTableRow(row chunk.Row, fs []*ast.ResultField } else { value.AuthPlugin = mysql.AuthNativePassword } - case f.Column.GetType() == mysql.TypeEnum: - if row.GetEnum(i).String() != "Y" { - continue - } - priv, ok := mysql.Col2PrivType[f.ColumnAsName.O] - if !ok { - return errInvalidPrivilegeType.GenWithStack(f.ColumnAsName.O) - } - value.Privileges |= priv case f.ColumnAsName.L == "token_issuer": value.AuthTokenIssuer = row.GetString(i) case f.ColumnAsName.L == "user_attributes": @@ -683,6 +689,52 @@ func (p *MySQLPrivilege) decodeUserTableRow(row chunk.Row, fs []*ast.ResultField } value.Email = email } + pathExpr, err = types.ParseJSONPathExpr("$.resource_group") + if err != nil { + return err + } + if resourceGroup, found := bj.Extract([]types.JSONPathExpression{pathExpr}); found { + resourceGroup, err := resourceGroup.Unquote() + if err != nil { + return err + } + value.ResourceGroup = resourceGroup + } + passwordLocking := PasswordLocking{} + if err := passwordLocking.ParseJSON(bj); err != nil { + return err + } + value.FailedLoginAttempts = passwordLocking.FailedLoginAttempts + value.PasswordLockTimeDays = passwordLocking.PasswordLockTimeDays + value.FailedLoginCount = passwordLocking.FailedLoginCount + value.AutoLockedLastChanged = passwordLocking.AutoLockedLastChanged + value.AutoAccountLocked = passwordLocking.AutoAccountLocked + case f.ColumnAsName.L == "password_expired": + if row.GetEnum(i).String() == "Y" { + value.PasswordExpired = true + } + case f.ColumnAsName.L == "password_last_changed": + t := row.GetTime(i) + gotime, err := t.GoTime(time.Local) + if err != nil { + return err + } + value.PasswordLastChanged = gotime + case f.ColumnAsName.L == "password_lifetime": + if row.IsNull(i) { + value.PasswordLifeTime = -1 + continue + } + value.PasswordLifeTime = row.GetInt64(i) + case f.Column.GetType() == mysql.TypeEnum: + if row.GetEnum(i).String() != "Y" { + continue + } + priv, ok := mysql.Col2PrivType[f.ColumnAsName.O] + if !ok { + return errInvalidPrivilegeType.GenWithStack(f.ColumnAsName.O) + } + value.Privileges |= priv default: value.assignUserOrHost(row, i, f) } @@ -962,6 +1014,17 @@ func (p *MySQLPrivilege) matchIdentity(user, host string, skipNameResolve bool) return nil } +// matchResoureGroup finds an identity to match resource group. +func (p *MySQLPrivilege) matchResoureGroup(resourceGroupName string) *UserRecord { + for i := 0; i < len(p.User); i++ { + record := &p.User[i] + if record.ResourceGroup == resourceGroupName { + return record + } + } + return nil +} + // connectionVerification verifies the username + hostname according to exact // match from the mysql.user privilege table. call matchIdentity() first if you // do not have an exact match yet. diff --git a/privilege/privileges/cache_test.go b/privilege/privileges/cache_test.go index c611c80d99b16..0feefaafa6bff 100644 --- a/privilege/privileges/cache_test.go +++ b/privilege/privileges/cache_test.go @@ -17,6 +17,7 @@ package privileges_test import ( "fmt" "testing" + "time" "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/mysql" @@ -43,6 +44,8 @@ func TestLoadUserTable(t *testing.T) { tk.MustExec(`INSERT INTO mysql.user (Host, User, authentication_string, Update_priv, Show_db_priv, References_priv) VALUES ("%", "root11", "", "Y", "Y", "Y")`) tk.MustExec(`INSERT INTO mysql.user (Host, User, authentication_string, Create_user_priv, Index_priv, Execute_priv, Create_view_priv, Show_view_priv, Show_db_priv, Super_priv, Trigger_priv) VALUES ("%", "root111", "", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y")`) tk.MustExec(`INSERT INTO mysql.user (Host, User, user_attributes, token_issuer) VALUES ("%", "root1111", "{\"metadata\": {\"email\": \"user@pingcap.com\"}}", "")`) + tk.MustExec(`INSERT INTO mysql.user (Host, User, password_expired, password_last_changed, password_lifetime) VALUES ("%", "root2", "Y", "2022-10-10 12:00:00", 3)`) + tk.MustExec(`INSERT INTO mysql.user (Host, User, password_expired, password_last_changed) VALUES ("%", "root3", "N", "2022-10-10 12:00:00")`) p = privileges.MySQLPrivilege{} require.NoError(t, p.LoadUserTable(tk.Session())) @@ -56,6 +59,12 @@ func TestLoadUserTable(t *testing.T) { require.Equal(t, mysql.CreateUserPriv|mysql.IndexPriv|mysql.ExecutePriv|mysql.CreateViewPriv|mysql.ShowViewPriv|mysql.ShowDBPriv|mysql.SuperPriv|mysql.TriggerPriv, user[3].Privileges) require.Equal(t, "user@pingcap.com", user[4].Email) require.Equal(t, "", user[4].AuthTokenIssuer) + require.Equal(t, true, user[5].PasswordExpired) + require.Equal(t, time.Date(2022, 10, 10, 12, 0, 0, 0, time.Local), user[5].PasswordLastChanged) + require.Equal(t, int64(3), user[5].PasswordLifeTime) + require.Equal(t, false, user[6].PasswordExpired) + require.Equal(t, time.Date(2022, 10, 10, 12, 0, 0, 0, time.Local), user[6].PasswordLastChanged) + require.Equal(t, int64(-1), user[6].PasswordLifeTime) } func TestLoadGlobalPrivTable(t *testing.T) { @@ -412,12 +421,14 @@ func TestAbnormalMySQLTable(t *testing.T) { max_user_connections int(11) unsigned NOT NULL DEFAULT '0', plugin char(64) COLLATE utf8_bin DEFAULT 'mysql_native_password', authentication_string text COLLATE utf8_bin, - password_expired enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', token_issuer varchar(255), user_attributes json, + password_expired ENUM('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', + password_last_changed TIMESTAMP DEFAULT CURRENT_TIMESTAMP(), + password_lifetime SMALLINT UNSIGNED, PRIMARY KEY (Host,User) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges';`) - tk.MustExec(`INSERT INTO user VALUES ('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0,'mysql_native_password','','N', '', 'null'); + tk.MustExec(`INSERT INTO user VALUES ('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0,'mysql_native_password','', '', 'null', 'N', current_timestamp(), null); `) var p privileges.MySQLPrivilege require.NoError(t, p.LoadUserTable(tk.Session())) diff --git a/privilege/privileges/errors.go b/privilege/privileges/errors.go index 4b9ecd48417ca..8ec5d9401e3c9 100644 --- a/privilege/privileges/errors.go +++ b/privilege/privileges/errors.go @@ -21,9 +21,11 @@ import ( // error definitions. var ( - errInvalidPrivilegeType = dbterror.ClassPrivilege.NewStd(mysql.ErrInvalidPrivilegeType) - ErrNonexistingGrant = dbterror.ClassPrivilege.NewStd(mysql.ErrNonexistingGrant) - errLoadPrivilege = dbterror.ClassPrivilege.NewStd(mysql.ErrLoadPrivilege) - ErrAccessDenied = dbterror.ClassPrivilege.NewStd(mysql.ErrAccessDenied) - errAccountHasBeenLocked = dbterror.ClassPrivilege.NewStd(mysql.ErrAccountHasBeenLocked) + errInvalidPrivilegeType = dbterror.ClassPrivilege.NewStd(mysql.ErrInvalidPrivilegeType) + ErrNonexistingGrant = dbterror.ClassPrivilege.NewStd(mysql.ErrNonexistingGrant) + errLoadPrivilege = dbterror.ClassPrivilege.NewStd(mysql.ErrLoadPrivilege) + ErrAccessDenied = dbterror.ClassPrivilege.NewStd(mysql.ErrAccessDenied) + errAccountHasBeenLocked = dbterror.ClassPrivilege.NewStd(mysql.ErrAccountHasBeenLocked) + ErUserAccessDeniedForUserAccountBlockedByPasswordLock = dbterror.ClassPrivilege.NewStd(mysql.ErUserAccessDeniedForUserAccountBlockedByPasswordLock) + ErrMustChangePasswordLogin = dbterror.ClassPrivilege.NewStd(mysql.ErrMustChangePasswordLogin) ) diff --git a/privilege/privileges/privileges.go b/privilege/privileges/privileges.go index e983b81f0a976..36b07c6e47b5e 100644 --- a/privilege/privileges/privileges.go +++ b/privilege/privileges/privileges.go @@ -19,6 +19,8 @@ import ( "crypto/x509" "errors" "fmt" + "math" + "strconv" "strings" "sync" "time" @@ -31,10 +33,13 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/privilege" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/sessionstates" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/mathutil" "github.com/pingcap/tidb/util/sem" "go.uber.org/zap" ) @@ -58,6 +63,7 @@ var dynamicPrivs = []string{ "RESTRICTED_USER_ADMIN", // User can not have their access revoked by SUPER users. "RESTRICTED_CONNECTION_ADMIN", // Can not be killed by PROCESS/CONNECTION_ADMIN privilege "RESTRICTED_REPLICA_WRITER_ADMIN", // Can write to the sever even when tidb_restriced_read_only is turned on. + "RESOURCE_GROUP_ADMIN", // Create/Drop/Alter RESOURCE GROUP } var dynamicPrivLock sync.Mutex var defaultTokenLife = 15 * time.Minute @@ -135,6 +141,7 @@ func (p *UserPrivileges) RequestVerification(activeRoles []*auth.RoleIdentity, d // See https://dev.mysql.com/doc/refman/5.7/en/information-schema.html dbLowerName := strings.ToLower(db) tblLowerName := strings.ToLower(table) + // If SEM is enabled and the user does not have the RESTRICTED_TABLES_ADMIN privilege // There are some hard rules which overwrite system tables and schemas as read-only at most. semEnabled := sem.IsEnabled() @@ -250,8 +257,8 @@ func (p *UserPrivileges) GetEncodedPassword(user, host string) string { return "" } -// GetAuthPlugin gets the authentication plugin for the account identified by the user and host -func (p *UserPrivileges) GetAuthPlugin(user, host string) (string, error) { +// GetAuthPluginForConnection gets the authentication plugin used in connection establishment. +func (p *UserPrivileges) GetAuthPluginForConnection(user, host string) (string, error) { if SkipWithGrant { return mysql.AuthNativePassword, nil } @@ -276,6 +283,22 @@ func (p *UserPrivileges) GetAuthPlugin(user, host string) (string, error) { return "", errors.New("Failed to get plugin for user") } +// GetAuthPlugin gets the authentication plugin for the account identified by the user and host +func (p *UserPrivileges) GetAuthPlugin(user, host string) (string, error) { + if SkipWithGrant { + return mysql.AuthNativePassword, nil + } + mysqlPriv := p.Handle.Get() + record := mysqlPriv.connectionVerification(user, host) + if record == nil { + return "", errors.New("Failed to get user record") + } + if !p.isValidHash(record) { + return "", errors.New("Failed to get plugin for user") + } + return record.AuthPlugin, nil +} + // MatchIdentity implements the Manager interface. func (p *UserPrivileges) MatchIdentity(user, host string, skipNameResolve bool) (u string, h string, success bool) { if SkipWithGrant { @@ -289,6 +312,16 @@ func (p *UserPrivileges) MatchIdentity(user, host string, skipNameResolve bool) return "", "", false } +// MatchUserResourceGroupName implements the Manager interface. +func (p *UserPrivileges) MatchUserResourceGroupName(resourceGroupName string) (u string, success bool) { + mysqlPriv := p.Handle.Get() + record := mysqlPriv.matchResoureGroup(resourceGroupName) + if record != nil { + return record.User, true + } + return "", false +} + // GetAuthWithoutVerification implements the Manager interface. func (p *UserPrivileges) GetAuthWithoutVerification(user, host string) (success bool) { if SkipWithGrant { @@ -355,69 +388,201 @@ func checkAuthTokenClaims(claims map[string]interface{}, record *UserRecord, tok return nil } +// CheckPasswordExpired checks whether the password has been expired. +func (*UserPrivileges) CheckPasswordExpired(sessionVars *variable.SessionVars, record *UserRecord) (bool, error) { + isSandBoxModeEnabled := variable.IsSandBoxModeEnabled.Load() + if record.PasswordExpired { + if isSandBoxModeEnabled { + return true, nil + } + return false, ErrMustChangePasswordLogin.GenWithStackByArgs() + } + if record.PasswordLifeTime != 0 { + lifeTime := record.PasswordLifeTime + if lifeTime == -1 { + pwdLifeTimeStr, err := sessionVars.GlobalVarsAccessor.GetGlobalSysVar(variable.DefaultPasswordLifetime) + if err != nil { + return false, err + } + lifeTime, err = strconv.ParseInt(pwdLifeTimeStr, 10, 64) + if err != nil { + return false, err + } + } + if lifeTime > 0 && record.PasswordLastChanged.AddDate(0, 0, int(lifeTime)).Before(time.Now()) { + if isSandBoxModeEnabled { + return true, nil + } + return false, ErrMustChangePasswordLogin.GenWithStackByArgs() + } + } + return false, nil +} + +// GenerateAccountAutoLockErr implements the Manager interface. +func GenerateAccountAutoLockErr(failedLoginAttempts int64, + user, host, lockTime, remainTime string) error { + logutil.BgLogger().Error(fmt.Sprintf("Access denied for user '%s'@'%s'."+ + " Account is blocked for %s day(s) (%s day(s) remaining) due to %d "+ + "consecutive failed logins.", user, host, lockTime, + remainTime, failedLoginAttempts)) + return ErUserAccessDeniedForUserAccountBlockedByPasswordLock.FastGenByArgs(user, host, + lockTime, remainTime, failedLoginAttempts) +} + +// VerifyAccountAutoLockInMemory implements the Manager interface. +func (p *UserPrivileges) VerifyAccountAutoLockInMemory(user string, host string) (bool, error) { + mysqlPriv := p.Handle.Get() + record := mysqlPriv.matchUser(user, host) + if record == nil { + logutil.BgLogger().Error("get authUser privilege record fail", + zap.String("authUser", user), zap.String("authHost", host)) + return false, ErrAccessDenied.FastGenByArgs(user, host) + } + + if record.AutoAccountLocked { + // If it is locked, need to check whether it can be automatically unlocked. + lockTime := record.PasswordLockTimeDays + if lockTime == -1 { + return record.AutoAccountLocked, GenerateAccountAutoLockErr(record.FailedLoginAttempts, user, host, "unlimited", "unlimited") + } + lastChanged := record.AutoLockedLastChanged + d := time.Now().Unix() - lastChanged + if d > lockTime*24*60*60 { + return record.AutoAccountLocked, nil + } + lds := strconv.FormatInt(lockTime, 10) + rds := strconv.FormatInt(int64(math.Ceil(float64(lockTime)-float64(d)/(24*60*60))), 10) + return record.AutoAccountLocked, GenerateAccountAutoLockErr(record.FailedLoginAttempts, user, host, lds, rds) + } + return record.AutoAccountLocked, nil +} + +// IsAccountAutoLockEnabled implements the Manager interface. +func (p *UserPrivileges) IsAccountAutoLockEnabled(user string, host string) bool { + // If the service is started using skip-grant-tables, the system ignores whether + // to enable the automatic account locking feature after continuous login failure. + if SkipWithGrant { + p.user = user + p.host = host + return false + } + mysqlPriv := p.Handle.Get() + record := mysqlPriv.matchUser(user, host) + if record == nil { + return false + } + // For failed-login tracking and temporary locking to occur, an account's FAILED_LOGIN_ATTEMPTS + // and PASSWORD_LOCK_TIME options both must be nonzero. + // https://dev.mysql.com/doc/refman/8.0/en/create-user.html + if record.FailedLoginAttempts == 0 || record.PasswordLockTimeDays == 0 { + return false + } + return true +} + +// BuildSuccessPasswordLockingJSON builds success PasswordLocking JSON string. +func BuildSuccessPasswordLockingJSON(failedLoginAttempts, passwordLockTimeDays int64) string { + return BuildPasswordLockingJSON(failedLoginAttempts, passwordLockTimeDays, "N", 0, time.Now().Format(time.UnixDate)) +} + +// BuildPasswordLockingJSON builds PasswordLocking JSON string. +func BuildPasswordLockingJSON(failedLoginAttempts int64, + passwordLockTimeDays int64, autoAccountLocked string, failedLoginCount int64, autoLockedLastChanged string) string { + var passwordLockingArray []string + passwordLockingArray = append(passwordLockingArray, fmt.Sprintf("\"failed_login_count\": %d", failedLoginCount)) + passwordLockingArray = append(passwordLockingArray, fmt.Sprintf("\"failed_login_attempts\": %d", failedLoginAttempts)) + passwordLockingArray = append(passwordLockingArray, fmt.Sprintf("\"password_lock_time_days\": %d", passwordLockTimeDays)) + if autoAccountLocked != "" { + passwordLockingArray = append(passwordLockingArray, fmt.Sprintf("\"auto_account_locked\": \"%s\"", autoAccountLocked)) + } + if autoLockedLastChanged != "" { + passwordLockingArray = append(passwordLockingArray, fmt.Sprintf("\"auto_locked_last_changed\": \"%s\"", autoLockedLastChanged)) + } + + newAttributesStr := fmt.Sprintf("{\"Password_locking\": {%s}}", strings.Join(passwordLockingArray, ",")) + return newAttributesStr +} + // ConnectionVerification implements the Manager interface. -func (p *UserPrivileges) ConnectionVerification(user *auth.UserIdentity, authUser, authHost string, authentication, salt []byte, tlsState *tls.ConnectionState) error { +func (p *UserPrivileges) ConnectionVerification(user *auth.UserIdentity, authUser, authHost string, authentication, salt []byte, sessionVars *variable.SessionVars) (info privilege.VerificationInfo, err error) { hasPassword := "YES" if len(authentication) == 0 { hasPassword = "NO" } + + mysqlPriv := p.Handle.Get() + record := mysqlPriv.connectionVerification(authUser, authHost) + if SkipWithGrant { p.user = authUser p.host = authHost - return nil + // special handling to existing users or root user initialized with insecure + if record == nil || record.ResourceGroup == "" { + info.ResourceGroupName = "default" + } else { + info.ResourceGroupName = record.ResourceGroup + } + return } - mysqlPriv := p.Handle.Get() - record := mysqlPriv.connectionVerification(authUser, authHost) if record == nil { logutil.BgLogger().Error("get authUser privilege record fail", zap.String("authUser", authUser), zap.String("authHost", authHost)) - return ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) + return info, ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) } globalPriv := mysqlPriv.matchGlobalPriv(authUser, authHost) if globalPriv != nil { - if !p.checkSSL(globalPriv, tlsState) { + if !p.checkSSL(globalPriv, sessionVars.TLSConnectionState) { logutil.BgLogger().Error("global priv check ssl fail", zap.String("authUser", authUser), zap.String("authHost", authHost)) - return ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) + return info, ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) } } pwd := record.AuthenticationString if !p.isValidHash(record) { - return ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) + return info, ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) } - if record.AuthPlugin == mysql.AuthTiDBAuthToken { + // If the user uses session token to log in, skip checking record.AuthPlugin. + if user.AuthPlugin == mysql.AuthTiDBSessionToken { + if err = sessionstates.ValidateSessionToken(authentication, user.Username); err != nil { + logutil.BgLogger().Warn("verify session token failed", zap.String("username", user.Username), zap.Error(err)) + return info, ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) + } + } else if record.AuthPlugin == mysql.AuthTiDBAuthToken { if len(authentication) == 0 { logutil.BgLogger().Error("empty authentication") - return ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) + return info, ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) } tokenString := string(hack.String(authentication[:len(authentication)-1])) var ( claims map[string]interface{} - err error ) if claims, err = GlobalJWKS.checkSigWithRetry(tokenString, 1); err != nil { logutil.BgLogger().Error("verify JWT failed", zap.Error(err)) - return ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) + return info, ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) } if err = checkAuthTokenClaims(claims, record, defaultTokenLife); err != nil { logutil.BgLogger().Error("check claims failed", zap.Error(err)) - return ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) + return info, ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) } } else if len(pwd) > 0 && len(authentication) > 0 { switch record.AuthPlugin { + // NOTE: If the checking of the clear-text password fails, please set `info.FailedDueToWrongPassword = true`. case mysql.AuthNativePassword: hpwd, err := auth.DecodePassword(pwd) if err != nil { logutil.BgLogger().Error("decode password string failed", zap.Error(err)) - return ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) + info.FailedDueToWrongPassword = true + return info, ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) } if !auth.CheckScrambledPassword(salt, hpwd, authentication) { - return ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) + info.FailedDueToWrongPassword = true + return info, ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) } case mysql.AuthCachingSha2Password, mysql.AuthTiDBSM3Password: authok, err := auth.CheckHashingPassword([]byte(pwd), string(authentication), record.AuthPlugin) @@ -426,22 +591,24 @@ func (p *UserPrivileges) ConnectionVerification(user *auth.UserIdentity, authUse } if !authok { - return ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) + info.FailedDueToWrongPassword = true + return info, ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) } case mysql.AuthSocket: if string(authentication) != authUser && string(authentication) != pwd { logutil.BgLogger().Error("Failed socket auth", zap.String("authUser", authUser), zap.String("socket_user", string(authentication)), zap.String("authentication_string", pwd)) - return ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) + return info, ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) } default: logutil.BgLogger().Error("unknown authentication plugin", zap.String("authUser", authUser), zap.String("plugin", record.AuthPlugin)) - return ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) + return info, ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) } } else if len(pwd) > 0 || len(authentication) > 0 { if record.AuthPlugin != mysql.AuthSocket { - return ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) + info.FailedDueToWrongPassword = true + return info, ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) } } @@ -449,12 +616,27 @@ func (p *UserPrivileges) ConnectionVerification(user *auth.UserIdentity, authUse locked := record.AccountLocked if locked { logutil.BgLogger().Error(fmt.Sprintf("Access denied for authUser '%s'@'%s'. Account is locked.", authUser, authHost)) - return errAccountHasBeenLocked.FastGenByArgs(user.Username, user.Hostname) + return info, errAccountHasBeenLocked.FastGenByArgs(user.Username, user.Hostname) + } + + // special handling to existing users or root user initialized with insecure + if record.ResourceGroup == "" { + info.ResourceGroupName = "default" + } else { + info.ResourceGroupName = record.ResourceGroup + } + // Skip checking password expiration if the session is migrated from another session. + // Otherwise, the user cannot log in or execute statements after migration. + if user.AuthPlugin != mysql.AuthTiDBSessionToken { + info.InSandBoxMode, err = p.CheckPasswordExpired(sessionVars, record) } + return +} +// AuthSuccess is to make the permission take effect. +func (p *UserPrivileges) AuthSuccess(authUser, authHost string) { p.user = authUser - p.host = record.Host - return nil + p.host = authHost } type checkResult int @@ -772,3 +954,100 @@ func init() { extension.RegisterDynamicPrivilege = RegisterDynamicPrivilege extension.RemoveDynamicPrivilege = RemoveDynamicPrivilege } + +// PasswordLocking is the User_attributes->>"$.Password_locking". +// It records information about failed-login tracking and temporary account locking. +type PasswordLocking struct { + FailedLoginCount int64 + PasswordLockTimeDays int64 + AutoAccountLocked bool + AutoLockedLastChanged int64 + FailedLoginAttempts int64 +} + +// ParseJSON parses information about PasswordLocking. +func (passwordLocking *PasswordLocking) ParseJSON(passwordLockingJSON types.BinaryJSON) error { + var err error + + passwordLocking.FailedLoginAttempts, err = + extractInt64FromJSON(passwordLockingJSON, "$.Password_locking.failed_login_attempts") + if err != nil { + return err + } + passwordLocking.FailedLoginAttempts = mathutil.Min(passwordLocking.FailedLoginAttempts, math.MaxInt16) + passwordLocking.FailedLoginAttempts = mathutil.Max(passwordLocking.FailedLoginAttempts, 0) + + passwordLocking.PasswordLockTimeDays, err = + extractInt64FromJSON(passwordLockingJSON, "$.Password_locking.password_lock_time_days") + if err != nil { + return err + } + passwordLocking.PasswordLockTimeDays = mathutil.Min(passwordLocking.PasswordLockTimeDays, math.MaxInt16) + passwordLocking.PasswordLockTimeDays = mathutil.Max(passwordLocking.PasswordLockTimeDays, -1) + + passwordLocking.FailedLoginCount, err = + extractInt64FromJSON(passwordLockingJSON, "$.Password_locking.failed_login_count") + if err != nil { + return err + } + + passwordLocking.AutoLockedLastChanged, err = + extractTimeUnixFromJSON(passwordLockingJSON, "$.Password_locking.auto_locked_last_changed") + if err != nil { + return err + } + + passwordLocking.AutoAccountLocked, err = + extractBoolFromJSON(passwordLockingJSON, "$.Password_locking.auto_account_locked") + if err != nil { + return err + } + return nil +} + +func extractInt64FromJSON(json types.BinaryJSON, pathExpr string) (val int64, err error) { + jsonPath, err := types.ParseJSONPathExpr(pathExpr) + if err != nil { + return 0, err + } + if BJ, found := json.Extract([]types.JSONPathExpression{jsonPath}); found { + return BJ.GetInt64(), nil + } + return 0, nil +} + +func extractTimeUnixFromJSON(json types.BinaryJSON, pathExpr string) (int64, error) { + jsonPath, err := types.ParseJSONPathExpr(pathExpr) + if err != nil { + return -1, err + } + if BJ, found := json.Extract([]types.JSONPathExpression{jsonPath}); found { + value, err := BJ.Unquote() + if err != nil { + return -1, err + } + t, err := time.ParseInLocation(time.UnixDate, value, time.Local) + if err != nil { + return -1, err + } + return t.Unix(), nil + } + return 0, nil +} + +func extractBoolFromJSON(json types.BinaryJSON, pathExpr string) (bool, error) { + jsonPath, err := types.ParseJSONPathExpr(pathExpr) + if err != nil { + return false, err + } + if BJ, found := json.Extract([]types.JSONPathExpression{jsonPath}); found { + value, err := BJ.Unquote() + if err != nil { + return false, err + } + if value == "Y" { + return true, nil + } + } + return false, nil +} diff --git a/privilege/privileges/privileges_test.go b/privilege/privileges/privileges_test.go index 210e524385e16..0040751e0ff9f 100644 --- a/privilege/privileges/privileges_test.go +++ b/privilege/privileges/privileges_test.go @@ -20,11 +20,14 @@ import ( "crypto/tls" "crypto/x509" "crypto/x509/pkix" + "encoding/json" "fmt" "net/url" "os" + "path/filepath" "strings" "testing" + "time" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/errno" @@ -38,6 +41,7 @@ import ( "github.com/pingcap/tidb/privilege/privileges" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/sessionstates" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/testkit/testutil" @@ -514,6 +518,14 @@ func TestAlterUserStmt(t *testing.T) { tk.MustExec("GRANT RESTRICTED_USER_ADMIN ON *.* TO semuser1, semuser2, semuser3") tk.MustExec("GRANT SYSTEM_USER ON *.* to semuser3") // user is both restricted + has SYSTEM_USER (or super) + tk.MustExec("set global tidb_enable_resource_control = 'on'") + tk.MustExec("CREATE RESOURCE GROUP rg1 ru_per_sec=1000") + tk.MustExec(`ALTER USER 'semuser1' RESOURCE GROUP rg1`) + tk.MustQuery(`SELECT User_attributes FROM mysql.user WHERE User = "semuser1"`).Check(testkit.Rows("{\"resource_group\": \"rg1\"}")) + + tk.MustExec(`ALTER USER 'semuser1' COMMENT 'comment1'`) + tk.MustQuery(`SELECT User_attributes FROM mysql.user WHERE User = "semuser1"`).Check(testkit.Rows("{\"metadata\": {\"comment\": \"comment1\"}, \"resource_group\": \"rg1\"}")) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "superuser2", Hostname: "localhost"}, nil, nil)) tk.MustExec("ALTER USER 'nobodyuser2' IDENTIFIED BY 'newpassword'") tk.MustExec("ALTER USER 'nobodyuser2' IDENTIFIED BY ''") @@ -1123,6 +1135,16 @@ func TestCreateDropUser(t *testing.T) { tk.MustExec(`SET ROLE tcd2;`) tk.MustExec(`CREATE USER tcd3`) tk.MustExec(`DROP USER tcd3`) + + tk.MustExec(`CREATE USER usr1`) + tk.MustQuery(`SELECT User_attributes FROM mysql.user WHERE User = "usr1"`).Check(testkit.Rows("{}")) + tk.MustExec(`DROP USER usr1`) + + tk.MustExec("set global tidb_enable_resource_control = 'on'") + tk.MustExec("CREATE RESOURCE GROUP rg1 ru_per_sec=1000") + tk.MustExec(`CREATE USER usr1 RESOURCE GROUP rg1`) + tk.MustQuery(`SELECT User_attributes FROM mysql.user WHERE User = "usr1"`).Check(testkit.Rows("{\"resource_group\": \"rg1\"}")) + tk.MustExec(`DROP USER usr1`) } func TestConfigPrivilege(t *testing.T) { @@ -2554,6 +2576,46 @@ func TestPlacementPolicyStmt(t *testing.T) { tk.MustExec(dropStmt) } +func TestResourceGroupAdminDynamicPriv(t *testing.T) { + store := createStoreAndPrepareDB(t) + + tk1 := testkit.NewTestKit(t, store) + // tk1 is the root user, create a new user for test. + tk1.Session().Auth(&auth.UserIdentity{ + Username: "root", + Hostname: "localhost", + }, nil, nil) + tk1.MustExec("CREATE USER resource_group_user") + tk1.MustExec("set @@global.tidb_enable_resource_control = 1") + + // tk2 is the new user. + tk2 := testkit.NewTestKit(t, store) + tk2.Session().Auth(&auth.UserIdentity{ + Username: "resource_group_user", + Hostname: "localhost", + }, nil, nil) + err := tk2.ExecToErr("CREATE RESOURCE GROUP test RU_PER_SEC = 666") + require.EqualError(t, err, "[planner:1227]Access denied; you need (at least one of) the SUPER or RESOURCE_GROUP_ADMIN privilege(s) for this operation") + + // grant the RESOURCE_GROUP_ADMIN dynamic privilege to the user. + tk1.MustExec("GRANT RESOURCE_GROUP_ADMIN ON *.* TO resource_group_user") + tk1.MustQuery("SHOW GRANTS FOR resource_group_user").Check(testkit.Rows( + `GRANT USAGE ON *.* TO 'resource_group_user'@'%'`, + `GRANT RESOURCE_GROUP_ADMIN ON *.* TO 'resource_group_user'@'%'`)) + + tk2.MustExec("CREATE RESOURCE GROUP test RU_PER_SEC = 666") + tk2.MustExec("CREATE RESOURCE GROUP test2 RU_PER_SEC = 999") + + tk2.MustExec("ALTER RESOURCE GROUP test2 RU_PER_SEC = 1000") + tk2.MustExec("DROP RESOURCE GROUP test2") + + tk1.MustExec("REVOKE RESOURCE_GROUP_ADMIN ON *.* FROM resource_group_user") + err = tk2.ExecToErr("ALTER RESOURCE GROUP test RU_PER_SEC = 667") + require.EqualError(t, err, "[planner:1227]Access denied; you need (at least one of) the SUPER or RESOURCE_GROUP_ADMIN privilege(s) for this operation") + err = tk2.ExecToErr("DROP RESOURCE GROUP test") + require.EqualError(t, err, "[planner:1227]Access denied; you need (at least one of) the SUPER or RESOURCE_GROUP_ADMIN privilege(s) for this operation") +} + func TestDBNameCaseSensitivityInTableLevel(t *testing.T) { store := createStoreAndPrepareDB(t) tk := testkit.NewTestKit(t, store) @@ -2963,3 +3025,183 @@ func TestIssue37488(t *testing.T) { tk.MustQuery("select current_user()").Check(testkit.Rows("dba_test@192.168.%")) tk.MustExec("DROP TABLE IF EXISTS a;") // succ } + +func TestCheckPasswordExpired(t *testing.T) { + sessionVars := variable.NewSessionVars(nil) + sessionVars.GlobalVarsAccessor = variable.NewMockGlobalAccessor4Tests() + record := privileges.NewUserRecord("%", "root") + userPrivilege := privileges.NewUserPrivileges(privileges.NewHandle(), nil) + + record.PasswordExpired = true + _, err := userPrivilege.CheckPasswordExpired(sessionVars, &record) + require.ErrorContains(t, err, "Your password has expired. To log in you must change it using a client that supports expired passwords") + + record.PasswordExpired = false + err = sessionVars.GlobalVarsAccessor.SetGlobalSysVar(context.Background(), variable.DefaultPasswordLifetime, "2") + require.NoError(t, err) + // use default_password_lifetime + record.PasswordLifeTime = -1 + record.PasswordLastChanged = time.Now().AddDate(0, 0, -2) + time.Sleep(time.Second) + _, err = userPrivilege.CheckPasswordExpired(sessionVars, &record) + require.ErrorContains(t, err, "Your password has expired. To log in you must change it using a client that supports expired passwords") + record.PasswordLastChanged = time.Now().AddDate(0, 0, -1) + _, err = userPrivilege.CheckPasswordExpired(sessionVars, &record) + require.NoError(t, err) + + // never expire + record.PasswordLifeTime = 0 + record.PasswordLastChanged = time.Now().AddDate(0, 0, -10) + _, err = userPrivilege.CheckPasswordExpired(sessionVars, &record) + require.NoError(t, err) + + // expire with the specified time + record.PasswordLifeTime = 3 + record.PasswordLastChanged = time.Now().AddDate(0, 0, -3) + time.Sleep(time.Second) + _, err = userPrivilege.CheckPasswordExpired(sessionVars, &record) + require.ErrorContains(t, err, "Your password has expired. To log in you must change it using a client that supports expired passwords") + record.PasswordLastChanged = time.Now().AddDate(0, 0, -2) + _, err = userPrivilege.CheckPasswordExpired(sessionVars, &record) + require.NoError(t, err) +} + +func TestPasswordExpireWithoutSandBoxMode(t *testing.T) { + store := createStoreAndPrepareDB(t) + rootTk := testkit.NewTestKit(t, store) + rootTk.MustExec(`CREATE USER 'testuser'@'localhost' PASSWORD EXPIRE`) + + // PASSWORD EXPIRE + user := &auth.UserIdentity{Username: "testuser", Hostname: "localhost"} + tk := testkit.NewTestKit(t, store) + err := tk.Session().Auth(user, nil, nil) + require.ErrorContains(t, err, "Your password has expired") + + // PASSWORD EXPIRE NEVER + rootTk.MustExec(`ALTER USER 'testuser'@'localhost' IDENTIFIED BY '' PASSWORD EXPIRE NEVER`) + err = tk.Session().Auth(user, nil, nil) + require.NoError(t, err) + + // PASSWORD EXPIRE INTERVAL N DAY + rootTk.MustExec(`ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE INTERVAL 2 DAY`) + rootTk.MustExec(`UPDATE mysql.user SET password_last_changed = (now() - INTERVAL 1 DAY) where user='testuser'`) + rootTk.MustExec(`FLUSH PRIVILEGES`) + err = tk.Session().Auth(user, nil, nil) + require.NoError(t, err) + rootTk.MustExec(`UPDATE mysql.user SET password_last_changed = (now() - INTERVAL 2 DAY) where user='testuser'`) + rootTk.MustExec(`FLUSH PRIVILEGES`) + time.Sleep(2 * time.Second) + err = tk.Session().Auth(user, nil, nil) + require.ErrorContains(t, err, "Your password has expired") + + // PASSWORD EXPIRE DEFAULT + rootTk.MustExec(`ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE DEFAULT`) + rootTk.MustExec(`SET GLOBAL default_password_lifetime = 2`) + err = tk.Session().Auth(user, nil, nil) + require.ErrorContains(t, err, "Your password has expired") + rootTk.MustExec(`SET GLOBAL default_password_lifetime = 3`) + err = tk.Session().Auth(user, nil, nil) + require.NoError(t, err) +} + +func TestPasswordExpireWithSandBoxMode(t *testing.T) { + store := createStoreAndPrepareDB(t) + rootTk := testkit.NewTestKit(t, store) + rootTk.MustExec(`CREATE USER 'testuser'@'localhost' PASSWORD EXPIRE`) + variable.IsSandBoxModeEnabled.Store(true) + + // PASSWORD EXPIRE + user := &auth.UserIdentity{Username: "testuser", Hostname: "localhost"} + tk := testkit.NewTestKit(t, store) + err := tk.Session().Auth(user, nil, nil) + require.NoError(t, err) + require.True(t, tk.Session().InSandBoxMode()) + tk.Session().DisableSandBoxMode() + + // PASSWORD EXPIRE NEVER + rootTk.MustExec(`ALTER USER 'testuser'@'localhost' IDENTIFIED BY '' PASSWORD EXPIRE NEVER`) + err = tk.Session().Auth(user, nil, nil) + require.NoError(t, err) + require.False(t, tk.Session().InSandBoxMode()) + + // PASSWORD EXPIRE INTERVAL N DAY + rootTk.MustExec(`ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE INTERVAL 2 DAY`) + rootTk.MustExec(`UPDATE mysql.user SET password_last_changed = (now() - INTERVAL 1 DAY) where user='testuser'`) + rootTk.MustExec(`FLUSH PRIVILEGES`) + err = tk.Session().Auth(user, nil, nil) + require.NoError(t, err) + require.False(t, tk.Session().InSandBoxMode()) + rootTk.MustExec(`UPDATE mysql.user SET password_last_changed = (now() - INTERVAL 2 DAY) where user='testuser'`) + rootTk.MustExec(`FLUSH PRIVILEGES`) + time.Sleep(2 * time.Second) + err = tk.Session().Auth(user, nil, nil) + require.NoError(t, err) + require.True(t, tk.Session().InSandBoxMode()) + tk.Session().DisableSandBoxMode() + + // PASSWORD EXPIRE DEFAULT + rootTk.MustExec(`ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE DEFAULT`) + rootTk.MustExec(`SET GLOBAL default_password_lifetime = 2`) + err = tk.Session().Auth(user, nil, nil) + require.NoError(t, err) + require.True(t, tk.Session().InSandBoxMode()) + tk.Session().DisableSandBoxMode() + rootTk.MustExec(`SET GLOBAL default_password_lifetime = 3`) + err = tk.Session().Auth(user, nil, nil) + require.NoError(t, err) + require.False(t, tk.Session().InSandBoxMode()) +} + +func TestVerificationInfoWithSessionTokenPlugin(t *testing.T) { + // prepare signing certs + tempDir := t.TempDir() + certPath := filepath.Join(tempDir, "test1_cert.pem") + keyPath := filepath.Join(tempDir, "test1_key.pem") + err := util.CreateCertificates(certPath, keyPath, 4096, x509.RSA, x509.UnknownSignatureAlgorithm) + require.NoError(t, err) + sessionstates.SetKeyPath(keyPath) + sessionstates.SetCertPath(certPath) + + // prepare user + store := createStoreAndPrepareDB(t) + rootTk := testkit.NewTestKit(t, store) + rootTk.MustExec(`CREATE USER 'testuser'@'localhost' PASSWORD EXPIRE`) + // prepare session token + token, err := sessionstates.CreateSessionToken("testuser") + require.NoError(t, err) + tokenBytes, err := json.Marshal(token) + require.NoError(t, err) + + // Test password expiration without sandbox. + user := &auth.UserIdentity{Username: "testuser", Hostname: "localhost", AuthPlugin: mysql.AuthTiDBSessionToken} + tk := testkit.NewTestKit(t, store) + err = tk.Session().Auth(user, tokenBytes, nil) + require.NoError(t, err) + require.False(t, tk.Session().InSandBoxMode()) + + // Test password expiration with sandbox. + variable.IsSandBoxModeEnabled.Store(true) + err = tk.Session().Auth(user, tokenBytes, nil) + require.NoError(t, err) + require.False(t, tk.Session().InSandBoxMode()) + + // Disable resource group. + require.Equal(t, "", tk.Session().GetSessionVars().ResourceGroupName) + + // Enable resource group. + variable.EnableResourceControl.Store(true) + err = tk.Session().Auth(user, tokenBytes, nil) + require.NoError(t, err) + require.Equal(t, "default", tk.Session().GetSessionVars().ResourceGroupName) + + // Non-default resource group. + rootTk.MustExec("CREATE RESOURCE GROUP rg1 RU_PER_SEC = 999") + rootTk.MustExec(`ALTER USER 'testuser'@'localhost' RESOURCE GROUP rg1`) + err = tk.Session().Auth(user, tokenBytes, nil) + require.NoError(t, err) + require.Equal(t, "rg1", tk.Session().GetSessionVars().ResourceGroupName) + + // Wrong token + err = tk.Session().Auth(user, nil, nil) + require.ErrorContains(t, err, "Access denied") +} diff --git a/privilege/privileges/tidb_auth_token_test.go b/privilege/privileges/tidb_auth_token_test.go index a1ee4b2fb33a0..4e036f00995d0 100644 --- a/privilege/privileges/tidb_auth_token_test.go +++ b/privilege/privileges/tidb_auth_token_test.go @@ -284,7 +284,11 @@ func TestAuthTokenClaims(t *testing.T) { User: email1, }, AuthTokenIssuer: issuer1, - Email: email1, + UserAttributesInfo: UserAttributesInfo{ + MetadataInfo: MetadataInfo{ + Email: email1, + }, + }, } // Success diff --git a/resourcemanager/BUILD.bazel b/resourcemanager/BUILD.bazel new file mode 100644 index 0000000000000..c6e7983df34be --- /dev/null +++ b/resourcemanager/BUILD.bazel @@ -0,0 +1,20 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "resourcemanager", + srcs = [ + "rm.go", + "schedule.go", + ], + importpath = "github.com/pingcap/tidb/resourcemanager", + visibility = ["//visibility:public"], + deps = [ + "//resourcemanager/scheduler", + "//resourcemanager/util", + "//util", + "//util/cpu", + "@com_github_google_uuid//:uuid", + "@com_github_pingcap_log//:log", + "@org_uber_go_zap//:zap", + ], +) diff --git a/resourcemanager/pooltask/BUILD.bazel b/resourcemanager/pooltask/BUILD.bazel new file mode 100644 index 0000000000000..176bd1871cd9e --- /dev/null +++ b/resourcemanager/pooltask/BUILD.bazel @@ -0,0 +1,26 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "pooltask", + srcs = [ + "task.go", + "task_manager.go", + "task_manager_iterator.go", + "task_manager_scheduler.go", + ], + importpath = "github.com/pingcap/tidb/resourcemanager/pooltask", + visibility = ["//visibility:public"], + deps = [ + "//util/channel", + "@org_uber_go_atomic//:atomic", + ], +) + +go_test( + name = "pooltask_test", + timeout = "short", + srcs = ["task_test.go"], + embed = [":pooltask"], + flaky = True, + deps = ["@com_github_stretchr_testify//require"], +) diff --git a/resourcemanager/pooltask/task.go b/resourcemanager/pooltask/task.go new file mode 100644 index 0000000000000..88134e684065b --- /dev/null +++ b/resourcemanager/pooltask/task.go @@ -0,0 +1,180 @@ +// 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, +// 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 pooltask + +import ( + "sync" + "sync/atomic" + + "github.com/pingcap/tidb/util/channel" +) + +// Context is a interface that can be used to create a context. +type Context[T any] interface { + GetContext() T +} + +// NilContext is to create a nil as context +type NilContext struct{} + +// GetContext is to get a nil as context +func (NilContext) GetContext() any { + return nil +} + +const ( + // PendingTask is a task waiting to start. + PendingTask int32 = iota + // RunningTask is a task running. + RunningTask + // StopTask is a stop task. + StopTask +) + +// TaskBox is a box which contains all info about pool task. +type TaskBox[T any, U any, C any, CT any, TF Context[CT]] struct { + constArgs C + contextFunc TF + wg *sync.WaitGroup + task chan Task[T] + resultCh chan U + taskID uint64 + status atomic.Int32 // task manager is able to make this task stop, wait or running +} + +// GetStatus is to get the status of task. +func (t *TaskBox[T, U, C, CT, TF]) GetStatus() int32 { + return t.status.Load() +} + +// SetStatus is to set the status of task. +func (t *TaskBox[T, U, C, CT, TF]) SetStatus(s int32) { + t.status.Store(s) +} + +// NewTaskBox is to create a task box for pool. +func NewTaskBox[T any, U any, C any, CT any, TF Context[CT]](constArgs C, contextFunc TF, wg *sync.WaitGroup, taskCh chan Task[T], resultCh chan U, taskID uint64) TaskBox[T, U, C, CT, TF] { + // We still need to do some work after a TaskBox finishes. + // So we need to add 1 to waitgroup. After we finish the work, we need to call TaskBox.Finish() + wg.Add(1) + return TaskBox[T, U, C, CT, TF]{ + constArgs: constArgs, + contextFunc: contextFunc, + wg: wg, + task: taskCh, + resultCh: resultCh, + taskID: taskID, + } +} + +// TaskID is to get the task id. +func (t *TaskBox[T, U, C, CT, TF]) TaskID() uint64 { + return t.taskID +} + +// ConstArgs is to get the const args. +func (t *TaskBox[T, U, C, CT, TF]) ConstArgs() C { + return t.constArgs +} + +// GetTaskCh is to get the task channel. +func (t *TaskBox[T, U, C, CT, TF]) GetTaskCh() chan Task[T] { + return t.task +} + +// GetResultCh is to get result channel +func (t *TaskBox[T, U, C, CT, TF]) GetResultCh() chan U { + return t.resultCh +} + +// GetContextFunc is to get context func. +func (t *TaskBox[T, U, C, CT, TF]) GetContextFunc() TF { + return t.contextFunc +} + +// Done is to set the pooltask status to complete. +func (t *TaskBox[T, U, C, CT, TF]) Done() { + t.wg.Done() +} + +// Finish is to set the TaskBox finish status. +func (t *TaskBox[T, U, C, CT, TF]) Finish() { + t.wg.Done() +} + +// Clone is to copy the box +func (t *TaskBox[T, U, C, CT, TF]) Clone() *TaskBox[T, U, C, CT, TF] { + newBox := NewTaskBox[T, U, C, CT, TF](t.constArgs, t.contextFunc, t.wg, t.task, t.resultCh, t.taskID) + return &newBox +} + +// GPool is a goroutine pool. +type GPool[T any, U any, C any, CT any, TF Context[CT]] interface { + Tune(size int) + DeleteTask(id uint64) + StopTask(id uint64) +} + +// TaskController is a controller that can control or watch the pool. +type TaskController[T any, U any, C any, CT any, TF Context[CT]] struct { + pool GPool[T, U, C, CT, TF] + productExitCh chan struct{} + wg *sync.WaitGroup + taskID uint64 + resultCh chan U + inputCh chan Task[T] +} + +// NewTaskController create a controller to deal with pooltask's status. +func NewTaskController[T any, U any, C any, CT any, TF Context[CT]](p GPool[T, U, C, CT, TF], taskID uint64, productExitCh chan struct{}, wg *sync.WaitGroup, inputCh chan Task[T], resultCh chan U) TaskController[T, U, C, CT, TF] { + return TaskController[T, U, C, CT, TF]{ + pool: p, + taskID: taskID, + productExitCh: productExitCh, + wg: wg, + resultCh: resultCh, + inputCh: inputCh, + } +} + +// Wait is to wait the pool task to stop. +func (t *TaskController[T, U, C, CT, TF]) Wait() { + t.wg.Wait() + close(t.resultCh) + t.pool.DeleteTask(t.taskID) +} + +// Stop is to send stop command to the task. But you still need to wait the task to stop. +func (t *TaskController[T, U, C, CT, TF]) Stop() { + close(t.productExitCh) + // Clear all the task in the task queue and mark all task complete. + // so that ```t.Wait``` is able to close resultCh + for range t.inputCh { + t.wg.Done() + } + t.pool.StopTask(t.TaskID()) + // Clear the resultCh to avoid blocking the consumer put result into the channel and cannot exit. + channel.Clear(t.resultCh) +} + +// TaskID is to get the task id. +func (t *TaskController[T, U, C, CT, TF]) TaskID() uint64 { + return t.taskID +} + +// Task is a task that can be executed. +type Task[T any] struct { + Task T +} diff --git a/resourcemanager/pooltask/task_manager.go b/resourcemanager/pooltask/task_manager.go new file mode 100644 index 0000000000000..e87c222569792 --- /dev/null +++ b/resourcemanager/pooltask/task_manager.go @@ -0,0 +1,155 @@ +// 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, +// 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 pooltask + +import ( + "container/list" + "sync" + "time" + + "go.uber.org/atomic" +) + +const shard int = 8 + +func getShardID(id uint64) uint64 { + return id % uint64(shard) +} + +type tContainer[T any, U any, C any, CT any, TF Context[CT]] struct { + task *TaskBox[T, U, C, CT, TF] +} + +type meta[T any, U any, C any, CT any, TF Context[CT]] struct { + stats *list.List + createTS time.Time + initialConcurrency int32 + running atomic.Int32 +} + +func newStats[T any, U any, C any, CT any, TF Context[CT]](concurrency int32) *meta[T, U, C, CT, TF] { + s := &meta[T, U, C, CT, TF]{ + createTS: time.Now(), + stats: list.New(), + initialConcurrency: concurrency, + } + return s +} + +func (m *meta[T, U, C, CT, TF]) getOriginConcurrency() int32 { + return m.initialConcurrency +} + +// TaskStatusContainer is a container that can control or watch the pool. +type TaskStatusContainer[T any, U any, C any, CT any, TF Context[CT]] struct { + stats map[uint64]*meta[T, U, C, CT, TF] + rw sync.RWMutex +} + +// TaskManager is a manager that can control or watch the pool. +type TaskManager[T any, U any, C any, CT any, TF Context[CT]] struct { + task []TaskStatusContainer[T, U, C, CT, TF] + running atomic.Int32 + concurrency int32 +} + +// NewTaskManager create a new pool task manager. +func NewTaskManager[T any, U any, C any, CT any, TF Context[CT]](c int32) TaskManager[T, U, C, CT, TF] { + task := make([]TaskStatusContainer[T, U, C, CT, TF], shard) + for i := 0; i < shard; i++ { + task[i] = TaskStatusContainer[T, U, C, CT, TF]{ + stats: make(map[uint64]*meta[T, U, C, CT, TF]), + } + } + return TaskManager[T, U, C, CT, TF]{ + task: task, + concurrency: c, + } +} + +// RegisterTask register a task to the manager. +func (t *TaskManager[T, U, C, CT, TF]) RegisterTask(taskID uint64, concurrency int32) { + id := getShardID(taskID) + t.task[id].rw.Lock() + t.task[id].stats[taskID] = newStats[T, U, C, CT, TF](concurrency) + t.task[id].rw.Unlock() +} + +// DeleteTask delete a task from the manager. +func (t *TaskManager[T, U, C, CT, TF]) DeleteTask(taskID uint64) { + shardID := getShardID(taskID) + t.task[shardID].rw.Lock() + delete(t.task[shardID].stats, taskID) + t.task[shardID].rw.Unlock() +} + +// hasTask check if the task is in the manager. +func (t *TaskManager[T, U, C, CT, TF]) hasTask(taskID uint64) bool { + shardID := getShardID(taskID) + t.task[shardID].rw.Lock() + defer t.task[shardID].rw.Unlock() + _, ok := t.task[shardID].stats[taskID] + return ok +} + +// AddSubTask AddTask add a task to the manager. +func (t *TaskManager[T, U, C, CT, TF]) AddSubTask(taskID uint64, task *TaskBox[T, U, C, CT, TF]) { + shardID := getShardID(taskID) + tc := tContainer[T, U, C, CT, TF]{ + task: task, + } + t.running.Inc() + t.task[shardID].rw.Lock() + t.task[shardID].stats[taskID].stats.PushBack(tc) + t.task[shardID].stats[taskID].running.Inc() // running job in this task + t.task[shardID].rw.Unlock() +} + +// ExitSubTask is to exit a task, and it will decrease the count of running pooltask. +func (t *TaskManager[T, U, C, CT, TF]) ExitSubTask(taskID uint64) { + shardID := getShardID(taskID) + t.running.Dec() // total running tasks + t.task[shardID].rw.Lock() + t.task[shardID].stats[taskID].running.Dec() // running job in this task + t.task[shardID].rw.Unlock() +} + +// Running return the count of running job in this task. +func (t *TaskManager[T, U, C, CT, TF]) Running(taskID uint64) int32 { + shardID := getShardID(taskID) + t.task[shardID].rw.Lock() + defer t.task[shardID].rw.Unlock() + return t.task[shardID].stats[taskID].running.Load() +} + +// StopTask is to stop a task by TaskID. +func (t *TaskManager[T, U, C, CT, TF]) StopTask(taskID uint64) { + shardID := getShardID(taskID) + t.task[shardID].rw.Lock() + defer t.task[shardID].rw.Unlock() + // When call the StopTask, the task may have been deleted from the manager. + s, ok := t.task[shardID].stats[taskID] + if ok { + l := s.stats + for e := l.Front(); e != nil; e = e.Next() { + e.Value.(tContainer[T, U, C, CT, TF]).task.SetStatus(StopTask) + } + } +} + +// GetOriginConcurrency return the concurrency of the pool at the init. +func (t *TaskManager[T, U, C, CT, TF]) GetOriginConcurrency() int32 { + return t.concurrency +} diff --git a/resourcemanager/pooltask/task_manager_iterator.go b/resourcemanager/pooltask/task_manager_iterator.go new file mode 100644 index 0000000000000..ada5994599ff5 --- /dev/null +++ b/resourcemanager/pooltask/task_manager_iterator.go @@ -0,0 +1,131 @@ +// Copyright 2023 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 pooltask + +import ( + "container/list" + "time" +) + +func (t *TaskManager[T, U, C, CT, TF]) getBoostTask() (tid uint64, result *TaskBox[T, U, C, CT, TF]) { + // boost task + // 1、the count of running task is less than concurrency + // 2、less run time, more possible to boost + tid, element := t.iter(canBoost[T, U, C, CT, TF]) + if element != nil { + return tid, element.Value.(tContainer[T, U, C, CT, TF]).task + } + return 0, nil +} + +func (t *TaskManager[T, U, C, CT, TF]) pauseTask() { + // pause task, + // 1、more run time, more possible to pause + // 2、if task have been boosted, first to pause. + tid, result := t.iter(canPause[T, U, C, CT, TF]) + if result != nil { + result.Value.(tContainer[T, U, C, CT, TF]).task.status.CompareAndSwap(RunningTask, StopTask) + // delete it from list + shardID := getShardID(tid) + t.task[shardID].rw.Lock() + defer t.task[shardID].rw.Unlock() + t.task[shardID].stats[tid].stats.Remove(result) + } +} + +func (t *TaskManager[T, U, C, CT, TF]) iter(fn func(m *meta[T, U, C, CT, TF], max time.Time) (*list.Element, bool)) (tid uint64, result *list.Element) { + var compareTS time.Time + for i := 0; i < shard; i++ { + breakFind := func(index int) (breakFind bool) { + t.task[i].rw.RLock() + defer t.task[i].rw.RUnlock() + for id, stats := range t.task[i].stats { + if result == nil { + result = findTask[T, U, C, CT, TF](stats, RunningTask) + tid = id + compareTS = stats.createTS + continue + } + newResult, pauseFind := fn(stats, compareTS) + if pauseFind { + result = newResult + tid = id + compareTS = stats.createTS + return true + } + if newResult != nil { + result = newResult + tid = id + compareTS = stats.createTS + } + } + return false + }(shard) + if breakFind { + break + } + } + return tid, result +} + +func canPause[T any, U any, C any, CT any, TF Context[CT]](m *meta[T, U, C, CT, TF], max time.Time) (result *list.Element, isBreak bool) { + if m.initialConcurrency < m.running.Load() { + box := findTask[T, U, C, CT, TF](m, RunningTask) + if box != nil { + return box, true + } + } + if m.createTS.Before(max) { + box := findTask[T, U, C, CT, TF](m, RunningTask) + if box != nil { + return box, false + } + } + return nil, false +} + +func canBoost[T any, U any, C any, CT any, TF Context[CT]](m *meta[T, U, C, CT, TF], min time.Time) (result *list.Element, isBreak bool) { + if m.running.Load() < m.initialConcurrency { + box := getTask[T, U, C, CT, TF](m) + if box != nil { + return box, true + } + } + if m.createTS.After(min) { + box := getTask[T, U, C, CT, TF](m) + if box != nil { + return box, false + } + } + return nil, false +} + +func findTask[T any, U any, C any, CT any, TF Context[CT]](m *meta[T, U, C, CT, TF], status int32) *list.Element { + for e := m.stats.Front(); e != nil; e = e.Next() { + box := e.Value.(tContainer[T, U, C, CT, TF]) + if box.task.status.Load() == status { + return e + } + } + return nil +} + +func getTask[T any, U any, C any, CT any, TF Context[CT]](m *meta[T, U, C, CT, TF]) *list.Element { + e := m.stats.Front() + if e != nil { + return e + } + return nil +} diff --git a/resourcemanager/pooltask/task_manager_scheduler.go b/resourcemanager/pooltask/task_manager_scheduler.go new file mode 100644 index 0000000000000..73c5ee46f099a --- /dev/null +++ b/resourcemanager/pooltask/task_manager_scheduler.go @@ -0,0 +1,31 @@ +// 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, +// 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 pooltask + +// Overclock is to increase the concurrency of pool. +func (t *TaskManager[T, U, C, CT, TF]) Overclock(capacity int) (tid uint64, task *TaskBox[T, U, C, CT, TF]) { + if t.running.Load() >= int32(capacity) { + return + } + return t.getBoostTask() +} + +// Downclock is to decrease the concurrency of pool. +func (t *TaskManager[T, U, C, CT, TF]) Downclock(capacity int) { + if t.running.Load() <= int32(capacity) { + return + } + t.pauseTask() +} diff --git a/resourcemanager/pooltask/task_test.go b/resourcemanager/pooltask/task_test.go new file mode 100644 index 0000000000000..b4f189fb14525 --- /dev/null +++ b/resourcemanager/pooltask/task_test.go @@ -0,0 +1,40 @@ +// 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, +// 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 pooltask + +import ( + "sync" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestTaskManager(t *testing.T) { + size := 32 + taskConcurrency := 8 + tm := NewTaskManager[int, int, int, any, NilContext](int32(size)) + tm.RegisterTask(1, int32(taskConcurrency)) + for i := 0; i < taskConcurrency; i++ { + tid := NewTaskBox[int, int, int, any, NilContext](1, NilContext{}, &sync.WaitGroup{}, make(chan Task[int]), make(chan int), 1) + tm.AddSubTask(1, &tid) + } + for i := 0; i < taskConcurrency; i++ { + tm.ExitSubTask(1) + } + require.Equal(t, int32(0), tm.Running(1)) + require.True(t, tm.hasTask(1)) + tm.DeleteTask(1) + require.False(t, tm.hasTask(1)) +} diff --git a/resourcemanager/rm.go b/resourcemanager/rm.go new file mode 100644 index 0000000000000..025eb0fcbc129 --- /dev/null +++ b/resourcemanager/rm.go @@ -0,0 +1,98 @@ +// 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, +// 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 resourcemanager + +import ( + "time" + + "github.com/google/uuid" + "github.com/pingcap/tidb/resourcemanager/scheduler" + "github.com/pingcap/tidb/resourcemanager/util" + tidbutil "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/cpu" +) + +// InstanceResourceManager is a local instance resource manager +var InstanceResourceManager = NewResourceManger() + +// RandomName is to get a random name for register pool. It is just for test. +func RandomName() string { + return uuid.New().String() +} + +// ResourceManager is a resource manager +type ResourceManager struct { + poolMap *util.ShardPoolMap + scheduler []scheduler.Scheduler + cpuObserver *cpu.Observer + exitCh chan struct{} + wg tidbutil.WaitGroupWrapper +} + +// NewResourceManger is to create a new resource manager +func NewResourceManger() *ResourceManager { + sc := make([]scheduler.Scheduler, 0, 1) + sc = append(sc, scheduler.NewCPUScheduler()) + return &ResourceManager{ + cpuObserver: cpu.NewCPUObserver(), + exitCh: make(chan struct{}), + poolMap: util.NewShardPoolMap(), + scheduler: sc, + } +} + +// Start is to start resource manager +func (r *ResourceManager) Start() { + r.wg.Run(r.cpuObserver.Start) + r.wg.Run(func() { + tick := time.NewTicker(100 * time.Millisecond) + defer tick.Stop() + for { + select { + case <-tick.C: + r.schedule() + case <-r.exitCh: + return + } + } + }) +} + +// Stop is to stop resource manager +func (r *ResourceManager) Stop() { + r.cpuObserver.Stop() + close(r.exitCh) + r.wg.Wait() +} + +// Register is to register pool into resource manager +func (r *ResourceManager) Register(pool util.GoroutinePool, name string, component util.Component) error { + p := util.PoolContainer{Pool: pool, Component: component} + return r.registerPool(name, &p) +} + +func (r *ResourceManager) registerPool(name string, pool *util.PoolContainer) error { + return r.poolMap.Add(name, pool) +} + +// Unregister is to unregister pool into resource manager. +func (r *ResourceManager) Unregister(name string) { + r.poolMap.Del(name) +} + +// Reset is to Reset resource manager. it is just for test. +func (r *ResourceManager) Reset() { + r.poolMap = util.NewShardPoolMap() +} diff --git a/resourcemanager/schedule.go b/resourcemanager/schedule.go new file mode 100644 index 0000000000000..4ba4068ba88c2 --- /dev/null +++ b/resourcemanager/schedule.go @@ -0,0 +1,72 @@ +// 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, +// 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 resourcemanager + +import ( + "time" + + "github.com/pingcap/log" + "github.com/pingcap/tidb/resourcemanager/scheduler" + "github.com/pingcap/tidb/resourcemanager/util" + "go.uber.org/zap" +) + +func (r *ResourceManager) schedule() { + r.poolMap.Iter(func(pool *util.PoolContainer) { + cmd := r.schedulePool(pool) + r.exec(pool, cmd) + }) +} + +func (r *ResourceManager) schedulePool(pool *util.PoolContainer) scheduler.Command { + if pool.Pool.Running() == 0 { + return scheduler.Hold + } + for _, sch := range r.scheduler { + cmd := sch.Tune(pool.Component, pool.Pool) + switch cmd { + case scheduler.Hold: + continue + default: + return cmd + } + } + return scheduler.Hold +} + +func (*ResourceManager) exec(pool *util.PoolContainer, cmd scheduler.Command) { + if cmd == scheduler.Hold { + return + } + if time.Since(pool.Pool.LastTunerTs()) > util.MinSchedulerInterval.Load() { + con := pool.Pool.Cap() + switch cmd { + case scheduler.Downclock: + concurrency := con - 1 + log.Debug("[resource manager] downclock goroutine pool", + zap.Int("origin concurrency", con), + zap.Int("concurrency", concurrency), + zap.String("name", pool.Pool.Name())) + pool.Pool.Tune(concurrency) + case scheduler.Overclock: + concurrency := con + 1 + log.Debug("[resource manager] overclock goroutine pool", + zap.Int("origin concurrency", con), + zap.Int("concurrency", concurrency), + zap.String("name", pool.Pool.Name())) + pool.Pool.Tune(concurrency) + } + } +} diff --git a/resourcemanager/scheduler/BUILD.bazel b/resourcemanager/scheduler/BUILD.bazel new file mode 100644 index 0000000000000..39bd88f030372 --- /dev/null +++ b/resourcemanager/scheduler/BUILD.bazel @@ -0,0 +1,15 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "scheduler", + srcs = [ + "cpu_scheduler.go", + "scheduler.go", + ], + importpath = "github.com/pingcap/tidb/resourcemanager/scheduler", + visibility = ["//visibility:public"], + deps = [ + "//resourcemanager/util", + "//util/cpu", + ], +) diff --git a/resourcemanager/scheduler/cpu_scheduler.go b/resourcemanager/scheduler/cpu_scheduler.go new file mode 100644 index 0000000000000..14338d80683d4 --- /dev/null +++ b/resourcemanager/scheduler/cpu_scheduler.go @@ -0,0 +1,44 @@ +// 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, +// 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 scheduler + +import ( + "time" + + "github.com/pingcap/tidb/resourcemanager/util" + "github.com/pingcap/tidb/util/cpu" +) + +// CPUScheduler is a cpu scheduler +type CPUScheduler struct{} + +// NewCPUScheduler is to create a new cpu scheduler +func NewCPUScheduler() *CPUScheduler { + return &CPUScheduler{} +} + +// Tune is to tune the goroutine pool +func (*CPUScheduler) Tune(_ util.Component, pool util.GoroutinePool) Command { + if time.Since(pool.LastTunerTs()) < util.MinSchedulerInterval.Load() { + return Hold + } + if cpu.GetCPUUsage() < 0.5 { + return Overclock + } + if cpu.GetCPUUsage() > 0.7 { + return Downclock + } + return Hold +} diff --git a/resourcemanager/scheduler/scheduler.go b/resourcemanager/scheduler/scheduler.go new file mode 100644 index 0000000000000..521536a741dee --- /dev/null +++ b/resourcemanager/scheduler/scheduler.go @@ -0,0 +1,36 @@ +// 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, +// 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 scheduler + +import ( + "github.com/pingcap/tidb/resourcemanager/util" +) + +// Command is the command for scheduler +type Command int + +const ( + // Downclock is to reduce the number of concurrency. + Downclock Command = iota + // Hold is to hold the number of concurrency. + Hold + // Overclock is to increase the number of concurrency. + Overclock +) + +// Scheduler is a scheduler interface +type Scheduler interface { + Tune(component util.Component, p util.GoroutinePool) Command +} diff --git a/resourcemanager/util/BUILD.bazel b/resourcemanager/util/BUILD.bazel new file mode 100644 index 0000000000000..ed91648321472 --- /dev/null +++ b/resourcemanager/util/BUILD.bazel @@ -0,0 +1,29 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "util", + srcs = [ + "mock_gpool.go", + "shard_pool_map.go", + "util.go", + ], + importpath = "github.com/pingcap/tidb/resourcemanager/util", + visibility = ["//visibility:public"], + deps = [ + "//util/intest", + "@com_github_pingcap_errors//:errors", + "@org_uber_go_atomic//:atomic", + ], +) + +go_test( + name = "util_test", + timeout = "short", + srcs = ["shard_pool_map_test.go"], + embed = [":util"], + flaky = True, + deps = [ + "//util/intest", + "@com_github_stretchr_testify//require", + ], +) diff --git a/resourcemanager/util/mock_gpool.go b/resourcemanager/util/mock_gpool.go new file mode 100644 index 0000000000000..9697d2942d6ee --- /dev/null +++ b/resourcemanager/util/mock_gpool.go @@ -0,0 +1,97 @@ +// 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, +// 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 util + +import "time" + +// MockGPool is only for test +type MockGPool struct { + name string +} + +// NewMockGPool is only for test +func NewMockGPool(name string) *MockGPool { + return &MockGPool{name: name} +} + +// ReleaseAndWait is only for test +func (*MockGPool) ReleaseAndWait() { + panic("implement me") +} + +// Tune is only for test +func (*MockGPool) Tune(_ int) { + panic("implement me") +} + +// LastTunerTs is only for test +func (*MockGPool) LastTunerTs() time.Time { + panic("implement me") +} + +// MaxInFlight is only for test +func (*MockGPool) MaxInFlight() int64 { + panic("implement me") +} + +// InFlight is only for test +func (*MockGPool) InFlight() int64 { + panic("implement me") +} + +// MinRT is only for test +func (*MockGPool) MinRT() uint64 { + panic("implement me") +} + +// MaxPASS is only for test +func (*MockGPool) MaxPASS() uint64 { + panic("implement me") +} + +// Cap is only for test +func (*MockGPool) Cap() int { + panic("implement me") +} + +// LongRTT is to represent the baseline latency by tracking a measurement of the long term, less volatile RTT. +func (*MockGPool) LongRTT() float64 { + panic("implement me") +} + +// UpdateLongRTT is only for test +func (*MockGPool) UpdateLongRTT(_ func(float64) float64) { + panic("implement me") +} + +// ShortRTT is to represent the current system latency by tracking a measurement of the short time, and more volatile RTT. +func (*MockGPool) ShortRTT() uint64 { + panic("implement me") +} + +// GetQueueSize is only for test +func (*MockGPool) GetQueueSize() int64 { + panic("implement me") +} + +// Running is only for test +func (*MockGPool) Running() int { + panic("implement me") +} + +// Name is only for test +func (m *MockGPool) Name() string { + return m.name +} diff --git a/resourcemanager/util/shard_pool_map.go b/resourcemanager/util/shard_pool_map.go new file mode 100644 index 0000000000000..3b3975b3b933f --- /dev/null +++ b/resourcemanager/util/shard_pool_map.go @@ -0,0 +1,92 @@ +// 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, +// 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 util + +import ( + "sync" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/util/intest" +) + +const shard = 8 + +func hash(key string) int { + return int(key[0]) % shard +} + +// ShardPoolMap is a map with shard +type ShardPoolMap struct { + pools [shard]poolMap +} + +// NewShardPoolMap creates a shard pool map +func NewShardPoolMap() *ShardPoolMap { + var result ShardPoolMap + for i := 0; i < shard; i++ { + result.pools[i] = newPoolMap() + } + return &result +} + +// Add adds a pool to the map +func (s *ShardPoolMap) Add(key string, pool *PoolContainer) error { + return s.pools[hash(key)].Add(key, pool) +} + +// Del deletes a pool to the map. +func (s *ShardPoolMap) Del(key string) { + s.pools[hash(key)].Del(key) +} + +// Iter iterates the map +func (s *ShardPoolMap) Iter(fn func(pool *PoolContainer)) { + for i := 0; i < shard; i++ { + s.pools[i].Iter(fn) + } +} + +type poolMap struct { + mu sync.RWMutex + poolMap map[string]*PoolContainer +} + +func newPoolMap() poolMap { + return poolMap{poolMap: make(map[string]*PoolContainer)} +} + +func (p *poolMap) Add(key string, pool *PoolContainer) error { + p.mu.Lock() + defer p.mu.Unlock() + if _, contain := p.poolMap[key]; contain && !intest.InTest { + return errors.New("pool is already exist") + } + p.poolMap[key] = pool + return nil +} + +func (p *poolMap) Del(key string) { + p.mu.Lock() + defer p.mu.Unlock() + delete(p.poolMap, key) +} + +func (p *poolMap) Iter(fn func(pool *PoolContainer)) { + p.mu.RLock() + defer p.mu.RUnlock() + for _, pool := range p.poolMap { + fn(pool) + } +} diff --git a/resourcemanager/util/shard_pool_map_test.go b/resourcemanager/util/shard_pool_map_test.go new file mode 100644 index 0000000000000..48f0c3b7d3122 --- /dev/null +++ b/resourcemanager/util/shard_pool_map_test.go @@ -0,0 +1,53 @@ +// 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, +// 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 util + +import ( + "strconv" + "sync/atomic" + "testing" + + "github.com/pingcap/tidb/util/intest" + "github.com/stretchr/testify/require" +) + +func TestShardPoolMap(t *testing.T) { + rc := 10 + pm := NewShardPoolMap() + for i := 0; i < rc; i++ { + id := strconv.FormatInt(int64(i), 10) + require.NoError(t, pm.Add(id, &PoolContainer{Pool: NewMockGPool(id), Component: DDL})) + } + if !intest.InTest { + require.Error(t, pm.Add("1", &PoolContainer{Pool: NewMockGPool("1"), Component: DDL})) + } + var cnt atomic.Int32 + pm.Iter(func(pool *PoolContainer) { + cnt.Add(1) + }) + require.Equal(t, rc, int(cnt.Load())) + + for i := 0; i < rc; i++ { + id := strconv.FormatInt(int64(i), 10) + pm.Del(id) + } + cnt.Store(0) + pm.Iter(func(pool *PoolContainer) { + cnt.Add(1) + }) + require.Equal(t, 0, int(cnt.Load())) + id := strconv.FormatInt(int64(0), 10) + pm.Del(id) +} diff --git a/resourcemanager/util/util.go b/resourcemanager/util/util.go new file mode 100644 index 0000000000000..92b7ddfe8f979 --- /dev/null +++ b/resourcemanager/util/util.go @@ -0,0 +1,55 @@ +// 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, +// 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 util + +import ( + "time" + + "go.uber.org/atomic" +) + +var ( + // MinSchedulerInterval is the minimum interval between two scheduling. + MinSchedulerInterval = atomic.NewDuration(200 * time.Millisecond) + + // MaxOverclockCount is the maximum number of overclock goroutine. + MaxOverclockCount = 1 +) + +// GoroutinePool is a pool interface +type GoroutinePool interface { + ReleaseAndWait() + Tune(size int) + LastTunerTs() time.Time + Cap() int + Running() int + Name() string +} + +// PoolContainer is a pool container +type PoolContainer struct { + Pool GoroutinePool + Component Component +} + +// Component is ID for difference component +type Component int + +const ( + // UNKNOWN is for unknown component. It is only for test + UNKNOWN Component = iota + // DDL is for ddl component + DDL +) diff --git a/roadmap.md b/roadmap.md index 92de0e67c7f34..a8b57db5440df 100644 --- a/roadmap.md +++ b/roadmap.md @@ -2,6 +2,8 @@ This roadmap brings you what's coming in the 1-year future, so you can see the new features or improvements in advance, follow the progress, learn about the key milestones on the way, and give feedback as the development work goes on. In the course of development, this roadmap is subject to change based on user needs and feedback. If you have a feature request or want to prioritize a feature, please file an issue on [GitHub](https://github.com/pingcap/tidb/issues). +✅: The feature or improvement is already available in TiDB. + > **Safe harbor statement:** > > *Any unreleased features discussed or referenced in our documents, roadmaps, blogs, websites, press releases, or public statements that are not currently available ("unreleased features") are subject to change at our discretion and may not be delivered as planned or at all. Customers acknowledge that purchase decisions are solely based on features and functions that are currently available, and that PingCAP is not obliged to deliver aforementioned unreleased features as part of the contractual agreement unless otherwise stated.* @@ -19,7 +21,7 @@ This roadmap brings you what's coming in the 1-year future, so you can see the n Scalability & Stability - Support resource management framework. +
  • ✅ Optimize resource isolation in heavy read scenarios.
  • ✅ Optimize resource isolation in heavy (batch) write scenarios.
  • Provide resource management capability for background process.
  • Support resource management framework.
  • Provide a basic resource management and control framework to effectively control the resource squeeze of background tasks on front-end tasks (user operations), and improve cluster stability.
  • Refine resource management in the multi-service aggregation scenario.
@@ -31,37 +33,39 @@ This roadmap brings you what's coming in the 1-year future, so you can see the n Support dynamic region size adjustment (heterogeneous) and huge region size for scenarios with fast business growth and a large amount of data. - SQL - Support the JSON function.
  • Expression index
  • Multi-value index
  • Partial index
  • -
+ SQL + Support the JSON function.
  • ✅ Expression index
  • Multi-value index
  • ✅ TiFlash supports JSON function pushdown
In business scenarios that require flexible schema definitions, the application can use JSON to store information for ODS, transaction indicators, commodities, game characters, and props. - Support cluster-level flashback. +
  • ✅ Support cluster-level flashback.
  • ✅ Support database-level flashback.
In game rollback scenarios, the flashback can be used to achieve a fast rollback of the current cluster. This solves the common problems in the gaming industry such as version errors and bugs. - Support time to live (TTL). + ✅ Support time to live (TTL). This feature enables automatic data cleanup in limited data archiving scenarios. - Implement a DDL parallel execution framework. + Support foreign key constraints. + Supports foreign key constraints compatible with MySQL syntax, and provides DB-level referential integrity check capabilities. + + + ✅ Support non-transactional DML for insert and update operations. + + + +
  • Implement a DDL parallel execution framework.
  • Provide DDL pause/resume capability.
Implement a distributed parallel DDL execution framework, so that DDL tasks executed by only one TiDB Owner node can be coordinated and executed by all TiDB nodes in the cluster. Improve the execution speed of DDL tasks and cluster resource utilization.
By converting the execution of DDL tasks to distributed mode, this feature accelerates the execution speed of DDL tasks and improves the utilization of computing resources in the entire cluster. At present, DDL tasks that need to improve the speed include large table indexing and lossy column type modification tasks. Hybrid Transactional and Analytical Processing (HTAP) - Support TiFlash result write-back. + ✅ Support TiFlash result write-back.

Support INSERT INTO SELECT.

  • Easily write analysis results in TiFlash back to TiDB.
  • Provide complete ACID transactions, more convenient and reliable than general ETL solutions.
  • Set a hard limit on the threshold of intermediate result size, and report an error if the threshold is exceeded.
  • Support fully distributed transactions, and remove or relax the limit on the intermediate result size.

These features combined enable a way to materialize intermediate results. The analysis results can be easily reused, which reduces unnecessary ad-hoc queries, improves the performance of BI and other applications (by pulling results directly) and reduces system load (by avoiding duplicated computation), thereby improving the overall data pipeline efficiency and reducing costs. It will make TiFlash an online service.

- Support FastScan for TiFlash. + ✅ Support FastScan for TiFlash.
  • FastScan provides weak consistency but faster table scan capability.
  • Further optimize the join order, shuffle, and exchange algorithms to improve computing efficiency and boost performance for complex queries.
  • Add a fine-grained data sharding mechanism to optimize the COUNT(DISTINCT) function and high cardinality aggregation.

This feature improves the basic computing capability of TiFlash, and optimizes the performance and reliability of the underlying algorithms of the columnar storage and MPP engine.

- - Proxy - Support TiDB proxy. - Implement automatic load balancing so that upgrading a cluster or modifying configurations does not affect the application. After scaling out or scaling in the cluster, the application can automatically rebalance the connection without reconnecting.
In scenarios such as upgrades and configuration changes, TiDB proxy is more business-friendly. - Maintenance Support rule-based SQL blocklist. @@ -82,9 +86,13 @@ This roadmap brings you what's coming in the 1-year future, so you can see the n - SQL tuning for HTAP workloads -
  • Provide SQL execution information from the perspective of applications.
  • Provide suggestions on optimizing SQL for TiFlash and TiKV in HTAP workloads.
-
  • Provide a dashboard that displays a SQL execution overview from the perspective of applications in HTAP workloads.
  • For one or several HTAP scenarios, provide suggestions on SQL optimization.
+ SQL tuning for HTAP workloads + Provide SQL execution information from the perspective of applications. + Provide a dashboard that displays a SQL execution overview from the perspective of applications in HTAP workloads. + + + Provide suggestions on optimizing SQL for TiFlash and TiKV in HTAP workloads. + For one or several HTAP scenarios, provide suggestions on SQL optimization. @@ -112,17 +120,17 @@ This roadmap brings you what's coming in the 1-year future, so you can see the n Data replication to downstream systems via TiCDC - Reduce TiCDC replication latency in daily operations. - When TiKV, TiDB, PD, or TiCDC nodes are offline in a planned maintenance window, the replication latency of TiCDC can be reduced to less than 10 seconds. + Improve TiCDC scalability and reduce replication latency. + Increase TiCDC's scalability by spanning data changes for single table to multiple TiCDC nodes and reduce replication latency by removing sorting stage. - Support replicating data to object storage such as S3. + ✅ Support replicating data to object storage such as S3. TiCDC supports replicating data changes to common object storage services. Data migration - TiDB Lightning supports table-level and partition-level online data import. - TiDB Lightning provides comprehensive table-level and partition-level data import capabilities. + ✅ Continuous data verification during data migration. + DM supports online data verification during migration from MySQL compatible database to TiDB. @@ -138,25 +146,30 @@ This roadmap brings you what's coming in the 1-year future, so you can see the n - - Log redaction -
  • Support data redaction in execution plans in TiDB Dashboard.
  • Enhance data redaction in TiDB-related logs.
- Redact sensitive information in execution plans and various logs to enhance the security of user data. - Password complexity check - A strong password is required. + ✅ A strong password is required. To improve security, empty passwords and weak passwords are not allowed.
The required password length is not less than 8. The password must contain an uppercase letter, a lowercase letter, a number, and a character. Password expiration - TiDB provides password expiration management and requires users to change passwords regularly. + ✅ TiDB provides password expiration management and requires users to change passwords regularly. Reduce the security risk of password cracking or leakage caused by using the same password for a long time. - Password policy management - TiDB provides a password reuse mechanism and brute-force cracking prevention capabilities. - TiDB supports password policy management to protect password security. + Password reuse policy + ✅ TiDB provides a password reuse policy. + Restrict password reuse and improve password security. + + + Password anti-brute force cracking + ✅ Accounts will be locked in case of consecutive incorrect passwords. + Lock the account under continuous wrong passwords to prevent the password from being cracked by brute force. + + + Log redaction +
  • Support data redaction in execution plans in TiDB Dashboard.
  • Enhance data redaction in TiDB-related logs.
+ Redact sensitive information in execution plans and various logs to enhance the security of user data. Column-level access control diff --git a/server/BUILD.bazel b/server/BUILD.bazel index 56b3741259f81..2f7de500099cf 100644 --- a/server/BUILD.bazel +++ b/server/BUILD.bazel @@ -58,6 +58,7 @@ go_library( "//sessionctx/stmtctx", "//sessionctx/variable", "//sessiontxn", + "//statistics/handle", "//store", "//store/driver/error", "//store/gcworker", @@ -77,10 +78,12 @@ go_library( "//util/fastrand", "//util/gcutil", "//util/hack", + "//util/intest", "//util/logutil", "//util/memory", "//util/pdapi", "//util/printer", + "//util/replayer", "//util/sqlexec", "//util/sys/linux", "//util/timeutil", @@ -88,10 +91,11 @@ go_library( "//util/topsql", "//util/topsql/state", "//util/topsql/stmtstats", + "//util/tracing", "//util/versioninfo", "@com_github_blacktear23_go_proxyprotocol//:go-proxyprotocol", + "@com_github_burntsushi_toml//:toml", "@com_github_gorilla_mux//:mux", - "@com_github_opentracing_opentracing_go//:opentracing-go", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_fn//:fn", @@ -158,6 +162,7 @@ go_test( "//expression", "//extension", "//infoschema", + "//keyspace", "//kv", "//meta", "//metrics", @@ -194,6 +199,8 @@ go_test( "//util/plancodec", "//util/resourcegrouptag", "//util/rowcodec", + "//util/sqlexec", + "//util/syncutil", "//util/topsql", "//util/topsql/collector", "//util/topsql/collector/mock", diff --git a/server/column.go b/server/column.go index 2ef6323d83b5f..155a1b0e897a1 100644 --- a/server/column.go +++ b/server/column.go @@ -15,6 +15,8 @@ package server import ( + "fmt" + "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" ) @@ -23,22 +25,30 @@ const maxColumnNameSize = 256 // ColumnInfo contains information of a column type ColumnInfo struct { - Schema string - Table string - OrgTable string - Name string - OrgName string - ColumnLength uint32 - Charset uint16 - Flag uint16 - Decimal uint8 - Type uint8 - DefaultValueLength uint64 - DefaultValue []byte + Schema string + Table string + OrgTable string + Name string + OrgName string + ColumnLength uint32 + Charset uint16 + Flag uint16 + Decimal uint8 + Type uint8 + DefaultValue any } // Dump dumps ColumnInfo to bytes. func (column *ColumnInfo) Dump(buffer []byte, d *resultEncoder) []byte { + return column.dump(buffer, d, false) +} + +// DumpWithDefault dumps ColumnInfo to bytes, including column defaults. This is used for ComFieldList responses. +func (column *ColumnInfo) DumpWithDefault(buffer []byte, d *resultEncoder) []byte { + return column.dump(buffer, d, true) +} + +func (column *ColumnInfo) dump(buffer []byte, d *resultEncoder, withDefault bool) []byte { if d == nil { d = newResultEncoder(charset.CharsetUTF8MB4) } @@ -64,9 +74,14 @@ func (column *ColumnInfo) Dump(buffer []byte, d *resultEncoder) []byte { buffer = append(buffer, column.Decimal) buffer = append(buffer, 0, 0) - if column.DefaultValue != nil { - buffer = dumpUint64(buffer, uint64(len(column.DefaultValue))) - buffer = append(buffer, column.DefaultValue...) + if withDefault { + switch column.DefaultValue { + case "CURRENT_TIMESTAMP", "CURRENT_DATE", nil: + buffer = append(buffer, 251) // NULL + default: + defaultValStr := fmt.Sprintf("%v", column.DefaultValue) + buffer = dumpLengthEncodedString(buffer, []byte(defaultValStr)) + } } return buffer diff --git a/server/column_test.go b/server/column_test.go index 9d54a643f7f7b..e2251040e1f9a 100644 --- a/server/column_test.go +++ b/server/column_test.go @@ -23,21 +23,47 @@ import ( func TestDumpColumn(t *testing.T) { info := ColumnInfo{ - Schema: "testSchema", - Table: "testTable", - OrgTable: "testOrgTable", - Name: "testName", - OrgName: "testOrgName", - ColumnLength: 1, - Charset: 106, - Flag: 0, - Decimal: 1, - Type: 14, - DefaultValueLength: 2, - DefaultValue: []byte{5, 2}, + Schema: "testSchema", + Table: "testTable", + OrgTable: "testOrgTable", + Name: "testName", + OrgName: "testOrgName", + ColumnLength: 1, + Charset: 106, + Flag: 0, + Decimal: 1, + Type: 14, + DefaultValue: []byte{5, 2}, } r := info.Dump(nil, nil) - exp := []byte{0x3, 0x64, 0x65, 0x66, 0xa, 0x74, 0x65, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x9, 0x74, 0x65, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0xc, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x8, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0xb, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0xc, 0x6a, 0x0, 0x1, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x1, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x2} + exp := []byte{0x3, 0x64, 0x65, 0x66, 0xa, 0x74, 0x65, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x9, 0x74, 0x65, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0xc, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x8, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0xb, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0xc, 0x6a, 0x0, 0x1, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x1, 0x0, 0x0} + require.Equal(t, exp, r) + + require.Equal(t, uint16(mysql.SetFlag), dumpFlag(mysql.TypeSet, 0)) + require.Equal(t, uint16(mysql.EnumFlag), dumpFlag(mysql.TypeEnum, 0)) + require.Equal(t, uint16(0), dumpFlag(mysql.TypeString, 0)) + + require.Equal(t, mysql.TypeString, dumpType(mysql.TypeSet)) + require.Equal(t, mysql.TypeString, dumpType(mysql.TypeEnum)) + require.Equal(t, mysql.TypeBit, dumpType(mysql.TypeBit)) +} + +func TestDumpColumnWithDefault(t *testing.T) { + info := ColumnInfo{ + Schema: "testSchema", + Table: "testTable", + OrgTable: "testOrgTable", + Name: "testName", + OrgName: "testOrgName", + ColumnLength: 1, + Charset: 106, + Flag: 0, + Decimal: 1, + Type: 14, + DefaultValue: "test", + } + r := info.DumpWithDefault(nil, nil) + exp := []byte{0x3, 0x64, 0x65, 0x66, 0xa, 0x74, 0x65, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x9, 0x74, 0x65, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0xc, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x8, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0xb, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0xc, 0x6a, 0x0, 0x1, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x1, 0x0, 0x0, 0x4, 0x74, 0x65, 0x73, 0x74} require.Equal(t, exp, r) require.Equal(t, uint16(mysql.SetFlag), dumpFlag(mysql.TypeSet, 0)) @@ -55,20 +81,19 @@ func TestColumnNameLimit(t *testing.T) { aLongName = append(aLongName, 'a') } info := ColumnInfo{ - Schema: "testSchema", - Table: "testTable", - OrgTable: "testOrgTable", - Name: string(aLongName), - OrgName: "testOrgName", - ColumnLength: 1, - Charset: 106, - Flag: 0, - Decimal: 1, - Type: 14, - DefaultValueLength: 2, - DefaultValue: []byte{5, 2}, + Schema: "testSchema", + Table: "testTable", + OrgTable: "testOrgTable", + Name: string(aLongName), + OrgName: "testOrgName", + ColumnLength: 1, + Charset: 106, + Flag: 0, + Decimal: 1, + Type: 14, + DefaultValue: []byte{5, 2}, } r := info.Dump(nil, nil) - exp := []byte{0x3, 0x64, 0x65, 0x66, 0xa, 0x74, 0x65, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x9, 0x74, 0x65, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0xc, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0xfc, 0x0, 0x1, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xb, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0xc, 0x6a, 0x0, 0x1, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x1, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x2} + exp := []byte{0x3, 0x64, 0x65, 0x66, 0xa, 0x74, 0x65, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x9, 0x74, 0x65, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0xc, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0xfc, 0x0, 0x1, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xb, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0xc, 0x6a, 0x0, 0x1, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x1, 0x0, 0x0} require.Equal(t, exp, r) } diff --git a/server/conn.go b/server/conn.go index b319679fdbf14..10d81ffa196b1 100644 --- a/server/conn.go +++ b/server/conn.go @@ -54,7 +54,6 @@ import ( "time" "unsafe" - "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" @@ -75,7 +74,6 @@ import ( "github.com/pingcap/tidb/privilege" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/sessionctx/sessionstates" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/sessiontxn" @@ -90,6 +88,7 @@ import ( "github.com/pingcap/tidb/util/memory" tlsutil "github.com/pingcap/tidb/util/tls" topsqlstate "github.com/pingcap/tidb/util/topsql/state" + "github.com/pingcap/tidb/util/tracing" "github.com/prometheus/client_golang/prometheus" "github.com/tikv/client-go/v2/util" "go.uber.org/zap" @@ -669,12 +668,12 @@ func (cc *clientConn) readOptionalSSLRequestAndHandshakeResponse(ctx context.Con switch resp.AuthPlugin { case mysql.AuthCachingSha2Password: - resp.Auth, err = cc.authSha(ctx) + resp.Auth, err = cc.authSha(ctx, resp) if err != nil { return err } case mysql.AuthTiDBSM3Password: - resp.Auth, err = cc.authSM3(ctx) + resp.Auth, err = cc.authSM3(ctx, resp) if err != nil { return err } @@ -728,7 +727,7 @@ func (cc *clientConn) handleAuthPlugin(ctx context.Context, resp *handshakeRespo } // authSha implements the caching_sha2_password specific part of the protocol. -func (cc *clientConn) authSha(ctx context.Context) ([]byte, error) { +func (cc *clientConn) authSha(ctx context.Context, resp handshakeResponse41) ([]byte, error) { const ( shaCommand = 1 requestRsaPubKey = 2 // Not supported yet, only TLS is supported as secure channel. @@ -736,6 +735,13 @@ func (cc *clientConn) authSha(ctx context.Context) ([]byte, error) { fastAuthFail = 4 ) + // If no password is specified, we don't send the FastAuthFail to do the full authentication + // as that doesn't make sense without a password and confuses the client. + // https://github.com/pingcap/tidb/issues/40831 + if len(resp.Auth) == 0 { + return []byte{}, nil + } + // Currently we always send a "FastAuthFail" as the cached part of the protocol isn't implemented yet. // This triggers the client to send the full response. err := cc.writePacket([]byte{0, 0, 0, 0, shaCommand, fastAuthFail}) @@ -758,8 +764,16 @@ func (cc *clientConn) authSha(ctx context.Context) ([]byte, error) { } // authSM3 implements the tidb_sm3_password specific part of the protocol. -func (cc *clientConn) authSM3(ctx context.Context) ([]byte, error) { - err := cc.writePacket([]byte{0, 0, 0, 0, 1, 4}) +// tidb_sm3_password is very similar to caching_sha2_password. +func (cc *clientConn) authSM3(ctx context.Context, resp handshakeResponse41) ([]byte, error) { + // If no password is specified, we don't send the FastAuthFail to do the full authentication + // as that doesn't make sense without a password and confuses the client. + // https://github.com/pingcap/tidb/issues/40831 + if len(resp.Auth) == 0 { + return []byte{}, nil + } + + err := cc.writePacket([]byte{0, 0, 0, 0, 1, 4}) // fastAuthFail if err != nil { logutil.Logger(ctx).Error("authSM3 packet write failed", zap.Error(err)) return nil, err @@ -833,16 +847,8 @@ func (cc *clientConn) openSessionAndDoAuth(authData []byte, authPlugin string) e return errAccessDeniedNoPassword.FastGenByArgs(cc.user, host) } - userIdentity := &auth.UserIdentity{Username: cc.user, Hostname: host} - if authPlugin == mysql.AuthTiDBSessionToken { - if !cc.ctx.AuthWithoutVerification(userIdentity) { - return errAccessDenied.FastGenByArgs(cc.user, host, hasPassword) - } - if err = sessionstates.ValidateSessionToken(authData, cc.user); err != nil { - logutil.BgLogger().Warn("verify session token failed", zap.String("username", cc.user), zap.Error(err)) - return errAccessDenied.FastGenByArgs(cc.user, host, hasPassword) - } - } else if err = cc.ctx.Auth(userIdentity, authData, cc.salt); err != nil { + userIdentity := &auth.UserIdentity{Username: cc.user, Hostname: host, AuthPlugin: authPlugin} + if err = cc.ctx.Auth(userIdentity, authData, cc.salt); err != nil { return err } cc.ctx.SetPort(port) @@ -1284,10 +1290,11 @@ func (cc *clientConn) dispatch(ctx context.Context, data []byte) error { connIdleDurationHistogramNotInTxn.Observe(t.Sub(cc.lastActive).Seconds()) } - span := opentracing.StartSpan("server.dispatch") cfg := config.GetGlobalConfig() if cfg.OpenTracing.Enable { - ctx = opentracing.ContextWithSpan(ctx, span) + var r tracing.Region + r, ctx = tracing.StartRegionEx(ctx, "server.dispatch") + defer r.End() } var cancelFunc context.CancelFunc @@ -1334,7 +1341,6 @@ func (cc *clientConn) dispatch(ctx context.Context, data []byte) error { } cc.server.releaseToken(token) - span.Finish() cc.lastActive = time.Now() }() @@ -1391,6 +1397,11 @@ func (cc *clientConn) dispatch(ctx context.Context, data []byte) error { return cc.handleChangeUser(ctx, data) // ComBinlogDump, ComTableDump, ComConnectOut, ComRegisterSlave case mysql.ComStmtPrepare: + // For issue 39132, same as ComQuery + if len(data) > 0 && data[len(data)-1] == 0 { + data = data[:len(data)-1] + dataStr = string(hack.String(data)) + } return cc.handleStmtPrepare(ctx, dataStr) case mysql.ComStmtExecute: return cc.handleStmtExecute(ctx, data) @@ -1599,90 +1610,6 @@ func (cc *clientConn) writeReq(ctx context.Context, filePath string) error { return cc.flush(ctx) } -func insertDataWithCommit(ctx context.Context, prevData, - curData []byte, loadDataInfo *executor.LoadDataInfo) ([]byte, error) { - var err error - var reachLimit bool - for { - prevData, reachLimit, err = loadDataInfo.InsertData(ctx, prevData, curData) - if err != nil { - return nil, err - } - if !reachLimit { - break - } - // push into commit task queue - err = loadDataInfo.EnqOneTask(ctx) - if err != nil { - return prevData, err - } - curData = prevData - prevData = nil - } - return prevData, nil -} - -// processStream process input stream from network -func processStream(ctx context.Context, cc *clientConn, loadDataInfo *executor.LoadDataInfo, wg *sync.WaitGroup) { - var err error - var shouldBreak bool - var prevData, curData []byte - defer func() { - r := recover() - if r != nil { - logutil.Logger(ctx).Error("process routine panicked", - zap.Reflect("r", r), - zap.Stack("stack")) - } - if err != nil || r != nil { - loadDataInfo.ForceQuit() - } else { - loadDataInfo.CloseTaskQueue() - } - wg.Done() - }() - for { - curData, err = cc.readPacket() - if err != nil { - if terror.ErrorNotEqual(err, io.EOF) { - logutil.Logger(ctx).Error("read packet failed", zap.Error(err)) - break - } - } - if len(curData) == 0 { - loadDataInfo.Drained = true - shouldBreak = true - if len(prevData) == 0 { - break - } - } - select { - case <-loadDataInfo.QuitCh: - err = errors.New("processStream forced to quit") - default: - } - if err != nil { - break - } - // prepare batch and enqueue task - prevData, err = insertDataWithCommit(ctx, prevData, curData, loadDataInfo) - if err != nil { - break - } - if shouldBreak { - break - } - } - if err != nil { - logutil.Logger(ctx).Error("load data process stream error", zap.Error(err)) - return - } - if err = loadDataInfo.EnqOneTask(ctx); err != nil { - logutil.Logger(ctx).Error("load data process stream error", zap.Error(err)) - return - } -} - // handleLoadData does the additional work after processing the 'load data' query. // It sends client a file path, then reads the file content from client, inserts data into database. func (cc *clientConn) handleLoadData(ctx context.Context, loadDataInfo *executor.LoadDataInfo) error { @@ -1693,29 +1620,13 @@ func (cc *clientConn) handleLoadData(ctx context.Context, loadDataInfo *executor if loadDataInfo == nil { return errors.New("load data info is empty") } - if !loadDataInfo.Table.Meta().IsBaseTable() { - return errors.New("can only load data into base tables") - } + err := cc.writeReq(ctx, loadDataInfo.Path) if err != nil { return err } - loadDataInfo.InitQueues() - loadDataInfo.SetMaxRowsInBatch(uint64(loadDataInfo.Ctx.GetSessionVars().DMLBatchSize)) - loadDataInfo.StartStopWatcher() - // let stop watcher goroutine quit - defer loadDataInfo.ForceQuit() - err = sessiontxn.NewTxn(ctx, loadDataInfo.Ctx) - if err != nil { - return err - } - // processStream process input data, enqueue commit task - wg := new(sync.WaitGroup) - wg.Add(1) - go processStream(ctx, cc, loadDataInfo, wg) - err = loadDataInfo.CommitWork(ctx) - wg.Wait() + err = loadDataInfo.Load(ctx, cc.readPacket) if err != nil { if !loadDataInfo.Drained { logutil.Logger(ctx).Info("not drained yet, try reading left data from client connection") @@ -2193,14 +2104,8 @@ func (cc *clientConn) handleFieldList(ctx context.Context, sql string) (err erro cc.initResultEncoder(ctx) defer cc.rsEncoder.clean() for _, column := range columns { - // Current we doesn't output defaultValue but reserve defaultValue length byte to make mariadb client happy. - // https://dev.mysql.com/doc/internals/en/com-query-response.html#column-definition - // TODO: fill the right DefaultValues. - column.DefaultValueLength = 0 - column.DefaultValue = []byte{} - data = data[0:4] - data = column.Dump(data, cc.rsEncoder) + data = column.DumpWithDefault(data, cc.rsEncoder) if err := cc.writePacket(data); err != nil { return err } diff --git a/server/conn_stmt.go b/server/conn_stmt.go index 436b2d1721ca0..19e77ce222d51 100644 --- a/server/conn_stmt.go +++ b/server/conn_stmt.go @@ -158,7 +158,10 @@ func (cc *clientConn) handleStmtExecute(ctx context.Context, data []byte) (err e return mysql.NewErrf(mysql.ErrUnknown, "unsupported flag: CursorTypeScrollable", nil) } - if !useCursor { + if useCursor { + cc.ctx.GetSessionVars().SetStatusFlag(mysql.ServerStatusCursorExists, true) + defer cc.ctx.GetSessionVars().SetStatusFlag(mysql.ServerStatusCursorExists, false) + } else { // not using streaming ,can reuse chunk cc.ctx.GetSessionVars().SetAlloc(cc.chunkAlloc) } @@ -251,7 +254,8 @@ func (cc *clientConn) executePlanCacheStmt(ctx context.Context, stmt interface{} // The first return value indicates whether the call of executePreparedStmtAndWriteResult has no side effect and can be retried. // Currently the first return value is used to fallback to TiKV when TiFlash is down. func (cc *clientConn) executePreparedStmtAndWriteResult(ctx context.Context, stmt PreparedStatement, args []expression.Expression, useCursor bool) (bool, error) { - prepStmt, err := (&cc.ctx).GetSessionVars().GetPreparedStmtByID(uint32(stmt.ID())) + vars := (&cc.ctx).GetSessionVars() + prepStmt, err := vars.GetPreparedStmtByID(uint32(stmt.ID())) if err != nil { return true, errors.Annotate(err, cc.preparedStmt2String(uint32(stmt.ID()))) } @@ -259,14 +263,29 @@ func (cc *clientConn) executePreparedStmtAndWriteResult(ctx context.Context, stm BinaryArgs: args, PrepStmt: prepStmt, } + + // For the combination of `ComPrepare` and `ComExecute`, the statement name is stored in the client side, and the + // TiDB only has the ID, so don't try to construct an `EXECUTE SOMETHING`. Use the original prepared statement here + // instead. + sql := "" + planCacheStmt, ok := prepStmt.(*plannercore.PlanCacheStmt) + if ok { + sql = planCacheStmt.StmtText + } + execStmt.SetText(charset.EncodingUTF8Impl, sql) rs, err := (&cc.ctx).ExecuteStmt(ctx, execStmt) if err != nil { return true, errors.Annotate(err, cc.preparedStmt2String(uint32(stmt.ID()))) } if rs == nil { + if useCursor { + vars.SetStatusFlag(mysql.ServerStatusCursorExists, false) + } return false, cc.writeOK(ctx) } - if result, ok := rs.(*tidbResultSet); ok { + // since there are multiple implementations of ResultSet (the rs might be wrapped), we have to unwrap the rs before + // casting it to *tidbResultSet. + if result, ok := unwrapResultSet(rs).(*tidbResultSet); ok { if planCacheStmt, ok := prepStmt.(*plannercore.PlanCacheStmt); ok { result.preparedStmt = planCacheStmt } @@ -278,6 +297,12 @@ func (cc *clientConn) executePreparedStmtAndWriteResult(ctx context.Context, stm if useCursor { cc.initResultEncoder(ctx) defer cc.rsEncoder.clean() + // fix https://github.com/pingcap/tidb/issues/39447. we need to hold the start-ts here because the process info + // will be set to sleep after fetch returned. + if pi := cc.ctx.ShowProcess(); pi != nil && pi.ProtectedTSList != nil && pi.CurTxnStartTS > 0 { + unhold := pi.HoldTS(pi.CurTxnStartTS) + rs = &rsWithHooks{ResultSet: rs, onClosed: unhold} + } stmt.StoreResultSet(rs) if err = cc.writeColumnInfo(rs.Columns()); err != nil { return false, err @@ -286,7 +311,7 @@ func (cc *clientConn) executePreparedStmtAndWriteResult(ctx context.Context, stm cl.OnFetchReturned() } // explicitly flush columnInfo to client. - err = cc.writeEOF(ctx, cc.ctx.Status()|mysql.ServerStatusCursorExists) + err = cc.writeEOF(ctx, cc.ctx.Status()) if err != nil { return false, err } @@ -308,6 +333,8 @@ const ( func (cc *clientConn) handleStmtFetch(ctx context.Context, data []byte) (err error) { cc.ctx.GetSessionVars().StartTime = time.Now() cc.ctx.GetSessionVars().ClearAlloc(nil, false) + cc.ctx.GetSessionVars().SetStatusFlag(mysql.ServerStatusCursorExists, true) + defer cc.ctx.GetSessionVars().SetStatusFlag(mysql.ServerStatusCursorExists, false) stmtID, fetchSize, err := parseStmtFetchCmd(data) if err != nil { @@ -336,7 +363,7 @@ func (cc *clientConn) handleStmtFetch(ctx context.Context, data []byte) (err err strconv.FormatUint(uint64(stmtID), 10), "stmt_fetch_rs"), cc.preparedStmt2String(stmtID)) } - _, err = cc.writeResultset(ctx, rs, true, cc.ctx.Status()|mysql.ServerStatusCursorExists, int(fetchSize)) + _, err = cc.writeResultset(ctx, rs, true, cc.ctx.Status(), int(fetchSize)) if err != nil { return errors.Annotate(err, cc.preparedStmt2String(stmtID)) } diff --git a/server/conn_stmt_test.go b/server/conn_stmt_test.go index 1b8ea55e61c35..366e5c54ac222 100644 --- a/server/conn_stmt_test.go +++ b/server/conn_stmt_test.go @@ -15,12 +15,16 @@ package server import ( + "bytes" + "context" + "encoding/binary" "testing" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/types" "github.com/stretchr/testify/require" ) @@ -251,3 +255,145 @@ func TestParseStmtFetchCmd(t *testing.T) { require.Equal(t, tc.err, err) } } + +func TestCursorReadHoldTS(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + srv := CreateMockServer(t, store) + srv.SetDomain(dom) + defer srv.Close() + + appendUint32 := binary.LittleEndian.AppendUint32 + ctx := context.Background() + c := CreateMockConn(t, srv) + tk := testkit.NewTestKitWithSession(t, store, c.Context().Session) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int primary key)") + tk.MustExec("insert into t values (1), (2), (3), (4), (5), (6), (7), (8)") + tk.MustQuery("select count(*) from t").Check(testkit.Rows("8")) + + stmt, _, _, err := c.Context().Prepare("select * from t") + require.NoError(t, err) + require.Zero(t, tk.Session().ShowProcess().GetMinStartTS(0)) + + // should hold ts after executing stmt with cursor + require.NoError(t, c.Dispatch(ctx, append( + appendUint32([]byte{mysql.ComStmtExecute}, uint32(stmt.ID())), + mysql.CursorTypeReadOnly, 0x1, 0x0, 0x0, 0x0, + ))) + ts := tk.Session().ShowProcess().GetMinStartTS(0) + require.Positive(t, ts) + // should unhold ts when result set exhausted + require.NoError(t, c.Dispatch(ctx, appendUint32(appendUint32([]byte{mysql.ComStmtFetch}, uint32(stmt.ID())), 5))) + require.Equal(t, ts, tk.Session().ShowProcess().GetMinStartTS(0)) + require.Equal(t, ts, srv.GetMinStartTS(0)) + require.NoError(t, c.Dispatch(ctx, appendUint32(appendUint32([]byte{mysql.ComStmtFetch}, uint32(stmt.ID())), 5))) + require.Equal(t, ts, tk.Session().ShowProcess().GetMinStartTS(0)) + require.Equal(t, ts, srv.GetMinStartTS(0)) + require.NoError(t, c.Dispatch(ctx, appendUint32(appendUint32([]byte{mysql.ComStmtFetch}, uint32(stmt.ID())), 5))) + require.Zero(t, tk.Session().ShowProcess().GetMinStartTS(0)) + + // should hold ts after executing stmt with cursor + require.NoError(t, c.Dispatch(ctx, append( + appendUint32([]byte{mysql.ComStmtExecute}, uint32(stmt.ID())), + mysql.CursorTypeReadOnly, 0x1, 0x0, 0x0, 0x0, + ))) + require.Positive(t, tk.Session().ShowProcess().GetMinStartTS(0)) + // should unhold ts when stmt reset + require.NoError(t, c.Dispatch(ctx, appendUint32([]byte{mysql.ComStmtReset}, uint32(stmt.ID())))) + require.Zero(t, tk.Session().ShowProcess().GetMinStartTS(0)) + + // should hold ts after executing stmt with cursor + require.NoError(t, c.Dispatch(ctx, append( + appendUint32([]byte{mysql.ComStmtExecute}, uint32(stmt.ID())), + mysql.CursorTypeReadOnly, 0x1, 0x0, 0x0, 0x0, + ))) + require.Positive(t, tk.Session().ShowProcess().GetMinStartTS(0)) + // should unhold ts when stmt closed + require.NoError(t, c.Dispatch(ctx, appendUint32([]byte{mysql.ComStmtClose}, uint32(stmt.ID())))) + require.Zero(t, tk.Session().ShowProcess().GetMinStartTS(0)) + + // create another 2 stmts and execute them + stmt1, _, _, err := c.Context().Prepare("select * from t") + require.NoError(t, err) + require.NoError(t, c.Dispatch(ctx, append( + appendUint32([]byte{mysql.ComStmtExecute}, uint32(stmt1.ID())), + mysql.CursorTypeReadOnly, 0x1, 0x0, 0x0, 0x0, + ))) + ts1 := tk.Session().ShowProcess().GetMinStartTS(0) + require.Positive(t, ts1) + stmt2, _, _, err := c.Context().Prepare("select * from t") + require.NoError(t, err) + require.NoError(t, c.Dispatch(ctx, append( + appendUint32([]byte{mysql.ComStmtExecute}, uint32(stmt2.ID())), + mysql.CursorTypeReadOnly, 0x1, 0x0, 0x0, 0x0, + ))) + ts2 := tk.Session().ShowProcess().GetMinStartTS(ts1) + require.Positive(t, ts2) + + require.Less(t, ts1, ts2) + require.Equal(t, ts1, srv.GetMinStartTS(0)) + require.Equal(t, ts2, srv.GetMinStartTS(ts1)) + require.Zero(t, srv.GetMinStartTS(ts2)) + + // should unhold all when session closed + c.Close() + require.Zero(t, tk.Session().ShowProcess().GetMinStartTS(0)) + require.Zero(t, srv.GetMinStartTS(0)) +} + +func TestCursorExistsFlag(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + srv := CreateMockServer(t, store) + srv.SetDomain(dom) + defer srv.Close() + + appendUint32 := binary.LittleEndian.AppendUint32 + ctx := context.Background() + c := CreateMockConn(t, srv).(*mockConn) + out := new(bytes.Buffer) + c.pkt.bufWriter.Reset(out) + c.capability |= mysql.ClientDeprecateEOF | mysql.ClientProtocol41 + tk := testkit.NewTestKitWithSession(t, store, c.Context().Session) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int primary key)") + tk.MustExec("insert into t values (1), (2), (3), (4), (5), (6), (7), (8)") + tk.MustQuery("select count(*) from t").Check(testkit.Rows("8")) + + getLastStatus := func() uint16 { + raw := out.Bytes() + return binary.LittleEndian.Uint16(raw[len(raw)-4 : len(raw)-2]) + } + + stmt, _, _, err := c.Context().Prepare("select * from t") + require.NoError(t, err) + + require.NoError(t, c.Dispatch(ctx, append( + appendUint32([]byte{mysql.ComStmtExecute}, uint32(stmt.ID())), + mysql.CursorTypeReadOnly, 0x1, 0x0, 0x0, 0x0, + ))) + require.True(t, mysql.HasCursorExistsFlag(getLastStatus())) + + // fetch first 5 + require.NoError(t, c.Dispatch(ctx, appendUint32(appendUint32([]byte{mysql.ComStmtFetch}, uint32(stmt.ID())), 5))) + require.True(t, mysql.HasCursorExistsFlag(getLastStatus())) + + // COM_QUERY during fetch + require.NoError(t, c.Dispatch(ctx, append([]byte{mysql.ComQuery}, "select * from t"...))) + require.False(t, mysql.HasCursorExistsFlag(getLastStatus())) + + // fetch last 3 + require.NoError(t, c.Dispatch(ctx, appendUint32(appendUint32([]byte{mysql.ComStmtFetch}, uint32(stmt.ID())), 5))) + require.True(t, mysql.HasCursorExistsFlag(getLastStatus())) + + // final fetch with no row retured + // (tidb doesn't unset cursor-exists flag in the previous response like mysql, one more fetch is needed) + require.NoError(t, c.Dispatch(ctx, appendUint32(appendUint32([]byte{mysql.ComStmtFetch}, uint32(stmt.ID())), 5))) + require.False(t, mysql.HasCursorExistsFlag(getLastStatus())) + require.True(t, getLastStatus()&mysql.ServerStatusLastRowSend > 0) + + // COM_QUERY after fetch + require.NoError(t, c.Dispatch(ctx, append([]byte{mysql.ComQuery}, "select * from t"...))) + require.False(t, mysql.HasCursorExistsFlag(getLastStatus())) +} diff --git a/server/conn_test.go b/server/conn_test.go index 84db98f9e1827..94461685c33c4 100644 --- a/server/conn_test.go +++ b/server/conn_test.go @@ -429,9 +429,9 @@ func TestDispatch(t *testing.T) { in: []byte("t"), err: nil, out: []byte{ - 0x26, 0x0, 0x0, 0xc, 0x3, 0x64, 0x65, 0x66, 0x4, 0x74, 0x65, 0x73, 0x74, 0x1, 0x74, + 0x1f, 0x0, 0x0, 0xc, 0x3, 0x64, 0x65, 0x66, 0x4, 0x74, 0x65, 0x73, 0x74, 0x1, 0x74, 0x1, 0x74, 0x1, 0x61, 0x1, 0x61, 0xc, 0x3f, 0x0, 0xb, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0xd, 0xfe, + 0x0, 0x0, 0x0, 0xfb, 0x1, 0x0, 0x0, 0xd, 0xfe, }, }, { @@ -549,10 +549,9 @@ func TestDispatchClientProtocol41(t *testing.T) { in: []byte("t"), err: nil, out: []byte{ - 0x26, 0x0, 0x0, 0xc, 0x3, 0x64, 0x65, 0x66, 0x4, 0x74, 0x65, 0x73, 0x74, 0x1, 0x74, + 0x1f, 0x0, 0x0, 0xc, 0x3, 0x64, 0x65, 0x66, 0x4, 0x74, 0x65, 0x73, 0x74, 0x1, 0x74, 0x1, 0x74, 0x1, 0x61, 0x1, 0x61, 0xc, 0x3f, 0x0, 0xb, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0xd, 0xfe, - 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0xfb, 0x5, 0x0, 0x0, 0x0d, 0xfe, 0x0, 0x0, 0x2, 0x0, }, }, { @@ -584,6 +583,33 @@ func TestDispatchClientProtocol41(t *testing.T) { testDispatch(t, inputs, mysql.ClientProtocol41) } +func TestQueryEndWithZero(t *testing.T) { + inputs := []dispatchInput{ + { + com: mysql.ComStmtPrepare, + in: append([]byte("select 1"), 0x0), + err: nil, + out: []byte{ + 0xc, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0x0, 0x0, 0x1, 0x3, 0x64, 0x65, 0x66, 0x0, 0x0, 0x0, 0x1, 0x31, 0x1, 0x31, 0xc, 0x3f, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x81, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x2, 0xfe, + }, + }, + { + com: mysql.ComQuery, + in: append([]byte("select 1"), 0x0), + err: nil, + out: []byte{ + 0x1, 0x0, 0x0, 0x3, 0x1, 0x18, 0x0, 0x0, 0x4, 0x3, 0x64, 0x65, 0x66, 0x0, 0x0, 0x0, + 0x1, 0x31, 0x1, 0x31, 0xc, 0x3f, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x81, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x5, 0xfe, 0x2, 0x0, 0x0, 0x6, 0x1, 0x31, 0x1, 0x0, 0x0, 0x7, 0xfe, + }, + }, + } + + testDispatch(t, inputs, 0) +} + func testDispatch(t *testing.T, inputs []dispatchInput, capability uint32) { store := testkit.CreateMockStore(t) @@ -1457,7 +1483,7 @@ func TestAuthPlugin2(t *testing.T) { require.NoError(t, err) } -func TestAuthTokenPlugin(t *testing.T) { +func TestAuthSessionTokenPlugin(t *testing.T) { // create the cert tempDir := t.TempDir() certPath := filepath.Join(tempDir, "test1_cert.pem") @@ -1528,6 +1554,13 @@ func TestAuthTokenPlugin(t *testing.T) { err = cc.openSessionAndDoAuth(resp.Auth, resp.AuthPlugin) require.NoError(t, err) + // login succeeds even if the password expires now + tk.MustExec("ALTER USER auth_session_token PASSWORD EXPIRE") + err = cc.openSessionAndDoAuth([]byte{}, mysql.AuthNativePassword) + require.ErrorContains(t, err, "Your password has expired") + err = cc.openSessionAndDoAuth(resp.Auth, resp.AuthPlugin) + require.NoError(t, err) + // wrong token should fail tokenBytes[0] ^= 0xff err = cc.openSessionAndDoAuth(resp.Auth, resp.AuthPlugin) @@ -1772,3 +1805,80 @@ func TestExtensionChangeUser(t *testing.T) { require.Equal(t, expectedConnInfo.Error, logInfo.Error) require.Equal(t, *(expectedConnInfo.ConnectionInfo), *(logInfo.ConnectionInfo)) } + +func TestAuthSha(t *testing.T) { + store := testkit.CreateMockStore(t) + + var outBuffer bytes.Buffer + tidbdrv := NewTiDBDriver(store) + cfg := newTestConfig() + cfg.Port, cfg.Status.StatusPort = 0, 0 + cfg.Status.ReportStatus = false + server, err := NewServer(cfg, tidbdrv) + require.NoError(t, err) + defer server.Close() + + cc := &clientConn{ + connectionID: 1, + salt: []byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14}, + server: server, + pkt: &packetIO{ + bufWriter: bufio.NewWriter(&outBuffer), + }, + collation: mysql.DefaultCollationID, + peerHost: "localhost", + alloc: arena.NewAllocator(512), + chunkAlloc: chunk.NewAllocator(), + capability: mysql.ClientProtocol41, + } + + tk := testkit.NewTestKit(t, store) + ctx := &TiDBContext{Session: tk.Session()} + cc.setCtx(ctx) + + resp := handshakeResponse41{ + Capability: mysql.ClientProtocol41 | mysql.ClientPluginAuth, + AuthPlugin: mysql.AuthCachingSha2Password, + Auth: []byte{}, // No password + } + + authData, err := cc.authSha(context.Background(), resp) + require.NoError(t, err) + + // If no password is specified authSha() should return an empty byte slice + // which differs from when a password is specified as that should trigger + // fastAuthFail and the rest of the auth process. + require.Equal(t, authData, []byte{}) +} + +func TestProcessInfoForExecuteCommand(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + cc := &clientConn{ + alloc: arena.NewAllocator(1024), + chunkAlloc: chunk.NewAllocator(), + pkt: &packetIO{ + bufWriter: bufio.NewWriter(bytes.NewBuffer(nil)), + }, + } + ctx := context.Background() + + tk.MustExec("use test") + cc.setCtx(&TiDBContext{Session: tk.Session(), stmts: make(map[int]*TiDBStatement)}) + + tk.MustExec("create table t (col1 int)") + + // simple prepare and execute + require.NoError(t, cc.handleStmtPrepare(ctx, "select sum(col1) from t")) + require.NoError(t, cc.handleStmtExecute(ctx, []byte{0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0})) + require.Equal(t, cc.ctx.Session.ShowProcess().Info, "select sum(col1) from t") + + // prepare and execute with params + require.NoError(t, cc.handleStmtPrepare(ctx, "select sum(col1) from t where col1 < ? and col1 > 100")) + // 1 params, length of nullBitMap is 1, `0x8, 0x0` represents the type, and the following `0x10, 0x0....` is the param + // 10 + require.NoError(t, cc.handleStmtExecute(ctx, []byte{0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x1, 0x8, 0x0, + 0x0A, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0})) + require.Equal(t, cc.ctx.Session.ShowProcess().Info, "select sum(col1) from t where col1 < ? and col1 > 100") +} diff --git a/server/driver_tidb.go b/server/driver_tidb.go index 9c24a273b3f8c..b37b76a75a889 100644 --- a/server/driver_tidb.go +++ b/server/driver_tidb.go @@ -223,10 +223,24 @@ func (tc *TiDBContext) WarningCount() uint16 { return tc.GetSessionVars().StmtCtx.WarningCount() } +func (tc *TiDBContext) checkSandBoxMode(stmt ast.StmtNode) error { + if !tc.Session.GetSessionVars().InRestrictedSQL && tc.InSandBoxMode() { + switch stmt.(type) { + case *ast.SetPwdStmt, *ast.AlterUserStmt: + default: + return errMustChangePassword.GenWithStackByArgs() + } + } + return nil +} + // ExecuteStmt implements QueryCtx interface. func (tc *TiDBContext) ExecuteStmt(ctx context.Context, stmt ast.StmtNode) (ResultSet, error) { var rs sqlexec.RecordSet var err error + if err = tc.checkSandBoxMode(stmt); err != nil { + return nil, err + } if s, ok := stmt.(*ast.NonTransactionalDMLStmt); ok { rs, err = session.HandleNonTransactionalDML(ctx, s, tc.Session) } else { @@ -466,15 +480,56 @@ func (trs *tidbResultSet) Columns() []*ColumnInfo { return trs.columns } +// rsWithHooks wraps a ResultSet with some hooks (currently only onClosed). +type rsWithHooks struct { + ResultSet + onClosed func() +} + +// Close implements ResultSet#Close +func (rs *rsWithHooks) Close() error { + closed := rs.IsClosed() + err := rs.ResultSet.Close() + if !closed && rs.onClosed != nil { + rs.onClosed() + } + return err +} + +// OnFetchReturned implements fetchNotifier#OnFetchReturned +func (rs *rsWithHooks) OnFetchReturned() { + if impl, ok := rs.ResultSet.(fetchNotifier); ok { + impl.OnFetchReturned() + } +} + +// Unwrap returns the underlying result set +func (rs *rsWithHooks) Unwrap() ResultSet { + return rs.ResultSet +} + +// unwrapResultSet likes errors.Cause but for ResultSet +func unwrapResultSet(rs ResultSet) ResultSet { + var unRS ResultSet + if u, ok := rs.(interface{ Unwrap() ResultSet }); ok { + unRS = u.Unwrap() + } + if unRS == nil { + return rs + } + return unwrapResultSet(unRS) +} + func convertColumnInfo(fld *ast.ResultField) (ci *ColumnInfo) { ci = &ColumnInfo{ - Name: fld.ColumnAsName.O, - OrgName: fld.Column.Name.O, - Table: fld.TableAsName.O, - Schema: fld.DBName.O, - Flag: uint16(fld.Column.GetFlag()), - Charset: uint16(mysql.CharsetNameToID(fld.Column.GetCharset())), - Type: fld.Column.GetType(), + Name: fld.ColumnAsName.O, + OrgName: fld.Column.Name.O, + Table: fld.TableAsName.O, + Schema: fld.DBName.O, + Flag: uint16(fld.Column.GetFlag()), + Charset: uint16(mysql.CharsetNameToID(fld.Column.GetCharset())), + Type: fld.Column.GetType(), + DefaultValue: fld.Column.GetDefaultValue(), } if fld.Table != nil { diff --git a/server/driver_tidb_test.go b/server/driver_tidb_test.go index b5f7e670aded0..35dd70f438982 100644 --- a/server/driver_tidb_test.go +++ b/server/driver_tidb_test.go @@ -22,23 +22,23 @@ import ( "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/sqlexec" "github.com/stretchr/testify/require" ) func createColumnByTypeAndLen(tp byte, cl uint32) *ColumnInfo { return &ColumnInfo{ - Schema: "test", - Table: "dual", - OrgTable: "", - Name: "a", - OrgName: "a", - ColumnLength: cl, - Charset: uint16(mysql.CharsetNameToID(charset.CharsetUTF8)), - Flag: uint16(mysql.UnsignedFlag), - Decimal: uint8(0), - Type: tp, - DefaultValueLength: uint64(0), - DefaultValue: nil, + Schema: "test", + Table: "dual", + OrgTable: "", + Name: "a", + OrgName: "a", + ColumnLength: cl, + Charset: uint16(mysql.CharsetNameToID(charset.CharsetUTF8)), + Flag: uint16(mysql.UnsignedFlag), + Decimal: uint8(0), + Type: tp, + DefaultValue: nil, } } func TestConvertColumnInfo(t *testing.T) { @@ -95,3 +95,27 @@ func TestConvertColumnInfo(t *testing.T) { colInfo = convertColumnInfo(&resultField) require.Equal(t, uint32(4), colInfo.ColumnLength) } + +func TestRSWithHooks(t *testing.T) { + closeCount := 0 + rs := &rsWithHooks{ + ResultSet: &tidbResultSet{recordSet: new(sqlexec.SimpleRecordSet)}, + onClosed: func() { closeCount++ }, + } + require.Equal(t, 0, closeCount) + rs.Close() + require.Equal(t, 1, closeCount) + rs.Close() + require.Equal(t, 1, closeCount) +} + +func TestUnwrapRS(t *testing.T) { + var nilRS ResultSet + require.Nil(t, unwrapResultSet(nilRS)) + rs0 := new(tidbResultSet) + rs1 := &rsWithHooks{ResultSet: rs0} + rs2 := &rsWithHooks{ResultSet: rs1} + for _, rs := range []ResultSet{rs0, rs1, rs2} { + require.Equal(t, rs0, unwrapResultSet(rs)) + } +} diff --git a/server/http_handler.go b/server/http_handler.go index 6044f82861386..2855186b9cdfa 100644 --- a/server/http_handler.go +++ b/server/http_handler.go @@ -206,7 +206,7 @@ func (t *tikvHandlerTool) getHandle(tb table.PhysicalTable, params map[string]st return handle, nil } -func (t *tikvHandlerTool) getMvccByIdxValue(idx table.Index, values url.Values, idxCols []*model.ColumnInfo, handle kv.Handle) (*helper.MvccKV, error) { +func (t *tikvHandlerTool) getMvccByIdxValue(idx table.Index, values url.Values, idxCols []*model.ColumnInfo, handle kv.Handle) ([]*helper.MvccKV, error) { sc := new(stmtctx.StatementContext) // HTTP request is not a database session, set timezone to UTC directly here. // See https://github.com/pingcap/tidb/blob/master/docs/tidb_http_api.md for more details. @@ -227,7 +227,18 @@ func (t *tikvHandlerTool) getMvccByIdxValue(idx table.Index, values url.Values, if err != nil { return nil, err } - return &helper.MvccKV{Key: strings.ToUpper(hex.EncodeToString(encodedKey)), RegionID: regionID, Value: data}, err + idxData := &helper.MvccKV{Key: strings.ToUpper(hex.EncodeToString(encodedKey)), RegionID: regionID, Value: data} + tablecodec.IndexKey2TempIndexKey(idx.Meta().ID, encodedKey) + data, err = t.GetMvccByEncodedKey(encodedKey) + if err != nil { + return nil, err + } + regionID, err = t.getRegionIDByKey(encodedKey) + if err != nil { + return nil, err + } + tempIdxData := &helper.MvccKV{Key: strings.ToUpper(hex.EncodeToString(encodedKey)), RegionID: regionID, Value: data} + return append([]*helper.MvccKV{}, idxData, tempIdxData), err } // formValue2DatumRow converts URL query string to a Datum Row. diff --git a/server/http_handler_test.go b/server/http_handler_test.go index 7d2b8c3867bf5..c28967abf06ee 100644 --- a/server/http_handler_test.go +++ b/server/http_handler_test.go @@ -539,16 +539,16 @@ partition by range (a) func decodeKeyMvcc(closer io.ReadCloser, t *testing.T, valid bool) { decoder := json.NewDecoder(closer) - var data helper.MvccKV + var data []helper.MvccKV err := decoder.Decode(&data) require.NoError(t, err) if valid { - require.NotNil(t, data.Value.Info) - require.Greater(t, len(data.Value.Info.Writes), 0) + require.NotNil(t, data[0].Value.Info) + require.Greater(t, len(data[0].Value.Info.Writes), 0) } else { - require.Nil(t, data.Value.Info.Lock) - require.Nil(t, data.Value.Info.Writes) - require.Nil(t, data.Value.Info.Values) + require.Nil(t, data[0].Value.Info.Lock) + require.Nil(t, data[0].Value.Info.Writes) + require.Nil(t, data[0].Value.Info.Values) } } diff --git a/server/http_status.go b/server/http_status.go index 5f02e1762d4ac..b32237c376f7a 100644 --- a/server/http_status.go +++ b/server/http_status.go @@ -461,8 +461,14 @@ func (s *Server) startStatusServerAndRPCServer(serverMux *http.ServeMux) { grpcServer := NewRPCServer(s.cfg, s.dom, s) service.RegisterChannelzServiceToServer(grpcServer) if s.cfg.Store == "tikv" { + keyspaceName := config.GetGlobalKeyspaceName() for { - fullPath := fmt.Sprintf("tikv://%s", s.cfg.Path) + var fullPath string + if keyspaceName == "" { + fullPath = fmt.Sprintf("%s://%s", s.cfg.Store, s.cfg.Path) + } else { + fullPath = fmt.Sprintf("%s://%s?keyspaceName=%s", s.cfg.Store, s.cfg.Path, keyspaceName) + } store, err := store.New(fullPath) if err != nil { logutil.BgLogger().Error("new tikv store fail", zap.Error(err)) @@ -477,7 +483,9 @@ func (s *Server) startStatusServerAndRPCServer(serverMux *http.ServeMux) { logutil.BgLogger().Error("tikv store not etcd background", zap.Error(err)) break } - service := autoid.New(s.statusListener.Addr().String(), etcdAddr, store, ebd.TLSConfig()) + selfAddr := fmt.Sprintf("%s:%d", s.cfg.AdvertiseAddress, s.cfg.Status.StatusPort) + service := autoid.New(selfAddr, etcdAddr, store, ebd.TLSConfig()) + logutil.BgLogger().Info("register auto service at", zap.String("addr", selfAddr)) pb.RegisterAutoIDAllocServer(grpcServer, service) s.autoIDService = service break diff --git a/server/mock_conn.go b/server/mock_conn.go index 36ad6503db812..620cae702707a 100644 --- a/server/mock_conn.go +++ b/server/mock_conn.go @@ -18,7 +18,6 @@ import ( "bufio" "bytes" "context" - "flag" "math/rand" "testing" @@ -29,6 +28,7 @@ import ( tmysql "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/util/arena" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/intest" "github.com/stretchr/testify/require" ) @@ -80,7 +80,7 @@ func (mc *mockConn) ID() uint64 { func CreateMockServer(t *testing.T, store kv.Storage) *Server { if !RunInGoTest { // If CreateMockServer is called in another package, RunInGoTest is not initialized. - RunInGoTest = flag.Lookup("test.v") != nil || flag.Lookup("check.v") != nil + RunInGoTest = intest.InTest } tidbdrv := NewTiDBDriver(store) cfg := config.NewConfig() diff --git a/server/plan_replayer.go b/server/plan_replayer.go index 30a00e4eda112..d5265a21e7939 100644 --- a/server/plan_replayer.go +++ b/server/plan_replayer.go @@ -15,26 +15,39 @@ package server import ( + "archive/zip" + "bytes" + "encoding/json" "fmt" - "io/ioutil" + "io" "net/http" "os" "path/filepath" + "strconv" + "strings" + "github.com/BurntSushi/toml" "github.com/gorilla/mux" + "github.com/pingcap/errors" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/domain/infosync" + "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/statistics/handle" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/replayer" "go.uber.org/zap" ) // PlanReplayerHandler is the handler for dumping plan replayer file. type PlanReplayerHandler struct { - infoGetter *infosync.InfoSyncer - address string - statusPort uint + is infoschema.InfoSchema + statsHandle *handle.Handle + infoGetter *infosync.InfoSyncer + address string + statusPort uint } func (s *Server) newPlanReplayerHandler() *PlanReplayerHandler { @@ -46,6 +59,12 @@ func (s *Server) newPlanReplayerHandler() *PlanReplayerHandler { if s.dom != nil && s.dom.InfoSyncer() != nil { prh.infoGetter = s.dom.InfoSyncer() } + if s.dom != nil && s.dom.InfoSchema() != nil { + prh.is = s.dom.InfoSchema() + } + if s.dom != nil && s.dom.StatsHandle() != nil { + prh.statsHandle = s.dom.StatsHandle() + } return prh } @@ -53,7 +72,7 @@ func (prh PlanReplayerHandler) ServeHTTP(w http.ResponseWriter, req *http.Reques params := mux.Vars(req) name := params[pFileName] handler := downloadFileHandler{ - filePath: filepath.Join(domain.GetPlanReplayerDirName(), name), + filePath: filepath.Join(replayer.GetPlanReplayerDirName(), name), fileName: name, infoGetter: prh.infoGetter, address: prh.address, @@ -61,6 +80,8 @@ func (prh PlanReplayerHandler) ServeHTTP(w http.ResponseWriter, req *http.Reques urlPath: fmt.Sprintf("plan_replayer/dump/%s", name), downloadedFilename: "plan_replayer", scheme: util.InternalHTTPSchema(), + statsHandle: prh.statsHandle, + is: prh.is, } handleDownloadFile(handler, w, req) } @@ -83,7 +104,7 @@ func handleDownloadFile(handler downloadFileHandler, w http.ResponseWriter, req writeError(w, err) return } - content, err := ioutil.ReadAll(file) + content, err := io.ReadAll(file) if err != nil { writeError(w, err) return @@ -93,6 +114,13 @@ func handleDownloadFile(handler downloadFileHandler, w http.ResponseWriter, req writeError(w, err) return } + if handler.downloadedFilename == "plan_replayer" { + content, err = handlePlanReplayerCaptureFile(content, path, handler) + if err != nil { + writeError(w, err) + return + } + } _, err = w.Write(content) if err != nil { writeError(w, err) @@ -137,7 +165,7 @@ func handleDownloadFile(handler downloadFileHandler, w http.ResponseWriter, req zap.String("remote-addr", remoteAddr), zap.Int("status-code", resp.StatusCode)) continue } - content, err := ioutil.ReadAll(resp.Body) + content, err := io.ReadAll(resp.Body) if err != nil { writeError(w, err) return @@ -175,6 +203,9 @@ type downloadFileHandler struct { statusPort uint urlPath string downloadedFilename string + + statsHandle *handle.Handle + is infoschema.InfoSchema } func isExists(path string) (bool, error) { @@ -187,3 +218,162 @@ func isExists(path string) (bool, error) { } return true, nil } + +func handlePlanReplayerCaptureFile(content []byte, path string, handler downloadFileHandler) ([]byte, error) { + if !strings.HasPrefix(handler.filePath, "capture_replayer") { + return content, nil + } + b := bytes.NewReader(content) + zr, err := zip.NewReader(b, int64(len(content))) + if err != nil { + return nil, err + } + startTS, err := loadSQLMetaFile(zr) + if err != nil { + return nil, err + } + if startTS == 0 { + return content, nil + } + tbls, err := loadSchemaMeta(zr, handler.is) + if err != nil { + return nil, err + } + for _, tbl := range tbls { + jsonStats, err := handler.statsHandle.DumpHistoricalStatsBySnapshot(tbl.dbName, tbl.info, startTS) + if err != nil { + return nil, err + } + tbl.jsonStats = jsonStats + } + newPath, err := dumpJSONStatsIntoZip(tbls, content, path) + if err != nil { + return nil, err + } + //nolint: gosec + file, err := os.Open(newPath) + if err != nil { + return nil, err + } + content, err = io.ReadAll(file) + if err != nil { + return nil, err + } + err = file.Close() + if err != nil { + return nil, err + } + return content, nil +} + +func loadSQLMetaFile(z *zip.Reader) (uint64, error) { + for _, zipFile := range z.File { + if zipFile.Name == domain.PlanReplayerSQLMetaFile { + varMap := make(map[string]string) + v, err := zipFile.Open() + if err != nil { + return 0, errors.AddStack(err) + } + //nolint: errcheck,all_revive + defer v.Close() + _, err = toml.NewDecoder(v).Decode(&varMap) + if err != nil { + return 0, errors.AddStack(err) + } + startTS, err := strconv.ParseUint(varMap[domain.PlanReplayerSQLMetaStartTS], 10, 64) + if err != nil { + return 0, err + } + return startTS, nil + } + } + return 0, nil +} + +func loadSchemaMeta(z *zip.Reader, is infoschema.InfoSchema) (map[int64]*tblInfo, error) { + r := make(map[int64]*tblInfo, 0) + for _, zipFile := range z.File { + if zipFile.Name == fmt.Sprintf("schema/%v", domain.PlanReplayerSchemaMetaFile) { + v, err := zipFile.Open() + if err != nil { + return nil, errors.AddStack(err) + } + //nolint: errcheck,all_revive + defer v.Close() + buf := new(bytes.Buffer) + _, err = buf.ReadFrom(v) + if err != nil { + return nil, errors.AddStack(err) + } + rows := strings.Split(buf.String(), "\n") + for _, row := range rows { + s := strings.Split(row, ";") + databaseName := s[0] + tableName := s[1] + t, err := is.TableByName(model.NewCIStr(databaseName), model.NewCIStr(tableName)) + if err != nil { + return nil, err + } + r[t.Meta().ID] = &tblInfo{ + info: t.Meta(), + dbName: databaseName, + tblName: tableName, + } + } + break + } + } + return r, nil +} + +func dumpJSONStatsIntoZip(tbls map[int64]*tblInfo, content []byte, path string) (string, error) { + zr, err := zip.NewReader(bytes.NewReader(content), int64(len(content))) + if err != nil { + return "", err + } + newPath := strings.Replace(path, "capture_replayer", "copy_capture_replayer", 1) + zf, err := os.Create(newPath) + if err != nil { + return "", err + } + zw := zip.NewWriter(zf) + for _, f := range zr.File { + err = zw.Copy(f) + if err != nil { + logutil.BgLogger().Error("copy plan replayer zip file failed", zap.Error(err)) + return "", err + } + } + for _, tbl := range tbls { + w, err := zw.Create(fmt.Sprintf("stats/%v.%v.json", tbl.dbName, tbl.tblName)) + if err != nil { + return "", err + } + data, err := json.Marshal(tbl.jsonStats) + if err != nil { + return "", err + } + _, err = w.Write(data) + if err != nil { + return "", err + } + } + err = zw.Close() + if err != nil { + logutil.BgLogger().Error("Closing file failed", zap.Error(err)) + return "", err + } + err = zf.Close() + if err != nil { + logutil.BgLogger().Error("Closing file failed", zap.Error(err)) + return "", err + } + return newPath, nil +} + +type tblInfo struct { + info *model.TableInfo + jsonStats *handle.JSONTable + dbName string + tblName string +} diff --git a/server/plan_replayer_test.go b/server/plan_replayer_test.go index 2a00bc0db04de..2f2308efdd1a9 100644 --- a/server/plan_replayer_test.go +++ b/server/plan_replayer_test.go @@ -18,7 +18,6 @@ import ( "bytes" "database/sql" "io" - "io/ioutil" "os" "path/filepath" "testing" @@ -69,7 +68,7 @@ func TestDumpPlanReplayerAPI(t *testing.T) { require.NoError(t, resp0.Body.Close()) }() - body, err := ioutil.ReadAll(resp0.Body) + body, err := io.ReadAll(resp0.Body) require.NoError(t, err) path := "/tmp/plan_replayer.zip" diff --git a/server/server.go b/server/server.go index 33d9ed3737b4e..59ac88de3204d 100644 --- a/server/server.go +++ b/server/server.go @@ -111,6 +111,7 @@ var ( errNewAbortingConnection = dbterror.ClassServer.NewStd(errno.ErrNewAbortingConnection) errNotSupportedAuthMode = dbterror.ClassServer.NewStd(errno.ErrNotSupportedAuthMode) errNetPacketTooLarge = dbterror.ClassServer.NewStd(errno.ErrNetPacketTooLarge) + errMustChangePassword = dbterror.ClassServer.NewStd(errno.ErrMustChangePassword) ) // DefaultCapability is the capability of the server when it is created using the default configuration. @@ -733,6 +734,11 @@ func (s *Server) GetProcessInfo(id uint64) (*util.ProcessInfo, bool) { conn, ok := s.clients[id] s.rwlock.RUnlock() if !ok { + if s.dom != nil { + if pinfo, ok2 := s.dom.SysProcTracker().GetSysProcessList()[id]; ok2 { + return pinfo, true + } + } return &util.ProcessInfo{}, false } return conn.ctx.ShowProcess(), ok @@ -785,6 +791,17 @@ func killConn(conn *clientConn) { } } +// KillSysProcesses kill sys processes such as auto analyze. +func (s *Server) KillSysProcesses() { + if s.dom == nil { + return + } + sysProcTracker := s.dom.SysProcTracker() + for connID := range sysProcTracker.GetSysProcessList() { + sysProcTracker.KillSysProcess(connID) + } +} + // KillAllConnections kills all connections when server is not gracefully shutdown. func (s *Server) KillAllConnections() { logutil.BgLogger().Info("[server] kill all connections.") @@ -799,12 +816,7 @@ func (s *Server) KillAllConnections() { killConn(conn) } - if s.dom != nil { - sysProcTracker := s.dom.SysProcTracker() - for connID := range sysProcTracker.GetSysProcessList() { - sysProcTracker.KillSysProcess(connID) - } - } + s.KillSysProcesses() } var gracefulCloseConnectionsTimeout = 15 * time.Second @@ -970,3 +982,37 @@ func (s *Server) KillNonFlashbackClusterConn() { s.Kill(id, false) } } + +// GetMinStartTS implements SessionManager interface. +func (s *Server) GetMinStartTS(lowerBound uint64) (ts uint64) { + // sys processes + if s.dom != nil { + for _, pi := range s.dom.SysProcTracker().GetSysProcessList() { + if thisTS := pi.GetMinStartTS(lowerBound); thisTS > lowerBound && (thisTS < ts || ts == 0) { + ts = thisTS + } + } + } + // user sessions + func() { + s.rwlock.RLock() + defer s.rwlock.RUnlock() + for _, client := range s.clients { + if thisTS := client.ctx.ShowProcess().GetMinStartTS(lowerBound); thisTS > lowerBound && (thisTS < ts || ts == 0) { + ts = thisTS + } + } + }() + // internal sessions + func() { + s.sessionMapMutex.Lock() + defer s.sessionMapMutex.Unlock() + analyzeProcID := util.GetAutoAnalyzeProcID(s.ServerID) + for se := range s.internalSessions { + if thisTS, processInfoID := session.GetStartTSFromSession(se); processInfoID != analyzeProcID && thisTS > lowerBound && (thisTS < ts || ts == 0) { + ts = thisTS + } + } + }() + return +} diff --git a/server/stat_test.go b/server/stat_test.go index 66c974a3deeea..dfa2228467911 100644 --- a/server/stat_test.go +++ b/server/stat_test.go @@ -21,6 +21,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/domain/infosync" + "github.com/pingcap/tidb/keyspace" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store/mockstore" "github.com/stretchr/testify/require" @@ -46,7 +47,7 @@ func TestUptime(t *testing.T) { }() require.NoError(t, err) - _, err = infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), true) + _, err = infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), dom.GetEtcdClient(), dom.GetPDClient(), keyspace.CodecV1, true) require.NoError(t, err) tidbdrv := NewTiDBDriver(store) diff --git a/server/statistics_handler.go b/server/statistics_handler.go index 09de26810a332..88039ad811777 100644 --- a/server/statistics_handler.go +++ b/server/statistics_handler.go @@ -15,6 +15,7 @@ package server import ( + "fmt" "net/http" "strconv" "time" @@ -24,8 +25,8 @@ import ( "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/gcutil" "github.com/tikv/client-go/v2/oracle" ) @@ -105,18 +106,18 @@ func (sh StatsHistoryHandler) ServeHTTP(w http.ResponseWriter, req *http.Request return } defer se.Close() - - dumpPartitionStats := true - if len(params[pDumpPartitionStats]) > 0 { - dumpPartitionStats, err = strconv.ParseBool(params[pDumpPartitionStats]) - if err != nil { - writeError(w, err) - return - } + enabeld, err := sh.do.StatsHandle().CheckHistoricalStatsEnable() + if err != nil { + writeError(w, err) + return + } + if !enabeld { + writeError(w, fmt.Errorf("%v should be enabled", variable.TiDBEnableHistoricalStats)) + return } se.GetSessionVars().StmtCtx.TimeZone = time.Local - t, err := types.ParseTime(se.GetSessionVars().StmtCtx, params[pSnapshot], mysql.TypeTimestamp, 6) + t, err := types.ParseTime(se.GetSessionVars().StmtCtx, params[pSnapshot], mysql.TypeTimestamp, 6, nil) if err != nil { writeError(w, err) return @@ -127,12 +128,6 @@ func (sh StatsHistoryHandler) ServeHTTP(w http.ResponseWriter, req *http.Request return } snapshot := oracle.GoTimeToTS(t1) - err = gcutil.ValidateSnapshot(se, snapshot) - if err != nil { - writeError(w, err) - return - } - is, err := sh.do.GetSnapshotInfoSchema(snapshot) if err != nil { writeError(w, err) @@ -144,7 +139,7 @@ func (sh StatsHistoryHandler) ServeHTTP(w http.ResponseWriter, req *http.Request writeError(w, err) return } - js, err := h.DumpStatsToJSONBySnapshot(params[pDBName], tbl.Meta(), snapshot, dumpPartitionStats) + js, err := h.DumpHistoricalStatsBySnapshot(params[pDBName], tbl.Meta(), snapshot) if err != nil { writeError(w, err) } else { diff --git a/server/statistics_handler_test.go b/server/statistics_handler_test.go index a4d557f45be88..e0ecc7ba853f0 100644 --- a/server/statistics_handler_test.go +++ b/server/statistics_handler_test.go @@ -25,6 +25,7 @@ import ( "github.com/go-sql-driver/mysql" "github.com/gorilla/mux" + "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/statistics/handle" "github.com/pingcap/tidb/testkit" @@ -59,6 +60,10 @@ func TestDumpStatsAPI(t *testing.T) { statsHandler := &StatsHandler{dom} prepareData(t, client, statsHandler) + tableInfo, err := dom.InfoSchema().TableByName(model.NewCIStr("tidb"), model.NewCIStr("test")) + require.NoError(t, err) + err = dom.GetHistoricalStatsWorker().DumpHistoricalStats(tableInfo.Meta().ID, dom.StatsHandle()) + require.NoError(t, err) router := mux.NewRouter() router.Handle("/stats/dump/{db}/{table}", statsHandler) @@ -168,6 +173,7 @@ func prepareData(t *testing.T, client *testServerClient, statHandle *StatsHandle tk.MustExec("insert test values (1, 's')") require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) tk.MustExec("analyze table test") + tk.MustExec("set global tidb_enable_historical_stats = 1") tk.MustExec("insert into test(a,b) values (1, 'v'),(3, 'vvv'),(5, 'vv')") is := statHandle.do.InfoSchema() require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) diff --git a/server/tidb_library_test.go b/server/tidb_library_test.go index 8d895aa692e95..9c9e9b3d8110e 100644 --- a/server/tidb_library_test.go +++ b/server/tidb_library_test.go @@ -21,6 +21,7 @@ import ( "github.com/docker/go-units" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store/mockstore" + "github.com/pingcap/tidb/util/syncutil" "github.com/stretchr/testify/require" ) @@ -47,5 +48,9 @@ func TestMemoryLeak(t *testing.T) { runtime.GC() runtime.ReadMemStats(&memStat) // before the fix, initAndCloseTiDB for 20 times will cost 900 MB memory, so we test for a quite loose upper bound. - require.Less(t, memStat.HeapInuse-oldHeapInUse, uint64(300*units.MiB)) + if syncutil.EnableDeadlock { + require.Less(t, memStat.HeapInuse-oldHeapInUse, uint64(1100*units.MiB)) + } else { + require.Less(t, memStat.HeapInuse-oldHeapInUse, uint64(300*units.MiB)) + } } diff --git a/server/tidb_test.go b/server/tidb_test.go index fc176613768ba..11c31354ca0e9 100644 --- a/server/tidb_test.go +++ b/server/tidb_test.go @@ -2781,11 +2781,11 @@ func (l *connEventLogs) check(fn func()) { fn() } -func (l *connEventLogs) waitConnDisconnected() error { +func (l *connEventLogs) waitEvent(tp extension.ConnEventTp) error { totalSleep := 0 for { l.Lock() - if l.types[len(l.types)-1] == extension.ConnDisconnected { + if l.types[len(l.types)-1] == tp { l.Unlock() return nil } @@ -2812,6 +2812,8 @@ func TestExtensionConnEvent(t *testing.T) { require.NoError(t, extension.Setup()) ts := createTidbTestSuite(t) + // createTidbTestSuite create an inner connection, so wait the previous connection closed + require.NoError(t, logs.waitEvent(extension.ConnDisconnected)) // test for login success logs.reset() @@ -2828,6 +2830,7 @@ func TestExtensionConnEvent(t *testing.T) { }() var expectedConn2 variable.ConnectionInfo + require.NoError(t, logs.waitEvent(extension.ConnHandshakeAccepted)) logs.check(func() { require.Equal(t, []extension.ConnEventTp{ extension.ConnConnected, @@ -2861,7 +2864,7 @@ func TestExtensionConnEvent(t *testing.T) { require.NoError(t, conn.Close()) require.NoError(t, db.Close()) - require.NoError(t, logs.waitConnDisconnected()) + require.NoError(t, logs.waitEvent(extension.ConnDisconnected)) logs.check(func() { require.Equal(t, 3, len(logs.infos)) require.Equal(t, 1, len(logs.infos[2].ActiveRoles)) @@ -2889,6 +2892,7 @@ func TestExtensionConnEvent(t *testing.T) { _, err = db.Conn(context.Background()) require.Error(t, err) + require.NoError(t, logs.waitEvent(extension.ConnDisconnected)) logs.check(func() { require.Equal(t, []extension.ConnEventTp{ extension.ConnConnected, @@ -2914,3 +2918,72 @@ func TestExtensionConnEvent(t *testing.T) { require.Equal(t, expectedConn2, *(logs.infos[1].ConnectionInfo)) }) } + +func TestSandBoxMode(t *testing.T) { + ts := createTidbTestSuite(t) + qctx, err := ts.tidbdrv.OpenCtx(uint64(0), 0, uint8(tmysql.DefaultCollationID), "test", nil, nil) + require.NoError(t, err) + _, err = Execute(context.Background(), qctx, "create user testuser;") + require.NoError(t, err) + qctx.Session.GetSessionVars().User = &auth.UserIdentity{Username: "testuser", AuthUsername: "testuser", AuthHostname: "%"} + + alterPwdStmts := []string{ + "set password = '1234';", + "alter user testuser identified by '1234';", + "alter user current_user() identified by '1234';", + } + + for _, alterPwdStmt := range alterPwdStmts { + require.False(t, qctx.Session.InSandBoxMode()) + _, err = Execute(context.Background(), qctx, "select 1;") + require.NoError(t, err) + + qctx.Session.EnableSandBoxMode() + require.True(t, qctx.Session.InSandBoxMode()) + _, err = Execute(context.Background(), qctx, "select 1;") + require.Error(t, err) + _, err = Execute(context.Background(), qctx, "alter user testuser identified with 'mysql_native_password';") + require.Error(t, err) + _, err = Execute(context.Background(), qctx, alterPwdStmt) + require.NoError(t, err) + _, err = Execute(context.Background(), qctx, "select 1;") + require.NoError(t, err) + } +} + +// See: https://github.com/pingcap/tidb/issues/40979 +// Reusing memory of `chunk.Chunk` may cause some systems variable's memory value to be modified unexpectedly. +func TestChunkReuseCorruptSysVarString(t *testing.T) { + ts := createTidbTestSuite(t) + + db, err := sql.Open("mysql", ts.getDSN()) + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + defer func() { + require.NoError(t, conn.Close()) + }() + + rs, err := conn.QueryContext(context.Background(), "show tables in test") + ts.Rows(t, rs) + + _, err = conn.ExecContext(context.Background(), "set @@time_zone=(select 'Asia/Shanghai')") + require.NoError(t, err) + + rs, err = conn.QueryContext(context.Background(), "select TIDB_TABLE_ID from information_schema.tables where TABLE_SCHEMA='aaaa'") + ts.Rows(t, rs) + + rs, err = conn.QueryContext(context.Background(), "select @@time_zone") + require.NoError(t, err) + defer func() { + require.NoError(t, rs.Close()) + }() + + rows := ts.Rows(t, rs) + require.Equal(t, 1, len(rows)) + require.Equal(t, "Asia/Shanghai", rows[0]) +} diff --git a/server/util_test.go b/server/util_test.go index a335d88c4ef42..1ee2d34dd6b2c 100644 --- a/server/util_test.go +++ b/server/util_test.go @@ -185,7 +185,7 @@ func TestDumpTextValue(t *testing.T) { require.NoError(t, err) sc.TimeZone = losAngelesTz - time, err := types.ParseTime(sc, "2017-01-05 23:59:59.575601", mysql.TypeDatetime, 0) + time, err := types.ParseTime(sc, "2017-01-05 23:59:59.575601", mysql.TypeDatetime, 0, nil) require.NoError(t, err) d.SetMysqlTime(time) columns[0].Type = mysql.TypeDatetime diff --git a/session/BUILD.bazel b/session/BUILD.bazel index 2a79502bf985e..2af8f62b74fa9 100644 --- a/session/BUILD.bazel +++ b/session/BUILD.bazel @@ -6,7 +6,6 @@ go_library( "advisory_locks.go", "bootstrap.go", "nontransactional.go", - "schema_amender.go", "session.go", "tidb.go", "txn.go", @@ -65,6 +64,7 @@ go_library( "//table/temptable", "//tablecodec", "//telemetry", + "//ttl/ttlworker", "//types", "//types/parser_driver", "//util", @@ -72,23 +72,24 @@ go_library( "//util/collate", "//util/dbterror", "//util/execdetails", + "//util/intest", "//util/kvcache", "//util/logutil", "//util/logutil/consistency", "//util/mathutil", "//util/memory", "//util/parser", - "//util/rowcodec", "//util/sem", "//util/sli", "//util/sqlexec", + "//util/syncutil", "//util/tableutil", "//util/timeutil", "//util/topsql", "//util/topsql/state", "//util/topsql/stmtstats", + "//util/tracing", "@com_github_ngaut_pools//:pools", - "@com_github_opentracing_opentracing_go//:opentracing-go", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/kvrpcpb", @@ -98,7 +99,6 @@ go_library( "@com_github_tikv_client_go_v2//kv", "@com_github_tikv_client_go_v2//oracle", "@com_github_tikv_client_go_v2//tikv", - "@com_github_tikv_client_go_v2//txnkv/transaction", "@com_github_tikv_client_go_v2//util", "@io_etcd_go_etcd_client_v3//concurrency", "@org_uber_go_zap//:zap", @@ -107,7 +107,7 @@ go_library( go_test( name = "session_test", - timeout = "short", + timeout = "moderate", srcs = [ "bench_test.go", "bootstrap_test.go", @@ -116,7 +116,6 @@ go_test( "index_usage_sync_lease_test.go", "main_test.go", "nontransactional_test.go", - "schema_amender_test.go", "schema_test.go", "session_test.go", "tidb_test.go", @@ -127,6 +126,7 @@ go_test( race = "on", shard_count = 50, deps = [ + "//autoid_service", "//bindinfo", "//config", "//ddl", @@ -136,19 +136,17 @@ go_test( "//expression", "//kv", "//meta", + "//metrics", "//parser/ast", "//parser/auth", "//parser/model", - "//parser/mysql", "//parser/terror", "//planner/core", "//server", "//sessionctx", "//sessionctx/variable", - "//sessiontxn", "//statistics", "//store/mockstore", - "//table", "//tablecodec", "//telemetry", "//testkit", @@ -162,17 +160,15 @@ go_test( "//util/chunk", "//util/collate", "//util/logutil", - "//util/rowcodec", "//util/sqlexec", "@com_github_pingcap_failpoint//:failpoint", - "@com_github_pingcap_kvproto//pkg/kvrpcpb", "@com_github_pingcap_log//:log", + "@com_github_prometheus_client_golang//prometheus", + "@com_github_prometheus_client_model//go", "@com_github_stretchr_testify//require", "@com_github_tikv_client_go_v2//testutils", "@com_github_tikv_client_go_v2//tikv", - "@com_github_tikv_client_go_v2//txnkv/transaction", "@com_github_tikv_client_go_v2//util", - "@org_golang_x_exp//slices", "@org_uber_go_atomic//:atomic", "@org_uber_go_goleak//:goleak", "@org_uber_go_zap//:zap", diff --git a/session/bench_test.go b/session/bench_test.go index 742f63aa00f01..04c86b9227f8d 100644 --- a/session/bench_test.go +++ b/session/bench_test.go @@ -24,6 +24,7 @@ import ( "time" "github.com/pingcap/log" + _ "github.com/pingcap/tidb/autoid_service" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor" @@ -1855,6 +1856,22 @@ func BenchmarkCompileStmt(b *testing.B) { b.StopTimer() } +func BenchmarkAutoIncrement(b *testing.B) { + se, do, st := prepareBenchSession() + defer func() { + se.Close() + do.Close() + st.Close() + }() + mustExecute(se, "create table auto_inc (id int unsigned key nonclustered auto_increment) shard_row_id_bits=4 auto_id_cache 1;") + mustExecute(se, "set @@tidb_enable_mutation_checker = false") + b.ResetTimer() + for i := 0; i < b.N; i++ { + mustExecute(se, "insert into auto_inc values ()") + } + b.StopTimer() +} + // TestBenchDaily collects the daily benchmark test result and generates a json output file. // The format of the json output is described by the BenchOutput. // Used by this command in the Makefile @@ -1887,5 +1904,6 @@ func TestBenchDaily(t *testing.T) { BenchmarkHashPartitionPruningMultiSelect, BenchmarkInsertIntoSelect, BenchmarkCompileStmt, + BenchmarkAutoIncrement, ) } diff --git a/session/bootstrap.go b/session/bootstrap.go index 08bf0293db72c..69a5345e40791 100644 --- a/session/bootstrap.go +++ b/session/bootstrap.go @@ -21,15 +21,15 @@ package session import ( "context" "encoding/hex" - "flag" "fmt" + "io/ioutil" osuser "os/user" - "runtime/debug" "strconv" "strings" "time" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/tidb/bindinfo" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" @@ -37,6 +37,7 @@ import ( "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/owner" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/auth" @@ -49,6 +50,7 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/dbterror" + "github.com/pingcap/tidb/util/intest" "github.com/pingcap/tidb/util/logutil" utilparser "github.com/pingcap/tidb/util/parser" "github.com/pingcap/tidb/util/sqlexec" @@ -59,6 +61,10 @@ import ( const ( // CreateUserTable is the SQL statement creates User table in system db. + // WARNING: There are some limitations on altering the schema of mysql.user table. + // Adding columns that are nullable or have default values is permitted. + // But operations like dropping or renaming columns may break the compatibility with BR. + // REFERENCE ISSUE: https://github.com/pingcap/tidb/issues/38785 CreateUserTable = `CREATE TABLE IF NOT EXISTS mysql.user ( Host CHAR(255), User CHAR(32), @@ -97,8 +103,13 @@ const ( FILE_priv ENUM('N','Y') NOT NULL DEFAULT 'N', Config_priv ENUM('N','Y') NOT NULL DEFAULT 'N', Create_Tablespace_Priv ENUM('N','Y') NOT NULL DEFAULT 'N', + Password_reuse_history smallint unsigned DEFAULT NULL, + Password_reuse_time smallint unsigned DEFAULT NULL, User_attributes json, Token_issuer VARCHAR(255), + Password_expired ENUM('N','Y') NOT NULL DEFAULT 'N', + Password_last_changed TIMESTAMP DEFAULT CURRENT_TIMESTAMP(), + Password_lifetime SMALLINT UNSIGNED DEFAULT NULL, PRIMARY KEY (Host, User));` // CreateGlobalPrivTable is the SQL statement creates Global scope privilege table in system db. CreateGlobalPrivTable = "CREATE TABLE IF NOT EXISTS mysql.global_priv (" + @@ -264,6 +275,8 @@ const ( charset TEXT NOT NULL, collation TEXT NOT NULL, source VARCHAR(10) NOT NULL DEFAULT 'unknown', + sql_digest varchar(64), + plan_digest varchar(64), INDEX sql_index(original_sql(700),default_db(68)) COMMENT "accelerate the speed when add global binding query", INDEX time_index(update_time) COMMENT "accelerate the speed when querying with last update time" ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;` @@ -400,6 +413,7 @@ const ( modify_count bigint(64) NOT NULL, count bigint(64) NOT NULL, version bigint(64) NOT NULL comment 'stats version which corresponding to stats:version in EXPLAIN', + source varchar(40) NOT NULL, create_time datetime(6) NOT NULL, UNIQUE KEY table_version (table_id, version), KEY table_create_time (table_id, create_time) @@ -428,7 +442,19 @@ const ( );` // CreateMDLView is a view about metadata locks. CreateMDLView = `CREATE OR REPLACE VIEW mysql.tidb_mdl_view as ( - select JOB_ID, DB_NAME, TABLE_NAME, QUERY, SESSION_ID, TxnStart, TIDB_DECODE_SQL_DIGESTS(ALL_SQL_DIGESTS, 4096) AS SQL_DIGESTS from information_schema.ddl_jobs, information_schema.CLUSTER_TIDB_TRX, information_schema.CLUSTER_PROCESSLIST where ddl_jobs.STATE = 'running' and find_in_set(ddl_jobs.table_id, CLUSTER_TIDB_TRX.RELATED_TABLE_IDS) and CLUSTER_TIDB_TRX.SESSION_ID=CLUSTER_PROCESSLIST.ID + SELECT job_id, + db_name, + table_name, + query, + session_id, + txnstart, + tidb_decode_sql_digests(all_sql_digests, 4096) AS SQL_DIGESTS + FROM information_schema.ddl_jobs, + information_schema.cluster_tidb_trx, + information_schema.cluster_processlist + WHERE (ddl_jobs.state != 'synced' and ddl_jobs.state != 'cancelled') + AND Find_in_set(ddl_jobs.table_id, cluster_tidb_trx.related_table_ids) + AND cluster_tidb_trx.session_id = cluster_processlist.id );` // CreatePlanReplayerStatusTable is a table about plan replayer status @@ -447,6 +473,7 @@ const ( plan_digest VARCHAR(128) NOT NULL, update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (sql_digest,plan_digest));` + // CreateStatsTableLocked stores the locked tables CreateStatsTableLocked = `CREATE TABLE IF NOT EXISTS mysql.stats_table_locked( table_id bigint(64) NOT NULL, @@ -454,11 +481,84 @@ const ( count bigint(64) NOT NULL DEFAULT 0, version bigint(64) UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (table_id));` + + // CreatePasswordHistory is a table save history passwd. + CreatePasswordHistory = `CREATE TABLE IF NOT EXISTS mysql.password_history ( + Host char(255) NOT NULL DEFAULT '', + User char(32) NOT NULL DEFAULT '', + Password_timestamp timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + Password text, + PRIMARY KEY (Host,User,Password_timestamp ) + ) COMMENT='Password history for user accounts' ` + + // CreateTTLTableStatus is a table about TTL job schedule + CreateTTLTableStatus = `CREATE TABLE IF NOT EXISTS mysql.tidb_ttl_table_status ( + table_id bigint(64) PRIMARY KEY, + parent_table_id bigint(64), + table_statistics text DEFAULT NULL, + last_job_id varchar(64) DEFAULT NULL, + last_job_start_time timestamp NULL DEFAULT NULL, + last_job_finish_time timestamp NULL DEFAULT NULL, + last_job_ttl_expire timestamp NULL DEFAULT NULL, + last_job_summary text DEFAULT NULL, + current_job_id varchar(64) DEFAULT NULL, + current_job_owner_id varchar(64) DEFAULT NULL, + current_job_owner_addr varchar(256) DEFAULT NULL, + current_job_owner_hb_time timestamp, + current_job_start_time timestamp NULL DEFAULT NULL, + current_job_ttl_expire timestamp NULL DEFAULT NULL, + current_job_state text DEFAULT NULL, + current_job_status varchar(64) DEFAULT NULL, + current_job_status_update_time timestamp NULL DEFAULT NULL);` + + // CreateTTLTask is a table about parallel ttl tasks + CreateTTLTask = `CREATE TABLE IF NOT EXISTS mysql.tidb_ttl_task ( + job_id varchar(64) NOT NULL, + table_id bigint(64) NOT NULL, + scan_id int NOT NULL, + scan_range_start BLOB, + scan_range_end BLOB, + expire_time timestamp NOT NULL, + owner_id varchar(64) DEFAULT NULL, + owner_addr varchar(64) DEFAULT NULL, + owner_hb_time timestamp DEFAULT NULL, + status varchar(64) DEFAULT 'waiting', + status_update_time timestamp NULL DEFAULT NULL, + state text, + created_time timestamp NOT NULL, + primary key(job_id, scan_id), + key(created_time));` + + // CreateTTLJobHistory is a table that stores ttl job's history + CreateTTLJobHistory = `CREATE TABLE IF NOT EXISTS mysql.tidb_ttl_job_history ( + job_id varchar(64) PRIMARY KEY, + table_id bigint(64) NOT NULL, + parent_table_id bigint(64) NOT NULL, + table_schema varchar(64) NOT NULL, + table_name varchar(64) NOT NULL, + partition_name varchar(64) DEFAULT NULL, + create_time timestamp NOT NULL, + finish_time timestamp NOT NULL, + ttl_expire timestamp NOT NULL, + summary_text text, + expired_rows bigint(64) DEFAULT NULL, + deleted_rows bigint(64) DEFAULT NULL, + error_delete_rows bigint(64) DEFAULT NULL, + status varchar(64) NOT NULL, + key(table_schema, table_name, create_time), + key(parent_table_id, create_time), + key(create_time) + );` ) // bootstrap initiates system DB for a store. func bootstrap(s Session) { startTime := time.Now() + err := InitMDLVariableForBootstrap(s.GetStore()) + if err != nil { + logutil.BgLogger().Fatal("init metadata lock error", + zap.Error(err)) + } dom := domain.GetDomain(s) for { b, err := checkBootstrapped(s) @@ -478,6 +578,7 @@ func bootstrap(s Session) { if dom.DDL().OwnerManager().IsOwner() { doDDLWorks(s) doDMLWorks(s) + runBootstrapSQLFile = true logutil.BgLogger().Info("bootstrap successful", zap.Duration("take time", time.Since(startTime))) return @@ -674,15 +775,37 @@ const ( version102 = 102 // version103 adds the tables mysql.stats_table_locked version103 = 103 + // version104 add `sql_digest` and `plan_digest` to `bind_info` + version104 = 104 + // version105 insert "tidb_cost_model_version|1" to mysql.GLOBAL_VARIABLES if there is no tidb_cost_model_version. + // This will only happens when we upgrade a cluster before 6.0. + version105 = 105 + // version106 add mysql.password_history, and Password_reuse_history, Password_reuse_time into mysql.user. + version106 = 106 + // version107 add columns related to password expiration into mysql.user + version107 = 107 + // version108 adds the table tidb_ttl_table_status + version108 = 108 + // version109 add column source to mysql.stats_meta_history + version109 = 109 + // version110 sets tidb_enable_gc_aware_memory_track to off when a cluster upgrades from some version lower than v6.5.0. + version110 = 110 + // version111 adds the table tidb_ttl_task and tidb_ttl_job_history + version111 = 111 + // version112 modifies the view tidb_mdl_view + version112 = 112 ) // currentBootstrapVersion is defined as a variable, so we can modify its value for testing. // please make sure this is the largest version -var currentBootstrapVersion int64 = version103 +var currentBootstrapVersion int64 = version112 // DDL owner key's expired time is ManagerSessionTTL seconds, we should wait the time and give more time to have a chance to finish it. var internalSQLTimeout = owner.ManagerSessionTTL + 15 +// whether to run the sql file in bootstrap. +var runBootstrapSQLFile = false + var ( bootstrapVersion = []func(Session, int64){ upgradeToVer2, @@ -786,6 +909,15 @@ var ( upgradeToVer101, upgradeToVer102, upgradeToVer103, + upgradeToVer104, + upgradeToVer105, + upgradeToVer106, + upgradeToVer107, + upgradeToVer108, + upgradeToVer109, + upgradeToVer110, + upgradeToVer111, + upgradeToVer112, } ) @@ -857,7 +989,7 @@ func upgrade(s Session) { if ver < version92 { useConcurrentDDL, err := checkOwnerVersion(context.Background(), domain.GetDomain(s)) if err != nil { - logutil.BgLogger().Fatal("[Upgrade] upgrade failed", zap.Error(err)) + logutil.BgLogger().Fatal("[upgrade] upgrade failed", zap.Error(err)) } if !useConcurrentDDL { // Use another variable DDLForce2Queue but not EnableConcurrentDDL since in upgrade it may set global variable, the initial step will @@ -866,12 +998,19 @@ func upgrade(s Session) { } } // Do upgrade works then update bootstrap version. - needEnableMdl := upgradeToVer99Before(s, ver) + isNull, err := InitMDLVariableForUpgrade(s.GetStore()) + if err != nil { + logutil.BgLogger().Fatal("[upgrade] init metadata lock failed", zap.Error(err)) + } + + if isNull { + upgradeToVer99Before(s) + } for _, upgrade := range bootstrapVersion { upgrade(s, ver) } - if needEnableMdl { - upgradeToVer99After(s, ver) + if isNull { + upgradeToVer99After(s) } variable.DDLForce2Queue.Store(false) @@ -879,11 +1018,6 @@ func upgrade(s Session) { ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBootstrap) _, err = s.ExecuteInternal(ctx, "COMMIT") - if err == nil && ver <= version92 { - logutil.BgLogger().Info("start migrate DDLs") - err = domain.GetDomain(s).DDL().MoveJobFromQueue2Table(true) - } - if err != nil { sleepTime := 1 * time.Second logutil.BgLogger().Info("update bootstrap ver failed", @@ -898,7 +1032,7 @@ func upgrade(s Session) { // It is already bootstrapped/upgraded by a higher version TiDB server. return } - logutil.BgLogger().Fatal("[Upgrade] upgrade failed", + logutil.BgLogger().Fatal("[upgrade] upgrade failed", zap.Int64("from", ver), zap.Int64("to", currentBootstrapVersion), zap.Error(err)) @@ -1552,7 +1686,8 @@ func initBindInfoTable(s Session) { } func insertBuiltinBindInfoRow(s Session) { - mustExecute(s, `INSERT HIGH_PRIORITY INTO mysql.bind_info VALUES (%?, %?, "mysql", %?, "0000-00-00 00:00:00", "0000-00-00 00:00:00", "", "", %?)`, + mustExecute(s, `INSERT HIGH_PRIORITY INTO mysql.bind_info(original_sql, bind_sql, default_db, status, create_time, update_time, charset, collation, source) + VALUES (%?, %?, "mysql", %?, "0000-00-00 00:00:00", "0000-00-00 00:00:00", "", "", %?)`, bindinfo.BuiltinPseudoSQL4BindLock, bindinfo.BuiltinPseudoSQL4BindLock, bindinfo.Builtin, bindinfo.Builtin, ) } @@ -2020,6 +2155,30 @@ func upgradeToVer98(s Session, ver int64) { doReentrantDDL(s, "ALTER TABLE mysql.user ADD COLUMN IF NOT EXISTS `Token_issuer` varchar(255)") } +func upgradeToVer99Before(s Session) { + mustExecute(s, "INSERT HIGH_PRIORITY IGNORE INTO %n.%n VALUES (%?, %?);", + mysql.SystemDB, mysql.GlobalVariablesTable, variable.TiDBEnableMDL, 0) +} + +func upgradeToVer99After(s Session) { + sql := fmt.Sprintf("UPDATE HIGH_PRIORITY %[1]s.%[2]s SET VARIABLE_VALUE = %[4]d WHERE VARIABLE_NAME = '%[3]s'", + mysql.SystemDB, mysql.GlobalVariablesTable, variable.TiDBEnableMDL, 1) + mustExecute(s, sql) + err := kv.RunInNewTxn(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), s.GetStore(), true, func(ctx context.Context, txn kv.Transaction) error { + t := meta.NewMeta(txn) + return t.SetMetadataLock(true) + }) + terror.MustNil(err) +} + +func upgradeToVer100(s Session, ver int64) { + if ver >= version100 { + return + } + valStr := strconv.Itoa(int(config.GetGlobalConfig().Performance.ServerMemoryQuota)) + importConfigOption(s, "performance.server-memory-quota", variable.TiDBServerMemoryLimit, valStr) +} + func upgradeToVer101(s Session, ver int64) { if ver >= version101 { return @@ -2041,43 +2200,89 @@ func upgradeToVer103(s Session, ver int64) { doReentrantDDL(s, CreateStatsTableLocked) } -func upgradeToVer99Before(s Session, ver int64) bool { - if ver >= version99 { - return false +func upgradeToVer104(s Session, ver int64) { + if ver >= version104 { + return + } + + doReentrantDDL(s, "ALTER TABLE mysql.bind_info ADD COLUMN IF NOT EXISTS `sql_digest` varchar(64)") + doReentrantDDL(s, "ALTER TABLE mysql.bind_info ADD COLUMN IF NOT EXISTS `plan_digest` varchar(64)") +} + +// For users that upgrade TiDB from a pre-6.0 version, we want to disable tidb cost model2 by default to keep plans unchanged. +func upgradeToVer105(s Session, ver int64) { + if ver >= version105 { + return } - // Check if tidb_enable_metadata_lock exists in mysql.GLOBAL_VARIABLES. - // If not, insert "tidb_enable_metadata_lock | 0" since concurrent DDL may not be enabled. ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBootstrap) rs, err := s.ExecuteInternal(ctx, "SELECT VARIABLE_VALUE FROM %n.%n WHERE VARIABLE_NAME=%?;", - mysql.SystemDB, mysql.GlobalVariablesTable, variable.TiDBEnableMDL) + mysql.SystemDB, mysql.GlobalVariablesTable, variable.TiDBCostModelVersion) terror.MustNil(err) req := rs.NewChunk(nil) err = rs.Next(ctx, req) terror.MustNil(err) if req.NumRows() != 0 { - return false + return } mustExecute(s, "INSERT HIGH_PRIORITY IGNORE INTO %n.%n VALUES (%?, %?);", - mysql.SystemDB, mysql.GlobalVariablesTable, variable.TiDBEnableMDL, 0) - return true + mysql.SystemDB, mysql.GlobalVariablesTable, variable.TiDBCostModelVersion, "1") } -func upgradeToVer99After(s Session, ver int64) { - if ver >= version99 { +func upgradeToVer106(s Session, ver int64) { + if ver >= version106 { return } - sql := fmt.Sprintf("UPDATE HIGH_PRIORITY %[1]s.%[2]s SET VARIABLE_VALUE = %[4]d WHERE VARIABLE_NAME = '%[3]s'", - mysql.SystemDB, mysql.GlobalVariablesTable, variable.TiDBEnableMDL, 1) - mustExecute(s, sql) + doReentrantDDL(s, CreatePasswordHistory) + doReentrantDDL(s, "Alter table mysql.user add COLUMN IF NOT EXISTS `Password_reuse_history` smallint unsigned DEFAULT NULL AFTER `Create_Tablespace_Priv` ") + doReentrantDDL(s, "Alter table mysql.user add COLUMN IF NOT EXISTS `Password_reuse_time` smallint unsigned DEFAULT NULL AFTER `Password_reuse_history`") } -func upgradeToVer100(s Session, ver int64) { - if ver >= version100 { +func upgradeToVer107(s Session, ver int64) { + if ver >= version107 { return } - valStr := strconv.Itoa(int(config.GetGlobalConfig().Performance.ServerMemoryQuota)) - importConfigOption(s, "performance.server-memory-quota", variable.TiDBServerMemoryLimit, valStr) + doReentrantDDL(s, "ALTER TABLE mysql.user ADD COLUMN IF NOT EXISTS `Password_expired` ENUM('N','Y') NOT NULL DEFAULT 'N'") + doReentrantDDL(s, "ALTER TABLE mysql.user ADD COLUMN IF NOT EXISTS `Password_last_changed` TIMESTAMP DEFAULT CURRENT_TIMESTAMP()") + doReentrantDDL(s, "ALTER TABLE mysql.user ADD COLUMN IF NOT EXISTS `Password_lifetime` SMALLINT UNSIGNED DEFAULT NULL") +} + +func upgradeToVer108(s Session, ver int64) { + if ver >= version108 { + return + } + doReentrantDDL(s, CreateTTLTableStatus) +} + +func upgradeToVer109(s Session, ver int64) { + if ver >= version109 { + return + } + doReentrantDDL(s, "ALTER TABLE mysql.stats_meta_history ADD COLUMN IF NOT EXISTS `source` varchar(40) NOT NULL after `version`;") +} + +// For users that upgrade TiDB from a 6.2-6.4 version, we want to disable tidb gc_aware_memory_track by default. +func upgradeToVer110(s Session, ver int64) { + if ver >= version110 { + return + } + mustExecute(s, "REPLACE HIGH_PRIORITY INTO %n.%n VALUES (%?, %?);", + mysql.SystemDB, mysql.GlobalVariablesTable, variable.TiDBEnableGCAwareMemoryTrack, 0) +} + +func upgradeToVer111(s Session, ver int64) { + if ver >= version111 { + return + } + doReentrantDDL(s, CreateTTLTask) + doReentrantDDL(s, CreateTTLJobHistory) +} + +func upgradeToVer112(s Session, ver int64) { + if ver >= version112 { + return + } + doReentrantDDL(s, CreateMDLView) } func writeOOMAction(s Session) { @@ -2115,6 +2320,8 @@ func doDDLWorks(s Session) { mustExecute(s, "CREATE DATABASE IF NOT EXISTS %n", mysql.SystemDB) // Create user table. mustExecute(s, CreateUserTable) + // Create password history. + mustExecute(s, CreatePasswordHistory) // Create privilege tables. mustExecute(s, CreateGlobalPrivTable) mustExecute(s, CreateDBPrivTable) @@ -2182,12 +2389,44 @@ func doDDLWorks(s Session) { mustExecute(s, CreatePlanReplayerTaskTable) // Create stats_meta_table_locked table mustExecute(s, CreateStatsTableLocked) -} - -// inTestSuite checks if we are bootstrapping in the context of tests. -// There are some historical differences in behavior between tests and non-tests. -func inTestSuite() bool { - return flag.Lookup("test.v") != nil || flag.Lookup("check.v") != nil + // Create tidb_ttl_table_status table + mustExecute(s, CreateTTLTableStatus) + // Create tidb_ttl_task table + mustExecute(s, CreateTTLTask) + // Create tidb_ttl_job_history table + mustExecute(s, CreateTTLJobHistory) +} + +// doBootstrapSQLFile executes SQL commands in a file as the last stage of bootstrap. +// It is useful for setting the initial value of GLOBAL variables. +func doBootstrapSQLFile(s Session) { + sqlFile := config.GetGlobalConfig().InitializeSQLFile + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBootstrap) + if sqlFile == "" { + return + } + logutil.BgLogger().Info("executing -initialize-sql-file", zap.String("file", sqlFile)) + b, err := ioutil.ReadFile(sqlFile) //nolint:gosec + if err != nil { + logutil.BgLogger().Fatal("unable to read InitializeSQLFile", zap.Error(err)) + } + stmts, err := s.Parse(ctx, string(b)) + if err != nil { + logutil.BgLogger().Fatal("unable to parse InitializeSQLFile", zap.Error(err)) + } + for _, stmt := range stmts { + rs, err := s.ExecuteStmt(ctx, stmt) + if err != nil { + logutil.BgLogger().Warn("InitializeSQLFile error", zap.Error(err)) + } + if rs != nil { + // I don't believe we need to drain the result-set in bootstrap mode + // but if required we can do this here in future. + if err := rs.Close(); err != nil { + logutil.BgLogger().Fatal("unable to close result", zap.Error(err)) + } + } + } } // doDMLWorks executes DML statements in bootstrap stage. @@ -2202,10 +2441,14 @@ func doDMLWorks(s Session) { if err != nil { logutil.BgLogger().Fatal("failed to read current user. unable to secure bootstrap.", zap.Error(err)) } - mustExecute(s, `INSERT HIGH_PRIORITY INTO mysql.user VALUES + mustExecute(s, `INSERT HIGH_PRIORITY INTO mysql.user (Host,User,authentication_string,plugin,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Process_priv,Grant_priv,References_priv,Alter_priv,Show_db_priv, + Super_priv,Create_tmp_table_priv,Lock_tables_priv,Execute_priv,Create_view_priv,Show_view_priv,Create_routine_priv,Alter_routine_priv,Index_priv,Create_user_priv,Event_priv,Repl_slave_priv,Repl_client_priv,Trigger_priv,Create_role_priv,Drop_role_priv,Account_locked, + Shutdown_priv,Reload_priv,FILE_priv,Config_priv,Create_Tablespace_Priv,User_attributes,Token_issuer) VALUES ("localhost", "root", %?, "auth_socket", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "Y", "Y", "Y", "Y", null, "")`, u.Username) } else { - mustExecute(s, `INSERT HIGH_PRIORITY INTO mysql.user VALUES + mustExecute(s, `INSERT HIGH_PRIORITY INTO mysql.user (Host,User,authentication_string,plugin,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Process_priv,Grant_priv,References_priv,Alter_priv,Show_db_priv, + Super_priv,Create_tmp_table_priv,Lock_tables_priv,Execute_priv,Create_view_priv,Show_view_priv,Create_routine_priv,Alter_routine_priv,Index_priv,Create_user_priv,Event_priv,Repl_slave_priv,Repl_client_priv,Trigger_priv,Create_role_priv,Drop_role_priv,Account_locked, + Shutdown_priv,Reload_priv,FILE_priv,Config_priv,Create_Tablespace_Priv,User_attributes,Token_issuer) VALUES ("%", "root", "", "mysql_native_password", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "Y", "Y", "Y", "Y", null, "")`) } @@ -2230,11 +2473,11 @@ func doDMLWorks(s Session) { vVal = variable.On } case variable.TiDBMemOOMAction: - if inTestSuite() { + if intest.InTest { vVal = variable.OOMActionLog } case variable.TiDBEnableAutoAnalyze: - if inTestSuite() { + if intest.InTest { vVal = variable.Off } // For the following sysvars, we change the default @@ -2248,6 +2491,13 @@ func doDMLWorks(s Session) { case variable.TiDBEnableMutationChecker: vVal = variable.On } + + failpoint.Inject("enableAggressiveLockingOnBootstrap", func() { + if v.Name == variable.TiDBPessimisticTransactionAggressiveLocking { + vVal = variable.On + } + }) + // sanitize k and vVal value := fmt.Sprintf(`("%s", "%s")`, sqlexec.EscapeString(k), sqlexec.EscapeString(vVal)) values = append(values, value) @@ -2268,8 +2518,6 @@ func doDMLWorks(s Session) { writeNewCollationParameter(s, config.GetGlobalConfig().NewCollationsEnabledOnFirstBootstrap) - writeDefaultExprPushDownBlacklist(s) - writeStmtSummaryVars(s) ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBootstrap) @@ -2296,8 +2544,7 @@ func mustExecute(s Session, sql string, args ...interface{}) { _, err := s.ExecuteInternal(ctx, sql, args...) defer cancel() if err != nil { - debug.PrintStack() - logutil.BgLogger().Fatal("mustExecute error", zap.Error(err)) + logutil.BgLogger().Fatal("mustExecute error", zap.Error(err), zap.Stack("stack")) } } @@ -2316,7 +2563,7 @@ func oldPasswordUpgrade(pass string) (string, error) { // rebuildAllPartitionValueMapAndSorted rebuilds all value map and sorted info for list column partitions with InfoSchema. func rebuildAllPartitionValueMapAndSorted(s *session) { type partitionExpr interface { - PartitionExpr() (*tables.PartitionExpr, error) + PartitionExpr() *tables.PartitionExpr } p := parser.New() @@ -2328,12 +2575,9 @@ func rebuildAllPartitionValueMapAndSorted(s *session) { continue } - pe, err := t.(partitionExpr).PartitionExpr() - if err != nil { - panic("partition table gets partition expression failed") - } + pe := t.(partitionExpr).PartitionExpr() for _, cp := range pe.ColPrunes { - if err = cp.RebuildPartitionValueMapAndSorted(p); err != nil { + if err := cp.RebuildPartitionValueMapAndSorted(p, pi.Definitions); err != nil { logutil.BgLogger().Warn("build list column partition value map and sorted failed") break } diff --git a/session/bootstrap_test.go b/session/bootstrap_test.go index 53076c82a0d85..d126c1f7549f9 100644 --- a/session/bootstrap_test.go +++ b/session/bootstrap_test.go @@ -17,11 +17,14 @@ package session import ( "context" "fmt" + "os" "strconv" "strings" "testing" + "time" "github.com/pingcap/tidb/bindinfo" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/parser/auth" @@ -45,7 +48,7 @@ func TestBootstrap(t *testing.T) { se := createSessionAndSetID(t, store) mustExec(t, se, "set global tidb_txn_mode=''") mustExec(t, se, "use mysql") - r := mustExec(t, se, "select * from user") + r := mustExecToRecodeSet(t, se, "select * from user") require.NotNil(t, r) ctx := context.Background() @@ -55,7 +58,7 @@ func TestBootstrap(t *testing.T) { require.NotEqual(t, 0, req.NumRows()) rows := statistics.RowToDatums(req.GetRow(0), r.Fields()) - match(t, rows, `%`, "root", "", "mysql_native_password", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "Y", "Y", "Y", "Y", nil, "") + match(t, rows, `%`, "root", "", "mysql_native_password", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "Y", "Y", "Y", "Y", nil, nil, nil, "", "N", time.Now(), nil) r.Close() require.NoError(t, se.Auth(&auth.UserIdentity{Username: "root", Hostname: "anyhost"}, []byte(""), []byte(""))) @@ -63,25 +66,21 @@ func TestBootstrap(t *testing.T) { mustExec(t, se, "use test") // Check privilege tables. - rs := mustExec(t, se, "SELECT * from mysql.global_priv") - require.NoError(t, rs.Close()) - rs = mustExec(t, se, "SELECT * from mysql.db") - require.NoError(t, rs.Close()) - rs = mustExec(t, se, "SELECT * from mysql.tables_priv") - require.NoError(t, rs.Close()) - rs = mustExec(t, se, "SELECT * from mysql.columns_priv") - require.NoError(t, rs.Close()) - rs = mustExec(t, se, "SELECT * from mysql.global_grants") - require.NoError(t, rs.Close()) + mustExec(t, se, "SELECT * from mysql.global_priv") + mustExec(t, se, "SELECT * from mysql.db") + mustExec(t, se, "SELECT * from mysql.tables_priv") + mustExec(t, se, "SELECT * from mysql.columns_priv") + mustExec(t, se, "SELECT * from mysql.global_grants") // Check privilege tables. - r = mustExec(t, se, "SELECT COUNT(*) from mysql.global_variables") + r = mustExecToRecodeSet(t, se, "SELECT COUNT(*) from mysql.global_variables") require.NotNil(t, r) req = r.NewChunk(nil) err = r.Next(ctx, req) require.NoError(t, err) require.Equal(t, globalVarsCount(), req.GetRow(0).GetInt64(0)) + require.NoError(t, r.Close()) // Check a storage operations are default autocommit after the second start. mustExec(t, se, "USE test") @@ -98,7 +97,7 @@ func TestBootstrap(t *testing.T) { se, err = CreateSession4Test(store) require.NoError(t, err) mustExec(t, se, "USE test") - r = mustExec(t, se, "select * from t") + r = mustExecToRecodeSet(t, se, "select * from t") require.NotNil(t, r) req = r.NewChunk(nil) @@ -114,6 +113,12 @@ func TestBootstrap(t *testing.T) { se, err = CreateSession4Test(store) require.NoError(t, err) doDMLWorks(se) + r = mustExecToRecodeSet(t, se, "select * from mysql.expr_pushdown_blacklist where name = 'date_add'") + req = r.NewChunk(nil) + err = r.Next(ctx, req) + require.NoError(t, err) + require.Equal(t, 0, req.NumRows()) + se.Close() } func globalVarsCount() int64 { @@ -147,10 +152,12 @@ func TestBootstrapWithError(t *testing.T) { se.txn.init() se.mu.values = make(map[fmt.Stringer]interface{}) se.SetValue(sessionctx.Initing, true) - err := InitDDLJobTables(store) + err := InitDDLJobTables(store, meta.BaseDDLTableVersion) require.NoError(t, err) err = InitMDLTable(store) require.NoError(t, err) + err = InitDDLJobTables(store, meta.BackfillTableVersion) + require.NoError(t, err) dom, err := domap.Get(store) require.NoError(t, err) domain.BindDomain(se, dom) @@ -171,7 +178,7 @@ func TestBootstrapWithError(t *testing.T) { se := createSessionAndSetID(t, store) mustExec(t, se, "USE mysql") - r := mustExec(t, se, `select * from user`) + r := mustExecToRecodeSet(t, se, `select * from user`) req := r.NewChunk(nil) err = r.Next(ctx, req) require.NoError(t, err) @@ -179,20 +186,20 @@ func TestBootstrapWithError(t *testing.T) { row := req.GetRow(0) rows := statistics.RowToDatums(row, r.Fields()) - match(t, rows, `%`, "root", "", "mysql_native_password", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "Y", "Y", "Y", "Y", nil, "") + match(t, rows, `%`, "root", "", "mysql_native_password", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "Y", "Y", "Y", "Y", nil, nil, nil, "", "N", time.Now(), nil) require.NoError(t, r.Close()) mustExec(t, se, "USE test") // Check privilege tables. - mustExec(t, se, "SELECT * from mysql.global_priv").Close() - mustExec(t, se, "SELECT * from mysql.db").Close() - mustExec(t, se, "SELECT * from mysql.tables_priv").Close() - mustExec(t, se, "SELECT * from mysql.columns_priv").Close() + mustExec(t, se, "SELECT * from mysql.global_priv") + mustExec(t, se, "SELECT * from mysql.db") + mustExec(t, se, "SELECT * from mysql.tables_priv") + mustExec(t, se, "SELECT * from mysql.columns_priv") // Check role tables. - mustExec(t, se, "SELECT * from mysql.role_edges").Close() - mustExec(t, se, "SELECT * from mysql.default_roles").Close() + mustExec(t, se, "SELECT * from mysql.role_edges") + mustExec(t, se, "SELECT * from mysql.default_roles") // Check global variables. - r = mustExec(t, se, "SELECT COUNT(*) from mysql.global_variables") + r = mustExecToRecodeSet(t, se, "SELECT COUNT(*) from mysql.global_variables") req = r.NewChunk(nil) err = r.Next(ctx, req) require.NoError(t, err) @@ -200,7 +207,7 @@ func TestBootstrapWithError(t *testing.T) { require.Equal(t, globalVarsCount(), v.GetInt64(0)) require.NoError(t, r.Close()) - r = mustExec(t, se, `SELECT VARIABLE_VALUE from mysql.TiDB where VARIABLE_NAME="bootstrapped"`) + r = mustExecToRecodeSet(t, se, `SELECT VARIABLE_VALUE from mysql.TiDB where VARIABLE_NAME="bootstrapped"`) req = r.NewChunk(nil) err = r.Next(ctx, req) require.NoError(t, err) @@ -209,6 +216,42 @@ func TestBootstrapWithError(t *testing.T) { require.Equal(t, 1, row.Len()) require.Equal(t, []byte("True"), row.GetBytes(0)) require.NoError(t, r.Close()) + + mustExec(t, se, "SELECT * from mysql.tidb_background_subtask") + mustExec(t, se, "SELECT * from mysql.tidb_background_subtask_history") + + // Check tidb_ttl_table_status table + mustExec(t, se, "SELECT * from mysql.tidb_ttl_table_status") +} + +func TestDDLTableCreateBackfillTable(t *testing.T) { + store, dom := createStoreAndBootstrap(t) + defer func() { require.NoError(t, store.Close()) }() + se := createSessionAndSetID(t, store) + + txn, err := store.Begin() + require.NoError(t, err) + m := meta.NewMeta(txn) + ver, err := m.CheckDDLTableVersion() + require.NoError(t, err) + require.GreaterOrEqual(t, ver, meta.BackfillTableVersion) + + // downgrade `mDDLTableVersion` + m.SetDDLTables(meta.MDLTableVersion) + mustExec(t, se, "drop table mysql.tidb_background_subtask") + mustExec(t, se, "drop table mysql.tidb_background_subtask_history") + err = txn.Commit(context.Background()) + require.NoError(t, err) + + // to upgrade session for create ddl related tables + dom.Close() + dom, err = BootstrapSession(store) + require.NoError(t, err) + + se = createSessionAndSetID(t, store) + mustExec(t, se, "select * from mysql.tidb_background_subtask") + mustExec(t, se, "select * from mysql.tidb_background_subtask_history") + dom.Close() } // TestUpgrade tests upgrading @@ -222,7 +265,7 @@ func TestUpgrade(t *testing.T) { mustExec(t, se, "USE mysql") // bootstrap with currentBootstrapVersion - r := mustExec(t, se, `SELECT VARIABLE_VALUE from mysql.TiDB where VARIABLE_NAME="tidb_server_version"`) + r := mustExecToRecodeSet(t, se, `SELECT VARIABLE_VALUE from mysql.TiDB where VARIABLE_NAME="tidb_server_version"`) req := r.NewChunk(nil) err := r.Next(ctx, req) row := req.GetRow(0) @@ -251,7 +294,7 @@ func TestUpgrade(t *testing.T) { mustExec(t, se1, `commit`) unsetStoreBootstrapped(store.UUID()) // Make sure the version is downgraded. - r = mustExec(t, se1, `SELECT VARIABLE_VALUE from mysql.TiDB where VARIABLE_NAME="tidb_server_version"`) + r = mustExecToRecodeSet(t, se1, `SELECT VARIABLE_VALUE from mysql.TiDB where VARIABLE_NAME="tidb_server_version"`) req = r.NewChunk(nil) err = r.Next(ctx, req) require.NoError(t, err) @@ -267,7 +310,7 @@ func TestUpgrade(t *testing.T) { require.NoError(t, err) se2 := createSessionAndSetID(t, store) - r = mustExec(t, se2, `SELECT VARIABLE_VALUE from mysql.TiDB where VARIABLE_NAME="tidb_server_version"`) + r = mustExecToRecodeSet(t, se2, `SELECT VARIABLE_VALUE from mysql.TiDB where VARIABLE_NAME="tidb_server_version"`) req = r.NewChunk(nil) err = r.Next(ctx, req) require.NoError(t, err) @@ -282,7 +325,7 @@ func TestUpgrade(t *testing.T) { require.Equal(t, currentBootstrapVersion, ver) // Verify that 'new_collation_enabled' is false. - r = mustExec(t, se2, fmt.Sprintf(`SELECT VARIABLE_VALUE from mysql.TiDB where VARIABLE_NAME='%s'`, tidbNewCollationEnabled)) + r = mustExecToRecodeSet(t, se2, fmt.Sprintf(`SELECT VARIABLE_VALUE from mysql.TiDB where VARIABLE_NAME='%s'`, tidbNewCollationEnabled)) req = r.NewChunk(nil) err = r.Next(ctx, req) require.NoError(t, err) @@ -320,7 +363,7 @@ func TestIssue17979_1(t *testing.T) { ver, err = getBootstrapVersion(seV4) require.NoError(t, err) require.Equal(t, currentBootstrapVersion, ver) - r := mustExec(t, seV4, "select variable_value from mysql.tidb where variable_name='default_oom_action'") + r := mustExecToRecodeSet(t, seV4, "select variable_value from mysql.tidb where variable_name='default_oom_action'") req := r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) require.Equal(t, variable.OOMActionLog, req.GetRow(0).GetString(0)) @@ -357,7 +400,7 @@ func TestIssue17979_2(t *testing.T) { ver, err = getBootstrapVersion(seV4) require.NoError(t, err) require.Equal(t, currentBootstrapVersion, ver) - r := mustExec(t, seV4, "select variable_value from mysql.tidb where variable_name='default_oom_action'") + r := mustExecToRecodeSet(t, seV4, "select variable_value from mysql.tidb where variable_name='default_oom_action'") req := r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) require.Equal(t, 0, req.NumRows()) @@ -398,12 +441,12 @@ func TestIssue20900_2(t *testing.T) { ver, err = getBootstrapVersion(seV4) require.NoError(t, err) require.Equal(t, currentBootstrapVersion, ver) - r := mustExec(t, seV4, "select @@tidb_mem_quota_query") + r := mustExecToRecodeSet(t, seV4, "select @@tidb_mem_quota_query") req := r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) require.Equal(t, "1073741824", req.GetRow(0).GetString(0)) require.Equal(t, int64(1073741824), seV4.GetSessionVars().MemQuotaQuery) - r = mustExec(t, seV4, "select variable_value from mysql.tidb where variable_name='default_memory_quota_query'") + r = mustExecToRecodeSet(t, seV4, "select variable_value from mysql.tidb where variable_name='default_memory_quota_query'") req = r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) require.Equal(t, 0, req.NumRows()) @@ -465,7 +508,7 @@ func TestStmtSummary(t *testing.T) { defer dom.Close() se := createSessionAndSetID(t, store) - r := mustExec(t, se, "select variable_value from mysql.global_variables where variable_name='tidb_enable_stmt_summary'") + r := mustExecToRecodeSet(t, se, "select variable_value from mysql.global_variables where variable_name='tidb_enable_stmt_summary'") req := r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) row := req.GetRow(0) @@ -515,6 +558,9 @@ func TestUpdateBindInfo(t *testing.T) { defer func() { require.NoError(t, store.Close()) }() defer dom.Close() se := createSessionAndSetID(t, store) + + mustExec(t, se, "alter table mysql.bind_info drop column if exists plan_digest") + mustExec(t, se, "alter table mysql.bind_info drop column if exists sql_digest") for _, bindCase := range bindCases { sql := fmt.Sprintf("insert into mysql.bind_info values('%s', '%s', '%s', 'enabled', '2021-01-04 14:50:58.257', '2021-01-04 14:50:58.257', 'utf8', 'utf8_general_ci', 'manual')", bindCase.originText, @@ -524,7 +570,7 @@ func TestUpdateBindInfo(t *testing.T) { mustExec(t, se, sql) upgradeToVer67(se, version66) - r := mustExec(t, se, `select original_sql, bind_sql, default_db, status from mysql.bind_info where source != 'builtin'`) + r := mustExecToRecodeSet(t, se, `select original_sql, bind_sql, default_db, status from mysql.bind_info where source != 'builtin'`) req := r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) row := req.GetRow(0) @@ -535,7 +581,7 @@ func TestUpdateBindInfo(t *testing.T) { require.NoError(t, r.Close()) sql = fmt.Sprintf("drop global binding for %s", bindCase.deleteText) mustExec(t, se, sql) - r = mustExec(t, se, `select original_sql, bind_sql, status from mysql.bind_info where source != 'builtin'`) + r = mustExecToRecodeSet(t, se, `select original_sql, bind_sql, status from mysql.bind_info where source != 'builtin'`) require.NoError(t, r.Next(ctx, req)) row = req.GetRow(0) require.Equal(t, bindCase.originWithDB, row.GetString(0)) @@ -553,6 +599,9 @@ func TestUpdateDuplicateBindInfo(t *testing.T) { defer func() { require.NoError(t, store.Close()) }() defer dom.Close() se := createSessionAndSetID(t, store) + mustExec(t, se, "alter table mysql.bind_info drop column if exists plan_digest") + mustExec(t, se, "alter table mysql.bind_info drop column if exists sql_digest") + mustExec(t, se, `insert into mysql.bind_info values('select * from t', 'select /*+ use_index(t, idx_a)*/ * from t', 'test', 'enabled', '2021-01-04 14:50:58.257', '2021-01-04 14:50:58.257', 'utf8', 'utf8_general_ci', 'manual')`) // The latest one. mustExec(t, se, `insert into mysql.bind_info values('select * from test . t', 'select /*+ use_index(t, idx_b)*/ * from test.t', 'test', 'enabled', '2021-01-04 14:50:58.257', '2021-01-09 14:50:58.257', 'utf8', 'utf8_general_ci', 'manual')`) @@ -564,7 +613,7 @@ func TestUpdateDuplicateBindInfo(t *testing.T) { upgradeToVer67(se, version66) - r := mustExec(t, se, `select original_sql, bind_sql, default_db, status, create_time from mysql.bind_info where source != 'builtin' order by create_time`) + r := mustExecToRecodeSet(t, se, `select original_sql, bind_sql, default_db, status, create_time from mysql.bind_info where source != 'builtin' order by create_time`) req := r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) require.Equal(t, 3, req.NumRows()) @@ -620,7 +669,7 @@ func TestUpgradeClusteredIndexDefaultValue(t *testing.T) { require.NoError(t, err) require.Equal(t, currentBootstrapVersion, ver) - r := mustExec(t, seV68, `select @@global.tidb_enable_clustered_index, @@session.tidb_enable_clustered_index`) + r := mustExecToRecodeSet(t, seV68, `select @@global.tidb_enable_clustered_index, @@session.tidb_enable_clustered_index`) req := r.NewChunk(nil) require.NoError(t, r.Next(context.Background(), req)) require.Equal(t, 1, req.NumRows()) @@ -657,7 +706,7 @@ func TestUpgradeVersion66(t *testing.T) { ver, err = getBootstrapVersion(seV66) require.NoError(t, err) require.Equal(t, currentBootstrapVersion, ver) - r := mustExec(t, seV66, `select @@global.tidb_track_aggregate_memory_usage, @@session.tidb_track_aggregate_memory_usage`) + r := mustExecToRecodeSet(t, seV66, `select @@global.tidb_track_aggregate_memory_usage, @@session.tidb_track_aggregate_memory_usage`) req := r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) require.Equal(t, 1, req.NumRows()) @@ -707,7 +756,7 @@ func TestUpgradeVersion74(t *testing.T) { ver, err = getBootstrapVersion(seV74) require.NoError(t, err) require.Equal(t, currentBootstrapVersion, ver) - r := mustExec(t, seV74, `SELECT @@global.tidb_stmt_summary_max_stmt_count`) + r := mustExecToRecodeSet(t, seV74, `SELECT @@global.tidb_stmt_summary_max_stmt_count`) req := r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) require.Equal(t, 1, req.NumRows()) @@ -740,7 +789,7 @@ func TestUpgradeVersion75(t *testing.T) { ver, err := getBootstrapVersion(seV74) require.NoError(t, err) require.Equal(t, int64(74), ver) - r := mustExec(t, seV74, `desc mysql.user`) + r := mustExecToRecodeSet(t, seV74, `desc mysql.user`) req := r.NewChunk(nil) row := req.GetRow(0) require.NoError(t, r.Next(ctx, req)) @@ -754,7 +803,7 @@ func TestUpgradeVersion75(t *testing.T) { ver, err = getBootstrapVersion(seV75) require.NoError(t, err) require.Equal(t, currentBootstrapVersion, ver) - r = mustExec(t, seV75, `desc mysql.user`) + r = mustExecToRecodeSet(t, seV75, `desc mysql.user`) req = r.NewChunk(nil) row = req.GetRow(0) require.NoError(t, r.Next(ctx, req)) @@ -836,7 +885,7 @@ func TestAnalyzeVersionUpgradeFrom300To500(t *testing.T) { require.Equal(t, int64(ver300), ver) // We are now in 3.0.0, check tidb_analyze_version should not exist. - res := mustExec(t, seV3, fmt.Sprintf("select * from mysql.GLOBAL_VARIABLES where variable_name='%s'", variable.TiDBAnalyzeVersion)) + res := mustExecToRecodeSet(t, seV3, fmt.Sprintf("select * from mysql.GLOBAL_VARIABLES where variable_name='%s'", variable.TiDBAnalyzeVersion)) chk := res.NewChunk(nil) err = res.Next(ctx, chk) require.NoError(t, err) @@ -851,7 +900,7 @@ func TestAnalyzeVersionUpgradeFrom300To500(t *testing.T) { require.Equal(t, currentBootstrapVersion, ver) // We are now in version no lower than 5.x, tidb_enable_index_merge should be 1. - res = mustExec(t, seCurVer, "select @@tidb_analyze_version") + res = mustExecToRecodeSet(t, seCurVer, "select @@tidb_analyze_version") chk = res.NewChunk(nil) err = res.Next(ctx, chk) require.NoError(t, err) @@ -874,7 +923,7 @@ func TestIndexMergeInNewCluster(t *testing.T) { // In a new created cluster(above 5.4+), tidb_enable_index_merge is 1 by default. mustExec(t, se, "use test;") - r := mustExec(t, se, "select @@tidb_enable_index_merge;") + r := mustExecToRecodeSet(t, se, "select @@tidb_enable_index_merge;") require.NotNil(t, r) ctx := context.Background() @@ -911,7 +960,7 @@ func TestIndexMergeUpgradeFrom300To540(t *testing.T) { require.Equal(t, int64(ver300), ver) // We are now in 3.0.0, check tidb_enable_index_merge shoudle not exist. - res := mustExec(t, seV3, fmt.Sprintf("select * from mysql.GLOBAL_VARIABLES where variable_name='%s'", variable.TiDBEnableIndexMerge)) + res := mustExecToRecodeSet(t, seV3, fmt.Sprintf("select * from mysql.GLOBAL_VARIABLES where variable_name='%s'", variable.TiDBEnableIndexMerge)) chk := res.NewChunk(nil) err = res.Next(ctx, chk) require.NoError(t, err) @@ -926,7 +975,7 @@ func TestIndexMergeUpgradeFrom300To540(t *testing.T) { require.Equal(t, currentBootstrapVersion, ver) // We are now in 5.x, tidb_enable_index_merge should be off. - res = mustExec(t, seCurVer, "select @@tidb_enable_index_merge") + res = mustExecToRecodeSet(t, seCurVer, "select @@tidb_enable_index_merge") chk = res.NewChunk(nil) err = res.Next(ctx, chk) require.NoError(t, err) @@ -962,7 +1011,7 @@ func TestIndexMergeUpgradeFrom400To540(t *testing.T) { require.Equal(t, int64(ver400), ver) // We are now in 4.0.0, tidb_enable_index_merge is off. - res := mustExec(t, seV4, fmt.Sprintf("select * from mysql.GLOBAL_VARIABLES where variable_name='%s'", variable.TiDBEnableIndexMerge)) + res := mustExecToRecodeSet(t, seV4, fmt.Sprintf("select * from mysql.GLOBAL_VARIABLES where variable_name='%s'", variable.TiDBEnableIndexMerge)) chk := res.NewChunk(nil) err = res.Next(ctx, chk) require.NoError(t, err) @@ -988,7 +1037,7 @@ func TestIndexMergeUpgradeFrom400To540(t *testing.T) { require.Equal(t, currentBootstrapVersion, ver) // We are now in 5.x, tidb_enable_index_merge should be on because we enable it in 4.0.0. - res = mustExec(t, seCurVer, "select @@tidb_enable_index_merge") + res = mustExecToRecodeSet(t, seCurVer, "select @@tidb_enable_index_merge") chk = res.NewChunk(nil) err = res.Next(ctx, chk) require.NoError(t, err) @@ -1010,6 +1059,9 @@ func TestUpgradeToVer85(t *testing.T) { defer func() { require.NoError(t, store.Close()) }() defer dom.Close() se := createSessionAndSetID(t, store) + mustExec(t, se, "alter table mysql.bind_info drop column if exists plan_digest") + mustExec(t, se, "alter table mysql.bind_info drop column if exists sql_digest") + mustExec(t, se, `insert into mysql.bind_info values('select * from t', 'select /*+ use_index(t, idx_a)*/ * from t', 'test', 'using', '2021-01-04 14:50:58.257', '2021-01-04 14:50:58.257', 'utf8', 'utf8_general_ci', 'manual')`) mustExec(t, se, `insert into mysql.bind_info values('select * from t1', 'select /*+ use_index(t1, idx_a)*/ * from t1', 'test', 'enabled', '2021-01-05 14:50:58.257', '2021-01-05 14:50:58.257', 'utf8', 'utf8_general_ci', 'manual')`) mustExec(t, se, `insert into mysql.bind_info values('select * from t2', 'select /*+ use_index(t2, idx_a)*/ * from t2', 'test', 'disabled', '2021-01-06 14:50:58.257', '2021-01-06 14:50:58.257', 'utf8', 'utf8_general_ci', 'manual')`) @@ -1017,7 +1069,7 @@ func TestUpgradeToVer85(t *testing.T) { mustExec(t, se, `insert into mysql.bind_info values('select * from t4', 'select /*+ use_index(t4, idx_a)*/ * from t4', 'test', 'invalid', '2021-01-08 14:50:58.257', '2021-01-08 14:50:58.257', 'utf8', 'utf8_general_ci', 'manual')`) upgradeToVer85(se, version84) - r := mustExec(t, se, `select count(*) from mysql.bind_info where status = 'enabled'`) + r := mustExecToRecodeSet(t, se, `select count(*) from mysql.bind_info where status = 'enabled'`) req := r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) require.Equal(t, 1, req.NumRows()) @@ -1028,6 +1080,60 @@ func TestUpgradeToVer85(t *testing.T) { mustExec(t, se, "delete from mysql.bind_info where default_db = 'test'") } +func TestInitializeSQLFile(t *testing.T) { + // We create an initialize-sql-file and then bootstrap the server with it. + // The observed behavior should be that tidb_enable_noop_variables is now + // disabled, and the feature works as expected. + initializeSQLFile, err := os.CreateTemp("", "init.sql") + require.NoError(t, err) + defer func() { + path := initializeSQLFile.Name() + err = initializeSQLFile.Close() + require.NoError(t, err) + err = os.Remove(path) + require.NoError(t, err) + }() + // Implicitly test multi-line init files + _, err = initializeSQLFile.WriteString( + "CREATE DATABASE initsqlfiletest;\n" + + "SET GLOBAL tidb_enable_noop_variables = OFF;\n") + require.NoError(t, err) + + // Create a mock store + // Set the config parameter for initialize sql file + store, err := mockstore.NewMockStore() + require.NoError(t, err) + config.GetGlobalConfig().InitializeSQLFile = initializeSQLFile.Name() + defer func() { + require.NoError(t, store.Close()) + config.GetGlobalConfig().InitializeSQLFile = "" + }() + + // Bootstrap with the InitializeSQLFile config option + dom, err := BootstrapSession(store) + require.NoError(t, err) + defer dom.Close() + se := createSessionAndSetID(t, store) + ctx := context.Background() + r, err := exec(se, `SHOW VARIABLES LIKE 'query_cache_type'`) + require.NoError(t, err) + req := r.NewChunk(nil) + err = r.Next(ctx, req) + require.NoError(t, err) + require.Equal(t, 0, req.NumRows()) // not shown in noopvariables mode + require.NoError(t, r.Close()) + + r, err = exec(se, `SHOW VARIABLES LIKE 'tidb_enable_noop_variables'`) + require.NoError(t, err) + req = r.NewChunk(nil) + err = r.Next(ctx, req) + require.NoError(t, err) + require.Equal(t, 1, req.NumRows()) + row := req.GetRow(0) + require.Equal(t, []byte("OFF"), row.GetBytes(1)) + require.NoError(t, r.Close()) +} + func TestTiDBEnablePagingVariable(t *testing.T) { store, dom := createStoreAndBootstrap(t) se := createSessionAndSetID(t, store) @@ -1038,7 +1144,7 @@ func TestTiDBEnablePagingVariable(t *testing.T) { "select @@global.tidb_enable_paging", "select @@session.tidb_enable_paging", } { - r := mustExec(t, se, sql) + r := mustExecToRecodeSet(t, se, sql) require.NotNil(t, r) req := r.NewChunk(nil) @@ -1080,7 +1186,7 @@ func TestTiDBOptRangeMaxSizeWhenUpgrading(t *testing.T) { require.Equal(t, int64(ver94), ver) // We are now in 6.3.0, check tidb_opt_range_max_size should not exist. - res := mustExec(t, seV630, fmt.Sprintf("select * from mysql.GLOBAL_VARIABLES where variable_name='%s'", variable.TiDBOptRangeMaxSize)) + res := mustExecToRecodeSet(t, seV630, fmt.Sprintf("select * from mysql.GLOBAL_VARIABLES where variable_name='%s'", variable.TiDBOptRangeMaxSize)) chk := res.NewChunk(nil) err = res.Next(ctx, chk) require.NoError(t, err) @@ -1095,7 +1201,7 @@ func TestTiDBOptRangeMaxSizeWhenUpgrading(t *testing.T) { require.Equal(t, currentBootstrapVersion, ver) // We are now in version no lower than v6.4.0, tidb_opt_range_max_size should be 0. - res = mustExec(t, seCurVer, "select @@session.tidb_opt_range_max_size") + res = mustExecToRecodeSet(t, seCurVer, "select @@session.tidb_opt_range_max_size") chk = res.NewChunk(nil) err = res.Next(ctx, chk) require.NoError(t, err) @@ -1104,7 +1210,7 @@ func TestTiDBOptRangeMaxSizeWhenUpgrading(t *testing.T) { require.Equal(t, 1, row.Len()) require.Equal(t, "0", row.GetString(0)) - res = mustExec(t, seCurVer, "select @@global.tidb_opt_range_max_size") + res = mustExecToRecodeSet(t, seCurVer, "select @@global.tidb_opt_range_max_size") chk = res.NewChunk(nil) err = res.Next(ctx, chk) require.NoError(t, err) @@ -1113,3 +1219,201 @@ func TestTiDBOptRangeMaxSizeWhenUpgrading(t *testing.T) { require.Equal(t, 1, row.Len()) require.Equal(t, "0", row.GetString(0)) } + +func TestTiDBCostModelInNewCluster(t *testing.T) { + store, err := mockstore.NewMockStore() + require.NoError(t, err) + // Indicates we are in a new cluster. + require.Equal(t, int64(notBootstrapped), getStoreBootstrapVersion(store)) + dom, err := BootstrapSession(store) + require.NoError(t, err) + defer func() { require.NoError(t, store.Close()) }() + defer dom.Close() + se := createSessionAndSetID(t, store) + + // In a new created cluster(above 6.5+), tidb_cost_model_version is 2 by default. + mustExec(t, se, "use test;") + r := mustExecToRecodeSet(t, se, "select @@tidb_cost_model_version;") + require.NotNil(t, r) + + ctx := context.Background() + chk := r.NewChunk(nil) + err = r.Next(ctx, chk) + require.NoError(t, err) + require.Equal(t, 1, chk.NumRows()) + row := chk.GetRow(0) + require.Equal(t, 1, row.Len()) + require.Equal(t, "2", row.GetString(0)) +} + +func TestTiDBCostModelUpgradeFrom300To650(t *testing.T) { + ctx := context.Background() + store, _ := createStoreAndBootstrap(t) + defer func() { require.NoError(t, store.Close()) }() + + // Upgrade from 3.0.0 to 6.5+. + ver300 := 33 + seV3 := createSessionAndSetID(t, store) + txn, err := store.Begin() + require.NoError(t, err) + m := meta.NewMeta(txn) + err = m.FinishBootstrap(int64(ver300)) + require.NoError(t, err) + err = txn.Commit(context.Background()) + require.NoError(t, err) + mustExec(t, seV3, fmt.Sprintf("update mysql.tidb set variable_value=%d where variable_name='tidb_server_version'", ver300)) + mustExec(t, seV3, fmt.Sprintf("delete from mysql.GLOBAL_VARIABLES where variable_name='%s'", variable.TiDBCostModelVersion)) + mustExec(t, seV3, "commit") + unsetStoreBootstrapped(store.UUID()) + ver, err := getBootstrapVersion(seV3) + require.NoError(t, err) + require.Equal(t, int64(ver300), ver) + + // We are now in 3.0.0, check TiDBCostModelVersion should not exist. + res := mustExecToRecodeSet(t, seV3, fmt.Sprintf("select * from mysql.GLOBAL_VARIABLES where variable_name='%s'", variable.TiDBCostModelVersion)) + chk := res.NewChunk(nil) + err = res.Next(ctx, chk) + require.NoError(t, err) + require.Equal(t, 0, chk.NumRows()) + + domCurVer, err := BootstrapSession(store) + require.NoError(t, err) + defer domCurVer.Close() + seCurVer := createSessionAndSetID(t, store) + ver, err = getBootstrapVersion(seCurVer) + require.NoError(t, err) + require.Equal(t, currentBootstrapVersion, ver) + + // We are now in 6.5+, TiDBCostModelVersion should be 1. + res = mustExecToRecodeSet(t, seCurVer, "select @@tidb_cost_model_version") + chk = res.NewChunk(nil) + err = res.Next(ctx, chk) + require.NoError(t, err) + require.Equal(t, 1, chk.NumRows()) + row := chk.GetRow(0) + require.Equal(t, 1, row.Len()) + require.Equal(t, "1", row.GetString(0)) +} + +func TestTiDBCostModelUpgradeFrom610To650(t *testing.T) { + for i := 0; i < 2; i++ { + func() { + ctx := context.Background() + store, dom := createStoreAndBootstrap(t) + defer func() { require.NoError(t, store.Close()) }() + + // upgrade from 6.1 to 6.5+. + ver61 := 91 + seV61 := createSessionAndSetID(t, store) + txn, err := store.Begin() + require.NoError(t, err) + m := meta.NewMeta(txn) + err = m.FinishBootstrap(int64(ver61)) + require.NoError(t, err) + err = txn.Commit(context.Background()) + require.NoError(t, err) + mustExec(t, seV61, fmt.Sprintf("update mysql.tidb set variable_value=%d where variable_name='tidb_server_version'", ver61)) + mustExec(t, seV61, fmt.Sprintf("update mysql.GLOBAL_VARIABLES set variable_value='%s' where variable_name='%s'", "1", variable.TiDBCostModelVersion)) + mustExec(t, seV61, "commit") + unsetStoreBootstrapped(store.UUID()) + ver, err := getBootstrapVersion(seV61) + require.NoError(t, err) + require.Equal(t, int64(ver61), ver) + + // We are now in 6.1, tidb_cost_model_version is 1. + res := mustExecToRecodeSet(t, seV61, fmt.Sprintf("select * from mysql.GLOBAL_VARIABLES where variable_name='%s'", variable.TiDBCostModelVersion)) + chk := res.NewChunk(nil) + err = res.Next(ctx, chk) + require.NoError(t, err) + require.Equal(t, 1, chk.NumRows()) + row := chk.GetRow(0) + require.Equal(t, 2, row.Len()) + require.Equal(t, "1", row.GetString(1)) + res.Close() + + if i == 0 { + // For the first time, We set tidb_cost_model_version to 2. + // And after upgrade to 6.5, tidb_cost_model_version should be 2. + // For the second it should be 1. + mustExec(t, seV61, "set global tidb_cost_model_version = 2") + } + dom.Close() + // Upgrade to 6.5. + domCurVer, err := BootstrapSession(store) + require.NoError(t, err) + defer domCurVer.Close() + seCurVer := createSessionAndSetID(t, store) + ver, err = getBootstrapVersion(seCurVer) + require.NoError(t, err) + require.Equal(t, currentBootstrapVersion, ver) + + // We are now in 6.5. + res = mustExecToRecodeSet(t, seCurVer, "select @@tidb_cost_model_version") + chk = res.NewChunk(nil) + err = res.Next(ctx, chk) + require.NoError(t, err) + require.Equal(t, 1, chk.NumRows()) + row = chk.GetRow(0) + require.Equal(t, 1, row.Len()) + if i == 0 { + require.Equal(t, "2", row.GetString(0)) + } else { + require.Equal(t, "1", row.GetString(0)) + } + res.Close() + }() + } +} + +func TestTiDBGCAwareUpgradeFrom630To650(t *testing.T) { + ctx := context.Background() + store, _ := createStoreAndBootstrap(t) + defer func() { require.NoError(t, store.Close()) }() + + // upgrade from 6.3 to 6.5+. + ver63 := version93 + seV63 := createSessionAndSetID(t, store) + txn, err := store.Begin() + require.NoError(t, err) + m := meta.NewMeta(txn) + err = m.FinishBootstrap(int64(ver63)) + require.NoError(t, err) + err = txn.Commit(context.Background()) + require.NoError(t, err) + mustExec(t, seV63, fmt.Sprintf("update mysql.tidb set variable_value=%d where variable_name='tidb_server_version'", ver63)) + mustExec(t, seV63, fmt.Sprintf("update mysql.GLOBAL_VARIABLES set variable_value='%s' where variable_name='%s'", "1", variable.TiDBEnableGCAwareMemoryTrack)) + mustExec(t, seV63, "commit") + unsetStoreBootstrapped(store.UUID()) + ver, err := getBootstrapVersion(seV63) + require.NoError(t, err) + require.Equal(t, int64(ver63), ver) + + // We are now in 6.3, tidb_enable_gc_aware_memory_track is ON. + res := mustExecToRecodeSet(t, seV63, fmt.Sprintf("select * from mysql.GLOBAL_VARIABLES where variable_name='%s'", variable.TiDBEnableGCAwareMemoryTrack)) + chk := res.NewChunk(nil) + err = res.Next(ctx, chk) + require.NoError(t, err) + require.Equal(t, 1, chk.NumRows()) + row := chk.GetRow(0) + require.Equal(t, 2, row.Len()) + require.Equal(t, "1", row.GetString(1)) + + // Upgrade to 6.5. + domCurVer, err := BootstrapSession(store) + require.NoError(t, err) + defer domCurVer.Close() + seCurVer := createSessionAndSetID(t, store) + ver, err = getBootstrapVersion(seCurVer) + require.NoError(t, err) + require.Equal(t, currentBootstrapVersion, ver) + + // We are now in 6.5. + res = mustExecToRecodeSet(t, seCurVer, fmt.Sprintf("select * from mysql.GLOBAL_VARIABLES where variable_name='%s'", variable.TiDBEnableGCAwareMemoryTrack)) + chk = res.NewChunk(nil) + err = res.Next(ctx, chk) + require.NoError(t, err) + require.Equal(t, 1, chk.NumRows()) + row = chk.GetRow(0) + require.Equal(t, 2, row.Len()) + require.Equal(t, "0", row.GetString(1)) +} diff --git a/session/bootstrap_upgrade_test.go b/session/bootstrap_upgrade_test.go index 27a5c34a2eb7f..59cdddf218a2d 100644 --- a/session/bootstrap_upgrade_test.go +++ b/session/bootstrap_upgrade_test.go @@ -72,14 +72,15 @@ func TestUpgradeVersion84(t *testing.T) { {"modify_count", "bigint(64)"}, {"count", "bigint(64)"}, {"version", "bigint(64)"}, + {"source", "varchar(40)"}, {"create_time", "datetime(6)"}, } rStatsHistoryTbl, err := tk.Exec(`desc mysql.stats_meta_history`) require.NoError(t, err) req := rStatsHistoryTbl.NewChunk(nil) require.NoError(t, rStatsHistoryTbl.Next(ctx, req)) - require.Equal(t, 5, req.NumRows()) - for i := 0; i < 5; i++ { + require.Equal(t, 6, req.NumRows()) + for i := 0; i < 6; i++ { row := req.GetRow(i) require.Equal(t, statsHistoryTblFields[i].field, strings.ToLower(row.GetString(0))) require.Equal(t, statsHistoryTblFields[i].tp, strings.ToLower(row.GetString(1))) diff --git a/session/main_test.go b/session/main_test.go index d44927580e55a..1841bbbdd3570 100644 --- a/session/main_test.go +++ b/session/main_test.go @@ -99,7 +99,15 @@ func createSessionAndSetID(t *testing.T, store kv.Storage) Session { return se } -func mustExec(t *testing.T, se Session, sql string, args ...interface{}) sqlexec.RecordSet { +func mustExec(t *testing.T, se Session, sql string, args ...interface{}) { + rs, err := exec(se, sql, args...) + require.NoError(t, err) + if rs != nil { + require.NoError(t, rs.Close()) + } +} + +func mustExecToRecodeSet(t *testing.T, se Session, sql string, args ...interface{}) sqlexec.RecordSet { rs, err := exec(se, sql, args...) require.NoError(t, err) return rs @@ -129,8 +137,12 @@ func exec(se Session, sql string, args ...interface{}) (sqlexec.RecordSet, error func match(t *testing.T, row []types.Datum, expected ...interface{}) { require.Len(t, row, len(expected)) for i := range row { + if _, ok := expected[i].(time.Time); ok { + // Since password_last_changed is set to default current_timestamp, we pass this check. + continue + } got := fmt.Sprintf("%v", row[i].GetValue()) need := fmt.Sprintf("%v", expected[i]) - require.Equal(t, need, got) + require.Equal(t, need, got, i) } } diff --git a/session/nontransactional.go b/session/nontransactional.go index 779b2b7042094..83a660f827ab6 100644 --- a/session/nontransactional.go +++ b/session/nontransactional.go @@ -33,6 +33,7 @@ import ( "github.com/pingcap/tidb/parser/opcode" "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" driver "github.com/pingcap/tidb/types/parser_driver" "github.com/pingcap/tidb/util/chunk" @@ -52,6 +53,7 @@ var ErrNonTransactionalJobFailure = dbterror.ClassSession.NewStd(errno.ErrNonTra var ( nonTransactionalDeleteCount = metrics.NonTransactionalDMLCount.With(prometheus.Labels{metrics.LblType: "delete"}) nonTransactionalInsertCount = metrics.NonTransactionalDMLCount.With(prometheus.Labels{metrics.LblType: "insert"}) + nonTransactionalUpdateCount = metrics.NonTransactionalDMLCount.With(prometheus.Labels{metrics.LblType: "update"}) ) // job: handle keys in [start, end] @@ -95,10 +97,16 @@ func HandleNonTransactionalDML(ctx context.Context, stmt *ast.NonTransactionalDM if err := checkConstraint(stmt, se); err != nil { return nil, err } - tableName, selectSQL, shardColumnInfo, err := buildSelectSQL(stmt, se) + + tableName, selectSQL, shardColumnInfo, tableSources, err := buildSelectSQL(stmt, se) if err != nil { return nil, err } + + if err := checkConstraintWithShardColumn(se, stmt, tableName, shardColumnInfo, tableSources); err != nil { + return nil, err + } + if stmt.DryRun == ast.DryRunQuery { return buildDryRunResults(stmt.DryRun, []string{selectSQL}, se.GetSessionVars().BatchSize.MaxChunkSize) } @@ -124,6 +132,60 @@ func HandleNonTransactionalDML(ctx context.Context, stmt *ast.NonTransactionalDM return buildExecuteResults(ctx, jobs, se.GetSessionVars().BatchSize.MaxChunkSize, se.GetSessionVars().EnableRedactLog) } +// we require: +// (1) in an update statement, shard column cannot be updated +// +// Note: this is not a comprehensive check. +// We do this to help user prevent some easy mistakes, at an acceptable maintenance cost. +func checkConstraintWithShardColumn(se Session, stmt *ast.NonTransactionalDMLStmt, + tableName *ast.TableName, shardColumnInfo *model.ColumnInfo, tableSources []*ast.TableSource) error { + switch s := stmt.DMLStmt.(type) { + case *ast.UpdateStmt: + if err := checkUpdateShardColumn(se, s.List, shardColumnInfo, tableName, tableSources, true); err != nil { + return err + } + case *ast.InsertStmt: + // FIXME: is it possible to happen? + // `insert into t select * from t on duplicate key update id = id + 1` will return an ambiguous column error? + if err := checkUpdateShardColumn(se, s.OnDuplicate, shardColumnInfo, tableName, tableSources, false); err != nil { + return err + } + default: + } + return nil +} + +// shard column should not be updated. +func checkUpdateShardColumn(se Session, assignments []*ast.Assignment, shardColumnInfo *model.ColumnInfo, + tableName *ast.TableName, tableSources []*ast.TableSource, isUpdate bool) error { + // if the table has alias, the alias is used in assignments, and we should use aliased name to compare + aliasedShardColumnTableName := tableName.Name.L + for _, tableSource := range tableSources { + if tableSource.Source.(*ast.TableName).Name.L == aliasedShardColumnTableName && tableSource.AsName.L != "" { + aliasedShardColumnTableName = tableSource.AsName.L + } + } + + if shardColumnInfo == nil { + return nil + } + for _, assignment := range assignments { + sameDB := (assignment.Column.Schema.L == tableName.Schema.L) || + (assignment.Column.Schema.L == "" && tableName.Schema.L == se.GetSessionVars().CurrentDB) + if !sameDB { + continue + } + sameTable := (assignment.Column.Table.L == aliasedShardColumnTableName) || (isUpdate && len(tableSources) == 1) + if !sameTable { + continue + } + if assignment.Column.Name.L == shardColumnInfo.Name.L { + return errors.New("Non-transactional DML, shard column cannot be updated") + } + } + return nil +} + func checkConstraint(stmt *ast.NonTransactionalDMLStmt, se Session) error { sessVars := se.GetSessionVars() if !(sessVars.IsAutocommit() && !sessVars.InTxn()) { @@ -143,7 +205,7 @@ func checkConstraint(stmt *ast.NonTransactionalDMLStmt, se Session) error { switch s := stmt.DMLStmt.(type) { case *ast.DeleteStmt: - if err := checkTableRef(s.TableRefs); err != nil { + if err := checkTableRef(s.TableRefs, true); err != nil { return err } if err := checkReadClauses(s.Limit, s.Order); err != nil { @@ -151,11 +213,13 @@ func checkConstraint(stmt *ast.NonTransactionalDMLStmt, se Session) error { } nonTransactionalDeleteCount.Inc() case *ast.UpdateStmt: - // TODO: check: (1) single target table (2) more... - if s.Limit != nil { - return errors.New("Non-transactional update doesn't support limit") + if err := checkTableRef(s.TableRefs, true); err != nil { + return err } - // TODO: metrics + if err := checkReadClauses(s.Limit, s.Order); err != nil { + return err + } + nonTransactionalUpdateCount.Inc() case *ast.InsertStmt: if s.Select == nil { return errors.New("Non-transactional insert supports insert select stmt only") @@ -164,31 +228,12 @@ func checkConstraint(stmt *ast.NonTransactionalDMLStmt, se Session) error { if !ok { return errors.New("Non-transactional insert doesn't support non-select source") } - if err := checkTableRef(selectStmt.From); err != nil { + if err := checkTableRef(selectStmt.From, true); err != nil { return err } if err := checkReadClauses(selectStmt.Limit, selectStmt.OrderBy); err != nil { return err } - sourceTable, ok := selectStmt.From.TableRefs.Left.(*ast.TableSource) - if !ok { - return errors.New("Non-transactional insert must have a source table") - } - sourceName, ok := sourceTable.Source.(*ast.TableName) - if !ok { - return errors.New("Non-transaction insert must have s source table") - } - targetTable, ok := s.Table.TableRefs.Left.(*ast.TableSource) - if !ok { - return errors.New("Non-transactional insert must have a target table") - } - targetName, ok := targetTable.Source.(*ast.TableName) - if !ok { - return errors.New("Non-transactional insert must have a target table") - } - if sourceName.Name.L == targetName.Name.L { - return errors.New("Non-transactional insert doesn't support self-insert") - } nonTransactionalInsertCount.Inc() default: return errors.New("Unsupported DML type for non-transactional DML") @@ -197,11 +242,11 @@ func checkConstraint(stmt *ast.NonTransactionalDMLStmt, se Session) error { return nil } -func checkTableRef(t *ast.TableRefsClause) error { +func checkTableRef(t *ast.TableRefsClause, allowMultipleTables bool) error { if t == nil || t.TableRefs == nil || t.TableRefs.Left == nil { return errors.New("table reference is nil") } - if t.TableRefs.Right != nil { + if !allowMultipleTables && t.TableRefs.Right != nil { return errors.New("Non-transactional statements don't support multiple tables") } return nil @@ -501,24 +546,30 @@ func appendNewJob(jobs []job, id int, start types.Datum, end types.Datum, size i return jobs } -func buildSelectSQL(stmt *ast.NonTransactionalDMLStmt, se Session) (*ast.TableName, string, *model.ColumnInfo, error) { +func buildSelectSQL(stmt *ast.NonTransactionalDMLStmt, se Session) ( + *ast.TableName, string, *model.ColumnInfo, []*ast.TableSource, error) { // only use the first table - tableSource, ok := stmt.DMLStmt.TableSource() + join, ok := stmt.DMLStmt.TableRefsJoin() if !ok { - return nil, "", nil, errors.New("Non-transactional DML, table source not found") + return nil, "", nil, nil, errors.New("Non-transactional DML, table source not found") } - tableName, ok := tableSource.Source.(*ast.TableName) + tableSources := make([]*ast.TableSource, 0) + tableSources, err := collectTableSourcesInJoin(join, tableSources) + if err != nil { + return nil, "", nil, nil, err + } + if len(tableSources) == 0 { + return nil, "", nil, nil, errors.New("Non-transactional DML, no tables found in table refs") + } + leftMostTableSource := tableSources[0] + leftMostTableName, ok := leftMostTableSource.Source.(*ast.TableName) if !ok { - return nil, "", nil, errors.New("Non-transactional DML, table name not found") + return nil, "", nil, nil, errors.New("Non-transactional DML, table name not found") } - // the shard column must be indexed - indexed, shardColumnInfo, err := selectShardColumn(stmt, se, tableName, tableSource.AsName) + shardColumnInfo, tableName, err := selectShardColumn(stmt, se, tableSources, leftMostTableName, leftMostTableSource) if err != nil { - return nil, "", nil, err - } - if !indexed { - return nil, "", nil, errors.Errorf("Non-transactional DML, shard column %s is not indexed", stmt.ShardColumn.Name.L) + return nil, "", nil, nil, err } var sb strings.Builder @@ -530,7 +581,7 @@ func buildSelectSQL(stmt *ast.NonTransactionalDMLStmt, se Session) (*ast.TableNa format.RestoreStringWithoutCharset, &sb), ) if err != nil { - return nil, "", nil, errors.Annotate(err, "Failed to restore where clause in non-transactional DML") + return nil, "", nil, nil, errors.Annotate(err, "Failed to restore where clause in non-transactional DML") } } else { sb.WriteString("TRUE") @@ -538,57 +589,131 @@ func buildSelectSQL(stmt *ast.NonTransactionalDMLStmt, se Session) (*ast.TableNa // assure NULL values are placed first selectSQL := fmt.Sprintf("SELECT `%s` FROM `%s`.`%s` WHERE %s ORDER BY IF(ISNULL(`%s`),0,1),`%s`", stmt.ShardColumn.Name.O, tableName.DBInfo.Name.O, tableName.Name.O, sb.String(), stmt.ShardColumn.Name.O, stmt.ShardColumn.Name.O) - return tableName, selectSQL, shardColumnInfo, nil + return tableName, selectSQL, shardColumnInfo, tableSources, nil } -// it attempts to auto-select a shard column from handle if not specified, and fills back the corresponding info in the stmt, -// making it transparent to following steps -func selectShardColumn(stmt *ast.NonTransactionalDMLStmt, se Session, tableName *ast.TableName, tableAsName model.CIStr) (indexed bool, shardColumnInfo *model.ColumnInfo, err error) { - tbl, err := domain.GetDomain(se).InfoSchema().TableByName(tableName.Schema, tableName.Name) - if err != nil { - return false, nil, err - } - tableInfo := tbl.Meta() +func selectShardColumn(stmt *ast.NonTransactionalDMLStmt, se Session, tableSources []*ast.TableSource, + leftMostTableName *ast.TableName, leftMostTableSource *ast.TableSource) ( + *model.ColumnInfo, *ast.TableName, error) { + var indexed bool + var shardColumnInfo *model.ColumnInfo + var selectedTableName *ast.TableName - var shardColumnName string - if stmt.ShardColumn == nil { - // auto-detect shard column - if tbl.Meta().PKIsHandle { - shardColumnInfo = tableInfo.GetPkColInfo() - } else if tableInfo.IsCommonHandle { - for _, index := range tableInfo.Indices { - if index.Primary { - if len(index.Columns) == 1 { - shardColumnInfo = tableInfo.Columns[index.Columns[0].Offset] - break - } - // if the clustered index contains multiple columns, we cannot automatically choose a column as the shard column - return false, nil, errors.New("Non-transactional DML, the clustered index contains multiple columns. Please specify a shard column") + if len(tableSources) == 1 { + // single table + leftMostTable, err := domain.GetDomain(se).InfoSchema().TableByName(leftMostTableName.Schema, leftMostTableName.Name) + if err != nil { + return nil, nil, err + } + selectedTableName = leftMostTableName + indexed, shardColumnInfo, err = selectShardColumnFromTheOnlyTable( + stmt, leftMostTableName, leftMostTableSource.AsName, leftMostTable) + if err != nil { + return nil, nil, err + } + } else { + // multi table join + if stmt.ShardColumn == nil { + leftMostTable, err := domain.GetDomain(se).InfoSchema().TableByName(leftMostTableName.Schema, leftMostTableName.Name) + if err != nil { + return nil, nil, err + } + selectedTableName = leftMostTableName + indexed, shardColumnInfo, err = selectShardColumnAutomatically(stmt, leftMostTable, leftMostTableName, leftMostTableSource.AsName) + if err != nil { + return nil, nil, err + } + } else if stmt.ShardColumn.Schema.L != "" && stmt.ShardColumn.Table.L != "" && stmt.ShardColumn.Name.L != "" { + specifiedDbName := stmt.ShardColumn.Schema + specifiedTableName := stmt.ShardColumn.Table + specifiedColName := stmt.ShardColumn.Name + + // the specified table must be in the join + tableInJoin := false + var chosenTableName model.CIStr + for _, tableSource := range tableSources { + tableSourceName := tableSource.Source.(*ast.TableName) + tableSourceFinalTableName := tableSource.AsName // precedence: alias name, then table name + if tableSourceFinalTableName.O == "" { + tableSourceFinalTableName = tableSourceName.Name + } + if tableSourceName.Schema.L == specifiedDbName.L && tableSourceFinalTableName.L == specifiedTableName.L { + tableInJoin = true + selectedTableName = tableSourceName + chosenTableName = tableSourceName.Name + break } } - if shardColumnInfo == nil { - return false, nil, errors.New("Non-transactional DML, the clustered index is not found") + if !tableInJoin { + return nil, nil, + errors.Errorf( + "Non-transactional DML, shard column %s.%s.%s is not in the tables involved in the join", + specifiedDbName.L, specifiedTableName.L, specifiedColName.L, + ) } - } - shardColumnName := model.ExtraHandleName.L - if shardColumnInfo != nil { - shardColumnName = shardColumnInfo.Name.L + tbl, err := domain.GetDomain(se).InfoSchema().TableByName(specifiedDbName, chosenTableName) + if err != nil { + return nil, nil, err + } + indexed, shardColumnInfo, err = selectShardColumnByGivenName(specifiedColName.L, tbl) + if err != nil { + return nil, nil, err + } + } else { + return nil, nil, errors.New( + "Non-transactional DML, shard column must be fully specified (i.e. `BATCH ON dbname.tablename.colname`) when multiple tables are involved", + ) } + } + if !indexed { + return nil, nil, errors.Errorf("Non-transactional DML, shard column %s is not indexed", stmt.ShardColumn.Name.L) + } + return shardColumnInfo, selectedTableName, nil +} - outputTableName := tableName.Name - if tableAsName.L != "" { - outputTableName = tableAsName +func collectTableSourcesInJoin(node ast.ResultSetNode, tableSources []*ast.TableSource) ([]*ast.TableSource, error) { + if node == nil { + return tableSources, nil + } + switch x := node.(type) { + case *ast.Join: + var err error + tableSources, err = collectTableSourcesInJoin(x.Left, tableSources) + if err != nil { + return nil, err } - stmt.ShardColumn = &ast.ColumnName{ - Schema: tableName.Schema, - Table: outputTableName, // so that table alias works - Name: model.NewCIStr(shardColumnName), + tableSources, err = collectTableSourcesInJoin(x.Right, tableSources) + if err != nil { + return nil, err } - return true, shardColumnInfo, nil + case *ast.TableSource: + // assert it's a table name + if _, ok := x.Source.(*ast.TableName); !ok { + return nil, errors.New("Non-transactional DML, table name not found in join") + } + tableSources = append(tableSources, x) + default: + return nil, errors.Errorf("Non-transactional DML, unknown type %T in table refs", node) } - shardColumnName = stmt.ShardColumn.Name.L + return tableSources, nil +} +// it attempts to auto-select a shard column from handle if not specified, and fills back the corresponding info in the stmt, +// making it transparent to following steps +func selectShardColumnFromTheOnlyTable(stmt *ast.NonTransactionalDMLStmt, tableName *ast.TableName, + tableAsName model.CIStr, tbl table.Table) ( + indexed bool, shardColumnInfo *model.ColumnInfo, err error) { + if stmt.ShardColumn == nil { + return selectShardColumnAutomatically(stmt, tbl, tableName, tableAsName) + } + + return selectShardColumnByGivenName(stmt.ShardColumn.Name.L, tbl) +} + +func selectShardColumnByGivenName(shardColumnName string, tbl table.Table) ( + indexed bool, shardColumnInfo *model.ColumnInfo, err error) { + tableInfo := tbl.Meta() if shardColumnName == model.ExtraHandleName.L && !tableInfo.HasClusteredIndex() { return true, nil, nil } @@ -621,6 +746,46 @@ func selectShardColumn(stmt *ast.NonTransactionalDMLStmt, se Session, tableName return indexed, shardColumnInfo, nil } +func selectShardColumnAutomatically(stmt *ast.NonTransactionalDMLStmt, tbl table.Table, + tableName *ast.TableName, tableAsName model.CIStr) (bool, *model.ColumnInfo, error) { + // auto-detect shard column + var shardColumnInfo *model.ColumnInfo + tableInfo := tbl.Meta() + if tbl.Meta().PKIsHandle { + shardColumnInfo = tableInfo.GetPkColInfo() + } else if tableInfo.IsCommonHandle { + for _, index := range tableInfo.Indices { + if index.Primary { + if len(index.Columns) == 1 { + shardColumnInfo = tableInfo.Columns[index.Columns[0].Offset] + break + } + // if the clustered index contains multiple columns, we cannot automatically choose a column as the shard column + return false, nil, errors.New("Non-transactional DML, the clustered index contains multiple columns. Please specify a shard column") + } + } + if shardColumnInfo == nil { + return false, nil, errors.New("Non-transactional DML, the clustered index is not found") + } + } + + shardColumnName := model.ExtraHandleName.L + if shardColumnInfo != nil { + shardColumnName = shardColumnInfo.Name.L + } + + outputTableName := tableName.Name + if tableAsName.L != "" { + outputTableName = tableAsName + } + stmt.ShardColumn = &ast.ColumnName{ + Schema: tableName.Schema, + Table: outputTableName, // so that table alias works + Name: model.NewCIStr(shardColumnName), + } + return true, shardColumnInfo, nil +} + func buildDryRunResults(dryRunOption int, results []string, maxChunkSize int) (sqlexec.RecordSet, error) { var fieldName string if dryRunOption == ast.DryRunSplitDml { diff --git a/session/nontransactional_test.go b/session/nontransactional_test.go index 3281cd71bd4da..9eea25e46bfbb 100644 --- a/session/nontransactional_test.go +++ b/session/nontransactional_test.go @@ -722,9 +722,7 @@ func TestNonTransactionalWithCheckConstraint(t *testing.T) { err = tk.ExecToErr("batch limit 1 insert into t select 1, 1") require.EqualError(t, err, "table reference is nil") err = tk.ExecToErr("batch limit 1 insert into t select * from (select 1, 2) tmp") - require.EqualError(t, err, "Non-transaction insert must have s source table") - err = tk.ExecToErr("batch limit 1 insert into t select * from t") - require.EqualError(t, err, "Non-transactional insert doesn't support self-insert") + require.EqualError(t, err, "Non-transactional DML, table name not found in join") } func TestNonTransactionalWithOptimizerHints(t *testing.T) { @@ -879,3 +877,138 @@ func TestNonTransactionalWithShardOnUnsupportedTypes(t *testing.T) { require.Error(t, err) tk.MustQuery("select count(*) from t2").Check(testkit.Rows("1")) } + +func TestNonTransactionalWithJoin(t *testing.T) { + // insert + // BATCH ON t2.id LIMIT 10000 insert into t1 select id, name from t2 inner join t3 on t2.id = t3.id; + // insert into t1 select id, name from t2 inner join t3 on t2.id = t3.id where t2.id between 1 and 10000 + + // replace + // BATCH ON t1.id LIMIT 10000 replace into t3 + // select * from t1 left join t2 on t1.id = t2.id; + + // update + // BATCH ON t1.id LIMIT 10000 update t1 join t2 on t1.a=t2.a set t1.a=t1.a*1000; + // update t1 join t2 on t1.a=t2.a set t1.a=t1.a*1000 where t1.id between 1 and 10000; + + // delete + // BATCH ON pa.id LIMIT 10000 DELETE pa + // FROM pets_activities pa JOIN pets p ON pa.id = p.pet_id + // WHERE p.order > :order AND p.pet_id = :pet_id + // delete pa + // from pets_activities pa join pets p on pa.id = p.pet_id + // WHERE p.order > :order AND p.pet_id = :pet_id and pa.id between 1 and 10000; + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(id int, v1 int, v2 int, unique key (id))") + tk.MustExec("create table t2(id int, v int, key i1(id))") + tk.MustExec("create table t3(id int, v int, key i1(id))") + tk.MustExec("insert into t2 values (1, 2), (2, 3), (3, 4)") + tk.MustExec("insert into t3 values (1, 4), (2, 5), (4, 6)") + + tk.MustExec("batch on test.t2.id limit 1 insert into t select t2.id, t2.v, t3.v from t2 join t3 on t2.id=t3.id") + tk.MustQuery("select * from t").Check(testkit.Rows("1 2 4", "2 3 5")) + + tk.MustContainErrMsg( + "batch on id limit 1 insert into t select t2.id, t2.v, t3.v from t2 join t3 on t2.id=t3.id", + "Non-transactional DML, shard column must be fully specified", + ) + tk.MustContainErrMsg( + "batch on test.t1.id limit 1 insert into t select t2.id, t2.v, t3.v from t2 join t3 on t2.id=t3.id", + "shard column test.t1.id is not in the tables involved in the join", + ) + + tk.MustExec("batch on test.t2.id limit 1 update t2 join t3 on t2.id=t3.id set t2.v=t2.v*100, t3.v=t3.v*200") + tk.MustQuery("select * from t2").Check(testkit.Rows("1 200", "2 300", "3 4")) + tk.MustQuery("select * from t3").Check(testkit.Rows("1 800", "2 1000", "4 6")) + + tk.MustExec("batch limit 1 delete t2 from t2 join t3 on t2.id=t3.id") + tk.MustQuery("select * from t2").Check(testkit.Rows("3 4")) + + tk.MustExec("insert into t2 values (1, 11), (2, 22)") + tk.MustExec("batch limit 1 replace into t select t2.id, t2.v, t3.v from t2 join t3 on t2.id=t3.id") + tk.MustQuery("select * from t").Check(testkit.Rows("1 11 800", "2 22 1000")) +} + +func TestAnomalousNontransactionalDML(t *testing.T) { + // some weird and error-prone behavior + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(id int, v int)") + + // self-insert, this is allowed but can be dangerous + tk.MustExec("insert into t values (1, 1)") + tk.MustExec("batch limit 1 insert into t select * from t") + tk.MustQuery("select * from t").Check(testkit.Rows("1 1", "1 1")) + tk.MustExec("drop table t") + + tk.MustExec("create table t(id int, v int, key(id))") + tk.MustExec("create table t2(id int, v int, key(id))") + tk.MustExec("insert into t values (1, 1), (2, 2), (3, 3)") + tk.MustExec("insert into t2 values (1, 1), (2, 2), (4, 4)") + + tk.MustExec("batch on test.t.id limit 1 update t join t2 on t.id=t2.id set t2.id = t2.id+1") + tk.MustQuery("select * from t2").Check(testkit.Rows("4 1", "4 2", "4 4")) +} + +func TestAlias(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(id int, v1 int, v2 int, unique key (id))") + tk.MustExec("create table t2(id int, v int, key (id))") + tk.MustExec("create table t3(id int, v int, key (id))") + tk.MustExec("insert into t values (1, 1, 1), (2, 2, 2), (3, 3, 3)") + tk.MustExec("insert into t2 values (1, 1), (2, 20), (4, 40)") + tk.MustExec("insert into t3 values (2, 21), (4, 41), (5, 50)") + tk.MustExec("update t as t1 set v1 = test.t1.id + 1") + tk.MustQuery("select * from t").Check(testkit.Rows("1 2 1", "2 3 2", "3 4 3")) + + tk.MustExec("batch on test.tt2.id limit 1 replace into t select tt2.id, tt2.v, t3.v from t2 as tt2 join t3 on tt2.id=t3.id") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 2 1", "2 20 21", "3 4 3", "4 40 41")) +} + +func TestUpdatingShardColumn(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(id int, v int, unique key(id))") + tk.MustExec("create table t2(id int, v int, unique key(id))") + tk.MustExec("insert into t values (1, 1), (2, 2), (3, 3)") + tk.MustExec("insert into t2 values (1, 1), (2, 2), (4, 4)") + + // update stmt + tk.MustContainErrMsg("batch on id limit 1 update t set id=id+1", "Non-transactional DML, shard column cannot be updated") + // insert on dup update + tk.MustContainErrMsg("batch on id limit 1 insert into t select * from t on duplicate key update t.id=t.id+10", "Non-transactional DML, shard column cannot be updated") + // update with table alias + tk.MustContainErrMsg("batch on id limit 1 update t as t1 set t1.id=t1.id+1", "Non-transactional DML, shard column cannot be updated") + // insert on dup update with table alias + tk.MustContainErrMsg("batch on id limit 1 insert into t select * from t as t1 on duplicate key update t1.id=t1.id+10", "Non-transactional DML, shard column cannot be updated") + // update stmt, multiple table + tk.MustContainErrMsg("batch on test.t.id limit 1 update t join t2 on t.id=t2.id set t.id=t.id+1", "Non-transactional DML, shard column cannot be updated") + // update stmt, multiple table, alias + tk.MustContainErrMsg("batch on test.tt.id limit 1 update t as tt join t2 as tt2 on tt.id=tt2.id set tt.id=tt.id+10", "Non-transactional DML, shard column cannot be updated") +} + +func TestNameAmbiguity(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(id int, v1 int, v2 int, unique key (id))") + tk.MustExec("create table t2(id int, v int, key (id))") + tk.MustExec("create table t3(id int, v int, key (id))") + + tk.MustExec("create database test2") + tk.MustExec("use test2") + tk.MustExec("create table t(id int, v1 int, v2 int, unique key (id))") + tk.MustExec("create table t2(id int, v int, key (id))") + tk.MustExec("create table t3(id int, v int, key (id))") + tk.MustExec("insert into t values (1, 1, 1), (2, 2, 2)") + + tk.MustExec("use test") + tk.MustExec("batch on id limit 1 insert into t select * from test2.t") + tk.MustQuery("select * from t").Check(testkit.Rows("1 1 1", "2 2 2")) +} diff --git a/session/schema_amender.go b/session/schema_amender.go deleted file mode 100644 index caaec7994ae3a..0000000000000 --- a/session/schema_amender.go +++ /dev/null @@ -1,713 +0,0 @@ -// 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, -// 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 session - -import ( - "bytes" - "context" - "encoding/hex" - "fmt" - "reflect" - - "github.com/pingcap/errors" - "github.com/pingcap/kvproto/pkg/kvrpcpb" - "github.com/pingcap/tidb/executor" - "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/parser/model" - "github.com/pingcap/tidb/parser/mysql" - "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/table/tables" - "github.com/pingcap/tidb/tablecodec" - "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/chunk" - "github.com/pingcap/tidb/util/logutil" - "github.com/pingcap/tidb/util/rowcodec" - "github.com/tikv/client-go/v2/tikv" - "github.com/tikv/client-go/v2/txnkv/transaction" - "go.uber.org/zap" -) - -const amendableType = nonMemAmendType | memBufAmendType -const nonMemAmendType = (1 << model.ActionAddColumn) | (1 << model.ActionDropColumn) | (1 << model.ActionDropIndex) -const memBufAmendType = uint64(1< 0 -} - -func needCollectIndexOps(actionType uint64) bool { - return actionType&(1< idxInfoAtStart.Meta().State { - amendOpType = ConstOpAddIndex[idxInfoAtStart.Meta().State][idxInfoAtCommit.Meta().State] - } - if amendOpType != AmendNone { - opInfo := &amendOperationAddIndexInfo{} - opInfo.AmendOpType = amendOpType - opInfo.tblInfoAtStart = tblAtStart - opInfo.tblInfoAtCommit = tblAtCommit - opInfo.indexInfoAtStart = idxInfoAtStart - opInfo.indexInfoAtCommit = idxInfoAtCommit - for _, idxCol := range idxInfoAtCommit.Meta().Columns { - colID := tblAtCommit.Meta().Columns[idxCol.Offset].ID - oldColInfo := findColByID(tblAtStart, colID) - // TODO: now index column MUST be found in old table columns, generated column is not supported. - if oldColInfo == nil || oldColInfo.IsGenerated() || oldColInfo.Hidden { - return nil, errors.Trace(errors.Errorf("amend index column=%v id=%v is not found or generated in table=%v", - idxCol.Name, colID, tblAtCommit.Meta().Name.String())) - } - opInfo.relatedOldIdxCols = append(opInfo.relatedOldIdxCols, oldColInfo) - } - opInfo.schemaAndDecoder = newSchemaAndDecoder(sctx, tblAtStart.Meta()) - fieldTypes := make([]*types.FieldType, 0, len(tblAtStart.Meta().Columns)) - for _, col := range tblAtStart.Meta().Columns { - fieldTypes = append(fieldTypes, &(col.FieldType)) - } - opInfo.chk = chunk.NewChunkWithCapacity(fieldTypes, 4) - addNewIndexOp := &amendOperationAddIndex{ - info: opInfo, - insertedNewIndexKeys: make(map[string]struct{}), - deletedOldIndexKeys: make(map[string]struct{}), - } - res = append(res, addNewIndexOp) - } - } - return res, nil -} - -// collectTblAmendOps collects amend operations for each table using the schema diff between startTS and commitTS. -func (a *amendCollector) collectTblAmendOps(sctx sessionctx.Context, phyTblID int64, - tblInfoAtStart, tblInfoAtCommit table.Table, actionType uint64) error { - if _, ok := a.tblAmendOpMap[phyTblID]; !ok { - a.tblAmendOpMap[phyTblID] = make([]amendOp, 0, 4) - } - if needCollectModifyColOps(actionType) { - _, err := a.collectModifyColAmendOps(tblInfoAtStart, tblInfoAtCommit) - if err != nil { - return err - } - } - if needCollectIndexOps(actionType) { - // TODO: currently only "add index" is considered. - ops, err := a.collectIndexAmendOps(sctx, tblInfoAtStart, tblInfoAtCommit) - if err != nil { - return err - } - a.tblAmendOpMap[phyTblID] = append(a.tblAmendOpMap[phyTblID], ops...) - } - return nil -} - -// mayGenDelIndexRowKeyOp returns if the row key op could generate Op_Del index key mutations. -func mayGenDelIndexRowKeyOp(keyOp kvrpcpb.Op) bool { - return keyOp == kvrpcpb.Op_Del || keyOp == kvrpcpb.Op_Put -} - -// mayGenPutIndexRowKeyOp returns if the row key op could generate Op_Put/Op_Insert index key mutations. -func mayGenPutIndexRowKeyOp(keyOp kvrpcpb.Op) bool { - return keyOp == kvrpcpb.Op_Put || keyOp == kvrpcpb.Op_Insert -} - -// amendOp is an amend operation for a specific schema change, new mutations will be generated using input ones. -type amendOp interface { - genMutations(ctx context.Context, sctx sessionctx.Context, commitMutations transaction.CommitterMutations, kvMap *rowKvMap, - resultMutations *transaction.PlainMutations) error -} - -// amendOperationAddIndex represents one amend operation related to a specific add index change. -type amendOperationAddIndexInfo struct { - AmendOpType int - tblInfoAtStart table.Table - tblInfoAtCommit table.Table - indexInfoAtStart table.Index - indexInfoAtCommit table.Index - relatedOldIdxCols []*table.Column - - schemaAndDecoder *schemaAndDecoder - chk *chunk.Chunk -} - -// amendOperationAddIndex represents the add operation will be performed on new key values for add index amend. -type amendOperationAddIndex struct { - info *amendOperationAddIndexInfo - - // insertedNewIndexKeys is used to check duplicates for new index generated by unique key. - insertedNewIndexKeys map[string]struct{} - // deletedOldIndexKeys is used to check duplicates for deleted old index keys. - deletedOldIndexKeys map[string]struct{} -} - -func (a *amendOperationAddIndexInfo) String() string { - var colStr string - colStr += "[" - for _, colInfo := range a.relatedOldIdxCols { - colStr += fmt.Sprintf(" %s ", colInfo.Name) - } - colStr += "]" - res := fmt.Sprintf("AmenedOpType=%d phyTblID=%d idxID=%d columns=%v", a.AmendOpType, a.indexInfoAtCommit.Meta().ID, - a.indexInfoAtCommit.Meta().ID, colStr) - return res -} - -func (a *amendOperationAddIndex) genMutations(ctx context.Context, sctx sessionctx.Context, commitMutations transaction.CommitterMutations, - kvMap *rowKvMap, resAddMutations *transaction.PlainMutations) error { - // There should be no duplicate keys in deletedOldIndexKeys and insertedNewIndexKeys. - deletedMutations := transaction.NewPlainMutations(32) - insertedMutations := transaction.NewPlainMutations(32) - for i, key := range commitMutations.GetKeys() { - if tablecodec.IsIndexKey(key) || tablecodec.DecodeTableID(key) != a.info.tblInfoAtCommit.Meta().ID { - continue - } - var newIdxMutation *transaction.PlainMutation - var oldIdxMutation *transaction.PlainMutation - var err error - keyOp := commitMutations.GetOp(i) - if addIndexNeedRemoveOp(a.info.AmendOpType) { - if mayGenDelIndexRowKeyOp(keyOp) { - oldIdxMutation, err = a.genOldIdxKey(ctx, sctx, key, kvMap.oldRowKvMap) - if err != nil { - return err - } - } - } - if addIndexNeedAddOp(a.info.AmendOpType) { - if mayGenPutIndexRowKeyOp(keyOp) { - newIdxMutation, err = a.genNewIdxKey(ctx, sctx, key, kvMap.newRowKvMap) - if err != nil { - return err - } - } - } - skipMerge := false - if a.info.AmendOpType == AmendNeedAddDeleteAndInsert { - // If the old index key is the same with new index key, then the index related row value - // is not changed in this row, we don't need to add or remove index keys for this row. - if oldIdxMutation != nil && newIdxMutation != nil { - if bytes.Equal(oldIdxMutation.Key, newIdxMutation.Key) { - skipMerge = true - } - } - } - if !skipMerge { - if oldIdxMutation != nil { - deletedMutations.AppendMutation(*oldIdxMutation) - } - if newIdxMutation != nil { - insertedMutations.AppendMutation(*newIdxMutation) - } - } - } - // For unique index, there may be conflicts on the same unique index key from different rows.Consider a update statement, - // "Op_Del" on row_key = 3, row_val = 4, the "Op_Del" unique_key_4 -> nil will be generated. - // "Op_Put" on row_key = 0, row_val = 4, the "Op_Insert" unique_key_4 -> 0 will be generated. - // The "Op_Insert" should cover the "Op_Del" otherwise the new put row value will not have a correspond index value. - if a.info.indexInfoAtCommit.Meta().Unique { - for i := 0; i < len(deletedMutations.GetKeys()); i++ { - key := deletedMutations.GetKeys()[i] - if _, ok := a.insertedNewIndexKeys[string(key)]; !ok { - resAddMutations.Push(deletedMutations.GetOps()[i], key, deletedMutations.GetValues()[i], deletedMutations.IsPessimisticLock(i), - deletedMutations.IsAssertExists(i), deletedMutations.IsAssertNotExist(i), deletedMutations.NeedConstraintCheckInPrewrite(i)) - } - } - for i := 0; i < len(insertedMutations.GetKeys()); i++ { - key := insertedMutations.GetKeys()[i] - destKeyOp := kvrpcpb.Op_Insert - if _, ok := a.deletedOldIndexKeys[string(key)]; ok { - destKeyOp = kvrpcpb.Op_Put - } - resAddMutations.Push(destKeyOp, key, insertedMutations.GetValues()[i], insertedMutations.IsPessimisticLock(i), - insertedMutations.IsAssertExists(i), insertedMutations.IsAssertNotExist(i), insertedMutations.NeedConstraintCheckInPrewrite(i)) - } - } else { - resAddMutations.MergeMutations(deletedMutations) - resAddMutations.MergeMutations(insertedMutations) - } - return nil -} - -func getCommonHandleDatum(tbl table.Table, row chunk.Row) []types.Datum { - if !tbl.Meta().IsCommonHandle { - return nil - } - datumBuf := make([]types.Datum, 0, 4) - for _, col := range tbl.Cols() { - if mysql.HasPriKeyFlag(col.GetFlag()) { - datumBuf = append(datumBuf, row.GetDatum(col.Offset, &col.FieldType)) - } - } - return datumBuf -} - -func (a *amendOperationAddIndexInfo) genIndexKeyValue(ctx context.Context, sctx sessionctx.Context, kvMap map[string][]byte, - key []byte, kvHandle kv.Handle, keyOnly bool) ([]byte, []byte, error) { - chk := a.chk - chk.Reset() - val, ok := kvMap[string(key)] - if !ok { - // The Op_Put may not exist in old value kv map. - if keyOnly { - return nil, nil, nil - } - return nil, nil, errors.Errorf("key=%v is not found in new row kv map", kv.Key(key).String()) - } - err := executor.DecodeRowValToChunk(sctx, a.schemaAndDecoder.schema, a.tblInfoAtStart.Meta(), kvHandle, val, chk, a.schemaAndDecoder.decoder) - if err != nil { - logutil.Logger(ctx).Warn("amend decode value to chunk failed", zap.Error(err)) - return nil, nil, errors.Trace(err) - } - idxVals := make([]types.Datum, 0, len(a.indexInfoAtCommit.Meta().Columns)) - for _, oldCol := range a.relatedOldIdxCols { - idxVals = append(idxVals, chk.GetRow(0).GetDatum(oldCol.Offset, &oldCol.FieldType)) - } - - rsData := tables.TryGetHandleRestoredDataWrapper(a.tblInfoAtCommit.Meta(), getCommonHandleDatum(a.tblInfoAtCommit, chk.GetRow(0)), nil, a.indexInfoAtCommit.Meta()) - - // Generate index key buf. - newIdxKey, distinct, err := tablecodec.GenIndexKey(sctx.GetSessionVars().StmtCtx, - a.tblInfoAtCommit.Meta(), a.indexInfoAtCommit.Meta(), a.tblInfoAtCommit.Meta().ID, idxVals, kvHandle, nil) - if err != nil { - logutil.Logger(ctx).Warn("amend generate index key failed", zap.Error(err)) - return nil, nil, errors.Trace(err) - } - if keyOnly { - return newIdxKey, []byte{}, nil - } - - // Generate index value buf. - needRsData := tables.NeedRestoredData(a.indexInfoAtCommit.Meta().Columns, a.tblInfoAtCommit.Meta().Columns) - newIdxVal, err := tablecodec.GenIndexValuePortal(sctx.GetSessionVars().StmtCtx, a.tblInfoAtCommit.Meta(), a.indexInfoAtCommit.Meta(), needRsData, distinct, false, idxVals, kvHandle, 0, rsData) - if err != nil { - logutil.Logger(ctx).Warn("amend generate index values failed", zap.Error(err)) - return nil, nil, errors.Trace(err) - } - return newIdxKey, newIdxVal, nil -} - -func (a *amendOperationAddIndex) genNewIdxKey(ctx context.Context, sctx sessionctx.Context, key []byte, - kvMap map[string][]byte) (*transaction.PlainMutation, error) { - kvHandle, err := tablecodec.DecodeRowKey(key) - if err != nil { - logutil.Logger(ctx).Error("decode key error", zap.String("key", hex.EncodeToString(key)), zap.Error(err)) - return nil, errors.Trace(err) - } - - newIdxKey, newIdxValue, err := a.info.genIndexKeyValue(ctx, sctx, kvMap, key, kvHandle, false) - if err != nil { - return nil, errors.Trace(err) - } - newIndexOp := kvrpcpb.Op_Put - isPessimisticLock := false - if _, ok := a.insertedNewIndexKeys[string(newIdxKey)]; ok { - return nil, errors.Trace(errors.Errorf("amend process key same key=%v found for index=%v in table=%v", - newIdxKey, a.info.indexInfoAtCommit.Meta().Name, a.info.tblInfoAtCommit.Meta().Name)) - } - if a.info.indexInfoAtCommit.Meta().Unique { - newIndexOp = kvrpcpb.Op_Insert - isPessimisticLock = true - } - a.insertedNewIndexKeys[string(newIdxKey)] = struct{}{} - var flags transaction.CommitterMutationFlags - if isPessimisticLock { - flags |= transaction.MutationFlagIsPessimisticLock - } - newMutation := &transaction.PlainMutation{KeyOp: newIndexOp, Key: newIdxKey, Value: newIdxValue, Flags: flags} - return newMutation, nil -} - -func (a *amendOperationAddIndex) genOldIdxKey(ctx context.Context, sctx sessionctx.Context, key []byte, - oldValKvMap map[string][]byte) (*transaction.PlainMutation, error) { - kvHandle, err := tablecodec.DecodeRowKey(key) - if err != nil { - logutil.Logger(ctx).Error("decode key error", zap.String("key", hex.EncodeToString(key)), zap.Error(err)) - return nil, errors.Trace(err) - } - // Generated delete index key value. - newIdxKey, emptyVal, err := a.info.genIndexKeyValue(ctx, sctx, oldValKvMap, key, kvHandle, true) - if err != nil { - return nil, errors.Trace(err) - } - // For Op_Put the key may not exist in old key value map. - if len(newIdxKey) > 0 { - isPessimisticLock := false - if _, ok := a.deletedOldIndexKeys[string(newIdxKey)]; ok { - return nil, errors.Trace(errors.Errorf("amend process key same key=%v found for index=%v in table=%v", - newIdxKey, a.info.indexInfoAtCommit.Meta().Name, a.info.tblInfoAtCommit.Meta().Name)) - } - if a.info.indexInfoAtCommit.Meta().Unique { - isPessimisticLock = true - } - a.deletedOldIndexKeys[string(newIdxKey)] = struct{}{} - var flags transaction.CommitterMutationFlags - if isPessimisticLock { - flags |= transaction.MutationFlagIsPessimisticLock - } - return &transaction.PlainMutation{KeyOp: kvrpcpb.Op_Del, Key: newIdxKey, Value: emptyVal, Flags: flags}, nil - } - return nil, nil -} - -// SchemaAmender is used to amend pessimistic transactions for schema change. -type SchemaAmender struct { - sess *session -} - -// NewSchemaAmenderForTikvTxn creates a schema amender for tikvTxn type. -func NewSchemaAmenderForTikvTxn(sess *session) *SchemaAmender { - amender := &SchemaAmender{sess: sess} - return amender -} - -func (s *SchemaAmender) getAmendableKeys(commitMutations transaction.CommitterMutations, info *amendCollector) ([]kv.Key, []kv.Key) { - addKeys := make([]kv.Key, 0, len(commitMutations.GetKeys())) - removeKeys := make([]kv.Key, 0, len(commitMutations.GetKeys())) - for i, byteKey := range commitMutations.GetKeys() { - if tablecodec.IsIndexKey(byteKey) || !info.keyHasAmendOp(byteKey) { - continue - } - keyOp := commitMutations.GetOp(i) - switch keyOp { - case kvrpcpb.Op_Put: - addKeys = append(addKeys, byteKey) - removeKeys = append(removeKeys, byteKey) - case kvrpcpb.Op_Insert: - addKeys = append(addKeys, byteKey) - case kvrpcpb.Op_Del: - removeKeys = append(removeKeys, byteKey) - } - } - return addKeys, removeKeys -} - -type rowKvMap struct { - oldRowKvMap map[string][]byte - newRowKvMap map[string][]byte -} - -func (s *SchemaAmender) prepareKvMap(ctx context.Context, commitMutations transaction.CommitterMutations, info *amendCollector) (*rowKvMap, error) { - // Get keys need to be considered for the amend operation, currently only row keys. - addKeys, removeKeys := s.getAmendableKeys(commitMutations, info) - - // BatchGet the new key values, the Op_Put and Op_Insert type keys in memory buffer. - txn, err := s.sess.Txn(true) - if err != nil { - return nil, errors.Trace(err) - } - newValKvMap, err := txn.BatchGet(ctx, addKeys) - if err != nil { - logutil.Logger(ctx).Warn("amend failed to batch get kv new keys", zap.Error(err)) - return nil, errors.Trace(err) - } - if len(newValKvMap) != len(addKeys) { - logutil.Logger(ctx).Error("amend failed to batch get results invalid", - zap.Int("addKeys len", len(addKeys)), zap.Int("newValKvMap", len(newValKvMap))) - return nil, errors.Errorf("add keys has %v values but result kvMap has %v", len(addKeys), len(newValKvMap)) - } - // BatchGet the old key values, the Op_Del and Op_Put types keys in storage using forUpdateTS, the Op_put type is for - // row update using the same row key, it may not exist. - snapshot := s.sess.GetStore().GetSnapshot(kv.Version{Ver: s.sess.sessionVars.TxnCtx.GetForUpdateTS()}) - oldValKvMap, err := snapshot.BatchGet(ctx, removeKeys) - if err != nil { - logutil.Logger(ctx).Warn("amend failed to batch get kv old keys", zap.Error(err)) - return nil, errors.Trace(err) - } - - res := &rowKvMap{ - oldRowKvMap: oldValKvMap, - newRowKvMap: newValKvMap, - } - return res, nil -} - -func (s *SchemaAmender) checkDupKeys(ctx context.Context, mutations transaction.CommitterMutations) error { - // Check if there are duplicate key entries. - checkMap := make(map[string]kvrpcpb.Op) - for i := 0; i < mutations.Len(); i++ { - key := mutations.GetKey(i) - keyOp := mutations.GetOp(i) - keyVal := mutations.GetValue(i) - if foundOp, ok := checkMap[string(key)]; ok { - logutil.Logger(ctx).Error("duplicate key found in amend result mutations", - zap.Stringer("key", kv.Key(key)), - zap.Stringer("foundKeyOp", foundOp), - zap.Stringer("thisKeyOp", keyOp), - zap.Stringer("thisKeyValue", kv.Key(keyVal))) - return errors.Trace(errors.Errorf("duplicate key=%s is found in mutations", kv.Key(key).String())) - } - checkMap[string(key)] = keyOp - } - return nil -} - -// genAllAmendMutations generates CommitterMutations for all tables and related amend operations. -func (s *SchemaAmender) genAllAmendMutations(ctx context.Context, commitMutations transaction.CommitterMutations, - info *amendCollector) (*transaction.PlainMutations, error) { - rowKvMap, err := s.prepareKvMap(ctx, commitMutations, info) - if err != nil { - return nil, err - } - // Do generate add/remove mutations processing each key. - resultNewMutations := transaction.NewPlainMutations(32) - for _, amendOps := range info.tblAmendOpMap { - for _, curOp := range amendOps { - err := curOp.genMutations(ctx, s.sess, commitMutations, rowKvMap, &resultNewMutations) - if err != nil { - return nil, err - } - } - } - err = s.checkDupKeys(ctx, &resultNewMutations) - if err != nil { - return nil, err - } - return &resultNewMutations, nil -} - -// AmendTxn does check and generate amend mutations based on input infoSchema and mutations, mutations need to prewrite -// are returned, the input commitMutations will not be changed. -func (s *SchemaAmender) AmendTxn(ctx context.Context, startInfoSchema tikv.SchemaVer, change *transaction.RelatedSchemaChange, - commitMutations transaction.CommitterMutations) (transaction.CommitterMutations, error) { - // Get info schema meta - infoSchemaAtStart := startInfoSchema.(infoschema.InfoSchema) - infoSchemaAtCheck := change.LatestInfoSchema.(infoschema.InfoSchema) - - // Collect amend operations for each table by physical table ID. - var needAmendMem bool - amendCollector := newAmendCollector() - for i, tblID := range change.PhyTblIDS { - actionType := change.ActionTypes[i] - // Check amendable flags, return if not supported flags exist. - if actionType&(^amendableType) != 0 { - logutil.Logger(ctx).Info("amend action type not supported for txn", zap.Int64("tblID", tblID), zap.Uint64("actionType", actionType)) - return nil, errors.Trace(table.ErrUnsupportedOp) - } - // Partition table is not supported now. - tblInfoAtStart, ok := infoSchemaAtStart.TableByID(tblID) - if !ok { - return nil, errors.Trace(errors.Errorf("tableID=%d is not found in infoSchema", tblID)) - } - if tblInfoAtStart.Meta().Partition != nil { - logutil.Logger(ctx).Info("Amend for partition table is not supported", - zap.String("tableName", tblInfoAtStart.Meta().Name.String()), zap.Int64("tableID", tblID)) - return nil, errors.Trace(table.ErrUnsupportedOp) - } - tblInfoAtCommit, ok := infoSchemaAtCheck.TableByID(tblID) - if !ok { - return nil, errors.Trace(errors.Errorf("tableID=%d is not found in infoSchema", tblID)) - } - if actionType&(memBufAmendType) != 0 { - needAmendMem = true - err := amendCollector.collectTblAmendOps(s.sess, tblID, tblInfoAtStart, tblInfoAtCommit, actionType) - if err != nil { - return nil, err - } - } - } - // After amend operations collect, generate related new mutations based on input commitMutations - if needAmendMem { - return s.genAllAmendMutations(ctx, commitMutations, amendCollector) - } - return nil, nil -} - -func newSchemaAndDecoder(ctx sessionctx.Context, tbl *model.TableInfo) *schemaAndDecoder { - schema := expression.NewSchema(make([]*expression.Column, 0, len(tbl.Columns))...) - for _, col := range tbl.Columns { - colExpr := &expression.Column{ - RetType: &col.FieldType, - ID: col.ID, - } - if col.IsGenerated() && !col.GeneratedStored { - // This will not be used since generated column is rejected in collectIndexAmendOps. - colExpr.VirtualExpr = &expression.Constant{} - } - schema.Append(colExpr) - } - return &schemaAndDecoder{schema, executor.NewRowDecoder(ctx, schema, tbl)} -} diff --git a/session/schema_amender_test.go b/session/schema_amender_test.go deleted file mode 100644 index e82faba8e6e56..0000000000000 --- a/session/schema_amender_test.go +++ /dev/null @@ -1,476 +0,0 @@ -// 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, -// 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 session - -import ( - "bytes" - "context" - "fmt" - "strconv" - "testing" - - "github.com/pingcap/kvproto/pkg/kvrpcpb" - "github.com/pingcap/tidb/domain" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/parser/model" - "github.com/pingcap/tidb/parser/mysql" - "github.com/pingcap/tidb/planner/core" - "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/sessiontxn" - "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/tablecodec" - "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/logutil" - "github.com/pingcap/tidb/util/rowcodec" - "github.com/stretchr/testify/require" - "github.com/tikv/client-go/v2/txnkv/transaction" - "go.uber.org/zap" - "golang.org/x/exp/slices" -) - -func initTblColIdxID(metaInfo *model.TableInfo) { - for i, col := range metaInfo.Columns { - col.ID = int64(i + 1) - } - for i, idx := range metaInfo.Indices { - idx.ID = int64(i + 1) - if idx.Name.L == "f_g" { - idx.Unique = true - } else { - idx.Unique = false - } - } - metaInfo.ID = 1 - metaInfo.State = model.StatePublic -} - -func mutationsEqual(res *transaction.PlainMutations, expected *transaction.PlainMutations, t *testing.T) { - require.Len(t, res.GetKeys(), len(expected.GetKeys())) - for i := 0; i < len(res.GetKeys()); i++ { - foundIdx := -1 - for j := 0; j < len(expected.GetKeys()); j++ { - if bytes.Equal(res.GetKeys()[i], expected.GetKeys()[j]) { - foundIdx = j - break - } - } - require.GreaterOrEqual(t, foundIdx, 0) - require.Equal(t, expected.GetOps()[foundIdx], res.GetOps()[i]) - require.Equal(t, expected.IsPessimisticLock(foundIdx), res.IsPessimisticLock(i)) - require.Equal(t, expected.GetKeys()[foundIdx], res.GetKeys()[i]) - require.Equal(t, expected.GetValues()[foundIdx], res.GetValues()[i]) - } -} - -type data struct { - ops []kvrpcpb.Op - keys [][]byte - values [][]byte - rowValue [][]types.Datum -} - -// Generate exist old data and new data in transaction to be amended. Also generate the expected amend mutations -// according to the old and new data and the full generated expected mutations. -func prepareTestData( - se *session, - mutations *transaction.PlainMutations, - oldTblInfo table.Table, - newTblInfo table.Table, - expectedAmendOps []amendOp, - t *testing.T, -) (*data, transaction.PlainMutations) { - var err error - // Generated test data. - colIds := make([]int64, len(oldTblInfo.Meta().Columns)) - basicRowValue := make([]types.Datum, len(oldTblInfo.Meta().Columns)) - for i, col := range oldTblInfo.Meta().Columns { - colIds[i] = oldTblInfo.Meta().Columns[col.Offset].ID - if col.FieldType.GetType() == mysql.TypeLong { - basicRowValue[i] = types.NewIntDatum(int64(col.Offset)) - } else { - basicRowValue[i] = types.NewStringDatum(strconv.Itoa(col.Offset)) - } - } - KeyOps := []kvrpcpb.Op{kvrpcpb.Op_Put, kvrpcpb.Op_Del, kvrpcpb.Op_Lock, kvrpcpb.Op_Insert, kvrpcpb.Op_Put, - kvrpcpb.Op_Del, kvrpcpb.Op_Insert, kvrpcpb.Op_Lock} - numberOfRows := len(KeyOps) - oldRowValues := make([][]types.Datum, numberOfRows) - newRowValues := make([][]types.Datum, numberOfRows) - rd := rowcodec.Encoder{Enable: true} - oldData := &data{} - expectedMutations := transaction.NewPlainMutations(8) - oldRowKvMap := make(map[string][]types.Datum) - newRowKvMap := make(map[string][]types.Datum) - - // colIdx: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. - // column: a, b, c, d, e, c_str, d_str, e_str, f, g. - // Generate old data. - for i := 0; i < numberOfRows; i++ { - keyOp := KeyOps[i] - thisRowValue := make([]types.Datum, len(basicRowValue)) - copy(thisRowValue, basicRowValue) - thisRowValue[0] = types.NewIntDatum(int64(i + 1)) - thisRowValue[4] = types.NewIntDatum(int64(i + 1 + 4)) - // f_g has a unique index. - thisRowValue[8] = types.NewIntDatum(int64(i + 1 + 8)) - - // Save old data, they will be put into db first. - rowKey := tablecodec.EncodeRowKeyWithHandle(oldTblInfo.Meta().ID, kv.IntHandle(int64(i+1))) - var rowValue []byte - rowValue, err = rd.Encode(se.sessionVars.StmtCtx, colIds, thisRowValue, nil) - require.NoError(t, err) - if keyOp == kvrpcpb.Op_Del || keyOp == kvrpcpb.Op_Put || keyOp == kvrpcpb.Op_Lock { - // Skip the last Op_put, it has no old row value. - if i == 4 { - oldRowValues[i] = nil - continue - } - oldData.keys = append(oldData.keys, rowKey) - oldData.values = append(oldData.values, rowValue) - oldData.ops = append(oldData.ops, keyOp) - oldData.rowValue = append(oldData.rowValue, thisRowValue) - if keyOp == kvrpcpb.Op_Del { - mutations.Push(keyOp, rowKey, []byte{}, true, false, false, false) - } - } - oldRowValues[i] = thisRowValue - oldRowKvMap[string(rowKey)] = thisRowValue - } - - // Generate new data. - for i := 0; i < numberOfRows; i++ { - keyOp := KeyOps[i] - thisRowValue := make([]types.Datum, len(basicRowValue)) - copy(thisRowValue, basicRowValue) - thisRowValue[0] = types.NewIntDatum(int64(i + 1)) - // New column e value should be different from old row values. - thisRowValue[4] = types.NewIntDatum(int64(i+1+4) * 20) - // New column f value should be different since it has a related unique index. - thisRowValue[8] = types.NewIntDatum(int64(i+1+4) * 20) - - var rowValue []byte - // Save new data. - rowKey := tablecodec.EncodeRowKeyWithHandle(oldTblInfo.Meta().ID, kv.IntHandle(int64(i+1))) - if keyOp == kvrpcpb.Op_Insert { - rowValue, err = tablecodec.EncodeOldRow(se.sessionVars.StmtCtx, thisRowValue, colIds, nil, nil) - } else { - rowValue, err = rd.Encode(se.sessionVars.StmtCtx, colIds, thisRowValue, nil) - } - require.NoError(t, err) - if keyOp == kvrpcpb.Op_Put || keyOp == kvrpcpb.Op_Insert { - mutations.Push(keyOp, rowKey, rowValue, true, false, false, false) - } else if keyOp == kvrpcpb.Op_Lock { - mutations.Push(keyOp, rowKey, []byte{}, true, false, false, false) - } - newRowValues[i] = thisRowValue - newRowKvMap[string(rowKey)] = thisRowValue - } - - // Prepare expected result mutations. - for _, op := range expectedAmendOps { - var info *amendOperationAddIndexInfo - expectedOp, ok := op.(*amendOperationAddIndex) - require.True(t, ok) - info = expectedOp.info - var idxVal []byte - genIndexKV := func(inputRow []types.Datum) ([]byte, []byte) { - indexDatums := make([]types.Datum, len(info.relatedOldIdxCols)) - for colIdx, col := range info.relatedOldIdxCols { - indexDatums[colIdx] = inputRow[col.Offset] - } - kvHandle := kv.IntHandle(inputRow[0].GetInt64()) - idxKey, _, err := tablecodec.GenIndexKey(se.sessionVars.StmtCtx, newTblInfo.Meta(), - info.indexInfoAtCommit.Meta(), newTblInfo.Meta().ID, indexDatums, kvHandle, nil) - require.NoError(t, err) - idxVal, err = tablecodec.GenIndexValuePortal(se.sessionVars.StmtCtx, newTblInfo.Meta(), info.indexInfoAtCommit.Meta(), false, info.indexInfoAtCommit.Meta().Unique, false, indexDatums, kvHandle, 0, nil) - require.NoError(t, err) - return idxKey, idxVal - } - for i := 0; i < len(mutations.GetKeys()); i++ { - oldIdxKeyMutation := transaction.PlainMutations{} - newIdxKeyMutation := transaction.PlainMutations{} - key := mutations.GetKeys()[i] - keyOp := mutations.GetOps()[i] - if addIndexNeedRemoveOp(info.AmendOpType) && mayGenDelIndexRowKeyOp(keyOp) { - thisRowValue := oldRowKvMap[string(key)] - if len(thisRowValue) > 0 { - idxKey, _ := genIndexKV(thisRowValue) - isPessimisticLock := false - if info.indexInfoAtCommit.Meta().Unique { - isPessimisticLock = true - } - oldIdxKeyMutation.Push(kvrpcpb.Op_Del, idxKey, []byte{}, isPessimisticLock, false, false, false) - } - } - if addIndexNeedAddOp(info.AmendOpType) && mayGenPutIndexRowKeyOp(keyOp) { - thisRowValue := newRowKvMap[string(key)] - idxKey, idxVal := genIndexKV(thisRowValue) - mutOp := kvrpcpb.Op_Put - isPessimisticLock := false - if info.indexInfoAtCommit.Meta().Unique { - mutOp = kvrpcpb.Op_Insert - isPessimisticLock = true - } - newIdxKeyMutation.Push(mutOp, idxKey, idxVal, isPessimisticLock, false, false, false) - } - skipMerge := false - if info.AmendOpType == AmendNeedAddDeleteAndInsert { - if len(oldIdxKeyMutation.GetKeys()) > 0 && len(newIdxKeyMutation.GetKeys()) > 0 { - if bytes.Equal(oldIdxKeyMutation.GetKeys()[0], newIdxKeyMutation.GetKeys()[0]) { - skipMerge = true - } - } - } - if !skipMerge { - if len(oldIdxKeyMutation.GetKeys()) > 0 { - expectedMutations.MergeMutations(oldIdxKeyMutation) - } - if len(newIdxKeyMutation.GetKeys()) > 0 { - expectedMutations.MergeMutations(newIdxKeyMutation) - } - } - } - } - - return oldData, expectedMutations -} - -func TestAmendCollectAndGenMutations(t *testing.T) { - ctx := context.Background() - store, err := mockstore.NewMockStore() - require.NoError(t, err) - defer func() { require.NoError(t, store.Close()) }() - se := &session{ - store: store, - sessionVars: variable.NewSessionVars(nil), - } - se.mu.values = make(map[fmt.Stringer]interface{}) - domain.BindDomain(se, domain.NewMockDomain()) - startStates := []model.SchemaState{model.StateNone, model.StateDeleteOnly, model.StateWriteOnly, model.StateWriteReorganization} - for _, startState := range startStates { - endStatMap := ConstOpAddIndex[startState] - var endStates []model.SchemaState - for st := range endStatMap { - endStates = append(endStates, st) - } - slices.Sort(endStates) - for _, endState := range endStates { - logutil.BgLogger().Info("[TEST]>>>>>>new round test", zap.Stringer("start", startState), zap.Stringer("end", endState)) - // column: a, b, c, d, e, c_str, d_str, e_str, f, g. - // PK: a. - // indices: c_d_e, e, f, g, f_g, c_d_e_str, c_d_e_str_prefix. - oldTblMeta := core.MockSignedTable() - initTblColIdxID(oldTblMeta) - // Indices[0] does not exist at the start. - oldTblMeta.Indices = oldTblMeta.Indices[1:] - oldTbInfo, err := table.TableFromMeta(nil, oldTblMeta) - require.NoError(t, err) - oldTblMeta.Indices[0].State = startState - oldTblMeta.Indices[2].State = endState - oldTblMeta.Indices[3].State = startState - - newTblMeta := core.MockSignedTable() - initTblColIdxID(newTblMeta) - // colh is newly added. - colh := &model.ColumnInfo{ - State: model.StatePublic, - Offset: 12, - Name: model.NewCIStr("b"), - FieldType: *(types.NewFieldType(mysql.TypeLong)), - ID: 13, - } - newTblMeta.Columns = append(newTblMeta.Columns, colh) - // The last index "c_d_e_str_prefix is dropped. - newTblMeta.Indices = newTblMeta.Indices[:len(newTblMeta.Indices)-1] - newTblMeta.Indices[0].Unique = false - newTblInfo, err := table.TableFromMeta(nil, newTblMeta) - require.NoError(t, err) - newTblMeta.Indices[0].State = endState - // Indices[1] is newly created. - newTblMeta.Indices[1].State = endState - // Indices[3] is dropped - newTblMeta.Indices[3].State = startState - // Indices[4] is newly created unique index. - newTblMeta.Indices[4].State = endState - - // Only the add index amend operations is collected in the results. - collector := newAmendCollector() - tblID := int64(1) - err = collector.collectTblAmendOps(se, tblID, oldTbInfo, newTblInfo, 1< 0 { s.txn.SetOption(kv.KVFilter, temporaryTableKVFilter(tables)) } + s.txn.SetOption(kv.TxnSource, sessVars.CDCWriteSource) if tables := sessVars.TxnCtx.CachedTables; len(tables) > 0 { c := cachedTableRenewLease{tables: tables} now := time.Now() @@ -952,14 +964,16 @@ func (s *session) doCommitWithRetry(ctx context.Context) error { // If the transaction is invalid, maybe it has already been rolled back by the client. return nil } + isInternalTxn := false + if internal := s.txn.GetOption(kv.RequestSourceInternal); internal != nil && internal.(bool) { + isInternalTxn = true + } var err error txnSize := s.txn.Size() isPessimistic := s.txn.IsPessimistic() - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("session.doCommitWitRetry", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } + r, ctx := tracing.StartRegionEx(ctx, "session.doCommitWithRetry") + defer r.End() + err = s.doCommit(ctx) if err != nil { // polish the Write Conflict error message @@ -998,7 +1012,7 @@ func (s *session) doCommitWithRetry(ctx context.Context) error { } counter := s.sessionVars.TxnCtx.StatementCount duration := time.Since(s.GetSessionVars().TxnCtx.CreateTime).Seconds() - s.recordOnTransactionExecution(err, counter, duration) + s.recordOnTransactionExecution(err, counter, duration, isInternalTxn) if err != nil { if !errIsNoisy(err) { @@ -1082,11 +1096,8 @@ func (s *session) updateStatsDeltaToCollector() { } func (s *session) CommitTxn(ctx context.Context) error { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("session.CommitTxn", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } + r, ctx := tracing.StartRegionEx(ctx, "session.CommitTxn") + defer r.End() var commitDetail *tikvutil.CommitDetails ctx = context.WithValue(ctx, tikvutil.CommitDetailCtxKey, &commitDetail) @@ -1095,6 +1106,9 @@ func (s *session) CommitTxn(ctx context.Context) error { s.sessionVars.StmtCtx.MergeExecDetails(nil, commitDetail) } + // record the TTLInsertRows in the metric + metrics.TTLInsertRowsCount.Add(float64(s.sessionVars.TxnCtx.InsertTTLRowsCount)) + failpoint.Inject("keepHistory", func(val failpoint.Value) { if val.(bool) { failpoint.Return(err) @@ -1106,10 +1120,8 @@ func (s *session) CommitTxn(ctx context.Context) error { } func (s *session) RollbackTxn(ctx context.Context) { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("session.RollbackTxn", opentracing.ChildOf(span.Context())) - defer span1.Finish() - } + r, ctx := tracing.StartRegionEx(ctx, "session.RollbackTxn") + defer r.End() if s.txn.Valid() { terror.Log(s.txn.Rollback()) @@ -1206,7 +1218,11 @@ func (s *session) retry(ctx context.Context, maxCnt uint) (err error) { defer func() { s.sessionVars.RetryInfo.Retrying = false // retryCnt only increments on retryable error, so +1 here. - metrics.SessionRetry.Observe(float64(retryCnt + 1)) + if s.sessionVars.InRestrictedSQL { + transactionRetryInternal.Observe(float64(retryCnt + 1)) + } else { + transactionRetryGeneral.Observe(float64(retryCnt + 1)) + } s.sessionVars.SetInTxn(false) if err != nil { s.RollbackTxn(ctx) @@ -1266,10 +1282,10 @@ func (s *session) retry(ctx context.Context, maxCnt uint) (err error) { } s.txn.onStmtEnd() if err != nil { - s.StmtRollback() + s.StmtRollback(ctx, false) break } - s.StmtCommit() + s.StmtCommit(ctx) } logutil.Logger(ctx).Warn("transaction association", zap.Uint64("retrying txnStartTS", s.GetSessionVars().TxnCtx.StartTS), @@ -1433,13 +1449,13 @@ func (s *session) getTableValue(ctx context.Context, tblName string, varName str // replaceGlobalVariablesTableValue executes restricted sql updates the variable value // It will then notify the etcd channel that the value has changed. -func (s *session) replaceGlobalVariablesTableValue(ctx context.Context, varName, val string) error { +func (s *session) replaceGlobalVariablesTableValue(ctx context.Context, varName, val string, updateLocal bool) error { ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnSysVar) _, _, err := s.ExecRestrictedSQL(ctx, nil, `REPLACE INTO %n.%n (variable_name, variable_value) VALUES (%?, %?)`, mysql.SystemDB, mysql.GlobalVariablesTable, varName, val) if err != nil { return err } - domain.GetDomain(s).NotifyUpdateSysVarCache() + domain.GetDomain(s).NotifyUpdateSysVarCache(updateLocal) return err } @@ -1501,12 +1517,13 @@ func (s *session) SetGlobalSysVar(ctx context.Context, name string, value string if sv.GlobalConfigName != "" { domain.GetDomain(s).NotifyGlobalConfigChange(sv.GlobalConfigName, variable.OnOffToTrueFalse(value)) } - return s.replaceGlobalVariablesTableValue(context.TODO(), sv.Name, value) + return s.replaceGlobalVariablesTableValue(context.TODO(), sv.Name, value, true) } // SetGlobalSysVarOnly updates the sysvar, but does not call the validation function or update aliases. // This is helpful to prevent duplicate warnings being appended from aliases, or recursion. -func (s *session) SetGlobalSysVarOnly(ctx context.Context, name string, value string) (err error) { +// updateLocal indicates whether to rebuild the local SysVar Cache. This is helpful to prevent recursion. +func (s *session) SetGlobalSysVarOnly(ctx context.Context, name string, value string, updateLocal bool) (err error) { sv := variable.GetSysVar(name) if sv == nil { return variable.ErrUnknownSystemVar.GenWithStackByArgs(name) @@ -1517,7 +1534,7 @@ func (s *session) SetGlobalSysVarOnly(ctx context.Context, name string, value st if sv.HasInstanceScope() { // skip for INSTANCE scope return nil } - return s.replaceGlobalVariablesTableValue(ctx, sv.Name, value) + return s.replaceGlobalVariablesTableValue(ctx, sv.Name, value, updateLocal) } // SetTiDBTableValue implements GlobalVarAccessor.SetTiDBTableValue interface. @@ -1535,11 +1552,7 @@ func (s *session) GetTiDBTableValue(name string) (string, error) { var _ sqlexec.SQLParser = &session{} func (s *session) ParseSQL(ctx context.Context, sql string, params ...parser.ParseParam) ([]ast.StmtNode, []error, error) { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("session.ParseSQL", opentracing.ChildOf(span.Context())) - defer span1.Finish() - } - defer trace.StartRegion(ctx, "ParseSQL").End() + defer tracing.StartRegion(ctx, "ParseSQL").End() p := parserPool.Get().(*parser.Parser) defer parserPool.Put(p) @@ -1572,6 +1585,7 @@ func (s *session) SetProcessInfo(sql string, t time.Time, command byte, maxExecu if explain, ok := p.(*plannercore.Explain); ok && explain.Analyze && explain.TargetPlan != nil { p = explain.TargetPlan } + pi := util.ProcessInfo{ ID: s.sessionVars.ConnectionID, Port: s.sessionVars.Port, @@ -1585,12 +1599,15 @@ func (s *session) SetProcessInfo(sql string, t time.Time, command byte, maxExecu Info: sql, CurTxnStartTS: curTxnStartTS, StmtCtx: s.sessionVars.StmtCtx, + RefCountOfStmtCtx: &s.sessionVars.RefCountOfStmtCtx, MemTracker: s.sessionVars.MemTracker, DiskTracker: s.sessionVars.DiskTracker, StatsInfo: plannercore.GetStatsInfo, OOMAlarmVariablesInfo: s.getOomAlarmVariablesInfo(), MaxExecutionTime: maxExecutionTime, RedactSQL: s.sessionVars.EnableRedactLog, + ProtectedTSList: &s.sessionVars.ProtectedTSList, + ResourceGroupName: s.sessionVars.ResourceGroupName, } oldPi := s.ShowProcess() if p == nil { @@ -1603,7 +1620,7 @@ func (s *session) SetProcessInfo(sql string, t time.Time, command byte, maxExecu } } // We set process info before building plan, so we extended execution time. - if oldPi != nil && oldPi.Info == pi.Info { + if oldPi != nil && oldPi.Info == pi.Info && oldPi.Command == pi.Command { pi.Time = oldPi.Time } _, digest := s.sessionVars.StmtCtx.SQLDigest() @@ -1649,12 +1666,9 @@ func (s *session) ExecuteInternal(ctx context.Context, sql string, args ...inter pprof.SetGoroutineLabels(ctx) }() - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("session.ExecuteInternal", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - logutil.Eventf(ctx, "execute: %s", sql) - } + r, ctx := tracing.StartRegionEx(ctx, "session.ExecuteInternal") + defer r.End() + logutil.Eventf(ctx, "execute: %s", sql) stmtNode, err := s.ParseWithParams(ctx, sql, args...) if err != nil { @@ -1674,12 +1688,9 @@ func (s *session) ExecuteInternal(ctx context.Context, sql string, args ...inter // Execute is deprecated, we can remove it as soon as plugins are migrated. func (s *session) Execute(ctx context.Context, sql string) (recordSets []sqlexec.RecordSet, err error) { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("session.Execute", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - logutil.Eventf(ctx, "execute: %s", sql) - } + r, ctx := tracing.StartRegionEx(ctx, "session.Execute") + defer r.End() + logutil.Eventf(ctx, "execute: %s", sql) stmtNodes, err := s.Parse(ctx, sql) if err != nil { @@ -1864,6 +1875,21 @@ func (s *session) SetExtensions(extensions *extension.SessionExtensions) { s.extensions = extensions } +// InSandBoxMode indicates that this session is in sandbox mode +func (s *session) InSandBoxMode() bool { + return s.sandBoxMode +} + +// EnableSandBoxMode enable the sandbox mode. +func (s *session) EnableSandBoxMode() { + s.sandBoxMode = true +} + +// DisableSandBoxMode enable the sandbox mode. +func (s *session) DisableSandBoxMode() { + s.sandBoxMode = false +} + // ParseWithParams4Test wrapper (s *session) ParseWithParams for test func ParseWithParams4Test(ctx context.Context, s Session, sql string, args ...interface{}) (ast.StmtNode, error) { @@ -1964,6 +1990,7 @@ func (s *session) useCurrentSession(execOption sqlexec.ExecOption) (*session, fu s.sessionVars.StmtCtx.OriginalSQL = prevSQL s.sessionVars.StmtCtx.StmtType = prevStmtType s.sessionVars.StmtCtx.Tables = prevTables + s.sessionVars.MemTracker.Detach() }, nil } @@ -2025,6 +2052,7 @@ func (s *session) getInternalSession(execOption sqlexec.ExecOption) (*session, f se.sessionVars.PartitionPruneMode.Store(prePruneMode) se.sessionVars.OptimizerUseInvisibleIndexes = false se.sessionVars.InspectionTableCache = nil + se.sessionVars.MemTracker.Detach() s.sysSessionPool().Put(tmp) }, nil } @@ -2065,7 +2093,7 @@ func (s *session) ExecRestrictedSQL(ctx context.Context, opts []sqlexec.OptionFu metrics.SessionRestrictedSQLCounter.Inc() ctx = context.WithValue(ctx, execdetails.StmtExecDetailKey, &execdetails.StmtExecDetails{}) ctx = context.WithValue(ctx, tikvutil.ExecDetailsKey, &tikvutil.ExecDetails{}) - rs, err := se.ExecuteStmt(ctx, stmt) + rs, err := se.ExecuteInternalStmt(ctx, stmt) if err != nil { se.sessionVars.StmtCtx.AppendError(err) } @@ -2087,17 +2115,25 @@ func (s *session) ExecRestrictedSQL(ctx context.Context, opts []sqlexec.OptionFu }) } +// ExecuteInternalStmt execute internal stmt +func (s *session) ExecuteInternalStmt(ctx context.Context, stmtNode ast.StmtNode) (sqlexec.RecordSet, error) { + origin := s.sessionVars.InRestrictedSQL + s.sessionVars.InRestrictedSQL = true + defer func() { + s.sessionVars.InRestrictedSQL = origin + // Restore the goroutine label by using the original ctx after execution is finished. + pprof.SetGoroutineLabels(ctx) + }() + return s.ExecuteStmt(ctx, stmtNode) +} + func (s *session) ExecuteStmt(ctx context.Context, stmtNode ast.StmtNode) (sqlexec.RecordSet, error) { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("session.ExecuteStmt", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } + r, ctx := tracing.StartRegionEx(ctx, "session.ExecuteStmt") + defer r.End() if err := s.PrepareTxnCtx(ctx); err != nil { return nil, err } - if err := s.loadCommonGlobalVariablesIfNeeded(); err != nil { return nil, err } @@ -2142,10 +2178,6 @@ func (s *session) ExecuteStmt(ctx context.Context, stmtNode ast.StmtNode) (sqlex // Transform abstract syntax tree to a physical plan(stored in executor.ExecStmt). compiler := executor.Compiler{Ctx: s} stmt, err := compiler.Compile(ctx, stmtNode) - if err == nil { - err = sessiontxn.OptimizeWithPlanAndThenWarmUp(s, stmt.Plan) - } - if err != nil { s.rollbackOnError(ctx) @@ -2186,6 +2218,13 @@ func (s *session) ExecuteStmt(ctx context.Context, stmtNode ast.StmtNode) (sqlex recordSet, err = runStmt(ctx, s, stmt) } + // Observe the resource group query total counter if the resource control is enabled and the + // current session is attached with a resource group. + resourceGroupName := s.GetSessionVars().ResourceGroupName + if len(resourceGroupName) > 0 && resourceGroupName != variable.DefaultResourceGroupName { + metrics.ResourceGroupQueryTotalCounter.WithLabelValues(resourceGroupName).Inc() + } + if err != nil { if !errIsNoisy(err) { logutil.Logger(ctx).Warn("run statement failed", @@ -2217,7 +2256,7 @@ func (s *session) onTxnManagerStmtStartOrRetry(ctx context.Context, node ast.Stm func (s *session) validateStatementReadOnlyInStaleness(stmtNode ast.StmtNode) error { vars := s.GetSessionVars() - if !vars.TxnCtx.IsStaleness && vars.TxnReadTS.PeakTxnReadTS() == 0 && !vars.EnableExternalTSRead { + if !vars.TxnCtx.IsStaleness && vars.TxnReadTS.PeakTxnReadTS() == 0 && !vars.EnableExternalTSRead || vars.InRestrictedSQL { return nil } errMsg := "only support read-only statement during read-only staleness transactions" @@ -2280,12 +2319,12 @@ func runStmt(ctx context.Context, se *session, s sqlexec.Statement) (rs sqlexec. } }) - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("session.runStmt", opentracing.ChildOf(span.Context())) - span1.LogKV("sql", s.OriginText()) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) + r, ctx := tracing.StartRegionEx(ctx, "session.runStmt") + defer r.End() + if r.Span != nil { + r.Span.LogKV("sql", s.OriginText()) } + se.SetValue(sessionctx.QueryString, s.OriginText()) if _, ok := s.(*executor.ExecStmt).StmtNode.(ast.DDLNode); ok { se.SetValue(sessionctx.LastExecuteDDL, true) @@ -2325,7 +2364,7 @@ func runStmt(ctx context.Context, se *session, s sqlexec.Statement) (rs sqlexec. if rs != nil { if se.GetSessionVars().StmtCtx.IsExplainAnalyzeDML { if !sessVars.InTxn() { - se.StmtCommit() + se.StmtCommit(ctx) if err := se.CommitTxn(ctx); err != nil { return nil, err } @@ -2418,22 +2457,6 @@ func (s *session) rollbackOnError(ctx context.Context) { } } -// CacheGeneralStmt parses the sql, generates the corresponding PlanCacheStmt and cache it. -// The sql have to be parameterized, e.g. select * from t where a>?. -func (s *session) CacheGeneralStmt(sql string) (interface{}, error) { - if stmt := s.sessionVars.GetGeneralPlanCacheStmt(sql); stmt != nil { - // skip this step if there is already a PlanCacheStmt for this ql - return stmt, nil - } - - prepareExec := executor.NewPrepareExec(s, sql) - prepareExec.IsGeneralStmt = true - if err := prepareExec.Next(context.Background(), nil); err != nil { - return nil, err - } - return prepareExec.Stmt, nil -} - // PrepareStmt is used for executing prepare statement in binary protocol func (s *session) PrepareStmt(sql string) (stmtID uint32, paramCount int, fields []*ast.ResultField, err error) { if s.sessionVars.TxnCtx.InfoSchema == nil { @@ -2446,7 +2469,6 @@ func (s *session) PrepareStmt(sql string) (stmtID uint32, paramCount int, fields } ctx := context.Background() - inTxn := s.GetSessionVars().InTxn() // NewPrepareExec may need startTS to build the executor, for example prepare statement has subquery in int. // So we have to call PrepareTxnCtx here. if err = s.PrepareTxnCtx(ctx); err != nil { @@ -2463,13 +2485,12 @@ func (s *session) PrepareStmt(sql string) (stmtID uint32, paramCount int, fields } prepareExec := executor.NewPrepareExec(s, sql) err = prepareExec.Next(ctx, nil) + // Rollback even if err is nil. + s.rollbackOnError(ctx) + if err != nil { return } - if !inTxn { - // We could start a transaction to build the prepare executor before, we should rollback it here. - s.RollbackTxn(ctx) - } return prepareExec.ID, prepareExec.ParamCount, prepareExec.Fields, nil } @@ -2506,6 +2527,7 @@ func (s *session) Txn(active bool) (kv.Transaction, error) { return &s.txn, nil } _, err := sessiontxn.GetTxnManager(s).ActivateTxn() + s.SetMemoryFootprintChangeHook() return &s.txn, err } @@ -2578,7 +2600,7 @@ func (s *session) GetSessionVars() *variable.SessionVars { func (s *session) AuthPluginForUser(user *auth.UserIdentity) (string, error) { pm := privilege.GetPrivilegeManager(s) - authplugin, err := pm.GetAuthPlugin(user.Username, user.Hostname) + authplugin, err := pm.GetAuthPluginForConnection(user.Username, user.Hostname) if err != nil { return "", err } @@ -2598,9 +2620,107 @@ func (s *session) Auth(user *auth.UserIdentity, authentication, salt []byte) err if err != nil { return privileges.ErrAccessDenied.FastGenByArgs(user.Username, user.Hostname, hasPassword) } - if err = pm.ConnectionVerification(user, authUser.Username, authUser.Hostname, authentication, salt, s.sessionVars.TLSConnectionState); err != nil { + // Check whether continuous login failure is enabled to lock the account. + // If enabled, determine whether to unlock the account and notify TiDB to update the cache. + enableAutoLock := pm.IsAccountAutoLockEnabled(authUser.Username, authUser.Hostname) + if enableAutoLock { + err = failedLoginTrackingBegin(s) + if err != nil { + return err + } + lockStatusChanged, err := verifyAccountAutoLock(s, authUser.Username, authUser.Hostname) + if err != nil { + rollbackErr := failedLoginTrackingRollback(s) + if rollbackErr != nil { + return rollbackErr + } + return err + } + err = failedLoginTrackingCommit(s) + if err != nil { + rollbackErr := failedLoginTrackingRollback(s) + if rollbackErr != nil { + return rollbackErr + } + return err + } + if lockStatusChanged { + // Notification auto unlock. + err = domain.GetDomain(s).NotifyUpdatePrivilege() + if err != nil { + return err + } + } + } + + info, err := pm.ConnectionVerification(user, authUser.Username, authUser.Hostname, authentication, salt, s.sessionVars) + if err != nil { + if info.FailedDueToWrongPassword { + // when user enables the account locking function for consecutive login failures, + // the system updates the login failure count and determines whether to lock the account when authentication fails. + if enableAutoLock { + err := failedLoginTrackingBegin(s) + if err != nil { + return err + } + lockStatusChanged, passwordLocking, trackingErr := authFailedTracking(s, authUser.Username, authUser.Hostname) + if trackingErr != nil { + if rollBackErr := failedLoginTrackingRollback(s); rollBackErr != nil { + return rollBackErr + } + return trackingErr + } + if err := failedLoginTrackingCommit(s); err != nil { + if rollBackErr := failedLoginTrackingRollback(s); rollBackErr != nil { + return rollBackErr + } + return err + } + if lockStatusChanged { + // Notification auto lock. + err := autolockAction(s, passwordLocking, authUser.Username, authUser.Hostname) + if err != nil { + return err + } + } + } + } return err } + + // If tidb_resource_control_enable is disabled, set resource group to empty + if variable.EnableResourceControl.Load() { + s.sessionVars.ResourceGroupName = strings.ToLower(info.ResourceGroupName) + } else { + s.sessionVars.ResourceGroupName = "" + } + + if info.InSandBoxMode { + // Enter sandbox mode, only execute statement for resetting password. + s.EnableSandBoxMode() + } + if enableAutoLock { + err := failedLoginTrackingBegin(s) + if err != nil { + return err + } + // The password is correct. If the account is not locked, the number of login failure statistics will be cleared. + err = authSuccessClearCount(s, authUser.Username, authUser.Hostname) + if err != nil { + if rollBackErr := failedLoginTrackingRollback(s); rollBackErr != nil { + return rollBackErr + } + return err + } + err = failedLoginTrackingCommit(s) + if err != nil { + if rollBackErr := failedLoginTrackingRollback(s); rollBackErr != nil { + return rollBackErr + } + return err + } + } + pm.AuthSuccess(authUser.Username, authUser.Hostname) user.AuthUsername = authUser.Username user.AuthHostname = authUser.Hostname s.sessionVars.User = user @@ -2608,6 +2728,217 @@ func (s *session) Auth(user *auth.UserIdentity, authentication, salt []byte) err return nil } +func authSuccessClearCount(s *session, user string, host string) error { + // Obtain accurate lock status and failure count information. + passwordLocking, err := getFailedLoginUserAttributes(s, user, host) + if err != nil { + return err + } + // If the account is locked, it may be caused by the untimely update of the cache, + // directly report the account lock. + if passwordLocking.AutoAccountLocked { + if passwordLocking.PasswordLockTimeDays == -1 { + return privileges.GenerateAccountAutoLockErr(passwordLocking.FailedLoginAttempts, user, host, + "unlimited", "unlimited") + } + + lds := strconv.FormatInt(passwordLocking.PasswordLockTimeDays, 10) + return privileges.GenerateAccountAutoLockErr(passwordLocking.FailedLoginAttempts, user, host, lds, lds) + } + if passwordLocking.FailedLoginCount != 0 { + // If the number of account login failures is not zero, it will be updated to 0. + passwordLockingJSON := privileges.BuildSuccessPasswordLockingJSON(passwordLocking.FailedLoginAttempts, + passwordLocking.PasswordLockTimeDays) + if passwordLockingJSON != "" { + if err := s.passwordLocking(user, host, passwordLockingJSON); err != nil { + return err + } + } + } + return nil +} + +func verifyAccountAutoLock(s *session, user, host string) (bool, error) { + pm := privilege.GetPrivilegeManager(s) + // Use the cache to determine whether to unlock the account. + // If the account needs to be unlocked, read the database information to determine whether + // the account needs to be unlocked. Otherwise, an error message is displayed. + lockStatusInMemory, err := pm.VerifyAccountAutoLockInMemory(user, host) + if err != nil { + return false, err + } + // If the lock status in the cache is Unlock, the automatic unlock is skipped. + // If memory synchronization is slow and there is a lock in the database, it will be processed upon successful login. + if !lockStatusInMemory { + return false, nil + } + lockStatusChanged := false + var plJSON string + // After checking the cache, obtain the latest data from the database and determine + // whether to automatically unlock the database to prevent repeated unlock errors. + pl, err := getFailedLoginUserAttributes(s, user, host) + if err != nil { + return false, err + } + if pl.AutoAccountLocked { + // If it is locked, need to check whether it can be automatically unlocked. + lockTimeDay := pl.PasswordLockTimeDays + if lockTimeDay == -1 { + return false, privileges.GenerateAccountAutoLockErr(pl.FailedLoginAttempts, user, host, "unlimited", "unlimited") + } + lastChanged := pl.AutoLockedLastChanged + d := time.Now().Unix() - lastChanged + if d > lockTimeDay*24*60*60 { + // Generate unlock json string. + plJSON = privileges.BuildPasswordLockingJSON(pl.FailedLoginAttempts, + pl.PasswordLockTimeDays, "N", 0, time.Now().Format(time.UnixDate)) + } else { + lds := strconv.FormatInt(lockTimeDay, 10) + rds := strconv.FormatInt(int64(math.Ceil(float64(lockTimeDay)-float64(d)/(24*60*60))), 10) + return false, privileges.GenerateAccountAutoLockErr(pl.FailedLoginAttempts, user, host, lds, rds) + } + } + if plJSON != "" { + lockStatusChanged = true + if err = s.passwordLocking(user, host, plJSON); err != nil { + return false, err + } + } + return lockStatusChanged, nil +} + +func authFailedTracking(s *session, user string, host string) (bool, *privileges.PasswordLocking, error) { + // Obtain the number of consecutive password login failures. + passwordLocking, err := getFailedLoginUserAttributes(s, user, host) + if err != nil { + return false, nil, err + } + // Consecutive wrong password login failure times +1, + // If the lock condition is satisfied, the lock status is updated and the update cache is notified. + lockStatusChanged, err := userAutoAccountLocked(s, user, host, passwordLocking) + if err != nil { + return false, nil, err + } + return lockStatusChanged, passwordLocking, nil +} + +func autolockAction(s *session, passwordLocking *privileges.PasswordLocking, user, host string) error { + // Don't want to update the cache frequently, and only trigger the update cache when the lock status is updated. + err := domain.GetDomain(s).NotifyUpdatePrivilege() + if err != nil { + return err + } + // The number of failed login attempts reaches FAILED_LOGIN_ATTEMPTS. + // An error message is displayed indicating permission denial and account lock. + if passwordLocking.PasswordLockTimeDays == -1 { + return privileges.GenerateAccountAutoLockErr(passwordLocking.FailedLoginAttempts, user, host, + "unlimited", "unlimited") + } + lds := strconv.FormatInt(passwordLocking.PasswordLockTimeDays, 10) + return privileges.GenerateAccountAutoLockErr(passwordLocking.FailedLoginAttempts, user, host, lds, lds) +} + +func (s *session) passwordLocking(user string, host string, newAttributesStr string) error { + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, "UPDATE %n.%n SET ", mysql.SystemDB, mysql.UserTable) + sqlexec.MustFormatSQL(sql, "user_attributes=json_merge_patch(coalesce(user_attributes, '{}'), %?)", newAttributesStr) + sqlexec.MustFormatSQL(sql, " WHERE Host=%? and User=%?;", host, user) + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnPrivilege) + _, err := s.ExecuteInternal(ctx, sql.String()) + return err +} + +func failedLoginTrackingBegin(s *session) error { + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnPrivilege) + _, err := s.ExecuteInternal(ctx, "BEGIN PESSIMISTIC") + return err +} + +func failedLoginTrackingCommit(s *session) error { + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnPrivilege) + _, err := s.ExecuteInternal(ctx, "COMMIT") + if err != nil { + _, rollBackErr := s.ExecuteInternal(ctx, "ROLLBACK") + if rollBackErr != nil { + return rollBackErr + } + } + return err +} + +func failedLoginTrackingRollback(s *session) error { + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnPrivilege) + _, err := s.ExecuteInternal(ctx, "ROLLBACK") + return err +} + +// getFailedLoginUserAttributes queries the exact number of consecutive password login failures (concurrency is not allowed). +func getFailedLoginUserAttributes(s *session, user string, host string) (*privileges.PasswordLocking, error) { + passwordLocking := &privileges.PasswordLocking{} + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnPrivilege) + rs, err := s.ExecuteInternal(ctx, `SELECT user_attributes from mysql.user WHERE USER = %? AND HOST = %? for update`, user, host) + if err != nil { + return passwordLocking, err + } + defer func() { + if closeErr := rs.Close(); closeErr != nil { + err = closeErr + } + }() + req := rs.NewChunk(nil) + iter := chunk.NewIterator4Chunk(req) + err = rs.Next(ctx, req) + if err != nil { + return passwordLocking, err + } + if req.NumRows() == 0 { + return passwordLocking, fmt.Errorf("user_attributes by `%s`@`%s` not found", user, host) + } + row := iter.Begin() + if !row.IsNull(0) { + passwordLockingJSON := row.GetJSON(0) + return passwordLocking, passwordLocking.ParseJSON(passwordLockingJSON) + } + return passwordLocking, fmt.Errorf("user_attributes by `%s`@`%s` not found", user, host) +} + +func userAutoAccountLocked(s *session, user string, host string, pl *privileges.PasswordLocking) (bool, error) { + // Indicates whether the user needs to update the lock status change. + lockStatusChanged := false + // The number of consecutive login failures is stored in the database. + // If the current login fails, one is added to the number of consecutive login failures + // stored in the database to determine whether the user needs to be locked and the number of update failures. + failedLoginCount := pl.FailedLoginCount + 1 + // If the cache is not updated, but it is already locked, it will report that the account is locked. + if pl.AutoAccountLocked { + if pl.PasswordLockTimeDays == -1 { + return false, privileges.GenerateAccountAutoLockErr(pl.FailedLoginAttempts, user, host, + "unlimited", "unlimited") + } + lds := strconv.FormatInt(pl.PasswordLockTimeDays, 10) + return false, privileges.GenerateAccountAutoLockErr(pl.FailedLoginAttempts, user, host, lds, lds) + } + + autoAccountLocked := "N" + autoLockedLastChanged := "" + if pl.FailedLoginAttempts == 0 || pl.PasswordLockTimeDays == 0 { + return false, nil + } + + if failedLoginCount >= pl.FailedLoginAttempts { + autoLockedLastChanged = time.Now().Format(time.UnixDate) + autoAccountLocked = "Y" + lockStatusChanged = true + } + + newAttributesStr := privileges.BuildPasswordLockingJSON(pl.FailedLoginAttempts, + pl.PasswordLockTimeDays, autoAccountLocked, failedLoginCount, autoLockedLastChanged) + if newAttributesStr != "" { + return lockStatusChanged, s.passwordLocking(user, host, newAttributesStr) + } + return lockStatusChanged, nil +} + // MatchIdentity finds the matching username + password in the MySQL privilege tables // for a username + hostname, since MySQL can have wildcards. func (s *session) MatchIdentity(username, remoteHost string) (*auth.UserIdentity, error) { @@ -2747,17 +3078,24 @@ func loadCollationParameter(ctx context.Context, se *session) (bool, error) { return false, nil } +type tableBasicInfo struct { + SQL string + id int64 +} + var ( errResultIsEmpty = dbterror.ClassExecutor.NewStd(errno.ErrResultIsEmpty) // DDLJobTables is a list of tables definitions used in concurrent DDL. - DDLJobTables = []struct { - SQL string - id int64 - }{ + DDLJobTables = []tableBasicInfo{ {ddl.JobTableSQL, ddl.JobTableID}, {ddl.ReorgTableSQL, ddl.ReorgTableID}, {ddl.HistoryTableSQL, ddl.HistoryTableID}, } + // BackfillTables is a list of tables definitions used in dist reorg DDL. + BackfillTables = []tableBasicInfo{ + {ddl.BackgroundSubtaskTableSQL, ddl.BackgroundSubtaskTableID}, + {ddl.BackgroundSubtaskHistoryTableSQL, ddl.BackgroundSubtaskHistoryTableID}, + } mdlTable = "create table mysql.tidb_mdl_info(job_id BIGINT NOT NULL PRIMARY KEY, version BIGINT NOT NULL, table_ids text(65535));" ) @@ -2775,51 +3113,62 @@ func splitAndScatterTable(store kv.Storage, tableIDs []int64) { } } -// InitDDLJobTables is to create tidb_ddl_job, tidb_ddl_reorg and tidb_ddl_history. -func InitDDLJobTables(store kv.Storage) error { +// InitDDLJobTables is to create tidb_ddl_job, tidb_ddl_reorg and tidb_ddl_history, or tidb_background_subtask and tidb_background_subtask_history. +func InitDDLJobTables(store kv.Storage, targetVer meta.DDLTableVersion) error { + targetTables := DDLJobTables + if targetVer == meta.BackfillTableVersion { + targetTables = BackfillTables + } return kv.RunInNewTxn(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), store, true, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) - exists, err := t.CheckDDLTableExists() - if err != nil || exists { + tableVer, err := t.CheckDDLTableVersion() + if err != nil || tableVer >= targetVer { return errors.Trace(err) } dbID, err := t.CreateMySQLDatabaseIfNotExists() if err != nil { return err } - tableIDs := make([]int64, 0, len(DDLJobTables)) - for _, tbl := range DDLJobTables { - tableIDs = append(tableIDs, tbl.id) - } - splitAndScatterTable(store, tableIDs) - p := parser.New() - for _, tbl := range DDLJobTables { - stmt, err := p.ParseOneStmt(tbl.SQL, "", "") - if err != nil { - return errors.Trace(err) - } - tblInfo, err := ddl.BuildTableInfoFromAST(stmt.(*ast.CreateTableStmt)) - if err != nil { - return errors.Trace(err) - } - tblInfo.State = model.StatePublic - tblInfo.ID = tbl.id - tblInfo.UpdateTS = t.StartTS - err = t.CreateTableOrView(dbID, tblInfo) - if err != nil { - return errors.Trace(err) - } + if err = createAndSplitTables(store, t, dbID, targetTables); err != nil { + return err } - return t.SetDDLTables() + return t.SetDDLTables(targetVer) }) } +func createAndSplitTables(store kv.Storage, t *meta.Meta, dbID int64, tables []tableBasicInfo) error { + tableIDs := make([]int64, 0, len(tables)) + for _, tbl := range tables { + tableIDs = append(tableIDs, tbl.id) + } + splitAndScatterTable(store, tableIDs) + p := parser.New() + for _, tbl := range tables { + stmt, err := p.ParseOneStmt(tbl.SQL, "", "") + if err != nil { + return errors.Trace(err) + } + tblInfo, err := ddl.BuildTableInfoFromAST(stmt.(*ast.CreateTableStmt)) + if err != nil { + return errors.Trace(err) + } + tblInfo.State = model.StatePublic + tblInfo.ID = tbl.id + tblInfo.UpdateTS = t.StartTS + err = t.CreateTableOrView(dbID, tblInfo) + if err != nil { + return errors.Trace(err) + } + } + return nil +} + // InitMDLTable is to create tidb_mdl_info, which is used for metadata lock. func InitMDLTable(store kv.Storage) error { return kv.RunInNewTxn(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), store, true, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) - exists, err := t.CheckMDLTableExists() - if err != nil || exists { + ver, err := t.CheckDDLTableVersion() + if err != nil || ver >= meta.MDLTableVersion { return errors.Trace(err) } dbID, err := t.CreateMySQLDatabaseIfNotExists() @@ -2844,10 +3193,70 @@ func InitMDLTable(store kv.Storage) error { return errors.Trace(err) } - return t.SetMDLTables() + return t.SetDDLTables(meta.MDLTableVersion) }) } +// InitMDLVariableForBootstrap initializes the metadata lock variable. +func InitMDLVariableForBootstrap(store kv.Storage) error { + err := kv.RunInNewTxn(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), store, true, func(ctx context.Context, txn kv.Transaction) error { + t := meta.NewMeta(txn) + return t.SetMetadataLock(true) + }) + if err != nil { + return err + } + variable.EnableMDL.Store(true) + return nil +} + +// InitMDLVariableForUpgrade initializes the metadata lock variable. +func InitMDLVariableForUpgrade(store kv.Storage) (bool, error) { + isNull := false + enable := false + var err error + err = kv.RunInNewTxn(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), store, true, func(ctx context.Context, txn kv.Transaction) error { + t := meta.NewMeta(txn) + enable, isNull, err = t.GetMetadataLock() + if err != nil { + return err + } + return nil + }) + if isNull || !enable { + variable.EnableMDL.Store(false) + } else { + variable.EnableMDL.Store(true) + } + return isNull, err +} + +// InitMDLVariable initializes the metadata lock variable. +func InitMDLVariable(store kv.Storage) error { + isNull := false + enable := false + var err error + err = kv.RunInNewTxn(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), store, true, func(ctx context.Context, txn kv.Transaction) error { + t := meta.NewMeta(txn) + enable, isNull, err = t.GetMetadataLock() + if err != nil { + return err + } + if isNull { + // Workaround for version: nightly-2022-11-07 to nightly-2022-11-17. + enable = true + logutil.BgLogger().Warn("metadata lock is null") + err = t.SetMetadataLock(true) + if err != nil { + return err + } + } + return nil + }) + variable.EnableMDL.Store(enable) + return err +} + // BootstrapSession runs the first time when the TiDB server start. func BootstrapSession(store kv.Storage) (*domain.Domain, error) { ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBootstrap) @@ -2861,7 +3270,7 @@ func BootstrapSession(store kv.Storage) (*domain.Domain, error) { return nil, err } } - err := InitDDLJobTables(store) + err := InitDDLJobTables(store, meta.BaseDDLTableVersion) if err != nil { return nil, err } @@ -2869,16 +3278,25 @@ func BootstrapSession(store kv.Storage) (*domain.Domain, error) { if err != nil { return nil, err } + err = InitDDLJobTables(store, meta.BackfillTableVersion) + if err != nil { + return nil, err + } ver := getStoreBootstrapVersion(store) if ver == notBootstrapped { runInBootstrapSession(store, bootstrap) } else if ver < currentBootstrapVersion { runInBootstrapSession(store, upgrade) + } else { + err = InitMDLVariable(store) + if err != nil { + return nil, err + } } analyzeConcurrencyQuota := int(config.GetGlobalConfig().Performance.AnalyzePartitionConcurrencyQuota) concurrency := int(config.GetGlobalConfig().Performance.StatsLoadConcurrency) - ses, err := createSessions(store, 8) + ses, err := createSessions(store, 10) if err != nil { return nil, err } @@ -2923,6 +3341,14 @@ func BootstrapSession(store kv.Storage) (*domain.Domain, error) { return nil, err } + if config.GetGlobalConfig().DisaggregatedTiFlash && !config.GetGlobalConfig().UseAutoScaler { + // Invalid client-go tiflash_compute store cache if necessary. + err = dom.WatchTiFlashComputeNodeChange() + if err != nil { + return nil, err + } + } + if err = extensionimpl.Bootstrap(context.Background(), dom); err != nil { return nil, err } @@ -2946,19 +3372,41 @@ func BootstrapSession(store kv.Storage) (*domain.Domain, error) { if dom.GetEtcdClient() != nil { // We only want telemetry data in production-like clusters. When TiDB is deployed over other engines, // for example, unistore engine (used for local tests), we just skip it. Its etcd client is nil. - go func() { - dom.TelemetryReportLoop(ses[5]) - dom.TelemetryRotateSubWindowLoop(ses[5]) - }() + if config.GetGlobalConfig().EnableTelemetry { + // There is no way to turn telemetry on with global variable `tidb_enable_telemetry` + // when it is disabled in config. See IsTelemetryEnabled function in telemetry/telemetry.go + go func() { + dom.TelemetryReportLoop(ses[5]) + dom.TelemetryRotateSubWindowLoop(ses[5]) + }() + } } + planReplayerWorkerCnt := config.GetGlobalConfig().Performance.PlanReplayerDumpWorkerConcurrency + planReplayerWorkersSctx := make([]sessionctx.Context, planReplayerWorkerCnt) + pworkerSes, err := createSessions(store, int(planReplayerWorkerCnt)) + if err != nil { + return nil, err + } + for i := 0; i < int(planReplayerWorkerCnt); i++ { + planReplayerWorkersSctx[i] = pworkerSes[i] + } // setup plan replayer handle - dom.SetupPlanReplayerHandle(ses[6]) + dom.SetupPlanReplayerHandle(ses[6], planReplayerWorkersSctx) dom.StartPlanReplayerHandle() // setup dumpFileGcChecker dom.SetupDumpFileGCChecker(ses[7]) dom.DumpFileGcCheckerLoop() - + // setup historical stats worker + dom.SetupHistoricalStatsWorker(ses[8]) + dom.StartHistoricalStatsWorker() + if runBootstrapSQLFile { + pm := &privileges.UserPrivileges{ + Handle: dom.PrivilegeHandle(), + } + privilege.BindPrivilegeManager(ses[9], pm) + doBootstrapSQLFile(ses[9]) + } // A sub context for update table stats, and other contexts for concurrent stats loading. cnt := 1 + concurrency syncStatsCtxs, err := createSessions(store, cnt) @@ -2969,9 +3417,29 @@ func BootstrapSession(store kv.Storage) (*domain.Domain, error) { for i := 0; i < cnt; i++ { subCtxs[i] = sessionctx.Context(syncStatsCtxs[i]) } - if err = dom.LoadAndUpdateStatsLoop(subCtxs); err != nil { + initStatsCtx, err := createSession(store) + if err != nil { return nil, err } + if err = dom.LoadAndUpdateStatsLoop(subCtxs, initStatsCtx); err != nil { + return nil, err + } + + // start TTL job manager after setup stats collector + // because TTL could modify a lot of columns, and need to trigger auto analyze + ttlworker.AttachStatsCollector = func(s sqlexec.SQLExecutor) sqlexec.SQLExecutor { + if s, ok := s.(*session); ok { + return attachStatsCollector(s, dom) + } + return s + } + ttlworker.DetachStatsCollector = func(s sqlexec.SQLExecutor) sqlexec.SQLExecutor { + if s, ok := s.(*session); ok { + return detachStatsCollector(s) + } + return s + } + dom.StartTTLJobManager() analyzeCtxs, err := createSessions(store, analyzeConcurrencyQuota) if err != nil { @@ -3072,12 +3540,32 @@ func createSessionWithOpt(store kv.Storage, opt *Opt) (*session, error) { s.sessionVars.BinlogClient = binloginfo.GetPumpsClient() s.txn.init() - sessionBindHandle := bindinfo.NewSessionBindHandle(parser.New()) + sessionBindHandle := bindinfo.NewSessionBindHandle() s.SetValue(bindinfo.SessionBindInfoKeyType, sessionBindHandle) s.SetSessionStatesHandler(sessionstates.StateBinding, sessionBindHandle) return s, nil } +// attachStatsCollector attaches the stats collector in the dom for the session +func attachStatsCollector(s *session, dom *domain.Domain) *session { + if dom.StatsHandle() != nil && dom.StatsUpdating() { + s.statsCollector = dom.StatsHandle().NewSessionStatsCollector() + if GetIndexUsageSyncLease() > 0 { + s.idxUsageCollector = dom.StatsHandle().NewSessionIndexUsageCollector() + } + } + + return s +} + +// detachStatsCollector removes the stats collector in the session +func detachStatsCollector(s *session) *session { + s.statsCollector = nil + s.idxUsageCollector = nil + + return s +} + // CreateSessionWithDomain creates a new Session and binds it with a Domain. // We need this because when we start DDL in Domain, the DDL need a session // to change some system tables. But at that time, we have been already in @@ -3364,22 +3852,42 @@ func logGeneralQuery(execStmt *executor.ExecStmt, s *session, isPrepared bool) { } } -func (s *session) recordOnTransactionExecution(err error, counter int, duration float64) { +func (s *session) recordOnTransactionExecution(err error, counter int, duration float64, isInternal bool) { if s.sessionVars.TxnCtx.IsPessimistic { if err != nil { - statementPerTransactionPessimisticError.Observe(float64(counter)) - transactionDurationPessimisticAbort.Observe(duration) + if isInternal { + transactionDurationPessimisticAbortInternal.Observe(duration) + statementPerTransactionPessimisticErrorInternal.Observe(float64(counter)) + } else { + transactionDurationPessimisticAbortGeneral.Observe(duration) + statementPerTransactionPessimisticErrorGeneral.Observe(float64(counter)) + } } else { - statementPerTransactionPessimisticOK.Observe(float64(counter)) - transactionDurationPessimisticCommit.Observe(duration) + if isInternal { + transactionDurationPessimisticCommitInternal.Observe(duration) + statementPerTransactionPessimisticOKInternal.Observe(float64(counter)) + } else { + transactionDurationPessimisticCommitGeneral.Observe(duration) + statementPerTransactionPessimisticOKGeneral.Observe(float64(counter)) + } } } else { if err != nil { - statementPerTransactionOptimisticError.Observe(float64(counter)) - transactionDurationOptimisticAbort.Observe(duration) + if isInternal { + transactionDurationOptimisticAbortInternal.Observe(duration) + statementPerTransactionOptimisticErrorInternal.Observe(float64(counter)) + } else { + transactionDurationOptimisticAbortGeneral.Observe(duration) + statementPerTransactionOptimisticErrorGeneral.Observe(float64(counter)) + } } else { - statementPerTransactionOptimisticOK.Observe(float64(counter)) - transactionDurationOptimisticCommit.Observe(duration) + if isInternal { + transactionDurationOptimisticCommitInternal.Observe(duration) + statementPerTransactionOptimisticOKInternal.Observe(float64(counter)) + } else { + transactionDurationOptimisticCommitGeneral.Observe(duration) + statementPerTransactionOptimisticOKGeneral.Observe(float64(counter)) + } } } } @@ -3518,6 +4026,10 @@ func (s *session) updateTelemetryMetric(es *executor.ExecStmt) { telemetryCTEUsageNotCTE.Inc() } + if ti.UseIndexMerge { + telemetryIndexMerge.Inc() + } + if ti.UseMultiSchemaChange { telemetryMultiSchemaChangeUsage.Inc() } @@ -3526,7 +4038,7 @@ func (s *session) updateTelemetryMetric(es *executor.ExecStmt) { telemetryFlashbackClusterUsage.Inc() } - if ti.UesExchangePartition { + if ti.UseExchangePartition { telemetryExchangePartitionUsage.Inc() } @@ -3568,6 +4080,12 @@ func (s *session) updateTelemetryMetric(es *executor.ExecStmt) { if ti.PartitionTelemetry.UseDropIntervalPartition { telemetryTablePartitionDropIntervalUsage.Inc() } + if ti.PartitionTelemetry.UseCompactTablePartition { + telemetryTableCompactPartitionUsage.Inc() + } + if ti.PartitionTelemetry.UseReorganizePartition { + telemetryReorganizePartitionUsage.Inc() + } } if ti.AccountLockTelemetry != nil { @@ -3575,6 +4093,10 @@ func (s *session) updateTelemetryMetric(es *executor.ExecStmt) { telemetryUnlockUserUsage.Add(float64(ti.AccountLockTelemetry.UnlockUser)) telemetryCreateOrAlterUserUsage.Add(float64(ti.AccountLockTelemetry.CreateOrAlterUser)) } + + if ti.UseTableLookUp && s.sessionVars.StoreBatchSize > 0 { + telemetryStoreBatchedUsage.Inc() + } } // GetBuiltinFunctionUsage returns the replica of counting of builtin function usage @@ -3599,6 +4121,25 @@ func (s *session) GetStmtStats() *stmtstats.StatementStats { return s.stmtStats } +// SetMemoryFootprintChangeHook sets the hook that is called when the memdb changes its size. +// Call this after s.txn becomes valid, since TxnInfo is initialized when the txn becomes valid. +func (s *session) SetMemoryFootprintChangeHook() { + if config.GetGlobalConfig().Performance.TxnTotalSizeLimit != config.DefTxnTotalSizeLimit { + // if the user manually specifies the config, don't involve the new memory tracker mechanism, let the old config + // work as before. + return + } + hook := func(mem uint64) { + if s.sessionVars.MemDBFootprint == nil { + tracker := memory.NewTracker(memory.LabelForMemDB, -1) + tracker.AttachTo(s.sessionVars.MemTracker) + s.sessionVars.MemDBFootprint = tracker + } + s.sessionVars.MemDBFootprint.ReplaceBytesUsed(int64(mem)) + } + s.txn.SetMemoryFootprintChangeHook(hook) +} + // EncodeSessionStates implements SessionStatesHandler.EncodeSessionStates interface. func (s *session) EncodeSessionStates(ctx context.Context, sctx sessionctx.Context, sessionStates *sessionstates.SessionStates) error { // Transaction status is hard to encode, so we do not support it. @@ -3624,6 +4165,10 @@ func (s *session) EncodeSessionStates(ctx context.Context, sctx sessionctx.Conte if len(s.lockedTables) > 0 { return sessionstates.ErrCannotMigrateSession.GenWithStackByArgs("session has locked tables") } + // It's insecure to migrate sandBoxMode because users can fake it. + if s.InSandBoxMode() { + return sessionstates.ErrCannotMigrateSession.GenWithStackByArgs("session is in sandbox mode") + } if err := s.sessionVars.EncodeSessionStates(ctx, sessionStates); err != nil { return err @@ -3633,8 +4178,9 @@ func (s *session) EncodeSessionStates(ctx context.Context, sctx sessionctx.Conte sessionStates.SystemVars = make(map[string]string) for _, sv := range variable.GetSysVars() { switch { - case sv.Hidden, sv.HasNoneScope(), sv.HasInstanceScope(), !sv.HasSessionScope(): - // Hidden and none-scoped variables cannot be modified. + case sv.HasNoneScope(), sv.HasInstanceScope(), !sv.HasSessionScope(): + // Hidden attribute is deprecated. + // None-scoped variables cannot be modified. // Instance-scoped variables don't need to be encoded. // Noop variables should also be migrated even if they are noop. continue @@ -3690,23 +4236,26 @@ func (s *session) setRequestSource(ctx context.Context, stmtLabel string, stmtNo } else { s.sessionVars.RequestSourceType = stmtLabel } - } else { - if source := ctx.Value(kv.RequestSourceKey); source != nil { - s.sessionVars.RequestSourceType = source.(kv.RequestSource).RequestSourceType - } else { - // panic in test mode in case there are requests without source in the future. - // log warnings in production mode. - if flag.Lookup("test.v") != nil || flag.Lookup("check.v") != nil { - panic("unexpected no source type context, if you see this error, " + - "the `RequestSourceTypeKey` is missing in your context") - } else { - logutil.Logger(ctx).Warn("unexpected no source type context, if you see this warning, "+ - "the `RequestSourceTypeKey` is missing in the context", - zap.Bool("internal", s.isInternal()), - zap.String("sql", stmtNode.Text())) - } + return + } + if source := ctx.Value(kv.RequestSourceKey); source != nil { + requestSource := source.(kv.RequestSource) + if requestSource.RequestSourceType != "" { + s.sessionVars.RequestSourceType = requestSource.RequestSourceType + return } } + // panic in test mode in case there are requests without source in the future. + // log warnings in production mode. + if intest.InTest { + panic("unexpected no source type context, if you see this error, " + + "the `RequestSourceTypeKey` is missing in your context") + } else { + logutil.Logger(ctx).Warn("unexpected no source type context, if you see this warning, "+ + "the `RequestSourceTypeKey` is missing in the context", + zap.Bool("internal", s.isInternal()), + zap.String("sql", stmtNode.Text())) + } } // RemoveLockDDLJobs removes the DDL jobs which doesn't get the metadata lock from job2ver. diff --git a/session/session_test.go b/session/session_test.go index 1c7c8f2ba7611..1426c689997d6 100644 --- a/session/session_test.go +++ b/session/session_test.go @@ -21,10 +21,13 @@ import ( "testing" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/testkit/external" + "github.com/prometheus/client_golang/prometheus" + dto "github.com/prometheus/client_model/go" "github.com/stretchr/testify/require" ) @@ -37,10 +40,16 @@ func TestInitMetaTable(t *testing.T) { tk.MustExec(sql.SQL) } + for _, sql := range session.BackfillTables { + tk.MustExec(sql.SQL) + } + tbls := map[string]struct{}{ - "tidb_ddl_job": {}, - "tidb_ddl_reorg": {}, - "tidb_ddl_history": {}, + "tidb_ddl_job": {}, + "tidb_ddl_reorg": {}, + "tidb_ddl_history": {}, + "tidb_background_subtask": {}, + "tidb_background_subtask_history": {}, } for tbl := range tbls { @@ -73,4 +82,59 @@ func TestMetaTableRegion(t *testing.T) { require.Equal(t, ddlJobTableRegionStartKey, fmt.Sprintf("%s_%d_", tablecodec.TablePrefix(), ddl.JobTableID)) require.NotEqual(t, ddlJobTableRegionID, ddlReorgTableRegionID) + + ddlBackfillTableRegionID := tk.MustQuery("show table mysql.tidb_background_subtask regions").Rows()[0][0] + ddlBackfillTableRegionStartKey := tk.MustQuery("show table mysql.tidb_background_subtask regions").Rows()[0][1] + require.Equal(t, ddlBackfillTableRegionStartKey, fmt.Sprintf("%s_%d_", tablecodec.TablePrefix(), ddl.BackgroundSubtaskTableID)) + ddlBackfillHistoryTableRegionID := tk.MustQuery("show table mysql.tidb_background_subtask_history regions").Rows()[0][0] + ddlBackfillHistoryTableRegionStartKey := tk.MustQuery("show table mysql.tidb_background_subtask_history regions").Rows()[0][1] + require.Equal(t, ddlBackfillHistoryTableRegionStartKey, fmt.Sprintf("%s_%d_", tablecodec.TablePrefix(), ddl.BackgroundSubtaskHistoryTableID)) + + require.NotEqual(t, ddlBackfillTableRegionID, ddlBackfillHistoryTableRegionID) +} + +func MustReadCounter(t *testing.T, m prometheus.Counter) float64 { + pb := &dto.Metric{} + require.NoError(t, m.Write(pb)) + return pb.GetCounter().GetValue() +} + +func TestRecordTTLRows(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("create table t(created_at datetime) TTL = created_at + INTERVAL 1 DAY") + // simple insert should be recorded + tk.MustExec("insert into t values (NOW())") + require.Equal(t, 1.0, MustReadCounter(t, metrics.TTLInsertRowsCount)) + + // insert in a explicit transaction should be recorded + tk.MustExec("begin") + tk.MustExec("insert into t values (NOW())") + tk.MustExec("commit") + require.Equal(t, 2.0, MustReadCounter(t, metrics.TTLInsertRowsCount)) + + // insert multiple rows should be the same + tk.MustExec("begin") + tk.MustExec("insert into t values (NOW())") + tk.MustExec("insert into t values (NOW())") + tk.MustExec("commit") + require.Equal(t, 4.0, MustReadCounter(t, metrics.TTLInsertRowsCount)) + + // rollback will remove all recorded TTL rows + tk.MustExec("begin") + tk.MustExec("insert into t values (NOW())") + tk.MustExec("insert into t values (NOW())") + tk.MustExec("rollback") + require.Equal(t, 6.0, MustReadCounter(t, metrics.TTLInsertRowsCount)) + + // savepoint will save the recorded TTL rows + tk.MustExec("begin") + tk.MustExec("insert into t values (NOW())") + tk.MustExec("savepoint insert1") + tk.MustExec("insert into t values (NOW())") + tk.MustExec("rollback to insert1") + tk.MustExec("commit") + require.Equal(t, 7.0, MustReadCounter(t, metrics.TTLInsertRowsCount)) } diff --git a/session/session_test/session_test.go b/session/session_test/session_test.go index c0c37cf3296a8..3f8a57be18f75 100644 --- a/session/session_test/session_test.go +++ b/session/session_test/session_test.go @@ -1574,8 +1574,8 @@ func TestKVVars(t *testing.T) { require.Nil(t, failpoint.Enable("tikvclient/probeSetVars", `return(true)`)) tk.MustExec("select * from kvvars where a = 1") require.Nil(t, failpoint.Disable("tikvclient/probeSetVars")) - require.True(t, transaction.SetSuccess) - transaction.SetSuccess = false + require.True(t, transaction.SetSuccess.Load()) + transaction.SetSuccess.Store(false) } func TestTxnRetryErrMsg(t *testing.T) { @@ -2961,6 +2961,7 @@ func TestIgnoreForeignKey(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set @@foreign_key_checks=0") sqlText := `CREATE TABLE address ( id bigint(20) NOT NULL AUTO_INCREMENT, user_id bigint(20) NOT NULL, @@ -3778,7 +3779,7 @@ func TestUpgradeSysvars(t *testing.T) { // i.e. implying that it was set from an earlier version of TiDB. tk.MustExec(`REPLACE INTO mysql.global_variables (variable_name, variable_value) VALUES ('tidb_enable_noop_functions', '0')`) - domain.GetDomain(tk.Session()).NotifyUpdateSysVarCache() // update cache + domain.GetDomain(tk.Session()).NotifyUpdateSysVarCache(true) // update cache v, err := se.GetGlobalSysVar("tidb_enable_noop_functions") require.NoError(t, err) require.Equal(t, "OFF", v) @@ -3789,7 +3790,7 @@ func TestUpgradeSysvars(t *testing.T) { // to handle upgrade/downgrade issues correctly. tk.MustExec(`REPLACE INTO mysql.global_variables (variable_name, variable_value) VALUES ('rpl_semi_sync_slave_enabled', '')`) - domain.GetDomain(tk.Session()).NotifyUpdateSysVarCache() // update cache + domain.GetDomain(tk.Session()).NotifyUpdateSysVarCache(true) // update cache v, err = se.GetGlobalSysVar("rpl_semi_sync_slave_enabled") require.NoError(t, err) require.Equal(t, "OFF", v) // the default value is restored. @@ -3800,7 +3801,7 @@ func TestUpgradeSysvars(t *testing.T) { // This further helps for https://github.com/pingcap/tidb/pull/28842 tk.MustExec(`REPLACE INTO mysql.global_variables (variable_name, variable_value) VALUES ('tidb_executor_concurrency', '999')`) - domain.GetDomain(tk.Session()).NotifyUpdateSysVarCache() // update cache + domain.GetDomain(tk.Session()).NotifyUpdateSysVarCache(true) // update cache v, err = se.GetGlobalSysVar("tidb_executor_concurrency") require.NoError(t, err) require.Equal(t, "256", v) // the max value is restored. @@ -3809,7 +3810,7 @@ func TestUpgradeSysvars(t *testing.T) { // This could be the case if an ENUM sysvar removes a value. tk.MustExec(`REPLACE INTO mysql.global_variables (variable_name, variable_value) VALUES ('tidb_enable_noop_functions', 'SOMEVAL')`) - domain.GetDomain(tk.Session()).NotifyUpdateSysVarCache() // update cache + domain.GetDomain(tk.Session()).NotifyUpdateSysVarCache(true) // update cache v, err = se.GetGlobalSysVar("tidb_enable_noop_functions") require.NoError(t, err) require.Equal(t, "OFF", v) // the default value is restored. diff --git a/session/testdata/clustered_index_suite_out.json b/session/testdata/clustered_index_suite_out.json index dd0f1f630b9fc..e7bc6f0cc52e7 100644 --- a/session/testdata/clustered_index_suite_out.json +++ b/session/testdata/clustered_index_suite_out.json @@ -15,9 +15,9 @@ { "SQL": "select count(1) from t1 use index(idx1) where c2 = 'cd'", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#5)->Column#4", - "└─IndexReader 1.00 root index:HashAgg", - " └─HashAgg 1.00 cop[tikv] funcs:count(1)->Column#5", + "StreamAgg 1.00 root funcs:count(Column#6)->Column#4", + "└─IndexReader 1.00 root index:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#6", " └─Selection 10.00 cop[tikv] eq(test.t1.c2, \"cd\")", " └─IndexRangeScan 10.00 cop[tikv] table:t1, index:idx1(c2) range:[\"c\",\"c\"], keep order:false, stats:pseudo" ], @@ -38,9 +38,9 @@ { "SQL": "select count(1) from t2 use index(idx1) where c2 = 'cd'", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#6)->Column#4", - "└─IndexReader 1.00 root index:HashAgg", - " └─HashAgg 1.00 cop[tikv] funcs:count(1)->Column#6", + "StreamAgg 1.00 root funcs:count(Column#9)->Column#4", + "└─IndexReader 1.00 root index:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#9", " └─Selection 10.00 cop[tikv] eq(test.t2.c2, \"cd\")", " └─IndexFullScan 10000.00 cop[tikv] table:t2, index:idx1(c1, c2) keep order:false, stats:pseudo" ], diff --git a/session/tidb.go b/session/tidb.go index fd4411a18518c..c5b95b6999afb 100644 --- a/session/tidb.go +++ b/session/tidb.go @@ -42,11 +42,12 @@ import ( "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/sqlexec" + "github.com/pingcap/tidb/util/syncutil" "go.uber.org/zap" ) type domainMap struct { - mu sync.Mutex + mu syncutil.Mutex domains map[string]*domain.Domain } @@ -81,10 +82,7 @@ func (dm *domainMap) Get(store kv.Storage) (d *domain.Domain, err error) { zap.Stringer("index usage sync lease", idxUsageSyncLease)) factory := createSessionFunc(store) sysFactory := createSessionWithDomainFunc(store) - onClose := func() { - dm.Delete(store) - } - d = domain.NewDomain(store, ddlLease, statisticLease, idxUsageSyncLease, planReplayerGCLease, factory, onClose) + d = domain.NewDomain(store, ddlLease, statisticLease, idxUsageSyncLease, planReplayerGCLease, factory) var ddlInjector func(ddl.DDL) *schematracker.Checker if injector, ok := store.(schematracker.StorageDDLInjector); ok { @@ -102,8 +100,10 @@ func (dm *domainMap) Get(store kv.Storage) (d *domain.Domain, err error) { if err != nil { return nil, err } - dm.domains[key] = d + d.SetOnClose(func() { + dm.Delete(store) + }) return } @@ -220,12 +220,20 @@ func Parse(ctx sessionctx.Context, src string) ([]ast.StmtNode, error) { return stmts, nil } -func recordAbortTxnDuration(sessVars *variable.SessionVars) { +func recordAbortTxnDuration(sessVars *variable.SessionVars, isInternal bool) { duration := time.Since(sessVars.TxnCtx.CreateTime).Seconds() if sessVars.TxnCtx.IsPessimistic { - transactionDurationPessimisticAbort.Observe(duration) + if isInternal { + transactionDurationPessimisticAbortInternal.Observe(duration) + } else { + transactionDurationPessimisticAbortGeneral.Observe(duration) + } } else { - transactionDurationOptimisticAbort.Observe(duration) + if isInternal { + transactionDurationOptimisticAbortInternal.Observe(duration) + } else { + transactionDurationOptimisticAbortGeneral.Observe(duration) + } } } @@ -240,9 +248,9 @@ func finishStmt(ctx context.Context, se *session, meetsErr error, sql sqlexec.St // Handle the stmt commit/rollback. if se.txn.Valid() { if meetsErr != nil { - se.StmtRollback() + se.StmtRollback(ctx, false) } else { - se.StmtCommit() + se.StmtCommit(ctx) } } } @@ -265,16 +273,20 @@ func finishStmt(ctx context.Context, se *session, meetsErr error, sql sqlexec.St } func autoCommitAfterStmt(ctx context.Context, se *session, meetsErr error, sql sqlexec.Statement) error { + isInternal := false + if internal := se.txn.GetOption(kv.RequestSourceInternal); internal != nil && internal.(bool) { + isInternal = true + } sessVars := se.sessionVars if meetsErr != nil { if !sessVars.InTxn() { logutil.BgLogger().Info("rollbackTxn called due to ddl/autocommit failure") se.RollbackTxn(ctx) - recordAbortTxnDuration(sessVars) + recordAbortTxnDuration(sessVars, isInternal) } else if se.txn.Valid() && se.txn.IsPessimistic() && executor.ErrDeadlock.Equal(meetsErr) { logutil.BgLogger().Info("rollbackTxn for deadlock", zap.Uint64("txn", se.txn.StartTS())) se.RollbackTxn(ctx) - recordAbortTxnDuration(sessVars) + recordAbortTxnDuration(sessVars, isInternal) } return meetsErr } diff --git a/session/txn.go b/session/txn.go index 18464073da2d1..e81dfcc578930 100644 --- a/session/txn.go +++ b/session/txn.go @@ -20,7 +20,6 @@ import ( "fmt" "runtime/trace" "strings" - "sync" "sync/atomic" "time" @@ -33,9 +32,11 @@ import ( "github.com/pingcap/tidb/session/txninfo" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/binloginfo" + "github.com/pingcap/tidb/sessiontxn" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/sli" + "github.com/pingcap/tidb/util/syncutil" "github.com/pingcap/tipb/go-binlog" "github.com/tikv/client-go/v2/oracle" "github.com/tikv/client-go/v2/tikv" @@ -59,12 +60,14 @@ type LazyTxn struct { mutations map[int64]*binlog.TableMutation writeSLI sli.TxnWriteThroughputSLI + enterAggressiveLockingOnValid bool + // TxnInfo is added for the lock view feature, the data is frequent modified but // rarely read (just in query select * from information_schema.tidb_trx). // The data in this session would be query by other sessions, so Mutex is necessary. // Since read is rare, the reader can copy-on-read to get a data snapshot. mu struct { - sync.RWMutex + syncutil.RWMutex txninfo.TxnInfo } @@ -151,7 +154,6 @@ func (txn *LazyTxn) cleanupStmtBuf() { txn.mu.Lock() defer txn.mu.Unlock() txn.mu.TxnInfo.EntriesCount = uint64(txn.Transaction.Len()) - txn.mu.TxnInfo.EntriesSize = uint64(txn.Transaction.Size()) } // resetTxnInfo resets the transaction info. @@ -159,8 +161,7 @@ func (txn *LazyTxn) cleanupStmtBuf() { func (txn *LazyTxn) resetTxnInfo( startTS uint64, state txninfo.TxnRunningState, - entriesCount, - entriesSize uint64, + entriesCount uint64, currentSQLDigest string, allSQLDigests []string, ) { @@ -178,7 +179,7 @@ func (txn *LazyTxn) resetTxnInfo( txninfo.TxnStatusEnteringCounter(state).Inc() txn.mu.TxnInfo.LastStateChangeTime = time.Now() txn.mu.TxnInfo.EntriesCount = entriesCount - txn.mu.TxnInfo.EntriesSize = entriesSize + txn.mu.TxnInfo.CurrentSQLDigest = currentSQLDigest txn.mu.TxnInfo.AllSQLDigests = allSQLDigests } @@ -191,6 +192,22 @@ func (txn *LazyTxn) Size() int { return txn.Transaction.Size() } +// Mem implements the MemBuffer interface. +func (txn *LazyTxn) Mem() uint64 { + if txn.Transaction == nil { + return 0 + } + return txn.Transaction.Mem() +} + +// SetMemoryFootprintChangeHook sets the hook to be called when the memory footprint of this transaction changes. +func (txn *LazyTxn) SetMemoryFootprintChangeHook(hook func(uint64)) { + if txn.Transaction == nil { + return + } + txn.Transaction.SetMemoryFootprintChangeHook(hook) +} + // Valid implements the kv.Transaction interface. func (txn *LazyTxn) Valid() bool { return txn.Transaction != nil && txn.Transaction.Valid() @@ -209,7 +226,11 @@ func (txn *LazyTxn) String() string { return txn.Transaction.String() } if txn.txnFuture != nil { - return "txnFuture" + res := "txnFuture" + if txn.enterAggressiveLockingOnValid { + res += " (pending aggressive locking)" + } + return res } return "invalid transaction" } @@ -268,6 +289,14 @@ func (txn *LazyTxn) changePendingToValid(ctx context.Context) error { txn.Transaction = t txn.initStmtBuf() + if txn.enterAggressiveLockingOnValid { + txn.enterAggressiveLockingOnValid = false + err = txn.Transaction.StartAggressiveLocking() + if err != nil { + return err + } + } + // The txnInfo may already recorded the first statement (usually "begin") when it's pending, so keep them. txn.mu.Lock() defer txn.mu.Unlock() @@ -275,7 +304,6 @@ func (txn *LazyTxn) changePendingToValid(ctx context.Context) error { t.StartTS(), txninfo.TxnIdle, uint64(txn.Transaction.Len()), - uint64(txn.Transaction.Size()), txn.mu.TxnInfo.CurrentSQLDigest, txn.mu.TxnInfo.AllSQLDigests) @@ -290,6 +318,8 @@ func (txn *LazyTxn) changeToInvalid() { txn.Transaction = nil txn.txnFuture = nil + txn.enterAggressiveLockingOnValid = false + txn.mu.Lock() lastState := txn.mu.TxnInfo.State lastStateChangeTime := txn.mu.TxnInfo.LastStateChangeTime @@ -413,8 +443,13 @@ func (txn *LazyTxn) RollbackMemDBToCheckpoint(savepoint *tikv.MemDBCheckpoint) { txn.cleanup() } -// LockKeys Wrap the inner transaction's `LockKeys` to record the status +// LockKeys wraps the inner transaction's `LockKeys` to record the status func (txn *LazyTxn) LockKeys(ctx context.Context, lockCtx *kv.LockCtx, keys ...kv.Key) error { + return txn.LockKeysFunc(ctx, lockCtx, nil, keys...) +} + +// LockKeysFunc Wrap the inner transaction's `LockKeys` to record the status +func (txn *LazyTxn) LockKeysFunc(ctx context.Context, lockCtx *kv.LockCtx, fn func(), keys ...kv.Key) error { failpoint.Inject("beforeLockKeys", func() {}) t := time.Now() @@ -425,16 +460,94 @@ func (txn *LazyTxn) LockKeys(ctx context.Context, lockCtx *kv.LockCtx, keys ...k txn.mu.TxnInfo.BlockStartTime.Valid = true txn.mu.TxnInfo.BlockStartTime.Time = t txn.mu.Unlock() + lockFunc := func() { + if fn != nil { + fn() + } + txn.mu.Lock() + defer txn.mu.Unlock() + txn.updateState(originState) + txn.mu.TxnInfo.BlockStartTime.Valid = false + txn.mu.TxnInfo.EntriesCount = uint64(txn.Transaction.Len()) + } + return txn.Transaction.LockKeysFunc(ctx, lockCtx, lockFunc, keys...) +} - err := txn.Transaction.LockKeys(ctx, lockCtx, keys...) +// StartAggressiveLocking wraps the inner transaction to support using aggressive locking with lazy initialization. +func (txn *LazyTxn) StartAggressiveLocking() error { + if txn.Valid() { + return txn.Transaction.StartAggressiveLocking() + } else if txn.pending() { + txn.enterAggressiveLockingOnValid = true + } else { + err := errors.New("trying to start aggressive locking on a transaction in invalid state") + logutil.BgLogger().Error("unexpected error when starting aggressive locking", zap.Error(err), zap.Stringer("txn", txn)) + return err + } + return nil +} - txn.mu.Lock() - defer txn.mu.Unlock() - txn.updateState(originState) - txn.mu.TxnInfo.BlockStartTime.Valid = false - txn.mu.TxnInfo.EntriesCount = uint64(txn.Transaction.Len()) - txn.mu.TxnInfo.EntriesSize = uint64(txn.Transaction.Size()) - return err +// RetryAggressiveLocking wraps the inner transaction to support using aggressive locking with lazy initialization. +func (txn *LazyTxn) RetryAggressiveLocking(ctx context.Context) error { + if txn.Valid() { + return txn.Transaction.RetryAggressiveLocking(ctx) + } else if !txn.pending() { + err := errors.New("trying to retry aggressive locking on a transaction in invalid state") + logutil.BgLogger().Error("unexpected error when retrying aggressive locking", zap.Error(err), zap.Stringer("txnStartTS", txn)) + return err + } + return nil +} + +// CancelAggressiveLocking wraps the inner transaction to support using aggressive locking with lazy initialization. +func (txn *LazyTxn) CancelAggressiveLocking(ctx context.Context) error { + if txn.Valid() { + return txn.Transaction.CancelAggressiveLocking(ctx) + } else if txn.pending() { + if txn.enterAggressiveLockingOnValid { + txn.enterAggressiveLockingOnValid = false + } else { + err := errors.New("trying to cancel aggressive locking when it's not started") + logutil.BgLogger().Error("unexpected error when cancelling aggressive locking", zap.Error(err), zap.Stringer("txnStartTS", txn)) + return err + } + } else { + err := errors.New("trying to cancel aggressive locking on a transaction in invalid state") + logutil.BgLogger().Error("unexpected error when cancelling aggressive locking", zap.Error(err), zap.Stringer("txnStartTS", txn)) + return err + } + return nil +} + +// DoneAggressiveLocking wraps the inner transaction to support using aggressive locking with lazy initialization. +func (txn *LazyTxn) DoneAggressiveLocking(ctx context.Context) error { + if txn.Valid() { + return txn.Transaction.DoneAggressiveLocking(ctx) + } else if txn.pending() { + if txn.enterAggressiveLockingOnValid { + txn.enterAggressiveLockingOnValid = false + } else { + err := errors.New("trying to finish aggressive locking when it's not started") + logutil.BgLogger().Error("unexpected error when finishing aggressive locking") + return err + } + } else { + err := errors.New("trying to cancel aggressive locking on a transaction in invalid state") + logutil.BgLogger().Error("unexpected error when finishing aggressive locking") + return err + } + return nil +} + +// IsInAggressiveLockingMode wraps the inner transaction to support using aggressive locking with lazy initialization. +func (txn *LazyTxn) IsInAggressiveLockingMode() bool { + if txn.Valid() { + return txn.Transaction.IsInAggressiveLockingMode() + } else if txn.pending() { + return txn.enterAggressiveLockingOnValid + } else { + return false + } } func (txn *LazyTxn) reset() { @@ -586,11 +699,17 @@ func (s *session) HasDirtyContent(tid int64) bool { } // StmtCommit implements the sessionctx.Context interface. -func (s *session) StmtCommit() { +func (s *session) StmtCommit(ctx context.Context) { defer func() { s.txn.cleanup() }() + txnManager := sessiontxn.GetTxnManager(s) + err := txnManager.OnStmtCommit(ctx) + if err != nil { + logutil.Logger(ctx).Error("txnManager failed to handle OnStmtCommit", zap.Error(err)) + } + st := &s.txn st.flushStmtBuf() @@ -602,7 +721,12 @@ func (s *session) StmtCommit() { } // StmtRollback implements the sessionctx.Context interface. -func (s *session) StmtRollback() { +func (s *session) StmtRollback(ctx context.Context, isForPessimisticRetry bool) { + txnManager := sessiontxn.GetTxnManager(s) + err := txnManager.OnStmtRollback(ctx, isForPessimisticRetry) + if err != nil { + logutil.Logger(ctx).Error("txnManager failed to handle OnStmtRollback", zap.Error(err)) + } s.txn.cleanup() } diff --git a/session/txninfo/txn_info.go b/session/txninfo/txn_info.go index 640e16474b4bd..31e4d338eb623 100644 --- a/session/txninfo/txn_info.go +++ b/session/txninfo/txn_info.go @@ -161,8 +161,6 @@ type TxnInfo struct { } // How many entries are in MemDB EntriesCount uint64 - // MemDB used memory - EntriesSize uint64 // The following fields will be filled in `session` instead of `LazyTxn` @@ -208,9 +206,6 @@ var columnValueGetterMap = map[string]func(*TxnInfo) types.Datum{ MemBufferKeysStr: func(info *TxnInfo) types.Datum { return types.NewDatum(info.EntriesCount) }, - MemBufferBytesStr: func(info *TxnInfo) types.Datum { - return types.NewDatum(info.EntriesSize) - }, SessionIDStr: func(info *TxnInfo) types.Datum { return types.NewDatum(info.ConnectionID) }, diff --git a/session/txnmanager.go b/session/txnmanager.go index 0d72c89461237..6916fbf42bb75 100644 --- a/session/txnmanager.go +++ b/session/txnmanager.go @@ -175,6 +175,15 @@ func (m *txnManager) OnStmtStart(ctx context.Context, node ast.StmtNode) error { return m.ctxProvider.OnStmtStart(ctx, m.stmtNode) } +// OnHandlePessimisticStmtStart is the hook that should be called when starts handling a pessimistic DML or +// a pessimistic select-for-update statements. +func (m *txnManager) OnHandlePessimisticStmtStart(ctx context.Context) error { + if m.ctxProvider == nil { + return errors.New("context provider not set") + } + return m.ctxProvider.OnHandlePessimisticStmtStart(ctx) +} + // OnStmtErrorForNextAction is the hook that should be called when a new statement get an error func (m *txnManager) OnStmtErrorForNextAction(point sessiontxn.StmtErrorHandlePoint, err error) (sessiontxn.StmtErrorAction, error) { if m.ctxProvider == nil { @@ -199,6 +208,22 @@ func (m *txnManager) OnStmtRetry(ctx context.Context) error { return m.ctxProvider.OnStmtRetry(ctx) } +// OnStmtCommit is the hook that should be called when a statement is executed successfully. +func (m *txnManager) OnStmtCommit(ctx context.Context) error { + if m.ctxProvider == nil { + return errors.New("context provider not set") + } + return m.ctxProvider.OnStmtCommit(ctx) +} + +// OnStmtRollback is the hook that should be called when a statement fails to execute. +func (m *txnManager) OnStmtRollback(ctx context.Context, isForPessimisticRetry bool) error { + if m.ctxProvider == nil { + return errors.New("context provider not set") + } + return m.ctxProvider.OnStmtRollback(ctx, isForPessimisticRetry) +} + // OnLocalTemporaryTableCreated is the hook that should be called when a temporary table created. // The provider will update its state then func (m *txnManager) OnLocalTemporaryTableCreated() { diff --git a/sessionctx/BUILD.bazel b/sessionctx/BUILD.bazel index 6cd2317cf8f01..f1987e5ddb063 100644 --- a/sessionctx/BUILD.bazel +++ b/sessionctx/BUILD.bazel @@ -26,13 +26,14 @@ go_library( go_test( name = "sessionctx_test", - timeout = "short", + timeout = "moderate", srcs = [ "context_test.go", "main_test.go", ], embed = [":sessionctx"], flaky = True, + race = "on", deps = [ "//testkit/testsetup", "@com_github_stretchr_testify//require", diff --git a/sessionctx/binloginfo/BUILD.bazel b/sessionctx/binloginfo/BUILD.bazel index 6d5a600b9e68c..3c345cd043469 100644 --- a/sessionctx/binloginfo/BUILD.bazel +++ b/sessionctx/binloginfo/BUILD.bazel @@ -33,6 +33,7 @@ go_test( embed = [":binloginfo"], flaky = True, deps = [ + "//autoid_service", "//ddl", "//domain", "//kv", @@ -53,6 +54,7 @@ go_test( "@com_github_pingcap_tipb//go-binlog", "@com_github_stretchr_testify//require", "@org_golang_google_grpc//:grpc", + "@org_golang_google_grpc//credentials/insecure", "@org_uber_go_goleak//:goleak", ], ) diff --git a/sessionctx/binloginfo/binloginfo_test.go b/sessionctx/binloginfo/binloginfo_test.go index 3c777a9436234..f6ca6bc059db8 100644 --- a/sessionctx/binloginfo/binloginfo_test.go +++ b/sessionctx/binloginfo/binloginfo_test.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" + _ "github.com/pingcap/tidb/autoid_service" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" @@ -44,6 +45,7 @@ import ( "github.com/pingcap/tipb/go-binlog" "github.com/stretchr/testify/require" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) type mockBinlogPump struct { @@ -99,7 +101,7 @@ func createBinlogSuite(t *testing.T) (s *binlogSuite) { opt := grpc.WithDialer(func(addr string, timeout time.Duration) (net.Conn, error) { return net.DialTimeout("unix", addr, timeout) }) - clientCon, err := grpc.Dial(unixFile, opt, grpc.WithInsecure()) + clientCon, err := grpc.Dial(unixFile, opt, grpc.WithTransportCredentials(insecure.NewCredentials())) require.NoError(t, err) require.NotNil(t, clientCon) diff --git a/sessionctx/context.go b/sessionctx/context.go index f51bdedef8948..0999b2396cae0 100644 --- a/sessionctx/context.go +++ b/sessionctx/context.go @@ -52,10 +52,10 @@ type SessionStatesHandler interface { DecodeSessionStates(context.Context, Context, *sessionstates.SessionStates) error } -// PlanCache is an interface for prepare and general plan cache +// PlanCache is an interface for prepare and non-prepared plan cache type PlanCache interface { - Get(key kvcache.Key, paramTypes []*types.FieldType) (value kvcache.Value, ok bool) - Put(key kvcache.Key, value kvcache.Value, paramTypes []*types.FieldType) + Get(key kvcache.Key, paramTypes []*types.FieldType, limitParams []uint64) (value kvcache.Value, ok bool) + Put(key kvcache.Key, value kvcache.Value, paramTypes []*types.FieldType, limitParams []uint64) Delete(key kvcache.Key) DeleteAll() Size() int @@ -120,8 +120,8 @@ type Context interface { GetStore() kv.Storage // GetPlanCache returns the cache of the physical plan. - // generalPlanCache indicates to return the general plan cache or the prepared plan cache. - GetPlanCache(isGeneralPlanCache bool) PlanCache + // isNonPrepared indicates to return the non-prepared plan cache or the prepared plan cache. + GetPlanCache(isNonPrepared bool) PlanCache // StoreQueryFeedback stores the query feedback. StoreQueryFeedback(feedback interface{}) @@ -134,9 +134,10 @@ type Context interface { HasDirtyContent(tid int64) bool // StmtCommit flush all changes by the statement to the underlying transaction. - StmtCommit() - // StmtRollback provides statement level rollback. - StmtRollback() + StmtCommit(ctx context.Context) + // StmtRollback provides statement level rollback. The parameter `forPessimisticRetry` should be true iff it's used + // for auto-retrying execution of DMLs in pessimistic transactions. + StmtRollback(ctx context.Context, isForPessimisticRetry bool) // StmtGetMutation gets the binlog mutation for current statement. StmtGetMutation(int64) *binlog.TableMutation // IsDDLOwner checks whether this session is DDL owner. @@ -182,6 +183,13 @@ type Context interface { ReleaseAllAdvisoryLocks() int // GetExtensions returns the `*extension.SessionExtensions` object GetExtensions() *extension.SessionExtensions + // InSandBoxMode indicates that this Session is in sandbox mode + // Ref about sandbox mode: https://dev.mysql.com/doc/refman/8.0/en/expired-password-handling.html + InSandBoxMode() bool + // EnableSandBoxMode enable the sandbox mode of this Session + EnableSandBoxMode() + // DisableSandBoxMode enable the sandbox mode of this Session + DisableSandBoxMode() } // TxnFuture is an interface where implementations have a kv.Transaction field and after diff --git a/sessionctx/sessionstates/session_states.go b/sessionctx/sessionstates/session_states.go index 36ea0b22455d7..c9e1652a9c1df 100644 --- a/sessionctx/sessionstates/session_states.go +++ b/sessionctx/sessionstates/session_states.go @@ -15,8 +15,6 @@ package sessionstates import ( - "time" - "github.com/pingcap/tidb/errno" ptypes "github.com/pingcap/tidb/parser/types" "github.com/pingcap/tidb/sessionctx/stmtctx" @@ -79,7 +77,6 @@ type SessionStates struct { FoundInPlanCache bool `json:"in-plan-cache,omitempty"` FoundInBinding bool `json:"in-binding,omitempty"` SequenceLatestValues map[int64]int64 `json:"seq-values,omitempty"` - MPPStoreLastFailTime map[string]time.Time `json:"store-fail-time,omitempty"` LastAffectedRows int64 `json:"affected-rows,omitempty"` LastInsertID uint64 `json:"last-insert-id,omitempty"` Warnings []stmtctx.SQLWarn `json:"warnings,omitempty"` diff --git a/sessionctx/sessionstates/session_states_test.go b/sessionctx/sessionstates/session_states_test.go index 5910d6b18e071..a4a92c55a4495 100644 --- a/sessionctx/sessionstates/session_states_test.go +++ b/sessionctx/sessionstates/session_states_test.go @@ -20,9 +20,7 @@ import ( "fmt" "strconv" "strings" - "sync" "testing" - "time" "github.com/pingcap/errors" "github.com/pingcap/tidb/config" @@ -109,8 +107,9 @@ func TestSystemVars(t *testing.T) { }, { // hidden variable - inSessionStates: false, + inSessionStates: true, varName: variable.TiDBTxnReadTS, + expectedValue: "", }, { // none-scoped variable @@ -133,7 +132,7 @@ func TestSystemVars(t *testing.T) { { // sem invisible variable inSessionStates: false, - varName: variable.TiDBAllowRemoveAutoInc, + varName: variable.TiDBConfig, }, { // noop variables @@ -378,23 +377,6 @@ func TestSessionCtx(t *testing.T) { tk.MustQuery("select nextval(test.s)").Check(testkit.Rows("2")) }, }, - { - // check MPPStoreLastFailTime - setFunc: func(tk *testkit.TestKit) any { - m := sync.Map{} - m.Store("store1", time.Now()) - tk.Session().GetSessionVars().MPPStoreLastFailTime = &m - return tk.Session().GetSessionVars().MPPStoreLastFailTime - }, - checkFunc: func(tk *testkit.TestKit, param any) { - failTime := tk.Session().GetSessionVars().MPPStoreLastFailTime - tm, ok := failTime.Load("store1") - require.True(t, ok) - v, ok := (param.(*sync.Map)).Load("store1") - require.True(t, ok) - require.True(t, tm.(time.Time).Equal(v.(time.Time))) - }, - }, { // check FoundInPlanCache setFunc: func(tk *testkit.TestKit) any { @@ -1271,6 +1253,16 @@ func TestShowStateFail(t *testing.T) { tk.MustExec("drop table test.t1") }, }, + { + // enable sandbox mode + setFunc: func(tk *testkit.TestKit, conn server.MockConn) { + tk.Session().EnableSandBoxMode() + }, + showErr: errno.ErrCannotMigrateSession, + cleanFunc: func(tk *testkit.TestKit) { + tk.Session().DisableSandBoxMode() + }, + }, { // after COM_STMT_SEND_LONG_DATA setFunc: func(tk *testkit.TestKit, conn server.MockConn) { diff --git a/sessionctx/stmtctx/BUILD.bazel b/sessionctx/stmtctx/BUILD.bazel index b42939f7ec324..a2e12d1e860e1 100644 --- a/sessionctx/stmtctx/BUILD.bazel +++ b/sessionctx/stmtctx/BUILD.bazel @@ -6,6 +6,7 @@ go_library( importpath = "github.com/pingcap/tidb/sessionctx/stmtctx", visibility = ["//visibility:public"], deps = [ + "//errno", "//parser", "//parser/ast", "//parser/model", diff --git a/sessionctx/stmtctx/stmtctx.go b/sessionctx/stmtctx/stmtctx.go index a02090e490c32..01ead10e580fc 100644 --- a/sessionctx/stmtctx/stmtctx.go +++ b/sessionctx/stmtctx/stmtctx.go @@ -24,6 +24,7 @@ import ( "time" "github.com/pingcap/errors" + "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" @@ -101,6 +102,42 @@ func (warn *SQLWarn) UnmarshalJSON(data []byte) error { return nil } +// ReferenceCount indicates the reference count of StmtCtx. +type ReferenceCount int32 + +const ( + // ReferenceCountIsFrozen indicates the current StmtCtx is resetting, it'll refuse all the access from other sessions. + ReferenceCountIsFrozen int32 = -1 + // ReferenceCountNoReference indicates the current StmtCtx is not accessed by other sessions. + ReferenceCountNoReference int32 = 0 +) + +// TryIncrease tries to increase the reference count. +// There is a small chance that TryIncrease returns true while TryFreeze and +// UnFreeze are invoked successfully during the execution of TryIncrease. +func (rf *ReferenceCount) TryIncrease() bool { + refCnt := atomic.LoadInt32((*int32)(rf)) + for ; refCnt != ReferenceCountIsFrozen && !atomic.CompareAndSwapInt32((*int32)(rf), refCnt, refCnt+1); refCnt = atomic.LoadInt32((*int32)(rf)) { + } + return refCnt != ReferenceCountIsFrozen +} + +// Decrease decreases the reference count. +func (rf *ReferenceCount) Decrease() { + for refCnt := atomic.LoadInt32((*int32)(rf)); !atomic.CompareAndSwapInt32((*int32)(rf), refCnt, refCnt-1); refCnt = atomic.LoadInt32((*int32)(rf)) { + } +} + +// TryFreeze tries to freeze the StmtCtx to frozen before resetting the old StmtCtx. +func (rf *ReferenceCount) TryFreeze() bool { + return atomic.LoadInt32((*int32)(rf)) == ReferenceCountNoReference && atomic.CompareAndSwapInt32((*int32)(rf), ReferenceCountNoReference, ReferenceCountIsFrozen) +} + +// UnFreeze unfreeze the frozen StmtCtx thus the other session can access this StmtCtx. +func (rf *ReferenceCount) UnFreeze() { + atomic.StoreInt32((*int32)(rf), ReferenceCountNoReference) +} + // StatementContext contains variables for a statement. // It should be reset before executing a statement. type StatementContext struct { @@ -135,7 +172,6 @@ type StatementContext struct { InNullRejectCheck bool AllowInvalidDate bool IgnoreNoPartition bool - SkipPlanCache bool IgnoreExplainIDSuffix bool SkipUTF8Check bool SkipASCIICheck bool @@ -173,11 +209,17 @@ type StatementContext struct { copied uint64 touched uint64 - message string - warnings []SQLWarn - errorCount uint16 + message string + warnings []SQLWarn + // extraWarnings record the extra warnings and are only used by the slow log only now. + // If a warning is expected to be output only under some conditions (like in EXPLAIN or EXPLAIN VERBOSE) but it's + // not under such conditions now, it is considered as an extra warning. + // extraWarnings would not be printed through SHOW WARNINGS, but we want to always output them through the slow + // log to help diagnostics, so we store them here separately. + extraWarnings []SQLWarn + execDetails execdetails.ExecDetails - allExecDetails []*execdetails.ExecDetails + allExecDetails []*execdetails.DetailsNeedP90 } // PrevAffectedRows is the affected-rows value(DDL is 0, DML is the number of affected rows). PrevAffectedRows int64 @@ -264,8 +306,6 @@ type StatementContext struct { LogOnExceed [2]memory.LogOnExceed } - // OptimInfo maps Plan.ID() to optimization information when generating Plan. - OptimInfo map[int]string // InVerboseExplain indicates the statement is "explain format='verbose' ...". InVerboseExplain bool @@ -297,8 +337,6 @@ type StatementContext struct { NeededItems []model.TableItemID // ResultCh to receive stats loading results ResultCh chan StatsLoadResult - // Fallback indicates if the planner uses full-loaded stats or fallback all to pseudo/simple. - Fallback bool // LoadStartTime is to record the load start time to calculate latency LoadStartTime time.Time } @@ -341,6 +379,13 @@ type StatementContext struct { HasFKCascades bool } + // MPPQueryInfo stores some id and timestamp of current MPP query statement. + MPPQueryInfo struct { + QueryID atomic2.Uint64 + QueryTS atomic2.Uint64 + AllocatedMPPTaskID atomic2.Int64 + } + // TableStats stores the visited runtime table stats by table id during query TableStats map[int64]interface{} // useChunkAlloc indicates whether statement use chunk alloc @@ -563,6 +608,15 @@ func (sc *StatementContext) SetPlanHint(hint string) { sc.planHint = hint } +// SetSkipPlanCache sets to skip the plan cache and records the reason. +func (sc *StatementContext) SetSkipPlanCache(reason error) { + if !sc.UseCache { + return // avoid unnecessary warnings + } + sc.UseCache = false + sc.AppendWarning(reason) +} + // TableEntry presents table in db. type TableEntry struct { DB string @@ -696,9 +750,7 @@ func (sc *StatementContext) SetMessage(msg string) { func (sc *StatementContext) GetWarnings() []SQLWarn { sc.mu.Lock() defer sc.mu.Unlock() - warns := make([]SQLWarn, len(sc.mu.warnings)) - copy(warns, sc.mu.warnings) - return warns + return sc.mu.warnings } // TruncateWarnings truncates warnings begin from start and returns the truncated warnings. @@ -729,7 +781,11 @@ func (sc *StatementContext) WarningCount() uint16 { func (sc *StatementContext) NumErrorWarnings() (ec uint16, wc int) { sc.mu.Lock() defer sc.mu.Unlock() - ec = sc.mu.errorCount + for _, w := range sc.mu.warnings { + if w.Level == WarnLevelError { + ec++ + } + } wc = len(sc.mu.warnings) return } @@ -739,12 +795,6 @@ func (sc *StatementContext) SetWarnings(warns []SQLWarn) { sc.mu.Lock() defer sc.mu.Unlock() sc.mu.warnings = warns - sc.mu.errorCount = 0 - for _, w := range warns { - if w.Level == WarnLevelError { - sc.mu.errorCount++ - } - } } // AppendWarning appends a warning with level 'Warning'. @@ -780,7 +830,47 @@ func (sc *StatementContext) AppendError(warn error) { defer sc.mu.Unlock() if len(sc.mu.warnings) < math.MaxUint16 { sc.mu.warnings = append(sc.mu.warnings, SQLWarn{WarnLevelError, warn}) - sc.mu.errorCount++ + } +} + +// GetExtraWarnings gets extra warnings. +func (sc *StatementContext) GetExtraWarnings() []SQLWarn { + sc.mu.Lock() + defer sc.mu.Unlock() + return sc.mu.extraWarnings +} + +// SetExtraWarnings sets extra warnings. +func (sc *StatementContext) SetExtraWarnings(warns []SQLWarn) { + sc.mu.Lock() + defer sc.mu.Unlock() + sc.mu.extraWarnings = warns +} + +// AppendExtraWarning appends an extra warning with level 'Warning'. +func (sc *StatementContext) AppendExtraWarning(warn error) { + sc.mu.Lock() + defer sc.mu.Unlock() + if len(sc.mu.extraWarnings) < math.MaxUint16 { + sc.mu.extraWarnings = append(sc.mu.extraWarnings, SQLWarn{WarnLevelWarning, warn}) + } +} + +// AppendExtraNote appends an extra warning with level 'Note'. +func (sc *StatementContext) AppendExtraNote(warn error) { + sc.mu.Lock() + defer sc.mu.Unlock() + if len(sc.mu.extraWarnings) < math.MaxUint16 { + sc.mu.extraWarnings = append(sc.mu.extraWarnings, SQLWarn{WarnLevelNote, warn}) + } +} + +// AppendExtraError appends an extra warning with level 'Error'. +func (sc *StatementContext) AppendExtraError(warn error) { + sc.mu.Lock() + defer sc.mu.Unlock() + if len(sc.mu.extraWarnings) < math.MaxUint16 { + sc.mu.extraWarnings = append(sc.mu.extraWarnings, SQLWarn{WarnLevelError, warn}) } } @@ -791,6 +881,21 @@ func (sc *StatementContext) HandleTruncate(err error) error { if err == nil { return nil } + + err = errors.Cause(err) + if e, ok := err.(*errors.Error); !ok || + (e.Code() != errno.ErrTruncatedWrongValue && + e.Code() != errno.ErrDataTooLong && + e.Code() != errno.ErrTruncatedWrongValueForField && + e.Code() != errno.ErrWarnDataOutOfRange && + e.Code() != errno.ErrDataOutOfRange && + e.Code() != errno.ErrBadNumber && + e.Code() != errno.ErrWrongValueForType && + e.Code() != errno.ErrDatetimeFunctionOverflow && + e.Code() != errno.WarnDataTruncated) { + return err + } + if sc.IgnoreTruncate { return nil } @@ -826,10 +931,9 @@ func (sc *StatementContext) resetMuForRetry() { sc.mu.copied = 0 sc.mu.touched = 0 sc.mu.message = "" - sc.mu.errorCount = 0 sc.mu.warnings = nil sc.mu.execDetails = execdetails.ExecDetails{} - sc.mu.allExecDetails = make([]*execdetails.ExecDetails, 0, 4) + sc.mu.allExecDetails = make([]*execdetails.DetailsNeedP90, 0, 4) } // ResetForRetry resets the changed states during execution. @@ -853,7 +957,13 @@ func (sc *StatementContext) MergeExecDetails(details *execdetails.ExecDetails, c sc.mu.execDetails.RequestCount++ sc.MergeScanDetail(details.ScanDetail) sc.MergeTimeDetail(details.TimeDetail) - sc.mu.allExecDetails = append(sc.mu.allExecDetails, details) + sc.mu.allExecDetails = append(sc.mu.allExecDetails, + &execdetails.DetailsNeedP90{ + BackoffSleep: details.BackoffSleep, + BackoffTimes: details.BackoffTimes, + CalleeAddress: details.CalleeAddress, + TimeDetail: details.TimeDetail, + }) } if commitDetails != nil { if sc.mu.execDetails.CommitDetail == nil { @@ -972,14 +1082,14 @@ func (sc *StatementContext) CopTasksDetails() *CopTasksDetails { d.AvgProcessTime = sc.mu.execDetails.TimeDetail.ProcessTime / time.Duration(n) d.AvgWaitTime = sc.mu.execDetails.TimeDetail.WaitTime / time.Duration(n) - slices.SortFunc(sc.mu.allExecDetails, func(i, j *execdetails.ExecDetails) bool { + slices.SortFunc(sc.mu.allExecDetails, func(i, j *execdetails.DetailsNeedP90) bool { return i.TimeDetail.ProcessTime < j.TimeDetail.ProcessTime }) d.P90ProcessTime = sc.mu.allExecDetails[n*9/10].TimeDetail.ProcessTime d.MaxProcessTime = sc.mu.allExecDetails[n-1].TimeDetail.ProcessTime d.MaxProcessAddress = sc.mu.allExecDetails[n-1].CalleeAddress - slices.SortFunc(sc.mu.allExecDetails, func(i, j *execdetails.ExecDetails) bool { + slices.SortFunc(sc.mu.allExecDetails, func(i, j *execdetails.DetailsNeedP90) bool { return i.TimeDetail.WaitTime < j.TimeDetail.WaitTime }) d.P90WaitTime = sc.mu.allExecDetails[n*9/10].TimeDetail.WaitTime @@ -1052,7 +1162,9 @@ func (sc *StatementContext) GetLockWaitStartTime() time.Time { func (sc *StatementContext) RecordRangeFallback(rangeMaxSize int64) { // If range fallback happens, it means ether the query is unreasonable(for example, several long IN lists) or tidb_opt_range_max_size is too small // and the generated plan is probably suboptimal. In that case we don't put it into plan cache. - sc.SkipPlanCache = true + if sc.UseCache { + sc.SetSkipPlanCache(errors.Errorf("skip plan-cache: in-list is too long")) + } if !sc.RangeFallback { sc.AppendWarning(errors.Errorf("Memory capacity of %v bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen", rangeMaxSize)) sc.RangeFallback = true diff --git a/sessionctx/stmtctx/stmtctx_test.go b/sessionctx/stmtctx/stmtctx_test.go index cc21b3e4812c7..67520c36e7b80 100644 --- a/sessionctx/stmtctx/stmtctx_test.go +++ b/sessionctx/stmtctx/stmtctx_test.go @@ -36,12 +36,14 @@ func TestCopTasksDetails(t *testing.T) { backoffs := []string{"tikvRPC", "pdRPC", "regionMiss"} for i := 0; i < 100; i++ { d := &execdetails.ExecDetails{ - CalleeAddress: fmt.Sprintf("%v", i+1), - BackoffSleep: make(map[string]time.Duration), - BackoffTimes: make(map[string]int), - TimeDetail: util.TimeDetail{ - ProcessTime: time.Second * time.Duration(i+1), - WaitTime: time.Millisecond * time.Duration(i+1), + DetailsNeedP90: execdetails.DetailsNeedP90{ + CalleeAddress: fmt.Sprintf("%v", i+1), + BackoffSleep: make(map[string]time.Duration), + BackoffTimes: make(map[string]int), + TimeDetail: util.TimeDetail{ + ProcessTime: time.Second * time.Duration(i+1), + WaitTime: time.Millisecond * time.Duration(i+1), + }, }, } for _, backoff := range backoffs { diff --git a/sessionctx/variable/BUILD.bazel b/sessionctx/variable/BUILD.bazel index 7c6bcd5330e25..fa0de88eece14 100644 --- a/sessionctx/variable/BUILD.bazel +++ b/sessionctx/variable/BUILD.bazel @@ -32,7 +32,7 @@ go_library( "//parser/types", "//sessionctx/sessionstates", "//sessionctx/stmtctx", - "//sessionctx/variable/featuretag/concurrencyddl", + "//sessionctx/variable/featuretag/distributereorg", "//tidb-binlog/pump_client", "//types", "//types/parser_driver", @@ -48,9 +48,10 @@ go_library( "//util/mathutil", "//util/memory", "//util/paging", + "//util/replayer", "//util/rowcodec", "//util/size", - "//util/stmtsummary", + "//util/stmtsummary/v2:stmtsummary", "//util/stringutil", "//util/tableutil", "//util/tikvutil", @@ -67,6 +68,7 @@ go_library( "@org_golang_x_exp//maps", "@org_golang_x_exp//slices", "@org_uber_go_atomic//:atomic", + "@org_uber_go_zap//:zap", ], ) @@ -94,12 +96,15 @@ go_test( "//parser/mysql", "//parser/terror", "//planner/core", + "//sessionctx/sessionstates", "//sessionctx/stmtctx", "//testkit", "//testkit/testsetup", "//types", + "//util", "//util/chunk", "//util/execdetails", + "//util/gctuner", "//util/memory", "//util/mock", "@com_github_pingcap_failpoint//:failpoint", diff --git a/sessionctx/variable/error.go b/sessionctx/variable/error.go index 60928932f0f06..f760cba8bfcd5 100644 --- a/sessionctx/variable/error.go +++ b/sessionctx/variable/error.go @@ -39,6 +39,7 @@ var ( errLocalVariable = dbterror.ClassVariable.NewStd(mysql.ErrLocalVariable) errValueNotSupportedWhen = dbterror.ClassVariable.NewStdErr(mysql.ErrNotSupportedYet, pmysql.Message("%s = OFF is not supported when %s = ON", nil)) ErrStmtNotFound = dbterror.ClassOptimizer.NewStd(mysql.ErrPreparedStmtNotFound) + ErrNotValidPassword = dbterror.ClassExecutor.NewStd(mysql.ErrNotValidPassword) // ErrFunctionsNoopImpl is an error to say the behavior is protected by the tidb_enable_noop_functions sysvar. // This is copied from expression.ErrFunctionsNoopImpl to prevent circular dependencies. // It needs to be public for tests. diff --git a/sessionctx/variable/featuretag/concurrencyddl/BUILD.bazel b/sessionctx/variable/featuretag/distributereorg/BUILD.bazel similarity index 70% rename from sessionctx/variable/featuretag/concurrencyddl/BUILD.bazel rename to sessionctx/variable/featuretag/distributereorg/BUILD.bazel index 44c1cede3c2b7..f31f9ddd6e2d8 100644 --- a/sessionctx/variable/featuretag/concurrencyddl/BUILD.bazel +++ b/sessionctx/variable/featuretag/distributereorg/BUILD.bazel @@ -1,11 +1,11 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( - name = "concurrencyddl", + name = "distributereorg", srcs = [ "default.go", - "non_default.go", + "non_default.go", #keep ], - importpath = "github.com/pingcap/tidb/sessionctx/variable/featuretag/concurrencyddl", + importpath = "github.com/pingcap/tidb/sessionctx/variable/featuretag/distributereorg", visibility = ["//visibility:public"], ) diff --git a/sessionctx/variable/featuretag/concurrencyddl/default.go b/sessionctx/variable/featuretag/distributereorg/default.go similarity index 80% rename from sessionctx/variable/featuretag/concurrencyddl/default.go rename to sessionctx/variable/featuretag/distributereorg/default.go index 8aca4924268f0..6594d3ff726a4 100644 --- a/sessionctx/variable/featuretag/concurrencyddl/default.go +++ b/sessionctx/variable/featuretag/distributereorg/default.go @@ -12,9 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !featuretag +//go:build !distributereorg -package concurrencyddl +package distributereorg -// TiDBEnableConcurrentDDL is a feature tag -const TiDBEnableConcurrentDDL bool = true +// TiDBEnableDistributeReorg is a feature tag +const TiDBEnableDistributeReorg bool = false diff --git a/sessionctx/variable/featuretag/concurrencyddl/non_default.go b/sessionctx/variable/featuretag/distributereorg/non_default.go similarity index 80% rename from sessionctx/variable/featuretag/concurrencyddl/non_default.go rename to sessionctx/variable/featuretag/distributereorg/non_default.go index 72218abe958a3..9530be9c617d1 100644 --- a/sessionctx/variable/featuretag/concurrencyddl/non_default.go +++ b/sessionctx/variable/featuretag/distributereorg/non_default.go @@ -12,9 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build featuretag +//go:build distributereorg -package concurrencyddl +package distributereorg -// TiDBEnableConcurrentDDL is a feature tag -const TiDBEnableConcurrentDDL bool = false +// TiDBEnableDistributeReorg is a feature tag +const TiDBEnableDistributeReorg bool = true diff --git a/sessionctx/variable/mock_globalaccessor.go b/sessionctx/variable/mock_globalaccessor.go index e452c398da424..5477c054257e4 100644 --- a/sessionctx/variable/mock_globalaccessor.go +++ b/sessionctx/variable/mock_globalaccessor.go @@ -87,7 +87,7 @@ func (m *MockGlobalAccessor) SetGlobalSysVar(ctx context.Context, name string, v } // SetGlobalSysVarOnly implements GlobalVarAccessor.SetGlobalSysVarOnly interface. -func (m *MockGlobalAccessor) SetGlobalSysVarOnly(ctx context.Context, name string, value string) error { +func (m *MockGlobalAccessor) SetGlobalSysVarOnly(ctx context.Context, name string, value string, _ bool) error { sv := GetSysVar(name) if sv == nil { return ErrUnknownSystemVar.GenWithStackByArgs(name) diff --git a/sessionctx/variable/mock_globalaccessor_test.go b/sessionctx/variable/mock_globalaccessor_test.go index 3372a92790275..76f4b1d39b608 100644 --- a/sessionctx/variable/mock_globalaccessor_test.go +++ b/sessionctx/variable/mock_globalaccessor_test.go @@ -36,7 +36,7 @@ func TestMockAPI(t *testing.T) { // invalid option name err = mock.SetGlobalSysVar(context.Background(), "illegalopt", "val") require.Error(t, err) - err = mock.SetGlobalSysVarOnly(context.Background(), "illegalopt", "val") + err = mock.SetGlobalSysVarOnly(context.Background(), "illegalopt", "val", true) require.Error(t, err) // valid option, invalid value @@ -46,7 +46,7 @@ func TestMockAPI(t *testing.T) { // valid option, valid value err = mock.SetGlobalSysVar(context.Background(), DefaultAuthPlugin, "mysql_native_password") require.NoError(t, err) - err = mock.SetGlobalSysVarOnly(context.Background(), DefaultAuthPlugin, "mysql_native_password") + err = mock.SetGlobalSysVarOnly(context.Background(), DefaultAuthPlugin, "mysql_native_password", true) require.NoError(t, err) // Test GetTiDBTableValue diff --git a/sessionctx/variable/noop.go b/sessionctx/variable/noop.go index 398ea09f3ec92..4c61a88c51820 100644 --- a/sessionctx/variable/noop.go +++ b/sessionctx/variable/noop.go @@ -58,8 +58,6 @@ var noopSysVars = []*SysVar{ {Scope: ScopeGlobal | ScopeSession, Name: BigTables, Value: Off, Type: TypeBool}, {Scope: ScopeNone, Name: "skip_external_locking", Value: "1"}, {Scope: ScopeNone, Name: "innodb_sync_array_size", Value: "1"}, - {Scope: ScopeGlobal, Name: ValidatePasswordCheckUserName, Value: Off, Type: TypeBool}, - {Scope: ScopeGlobal, Name: ValidatePasswordNumberCount, Value: "1", Type: TypeUnsigned, MinValue: 0, MaxValue: math.MaxUint64}, {Scope: ScopeSession, Name: "gtid_next", Value: ""}, {Scope: ScopeGlobal, Name: "ndb_show_foreign_key_mock_tables", Value: ""}, {Scope: ScopeNone, Name: "multi_range_count", Value: "256"}, @@ -117,7 +115,6 @@ var noopSysVars = []*SysVar{ {Scope: ScopeNone, Name: "innodb_log_group_home_dir", Value: "./"}, {Scope: ScopeNone, Name: "performance_schema_events_statements_history_size", Value: "10"}, {Scope: ScopeGlobal, Name: GeneralLog, Value: Off, Type: TypeBool}, - {Scope: ScopeGlobal, Name: "validate_password_dictionary_file", Value: ""}, {Scope: ScopeGlobal, Name: BinlogOrderCommits, Value: On, Type: TypeBool}, {Scope: ScopeGlobal, Name: "key_cache_division_limit", Value: "100"}, {Scope: ScopeGlobal | ScopeSession, Name: "max_insert_delayed_threads", Value: "20"}, @@ -170,11 +167,10 @@ var noopSysVars = []*SysVar{ {Scope: ScopeGlobal | ScopeSession, Name: MaxUserConnections, Value: "0", Type: TypeUnsigned, MinValue: 0, MaxValue: 4294967295}, {Scope: ScopeNone, Name: "performance_schema_max_thread_classes", Value: "50"}, {Scope: ScopeGlobal, Name: "innodb_api_trx_level", Value: "0"}, - {Scope: ScopeNone, Name: "disconnect_on_expired_password", Value: "1"}, {Scope: ScopeNone, Name: "performance_schema_max_file_classes", Value: "50"}, {Scope: ScopeGlobal, Name: "expire_logs_days", Value: "0"}, {Scope: ScopeGlobal | ScopeSession, Name: BinlogRowQueryLogEvents, Value: Off, Type: TypeBool}, - {Scope: ScopeGlobal, Name: "default_password_lifetime", Value: ""}, + {Scope: ScopeGlobal, Name: DefaultPasswordLifetime, Value: "0", Type: TypeInt, MinValue: 0, MaxValue: math.MaxUint16}, {Scope: ScopeNone, Name: "pid_file", Value: "/usr/local/mysql/data/localhost.pid"}, {Scope: ScopeNone, Name: "innodb_undo_tablespaces", Value: "0"}, {Scope: ScopeGlobal, Name: InnodbStatusOutputLocks, Value: Off, Type: TypeBool, AutoConvertNegativeBool: true}, @@ -463,7 +459,6 @@ var noopSysVars = []*SysVar{ {Scope: ScopeGlobal | ScopeSession, Name: "eq_range_index_dive_limit", Value: "200", IsHintUpdatable: true}, {Scope: ScopeNone, Name: "performance_schema_events_stages_history_size", Value: "10"}, {Scope: ScopeGlobal | ScopeSession, Name: "ndb_join_pushdown", Value: ""}, - {Scope: ScopeGlobal, Name: "validate_password_special_char_count", Value: "1"}, {Scope: ScopeNone, Name: "performance_schema_max_thread_instances", Value: "402"}, {Scope: ScopeGlobal | ScopeSession, Name: "ndbinfo_show_hidden", Value: ""}, {Scope: ScopeGlobal | ScopeSession, Name: "net_read_timeout", Value: "30"}, @@ -472,7 +467,6 @@ var noopSysVars = []*SysVar{ {Scope: ScopeGlobal, Name: "sync_relay_log_info", Value: "10000"}, {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_trace_limit", Value: "1"}, {Scope: ScopeNone, Name: "innodb_ft_max_token_size", Value: "84"}, - {Scope: ScopeGlobal, Name: ValidatePasswordLength, Value: "8", Type: TypeUnsigned, MinValue: 0, MaxValue: math.MaxUint64}, {Scope: ScopeGlobal, Name: "ndb_log_binlog_index", Value: ""}, {Scope: ScopeGlobal, Name: "innodb_api_bk_commit_interval", Value: "5"}, {Scope: ScopeNone, Name: "innodb_undo_directory", Value: "."}, diff --git a/sessionctx/variable/session.go b/sessionctx/variable/session.go index b11b727079630..0023148fe8059 100644 --- a/sessionctx/variable/session.go +++ b/sessionctx/variable/session.go @@ -19,6 +19,7 @@ import ( "context" "crypto/tls" "encoding/binary" + "encoding/json" "fmt" "math" "math/rand" @@ -51,6 +52,7 @@ import ( "github.com/pingcap/tidb/util/kvcache" "github.com/pingcap/tidb/util/mathutil" "github.com/pingcap/tidb/util/memory" + "github.com/pingcap/tidb/util/replayer" "github.com/pingcap/tidb/util/rowcodec" "github.com/pingcap/tidb/util/stringutil" "github.com/pingcap/tidb/util/tableutil" @@ -63,6 +65,9 @@ import ( "golang.org/x/exp/slices" ) +// DefaultResourceGroupName is the default resource group name. +const DefaultResourceGroupName = "default" + var ( // PreparedStmtCount is exported for test. PreparedStmtCount int64 @@ -182,6 +187,9 @@ type TxnCtxNeedToRestore struct { // CachedTables is not nil if the transaction write on cached table. CachedTables map[int64]interface{} + + // InsertTTLRowsCount counts how many rows are inserted in this statement + InsertTTLRowsCount int } // TxnCtxNoNeedToRestore stores transaction variables which do not need to restored when rolling back to a savepoint. @@ -196,7 +204,6 @@ type TxnCtxNoNeedToRestore struct { ShardStep int shardRemain int currentShard int64 - shardRand *rand.Rand // unchangedRowKeys is used to store the unchanged rows that needs to lock for pessimistic transaction. unchangedRowKeys map[string]struct{} @@ -233,6 +240,14 @@ type TxnCtxNoNeedToRestore struct { EnableMDL bool // relatedTableForMDL records the `lock` table for metadata lock. It maps from int64 to int64(version). relatedTableForMDL *sync.Map + + // AggressiveLockingUsed marking whether at least one of the statements in the transaction was executed in + // aggressive locking mode. + AggressiveLockingUsed bool + // AggressiveLockingEffective marking whether at least one of the statements in the transaction was executed in + // aggressive locking mode, and it takes effect (which is determined according to whether lock-with-conflict + // has occurred during execution of any statement). + AggressiveLockingEffective bool } // SavepointRecord indicates a transaction's savepoint record. @@ -246,21 +261,22 @@ type SavepointRecord struct { } // GetCurrentShard returns the shard for the next `count` IDs. -func (tc *TransactionContext) GetCurrentShard(count int) int64 { - if tc.shardRand == nil { - tc.shardRand = rand.New(rand.NewSource(int64(tc.StartTS))) // #nosec G404 +func (s *SessionVars) GetCurrentShard(count int) int64 { + tc := s.TxnCtx + if s.shardRand == nil { + s.shardRand = rand.New(rand.NewSource(int64(tc.StartTS))) // #nosec G404 } if tc.shardRemain <= 0 { - tc.updateShard() + tc.updateShard(s.shardRand) tc.shardRemain = tc.ShardStep } tc.shardRemain -= count return tc.currentShard } -func (tc *TransactionContext) updateShard() { +func (tc *TransactionContext) updateShard(shardRand *rand.Rand) { var buf [8]byte - binary.LittleEndian.PutUint64(buf[:], tc.shardRand.Uint64()) + binary.LittleEndian.PutUint64(buf[:], shardRand.Uint64()) tc.currentShard = int64(murmur3.Sum32(buf[:])) } @@ -372,6 +388,7 @@ func (tc *TransactionContext) GetCurrentSavepoint() TxnCtxNeedToRestore { TableDeltaMap: tableDeltaMap, pessimisticLockCache: pessimisticLockCache, CachedTables: cachedTables, + InsertTTLRowsCount: tc.InsertTTLRowsCount, } } @@ -380,6 +397,7 @@ func (tc *TransactionContext) RestoreBySavepoint(savepoint TxnCtxNeedToRestore) tc.TableDeltaMap = savepoint.TableDeltaMap tc.pessimisticLockCache = savepoint.pessimisticLockCache tc.CachedTables = savepoint.CachedTables + tc.InsertTTLRowsCount = savepoint.InsertTTLRowsCount } // AddSavepoint adds a new savepoint. @@ -638,8 +656,8 @@ type SessionVars struct { SysWarningCount int // SysErrorCount is the system variable "error_count", because it is on the hot path, so we extract it from the systems SysErrorCount uint16 - // generalPlanCacheStmts stores PlanCacheStmts for general plan cache. - generalPlanCacheStmts *kvcache.SimpleLRUCache + // nonPreparedPlanCacheStmts stores PlanCacheStmts for non-prepared plan cache. + nonPreparedPlanCacheStmts *kvcache.SimpleLRUCache // PreparedStmts stores prepared statement. PreparedStmts map[uint32]interface{} PreparedStmtNameToID map[string]uint32 @@ -670,13 +688,6 @@ type SessionVars struct { value string } - // mppTaskIDAllocator is used to allocate mpp task id for a session. - mppTaskIDAllocator struct { - mu sync.Mutex - lastTS uint64 - taskID int64 - } - // Status stands for the session status. e.g. in transaction or not, auto commit is on or off, and so on. Status uint16 @@ -742,6 +753,11 @@ type SessionVars struct { // StmtCtx holds variables for current executing statement. StmtCtx *stmtctx.StatementContext + // RefCountOfStmtCtx indicates the reference count of StmtCtx. When the + // StmtCtx is accessed by other sessions, e.g. oom-alarm-handler/expensive-query-handler, add one first. + // Note: this variable should be accessed and updated by atomic operations. + RefCountOfStmtCtx stmtctx.ReferenceCount + // AllowAggPushDown can be set to false to forbid aggregation push down. AllowAggPushDown bool @@ -1034,6 +1050,10 @@ type SessionVars struct { // IsolationReadEngines is used to isolation read, tidb only read from the stores whose engine type is in the engines. IsolationReadEngines map[kv.StoreType]struct{} + mppVersion kv.MppVersion + + mppExchangeCompressionMode kv.ExchangeCompressionMode + PlannerSelectBlockAsName []ast.HintTable // LockWaitTimeout is the duration waiting for pessimistic lock in milliseconds @@ -1041,6 +1061,10 @@ type SessionVars struct { // MetricSchemaStep indicates the step when query metric schema. MetricSchemaStep int64 + + // CDCWriteSource indicates the following data is written by TiCDC if it is not 0. + CDCWriteSource uint64 + // MetricSchemaRangeDuration indicates the step when query metric schema. MetricSchemaRangeDuration int64 @@ -1092,9 +1116,6 @@ type SessionVars struct { // ShardAllocateStep indicates the max size of continuous rowid shard in one transaction. ShardAllocateStep int64 - // EnableAmendPessimisticTxn indicates if schema change amend is enabled for pessimistic transactions. - EnableAmendPessimisticTxn bool - // LastTxnInfo keeps track the info of last committed transaction. LastTxnInfo string @@ -1161,9 +1182,6 @@ type SessionVars struct { // TemporaryTableData stores committed kv values for temporary table for current session. TemporaryTableData TemporaryTableData - // MPPStoreLastFailTime records the lastest fail time that a TiFlash store failed. It maps store address(string) to fail time(time.Time). - MPPStoreLastFailTime *sync.Map - // MPPStoreFailTTL indicates the duration that protect TiDB from sending task to a new recovered TiFlash. MPPStoreFailTTL string @@ -1201,6 +1219,9 @@ type SessionVars struct { EnableNewCostInterface bool // CostModelVersion is a internal switch to indicates the Cost Model Version. CostModelVersion int + // IndexJoinDoubleReadPenaltyCostRate indicates whether to add some penalty cost to IndexJoin and how much of it. + IndexJoinDoubleReadPenaltyCostRate float64 + // BatchPendingTiFlashCount shows the threshold of pending TiFlash tables when batch adding. BatchPendingTiFlashCount int // RcWriteCheckTS indicates whether some special write statements don't get latest tso from PD at RC @@ -1246,17 +1267,20 @@ type SessionVars struct { // EnablePreparedPlanCache indicates whether to enable prepared plan cache. EnablePreparedPlanCache bool - // GeneralPlanCacheSize controls the size of general plan cache. + // PreparedPlanCacheSize controls the size of prepared plan cache. PreparedPlanCacheSize uint64 // PreparedPlanCacheMonitor indicates whether to enable prepared plan cache monitor. EnablePreparedPlanCacheMemoryMonitor bool - // EnableGeneralPlanCache indicates whether to enable general plan cache. - EnableGeneralPlanCache bool + // EnablePlanCacheForParamLimit controls whether the prepare statement with parameterized limit can be cached + EnablePlanCacheForParamLimit bool + + // EnableNonPreparedPlanCache indicates whether to enable non-prepared plan cache. + EnableNonPreparedPlanCache bool - // GeneralPlanCacheSize controls the size of general plan cache. - GeneralPlanCacheSize uint64 + // NonPreparedPlanCacheSize controls the size of non-prepared plan cache. + NonPreparedPlanCacheSize uint64 // ConstraintCheckInPlacePessimistic controls whether to skip the locking of some keys in pessimistic transactions. // Postpone the conflict check and constraint check to prewrite or later pessimistic locking requests. @@ -1290,8 +1314,10 @@ type SessionVars struct { HookContext // MemTracker indicates the memory tracker of current session. - MemTracker *memory.Tracker - DiskTracker *memory.Tracker + MemTracker *memory.Tracker + // MemDBDBFootprint tracks the memory footprint of memdb, and is attached to `MemTracker` + MemDBFootprint *memory.Tracker + DiskTracker *memory.Tracker // OptPrefixIndexSingleScan indicates whether to do some optimizations to avoid double scan for prefix index. // When set to true, `col is (not) null`(`col` is index prefix column) is regarded as index filter rather than table filter. @@ -1305,6 +1331,67 @@ type SessionVars struct { // preuseChunkAlloc indicates whether pre statement use chunk alloc // like select @@last_sql_use_alloc preUseChunkAlloc bool + + // EnablePlanReplayerCapture indicates whether enabled plan replayer capture + EnablePlanReplayerCapture bool + + // EnablePlanReplayedContinuesCapture indicates whether enabled plan replayer continues capture + EnablePlanReplayedContinuesCapture bool + + // PlanReplayerFinishedTaskKey used to record the finished plan replayer task key in order not to record the + // duplicate task in plan replayer continues capture + PlanReplayerFinishedTaskKey map[replayer.PlanReplayerTaskKey]struct{} + + // StoreBatchSize indicates the batch size limit of store batch, set this field to 0 to disable store batch. + StoreBatchSize int + + // shardRand is used by TxnCtx, for the GetCurrentShard() method. + shardRand *rand.Rand + + // Resource group name + ResourceGroupName string + + // ProtectedTSList holds a list of timestamps that should delay GC. + ProtectedTSList protectedTSList + + // PessimisticTransactionAggressiveLocking controls whether aggressive locking for pessimistic transaction + // is enabled. + PessimisticTransactionAggressiveLocking bool + + // EnableINLJoinInnerMultiPattern indicates whether enable multi pattern for index join inner side + // For now it is not public to user + EnableINLJoinInnerMultiPattern bool +} + +// planReplayerSessionFinishedTaskKeyLen is used to control the max size for the finished plan replayer task key in session +// in order to control the used memory +const planReplayerSessionFinishedTaskKeyLen = 128 + +// AddPlanReplayerFinishedTaskKey record finished task key in session +func (s *SessionVars) AddPlanReplayerFinishedTaskKey(key replayer.PlanReplayerTaskKey) { + if len(s.PlanReplayerFinishedTaskKey) >= planReplayerSessionFinishedTaskKeyLen { + s.initializePlanReplayerFinishedTaskKey() + } + s.PlanReplayerFinishedTaskKey[key] = struct{}{} +} + +func (s *SessionVars) initializePlanReplayerFinishedTaskKey() { + s.PlanReplayerFinishedTaskKey = make(map[replayer.PlanReplayerTaskKey]struct{}, planReplayerSessionFinishedTaskKeyLen) +} + +// CheckPlanReplayerFinishedTaskKey check whether the key exists +func (s *SessionVars) CheckPlanReplayerFinishedTaskKey(key replayer.PlanReplayerTaskKey) bool { + if s.PlanReplayerFinishedTaskKey == nil { + s.initializePlanReplayerFinishedTaskKey() + return false + } + _, ok := s.PlanReplayerFinishedTaskKey[key] + return ok +} + +// IsPlanReplayerCaptureEnabled indicates whether capture or continues capture enabled +func (s *SessionVars) IsPlanReplayerCaptureEnabled() bool { + return s.EnablePlanReplayerCapture || s.EnablePlanReplayedContinuesCapture } // GetNewChunkWithCapacity Attempt to request memory from the chunk pool @@ -1380,22 +1467,13 @@ func (s *SessionVars) InitStatementContext() *stmtctx.StatementContext { if sc == s.StmtCtx { sc = &s.cachedStmtCtx[1] } - *sc = stmtctx.StatementContext{} - return sc -} - -// AllocMPPTaskID allocates task id for mpp tasks. It will reset the task id if the query's -// startTs is different. -func (s *SessionVars) AllocMPPTaskID(startTS uint64) int64 { - s.mppTaskIDAllocator.mu.Lock() - defer s.mppTaskIDAllocator.mu.Unlock() - if s.mppTaskIDAllocator.lastTS == startTS { - s.mppTaskIDAllocator.taskID++ - return s.mppTaskIDAllocator.taskID + if s.RefCountOfStmtCtx.TryFreeze() { + *sc = stmtctx.StatementContext{} + s.RefCountOfStmtCtx.UnFreeze() + } else { + sc = &stmtctx.StatementContext{} } - s.mppTaskIDAllocator.lastTS = startTS - s.mppTaskIDAllocator.taskID = 1 - return 1 + return sc } // IsMPPAllowed returns whether mpp execution is allowed. @@ -1408,12 +1486,34 @@ func (s *SessionVars) IsMPPEnforced() bool { return s.allowMPPExecution && s.enforceMPPExecution } +// ChooseMppVersion indicates the mpp-version used to build mpp plan, if mpp-version is unspecified, use the latest version. +func (s *SessionVars) ChooseMppVersion() kv.MppVersion { + if s.mppVersion == kv.MppVersionUnspecified { + return kv.GetNewestMppVersion() + } + return s.mppVersion +} + +// ChooseMppExchangeCompressionMode indicates the data compression method in mpp exchange operator +func (s *SessionVars) ChooseMppExchangeCompressionMode() kv.ExchangeCompressionMode { + if s.mppExchangeCompressionMode == kv.ExchangeCompressionModeUnspecified { + // If unspecified, use recommended mode + return kv.RecommendedExchangeCompressionMode + } + return s.mppExchangeCompressionMode +} + // RaiseWarningWhenMPPEnforced will raise a warning when mpp mode is enforced and executing explain statement. // TODO: Confirm whether this function will be inlined and // omit the overhead of string construction when calling with false condition. func (s *SessionVars) RaiseWarningWhenMPPEnforced(warning string) { - if s.IsMPPEnforced() && s.StmtCtx.InExplainStmt { + if !s.IsMPPEnforced() { + return + } + if s.StmtCtx.InExplainStmt { s.StmtCtx.AppendWarning(errors.New(warning)) + } else { + s.StmtCtx.AppendExtraWarning(errors.New(warning)) } } @@ -1626,7 +1726,6 @@ func NewSessionVars(hctx HookContext) *SessionVars { EnableClusteredIndex: DefTiDBEnableClusteredIndex, EnableParallelApply: DefTiDBEnableParallelApply, ShardAllocateStep: DefTiDBShardAllocateStep, - EnableAmendPessimisticTxn: DefTiDBEnableAmendPessimisticTxn, PartitionPruneMode: *atomic2.NewString(DefTiDBPartitionPruneMode), TxnScope: kv.NewDefaultTxnScopeVar(), EnabledRateLimitAction: DefTiDBEnableRateLimitAction, @@ -1638,7 +1737,6 @@ func NewSessionVars(hctx HookContext) *SessionVars { AllowFallbackToTiKV: make(map[kv.StoreType]struct{}), CTEMaxRecursionDepth: DefCTEMaxRecursionDepth, TMPTableSize: DefTiDBTmpTableMaxSize, - MPPStoreLastFailTime: new(sync.Map), MPPStoreFailTTL: DefTiDBMPPStoreFailTTL, Rng: mathutil.NewWithTime(), StatsLoadSyncWait: StatsLoadSyncWait.Load(), @@ -1654,21 +1752,24 @@ func NewSessionVars(hctx HookContext) *SessionVars { EnableReuseCheck: DefTiDBEnableReusechunk, preUseChunkAlloc: DefTiDBUseAlloc, ChunkPool: ReuseChunkPool{Alloc: nil}, + mppExchangeCompressionMode: DefaultExchangeCompressionMode, + mppVersion: kv.MppVersionUnspecified, } vars.KVVars = tikvstore.NewVariables(&vars.Killed) vars.Concurrency = Concurrency{ - indexLookupConcurrency: DefIndexLookupConcurrency, - indexSerialScanConcurrency: DefIndexSerialScanConcurrency, - indexLookupJoinConcurrency: DefIndexLookupJoinConcurrency, - hashJoinConcurrency: DefTiDBHashJoinConcurrency, - projectionConcurrency: DefTiDBProjectionConcurrency, - distSQLScanConcurrency: DefDistSQLScanConcurrency, - hashAggPartialConcurrency: DefTiDBHashAggPartialConcurrency, - hashAggFinalConcurrency: DefTiDBHashAggFinalConcurrency, - windowConcurrency: DefTiDBWindowConcurrency, - mergeJoinConcurrency: DefTiDBMergeJoinConcurrency, - streamAggConcurrency: DefTiDBStreamAggConcurrency, - ExecutorConcurrency: DefExecutorConcurrency, + indexLookupConcurrency: DefIndexLookupConcurrency, + indexSerialScanConcurrency: DefIndexSerialScanConcurrency, + indexLookupJoinConcurrency: DefIndexLookupJoinConcurrency, + hashJoinConcurrency: DefTiDBHashJoinConcurrency, + projectionConcurrency: DefTiDBProjectionConcurrency, + distSQLScanConcurrency: DefDistSQLScanConcurrency, + hashAggPartialConcurrency: DefTiDBHashAggPartialConcurrency, + hashAggFinalConcurrency: DefTiDBHashAggFinalConcurrency, + windowConcurrency: DefTiDBWindowConcurrency, + mergeJoinConcurrency: DefTiDBMergeJoinConcurrency, + streamAggConcurrency: DefTiDBStreamAggConcurrency, + indexMergeIntersectionConcurrency: DefTiDBIndexMergeIntersectionConcurrency, + ExecutorConcurrency: DefExecutorConcurrency, } vars.MemQuota = MemQuota{ MemQuotaQuery: DefTiDBMemQuotaQuery, @@ -2009,31 +2110,27 @@ func (k planCacheStmtKey) Hash() []byte { return []byte(k) } -// AddGeneralPlanCacheStmt adds this PlanCacheStmt into general-plan-cache-stmt cache -func (s *SessionVars) AddGeneralPlanCacheStmt(sql string, stmt interface{}) { - if s.generalPlanCacheStmts == nil { - s.generalPlanCacheStmts = kvcache.NewSimpleLRUCache(uint(s.GeneralPlanCacheSize), 0, 0) +// AddNonPreparedPlanCacheStmt adds this PlanCacheStmt into non-preapred plan-cache stmt cache +func (s *SessionVars) AddNonPreparedPlanCacheStmt(sql string, stmt interface{}) { + if s.nonPreparedPlanCacheStmts == nil { + s.nonPreparedPlanCacheStmts = kvcache.NewSimpleLRUCache(uint(s.NonPreparedPlanCacheSize), 0, 0) } - s.generalPlanCacheStmts.Put(planCacheStmtKey(sql), stmt) + s.nonPreparedPlanCacheStmts.Put(planCacheStmtKey(sql), stmt) } -// GetGeneralPlanCacheStmt gets the PlanCacheStmt. -func (s *SessionVars) GetGeneralPlanCacheStmt(sql string) interface{} { - if s.generalPlanCacheStmts == nil { +// GetNonPreparedPlanCacheStmt gets the PlanCacheStmt. +func (s *SessionVars) GetNonPreparedPlanCacheStmt(sql string) interface{} { + if s.nonPreparedPlanCacheStmts == nil { return nil } - stmt, _ := s.generalPlanCacheStmts.Get(planCacheStmtKey(sql)) + stmt, _ := s.nonPreparedPlanCacheStmts.Get(planCacheStmtKey(sql)) return stmt } // AddPreparedStmt adds prepareStmt to current session and count in global. func (s *SessionVars) AddPreparedStmt(stmtID uint32, stmt interface{}) error { if _, exists := s.PreparedStmts[stmtID]; !exists { - valStr, _ := s.GetSystemVar(MaxPreparedStmtCount) - maxPreparedStmtCount, err := strconv.ParseInt(valStr, 10, 64) - if err != nil { - maxPreparedStmtCount = DefMaxPreparedStmtCount - } + maxPreparedStmtCount := MaxPreparedStmtCountValue.Load() newPreparedStmtCount := atomic.AddInt64(&PreparedStmtCount, 1) if maxPreparedStmtCount >= 0 && newPreparedStmtCount > maxPreparedStmtCount { atomic.AddInt64(&PreparedStmtCount, -1) @@ -2240,16 +2337,16 @@ func (s *SessionVars) GetTemporaryTable(tblInfo *model.TableInfo) tableutil.Temp // EncodeSessionStates saves session states into SessionStates. func (s *SessionVars) EncodeSessionStates(ctx context.Context, sessionStates *sessionstates.SessionStates) (err error) { // Encode user-defined variables. + s.userVars.lock.RLock() sessionStates.UserVars = make(map[string]*types.Datum, len(s.userVars.values)) sessionStates.UserVarTypes = make(map[string]*ptypes.FieldType, len(s.userVars.types)) - s.userVars.lock.RLock() - defer s.userVars.lock.RUnlock() for name, userVar := range s.userVars.values { sessionStates.UserVars[name] = userVar.Clone() } for name, userVarType := range s.userVars.types { sessionStates.UserVarTypes[name] = userVarType.Clone() } + s.userVars.lock.RUnlock() // Encode other session contexts. sessionStates.PreparedStmtID = s.preparedStmtID @@ -2264,12 +2361,6 @@ func (s *SessionVars) EncodeSessionStates(ctx context.Context, sessionStates *se } sessionStates.LastFoundRows = s.LastFoundRows sessionStates.SequenceLatestValues = s.SequenceState.GetAllStates() - sessionStates.MPPStoreLastFailTime = make(map[string]time.Time, 0) - s.MPPStoreLastFailTime.Range( - func(key, value interface{}) bool { - sessionStates.MPPStoreLastFailTime[key.(string)] = value.(time.Time) - return true - }) sessionStates.FoundInPlanCache = s.PrevFoundInPlanCache sessionStates.FoundInBinding = s.PrevFoundInBinding @@ -2283,11 +2374,9 @@ func (s *SessionVars) EncodeSessionStates(ctx context.Context, sessionStates *se // DecodeSessionStates restores session states from SessionStates. func (s *SessionVars) DecodeSessionStates(ctx context.Context, sessionStates *sessionstates.SessionStates) (err error) { // Decode user-defined variables. - s.userVars.values = make(map[string]types.Datum, len(sessionStates.UserVars)) for name, userVar := range sessionStates.UserVars { s.SetUserVarVal(name, *userVar.Clone()) } - s.userVars.types = make(map[string]*ptypes.FieldType, len(sessionStates.UserVarTypes)) for name, userVarType := range sessionStates.UserVarTypes { s.SetUserVarType(name, userVarType.Clone()) } @@ -2305,9 +2394,6 @@ func (s *SessionVars) DecodeSessionStates(ctx context.Context, sessionStates *se } s.LastFoundRows = sessionStates.LastFoundRows s.SequenceState.SetAllStates(sessionStates.SequenceLatestValues) - for k, v := range sessionStates.MPPStoreLastFailTime { - s.MPPStoreLastFailTime.Store(k, v) - } s.FoundInPlanCache = sessionStates.FoundInPlanCache s.FoundInBinding = sessionStates.FoundInBinding @@ -2383,6 +2469,10 @@ type Concurrency struct { // streamAggConcurrency is deprecated, use ExecutorConcurrency instead. streamAggConcurrency int + // indexMergeIntersectionConcurrency is the number of indexMergeProcessWorker + // Only meaningful for dynamic pruned partition table. + indexMergeIntersectionConcurrency int + // indexSerialScanConcurrency is the number of concurrent index serial scan worker. indexSerialScanConcurrency int @@ -2443,6 +2533,11 @@ func (c *Concurrency) SetStreamAggConcurrency(n int) { c.streamAggConcurrency = n } +// SetIndexMergeIntersectionConcurrency set the number of concurrent intersection process worker. +func (c *Concurrency) SetIndexMergeIntersectionConcurrency(n int) { + c.indexMergeIntersectionConcurrency = n +} + // SetIndexSerialScanConcurrency set the number of concurrent index serial scan worker. func (c *Concurrency) SetIndexSerialScanConcurrency(n int) { c.indexSerialScanConcurrency = n @@ -2525,6 +2620,14 @@ func (c *Concurrency) StreamAggConcurrency() int { return c.ExecutorConcurrency } +// IndexMergeIntersectionConcurrency return the number of concurrent process worker. +func (c *Concurrency) IndexMergeIntersectionConcurrency() int { + if c.indexMergeIntersectionConcurrency != ConcurrencyUnset { + return c.indexMergeIntersectionConcurrency + } + return c.ExecutorConcurrency +} + // IndexSerialScanConcurrency return the number of concurrent index serial scan worker. // This option is not sync with ExecutorConcurrency since it's used by Analyze table. func (c *Concurrency) IndexSerialScanConcurrency() int { @@ -2680,6 +2783,9 @@ const ( SlowLogBackoffDetail = "Backoff_Detail" // SlowLogResultRows is the row count of the SQL result. SlowLogResultRows = "Result_rows" + // SlowLogWarnings is the warnings generated during executing the statement. + // Note that some extra warnings would also be printed through slow log. + SlowLogWarnings = "Warnings" // SlowLogIsExplicitTxn is used to indicate whether this sql execute in explicit transaction or not. SlowLogIsExplicitTxn = "IsExplicitTxn" // SlowLogIsWriteCacheTable is used to indicate whether writing to the cache table need to wait for the read lock to expire. @@ -2692,6 +2798,15 @@ const ( // It's controlled by the global variable `tidb_generate_binary_plan`. var GenerateBinaryPlan atomic2.Bool +// JSONSQLWarnForSlowLog helps to print the SQLWarn through the slow log in JSON format. +type JSONSQLWarnForSlowLog struct { + Level string + Message string + // IsExtra means this SQL Warn is expected to be recorded only under some conditions (like in EXPLAIN) and should + // haven't been recorded as a warning now, but we recorded it anyway to help diagnostics. + IsExtra bool `json:",omitempty"` +} + // SlowQueryLogItems is a collection of items that should be included in the // slow query log. type SlowQueryLogItems struct { @@ -2731,6 +2846,7 @@ type SlowQueryLogItems struct { // table -> name -> status StatsLoadStatus map[string]map[string]string IsSyncStatsFailed bool + Warnings []JSONSQLWarnForSlowLog } // SlowLogFormat uses for formatting slow log. @@ -2896,6 +3012,16 @@ func (s *SessionVars) SlowLogFormat(logItems *SlowQueryLogItems) string { writeSlowLogItem(&buf, SlowLogBackoffTotal, strconv.FormatFloat(logItems.BackoffTotal.Seconds(), 'f', -1, 64)) writeSlowLogItem(&buf, SlowLogWriteSQLRespTotal, strconv.FormatFloat(logItems.WriteSQLRespTotal.Seconds(), 'f', -1, 64)) writeSlowLogItem(&buf, SlowLogResultRows, strconv.FormatInt(logItems.ResultRows, 10)) + if len(logItems.Warnings) > 0 { + buf.WriteString(SlowLogRowPrefixStr + SlowLogWarnings + SlowLogSpaceMarkStr) + jsonEncoder := json.NewEncoder(&buf) + jsonEncoder.SetEscapeHTML(false) + // Note that the Encode() will append a '\n' so we don't need to add another. + err := jsonEncoder.Encode(logItems.Warnings) + if err != nil { + buf.WriteString(err.Error()) + } + } writeSlowLogItem(&buf, SlowLogSucc, strconv.FormatBool(logItems.Succ)) writeSlowLogItem(&buf, SlowLogIsExplicitTxn, strconv.FormatBool(logItems.IsExplicitTxn)) writeSlowLogItem(&buf, SlowLogIsSyncStatsFailed, strconv.FormatBool(logItems.IsSyncStatsFailed)) @@ -3111,3 +3237,53 @@ func (s *SessionVars) GetRelatedTableForMDL() *sync.Map { func (s *SessionVars) EnableForceInlineCTE() bool { return s.enableForceInlineCTE } + +// protectedTSList implements util/processinfo#ProtectedTSList +type protectedTSList struct { + sync.Mutex + items map[uint64]int +} + +// HoldTS holds the timestamp to prevent its data from being GCed. +func (lst *protectedTSList) HoldTS(ts uint64) (unhold func()) { + lst.Lock() + if lst.items == nil { + lst.items = map[uint64]int{} + } + lst.items[ts] += 1 + lst.Unlock() + var once sync.Once + return func() { + once.Do(func() { + lst.Lock() + if lst.items != nil { + if lst.items[ts] > 1 { + lst.items[ts] -= 1 + } else { + delete(lst.items, ts) + } + } + lst.Unlock() + }) + } +} + +// GetMinProtectedTS returns the minimum protected timestamp that greater than `lowerBound` (0 if no such one). +func (lst *protectedTSList) GetMinProtectedTS(lowerBound uint64) (ts uint64) { + lst.Lock() + for k, v := range lst.items { + if v > 0 && k > lowerBound && (k < ts || ts == 0) { + ts = k + } + } + lst.Unlock() + return +} + +// Size returns the number of protected timestamps (exported for test). +func (lst *protectedTSList) Size() (size int) { + lst.Lock() + size = len(lst.items) + lst.Unlock() + return +} diff --git a/sessionctx/variable/session_test.go b/sessionctx/variable/session_test.go index 92049902618c2..62c94e91867e9 100644 --- a/sessionctx/variable/session_test.go +++ b/sessionctx/variable/session_test.go @@ -15,6 +15,8 @@ package variable_test import ( + "context" + "strconv" "sync" "testing" "time" @@ -25,10 +27,12 @@ import ( "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/mysql" plannercore "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/sessionctx/sessionstates" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/types" + util2 "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/mock" @@ -130,16 +134,9 @@ func TestSession(t *testing.T) { func TestAllocMPPID(t *testing.T) { ctx := mock.NewContext() - - seVar := ctx.GetSessionVars() - require.NotNil(t, seVar) - - require.Equal(t, int64(1), seVar.AllocMPPTaskID(1)) - require.Equal(t, int64(2), seVar.AllocMPPTaskID(1)) - require.Equal(t, int64(3), seVar.AllocMPPTaskID(1)) - require.Equal(t, int64(1), seVar.AllocMPPTaskID(2)) - require.Equal(t, int64(2), seVar.AllocMPPTaskID(2)) - require.Equal(t, int64(3), seVar.AllocMPPTaskID(2)) + require.Equal(t, int64(1), plannercore.AllocMPPTaskID(ctx)) + require.Equal(t, int64(2), plannercore.AllocMPPTaskID(ctx)) + require.Equal(t, int64(3), plannercore.AllocMPPTaskID(ctx)) } func TestSlowLogFormat(t *testing.T) { @@ -164,9 +161,11 @@ func TestSlowLogFormat(t *testing.T) { ProcessedKeys: 20001, TotalKeys: 10000, }, - TimeDetail: util.TimeDetail{ - ProcessTime: time.Second * time.Duration(2), - WaitTime: time.Minute, + DetailsNeedP90: execdetails.DetailsNeedP90{ + TimeDetail: util.TimeDetail{ + ProcessTime: time.Second * time.Duration(2), + WaitTime: time.Minute, + }, }, } statsInfos := make(map[string]uint64) @@ -396,21 +395,21 @@ func TestTransactionContextSavepoint(t *testing.T) { require.Equal(t, 0, len(tc.Savepoints)) } -func TestGeneralPlanCacheStmt(t *testing.T) { +func TestNonPreparedPlanCacheStmt(t *testing.T) { sessVars := variable.NewSessionVars(nil) - sessVars.GeneralPlanCacheSize = 100 + sessVars.NonPreparedPlanCacheSize = 100 sql1 := "select * from t where a>?" sql2 := "select * from t where a 0 && intVal < 128 { // 128 Bytes s.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(TiDBServerMemoryLimitSessMinSize, originalValue)) @@ -815,17 +941,22 @@ var defaultSysVars = []*SysVar{ return nil }, }, - {Scope: ScopeGlobal, Name: TiDBServerMemoryLimitGCTrigger, Value: strconv.FormatFloat(DefTiDBServerMemoryLimitGCTrigger, 'f', -1, 64), Type: TypeFloat, MinValue: 0, MaxValue: math.MaxUint64, + {Scope: ScopeGlobal, Name: TiDBServerMemoryLimitGCTrigger, Value: strconv.FormatFloat(DefTiDBServerMemoryLimitGCTrigger, 'f', -1, 64), Type: TypeStr, GetGlobal: func(_ context.Context, s *SessionVars) (string, error) { return strconv.FormatFloat(gctuner.GlobalMemoryLimitTuner.GetPercentage(), 'f', -1, 64), nil }, Validation: func(s *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { floatValue, err := strconv.ParseFloat(normalizedValue, 64) if err != nil { - return "", err + perc, str := parsePercentage(normalizedValue) + if len(str) != 0 { + floatValue = float64(perc) / 100 + } else { + return "", err + } } gogcTunerThreshold := GOGCTunerThreshold.Load() - if floatValue < 0.51 && floatValue > 1 { // 51% ~ 100% + if floatValue < 0.51 || floatValue > 1 { // 51% ~ 100% return "", ErrWrongValueForVar.GenWithStackByArgs(TiDBServerMemoryLimitGCTrigger, normalizedValue) } // gogcTunerThreshold must not be 0. it will be 0 when tidb_gogc_tuner_threshold is not set during startup. @@ -955,14 +1086,14 @@ var defaultSysVars = []*SysVar{ }, GetGlobal: func(_ context.Context, s *SessionVars) (string, error) { return strconv.FormatFloat(PreparedPlanCacheMemoryGuardRatio.Load(), 'f', -1, 64), nil }}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableGeneralPlanCache, Value: BoolToOnOff(DefTiDBEnableGeneralPlanCache), Type: TypeBool, SetSession: func(s *SessionVars, val string) error { - s.EnableGeneralPlanCache = TiDBOptOn(val) + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableNonPreparedPlanCache, Value: BoolToOnOff(DefTiDBEnableNonPreparedPlanCache), Type: TypeBool, SetSession: func(s *SessionVars, val string) error { + s.EnableNonPreparedPlanCache = TiDBOptOn(val) return nil }}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBGeneralPlanCacheSize, Value: strconv.FormatUint(uint64(DefTiDBGeneralPlanCacheSize), 10), Type: TypeUnsigned, MinValue: 1, MaxValue: 100000, SetSession: func(s *SessionVars, val string) error { + {Scope: ScopeGlobal | ScopeSession, Name: TiDBNonPreparedPlanCacheSize, Value: strconv.FormatUint(uint64(DefTiDBNonPreparedPlanCacheSize), 10), Type: TypeUnsigned, MinValue: 1, MaxValue: 100000, SetSession: func(s *SessionVars, val string) error { uVal, err := strconv.ParseUint(val, 10, 64) if err == nil { - s.GeneralPlanCacheSize = uVal + s.NonPreparedPlanCacheSize = uVal } return err }}, @@ -986,18 +1117,6 @@ var defaultSysVars = []*SysVar{ return err }, }, - {Scope: ScopeGlobal, Name: TiDBEnableConcurrentDDL, Value: BoolToOnOff(DefTiDBEnableConcurrentDDL), Type: TypeBool, SetGlobal: func(_ context.Context, s *SessionVars, val string) error { - if EnableConcurrentDDL.Load() != TiDBOptOn(val) { - err := SwitchConcurrentDDL(TiDBOptOn(val)) - if err != nil { - return err - } - EnableConcurrentDDL.Store(TiDBOptOn(val)) - } - return nil - }, GetGlobal: func(_ context.Context, s *SessionVars) (string, error) { - return BoolToOnOff(EnableConcurrentDDL.Load()), nil - }}, {Scope: ScopeGlobal, Name: TiDBEnableMDL, Value: BoolToOnOff(DefTiDBEnableMDL), Type: TypeBool, SetGlobal: func(_ context.Context, vars *SessionVars, val string) error { if EnableMDL.Load() != TiDBOptOn(val) { err := SwitchMDL(TiDBOptOn(val)) @@ -1009,6 +1128,14 @@ var defaultSysVars = []*SysVar{ }, GetGlobal: func(_ context.Context, vars *SessionVars) (string, error) { return BoolToOnOff(EnableMDL.Load()), nil }}, + {Scope: ScopeGlobal, Name: TiDBDDLEnableDistributeReorg, Value: BoolToOnOff(DefTiDBDDLEnableDistributeReorg), Type: TypeBool, SetGlobal: func(_ context.Context, s *SessionVars, val string) error { + if DDLEnableDistributeReorg.Load() != TiDBOptOn(val) { + DDLEnableDistributeReorg.Store(TiDBOptOn(val)) + } + return nil + }, GetGlobal: func(_ context.Context, s *SessionVars) (string, error) { + return BoolToOnOff(DDLEnableDistributeReorg.Load()), nil + }}, {Scope: ScopeGlobal, Name: TiDBEnableNoopVariables, Value: BoolToOnOff(DefTiDBEnableNoopVariables), Type: TypeEnum, PossibleValues: []string{Off, On}, SetGlobal: func(_ context.Context, s *SessionVars, val string) error { EnableNoopVariables.Store(TiDBOptOn(val)) return nil @@ -1027,6 +1154,8 @@ var defaultSysVars = []*SysVar{ }, GetGlobal: func(_ context.Context, s *SessionVars) (string, error) { return BoolToOnOff(EnableTmpStorageOnOOM.Load()), nil }}, + {Scope: ScopeGlobal, Name: TiDBAutoBuildStatsConcurrency, Value: strconv.Itoa(DefTiDBAutoBuildStatsConcurrency), Type: TypeInt, MinValue: 1, MaxValue: MaxConfigurableConcurrency}, + {Scope: ScopeGlobal, Name: TiDBSysProcScanConcurrency, Value: strconv.Itoa(DefTiDBSysProcScanConcurrency), Type: TypeInt, MinValue: 1, MaxValue: MaxConfigurableConcurrency}, {Scope: ScopeGlobal, Name: TiDBMemoryUsageAlarmRatio, Value: strconv.FormatFloat(DefMemoryUsageAlarmRatio, 'f', -1, 64), Type: TypeFloat, MinValue: 0.0, MaxValue: 1.0, SetGlobal: func(_ context.Context, s *SessionVars, val string) error { MemoryUsageAlarmRatio.Store(tidbOptFloat64(val, DefMemoryUsageAlarmRatio)) return nil @@ -1037,17 +1166,77 @@ var defaultSysVars = []*SysVar{ MemoryUsageAlarmKeepRecordNum.Store(TidbOptInt64(val, DefMemoryUsageAlarmKeepRecordNum)) return nil }, GetGlobal: func(_ context.Context, s *SessionVars) (string, error) { - return fmt.Sprintf("%d", MemoryUsageAlarmKeepRecordNum.Load()), nil + return strconv.FormatInt(MemoryUsageAlarmKeepRecordNum.Load(), 10), nil + }}, + {Scope: ScopeGlobal, Name: PasswordReuseHistory, Value: strconv.Itoa(DefPasswordReuseHistory), Type: TypeUnsigned, MinValue: 0, MaxValue: math.MaxUint32, GetGlobal: func(_ context.Context, s *SessionVars) (string, error) { + return strconv.FormatInt(PasswordHistory.Load(), 10), nil + }, SetGlobal: func(_ context.Context, s *SessionVars, val string) error { + PasswordHistory.Store(TidbOptInt64(val, DefPasswordReuseHistory)) + return nil }}, - {Scope: ScopeGlobal, Name: TiDBEnablePlanReplayerCapture, Value: BoolToOnOff(false), Type: TypeBool, - SetGlobal: func(ctx context.Context, s *SessionVars, val string) error { - EnablePlanReplayerCapture.Store(TiDBOptOn(val)) + {Scope: ScopeGlobal, Name: PasswordReuseTime, Value: strconv.Itoa(DefPasswordReuseTime), Type: TypeUnsigned, MinValue: 0, MaxValue: math.MaxUint32, GetGlobal: func(_ context.Context, s *SessionVars) (string, error) { + return strconv.FormatInt(PasswordReuseInterval.Load(), 10), nil + }, SetGlobal: func(_ context.Context, s *SessionVars, val string) error { + PasswordReuseInterval.Store(TidbOptInt64(val, DefPasswordReuseTime)) + return nil + }}, + {Scope: ScopeGlobal, Name: TiDBEnableHistoricalStatsForCapture, Value: BoolToOnOff(DefTiDBEnableHistoricalStatsForCapture), Type: TypeBool, + SetGlobal: func(ctx context.Context, vars *SessionVars, s string) error { + EnableHistoricalStatsForCapture.Store(TiDBOptOn(s)) + return nil + }, + GetGlobal: func(ctx context.Context, vars *SessionVars) (string, error) { + return BoolToOnOff(EnableHistoricalStatsForCapture.Load()), nil + }, + }, + {Scope: ScopeGlobal, Name: TiDBHistoricalStatsDuration, Value: DefTiDBHistoricalStatsDuration.String(), Type: TypeDuration, MinValue: int64(time.Minute * 10), MaxValue: uint64(time.Hour * 24 * 365), + GetGlobal: func(ctx context.Context, vars *SessionVars) (string, error) { + return HistoricalStatsDuration.Load().String(), nil + }, SetGlobal: func(ctx context.Context, vars *SessionVars, s string) error { + d, err := time.ParseDuration(s) + if err != nil { + return err + } + HistoricalStatsDuration.Store(d) return nil - }, GetGlobal: func(ctx context.Context, vars *SessionVars) (string, error) { - return strconv.FormatBool(EnablePlanReplayerCapture.Load()), nil }}, /* The system variables below have GLOBAL and SESSION scope */ + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnablePlanReplayerContinuesCapture, Value: BoolToOnOff(false), Type: TypeBool, + SetSession: func(s *SessionVars, val string) error { + historicalStatsEnabled, err := s.GlobalVarsAccessor.GetGlobalSysVar(TiDBEnableHistoricalStats) + if err != nil { + return err + } + if !TiDBOptOn(historicalStatsEnabled) && TiDBOptOn(val) { + return errors.Errorf("%v should be enabled before enabling %v", TiDBEnableHistoricalStats, TiDBEnablePlanReplayerContinuesCapture) + } + s.EnablePlanReplayedContinuesCapture = TiDBOptOn(val) + return nil + }, + GetSession: func(vars *SessionVars) (string, error) { + return BoolToOnOff(vars.EnablePlanReplayedContinuesCapture), nil + }, + Validation: func(vars *SessionVars, s string, s2 string, flag ScopeFlag) (string, error) { + historicalStatsEnabled, err := vars.GlobalVarsAccessor.GetGlobalSysVar(TiDBEnableHistoricalStats) + if err != nil { + return "", err + } + if !TiDBOptOn(historicalStatsEnabled) && TiDBOptOn(s) { + return "", errors.Errorf("%v should be enabled before enabling %v", TiDBEnableHistoricalStats, TiDBEnablePlanReplayerContinuesCapture) + } + return s, nil + }, + }, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnablePlanReplayerCapture, Value: BoolToOnOff(true), Type: TypeBool, + SetSession: func(s *SessionVars, val string) error { + s.EnablePlanReplayerCapture = TiDBOptOn(val) + return nil + }, + GetSession: func(vars *SessionVars) (string, error) { + return BoolToOnOff(vars.EnablePlanReplayerCapture), nil + }, + }, {Scope: ScopeGlobal | ScopeSession, Name: TiDBRowFormatVersion, Value: strconv.Itoa(DefTiDBRowFormatV1), Type: TypeUnsigned, MinValue: 1, MaxValue: 2, SetGlobal: func(_ context.Context, s *SessionVars, val string) error { SetDDLReorgRowFormat(TidbOptInt64(val, DefTiDBRowFormatV2)) return nil @@ -1126,7 +1315,7 @@ var defaultSysVars = []*SysVar{ } return normalizedValue, ErrWrongValueForVar.GenWithStackByArgs(ForeignKeyChecks, originalValue) }}, - {Scope: ScopeGlobal, Name: TiDBEnableForeignKey, Value: BoolToOnOff(false), Type: TypeBool, SetGlobal: func(_ context.Context, s *SessionVars, val string) error { + {Scope: ScopeGlobal, Name: TiDBEnableForeignKey, Value: BoolToOnOff(true), Type: TypeBool, SetGlobal: func(_ context.Context, s *SessionVars, val string) error { EnableForeignKey.Store(TiDBOptOn(val)) return nil }, GetGlobal: func(_ context.Context, s *SessionVars) (string, error) { @@ -1495,6 +1684,13 @@ var defaultSysVars = []*SysVar{ appendDeprecationWarning(vars, TiDBStreamAggConcurrency, TiDBExecutorConcurrency) return normalizedValue, nil }}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBIndexMergeIntersectionConcurrency, Value: strconv.Itoa(DefTiDBIndexMergeIntersectionConcurrency), Type: TypeInt, MinValue: 1, MaxValue: MaxConfigurableConcurrency, AllowAutoValue: true, SetSession: func(s *SessionVars, val string) error { + s.indexMergeIntersectionConcurrency = tidbOptPositiveInt32(val, ConcurrencyUnset) + return nil + }, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + appendDeprecationWarning(vars, TiDBIndexMergeIntersectionConcurrency, TiDBExecutorConcurrency) + return normalizedValue, nil + }}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableParallelApply, Value: BoolToOnOff(DefTiDBEnableParallelApply), Type: TypeBool, SetSession: func(s *SessionVars, val string) error { s.EnableParallelApply = TiDBOptOn(val) return nil @@ -1620,7 +1816,7 @@ var defaultSysVars = []*SysVar{ s.NoopFuncsMode = TiDBOptOnOffWarn(val) return nil }}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBReplicaRead, Value: "leader", Type: TypeEnum, PossibleValues: []string{"leader", "follower", "leader-and-follower", "closest-replicas", "closest-adaptive"}, SetSession: func(s *SessionVars, val string) error { + {Scope: ScopeGlobal | ScopeSession, Name: TiDBReplicaRead, Value: "leader", Type: TypeEnum, PossibleValues: []string{"leader", "prefer-leader", "follower", "leader-and-follower", "closest-replicas", "closest-adaptive", "learner"}, SetSession: func(s *SessionVars, val string) error { if strings.EqualFold(val, "follower") { s.SetReplicaRead(kv.ReplicaReadFollower) } else if strings.EqualFold(val, "leader-and-follower") { @@ -1631,6 +1827,10 @@ var defaultSysVars = []*SysVar{ s.SetReplicaRead(kv.ReplicaReadClosest) } else if strings.EqualFold(val, "closest-adaptive") { s.SetReplicaRead(kv.ReplicaReadClosestAdaptive) + } else if strings.EqualFold(val, "learner") { + s.SetReplicaRead(kv.ReplicaReadLearner) + } else if strings.EqualFold(val, "prefer-leader") { + s.SetReplicaRead(kv.ReplicaReadPreferLeader) } return nil }}, @@ -1704,14 +1904,6 @@ var defaultSysVars = []*SysVar{ s.ShardAllocateStep = TidbOptInt64(val, DefTiDBShardAllocateStep) return nil }}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableAmendPessimisticTxn, Value: BoolToOnOff(DefTiDBEnableAmendPessimisticTxn), Type: TypeBool, SetSession: func(s *SessionVars, val string) error { - enableAmend := TiDBOptOn(val) - if enableAmend && EnableFastReorg.Load() { - return errors.Errorf("amend pessimistic transactions is not compatible with tidb_ddl_enable_fast_reorg") - } - s.EnableAmendPessimisticTxn = enableAmend - return nil - }}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableAsyncCommit, Value: BoolToOnOff(DefTiDBEnableAsyncCommit), Type: TypeBool, SetSession: func(s *SessionVars, val string) error { s.EnableAsyncCommit = TiDBOptOn(val) return nil @@ -1851,6 +2043,12 @@ var defaultSysVars = []*SysVar{ return nil }, }, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBIndexJoinDoubleReadPenaltyCostRate, Value: strconv.Itoa(0), Hidden: false, Type: TypeFloat, MinValue: 0, MaxValue: math.MaxUint64, + SetSession: func(vars *SessionVars, s string) error { + vars.IndexJoinDoubleReadPenaltyCostRate = tidbOptFloat64(s, 0) + return nil + }, + }, {Scope: ScopeGlobal | ScopeSession, Name: TiDBRCWriteCheckTs, Type: TypeBool, Value: BoolToOnOff(DefTiDBRcWriteCheckTs), SetSession: func(s *SessionVars, val string) error { s.RcWriteCheckTS = TiDBOptOn(val) return nil @@ -1997,6 +2195,177 @@ var defaultSysVars = []*SysVar{ s.EnableReuseCheck = TiDBOptOn(val) return nil }}, + {Scope: ScopeGlobal, Name: TiDBTTLJobEnable, Value: BoolToOnOff(DefTiDBTTLJobEnable), Type: TypeBool, SetGlobal: func(ctx context.Context, vars *SessionVars, s string) error { + EnableTTLJob.Store(TiDBOptOn(s)) + return nil + }, GetGlobal: func(ctx context.Context, vars *SessionVars) (string, error) { + return BoolToOnOff(EnableTTLJob.Load()), nil + }}, + {Scope: ScopeGlobal, Name: TiDBTTLScanBatchSize, Value: strconv.Itoa(DefTiDBTTLScanBatchSize), Type: TypeInt, MinValue: DefTiDBTTLScanBatchMinSize, MaxValue: DefTiDBTTLScanBatchMaxSize, SetGlobal: func(ctx context.Context, vars *SessionVars, s string) error { + val, err := strconv.ParseInt(s, 10, 64) + if err != nil { + return err + } + TTLScanBatchSize.Store(val) + return nil + }, GetGlobal: func(ctx context.Context, vars *SessionVars) (string, error) { + val := TTLScanBatchSize.Load() + return strconv.FormatInt(val, 10), nil + }}, + {Scope: ScopeGlobal, Name: TiDBTTLDeleteBatchSize, Value: strconv.Itoa(DefTiDBTTLDeleteBatchSize), Type: TypeInt, MinValue: DefTiDBTTLDeleteBatchMinSize, MaxValue: DefTiDBTTLDeleteBatchMaxSize, SetGlobal: func(ctx context.Context, vars *SessionVars, s string) error { + val, err := strconv.ParseInt(s, 10, 64) + if err != nil { + return err + } + TTLDeleteBatchSize.Store(val) + return nil + }, GetGlobal: func(ctx context.Context, vars *SessionVars) (string, error) { + val := TTLDeleteBatchSize.Load() + return strconv.FormatInt(val, 10), nil + }}, + {Scope: ScopeGlobal, Name: TiDBTTLDeleteRateLimit, Value: strconv.Itoa(DefTiDBTTLDeleteRateLimit), Type: TypeInt, MinValue: 0, MaxValue: math.MaxInt64, SetGlobal: func(ctx context.Context, vars *SessionVars, s string) error { + val, err := strconv.ParseInt(s, 10, 64) + if err != nil { + return err + } + TTLDeleteRateLimit.Store(val) + return nil + }, GetGlobal: func(ctx context.Context, vars *SessionVars) (string, error) { + val := TTLDeleteRateLimit.Load() + return strconv.FormatInt(val, 10), nil + }}, + { + Scope: ScopeGlobal | ScopeSession, Name: TiDBStoreBatchSize, Value: strconv.FormatInt(DefTiDBStoreBatchSize, 10), + Type: TypeInt, MinValue: 0, MaxValue: 25000, SetSession: func(s *SessionVars, val string) error { + s.StoreBatchSize = TidbOptInt(val, DefTiDBStoreBatchSize) + return nil + }, + }, + {Scope: ScopeGlobal | ScopeSession, Name: MppExchangeCompressionMode, Type: TypeStr, Value: DefaultExchangeCompressionMode.Name(), + Validation: func(_ *SessionVars, normalizedValue string, originalValue string, _ ScopeFlag) (string, error) { + _, ok := kv.ToExchangeCompressionMode(normalizedValue) + if !ok { + var msg string + for m := kv.ExchangeCompressionModeNONE; m <= kv.ExchangeCompressionModeUnspecified; m += 1 { + if m == 0 { + msg = m.Name() + } else { + msg = fmt.Sprintf("%s, %s", msg, m.Name()) + } + } + err := fmt.Errorf("incorrect value: `%s`. %s options: %s", + originalValue, + MppExchangeCompressionMode, msg) + return normalizedValue, err + } + return normalizedValue, nil + }, + SetSession: func(s *SessionVars, val string) error { + s.mppExchangeCompressionMode, _ = kv.ToExchangeCompressionMode(val) + if s.ChooseMppVersion() == kv.MppVersionV0 && s.mppExchangeCompressionMode != kv.ExchangeCompressionModeUnspecified { + s.StmtCtx.AppendWarning(fmt.Errorf("mpp exchange compression won't work under current mpp version %d", kv.MppVersionV0)) + } + + return nil + }, + }, + {Scope: ScopeGlobal | ScopeSession, Name: MppVersion, Type: TypeStr, Value: kv.MppVersionUnspecifiedName, + Validation: func(_ *SessionVars, normalizedValue string, originalValue string, _ ScopeFlag) (string, error) { + _, ok := kv.ToMppVersion(normalizedValue) + if ok { + return normalizedValue, nil + } + errMsg := fmt.Sprintf("incorrect value: %s. %s options: %d (unspecified)", + originalValue, MppVersion, kv.MppVersionUnspecified) + for i := kv.MppVersionV0; i <= kv.GetNewestMppVersion(); i += 1 { + errMsg = fmt.Sprintf("%s, %d", errMsg, i) + } + + return normalizedValue, errors.New(errMsg) + }, + SetSession: func(s *SessionVars, val string) error { + version, _ := kv.ToMppVersion(val) + s.mppVersion = version + return nil + }, + }, + { + Scope: ScopeGlobal, Name: TiDBTTLJobScheduleWindowStartTime, Value: DefTiDBTTLJobScheduleWindowStartTime, Type: TypeTime, SetGlobal: func(ctx context.Context, vars *SessionVars, s string) error { + startTime, err := time.ParseInLocation(FullDayTimeFormat, s, time.UTC) + if err != nil { + return err + } + TTLJobScheduleWindowStartTime.Store(startTime) + return nil + }, GetGlobal: func(ctx context.Context, vars *SessionVars) (string, error) { + startTime := TTLJobScheduleWindowStartTime.Load() + return startTime.Format(FullDayTimeFormat), nil + }, + }, + { + Scope: ScopeGlobal, Name: TiDBTTLJobScheduleWindowEndTime, Value: DefTiDBTTLJobScheduleWindowEndTime, Type: TypeTime, SetGlobal: func(ctx context.Context, vars *SessionVars, s string) error { + endTime, err := time.ParseInLocation(FullDayTimeFormat, s, time.UTC) + if err != nil { + return err + } + TTLJobScheduleWindowEndTime.Store(endTime) + return nil + }, GetGlobal: func(ctx context.Context, vars *SessionVars) (string, error) { + endTime := TTLJobScheduleWindowEndTime.Load() + return endTime.Format(FullDayTimeFormat), nil + }, + }, + { + Scope: ScopeGlobal, Name: TiDBTTLScanWorkerCount, Value: strconv.Itoa(DefTiDBTTLScanWorkerCount), Type: TypeUnsigned, MinValue: 1, MaxValue: 256, SetGlobal: func(ctx context.Context, vars *SessionVars, s string) error { + val, err := strconv.ParseInt(s, 10, 64) + if err != nil { + return err + } + TTLScanWorkerCount.Store(int32(val)) + return nil + }, GetGlobal: func(ctx context.Context, vars *SessionVars) (string, error) { + return strconv.Itoa(int(TTLScanWorkerCount.Load())), nil + }, + }, + { + Scope: ScopeGlobal, Name: TiDBTTLDeleteWorkerCount, Value: strconv.Itoa(DefTiDBTTLDeleteWorkerCount), Type: TypeUnsigned, MinValue: 1, MaxValue: 256, SetGlobal: func(ctx context.Context, vars *SessionVars, s string) error { + val, err := strconv.ParseInt(s, 10, 64) + if err != nil { + return err + } + TTLDeleteWorkerCount.Store(int32(val)) + return nil + }, GetGlobal: func(ctx context.Context, vars *SessionVars) (string, error) { + return strconv.Itoa(int(TTLDeleteWorkerCount.Load())), nil + }, + }, + {Scope: ScopeGlobal, Name: TiDBEnableResourceControl, Value: BoolToOnOff(DefTiDBEnableResourceControl), Type: TypeBool, SetGlobal: func(ctx context.Context, vars *SessionVars, s string) error { + if TiDBOptOn(s) != EnableResourceControl.Load() { + EnableResourceControl.Store(TiDBOptOn(s)) + (*SetGlobalResourceControl.Load())(TiDBOptOn(s)) + logutil.BgLogger().Info("set resource control", zap.Bool("enable", TiDBOptOn(s))) + } + return nil + }, GetGlobal: func(ctx context.Context, vars *SessionVars) (string, error) { + return BoolToOnOff(EnableResourceControl.Load()), nil + }}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBPessimisticTransactionAggressiveLocking, Value: BoolToOnOff(DefTiDBPessimisticTransactionAggressiveLocking), Type: TypeBool, SetSession: func(s *SessionVars, val string) error { + s.PessimisticTransactionAggressiveLocking = TiDBOptOn(val) + return nil + }}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnablePlanCacheForParamLimit, Value: BoolToOnOff(DefTiDBEnablePlanCacheForParamLimit), Type: TypeBool, SetSession: func(s *SessionVars, val string) error { + s.EnablePlanCacheForParamLimit = TiDBOptOn(val) + return nil + }}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableINLJoinInnerMultiPattern, Value: BoolToOnOff(false), Type: TypeBool, + SetSession: func(s *SessionVars, val string) error { + s.EnableINLJoinInnerMultiPattern = TiDBOptOn(val) + return nil + }, + GetSession: func(s *SessionVars) (string, error) { + return BoolToOnOff(s.EnableINLJoinInnerMultiPattern), nil + }, + }, } // FeedbackProbability points to the FeedbackProbability in statistics package. @@ -2097,6 +2466,10 @@ const ( WarningCount = "warning_count" // ErrorCount is the name for 'error_count' system variable. ErrorCount = "error_count" + // DefaultPasswordLifetime is the name for 'default_password_lifetime' system variable. + DefaultPasswordLifetime = "default_password_lifetime" + // DisconnectOnExpiredPassword is the name for 'disconnect_on_expired_password' system variable. + DisconnectOnExpiredPassword = "disconnect_on_expired_password" // SQLSelectLimit is the name for 'sql_select_limit' system variable. SQLSelectLimit = "sql_select_limit" // MaxConnectErrors is the name for 'max_connect_errors' system variable. @@ -2113,10 +2486,6 @@ const ( BlockEncryptionMode = "block_encryption_mode" // WaitTimeout is the name for 'wait_timeout' system variable. WaitTimeout = "wait_timeout" - // ValidatePasswordNumberCount is the name of 'validate_password_number_count' system variable. - ValidatePasswordNumberCount = "validate_password_number_count" - // ValidatePasswordLength is the name of 'validate_password_length' system variable. - ValidatePasswordLength = "validate_password_length" // Version is the name of 'version' system variable. Version = "version" // VersionComment is the name of 'version_comment' system variable. @@ -2139,8 +2508,6 @@ const ( BinlogOrderCommits = "binlog_order_commits" // MasterVerifyChecksum is the name for 'master_verify_checksum' system variable. MasterVerifyChecksum = "master_verify_checksum" - // ValidatePasswordCheckUserName is the name for 'validate_password_check_user_name' system variable. - ValidatePasswordCheckUserName = "validate_password_check_user_name" // SuperReadOnly is the name for 'super_read_only' system variable. SuperReadOnly = "super_read_only" // SQLNotes is the name for 'sql_notes' system variable. @@ -2307,4 +2674,21 @@ const ( RandSeed2 = "rand_seed2" // SQLRequirePrimaryKey is the name of `sql_require_primary_key` system variable. SQLRequirePrimaryKey = "sql_require_primary_key" + // ValidatePasswordEnable turns on/off the validation of password. + ValidatePasswordEnable = "validate_password.enable" + // ValidatePasswordPolicy specifies the password policy enforced by validate_password. + ValidatePasswordPolicy = "validate_password.policy" + // ValidatePasswordCheckUserName controls whether validate_password compares passwords to the user name part of + // the effective user account for the current session + ValidatePasswordCheckUserName = "validate_password.check_user_name" + // ValidatePasswordLength specified the minimum number of characters that validate_password requires passwords to have + ValidatePasswordLength = "validate_password.length" + // ValidatePasswordMixedCaseCount specified the minimum number of lowercase and uppercase characters that validate_password requires + ValidatePasswordMixedCaseCount = "validate_password.mixed_case_count" + // ValidatePasswordNumberCount specified the minimum number of numeric (digit) characters that validate_password requires + ValidatePasswordNumberCount = "validate_password.number_count" + // ValidatePasswordSpecialCharCount specified the minimum number of nonalphanumeric characters that validate_password requires + ValidatePasswordSpecialCharCount = "validate_password.special_char_count" + // ValidatePasswordDictionary specified the dictionary that validate_password uses for checking passwords. Each word is separated by semicolon (;). + ValidatePasswordDictionary = "validate_password.dictionary" ) diff --git a/sessionctx/variable/sysvar_test.go b/sessionctx/variable/sysvar_test.go index b44c852aed1fa..cf879d3ec4344 100644 --- a/sessionctx/variable/sysvar_test.go +++ b/sessionctx/variable/sysvar_test.go @@ -22,11 +22,13 @@ import ( "strconv" "sync/atomic" "testing" + "time" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/util/gctuner" "github.com/pingcap/tidb/util/memory" "github.com/stretchr/testify/require" ) @@ -673,6 +675,27 @@ func TestDefaultMemoryDebugModeValue(t *testing.T) { require.Equal(t, val, "0") } +func TestSetTIDBDistributeReorg(t *testing.T) { + vars := NewSessionVars(nil) + mock := NewMockGlobalAccessor4Tests() + mock.SessionVars = vars + vars.GlobalVarsAccessor = mock + + // Set to on + err := mock.SetGlobalSysVar(context.Background(), TiDBDDLEnableDistributeReorg, On) + require.NoError(t, err) + val, err := mock.GetGlobalSysVar(TiDBDDLEnableDistributeReorg) + require.NoError(t, err) + require.Equal(t, On, val) + + // Set to off + err = mock.SetGlobalSysVar(context.Background(), TiDBDDLEnableDistributeReorg, Off) + require.NoError(t, err) + val, err = mock.GetGlobalSysVar(TiDBDDLEnableDistributeReorg) + require.NoError(t, err) + require.Equal(t, Off, val) +} + func TestDefaultPartitionPruneMode(t *testing.T) { vars := NewSessionVars(nil) mock := NewMockGlobalAccessor4Tests() @@ -691,8 +714,8 @@ func TestSetTIDBFastDDL(t *testing.T) { vars.GlobalVarsAccessor = mock fastDDL := GetSysVar(TiDBDDLEnableFastReorg) - // Default off - require.Equal(t, fastDDL.Value, Off) + // Default true + require.Equal(t, fastDDL.Value, On) // Set to On err := mock.SetGlobalSysVar(context.Background(), TiDBDDLEnableFastReorg, On) @@ -843,7 +866,6 @@ func TestTiDBServerMemoryLimit2(t *testing.T) { mock.SessionVars = vars vars.GlobalVarsAccessor = mock var ( - //mb uint64 = 1 << 20 err error val string ) @@ -951,6 +973,91 @@ func TestTiDBServerMemoryLimit2(t *testing.T) { require.Error(t, err) } +func TestTiDBServerMemoryLimitSessMinSize(t *testing.T) { + vars := NewSessionVars(nil) + mock := NewMockGlobalAccessor4Tests() + mock.SessionVars = vars + vars.GlobalVarsAccessor = mock + + var ( + err error + val string + ) + + serverMemroyLimitSessMinSize := GetSysVar(TiDBServerMemoryLimitSessMinSize) + // Check default value + require.Equal(t, serverMemroyLimitSessMinSize.Value, strconv.FormatInt(DefTiDBServerMemoryLimitSessMinSize, 10)) + + err = mock.SetGlobalSysVar(context.Background(), TiDBServerMemoryLimitSessMinSize, "123456") + require.NoError(t, err) + val, err = mock.GetGlobalSysVar(TiDBServerMemoryLimitSessMinSize) + require.NoError(t, err) + require.Equal(t, memory.ServerMemoryLimitSessMinSize.Load(), uint64(123456)) + require.Equal(t, "123456", val) + + err = mock.SetGlobalSysVar(context.Background(), TiDBServerMemoryLimitSessMinSize, "100") + require.NoError(t, err) + val, err = mock.GetGlobalSysVar(TiDBServerMemoryLimitSessMinSize) + require.NoError(t, err) + require.Equal(t, memory.ServerMemoryLimitSessMinSize.Load(), uint64(128)) + require.Equal(t, "128", val) + + err = mock.SetGlobalSysVar(context.Background(), TiDBServerMemoryLimitSessMinSize, "123MB") + require.NoError(t, err) + val, err = mock.GetGlobalSysVar(TiDBServerMemoryLimitSessMinSize) + require.NoError(t, err) + require.Equal(t, memory.ServerMemoryLimitSessMinSize.Load(), uint64(123<<20)) + require.Equal(t, "128974848", val) +} + +func TestTiDBServerMemoryLimitGCTrigger(t *testing.T) { + vars := NewSessionVars(nil) + mock := NewMockGlobalAccessor4Tests() + mock.SessionVars = vars + vars.GlobalVarsAccessor = mock + + var ( + err error + val string + ) + + serverMemroyLimitGCTrigger := GetSysVar(TiDBServerMemoryLimitGCTrigger) + // Check default value + require.Equal(t, serverMemroyLimitGCTrigger.Value, strconv.FormatFloat(DefTiDBServerMemoryLimitGCTrigger, 'f', -1, 64)) + defer func() { + err = mock.SetGlobalSysVar(context.Background(), TiDBServerMemoryLimitGCTrigger, strconv.FormatFloat(DefTiDBServerMemoryLimitGCTrigger, 'f', -1, 64)) + require.NoError(t, err) + }() + + err = mock.SetGlobalSysVar(context.Background(), TiDBServerMemoryLimitGCTrigger, "0.8") + require.NoError(t, err) + val, err = mock.GetGlobalSysVar(TiDBServerMemoryLimitGCTrigger) + require.NoError(t, err) + require.Equal(t, gctuner.GlobalMemoryLimitTuner.GetPercentage(), 0.8) + require.Equal(t, "0.8", val) + + err = mock.SetGlobalSysVar(context.Background(), TiDBServerMemoryLimitGCTrigger, "90%") + require.NoError(t, err) + val, err = mock.GetGlobalSysVar(TiDBServerMemoryLimitGCTrigger) + require.NoError(t, err) + require.Equal(t, gctuner.GlobalMemoryLimitTuner.GetPercentage(), 0.9) + require.Equal(t, "0.9", val) + + err = mock.SetGlobalSysVar(context.Background(), TiDBServerMemoryLimitGCTrigger, "100%") + require.Error(t, err) + err = mock.SetGlobalSysVar(context.Background(), TiDBServerMemoryLimitGCTrigger, "101%") + require.Error(t, err) + err = mock.SetGlobalSysVar(context.Background(), TiDBServerMemoryLimitGCTrigger, "99%") + require.NoError(t, err) + + err = mock.SetGlobalSysVar(context.Background(), TiDBGOGCTunerThreshold, "0.4") + require.NoError(t, err) + err = mock.SetGlobalSysVar(context.Background(), TiDBServerMemoryLimitGCTrigger, "49%") + require.Error(t, err) + err = mock.SetGlobalSysVar(context.Background(), TiDBServerMemoryLimitGCTrigger, "51%") + require.NoError(t, err) +} + func TestSetAggPushDownGlobally(t *testing.T) { vars := NewSessionVars(nil) mock := NewMockGlobalAccessor4Tests() @@ -966,3 +1073,85 @@ func TestSetAggPushDownGlobally(t *testing.T) { require.NoError(t, err) require.Equal(t, "ON", val) } + +func TestSetJobScheduleWindow(t *testing.T) { + vars := NewSessionVars(nil) + mock := NewMockGlobalAccessor4Tests() + mock.SessionVars = vars + vars.GlobalVarsAccessor = mock + + // default value + val, err := mock.GetGlobalSysVar(TiDBTTLJobScheduleWindowStartTime) + require.NoError(t, err) + require.Equal(t, "00:00 +0000", val) + + // set and get variable in UTC + vars.TimeZone = time.UTC + err = mock.SetGlobalSysVar(context.Background(), TiDBTTLJobScheduleWindowStartTime, "16:11") + require.NoError(t, err) + val, err = mock.GetGlobalSysVar(TiDBTTLJobScheduleWindowStartTime) + require.NoError(t, err) + require.Equal(t, "16:11 +0000", val) + + // set variable in UTC, get it in Asia/Shanghai + vars.TimeZone = time.UTC + err = mock.SetGlobalSysVar(context.Background(), TiDBTTLJobScheduleWindowStartTime, "16:11") + require.NoError(t, err) + vars.TimeZone, err = time.LoadLocation("Asia/Shanghai") + require.NoError(t, err) + val, err = mock.GetGlobalSysVar(TiDBTTLJobScheduleWindowStartTime) + require.NoError(t, err) + require.Equal(t, "16:11 +0000", val) + + // set variable in Asia/Shanghai, get it it UTC + vars.TimeZone, err = time.LoadLocation("Asia/Shanghai") + require.NoError(t, err) + err = mock.SetGlobalSysVar(context.Background(), TiDBTTLJobScheduleWindowStartTime, "16:11") + require.NoError(t, err) + vars.TimeZone = time.UTC + val, err = mock.GetGlobalSysVar(TiDBTTLJobScheduleWindowStartTime) + require.NoError(t, err) + require.Equal(t, "16:11 +0800", val) +} + +func TestTiDBEnableResourceControl(t *testing.T) { + // setup the hooks for test + enable := false + EnableGlobalResourceControlFunc = func() { enable = true } + DisableGlobalResourceControlFunc = func() { enable = false } + setGlobalResourceControlFunc := func(enable bool) { + if enable { + EnableGlobalResourceControlFunc() + } else { + DisableGlobalResourceControlFunc() + } + } + SetGlobalResourceControl.Store(&setGlobalResourceControlFunc) + + vars := NewSessionVars(nil) + mock := NewMockGlobalAccessor4Tests() + mock.SessionVars = vars + vars.GlobalVarsAccessor = mock + resourceControlEnabled := GetSysVar(TiDBEnableResourceControl) + + // Default false + require.Equal(t, resourceControlEnabled.Value, Off) + require.Equal(t, enable, false) + + // Set to On + err := mock.SetGlobalSysVar(context.Background(), TiDBEnableResourceControl, On) + + require.NoError(t, err) + val, err1 := mock.GetGlobalSysVar(TiDBEnableResourceControl) + require.NoError(t, err1) + require.Equal(t, On, val) + require.Equal(t, enable, true) + + // Set to off + err = mock.SetGlobalSysVar(context.Background(), TiDBEnableResourceControl, Off) + require.NoError(t, err) + val, err1 = mock.GetGlobalSysVar(TiDBEnableResourceControl) + require.NoError(t, err1) + require.Equal(t, Off, val) + require.Equal(t, enable, false) +} diff --git a/sessionctx/variable/tidb_vars.go b/sessionctx/variable/tidb_vars.go index 80c9b41f4cc6e..9d5cc3c5e93a0 100644 --- a/sessionctx/variable/tidb_vars.go +++ b/sessionctx/variable/tidb_vars.go @@ -16,11 +16,14 @@ package variable import ( "context" + "fmt" "math" + "time" "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/mysql" - "github.com/pingcap/tidb/sessionctx/variable/featuretag/concurrencyddl" + "github.com/pingcap/tidb/sessionctx/variable/featuretag/distributereorg" "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/paging" "github.com/pingcap/tidb/util/size" @@ -425,6 +428,9 @@ const ( // tidb_stream_agg_concurrency is deprecated, use tidb_executor_concurrency instead. TiDBStreamAggConcurrency = "tidb_streamagg_concurrency" + // TiDBIndexMergeIntersectionConcurrency is used for parallel worker of index merge intersection. + TiDBIndexMergeIntersectionConcurrency = "tidb_index_merge_intersection_concurrency" + // TiDBEnableParallelApply is used for parallel apply. TiDBEnableParallelApply = "tidb_enable_parallel_apply" @@ -555,6 +561,9 @@ const ( // TiDBMetricSchemaStep indicates the step when query metric schema. TiDBMetricSchemaStep = "tidb_metric_query_step" + // TiDBCDCWriteSource indicates the following data is written by TiCDC if it is not 0. + TiDBCDCWriteSource = "tidb_cdc_write_source" + // TiDBMetricSchemaRangeDuration indicates the range duration when query metric schema. TiDBMetricSchemaRangeDuration = "tidb_metric_query_range_duration" @@ -584,9 +593,6 @@ const ( // TiDBEnableTelemetry indicates that whether usage data report to PingCAP is enabled. TiDBEnableTelemetry = "tidb_enable_telemetry" - // TiDBEnableAmendPessimisticTxn indicates if amend pessimistic transactions is enabled. - TiDBEnableAmendPessimisticTxn = "tidb_enable_amend_pessimistic_txn" - // TiDBMemoryUsageAlarmRatio indicates the alarm threshold when memory usage of the tidb-server exceeds. TiDBMemoryUsageAlarmRatio = "tidb_memory_usage_alarm_ratio" @@ -627,6 +633,9 @@ const ( // TiDBEnableTopSQL indicates whether the top SQL is enabled. TiDBEnableTopSQL = "tidb_enable_top_sql" + // TiDBSourceID indicates the source ID of the TiDB server. + TiDBSourceID = "tidb_source_id" + // TiDBTopSQLMaxTimeSeriesCount indicates the max number of statements been collected in each time series. TiDBTopSQLMaxTimeSeriesCount = "tidb_top_sql_max_time_series_count" @@ -689,6 +698,12 @@ const ( // TiDBCostModelVersion is a internal switch to indicates the cost model version. TiDBCostModelVersion = "tidb_cost_model_version" + // TiDBIndexJoinDoubleReadPenaltyCostRate indicates whether to add some penalty cost to IndexJoin and how much of it. + // IndexJoin can cause plenty of extra double read tasks, which consume lots of resources and take a long time. + // Since the number of double read tasks is hard to estimated accurately, we leave this variable to let us can adjust this + // part of cost manually. + TiDBIndexJoinDoubleReadPenaltyCostRate = "tidb_index_join_double_read_penalty_cost_rate" + // TiDBBatchPendingTiFlashCount indicates the maximum count of non-available TiFlash tables. TiDBBatchPendingTiFlashCount = "tidb_batch_pending_tiflash_count" @@ -739,10 +754,10 @@ const ( // TiDBEnablePrepPlanCacheMemoryMonitor indicates whether to enable prepared plan cache monitor TiDBEnablePrepPlanCacheMemoryMonitor = "tidb_enable_prepared_plan_cache_memory_monitor" - // TiDBEnableGeneralPlanCache indicates whether to enable general plan cache. - TiDBEnableGeneralPlanCache = "tidb_enable_general_plan_cache" - // TiDBGeneralPlanCacheSize controls the size of general plan cache. - TiDBGeneralPlanCacheSize = "tidb_general_plan_cache_size" + // TiDBEnableNonPreparedPlanCache indicates whether to enable non-prepared plan cache. + TiDBEnableNonPreparedPlanCache = "tidb_enable_non_prepared_plan_cache" + // TiDBNonPreparedPlanCacheSize controls the size of non-prepared plan cache. + TiDBNonPreparedPlanCacheSize = "tidb_non_prepared_plan_cache_size" // TiDBConstraintCheckInPlacePessimistic controls whether to skip certain kinds of pessimistic locks. TiDBConstraintCheckInPlacePessimistic = "tidb_constraint_check_in_place_pessimistic" @@ -770,8 +785,30 @@ const ( // TiDBEnablePlanReplayerCapture indicates whether to enable plan replayer capture TiDBEnablePlanReplayerCapture = "tidb_enable_plan_replayer_capture" + + // TiDBEnablePlanReplayerContinuesCapture indicates whether to enable continues capture + TiDBEnablePlanReplayerContinuesCapture = "tidb_enable_plan_replayer_continues_capture" // TiDBEnableReusechunk indicates whether to enable chunk alloc TiDBEnableReusechunk = "tidb_enable_reuse_chunk" + + // TiDBStoreBatchSize indicates the batch size of coprocessor in the same store. + TiDBStoreBatchSize = "tidb_store_batch_size" + + // MppExchangeCompressionMode indicates the data compression method in mpp exchange operator + MppExchangeCompressionMode = "mpp_exchange_compression_mode" + + // MppVersion indicates the mpp-version used to build mpp plan + MppVersion = "mpp_version" + + // TiDBPessimisticTransactionAggressiveLocking controls whether aggressive locking for pessimistic transaction + // is enabled. + TiDBPessimisticTransactionAggressiveLocking = "tidb_pessimistic_txn_aggressive_locking" + + // TiDBEnablePlanCacheForParamLimit controls whether prepare statement with parameterized limit can be cached + TiDBEnablePlanCacheForParamLimit = "tidb_enable_plan_cache_for_param_limit" + + // TiDBEnableINLJoinInnerMultiPattern indicates whether enable multi pattern for inner side of inl join + TiDBEnableINLJoinInnerMultiPattern = "tidb_enable_inl_join_inner_multi_pattern" ) // TiDB vars that have only global scope @@ -827,8 +864,8 @@ const ( // TiDBMaxAutoAnalyzeTime is the max time that auto analyze can run. If auto analyze runs longer than the value, it // will be killed. 0 indicates that there is no time limit. TiDBMaxAutoAnalyzeTime = "tidb_max_auto_analyze_time" - // TiDBEnableConcurrentDDL indicates whether to enable the new DDL framework. - TiDBEnableConcurrentDDL = "tidb_enable_concurrent_ddl" + // TiDBDDLEnableDistributeReorg indicates whether to enable the new Reorg framework. + TiDBDDLEnableDistributeReorg = "tidb_ddl_distribute_reorg" // TiDBGenerateBinaryPlan indicates whether binary plan should be generated in slow log and statements summary. TiDBGenerateBinaryPlan = "tidb_generate_binary_plan" // TiDBEnableGCAwareMemoryTrack indicates whether to turn-on GC-aware memory track. @@ -840,6 +877,10 @@ const ( TiDBDDLEnableFastReorg = "tidb_ddl_enable_fast_reorg" // TiDBDDLDiskQuota used to set disk quota for lightning add index. TiDBDDLDiskQuota = "tidb_ddl_disk_quota" + // TiDBAutoBuildStatsConcurrency is used to set the build concurrency of auto-analyze. + TiDBAutoBuildStatsConcurrency = "tidb_auto_build_stats_concurrency" + // TiDBSysProcScanConcurrency is used to set the scan concurrency of for backend system processes, like auto-analyze. + TiDBSysProcScanConcurrency = "tidb_sysproc_scan_concurrency" // TiDBServerMemoryLimit indicates the memory limit of the tidb-server instance. TiDBServerMemoryLimit = "tidb_server_memory_limit" // TiDBServerMemoryLimitSessMinSize indicates the minimal memory used of a session, that becomes a candidate for session kill. @@ -852,6 +893,42 @@ const ( TiDBGOGCTunerThreshold = "tidb_gogc_tuner_threshold" // TiDBExternalTS is the ts to read through when the `TiDBEnableExternalTsRead` is on TiDBExternalTS = "tidb_external_ts" + // TiDBTTLJobEnable is used to enable/disable scheduling ttl job + TiDBTTLJobEnable = "tidb_ttl_job_enable" + // TiDBTTLScanBatchSize is used to control the batch size in the SELECT statement for TTL jobs + TiDBTTLScanBatchSize = "tidb_ttl_scan_batch_size" + // TiDBTTLDeleteBatchSize is used to control the batch size in the DELETE statement for TTL jobs + TiDBTTLDeleteBatchSize = "tidb_ttl_delete_batch_size" + // TiDBTTLDeleteRateLimit is used to control the delete rate limit for TTL jobs in each node + TiDBTTLDeleteRateLimit = "tidb_ttl_delete_rate_limit" + // TiDBTTLJobScheduleWindowStartTime is used to restrict the start time of the time window of scheduling the ttl jobs. + TiDBTTLJobScheduleWindowStartTime = "tidb_ttl_job_schedule_window_start_time" + // TiDBTTLJobScheduleWindowEndTime is used to restrict the end time of the time window of scheduling the ttl jobs. + TiDBTTLJobScheduleWindowEndTime = "tidb_ttl_job_schedule_window_end_time" + // TiDBTTLScanWorkerCount indicates the count of the scan workers in each TiDB node + TiDBTTLScanWorkerCount = "tidb_ttl_scan_worker_count" + // TiDBTTLDeleteWorkerCount indicates the count of the delete workers in each TiDB node + TiDBTTLDeleteWorkerCount = "tidb_ttl_delete_worker_count" + // PasswordReuseHistory limit a few passwords to reuse. + PasswordReuseHistory = "password_history" + // PasswordReuseTime limit how long passwords can be reused. + PasswordReuseTime = "password_reuse_interval" + // TiDBHistoricalStatsDuration indicates the duration to remain tidb historical stats + TiDBHistoricalStatsDuration = "tidb_historical_stats_duration" + // TiDBEnableHistoricalStatsForCapture indicates whether use historical stats in plan replayer capture + TiDBEnableHistoricalStatsForCapture = "tidb_enable_historical_stats_for_capture" + // TiDBEnableResourceControl indicates whether resource control feature is enabled + TiDBEnableResourceControl = "tidb_enable_resource_control" + // TiDBStmtSummaryEnablePersistent indicates whether to enable file persistence for stmtsummary. + TiDBStmtSummaryEnablePersistent = "tidb_stmt_summary_enable_persistent" + // TiDBStmtSummaryFilename indicates the file name written by stmtsummary. + TiDBStmtSummaryFilename = "tidb_stmt_summary_filename" + // TiDBStmtSummaryFileMaxDays indicates how many days the files written by stmtsummary will be kept. + TiDBStmtSummaryFileMaxDays = "tidb_stmt_summary_file_max_days" + // TiDBStmtSummaryFileMaxSize indicates the maximum size (in mb) of a single file written by stmtsummary. + TiDBStmtSummaryFileMaxSize = "tidb_stmt_summary_file_max_size" + // TiDBStmtSummaryFileMaxBackups indicates the maximum number of files written by stmtsummary. + TiDBStmtSummaryFileMaxBackups = "tidb_stmt_summary_file_max_backups" ) // TiDB intentional limits @@ -926,7 +1003,7 @@ const ( DefBroadcastJoinThresholdCount = 10 * 1024 DefTiDBOptimizerSelectivityLevel = 0 DefTiDBOptimizerEnableNewOFGB = false - DefTiDBEnableOuterJoinReorder = false + DefTiDBEnableOuterJoinReorder = true DefTiDBEnableNAAJ = false DefTiDBAllowBatchCop = 1 DefTiDBAllowMPPExecution = true @@ -985,7 +1062,6 @@ const ( DefTiDBShardAllocateStep = math.MaxInt64 DefTiDBEnableTelemetry = true DefTiDBEnableParallelApply = false - DefTiDBEnableAmendPessimisticTxn = false DefTiDBPartitionPruneMode = "dynamic" DefTiDBEnableRateLimitAction = false DefTiDBEnableAsyncCommit = false @@ -1049,7 +1125,7 @@ const ( DefTiDBPrepPlanCacheSize = 100 DefTiDBEnablePrepPlanCacheMemoryMonitor = true DefTiDBPrepPlanCacheMemoryGuardRatio = 0.1 - DefTiDBEnableConcurrentDDL = concurrencyddl.TiDBEnableConcurrentDDL + DefTiDBDDLEnableDistributeReorg = distributereorg.TiDBEnableDistributeReorg DefTiDBSimplifiedMetrics = false DefTiDBEnablePaging = true DefTiFlashFineGrainedShuffleStreamCount = 0 @@ -1058,40 +1134,64 @@ const ( DefAdaptiveClosestReadThreshold = 4096 DefTiDBEnableAnalyzeSnapshot = false DefTiDBGenerateBinaryPlan = true - DefEnableTiDBGCAwareMemoryTrack = true + DefEnableTiDBGCAwareMemoryTrack = false DefTiDBDefaultStrMatchSelectivity = 0.8 DefTiDBEnableTmpStorageOnOOM = true DefTiDBEnableMDL = true DefTiFlashFastScan = false DefMemoryUsageAlarmRatio = 0.7 DefMemoryUsageAlarmKeepRecordNum = 5 - DefTiDBEnableFastReorg = false + DefTiDBEnableFastReorg = true DefTiDBDDLDiskQuota = 100 * 1024 * 1024 * 1024 // 100GB DefExecutorConcurrency = 5 - DefTiDBEnableGeneralPlanCache = false - DefTiDBGeneralPlanCacheSize = 100 + DefTiDBEnableNonPreparedPlanCache = false + DefTiDBNonPreparedPlanCacheSize = 100 DefTiDBEnableTiFlashReadForWriteStmt = false // MaxDDLReorgBatchSize is exported for testing. MaxDDLReorgBatchSize int32 = 10240 MinDDLReorgBatchSize int32 = 32 MinExpensiveQueryTimeThreshold uint64 = 10 // 10s + DefTiDBAutoBuildStatsConcurrency = 1 + DefTiDBSysProcScanConcurrency = 1 DefTiDBRcWriteCheckTs = false - DefTiDBForeignKeyChecks = false + DefTiDBForeignKeyChecks = true DefTiDBAnalyzePartitionConcurrency = 1 DefTiDBOptRangeMaxSize = 64 * int64(size.MB) // 64 MB - DefTiDBCostModelVer = 1 + DefTiDBCostModelVer = 2 DefTiDBServerMemoryLimitSessMinSize = 128 << 20 DefTiDBMergePartitionStatsConcurrency = 1 DefTiDBServerMemoryLimitGCTrigger = 0.7 DefTiDBEnableGOGCTuner = true // DefTiDBGOGCTunerThreshold is to limit TiDBGOGCTunerThreshold. - DefTiDBGOGCTunerThreshold float64 = 0.6 - DefTiDBOptPrefixIndexSingleScan = true - DefTiDBExternalTS = 0 - DefTiDBEnableExternalTSRead = false - DefTiDBEnableReusechunk = true - DefTiDBUseAlloc = false - DefTiDBEnablePlanReplayerCapture = false + DefTiDBGOGCTunerThreshold float64 = 0.6 + DefTiDBOptPrefixIndexSingleScan = true + DefTiDBExternalTS = 0 + DefTiDBEnableExternalTSRead = false + DefTiDBEnableReusechunk = true + DefTiDBUseAlloc = false + DefTiDBEnablePlanReplayerCapture = false + DefTiDBIndexMergeIntersectionConcurrency = ConcurrencyUnset + DefTiDBTTLJobEnable = true + DefTiDBTTLScanBatchSize = 500 + DefTiDBTTLScanBatchMaxSize = 10240 + DefTiDBTTLScanBatchMinSize = 1 + DefTiDBTTLDeleteBatchSize = 100 + DefTiDBTTLDeleteBatchMaxSize = 10240 + DefTiDBTTLDeleteBatchMinSize = 1 + DefTiDBTTLDeleteRateLimit = 0 + DefPasswordReuseHistory = 0 + DefPasswordReuseTime = 0 + DefTiDBStoreBatchSize = 4 + DefTiDBHistoricalStatsDuration = 7 * 24 * time.Hour + DefTiDBEnableHistoricalStatsForCapture = false + DefTiDBTTLJobScheduleWindowStartTime = "00:00 +0000" + DefTiDBTTLJobScheduleWindowEndTime = "23:59 +0000" + DefTiDBTTLScanWorkerCount = 4 + DefTiDBTTLDeleteWorkerCount = 4 + DefaultExchangeCompressionMode = kv.ExchangeCompressionModeUnspecified + DefTiDBEnableResourceControl = false + DefTiDBPessimisticTransactionAggressiveLocking = false + DefTiDBEnablePlanCacheForParamLimit = true ) // Process global variables. @@ -1133,7 +1233,7 @@ var ( MaxAutoAnalyzeTime = atomic.NewInt64(DefTiDBMaxAutoAnalyzeTime) // variables for plan cache PreparedPlanCacheMemoryGuardRatio = atomic.NewFloat64(DefTiDBPrepPlanCacheMemoryGuardRatio) - EnableConcurrentDDL = atomic.NewBool(DefTiDBEnableConcurrentDDL) + DDLEnableDistributeReorg = atomic.NewBool(DefTiDBDDLEnableDistributeReorg) DDLForce2Queue = atomic.NewBool(false) EnableNoopVariables = atomic.NewBool(DefTiDBEnableNoopVariables) EnableMDL = atomic.NewBool(false) @@ -1143,14 +1243,32 @@ var ( // DDLDiskQuota is the temporary variable for set disk quota for lightning DDLDiskQuota = atomic.NewUint64(DefTiDBDDLDiskQuota) // EnableForeignKey indicates whether to enable foreign key feature. - EnableForeignKey = atomic.NewBool(false) + EnableForeignKey = atomic.NewBool(true) EnableRCReadCheckTS = atomic.NewBool(false) // DefTiDBServerMemoryLimit indicates the default value of TiDBServerMemoryLimit(TotalMem * 80%). // It should be a const and shouldn't be modified after tidb is started. - DefTiDBServerMemoryLimit = serverMemoryLimitDefaultValue() - GOGCTunerThreshold = atomic.NewFloat64(DefTiDBGOGCTunerThreshold) - EnablePlanReplayerCapture = atomic.NewBool(DefTiDBEnablePlanReplayerCapture) + DefTiDBServerMemoryLimit = serverMemoryLimitDefaultValue() + GOGCTunerThreshold = atomic.NewFloat64(DefTiDBGOGCTunerThreshold) + PasswordValidationLength = atomic.NewInt32(8) + PasswordValidationMixedCaseCount = atomic.NewInt32(1) + PasswordValidtaionNumberCount = atomic.NewInt32(1) + PasswordValidationSpecialCharCount = atomic.NewInt32(1) + EnableTTLJob = atomic.NewBool(DefTiDBTTLJobEnable) + TTLScanBatchSize = atomic.NewInt64(DefTiDBTTLScanBatchSize) + TTLDeleteBatchSize = atomic.NewInt64(DefTiDBTTLDeleteBatchSize) + TTLDeleteRateLimit = atomic.NewInt64(DefTiDBTTLDeleteRateLimit) + TTLJobScheduleWindowStartTime = atomic.NewTime(mustParseTime(FullDayTimeFormat, DefTiDBTTLJobScheduleWindowStartTime)) + TTLJobScheduleWindowEndTime = atomic.NewTime(mustParseTime(FullDayTimeFormat, DefTiDBTTLJobScheduleWindowEndTime)) + TTLScanWorkerCount = atomic.NewInt32(DefTiDBTTLScanWorkerCount) + TTLDeleteWorkerCount = atomic.NewInt32(DefTiDBTTLDeleteWorkerCount) + PasswordHistory = atomic.NewInt64(DefPasswordReuseHistory) + PasswordReuseInterval = atomic.NewInt64(DefPasswordReuseTime) + IsSandBoxModeEnabled = atomic.NewBool(false) + MaxPreparedStmtCountValue = atomic.NewInt64(DefMaxPreparedStmtCount) + HistoricalStatsDuration = atomic.NewDuration(DefTiDBHistoricalStatsDuration) + EnableHistoricalStatsForCapture = atomic.NewBool(DefTiDBEnableHistoricalStatsForCapture) + EnableResourceControl = atomic.NewBool(DefTiDBEnableResourceControl) ) var ( @@ -1162,8 +1280,6 @@ var ( SetStatsCacheCapacity atomic.Value // SetPDClientDynamicOption is the func registered by domain SetPDClientDynamicOption atomic.Pointer[func(string, string)] - // SwitchConcurrentDDL is the func registered by DDL to switch concurrent DDL. - SwitchConcurrentDDL func(bool) error = nil // SwitchMDL is the func registered by DDL to switch MDL. SwitchMDL func(bool2 bool) error = nil // EnableDDL is the func registered by ddl to enable running ddl in this instance. @@ -1174,6 +1290,16 @@ var ( SetExternalTimestamp func(ctx context.Context, ts uint64) error // GetExternalTimestamp is the func registered by staleread to get externaltimestamp from pd GetExternalTimestamp func(ctx context.Context) (uint64, error) + // SetGlobalResourceControl is the func registered by domain to set cluster resource control. + SetGlobalResourceControl atomic.Pointer[func(bool)] +) + +// Hooks functions for Cluster Resource Control. +var ( + // EnableGlobalResourceControlFunc is the function registered by tikv_driver to set cluster resource control. + EnableGlobalResourceControlFunc func() = func() {} + // DisableGlobalResourceControlFunc is the function registered by tikv_driver to unset cluster resource control. + DisableGlobalResourceControlFunc func() = func() {} ) func serverMemoryLimitDefaultValue() string { @@ -1183,3 +1309,21 @@ func serverMemoryLimitDefaultValue() string { } return "0" } + +func mustParseDuration(str string) time.Duration { + duration, err := time.ParseDuration(str) + if err != nil { + panic(fmt.Sprintf("%s is not a duration", str)) + } + + return duration +} + +func mustParseTime(layout string, str string) time.Time { + time, err := time.ParseInLocation(layout, str, time.UTC) + if err != nil { + panic(fmt.Sprintf("%s is not in %s duration format", str, layout)) + } + + return time +} diff --git a/sessionctx/variable/variable.go b/sessionctx/variable/variable.go index 4b7faa09481c8..48eb86a45c2a2 100644 --- a/sessionctx/variable/variable.go +++ b/sessionctx/variable/variable.go @@ -85,6 +85,7 @@ const ( // Global config name list. const ( GlobalConfigEnableTopSQL = "enable_resource_metering" + GlobalConfigSourceID = "source_id" ) func (s ScopeFlag) String() string { @@ -255,7 +256,7 @@ func (sv *SysVar) SetGlobalFromHook(ctx context.Context, s *SessionVars, val str if !skipAliases && sv.Aliases != nil { for _, aliasName := range sv.Aliases { - if err := s.GlobalVarsAccessor.SetGlobalSysVarOnly(ctx, aliasName, val); err != nil { + if err := s.GlobalVarsAccessor.SetGlobalSysVarOnly(ctx, aliasName, val, true); err != nil { return err } } @@ -382,6 +383,10 @@ func (sv *SysVar) checkTimeSystemVar(value string, vars *SessionVars) (string, e if err != nil { return "", err } + // Add a modern date to it, as the timezone shift can differ across the history + // For example, the Asia/Shanghai refers to +08:05 before 1900 + now := time.Now() + t = time.Date(now.Year(), now.Month(), now.Day(), t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), t.Location()) return t.Format(FullDayTimeFormat), nil } @@ -626,7 +631,7 @@ type GlobalVarAccessor interface { // SetGlobalSysVar sets the global system variable name to value. SetGlobalSysVar(ctx context.Context, name string, value string) error // SetGlobalSysVarOnly sets the global system variable without calling the validation function or updating aliases. - SetGlobalSysVarOnly(ctx context.Context, name string, value string) error + SetGlobalSysVarOnly(ctx context.Context, name string, value string, updateLocal bool) error // GetTiDBTableValue gets a value from mysql.tidb for the key 'name' GetTiDBTableValue(name string) (string, error) // SetTiDBTableValue sets a value+comment for the mysql.tidb key 'name' diff --git a/sessionctx/variable/variable_test.go b/sessionctx/variable/variable_test.go index 023cc75e7cba7..b346f5f609e46 100644 --- a/sessionctx/variable/variable_test.go +++ b/sessionctx/variable/variable_test.go @@ -669,3 +669,21 @@ func TestSkipSysvarCache(t *testing.T) { require.True(t, GetSysVar(TiDBGCScanLockMode).SkipSysvarCache()) require.False(t, GetSysVar(TiDBEnableAsyncCommit).SkipSysvarCache()) } + +func TestTimeValidationWithTimezone(t *testing.T) { + sv := SysVar{Scope: ScopeSession, Name: "mynewsysvar", Value: "23:59 +0000", Type: TypeTime} + vars := NewSessionVars(nil) + + // In timezone UTC + vars.TimeZone = time.UTC + val, err := sv.Validate(vars, "23:59", ScopeSession) + require.NoError(t, err) + require.Equal(t, "23:59 +0000", val) + + // In timezone Asia/Shanghai + vars.TimeZone, err = time.LoadLocation("Asia/Shanghai") + require.NoError(t, err) + val, err = sv.Validate(vars, "23:59", ScopeSession) + require.NoError(t, err) + require.Equal(t, "23:59 +0800", val) +} diff --git a/sessionctx/variable/varsutil.go b/sessionctx/variable/varsutil.go index b64500b91d208..d7eda1a16c691 100644 --- a/sessionctx/variable/varsutil.go +++ b/sessionctx/variable/varsutil.go @@ -15,6 +15,7 @@ package variable import ( + "context" "fmt" "io" "strconv" @@ -466,7 +467,7 @@ func parseTSFromNumberOrTime(s *SessionVars, sVal string) (uint64, error) { return tso, nil } - t, err := types.ParseTime(s.StmtCtx, sVal, mysql.TypeTimestamp, types.MaxFsp) + t, err := types.ParseTime(s.StmtCtx, sVal, mysql.TypeTimestamp, types.MaxFsp, nil) if err != nil { return 0, err } @@ -481,7 +482,7 @@ func setTxnReadTS(s *SessionVars, sVal string) error { return nil } - t, err := types.ParseTime(s.StmtCtx, sVal, mysql.TypeTimestamp, types.MaxFsp) + t, err := types.ParseTime(s.StmtCtx, sVal, mysql.TypeTimestamp, types.MaxFsp, nil) if err != nil { return err } @@ -531,6 +532,15 @@ func collectAllowFuncName4ExpressionIndex() string { return strings.Join(str, ", ") } +func updatePasswordValidationLength(s *SessionVars, length int32) error { + err := s.GlobalVarsAccessor.SetGlobalSysVarOnly(context.Background(), ValidatePasswordLength, strconv.FormatInt(int64(length), 10), false) + if err != nil { + return err + } + PasswordValidationLength.Store(length) + return nil +} + // GAFunction4ExpressionIndex stores functions GA for expression index. var GAFunction4ExpressionIndex = map[string]struct{}{ ast.Lower: {}, diff --git a/sessionctx/variable/varsutil_test.go b/sessionctx/variable/varsutil_test.go index 69c9caf294e5e..1f4cfe603ac8c 100644 --- a/sessionctx/variable/varsutil_test.go +++ b/sessionctx/variable/varsutil_test.go @@ -74,6 +74,7 @@ func TestNewSessionVars(t *testing.T) { require.Equal(t, DefExecutorConcurrency, vars.HashAggPartialConcurrency()) require.Equal(t, DefExecutorConcurrency, vars.HashAggFinalConcurrency()) require.Equal(t, DefExecutorConcurrency, vars.WindowConcurrency()) + require.Equal(t, DefExecutorConcurrency, vars.IndexMergeIntersectionConcurrency()) require.Equal(t, DefTiDBMergeJoinConcurrency, vars.MergeJoinConcurrency()) require.Equal(t, DefTiDBStreamAggConcurrency, vars.StreamAggConcurrency()) require.Equal(t, DefDistSQLScanConcurrency, vars.DistSQLScanConcurrency()) @@ -535,9 +536,6 @@ func TestValidate(t *testing.T) { {TiDBShardAllocateStep, "ad", true}, {TiDBShardAllocateStep, "-123", false}, {TiDBShardAllocateStep, "128", false}, - {TiDBEnableAmendPessimisticTxn, "0", false}, - {TiDBEnableAmendPessimisticTxn, "1", false}, - {TiDBEnableAmendPessimisticTxn, "256", true}, {TiDBAllowFallbackToTiKV, "", false}, {TiDBAllowFallbackToTiKV, "tiflash", false}, {TiDBAllowFallbackToTiKV, " tiflash ", false}, diff --git a/sessiontxn/BUILD.bazel b/sessiontxn/BUILD.bazel index e484defb5b0c1..51a54724b33ec 100644 --- a/sessiontxn/BUILD.bazel +++ b/sessiontxn/BUILD.bazel @@ -27,6 +27,7 @@ go_test( "txn_rc_tso_optimize_test.go", ], flaky = True, + shard_count = 50, deps = [ ":sessiontxn", "//domain", diff --git a/sessiontxn/interface.go b/sessiontxn/interface.go index 85d9217a90c0f..4c6b50e2e0ae7 100644 --- a/sessiontxn/interface.go +++ b/sessiontxn/interface.go @@ -136,10 +136,17 @@ type TxnContextProvider interface { OnInitialize(ctx context.Context, enterNewTxnType EnterNewTxnType) error // OnStmtStart is the hook that should be called when a new statement started OnStmtStart(ctx context.Context, node ast.StmtNode) error + // OnHandlePessimisticStmtStart is the hook that should be called when starts handling a pessimistic DML or + // a pessimistic select-for-update statements. + OnHandlePessimisticStmtStart(ctx context.Context) error // OnStmtErrorForNextAction is the hook that should be called when a new statement get an error OnStmtErrorForNextAction(point StmtErrorHandlePoint, err error) (StmtErrorAction, error) // OnStmtRetry is the hook that should be called when a statement is retried internally. OnStmtRetry(ctx context.Context) error + // OnStmtCommit is the hook that should be called when a statement is executed successfully. + OnStmtCommit(ctx context.Context) error + // OnStmtRollback is the hook that should be called when a statement fails to execute. + OnStmtRollback(ctx context.Context, isForPessimisticRetry bool) error // OnLocalTemporaryTableCreated is the hook that should be called when a local temporary table created. OnLocalTemporaryTableCreated() // ActivateTxn activates the transaction. @@ -160,8 +167,10 @@ type TxnManager interface { // GetReadReplicaScope returns the read replica scope GetReadReplicaScope() string // GetStmtReadTS returns the read timestamp used by select statement (not for select ... for update) + // Calling this method will activate the txn implicitly if current read is not stale/historical read GetStmtReadTS() (uint64, error) // GetStmtForUpdateTS returns the read timestamp used by update/insert/delete or select ... for update + // Calling this method will activate the txn implicitly if current read is not stale/historical read GetStmtForUpdateTS() (uint64, error) // GetContextProvider returns the current TxnContextProvider GetContextProvider() TxnContextProvider @@ -176,6 +185,9 @@ type TxnManager interface { OnTxnEnd() // OnStmtStart is the hook that should be called when a new statement started OnStmtStart(ctx context.Context, node ast.StmtNode) error + // OnHandlePessimisticStmtStart is the hook that should be called when starts handling a pessimistic DML or + // a pessimistic select-for-update statements. + OnHandlePessimisticStmtStart(ctx context.Context) error // OnStmtErrorForNextAction is the hook that should be called when a new statement get an error // This method is not required to be called for every error in the statement, // it is only required to be called for some errors handled in some specified points given by the parameter `point`. @@ -183,6 +195,10 @@ type TxnManager interface { OnStmtErrorForNextAction(point StmtErrorHandlePoint, err error) (StmtErrorAction, error) // OnStmtRetry is the hook that should be called when a statement retry OnStmtRetry(ctx context.Context) error + // OnStmtCommit is the hook that should be called when a statement is executed successfully. + OnStmtCommit(ctx context.Context) error + // OnStmtRollback is the hook that should be called when a statement fails to execute. + OnStmtRollback(ctx context.Context, isForPessimisticRetry bool) error // OnLocalTemporaryTableCreated is the hook that should be called when a local temporary table created. OnLocalTemporaryTableCreated() // ActivateTxn activates the transaction. diff --git a/sessiontxn/isolation/BUILD.bazel b/sessiontxn/isolation/BUILD.bazel index 2f2cb5dce4e31..21ca84f60ad0f 100644 --- a/sessiontxn/isolation/BUILD.bazel +++ b/sessiontxn/isolation/BUILD.bazel @@ -27,7 +27,7 @@ go_library( "//sessiontxn/staleread", "//table/temptable", "//util/logutil", - "@com_github_opentracing_opentracing_go//:opentracing-go", + "//util/tracing", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_tikv_client_go_v2//error", @@ -38,7 +38,7 @@ go_library( go_test( name = "isolation_test", - timeout = "short", + timeout = "moderate", srcs = [ "main_test.go", "optimistic_test.go", diff --git a/sessiontxn/isolation/base.go b/sessiontxn/isolation/base.go index eeac646675bdf..85fcfde5f3828 100644 --- a/sessiontxn/isolation/base.go +++ b/sessiontxn/isolation/base.go @@ -18,7 +18,6 @@ import ( "context" "time" - "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" @@ -31,6 +30,7 @@ import ( "github.com/pingcap/tidb/sessiontxn/internal" "github.com/pingcap/tidb/sessiontxn/staleread" "github.com/pingcap/tidb/table/temptable" + "github.com/pingcap/tidb/util/tracing" "github.com/tikv/client-go/v2/oracle" ) @@ -207,12 +207,28 @@ func (p *baseTxnContextProvider) OnStmtStart(ctx context.Context, _ ast.StmtNode return nil } +// OnHandlePessimisticStmtStart is the hook that should be called when starts handling a pessimistic DML or +// a pessimistic select-for-update statements. +func (p *baseTxnContextProvider) OnHandlePessimisticStmtStart(_ context.Context) error { + return nil +} + // OnStmtRetry is the hook that should be called when a statement is retried internally. func (p *baseTxnContextProvider) OnStmtRetry(ctx context.Context) error { p.ctx = ctx return nil } +// OnStmtCommit is the hook that should be called when a statement is executed successfully. +func (p *baseTxnContextProvider) OnStmtCommit(_ context.Context) error { + return nil +} + +// OnStmtRollback is the hook that should be called when a statement fails to execute. +func (p *baseTxnContextProvider) OnStmtRollback(_ context.Context, _ bool) error { + return nil +} + // OnLocalTemporaryTableCreated is the hook that should be called when a local temporary table created. func (p *baseTxnContextProvider) OnLocalTemporaryTableCreated() { p.infoSchema = temptable.AttachLocalTemporaryTableInfoSchema(p.sctx, p.infoSchema) @@ -267,6 +283,10 @@ func (p *baseTxnContextProvider) ActivateTxn() (kv.Transaction, error) { sessVars := p.sctx.GetSessionVars() sessVars.TxnCtx.StartTS = txn.StartTS() + if sessVars.MemDBFootprint != nil { + sessVars.MemDBFootprint.Detach() + } + sessVars.MemDBFootprint = nil if p.enterNewTxnType == sessiontxn.EnterNewTxnBeforeStmt && !sessVars.IsAutocommit() && sessVars.SnapshotTS == 0 { sessVars.SetInTxn(true) @@ -454,11 +474,8 @@ func canReuseTxnWhenExplicitBegin(sctx sessionctx.Context) bool { // newOracleFuture creates new future according to the scope and the session context func newOracleFuture(ctx context.Context, sctx sessionctx.Context, scope string) oracle.Future { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("isolation.newOracleFuture", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } + r, ctx := tracing.StartRegionEx(ctx, "isolation.newOracleFuture") + defer r.End() failpoint.Inject("requestTsoFromPD", func() { sessiontxn.TsoRequestCountInc(sctx) @@ -480,3 +497,65 @@ type funcFuture func() (uint64, error) func (f funcFuture) Wait() (uint64, error) { return f() } + +// basePessimisticTxnContextProvider extends baseTxnContextProvider with some functionalities that are commonly used in +// pessimistic transactions. +type basePessimisticTxnContextProvider struct { + baseTxnContextProvider +} + +// OnHandlePessimisticStmtStart is the hook that should be called when starts handling a pessimistic DML or +// a pessimistic select-for-update statements. +func (p *basePessimisticTxnContextProvider) OnHandlePessimisticStmtStart(ctx context.Context) error { + if err := p.baseTxnContextProvider.OnHandlePessimisticStmtStart(ctx); err != nil { + return err + } + if p.sctx.GetSessionVars().PessimisticTransactionAggressiveLocking && + p.txn != nil && + p.sctx.GetSessionVars().ConnectionID != 0 && + !p.sctx.GetSessionVars().InRestrictedSQL { + if err := p.txn.StartAggressiveLocking(); err != nil { + return err + } + } + return nil +} + +// OnStmtRetry is the hook that should be called when a statement is retried internally. +func (p *basePessimisticTxnContextProvider) OnStmtRetry(ctx context.Context) error { + if err := p.baseTxnContextProvider.OnStmtRetry(ctx); err != nil { + return err + } + if p.txn != nil && p.txn.IsInAggressiveLockingMode() { + if err := p.txn.RetryAggressiveLocking(ctx); err != nil { + return err + } + } + return nil +} + +// OnStmtCommit is the hook that should be called when a statement is executed successfully. +func (p *basePessimisticTxnContextProvider) OnStmtCommit(ctx context.Context) error { + if err := p.baseTxnContextProvider.OnStmtCommit(ctx); err != nil { + return err + } + if p.txn != nil && p.txn.IsInAggressiveLockingMode() { + if err := p.txn.DoneAggressiveLocking(ctx); err != nil { + return err + } + } + return nil +} + +// OnStmtRollback is the hook that should be called when a statement fails to execute. +func (p *basePessimisticTxnContextProvider) OnStmtRollback(ctx context.Context, isForPessimisticRetry bool) error { + if err := p.baseTxnContextProvider.OnStmtRollback(ctx, isForPessimisticRetry); err != nil { + return err + } + if !isForPessimisticRetry && p.txn != nil && p.txn.IsInAggressiveLockingMode() { + if err := p.txn.CancelAggressiveLocking(ctx); err != nil { + return err + } + } + return nil +} diff --git a/sessiontxn/isolation/optimistic.go b/sessiontxn/isolation/optimistic.go index 3c60eba09331b..9a1f8d58aabbd 100644 --- a/sessiontxn/isolation/optimistic.go +++ b/sessiontxn/isolation/optimistic.go @@ -114,6 +114,12 @@ func (p *OptimisticTxnContextProvider) AdviseOptimizeWithPlan(plan interface{}) return nil } + if p.txn != nil { + // `p.txn != nil` means the txn has already been activated, we should not optimize the startTS because the startTS + // has already been used. + return nil + } + realPlan, ok := plan.(plannercore.Plan) if !ok { return nil @@ -141,7 +147,7 @@ func (p *OptimisticTxnContextProvider) AdviseOptimizeWithPlan(plan interface{}) zap.Uint64("conn", sessVars.ConnectionID), zap.String("text", sessVars.StmtCtx.OriginalSQL), ) - return nil + return err } p.optimizeWithMaxTS = true diff --git a/sessiontxn/isolation/readcommitted.go b/sessiontxn/isolation/readcommitted.go index 8752eb5b35e11..ef44834f8bcfb 100644 --- a/sessiontxn/isolation/readcommitted.go +++ b/sessiontxn/isolation/readcommitted.go @@ -16,6 +16,7 @@ package isolation import ( "context" + "time" "github.com/pingcap/errors" "github.com/pingcap/failpoint" @@ -53,7 +54,7 @@ func (s *stmtState) prepareStmt(useStartTS bool) error { // PessimisticRCTxnContextProvider provides txn context for isolation level read-committed type PessimisticRCTxnContextProvider struct { - baseTxnContextProvider + basePessimisticTxnContextProvider stmtState latestOracleTS uint64 // latestOracleTSValid shows whether we have already fetched a ts from pd and whether the ts we fetched is still valid. @@ -65,15 +66,17 @@ type PessimisticRCTxnContextProvider struct { // NewPessimisticRCTxnContextProvider returns a new PessimisticRCTxnContextProvider func NewPessimisticRCTxnContextProvider(sctx sessionctx.Context, causalConsistencyOnly bool) *PessimisticRCTxnContextProvider { provider := &PessimisticRCTxnContextProvider{ - baseTxnContextProvider: baseTxnContextProvider{ - sctx: sctx, - causalConsistencyOnly: causalConsistencyOnly, - onInitializeTxnCtx: func(txnCtx *variable.TransactionContext) { - txnCtx.IsPessimistic = true - txnCtx.Isolation = ast.ReadCommitted - }, - onTxnActiveFunc: func(txn kv.Transaction, _ sessiontxn.EnterNewTxnType) { - txn.SetOption(kv.Pessimistic, true) + basePessimisticTxnContextProvider: basePessimisticTxnContextProvider{ + baseTxnContextProvider: baseTxnContextProvider{ + sctx: sctx, + causalConsistencyOnly: causalConsistencyOnly, + onInitializeTxnCtx: func(txnCtx *variable.TransactionContext) { + txnCtx.IsPessimistic = true + txnCtx.Isolation = ast.ReadCommitted + }, + onTxnActiveFunc: func(txn kv.Transaction, _ sessiontxn.EnterNewTxnType) { + txn.SetOption(kv.Pessimistic, true) + }, }, }, } @@ -90,7 +93,7 @@ func NewPessimisticRCTxnContextProvider(sctx sessionctx.Context, causalConsisten // OnStmtStart is the hook that should be called when a new statement started func (p *PessimisticRCTxnContextProvider) OnStmtStart(ctx context.Context, node ast.StmtNode) error { - if err := p.baseTxnContextProvider.OnStmtStart(ctx, node); err != nil { + if err := p.basePessimisticTxnContextProvider.OnStmtStart(ctx, node); err != nil { return err } @@ -122,13 +125,13 @@ func (p *PessimisticRCTxnContextProvider) OnStmtErrorForNextAction(point session case sessiontxn.StmtErrAfterPessimisticLock: return p.handleAfterPessimisticLockError(err) default: - return p.baseTxnContextProvider.OnStmtErrorForNextAction(point, err) + return p.basePessimisticTxnContextProvider.OnStmtErrorForNextAction(point, err) } } // OnStmtRetry is the hook that should be called when a statement is retried internally. func (p *PessimisticRCTxnContextProvider) OnStmtRetry(ctx context.Context) error { - if err := p.baseTxnContextProvider.OnStmtRetry(ctx); err != nil { + if err := p.basePessimisticTxnContextProvider.OnStmtRetry(ctx); err != nil { return err } failpoint.Inject("CallOnStmtRetry", func() { @@ -186,9 +189,11 @@ func (p *PessimisticRCTxnContextProvider) getStmtTS() (ts uint64, err error) { } p.prepareStmtTS() + start := time.Now() if ts, err = p.stmtTSFuture.Wait(); err != nil { return 0, err } + p.sctx.GetSessionVars().DurationWaitTS += time.Since(start) txn.SetOption(kv.SnapshotTS, ts) p.stmtTS = ts @@ -317,7 +322,7 @@ func (p *PessimisticRCTxnContextProvider) AdviseOptimizeWithPlan(val interface{} // GetSnapshotWithStmtForUpdateTS gets snapshot with for update ts func (p *PessimisticRCTxnContextProvider) GetSnapshotWithStmtForUpdateTS() (kv.Snapshot, error) { - snapshot, err := p.baseTxnContextProvider.GetSnapshotWithStmtForUpdateTS() + snapshot, err := p.basePessimisticTxnContextProvider.GetSnapshotWithStmtForUpdateTS() if err != nil { return nil, err } @@ -329,7 +334,7 @@ func (p *PessimisticRCTxnContextProvider) GetSnapshotWithStmtForUpdateTS() (kv.S // GetSnapshotWithStmtReadTS gets snapshot with read ts func (p *PessimisticRCTxnContextProvider) GetSnapshotWithStmtReadTS() (kv.Snapshot, error) { - snapshot, err := p.baseTxnContextProvider.GetSnapshotWithStmtForUpdateTS() + snapshot, err := p.basePessimisticTxnContextProvider.GetSnapshotWithStmtForUpdateTS() if err != nil { return nil, err } diff --git a/sessiontxn/isolation/repeatable_read.go b/sessiontxn/isolation/repeatable_read.go index 18fa2ebd8608c..8288ff92bde44 100644 --- a/sessiontxn/isolation/repeatable_read.go +++ b/sessiontxn/isolation/repeatable_read.go @@ -16,6 +16,7 @@ package isolation import ( "context" + "time" "github.com/pingcap/errors" "github.com/pingcap/failpoint" @@ -33,7 +34,7 @@ import ( // PessimisticRRTxnContextProvider provides txn context for isolation level repeatable-read type PessimisticRRTxnContextProvider struct { - baseTxnContextProvider + basePessimisticTxnContextProvider // Used for ForUpdateRead statement forUpdateTS uint64 @@ -46,15 +47,17 @@ type PessimisticRRTxnContextProvider struct { // NewPessimisticRRTxnContextProvider returns a new PessimisticRRTxnContextProvider func NewPessimisticRRTxnContextProvider(sctx sessionctx.Context, causalConsistencyOnly bool) *PessimisticRRTxnContextProvider { provider := &PessimisticRRTxnContextProvider{ - baseTxnContextProvider: baseTxnContextProvider{ - sctx: sctx, - causalConsistencyOnly: causalConsistencyOnly, - onInitializeTxnCtx: func(txnCtx *variable.TransactionContext) { - txnCtx.IsPessimistic = true - txnCtx.Isolation = ast.RepeatableRead - }, - onTxnActiveFunc: func(txn kv.Transaction, _ sessiontxn.EnterNewTxnType) { - txn.SetOption(kv.Pessimistic, true) + basePessimisticTxnContextProvider: basePessimisticTxnContextProvider{ + baseTxnContextProvider: baseTxnContextProvider{ + sctx: sctx, + causalConsistencyOnly: causalConsistencyOnly, + onInitializeTxnCtx: func(txnCtx *variable.TransactionContext) { + txnCtx.IsPessimistic = true + txnCtx.Isolation = ast.RepeatableRead + }, + onTxnActiveFunc: func(txn kv.Transaction, _ sessiontxn.EnterNewTxnType) { + txn.SetOption(kv.Pessimistic, true) + }, }, }, } @@ -83,9 +86,11 @@ func (p *PessimisticRRTxnContextProvider) getForUpdateTs() (ts uint64, err error txnCtx := p.sctx.GetSessionVars().TxnCtx futureTS := newOracleFuture(p.ctx, p.sctx, txnCtx.TxnScope) + start := time.Now() if ts, err = futureTS.Wait(); err != nil { return 0, err } + p.sctx.GetSessionVars().DurationWaitTS += time.Since(start) txnCtx.SetForUpdateTS(ts) txn.SetOption(kv.SnapshotTS, ts) @@ -128,7 +133,7 @@ func (p *PessimisticRRTxnContextProvider) updateForUpdateTS() (err error) { // OnStmtStart is the hook that should be called when a new statement started func (p *PessimisticRRTxnContextProvider) OnStmtStart(ctx context.Context, node ast.StmtNode) error { - if err := p.baseTxnContextProvider.OnStmtStart(ctx, node); err != nil { + if err := p.basePessimisticTxnContextProvider.OnStmtStart(ctx, node); err != nil { return err } @@ -140,7 +145,7 @@ func (p *PessimisticRRTxnContextProvider) OnStmtStart(ctx context.Context, node // OnStmtRetry is the hook that should be called when a statement is retried internally. func (p *PessimisticRRTxnContextProvider) OnStmtRetry(ctx context.Context) (err error) { - if err = p.baseTxnContextProvider.OnStmtRetry(ctx); err != nil { + if err = p.basePessimisticTxnContextProvider.OnStmtRetry(ctx); err != nil { return err } diff --git a/sessiontxn/isolation/repeatable_read_test.go b/sessiontxn/isolation/repeatable_read_test.go index da798f05c2152..a2c0641ff456a 100644 --- a/sessiontxn/isolation/repeatable_read_test.go +++ b/sessiontxn/isolation/repeatable_read_test.go @@ -678,3 +678,40 @@ func initializeRepeatableReadProvider(t *testing.T, tk *testkit.TestKit, active require.NoError(t, tk.Session().PrepareTxnCtx(context.TODO())) return assert.CheckAndGetProvider(t) } + +func TestRRWaitTSTimeInSlowLog(t *testing.T) { + store := testkit.CreateMockStore(t) + + tk := testkit.NewTestKit(t, store) + se := tk.Session() + + tk.MustExec("use test") + tk.MustExec("create table t (id int primary key, v int)") + tk.MustExec("insert into t values (1, 1)") + + tk.MustExec("begin pessimistic") + waitTS1 := se.GetSessionVars().DurationWaitTS + tk.MustExec("update t set v = v + 10 where id = 1") + waitTS2 := se.GetSessionVars().DurationWaitTS + tk.MustExec("delete from t") + waitTS3 := se.GetSessionVars().DurationWaitTS + tk.MustExec("commit") + require.NotEqual(t, waitTS1, waitTS2) + require.NotEqual(t, waitTS1, waitTS3) + require.NotEqual(t, waitTS2, waitTS3) +} + +func TestIssue41194(t *testing.T) { + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/session/enableAggressiveLockingOnBootstrap", "return")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/session/enableAggressiveLockingOnBootstrap")) + }() + + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("create table t (id int primary key, v int)") + tk.MustExec("insert into t values (1, 1), (2, 2), (3, 3)") + tk.MustExec("analyze table t") +} diff --git a/sessiontxn/isolation/serializable.go b/sessiontxn/isolation/serializable.go index cff6ffc20fbbb..903b1479af79c 100644 --- a/sessiontxn/isolation/serializable.go +++ b/sessiontxn/isolation/serializable.go @@ -24,22 +24,24 @@ import ( // PessimisticSerializableTxnContextProvider provides txn context for isolation level oracle-like serializable type PessimisticSerializableTxnContextProvider struct { - baseTxnContextProvider + basePessimisticTxnContextProvider } // NewPessimisticSerializableTxnContextProvider returns a new PessimisticSerializableTxnContextProvider func NewPessimisticSerializableTxnContextProvider(sctx sessionctx.Context, causalConsistencyOnly bool) *PessimisticSerializableTxnContextProvider { provider := &PessimisticSerializableTxnContextProvider{ - baseTxnContextProvider{ - sctx: sctx, - causalConsistencyOnly: causalConsistencyOnly, - onInitializeTxnCtx: func(txnCtx *variable.TransactionContext) { - txnCtx.IsPessimistic = true - txnCtx.Isolation = ast.Serializable - }, - onTxnActiveFunc: func(txn kv.Transaction, _ sessiontxn.EnterNewTxnType) { - txn.SetOption(kv.Pessimistic, true) + basePessimisticTxnContextProvider: basePessimisticTxnContextProvider{ + baseTxnContextProvider{ + sctx: sctx, + causalConsistencyOnly: causalConsistencyOnly, + onInitializeTxnCtx: func(txnCtx *variable.TransactionContext) { + txnCtx.IsPessimistic = true + txnCtx.Isolation = ast.Serializable + }, + onTxnActiveFunc: func(txn kv.Transaction, _ sessiontxn.EnterNewTxnType) { + txn.SetOption(kv.Pessimistic, true) + }, }, }, } diff --git a/sessiontxn/staleread/externalts_test.go b/sessiontxn/staleread/externalts_test.go index 289c24d820d8f..2ee7c6f14f767 100644 --- a/sessiontxn/staleread/externalts_test.go +++ b/sessiontxn/staleread/externalts_test.go @@ -15,8 +15,10 @@ package staleread_test import ( + "context" "testing" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/testkit" "github.com/stretchr/testify/require" @@ -67,12 +69,20 @@ func TestExternalTimestampReadonly(t *testing.T) { tk.MustQuery("select @@tidb_external_ts").Check(testkit.Rows("0")) tk.MustExec("start transaction;set global tidb_external_ts=@@tidb_current_ts;commit;") + // with tidb_enable_external_ts_read enabled, this session will be readonly tk.MustExec("set tidb_enable_external_ts_read=ON") _, err := tk.Exec("insert into t values (0)") require.Error(t, err) tk.MustExec("set tidb_enable_external_ts_read=OFF") tk.MustExec("insert into t values (0)") + + // even when tidb_enable_external_ts_read is enabled, internal SQL will not be affected + tk.MustExec("set tidb_enable_external_ts_read=ON") + tk.Session().GetSessionVars().InRestrictedSQL = true + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnOthers) + tk.MustExecWithContext(ctx, "insert into t values (1)") + tk.Session().GetSessionVars().InRestrictedSQL = false } func TestExternalTimestampReadWithTransaction(t *testing.T) { diff --git a/sessiontxn/staleread/processor_test.go b/sessiontxn/staleread/processor_test.go index 204bb63a3d8de..e0f9d5895e49f 100644 --- a/sessiontxn/staleread/processor_test.go +++ b/sessiontxn/staleread/processor_test.go @@ -152,12 +152,12 @@ func TestStaleReadProcessorWithSelectTable(t *testing.T) { tk.MustExec("set @@tx_read_ts=''") // `@@tidb_read_staleness` - tk.MustExec("set @@tidb_read_staleness=-5") + tk.MustExec("set @@tidb_read_staleness=-100") processor = createProcessor(t, tk.Session()) err = processor.OnSelectTable(tn) require.True(t, processor.IsStaleness()) require.Equal(t, int64(0), processor.GetStalenessInfoSchema().SchemaMetaVersion()) - expectedTS, err := staleread.CalculateTsWithReadStaleness(tk.Session(), -5*time.Second) + expectedTS, err := staleread.CalculateTsWithReadStaleness(tk.Session(), -100*time.Second) require.NoError(t, err) require.Equal(t, expectedTS, processor.GetStalenessReadTS()) evaluator := processor.GetStalenessTSEvaluatorForPrepare() @@ -169,12 +169,12 @@ func TestStaleReadProcessorWithSelectTable(t *testing.T) { tk.MustExec("do sleep(0.01)") evaluatorTS, err = evaluator(tk.Session()) require.NoError(t, err) - expectedTS2, err := staleread.CalculateTsWithReadStaleness(tk.Session(), -5*time.Second) + expectedTS2, err := staleread.CalculateTsWithReadStaleness(tk.Session(), -100*time.Second) require.NoError(t, err) require.Equal(t, expectedTS2, evaluatorTS) // `@@tidb_read_staleness` will be ignored when `as of` or `@@tx_read_ts` - tk.MustExec("set @@tidb_read_staleness=-5") + tk.MustExec("set @@tidb_read_staleness=-100") processor = createProcessor(t, tk.Session()) err = processor.OnSelectTable(p1.tn) require.NoError(t, err) @@ -280,18 +280,18 @@ func TestStaleReadProcessorWithExecutePreparedStmt(t *testing.T) { tk.MustExec("set @@tx_read_ts=''") // `@@tidb_read_staleness` - tk.MustExec("set @@tidb_read_staleness=-5") + tk.MustExec("set @@tidb_read_staleness=-100") processor = createProcessor(t, tk.Session()) err = processor.OnExecutePreparedStmt(nil) require.True(t, processor.IsStaleness()) require.Equal(t, int64(0), processor.GetStalenessInfoSchema().SchemaMetaVersion()) - expectedTS, err := staleread.CalculateTsWithReadStaleness(tk.Session(), -5*time.Second) + expectedTS, err := staleread.CalculateTsWithReadStaleness(tk.Session(), -100*time.Second) require.NoError(t, err) require.Equal(t, expectedTS, processor.GetStalenessReadTS()) tk.MustExec("set @@tidb_read_staleness=''") // `@@tidb_read_staleness` will be ignored when `as of` or `@@tx_read_ts` - tk.MustExec("set @@tidb_read_staleness=-5") + tk.MustExec("set @@tidb_read_staleness=-100") processor = createProcessor(t, tk.Session()) err = processor.OnExecutePreparedStmt(func(sctx sessionctx.Context) (uint64, error) { return p1.ts, nil diff --git a/sessiontxn/staleread/provider.go b/sessiontxn/staleread/provider.go index 9bbc4c5593748..f5d8057882167 100644 --- a/sessiontxn/staleread/provider.go +++ b/sessiontxn/staleread/provider.go @@ -164,6 +164,12 @@ func (p *StalenessTxnContextProvider) OnStmtStart(ctx context.Context, _ ast.Stm return nil } +// OnHandlePessimisticStmtStart is the hook that should be called when starts handling a pessimistic DML or +// a pessimistic select-for-update statements. +func (p *StalenessTxnContextProvider) OnHandlePessimisticStmtStart(_ context.Context) error { + return nil +} + // ActivateTxn activates the transaction. func (p *StalenessTxnContextProvider) ActivateTxn() (kv.Transaction, error) { if p.txn != nil { @@ -196,6 +202,16 @@ func (p *StalenessTxnContextProvider) OnStmtRetry(ctx context.Context) error { return nil } +// OnStmtCommit is the hook that should be called when a statement is executed successfully. +func (p *StalenessTxnContextProvider) OnStmtCommit(_ context.Context) error { + return nil +} + +// OnStmtRollback is the hook that should be called when a statement fails to execute. +func (p *StalenessTxnContextProvider) OnStmtRollback(_ context.Context, _ bool) error { + return nil +} + // AdviseWarmup provides warmup for inner state func (p *StalenessTxnContextProvider) AdviseWarmup() error { return nil diff --git a/sessiontxn/txn_rc_tso_optimize_test.go b/sessiontxn/txn_rc_tso_optimize_test.go index 59bbf0de330bc..3e945778ca107 100644 --- a/sessiontxn/txn_rc_tso_optimize_test.go +++ b/sessiontxn/txn_rc_tso_optimize_test.go @@ -105,7 +105,7 @@ func TestRcTSOCmdCountForPrepareExecuteNormal(t *testing.T) { tk.MustExec("commit") } countTsoRequest, countTsoUseConstant, countWaitTsoOracle := getAllTsoCounter(sctx) - require.Equal(t, uint64(398), countTsoRequest.(uint64)) + require.Equal(t, uint64(496), countTsoRequest.(uint64)) require.Equal(t, uint64(594), countTsoUseConstant.(uint64)) require.Equal(t, uint64(198), countWaitTsoOracle.(uint64)) @@ -137,7 +137,7 @@ func TestRcTSOCmdCountForPrepareExecuteNormal(t *testing.T) { tk.MustExec("commit") } count := sctx.Value(sessiontxn.TsoRequestCount) - require.Equal(t, uint64(594), count) + require.Equal(t, uint64(693), count) } func TestRcTSOCmdCountForPrepareExecuteExtra(t *testing.T) { @@ -234,7 +234,7 @@ func TestRcTSOCmdCountForPrepareExecuteExtra(t *testing.T) { tk.MustExec("commit") } countTsoRequest, countTsoUseConstant, countWaitTsoOracle = getAllTsoCounter(sctx) - require.Equal(t, uint64(16), countTsoRequest.(uint64)) + require.Equal(t, uint64(20), countTsoRequest.(uint64)) require.Equal(t, uint64(5), countTsoUseConstant.(uint64)) require.Equal(t, uint64(5), countWaitTsoOracle.(uint64)) @@ -412,7 +412,7 @@ func TestRcTSOCmdCountForPrepareExecuteExtra(t *testing.T) { require.Nil(t, stmt) tk.MustExec("commit") countTsoRequest, countTsoUseConstant, countWaitTsoOracle = getAllTsoCounter(sctx) - require.Equal(t, uint64(3), countTsoRequest.(uint64)) + require.Equal(t, uint64(4), countTsoRequest.(uint64)) require.Equal(t, uint64(2), countTsoUseConstant.(uint64)) require.Equal(t, 0, countWaitTsoOracle.(int)) tk.MustQuery("SELECT * FROM t1 WHERE id1 = 1").Check(testkit.Rows("1 1 1")) @@ -790,3 +790,32 @@ func TestConflictErrorsUseRcWriteCheckTs(t *testing.T) { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/assertPessimisticLockErr")) } + +func TestRcWaitTSInSlowLog(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("set global transaction_isolation = 'READ-COMMITTED'") + tk.RefreshSession() + sctx := tk.Session() + + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(id1 int, id2 int, id3 int, PRIMARY KEY(id1), UNIQUE KEY udx_id2 (id2))") + tk.MustExec("insert into t1 values (1, 1, 1), (2, 2, 2), (3, 3, 3)") + + res := tk.MustQuery("show variables like 'transaction_isolation'") + require.Equal(t, "READ-COMMITTED", res.Rows()[0][1]) + sctx.SetValue(sessiontxn.TsoRequestCount, 0) + + tk.MustExec("begin pessimistic") + waitTs1 := sctx.GetSessionVars().DurationWaitTS + tk.MustExec("update t1 set id3 = id3 + 10 where id1 = 1") + waitTs2 := sctx.GetSessionVars().DurationWaitTS + tk.MustExec("update t1 set id3 = id3 + 10 where id1 > 3 and id1 < 6") + waitTs3 := sctx.GetSessionVars().DurationWaitTS + tk.MustExec("commit") + require.NotEqual(t, waitTs1, waitTs2) + require.NotEqual(t, waitTs1, waitTs2) + require.NotEqual(t, waitTs2, waitTs3) +} diff --git a/statistics/BUILD.bazel b/statistics/BUILD.bazel index 6a1b3d5a54921..7186245a79bda 100644 --- a/statistics/BUILD.bazel +++ b/statistics/BUILD.bazel @@ -13,6 +13,7 @@ go_library( "fmsketch.go", "histogram.go", "index.go", + "interact_with_storage.go", "merge_worker.go", "row_sampler.go", "sample.go", @@ -81,6 +82,7 @@ go_test( data = glob(["testdata/**"]), embed = [":statistics"], flaky = True, + shard_count = 50, deps = [ "//config", "//domain", @@ -112,6 +114,7 @@ go_test( "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_log//:log", "@com_github_stretchr_testify//require", + "@org_golang_x_exp//slices", "@org_uber_go_goleak//:goleak", "@org_uber_go_zap//:zap", ], diff --git a/statistics/column.go b/statistics/column.go index ccd541f276bcf..5ce06b5917854 100644 --- a/statistics/column.go +++ b/statistics/column.go @@ -121,9 +121,6 @@ func (c *Column) IsInvalid(sctx sessionctx.Context, collPseudo bool) bool { } if sctx != nil { stmtctx := sctx.GetSessionVars().StmtCtx - if stmtctx != nil && stmtctx.StatsLoad.Fallback { - return true - } if c.IsLoadNeeded() && stmtctx != nil { if stmtctx.StatsLoad.Timeout > 0 { logutil.BgLogger().Warn("Hist for column should already be loaded as sync but not found.", @@ -187,7 +184,7 @@ func (c *Column) equalRowCount(sctx sessionctx.Context, val types.Datum, encoded } // GetColumnRowCount estimates the row count by a slice of Range. -func (c *Column) GetColumnRowCount(sctx sessionctx.Context, ranges []*ranger.Range, realtimeRowCount int64, pkIsHandle bool) (float64, error) { +func (c *Column) GetColumnRowCount(sctx sessionctx.Context, ranges []*ranger.Range, realtimeRowCount, modifyCount int64, pkIsHandle bool) (float64, error) { sc := sctx.GetSessionVars().StmtCtx var rowCount float64 for _, rg := range ranges { @@ -284,11 +281,7 @@ func (c *Column) GetColumnRowCount(sctx sessionctx.Context, ranges []*ranger.Ran // handling the out-of-range part if (c.outOfRange(lowVal) && !lowVal.IsNull()) || c.outOfRange(highVal) { - increaseCount := realtimeRowCount - int64(c.TotalRowCount()) - if increaseCount < 0 { - increaseCount = 0 - } - cnt += c.Histogram.outOfRangeRowCount(&lowVal, &highVal, increaseCount) + cnt += c.Histogram.outOfRangeRowCount(&lowVal, &highVal, modifyCount) } rowCount += cnt diff --git a/statistics/handle/BUILD.bazel b/statistics/handle/BUILD.bazel index bcafe4260eb30..d52847495d539 100644 --- a/statistics/handle/BUILD.bazel +++ b/statistics/handle/BUILD.bazel @@ -9,6 +9,7 @@ go_library( "gc.go", "handle.go", "handle_hist.go", + "historical_stats_handler.go", "lru_cache.go", "statscache.go", "update.go", @@ -41,6 +42,7 @@ go_library( "//util/memory", "//util/ranger", "//util/sqlexec", + "//util/syncutil", "//util/timeutil", "@com_github_ngaut_pools//:pools", "@com_github_pingcap_errors//:errors", @@ -71,6 +73,7 @@ go_test( ], embed = [":handle"], flaky = True, + race = "on", shard_count = 50, deps = [ "//config", diff --git a/statistics/handle/bootstrap.go b/statistics/handle/bootstrap.go index 4aaeb05cf8c53..05e971488b360 100644 --- a/statistics/handle/bootstrap.go +++ b/statistics/handle/bootstrap.go @@ -63,7 +63,7 @@ func (h *Handle) initStatsMeta4Chunk(is infoschema.InfoSchema, cache *statsCache func (h *Handle) initStatsMeta(is infoschema.InfoSchema) (statsCache, error) { ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) sql := "select HIGH_PRIORITY version, table_id, modify_count, count from mysql.stats_meta" - rc, err := h.mu.ctx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, sql) + rc, err := h.initStatsCtx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, sql) if err != nil { return statsCache{}, errors.Trace(err) } @@ -167,7 +167,7 @@ func (h *Handle) initStatsHistograms4Chunk(is infoschema.InfoSchema, cache *stat func (h *Handle) initStatsHistograms(is infoschema.InfoSchema, cache *statsCache) error { ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) sql := "select HIGH_PRIORITY table_id, is_index, hist_id, distinct_count, version, null_count, cm_sketch, tot_col_size, stats_ver, correlation, flag, last_analyze_pos from mysql.stats_histograms" - rc, err := h.mu.ctx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, sql) + rc, err := h.initStatsCtx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, sql) if err != nil { return errors.Trace(err) } @@ -214,7 +214,7 @@ func (h *Handle) initStatsTopN4Chunk(cache *statsCache, iter *chunk.Iterator4Chu func (h *Handle) initStatsTopN(cache *statsCache) error { ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) sql := "select HIGH_PRIORITY table_id, hist_id, value, count from mysql.stats_top_n where is_index = 1" - rc, err := h.mu.ctx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, sql) + rc, err := h.initStatsCtx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, sql) if err != nil { return errors.Trace(err) } @@ -263,7 +263,7 @@ func (h *Handle) initStatsFMSketch4Chunk(cache *statsCache, iter *chunk.Iterator func (h *Handle) initStatsFMSketch(cache *statsCache) error { ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) sql := "select HIGH_PRIORITY table_id, is_index, hist_id, value from mysql.stats_fm_sketch" - rc, err := h.mu.ctx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, sql) + rc, err := h.initStatsCtx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, sql) if err != nil { return errors.Trace(err) } @@ -357,7 +357,7 @@ func (h *Handle) initTopNCountSum(tableID, colID int64) (int64, error) { func (h *Handle) initStatsBuckets(cache *statsCache) error { ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) sql := "select HIGH_PRIORITY table_id, is_index, hist_id, count, repeats, lower_bound, upper_bound, ndv from mysql.stats_buckets order by table_id, is_index, hist_id, bucket_id" - rc, err := h.mu.ctx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, sql) + rc, err := h.initStatsCtx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, sql) if err != nil { return errors.Trace(err) } @@ -398,15 +398,13 @@ func (h *Handle) initStatsBuckets(cache *statsCache) error { func (h *Handle) InitStats(is infoschema.InfoSchema) (err error) { loadFMSketch := config.GetGlobalConfig().Performance.EnableLoadFMSketch ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) - h.mu.Lock() defer func() { - _, err1 := h.mu.ctx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, "commit") + _, err1 := h.initStatsCtx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, "commit") if err == nil && err1 != nil { err = err1 } - h.mu.Unlock() }() - _, err = h.mu.ctx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, "begin") + _, err = h.initStatsCtx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, "begin") if err != nil { return err } @@ -446,17 +444,6 @@ func (h *Handle) InitStats(is infoschema.InfoSchema) (err error) { } cache.FreshMemUsage() h.updateStatsCache(cache) - v := h.statsCache.Load() - if v == nil { - return nil - } - healthyChange := &statsHealthyChange{} - for _, tbl := range v.(statsCache).Values() { - if healthy, ok := tbl.GetStatsHealthy(); ok { - healthyChange.add(healthy) - } - } - healthyChange.apply() return nil } diff --git a/statistics/handle/ddl.go b/statistics/handle/ddl.go index 84e0a087a13d3..ed09b2d5660c3 100644 --- a/statistics/handle/ddl.go +++ b/statistics/handle/ddl.go @@ -61,6 +61,21 @@ func (h *Handle) HandleDDLEvent(t *util.Event) error { return err } } + case model.ActionReorganizePartition: + for _, def := range t.PartInfo.Definitions { + // TODO: Should we trigger analyze instead of adding 0s? + if err := h.insertTableStats2KV(t.TableInfo, def.ID); err != nil { + return err + } + } + // Update global stats, even though it should not have changed, + // the updated statistics from the newly reorganized partitions may be better + pruneMode := h.CurrentPruneMode() + if pruneMode == variable.Dynamic && t.PartInfo != nil { + if err := h.updateGlobalStats(t.TableInfo); err != nil { + return err + } + } case model.ActionFlashbackCluster: return h.updateStatsVersion() } @@ -156,7 +171,8 @@ func (h *Handle) updateGlobalStats(tblInfo *model.TableInfo) error { for i := 0; i < newColGlobalStats.Num; i++ { hg, cms, topN := newColGlobalStats.Hg[i], newColGlobalStats.Cms[i], newColGlobalStats.TopN[i] // fms for global stats doesn't need to dump to kv. - err = h.SaveStatsToStorage(tableID, newColGlobalStats.Count, newColGlobalStats.ModifyCount, 0, hg, cms, topN, 2, 1, false) + err = h.SaveStatsToStorage(tableID, newColGlobalStats.Count, newColGlobalStats.ModifyCount, + 0, hg, cms, topN, 2, 1, false, StatsMetaHistorySourceSchemaChange) if err != nil { return err } @@ -186,7 +202,7 @@ func (h *Handle) updateGlobalStats(tblInfo *model.TableInfo) error { for i := 0; i < newIndexGlobalStats.Num; i++ { hg, cms, topN := newIndexGlobalStats.Hg[i], newIndexGlobalStats.Cms[i], newIndexGlobalStats.TopN[i] // fms for global stats doesn't need to dump to kv. - err = h.SaveStatsToStorage(tableID, newIndexGlobalStats.Count, newIndexGlobalStats.ModifyCount, 1, hg, cms, topN, 2, 1, false) + err = h.SaveStatsToStorage(tableID, newIndexGlobalStats.Count, newIndexGlobalStats.ModifyCount, 1, hg, cms, topN, 2, 1, false, StatsMetaHistorySourceSchemaChange) if err != nil { return err } @@ -221,7 +237,7 @@ func (h *Handle) insertTableStats2KV(info *model.TableInfo, physicalID int64) (e statsVer := uint64(0) defer func() { if err == nil && statsVer != 0 { - err = h.recordHistoricalStatsMeta(physicalID, statsVer) + h.recordHistoricalStatsMeta(physicalID, statsVer, StatsMetaHistorySourceSchemaChange) } }() h.mu.Lock() @@ -263,7 +279,7 @@ func (h *Handle) insertColStats2KV(physicalID int64, colInfos []*model.ColumnInf statsVer := uint64(0) defer func() { if err == nil && statsVer != 0 { - err = h.recordHistoricalStatsMeta(physicalID, statsVer) + h.recordHistoricalStatsMeta(physicalID, statsVer, StatsMetaHistorySourceSchemaChange) } }() h.mu.Lock() diff --git a/statistics/handle/dump.go b/statistics/handle/dump.go index 8f9b070ef2f6f..016fc858857ca 100644 --- a/statistics/handle/dump.go +++ b/statistics/handle/dump.go @@ -18,11 +18,12 @@ import ( "bytes" "compress/gzip" "encoding/json" - "io/ioutil" + "io" "time" "github.com/pingcap/errors" "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx" @@ -30,20 +31,24 @@ import ( "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tipb/go-tipb" + "go.uber.org/zap" ) // JSONTable is used for dumping statistics. type JSONTable struct { - DatabaseName string `json:"database_name"` - TableName string `json:"table_name"` - Columns map[string]*jsonColumn `json:"columns"` - Indices map[string]*jsonColumn `json:"indices"` - ExtStats []*jsonExtendedStats `json:"ext_stats"` - Count int64 `json:"count"` - ModifyCount int64 `json:"modify_count"` - Partitions map[string]*JSONTable `json:"partitions"` + IsHistoricalStats bool `json:"is_historical_stats"` + DatabaseName string `json:"database_name"` + TableName string `json:"table_name"` + Columns map[string]*jsonColumn `json:"columns"` + Indices map[string]*jsonColumn `json:"indices"` + ExtStats []*jsonExtendedStats `json:"ext_stats"` + Count int64 `json:"count"` + ModifyCount int64 `json:"modify_count"` + Partitions map[string]*JSONTable `json:"partitions"` + Version uint64 `json:"version"` } type jsonExtendedStats struct { @@ -130,6 +135,55 @@ func (h *Handle) DumpStatsToJSON(dbName string, tableInfo *model.TableInfo, return h.DumpStatsToJSONBySnapshot(dbName, tableInfo, snapshot, dumpPartitionStats) } +var ( + dumpHistoricalStatsSuccessCounter = metrics.HistoricalStatsCounter.WithLabelValues("dump", "success") + dumpHistoricalStatsFailedCounter = metrics.HistoricalStatsCounter.WithLabelValues("dump", "fail") +) + +// DumpHistoricalStatsBySnapshot dumped json tables from mysql.stats_meta_history and mysql.stats_history +func (h *Handle) DumpHistoricalStatsBySnapshot(dbName string, tableInfo *model.TableInfo, snapshot uint64) (jt *JSONTable, err error) { + historicalStatsEnabled, err := h.CheckHistoricalStatsEnable() + if err != nil { + return nil, errors.Errorf("check %v failed: %v", variable.TiDBEnableHistoricalStats, err) + } + if !historicalStatsEnabled { + return nil, errors.Errorf("%v should be enabled", variable.TiDBEnableHistoricalStats) + } + + defer func() { + if err == nil { + dumpHistoricalStatsSuccessCounter.Inc() + } else { + dumpHistoricalStatsFailedCounter.Inc() + } + }() + pi := tableInfo.GetPartitionInfo() + if pi == nil { + return h.getTableHistoricalStatsToJSONWithFallback(dbName, tableInfo, tableInfo.ID, snapshot) + } + jsonTbl := &JSONTable{ + DatabaseName: dbName, + TableName: tableInfo.Name.L, + Partitions: make(map[string]*JSONTable, len(pi.Definitions)), + } + for _, def := range pi.Definitions { + tbl, err := h.getTableHistoricalStatsToJSONWithFallback(dbName, tableInfo, def.ID, snapshot) + if err != nil { + return nil, errors.Trace(err) + } + jsonTbl.Partitions[def.Name.L] = tbl + } + tbl, err := h.getTableHistoricalStatsToJSONWithFallback(dbName, tableInfo, tableInfo.ID, snapshot) + if err != nil { + return nil, err + } + // dump its global-stats if existed + if tbl != nil { + jsonTbl.Partitions["global"] = tbl + } + return jsonTbl, nil +} + // DumpStatsToJSONBySnapshot dumps statistic to json. func (h *Handle) DumpStatsToJSONBySnapshot(dbName string, tableInfo *model.TableInfo, snapshot uint64, dumpPartitionStats bool) (*JSONTable, error) { h.mu.Lock() @@ -177,6 +231,7 @@ func GenJSONTableFromStats(dbName string, tableInfo *model.TableInfo, tbl *stati Indices: make(map[string]*jsonColumn, len(tbl.Indices)), Count: tbl.Count, ModifyCount: tbl.ModifyCount, + Version: tbl.Version, } for _, col := range tbl.Columns { sc := &stmtctx.StatementContext{TimeZone: time.UTC} @@ -194,6 +249,81 @@ func GenJSONTableFromStats(dbName string, tableInfo *model.TableInfo, tbl *stati return jsonTbl, nil } +// getTableHistoricalStatsToJSONWithFallback try to get table historical stats, if not exit, directly fallback to the latest stats +func (h *Handle) getTableHistoricalStatsToJSONWithFallback(dbName string, tableInfo *model.TableInfo, physicalID int64, snapshot uint64) (*JSONTable, error) { + jt, exist, err := h.tableHistoricalStatsToJSON(physicalID, snapshot) + if err != nil { + return nil, err + } + if !exist { + return h.tableStatsToJSON(dbName, tableInfo, physicalID, 0) + } + return jt, nil +} + +func (h *Handle) tableHistoricalStatsToJSON(physicalID int64, snapshot uint64) (*JSONTable, bool, error) { + reader, err := h.getGlobalStatsReader(0) + if err != nil { + return nil, false, err + } + defer func() { + err1 := h.releaseGlobalStatsReader(reader) + if err == nil && err1 != nil { + err = err1 + } + }() + + // get meta version + rows, _, err := reader.Read("select distinct version from mysql.stats_meta_history where table_id = %? and version <= %? order by version desc limit 1", physicalID, snapshot) + if err != nil { + return nil, false, errors.AddStack(err) + } + if len(rows) < 1 { + logutil.BgLogger().Warn("failed to get records of stats_meta_history", + zap.Int64("table-id", physicalID), + zap.Uint64("snapshotTS", snapshot)) + return nil, false, nil + } + statsMetaVersion := rows[0].GetInt64(0) + // get stats meta + rows, _, err = reader.Read("select modify_count, count from mysql.stats_meta_history where table_id = %? and version = %?", physicalID, statsMetaVersion) + if err != nil { + return nil, false, errors.AddStack(err) + } + modifyCount, count := rows[0].GetInt64(0), rows[0].GetInt64(1) + + // get stats version + rows, _, err = reader.Read("select distinct version from mysql.stats_history where table_id = %? and version <= %? order by version desc limit 1", physicalID, snapshot) + if err != nil { + return nil, false, errors.AddStack(err) + } + if len(rows) < 1 { + logutil.BgLogger().Warn("failed to get record of stats_history", + zap.Int64("table-id", physicalID), + zap.Uint64("snapshotTS", snapshot)) + return nil, false, nil + } + statsVersion := rows[0].GetInt64(0) + + // get stats + rows, _, err = reader.Read("select stats_data from mysql.stats_history where table_id = %? and version = %? order by seq_no", physicalID, statsVersion) + if err != nil { + return nil, false, errors.AddStack(err) + } + blocks := make([][]byte, 0) + for _, row := range rows { + blocks = append(blocks, row.GetBytes(0)) + } + jsonTbl, err := BlocksToJSONTable(blocks) + if err != nil { + return nil, false, errors.AddStack(err) + } + jsonTbl.Count = count + jsonTbl.ModifyCount = modifyCount + jsonTbl.IsHistoricalStats = true + return jsonTbl, true, nil +} + func (h *Handle) tableStatsToJSON(dbName string, tableInfo *model.TableInfo, physicalID int64, snapshot uint64) (*JSONTable, error) { tbl, err := h.TableStatsFromStorage(tableInfo, physicalID, true, snapshot) if err != nil || tbl == nil { @@ -254,7 +384,7 @@ func (h *Handle) loadStatsFromJSON(tableInfo *model.TableInfo, physicalID int64, // loadStatsFromJSON doesn't support partition table now. // The table level Count and Modify_count would be overridden by the SaveMetaToStorage below, so we don't need // to care about them here. - err = h.SaveStatsToStorage(tbl.PhysicalID, tbl.Count, 0, 0, &col.Histogram, col.CMSketch, col.TopN, int(col.StatsVer), 1, false) + err = h.SaveStatsToStorage(tbl.PhysicalID, tbl.Count, 0, 0, &col.Histogram, col.CMSketch, col.TopN, int(col.StatsVer), 1, false, StatsMetaHistorySourceLoadStats) if err != nil { return errors.Trace(err) } @@ -263,7 +393,7 @@ func (h *Handle) loadStatsFromJSON(tableInfo *model.TableInfo, physicalID int64, // loadStatsFromJSON doesn't support partition table now. // The table level Count and Modify_count would be overridden by the SaveMetaToStorage below, so we don't need // to care about them here. - err = h.SaveStatsToStorage(tbl.PhysicalID, tbl.Count, 0, 1, &idx.Histogram, idx.CMSketch, idx.TopN, int(idx.StatsVer), 1, false) + err = h.SaveStatsToStorage(tbl.PhysicalID, tbl.Count, 0, 1, &idx.Histogram, idx.CMSketch, idx.TopN, int(idx.StatsVer), 1, false, StatsMetaHistorySourceLoadStats) if err != nil { return errors.Trace(err) } @@ -272,7 +402,7 @@ func (h *Handle) loadStatsFromJSON(tableInfo *model.TableInfo, physicalID int64, if err != nil { return errors.Trace(err) } - return h.SaveMetaToStorage(tbl.PhysicalID, tbl.Count, tbl.ModifyCount) + return h.SaveMetaToStorage(tbl.PhysicalID, tbl.Count, tbl.ModifyCount, StatsMetaHistorySourceLoadStats) } // TableStatsFromJSON loads statistic from JSONTable and return the Table of statistic. @@ -408,7 +538,7 @@ func BlocksToJSONTable(blocks [][]byte) (*JSONTable, error) { if err := gzipReader.Close(); err != nil { return nil, err } - jsonStr, err := ioutil.ReadAll(gzipReader) + jsonStr, err := io.ReadAll(gzipReader) if err != nil { return nil, errors.Trace(err) } diff --git a/statistics/handle/dump_test.go b/statistics/handle/dump_test.go index 857c05749d066..165ea999ae25a 100644 --- a/statistics/handle/dump_test.go +++ b/statistics/handle/dump_test.go @@ -261,7 +261,7 @@ func TestDumpCMSketchWithTopN(t *testing.T) { cms, _, _, _ := statistics.NewCMSketchAndTopN(5, 2048, fakeData, 20, 100) stat := h.GetTableStats(tableInfo) - err = h.SaveStatsToStorage(tableInfo.ID, 1, 0, 0, &stat.Columns[tableInfo.Columns[0].ID].Histogram, cms, nil, statistics.Version2, 1, false) + err = h.SaveStatsToStorage(tableInfo.ID, 1, 0, 0, &stat.Columns[tableInfo.Columns[0].ID].Histogram, cms, nil, statistics.Version2, 1, false, handle.StatsMetaHistorySourceLoadStats) require.NoError(t, err) require.Nil(t, h.Update(is)) diff --git a/statistics/handle/gc.go b/statistics/handle/gc.go index 1babb4321eb9e..5cbba2c1063ce 100644 --- a/statistics/handle/gc.go +++ b/statistics/handle/gc.go @@ -22,6 +22,10 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/statistics" + "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/mathutil" "github.com/pingcap/tidb/util/sqlexec" @@ -50,6 +54,17 @@ func (h *Handle) GCStats(is infoschema.InfoSchema, ddlLease time.Duration) error if err := h.gcTableStats(is, row.GetInt64(0)); err != nil { return errors.Trace(err) } + _, existed := is.TableByID(row.GetInt64(0)) + if !existed { + if err := h.gcHistoryStatsFromKV(row.GetInt64(0)); err != nil { + return errors.Trace(err) + } + } + } + if err := h.ClearOutdatedHistoryStats(); err != nil { + logutil.BgLogger().Warn("failed to gc outdated historical stats", + zap.Duration("duration", variable.HistoricalStatsDuration.Load()), + zap.Error(err)) } return h.removeDeletedExtendedStats(gcVer) } @@ -68,9 +83,7 @@ func (h *Handle) gcTableStats(is infoschema.InfoSchema, physicalID int64) error return errors.Trace(err) } } - h.mu.Lock() tbl, ok := h.getTableByPhysicalID(is, physicalID) - h.mu.Unlock() if !ok { logutil.BgLogger().Info("remove stats in GC due to dropped table", zap.Int64("table_id", physicalID)) return errors.Trace(h.DeleteTableStatsFromKV([]int64{physicalID})) @@ -101,7 +114,7 @@ func (h *Handle) gcTableStats(is infoschema.InfoSchema, physicalID int64) error } } // Mark records in mysql.stats_extended as `deleted`. - rows, _, err = h.execRestrictedSQL(ctx, "select name, column_ids from mysql.stats_extended where table_id = %? and status in (%?, %?)", physicalID, StatsStatusAnalyzed, StatsStatusInited) + rows, _, err = h.execRestrictedSQL(ctx, "select name, column_ids from mysql.stats_extended where table_id = %? and status in (%?, %?)", physicalID, statistics.ExtendedStatsAnalyzed, statistics.ExtendedStatsInited) if err != nil { return errors.Trace(err) } @@ -138,6 +151,62 @@ func (h *Handle) gcTableStats(is infoschema.InfoSchema, physicalID int64) error return nil } +// ClearOutdatedHistoryStats clear outdated historical stats +func (h *Handle) ClearOutdatedHistoryStats() error { + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) + h.mu.Lock() + defer h.mu.Unlock() + exec := h.mu.ctx.(sqlexec.SQLExecutor) + sql := "select count(*) from mysql.stats_meta_history where NOW() - create_time >= %?" + rs, err := exec.ExecuteInternal(ctx, sql, variable.HistoricalStatsDuration.Load().Seconds()) + if err != nil { + return err + } + if rs == nil { + return nil + } + var rows []chunk.Row + defer terror.Call(rs.Close) + if rows, err = sqlexec.DrainRecordSet(ctx, rs, 8); err != nil { + return errors.Trace(err) + } + count := rows[0].GetInt64(0) + if count > 0 { + sql = "delete from mysql.stats_meta_history where NOW() - create_time >= %?" + _, err = exec.ExecuteInternal(ctx, sql, variable.HistoricalStatsDuration.Load().Seconds()) + if err != nil { + return err + } + sql = "delete from mysql.stats_history where NOW() - create_time >= %? " + _, err = exec.ExecuteInternal(ctx, sql, variable.HistoricalStatsDuration.Load().Seconds()) + logutil.BgLogger().Info("clear outdated historical stats") + return err + } + return nil +} + +func (h *Handle) gcHistoryStatsFromKV(physicalID int64) error { + h.mu.Lock() + defer h.mu.Unlock() + exec := h.mu.ctx.(sqlexec.SQLExecutor) + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) + _, err := exec.ExecuteInternal(ctx, "begin pessimistic") + if err != nil { + return errors.Trace(err) + } + defer func() { + err = finishTransaction(ctx, exec, err) + }() + sql := "delete from mysql.stats_history where table_id = %?" + _, err = exec.ExecuteInternal(ctx, sql, physicalID) + if err != nil { + return errors.Trace(err) + } + sql = "delete from mysql.stats_meta_history where table_id = %?" + _, err = exec.ExecuteInternal(ctx, sql, physicalID) + return err +} + // deleteHistStatsFromKV deletes all records about a column or an index and updates version. func (h *Handle) deleteHistStatsFromKV(physicalID int64, histID int64, isIndex int) (err error) { h.mu.Lock() @@ -222,7 +291,7 @@ func (h *Handle) DeleteTableStatsFromKV(statsIDs []int64) (err error) { if _, err = exec.ExecuteInternal(ctx, "delete from mysql.stats_feedback where table_id = %?", statsID); err != nil { return err } - if _, err = exec.ExecuteInternal(ctx, "update mysql.stats_extended set version = %?, status = %? where table_id = %? and status in (%?, %?)", startTS, StatsStatusDeleted, statsID, StatsStatusAnalyzed, StatsStatusInited); err != nil { + if _, err = exec.ExecuteInternal(ctx, "update mysql.stats_extended set version = %?, status = %? where table_id = %? and status in (%?, %?)", startTS, statistics.ExtendedStatsDeleted, statsID, statistics.ExtendedStatsAnalyzed, statistics.ExtendedStatsInited); err != nil { return err } if _, err = exec.ExecuteInternal(ctx, "delete from mysql.stats_fm_sketch where table_id = %?", statsID); err != nil { @@ -251,6 +320,6 @@ func (h *Handle) removeDeletedExtendedStats(version uint64) (err error) { err = finishTransaction(ctx, exec, err) }() const sql = "delete from mysql.stats_extended where status = %? and version < %?" - _, err = exec.ExecuteInternal(ctx, sql, StatsStatusDeleted, version) + _, err = exec.ExecuteInternal(ctx, sql, statistics.ExtendedStatsDeleted, version) return } diff --git a/statistics/handle/handle.go b/statistics/handle/handle.go index 7dfc3f47d2d62..b2c472c2d2c20 100644 --- a/statistics/handle/handle.go +++ b/statistics/handle/handle.go @@ -27,7 +27,6 @@ import ( "github.com/ngaut/pools" "github.com/pingcap/errors" - "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" ddlUtil "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/infoschema" @@ -48,6 +47,7 @@ import ( "github.com/pingcap/tidb/util/mathutil" "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/sqlexec" + "github.com/pingcap/tidb/util/syncutil" "github.com/prometheus/client_golang/prometheus" "github.com/tikv/client-go/v2/oracle" atomic2 "go.uber.org/atomic" @@ -65,11 +65,19 @@ const ( // Handle can update stats info periodically. type Handle struct { + + // initStatsCtx is the ctx only used for initStats + initStatsCtx sessionctx.Context + mu struct { - sync.RWMutex + syncutil.RWMutex ctx sessionctx.Context // rateMap contains the error rate delta from feedback. rateMap errorRateDeltaMap + } + + schemaMu struct { + sync.RWMutex // pid2tid is the map from partition ID to table ID. pid2tid map[int64]int64 // schemaVersion is the version of information schema when `pid2tid` is built. @@ -353,8 +361,15 @@ func (h *Handle) RemoveLockedTables(tids []int64, pids []int64, tables []*ast.Ta return "", err } -// IsTableLocked check whether table is locked in handle +// IsTableLocked check whether table is locked in handle with Handle.Mutex func (h *Handle) IsTableLocked(tableID int64) bool { + h.mu.RLock() + defer h.mu.RUnlock() + return h.isTableLocked(tableID) +} + +// IsTableLocked check whether table is locked in handle without Handle.Mutex +func (h *Handle) isTableLocked(tableID int64) bool { return isTableLocked(h.tableLocked, tableID) } @@ -460,16 +475,17 @@ type sessionPool interface { } // NewHandle creates a Handle for update stats. -func NewHandle(ctx sessionctx.Context, lease time.Duration, pool sessionPool, tracker sessionctx.SysProcTracker, serverIDGetter func() uint64) (*Handle, error) { +func NewHandle(ctx, initStatsCtx sessionctx.Context, lease time.Duration, pool sessionPool, tracker sessionctx.SysProcTracker, serverIDGetter func() uint64) (*Handle, error) { cfg := config.GetGlobalConfig() handle := &Handle{ - ddlEventCh: make(chan *ddlUtil.Event, 100), + ddlEventCh: make(chan *ddlUtil.Event, 1000), listHead: &SessionStatsCollector{mapper: make(tableDeltaMap), rateMap: make(errorRateDeltaMap)}, idxUsageListHead: &SessionIndexUsageCollector{mapper: make(indexUsageMap)}, pool: pool, sysProcTracker: tracker, serverIDGetter: serverIDGetter, } + handle.initStatsCtx = initStatsCtx handle.lease.Store(lease) handle.statsCache.memTracker = memory.NewTracker(memory.LabelForStatsCache, -1) handle.mu.ctx = ctx @@ -523,42 +539,32 @@ var statsHealthyGauges = []prometheus.Gauge{ metrics.StatsHealthyGauge.WithLabelValues("[0,100]"), } -type statsHealthyChange struct { - bucketDelta [5]int -} - -func (c *statsHealthyChange) update(add bool, statsHealthy int64) { - var idx int - if statsHealthy < 50 { - idx = 0 - } else if statsHealthy < 80 { - idx = 1 - } else if statsHealthy < 100 { - idx = 2 - } else { - idx = 3 - } - lastIDX := len(c.bucketDelta) - 1 - if add { - c.bucketDelta[idx]++ - c.bucketDelta[lastIDX]++ - } else { - c.bucketDelta[idx]-- - c.bucketDelta[lastIDX]-- +// UpdateStatsHealthyMetrics updates stats healthy distribution metrics according to stats cache. +func (h *Handle) UpdateStatsHealthyMetrics() { + v := h.statsCache.Load() + if v == nil { + return } -} - -func (c *statsHealthyChange) drop(statsHealthy int64) { - c.update(false, statsHealthy) -} -func (c *statsHealthyChange) add(statsHealthy int64) { - c.update(true, statsHealthy) -} - -func (c *statsHealthyChange) apply() { - for i, val := range c.bucketDelta { - statsHealthyGauges[i].Add(float64(val)) + distribution := make([]int64, 5) + for _, tbl := range v.(statsCache).Values() { + healthy, ok := tbl.GetStatsHealthy() + if !ok { + continue + } + if healthy < 50 { + distribution[0] += 1 + } else if healthy < 80 { + distribution[1] += 1 + } else if healthy < 100 { + distribution[2] += 1 + } else { + distribution[3] += 1 + } + distribution[4] += 1 + } + for i, val := range distribution { + statsHealthyGauges[i].Set(float64(val)) } } @@ -582,7 +588,6 @@ func (h *Handle) Update(is infoschema.InfoSchema, opts ...TableStatsOpt) error { if err != nil { return errors.Trace(err) } - healthyChange := &statsHealthyChange{} option := &tableStatsOption{} for _, opt := range opts { opt(option) @@ -595,17 +600,14 @@ func (h *Handle) Update(is infoschema.InfoSchema, opts ...TableStatsOpt) error { modifyCount := row.GetInt64(2) count := row.GetInt64(3) lastVersion = version - h.mu.Lock() table, ok := h.getTableByPhysicalID(is, physicalID) - h.mu.Unlock() if !ok { logutil.BgLogger().Debug("unknown physical ID in stats meta table, maybe it has been dropped", zap.Int64("ID", physicalID)) deletedTableIDs = append(deletedTableIDs, physicalID) continue } tableInfo := table.Meta() - oldTbl, ok := oldCache.Get(physicalID) - if ok && oldTbl.Version >= version && tableInfo.UpdateTS == oldTbl.TblInfoUpdateTS { + if oldTbl, ok := oldCache.Get(physicalID); ok && oldTbl.Version >= version && tableInfo.UpdateTS == oldTbl.TblInfoUpdateTS { continue } tbl, err := h.TableStatsFromStorage(tableInfo, physicalID, false, 0) @@ -614,9 +616,6 @@ func (h *Handle) Update(is infoschema.InfoSchema, opts ...TableStatsOpt) error { logutil.BgLogger().Error("[stats] error occurred when read table stats", zap.String("table", tableInfo.Name.O), zap.Error(err)) continue } - if oldHealthy, ok := oldTbl.GetStatsHealthy(); ok { - healthyChange.drop(oldHealthy) - } if tbl == nil { deletedTableIDs = append(deletedTableIDs, physicalID) continue @@ -626,15 +625,9 @@ func (h *Handle) Update(is infoschema.InfoSchema, opts ...TableStatsOpt) error { tbl.ModifyCount = modifyCount tbl.Name = getFullTableName(is, tableInfo) tbl.TblInfoUpdateTS = tableInfo.UpdateTS - if newHealthy, ok := tbl.GetStatsHealthy(); ok { - healthyChange.add(newHealthy) - } tables = append(tables, tbl) } - updated := h.updateStatsCache(oldCache.update(tables, deletedTableIDs, lastVersion, opts...)) - if updated { - healthyChange.apply() - } + h.updateStatsCache(oldCache.update(tables, deletedTableIDs, lastVersion, opts...)) return nil } @@ -675,9 +668,7 @@ func (h *Handle) MergePartitionStats2GlobalStatsByTableID(sc sessionctx.Context, physicalID int64, isIndex int, histIDs []int64, tablePartitionStats map[int64]*statistics.Table) (globalStats *GlobalStats, err error) { // get the partition table IDs - h.mu.Lock() globalTable, ok := h.getTableByPhysicalID(is, physicalID) - h.mu.Unlock() if !ok { err = errors.Errorf("unknown physical ID %d in stats meta table, maybe it has been dropped", physicalID) return @@ -686,20 +677,15 @@ func (h *Handle) MergePartitionStats2GlobalStatsByTableID(sc sessionctx.Context, return h.mergePartitionStats2GlobalStats(sc, opts, is, globalTableInfo, isIndex, histIDs, tablePartitionStats) } -func (h *Handle) loadTablePartitionStats(tableInfo *model.TableInfo, partitionID int64, isIndex int, histIDs []int64) (*statistics.Table, error) { +func (h *Handle) loadTablePartitionStats(tableInfo *model.TableInfo, partitionDef *model.PartitionDefinition) (*statistics.Table, error) { var partitionStats *statistics.Table - partitionStats, err := h.TableStatsFromStorage(tableInfo, partitionID, true, 0) + partitionStats, err := h.TableStatsFromStorage(tableInfo, partitionDef.ID, true, 0) if err != nil { return nil, err } // if the err == nil && partitionStats == nil, it means we lack the partition-level stats which the physicalID is equal to partitionID. if partitionStats == nil { - var errMsg string - if isIndex == 0 { - errMsg = fmt.Sprintf("`%s`", tableInfo.Name.L) - } else { - errMsg = fmt.Sprintf("`%s` index: `%s`", tableInfo.Name.L, tableInfo.FindIndexNameByID(histIDs[0])) - } + errMsg := fmt.Sprintf("table `%s` partition `%s`", tableInfo.Name.L, partitionDef.Name.L) err = types.ErrPartitionStatsMissing.GenWithStackByArgs(errMsg) return nil, err } @@ -750,10 +736,9 @@ func (h *Handle) mergePartitionStats2GlobalStats(sc sessionctx.Context, allFms[i] = make([]*statistics.FMSketch, 0, partitionNum) } - for _, partitionID := range partitionIDs { - h.mu.Lock() + for _, def := range globalTableInfo.Partition.Definitions { + partitionID := def.ID partitionTable, ok := h.getTableByPhysicalID(is, partitionID) - h.mu.Unlock() if !ok { err = errors.Errorf("unknown physical ID %d in stats meta table, maybe it has been dropped", partitionID) return @@ -765,7 +750,7 @@ func (h *Handle) mergePartitionStats2GlobalStats(sc sessionctx.Context, } // If pre-load partition stats isn't provided, then we load partition stats directly and set it into allPartitionStats if allPartitionStats == nil || partitionStats == nil || !ok { - partitionStats, err = h.loadTablePartitionStats(tableInfo, partitionID, isIndex, histIDs) + partitionStats, err = h.loadTablePartitionStats(tableInfo, &def) if err != nil { return } @@ -775,14 +760,24 @@ func (h *Handle) mergePartitionStats2GlobalStats(sc sessionctx.Context, allPartitionStats[partitionID] = partitionStats } for i := 0; i < globalStats.Num; i++ { - _, hg, cms, topN, fms := partitionStats.GetStatsInfo(histIDs[i], isIndex == 1) + _, hg, cms, topN, fms, analyzed := partitionStats.GetStatsInfo(histIDs[i], isIndex == 1) + if !analyzed { + var errMsg string + if isIndex == 0 { + errMsg = fmt.Sprintf("table `%s` partition `%s` column `%s`", tableInfo.Name.L, def.Name.L, tableInfo.FindColumnNameByID(histIDs[i])) + } else { + errMsg = fmt.Sprintf("table `%s` partition `%s` index `%s`", tableInfo.Name.L, def.Name.L, tableInfo.FindIndexNameByID(histIDs[i])) + } + err = types.ErrPartitionStatsMissing.GenWithStackByArgs(errMsg) + return + } // partition stats is not empty but column stats(hist, topn) is missing if partitionStats.Count > 0 && (hg == nil || hg.TotalRowCount() <= 0) && (topN == nil || topN.TotalCount() <= 0) { var errMsg string if isIndex == 0 { - errMsg = fmt.Sprintf("`%s` column: `%s`", tableInfo.Name.L, tableInfo.FindColumnNameByID(histIDs[i])) + errMsg = fmt.Sprintf("table `%s` partition `%s` column `%s`", tableInfo.Name.L, def.Name.L, tableInfo.FindColumnNameByID(histIDs[i])) } else { - errMsg = fmt.Sprintf("`%s` index: `%s`", tableInfo.Name.L, tableInfo.FindIndexNameByID(histIDs[i])) + errMsg = fmt.Sprintf("table `%s` partition `%s` index `%s`", tableInfo.Name.L, def.Name.L, tableInfo.FindIndexNameByID(histIDs[i])) } err = types.ErrPartitionColumnStatsMissing.GenWithStackByArgs(errMsg) return @@ -948,11 +943,13 @@ func (h *Handle) mergeGlobalStatsTopNByConcurrency(mergeConcurrency, mergeBatchS } func (h *Handle) getTableByPhysicalID(is infoschema.InfoSchema, physicalID int64) (table.Table, bool) { - if is.SchemaMetaVersion() != h.mu.schemaVersion { - h.mu.schemaVersion = is.SchemaMetaVersion() - h.mu.pid2tid = buildPartitionID2TableID(is) + h.schemaMu.Lock() + defer h.schemaMu.Unlock() + if is.SchemaMetaVersion() != h.schemaMu.schemaVersion { + h.schemaMu.schemaVersion = is.SchemaMetaVersion() + h.schemaMu.pid2tid = buildPartitionID2TableID(is) } - if id, ok := h.mu.pid2tid[physicalID]; ok { + if id, ok := h.schemaMu.pid2tid[physicalID]; ok { return is.TableByID(id) } return is.TableByID(physicalID) @@ -988,8 +985,13 @@ func (h *Handle) GetTableStats(tblInfo *model.TableInfo, opts ...TableStatsOpt) // GetPartitionStats retrieves the partition stats from cache. func (h *Handle) GetPartitionStats(tblInfo *model.TableInfo, pid int64, opts ...TableStatsOpt) *statistics.Table { - statsCache := h.statsCache.Load().(statsCache) var tbl *statistics.Table + if h == nil { + tbl = statistics.PseudoTable(tblInfo) + tbl.PhysicalID = pid + return tbl + } + statsCache := h.statsCache.Load().(statsCache) var ok bool option := &tableStatsOption{} for _, opt := range opts { @@ -1058,7 +1060,7 @@ func (h *Handle) LoadNeededHistograms() (err error) { return nil } -func (h *Handle) loadNeededColumnHistograms(reader *statsReader, col model.TableItemID, loadFMSketch bool) (err error) { +func (h *Handle) loadNeededColumnHistograms(reader *statistics.StatsReader, col model.TableItemID, loadFMSketch bool) (err error) { oldCache := h.statsCache.Load().(statsCache) tbl, ok := oldCache.Get(col.TableID) if !ok { @@ -1069,22 +1071,22 @@ func (h *Handle) loadNeededColumnHistograms(reader *statsReader, col model.Table statistics.HistogramNeededItems.Delete(col) return nil } - hg, err := h.histogramFromStorage(reader, col.TableID, c.ID, &c.Info.FieldType, c.Histogram.NDV, 0, c.LastUpdateVersion, c.NullCount, c.TotColSize, c.Correlation) + hg, err := statistics.HistogramFromStorage(reader, col.TableID, c.ID, &c.Info.FieldType, c.Histogram.NDV, 0, c.LastUpdateVersion, c.NullCount, c.TotColSize, c.Correlation) if err != nil { return errors.Trace(err) } - cms, topN, err := h.cmSketchAndTopNFromStorage(reader, col.TableID, 0, col.ID) + cms, topN, err := statistics.CMSketchAndTopNFromStorage(reader, col.TableID, 0, col.ID) if err != nil { return errors.Trace(err) } var fms *statistics.FMSketch if loadFMSketch { - fms, err = h.fmSketchFromStorage(reader, col.TableID, 0, col.ID) + fms, err = statistics.FMSketchFromStorage(reader, col.TableID, 0, col.ID) if err != nil { return errors.Trace(err) } } - rows, _, err := reader.read("select stats_ver from mysql.stats_histograms where is_index = 0 and table_id = %? and hist_id = %?", col.TableID, col.ID) + rows, _, err := reader.Read("select stats_ver from mysql.stats_histograms where is_index = 0 and table_id = %? and hist_id = %?", col.TableID, col.ID) if err != nil { return errors.Trace(err) } @@ -1125,7 +1127,7 @@ func (h *Handle) loadNeededColumnHistograms(reader *statsReader, col model.Table return nil } -func (h *Handle) loadNeededIndexHistograms(reader *statsReader, idx model.TableItemID, loadFMSketch bool) (err error) { +func (h *Handle) loadNeededIndexHistograms(reader *statistics.StatsReader, idx model.TableItemID, loadFMSketch bool) (err error) { oldCache := h.statsCache.Load().(statsCache) tbl, ok := oldCache.Get(idx.TableID) if !ok { @@ -1136,22 +1138,22 @@ func (h *Handle) loadNeededIndexHistograms(reader *statsReader, idx model.TableI statistics.HistogramNeededItems.Delete(idx) return nil } - hg, err := h.histogramFromStorage(reader, idx.TableID, index.ID, types.NewFieldType(mysql.TypeBlob), index.Histogram.NDV, 1, index.LastUpdateVersion, index.NullCount, index.TotColSize, index.Correlation) + hg, err := statistics.HistogramFromStorage(reader, idx.TableID, index.ID, types.NewFieldType(mysql.TypeBlob), index.Histogram.NDV, 1, index.LastUpdateVersion, index.NullCount, index.TotColSize, index.Correlation) if err != nil { return errors.Trace(err) } - cms, topN, err := h.cmSketchAndTopNFromStorage(reader, idx.TableID, 1, idx.ID) + cms, topN, err := statistics.CMSketchAndTopNFromStorage(reader, idx.TableID, 1, idx.ID) if err != nil { return errors.Trace(err) } var fms *statistics.FMSketch if loadFMSketch { - fms, err = h.fmSketchFromStorage(reader, idx.TableID, 1, idx.ID) + fms, err = statistics.FMSketchFromStorage(reader, idx.TableID, 1, idx.ID) if err != nil { return errors.Trace(err) } } - rows, _, err := reader.read("select stats_ver from mysql.stats_histograms where is_index = 1 and table_id = %? and hist_id = %?", idx.TableID, idx.ID) + rows, _, err := reader.Read("select stats_ver from mysql.stats_histograms where is_index = 1 and table_id = %? and hist_id = %?", idx.TableID, idx.ID) if err != nil { return errors.Trace(err) } @@ -1205,30 +1207,7 @@ func (h *Handle) FlushStats() { } } -func (h *Handle) cmSketchAndTopNFromStorage(reader *statsReader, tblID int64, isIndex, histID int64) (_ *statistics.CMSketch, _ *statistics.TopN, err error) { - topNRows, _, err := reader.read("select HIGH_PRIORITY value, count from mysql.stats_top_n where table_id = %? and is_index = %? and hist_id = %?", tblID, isIndex, histID) - if err != nil { - return nil, nil, err - } - rows, _, err := reader.read("select cm_sketch from mysql.stats_histograms where table_id = %? and is_index = %? and hist_id = %?", tblID, isIndex, histID) - if err != nil { - return nil, nil, err - } - if len(rows) == 0 { - return statistics.DecodeCMSketchAndTopN(nil, topNRows) - } - return statistics.DecodeCMSketchAndTopN(rows[0].GetBytes(0), topNRows) -} - -func (h *Handle) fmSketchFromStorage(reader *statsReader, tblID int64, isIndex, histID int64) (_ *statistics.FMSketch, err error) { - rows, _, err := reader.read("select value from mysql.stats_fm_sketch where table_id = %? and is_index = %? and hist_id = %?", tblID, isIndex, histID) - if err != nil || len(rows) == 0 { - return nil, err - } - return statistics.DecodeFMSketch(rows[0].GetBytes(0)) -} - -func (h *Handle) indexStatsFromStorage(reader *statsReader, row chunk.Row, table *statistics.Table, tableInfo *model.TableInfo) error { +func (h *Handle) indexStatsFromStorage(reader *statistics.StatsReader, row chunk.Row, table *statistics.Table, tableInfo *model.TableInfo) error { histID := row.GetInt64(2) distinct := row.GetInt64(3) histVer := row.GetUint64(4) @@ -1238,7 +1217,7 @@ func (h *Handle) indexStatsFromStorage(reader *statsReader, row chunk.Row, table errorRate := statistics.ErrorRate{} flag := row.GetInt64(8) lastAnalyzePos := row.GetDatum(10, types.NewFieldType(mysql.TypeBlob)) - if statistics.IsAnalyzed(flag) && !reader.isHistory() { + if statistics.IsAnalyzed(flag) && !reader.IsHistory() { h.mu.rateMap.clear(table.PhysicalID, histID, true) } else if idx != nil { errorRate = idx.ErrorRate @@ -1248,15 +1227,15 @@ func (h *Handle) indexStatsFromStorage(reader *statsReader, row chunk.Row, table continue } if idx == nil || idx.LastUpdateVersion < histVer { - hg, err := h.histogramFromStorage(reader, table.PhysicalID, histID, types.NewFieldType(mysql.TypeBlob), distinct, 1, histVer, nullCount, 0, 0) + hg, err := statistics.HistogramFromStorage(reader, table.PhysicalID, histID, types.NewFieldType(mysql.TypeBlob), distinct, 1, histVer, nullCount, 0, 0) if err != nil { return errors.Trace(err) } - cms, topN, err := h.cmSketchAndTopNFromStorage(reader, table.PhysicalID, 1, idxInfo.ID) + cms, topN, err := statistics.CMSketchAndTopNFromStorage(reader, table.PhysicalID, 1, idxInfo.ID) if err != nil { return errors.Trace(err) } - fmSketch, err := h.fmSketchFromStorage(reader, table.PhysicalID, 1, histID) + fmSketch, err := statistics.FMSketchFromStorage(reader, table.PhysicalID, 1, histID) if err != nil { return errors.Trace(err) } @@ -1286,7 +1265,7 @@ func (h *Handle) indexStatsFromStorage(reader *statsReader, row chunk.Row, table return nil } -func (h *Handle) columnStatsFromStorage(reader *statsReader, row chunk.Row, table *statistics.Table, tableInfo *model.TableInfo, loadAll bool) error { +func (h *Handle) columnStatsFromStorage(reader *statistics.StatsReader, row chunk.Row, table *statistics.Table, tableInfo *model.TableInfo, loadAll bool) error { histID := row.GetInt64(2) distinct := row.GetInt64(3) histVer := row.GetUint64(4) @@ -1298,7 +1277,7 @@ func (h *Handle) columnStatsFromStorage(reader *statsReader, row chunk.Row, tabl col := table.Columns[histID] errorRate := statistics.ErrorRate{} flag := row.GetInt64(8) - if statistics.IsAnalyzed(flag) && !reader.isHistory() { + if statistics.IsAnalyzed(flag) && !reader.IsHistory() { h.mu.rateMap.clear(table.PhysicalID, histID, false) } else if col != nil { errorRate = col.ErrorRate @@ -1318,7 +1297,7 @@ func (h *Handle) columnStatsFromStorage(reader *statsReader, row chunk.Row, tabl (col == nil || !col.IsStatsInitialized() && col.LastUpdateVersion < histVer) && !loadAll if notNeedLoad { - count, err := h.columnCountFromStorage(reader, table.PhysicalID, histID, statsVer) + count, err := statistics.ColumnCountFromStorage(reader, table.PhysicalID, histID, statsVer) if err != nil { return errors.Trace(err) } @@ -1342,11 +1321,11 @@ func (h *Handle) columnStatsFromStorage(reader *statsReader, row chunk.Row, tabl break } if col == nil || col.LastUpdateVersion < histVer || loadAll { - hg, err := h.histogramFromStorage(reader, table.PhysicalID, histID, &colInfo.FieldType, distinct, 0, histVer, nullCount, totColSize, correlation) + hg, err := statistics.HistogramFromStorage(reader, table.PhysicalID, histID, &colInfo.FieldType, distinct, 0, histVer, nullCount, totColSize, correlation) if err != nil { return errors.Trace(err) } - cms, topN, err := h.cmSketchAndTopNFromStorage(reader, table.PhysicalID, 0, colInfo.ID) + cms, topN, err := statistics.CMSketchAndTopNFromStorage(reader, table.PhysicalID, 0, colInfo.ID) if err != nil { return errors.Trace(err) } @@ -1354,7 +1333,7 @@ func (h *Handle) columnStatsFromStorage(reader *statsReader, row chunk.Row, tabl if loadAll { // FMSketch is only used when merging partition stats into global stats. When merging partition stats into global stats, // we load all the statistics, i.e., loadAll is true. - fmSketch, err = h.fmSketchFromStorage(reader, table.PhysicalID, 0, histID) + fmSketch, err = statistics.FMSketchFromStorage(reader, table.PhysicalID, 0, histID) if err != nil { return errors.Trace(err) } @@ -1411,97 +1390,28 @@ func (h *Handle) TableStatsFromStorage(tableInfo *model.TableInfo, physicalID in err = err1 } }() - table, ok := h.statsCache.Load().(statsCache).Get(physicalID) - // If table stats is pseudo, we also need to copy it, since we will use the column stats when - // the average error rate of it is small. - if !ok || snapshot > 0 { - histColl := statistics.HistColl{ - PhysicalID: physicalID, - HavePhysicalID: true, - Columns: make(map[int64]*statistics.Column, len(tableInfo.Columns)), - Indices: make(map[int64]*statistics.Index, len(tableInfo.Indices)), - } - table = &statistics.Table{ - HistColl: histColl, - } - } else { - // We copy it before writing to avoid race. - table = table.Copy() + statsTbl, ok := h.statsCache.Load().(statsCache).Get(physicalID) + if !ok { + statsTbl = nil } - table.Pseudo = false - - rows, _, err := reader.read("select modify_count, count from mysql.stats_meta where table_id = %?", physicalID) - if err != nil || len(rows) == 0 { + statsTbl, err = statistics.TableStatsFromStorage(reader, tableInfo, physicalID, loadAll, h.Lease(), statsTbl) + if err != nil { return nil, err } - table.ModifyCount = rows[0].GetInt64(0) - table.Count = rows[0].GetInt64(1) - - rows, _, err = reader.read("select table_id, is_index, hist_id, distinct_count, version, null_count, tot_col_size, stats_ver, flag, correlation, last_analyze_pos from mysql.stats_histograms where table_id = %?", physicalID) - // Check deleted table. - if err != nil || len(rows) == 0 { - return nil, nil + if reader.IsHistory() || statsTbl == nil { + return statsTbl, nil } - for _, row := range rows { - if row.GetInt64(1) > 0 { - err = h.indexStatsFromStorage(reader, row, table, tableInfo) - } else { - err = h.columnStatsFromStorage(reader, row, table, tableInfo, loadAll) - } - if err != nil { - return nil, err + for histID, idx := range statsTbl.Indices { + if statistics.IsAnalyzed(idx.Flag) { + h.mu.rateMap.clear(physicalID, histID, true) } } - return h.extendedStatsFromStorage(reader, table, physicalID, loadAll) -} - -func (h *Handle) extendedStatsFromStorage(reader *statsReader, table *statistics.Table, physicalID int64, loadAll bool) (*statistics.Table, error) { - failpoint.Inject("injectExtStatsLoadErr", func() { - failpoint.Return(nil, errors.New("gofail extendedStatsFromStorage error")) - }) - lastVersion := uint64(0) - if table.ExtendedStats != nil && !loadAll { - lastVersion = table.ExtendedStats.LastUpdateVersion - } else { - table.ExtendedStats = statistics.NewExtendedStatsColl() - } - rows, _, err := reader.read("select name, status, type, column_ids, stats, version from mysql.stats_extended where table_id = %? and status in (%?, %?, %?) and version > %?", physicalID, StatsStatusInited, StatsStatusAnalyzed, StatsStatusDeleted, lastVersion) - if err != nil || len(rows) == 0 { - return table, nil - } - for _, row := range rows { - lastVersion = mathutil.Max(lastVersion, row.GetUint64(5)) - name := row.GetString(0) - status := uint8(row.GetInt64(1)) - if status == StatsStatusDeleted || status == StatsStatusInited { - delete(table.ExtendedStats.Stats, name) - } else { - item := &statistics.ExtendedStatsItem{ - Tp: uint8(row.GetInt64(2)), - } - colIDs := row.GetString(3) - err := json.Unmarshal([]byte(colIDs), &item.ColIDs) - if err != nil { - logutil.BgLogger().Error("[stats] decode column IDs failed", zap.String("column_ids", colIDs), zap.Error(err)) - return nil, err - } - statsStr := row.GetString(4) - if item.Tp == ast.StatsTypeCardinality || item.Tp == ast.StatsTypeCorrelation { - if statsStr != "" { - item.ScalarVals, err = strconv.ParseFloat(statsStr, 64) - if err != nil { - logutil.BgLogger().Error("[stats] parse scalar stats failed", zap.String("stats", statsStr), zap.Error(err)) - return nil, err - } - } - } else { - item.StringVals = statsStr - } - table.ExtendedStats.Stats[name] = item + for histID, col := range statsTbl.Columns { + if statistics.IsAnalyzed(col.Flag) { + h.mu.rateMap.clear(physicalID, histID, false) } } - table.ExtendedStats.LastUpdateVersion = lastVersion - return table, nil + return statsTbl, nil } // StatsMetaCountAndModifyCount reads count and modify_count for the given table from mysql.stats_meta. @@ -1516,7 +1426,7 @@ func (h *Handle) StatsMetaCountAndModifyCount(tableID int64) (int64, int64, erro err = err1 } }() - rows, _, err := reader.read("select count, modify_count from mysql.stats_meta where table_id = %?", tableID) + rows, _, err := reader.Read("select count, modify_count from mysql.stats_meta where table_id = %?", tableID) if err != nil { return 0, 0, err } @@ -1608,27 +1518,26 @@ func saveBucketsToStorage(ctx context.Context, exec sqlexec.SQLExecutor, sc *stm } // SaveTableStatsToStorage saves the stats of a table to storage. -func (h *Handle) SaveTableStatsToStorage(results *statistics.AnalyzeResults, analyzeSnapshot bool) (err error) { - tableID := results.TableID.GetStatisticsID() - statsVer := uint64(0) - defer func() { - if err == nil && statsVer != 0 { - err = h.recordHistoricalStatsMeta(tableID, statsVer) - } - }() +func (h *Handle) SaveTableStatsToStorage(results *statistics.AnalyzeResults, analyzeSnapshot bool, source string) (err error) { h.mu.Lock() defer h.mu.Unlock() - return SaveTableStatsToStorage(h.mu.ctx, results, analyzeSnapshot) + return SaveTableStatsToStorage(h.mu.ctx, results, analyzeSnapshot, source) } // SaveTableStatsToStorage saves the stats of a table to storage. -func SaveTableStatsToStorage(sctx sessionctx.Context, results *statistics.AnalyzeResults, analyzeSnapshot bool) (err error) { +func SaveTableStatsToStorage(sctx sessionctx.Context, results *statistics.AnalyzeResults, analyzeSnapshot bool, source string) (err error) { needDumpFMS := results.TableID.IsPartitionTable() tableID := results.TableID.GetStatisticsID() statsVer := uint64(0) defer func() { if err == nil && statsVer != 0 { - err = recordHistoricalStatsMeta(sctx, tableID, statsVer) + if err1 := recordHistoricalStatsMeta(sctx, tableID, statsVer, source); err1 != nil { + logutil.BgLogger().Error("record historical stats meta failed", + zap.Int64("table-id", tableID), + zap.Uint64("version", statsVer), + zap.String("source", source), + zap.Error(err1)) + } } }() ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) @@ -1657,6 +1566,10 @@ func SaveTableStatsToStorage(sctx sessionctx.Context, results *statistics.Analyz if err != nil { return err } + err = rs.Close() + if err != nil { + return err + } var curCnt, curModifyCnt int64 if len(rows) > 0 { snapshot := rows[0].GetUint64(0) @@ -1787,7 +1700,7 @@ func SaveTableStatsToStorage(sctx sessionctx.Context, results *statistics.Analyz case ast.StatsTypeDependency: statsStr = item.StringVals } - if _, err = exec.ExecuteInternal(ctx, "replace into mysql.stats_extended values (%?, %?, %?, %?, %?, %?, %?)", name, item.Tp, tableID, strColIDs, statsStr, version, StatsStatusAnalyzed); err != nil { + if _, err = exec.ExecuteInternal(ctx, "replace into mysql.stats_extended values (%?, %?, %?, %?, %?, %?, %?)", name, item.Tp, tableID, strColIDs, statsStr, version, statistics.ExtendedStatsAnalyzed); err != nil { return err } } @@ -1798,11 +1711,12 @@ func SaveTableStatsToStorage(sctx sessionctx.Context, results *statistics.Analyz // If count is negative, both count and modify count would not be used and not be written to the table. Unless, corresponding // fields in the stats_meta table will be updated. // TODO: refactor to reduce the number of parameters -func (h *Handle) SaveStatsToStorage(tableID int64, count, modifyCount int64, isIndex int, hg *statistics.Histogram, cms *statistics.CMSketch, topN *statistics.TopN, statsVersion int, isAnalyzed int64, updateAnalyzeTime bool) (err error) { +func (h *Handle) SaveStatsToStorage(tableID int64, count, modifyCount int64, isIndex int, hg *statistics.Histogram, + cms *statistics.CMSketch, topN *statistics.TopN, statsVersion int, isAnalyzed int64, updateAnalyzeTime bool, source string) (err error) { statsVer := uint64(0) defer func() { if err == nil && statsVer != 0 { - err = h.recordHistoricalStatsMeta(tableID, statsVer) + h.recordHistoricalStatsMeta(tableID, statsVer, source) } }() h.mu.Lock() @@ -1877,11 +1791,11 @@ func (h *Handle) SaveStatsToStorage(tableID int64, count, modifyCount int64, isI } // SaveMetaToStorage will save stats_meta to storage. -func (h *Handle) SaveMetaToStorage(tableID, count, modifyCount int64) (err error) { +func (h *Handle) SaveMetaToStorage(tableID, count, modifyCount int64, source string) (err error) { statsVer := uint64(0) defer func() { if err == nil && statsVer != 0 { - err = h.recordHistoricalStatsMeta(tableID, statsVer) + h.recordHistoricalStatsMeta(tableID, statsVer, source) } }() h.mu.Lock() @@ -1905,85 +1819,6 @@ func (h *Handle) SaveMetaToStorage(tableID, count, modifyCount int64) (err error return err } -func (h *Handle) histogramFromStorage(reader *statsReader, tableID int64, colID int64, tp *types.FieldType, distinct int64, isIndex int, ver uint64, nullCount int64, totColSize int64, corr float64) (_ *statistics.Histogram, err error) { - rows, fields, err := reader.read("select count, repeats, lower_bound, upper_bound, ndv from mysql.stats_buckets where table_id = %? and is_index = %? and hist_id = %? order by bucket_id", tableID, isIndex, colID) - if err != nil { - return nil, errors.Trace(err) - } - bucketSize := len(rows) - hg := statistics.NewHistogram(colID, distinct, nullCount, ver, tp, bucketSize, totColSize) - hg.Correlation = corr - totalCount := int64(0) - for i := 0; i < bucketSize; i++ { - count := rows[i].GetInt64(0) - repeats := rows[i].GetInt64(1) - var upperBound, lowerBound types.Datum - if isIndex == 1 { - lowerBound = rows[i].GetDatum(2, &fields[2].Column.FieldType) - upperBound = rows[i].GetDatum(3, &fields[3].Column.FieldType) - } else { - sc := &stmtctx.StatementContext{TimeZone: time.UTC} - d := rows[i].GetDatum(2, &fields[2].Column.FieldType) - // For new collation data, when storing the bounds of the histogram, we store the collate key instead of the - // original value. - // But there's additional conversion logic for new collation data, and the collate key might be longer than - // the FieldType.flen. - // If we use the original FieldType here, there might be errors like "Invalid utf8mb4 character string" - // or "Data too long". - // So we change it to TypeBlob to bypass those logics here. - if tp.EvalType() == types.ETString && tp.GetType() != mysql.TypeEnum && tp.GetType() != mysql.TypeSet { - tp = types.NewFieldType(mysql.TypeBlob) - } - lowerBound, err = d.ConvertTo(sc, tp) - if err != nil { - return nil, errors.Trace(err) - } - d = rows[i].GetDatum(3, &fields[3].Column.FieldType) - upperBound, err = d.ConvertTo(sc, tp) - if err != nil { - return nil, errors.Trace(err) - } - } - totalCount += count - hg.AppendBucketWithNDV(&lowerBound, &upperBound, totalCount, repeats, rows[i].GetInt64(4)) - } - hg.PreCalculateScalar() - return hg, nil -} - -func (h *Handle) columnCountFromStorage(reader *statsReader, tableID, colID, statsVer int64) (int64, error) { - count := int64(0) - rows, _, err := reader.read("select sum(count) from mysql.stats_buckets where table_id = %? and is_index = 0 and hist_id = %?", tableID, colID) - if err != nil { - return 0, errors.Trace(err) - } - // If there doesn't exist any buckets, the SQL will return NULL. So we only use the result if it's not NULL. - if !rows[0].IsNull(0) { - count, err = rows[0].GetMyDecimal(0).ToInt() - if err != nil { - return 0, errors.Trace(err) - } - } - - if statsVer >= statistics.Version2 { - // Before stats ver 2, histogram represents all data in this column. - // In stats ver 2, histogram + TopN represent all data in this column. - // So we need to add TopN total count here. - rows, _, err = reader.read("select sum(count) from mysql.stats_top_n where table_id = %? and is_index = 0 and hist_id = %?", tableID, colID) - if err != nil { - return 0, errors.Trace(err) - } - if !rows[0].IsNull(0) { - topNCount, err := rows[0].GetMyDecimal(0).ToInt() - if err != nil { - return 0, errors.Trace(err) - } - count += topNCount - } - } - return count, err -} - func (h *Handle) statsMetaByTableIDFromStorage(tableID int64, snapshot uint64) (version uint64, modifyCount, count int64, err error) { ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) var rows []chunk.Row @@ -2004,26 +1839,7 @@ func (h *Handle) statsMetaByTableIDFromStorage(tableID int64, snapshot uint64) ( return } -// statsReader is used for simplify code that needs to read system tables in different sqls -// but requires the same transactions. -type statsReader struct { - ctx sqlexec.RestrictedSQLExecutor - snapshot uint64 -} - -func (sr *statsReader) read(sql string, args ...interface{}) (rows []chunk.Row, fields []*ast.ResultField, err error) { - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) - if sr.snapshot > 0 { - return sr.ctx.ExecRestrictedSQL(ctx, []sqlexec.OptionFuncAlias{sqlexec.ExecOptionUseSessionPool, sqlexec.ExecOptionWithSnapshot(sr.snapshot)}, sql, args...) - } - return sr.ctx.ExecRestrictedSQL(ctx, []sqlexec.OptionFuncAlias{sqlexec.ExecOptionUseCurSession}, sql, args...) -} - -func (sr *statsReader) isHistory() bool { - return sr.snapshot > 0 -} - -func (h *Handle) getGlobalStatsReader(snapshot uint64) (reader *statsReader, err error) { +func (h *Handle) getGlobalStatsReader(snapshot uint64) (reader *statistics.StatsReader, err error) { h.mu.Lock() defer func() { if r := recover(); r != nil { @@ -2033,61 +1849,20 @@ func (h *Handle) getGlobalStatsReader(snapshot uint64) (reader *statsReader, err h.mu.Unlock() } }() - return h.getStatsReader(snapshot, h.mu.ctx.(sqlexec.RestrictedSQLExecutor)) + return statistics.GetStatsReader(snapshot, h.mu.ctx.(sqlexec.RestrictedSQLExecutor)) } -func (h *Handle) releaseGlobalStatsReader(reader *statsReader) error { +func (h *Handle) releaseGlobalStatsReader(reader *statistics.StatsReader) error { defer h.mu.Unlock() - return h.releaseStatsReader(reader, h.mu.ctx.(sqlexec.RestrictedSQLExecutor)) -} - -func (h *Handle) getStatsReader(snapshot uint64, exec sqlexec.RestrictedSQLExecutor) (reader *statsReader, err error) { - failpoint.Inject("mockGetStatsReaderFail", func(val failpoint.Value) { - if val.(bool) { - failpoint.Return(nil, errors.New("gofail genStatsReader error")) - } - }) - if snapshot > 0 { - return &statsReader{ctx: exec, snapshot: snapshot}, nil - } - defer func() { - if r := recover(); r != nil { - err = fmt.Errorf("getStatsReader panic %v", r) - } - }() - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) - failpoint.Inject("mockGetStatsReaderPanic", nil) - _, err = exec.(sqlexec.SQLExecutor).ExecuteInternal(ctx, "begin") - if err != nil { - return nil, err - } - return &statsReader{ctx: exec}, nil + return reader.Close() } -func (h *Handle) releaseStatsReader(reader *statsReader, exec sqlexec.RestrictedSQLExecutor) error { - if reader.snapshot > 0 { - return nil - } - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) - _, err := exec.(sqlexec.SQLExecutor).ExecuteInternal(ctx, "commit") - return err -} - -const ( - // StatsStatusInited is the status for extended stats which are just registered but have not been analyzed yet. - StatsStatusInited uint8 = iota - // StatsStatusAnalyzed is the status for extended stats which have been collected in analyze. - StatsStatusAnalyzed - // StatsStatusDeleted is the status for extended stats which were dropped. These "deleted" records would be removed from storage by GCStats(). - StatsStatusDeleted -) - // InsertExtendedStats inserts a record into mysql.stats_extended and update version in mysql.stats_meta. func (h *Handle) InsertExtendedStats(statsName string, colIDs []int64, tp int, tableID int64, ifNotExists bool) (err error) { statsVer := uint64(0) defer func() { if err == nil && statsVer != 0 { - err = h.recordHistoricalStatsMeta(tableID, statsVer) + h.recordHistoricalStatsMeta(tableID, statsVer, StatsMetaHistorySourceExtendedStats) } }() slices.Sort(colIDs) @@ -2108,7 +1883,7 @@ func (h *Handle) InsertExtendedStats(statsName string, colIDs []int64, tp int, t err = finishTransaction(ctx, exec, err) }() // No need to use `exec.ExecuteInternal` since we have acquired the lock. - rows, _, err := h.execRestrictedSQL(ctx, "SELECT name, type, column_ids FROM mysql.stats_extended WHERE table_id = %? and status in (%?, %?)", tableID, StatsStatusInited, StatsStatusAnalyzed) + rows, _, err := h.execRestrictedSQL(ctx, "SELECT name, type, column_ids FROM mysql.stats_extended WHERE table_id = %? and status in (%?, %?)", tableID, statistics.ExtendedStatsInited, statistics.ExtendedStatsAnalyzed) if err != nil { return errors.Trace(err) } @@ -2147,7 +1922,7 @@ func (h *Handle) InsertExtendedStats(statsName string, colIDs []int64, tp int, t // next `Update()` to remove the cached item then. h.removeExtendedStatsItem(tableID, statsName) const sql = "INSERT INTO mysql.stats_extended(name, type, table_id, column_ids, version, status) VALUES (%?, %?, %?, %?, %?, %?)" - if _, err = exec.ExecuteInternal(ctx, sql, statsName, tp, tableID, strColIDs, version, StatsStatusInited); err != nil { + if _, err = exec.ExecuteInternal(ctx, sql, statsName, tp, tableID, strColIDs, version, statistics.ExtendedStatsInited); err != nil { return err } return @@ -2158,11 +1933,11 @@ func (h *Handle) MarkExtendedStatsDeleted(statsName string, tableID int64, ifExi statsVer := uint64(0) defer func() { if err == nil && statsVer != 0 { - err = h.recordHistoricalStatsMeta(tableID, statsVer) + h.recordHistoricalStatsMeta(tableID, statsVer, StatsMetaHistorySourceExtendedStats) } }() ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) - rows, _, err := h.execRestrictedSQL(ctx, "SELECT name FROM mysql.stats_extended WHERE name = %? and table_id = %? and status in (%?, %?)", statsName, tableID, StatsStatusInited, StatsStatusAnalyzed) + rows, _, err := h.execRestrictedSQL(ctx, "SELECT name FROM mysql.stats_extended WHERE name = %? and table_id = %? and status in (%?, %?)", statsName, tableID, statistics.ExtendedStatsInited, statistics.ExtendedStatsAnalyzed) if err != nil { return errors.Trace(err) } @@ -2199,7 +1974,7 @@ func (h *Handle) MarkExtendedStatsDeleted(statsName string, tableID int64, ifExi return err } statsVer = version - if _, err = exec.ExecuteInternal(ctx, "UPDATE mysql.stats_extended SET version = %?, status = %? WHERE name = %? and table_id = %?", version, StatsStatusDeleted, statsName, tableID); err != nil { + if _, err = exec.ExecuteInternal(ctx, "UPDATE mysql.stats_extended SET version = %?, status = %? WHERE name = %? and table_id = %?", version, statistics.ExtendedStatsDeleted, statsName, tableID); err != nil { return err } return nil @@ -2243,7 +2018,7 @@ func (h *Handle) ReloadExtendedStatistics() error { oldCache := h.statsCache.Load().(statsCache) tables := make([]*statistics.Table, 0, oldCache.Len()) for physicalID, tbl := range oldCache.Map() { - t, err := h.extendedStatsFromStorage(reader, tbl.Copy(), physicalID, true) + t, err := statistics.ExtendedStatsFromStorage(reader, tbl.Copy(), physicalID, true) if err != nil { return err } @@ -2260,7 +2035,7 @@ func (h *Handle) ReloadExtendedStatistics() error { func (h *Handle) BuildExtendedStats(tableID int64, cols []*model.ColumnInfo, collectors []*statistics.SampleCollector) (*statistics.ExtendedStatsColl, error) { ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) const sql = "SELECT name, type, column_ids FROM mysql.stats_extended WHERE table_id = %? and status in (%?, %?)" - rows, _, err := h.execRestrictedSQL(ctx, sql, tableID, StatsStatusAnalyzed, StatsStatusInited) + rows, _, err := h.execRestrictedSQL(ctx, sql, tableID, statistics.ExtendedStatsAnalyzed, statistics.ExtendedStatsInited) if err != nil { return nil, errors.Trace(err) } @@ -2371,7 +2146,7 @@ func (h *Handle) SaveExtendedStatsToStorage(tableID int64, extStats *statistics. statsVer := uint64(0) defer func() { if err == nil && statsVer != 0 { - err = h.recordHistoricalStatsMeta(tableID, statsVer) + h.recordHistoricalStatsMeta(tableID, statsVer, StatsMetaHistorySourceExtendedStats) } }() if extStats == nil || len(extStats.Stats) == 0 { @@ -2407,7 +2182,7 @@ func (h *Handle) SaveExtendedStatsToStorage(tableID int64, extStats *statistics. statsStr = item.StringVals } // If isLoad is true, it's INSERT; otherwise, it's UPDATE. - if _, err := exec.ExecuteInternal(ctx, "replace into mysql.stats_extended values (%?, %?, %?, %?, %?, %?, %?)", name, item.Tp, tableID, strColIDs, statsStr, version, StatsStatusAnalyzed); err != nil { + if _, err := exec.ExecuteInternal(ctx, "replace into mysql.stats_extended values (%?, %?, %?, %?, %?, %?, %?)", name, item.Tp, tableID, strColIDs, statsStr, version, statistics.ExtendedStatsAnalyzed); err != nil { return err } } @@ -2524,7 +2299,7 @@ func (h *Handle) LoadColumnStatsUsage(loc *time.Location) (map[model.TableItemID func (h *Handle) CollectColumnsInExtendedStats(tableID int64) ([]int64, error) { ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) const sql = "SELECT name, type, column_ids FROM mysql.stats_extended WHERE table_id = %? and status in (%?, %?)" - rows, _, err := h.execRestrictedSQL(ctx, sql, tableID, StatsStatusAnalyzed, StatsStatusInited) + rows, _, err := h.execRestrictedSQL(ctx, sql, tableID, statistics.ExtendedStatsAnalyzed, statistics.ExtendedStatsInited) if err != nil { return nil, errors.Trace(err) } @@ -2579,17 +2354,27 @@ func (h *Handle) GetPredicateColumns(tableID int64) ([]int64, error) { const maxColumnSize = 6 << 20 // RecordHistoricalStatsToStorage records the given table's stats data to mysql.stats_history -func (h *Handle) RecordHistoricalStatsToStorage(dbName string, tableInfo *model.TableInfo) (uint64, error) { +func (h *Handle) RecordHistoricalStatsToStorage(dbName string, tableInfo *model.TableInfo, physicalID int64, isPartition bool) (uint64, error) { ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) - js, err := h.DumpStatsToJSON(dbName, tableInfo, nil, true) + var js *JSONTable + var err error + if isPartition { + js, err = h.tableStatsToJSON(dbName, tableInfo, physicalID, 0) + } else { + js, err = h.DumpStatsToJSON(dbName, tableInfo, nil, true) + } if err != nil { return 0, errors.Trace(err) } version := uint64(0) - for _, value := range js.Columns { - version = uint64(*value.StatsVer) - if version != 0 { - break + if len(js.Partitions) == 0 { + version = js.Version + } else { + for _, p := range js.Partitions { + version = p.Version + if version != 0 { + break + } } } blocks, err := JSONTableToBlocks(js, maxColumnSize) @@ -2610,7 +2395,7 @@ func (h *Handle) RecordHistoricalStatsToStorage(dbName string, tableInfo *model. const sql = "INSERT INTO mysql.stats_history(table_id, stats_data, seq_no, version, create_time) VALUES (%?, %?, %?, %?, %?)" for i := 0; i < len(blocks); i++ { - if _, err := exec.ExecuteInternal(ctx, sql, tableInfo.ID, blocks[i], i, version, ts); err != nil { + if _, err := exec.ExecuteInternal(ctx, sql, physicalID, blocks[i], i, version, ts); err != nil { return version, errors.Trace(err) } } @@ -2632,50 +2417,6 @@ func (h *Handle) CheckHistoricalStatsEnable() (enable bool, err error) { return checkHistoricalStatsEnable(h.mu.ctx) } -func recordHistoricalStatsMeta(sctx sessionctx.Context, tableID int64, version uint64) error { - if tableID == 0 || version == 0 { - return errors.Errorf("tableID %d, version %d are invalid", tableID, version) - } - historicalStatsEnabled, err := checkHistoricalStatsEnable(sctx) - if err != nil { - return errors.Errorf("check tidb_enable_historical_stats failed: %v", err) - } - if !historicalStatsEnabled { - return nil - } - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) - exec := sctx.(sqlexec.SQLExecutor) - rexec := sctx.(sqlexec.RestrictedSQLExecutor) - rows, _, err := rexec.ExecRestrictedSQL(ctx, []sqlexec.OptionFuncAlias{sqlexec.ExecOptionUseCurSession}, "select modify_count, count from mysql.stats_meta where table_id = %? and version = %?", tableID, version) - if err != nil { - return errors.Trace(err) - } - if len(rows) == 0 { - return errors.New("no historical meta stats can be recorded") - } - modifyCount, count := rows[0].GetInt64(0), rows[0].GetInt64(1) - - _, err = exec.ExecuteInternal(ctx, "begin pessimistic") - if err != nil { - return errors.Trace(err) - } - defer func() { - err = finishTransaction(ctx, exec, err) - }() - - const sql = "REPLACE INTO mysql.stats_meta_history(table_id, modify_count, count, version, create_time) VALUES (%?, %?, %?, %?, NOW())" - if _, err := exec.ExecuteInternal(ctx, sql, tableID, modifyCount, count, version); err != nil { - return errors.Trace(err) - } - return nil -} - -func (h *Handle) recordHistoricalStatsMeta(tableID int64, version uint64) error { - h.mu.Lock() - defer h.mu.Unlock() - return recordHistoricalStatsMeta(h.mu.ctx, tableID, version) -} - // InsertAnalyzeJob inserts analyze job into mysql.analyze_jobs and gets job ID for further updating job. func (h *Handle) InsertAnalyzeJob(job *statistics.AnalyzeJob, instance string, procID uint64) error { h.mu.Lock() diff --git a/statistics/handle/handle_hist.go b/statistics/handle/handle_hist.go index 4d0128095e071..6c49afe736afe 100644 --- a/statistics/handle/handle_hist.go +++ b/statistics/handle/handle_hist.go @@ -75,15 +75,23 @@ func (h *Handle) SendLoadRequests(sc *stmtctx.StatementContext, neededHistItems sc.StatsLoad.Timeout = timeout sc.StatsLoad.NeededItems = remainedItems sc.StatsLoad.ResultCh = make(chan stmtctx.StatsLoadResult, len(remainedItems)) + tasks := make([]*NeededItemTask, 0) for _, item := range remainedItems { task := &NeededItemTask{ TableItemID: item, ToTimeout: time.Now().Local().Add(timeout), ResultCh: sc.StatsLoad.ResultCh, } - err := h.AppendNeededItem(task, timeout) - if err != nil { - return err + tasks = append(tasks, task) + } + timer := time.NewTimer(timeout) + defer timer.Stop() + for _, task := range tasks { + select { + case h.StatsLoad.NeededItemsCh <- task: + continue + case <-timer.C: + return errors.New("sync load stats channel is full and timeout sending task to channel") } } sc.StatsLoad.LoadStartTime = time.Now() @@ -91,9 +99,9 @@ func (h *Handle) SendLoadRequests(sc *stmtctx.StatementContext, neededHistItems } // SyncWaitStatsLoad sync waits loading of neededColumns and return false if timeout -func (h *Handle) SyncWaitStatsLoad(sc *stmtctx.StatementContext) bool { +func (h *Handle) SyncWaitStatsLoad(sc *stmtctx.StatementContext) error { if len(sc.StatsLoad.NeededItems) <= 0 { - return true + return nil } var errorMsgs []string defer func() { @@ -120,15 +128,14 @@ func (h *Handle) SyncWaitStatsLoad(sc *stmtctx.StatementContext) bool { delete(resultCheckMap, result.Item) if len(resultCheckMap) == 0 { metrics.SyncLoadHistogram.Observe(float64(time.Since(sc.StatsLoad.LoadStartTime).Milliseconds())) - return true + return nil } } else { - return false + return errors.New("sync load stats channel closed unexpectedly") } case <-timer.C: metrics.SyncLoadTimeoutCounter.Inc() - logutil.BgLogger().Warn("SyncWaitStatsLoad timeout") - return false + return errors.New("sync load stats timeout") } } } @@ -154,27 +161,34 @@ func (h *Handle) removeHistLoadedColumns(neededItems []model.TableItemID) []mode return remainedItems } -// AppendNeededItem appends needed columns/indices to ch, if exists, do not append the duplicated one. +// AppendNeededItem appends needed columns/indices to ch, it is only used for test func (h *Handle) AppendNeededItem(task *NeededItemTask, timeout time.Duration) error { - return h.writeToChanWithTimeout(h.StatsLoad.NeededItemsCh, task, timeout) + timer := time.NewTimer(timeout) + defer timer.Stop() + select { + case h.StatsLoad.NeededItemsCh <- task: + case <-timer.C: + return errors.New("Channel is full and timeout writing to channel") + } + return nil } var errExit = errors.New("Stop loading since domain is closed") // StatsReaderContext exported for testing type StatsReaderContext struct { - reader *statsReader + reader *statistics.StatsReader createdTime time.Time } // SubLoadWorker loads hist data for each column -func (h *Handle) SubLoadWorker(ctx sessionctx.Context, exit chan struct{}, exitWg *util.WaitGroupWrapper) { +func (h *Handle) SubLoadWorker(ctx sessionctx.Context, exit chan struct{}, exitWg *util.WaitGroupEnhancedWrapper) { readerCtx := &StatsReaderContext{} defer func() { exitWg.Done() logutil.BgLogger().Info("SubLoadWorker exited.") if readerCtx.reader != nil { - err := h.releaseStatsReader(readerCtx.reader, ctx.(sqlexec.RestrictedSQLExecutor)) + err := readerCtx.reader.Close() if err != nil { logutil.BgLogger().Error("Fail to release stats loader: ", zap.Error(err)) } @@ -281,13 +295,13 @@ func (h *Handle) handleOneItemTask(task *NeededItemTask, readerCtx *StatsReaderC func (h *Handle) loadFreshStatsReader(readerCtx *StatsReaderContext, ctx sqlexec.RestrictedSQLExecutor) { if readerCtx.reader == nil || readerCtx.createdTime.Add(h.Lease()).Before(time.Now()) { if readerCtx.reader != nil { - err := h.releaseStatsReader(readerCtx.reader, ctx) + err := readerCtx.reader.Close() if err != nil { logutil.BgLogger().Warn("Fail to release stats loader: ", zap.Error(err)) } } for { - newReader, err := h.getStatsReader(0, ctx) + newReader, err := statistics.GetStatsReader(0, ctx) if err != nil { logutil.BgLogger().Error("Fail to new stats loader, retry after a while.", zap.Error(err)) time.Sleep(h.Lease() / 10) @@ -303,7 +317,7 @@ func (h *Handle) loadFreshStatsReader(readerCtx *StatsReaderContext, ctx sqlexec } // readStatsForOneItem reads hist for one column/index, TODO load data via kv-get asynchronously -func (h *Handle) readStatsForOneItem(item model.TableItemID, w *statsWrapper, reader *statsReader) (*statsWrapper, error) { +func (h *Handle) readStatsForOneItem(item model.TableItemID, w *statsWrapper, reader *statistics.StatsReader) (*statsWrapper, error) { failpoint.Inject("mockReadStatsForOnePanic", nil) failpoint.Inject("mockReadStatsForOneFail", func(val failpoint.Value) { if val.(bool) { @@ -320,30 +334,30 @@ func (h *Handle) readStatsForOneItem(item model.TableItemID, w *statsWrapper, re isIndexFlag = 1 } if item.IsIndex { - hg, err = h.histogramFromStorage(reader, item.TableID, item.ID, types.NewFieldType(mysql.TypeBlob), index.Histogram.NDV, int(isIndexFlag), index.LastUpdateVersion, index.NullCount, index.TotColSize, index.Correlation) + hg, err = statistics.HistogramFromStorage(reader, item.TableID, item.ID, types.NewFieldType(mysql.TypeBlob), index.Histogram.NDV, int(isIndexFlag), index.LastUpdateVersion, index.NullCount, index.TotColSize, index.Correlation) if err != nil { return nil, errors.Trace(err) } } else { - hg, err = h.histogramFromStorage(reader, item.TableID, item.ID, &c.Info.FieldType, c.Histogram.NDV, int(isIndexFlag), c.LastUpdateVersion, c.NullCount, c.TotColSize, c.Correlation) + hg, err = statistics.HistogramFromStorage(reader, item.TableID, item.ID, &c.Info.FieldType, c.Histogram.NDV, int(isIndexFlag), c.LastUpdateVersion, c.NullCount, c.TotColSize, c.Correlation) if err != nil { return nil, errors.Trace(err) } } var cms *statistics.CMSketch var topN *statistics.TopN - cms, topN, err = h.cmSketchAndTopNFromStorage(reader, item.TableID, isIndexFlag, item.ID) + cms, topN, err = statistics.CMSketchAndTopNFromStorage(reader, item.TableID, isIndexFlag, item.ID) if err != nil { return nil, errors.Trace(err) } var fms *statistics.FMSketch if loadFMSketch { - fms, err = h.fmSketchFromStorage(reader, item.TableID, isIndexFlag, item.ID) + fms, err = statistics.FMSketchFromStorage(reader, item.TableID, isIndexFlag, item.ID) if err != nil { return nil, errors.Trace(err) } } - rows, _, err := reader.read("select stats_ver from mysql.stats_histograms where table_id = %? and hist_id = %? and is_index = %?", item.TableID, item.ID, int(isIndexFlag)) + rows, _, err := reader.Read("select stats_ver from mysql.stats_histograms where table_id = %? and hist_id = %? and is_index = %?", item.TableID, item.ID, int(isIndexFlag)) if err != nil { return nil, errors.Trace(err) } diff --git a/statistics/handle/handle_hist_test.go b/statistics/handle/handle_hist_test.go index f2b1fa87ba37f..8febf5827165d 100644 --- a/statistics/handle/handle_hist_test.go +++ b/statistics/handle/handle_hist_test.go @@ -88,7 +88,7 @@ func TestConcurrentLoadHist(t *testing.T) { timeout := time.Nanosecond * mathutil.MaxInt h.SendLoadRequests(stmtCtx, neededColumns, timeout) rs := h.SyncWaitStatsLoad(stmtCtx) - require.True(t, rs) + require.Nil(t, rs) stat = h.GetTableStats(tableInfo) hg = stat.Columns[tableInfo.Columns[2].ID].Histogram topn = stat.Columns[tableInfo.Columns[2].ID].TopN @@ -132,7 +132,7 @@ func TestConcurrentLoadHistTimeout(t *testing.T) { } h.SendLoadRequests(stmtCtx, neededColumns, 0) // set timeout to 0 so task will go to timeout channel rs := h.SyncWaitStatsLoad(stmtCtx) - require.False(t, rs) + require.Error(t, rs) stat = h.GetTableStats(tableInfo) hg = stat.Columns[tableInfo.Columns[2].ID].Histogram topn = stat.Columns[tableInfo.Columns[2].ID].TopN diff --git a/statistics/handle/handle_test.go b/statistics/handle/handle_test.go index 4d268a59ae76e..ab701ce55bb3a 100644 --- a/statistics/handle/handle_test.go +++ b/statistics/handle/handle_test.go @@ -344,6 +344,7 @@ func TestDurationToTS(t *testing.T) { func TestVersion(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) + testKit2 := testkit.NewTestKit(t, store) testKit := testkit.NewTestKit(t, store) testKit.MustExec("use test") testKit.MustExec("create table t1 (c1 int, c2 int)") @@ -353,7 +354,7 @@ func TestVersion(t *testing.T) { tbl1, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) require.NoError(t, err) tableInfo1 := tbl1.Meta() - h, err := handle.NewHandle(testKit.Session(), time.Millisecond, do.SysSessionPool(), do.SysProcTracker(), do.ServerID) + h, err := handle.NewHandle(testKit.Session(), testKit2.Session(), time.Millisecond, do.SysSessionPool(), do.SysProcTracker(), do.ServerID) require.NoError(t, err) unit := oracle.ComposeTS(1, 0) testKit.MustExec("update mysql.stats_meta set version = ? where table_id = ?", 2*unit, tableInfo1.ID) @@ -552,10 +553,10 @@ func TestReloadExtStatsLockRelease(t *testing.T) { tk.MustExec("insert into t values(1,1),(2,2),(3,3)") tk.MustExec("alter table t add stats_extended s1 correlation(a,b)") tk.MustExec("analyze table t") - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/statistics/handle/injectExtStatsLoadErr", `return("")`)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/statistics/injectExtStatsLoadErr", `return("")`)) err := tk.ExecToErr("admin reload stats_extended") require.Equal(t, "gofail extendedStatsFromStorage error", err.Error()) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/statistics/handle/injectExtStatsLoadErr")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/statistics/injectExtStatsLoadErr")) // Check the lock is released by `admin reload stats_extended` if error happens. tk.MustExec("analyze table t") } @@ -621,16 +622,16 @@ func TestLoadStats(t *testing.T) { require.True(t, idx.IsFullLoad()) // Following test tests whether the LoadNeededHistograms would panic. - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/statistics/handle/mockGetStatsReaderFail", `return(true)`)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/statistics/mockGetStatsReaderFail", `return(true)`)) err = h.LoadNeededHistograms() require.Error(t, err) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/statistics/handle/mockGetStatsReaderFail")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/statistics/mockGetStatsReaderFail")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/statistics/handle/mockGetStatsReaderPanic", "panic")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/statistics/mockGetStatsReaderPanic", "panic")) err = h.LoadNeededHistograms() require.Error(t, err) require.Regexp(t, ".*getStatsReader panic.*", err.Error()) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/statistics/handle/mockGetStatsReaderPanic")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/statistics/mockGetStatsReaderPanic")) err = h.LoadNeededHistograms() require.NoError(t, err) } @@ -1095,7 +1096,7 @@ partition by range (a) ( require.NoError(t, dom.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll)) require.NoError(t, dom.StatsHandle().Update(dom.InfoSchema())) checkModifyAndCount(4, 10, 2, 4, 2, 6) - checkHealthy(60, 50, 66) + checkHealthy(33, 0, 50) } func TestGlobalStatsData(t *testing.T) { @@ -2227,8 +2228,8 @@ func TestFMSWithAnalyzePartition(t *testing.T) { tk.MustQuery("show warnings").Sort().Check(testkit.Rows( "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t's partition p0", "Warning 1105 Ignore columns and options when analyze partition in dynamic mode", - "Warning 8131 Build table: `t` global-level stats failed due to missing partition-level stats", - "Warning 8131 Build table: `t` index: `a` global-level stats failed due to missing partition-level stats", + "Warning 8131 Build global-level stats failed due to missing partition-level stats: table `t` partition `p1`", + "Warning 8131 Build global-level stats failed due to missing partition-level stats: table `t` partition `p1`", )) tk.MustQuery("select count(*) from mysql.stats_fm_sketch").Check(testkit.Rows("2")) } @@ -3299,7 +3300,7 @@ func TestRecordHistoricalStatsToStorage(t *testing.T) { tableInfo, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) require.NoError(t, err) - version, err := dom.StatsHandle().RecordHistoricalStatsToStorage("t", tableInfo.Meta()) + version, err := dom.StatsHandle().RecordHistoricalStatsToStorage("t", tableInfo.Meta(), tableInfo.Meta().ID, false) require.NoError(t, err) rows := tk.MustQuery(fmt.Sprintf("select count(*) from mysql.stats_history where version = '%d'", version)).Rows() @@ -3543,3 +3544,35 @@ func TestStatsLockAndUnlockTables(t *testing.T) { tbl2Stats2 := handle.GetTableStats(tbl2.Meta()) require.Equal(t, int64(2), tbl2Stats2.Count) } + +func TestIssue39336(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(` +create table t1 ( + a datetime(3) default null, + b int +) partition by range (b) ( + partition p0 values less than (1000), + partition p1 values less than (maxvalue) +)`) + tk.MustExec("set @@sql_mode=''") + tk.MustExec("set @@tidb_analyze_version=2") + tk.MustExec("set @@tidb_partition_prune_mode='dynamic'") + tk.MustExec(` +insert into t1 values +('1000-00-09 00:00:00.000', 1), +('1000-00-06 00:00:00.000', 1), +('1000-00-06 00:00:00.000', 1), +('2022-11-23 14:24:30.000', 1), +('2022-11-23 14:24:32.000', 1), +('2022-11-23 14:24:33.000', 1), +('2022-11-23 14:24:35.000', 1), +('2022-11-23 14:25:08.000', 1001), +('2022-11-23 14:25:09.000', 1001)`) + tk.MustExec("analyze table t1 with 0 topn") + rows := tk.MustQuery("show analyze status where job_info like 'merge global stats%'").Rows() + require.Len(t, rows, 1) + require.Equal(t, "finished", rows[0][7]) +} diff --git a/statistics/handle/historical_stats_handler.go b/statistics/handle/historical_stats_handler.go new file mode 100644 index 0000000000000..b9d37fe487d56 --- /dev/null +++ b/statistics/handle/historical_stats_handler.go @@ -0,0 +1,104 @@ +// 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, +// 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 handle + +import ( + "context" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/sqlexec" + "go.uber.org/zap" +) + +const ( + // StatsMetaHistorySourceAnalyze indicates stats history meta source from analyze + StatsMetaHistorySourceAnalyze = "analyze" + // StatsMetaHistorySourceLoadStats indicates stats history meta source from load stats + StatsMetaHistorySourceLoadStats = "load stats" + // StatsMetaHistorySourceFlushStats indicates stats history meta source from flush stats + StatsMetaHistorySourceFlushStats = "flush stats" + // StatsMetaHistorySourceExtendedStats indicates stats history meta source from extended stats + StatsMetaHistorySourceExtendedStats = "extended stats" + // StatsMetaHistorySourceSchemaChange indicates stats history meta source from schema change + StatsMetaHistorySourceSchemaChange = "schema change" + // StatsMetaHistorySourceFeedBack indicates stats history meta source from feedback + StatsMetaHistorySourceFeedBack = "feedback" +) + +func recordHistoricalStatsMeta(sctx sessionctx.Context, tableID int64, version uint64, source string) error { + if tableID == 0 || version == 0 { + return errors.Errorf("tableID %d, version %d are invalid", tableID, version) + } + historicalStatsEnabled, err := checkHistoricalStatsEnable(sctx) + if err != nil { + return errors.Errorf("check tidb_enable_historical_stats failed: %v", err) + } + if !historicalStatsEnabled { + return nil + } + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) + exec := sctx.(sqlexec.SQLExecutor) + rexec := sctx.(sqlexec.RestrictedSQLExecutor) + rows, _, err := rexec.ExecRestrictedSQL(ctx, []sqlexec.OptionFuncAlias{sqlexec.ExecOptionUseCurSession}, "select modify_count, count from mysql.stats_meta where table_id = %? and version = %?", tableID, version) + if err != nil { + return errors.Trace(err) + } + if len(rows) == 0 { + return errors.New("no historical meta stats can be recorded") + } + modifyCount, count := rows[0].GetInt64(0), rows[0].GetInt64(1) + + _, err = exec.ExecuteInternal(ctx, "begin pessimistic") + if err != nil { + return errors.Trace(err) + } + defer func() { + err = finishTransaction(ctx, exec, err) + }() + + const sql = "REPLACE INTO mysql.stats_meta_history(table_id, modify_count, count, version, source, create_time) VALUES (%?, %?, %?, %?, %?, NOW())" + if _, err := exec.ExecuteInternal(ctx, sql, tableID, modifyCount, count, version, source); err != nil { + return errors.Trace(err) + } + return nil +} + +func (h *Handle) recordHistoricalStatsMeta(tableID int64, version uint64, source string) { + v := h.statsCache.Load() + if v == nil { + return + } + sc := v.(statsCache) + tbl, ok := sc.Get(tableID) + if !ok { + return + } + if !tbl.IsInitialized() { + return + } + h.mu.Lock() + defer h.mu.Unlock() + err := recordHistoricalStatsMeta(h.mu.ctx, tableID, version, source) + if err != nil { + logutil.BgLogger().Error("record historical stats meta failed", + zap.Int64("table-id", tableID), + zap.Uint64("version", version), + zap.String("source", source), + zap.Error(err)) + } +} diff --git a/statistics/handle/update.go b/statistics/handle/update.go index 22c7771724e11..eb65e2da7c75e 100644 --- a/statistics/handle/update.go +++ b/statistics/handle/update.go @@ -45,7 +45,6 @@ import ( "github.com/pingcap/tidb/util/ranger" "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tidb/util/timeutil" - "github.com/tikv/client-go/v2/oracle" "go.uber.org/atomic" "go.uber.org/zap" "golang.org/x/exp/slices" @@ -409,22 +408,35 @@ var ( dumpStatsMaxDuration = time.Hour ) -// needDumpStatsDelta returns true when only updates a small portion of the table and the time since last update -// do not exceed one hour. -func needDumpStatsDelta(h *Handle, id int64, item variable.TableDelta, currentTime time.Time) bool { - if item.InitTime.IsZero() { - item.InitTime = currentTime +// needDumpStatsDelta checks whether to dump stats delta. +// 1. If the table doesn't exist or is a mem table or system table, then return false. +// 2. If the mode is DumpAll, then return true. +// 3. If the stats delta haven't been dumped in the past hour, then return true. +// 4. If the table stats is pseudo or empty or `Modify Count / Table Count` exceeds the threshold. +func (h *Handle) needDumpStatsDelta(is infoschema.InfoSchema, mode dumpMode, id int64, item variable.TableDelta, currentTime time.Time) bool { + tbl, ok := h.getTableByPhysicalID(is, id) + if !ok { + return false } - tbl, ok := h.statsCache.Load().(statsCache).Get(id) + dbInfo, ok := is.SchemaByTable(tbl.Meta()) if !ok { - // No need to dump if the stats is invalid. return false } + if util.IsMemOrSysDB(dbInfo.Name.L) { + return false + } + if mode == DumpAll { + return true + } + if item.InitTime.IsZero() { + item.InitTime = currentTime + } if currentTime.Sub(item.InitTime) > dumpStatsMaxDuration { // Dump the stats to kv at least once an hour. return true } - if tbl.Count == 0 || float64(item.Count)/float64(tbl.Count) > DumpStatsDeltaRatio { + statsTbl := h.GetPartitionStats(tbl.Meta(), id) + if statsTbl.Pseudo || statsTbl.Count == 0 || float64(item.Count)/float64(statsTbl.Count) > DumpStatsDeltaRatio { // Dump the stats when there are many modifications. return true } @@ -493,9 +505,15 @@ func (h *Handle) DumpStatsDeltaToKV(mode dumpMode) error { h.globalMap.data = deltaMap h.globalMap.Unlock() }() + // TODO: pass in do.InfoSchema() to DumpStatsDeltaToKV. + is := func() infoschema.InfoSchema { + h.mu.Lock() + defer h.mu.Unlock() + return h.mu.ctx.GetDomainInfoSchema().(infoschema.InfoSchema) + }() currentTime := time.Now() for id, item := range deltaMap { - if mode == DumpDelta && !needDumpStatsDelta(h, id, item, currentTime) { + if !h.needDumpStatsDelta(is, mode, id, item, currentTime) { continue } updated, err := h.dumpTableStatCountToKV(id, item) @@ -525,7 +543,7 @@ func (h *Handle) dumpTableStatCountToKV(id int64, delta variable.TableDelta) (up statsVer := uint64(0) defer func() { if err == nil && statsVer != 0 { - err = h.recordHistoricalStatsMeta(id, statsVer) + h.recordHistoricalStatsMeta(id, statsVer, StatsMetaHistorySourceFlushStats) } }() if delta.Count == 0 { @@ -550,7 +568,8 @@ func (h *Handle) dumpTableStatCountToKV(id int64, delta variable.TableDelta) (up startTS := txn.StartTS() updateStatsMeta := func(id int64) error { var err error - if h.IsTableLocked(id) { + // This lock is already locked on it so it use isTableLocked without lock. + if h.isTableLocked(id) { if delta.Delta < 0 { _, err = exec.ExecuteInternal(ctx, "update mysql.stats_table_locked set version = %?, count = count - %?, modify_count = modify_count + %? where table_id = %? and count >= %?", startTS, -delta.Delta, delta.Count, id, -delta.Delta) } else { @@ -558,9 +577,13 @@ func (h *Handle) dumpTableStatCountToKV(id int64, delta variable.TableDelta) (up } } else { if delta.Delta < 0 { - _, err = exec.ExecuteInternal(ctx, "update mysql.stats_meta set version = %?, count = count - %?, modify_count = modify_count + %? where table_id = %? and count >= %?", startTS, -delta.Delta, delta.Count, id, -delta.Delta) + // use INSERT INTO ... ON DUPLICATE KEY UPDATE here to fill missing stats_meta. + _, err = exec.ExecuteInternal(ctx, "insert into mysql.stats_meta (version, table_id, modify_count, count) values (%?, %?, %?, 0) on duplicate key "+ + "update version = values(version), modify_count = modify_count + values(modify_count), count = if(count > %?, count - %?, 0)", startTS, id, delta.Count, -delta.Delta, -delta.Delta) } else { - _, err = exec.ExecuteInternal(ctx, "update mysql.stats_meta set version = %?, count = count + %?, modify_count = modify_count + %? where table_id = %?", startTS, delta.Delta, delta.Count, id) + // use INSERT INTO ... ON DUPLICATE KEY UPDATE here to fill missing stats_meta. + _, err = exec.ExecuteInternal(ctx, "insert into mysql.stats_meta (version, table_id, modify_count, count) values (%?, %?, %?, %?) on duplicate key "+ + "update version = values(version), modify_count = modify_count + values(modify_count), count = count + values(count)", startTS, id, delta.Count, delta.Delta) } } statsVer = startTS @@ -680,9 +703,7 @@ func (h *Handle) UpdateStatsByLocalFeedback(is infoschema.InfoSchema) { OUTER: for _, fbs := range feedback.Feedbacks { for _, fb := range fbs { - h.mu.Lock() table, ok := h.getTableByPhysicalID(is, fb.PhysicalID) - h.mu.Unlock() if !ok { continue } @@ -825,9 +846,7 @@ func (h *Handle) handleSingleHistogramUpdate(is infoschema.InfoSchema, rows []ch err = errors.Trace(h.deleteOutdatedFeedback(physicalTableID, histID, isIndex)) } }() - h.mu.Lock() table, ok := h.getTableByPhysicalID(is, physicalTableID) - h.mu.Unlock() // The table has been deleted. if !ok { return nil @@ -905,7 +924,7 @@ func (h *Handle) deleteOutdatedFeedback(tableID, histID, isIndex int64) error { func (h *Handle) dumpStatsUpdateToKV(tableID, isIndex int64, q *statistics.QueryFeedback, hist *statistics.Histogram, cms *statistics.CMSketch, topN *statistics.TopN, statsVersion int64) error { hist = statistics.UpdateHistogram(hist, q, int(statsVersion)) // feedback for partition is not ready. - err := h.SaveStatsToStorage(tableID, -1, 0, int(isIndex), hist, cms, topN, int(statsVersion), 0, false) + err := h.SaveStatsToStorage(tableID, -1, 0, int(isIndex), hist, cms, topN, int(statsVersion), 0, false, StatsMetaHistorySourceFeedBack) metrics.UpdateStatsCounter.WithLabelValues(metrics.RetLabel(err)).Inc() return errors.Trace(err) } @@ -1000,9 +1019,7 @@ func TableAnalyzed(tbl *statistics.Table) bool { func NeedAnalyzeTable(tbl *statistics.Table, limit time.Duration, autoAnalyzeRatio float64) (bool, string) { analyzed := TableAnalyzed(tbl) if !analyzed { - t := time.UnixMilli(oracle.ExtractPhysical(tbl.Version)) - dur := time.Since(t) - return dur >= limit, fmt.Sprintf("table unanalyzed, time since last updated %v", dur) + return true, "table unanalyzed" } // Auto analyze is disabled. if autoAnalyzeRatio == 0 { @@ -1068,6 +1085,11 @@ func (h *Handle) getAnalyzeSnapshot() (bool, error) { // HandleAutoAnalyze analyzes the newly created table or index. func (h *Handle) HandleAutoAnalyze(is infoschema.InfoSchema) (analyzed bool) { + defer func() { + if r := recover(); r != nil { + logutil.BgLogger().Error("HandleAutoAnalyze panicked", zap.Any("error", r), zap.Stack("stack")) + } + }() err := h.UpdateSessionVar() if err != nil { logutil.BgLogger().Error("[stats] update analyze version for auto analyze session failed", zap.Error(err)) @@ -1472,10 +1494,10 @@ func (h *Handle) RecalculateExpectCount(q *statistics.QueryFeedback, enablePseud expected := 0.0 if isIndex { idx := t.Indices[id] - expected, err = idx.GetRowCount(sctx, nil, ranges, t.Count) + expected, err = idx.GetRowCount(sctx, nil, ranges, t.Count, t.ModifyCount) } else { c := t.Columns[id] - expected, err = c.GetColumnRowCount(sctx, ranges, t.Count, true) + expected, err = c.GetColumnRowCount(sctx, ranges, t.Count, t.ModifyCount, true) } q.Expected = int64(expected) return err diff --git a/statistics/handle/update_test.go b/statistics/handle/update_test.go index e14522c31c4a8..edbef59135696 100644 --- a/statistics/handle/update_test.go +++ b/statistics/handle/update_test.go @@ -1151,13 +1151,15 @@ func TestOutOfOrderUpdate(t *testing.T) { testKit.MustExec("delete from t") require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) - testKit.MustQuery("select count from mysql.stats_meta").Check(testkit.Rows("1")) + // If count < -Delta, then update count to 0. + // Check https://github.com/pingcap/tidb/pull/38301#discussion_r1094050951 for details. + testKit.MustQuery(fmt.Sprintf("select count from mysql.stats_meta where table_id = %d", tableInfo.ID)).Check(testkit.Rows("0")) // Now another tidb has updated the delta info. testKit.MustExec(fmt.Sprintf("update mysql.stats_meta set count = 3 where table_id = %d", tableInfo.ID)) require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) - testKit.MustQuery("select count from mysql.stats_meta").Check(testkit.Rows("0")) + testKit.MustQuery(fmt.Sprintf("select count from mysql.stats_meta where table_id = %d", tableInfo.ID)).Check(testkit.Rows("3")) } func TestUpdateStatsByLocalFeedback(t *testing.T) { @@ -1391,8 +1393,8 @@ func TestNeedAnalyzeTable(t *testing.T) { tbl: &statistics.Table{Version: oracle.GoTimeToTS(time.Now())}, limit: time.Hour, ratio: 0, - result: false, - reason: "", + result: true, + reason: "table unanalyzed", }, // table was already analyzed but auto analyze is disabled { @@ -2210,19 +2212,30 @@ func TestAutoAnalyzeRatio(t *testing.T) { tk.MustExec("set global tidb_auto_analyze_start_time='00:00 +0000'") tk.MustExec("set global tidb_auto_analyze_end_time='23:59 +0000'") + getStatsHealthy := func() int { + rows := tk.MustQuery("show stats_healthy where db_name = 'test' and table_name = 't'").Rows() + require.Len(t, rows, 1) + healthy, err := strconv.Atoi(rows[0][3].(string)) + require.NoError(t, err) + return healthy + } + tk.MustExec("insert into t values (1)" + strings.Repeat(", (1)", 10)) require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) require.NoError(t, h.Update(is)) + require.Equal(t, getStatsHealthy(), 44) require.True(t, h.HandleAutoAnalyze(is)) tk.MustExec("delete from t limit 12") require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) require.NoError(t, h.Update(is)) + require.Equal(t, getStatsHealthy(), 61) require.False(t, h.HandleAutoAnalyze(is)) tk.MustExec("delete from t limit 4") require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) require.NoError(t, h.Update(is)) + require.Equal(t, getStatsHealthy(), 48) require.True(t, h.HandleAutoAnalyze(dom.InfoSchema())) } @@ -2620,3 +2633,76 @@ func TestStatsLockForDelta(t *testing.T) { stats1 = h.GetTableStats(tableInfo1) require.Equal(t, int64(30), stats1.Count) } + +func TestFillMissingStatsMeta(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t1 (a int, b int)") + tk.MustExec("create table t2 (a int, b int) partition by range (a) (partition p0 values less than (10), partition p1 values less than (maxvalue))") + + tk.MustQuery("select * from mysql.stats_meta").Check(testkit.Rows()) + + is := dom.InfoSchema() + tbl1, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + require.NoError(t, err) + tbl1ID := tbl1.Meta().ID + tbl2, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t2")) + require.NoError(t, err) + tbl2Info := tbl2.Meta() + tbl2ID := tbl2Info.ID + require.Len(t, tbl2Info.Partition.Definitions, 2) + p0ID := tbl2Info.Partition.Definitions[0].ID + p1ID := tbl2Info.Partition.Definitions[1].ID + h := dom.StatsHandle() + + checkStatsMeta := func(id int64, expectedModifyCount, expectedCount string) int64 { + rows := tk.MustQuery(fmt.Sprintf("select version, modify_count, count from mysql.stats_meta where table_id = %v", id)).Rows() + require.Len(t, rows, 1) + ver, err := strconv.ParseInt(rows[0][0].(string), 10, 64) + require.NoError(t, err) + require.Equal(t, expectedModifyCount, rows[0][1]) + require.Equal(t, expectedCount, rows[0][2]) + return ver + } + + tk.MustExec("insert into t1 values (1, 2), (3, 4)") + require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpDelta)) + require.NoError(t, h.Update(is)) + ver1 := checkStatsMeta(tbl1ID, "2", "2") + tk.MustExec("delete from t1 where a = 1") + require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpDelta)) + require.NoError(t, h.Update(is)) + ver2 := checkStatsMeta(tbl1ID, "3", "1") + require.Greater(t, ver2, ver1) + + tk.MustExec("insert into t2 values (1, 2), (3, 4)") + require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpDelta)) + require.NoError(t, h.Update(is)) + checkStatsMeta(p0ID, "2", "2") + globalVer1 := checkStatsMeta(tbl2ID, "2", "2") + tk.MustExec("insert into t2 values (11, 12)") + require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpDelta)) + require.NoError(t, h.Update(is)) + checkStatsMeta(p1ID, "1", "1") + globalVer2 := checkStatsMeta(tbl2ID, "3", "3") + require.Greater(t, globalVer2, globalVer1) +} + +func TestNotDumpSysTable(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t1 (a int, b int)") + h := dom.StatsHandle() + require.NoError(t, h.HandleDDLEvent(<-h.DDLEventCh())) + tk.MustQuery("select count(1) from mysql.stats_meta").Check(testkit.Rows("1")) + // After executing `delete from mysql.stats_meta`, a delta for mysql.stats_meta is created but it would not be dumped. + tk.MustExec("delete from mysql.stats_meta") + require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + is := dom.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("mysql"), model.NewCIStr("stats_meta")) + require.NoError(t, err) + tblID := tbl.Meta().ID + tk.MustQuery(fmt.Sprintf("select * from mysql.stats_meta where table_id = %v", tblID)).Check(testkit.Rows()) +} diff --git a/statistics/histogram.go b/statistics/histogram.go index 8c662b6f04061..3cab23f0492d8 100644 --- a/statistics/histogram.go +++ b/statistics/histogram.go @@ -778,7 +778,7 @@ func (hg *Histogram) outOfRange(val types.Datum) bool { // outOfRangeRowCount estimate the row count of part of [lDatum, rDatum] which is out of range of the histogram. // Here we assume the density of data is decreasing from the lower/upper bound of the histogram toward outside. -// The maximum row count it can get is the increaseCount. It reaches the maximum when out-of-range width reaches histogram range width. +// The maximum row count it can get is the modifyCount. It reaches the maximum when out-of-range width reaches histogram range width. // As it shows below. To calculate the out-of-range row count, we need to calculate the percentage of the shaded area. // Note that we assume histL-boundL == histR-histL == boundR-histR here. /* @@ -795,7 +795,7 @@ func (hg *Histogram) outOfRange(val types.Datum) bool { │ │ lDatum rDatum */ -func (hg *Histogram) outOfRangeRowCount(lDatum, rDatum *types.Datum, increaseCount int64) float64 { +func (hg *Histogram) outOfRangeRowCount(lDatum, rDatum *types.Datum, modifyCount int64) float64 { if hg.Len() == 0 { return 0 } @@ -879,8 +879,14 @@ func (hg *Histogram) outOfRangeRowCount(lDatum, rDatum *types.Datum, increaseCou totalPercent = 1 } rowCount := totalPercent * hg.notNullCount() - if rowCount > float64(increaseCount) { - return float64(increaseCount) + + // Use the modifyCount as the upper bound. Note that modifyCount contains insert, delete and update. So this is + // a rather loose upper bound. + // There are some scenarios where we need to handle out-of-range estimation after both insert and delete happen. + // But we don't know how many increases are in the modifyCount. So we have to use this loose bound to ensure it + // can produce a reasonable results in this scenario. + if rowCount > float64(modifyCount) { + return float64(modifyCount) } return rowCount } diff --git a/statistics/index.go b/statistics/index.go index 71d2aa839bd61..40ba2b005843b 100644 --- a/statistics/index.go +++ b/statistics/index.go @@ -216,12 +216,13 @@ func (idx *Index) QueryBytes(d []byte) uint64 { // GetRowCount returns the row count of the given ranges. // It uses the modifyCount to adjust the influence of modifications on the table. -func (idx *Index) GetRowCount(sctx sessionctx.Context, coll *HistColl, indexRanges []*ranger.Range, realtimeRowCount int64) (float64, error) { +func (idx *Index) GetRowCount(sctx sessionctx.Context, coll *HistColl, indexRanges []*ranger.Range, realtimeRowCount, modifyCount int64) (float64, error) { idx.checkStats() sc := sctx.GetSessionVars().StmtCtx totalCount := float64(0) isSingleCol := len(idx.Info.Columns) == 1 for _, indexRange := range indexRanges { + var count float64 lb, err := codec.EncodeKey(sc, nil, indexRange.LowVal...) if err != nil { return 0, err @@ -242,7 +243,7 @@ func (idx *Index) GetRowCount(sctx sessionctx.Context, coll *HistColl, indexRang totalCount++ continue } - count := idx.equalRowCount(lb, realtimeRowCount) + count = idx.equalRowCount(lb, realtimeRowCount) // If the current table row count has changed, we should scale the row count accordingly. count *= idx.GetIncreaseFactor(realtimeRowCount) totalCount += count @@ -262,7 +263,7 @@ func (idx *Index) GetRowCount(sctx sessionctx.Context, coll *HistColl, indexRang r := types.NewBytesDatum(rb) lowIsNull := bytes.Equal(lb, nullKeyBytes) if isSingleCol && lowIsNull { - totalCount += float64(idx.Histogram.NullCount) + count += float64(idx.Histogram.NullCount) } expBackoffSuccess := false // Due to the limitation of calcFraction and convertDatumToScalar, the histogram actually won't estimate anything. @@ -297,24 +298,21 @@ func (idx *Index) GetRowCount(sctx sessionctx.Context, coll *HistColl, indexRang if expBackoffCnt > upperLimit { expBackoffCnt = upperLimit } - totalCount += expBackoffCnt + count += expBackoffCnt } } if !expBackoffSuccess { - totalCount += idx.BetweenRowCount(l, r) + count += idx.BetweenRowCount(l, r) } // If the current table row count has changed, we should scale the row count accordingly. - totalCount *= idx.GetIncreaseFactor(realtimeRowCount) + count *= idx.GetIncreaseFactor(realtimeRowCount) // handling the out-of-range part if (idx.outOfRange(l) && !(isSingleCol && lowIsNull)) || idx.outOfRange(r) { - increaseCount := realtimeRowCount - int64(idx.TotalRowCount()) - if increaseCount < 0 { - increaseCount = 0 - } - totalCount += idx.Histogram.outOfRangeRowCount(&l, &r, increaseCount) + count += idx.Histogram.outOfRangeRowCount(&l, &r, modifyCount) } + totalCount += count } totalCount = mathutil.Clamp(totalCount, 0, float64(realtimeRowCount)) return totalCount, nil diff --git a/statistics/integration_test.go b/statistics/integration_test.go index a94a029f86381..179256d639677 100644 --- a/statistics/integration_test.go +++ b/statistics/integration_test.go @@ -520,14 +520,23 @@ func TestOutdatedStatsCheck(t *testing.T) { tk.MustExec("explain select * from t where a = 1") require.NoError(t, h.LoadNeededHistograms()) + getStatsHealthy := func() int { + rows := tk.MustQuery("show stats_healthy where db_name = 'test' and table_name = 't'").Rows() + require.Len(t, rows, 1) + healthy, err := strconv.Atoi(rows[0][3].(string)) + require.NoError(t, err) + return healthy + } + tk.MustExec("insert into t values (1)" + strings.Repeat(", (1)", 13)) // 34 rows require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) require.NoError(t, h.Update(is)) + require.Equal(t, getStatsHealthy(), 30) require.False(t, hasPseudoStats(tk.MustQuery("explain select * from t where a = 1").Rows())) - tk.MustExec("insert into t values (1)") // 35 rows require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) require.NoError(t, h.Update(is)) + require.Equal(t, getStatsHealthy(), 25) require.True(t, hasPseudoStats(tk.MustQuery("explain select * from t where a = 1").Rows())) tk.MustExec("analyze table t") @@ -535,11 +544,13 @@ func TestOutdatedStatsCheck(t *testing.T) { tk.MustExec("delete from t limit 24") // 11 rows require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) require.NoError(t, h.Update(is)) + require.Equal(t, getStatsHealthy(), 31) require.False(t, hasPseudoStats(tk.MustQuery("explain select * from t where a = 1").Rows())) tk.MustExec("delete from t limit 1") // 10 rows require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) require.NoError(t, h.Update(is)) + require.Equal(t, getStatsHealthy(), 28) require.True(t, hasPseudoStats(tk.MustQuery("explain select * from t where a = 1").Rows())) } diff --git a/statistics/interact_with_storage.go b/statistics/interact_with_storage.go new file mode 100644 index 0000000000000..c0acce31b77b7 --- /dev/null +++ b/statistics/interact_with_storage.go @@ -0,0 +1,466 @@ +// Copyright 2023 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 statistics + +import ( + "context" + "encoding/json" + "fmt" + "strconv" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/mathutil" + "github.com/pingcap/tidb/util/sqlexec" + "go.uber.org/zap" +) + +// StatsReader is used for simplifying code that needs to read statistics from system tables(mysql.stats_xxx) in different sqls +// but requires the same transactions. +// +// Note that: +// 1. Remember to call (*StatsReader).Close after reading all statistics. +// 2. StatsReader is not thread-safe. Different goroutines cannot call (*StatsReader).Read concurrently. +type StatsReader struct { + ctx sqlexec.RestrictedSQLExecutor + snapshot uint64 +} + +// GetStatsReader returns a StatsReader. +func GetStatsReader(snapshot uint64, exec sqlexec.RestrictedSQLExecutor) (reader *StatsReader, err error) { + failpoint.Inject("mockGetStatsReaderFail", func(val failpoint.Value) { + if val.(bool) { + failpoint.Return(nil, errors.New("gofail genStatsReader error")) + } + }) + if snapshot > 0 { + return &StatsReader{ctx: exec, snapshot: snapshot}, nil + } + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("getStatsReader panic %v", r) + } + }() + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) + failpoint.Inject("mockGetStatsReaderPanic", nil) + _, err = exec.(sqlexec.SQLExecutor).ExecuteInternal(ctx, "begin") + if err != nil { + return nil, err + } + return &StatsReader{ctx: exec}, nil +} + +// Read is a thin wrapper reading statistics from storage by sql command. +func (sr *StatsReader) Read(sql string, args ...interface{}) (rows []chunk.Row, fields []*ast.ResultField, err error) { + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) + if sr.snapshot > 0 { + return sr.ctx.ExecRestrictedSQL(ctx, []sqlexec.OptionFuncAlias{sqlexec.ExecOptionUseSessionPool, sqlexec.ExecOptionWithSnapshot(sr.snapshot)}, sql, args...) + } + return sr.ctx.ExecRestrictedSQL(ctx, []sqlexec.OptionFuncAlias{sqlexec.ExecOptionUseCurSession}, sql, args...) +} + +// IsHistory indicates whether to read history statistics. +func (sr *StatsReader) IsHistory() bool { + return sr.snapshot > 0 +} + +// Close closes the StatsReader. +func (sr *StatsReader) Close() error { + if sr.IsHistory() || sr.ctx == nil { + return nil + } + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) + _, err := sr.ctx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, "commit") + return err +} + +// HistogramFromStorage reads histogram from storage. +func HistogramFromStorage(reader *StatsReader, tableID int64, colID int64, tp *types.FieldType, distinct int64, isIndex int, ver uint64, nullCount int64, totColSize int64, corr float64) (_ *Histogram, err error) { + rows, fields, err := reader.Read("select count, repeats, lower_bound, upper_bound, ndv from mysql.stats_buckets where table_id = %? and is_index = %? and hist_id = %? order by bucket_id", tableID, isIndex, colID) + if err != nil { + return nil, errors.Trace(err) + } + bucketSize := len(rows) + hg := NewHistogram(colID, distinct, nullCount, ver, tp, bucketSize, totColSize) + hg.Correlation = corr + totalCount := int64(0) + for i := 0; i < bucketSize; i++ { + count := rows[i].GetInt64(0) + repeats := rows[i].GetInt64(1) + var upperBound, lowerBound types.Datum + if isIndex == 1 { + lowerBound = rows[i].GetDatum(2, &fields[2].Column.FieldType) + upperBound = rows[i].GetDatum(3, &fields[3].Column.FieldType) + } else { + // Invalid date values may be inserted into table under some relaxed sql mode. Those values may exist in statistics. + // Hence, when reading statistics, we should skip invalid date check. See #39336. + sc := &stmtctx.StatementContext{TimeZone: time.UTC, AllowInvalidDate: true, IgnoreZeroInDate: true} + d := rows[i].GetDatum(2, &fields[2].Column.FieldType) + // For new collation data, when storing the bounds of the histogram, we store the collate key instead of the + // original value. + // But there's additional conversion logic for new collation data, and the collate key might be longer than + // the FieldType.flen. + // If we use the original FieldType here, there might be errors like "Invalid utf8mb4 character string" + // or "Data too long". + // So we change it to TypeBlob to bypass those logics here. + if tp.EvalType() == types.ETString && tp.GetType() != mysql.TypeEnum && tp.GetType() != mysql.TypeSet { + tp = types.NewFieldType(mysql.TypeBlob) + } + lowerBound, err = d.ConvertTo(sc, tp) + if err != nil { + return nil, errors.Trace(err) + } + d = rows[i].GetDatum(3, &fields[3].Column.FieldType) + upperBound, err = d.ConvertTo(sc, tp) + if err != nil { + return nil, errors.Trace(err) + } + } + totalCount += count + hg.AppendBucketWithNDV(&lowerBound, &upperBound, totalCount, repeats, rows[i].GetInt64(4)) + } + hg.PreCalculateScalar() + return hg, nil +} + +// CMSketchAndTopNFromStorage reads CMSketch and TopN from storage. +func CMSketchAndTopNFromStorage(reader *StatsReader, tblID int64, isIndex, histID int64) (_ *CMSketch, _ *TopN, err error) { + topNRows, _, err := reader.Read("select HIGH_PRIORITY value, count from mysql.stats_top_n where table_id = %? and is_index = %? and hist_id = %?", tblID, isIndex, histID) + if err != nil { + return nil, nil, err + } + rows, _, err := reader.Read("select cm_sketch from mysql.stats_histograms where table_id = %? and is_index = %? and hist_id = %?", tblID, isIndex, histID) + if err != nil { + return nil, nil, err + } + if len(rows) == 0 { + return DecodeCMSketchAndTopN(nil, topNRows) + } + return DecodeCMSketchAndTopN(rows[0].GetBytes(0), topNRows) +} + +// FMSketchFromStorage reads FMSketch from storage +func FMSketchFromStorage(reader *StatsReader, tblID int64, isIndex, histID int64) (_ *FMSketch, err error) { + rows, _, err := reader.Read("select value from mysql.stats_fm_sketch where table_id = %? and is_index = %? and hist_id = %?", tblID, isIndex, histID) + if err != nil || len(rows) == 0 { + return nil, err + } + return DecodeFMSketch(rows[0].GetBytes(0)) +} + +// ColumnCountFromStorage reads column count from storage +func ColumnCountFromStorage(reader *StatsReader, tableID, colID, statsVer int64) (int64, error) { + count := int64(0) + rows, _, err := reader.Read("select sum(count) from mysql.stats_buckets where table_id = %? and is_index = 0 and hist_id = %?", tableID, colID) + if err != nil { + return 0, errors.Trace(err) + } + // If there doesn't exist any buckets, the SQL will return NULL. So we only use the result if it's not NULL. + if !rows[0].IsNull(0) { + count, err = rows[0].GetMyDecimal(0).ToInt() + if err != nil { + return 0, errors.Trace(err) + } + } + + if statsVer >= Version2 { + // Before stats ver 2, histogram represents all data in this column. + // In stats ver 2, histogram + TopN represent all data in this column. + // So we need to add TopN total count here. + rows, _, err = reader.Read("select sum(count) from mysql.stats_top_n where table_id = %? and is_index = 0 and hist_id = %?", tableID, colID) + if err != nil { + return 0, errors.Trace(err) + } + if !rows[0].IsNull(0) { + topNCount, err := rows[0].GetMyDecimal(0).ToInt() + if err != nil { + return 0, errors.Trace(err) + } + count += topNCount + } + } + return count, err +} + +// ExtendedStatsFromStorage reads extended stats from storage. +func ExtendedStatsFromStorage(reader *StatsReader, table *Table, physicalID int64, loadAll bool) (*Table, error) { + failpoint.Inject("injectExtStatsLoadErr", func() { + failpoint.Return(nil, errors.New("gofail extendedStatsFromStorage error")) + }) + lastVersion := uint64(0) + if table.ExtendedStats != nil && !loadAll { + lastVersion = table.ExtendedStats.LastUpdateVersion + } else { + table.ExtendedStats = NewExtendedStatsColl() + } + rows, _, err := reader.Read("select name, status, type, column_ids, stats, version from mysql.stats_extended where table_id = %? and status in (%?, %?, %?) and version > %?", physicalID, ExtendedStatsInited, ExtendedStatsAnalyzed, ExtendedStatsDeleted, lastVersion) + if err != nil || len(rows) == 0 { + return table, nil + } + for _, row := range rows { + lastVersion = mathutil.Max(lastVersion, row.GetUint64(5)) + name := row.GetString(0) + status := uint8(row.GetInt64(1)) + if status == ExtendedStatsDeleted || status == ExtendedStatsInited { + delete(table.ExtendedStats.Stats, name) + } else { + item := &ExtendedStatsItem{ + Tp: uint8(row.GetInt64(2)), + } + colIDs := row.GetString(3) + err := json.Unmarshal([]byte(colIDs), &item.ColIDs) + if err != nil { + logutil.BgLogger().Error("[stats] decode column IDs failed", zap.String("column_ids", colIDs), zap.Error(err)) + return nil, err + } + statsStr := row.GetString(4) + if item.Tp == ast.StatsTypeCardinality || item.Tp == ast.StatsTypeCorrelation { + if statsStr != "" { + item.ScalarVals, err = strconv.ParseFloat(statsStr, 64) + if err != nil { + logutil.BgLogger().Error("[stats] parse scalar stats failed", zap.String("stats", statsStr), zap.Error(err)) + return nil, err + } + } + } else { + item.StringVals = statsStr + } + table.ExtendedStats.Stats[name] = item + } + } + table.ExtendedStats.LastUpdateVersion = lastVersion + return table, nil +} + +func indexStatsFromStorage(reader *StatsReader, row chunk.Row, table *Table, tableInfo *model.TableInfo) error { + histID := row.GetInt64(2) + distinct := row.GetInt64(3) + histVer := row.GetUint64(4) + nullCount := row.GetInt64(5) + statsVer := row.GetInt64(7) + idx := table.Indices[histID] + errorRate := ErrorRate{} + flag := row.GetInt64(8) + lastAnalyzePos := row.GetDatum(10, types.NewFieldType(mysql.TypeBlob)) + if (!IsAnalyzed(flag) || reader.IsHistory()) && idx != nil { + errorRate = idx.ErrorRate + } + for _, idxInfo := range tableInfo.Indices { + if histID != idxInfo.ID { + continue + } + if idx == nil || idx.LastUpdateVersion < histVer { + hg, err := HistogramFromStorage(reader, table.PhysicalID, histID, types.NewFieldType(mysql.TypeBlob), distinct, 1, histVer, nullCount, 0, 0) + if err != nil { + return errors.Trace(err) + } + cms, topN, err := CMSketchAndTopNFromStorage(reader, table.PhysicalID, 1, idxInfo.ID) + if err != nil { + return errors.Trace(err) + } + fmSketch, err := FMSketchFromStorage(reader, table.PhysicalID, 1, histID) + if err != nil { + return errors.Trace(err) + } + idx = &Index{ + Histogram: *hg, + CMSketch: cms, + TopN: topN, + FMSketch: fmSketch, + Info: idxInfo, + ErrorRate: errorRate, + StatsVer: statsVer, + Flag: flag, + PhysicalID: table.PhysicalID, + } + if statsVer != Version0 { + idx.StatsLoadedStatus = NewStatsFullLoadStatus() + } + lastAnalyzePos.Copy(&idx.LastAnalyzePos) + } + break + } + if idx != nil { + table.Indices[histID] = idx + } else { + logutil.BgLogger().Debug("we cannot find index id in table info. It may be deleted.", zap.Int64("indexID", histID), zap.String("table", tableInfo.Name.O)) + } + return nil +} + +func columnStatsFromStorage(reader *StatsReader, row chunk.Row, table *Table, tableInfo *model.TableInfo, loadAll bool, lease time.Duration) error { + histID := row.GetInt64(2) + distinct := row.GetInt64(3) + histVer := row.GetUint64(4) + nullCount := row.GetInt64(5) + totColSize := row.GetInt64(6) + statsVer := row.GetInt64(7) + correlation := row.GetFloat64(9) + lastAnalyzePos := row.GetDatum(10, types.NewFieldType(mysql.TypeBlob)) + col := table.Columns[histID] + errorRate := ErrorRate{} + flag := row.GetInt64(8) + if (!IsAnalyzed(flag) || reader.IsHistory()) && col != nil { + errorRate = col.ErrorRate + } + for _, colInfo := range tableInfo.Columns { + if histID != colInfo.ID { + continue + } + isHandle := tableInfo.PKIsHandle && mysql.HasPriKeyFlag(colInfo.GetFlag()) + // We will not load buckets if: + // 1. lease > 0, and: + // 2. this column is not handle, and: + // 3. the column doesn't has any statistics before, and: + // 4. loadAll is false. + notNeedLoad := lease > 0 && + !isHandle && + (col == nil || !col.IsStatsInitialized() && col.LastUpdateVersion < histVer) && + !loadAll + if notNeedLoad { + count, err := ColumnCountFromStorage(reader, table.PhysicalID, histID, statsVer) + if err != nil { + return errors.Trace(err) + } + col = &Column{ + PhysicalID: table.PhysicalID, + Histogram: *NewHistogram(histID, distinct, nullCount, histVer, &colInfo.FieldType, 0, totColSize), + Info: colInfo, + Count: count + nullCount, + ErrorRate: errorRate, + IsHandle: tableInfo.PKIsHandle && mysql.HasPriKeyFlag(colInfo.GetFlag()), + Flag: flag, + StatsVer: statsVer, + } + // When adding/modifying a column, we create its stats(all values are default values) without setting stats_ver. + // So we need add col.Count > 0 here. + if statsVer != Version0 || col.Count > 0 { + col.StatsLoadedStatus = NewStatsAllEvictedStatus() + } + lastAnalyzePos.Copy(&col.LastAnalyzePos) + col.Histogram.Correlation = correlation + break + } + if col == nil || col.LastUpdateVersion < histVer || loadAll { + hg, err := HistogramFromStorage(reader, table.PhysicalID, histID, &colInfo.FieldType, distinct, 0, histVer, nullCount, totColSize, correlation) + if err != nil { + return errors.Trace(err) + } + cms, topN, err := CMSketchAndTopNFromStorage(reader, table.PhysicalID, 0, colInfo.ID) + if err != nil { + return errors.Trace(err) + } + var fmSketch *FMSketch + if loadAll { + // FMSketch is only used when merging partition stats into global stats. When merging partition stats into global stats, + // we load all the statistics, i.e., loadAll is true. + fmSketch, err = FMSketchFromStorage(reader, table.PhysicalID, 0, histID) + if err != nil { + return errors.Trace(err) + } + } + col = &Column{ + PhysicalID: table.PhysicalID, + Histogram: *hg, + Info: colInfo, + CMSketch: cms, + TopN: topN, + FMSketch: fmSketch, + ErrorRate: errorRate, + IsHandle: tableInfo.PKIsHandle && mysql.HasPriKeyFlag(colInfo.GetFlag()), + Flag: flag, + StatsVer: statsVer, + } + // Column.Count is calculated by Column.TotalRowCount(). Hence we don't set Column.Count when initializing col. + col.Count = int64(col.TotalRowCount()) + // When adding/modifying a column, we create its stats(all values are default values) without setting stats_ver. + // So we need add colHist.Count > 0 here. + if statsVer != Version0 || col.Count > 0 { + col.StatsLoadedStatus = NewStatsFullLoadStatus() + } + lastAnalyzePos.Copy(&col.LastAnalyzePos) + break + } + if col.TotColSize != totColSize { + newCol := *col + newCol.TotColSize = totColSize + col = &newCol + } + break + } + if col != nil { + table.Columns[col.ID] = col + } else { + // If we didn't find a Column or Index in tableInfo, we won't load the histogram for it. + // But don't worry, next lease the ddl will be updated, and we will load a same table for two times to + // avoid error. + logutil.BgLogger().Debug("we cannot find column in table info now. It may be deleted", zap.Int64("colID", histID), zap.String("table", tableInfo.Name.O)) + } + return nil +} + +// TableStatsFromStorage loads table stats info from storage. +func TableStatsFromStorage(reader *StatsReader, tableInfo *model.TableInfo, physicalID int64, loadAll bool, lease time.Duration, table *Table) (_ *Table, err error) { + // If table stats is pseudo, we also need to copy it, since we will use the column stats when + // the average error rate of it is small. + if table == nil || reader.IsHistory() { + histColl := HistColl{ + PhysicalID: physicalID, + HavePhysicalID: true, + Columns: make(map[int64]*Column, len(tableInfo.Columns)), + Indices: make(map[int64]*Index, len(tableInfo.Indices)), + } + table = &Table{ + HistColl: histColl, + } + } else { + // We copy it before writing to avoid race. + table = table.Copy() + } + table.Pseudo = false + + rows, _, err := reader.Read("select modify_count, count from mysql.stats_meta where table_id = %?", physicalID) + if err != nil || len(rows) == 0 { + return nil, err + } + table.ModifyCount = rows[0].GetInt64(0) + table.Count = rows[0].GetInt64(1) + + rows, _, err = reader.Read("select table_id, is_index, hist_id, distinct_count, version, null_count, tot_col_size, stats_ver, flag, correlation, last_analyze_pos from mysql.stats_histograms where table_id = %?", physicalID) + // Check deleted table. + if err != nil || len(rows) == 0 { + return nil, nil + } + for _, row := range rows { + if row.GetInt64(1) > 0 { + err = indexStatsFromStorage(reader, row, table, tableInfo) + } else { + err = columnStatsFromStorage(reader, row, table, tableInfo, loadAll, lease) + } + if err != nil { + return nil, err + } + } + return ExtendedStatsFromStorage(reader, table, physicalID, loadAll) +} diff --git a/statistics/selectivity_test.go b/statistics/selectivity_test.go index f0dad37f7cac8..05a7413fa3d09 100644 --- a/statistics/selectivity_test.go +++ b/statistics/selectivity_test.go @@ -44,6 +44,7 @@ import ( "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/ranger" "github.com/stretchr/testify/require" + "golang.org/x/exp/slices" ) func TestCollationColumnEstimate(t *testing.T) { @@ -127,7 +128,7 @@ func TestOutOfRangeEstimation(t *testing.T) { statsTbl := h.GetTableStats(table.Meta()) sctx := mock.NewContext() col := statsTbl.Columns[table.Meta().Columns[0].ID] - count, err := col.GetColumnRowCount(sctx, getRange(900, 900), statsTbl.Count, false) + count, err := col.GetColumnRowCount(sctx, getRange(900, 900), statsTbl.Count, statsTbl.ModifyCount, false) require.NoError(t, err) // Because the ANALYZE collect data by random sampling, so the result is not an accurate value. // so we use a range here. @@ -146,8 +147,9 @@ func TestOutOfRangeEstimation(t *testing.T) { statsSuiteData := statistics.GetStatsSuiteData() statsSuiteData.LoadTestCases(t, &input, &output) increasedTblRowCount := int64(float64(statsTbl.Count) * 1.5) + modifyCount := int64(float64(statsTbl.Count) * 0.5) for i, ran := range input { - count, err = col.GetColumnRowCount(sctx, getRange(ran.Start, ran.End), increasedTblRowCount, false) + count, err = col.GetColumnRowCount(sctx, getRange(ran.Start, ran.End), increasedTblRowCount, modifyCount, false) require.NoError(t, err) testdata.OnRecord(func() { output[i].Start = ran.Start @@ -159,6 +161,42 @@ func TestOutOfRangeEstimation(t *testing.T) { } } +// TestOutOfRangeEstimationAfterDelete tests the out-of-range estimation after deletion happen. +// The test result doesn't perfectly reflect the actual data distribution, but this is the expected behavior for now. +func TestOutOfRangeEstimationAfterDelete(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + testKit := testkit.NewTestKit(t, store) + h := dom.StatsHandle() + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec("create table t(a int unsigned)") + require.NoError(t, h.HandleDDLEvent(<-h.DDLEventCh())) + for i := 0; i < 3000; i++ { + testKit.MustExec(fmt.Sprintf("insert into t values (%v)", i/5+300)) // [300, 900) + } + require.Nil(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + testKit.MustExec("analyze table t with 1 samplerate, 0 topn") + testKit.MustExec("delete from t where a < 500") + require.Nil(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + require.Nil(t, h.Update(dom.InfoSchema())) + var ( + input []string + output []struct { + SQL string + Result []string + } + ) + statsSuiteData := statistics.GetStatsSuiteData() + statsSuiteData.LoadTestCases(t, &input, &output) + for i := range input { + testdata.OnRecord(func() { + output[i].SQL = input[i] + output[i].Result = testdata.ConvertRowsToStrings(testKit.MustQuery(input[i]).Rows()) + }) + testKit.MustQuery(input[i]).Check(testkit.Rows(output[i].Result...)) + } +} + func TestEstimationForUnknownValues(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) testKit := testkit.NewTestKit(t, store) @@ -543,6 +581,7 @@ func TestSelectivity(t *testing.T) { require.Truef(t, math.Abs(ratio-tt.selectivity) < eps, "for %s, needed: %v, got: %v", tt.exprs, tt.selectivity, ratio) histColl.Count *= 10 + histColl.ModifyCount = histColl.Count * 9 ratio, _, err = histColl.Selectivity(sctx, sel.Conditions, nil) require.NoErrorf(t, err, "for %s", tt.exprs) require.Truef(t, math.Abs(ratio-tt.selectivityAfterIncrease) < eps, "for %s, needed: %v, got: %v", tt.exprs, tt.selectivityAfterIncrease, ratio) @@ -748,7 +787,7 @@ func TestSmallRangeEstimation(t *testing.T) { statsSuiteData := statistics.GetStatsSuiteData() statsSuiteData.LoadTestCases(t, &input, &output) for i, ran := range input { - count, err := col.GetColumnRowCount(sctx, getRange(ran.Start, ran.End), statsTbl.Count, false) + count, err := col.GetColumnRowCount(sctx, getRange(ran.Start, ran.End), statsTbl.Count, statsTbl.ModifyCount, false) require.NoError(t, err) testdata.OnRecord(func() { output[i].Start = ran.Start @@ -853,7 +892,7 @@ func prepareSelectivity(testKit *testkit.TestKit, dom *domain.Domain) (*statisti return statsTbl, nil } -func getRange(start, end int64) []*ranger.Range { +func getRange(start, end int64) ranger.Ranges { ran := &ranger.Range{ LowVal: []types.Datum{types.NewIntDatum(start)}, HighVal: []types.Datum{types.NewIntDatum(end)}, @@ -862,6 +901,21 @@ func getRange(start, end int64) []*ranger.Range { return []*ranger.Range{ran} } +func getRanges(start, end []int64) (res ranger.Ranges) { + if len(start) != len(end) { + return nil + } + for i := range start { + ran := &ranger.Range{ + LowVal: []types.Datum{types.NewIntDatum(start[i])}, + HighVal: []types.Datum{types.NewIntDatum(end[i])}, + Collators: collate.GetBinaryCollatorSlice(1), + } + res = append(res, ran) + } + return +} + func TestSelectivityGreedyAlgo(t *testing.T) { nodes := make([]*statistics.StatsNode, 3) nodes[0] = statistics.MockStatsNode(1, 3, 2) @@ -991,3 +1045,115 @@ type outputType struct { SQL string Result []string } + +func TestGlobalStatsOutOfRangeEstimationAfterDelete(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + testKit := testkit.NewTestKit(t, store) + h := dom.StatsHandle() + testKit.MustExec("use test") + testKit.MustExec("set @@tidb_partition_prune_mode='dynamic'") + testKit.MustExec("drop table if exists t") + testKit.MustExec("create table t(a int unsigned) " + + "partition by range (a) " + + "(partition p0 values less than (400), " + + "partition p1 values less than (600), " + + "partition p2 values less than (800)," + + "partition p3 values less than (1000)," + + "partition p4 values less than (1200))") + require.NoError(t, h.HandleDDLEvent(<-h.DDLEventCh())) + for i := 0; i < 3000; i++ { + testKit.MustExec(fmt.Sprintf("insert into t values (%v)", i/5+300)) // [300, 900) + } + require.Nil(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + testKit.MustExec("analyze table t with 1 samplerate, 0 topn") + testKit.MustExec("delete from t where a < 500") + require.Nil(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + require.Nil(t, h.Update(dom.InfoSchema())) + var ( + input []string + output []struct { + SQL string + Result []string + } + ) + statsSuiteData := statistics.GetStatsSuiteData() + statsSuiteData.LoadTestCases(t, &input, &output) + for i := range input { + testdata.OnRecord(func() { + output[i].SQL = input[i] + output[i].Result = testdata.ConvertRowsToStrings(testKit.MustQuery(input[i]).Rows()) + }) + testKit.MustQuery(input[i]).Check(testkit.Rows(output[i].Result...)) + } + testKit.MustExec("analyze table t partition p4 with 1 samplerate, 0 topn") + require.Nil(t, h.Update(dom.InfoSchema())) + for i := range input { + testKit.MustQuery(input[i]).Check(testkit.Rows(output[i].Result...)) + } +} + +func generateMapsForMockStatsTbl(statsTbl *statistics.Table) { + idx2Columns := make(map[int64][]int64) + colID2IdxIDs := make(map[int64][]int64) + for _, idxHist := range statsTbl.Indices { + ids := make([]int64, 0, len(idxHist.Info.Columns)) + for _, idxCol := range idxHist.Info.Columns { + ids = append(ids, int64(idxCol.Offset)) + } + colID2IdxIDs[ids[0]] = append(colID2IdxIDs[ids[0]], idxHist.ID) + idx2Columns[idxHist.ID] = ids + } + for _, idxIDs := range colID2IdxIDs { + slices.Sort(idxIDs) + } + statsTbl.Idx2ColumnIDs = idx2Columns + statsTbl.ColID2IdxIDs = colID2IdxIDs +} + +func TestIssue39593(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + testKit := testkit.NewTestKit(t, store) + + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec("create table t(a int, b int, index idx(a, b))") + is := dom.InfoSchema() + tb, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + tblInfo := tb.Meta() + + // mock the statistics.Table + statsTbl := mockStatsTable(tblInfo, 540) + colValues, err := generateIntDatum(1, 54) + require.NoError(t, err) + for i := 1; i <= 2; i++ { + statsTbl.Columns[int64(i)] = &statistics.Column{ + Histogram: *mockStatsHistogram(int64(i), colValues, 10, types.NewFieldType(mysql.TypeLonglong)), + Info: tblInfo.Columns[i-1], + StatsLoadedStatus: statistics.NewStatsFullLoadStatus(), + StatsVer: 2, + } + } + idxValues, err := generateIntDatum(2, 3) + require.NoError(t, err) + tp := types.NewFieldType(mysql.TypeBlob) + statsTbl.Indices[1] = &statistics.Index{ + Histogram: *mockStatsHistogram(1, idxValues, 60, tp), + Info: tblInfo.Indices[0], + StatsVer: 2, + } + generateMapsForMockStatsTbl(statsTbl) + + sctx := testKit.Session() + idxID := tblInfo.Indices[0].ID + vals := []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20} + count, err := statsTbl.GetRowCountByIndexRanges(sctx, idxID, getRanges(vals, vals)) + require.NoError(t, err) + // estimated row count without any changes + require.Equal(t, float64(360), count) + statsTbl.Count *= 10 + count, err = statsTbl.GetRowCountByIndexRanges(sctx, idxID, getRanges(vals, vals)) + require.NoError(t, err) + // estimated row count after mock modify on the table + require.Equal(t, float64(3600), count) +} diff --git a/statistics/table.go b/statistics/table.go index 2e66e39ab8152..892e964011461 100644 --- a/statistics/table.go +++ b/statistics/table.go @@ -94,6 +94,15 @@ func NewExtendedStatsColl() *ExtendedStatsColl { return &ExtendedStatsColl{Stats: make(map[string]*ExtendedStatsItem)} } +const ( + // ExtendedStatsInited is the status for extended stats which are just registered but have not been analyzed yet. + ExtendedStatsInited uint8 = iota + // ExtendedStatsAnalyzed is the status for extended stats which have been collected in analyze. + ExtendedStatsAnalyzed + // ExtendedStatsDeleted is the status for extended stats which were dropped. These "deleted" records would be removed from storage by GCStats(). + ExtendedStatsDeleted +) + // HistColl is a collection of histogram. It collects enough information for plan to calculate the selectivity. type HistColl struct { PhysicalID int64 @@ -377,19 +386,19 @@ func (t *Table) ColumnByName(colName string) *Column { } // GetStatsInfo returns their statistics according to the ID of the column or index, including histogram, CMSketch, TopN and FMSketch. -func (t *Table) GetStatsInfo(ID int64, isIndex bool) (int64, *Histogram, *CMSketch, *TopN, *FMSketch) { +func (t *Table) GetStatsInfo(ID int64, isIndex bool) (int64, *Histogram, *CMSketch, *TopN, *FMSketch, bool) { if isIndex { if idxStatsInfo, ok := t.Indices[ID]; ok { - return int64(idxStatsInfo.TotalRowCount()), idxStatsInfo.Histogram.Copy(), idxStatsInfo.CMSketch.Copy(), idxStatsInfo.TopN.Copy(), idxStatsInfo.FMSketch.Copy() + return int64(idxStatsInfo.TotalRowCount()), idxStatsInfo.Histogram.Copy(), idxStatsInfo.CMSketch.Copy(), idxStatsInfo.TopN.Copy(), idxStatsInfo.FMSketch.Copy(), true } // newly added index which is not analyzed yet - return 0, nil, nil, nil, nil + return 0, nil, nil, nil, nil, false } if colStatsInfo, ok := t.Columns[ID]; ok { - return int64(colStatsInfo.TotalRowCount()), colStatsInfo.Histogram.Copy(), colStatsInfo.CMSketch.Copy(), colStatsInfo.TopN.Copy(), colStatsInfo.FMSketch.Copy() + return int64(colStatsInfo.TotalRowCount()), colStatsInfo.Histogram.Copy(), colStatsInfo.CMSketch.Copy(), colStatsInfo.TopN.Copy(), colStatsInfo.FMSketch.Copy(), true } // newly added column which is not analyzed yet - return 0, nil, nil, nil, nil + return 0, nil, nil, nil, nil, false } // GetColRowCount tries to get the row count of the a column if possible. @@ -418,8 +427,12 @@ func (t *Table) GetStatsHealthy() (int64, bool) { return 0, false } var healthy int64 - if t.ModifyCount < t.Count { - healthy = int64((1.0 - float64(t.ModifyCount)/float64(t.Count)) * 100.0) + count := float64(t.Count) + if histCount := t.GetColRowCount(); histCount > 0 { + count = histCount + } + if float64(t.ModifyCount) < count { + healthy = int64((1.0 - float64(t.ModifyCount)/count) * 100.0) } else if t.ModifyCount == 0 { healthy = 100 } @@ -566,7 +579,7 @@ func (coll *HistColl) GetRowCountByIntColumnRanges(sctx sessionctx.Context, colI } return result, nil } - result, err = c.GetColumnRowCount(sctx, intRanges, coll.Count, true) + result, err = c.GetColumnRowCount(sctx, intRanges, coll.Count, coll.ModifyCount, true) if sc.EnableOptimizerCETrace { CETraceRange(sctx, coll.PhysicalID, []string{c.Info.Name.O}, intRanges, "Column Stats", uint64(result)) } @@ -587,7 +600,7 @@ func (coll *HistColl) GetRowCountByColumnRanges(sctx sessionctx.Context, colID i } return result, err } - result, err := c.GetColumnRowCount(sctx, colRanges, coll.Count, false) + result, err := c.GetColumnRowCount(sctx, colRanges, coll.Count, coll.ModifyCount, false) if sc.EnableOptimizerCETrace { CETraceRange(sctx, coll.PhysicalID, []string{c.Info.Name.O}, colRanges, "Column Stats", uint64(result)) } @@ -623,7 +636,7 @@ func (coll *HistColl) GetRowCountByIndexRanges(sctx sessionctx.Context, idxID in if idx.CMSketch != nil && idx.StatsVer == Version1 { result, err = coll.getIndexRowCount(sctx, idxID, indexRanges) } else { - result, err = idx.GetRowCount(sctx, coll, indexRanges, coll.Count) + result, err = idx.GetRowCount(sctx, coll, indexRanges, coll.Count, coll.ModifyCount) } if sc.EnableOptimizerCETrace { CETraceRange(sctx, coll.PhysicalID, colNames, indexRanges, "Index Stats", uint64(result)) @@ -959,7 +972,7 @@ func (coll *HistColl) crossValidationSelectivity(sctx sessionctx.Context, idx *I Collators: []collate.Collator{idxPointRange.Collators[i]}, } - rowCount, err := col.GetColumnRowCount(sctx, []*ranger.Range{&rang}, coll.Count, col.IsHandle) + rowCount, err := col.GetColumnRowCount(sctx, []*ranger.Range{&rang}, coll.Count, coll.ModifyCount, col.IsHandle) if err != nil { return 0, 0, err } @@ -1031,7 +1044,7 @@ func (coll *HistColl) getIndexRowCount(sctx sessionctx.Context, idxID int64, ind // on single-column index, use previous way as well, because CMSketch does not contain null // values in this case. if rangePosition == 0 || isSingleColIdxNullRange(idx, ran) { - count, err := idx.GetRowCount(sctx, nil, []*ranger.Range{ran}, coll.Count) + count, err := idx.GetRowCount(sctx, nil, []*ranger.Range{ran}, coll.Count, coll.ModifyCount) if err != nil { return 0, errors.Trace(err) } diff --git a/statistics/testdata/integration_suite_out.json b/statistics/testdata/integration_suite_out.json index 73b62a002e248..229e05cd0db2a 100644 --- a/statistics/testdata/integration_suite_out.json +++ b/statistics/testdata/integration_suite_out.json @@ -411,7 +411,7 @@ { "SQL": "explain format = 'brief' select * from t where f regexp '.*111.*'", "Result": [ - "Selection 30.70 root regexp(test.t.f, \".*111.*\")", + "Selection 32.00 root regexp(test.t.f, \".*111.*\")", "└─TableReader 40.00 root data:TableFullScan", " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" ] @@ -419,7 +419,7 @@ { "SQL": "explain format = 'brief' select * from t where f not regexp '.*111.*'", "Result": [ - "Selection 6.30 root not(istrue_with_null(regexp(test.t.f, \".*111.*\")))", + "Selection 32.00 root not(regexp(test.t.f, \".*111.*\"))", "└─TableReader 40.00 root data:TableFullScan", " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" ] @@ -435,7 +435,7 @@ { "SQL": "explain format = 'brief' select * from t where a like '%111%' and f rlike '.*111.*'", "Result": [ - "Selection 23.56 root regexp(test.t.f, \".*111.*\")", + "Selection 24.56 root regexp(test.t.f, \".*111.*\")", "└─TableReader 30.70 root data:Selection", " └─Selection 30.70 cop[tikv] like(test.t.a, \"%111%\", 92)", " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" @@ -641,7 +641,7 @@ { "SQL": "explain format = 'brief' select * from t where f regexp '.*111.*'", "Result": [ - "Selection 30.70 root regexp(test.t.f, \".*111.*\")", + "Selection 32.00 root regexp(test.t.f, \".*111.*\")", "└─TableReader 40.00 root data:TableFullScan", " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" ] @@ -649,7 +649,7 @@ { "SQL": "explain format = 'brief' select * from t where f not regexp '.*111.*'", "Result": [ - "Selection 6.30 root not(istrue_with_null(regexp(test.t.f, \".*111.*\")))", + "Selection 32.00 root not(regexp(test.t.f, \".*111.*\"))", "└─TableReader 40.00 root data:TableFullScan", " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" ] @@ -665,7 +665,7 @@ { "SQL": "explain format = 'brief' select * from t where a like '%111%' and f rlike '.*111.*'", "Result": [ - "Selection 23.56 root regexp(test.t.f, \".*111.*\")", + "Selection 24.56 root regexp(test.t.f, \".*111.*\")", "└─TableReader 30.70 root data:Selection", " └─Selection 30.70 cop[tikv] like(test.t.a, \"%111%\", 92)", " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" diff --git a/statistics/testdata/stats_suite_in.json b/statistics/testdata/stats_suite_in.json index ff76b09ac4c15..bf53c6726c974 100644 --- a/statistics/testdata/stats_suite_in.json +++ b/statistics/testdata/stats_suite_in.json @@ -259,5 +259,41 @@ "End": 0 } ] + }, + { + "name": "TestOutOfRangeEstimationAfterDelete", + "cases": [ + "explain format = 'brief' select * from t where a <= 300", + "explain format = 'brief' select * from t where a < 300", + "explain format = 'brief' select * from t where a <= 500", + "explain format = 'brief' select * from t where a >= 300 and a <= 900", + "explain format = 'brief' select * from t where a >= 900", + "explain format = 'brief' select * from t where a > 900", + "explain format = 'brief' select * from t where a >= 300", + "explain format = 'brief' select * from t where a <= 900", + "explain format = 'brief' select * from t where a > 800 and a < 1000", + "explain format = 'brief' select * from t where a > 900 and a < 1000", + "explain format = 'brief' select * from t where a > 900 and a < 1100", + "explain format = 'brief' select * from t where a > 200 and a < 300", + "explain format = 'brief' select * from t where a > 100 and a < 300" + ] + }, + { + "name": "TestGlobalStatsOutOfRangeEstimationAfterDelete", + "cases": [ + "explain format = 'brief' select * from t where a <= 300", + "explain format = 'brief' select * from t where a < 300", + "explain format = 'brief' select * from t where a <= 500", + "explain format = 'brief' select * from t where a >= 300 and a <= 900", + "explain format = 'brief' select * from t where a >= 900", + "explain format = 'brief' select * from t where a > 900", + "explain format = 'brief' select * from t where a >= 300", + "explain format = 'brief' select * from t where a <= 900", + "explain format = 'brief' select * from t where a > 800 and a < 1000", + "explain format = 'brief' select * from t where a > 900 and a < 1000", + "explain format = 'brief' select * from t where a > 900 and a < 1100", + "explain format = 'brief' select * from t where a > 200 and a < 300", + "explain format = 'brief' select * from t where a > 100 and a < 300" + ] } ] diff --git a/statistics/testdata/stats_suite_out.json b/statistics/testdata/stats_suite_out.json index a78fafe87ade9..fea01ef77bee1 100644 --- a/statistics/testdata/stats_suite_out.json +++ b/statistics/testdata/stats_suite_out.json @@ -759,5 +759,223 @@ "Count": 7.5 } ] + }, + { + "Name": "TestOutOfRangeEstimationAfterDelete", + "Cases": [ + { + "SQL": "explain format = 'brief' select * from t where a <= 300", + "Result": [ + "TableReader 1003.33 root data:Selection", + "└─Selection 1003.33 cop[tikv] le(test.t.a, 300)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a < 300", + "Result": [ + "TableReader 1000.00 root data:Selection", + "└─Selection 1000.00 cop[tikv] lt(test.t.a, 300)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a <= 500", + "Result": [ + "TableReader 1670.00 root data:Selection", + "└─Selection 1670.00 cop[tikv] le(test.t.a, 500)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a >= 300 and a <= 900", + "Result": [ + "TableReader 2000.00 root data:Selection", + "└─Selection 2000.00 cop[tikv] ge(test.t.a, 300), le(test.t.a, 900)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a >= 900", + "Result": [ + "TableReader 1000.00 root data:Selection", + "└─Selection 1000.00 cop[tikv] ge(test.t.a, 900)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a > 900", + "Result": [ + "TableReader 1000.00 root data:Selection", + "└─Selection 1000.00 cop[tikv] gt(test.t.a, 900)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a >= 300", + "Result": [ + "TableReader 2000.00 root data:Selection", + "└─Selection 2000.00 cop[tikv] ge(test.t.a, 300)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a <= 900", + "Result": [ + "TableReader 2000.00 root data:Selection", + "└─Selection 2000.00 cop[tikv] le(test.t.a, 900)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a > 800 and a < 1000", + "Result": [ + "TableReader 793.13 root data:Selection", + "└─Selection 793.13 cop[tikv] gt(test.t.a, 800), lt(test.t.a, 1000)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a > 900 and a < 1000", + "Result": [ + "TableReader 458.12 root data:Selection", + "└─Selection 458.12 cop[tikv] gt(test.t.a, 900), lt(test.t.a, 1000)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a > 900 and a < 1100", + "Result": [ + "TableReader 832.49 root data:Selection", + "└─Selection 832.49 cop[tikv] gt(test.t.a, 900), lt(test.t.a, 1100)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a > 200 and a < 300", + "Result": [ + "TableReader 458.12 root data:Selection", + "└─Selection 458.12 cop[tikv] gt(test.t.a, 200), lt(test.t.a, 300)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a > 100 and a < 300", + "Result": [ + "TableReader 832.49 root data:Selection", + "└─Selection 832.49 cop[tikv] gt(test.t.a, 100), lt(test.t.a, 300)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + } + ] + }, + { + "Name": "TestGlobalStatsOutOfRangeEstimationAfterDelete", + "Cases": [ + { + "SQL": "explain format = 'brief' select * from t where a <= 300", + "Result": [ + "TableReader 1003.33 root partition:p0 data:Selection", + "└─Selection 1003.33 cop[tikv] le(test.t.a, 300)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a < 300", + "Result": [ + "TableReader 1000.00 root partition:p0 data:Selection", + "└─Selection 1000.00 cop[tikv] lt(test.t.a, 300)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a <= 500", + "Result": [ + "TableReader 1670.00 root partition:p0,p1 data:Selection", + "└─Selection 1670.00 cop[tikv] le(test.t.a, 500)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a >= 300 and a <= 900", + "Result": [ + "TableReader 2000.00 root partition:p0,p1,p2,p3 data:Selection", + "└─Selection 2000.00 cop[tikv] ge(test.t.a, 300), le(test.t.a, 900)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a >= 900", + "Result": [ + "TableReader 1000.00 root partition:p3,p4 data:Selection", + "└─Selection 1000.00 cop[tikv] ge(test.t.a, 900)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a > 900", + "Result": [ + "TableReader 1000.00 root partition:p3,p4 data:Selection", + "└─Selection 1000.00 cop[tikv] gt(test.t.a, 900)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a >= 300", + "Result": [ + "TableReader 2000.00 root partition:all data:Selection", + "└─Selection 2000.00 cop[tikv] ge(test.t.a, 300)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a <= 900", + "Result": [ + "TableReader 2000.00 root partition:p0,p1,p2,p3 data:Selection", + "└─Selection 2000.00 cop[tikv] le(test.t.a, 900)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a > 800 and a < 1000", + "Result": [ + "TableReader 793.20 root partition:p3 data:Selection", + "└─Selection 793.20 cop[tikv] gt(test.t.a, 800), lt(test.t.a, 1000)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a > 900 and a < 1000", + "Result": [ + "TableReader 458.19 root partition:p3 data:Selection", + "└─Selection 458.19 cop[tikv] gt(test.t.a, 900), lt(test.t.a, 1000)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a > 900 and a < 1100", + "Result": [ + "TableReader 832.77 root partition:p3,p4 data:Selection", + "└─Selection 832.77 cop[tikv] gt(test.t.a, 900), lt(test.t.a, 1100)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a > 200 and a < 300", + "Result": [ + "TableReader 459.03 root partition:p0 data:Selection", + "└─Selection 459.03 cop[tikv] gt(test.t.a, 200), lt(test.t.a, 300)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a > 100 and a < 300", + "Result": [ + "TableReader 834.45 root partition:p0 data:Selection", + "└─Selection 834.45 cop[tikv] gt(test.t.a, 100), lt(test.t.a, 300)", + " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" + ] + } + ] } ] diff --git a/store/BUILD.bazel b/store/BUILD.bazel index dc33aa14eea94..bf8faa0dde9b9 100644 --- a/store/BUILD.bazel +++ b/store/BUILD.bazel @@ -10,6 +10,7 @@ go_library( "//util", "//util/logutil", "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_kvproto//pkg/pdpb", "@org_uber_go_zap//:zap", ], ) diff --git a/store/copr/BUILD.bazel b/store/copr/BUILD.bazel index 674ca8f6c54e1..9f187190bb70c 100644 --- a/store/copr/BUILD.bazel +++ b/store/copr/BUILD.bazel @@ -9,6 +9,7 @@ go_library( "coprocessor_cache.go", "key_ranges.go", "mpp.go", + "mpp_probe.go", "region_cache.go", "store.go", ], @@ -30,17 +31,21 @@ go_library( "//util/mathutil", "//util/memory", "//util/paging", + "//util/tiflashcompute", + "//util/tracing", "//util/trxevents", "@com_github_dgraph_io_ristretto//:ristretto", "@com_github_gogo_protobuf//proto", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/coprocessor", + "@com_github_pingcap_kvproto//pkg/errorpb", "@com_github_pingcap_kvproto//pkg/kvrpcpb", "@com_github_pingcap_kvproto//pkg/metapb", "@com_github_pingcap_kvproto//pkg/mpp", "@com_github_pingcap_log//:log", "@com_github_pingcap_tipb//go-tipb", + "@com_github_stathat_consistent//:consistent", "@com_github_tikv_client_go_v2//config", "@com_github_tikv_client_go_v2//error", "@com_github_tikv_client_go_v2//metrics", @@ -65,6 +70,7 @@ go_test( "coprocessor_test.go", "key_ranges_test.go", "main_test.go", + "mpp_probe_test.go", ], embed = [":copr"], flaky = True, @@ -73,12 +79,19 @@ go_test( "//kv", "//store/driver/backoff", "//testkit/testsetup", + "//util/logutil", "//util/paging", + "//util/trxevents", + "@com_github_pingcap_errors//:errors", "@com_github_pingcap_kvproto//pkg/coprocessor", + "@com_github_pingcap_kvproto//pkg/mpp", + "@com_github_stathat_consistent//:consistent", "@com_github_stretchr_testify//require", "@com_github_tikv_client_go_v2//config", "@com_github_tikv_client_go_v2//testutils", "@com_github_tikv_client_go_v2//tikv", + "@com_github_tikv_client_go_v2//tikvrpc", "@org_uber_go_goleak//:goleak", + "@org_uber_go_zap//:zap", ], ) diff --git a/store/copr/batch_coprocessor.go b/store/copr/batch_coprocessor.go index bfd3bbcc94fdd..273b97a0c2a13 100644 --- a/store/copr/batch_coprocessor.go +++ b/store/copr/batch_coprocessor.go @@ -21,6 +21,7 @@ import ( "io" "math" "strconv" + "strings" "sync" "sync/atomic" "time" @@ -29,12 +30,14 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/coprocessor" "github.com/pingcap/kvproto/pkg/kvrpcpb" - "github.com/pingcap/kvproto/pkg/mpp" "github.com/pingcap/log" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/driver/backoff" derr "github.com/pingcap/tidb/store/driver/error" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/tiflashcompute" + "github.com/stathat/consistent" "github.com/tikv/client-go/v2/metrics" "github.com/tikv/client-go/v2/tikv" "github.com/tikv/client-go/v2/tikvrpc" @@ -42,6 +45,8 @@ import ( "golang.org/x/exp/slices" ) +const fetchTopoMaxBackoff = 20000 + // batchCopTask comprises of multiple copTask that will send to same store. type batchCopTask struct { storeAddr string @@ -293,12 +298,11 @@ func balanceBatchCopTaskWithContinuity(storeTaskMap map[uint64]*batchCopTask, ca // // The second balance strategy: Not only consider the region count between TiFlash stores, but also try to make the regions' range continuous(stored in TiFlash closely). // If balanceWithContinuity is true, the second balance strategy is enable. -func balanceBatchCopTask(ctx context.Context, kvStore *kvStore, originalTasks []*batchCopTask, mppStoreLastFailTime *sync.Map, ttl time.Duration, balanceWithContinuity bool, balanceContinuousRegionCount int64) []*batchCopTask { +func balanceBatchCopTask(ctx context.Context, kvStore *kvStore, originalTasks []*batchCopTask, isMPP bool, ttl time.Duration, balanceWithContinuity bool, balanceContinuousRegionCount int64) []*batchCopTask { if len(originalTasks) == 0 { log.Info("Batch cop task balancer got an empty task set.") return originalTasks } - isMPP := mppStoreLastFailTime != nil // for mpp, we still need to detect the store availability if len(originalTasks) <= 1 && !isMPP { return originalTasks @@ -323,64 +327,15 @@ func balanceBatchCopTask(ctx context.Context, kvStore *kvStore, originalTasks [] storeTaskMap[taskStoreID] = batchTask } } else { - logutil.BgLogger().Info("detecting available mpp stores") - // decide the available stores stores := cache.RegionCache.GetTiFlashStores() - var wg sync.WaitGroup - var mu sync.Mutex - wg.Add(len(stores)) - cur := time.Now() - for i := range stores { - go func(idx int) { - defer wg.Done() - s := stores[idx] - - var lastAny any - var ok bool - mu.Lock() - if lastAny, ok = mppStoreLastFailTime.Load(s.GetAddr()); ok && cur.Sub(lastAny.(time.Time)) < 100*time.Millisecond { - // The interval time is so short that may happen in a same query, so we needn't to check again. - mu.Unlock() - return - } else if !ok { - lastAny = time.Time{} - } - mu.Unlock() - - resp, err := kvStore.GetTiKVClient().SendRequest(ctx, s.GetAddr(), &tikvrpc.Request{ - Type: tikvrpc.CmdMPPAlive, - StoreTp: tikvrpc.TiFlash, - Req: &mpp.IsAliveRequest{}, - Context: kvrpcpb.Context{}, - }, 2*time.Second) - - if err != nil || !resp.Resp.(*mpp.IsAliveResponse).Available { - errMsg := "store not ready to serve" - if err != nil { - errMsg = err.Error() - } - logutil.BgLogger().Warn("Store is not ready", zap.String("store address", s.GetAddr()), zap.String("err message", errMsg)) - mu.Lock() - mppStoreLastFailTime.Store(s.GetAddr(), time.Now()) - mu.Unlock() - return - } - - if cur.Sub(lastAny.(time.Time)) < ttl { - logutil.BgLogger().Warn("Cannot detect store's availability because the current time has not reached MPPStoreLastFailTime + MPPStoreFailTTL", zap.String("store address", s.GetAddr()), zap.Time("last fail time", lastAny.(time.Time))) - return - } - - mu.Lock() - defer mu.Unlock() - storeTaskMap[s.StoreID()] = &batchCopTask{ - storeAddr: s.GetAddr(), - cmdType: originalTasks[0].cmdType, - ctx: &tikv.RPCContext{Addr: s.GetAddr(), Store: s}, - } - }(i) + aliveStores := filterAliveStores(ctx, stores, ttl, kvStore) + for _, s := range aliveStores { + storeTaskMap[s.StoreID()] = &batchCopTask{ + storeAddr: s.GetAddr(), + cmdType: originalTasks[0].cmdType, + ctx: &tikv.RPCContext{Addr: s.GetAddr(), Store: s}, + } } - wg.Wait() } var candidateRegionInfos []RegionInfo @@ -528,12 +483,46 @@ func balanceBatchCopTask(ctx context.Context, kvStore *kvStore, originalTasks [] return ret } -func buildBatchCopTasksForNonPartitionedTable(bo *backoff.Backoffer, store *kvStore, ranges *KeyRanges, storeType kv.StoreType, mppStoreLastFailTime *sync.Map, ttl time.Duration, balanceWithContinuity bool, balanceContinuousRegionCount int64) ([]*batchCopTask, error) { - return buildBatchCopTasksCore(bo, store, []*KeyRanges{ranges}, storeType, mppStoreLastFailTime, ttl, balanceWithContinuity, balanceContinuousRegionCount) +func buildBatchCopTasksForNonPartitionedTable( + ctx context.Context, + bo *backoff.Backoffer, + store *kvStore, + ranges *KeyRanges, + storeType kv.StoreType, + isMPP bool, + ttl time.Duration, + balanceWithContinuity bool, + balanceContinuousRegionCount int64) ([]*batchCopTask, error) { + if config.GetGlobalConfig().DisaggregatedTiFlash { + if config.GetGlobalConfig().UseAutoScaler { + return buildBatchCopTasksConsistentHash(ctx, bo, store, []*KeyRanges{ranges}, storeType, ttl) + } + return buildBatchCopTasksConsistentHashForPD(bo, store, []*KeyRanges{ranges}, storeType, ttl) + } + return buildBatchCopTasksCore(bo, store, []*KeyRanges{ranges}, storeType, isMPP, ttl, balanceWithContinuity, balanceContinuousRegionCount) } -func buildBatchCopTasksForPartitionedTable(bo *backoff.Backoffer, store *kvStore, rangesForEachPhysicalTable []*KeyRanges, storeType kv.StoreType, mppStoreLastFailTime *sync.Map, ttl time.Duration, balanceWithContinuity bool, balanceContinuousRegionCount int64, partitionIDs []int64) ([]*batchCopTask, error) { - batchTasks, err := buildBatchCopTasksCore(bo, store, rangesForEachPhysicalTable, storeType, mppStoreLastFailTime, ttl, balanceWithContinuity, balanceContinuousRegionCount) +func buildBatchCopTasksForPartitionedTable( + ctx context.Context, + bo *backoff.Backoffer, + store *kvStore, + rangesForEachPhysicalTable []*KeyRanges, + storeType kv.StoreType, + isMPP bool, + ttl time.Duration, + balanceWithContinuity bool, + balanceContinuousRegionCount int64, + partitionIDs []int64) (batchTasks []*batchCopTask, err error) { + if config.GetGlobalConfig().DisaggregatedTiFlash { + if config.GetGlobalConfig().UseAutoScaler { + batchTasks, err = buildBatchCopTasksConsistentHash(ctx, bo, store, rangesForEachPhysicalTable, storeType, ttl) + } else { + // todo: remove this after AutoScaler is stable. + batchTasks, err = buildBatchCopTasksConsistentHashForPD(bo, store, rangesForEachPhysicalTable, storeType, ttl) + } + } else { + batchTasks, err = buildBatchCopTasksCore(bo, store, rangesForEachPhysicalTable, storeType, isMPP, ttl, balanceWithContinuity, balanceContinuousRegionCount) + } if err != nil { return nil, err } @@ -542,10 +531,220 @@ func buildBatchCopTasksForPartitionedTable(bo *backoff.Backoffer, store *kvStore return batchTasks, nil } +func filterAliveStores(ctx context.Context, stores []*tikv.Store, ttl time.Duration, kvStore *kvStore) (aliveStores []*tikv.Store) { + storesStr := make([]string, 0, len(stores)) + for _, s := range stores { + storesStr = append(storesStr, s.GetAddr()) + } + + aliveIdx := filterAliveStoresHelper(ctx, storesStr, ttl, kvStore) + for _, idx := range aliveIdx { + aliveStores = append(aliveStores, stores[idx]) + } + return aliveStores +} + +func filterAliveStoresHelper(ctx context.Context, stores []string, ttl time.Duration, kvStore *kvStore) (aliveIdx []int) { + var wg sync.WaitGroup + var mu sync.Mutex + wg.Add(len(stores)) + for i := range stores { + go func(idx int) { + defer wg.Done() + s := stores[idx] + + // Check if store is failed already. + if ok := GlobalMPPFailedStoreProber.IsRecovery(ctx, s, ttl); !ok { + return + } + + tikvClient := kvStore.GetTiKVClient() + if ok := detectMPPStore(ctx, tikvClient, s, DetectTimeoutLimit); !ok { + GlobalMPPFailedStoreProber.Add(ctx, s, tikvClient) + return + } + + mu.Lock() + defer mu.Unlock() + aliveIdx = append(aliveIdx, idx) + }(i) + } + wg.Wait() + + logutil.BgLogger().Info("detecting available mpp stores", zap.Any("total", len(stores)), zap.Any("alive", len(aliveIdx))) + return aliveIdx +} + +func getTiFlashComputeRPCContextByConsistentHash(ids []tikv.RegionVerID, storesStr []string) (res []*tikv.RPCContext, err error) { + hasher := consistent.New() + for _, addr := range storesStr { + hasher.Add(addr) + } + + for _, id := range ids { + addr, err := hasher.Get(strconv.Itoa(int(id.GetID()))) + if err != nil { + return nil, err + } + + rpcCtx := &tikv.RPCContext{ + Region: id, + Addr: addr, + } + + res = append(res, rpcCtx) + } + return res, nil +} + +// 1. Split range by region location to build copTasks. +// 2. For each copTask build its rpcCtx , the target tiflash_compute node will be chosen using consistent hash. +// 3. All copTasks that will be sent to one tiflash_compute node are put in one batchCopTask. +func buildBatchCopTasksConsistentHash( + ctx context.Context, + bo *backoff.Backoffer, + kvStore *kvStore, + rangesForEachPhysicalTable []*KeyRanges, + storeType kv.StoreType, + ttl time.Duration) (res []*batchCopTask, err error) { + start := time.Now() + const cmdType = tikvrpc.CmdBatchCop + cache := kvStore.GetRegionCache() + fetchTopoBo := backoff.NewBackofferWithVars(ctx, fetchTopoMaxBackoff, nil) + + var ( + retryNum int + rangesLen int + storesStr []string + ) + + tasks := make([]*copTask, 0) + regionIDs := make([]tikv.RegionVerID, 0) + + for i, ranges := range rangesForEachPhysicalTable { + rangesLen += ranges.Len() + locations, err := cache.SplitKeyRangesByLocations(bo, ranges, UnspecifiedLimit) + if err != nil { + return nil, errors.Trace(err) + } + for _, lo := range locations { + tasks = append(tasks, &copTask{ + region: lo.Location.Region, + ranges: lo.Ranges, + cmdType: cmdType, + storeType: storeType, + partitionIndex: int64(i), + }) + regionIDs = append(regionIDs, lo.Location.Region) + } + } + splitKeyElapsed := time.Since(start) + + fetchTopoStart := time.Now() + for { + retryNum++ + // todo: use AssureAndGetTopo() after SNS is done. + storesStr, err = tiflashcompute.GetGlobalTopoFetcher().FetchAndGetTopo() + if err != nil { + return nil, err + } + if len(storesStr) == 0 { + retErr := errors.New("Cannot find proper topo from AutoScaler") + logutil.BgLogger().Info("buildBatchCopTasksConsistentHash retry because FetchAndGetTopo return empty topo", zap.Int("retryNum", retryNum)) + err := fetchTopoBo.Backoff(tikv.BoTiFlashRPC(), retErr) + if err != nil { + return nil, retErr + } + continue + } + break + } + fetchTopoElapsed := time.Since(fetchTopoStart) + + rpcCtxs, err := getTiFlashComputeRPCContextByConsistentHash(regionIDs, storesStr) + if err != nil { + return nil, err + } + if len(rpcCtxs) != len(tasks) { + return nil, errors.Errorf("length should be equal, len(rpcCtxs): %d, len(tasks): %d", len(rpcCtxs), len(tasks)) + } + taskMap := make(map[string]*batchCopTask) + for i, rpcCtx := range rpcCtxs { + regionInfo := RegionInfo{ + // tasks and rpcCtxs are correspond to each other. + Region: tasks[i].region, + Ranges: tasks[i].ranges, + PartitionIndex: tasks[i].partitionIndex, + // No need to setup regionMeta and Store info. + // Meta: rpcCtx.Meta, + // AllStores: []uint64{rpcCtx.Store.StoreID()}, + } + if batchTask, ok := taskMap[rpcCtx.Addr]; ok { + batchTask.regionInfos = append(batchTask.regionInfos, regionInfo) + } else { + batchTask := &batchCopTask{ + storeAddr: rpcCtx.Addr, + cmdType: cmdType, + ctx: rpcCtx, + regionInfos: []RegionInfo{regionInfo}, + } + taskMap[rpcCtx.Addr] = batchTask + res = append(res, batchTask) + } + } + logutil.BgLogger().Info("buildBatchCopTasksConsistentHash done", zap.Any("len(tasks)", len(taskMap)), zap.Any("len(tiflash_compute)", len(storesStr))) + + if log.GetLevel() <= zap.DebugLevel { + debugTaskMap := make(map[string]string, len(taskMap)) + for s, b := range taskMap { + debugTaskMap[s] = fmt.Sprintf("addr: %s; regionInfos: %v", b.storeAddr, b.regionInfos) + } + logutil.BgLogger().Debug("detailed info buildBatchCopTasksConsistentHash", zap.Any("taskMap", debugTaskMap), zap.Any("allStores", storesStr)) + } + + if elapsed := time.Since(start); elapsed > time.Millisecond*500 { + logutil.BgLogger().Warn("buildBatchCopTasksConsistentHash takes too much time", + zap.Duration("total elapsed", elapsed), + zap.Int("retryNum", retryNum), + zap.Duration("splitKeyElapsed", splitKeyElapsed), + zap.Duration("fetchTopoElapsed", fetchTopoElapsed), + zap.Int("range len", rangesLen), + zap.Int("copTaskNum", len(tasks)), + zap.Int("batchCopTaskNum", len(res))) + } + failpointCheckForConsistentHash(res) + return res, nil +} + +func failpointCheckForConsistentHash(tasks []*batchCopTask) { + failpoint.Inject("checkOnlyDispatchToTiFlashComputeNodes", func(val failpoint.Value) { + logutil.BgLogger().Debug("in checkOnlyDispatchToTiFlashComputeNodes") + + // This failpoint will be tested in test-infra case, because we needs setup a cluster. + // All tiflash_compute nodes addrs are stored in val, separated by semicolon. + str := val.(string) + addrs := strings.Split(str, ";") + if len(addrs) < 1 { + err := fmt.Sprintf("unexpected length of tiflash_compute node addrs: %v, %s", len(addrs), str) + panic(err) + } + addrMap := make(map[string]struct{}) + for _, addr := range addrs { + addrMap[addr] = struct{}{} + } + for _, batchTask := range tasks { + if _, ok := addrMap[batchTask.storeAddr]; !ok { + err := errors.Errorf("batchCopTask send to node which is not tiflash_compute: %v(tiflash_compute nodes: %s)", batchTask.storeAddr, str) + panic(err) + } + } + }) +} + // When `partitionIDs != nil`, it means that buildBatchCopTasksCore is constructing a batch cop tasks for PartitionTableScan. // At this time, `len(rangesForEachPhysicalTable) == len(partitionIDs)` and `rangesForEachPhysicalTable[i]` is for partition `partitionIDs[i]`. // Otherwise, `rangesForEachPhysicalTable[0]` indicates the range for the single physical table. -func buildBatchCopTasksCore(bo *backoff.Backoffer, store *kvStore, rangesForEachPhysicalTable []*KeyRanges, storeType kv.StoreType, mppStoreLastFailTime *sync.Map, ttl time.Duration, balanceWithContinuity bool, balanceContinuousRegionCount int64) ([]*batchCopTask, error) { +func buildBatchCopTasksCore(bo *backoff.Backoffer, store *kvStore, rangesForEachPhysicalTable []*KeyRanges, storeType kv.StoreType, isMPP bool, ttl time.Duration, balanceWithContinuity bool, balanceContinuousRegionCount int64) ([]*batchCopTask, error) { cache := store.GetRegionCache() start := time.Now() const cmdType = tikvrpc.CmdBatchCop @@ -556,7 +755,7 @@ func buildBatchCopTasksCore(bo *backoff.Backoffer, store *kvStore, rangesForEach rangesLen = 0 for i, ranges := range rangesForEachPhysicalTable { rangesLen += ranges.Len() - locations, err := cache.SplitKeyRangesByLocations(bo, ranges) + locations, err := cache.SplitKeyRangesByLocations(bo, ranges, UnspecifiedLimit) if err != nil { return nil, errors.Trace(err) } @@ -575,7 +774,6 @@ func buildBatchCopTasksCore(bo *backoff.Backoffer, store *kvStore, rangesForEach storeTaskMap := make(map[string]*batchCopTask) needRetry := false - isMPP := mppStoreLastFailTime != nil for _, task := range tasks { rpcCtx, err := cache.GetTiFlashRPCContext(bo.TiKVBackoffer(), task.region, isMPP) if err != nil { @@ -627,7 +825,7 @@ func buildBatchCopTasksCore(bo *backoff.Backoffer, store *kvStore, rangesForEach logutil.BgLogger().Debug(msg) } balanceStart := time.Now() - batchTasks = balanceBatchCopTask(bo.GetCtx(), store, batchTasks, mppStoreLastFailTime, ttl, balanceWithContinuity, balanceContinuousRegionCount) + batchTasks = balanceBatchCopTask(bo.GetCtx(), store, batchTasks, isMPP, ttl, balanceWithContinuity, balanceContinuousRegionCount) balanceElapsed := time.Since(balanceStart) if log.GetLevel() <= zap.DebugLevel { msg := "After region balance:" @@ -693,10 +891,11 @@ func (c *CopClient) sendBatch(ctx context.Context, req *kv.Request, vars *tikv.V keyRanges = append(keyRanges, NewKeyRanges(pi.KeyRanges)) partitionIDs = append(partitionIDs, pi.ID) } - tasks, err = buildBatchCopTasksForPartitionedTable(bo, c.store.kvStore, keyRanges, req.StoreType, nil, 0, false, 0, partitionIDs) + tasks, err = buildBatchCopTasksForPartitionedTable(ctx, bo, c.store.kvStore, keyRanges, req.StoreType, false, 0, false, 0, partitionIDs) } else { - ranges := NewKeyRanges(req.KeyRanges) - tasks, err = buildBatchCopTasksForNonPartitionedTable(bo, c.store.kvStore, ranges, req.StoreType, nil, 0, false, 0) + // TODO: merge the if branch. + ranges := NewKeyRanges(req.KeyRanges.FirstPartitionRange()) + tasks, err = buildBatchCopTasksForNonPartitionedTable(ctx, bo, c.store.kvStore, ranges, req.StoreType, false, 0, false, 0) } if err != nil { @@ -843,7 +1042,7 @@ func (b *batchCopIterator) retryBatchCopTask(ctx context.Context, bo *backoff.Ba ranges = append(ranges, *ran) }) } - ret, err := buildBatchCopTasksForNonPartitionedTable(bo, b.store, NewKeyRanges(ranges), b.req.StoreType, nil, 0, false, 0) + ret, err := buildBatchCopTasksForNonPartitionedTable(ctx, bo, b.store, NewKeyRanges(ranges), b.req.StoreType, false, 0, false, 0) return ret, err } // Retry Partition Table Scan @@ -862,7 +1061,7 @@ func (b *batchCopIterator) retryBatchCopTask(ctx context.Context, bo *backoff.Ba } keyRanges = append(keyRanges, NewKeyRanges(ranges)) } - ret, err := buildBatchCopTasksForPartitionedTable(bo, b.store, keyRanges, b.req.StoreType, nil, 0, false, 0, pid) + ret, err := buildBatchCopTasksForPartitionedTable(ctx, bo, b.store, keyRanges, b.req.StoreType, false, 0, false, 0, pid) return ret, err } @@ -895,7 +1094,7 @@ func (b *batchCopIterator) handleTaskOnce(ctx context.Context, bo *backoff.Backo if b.req.ResourceGroupTagger != nil { b.req.ResourceGroupTagger(req) } - req.StoreTp = tikvrpc.TiFlash + req.StoreTp = getEndPointType(kv.TiFlash) logutil.BgLogger().Debug("send batch request to ", zap.String("req info", req.String()), zap.Int("cop task len", len(task.regionInfos))) resp, retry, cancel, err := sender.SendReqToAddr(bo, task.ctx, task.regionInfos, req, readTimeoutUltraLong) @@ -1002,3 +1201,125 @@ func (b *batchCopIterator) handleCollectExecutionInfo(bo *Backoffer, resp *batch } resp.detail.CalleeAddress = task.storeAddr } + +// Only called when UseAutoScaler is false. +func buildBatchCopTasksConsistentHashForPD(bo *backoff.Backoffer, + kvStore *kvStore, + rangesForEachPhysicalTable []*KeyRanges, + storeType kv.StoreType, + ttl time.Duration) (res []*batchCopTask, err error) { + const cmdType = tikvrpc.CmdBatchCop + var ( + retryNum int + rangesLen int + copTaskNum int + splitKeyElapsed time.Duration + getStoreElapsed time.Duration + ) + cache := kvStore.GetRegionCache() + start := time.Now() + + for { + retryNum++ + rangesLen = 0 + tasks := make([]*copTask, 0) + regionIDs := make([]tikv.RegionVerID, 0) + + splitKeyStart := time.Now() + for i, ranges := range rangesForEachPhysicalTable { + rangesLen += ranges.Len() + locations, err := cache.SplitKeyRangesByLocations(bo, ranges, UnspecifiedLimit) + if err != nil { + return nil, errors.Trace(err) + } + for _, lo := range locations { + tasks = append(tasks, &copTask{ + region: lo.Location.Region, + ranges: lo.Ranges, + cmdType: cmdType, + storeType: storeType, + partitionIndex: int64(i), + }) + regionIDs = append(regionIDs, lo.Location.Region) + } + } + splitKeyElapsed += time.Since(splitKeyStart) + + getStoreStart := time.Now() + stores, err := cache.GetTiFlashComputeStores(bo.TiKVBackoffer()) + if err != nil { + return nil, err + } + stores = filterAliveStores(bo.GetCtx(), stores, ttl, kvStore) + if len(stores) == 0 { + return nil, errors.New("tiflash_compute node is unavailable") + } + getStoreElapsed = time.Since(getStoreStart) + + rpcCtxs, err := cache.GetTiFlashComputeRPCContextByConsistentHash(bo.TiKVBackoffer(), regionIDs, stores) + if err != nil { + return nil, err + } + if rpcCtxs == nil { + logutil.BgLogger().Info("buildBatchCopTasksConsistentHashForPD retry because rcpCtx is nil", zap.Int("retryNum", retryNum)) + err := bo.Backoff(tikv.BoTiFlashRPC(), errors.New("Cannot find region with TiFlash peer")) + if err != nil { + return nil, errors.Trace(err) + } + continue + } + if len(rpcCtxs) != len(tasks) { + return nil, errors.Errorf("length should be equal, len(rpcCtxs): %d, len(tasks): %d", len(rpcCtxs), len(tasks)) + } + copTaskNum = len(tasks) + taskMap := make(map[string]*batchCopTask) + for i, rpcCtx := range rpcCtxs { + regionInfo := RegionInfo{ + // tasks and rpcCtxs are correspond to each other. + Region: tasks[i].region, + Meta: rpcCtx.Meta, + Ranges: tasks[i].ranges, + AllStores: []uint64{rpcCtx.Store.StoreID()}, + PartitionIndex: tasks[i].partitionIndex, + } + if batchTask, ok := taskMap[rpcCtx.Addr]; ok { + batchTask.regionInfos = append(batchTask.regionInfos, regionInfo) + } else { + batchTask := &batchCopTask{ + storeAddr: rpcCtx.Addr, + cmdType: cmdType, + ctx: rpcCtx, + regionInfos: []RegionInfo{regionInfo}, + } + taskMap[rpcCtx.Addr] = batchTask + res = append(res, batchTask) + } + } + logutil.BgLogger().Info("buildBatchCopTasksConsistentHashForPD done", zap.Any("len(tasks)", len(taskMap)), zap.Any("len(tiflash_compute)", len(stores))) + if log.GetLevel() <= zap.DebugLevel { + debugStores := make([]string, 0, len(stores)) + for _, s := range stores { + debugStores = append(debugStores, s.GetAddr()) + } + debugTaskMap := make(map[string]string, len(taskMap)) + for s, b := range taskMap { + debugTaskMap[s] = fmt.Sprintf("addr: %s; regionInfos: %v", b.storeAddr, b.regionInfos) + } + logutil.BgLogger().Debug("detailed info buildBatchCopTasksConsistentHashForPD", zap.Any("taskMap", debugTaskMap), zap.Any("allStores", debugStores)) + } + break + } + + if elapsed := time.Since(start); elapsed > time.Millisecond*500 { + logutil.BgLogger().Warn("buildBatchCopTasksConsistentHashForPD takes too much time", + zap.Duration("total elapsed", elapsed), + zap.Int("retryNum", retryNum), + zap.Duration("splitKeyElapsed", splitKeyElapsed), + zap.Duration("getStoreElapsed", getStoreElapsed), + zap.Int("range len", rangesLen), + zap.Int("copTaskNum", copTaskNum), + zap.Int("batchCopTaskNum", len(res))) + } + failpointCheckForConsistentHash(res) + return res, nil +} diff --git a/store/copr/batch_coprocessor_test.go b/store/copr/batch_coprocessor_test.go index aafa19071a392..23f3b0cad8002 100644 --- a/store/copr/batch_coprocessor_test.go +++ b/store/copr/batch_coprocessor_test.go @@ -15,15 +15,21 @@ package copr import ( + "context" "math/rand" "sort" "strconv" "testing" "time" + "github.com/pingcap/errors" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/store/driver/backoff" + "github.com/pingcap/tidb/util/logutil" + "github.com/stathat/consistent" "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/tikv" + "go.uber.org/zap" ) // StoreID: [1, storeCount] @@ -119,13 +125,13 @@ func TestBalanceBatchCopTaskWithContinuity(t *testing.T) { func TestBalanceBatchCopTaskWithEmptyTaskSet(t *testing.T) { { var nilTaskSet []*batchCopTask - nilResult := balanceBatchCopTask(nil, nil, nilTaskSet, nil, time.Second, false, 0) + nilResult := balanceBatchCopTask(nil, nil, nilTaskSet, false, time.Second, false, 0) require.True(t, nilResult == nil) } { emptyTaskSet := make([]*batchCopTask, 0) - emptyResult := balanceBatchCopTask(nil, nil, emptyTaskSet, nil, time.Second, false, 0) + emptyResult := balanceBatchCopTask(nil, nil, emptyTaskSet, false, time.Second, false, 0) require.True(t, emptyResult != nil) require.True(t, len(emptyResult) == 0) } @@ -150,3 +156,76 @@ func TestDeepCopyStoreTaskMap(t *testing.T) { require.Equal(t, 2, len(task.regionInfos)) } } + +// Make sure no duplicated ip:addr. +func generateOneAddr() string { + var ip string + for i := 0; i < 4; i++ { + if i != 0 { + ip += "." + } + ip += strconv.Itoa(rand.Intn(255)) + } + return ip + ":" + strconv.Itoa(rand.Intn(65535)) +} + +func generateDifferentAddrs(num int) (res []string) { + addrMap := make(map[string]struct{}) + for len(addrMap) < num { + addr := generateOneAddr() + if _, ok := addrMap[addr]; !ok { + addrMap[addr] = struct{}{} + } + } + for addr := range addrMap { + res = append(res, addr) + } + return +} + +func TestConsistentHash(t *testing.T) { + allAddrs := generateDifferentAddrs(100) + + computeNodes := allAddrs[:30] + storageNodes := allAddrs[30:] + firstRoundMap := make(map[string]string) + for round := 0; round < 100; round++ { + hasher := consistent.New() + rand.Shuffle(len(computeNodes), func(i, j int) { + computeNodes[i], computeNodes[j] = computeNodes[j], computeNodes[i] + }) + for _, computeNode := range computeNodes { + hasher.Add(computeNode) + } + for _, storageNode := range storageNodes { + computeNode, err := hasher.Get(storageNode) + require.NoError(t, err) + if round == 0 { + firstRoundMap[storageNode] = computeNode + } else { + firstRoundAddr, ok := firstRoundMap[storageNode] + require.True(t, ok) + require.Equal(t, firstRoundAddr, computeNode) + } + } + } +} + +func TestTopoFetcherBackoff(t *testing.T) { + fetchTopoBo := backoff.NewBackofferWithVars(context.Background(), fetchTopoMaxBackoff, nil) + expectErr := errors.New("Cannot find proper topo from AutoScaler") + var retryNum int + start := time.Now() + for { + retryNum++ + if err := fetchTopoBo.Backoff(tikv.BoTiFlashRPC(), expectErr); err != nil { + break + } + logutil.BgLogger().Info("TestTopoFetcherBackoff", zap.Any("retryNum", retryNum)) + } + dura := time.Since(start) + // fetchTopoMaxBackoff is milliseconds. + require.GreaterOrEqual(t, dura, time.Duration(fetchTopoMaxBackoff*1000)) + require.GreaterOrEqual(t, dura, 30*time.Second) + require.LessOrEqual(t, dura, 50*time.Second) +} diff --git a/store/copr/batch_request_sender.go b/store/copr/batch_request_sender.go index b976d26a59ab3..2e2df9bd10076 100644 --- a/store/copr/batch_request_sender.go +++ b/store/copr/batch_request_sender.go @@ -21,6 +21,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/kvproto/pkg/coprocessor" "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/tidb/config" tikverr "github.com/tikv/client-go/v2/error" "github.com/tikv/client-go/v2/tikv" "github.com/tikv/client-go/v2/tikvrpc" @@ -98,13 +99,15 @@ func (ss *RegionBatchRequestSender) onSendFailForBatchRegions(bo *Backoffer, ctx return tikverr.ErrTiDBShuttingDown } - // The reload region param is always true. Because that every time we try, we must - // re-build the range then re-create the batch sender. As a result, the len of "failStores" - // will change. If tiflash's replica is more than two, the "reload region" will always be false. - // Now that the batch cop and mpp has a relative low qps, it's reasonable to reload every time - // when meeting io error. - rc := RegionCache{ss.GetRegionCache()} - rc.OnSendFailForBatchRegions(bo, ctx.Store, regionInfos, true, err) + if !config.GetGlobalConfig().DisaggregatedTiFlash { + // The reload region param is always true. Because that every time we try, we must + // re-build the range then re-create the batch sender. As a result, the len of "failStores" + // will change. If tiflash's replica is more than two, the "reload region" will always be false. + // Now that the batch cop and mpp has a relative low qps, it's reasonable to reload every time + // when meeting io error. + rc := RegionCache{ss.GetRegionCache()} + rc.OnSendFailForBatchRegions(bo, ctx.Store, regionInfos, true, err) + } // Retry on send request failure when it's not canceled. // When a store is not available, the leader of related region should be elected quickly. diff --git a/store/copr/copr_test/BUILD.bazel b/store/copr/copr_test/BUILD.bazel index af7d46d052bf5..e0ebf384543a2 100644 --- a/store/copr/copr_test/BUILD.bazel +++ b/store/copr/copr_test/BUILD.bazel @@ -2,10 +2,12 @@ load("@io_bazel_rules_go//go:def.bzl", "go_test") go_test( name = "copr_test_test", + timeout = "short", srcs = [ "coprocessor_test.go", "main_test.go", ], + flaky = True, deps = [ "//config", "//kv", diff --git a/store/copr/copr_test/coprocessor_test.go b/store/copr/copr_test/coprocessor_test.go index f92db7ba7c334..30247b8694a72 100644 --- a/store/copr/copr_test/coprocessor_test.go +++ b/store/copr/copr_test/coprocessor_test.go @@ -41,11 +41,11 @@ func TestBuildCopIteratorWithRowCountHint(t *testing.T) { vars := kv.NewVariables(&killed) opt := &kv.ClientSendOption{} + ranges := copr.BuildKeyRanges("a", "c", "d", "e", "h", "x", "y", "z") req := &kv.Request{ - Tp: kv.ReqTypeDAG, - KeyRanges: copr.BuildKeyRanges("a", "c", "d", "e", "h", "x", "y", "z"), - FixedRowCountHint: []int{1, 1, 3, copr.CopSmallTaskRow}, - Concurrency: 15, + Tp: kv.ReqTypeDAG, + KeyRanges: kv.NewNonParitionedKeyRangesWithHint(ranges, []int{1, 1, 3, copr.CopSmallTaskRow}), + Concurrency: 15, } it, errRes := copClient.BuildCopIterator(ctx, req, vars, opt) require.Nil(t, errRes) @@ -55,11 +55,11 @@ func TestBuildCopIteratorWithRowCountHint(t *testing.T) { require.Equal(t, smallConc, 1) require.Equal(t, rateLimit.GetCapacity(), 2) + ranges = copr.BuildKeyRanges("a", "c", "d", "e", "h", "x", "y", "z") req = &kv.Request{ - Tp: kv.ReqTypeDAG, - KeyRanges: copr.BuildKeyRanges("a", "c", "d", "e", "h", "x", "y", "z"), - FixedRowCountHint: []int{1, 1, 3, 3}, - Concurrency: 15, + Tp: kv.ReqTypeDAG, + KeyRanges: kv.NewNonParitionedKeyRangesWithHint(ranges, []int{1, 1, 3, 3}), + Concurrency: 15, } it, errRes = copClient.BuildCopIterator(ctx, req, vars, opt) require.Nil(t, errRes) @@ -70,11 +70,11 @@ func TestBuildCopIteratorWithRowCountHint(t *testing.T) { require.Equal(t, rateLimit.GetCapacity(), 3) // cross-region long range + ranges = copr.BuildKeyRanges("a", "z") req = &kv.Request{ - Tp: kv.ReqTypeDAG, - KeyRanges: copr.BuildKeyRanges("a", "z"), - FixedRowCountHint: []int{10}, - Concurrency: 15, + Tp: kv.ReqTypeDAG, + KeyRanges: kv.NewNonParitionedKeyRangesWithHint(ranges, []int{10}), + Concurrency: 15, } it, errRes = copClient.BuildCopIterator(ctx, req, vars, opt) require.Nil(t, errRes) @@ -84,11 +84,11 @@ func TestBuildCopIteratorWithRowCountHint(t *testing.T) { require.Equal(t, smallConc, 2) require.Equal(t, rateLimit.GetCapacity(), 3) + ranges = copr.BuildKeyRanges("a", "z") req = &kv.Request{ - Tp: kv.ReqTypeDAG, - KeyRanges: copr.BuildKeyRanges("a", "z"), - FixedRowCountHint: []int{copr.CopSmallTaskRow + 1}, - Concurrency: 15, + Tp: kv.ReqTypeDAG, + KeyRanges: kv.NewNonParitionedKeyRangesWithHint(ranges, []int{copr.CopSmallTaskRow + 1}), + Concurrency: 15, } it, errRes = copClient.BuildCopIterator(ctx, req, vars, opt) require.Nil(t, errRes) @@ -98,3 +98,87 @@ func TestBuildCopIteratorWithRowCountHint(t *testing.T) { require.Equal(t, smallConc, 0) require.Equal(t, rateLimit.GetCapacity(), 4) } + +func TestBuildCopIteratorWithBatchStoreCopr(t *testing.T) { + // nil --- 'g' --- 'n' --- 't' --- nil + // <- 0 -> <- 1 -> <- 2 -> <- 3 -> + store, err := mockstore.NewMockStore( + mockstore.WithClusterInspector(func(c testutils.Cluster) { + mockstore.BootstrapWithMultiRegions(c, []byte("g"), []byte("n"), []byte("t")) + }), + ) + require.NoError(t, err) + defer require.NoError(t, store.Close()) + copClient := store.GetClient().(*copr.CopClient) + ctx := context.Background() + killed := uint32(0) + vars := kv.NewVariables(&killed) + opt := &kv.ClientSendOption{} + + ranges := copr.BuildKeyRanges("a", "c", "d", "e", "h", "x", "y", "z") + req := &kv.Request{ + Tp: kv.ReqTypeDAG, + KeyRanges: kv.NewNonParitionedKeyRangesWithHint(ranges, []int{1, 1, 3, 3}), + Concurrency: 15, + StoreBatchSize: 1, + } + it, errRes := copClient.BuildCopIterator(ctx, req, vars, opt) + require.Nil(t, errRes) + tasks := it.GetTasks() + require.Equal(t, len(tasks), 2) + require.Equal(t, len(tasks[0].ToPBBatchTasks()), 1) + require.Equal(t, tasks[0].RowCountHint, 5) + require.Equal(t, len(tasks[1].ToPBBatchTasks()), 1) + require.Equal(t, tasks[1].RowCountHint, 9) + + ranges = copr.BuildKeyRanges("a", "c", "d", "e", "h", "x", "y", "z") + req = &kv.Request{ + Tp: kv.ReqTypeDAG, + KeyRanges: kv.NewNonParitionedKeyRangesWithHint(ranges, []int{1, 1, 3, 3}), + Concurrency: 15, + StoreBatchSize: 3, + } + it, errRes = copClient.BuildCopIterator(ctx, req, vars, opt) + require.Nil(t, errRes) + tasks = it.GetTasks() + require.Equal(t, len(tasks), 1) + require.Equal(t, len(tasks[0].ToPBBatchTasks()), 3) + require.Equal(t, tasks[0].RowCountHint, 14) + + // paging will disable store batch. + ranges = copr.BuildKeyRanges("a", "c", "d", "e", "h", "x", "y", "z") + req = &kv.Request{ + Tp: kv.ReqTypeDAG, + KeyRanges: kv.NewNonParitionedKeyRangesWithHint(ranges, []int{1, 1, 3, 3}), + Concurrency: 15, + StoreBatchSize: 3, + Paging: struct { + Enable bool + MinPagingSize uint64 + MaxPagingSize uint64 + }{ + Enable: true, + MinPagingSize: 1, + MaxPagingSize: 1024, + }, + } + it, errRes = copClient.BuildCopIterator(ctx, req, vars, opt) + require.Nil(t, errRes) + tasks = it.GetTasks() + require.Equal(t, len(tasks), 4) + + // only small tasks will be batched. + ranges = copr.BuildKeyRanges("a", "b", "h", "i", "o", "p") + req = &kv.Request{ + Tp: kv.ReqTypeDAG, + KeyRanges: kv.NewNonParitionedKeyRangesWithHint(ranges, []int{1, 33, 32}), + Concurrency: 15, + StoreBatchSize: 3, + } + it, errRes = copClient.BuildCopIterator(ctx, req, vars, opt) + require.Nil(t, errRes) + tasks = it.GetTasks() + require.Equal(t, len(tasks), 2) + require.Equal(t, len(tasks[0].ToPBBatchTasks()), 1) + require.Equal(t, len(tasks[1].ToPBBatchTasks()), 0) +} diff --git a/store/copr/coprocessor.go b/store/copr/coprocessor.go index 982e981f24c79..06ab6ab61efd1 100644 --- a/store/copr/coprocessor.go +++ b/store/copr/coprocessor.go @@ -15,7 +15,6 @@ package copr import ( - "bytes" "context" "fmt" "math" @@ -30,7 +29,9 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/coprocessor" + "github.com/pingcap/kvproto/pkg/errorpb" "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" @@ -44,6 +45,7 @@ import ( "github.com/pingcap/tidb/util/mathutil" "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/paging" + "github.com/pingcap/tidb/util/tracing" "github.com/pingcap/tidb/util/trxevents" "github.com/pingcap/tipb/go-tipb" "github.com/tikv/client-go/v2/metrics" @@ -53,7 +55,6 @@ import ( "github.com/tikv/client-go/v2/txnkv/txnsnapshot" "github.com/tikv/client-go/v2/util" "go.uber.org/zap" - "golang.org/x/exp/slices" ) var coprCacheCounterEvict = tidbmetrics.DistSQLCoprCacheCounter.WithLabelValues("evict") @@ -69,6 +70,7 @@ const ( copNextMaxBackoff = 20000 CopSmallTaskRow = 32 // 32 is the initial batch size of TiKV smallTaskSigma = 0.5 + smallConcPerCore = 20 ) // CopClient is coprocessor client. @@ -113,7 +115,6 @@ func (c *CopClient) BuildCopIterator(ctx context.Context, req *kv.Request, vars if req.StoreType == kv.TiDB { // coprocessor on TiDB doesn't support paging req.Paging.Enable = false - req.FixedRowCountHint = nil } if req.Tp != kv.ReqTypeDAG { // coprocessor request but type is not DAG @@ -121,25 +122,60 @@ func (c *CopClient) BuildCopIterator(ctx context.Context, req *kv.Request, vars } failpoint.Inject("checkKeyRangeSortedForPaging", func(_ failpoint.Value) { if req.Paging.Enable { - isSorted := slices.IsSortedFunc(req.KeyRanges, func(i, j kv.KeyRange) bool { - return bytes.Compare(i.StartKey, j.StartKey) < 0 - }) - if !isSorted { + if !req.KeyRanges.IsFullySorted() { logutil.BgLogger().Fatal("distsql request key range not sorted!") } } }) - if req.RequestSource.RequestSourceInternal || req.Tp != kv.ReqTypeDAG { - // disable extra concurrency for internal tasks. - req.FixedRowCountHint = nil + if req.Tp != kv.ReqTypeDAG || req.StoreType != kv.TiKV { + req.StoreBatchSize = 0 + } + // TODO: support keep-order batch + if req.ReplicaRead != kv.ReplicaReadLeader || req.KeepOrder { + // disable batch copr for follower read + req.StoreBatchSize = 0 + } + // disable batch copr when paging is enabled. + if req.Paging.Enable { + req.StoreBatchSize = 0 } - failpoint.Inject("disableFixedRowCountHint", func(_ failpoint.Value) { - req.FixedRowCountHint = nil - }) bo := backoff.NewBackofferWithVars(ctx, copBuildTaskMaxBackoff, vars) - ranges := NewKeyRanges(req.KeyRanges) - tasks, err := buildCopTasks(bo, c.store.GetRegionCache(), ranges, req, eventCb) + var ( + tasks []*copTask + err error + ) + tryRowHint := optRowHint(req) + elapsed := time.Duration(0) + buildOpt := &buildCopTaskOpt{ + req: req, + cache: c.store.GetRegionCache(), + eventCb: eventCb, + respChan: req.KeepOrder, + elapsed: &elapsed, + } + buildTaskFunc := func(ranges []kv.KeyRange, hints []int) error { + keyRanges := NewKeyRanges(ranges) + if tryRowHint { + buildOpt.rowHints = hints + } + tasksFromRanges, err := buildCopTasks(bo, keyRanges, buildOpt) + if err != nil { + return err + } + if len(tasks) == 0 { + tasks = tasksFromRanges + return nil + } + tasks = append(tasks, tasksFromRanges...) + return nil + } + // Here we build the task by partition, not directly by region. + // This is because it's possible that TiDB merge multiple small partition into one region which break some assumption. + // Keep it split by partition would be more safe. + err = req.KeyRanges.ForEachPartitionWithErr(buildTaskFunc) + // only batch store requests in first build. + req.StoreBatchSize = 0 reqType := "null" if req.ClosestReplicaReadAdjuster != nil { reqType = "miss" @@ -152,22 +188,23 @@ func (c *CopClient) BuildCopIterator(ctx context.Context, req *kv.Request, vars return nil, copErrorResponse{err} } it := &copIterator{ - store: c.store, - req: req, - concurrency: req.Concurrency, - finishCh: make(chan struct{}), - vars: vars, - memTracker: req.MemTracker, - replicaReadSeed: c.replicaReadSeed, - rpcCancel: tikv.NewRPCanceller(), + store: c.store, + req: req, + concurrency: req.Concurrency, + finishCh: make(chan struct{}), + vars: vars, + memTracker: req.MemTracker, + replicaReadSeed: c.replicaReadSeed, + rpcCancel: tikv.NewRPCanceller(), + buildTaskElapsed: *buildOpt.elapsed, } it.tasks = tasks if it.concurrency > len(tasks) { it.concurrency = len(tasks) } - if req.FixedRowCountHint != nil { + if tryRowHint { var smallTasks int - smallTasks, it.smallTaskConcurrency = smallTaskConcurrency(tasks) + smallTasks, it.smallTaskConcurrency = smallTaskConcurrency(tasks, c.store.numcpu) if len(tasks)-smallTasks < it.concurrency { it.concurrency = len(tasks) - smallTasks } @@ -184,7 +221,8 @@ func (c *CopClient) BuildCopIterator(ctx context.Context, req *kv.Request, vars // higher concurrency, the data is just cached and not consumed for a while, this increase the memory usage. // Set concurrency to 2 can reduce the memory usage and I've tested that it does not necessarily // decrease the performance. - if it.concurrency > 2 { + // For ReqTypeAnalyze, we keep its concurrency to avoid slow analyze(see https://github.com/pingcap/tidb/issues/40162 for details). + if it.concurrency > 2 && it.req.Tp != kv.ReqTypeAnalyze { oldConcurrency := it.concurrency it.concurrency = 2 @@ -210,6 +248,7 @@ func (c *CopClient) BuildCopIterator(ctx context.Context, req *kv.Request, vars // copTask contains a related Region and KeyRange for a kv.Request. type copTask struct { + taskID uint64 region tikv.RegionVerID bucketsVer uint64 ranges *KeyRanges @@ -227,6 +266,14 @@ type copTask struct { partitionIndex int64 // used by balanceBatchCopTask in PartitionTableScan requestSource util.RequestSource RowCountHint int // used for extra concurrency of small tasks, -1 for unknown row count + batchTaskList map[uint64]*batchedCopTask +} + +type batchedCopTask struct { + task *copTask + region coprocessor.RegionInfo + storeID uint64 + peer *metapb.Peer } func (r *copTask) String() string { @@ -234,17 +281,55 @@ func (r *copTask) String() string { r.region.GetID(), r.region.GetConfVer(), r.region.GetVer(), r.ranges.Len(), r.storeAddr) } +func (r *copTask) ToPBBatchTasks() []*coprocessor.StoreBatchTask { + if len(r.batchTaskList) == 0 { + return nil + } + pbTasks := make([]*coprocessor.StoreBatchTask, 0, len(r.batchTaskList)) + for _, task := range r.batchTaskList { + storeBatchTask := &coprocessor.StoreBatchTask{ + RegionId: task.region.GetRegionId(), + RegionEpoch: task.region.GetRegionEpoch(), + Peer: task.peer, + Ranges: task.region.GetRanges(), + TaskId: task.task.taskID, + } + pbTasks = append(pbTasks, storeBatchTask) + } + return pbTasks +} + // rangesPerTask limits the length of the ranges slice sent in one copTask. const rangesPerTask = 25000 -func buildCopTasks(bo *Backoffer, cache *RegionCache, ranges *KeyRanges, req *kv.Request, eventCb trxevents.EventCallback) ([]*copTask, error) { +type buildCopTaskOpt struct { + req *kv.Request + cache *RegionCache + eventCb trxevents.EventCallback + respChan bool + rowHints []int + elapsed *time.Duration +} + +func buildCopTasks(bo *Backoffer, ranges *KeyRanges, opt *buildCopTaskOpt) ([]*copTask, error) { + req, cache, eventCb, hints := opt.req, opt.cache, opt.eventCb, opt.rowHints start := time.Now() cmdType := tikvrpc.CmdCop if req.StoreType == kv.TiDB { return buildTiDBMemCopTasks(ranges, req) } - rangesLen := ranges.Len() + // something went wrong, disable hints to avoid out of range index. + if len(hints) != rangesLen { + hints = nil + } + + rangesPerTaskLimit := rangesPerTask + failpoint.Inject("setRangesPerTask", func(val failpoint.Value) { + if v, ok := val.(int); ok { + rangesPerTaskLimit = v + } + }) // TODO(youjiali1995): is there any request type that needn't be splitted by buckets? locs, err := cache.SplitKeyRangesByBuckets(bo, ranges) @@ -260,7 +345,12 @@ func buildCopTasks(bo *Backoffer, cache *RegionCache, ranges *KeyRanges, req *kv chanSize = 18 } - tasks := make([]*copTask, 0, len(locs)) + var builder taskBuilder + if req.StoreBatchSize > 0 && hints != nil { + builder = newBatchTaskBuilder(bo, req, cache) + } else { + builder = newLegacyTaskBuilder(len(locs)) + } origRangeIdx := 0 for _, loc := range locs { // TiKV will return gRPC error if the message is too large. So we need to limit the length of the ranges slice @@ -273,34 +363,33 @@ func buildCopTasks(bo *Backoffer, cache *RegionCache, ranges *KeyRanges, req *kv pagingSize = req.Paging.MinPagingSize } for i := 0; i < rLen; { - nextI := mathutil.Min(i+rangesPerTask, rLen) + nextI := mathutil.Min(i+rangesPerTaskLimit, rLen) hint := -1 // calculate the row count hint - if req.FixedRowCountHint != nil { - startKey, endKey := loc.Ranges.At(i).StartKey, loc.Ranges.At(nextI-1).EndKey + if hints != nil { + startKey, endKey := loc.Ranges.RefAt(i).StartKey, loc.Ranges.RefAt(nextI-1).EndKey // move to the previous range if startKey of current range is lower than endKey of previous location. // In the following example, task1 will move origRangeIdx to region(i, z). // When counting the row hint for task2, we need to move origRangeIdx back to region(a, h). // |<- region(a, h) ->| |<- region(i, z) ->| // |<- task1 ->| |<- task2 ->| ... - if origRangeIdx > 0 && ranges.At(origRangeIdx-1).EndKey.Cmp(startKey) > 0 { + if origRangeIdx > 0 && ranges.RefAt(origRangeIdx-1).EndKey.Cmp(startKey) > 0 { origRangeIdx-- } hint = 0 for nextOrigRangeIdx := origRangeIdx; nextOrigRangeIdx < ranges.Len(); nextOrigRangeIdx++ { - rangeStart := ranges.At(nextOrigRangeIdx).StartKey + rangeStart := ranges.RefAt(nextOrigRangeIdx).StartKey if rangeStart.Cmp(endKey) > 0 { origRangeIdx = nextOrigRangeIdx break } - hint += req.FixedRowCountHint[nextOrigRangeIdx] + hint += hints[nextOrigRangeIdx] } } - tasks = append(tasks, &copTask{ + task := &copTask{ region: loc.Location.Region, bucketsVer: loc.getBucketVersion(), ranges: loc.Ranges.Slice(i, nextI), - respChan: make(chan *copResponse, chanSize), cmdType: cmdType, storeType: req.StoreType, eventCb: eventCb, @@ -308,27 +397,158 @@ func buildCopTasks(bo *Backoffer, cache *RegionCache, ranges *KeyRanges, req *kv pagingSize: pagingSize, requestSource: req.RequestSource, RowCountHint: hint, - }) + } + // only keep-order need chan inside task. + // tasks by region error will reuse the channel of parent task. + if req.KeepOrder && opt.respChan { + task.respChan = make(chan *copResponse, chanSize) + } + if err = builder.handle(task); err != nil { + return nil, err + } i = nextI if req.Paging.Enable { - pagingSize = paging.GrowPagingSize(pagingSize, req.Paging.MaxPagingSize) + if req.LimitSize != 0 && req.LimitSize < pagingSize { + // disable paging for small limit. + task.paging = false + task.pagingSize = 0 + } else { + pagingSize = paging.GrowPagingSize(pagingSize, req.Paging.MaxPagingSize) + } } } } if req.Desc { - reverseTasks(tasks) + builder.reverse() } - if elapsed := time.Since(start); elapsed > time.Millisecond*500 { + tasks := builder.build() + elapsed := time.Since(start) + if elapsed > time.Millisecond*500 { logutil.BgLogger().Warn("buildCopTasks takes too much time", zap.Duration("elapsed", elapsed), zap.Int("range len", rangesLen), zap.Int("task len", len(tasks))) } - metrics.TxnRegionsNumHistogramWithCoprocessor.Observe(float64(len(tasks))) + if elapsed > time.Millisecond { + defer tracing.StartRegion(bo.GetCtx(), "copr.buildCopTasks").End() + } + if opt.elapsed != nil { + *opt.elapsed = *opt.elapsed + elapsed + } + metrics.TxnRegionsNumHistogramWithCoprocessor.Observe(float64(builder.regionNum())) return tasks, nil } +type taskBuilder interface { + handle(*copTask) error + reverse() + build() []*copTask + regionNum() int +} + +type legacyTaskBuilder struct { + tasks []*copTask +} + +func newLegacyTaskBuilder(hint int) *legacyTaskBuilder { + return &legacyTaskBuilder{ + tasks: make([]*copTask, 0, hint), + } +} + +func (b *legacyTaskBuilder) handle(task *copTask) error { + b.tasks = append(b.tasks, task) + return nil +} + +func (b *legacyTaskBuilder) regionNum() int { + return len(b.tasks) +} + +func (b *legacyTaskBuilder) reverse() { + reverseTasks(b.tasks) +} + +func (b *legacyTaskBuilder) build() []*copTask { + return b.tasks +} + +type batchStoreTaskBuilder struct { + bo *Backoffer + req *kv.Request + cache *RegionCache + taskID uint64 + limit int + store2Idx map[uint64]int + tasks []*copTask +} + +func newBatchTaskBuilder(bo *Backoffer, req *kv.Request, cache *RegionCache) *batchStoreTaskBuilder { + return &batchStoreTaskBuilder{ + bo: bo, + req: req, + cache: cache, + taskID: 0, + limit: req.StoreBatchSize, + store2Idx: make(map[uint64]int, 16), + tasks: make([]*copTask, 0, 16), + } +} + +func (b *batchStoreTaskBuilder) handle(task *copTask) (err error) { + b.taskID++ + task.taskID = b.taskID + handled := false + defer func() { + if !handled && err == nil { + // fallback to non-batch way. It's mainly caused by region miss. + b.tasks = append(b.tasks, task) + } + }() + // only batch small tasks for memory control. + if b.limit <= 0 || !isSmallTask(task) { + return nil + } + batchedTask, err := b.cache.BuildBatchTask(b.bo, task, b.req.ReplicaRead) + if err != nil { + return err + } + if batchedTask == nil { + return nil + } + if idx, ok := b.store2Idx[batchedTask.storeID]; !ok || len(b.tasks[idx].batchTaskList) >= b.limit { + b.tasks = append(b.tasks, batchedTask.task) + b.store2Idx[batchedTask.storeID] = len(b.tasks) - 1 + } else { + if b.tasks[idx].batchTaskList == nil { + b.tasks[idx].batchTaskList = make(map[uint64]*batchedCopTask, b.limit) + // disable paging for batched task. + b.tasks[idx].paging = false + b.tasks[idx].pagingSize = 0 + } + if task.RowCountHint > 0 { + b.tasks[idx].RowCountHint += task.RowCountHint + } + b.tasks[idx].batchTaskList[task.taskID] = batchedTask + } + handled = true + return nil +} + +func (b *batchStoreTaskBuilder) regionNum() int { + // we allocate b.taskID for each region task, so the final b.taskID is equal to the related region number. + return int(b.taskID) +} + +func (b *batchStoreTaskBuilder) reverse() { + reverseTasks(b.tasks) +} + +func (b *batchStoreTaskBuilder) build() []*copTask { + return b.tasks +} + func buildTiDBMemCopTasks(ranges *KeyRanges, req *kv.Request) ([]*copTask, error) { servers, err := infosync.GetAllServerInfo(context.Background()) if err != nil { @@ -365,12 +585,14 @@ func isSmallTask(task *copTask) bool { // strictly, only RowCountHint == -1 stands for unknown task rows, // but when RowCountHint == 0, it may be caused by initialized value, // to avoid the future bugs, let the tasks with RowCountHint == 0 be non-small tasks. - return task.RowCountHint > 0 && task.RowCountHint <= CopSmallTaskRow + return task.RowCountHint > 0 && + (len(task.batchTaskList) == 0 && task.RowCountHint <= CopSmallTaskRow) || + (len(task.batchTaskList) > 0 && task.RowCountHint <= 2*CopSmallTaskRow) } // smallTaskConcurrency counts the small tasks of tasks, // then returns the task count and extra concurrency for small tasks. -func smallTaskConcurrency(tasks []*copTask) (int, int) { +func smallTaskConcurrency(tasks []*copTask, numcpu int) (int, int) { res := 0 for _, task := range tasks { if isSmallTask(task) { @@ -382,8 +604,25 @@ func smallTaskConcurrency(tasks []*copTask) (int, int) { } // Calculate the extra concurrency for small tasks // extra concurrency = tasks / (1 + sigma * sqrt(log(tasks ^ 2))) - extraConc := float64(res) / (1 + smallTaskSigma*math.Sqrt(2*math.Log(float64(res)))) - return res, int(extraConc) + extraConc := int(float64(res) / (1 + smallTaskSigma*math.Sqrt(2*math.Log(float64(res))))) + if numcpu <= 0 { + numcpu = 1 + } + smallTaskConcurrencyLimit := smallConcPerCore * numcpu + if extraConc > smallTaskConcurrencyLimit { + extraConc = smallTaskConcurrencyLimit + } + return res, extraConc +} + +// CopInfo is used to expose functions of copIterator. +type CopInfo interface { + // GetConcurrency returns the concurrency and small task concurrency. + GetConcurrency() (int, int) + // GetStoreBatchInfo returns the batched and fallback num. + GetStoreBatchInfo() (uint64, uint64) + // GetBuildTaskElapsed returns the duration of building task. + GetBuildTaskElapsed() time.Duration } type copIterator struct { @@ -423,6 +662,10 @@ type copIterator struct { actionOnExceed *rateLimitAction pagingTaskIdx uint32 + + buildTaskElapsed time.Duration + storeBatchedNum atomic.Uint64 + storeBatchedFallbackNum atomic.Uint64 } // copIteratorWorker receives tasks from copIteratorTaskSender, handles tasks and sends the copResponse to respChan. @@ -442,6 +685,9 @@ type copIteratorWorker struct { enableCollectExecutionInfo bool pagingTaskIdx *uint32 + + storeBatchedNum *atomic.Uint64 + storeBatchedFallbackNum *atomic.Uint64 } // copIteratorTaskSender sends tasks to taskCh then wait for the workers to exit. @@ -539,7 +785,9 @@ func (worker *copIteratorWorker) run(ctx context.Context) { // there is a task finished. worker.sendToRespCh(finCopResp, worker.respChan, false) } - close(task.respChan) + if task.respChan != nil { + close(task.respChan) + } if worker.finished() { return } @@ -572,6 +820,8 @@ func (it *copIterator) open(ctx context.Context, enabledRateLimitAction, enableC replicaReadSeed: it.replicaReadSeed, enableCollectExecutionInfo: enableCollectExecutionInfo, pagingTaskIdx: &it.pagingTaskIdx, + storeBatchedNum: &it.storeBatchedNum, + storeBatchedFallbackNum: &it.storeBatchedFallbackNum, } go worker.run(ctx) } @@ -670,11 +920,26 @@ func (it *copIterator) GetConcurrency() (int, int) { return it.concurrency, it.smallTaskConcurrency } +// GetStoreBatchInfo returns the batched and fallback num. +func (it *copIterator) GetStoreBatchInfo() (uint64, uint64) { + return it.storeBatchedNum.Load(), it.storeBatchedFallbackNum.Load() +} + +// GetBuildTaskElapsed returns the duration of building task. +func (it *copIterator) GetBuildTaskElapsed() time.Duration { + return it.buildTaskElapsed +} + // GetSendRate returns the rate-limit object. func (it *copIterator) GetSendRate() *util.RateLimit { return it.sendRate } +// GetTasks returns the built tasks. +func (it *copIterator) GetTasks() []*copTask { + return it.tasks +} + func (sender *copIteratorTaskSender) sendToTaskCh(t *copTask, sendTo chan<- *copTask) (exit bool) { select { case sendTo <- t: @@ -858,41 +1123,20 @@ func (worker *copIteratorWorker) handleTaskOnce(bo *Backoffer, task *copTask, ch Ranges: task.ranges.ToPBRanges(), SchemaVer: worker.req.SchemaVar, PagingSize: task.pagingSize, + Tasks: task.ToPBBatchTasks(), } - var cacheKey []byte - var cacheValue *coprCacheValue - - // If there are many ranges, it is very likely to be a TableLookupRequest. They are not worth to cache since - // computing is not the main cost. Ignore such requests directly to avoid slowly building the cache key. - if task.cmdType == tikvrpc.CmdCop && worker.store.coprCache != nil && worker.req.Cacheable && worker.store.coprCache.CheckRequestAdmission(len(copReq.Ranges)) { - cKey, err := coprCacheBuildKey(&copReq) - if err == nil { - cacheKey = cKey - cValue := worker.store.coprCache.Get(cKey) - copReq.IsCacheEnabled = true - - if cValue != nil && cValue.RegionID == task.region.GetID() && cValue.TimeStamp <= worker.req.StartTs { - // Append cache version to the request to skip Coprocessor computation if possible - // when request result is cached - copReq.CacheIfMatchVersion = cValue.RegionDataVersion - cacheValue = cValue - } else { - copReq.CacheIfMatchVersion = 0 - } - } else { - logutil.BgLogger().Warn("Failed to build copr cache key", zap.Error(err)) - } - } + cacheKey, cacheValue := worker.buildCacheKey(task, &copReq) req := tikvrpc.NewReplicaReadRequest(task.cmdType, &copReq, options.GetTiKVReplicaReadType(worker.req.ReplicaRead), &worker.replicaReadSeed, kvrpcpb.Context{ - IsolationLevel: isolationLevelToPB(worker.req.IsolationLevel), - Priority: priorityToPB(worker.req.Priority), - NotFillCache: worker.req.NotFillCache, - RecordTimeStat: true, - RecordScanStat: true, - TaskId: worker.req.TaskID, - RequestSource: task.requestSource.GetRequestSource(), + IsolationLevel: isolationLevelToPB(worker.req.IsolationLevel), + Priority: priorityToPB(worker.req.Priority), + NotFillCache: worker.req.NotFillCache, + RecordTimeStat: true, + RecordScanStat: true, + TaskId: worker.req.TaskID, + RequestSource: task.requestSource.GetRequestSource(), + ResourceGroupName: worker.req.ResourceGroupName, }) if worker.req.ResourceGroupTagger != nil { worker.req.ResourceGroupTagger(req) @@ -1043,37 +1287,22 @@ func (worker *copIteratorWorker) handleCopResponse(bo *Backoffer, rpcCtx *tikv.R return nil, errors.Trace(err) } // We may meet RegionError at the first packet, but not during visiting the stream. - return buildCopTasks(bo, worker.store.GetRegionCache(), task.ranges, worker.req, task.eventCb) + remains, err := buildCopTasks(bo, task.ranges, &buildCopTaskOpt{ + req: worker.req, + cache: worker.store.GetRegionCache(), + respChan: false, + eventCb: task.eventCb, + }) + if err != nil { + return remains, err + } + return worker.handleBatchRemainsOnErr(bo, rpcCtx, remains, resp.pbResp.GetBatchResponses(), task, ch) } - var resolveLockDetail *util.ResolveLockDetail if lockErr := resp.pbResp.GetLocked(); lockErr != nil { - resolveLockDetail = worker.getLockResolverDetails() - // Be care that we didn't redact the SQL statement because the log is DEBUG level. - if task.eventCb != nil { - task.eventCb(trxevents.WrapCopMeetLock(&trxevents.CopMeetLock{ - LockInfo: lockErr, - })) - } else { - logutil.Logger(bo.GetCtx()).Debug("coprocessor encounters lock", - zap.Stringer("lock", lockErr)) - } - resolveLocksOpts := txnlock.ResolveLocksOptions{ - CallerStartTS: worker.req.StartTs, - Locks: []*txnlock.Lock{txnlock.NewLock(lockErr)}, - Detail: resolveLockDetail, - } - resolveLocksRes, err1 := worker.kvclient.ResolveLocksWithOpts(bo.TiKVBackoffer(), resolveLocksOpts) - err1 = derr.ToTiDBErr(err1) - if err1 != nil { - return nil, errors.Trace(err1) - } - msBeforeExpired := resolveLocksRes.TTL - if msBeforeExpired > 0 { - if err := bo.BackoffWithMaxSleepTxnLockFast(int(msBeforeExpired), errors.New(lockErr.String())); err != nil { - return nil, errors.Trace(err) - } + if err := worker.handleLockErr(bo, lockErr, task); err != nil { + return nil, err } - return []*copTask{task}, nil + return worker.handleBatchRemainsOnErr(bo, rpcCtx, []*copTask{task}, resp.pbResp.GetBatchResponses(), task, ch) } if otherErr := resp.pbResp.GetOtherError(); otherErr != "" { err := errors.Errorf("other error: %s", otherErr) @@ -1102,13 +1331,213 @@ func (worker *copIteratorWorker) handleCopResponse(bo *Backoffer, rpcCtx *tikv.R } else if task.ranges != nil && task.ranges.Len() > 0 { resp.startKey = task.ranges.At(0).StartKey } - worker.handleCollectExecutionInfo(bo, rpcCtx, resp, resolveLockDetail) + worker.handleCollectExecutionInfo(bo, rpcCtx, resp) resp.respTime = costTime + + if err := worker.handleCopCache(task, resp, cacheKey, cacheValue); err != nil { + return nil, err + } + + batchResps := resp.pbResp.BatchResponses + worker.sendToRespCh(resp, ch, true) + return worker.handleBatchCopResponse(bo, rpcCtx, batchResps, task.batchTaskList, ch) +} + +func (worker *copIteratorWorker) handleBatchRemainsOnErr(bo *Backoffer, rpcCtx *tikv.RPCContext, remains []*copTask, batchResp []*coprocessor.StoreBatchTaskResponse, task *copTask, ch chan<- *copResponse) ([]*copTask, error) { + if len(task.batchTaskList) == 0 { + return remains, nil + } + batchedTasks := task.batchTaskList + task.batchTaskList = nil + batchedRemains, err := worker.handleBatchCopResponse(bo, rpcCtx, batchResp, batchedTasks, ch) + if err != nil { + return nil, err + } + return append(remains, batchedRemains...), nil +} + +// handle the batched cop response. +// tasks will be changed, so the input tasks should not be used after calling this function. +func (worker *copIteratorWorker) handleBatchCopResponse(bo *Backoffer, rpcCtx *tikv.RPCContext, batchResps []*coprocessor.StoreBatchTaskResponse, + tasks map[uint64]*batchedCopTask, ch chan<- *copResponse) (remainTasks []*copTask, err error) { + if len(tasks) == 0 { + return nil, nil + } + batchedNum := len(tasks) + defer func() { + if err != nil { + return + } + worker.storeBatchedNum.Add(uint64(batchedNum - len(remainTasks))) + worker.storeBatchedFallbackNum.Add(uint64(len(remainTasks))) + }() + appendRemainTasks := func(tasks ...*copTask) { + if remainTasks == nil { + // allocate size fo remain length + remainTasks = make([]*copTask, 0, len(tasks)) + } + remainTasks = append(remainTasks, tasks...) + } + // need Addr for recording details. + var dummyRPCCtx *tikv.RPCContext + if rpcCtx != nil { + dummyRPCCtx = &tikv.RPCContext{ + Addr: rpcCtx.Addr, + } + } + for _, batchResp := range batchResps { + taskID := batchResp.GetTaskId() + batchedTask, ok := tasks[taskID] + if !ok { + return nil, errors.Errorf("task id %d not found", batchResp.GetTaskId()) + } + delete(tasks, taskID) + resp := &copResponse{ + pbResp: &coprocessor.Response{ + Data: batchResp.Data, + ExecDetailsV2: batchResp.ExecDetailsV2, + }, + } + task := batchedTask.task + failpoint.Inject("batchCopRegionError", func() { + batchResp.RegionError = &errorpb.Error{} + }) + if regionErr := batchResp.GetRegionError(); regionErr != nil { + errStr := fmt.Sprintf("region_id:%v, region_ver:%v, store_type:%s, peer_addr:%s, error:%s", + task.region.GetID(), task.region.GetVer(), task.storeType.Name(), task.storeAddr, regionErr.String()) + if err := bo.Backoff(tikv.BoRegionMiss(), errors.New(errStr)); err != nil { + return nil, errors.Trace(err) + } + remains, err := buildCopTasks(bo, task.ranges, &buildCopTaskOpt{ + req: worker.req, + cache: worker.store.GetRegionCache(), + respChan: false, + eventCb: task.eventCb, + }) + if err != nil { + return nil, err + } + appendRemainTasks(remains...) + continue + } + //TODO: handle locks in batch + if lockErr := batchResp.GetLocked(); lockErr != nil { + if err := worker.handleLockErr(bo, resp.pbResp.GetLocked(), task); err != nil { + return nil, err + } + appendRemainTasks(task) + continue + } + if otherErr := batchResp.GetOtherError(); otherErr != "" { + err := errors.Errorf("other error: %s", otherErr) + + firstRangeStartKey := task.ranges.At(0).StartKey + lastRangeEndKey := task.ranges.At(task.ranges.Len() - 1).EndKey + + logutil.Logger(bo.GetCtx()).Warn("other error", + zap.Uint64("txnStartTS", worker.req.StartTs), + zap.Uint64("regionID", task.region.GetID()), + zap.Uint64("bucketsVer", task.bucketsVer), + // TODO: add bucket version in log + //zap.Uint64("latestBucketsVer", batchResp.GetLatestBucketsVersion()), + zap.Int("rangeNums", task.ranges.Len()), + zap.ByteString("firstRangeStartKey", firstRangeStartKey), + zap.ByteString("lastRangeEndKey", lastRangeEndKey), + zap.String("storeAddr", task.storeAddr), + zap.Error(err)) + if strings.Contains(err.Error(), "write conflict") { + return nil, kv.ErrWriteConflict.FastGen("%s", otherErr) + } + return nil, errors.Trace(err) + } + worker.handleCollectExecutionInfo(bo, dummyRPCCtx, resp) + worker.sendToRespCh(resp, ch, true) + } + for _, t := range tasks { + task := t.task + // when the error is generated by client, response is empty, skip warning for this case. + if len(batchResps) != 0 { + firstRangeStartKey := task.ranges.At(0).StartKey + lastRangeEndKey := task.ranges.At(task.ranges.Len() - 1).EndKey + logutil.Logger(bo.GetCtx()).Error("response of batched task missing", + zap.Uint64("id", task.taskID), + zap.Uint64("txnStartTS", worker.req.StartTs), + zap.Uint64("regionID", task.region.GetID()), + zap.Uint64("bucketsVer", task.bucketsVer), + zap.Int("rangeNums", task.ranges.Len()), + zap.ByteString("firstRangeStartKey", firstRangeStartKey), + zap.ByteString("lastRangeEndKey", lastRangeEndKey), + zap.String("storeAddr", task.storeAddr)) + } + appendRemainTasks(t.task) + } + return remainTasks, nil +} + +func (worker *copIteratorWorker) handleLockErr(bo *Backoffer, lockErr *kvrpcpb.LockInfo, task *copTask) error { + if lockErr == nil { + return nil + } + resolveLockDetail := worker.getLockResolverDetails() + // Be care that we didn't redact the SQL statement because the log is DEBUG level. + if task.eventCb != nil { + task.eventCb(trxevents.WrapCopMeetLock(&trxevents.CopMeetLock{ + LockInfo: lockErr, + })) + } else { + logutil.Logger(bo.GetCtx()).Debug("coprocessor encounters lock", + zap.Stringer("lock", lockErr)) + } + resolveLocksOpts := txnlock.ResolveLocksOptions{ + CallerStartTS: worker.req.StartTs, + Locks: []*txnlock.Lock{txnlock.NewLock(lockErr)}, + Detail: resolveLockDetail, + } + resolveLocksRes, err1 := worker.kvclient.ResolveLocksWithOpts(bo.TiKVBackoffer(), resolveLocksOpts) + err1 = derr.ToTiDBErr(err1) + if err1 != nil { + return errors.Trace(err1) + } + msBeforeExpired := resolveLocksRes.TTL + if msBeforeExpired > 0 { + if err := bo.BackoffWithMaxSleepTxnLockFast(int(msBeforeExpired), errors.New(lockErr.String())); err != nil { + return errors.Trace(err) + } + } + return nil +} + +func (worker *copIteratorWorker) buildCacheKey(task *copTask, copReq *coprocessor.Request) (cacheKey []byte, cacheValue *coprCacheValue) { + // If there are many ranges, it is very likely to be a TableLookupRequest. They are not worth to cache since + // computing is not the main cost. Ignore requests with many ranges directly to avoid slowly building the cache key. + if task.cmdType == tikvrpc.CmdCop && worker.store.coprCache != nil && worker.req.Cacheable && worker.store.coprCache.CheckRequestAdmission(len(copReq.Ranges)) { + cKey, err := coprCacheBuildKey(copReq) + if err == nil { + cacheKey = cKey + cValue := worker.store.coprCache.Get(cKey) + copReq.IsCacheEnabled = true + + if cValue != nil && cValue.RegionID == task.region.GetID() && cValue.TimeStamp <= worker.req.StartTs { + // Append cache version to the request to skip Coprocessor computation if possible + // when request result is cached + copReq.CacheIfMatchVersion = cValue.RegionDataVersion + cacheValue = cValue + } else { + copReq.CacheIfMatchVersion = 0 + } + } else { + logutil.BgLogger().Warn("Failed to build copr cache key", zap.Error(err)) + } + } + return +} + +func (worker *copIteratorWorker) handleCopCache(task *copTask, resp *copResponse, cacheKey []byte, cacheValue *coprCacheValue) error { if resp.pbResp.IsCacheHit { - coprCacheCounterHit.Add(1) if cacheValue == nil { - return nil, errors.New("Internal error: received illegal TiKV response") + return errors.New("Internal error: received illegal TiKV response") } + coprCacheCounterHit.Add(1) // Cache hit and is valid: use cached data as response data and we don't update the cache. data := make([]byte, len(cacheValue.Data)) copy(data, cacheValue.Data) @@ -1134,34 +1563,32 @@ func (worker *copIteratorWorker) handleCopResponse(bo *Backoffer, rpcCtx *tikv.R } } resp.detail.CoprCacheHit = true - } else { - coprCacheCounterMiss.Add(1) - // Cache not hit or cache hit but not valid: update the cache if the response can be cached. - if cacheKey != nil && resp.pbResp.CanBeCached && resp.pbResp.CacheLastVersion > 0 { - if resp.detail != nil { - if worker.store.coprCache.CheckResponseAdmission(resp.pbResp.Data.Size(), resp.detail.TimeDetail.ProcessTime, task.pagingTaskIdx) { - data := make([]byte, len(resp.pbResp.Data)) - copy(data, resp.pbResp.Data) - - newCacheValue := coprCacheValue{ - Data: data, - TimeStamp: worker.req.StartTs, - RegionID: task.region.GetID(), - RegionDataVersion: resp.pbResp.CacheLastVersion, - } - // When paging protocol is used, the response key range is part of the cache data. - if r := resp.pbResp.GetRange(); r != nil { - newCacheValue.PageStart = append([]byte{}, r.GetStart()...) - newCacheValue.PageEnd = append([]byte{}, r.GetEnd()...) - } - - worker.store.coprCache.Set(cacheKey, &newCacheValue) + return nil + } + coprCacheCounterMiss.Add(1) + // Cache not hit or cache hit but not valid: update the cache if the response can be cached. + if cacheKey != nil && resp.pbResp.CanBeCached && resp.pbResp.CacheLastVersion > 0 { + if resp.detail != nil { + if worker.store.coprCache.CheckResponseAdmission(resp.pbResp.Data.Size(), resp.detail.TimeDetail.ProcessTime, task.pagingTaskIdx) { + data := make([]byte, len(resp.pbResp.Data)) + copy(data, resp.pbResp.Data) + + newCacheValue := coprCacheValue{ + Data: data, + TimeStamp: worker.req.StartTs, + RegionID: task.region.GetID(), + RegionDataVersion: resp.pbResp.CacheLastVersion, + } + // When paging protocol is used, the response key range is part of the cache data. + if r := resp.pbResp.GetRange(); r != nil { + newCacheValue.PageStart = append([]byte{}, r.GetStart()...) + newCacheValue.PageEnd = append([]byte{}, r.GetEnd()...) } + worker.store.coprCache.Set(cacheKey, &newCacheValue) } } } - worker.sendToRespCh(resp, ch, true) - return nil, nil + return nil } func (worker *copIteratorWorker) getLockResolverDetails() *util.ResolveLockDetail { @@ -1171,7 +1598,7 @@ func (worker *copIteratorWorker) getLockResolverDetails() *util.ResolveLockDetai return &util.ResolveLockDetail{} } -func (worker *copIteratorWorker) handleCollectExecutionInfo(bo *Backoffer, rpcCtx *tikv.RPCContext, resp *copResponse, resolveLockDetail *util.ResolveLockDetail) { +func (worker *copIteratorWorker) handleCollectExecutionInfo(bo *Backoffer, rpcCtx *tikv.RPCContext, resp *copResponse) { defer func() { worker.kvclient.Stats = nil }() @@ -1199,9 +1626,6 @@ func (worker *copIteratorWorker) handleCollectExecutionInfo(bo *Backoffer, rpcCt resp.detail.CalleeAddress = rpcCtx.Addr } sd := &util.ScanDetail{} - if resolveLockDetail != nil { - sd.ResolveLock = resolveLockDetail - } td := util.TimeDetail{} if pbDetails := resp.pbResp.ExecDetailsV2; pbDetails != nil { // Take values in `ExecDetailsV2` first. @@ -1507,3 +1931,18 @@ func BuildKeyRanges(keys ...string) []kv.KeyRange { } return ranges } + +func optRowHint(req *kv.Request) bool { + opt := true + if req.StoreType == kv.TiDB { + return false + } + if req.RequestSource.RequestSourceInternal || req.Tp != kv.ReqTypeDAG { + // disable extra concurrency for internal tasks. + return false + } + failpoint.Inject("disableFixedRowCountHint", func(_ failpoint.Value) { + opt = false + }) + return opt +} diff --git a/store/copr/coprocessor_test.go b/store/copr/coprocessor_test.go index 7790e8f7661fc..ed6f2c6f3cb81 100644 --- a/store/copr/coprocessor_test.go +++ b/store/copr/coprocessor_test.go @@ -22,11 +22,21 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/driver/backoff" "github.com/pingcap/tidb/util/paging" + "github.com/pingcap/tidb/util/trxevents" "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/testutils" "github.com/tikv/client-go/v2/tikv" ) +func buildTestCopTasks(bo *Backoffer, cache *RegionCache, ranges *KeyRanges, req *kv.Request, eventCb trxevents.EventCallback) ([]*copTask, error) { + return buildCopTasks(bo, ranges, &buildCopTaskOpt{ + req: req, + cache: cache, + eventCb: eventCb, + respChan: true, + }) +} + func TestBuildTasksWithoutBuckets(t *testing.T) { // nil --- 'g' --- 'n' --- 't' --- nil // <- 0 -> <- 1 -> <- 2 -> <- 3 -> @@ -39,7 +49,7 @@ func TestBuildTasksWithoutBuckets(t *testing.T) { }() _, regionIDs, _ := testutils.BootstrapWithMultiRegions(cluster, []byte("g"), []byte("n"), []byte("t")) - pdCli := &tikv.CodecPDClient{Client: pdClient} + pdCli := tikv.NewCodecPDClient(tikv.ModeTxn, pdClient) defer pdCli.Close() cache := NewRegionCache(tikv.NewRegionCache(pdCli)) @@ -50,49 +60,49 @@ func TestBuildTasksWithoutBuckets(t *testing.T) { req := &kv.Request{} flashReq := &kv.Request{} flashReq.StoreType = kv.TiFlash - tasks, err := buildCopTasks(bo, cache, buildCopRanges("a", "c"), req, nil) + tasks, err := buildTestCopTasks(bo, cache, buildCopRanges("a", "c"), req, nil) require.NoError(t, err) require.Len(t, tasks, 1) taskEqual(t, tasks[0], regionIDs[0], 0, "a", "c") - tasks, err = buildCopTasks(bo, cache, buildCopRanges("a", "c"), flashReq, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("a", "c"), flashReq, nil) require.NoError(t, err) require.Len(t, tasks, 1) taskEqual(t, tasks[0], regionIDs[0], 0, "a", "c") - tasks, err = buildCopTasks(bo, cache, buildCopRanges("g", "n"), req, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("g", "n"), req, nil) require.NoError(t, err) require.Len(t, tasks, 1) taskEqual(t, tasks[0], regionIDs[1], 0, "g", "n") - tasks, err = buildCopTasks(bo, cache, buildCopRanges("g", "n"), flashReq, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("g", "n"), flashReq, nil) require.NoError(t, err) require.Len(t, tasks, 1) taskEqual(t, tasks[0], regionIDs[1], 0, "g", "n") - tasks, err = buildCopTasks(bo, cache, buildCopRanges("m", "n"), req, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("m", "n"), req, nil) require.NoError(t, err) require.Len(t, tasks, 1) taskEqual(t, tasks[0], regionIDs[1], 0, "m", "n") - tasks, err = buildCopTasks(bo, cache, buildCopRanges("m", "n"), flashReq, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("m", "n"), flashReq, nil) require.NoError(t, err) require.Len(t, tasks, 1) taskEqual(t, tasks[0], regionIDs[1], 0, "m", "n") - tasks, err = buildCopTasks(bo, cache, buildCopRanges("a", "k"), req, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("a", "k"), req, nil) require.NoError(t, err) require.Len(t, tasks, 2) taskEqual(t, tasks[0], regionIDs[0], 0, "a", "g") taskEqual(t, tasks[1], regionIDs[1], 0, "g", "k") - tasks, err = buildCopTasks(bo, cache, buildCopRanges("a", "k"), flashReq, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("a", "k"), flashReq, nil) require.NoError(t, err) require.Len(t, tasks, 2) taskEqual(t, tasks[0], regionIDs[0], 0, "a", "g") taskEqual(t, tasks[1], regionIDs[1], 0, "g", "k") - tasks, err = buildCopTasks(bo, cache, buildCopRanges("a", "x"), req, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("a", "x"), req, nil) require.NoError(t, err) require.Len(t, tasks, 4) taskEqual(t, tasks[0], regionIDs[0], 0, "a", "g") @@ -100,7 +110,7 @@ func TestBuildTasksWithoutBuckets(t *testing.T) { taskEqual(t, tasks[2], regionIDs[2], 0, "n", "t") taskEqual(t, tasks[3], regionIDs[3], 0, "t", "x") - tasks, err = buildCopTasks(bo, cache, buildCopRanges("a", "x"), flashReq, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("a", "x"), flashReq, nil) require.NoError(t, err) require.Len(t, tasks, 4) taskEqual(t, tasks[0], regionIDs[0], 0, "a", "g") @@ -108,45 +118,45 @@ func TestBuildTasksWithoutBuckets(t *testing.T) { taskEqual(t, tasks[2], regionIDs[2], 0, "n", "t") taskEqual(t, tasks[3], regionIDs[3], 0, "t", "x") - tasks, err = buildCopTasks(bo, cache, buildCopRanges("a", "b", "b", "c"), req, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("a", "b", "b", "c"), req, nil) require.NoError(t, err) require.Len(t, tasks, 1) taskEqual(t, tasks[0], regionIDs[0], 0, "a", "b", "b", "c") - tasks, err = buildCopTasks(bo, cache, buildCopRanges("a", "b", "b", "c"), flashReq, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("a", "b", "b", "c"), flashReq, nil) require.NoError(t, err) require.Len(t, tasks, 1) taskEqual(t, tasks[0], regionIDs[0], 0, "a", "b", "b", "c") - tasks, err = buildCopTasks(bo, cache, buildCopRanges("a", "b", "e", "f"), req, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("a", "b", "e", "f"), req, nil) require.NoError(t, err) require.Len(t, tasks, 1) taskEqual(t, tasks[0], regionIDs[0], 0, "a", "b", "e", "f") - tasks, err = buildCopTasks(bo, cache, buildCopRanges("a", "b", "e", "f"), flashReq, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("a", "b", "e", "f"), flashReq, nil) require.NoError(t, err) require.Len(t, tasks, 1) taskEqual(t, tasks[0], regionIDs[0], 0, "a", "b", "e", "f") - tasks, err = buildCopTasks(bo, cache, buildCopRanges("g", "n", "o", "p"), req, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("g", "n", "o", "p"), req, nil) require.NoError(t, err) require.Len(t, tasks, 2) taskEqual(t, tasks[0], regionIDs[1], 0, "g", "n") taskEqual(t, tasks[1], regionIDs[2], 0, "o", "p") - tasks, err = buildCopTasks(bo, cache, buildCopRanges("g", "n", "o", "p"), flashReq, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("g", "n", "o", "p"), flashReq, nil) require.NoError(t, err) require.Len(t, tasks, 2) taskEqual(t, tasks[0], regionIDs[1], 0, "g", "n") taskEqual(t, tasks[1], regionIDs[2], 0, "o", "p") - tasks, err = buildCopTasks(bo, cache, buildCopRanges("h", "k", "m", "p"), req, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("h", "k", "m", "p"), req, nil) require.NoError(t, err) require.Len(t, tasks, 2) taskEqual(t, tasks[0], regionIDs[1], 0, "h", "k", "m", "n") taskEqual(t, tasks[1], regionIDs[2], 0, "n", "p") - tasks, err = buildCopTasks(bo, cache, buildCopRanges("h", "k", "m", "p"), flashReq, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("h", "k", "m", "p"), flashReq, nil) require.NoError(t, err) require.Len(t, tasks, 2) taskEqual(t, tasks[0], regionIDs[1], 0, "h", "k", "m", "n") @@ -168,7 +178,7 @@ func TestBuildTasksByBuckets(t *testing.T) { cluster.SplitRegionBuckets(regionIDs[0], [][]byte{{}, {'c'}, {'g'}, {'k'}, {'n'}}, regionIDs[0]) cluster.SplitRegionBuckets(regionIDs[1], [][]byte{{'n'}, {'t'}, {'x'}}, regionIDs[1]) cluster.SplitRegionBuckets(regionIDs[2], [][]byte{{'x'}, {}}, regionIDs[2]) - pdCli := &tikv.CodecPDClient{Client: pdClient} + pdCli := tikv.NewCodecPDClient(tikv.ModeTxn, pdClient) defer pdCli.Close() cache := NewRegionCache(tikv.NewRegionCache(pdCli)) @@ -191,7 +201,7 @@ func TestBuildTasksByBuckets(t *testing.T) { } for _, regionRange := range regionRanges { regionID, ranges := regionRange.regionID, regionRange.ranges - tasks, err := buildCopTasks(bo, cache, buildCopRanges(ranges...), req, nil) + tasks, err := buildTestCopTasks(bo, cache, buildCopRanges(ranges...), req, nil) require.NoError(t, err) require.Len(t, tasks, len(ranges)/2) for i, task := range tasks { @@ -204,7 +214,7 @@ func TestBuildTasksByBuckets(t *testing.T) { for _, regionRange := range regionRanges { allRanges = append(allRanges, regionRange.ranges...) } - tasks, err := buildCopTasks(bo, cache, buildCopRanges(allRanges...), req, nil) + tasks, err := buildTestCopTasks(bo, cache, buildCopRanges(allRanges...), req, nil) require.NoError(t, err) require.Len(t, tasks, len(allRanges)/2) taskIdx := 0 @@ -230,7 +240,7 @@ func TestBuildTasksByBuckets(t *testing.T) { "h", "i", "j", "k", "k", "l", "m", "n", } - tasks, err = buildCopTasks(bo, cache, buildCopRanges(keyRanges...), req, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges(keyRanges...), req, nil) require.NoError(t, err) require.Len(t, tasks, len(keyRanges)/4) for i, task := range tasks { @@ -251,7 +261,7 @@ func TestBuildTasksByBuckets(t *testing.T) { {"c", "d", "e", "g"}, {"g", "h", "i", "j"}, } - tasks, err = buildCopTasks(bo, cache, buildCopRanges(keyRanges...), req, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges(keyRanges...), req, nil) require.NoError(t, err) require.Len(t, tasks, len(expectedTaskRanges)) for i, task := range tasks { @@ -277,7 +287,7 @@ func TestBuildTasksByBuckets(t *testing.T) { cluster.SplitRegionBuckets(regionIDs[1], [][]byte{{'n'}, {'q'}, {'r'}, {'t'}, {'u'}, {'v'}, {'x'}}, regionIDs[1]) cache = NewRegionCache(tikv.NewRegionCache(pdCli)) defer cache.Close() - tasks, err = buildCopTasks(bo, cache, buildCopRanges("n", "o", "p", "q", "s", "w"), req, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("n", "o", "p", "q", "s", "w"), req, nil) require.NoError(t, err) require.Len(t, tasks, len(expectedTaskRanges)) for i, task := range tasks { @@ -301,7 +311,7 @@ func TestBuildTasksByBuckets(t *testing.T) { cluster.SplitRegionBuckets(regionIDs[1], [][]byte{{'q'}, {'s'}, {'u'}}, regionIDs[1]) cache = NewRegionCache(tikv.NewRegionCache(pdCli)) defer cache.Close() - tasks, err = buildCopTasks(bo, cache, buildCopRanges("n", "o", "p", "s", "t", "v", "w", "x"), req, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("n", "o", "p", "s", "t", "v", "w", "x"), req, nil) require.NoError(t, err) require.Len(t, tasks, len(expectedTaskRanges)) for i, task := range tasks { @@ -321,7 +331,7 @@ func TestBuildTasksByBuckets(t *testing.T) { cluster.SplitRegionBuckets(regionIDs[1], [][]byte{{'g'}, {'t'}, {'z'}}, regionIDs[1]) cache = NewRegionCache(tikv.NewRegionCache(pdCli)) defer cache.Close() - tasks, err = buildCopTasks(bo, cache, buildCopRanges("o", "p", "u", "w"), req, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("o", "p", "u", "w"), req, nil) require.NoError(t, err) require.Len(t, tasks, len(expectedTaskRanges)) for i, task := range tasks { @@ -343,7 +353,7 @@ func TestBuildTasksByBuckets(t *testing.T) { cluster.SplitRegionBuckets(regionIDs[1], [][]byte{{'n'}, {'q'}, {'r'}, {'x'}}, regionIDs[1]) cache = NewRegionCache(tikv.NewRegionCache(pdCli)) defer cache.Close() - tasks, err = buildCopTasks(bo, cache, buildCopRanges("n", "x"), req, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("n", "x"), req, nil) require.NoError(t, err) require.Len(t, tasks, len(expectedTaskRanges)) for i, task := range tasks { @@ -363,7 +373,7 @@ func TestSplitRegionRanges(t *testing.T) { }() testutils.BootstrapWithMultiRegions(cluster, []byte("g"), []byte("n"), []byte("t")) - pdCli := &tikv.CodecPDClient{Client: pdClient} + pdCli := tikv.NewCodecPDClient(tikv.ModeTxn, pdClient) defer pdCli.Close() cache := NewRegionCache(tikv.NewRegionCache(pdCli)) @@ -371,46 +381,51 @@ func TestSplitRegionRanges(t *testing.T) { bo := backoff.NewBackofferWithVars(context.Background(), 3000, nil) - ranges, err := cache.SplitRegionRanges(bo, BuildKeyRanges("a", "c")) + ranges, err := cache.SplitRegionRanges(bo, BuildKeyRanges("a", "c"), UnspecifiedLimit) require.NoError(t, err) require.Len(t, ranges, 1) rangeEqual(t, ranges, "a", "c") - ranges, err = cache.SplitRegionRanges(bo, BuildKeyRanges("h", "y")) + ranges, err = cache.SplitRegionRanges(bo, BuildKeyRanges("h", "y"), UnspecifiedLimit) require.NoError(t, err) require.Len(t, ranges, 3) rangeEqual(t, ranges, "h", "n", "n", "t", "t", "y") - ranges, err = cache.SplitRegionRanges(bo, BuildKeyRanges("s", "z")) + ranges, err = cache.SplitRegionRanges(bo, BuildKeyRanges("s", "z"), UnspecifiedLimit) require.NoError(t, err) require.Len(t, ranges, 2) rangeEqual(t, ranges, "s", "t", "t", "z") - ranges, err = cache.SplitRegionRanges(bo, BuildKeyRanges("s", "s")) + ranges, err = cache.SplitRegionRanges(bo, BuildKeyRanges("s", "s"), UnspecifiedLimit) require.NoError(t, err) require.Len(t, ranges, 1) rangeEqual(t, ranges, "s", "s") - ranges, err = cache.SplitRegionRanges(bo, BuildKeyRanges("t", "t")) + ranges, err = cache.SplitRegionRanges(bo, BuildKeyRanges("t", "t"), UnspecifiedLimit) require.NoError(t, err) require.Len(t, ranges, 1) rangeEqual(t, ranges, "t", "t") - ranges, err = cache.SplitRegionRanges(bo, BuildKeyRanges("t", "u")) + ranges, err = cache.SplitRegionRanges(bo, BuildKeyRanges("t", "u"), UnspecifiedLimit) require.NoError(t, err) require.Len(t, ranges, 1) rangeEqual(t, ranges, "t", "u") - ranges, err = cache.SplitRegionRanges(bo, BuildKeyRanges("u", "z")) + ranges, err = cache.SplitRegionRanges(bo, BuildKeyRanges("u", "z"), UnspecifiedLimit) require.NoError(t, err) require.Len(t, ranges, 1) rangeEqual(t, ranges, "u", "z") // min --> max - ranges, err = cache.SplitRegionRanges(bo, BuildKeyRanges("a", "z")) + ranges, err = cache.SplitRegionRanges(bo, BuildKeyRanges("a", "z"), UnspecifiedLimit) require.NoError(t, err) require.Len(t, ranges, 4) rangeEqual(t, ranges, "a", "g", "g", "n", "n", "t", "t", "z") + + ranges, err = cache.SplitRegionRanges(bo, BuildKeyRanges("a", "z"), 3) + require.NoError(t, err) + require.Len(t, ranges, 3) + rangeEqual(t, ranges, "a", "g", "g", "n", "n", "t") } func TestRebuild(t *testing.T) { @@ -425,14 +440,14 @@ func TestRebuild(t *testing.T) { }() storeID, regionIDs, peerIDs := testutils.BootstrapWithMultiRegions(cluster, []byte("m")) - pdCli := &tikv.CodecPDClient{Client: pdClient} + pdCli := tikv.NewCodecPDClient(tikv.ModeTxn, pdClient) defer pdCli.Close() cache := NewRegionCache(tikv.NewRegionCache(pdCli)) defer cache.Close() bo := backoff.NewBackofferWithVars(context.Background(), 3000, nil) req := &kv.Request{} - tasks, err := buildCopTasks(bo, cache, buildCopRanges("a", "z"), req, nil) + tasks, err := buildTestCopTasks(bo, cache, buildCopRanges("a", "z"), req, nil) require.NoError(t, err) require.Len(t, tasks, 2) taskEqual(t, tasks[0], regionIDs[0], 0, "a", "m") @@ -446,7 +461,7 @@ func TestRebuild(t *testing.T) { cache.InvalidateCachedRegion(tasks[1].region) req.Desc = true - tasks, err = buildCopTasks(bo, cache, buildCopRanges("a", "z"), req, nil) + tasks, err = buildTestCopTasks(bo, cache, buildCopRanges("a", "z"), req, nil) require.NoError(t, err) require.Len(t, tasks, 3) taskEqual(t, tasks[2], regionIDs[0], 0, "a", "m") @@ -488,7 +503,7 @@ func TestBuildPagingTasks(t *testing.T) { }() _, regionIDs, _ := testutils.BootstrapWithMultiRegions(cluster, []byte("g"), []byte("n"), []byte("t")) - pdCli := &tikv.CodecPDClient{Client: pdClient} + pdCli := tikv.NewCodecPDClient(tikv.ModeTxn, pdClient) defer pdCli.Close() cache := NewRegionCache(tikv.NewRegionCache(pdCli)) @@ -499,9 +514,7 @@ func TestBuildPagingTasks(t *testing.T) { req := &kv.Request{} req.Paging.Enable = true req.Paging.MinPagingSize = paging.MinPagingSize - flashReq := &kv.Request{} - flashReq.StoreType = kv.TiFlash - tasks, err := buildCopTasks(bo, cache, buildCopRanges("a", "c"), req, nil) + tasks, err := buildTestCopTasks(bo, cache, buildCopRanges("a", "c"), req, nil) require.NoError(t, err) require.Len(t, tasks, 1) require.Len(t, tasks, 1) @@ -510,6 +523,37 @@ func TestBuildPagingTasks(t *testing.T) { require.Equal(t, tasks[0].pagingSize, paging.MinPagingSize) } +func TestBuildPagingTasksDisablePagingForSmallLimit(t *testing.T) { + mockClient, cluster, pdClient, err := testutils.NewMockTiKV("", nil) + require.NoError(t, err) + defer func() { + pdClient.Close() + err = mockClient.Close() + require.NoError(t, err) + }() + _, regionIDs, _ := testutils.BootstrapWithMultiRegions(cluster, []byte("g"), []byte("n"), []byte("t")) + + pdCli := tikv.NewCodecPDClient(tikv.ModeTxn, pdClient) + defer pdCli.Close() + + cache := NewRegionCache(tikv.NewRegionCache(pdCli)) + defer cache.Close() + + bo := backoff.NewBackofferWithVars(context.Background(), 3000, nil) + + req := &kv.Request{} + req.Paging.Enable = true + req.Paging.MinPagingSize = paging.MinPagingSize + req.LimitSize = 1 + tasks, err := buildTestCopTasks(bo, cache, buildCopRanges("a", "c"), req, nil) + require.NoError(t, err) + require.Len(t, tasks, 1) + require.Len(t, tasks, 1) + taskEqual(t, tasks[0], regionIDs[0], 0, "a", "c") + require.False(t, tasks[0].paging) + require.Equal(t, tasks[0].pagingSize, uint64(0)) +} + func toCopRange(r kv.KeyRange) *coprocessor.KeyRange { coprRange := coprocessor.KeyRange{} coprRange.Start = r.StartKey @@ -652,7 +696,7 @@ func TestBasicSmallTaskConc(t *testing.T) { require.True(t, isSmallTask(&copTask{RowCountHint: 6})) require.True(t, isSmallTask(&copTask{RowCountHint: CopSmallTaskRow})) require.False(t, isSmallTask(&copTask{RowCountHint: CopSmallTaskRow + 1})) - _, conc := smallTaskConcurrency([]*copTask{}) + _, conc := smallTaskConcurrency([]*copTask{}, 16) require.GreaterOrEqual(t, conc, 0) } @@ -667,15 +711,19 @@ func TestBuildCopTasksWithRowCountHint(t *testing.T) { require.NoError(t, err) }() _, _, _ = testutils.BootstrapWithMultiRegions(cluster, []byte("g"), []byte("n"), []byte("t")) - pdCli := &tikv.CodecPDClient{Client: pdClient} + pdCli := tikv.NewCodecPDClient(tikv.ModeTxn, pdClient) defer pdCli.Close() cache := NewRegionCache(tikv.NewRegionCache(pdCli)) defer cache.Close() bo := backoff.NewBackofferWithVars(context.Background(), 3000, nil) req := &kv.Request{} - req.FixedRowCountHint = []int{1, 1, 3, CopSmallTaskRow} - tasks, err := buildCopTasks(bo, cache, buildCopRanges("a", "c", "d", "e", "h", "x", "y", "z"), req, nil) + ranges := buildCopRanges("a", "c", "d", "e", "h", "x", "y", "z") + tasks, err := buildCopTasks(bo, ranges, &buildCopTaskOpt{ + req: req, + cache: cache, + rowHints: []int{1, 1, 3, CopSmallTaskRow}, + }) require.Nil(t, err) require.Equal(t, len(tasks), 4) // task[0] ["a"-"c", "d"-"e"] @@ -686,11 +734,15 @@ func TestBuildCopTasksWithRowCountHint(t *testing.T) { require.Equal(t, tasks[2].RowCountHint, 3) // task[3] ["t"-"x", "y"-"z"] require.Equal(t, tasks[3].RowCountHint, 3+CopSmallTaskRow) - _, conc := smallTaskConcurrency(tasks) + _, conc := smallTaskConcurrency(tasks, 16) require.Equal(t, conc, 1) - req.FixedRowCountHint = []int{1, 1, 3, 3} - tasks, err = buildCopTasks(bo, cache, buildCopRanges("a", "c", "d", "e", "h", "x", "y", "z"), req, nil) + ranges = buildCopRanges("a", "c", "d", "e", "h", "x", "y", "z") + tasks, err = buildCopTasks(bo, ranges, &buildCopTaskOpt{ + req: req, + cache: cache, + rowHints: []int{1, 1, 3, 3}, + }) require.Nil(t, err) require.Equal(t, len(tasks), 4) // task[0] ["a"-"c", "d"-"e"] @@ -701,12 +753,16 @@ func TestBuildCopTasksWithRowCountHint(t *testing.T) { require.Equal(t, tasks[2].RowCountHint, 3) // task[3] ["t"-"x", "y"-"z"] require.Equal(t, tasks[3].RowCountHint, 6) - _, conc = smallTaskConcurrency(tasks) + _, conc = smallTaskConcurrency(tasks, 16) require.Equal(t, conc, 2) // cross-region long range - req.FixedRowCountHint = []int{10} - tasks, err = buildCopTasks(bo, cache, buildCopRanges("a", "z"), req, nil) + ranges = buildCopRanges("a", "z") + tasks, err = buildCopTasks(bo, ranges, &buildCopTaskOpt{ + req: req, + cache: cache, + rowHints: []int{10}, + }) require.Nil(t, err) require.Equal(t, len(tasks), 4) // task[0] ["a"-"g"] @@ -718,3 +774,20 @@ func TestBuildCopTasksWithRowCountHint(t *testing.T) { // task[3] ["t"-"z"] require.Equal(t, tasks[3].RowCountHint, 10) } + +func TestSmallTaskConcurrencyLimit(t *testing.T) { + smallTaskCount := 1000 + tasks := make([]*copTask, 0, smallTaskCount) + for i := 0; i < smallTaskCount; i++ { + tasks = append(tasks, &copTask{ + RowCountHint: 1, + }) + } + count, conc := smallTaskConcurrency(tasks, 1) + require.Equal(t, smallConcPerCore, conc) + require.Equal(t, smallTaskCount, count) + // also handle 0 value. + count, conc = smallTaskConcurrency(tasks, 0) + require.Equal(t, smallConcPerCore, conc) + require.Equal(t, smallTaskCount, count) +} diff --git a/store/copr/key_ranges.go b/store/copr/key_ranges.go index 86dcf036fed4e..67effbbc8b7a1 100644 --- a/store/copr/key_ranges.go +++ b/store/copr/key_ranges.go @@ -58,18 +58,23 @@ func (r *KeyRanges) Len() int { return l } -// At returns the range at the ith position. -func (r *KeyRanges) At(i int) kv.KeyRange { +// RefAt returns the reference at the ith position without copy. +func (r *KeyRanges) RefAt(i int) *kv.KeyRange { if r.first != nil { if i == 0 { - return *r.first + return r.first } i-- } if i < len(r.mid) { - return r.mid[i] + return &r.mid[i] } - return *r.last + return r.last +} + +// At returns the range at the ith position. +func (r *KeyRanges) At(i int) kv.KeyRange { + return *r.RefAt(i) } // Slice returns the sub ranges [from, to). diff --git a/store/copr/mpp.go b/store/copr/mpp.go index 5c159bc355ab1..1c4ef6a40e85a 100644 --- a/store/copr/mpp.go +++ b/store/copr/mpp.go @@ -16,6 +16,7 @@ package copr import ( "context" + "fmt" "io" "strconv" "sync" @@ -35,6 +36,7 @@ import ( "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/mathutil" + "github.com/pingcap/tidb/util/memory" "github.com/tikv/client-go/v2/tikv" "github.com/tikv/client-go/v2/tikvrpc" "go.uber.org/zap" @@ -62,7 +64,7 @@ func (c *MPPClient) selectAllTiFlashStore() []kv.MPPTaskMeta { } // ConstructMPPTasks receives ScheduleRequest, which are actually collects of kv ranges. We allocates MPPTaskMeta for them and returns. -func (c *MPPClient) ConstructMPPTasks(ctx context.Context, req *kv.MPPBuildTasksRequest, mppStoreLastFailTime *sync.Map, ttl time.Duration) ([]kv.MPPTaskMeta, error) { +func (c *MPPClient) ConstructMPPTasks(ctx context.Context, req *kv.MPPBuildTasksRequest, ttl time.Duration) ([]kv.MPPTaskMeta, error) { ctx = context.WithValue(ctx, tikv.TxnStartKey(), req.StartTS) bo := backoff.NewBackofferWithVars(ctx, copBuildTaskMaxBackoff, nil) var tasks []*batchCopTask @@ -74,13 +76,13 @@ func (c *MPPClient) ConstructMPPTasks(ctx context.Context, req *kv.MPPBuildTasks rangesForEachPartition[i] = NewKeyRanges(p.KeyRanges) partitionIDs[i] = p.ID } - tasks, err = buildBatchCopTasksForPartitionedTable(bo, c.store, rangesForEachPartition, kv.TiFlash, mppStoreLastFailTime, ttl, true, 20, partitionIDs) + tasks, err = buildBatchCopTasksForPartitionedTable(ctx, bo, c.store, rangesForEachPartition, kv.TiFlash, true, ttl, true, 20, partitionIDs) } else { if req.KeyRanges == nil { return c.selectAllTiFlashStore(), nil } ranges := NewKeyRanges(req.KeyRanges) - tasks, err = buildBatchCopTasksForNonPartitionedTable(bo, c.store, ranges, kv.TiFlash, mppStoreLastFailTime, ttl, true, 20) + tasks, err = buildBatchCopTasksForNonPartitionedTable(ctx, bo, c.store, ranges, kv.TiFlash, true, ttl, true, 20) } if err != nil { @@ -143,13 +145,17 @@ type mppIterator struct { tasks []*kv.MPPDispatchRequest finishCh chan struct{} - startTs uint64 + startTs uint64 + mppQueryID kv.MPPQueryID + + mppVersion kv.MppVersion respChan chan *mppResponse cancelFunc context.CancelFunc - wg sync.WaitGroup + wg sync.WaitGroup + wgDoneChan chan struct{} closed uint32 @@ -160,6 +166,8 @@ type mppIterator struct { mu sync.Mutex enableCollectExecutionInfo bool + + memTracker *memory.Tracker } func (m *mppIterator) run(ctx context.Context) { @@ -188,6 +196,7 @@ func (m *mppIterator) run(ctx context.Context) { }(task) } m.wg.Wait() + close(m.wgDoneChan) close(m.respChan) } @@ -197,6 +206,22 @@ func (m *mppIterator) sendError(err error) { } func (m *mppIterator) sendToRespCh(resp *mppResponse) (exit bool) { + defer func() { + if r := recover(); r != nil { + logutil.BgLogger().Error("mppIterator panic", zap.Stack("stack"), zap.Any("recover", r)) + m.sendError(errors.New(fmt.Sprint(r))) + } + }() + if m.memTracker != nil { + respSize := resp.MemSize() + failpoint.Inject("testMPPOOMPanic", func(val failpoint.Value) { + if val.(bool) && respSize != 0 { + respSize = 1 << 30 + } + }) + m.memTracker.Consume(respSize) + defer m.memTracker.Consume(-respSize) + } select { case m.respChan <- resp: case <-m.finishCh: @@ -218,7 +243,10 @@ func (m *mppIterator) handleDispatchReq(ctx context.Context, bo *Backoffer, req } // meta for current task. - taskMeta := &mpp.TaskMeta{StartTs: req.StartTs, TaskId: req.ID, Address: req.Meta.GetAddress()} + taskMeta := &mpp.TaskMeta{StartTs: req.StartTs, QueryTs: req.MppQueryID.QueryTs, LocalQueryId: req.MppQueryID.LocalQueryID, TaskId: req.ID, ServerId: req.MppQueryID.ServerID, + Address: req.Meta.GetAddress(), + MppVersion: m.mppVersion.ToInt64(), + } mppReq := &mpp.DispatchTaskRequest{ Meta: taskMeta, @@ -236,12 +264,14 @@ func (m *mppIterator) handleDispatchReq(ctx context.Context, bo *Backoffer, req } wrappedReq := tikvrpc.NewRequest(tikvrpc.CmdMPPTask, mppReq, kvrpcpb.Context{}) - wrappedReq.StoreTp = tikvrpc.TiFlash + wrappedReq.StoreTp = getEndPointType(kv.TiFlash) // TODO: Handle dispatch task response correctly, including retry logic and cancel logic. var rpcResp *tikvrpc.Response var err error var retry bool + invalidPDCache := config.GetGlobalConfig().DisaggregatedTiFlash && !config.GetGlobalConfig().UseAutoScaler + // If copTasks is not empty, we should send request according to region distribution. // Or else it's the task without region, which always happens in high layer task without table. // In that case @@ -252,7 +282,10 @@ func (m *mppIterator) handleDispatchReq(ctx context.Context, bo *Backoffer, req // TODO: If we want to retry, we must redo the plan fragment cutting and task scheduling. // That's a hard job but we can try it in the future. if sender.GetRPCError() != nil { - logutil.BgLogger().Warn("mpp dispatch meet io error", zap.String("error", sender.GetRPCError().Error()), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId)) + logutil.BgLogger().Warn("mpp dispatch meet io error", zap.String("error", sender.GetRPCError().Error()), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId), zap.Int64("mpp-version", taskMeta.MppVersion)) + if invalidPDCache { + m.store.GetRegionCache().InvalidateTiFlashComputeStores() + } // if needTriggerFallback is true, we return timeout to trigger tikv's fallback if m.needTriggerFallback { err = derr.ErrTiFlashServerTimeout @@ -265,6 +298,9 @@ func (m *mppIterator) handleDispatchReq(ctx context.Context, bo *Backoffer, req if errors.Cause(err) == context.Canceled || status.Code(errors.Cause(err)) == codes.Canceled { retry = false } else if err != nil { + if invalidPDCache { + m.store.GetRegionCache().InvalidateTiFlashComputeStores() + } if bo.Backoff(tikv.BoTiFlashRPC(), err) == nil { retry = true } @@ -272,13 +308,13 @@ func (m *mppIterator) handleDispatchReq(ctx context.Context, bo *Backoffer, req } if retry { - logutil.BgLogger().Warn("mpp dispatch meet error and retrying", zap.Error(err), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId)) + logutil.BgLogger().Warn("mpp dispatch meet error and retrying", zap.Error(err), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId), zap.Int64("mpp-version", taskMeta.MppVersion)) m.handleDispatchReq(ctx, bo, req) return } if err != nil { - logutil.BgLogger().Error("mpp dispatch meet error", zap.String("error", err.Error()), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId)) + logutil.BgLogger().Error("mpp dispatch meet error", zap.String("error", err.Error()), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId), zap.Int64("mpp-version", taskMeta.MppVersion)) // if needTriggerFallback is true, we return timeout to trigger tikv's fallback if m.needTriggerFallback { err = derr.ErrTiFlashServerTimeout @@ -290,7 +326,7 @@ func (m *mppIterator) handleDispatchReq(ctx context.Context, bo *Backoffer, req realResp := rpcResp.Resp.(*mpp.DispatchTaskResponse) if realResp.Error != nil { - logutil.BgLogger().Error("mpp dispatch response meet error", zap.String("error", realResp.Error.Msg), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId)) + logutil.BgLogger().Error("mpp dispatch response meet error", zap.String("error", realResp.Error.Msg), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId), zap.Int64("task-mpp-version", taskMeta.MppVersion), zap.Int64("error-mpp-version", realResp.Error.GetMppVersion())) m.sendError(errors.New(realResp.Error.Msg)) return } @@ -324,11 +360,11 @@ func (m *mppIterator) cancelMppTasks() { m.mu.Lock() defer m.mu.Unlock() killReq := &mpp.CancelTaskRequest{ - Meta: &mpp.TaskMeta{StartTs: m.startTs}, + Meta: &mpp.TaskMeta{StartTs: m.startTs, QueryTs: m.mppQueryID.QueryTs, LocalQueryId: m.mppQueryID.LocalQueryID, ServerId: m.mppQueryID.ServerID, MppVersion: m.mppVersion.ToInt64()}, } wrappedReq := tikvrpc.NewRequest(tikvrpc.CmdMPPCancel, killReq, kvrpcpb.Context{}) - wrappedReq.StoreTp = tikvrpc.TiFlash + wrappedReq.StoreTp = getEndPointType(kv.TiFlash) usedStoreAddrs := make(map[string]bool) for _, task := range m.tasks { @@ -342,38 +378,55 @@ func (m *mppIterator) cancelMppTasks() { } // send cancel cmd to all stores where tasks run + invalidPDCache := config.GetGlobalConfig().DisaggregatedTiFlash && !config.GetGlobalConfig().UseAutoScaler wg := util.WaitGroupWrapper{} + gotErr := atomic.Bool{} for addr := range usedStoreAddrs { storeAddr := addr wg.Run(func() { _, err := m.store.GetTiKVClient().SendRequest(context.Background(), storeAddr, wrappedReq, tikv.ReadTimeoutShort) - logutil.BgLogger().Debug("cancel task", zap.Uint64("query id ", m.startTs), zap.String("on addr", storeAddr)) + logutil.BgLogger().Debug("cancel task", zap.Uint64("query id ", m.startTs), zap.String("on addr", storeAddr), zap.Int64("mpp-version", m.mppVersion.ToInt64())) if err != nil { - logutil.BgLogger().Error("cancel task error", zap.Error(err), zap.Uint64("query id", m.startTs), zap.String("on addr", storeAddr)) + logutil.BgLogger().Error("cancel task error", zap.Error(err), zap.Uint64("query id", m.startTs), zap.String("on addr", storeAddr), zap.Int64("mpp-version", m.mppVersion.ToInt64())) + if invalidPDCache { + gotErr.CompareAndSwap(false, true) + } } }) } wg.Wait() + if invalidPDCache && gotErr.Load() { + m.store.GetRegionCache().InvalidateTiFlashComputeStores() + } } func (m *mppIterator) establishMPPConns(bo *Backoffer, req *kv.MPPDispatchRequest, taskMeta *mpp.TaskMeta) { connReq := &mpp.EstablishMPPConnectionRequest{ SenderMeta: taskMeta, ReceiverMeta: &mpp.TaskMeta{ - StartTs: req.StartTs, - TaskId: -1, + StartTs: req.StartTs, + QueryTs: m.mppQueryID.QueryTs, + LocalQueryId: m.mppQueryID.LocalQueryID, + ServerId: m.mppQueryID.ServerID, + MppVersion: m.mppVersion.ToInt64(), + TaskId: -1, }, } + var err error + wrappedReq := tikvrpc.NewRequest(tikvrpc.CmdMPPConn, connReq, kvrpcpb.Context{}) - wrappedReq.StoreTp = tikvrpc.TiFlash + wrappedReq.StoreTp = getEndPointType(kv.TiFlash) // Drain results from root task. // We don't need to process any special error. When we meet errors, just let it fail. rpcResp, err := m.store.GetTiKVClient().SendRequest(bo.GetCtx(), req.Meta.GetAddress(), wrappedReq, readTimeoutUltraLong) if err != nil { - logutil.BgLogger().Warn("establish mpp connection meet error and cannot retry", zap.String("error", err.Error()), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId)) + logutil.BgLogger().Warn("establish mpp connection meet error and cannot retry", zap.String("error", err.Error()), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId), zap.Int64("mpp-version", taskMeta.MppVersion)) + if config.GetGlobalConfig().DisaggregatedTiFlash && !config.GetGlobalConfig().UseAutoScaler { + m.store.GetRegionCache().InvalidateTiFlashComputeStores() + } // if needTriggerFallback is true, we return timeout to trigger tikv's fallback if m.needTriggerFallback { m.sendError(derr.ErrTiFlashServerTimeout) @@ -406,9 +459,9 @@ func (m *mppIterator) establishMPPConns(bo *Backoffer, req *kv.MPPDispatchReques if err1 := bo.Backoff(tikv.BoTiKVRPC(), errors.Errorf("recv stream response error: %v", err)); err1 != nil { if errors.Cause(err) == context.Canceled { - logutil.BgLogger().Info("stream recv timeout", zap.Error(err), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId)) + logutil.BgLogger().Info("stream recv timeout", zap.Error(err), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId), zap.Int64("mpp-version", taskMeta.MppVersion)) } else { - logutil.BgLogger().Info("stream unknown error", zap.Error(err), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId)) + logutil.BgLogger().Info("stream unknown error", zap.Error(err), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId), zap.Int64("mpp-version", taskMeta.MppVersion)) } } // if needTriggerFallback is true, we return timeout to trigger tikv's fallback @@ -428,7 +481,7 @@ func (m *mppIterator) Close() error { close(m.finishCh) } m.cancelFunc() - m.wg.Wait() + <-m.wgDoneChan return nil } @@ -438,6 +491,7 @@ func (m *mppIterator) handleMPPStreamResponse(bo *Backoffer, response *mpp.MPPDa logutil.BgLogger().Warn("other error", zap.Uint64("txnStartTS", req.StartTs), zap.String("storeAddr", req.Meta.GetAddress()), + zap.Int64("mpp-version", m.mppVersion.ToInt64()), zap.Error(err)) return err } @@ -508,19 +562,23 @@ func (m *mppIterator) Next(ctx context.Context) (kv.ResultSubset, error) { } // DispatchMPPTasks dispatches all the mpp task and waits for the responses. -func (c *MPPClient) DispatchMPPTasks(ctx context.Context, variables interface{}, dispatchReqs []*kv.MPPDispatchRequest, needTriggerFallback bool, startTs uint64) kv.Response { +func (c *MPPClient) DispatchMPPTasks(ctx context.Context, variables interface{}, dispatchReqs []*kv.MPPDispatchRequest, needTriggerFallback bool, startTs uint64, mppQueryID kv.MPPQueryID, mppVersion kv.MppVersion, memTracker *memory.Tracker) kv.Response { vars := variables.(*tikv.Variables) ctxChild, cancelFunc := context.WithCancel(ctx) iter := &mppIterator{ store: c.store, tasks: dispatchReqs, finishCh: make(chan struct{}), + wgDoneChan: make(chan struct{}), cancelFunc: cancelFunc, - respChan: make(chan *mppResponse, 4096), + respChan: make(chan *mppResponse), startTs: startTs, + mppQueryID: mppQueryID, + mppVersion: mppVersion, vars: vars, needTriggerFallback: needTriggerFallback, enableCollectExecutionInfo: config.GetGlobalConfig().Instance.EnableCollectExecutionInfo.Load(), + memTracker: memTracker, } go iter.run(ctxChild) return iter diff --git a/store/copr/mpp_probe.go b/store/copr/mpp_probe.go new file mode 100644 index 0000000000000..0a0eba286648e --- /dev/null +++ b/store/copr/mpp_probe.go @@ -0,0 +1,270 @@ +// 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, +// 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 copr + +import ( + "context" + "fmt" + "sync" + "sync/atomic" + "time" + + "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/kvproto/pkg/mpp" + "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/util/logutil" + "github.com/tikv/client-go/v2/tikv" + "github.com/tikv/client-go/v2/tikvrpc" + "go.uber.org/zap" +) + +// GlobalMPPFailedStoreProber mpp failed store probe +var GlobalMPPFailedStoreProber *MPPFailedStoreProber + +const ( + // DetectPeriod detect period + DetectPeriod = 3 * time.Second + // DetectTimeoutLimit detect timeout + DetectTimeoutLimit = 2 * time.Second + // MaxRecoveryTimeLimit wait TiFlash recovery,more than MPPStoreFailTTL + MaxRecoveryTimeLimit = 15 * time.Minute + // MaxObsoletTimeLimit no request for a long time,that might be obsoleted + MaxObsoletTimeLimit = time.Hour +) + +// MPPStoreState the state for MPPStore. +type MPPStoreState struct { + address string // MPPStore TiFlash address + tikvClient tikv.Client + + lock struct { + sync.Mutex + + recoveryTime time.Time + lastLookupTime time.Time + lastDetectTime time.Time + } +} + +// MPPFailedStoreProber use for detecting of failed TiFlash instance +type MPPFailedStoreProber struct { + failedMPPStores *sync.Map + lock *sync.Mutex + isStop *atomic.Bool + wg *sync.WaitGroup + ctx context.Context + cancel context.CancelFunc + + detectPeriod time.Duration + detectTimeoutLimit time.Duration + maxRecoveryTimeLimit time.Duration + maxObsoletTimeLimit time.Duration +} + +func (t *MPPStoreState) detect(ctx context.Context, detectPeriod time.Duration, detectTimeoutLimit time.Duration) { + if time.Since(t.lock.lastDetectTime) < detectPeriod { + return + } + + defer func() { t.lock.lastDetectTime = time.Now() }() + metrics.TiFlashFailedMPPStoreState.WithLabelValues(t.address).Set(0) + ok := detectMPPStore(ctx, t.tikvClient, t.address, detectTimeoutLimit) + if !ok { + metrics.TiFlashFailedMPPStoreState.WithLabelValues(t.address).Set(1) + t.lock.recoveryTime = time.Time{} // if detect failed,reset recovery time to zero. + return + } + + // record the time of the first recovery + if t.lock.recoveryTime.IsZero() { + t.lock.recoveryTime = time.Now() + } +} + +func (t *MPPStoreState) isRecovery(ctx context.Context, recoveryTTL time.Duration) bool { + if !t.lock.TryLock() { + return false + } + defer t.lock.Unlock() + + t.lock.lastLookupTime = time.Now() + if !t.lock.recoveryTime.IsZero() && time.Since(t.lock.recoveryTime) > recoveryTTL { + return true + } + logutil.Logger(ctx).Debug("Cannot detect store's availability "+ + "because the current time has not recovery or wait mppStoreFailTTL", + zap.String("store address", t.address), + zap.Time("recovery time", t.lock.recoveryTime), + zap.Duration("MPPStoreFailTTL", recoveryTTL)) + return false +} + +func (t MPPFailedStoreProber) scan(ctx context.Context) { + defer func() { + if r := recover(); r != nil { + logutil.Logger(ctx).Warn("mpp failed store probe scan error,will restart", zap.Any("recover", r), zap.Stack("stack")) + } + }() + + do := func(k, v any) { + address := fmt.Sprint(k) + state, ok := v.(*MPPStoreState) + if !ok { + logutil.BgLogger().Warn("MPPStoreState struct assert failed,will be clean", + zap.String("address", address)) + t.Delete(address) + return + } + + if !state.lock.TryLock() { + return + } + defer state.lock.Unlock() + + state.detect(ctx, t.detectPeriod, t.detectTimeoutLimit) + + // clean restored store + if !state.lock.recoveryTime.IsZero() && time.Since(state.lock.recoveryTime) > t.maxRecoveryTimeLimit { + t.Delete(address) + // clean store that may be obsolete + } else if state.lock.recoveryTime.IsZero() && time.Since(state.lock.lastLookupTime) > t.maxObsoletTimeLimit { + t.Delete(address) + } + } + + f := func(k, v any) bool { + go do(k, v) + return true + } + + metrics.TiFlashFailedMPPStoreState.WithLabelValues("probe").Set(-1) //probe heartbeat + t.failedMPPStores.Range(f) +} + +// Add add a store when sync probe failed +func (t *MPPFailedStoreProber) Add(ctx context.Context, address string, tikvClient tikv.Client) { + state := MPPStoreState{ + address: address, + tikvClient: tikvClient, + } + state.lock.lastLookupTime = time.Now() + logutil.Logger(ctx).Debug("add mpp store to failed list", zap.String("address", address)) + t.failedMPPStores.Store(address, &state) +} + +// IsRecovery check whether the store is recovery +func (t *MPPFailedStoreProber) IsRecovery(ctx context.Context, address string, recoveryTTL time.Duration) bool { + logutil.Logger(ctx).Debug("check failed store recovery", + zap.String("address", address), zap.Duration("ttl", recoveryTTL)) + v, ok := t.failedMPPStores.Load(address) + if !ok { + // store not in failed map + return true + } + + state, ok := v.(*MPPStoreState) + if !ok { + logutil.BgLogger().Warn("MPPStoreState struct assert failed,will be clean", + zap.String("address", address)) + t.Delete(address) + return false + } + + return state.isRecovery(ctx, recoveryTTL) +} + +// Run a loop of scan +// there can be only one background task +func (t *MPPFailedStoreProber) Run() { + if !t.lock.TryLock() { + return + } + t.wg.Add(1) + t.isStop.Swap(false) + go func() { + defer t.wg.Done() + defer t.lock.Unlock() + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + for { + select { + case <-t.ctx.Done(): + logutil.BgLogger().Debug("ctx.done") + return + case <-ticker.C: + t.scan(t.ctx) + } + } + }() + logutil.BgLogger().Debug("run a background probe process for mpp") +} + +// Stop stop background goroutine +func (t *MPPFailedStoreProber) Stop() { + if !t.isStop.CompareAndSwap(false, true) { + return + } + t.cancel() + t.wg.Wait() + logutil.BgLogger().Debug("stop background task") +} + +// Delete clean store from failed map +func (t *MPPFailedStoreProber) Delete(address string) { + metrics.TiFlashFailedMPPStoreState.DeleteLabelValues(address) + _, ok := t.failedMPPStores.LoadAndDelete(address) + if !ok { + logutil.BgLogger().Warn("Store is deleted", zap.String("address", address)) + } +} + +// MPPStore detect function +func detectMPPStore(ctx context.Context, client tikv.Client, address string, detectTimeoutLimit time.Duration) bool { + resp, err := client.SendRequest(ctx, address, &tikvrpc.Request{ + Type: tikvrpc.CmdMPPAlive, + StoreTp: tikvrpc.TiFlash, + Req: &mpp.IsAliveRequest{}, + Context: kvrpcpb.Context{}, + }, detectTimeoutLimit) + if err != nil || !resp.Resp.(*mpp.IsAliveResponse).Available { + if err == nil { + err = fmt.Errorf("store not ready to serve") + } + logutil.BgLogger().Warn("Store is not ready", + zap.String("store address", address), + zap.String("err message", err.Error())) + return false + } + return true +} + +func init() { + ctx, cancel := context.WithCancel(context.Background()) + isStop := atomic.Bool{} + isStop.Swap(true) + GlobalMPPFailedStoreProber = &MPPFailedStoreProber{ + failedMPPStores: &sync.Map{}, + lock: &sync.Mutex{}, + isStop: &isStop, + ctx: ctx, + cancel: cancel, + wg: &sync.WaitGroup{}, + detectPeriod: DetectPeriod, + detectTimeoutLimit: DetectTimeoutLimit, + maxRecoveryTimeLimit: MaxRecoveryTimeLimit, + maxObsoletTimeLimit: MaxObsoletTimeLimit, + } +} diff --git a/store/copr/mpp_probe_test.go b/store/copr/mpp_probe_test.go new file mode 100644 index 0000000000000..7826c970d3e1e --- /dev/null +++ b/store/copr/mpp_probe_test.go @@ -0,0 +1,177 @@ +// 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, +// 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 copr + +import ( + "context" + "testing" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/kvproto/pkg/mpp" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/tikvrpc" +) + +const ( + testimeout = "timeout" + Error = "error" + Normal = "normal" +) + +type mockDetectClient struct { + errortestype string +} + +func (t *mockDetectClient) CloseAddr(string) error { + return nil +} + +func (t *mockDetectClient) Close() error { + return nil +} + +func (t *mockDetectClient) SendRequest( + ctx context.Context, + addr string, + req *tikvrpc.Request, + timeout time.Duration, +) (*tikvrpc.Response, error) { + if t.errortestype == Error { + return nil, errors.New("store error") + } else if t.errortestype == testimeout { + return &tikvrpc.Response{Resp: &mpp.IsAliveResponse{}}, nil + } + + return &tikvrpc.Response{Resp: &mpp.IsAliveResponse{Available: true}}, nil +} + +type ProbeTest map[string]*mockDetectClient + +func (t ProbeTest) add(ctx context.Context) { + for k, v := range t { + GlobalMPPFailedStoreProber.Add(ctx, k, v) + } +} + +func (t ProbeTest) reSetErrortestype(to string) { + for k, v := range t { + if to == Normal { + v.errortestype = Normal + } else { + v.errortestype = k + } + } +} + +func (t ProbeTest) judge(ctx context.Context, test *testing.T, recoveryTTL time.Duration, need bool) { + for k := range t { + ok := GlobalMPPFailedStoreProber.IsRecovery(ctx, k, recoveryTTL) + require.Equal(test, need, ok) + } +} + +func failedStoreSizeJudge(ctx context.Context, test *testing.T, need int) { + var l int + GlobalMPPFailedStoreProber.scan(ctx) + time.Sleep(time.Second / 10) + GlobalMPPFailedStoreProber.failedMPPStores.Range(func(k, v interface{}) bool { + l++ + return true + }) + require.Equal(test, need, l) +} + +func testFlow(ctx context.Context, probetestest ProbeTest, test *testing.T, flow []string) { + probetestest.add(ctx) + for _, to := range flow { + probetestest.reSetErrortestype(to) + + GlobalMPPFailedStoreProber.scan(ctx) + time.Sleep(time.Second / 10) //wait detect goroutine finish + + var need bool + if to == Normal { + need = true + } + probetestest.judge(ctx, test, 0, need) + probetestest.judge(ctx, test, time.Minute, false) + } + + lastTo := flow[len(flow)-1] + cleanRecover := func(need int) { + GlobalMPPFailedStoreProber.maxRecoveryTimeLimit = 0 - time.Second + failedStoreSizeJudge(ctx, test, need) + GlobalMPPFailedStoreProber.maxRecoveryTimeLimit = MaxRecoveryTimeLimit + } + + cleanObsolet := func(need int) { + GlobalMPPFailedStoreProber.maxObsoletTimeLimit = 0 - time.Second + failedStoreSizeJudge(ctx, test, need) + GlobalMPPFailedStoreProber.maxObsoletTimeLimit = MaxObsoletTimeLimit + } + + if lastTo == Error { + cleanRecover(2) + cleanObsolet(0) + } else if lastTo == Normal { + cleanObsolet(2) + cleanRecover(0) + } +} + +func TestMPPFailedStoreProbe(t *testing.T) { + ctx := context.Background() + + notExistAddress := "not exist address" + + GlobalMPPFailedStoreProber.detectPeriod = 0 - time.Second + + // check not exist address + ok := GlobalMPPFailedStoreProber.IsRecovery(ctx, notExistAddress, 0) + require.True(t, ok) + + GlobalMPPFailedStoreProber.scan(ctx) + + probetestest := map[string]*mockDetectClient{ + testimeout: {errortestype: testimeout}, + Error: {errortestype: Error}, + } + + testFlowFinallyRecover := []string{Error, Normal, Error, Error, Normal} + testFlow(ctx, probetestest, t, testFlowFinallyRecover) + testFlowFinallyDesert := []string{Error, Normal, Normal, Error, Error} + testFlow(ctx, probetestest, t, testFlowFinallyDesert) +} + +func TestMPPFailedStoreProbeGoroutineTask(t *testing.T) { + // Confirm that multiple tasks are not allowed + GlobalMPPFailedStoreProber.lock.Lock() + GlobalMPPFailedStoreProber.Run() + GlobalMPPFailedStoreProber.lock.Unlock() + + GlobalMPPFailedStoreProber.Run() + GlobalMPPFailedStoreProber.Stop() +} + +func TestMPPFailedStoreAssertFailed(t *testing.T) { + ctx := context.Background() + + GlobalMPPFailedStoreProber.failedMPPStores.Store("errorinfo", nil) + GlobalMPPFailedStoreProber.scan(ctx) + + GlobalMPPFailedStoreProber.failedMPPStores.Store("errorinfo", nil) + GlobalMPPFailedStoreProber.IsRecovery(ctx, "errorinfo", 0) +} diff --git a/store/copr/region_cache.go b/store/copr/region_cache.go index 4aa970aa458a4..aa33656c39cca 100644 --- a/store/copr/region_cache.go +++ b/store/copr/region_cache.go @@ -18,9 +18,12 @@ import ( "bytes" "strconv" + "github.com/pingcap/kvproto/pkg/coprocessor" + "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/log" "github.com/pingcap/tidb/kv" derr "github.com/pingcap/tidb/store/driver/error" + "github.com/pingcap/tidb/store/driver/options" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/mathutil" "github.com/tikv/client-go/v2/metrics" @@ -39,10 +42,10 @@ func NewRegionCache(rc *tikv.RegionCache) *RegionCache { } // SplitRegionRanges gets the split ranges from pd region. -func (c *RegionCache) SplitRegionRanges(bo *Backoffer, keyRanges []kv.KeyRange) ([]kv.KeyRange, error) { +func (c *RegionCache) SplitRegionRanges(bo *Backoffer, keyRanges []kv.KeyRange, limit int) ([]kv.KeyRange, error) { ranges := NewKeyRanges(keyRanges) - locations, err := c.SplitKeyRangesByLocations(bo, ranges) + locations, err := c.SplitKeyRangesByLocations(bo, ranges, limit) if err != nil { return nil, derr.ToTiDBErr(err) } @@ -119,10 +122,16 @@ func (l *LocationKeyRanges) splitKeyRangesByBuckets() []*LocationKeyRanges { return res } +// UnspecifiedLimit means no limit. +const UnspecifiedLimit = -1 + // SplitKeyRangesByLocations splits the KeyRanges by logical info in the cache. -func (c *RegionCache) SplitKeyRangesByLocations(bo *Backoffer, ranges *KeyRanges) ([]*LocationKeyRanges, error) { +func (c *RegionCache) SplitKeyRangesByLocations(bo *Backoffer, ranges *KeyRanges, limit int) ([]*LocationKeyRanges, error) { res := make([]*LocationKeyRanges, 0) for ranges.Len() > 0 { + if limit != UnspecifiedLimit && len(res) >= limit { + break + } loc, err := c.LocateKey(bo.TiKVBackoffer(), ranges.At(0).StartKey) if err != nil { return res, derr.ToTiDBErr(err) @@ -173,7 +182,7 @@ func (c *RegionCache) SplitKeyRangesByLocations(bo *Backoffer, ranges *KeyRanges // // TODO(youjiali1995): Try to do it in one round and reduce allocations if bucket is not enabled. func (c *RegionCache) SplitKeyRangesByBuckets(bo *Backoffer, ranges *KeyRanges) ([]*LocationKeyRanges, error) { - locs, err := c.SplitKeyRangesByLocations(bo, ranges) + locs, err := c.SplitKeyRangesByLocations(bo, ranges, UnspecifiedLimit) if err != nil { return nil, derr.ToTiDBErr(err) } @@ -199,3 +208,28 @@ func (c *RegionCache) OnSendFailForBatchRegions(bo *Backoffer, store *tikv.Store c.OnSendFailForTiFlash(bo.TiKVBackoffer(), store, ri.Region, ri.Meta, scheduleReload, err, !(index < 10 || log.GetLevel() <= zap.DebugLevel)) } } + +// BuildBatchTask fetches store and peer info for cop task, wrap it as `batchedCopTask`. +func (c *RegionCache) BuildBatchTask(bo *Backoffer, task *copTask, replicaRead kv.ReplicaReadType) (*batchedCopTask, error) { + rpcContext, err := c.GetTiKVRPCContext(bo.TiKVBackoffer(), task.region, options.GetTiKVReplicaReadType(replicaRead), 0) + if err != nil { + return nil, err + } + // fallback to non-batch path + if rpcContext == nil { + return nil, nil + } + return &batchedCopTask{ + task: task, + region: coprocessor.RegionInfo{ + RegionId: rpcContext.Region.GetID(), + RegionEpoch: &metapb.RegionEpoch{ + ConfVer: rpcContext.Region.GetConfVer(), + Version: rpcContext.Region.GetVer(), + }, + Ranges: task.ranges.ToPBRanges(), + }, + storeID: rpcContext.Store.StoreID(), + peer: rpcContext.Peer, + }, nil +} diff --git a/store/copr/store.go b/store/copr/store.go index ad7ebb5dd9a63..afd1004bdba4d 100644 --- a/store/copr/store.go +++ b/store/copr/store.go @@ -17,10 +17,12 @@ package copr import ( "context" "math/rand" + "runtime" "sync/atomic" "time" "github.com/pingcap/errors" + tidb_config "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/driver/backoff" derr "github.com/pingcap/tidb/store/driver/error" @@ -75,6 +77,7 @@ type Store struct { *kvStore coprCache *coprCache replicaReadSeed uint32 + numcpu int } // NewStore creates a new store instance. @@ -83,11 +86,13 @@ func NewStore(s *tikv.KVStore, coprCacheConfig *config.CoprocessorCache) (*Store if err != nil { return nil, errors.Trace(err) } + /* #nosec G404 */ return &Store{ kvStore: &kvStore{store: s}, coprCache: coprCache, replicaReadSeed: rand.Uint32(), + numcpu: runtime.GOMAXPROCS(0), }, nil } @@ -122,6 +127,9 @@ func getEndPointType(t kv.StoreType) tikvrpc.EndpointType { case kv.TiKV: return tikvrpc.TiKV case kv.TiFlash: + if tidb_config.GetGlobalConfig().DisaggregatedTiFlash { + return tikvrpc.TiFlashCompute + } return tikvrpc.TiFlash case kv.TiDB: return tikvrpc.TiDB diff --git a/store/driver/BUILD.bazel b/store/driver/BUILD.bazel index e3b0480f7e11d..8693c30bb233e 100644 --- a/store/driver/BUILD.bazel +++ b/store/driver/BUILD.bazel @@ -7,6 +7,7 @@ go_library( visibility = ["//visibility:public"], deps = [ "//kv", + "//sessionctx/variable", "//store/copr", "//store/driver/error", "//store/driver/txn", @@ -20,6 +21,7 @@ go_library( "@com_github_tikv_client_go_v2//tikvrpc", "@com_github_tikv_client_go_v2//util", "@com_github_tikv_pd_client//:client", + "@com_github_tikv_pd_client//resource_manager/client", "@org_golang_google_grpc//:grpc", "@org_golang_google_grpc//keepalive", "@org_uber_go_zap//:zap", diff --git a/store/driver/error/error.go b/store/driver/error/error.go index 1d9543cc1437d..4be6e3628c5cc 100644 --- a/store/driver/error/error.go +++ b/store/driver/error/error.go @@ -102,9 +102,6 @@ func ToTiDBErr(err error) error { var pdServerTimeout *tikverr.ErrPDServerTimeout if stderrs.As(err, &pdServerTimeout) { - if len(pdServerTimeout.Error()) == 0 { - return ErrPDServerTimeout - } return ErrPDServerTimeout.GenWithStackByArgs(pdServerTimeout.Error()) } diff --git a/store/driver/options/options.go b/store/driver/options/options.go index 1b677ffc348d0..c2b3b52e177b8 100644 --- a/store/driver/options/options.go +++ b/store/driver/options/options.go @@ -32,6 +32,10 @@ func GetTiKVReplicaReadType(t kv.ReplicaReadType) storekv.ReplicaReadType { return storekv.ReplicaReadMixed case kv.ReplicaReadClosestAdaptive: return storekv.ReplicaReadMixed + case kv.ReplicaReadLearner: + return storekv.ReplicaReadLearner + case kv.ReplicaReadPreferLeader: + return storekv.ReplicaReadPreferLeader } return 0 } diff --git a/store/driver/tikv_driver.go b/store/driver/tikv_driver.go index e1ba5d121608f..86d28b77d4def 100644 --- a/store/driver/tikv_driver.go +++ b/store/driver/tikv_driver.go @@ -28,6 +28,7 @@ import ( deadlockpb "github.com/pingcap/kvproto/pkg/deadlock" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/copr" derr "github.com/pingcap/tidb/store/driver/error" txn_driver "github.com/pingcap/tidb/store/driver/txn" @@ -38,6 +39,7 @@ import ( "github.com/tikv/client-go/v2/tikvrpc" "github.com/tikv/client-go/v2/util" pd "github.com/tikv/pd/client" + rmclient "github.com/tikv/pd/client/resource_manager/client" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/keepalive" @@ -53,6 +55,10 @@ var mc storeCache func init() { mc.cache = make(map[string]*tikvStore) rand.Seed(time.Now().UnixNano()) + + // Setup the Hooks to dynamic control global resource controller. + variable.EnableGlobalResourceControlFunc = tikv.EnableResourceControl + variable.DisableGlobalResourceControlFunc = tikv.DisableResourceControl } // Option is a function that changes some config of Driver @@ -86,6 +92,25 @@ func WithPDClientConfig(client config.PDClient) Option { } } +// TrySetupGlobalResourceController tries to setup global resource controller. +func TrySetupGlobalResourceController(ctx context.Context, serverID uint64, s kv.Storage) error { + var ( + store *tikvStore + ok bool + ) + if store, ok = s.(*tikvStore); !ok { + return errors.New("cannot setup up resource controller, should use tikv storage") + } + + control, err := rmclient.NewResourceGroupController(serverID, store.GetPDClient(), rmclient.DefaultRequestUnitConfig()) + if err != nil { + return err + } + tikv.SetResourceControlInterceptor(control) + control.Start(ctx) + return nil +} + // TiKVDriver implements engine TiKV. type TiKVDriver struct { pdConfig config.PDClient @@ -117,7 +142,7 @@ func (d TiKVDriver) OpenWithOptions(path string, options ...Option) (kv.Storage, mc.Lock() defer mc.Unlock() d.setDefaultAndOptions(options...) - etcdAddrs, disableGC, err := config.ParsePath(path) + etcdAddrs, disableGC, keyspaceName, err := config.ParsePath(path) if err != nil { return nil, errors.Trace(err) } @@ -157,11 +182,35 @@ func (d TiKVDriver) OpenWithOptions(path string, options ...Option) (kv.Storage, return nil, errors.Trace(err) } - pdClient := tikv.CodecPDClient{Client: pdCli} - s, err := tikv.NewKVStore(uuid, &pdClient, spkv, tikv.NewRPCClient(tikv.WithSecurity(d.security))) + // ---------------- keyspace logic ---------------- + var ( + pdClient *tikv.CodecPDClient + ) + + if keyspaceName == "" { + logutil.BgLogger().Info("using API V1.") + pdClient = tikv.NewCodecPDClient(tikv.ModeTxn, pdCli) + } else { + logutil.BgLogger().Info("using API V2.", zap.String("keyspaceName", keyspaceName)) + pdClient, err = tikv.NewCodecPDClientWithKeyspace(tikv.ModeTxn, pdCli, keyspaceName) + if err != nil { + return nil, errors.Trace(err) + } + } + + codec := pdClient.GetCodec() + + rpcClient := tikv.NewRPCClient( + tikv.WithSecurity(d.security), + tikv.WithCodec(codec), + ) + + s, err := tikv.NewKVStore(uuid, pdClient, spkv, rpcClient) if err != nil { return nil, errors.Trace(err) } + + // ---------------- keyspace logic ---------------- if d.txnLocalLatches.Enabled { s.EnableTxnLocalLatches(d.txnLocalLatches.Capacity) } @@ -178,6 +227,7 @@ func (d TiKVDriver) OpenWithOptions(path string, options ...Option) (kv.Storage, memCache: kv.NewCacheDB(), enableGC: !disableGC, coprStore: coprStore, + codec: codec, } mc.cache[uuid] = store @@ -192,6 +242,7 @@ type tikvStore struct { enableGC bool gcWorker *gcworker.GCWorker coprStore *copr.Store + codec tikv.Codec } // Name gets the name of the storage engine @@ -343,3 +394,7 @@ func (s *tikvStore) GetLockWaits() ([]*deadlockpb.WaitForEntry, error) { } return result, nil } + +func (s *tikvStore) GetCodec() tikv.Codec { + return s.codec +} diff --git a/store/driver/txn/BUILD.bazel b/store/driver/txn/BUILD.bazel index ab10c88f12c9c..437fd464b8c81 100644 --- a/store/driver/txn/BUILD.bazel +++ b/store/driver/txn/BUILD.bazel @@ -24,8 +24,9 @@ go_library( "//table/tables", "//tablecodec", "//types", + "//util", "//util/logutil", - "@com_github_opentracing_opentracing_go//:opentracing-go", + "//util/tracing", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/kvrpcpb", diff --git a/store/driver/txn/error.go b/store/driver/txn/error.go index 5ff5f0c776309..80543fe2f8513 100644 --- a/store/driver/txn/error.go +++ b/store/driver/txn/error.go @@ -33,6 +33,7 @@ import ( "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/logutil" tikverr "github.com/tikv/client-go/v2/error" "go.uber.org/zap" @@ -100,6 +101,9 @@ func extractKeyExistsErrFromHandle(key kv.Key, value []byte, tblInfo *model.Tabl if col.Length > 0 && len(str) > col.Length { str = str[:col.Length] } + if types.IsBinaryStr(&tblInfo.Columns[col.Offset].FieldType) || types.IsTypeBit(&tblInfo.Columns[col.Offset].FieldType) { + str = util.FmtNonASCIIPrintableCharToHex(str) + } valueStr = append(valueStr, str) } return genKeyExistsError(name, strings.Join(valueStr, "-"), nil) @@ -136,6 +140,9 @@ func extractKeyExistsErrFromIndex(key kv.Key, value []byte, tblInfo *model.Table if err != nil { return genKeyExistsError(name, key.String(), err) } + if types.IsBinaryStr(colInfo[i].Ft) || types.IsTypeBit(colInfo[i].Ft) { + str = util.FmtNonASCIIPrintableCharToHex(str) + } valueStr = append(valueStr, str) } return genKeyExistsError(name, strings.Join(valueStr, "-"), nil) diff --git a/store/driver/txn/snapshot.go b/store/driver/txn/snapshot.go index 66c82f86eaedb..4adcfcf1b07f8 100644 --- a/store/driver/txn/snapshot.go +++ b/store/driver/txn/snapshot.go @@ -135,6 +135,8 @@ func (s *tikvSnapshot) SetOption(opt int, val interface{}) { if size > 0 { s.KVSnapshot.SetScanBatchSize(size) } + case kv.ResourceGroupName: + s.KVSnapshot.SetResourceGroupName(val.(string)) } } diff --git a/store/driver/txn/txn_driver.go b/store/driver/txn/txn_driver.go index 851e68eac89ef..5878413024bf2 100644 --- a/store/driver/txn/txn_driver.go +++ b/store/driver/txn/txn_driver.go @@ -15,10 +15,10 @@ package txn import ( + "bytes" "context" "sync/atomic" - "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/metapb" @@ -29,6 +29,7 @@ import ( "github.com/pingcap/tidb/store/driver/options" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/tracing" tikverr "github.com/tikv/client-go/v2/error" tikvstore "github.com/tikv/client-go/v2/kv" "github.com/tikv/client-go/v2/tikv" @@ -72,8 +73,22 @@ func (txn *tikvTxn) CacheTableInfo(id int64, info *model.TableInfo) { func (txn *tikvTxn) LockKeys(ctx context.Context, lockCtx *kv.LockCtx, keysInput ...kv.Key) error { keys := toTiKVKeys(keysInput) + txn.exitAggressiveLockingIfInapplicable(ctx, keys) err := txn.KVTxn.LockKeys(ctx, lockCtx, keys...) - return txn.extractKeyErr(err) + if err != nil { + return txn.extractKeyErr(err) + } + return txn.generateWriteConflictForLockedWithConflict(lockCtx) +} + +func (txn *tikvTxn) LockKeysFunc(ctx context.Context, lockCtx *kv.LockCtx, fn func(), keysInput ...kv.Key) error { + keys := toTiKVKeys(keysInput) + txn.exitAggressiveLockingIfInapplicable(ctx, keys) + err := txn.KVTxn.LockKeysFunc(ctx, lockCtx, fn, keys...) + if err != nil { + return txn.extractKeyErr(err) + } + return txn.generateWriteConflictForLockedWithConflict(lockCtx) } func (txn *tikvTxn) Commit(ctx context.Context) error { @@ -150,11 +165,8 @@ func (txn *tikvTxn) IterReverse(k kv.Key) (iter kv.Iterator, err error) { // Do not use len(value) == 0 or value == nil to represent non-exist. // If a key doesn't exist, there shouldn't be any corresponding entry in the result map. func (txn *tikvTxn) BatchGet(ctx context.Context, keys []kv.Key) (map[string][]byte, error) { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("tikvTxn.BatchGet", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } + r, ctx := tracing.StartRegionEx(ctx, "tikvTxn.BatchGet") + defer r.End() return NewBufferBatchGetter(txn.GetMemBuffer(), nil, txn.GetSnapshot()).BatchGet(ctx, keys) } @@ -218,8 +230,6 @@ func (txn *tikvTxn) SetOption(opt int, val interface{}) { } else { txn.KVTxn.GetSnapshot().SetRuntimeStats(val.(*txnsnapshot.SnapshotRuntimeStats)) } - case kv.SchemaAmender: - txn.SetSchemaAmender(val.(tikv.SchemaAmender)) case kv.SampleStep: txn.KVTxn.GetSnapshot().SetSampleStep(val.(uint32)) case kv.CommitHook: @@ -258,6 +268,10 @@ func (txn *tikvTxn) SetOption(opt int, val interface{}) { txn.KVTxn.SetRequestSourceType(val.(string)) case kv.ReplicaReadAdjuster: txn.KVTxn.GetSnapshot().SetReplicaReadAdjuster(val.(txnkv.ReplicaReadAdjuster)) + case kv.TxnSource: + txn.KVTxn.SetTxnSource(val.(uint64)) + case kv.ResourceGroupName: + txn.KVTxn.SetResourceGroupName(val.(string)) } } @@ -269,6 +283,8 @@ func (txn *tikvTxn) GetOption(opt int) interface{} { return txn.KVTxn.GetScope() case kv.TableToColumnMaps: return txn.columnMapsCache + case kv.RequestSourceInternal: + return txn.RequestSourceInternal case kv.RequestSourceType: return txn.RequestSourceType default: @@ -333,6 +349,65 @@ func (txn *tikvTxn) UpdateMemBufferFlags(key []byte, flags ...kv.FlagsOp) { txn.GetUnionStore().GetMemBuffer().UpdateFlags(key, getTiKVFlagsOps(flags)...) } +func (txn *tikvTxn) exitAggressiveLockingIfInapplicable(ctx context.Context, keys [][]byte) { + if len(keys) > 1 && txn.IsInAggressiveLockingMode() { + // Only allow aggressive locking if it only needs to lock one key. Considering that it's possible that a + // statement causes multiple calls to `LockKeys` (which means some keys may have been locked in aggressive + // locking mode), here we exit aggressive locking mode by calling DoneAggressiveLocking instead of cancelling. + // Then the previously-locked keys during execution in this statement (if any) will be turned into the state + // as if they were locked in normal way. + // Note that the issue https://github.com/pingcap/tidb/issues/35682 also exists here. + txn.KVTxn.DoneAggressiveLocking(ctx) + } +} + +func (txn *tikvTxn) generateWriteConflictForLockedWithConflict(lockCtx *kv.LockCtx) error { + if lockCtx.MaxLockedWithConflictTS != 0 { + var bufTableID, bufRest bytes.Buffer + foundKey := false + for k, v := range lockCtx.Values { + if v.LockedWithConflictTS >= lockCtx.MaxLockedWithConflictTS { + foundKey = true + prettyWriteKey(&bufTableID, &bufRest, []byte(k)) + break + } + } + if !foundKey { + bufTableID.WriteString("") + } + // TODO: Primary is not exported here. + primary := " primary=" + primaryRest := "" + return kv.ErrWriteConflict.FastGenByArgs(txn.StartTS(), 0, lockCtx.MaxLockedWithConflictTS, bufTableID.String(), bufRest.String(), primary, primaryRest, "LockedWithConflict") + } + return nil +} + +// StartAggressiveLocking adapts the method signature of `KVTxn` to satisfy kv.AggressiveLockingController. +// TODO: Update the methods' signatures in client-go to avoid this adaptor functions. +func (txn *tikvTxn) StartAggressiveLocking() error { + txn.KVTxn.StartAggressiveLocking() + return nil +} + +// RetryAggressiveLocking adapts the method signature of `KVTxn` to satisfy kv.AggressiveLockingController. +func (txn *tikvTxn) RetryAggressiveLocking(ctx context.Context) error { + txn.KVTxn.RetryAggressiveLocking(ctx) + return nil +} + +// CancelAggressiveLocking adapts the method signature of `KVTxn` to satisfy kv.AggressiveLockingController. +func (txn *tikvTxn) CancelAggressiveLocking(ctx context.Context) error { + txn.KVTxn.CancelAggressiveLocking(ctx) + return nil +} + +// DoneAggressiveLocking adapts the method signature of `KVTxn` to satisfy kv.AggressiveLockingController. +func (txn *tikvTxn) DoneAggressiveLocking(ctx context.Context) error { + txn.KVTxn.DoneAggressiveLocking(ctx) + return nil +} + // TiDBKVFilter is the filter specific to TiDB to filter out KV pairs that needn't be committed. type TiDBKVFilter struct{} diff --git a/store/gcworker/gc_worker.go b/store/gcworker/gc_worker.go index 92c3b535ba5d3..104e5ee7f2dc3 100644 --- a/store/gcworker/gc_worker.go +++ b/store/gcworker/gc_worker.go @@ -79,7 +79,7 @@ type GCWorker struct { batchResolveLocks func(locks []*txnlock.Lock, regionID tikv.RegionVerID, safepoint uint64) (ok bool, err error) resolveLocks func(locks []*txnlock.Lock, lowResolutionTS uint64) (int64, error) } - logBackupEnabled bool + logBackupEnabled bool // check log-backup task existed. } // NewGCWorker creates a GCWorker instance. @@ -301,6 +301,85 @@ func (w *GCWorker) tick(ctx context.Context) { } } +// getGCSafePoint returns the current gc safe point. +func getGCSafePoint(ctx context.Context, pdClient pd.Client) (uint64, error) { + // If there is try to set gc safepoint is 0, the interface will not set gc safepoint to 0, + // it will return current gc safepoint. + safePoint, err := pdClient.UpdateGCSafePoint(ctx, 0) + if err != nil { + return 0, errors.Trace(err) + } + return safePoint, nil +} + +func (w *GCWorker) logIsGCSafePointTooEarly(ctx context.Context, safePoint uint64) error { + now, err := w.getOracleTime() + if err != nil { + return errors.Trace(err) + } + + checkTs := oracle.GoTimeToTS(now.Add(-gcDefaultLifeTime * 2)) + if checkTs > safePoint { + logutil.Logger(ctx).Info("[gc worker] gc safepoint is too early. " + + "Maybe there is a bit BR/Lightning/CDC task, " + + "or a long transaction is running" + + "or need a tidb without setting keyspace-name to calculate and update gc safe point.") + } + return nil +} + +func (w *GCWorker) runKeyspaceDeleteRange(ctx context.Context, concurrency int) error { + // Get safe point from PD. + // The GC safe point is updated only after the global GC have done resolveLocks phase globally. + // So, in the following code, resolveLocks must have been done by the global GC on the ranges to be deleted, + // so its safe to delete the ranges. + safePoint, err := getGCSafePoint(ctx, w.pdClient) + if err != nil { + logutil.Logger(ctx).Info("[gc worker] get gc safe point error", zap.Error(errors.Trace(err))) + return nil + } + + if safePoint == 0 { + logutil.Logger(ctx).Info("[gc worker] skip keyspace delete range, because gc safe point is 0") + return nil + } + + err = w.logIsGCSafePointTooEarly(ctx, safePoint) + if err != nil { + logutil.Logger(ctx).Info("[gc worker] log is gc safe point is too early error", zap.Error(errors.Trace(err))) + return nil + } + + keyspaceID := w.store.GetCodec().GetKeyspaceID() + logutil.Logger(ctx).Info("[gc worker] start keyspace delete range", + zap.String("uuid", w.uuid), + zap.Int("concurrency", concurrency), + zap.Uint32("keyspaceID", uint32(keyspaceID)), + zap.Uint64("GCSafepoint", safePoint)) + + // Do deleteRanges. + err = w.deleteRanges(ctx, safePoint, concurrency) + if err != nil { + logutil.Logger(ctx).Error("[gc worker] delete range returns an error", + zap.String("uuid", w.uuid), + zap.Error(err)) + metrics.GCJobFailureCounter.WithLabelValues("delete_range").Inc() + return errors.Trace(err) + } + + // Do redoDeleteRanges. + err = w.redoDeleteRanges(ctx, safePoint, concurrency) + if err != nil { + logutil.Logger(ctx).Error("[gc worker] redo-delete range returns an error", + zap.String("uuid", w.uuid), + zap.Error(err)) + metrics.GCJobFailureCounter.WithLabelValues("redo_delete_range").Inc() + return errors.Trace(err) + } + + return nil +} + // leaderTick of GC worker checks if it should start a GC job every tick. func (w *GCWorker) leaderTick(ctx context.Context) error { if w.gcIsRunning { @@ -317,6 +396,19 @@ func (w *GCWorker) leaderTick(ctx context.Context) error { return errors.Trace(err) } + // Gc safe point is not separated by keyspace now. The whole cluster has only one global gc safe point. + // So at least one TiDB with `keyspace-name` not set is required in the whole cluster to calculate and update gc safe point. + // If `keyspace-name` is set, the TiDB node will only do its own delete range, and will not calculate gc safe point and resolve locks. + // Note that when `keyspace-name` is set, `checkLeader` will be done within the key space. + // Therefore only one TiDB node in each key space will be responsible to do delete range. + if w.store.GetCodec().GetKeyspace() != nil { + err = w.runKeyspaceGCJob(ctx, concurrency) + if err != nil { + return errors.Trace(err) + } + return nil + } + ok, safePoint, err := w.prepare(ctx) if err != nil { metrics.GCJobFailureCounter.WithLabelValues("prepare").Inc() @@ -354,6 +446,36 @@ func (w *GCWorker) leaderTick(ctx context.Context) error { return nil } +func (w *GCWorker) runKeyspaceGCJob(ctx context.Context, concurrency int) error { + // When the worker is just started, or an old GC job has just finished, + // wait a while before starting a new job. + if time.Since(w.lastFinish) < gcWaitTime { + logutil.Logger(ctx).Info("[gc worker] another keyspace gc job has just finished, skipped.", + zap.String("leaderTick on ", w.uuid)) + return nil + } + + now, err := w.getOracleTime() + if err != nil { + return errors.Trace(err) + } + ok, err := w.checkGCInterval(now) + if err != nil || !ok { + return errors.Trace(err) + } + + go func() { + w.done <- w.runKeyspaceDeleteRange(ctx, concurrency) + }() + + err = w.saveTime(gcLastRunTimeKey, now) + if err != nil { + return errors.Trace(err) + } + + return nil +} + // prepare checks preconditions for starting a GC job. It returns a bool // that indicates whether the GC job should start and the new safePoint. func (w *GCWorker) prepare(ctx context.Context) (bool, uint64, error) { @@ -912,6 +1034,10 @@ func needsGCOperationForStore(store *metapb.Store) (bool, error) { // skip physical resolve locks for it. return false, nil + case placement.EngineLabelTiFlashCompute: + logutil.BgLogger().Debug("[gc worker] will ignore gc tiflash_compute node") + return false, nil + case placement.EngineLabelTiKV, "": // If no engine label is set, it should be a TiKV node. return true, nil @@ -1194,6 +1320,7 @@ func (w *GCWorker) resolveLocksForRange( failpoint.Inject("setGcResolveMaxBackoff", func(v failpoint.Value) { sleep := v.(int) // cooperate with github.com/tikv/client-go/v2/locate/invalidCacheAndRetry + //nolint: SA1029 ctx = context.WithValue(ctx, "injectedBackoff", struct{}{}) bo = tikv.NewBackofferWithVars(ctx, sleep, nil) }) @@ -1790,7 +1917,7 @@ func (w *GCWorker) checkLeader(ctx context.Context) (bool, error) { se := createSession(w.store) defer se.Close() - w.logBackupEnabled = utils.CheckLogBackupEnabled(se) + w.logBackupEnabled = utils.IsLogBackupInUse(se) _, err := se.ExecuteInternal(ctx, "BEGIN") if err != nil { return false, errors.Trace(err) @@ -1969,6 +2096,11 @@ func (w *GCWorker) saveValueToSysTable(key, value string) error { // Placement rules cannot be removed immediately after drop table / truncate table, // because the tables can be flashed back or recovered. func (w *GCWorker) doGCPlacementRules(se session.Session, safePoint uint64, dr util.DelRangeTask, gcPlacementRuleCache map[int64]interface{}) (err error) { + if w.store.GetCodec().GetKeyspace() != nil { + logutil.BgLogger().Info("[gc worker] skip doGCPlacementRules when keyspace_name is set.", zap.String("uuid", w.uuid)) + return nil + } + // Get the job from the job history var historyJob *model.Job failpoint.Inject("mockHistoryJobForGC", func(v failpoint.Value) { @@ -2006,6 +2138,10 @@ func (w *GCWorker) doGCPlacementRules(se session.Session, safePoint uint64, dr u if err = historyJob.DecodeArgs(&physicalTableIDs); err != nil { return } + case model.ActionReorganizePartition: + if err = historyJob.DecodeArgs(&physicalTableIDs); err != nil { + return + } } if len(physicalTableIDs) == 0 { @@ -2028,7 +2164,6 @@ func (w *GCWorker) doGCPlacementRules(se session.Session, safePoint uint64, dr u zap.Int64("tableID", id), zap.String("endKey", string(dr.EndKey)), zap.Uint64("safePoint", safePoint)) ruleID := fmt.Sprintf("table-%v-r", id) if err := infosync.DeleteTiFlashPlacementRule(context.Background(), "tiflash", ruleID); err != nil { - // If DeletePlacementRule fails here, the rule will be deleted in `HandlePlacementRuleRoutine`. logutil.BgLogger().Error("delete TiFlash pd rule failed when gc", zap.Error(err), zap.String("ruleID", ruleID), zap.Uint64("safePoint", safePoint)) } else { diff --git a/store/helper/helper.go b/store/helper/helper.go index f24443433e724..c4fe7c7cc38f0 100644 --- a/store/helper/helper.go +++ b/store/helper/helper.go @@ -78,6 +78,7 @@ type Storage interface { Closed() <-chan struct{} GetMinSafeTS(txnScope string) uint64 GetLockWaits() ([]*deadlockpb.WaitForEntry, error) + GetCodec() tikv.Codec } // Helper is a middleware to get some information from tikv/pd. It can be used for TiDB's http api or mem table. @@ -653,11 +654,11 @@ func newTableWithKeyRange(db *model.DBInfo, table *model.TableInfo) TableInfoWit // NewIndexWithKeyRange constructs TableInfoWithKeyRange for given index, it is exported only for test. func NewIndexWithKeyRange(db *model.DBInfo, table *model.TableInfo, index *model.IndexInfo) TableInfoWithKeyRange { - return newIndexWithKeyRange(db, table, index) + return newIndexWithKeyRange(db, table, index, table.ID) } -func newIndexWithKeyRange(db *model.DBInfo, table *model.TableInfo, index *model.IndexInfo) TableInfoWithKeyRange { - sk, ek := tablecodec.GetTableIndexKeyRange(table.ID, index.ID) +func newIndexWithKeyRange(db *model.DBInfo, table *model.TableInfo, index *model.IndexInfo, physicalID int64) TableInfoWithKeyRange { + sk, ek := tablecodec.GetTableIndexKeyRange(physicalID, index.ID) startKey := bytesKeyToHex(codec.EncodeBytes(nil, sk)) endKey := bytesKeyToHex(codec.EncodeBytes(nil, ek)) return TableInfoWithKeyRange{ @@ -727,7 +728,13 @@ func (*Helper) GetTablesInfoWithKeyRange(schemas []*model.DBInfo) []TableInfoWit tables = append(tables, newTableWithKeyRange(db, table)) } for _, index := range table.Indices { - tables = append(tables, newIndexWithKeyRange(db, table, index)) + if table.Partition == nil || index.Global { + tables = append(tables, newIndexWithKeyRange(db, table, index, table.ID)) + continue + } + for _, partition := range table.Partition.Definitions { + tables = append(tables, newIndexWithKeyRange(db, table, index, partition.ID)) + } } } } diff --git a/store/mockstore/mockstorage/storage.go b/store/mockstore/mockstorage/storage.go index a85b46166631f..6a05a78fef0ff 100644 --- a/store/mockstore/mockstorage/storage.go +++ b/store/mockstore/mockstorage/storage.go @@ -117,6 +117,12 @@ func (s *mockStorage) Close() error { return s.KVStore.Close() } +func (s *mockStorage) GetCodec() tikv.Codec { + pdClient := s.KVStore.GetPDClient() + pdCodecCli := tikv.NewCodecPDClient(tikv.ModeTxn, pdClient) + return pdCodecCli.GetCodec() +} + // MockLockWaitSetter is used to set the mocked lock wait information, which helps implementing tests that uses the // GetLockWaits function. type MockLockWaitSetter interface { diff --git a/store/mockstore/unistore/BUILD.bazel b/store/mockstore/unistore/BUILD.bazel index 50a04a77f9bfe..c25dad1d5fe6d 100644 --- a/store/mockstore/unistore/BUILD.bazel +++ b/store/mockstore/unistore/BUILD.bazel @@ -32,6 +32,8 @@ go_library( "@com_github_pingcap_kvproto//pkg/metapb", "@com_github_pingcap_kvproto//pkg/mpp", "@com_github_pingcap_kvproto//pkg/pdpb", + "@com_github_pingcap_kvproto//pkg/resource_manager", + "@com_github_tikv_client_go_v2//oracle", "@com_github_tikv_client_go_v2//testutils", "@com_github_tikv_client_go_v2//tikvrpc", "@com_github_tikv_pd_client//:client", diff --git a/store/mockstore/unistore/pd.go b/store/mockstore/unistore/pd.go index 9361fcc9ddc07..85c64ba5b3987 100644 --- a/store/mockstore/unistore/pd.go +++ b/store/mockstore/unistore/pd.go @@ -19,10 +19,13 @@ import ( "errors" "math" "sync" + "sync/atomic" "github.com/pingcap/kvproto/pkg/keyspacepb" "github.com/pingcap/kvproto/pkg/pdpb" + rmpb "github.com/pingcap/kvproto/pkg/resource_manager" us "github.com/pingcap/tidb/store/mockstore/unistore/tikv" + "github.com/tikv/client-go/v2/oracle" pd "github.com/tikv/pd/client" ) @@ -31,9 +34,14 @@ var _ pd.Client = new(pdClient) type pdClient struct { *us.MockPD - serviceSafePoints map[string]uint64 - gcSafePointMu sync.Mutex - globalConfig map[string]string + serviceSafePoints map[string]uint64 + gcSafePointMu sync.Mutex + globalConfig map[string]string + externalTimestamp atomic.Uint64 + resourceGroupManager struct { + sync.RWMutex + groups map[string]*rmpb.ResourceGroup + } } func newPDClient(pd *us.MockPD) *pdClient { @@ -41,29 +49,35 @@ func newPDClient(pd *us.MockPD) *pdClient { MockPD: pd, serviceSafePoints: make(map[string]uint64), globalConfig: make(map[string]string), + resourceGroupManager: struct { + sync.RWMutex + groups map[string]*rmpb.ResourceGroup + }{ + groups: make(map[string]*rmpb.ResourceGroup), + }, } } -func (c *pdClient) LoadGlobalConfig(ctx context.Context, names []string) ([]pd.GlobalConfigItem, error) { +func (c *pdClient) LoadGlobalConfig(ctx context.Context, names []string, configPath string) ([]pd.GlobalConfigItem, int64, error) { ret := make([]pd.GlobalConfigItem, len(names)) for i, name := range names { if r, ok := c.globalConfig["/global/config/"+name]; ok { - ret[i] = pd.GlobalConfigItem{Name: "/global/config/" + name, Value: r} + ret[i] = pd.GlobalConfigItem{Name: "/global/config/" + name, Value: r, EventType: pdpb.EventType_PUT} } else { - ret[i] = pd.GlobalConfigItem{Name: "/global/config/" + name, Error: errors.New("not found")} + ret[i] = pd.GlobalConfigItem{Name: "/global/config/" + name, Value: ""} } } - return ret, nil + return ret, 0, nil } -func (c *pdClient) StoreGlobalConfig(ctx context.Context, items []pd.GlobalConfigItem) error { +func (c *pdClient) StoreGlobalConfig(ctx context.Context, configPath string, items []pd.GlobalConfigItem) error { for _, item := range items { c.globalConfig["/global/config/"+item.Name] = item.Value } return nil } -func (c *pdClient) WatchGlobalConfig(ctx context.Context) (chan []pd.GlobalConfigItem, error) { +func (c *pdClient) WatchGlobalConfig(ctx context.Context, configPath string, revision int64) (chan []pd.GlobalConfigItem, error) { globalConfigWatcherCh := make(chan []pd.GlobalConfigItem, 16) go func() { defer func() { @@ -177,3 +191,84 @@ func (c *pdClient) LoadKeyspace(ctx context.Context, name string) (*keyspacepb.K func (c *pdClient) WatchKeyspaces(ctx context.Context) (chan []*keyspacepb.KeyspaceMeta, error) { return nil, nil } + +func (c *pdClient) UpdateKeyspaceState(ctx context.Context, id uint32, state keyspacepb.KeyspaceState) (*keyspacepb.KeyspaceMeta, error) { + return nil, nil +} + +func (c *pdClient) ListResourceGroups(ctx context.Context) ([]*rmpb.ResourceGroup, error) { + c.resourceGroupManager.RLock() + defer c.resourceGroupManager.RUnlock() + groups := make([]*rmpb.ResourceGroup, 0, len(c.resourceGroupManager.groups)) + for _, group := range c.resourceGroupManager.groups { + groups = append(groups, group) + } + return groups, nil +} + +func (c *pdClient) GetResourceGroup(ctx context.Context, name string) (*rmpb.ResourceGroup, error) { + c.resourceGroupManager.RLock() + defer c.resourceGroupManager.RUnlock() + group, ok := c.resourceGroupManager.groups[name] + if !ok { + return nil, nil + } + return group, nil +} + +func (c *pdClient) AddResourceGroup(ctx context.Context, group *rmpb.ResourceGroup) (string, error) { + c.resourceGroupManager.Lock() + defer c.resourceGroupManager.Unlock() + c.resourceGroupManager.groups[group.Name] = group + return "Success!", nil +} + +func (c *pdClient) ModifyResourceGroup(ctx context.Context, group *rmpb.ResourceGroup) (string, error) { + c.resourceGroupManager.Lock() + defer c.resourceGroupManager.Unlock() + c.resourceGroupManager.groups[group.Name] = group + return "Success!", nil +} + +func (c *pdClient) DeleteResourceGroup(ctx context.Context, name string) (string, error) { + c.resourceGroupManager.Lock() + defer c.resourceGroupManager.Unlock() + delete(c.resourceGroupManager.groups, name) + return "Success!", nil +} + +func (c *pdClient) WatchResourceGroup(ctx context.Context, revision int64) (chan []*rmpb.ResourceGroup, error) { + return nil, nil +} + +func (c *pdClient) AcquireTokenBuckets(ctx context.Context, request *rmpb.TokenBucketsRequest) ([]*rmpb.TokenBucketResponse, error) { + return nil, nil +} + +func (c *pdClient) SetExternalTimestamp(ctx context.Context, newTimestamp uint64) error { + p, l, err := c.GetTS(ctx) + if err != nil { + return err + } + + currentTSO := oracle.ComposeTS(p, l) + if newTimestamp > currentTSO { + return errors.New("external timestamp is greater than global tso") + } + for { + externalTimestamp := c.externalTimestamp.Load() + if externalTimestamp > newTimestamp { + return errors.New("cannot decrease the external timestamp") + } else if externalTimestamp == newTimestamp { + return nil + } + + if c.externalTimestamp.CompareAndSwap(externalTimestamp, newTimestamp) { + return nil + } + } +} + +func (c *pdClient) GetExternalTimestamp(ctx context.Context) (uint64, error) { + return c.externalTimestamp.Load(), nil +} diff --git a/store/mockstore/unistore/pd/BUILD.bazel b/store/mockstore/unistore/pd/BUILD.bazel index e57867b014e47..5d5563cbdc153 100644 --- a/store/mockstore/unistore/pd/BUILD.bazel +++ b/store/mockstore/unistore/pd/BUILD.bazel @@ -12,6 +12,7 @@ go_library( "@com_github_pingcap_log//:log", "@com_github_tikv_pd_client//:client", "@org_golang_google_grpc//:grpc", + "@org_golang_google_grpc//credentials/insecure", "@org_uber_go_zap//:zap", ], ) diff --git a/store/mockstore/unistore/pd/client.go b/store/mockstore/unistore/pd/client.go index 55547e9461899..96d53eb8d54bf 100644 --- a/store/mockstore/unistore/pd/client.go +++ b/store/mockstore/unistore/pd/client.go @@ -29,6 +29,7 @@ import ( pd "github.com/tikv/pd/client" "go.uber.org/zap" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) // Client is a PD (Placement Driver) client. @@ -231,7 +232,7 @@ func (c *client) getOrCreateConn(addr string) (*grpc.ClientConn, error) { if err != nil { return nil, err } - cc, err := grpc.Dial(u.Host, grpc.WithInsecure()) + cc, err := grpc.Dial(u.Host, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { return nil, err } diff --git a/store/mockstore/unistore/pd_test.go b/store/mockstore/unistore/pd_test.go index 1fa645a3f2e86..4cfbfd094e396 100644 --- a/store/mockstore/unistore/pd_test.go +++ b/store/mockstore/unistore/pd_test.go @@ -36,18 +36,17 @@ func SetUpSuite() *GlobalConfigTestSuite { func TestLoad(t *testing.T) { s := SetUpSuite() - - s.client.StoreGlobalConfig(context.Background(), []pd.GlobalConfigItem{{Name: "LoadOkGlobalConfig", Value: "ok"}}) - res, err := s.client.LoadGlobalConfig(context.Background(), []string{"LoadOkGlobalConfig", "LoadErrGlobalConfig"}) + err := s.client.StoreGlobalConfig(context.Background(), "", []pd.GlobalConfigItem{{Name: "LoadOkGlobalConfig", Value: "ok"}}) + require.Equal(t, nil, err) + res, _, err := s.client.LoadGlobalConfig(context.Background(), []string{"LoadOkGlobalConfig", "LoadErrGlobalConfig"}, "") require.Equal(t, err, nil) for _, j := range res { + println(j.Name) switch j.Name { case "/global/config/LoadOkGlobalConfig": - require.Equal(t, j.Value, "ok") - + require.Equal(t, "ok", j.Value) case "/global/config/LoadErrGlobalConfig": - require.Equal(t, j.Value, "") - require.EqualError(t, j.Error, "not found") + require.Equal(t, "", j.Value) default: require.Equal(t, true, false) } @@ -58,26 +57,26 @@ func TestLoad(t *testing.T) { func TestStore(t *testing.T) { s := SetUpSuite() - res, err := s.client.LoadGlobalConfig(context.Background(), []string{"NewObject"}) + res, _, err := s.client.LoadGlobalConfig(context.Background(), []string{"NewObject"}, "") require.Equal(t, err, nil) - require.EqualError(t, res[0].Error, "not found") + require.Equal(t, res[0].Value, "") - err = s.client.StoreGlobalConfig(context.Background(), []pd.GlobalConfigItem{{Name: "NewObject", Value: "ok"}}) + err = s.client.StoreGlobalConfig(context.Background(), "", []pd.GlobalConfigItem{{Name: "NewObject", Value: "ok"}}) require.Equal(t, err, nil) - res, err = s.client.LoadGlobalConfig(context.Background(), []string{"NewObject"}) + res, _, err = s.client.LoadGlobalConfig(context.Background(), []string{"NewObject"}, "") require.Equal(t, err, nil) - require.Equal(t, res[0].Error, nil) + require.Equal(t, res[0].Value, "ok") s.TearDownSuite() } func TestWatch(t *testing.T) { s := SetUpSuite() - err := s.client.StoreGlobalConfig(context.Background(), []pd.GlobalConfigItem{{Name: "NewObject", Value: "ok"}}) + err := s.client.StoreGlobalConfig(context.Background(), "/global/config", []pd.GlobalConfigItem{{Name: "NewObject", Value: "ok"}}) require.Equal(t, err, nil) - ch, err := s.client.WatchGlobalConfig(context.Background()) + ch, err := s.client.WatchGlobalConfig(context.Background(), "/global/config", 0) require.Equal(t, err, nil) for i := 0; i < 10; i++ { diff --git a/store/mockstore/unistore/rpc.go b/store/mockstore/unistore/rpc.go index b0e88e533582d..15fe6828ddabf 100644 --- a/store/mockstore/unistore/rpc.go +++ b/store/mockstore/unistore/rpc.go @@ -265,6 +265,11 @@ func (c *RPCClient) SendRequest(ctx context.Context, addr string, req *tikvrpc.R failpoint.Return(nil, errors.New("rpc error")) } }) + failpoint.Inject("MppVersionError", func(val failpoint.Value) { + if v := int64(val.(int)); v > req.EstablishMPPConn().GetReceiverMeta().GetMppVersion() || v > req.EstablishMPPConn().GetSenderMeta().GetMppVersion() { + failpoint.Return(nil, context.Canceled) + } + }) resp.Resp, err = c.handleEstablishMPPConnection(ctx, req.EstablishMPPConn(), timeout, storeID) case tikvrpc.CmdMPPTask: failpoint.Inject("mppDispatchTimeout", func(val failpoint.Value) { @@ -272,6 +277,11 @@ func (c *RPCClient) SendRequest(ctx context.Context, addr string, req *tikvrpc.R failpoint.Return(nil, errors.New("rpc error")) } }) + failpoint.Inject("MppVersionError", func(val failpoint.Value) { + if v := int64(val.(int)); v > req.DispatchMPPTask().GetMeta().GetMppVersion() { + failpoint.Return(nil, context.Canceled) + } + }) resp.Resp, err = c.handleDispatchMPPTask(ctx, req.DispatchMPPTask(), storeID) case tikvrpc.CmdMPPCancel: case tikvrpc.CmdMvccGetByKey: diff --git a/store/mockstore/unistore/tikv/BUILD.bazel b/store/mockstore/unistore/tikv/BUILD.bazel index 91db06dd09dfa..bc7ecacf382fc 100644 --- a/store/mockstore/unistore/tikv/BUILD.bazel +++ b/store/mockstore/unistore/tikv/BUILD.bazel @@ -54,6 +54,7 @@ go_library( "@com_github_tikv_client_go_v2//oracle", "@com_github_tikv_pd_client//:client", "@org_golang_google_grpc//:grpc", + "@org_golang_google_grpc//credentials/insecure", "@org_golang_x_exp//slices", "@org_uber_go_zap//:zap", ], diff --git a/store/mockstore/unistore/tikv/deadlock.go b/store/mockstore/unistore/tikv/deadlock.go index 7eeb1fb2c5b64..7e8b0179e082d 100644 --- a/store/mockstore/unistore/tikv/deadlock.go +++ b/store/mockstore/unistore/tikv/deadlock.go @@ -27,6 +27,7 @@ import ( "github.com/pingcap/tidb/store/mockstore/unistore/util/lockwaiter" "go.uber.org/zap" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) // Follower will send detection rpc to Leader @@ -100,7 +101,7 @@ func (dt *DetectorClient) rebuildStreamClient() error { if err != nil { return err } - cc, err := grpc.Dial(leaderAddr, grpc.WithInsecure()) + cc, err := grpc.Dial(leaderAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { return err } diff --git a/store/mockstore/unistore/tikv/mvcc.go b/store/mockstore/unistore/tikv/mvcc.go index 753c2e49c709c..7cedfeabbbf1a 100644 --- a/store/mockstore/unistore/tikv/mvcc.go +++ b/store/mockstore/unistore/tikv/mvcc.go @@ -227,6 +227,20 @@ func sortKeys(keys [][]byte) [][]byte { // PessimisticLock will add pessimistic lock on key func (store *MVCCStore) PessimisticLock(reqCtx *requestCtx, req *kvrpcpb.PessimisticLockRequest, resp *kvrpcpb.PessimisticLockResponse) (*lockwaiter.Waiter, error) { + waiter, err := store.pessimisticLockInner(reqCtx, req, resp) + if err != nil && req.GetWakeUpMode() == kvrpcpb.PessimisticLockWakeUpMode_WakeUpModeForceLock { + // The execution of `pessimisticLockInner` is broken by error. If resp.Results is not completely set yet, fill it with LockResultFailed. + for len(resp.Results) < len(req.Mutations) { + resp.Results = append(resp.Results, &kvrpcpb.PessimisticLockKeyResult{ + Type: kvrpcpb.PessimisticLockKeyResultType_LockResultFailed, + }) + } + } + + return waiter, err +} + +func (store *MVCCStore) pessimisticLockInner(reqCtx *requestCtx, req *kvrpcpb.PessimisticLockRequest, resp *kvrpcpb.PessimisticLockResponse) (*lockwaiter.Waiter, error) { mutations := req.Mutations if !req.ReturnValues { mutations = sortMutations(req.Mutations) @@ -240,6 +254,9 @@ func (store *MVCCStore) PessimisticLock(reqCtx *requestCtx, req *kvrpcpb.Pessimi if req.LockOnlyIfExists && !req.ReturnValues { return nil, errors.New("LockOnlyIfExists is set for LockKeys but ReturnValues is not set") } + if req.GetWakeUpMode() == kvrpcpb.PessimisticLockWakeUpMode_WakeUpModeForceLock && len(req.Mutations) > 1 { + return nil, errors.New("Trying to lock more than one key in WakeUpModeForceLock, which is not supported yet") + } batch := store.dbWriter.NewWriteBatch(startTS, 0, reqCtx.rpcCtx) var dup bool for _, m := range mutations { @@ -273,12 +290,14 @@ func (store *MVCCStore) PessimisticLock(reqCtx *requestCtx, req *kvrpcpb.Pessimi } } items, err := store.getDBItems(reqCtx, mutations) + lockedWithConflictTSList := make([]uint64, 0, len(mutations)) if err != nil { return nil, err } if !dup { for i, m := range mutations { - lock, err1 := store.buildPessimisticLock(m, items[i], req) + lock, lockedWithConflictTS, err1 := store.buildPessimisticLock(m, items[i], req) + lockedWithConflictTSList = append(lockedWithConflictTSList, lockedWithConflictTS) if err1 != nil { return nil, err1 } @@ -301,24 +320,73 @@ func (store *MVCCStore) PessimisticLock(reqCtx *requestCtx, req *kvrpcpb.Pessimi resp.Value = val resp.CommitTs = dbMeta.CommitTS() } - if req.ReturnValues || req.CheckExistence { - for _, item := range items { - if item == nil { + + if req.GetWakeUpMode() == kvrpcpb.PessimisticLockWakeUpMode_WakeUpModeNormal { + if req.ReturnValues || req.CheckExistence { + for _, item := range items { + if item == nil { + if req.ReturnValues { + resp.Values = append(resp.Values, nil) + } + resp.NotFounds = append(resp.NotFounds, true) + continue + } + val, err1 := item.ValueCopy(nil) + if err1 != nil { + return nil, err1 + } if req.ReturnValues { - resp.Values = append(resp.Values, nil) + resp.Values = append(resp.Values, val) } - resp.NotFounds = append(resp.NotFounds, true) - continue + resp.NotFounds = append(resp.NotFounds, len(val) == 0) } - val, err1 := item.ValueCopy(nil) - if err1 != nil { - return nil, err1 + } + } else if req.GetWakeUpMode() == kvrpcpb.PessimisticLockWakeUpMode_WakeUpModeForceLock { + for i, item := range items { + res := &kvrpcpb.PessimisticLockKeyResult{ + Type: kvrpcpb.PessimisticLockKeyResultType_LockResultNormal, + Value: nil, + Existence: false, + LockedWithConflictTs: 0, } - if req.ReturnValues { - resp.Values = append(resp.Values, val) + + if lockedWithConflictTSList[i] != 0 { + res.Type = kvrpcpb.PessimisticLockKeyResultType_LockResultLockedWithConflict + res.LockedWithConflictTs = lockedWithConflictTSList[i] + if item == nil { + res.Value = nil + res.Existence = false + } else { + val, err1 := item.ValueCopy(nil) + if err1 != nil { + return nil, err1 + } + res.Value = val + res.Existence = len(val) != 0 + } + } else if req.ReturnValues { + if item != nil { + val, err1 := item.ValueCopy(nil) + if err1 != nil { + return nil, err1 + } + res.Value = val + res.Existence = len(val) != 0 + } + } else if req.CheckExistence { + if item != nil { + val, err1 := item.ValueCopy(nil) + if err1 != nil { + return nil, err1 + } + res.Existence = len(val) != 0 + } } - resp.NotFounds = append(resp.NotFounds, len(val) == 0) + + resp.Results = append(resp.Results, res) } + } else { + panic("unreachable") } return nil, err } @@ -575,42 +643,57 @@ func (store *MVCCStore) handleCheckPessimisticErr(startTS uint64, err error, isF return nil, err } +// buildPessimisticLock builds the lock according to the request and the current state of the key. +// Returns the built lock, and the LockedWithConflictTS (if any, otherwise 0). func (store *MVCCStore) buildPessimisticLock(m *kvrpcpb.Mutation, item *badger.Item, - req *kvrpcpb.PessimisticLockRequest) (*mvcc.Lock, error) { + req *kvrpcpb.PessimisticLockRequest) (*mvcc.Lock, uint64, error) { + var lockedWithConflictTS uint64 = 0 + if item != nil { userMeta := mvcc.DBUserMeta(item.UserMeta()) if !req.Force { if userMeta.CommitTS() > req.ForUpdateTs { - return nil, &kverrors.ErrConflict{ - StartTS: req.StartVersion, - ConflictTS: userMeta.StartTS(), - ConflictCommitTS: userMeta.CommitTS(), - Key: item.KeyCopy(nil), - Reason: kvrpcpb.WriteConflict_PessimisticRetry, + if req.GetWakeUpMode() == kvrpcpb.PessimisticLockWakeUpMode_WakeUpModeNormal { + return nil, 0, &kverrors.ErrConflict{ + StartTS: req.StartVersion, + ConflictTS: userMeta.StartTS(), + ConflictCommitTS: userMeta.CommitTS(), + Key: item.KeyCopy(nil), + Reason: kvrpcpb.WriteConflict_PessimisticRetry, + } + } else if req.GetWakeUpMode() == kvrpcpb.PessimisticLockWakeUpMode_WakeUpModeForceLock { + lockedWithConflictTS = userMeta.CommitTS() + } else { + panic("unreachable") } } } - if m.Assertion == kvrpcpb.Assertion_NotExist && !item.IsEmpty() { - return nil, &kverrors.ErrKeyAlreadyExists{Key: m.Key} + if lockedWithConflictTS == 0 && m.Assertion == kvrpcpb.Assertion_NotExist && !item.IsEmpty() { + return nil, 0, &kverrors.ErrKeyAlreadyExists{Key: m.Key} } } - if ok, err := doesNeedLock(item, req); !ok { + + actualWrittenForUpdateTS := req.ForUpdateTs + if lockedWithConflictTS > 0 { + actualWrittenForUpdateTS = lockedWithConflictTS + } else if ok, err := doesNeedLock(item, req); !ok { if err != nil { - return nil, err + return nil, 0, err } - return nil, nil + return nil, 0, nil } + lock := &mvcc.Lock{ LockHdr: mvcc.LockHdr{ StartTS: req.StartVersion, - ForUpdateTS: req.ForUpdateTs, + ForUpdateTS: actualWrittenForUpdateTS, Op: uint8(kvrpcpb.Op_PessimisticLock), TTL: uint32(req.LockTtl), PrimaryLen: uint16(len(req.PrimaryLock)), }, Primary: req.PrimaryLock, } - return lock, nil + return lock, lockedWithConflictTS, nil } // Prewrite implements the MVCCStore interface. @@ -935,16 +1018,16 @@ func (store *MVCCStore) buildPrewriteLock(reqCtx *requestCtx, m *kvrpcpb.Mutatio lock.Op = uint8(kvrpcpb.Op_Put) } if rowcodec.IsRowKey(m.Key) && lock.Op == uint8(kvrpcpb.Op_Put) { - if rowcodec.IsNewFormat(m.Value) { - reqCtx.buf = m.Value - } else { + if !rowcodec.IsNewFormat(m.Value) { reqCtx.buf, err = encodeFromOldRow(m.Value, reqCtx.buf) if err != nil { log.Error("encode data failed", zap.Binary("value", m.Value), zap.Binary("key", m.Key), zap.Stringer("op", m.Op), zap.Error(err)) return nil, err } + + lock.Value = make([]byte, len(reqCtx.buf)) + copy(lock.Value, reqCtx.buf) } - lock.Value = reqCtx.buf } lock.ForUpdateTS = req.ForUpdateTs diff --git a/store/mockstore/unistore/tikv/server.go b/store/mockstore/unistore/tikv/server.go index f7779b51a8d69..d3163d887d6a9 100644 --- a/store/mockstore/unistore/tikv/server.go +++ b/store/mockstore/unistore/tikv/server.go @@ -223,11 +223,19 @@ func (svr *Server) KvPessimisticLock(ctx context.Context, req *kvrpcpb.Pessimist WaitChain: result.DeadlockResp.WaitChain, } resp.Errors, resp.RegionError = convertToPBErrors(deadlockErr) + if req.WakeUpMode == kvrpcpb.PessimisticLockWakeUpMode_WakeUpModeForceLock { + resp.Results = []*kvrpcpb.PessimisticLockKeyResult{ + { + Type: kvrpcpb.PessimisticLockKeyResultType_LockResultFailed, + }, + } + } return resp, nil } if result.WakeupSleepTime == lockwaiter.WakeUpThisWaiter { - if req.Force { + if req.Force || req.WakeUpMode == kvrpcpb.PessimisticLockWakeUpMode_WakeUpModeForceLock { req.WaitTimeout = lockwaiter.LockNoWait + resp = &kvrpcpb.PessimisticLockResponse{} _, err := svr.mvccStore.PessimisticLock(reqCtx, req, resp) resp.Errors, resp.RegionError = convertToPBErrors(err) if err == nil { @@ -556,7 +564,7 @@ func (svr *Server) RawDeleteRange(context.Context, *kvrpcpb.RawDeleteRangeReques // SQL push down commands. // Coprocessor implements the tikvpb.TikvServer interface. -func (svr *Server) Coprocessor(_ context.Context, req *coprocessor.Request) (*coprocessor.Response, error) { +func (svr *Server) Coprocessor(ctx context.Context, req *coprocessor.Request) (*coprocessor.Response, error) { reqCtx, err := newRequestCtx(svr, req.Context, "Coprocessor") if err != nil { return &coprocessor.Response{OtherError: convertToKeyError(err).String()}, nil @@ -565,7 +573,58 @@ func (svr *Server) Coprocessor(_ context.Context, req *coprocessor.Request) (*co if reqCtx.regErr != nil { return &coprocessor.Response{RegionError: reqCtx.regErr}, nil } - return cophandler.HandleCopRequest(reqCtx.getDBReader(), svr.mvccStore.lockStore, req), nil + resp := cophandler.HandleCopRequest(reqCtx.getDBReader(), svr.mvccStore.lockStore, req) + resp.BatchResponses = svr.StoreBatchCoprocessor(ctx, req) + return resp, nil +} + +// StoreBatchCoprocessor handle batched tasks in the same store. +func (svr *Server) StoreBatchCoprocessor(ctx context.Context, req *coprocessor.Request) []*coprocessor.StoreBatchTaskResponse { + if len(req.Tasks) == 0 { + return nil + } + tasks := req.Tasks + batchResps := make([]*coprocessor.StoreBatchTaskResponse, 0, len(tasks)) + handleBatchResp := func(task *coprocessor.StoreBatchTask) { + var err error + batchResp := &coprocessor.StoreBatchTaskResponse{ + TaskId: task.TaskId, + } + defer func() { + if err != nil { + batchResp.OtherError = err.Error() + } + batchResps = append(batchResps, batchResp) + }() + bytes, err := req.Marshal() + if err != nil { + return + } + taskReq := &coprocessor.Request{} + // deep clone req + if err = taskReq.Unmarshal(bytes); err != nil { + return + } + taskReq.Tasks = nil + taskReq.IsCacheEnabled = false + taskReq.Ranges = task.Ranges + taskReq.Context.RegionId = task.RegionId + taskReq.Context.RegionEpoch = task.RegionEpoch + taskReq.Context.Peer = task.Peer + resp, err := svr.Coprocessor(ctx, taskReq) + if err != nil { + return + } + batchResp.RegionError = resp.RegionError + batchResp.Locked = resp.Locked + batchResp.OtherError = resp.OtherError + batchResp.ExecDetailsV2 = resp.ExecDetailsV2 + batchResp.Data = resp.Data + } + for _, task := range tasks { + handleBatchResp(task) + } + return batchResps } // CoprocessorStream implements the tikvpb.TikvServer interface. @@ -574,6 +633,11 @@ func (svr *Server) CoprocessorStream(*coprocessor.Request, tikvpb.Tikv_Coprocess return nil } +// GetLockWaitHistory implements the tikvpb.TikvServer interface. +func (svr *Server) GetLockWaitHistory(context.Context, *kvrpcpb.GetLockWaitHistoryRequest) (*kvrpcpb.GetLockWaitHistoryResponse, error) { + return &kvrpcpb.GetLockWaitHistoryResponse{}, nil +} + // RegionError represents a region error type RegionError struct { err *errorpb.Error diff --git a/store/store.go b/store/store.go index d4b51f025d824..cbc91a4fce259 100644 --- a/store/store.go +++ b/store/store.go @@ -20,6 +20,7 @@ import ( "sync" "github.com/pingcap/errors" + "github.com/pingcap/kvproto/pkg/pdpb" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/logutil" @@ -74,7 +75,7 @@ func newStoreWithRetry(path string, maxRetries int) (kv.Storage, error) { err = util.RunWithRetry(maxRetries, util.RetryInterval, func() (bool, error) { logutil.BgLogger().Info("new store", zap.String("path", path)) s, err = d.Open(path) - return kv.IsTxnRetryableError(err), err + return isNewStoreRetryableError(err), err }) if err == nil { @@ -91,3 +92,32 @@ func loadDriver(name string) (kv.Driver, bool) { d, ok := stores[name] return d, ok } + +// isOpenRetryableError check if the new store operation should be retried under given error +// currently, it should be retried if: +// +// Transaction conflict and is retryable (kv.IsTxnRetryableError) +// PD is not bootstrapped at the time of request +// Keyspace requested does not exist (request prior to PD keyspace pre-split) +func isNewStoreRetryableError(err error) bool { + if err == nil { + return false + } + return kv.IsTxnRetryableError(err) || IsNotBootstrappedError(err) || IsKeyspaceNotExistError(err) +} + +// IsNotBootstrappedError returns true if the error is pd not bootstrapped error. +func IsNotBootstrappedError(err error) bool { + if err == nil { + return false + } + return strings.Contains(err.Error(), pdpb.ErrorType_NOT_BOOTSTRAPPED.String()) +} + +// IsKeyspaceNotExistError returns true the error is caused by keyspace not exists. +func IsKeyspaceNotExistError(err error) bool { + if err == nil { + return false + } + return strings.Contains(err.Error(), pdpb.ErrorType_ENTRY_NOT_FOUND.String()) +} diff --git a/table/BUILD.bazel b/table/BUILD.bazel index 5f8e425822279..e1cf80e5e90fa 100644 --- a/table/BUILD.bazel +++ b/table/BUILD.bazel @@ -23,12 +23,13 @@ go_library( "//sessionctx", "//sessionctx/stmtctx", "//types", + "//util/chunk", "//util/dbterror", "//util/hack", "//util/logutil", "//util/sqlexec", "//util/timeutil", - "@com_github_opentracing_opentracing_go//:opentracing-go", + "//util/tracing", "@com_github_pingcap_errors//:errors", "@org_uber_go_zap//:zap", ], diff --git a/table/column.go b/table/column.go index b814c8927a472..23aa3868e3b0f 100644 --- a/table/column.go +++ b/table/column.go @@ -35,6 +35,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/timeutil" @@ -322,6 +323,7 @@ func CastValue(ctx sessionctx.Context, val types.Datum, col *model.ColumnInfo, r } err = sc.HandleTruncate(err) + err = sc.HandleOverflow(err, err) if forceIgnoreTruncate { err = nil @@ -536,7 +538,9 @@ func getColDefaultValue(ctx sessionctx.Context, col *model.ColumnInfo, defaultVa return getColDefaultValueFromNil(ctx, col) } - if col.GetType() != mysql.TypeTimestamp && col.GetType() != mysql.TypeDatetime { + switch col.GetType() { + case mysql.TypeTimestamp, mysql.TypeDate, mysql.TypeDatetime: + default: value, err := CastValue(ctx, types.NewDatum(defaultVal), col, false, false) if err != nil { return types.Datum{}, err @@ -545,29 +549,27 @@ func getColDefaultValue(ctx sessionctx.Context, col *model.ColumnInfo, defaultVa } // Check and get timestamp/datetime default value. - sc := ctx.GetSessionVars().StmtCtx var needChangeTimeZone bool + var explicitTz *time.Location // If the column's default value is not ZeroDatetimeStr nor CurrentTimestamp, should use the time zone of the default value itself. if col.GetType() == mysql.TypeTimestamp { if vv, ok := defaultVal.(string); ok && vv != types.ZeroDatetimeStr && !strings.EqualFold(vv, ast.CurrentTimestamp) { needChangeTimeZone = true - originalTZ := sc.TimeZone // For col.Version = 0, the timezone information of default value is already lost, so use the system timezone as the default value timezone. - sc.TimeZone = timeutil.SystemLocation() + explicitTz = timeutil.SystemLocation() if col.Version >= model.ColumnInfoVersion1 { - sc.TimeZone = time.UTC + explicitTz = time.UTC } - defer func() { sc.TimeZone = originalTZ }() } } - value, err := expression.GetTimeValue(ctx, defaultVal, col.GetType(), col.GetDecimal()) + value, err := expression.GetTimeValue(ctx, defaultVal, col.GetType(), col.GetDecimal(), explicitTz) if err != nil { return types.Datum{}, errGetDefaultFailed.GenWithStackByArgs(col.Name) } // If the column's default value is not ZeroDatetimeStr or CurrentTimestamp, convert the default value to the current session time zone. if needChangeTimeZone { t := value.GetMysqlTime() - err = t.ConvertTimeZone(sc.TimeZone, ctx.GetSessionVars().Location()) + err = t.ConvertTimeZone(explicitTz, ctx.GetSessionVars().Location()) if err != nil { return value, err } @@ -670,3 +672,36 @@ func OptionalFsp(fieldType *types.FieldType) string { } return "(" + strconv.Itoa(fsp) + ")" } + +// FillVirtualColumnValue will calculate the virtual column value by evaluating generated +// expression using rows from a chunk, and then fill this value into the chunk. +func FillVirtualColumnValue(virtualRetTypes []*types.FieldType, virtualColumnIndex []int, + expCols []*expression.Column, colInfos []*model.ColumnInfo, sctx sessionctx.Context, req *chunk.Chunk) error { + if len(virtualColumnIndex) == 0 { + return nil + } + + virCols := chunk.NewChunkWithCapacity(virtualRetTypes, req.Capacity()) + iter := chunk.NewIterator4Chunk(req) + for i, idx := range virtualColumnIndex { + for row := iter.Begin(); row != iter.End(); row = iter.Next() { + datum, err := expCols[idx].EvalVirtualColumn(row) + if err != nil { + return err + } + // Because the expression might return different type from + // the generated column, we should wrap a CAST on the result. + castDatum, err := CastValue(sctx, datum, colInfos[idx], false, true) + if err != nil { + return err + } + // Handle the bad null error. + if (mysql.HasNotNullFlag(colInfos[idx].GetFlag()) || mysql.HasPreventNullInsertFlag(colInfos[idx].GetFlag())) && castDatum.IsNull() { + castDatum = GetZeroValue(colInfos[idx]) + } + virCols.AppendDatum(i, &castDatum) + } + req.SetCol(idx, virCols.Column(i)) + } + return nil +} diff --git a/table/index.go b/table/index.go index f83e2dd35d2f4..a33b9c05f0049 100644 --- a/table/index.go +++ b/table/index.go @@ -69,6 +69,12 @@ func WithCtx(ctx context.Context) CreateIdxOptFunc { } } +// IndexIter is index kvs iter. +type IndexIter interface { + Next(kb []byte) ([]byte, []byte, bool, error) + Valid() bool +} + // Index is the interface for index data on KV store. type Index interface { // Meta returns IndexInfo. @@ -79,9 +85,11 @@ type Index interface { Create(ctx sessionctx.Context, txn kv.Transaction, indexedValues []types.Datum, h kv.Handle, handleRestoreData []types.Datum, opts ...CreateIdxOptFunc) (kv.Handle, error) // Delete supports delete from statement. Delete(sc *stmtctx.StatementContext, txn kv.Transaction, indexedValues []types.Datum, h kv.Handle) error + // GenIndexKVIter generate index key and value for multi-valued index, use iterator to reduce the memory allocation. + GenIndexKVIter(sc *stmtctx.StatementContext, indexedValue []types.Datum, h kv.Handle, handleRestoreData []types.Datum) IndexIter // Exist supports check index exists or not. Exist(sc *stmtctx.StatementContext, txn kv.Transaction, indexedValues []types.Datum, h kv.Handle) (bool, kv.Handle, error) - // GenIndexKey generates an index key. + // GenIndexKey generates an index key. If the index is a multi-valued index, use GenIndexKVIter instead. GenIndexKey(sc *stmtctx.StatementContext, indexedValues []types.Datum, h kv.Handle, buf []byte) (key []byte, distinct bool, err error) // GenIndexValue generates an index value. GenIndexValue(sc *stmtctx.StatementContext, distinct bool, indexedValues []types.Datum, h kv.Handle, restoredData []types.Datum) ([]byte, error) diff --git a/table/table.go b/table/table.go index 6aef5ed4497e6..d71c24fc64b18 100644 --- a/table/table.go +++ b/table/table.go @@ -22,7 +22,6 @@ import ( "context" "time" - "github.com/opentracing/opentracing-go" mysql "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" @@ -31,6 +30,7 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/sqlexec" + "github.com/pingcap/tidb/util/tracing" ) // Type is used to distinguish between different tables that store data in different ways. @@ -196,17 +196,19 @@ type Table interface { // Type returns the type of table Type() Type + + // GetPartitionedTable returns nil if not partitioned + GetPartitionedTable() PartitionedTable } // AllocAutoIncrementValue allocates an auto_increment value for a new row. func AllocAutoIncrementValue(ctx context.Context, t Table, sctx sessionctx.Context) (int64, error) { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("table.AllocAutoIncrementValue", opentracing.ChildOf(span.Context())) - defer span1.Finish() - } + r, ctx := tracing.StartRegionEx(ctx, "table.AllocAutoIncrementValue") + defer r.End() increment := sctx.GetSessionVars().AutoIncrementIncrement offset := sctx.GetSessionVars().AutoIncrementOffset - _, max, err := t.Allocators(sctx).Get(autoid.RowIDAllocType).Alloc(ctx, uint64(1), int64(increment), int64(offset)) + alloc := t.Allocators(sctx).Get(autoid.AutoIncrementType) + _, max, err := alloc.Alloc(ctx, uint64(1), int64(increment), int64(offset)) if err != nil { return 0, err } @@ -218,7 +220,8 @@ func AllocAutoIncrementValue(ctx context.Context, t Table, sctx sessionctx.Conte func AllocBatchAutoIncrementValue(ctx context.Context, t Table, sctx sessionctx.Context, N int) (firstID int64, increment int64, err error) { increment = int64(sctx.GetSessionVars().AutoIncrementIncrement) offset := int64(sctx.GetSessionVars().AutoIncrementOffset) - min, max, err := t.Allocators(sctx).Get(autoid.RowIDAllocType).Alloc(ctx, uint64(N), increment, offset) + alloc := t.Allocators(sctx).Get(autoid.AutoIncrementType) + min, max, err := alloc.Alloc(ctx, uint64(N), increment, offset) if err != nil { return min, max, err } @@ -243,6 +246,7 @@ type PartitionedTable interface { GetPartition(physicalID int64) PhysicalTable GetPartitionByRow(sessionctx.Context, []types.Datum) (PhysicalTable, error) GetAllPartitionIDs() []int64 + GetPartitionColumnIDs() []int64 GetPartitionColumnNames() []model.CIStr CheckForExchangePartition(ctx sessionctx.Context, pi *model.PartitionInfo, r []types.Datum, pid int64) error } diff --git a/table/tables/BUILD.bazel b/table/tables/BUILD.bazel index a6e9bec521355..3aa8362fbaf46 100644 --- a/table/tables/BUILD.bazel +++ b/table/tables/BUILD.bazel @@ -46,8 +46,8 @@ go_library( "//util/sqlexec", "//util/stringutil", "//util/tableutil", + "//util/tracing", "@com_github_google_btree//:btree", - "@com_github_opentracing_opentracing_go//:opentracing-go", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_log//:log", diff --git a/table/tables/index.go b/table/tables/index.go index bc1a90f70ba71..8b8ce6660ca1c 100644 --- a/table/tables/index.go +++ b/table/tables/index.go @@ -18,7 +18,6 @@ import ( "context" "sync" - "github.com/opentracing/opentracing-go" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" @@ -28,6 +27,7 @@ import ( "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/rowcodec" + "github.com/pingcap/tidb/util/tracing" ) // index is the data structure for index data in the KV store. @@ -102,10 +102,62 @@ func (c *index) GenIndexValue(sc *stmtctx.StatementContext, distinct bool, index return tablecodec.GenIndexValuePortal(sc, c.tblInfo, c.idxInfo, c.needRestoredData, distinct, false, indexedValues, h, c.phyTblID, restoredData) } +// getIndexedValue will produce the result like: +// 1. If not multi-valued index, return directly. +// 2. (i1, [m1,m2], i2, ...) ==> [(i1, m1, i2, ...), (i1, m2, i2, ...)] +// 3. (i1, null, i2, ...) ==> [(i1, null, i2, ...)] +// 4. (i1, [], i2, ...) ==> nothing. +func (c *index) getIndexedValue(indexedValues []types.Datum) [][]types.Datum { + if !c.idxInfo.MVIndex { + return [][]types.Datum{indexedValues} + } + + vals := make([][]types.Datum, 0, 16) + jsonIdx := 0 + jsonIsNull := false + existsVals := make(map[string]struct{}) + var buf []byte + for !jsonIsNull { + val := make([]types.Datum, 0, len(indexedValues)) + for i, v := range indexedValues { + if !c.tblInfo.Columns[c.idxInfo.Columns[i].Offset].FieldType.IsArray() { + val = append(val, v) + } else { + // if the datum type is not JSON, it must come from cleanup index. + if v.IsNull() || v.Kind() != types.KindMysqlJSON { + val = append(val, v) + jsonIsNull = true + continue + } + elemCount := v.GetMysqlJSON().GetElemCount() + for { + // JSON cannot be indexed, if the value is JSON type, it must be multi-valued index. + if jsonIdx >= elemCount { + goto out + } + binaryJSON := v.GetMysqlJSON().ArrayGetElem(jsonIdx) + jsonIdx++ + buf = buf[:0] + key := string(binaryJSON.HashValue(buf)) + if _, exists := existsVals[key]; exists { + continue + } + existsVals[key] = struct{}{} + val = append(val, types.NewDatum(binaryJSON.GetValue())) + break + } + } + } + vals = append(vals, val) + } +out: + return vals +} + // Create creates a new entry in the kvIndex data. // If the index is unique and there is an existing entry with the same key, // Create will return the existing entry's handle as the first return value, ErrKeyExists as the second return value. -func (c *index) Create(sctx sessionctx.Context, txn kv.Transaction, indexedValues []types.Datum, h kv.Handle, handleRestoreData []types.Datum, opts ...table.CreateIdxOptFunc) (kv.Handle, error) { +func (c *index) Create(sctx sessionctx.Context, txn kv.Transaction, indexedValue []types.Datum, h kv.Handle, handleRestoreData []types.Datum, opts ...table.CreateIdxOptFunc) (kv.Handle, error) { if c.Meta().Unique { txn.CacheTableInfo(c.phyTblID, c.tblInfo) } @@ -113,230 +165,333 @@ func (c *index) Create(sctx sessionctx.Context, txn kv.Transaction, indexedValue for _, fn := range opts { fn(&opt) } + + indexedValues := c.getIndexedValue(indexedValue) + ctx := opt.Ctx + if ctx != nil { + var r tracing.Region + r, ctx = tracing.StartRegionEx(ctx, "index.Create") + defer r.End() + } else { + ctx = context.TODO() + } vars := sctx.GetSessionVars() writeBufs := vars.GetWriteStmtBufs() skipCheck := vars.StmtCtx.BatchCheck - key, distinct, err := c.GenIndexKey(vars.StmtCtx, indexedValues, h, writeBufs.IndexKeyBuf) - if err != nil { - return nil, err - } - - var ( - tempKey []byte - keyVer byte - keyIsRewritten bool - ) - if !opt.FromBackFill { - key, tempKey, keyVer = genTempIdxKeyByState(c.idxInfo, key) - if keyVer == TempIndexKeyTypeBackfill { - key, tempKey = tempKey, nil - keyIsRewritten = true + for _, value := range indexedValues { + key, distinct, err := c.GenIndexKey(vars.StmtCtx, value, h, writeBufs.IndexKeyBuf) + if err != nil { + return nil, err } - } - ctx := opt.Ctx - if opt.Untouched { - txn, err1 := sctx.Txn(true) - if err1 != nil { - return nil, err1 + var ( + tempKey []byte + keyVer byte + keyIsTempIdxKey bool + ) + if !opt.FromBackFill { + key, tempKey, keyVer = GenTempIdxKeyByState(c.idxInfo, key) + if keyVer == TempIndexKeyTypeBackfill || keyVer == TempIndexKeyTypeDelete { + key, tempKey = tempKey, nil + keyIsTempIdxKey = true + } } - // If the index kv was untouched(unchanged), and the key/value already exists in mem-buffer, - // should not overwrite the key with un-commit flag. - // So if the key exists, just do nothing and return. - v, err := txn.GetMemBuffer().Get(ctx, key) - if err == nil { - if len(v) != 0 { - return nil, nil + + if opt.Untouched { + txn, err1 := sctx.Txn(true) + if err1 != nil { + return nil, err1 } - // The key is marked as deleted in the memory buffer, as the existence check is done lazily - // for optimistic transactions by default. The "untouched" key could still exist in the store, - // it's needed to commit this key to do the existence check so unset the untouched flag. - if !txn.IsPessimistic() { - keyFlags, err := txn.GetMemBuffer().GetFlags(key) - if err != nil { - return nil, err + // If the index kv was untouched(unchanged), and the key/value already exists in mem-buffer, + // should not overwrite the key with un-commit flag. + // So if the key exists, just do nothing and return. + v, err := txn.GetMemBuffer().Get(ctx, key) + if err == nil { + if len(v) != 0 { + continue } - if keyFlags.HasPresumeKeyNotExists() { - opt.Untouched = false + // The key is marked as deleted in the memory buffer, as the existence check is done lazily + // for optimistic transactions by default. The "untouched" key could still exist in the store, + // it's needed to commit this key to do the existence check so unset the untouched flag. + if !txn.IsPessimistic() { + keyFlags, err := txn.GetMemBuffer().GetFlags(key) + if err != nil { + return nil, err + } + if keyFlags.HasPresumeKeyNotExists() { + opt.Untouched = false + } } } } - } - // save the key buffer to reuse. - writeBufs.IndexKeyBuf = key - c.initNeedRestoreData.Do(func() { - c.needRestoredData = NeedRestoredData(c.idxInfo.Columns, c.tblInfo.Columns) - }) - idxVal, err := tablecodec.GenIndexValuePortal(sctx.GetSessionVars().StmtCtx, c.tblInfo, c.idxInfo, c.needRestoredData, distinct, opt.Untouched, indexedValues, h, c.phyTblID, handleRestoreData) - if err != nil { - return nil, err - } - - opt.IgnoreAssertion = opt.IgnoreAssertion || c.idxInfo.State != model.StatePublic - - if !distinct || skipCheck || opt.Untouched { - if keyIsRewritten { - idxVal = append(idxVal, keyVer) - } - err = txn.GetMemBuffer().Set(key, idxVal) + // save the key buffer to reuse. + writeBufs.IndexKeyBuf = key + c.initNeedRestoreData.Do(func() { + c.needRestoredData = NeedRestoredData(c.idxInfo.Columns, c.tblInfo.Columns) + }) + idxVal, err := tablecodec.GenIndexValuePortal(sctx.GetSessionVars().StmtCtx, c.tblInfo, c.idxInfo, c.needRestoredData, distinct, opt.Untouched, value, h, c.phyTblID, handleRestoreData) if err != nil { return nil, err } - if len(tempKey) > 0 { - idxVal = append(idxVal, keyVer) - err = txn.GetMemBuffer().Set(tempKey, idxVal) + + opt.IgnoreAssertion = opt.IgnoreAssertion || c.idxInfo.State != model.StatePublic + + if !distinct || skipCheck || opt.Untouched { + val := idxVal + if keyIsTempIdxKey && !opt.Untouched { // Untouched key-values never occur in the storage. + tempVal := tablecodec.TempIndexValueElem{Value: idxVal, KeyVer: keyVer, Distinct: distinct} + val = tempVal.Encode(nil) + } + err = txn.GetMemBuffer().Set(key, val) if err != nil { return nil, err } - } - if !opt.IgnoreAssertion && (!opt.Untouched) { - if sctx.GetSessionVars().LazyCheckKeyNotExists() && !txn.IsPessimistic() { - err = txn.SetAssertion(key, kv.SetAssertUnknown) - } else { - err = txn.SetAssertion(key, kv.SetAssertNotExist) + if len(tempKey) > 0 { + if !opt.Untouched { // Untouched key-values never occur in the storage. + tempVal := tablecodec.TempIndexValueElem{Value: idxVal, KeyVer: keyVer, Distinct: distinct} + val = tempVal.Encode(nil) + } + err = txn.GetMemBuffer().Set(tempKey, val) + if err != nil { + return nil, err + } } + if !opt.IgnoreAssertion && (!opt.Untouched) { + if sctx.GetSessionVars().LazyCheckKeyNotExists() && !txn.IsPessimistic() { + err = txn.SetAssertion(key, kv.SetAssertUnknown) + } else { + err = txn.SetAssertion(key, kv.SetAssertNotExist) + } + } + if err != nil { + return nil, err + } + continue } - return nil, err - } - - if ctx != nil { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("index.Create", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } - } else { - ctx = context.TODO() - } - var value []byte - if c.tblInfo.TempTableType != model.TempTableNone { - // Always check key for temporary table because it does not write to TiKV - value, err = txn.Get(ctx, key) - } else if sctx.GetSessionVars().LazyCheckKeyNotExists() { - value, err = txn.GetMemBuffer().Get(ctx, key) - } else { - value, err = txn.Get(ctx, key) - } - if err != nil && !kv.IsErrNotFound(err) { - return nil, err - } - if err != nil || len(value) == 0 { - lazyCheck := sctx.GetSessionVars().LazyCheckKeyNotExists() && err != nil - if keyIsRewritten { - idxVal = append(idxVal, keyVer) - } - if lazyCheck { - flags := []kv.FlagsOp{kv.SetPresumeKeyNotExists} - if !vars.ConstraintCheckInPlacePessimistic && vars.TxnCtx.IsPessimistic && vars.InTxn() && - !vars.InRestrictedSQL && vars.ConnectionID > 0 { - flags = append(flags, kv.SetNeedConstraintCheckInPrewrite) - } - err = txn.GetMemBuffer().SetWithFlags(key, idxVal, flags...) + var value []byte + if c.tblInfo.TempTableType != model.TempTableNone { + // Always check key for temporary table because it does not write to TiKV + value, err = txn.Get(ctx, key) + } else if sctx.GetSessionVars().LazyCheckKeyNotExists() { + value, err = txn.GetMemBuffer().Get(ctx, key) } else { - err = txn.GetMemBuffer().Set(key, idxVal) + value, err = txn.Get(ctx, key) } - if err != nil { + if err != nil && !kv.IsErrNotFound(err) { return nil, err } - if len(tempKey) > 0 { - idxVal = append(idxVal, keyVer) + var tempIdxVal tablecodec.TempIndexValue + if len(value) > 0 && keyIsTempIdxKey { + tempIdxVal, err = tablecodec.DecodeTempIndexValue(value, c.tblInfo.IsCommonHandle) + if err != nil { + return nil, err + } + } + // The index key value is not found or deleted. + if err != nil || len(value) == 0 || (!tempIdxVal.IsEmpty() && tempIdxVal.Current().Delete) { + val := idxVal + lazyCheck := sctx.GetSessionVars().LazyCheckKeyNotExists() && err != nil + if keyIsTempIdxKey { + tempVal := tablecodec.TempIndexValueElem{Value: idxVal, KeyVer: keyVer, Distinct: true} + val = tempVal.Encode(value) + } + needPresumeNotExists, err := needPresumeKeyNotExistsFlag(ctx, txn, key, tempKey, h, + keyIsTempIdxKey, c.tblInfo.IsCommonHandle, c.tblInfo.ID) + if err != nil { + return nil, err + } if lazyCheck { - err = txn.GetMemBuffer().SetWithFlags(tempKey, idxVal, kv.SetPresumeKeyNotExists) + var flags []kv.FlagsOp + if needPresumeNotExists { + flags = []kv.FlagsOp{kv.SetPresumeKeyNotExists} + } + if !vars.ConstraintCheckInPlacePessimistic && vars.TxnCtx.IsPessimistic && vars.InTxn() && + !vars.InRestrictedSQL && vars.ConnectionID > 0 { + flags = append(flags, kv.SetNeedConstraintCheckInPrewrite) + } + err = txn.GetMemBuffer().SetWithFlags(key, val, flags...) + } else { + err = txn.GetMemBuffer().Set(key, val) + } + if err != nil { + return nil, err + } + if len(tempKey) > 0 { + tempVal := tablecodec.TempIndexValueElem{Value: idxVal, KeyVer: keyVer, Distinct: true} + val = tempVal.Encode(value) + if lazyCheck && needPresumeNotExists { + err = txn.GetMemBuffer().SetWithFlags(tempKey, val, kv.SetPresumeKeyNotExists) + } else { + err = txn.GetMemBuffer().Set(tempKey, val) + } + if err != nil { + return nil, err + } + } + if opt.IgnoreAssertion { + continue + } + if lazyCheck && !txn.IsPessimistic() { + err = txn.SetAssertion(key, kv.SetAssertUnknown) } else { - err = txn.GetMemBuffer().Set(tempKey, idxVal) + err = txn.SetAssertion(key, kv.SetAssertNotExist) } if err != nil { return nil, err } + continue } - if opt.IgnoreAssertion { - return nil, nil + + if keyIsTempIdxKey && !tempIdxVal.IsEmpty() { + value = tempIdxVal.Current().Value } - if lazyCheck && !txn.IsPessimistic() { - err = txn.SetAssertion(key, kv.SetAssertUnknown) - } else { - err = txn.SetAssertion(key, kv.SetAssertNotExist) + handle, err := tablecodec.DecodeHandleInUniqueIndexValue(value, c.tblInfo.IsCommonHandle) + if err != nil { + return nil, err } - return nil, err + return handle, kv.ErrKeyExists } + return nil, nil +} - handle, err := tablecodec.DecodeHandleInUniqueIndexValue(value, c.tblInfo.IsCommonHandle) +func needPresumeKeyNotExistsFlag(ctx context.Context, txn kv.Transaction, key, tempKey kv.Key, + h kv.Handle, keyIsTempIdxKey bool, isCommon bool, tblID int64) (needFlag bool, err error) { + var uniqueTempKey kv.Key + if keyIsTempIdxKey { + uniqueTempKey = key + } else if len(tempKey) > 0 { + uniqueTempKey = tempKey + } else { + return true, nil + } + foundKey, dupHandle, err := FetchDuplicatedHandle(ctx, uniqueTempKey, true, txn, tblID, isCommon) if err != nil { - return nil, err + return false, err + } + if foundKey && dupHandle != nil && !dupHandle.Equal(h) { + return false, kv.ErrKeyExists } - return handle, kv.ErrKeyExists + return false, nil } -var ( - // DeleteMarker is a marker that the key is deleted. - DeleteMarker = []byte("delete") - // DeleteMarkerUnique is a marker that the unique index key is deleted. - DeleteMarkerUnique = []byte("deleteu") -) - // Delete removes the entry for handle h and indexedValues from KV index. -func (c *index) Delete(sc *stmtctx.StatementContext, txn kv.Transaction, indexedValues []types.Datum, h kv.Handle) error { - key, distinct, err := c.GenIndexKey(sc, indexedValues, h, nil) - if err != nil { - return err - } - - key, tempKey, tempKeyVer := genTempIdxKeyByState(c.idxInfo, key) +func (c *index) Delete(sc *stmtctx.StatementContext, txn kv.Transaction, indexedValue []types.Datum, h kv.Handle) error { + indexedValues := c.getIndexedValue(indexedValue) + for _, value := range indexedValues { + key, distinct, err := c.GenIndexKey(sc, value, h, nil) + if err != nil { + return err + } - if distinct { - if len(key) > 0 { - err = txn.GetMemBuffer().DeleteWithFlags(key, kv.SetNeedLocked) + key, tempKey, tempKeyVer := GenTempIdxKeyByState(c.idxInfo, key) + var originTempVal []byte + if len(tempKey) > 0 && c.idxInfo.Unique { + // Get the origin value of the unique temporary index key. + // Append the new delete operations to the end of the origin value. + originTempVal, err = getKeyInTxn(context.TODO(), txn, tempKey) if err != nil { return err } } - if len(tempKey) > 0 { - val := make([]byte, 0, len(DeleteMarkerUnique)+1) - val = append(val, DeleteMarkerUnique...) - val = append(val, tempKeyVer) - err = txn.GetMemBuffer().Set(tempKey, val) - if err != nil { - return err + tempValElem := tablecodec.TempIndexValueElem{Handle: h, KeyVer: tempKeyVer, Delete: true, Distinct: distinct} + + if distinct { + if len(key) > 0 { + err = txn.GetMemBuffer().DeleteWithFlags(key, kv.SetNeedLocked) + if err != nil { + return err + } } - } - } else { - if len(key) > 0 { - err = txn.GetMemBuffer().Delete(key) - if err != nil { - return err + if len(tempKey) > 0 { + // Append to the end of the origin value for distinct value. + tempVal := tempValElem.Encode(originTempVal) + err = txn.GetMemBuffer().Set(tempKey, tempVal) + if err != nil { + return err + } } - } - if len(tempKey) > 0 { - val := make([]byte, 0, len(DeleteMarker)+1) - val = append(val, DeleteMarker...) - val = append(val, tempKeyVer) - err = txn.GetMemBuffer().Set(tempKey, val) - if err != nil { - return err + } else { + if len(key) > 0 { + err = txn.GetMemBuffer().Delete(key) + if err != nil { + return err + } + } + if len(tempKey) > 0 { + tempVal := tempValElem.Encode(nil) + err = txn.GetMemBuffer().Set(tempKey, tempVal) + if err != nil { + return err + } } } + if c.idxInfo.State == model.StatePublic { + // If the index is in public state, delete this index means it must exists. + err = txn.SetAssertion(key, kv.SetAssertExist) + } + if err != nil { + return err + } + } + return nil +} + +func (c *index) GenIndexKVIter(sc *stmtctx.StatementContext, indexedValue []types.Datum, h kv.Handle, handleRestoreData []types.Datum) table.IndexIter { + indexedValues := c.getIndexedValue(indexedValue) + return &indexGenerator{ + c: c, + sctx: sc, + indexedVals: indexedValues, + h: h, + handleRestoreData: handleRestoreData, + i: 0, + } +} + +type indexGenerator struct { + c *index + sctx *stmtctx.StatementContext + indexedVals [][]types.Datum + h kv.Handle + handleRestoreData []types.Datum + + i int +} + +func (s *indexGenerator) Next(kb []byte) ([]byte, []byte, bool, error) { + val := s.indexedVals[s.i] + key, distinct, err := s.c.GenIndexKey(s.sctx, val, s.h, kb) + if err != nil { + return nil, nil, false, err } - if c.idxInfo.State == model.StatePublic { - // If the index is in public state, delete this index means it must exists. - err = txn.SetAssertion(key, kv.SetAssertExist) + idxVal, err := s.c.GenIndexValue(s.sctx, distinct, val, s.h, s.handleRestoreData) + if err != nil { + return nil, nil, false, err } - return err + s.i++ + return key, idxVal, distinct, err +} + +func (s *indexGenerator) Valid() bool { + return s.i < len(s.indexedVals) } const ( // TempIndexKeyTypeNone means the key is not a temporary index key. TempIndexKeyTypeNone byte = 0 + // TempIndexKeyTypeDelete indicates this value is written in the delete-only stage. + TempIndexKeyTypeDelete byte = 'd' // TempIndexKeyTypeBackfill indicates this value is written in the backfill stage. TempIndexKeyTypeBackfill byte = 'b' // TempIndexKeyTypeMerge indicates this value is written in the merge stage. TempIndexKeyTypeMerge byte = 'm' ) -// genTempIdxKeyByState is used to get the key version and the temporary key. +// GenTempIdxKeyByState is used to get the key version and the temporary key. // The tempKeyVer means the temp index key/value version. -func genTempIdxKeyByState(indexInfo *model.IndexInfo, indexKey kv.Key) (key, tempKey kv.Key, tempKeyVer byte) { +func GenTempIdxKeyByState(indexInfo *model.IndexInfo, indexKey kv.Key) (key, tempKey kv.Key, tempKeyVer byte) { if indexInfo.State != model.StatePublic { switch indexInfo.BackfillState { case model.BackfillStateInapplicable: @@ -344,6 +499,9 @@ func genTempIdxKeyByState(indexInfo *model.IndexInfo, indexKey kv.Key) (key, tem case model.BackfillStateRunning: // Write to the temporary index. tablecodec.IndexKey2TempIndexKey(indexInfo.ID, indexKey) + if indexInfo.State == model.StateDeleteOnly { + return nil, indexKey, TempIndexKeyTypeDelete + } return nil, indexKey, TempIndexKeyTypeBackfill case model.BackfillStateReadyToMerge, model.BackfillStateMerging: // Double write @@ -356,34 +514,123 @@ func genTempIdxKeyByState(indexInfo *model.IndexInfo, indexKey kv.Key) (key, tem return indexKey, nil, TempIndexKeyTypeNone } -func (c *index) Exist(sc *stmtctx.StatementContext, txn kv.Transaction, indexedValues []types.Datum, h kv.Handle) (bool, kv.Handle, error) { - key, distinct, err := c.GenIndexKey(sc, indexedValues, h, nil) - if err != nil { +func (c *index) Exist(sc *stmtctx.StatementContext, txn kv.Transaction, indexedValue []types.Datum, h kv.Handle) (bool, kv.Handle, error) { + indexedValues := c.getIndexedValue(indexedValue) + for _, val := range indexedValues { + key, distinct, err := c.GenIndexKey(sc, val, h, nil) + if err != nil { + return false, nil, err + } + // If index current is in creating status and using ingest mode, we need first + // check key exist status in temp index. + key, tempKey, _ := GenTempIdxKeyByState(c.idxInfo, key) + if len(tempKey) > 0 { + key = tempKey + } + foundKey, dupHandle, err := FetchDuplicatedHandle(context.TODO(), key, distinct, txn, c.tblInfo.ID, c.tblInfo.IsCommonHandle) + if err != nil || !foundKey { + return false, nil, err + } + if dupHandle != nil && !dupHandle.Equal(h) { + return false, nil, err + } + continue + } + return true, h, nil +} + +// FetchDuplicatedHandle is used to find the duplicated row's handle for a given unique index key. +func FetchDuplicatedHandle(ctx context.Context, key kv.Key, distinct bool, + txn kv.Transaction, tableID int64, isCommon bool) (foundKey bool, dupHandle kv.Handle, err error) { + if isTemp, originIdxID := tablecodec.CheckTempIndexKey(key); isTemp { + return fetchDuplicatedHandleForTempIndexKey(ctx, key, distinct, txn, tableID, originIdxID, isCommon) + } + // The index key is not from temp index. + val, err := getKeyInTxn(ctx, txn, key) + if err != nil || len(val) == 0 { return false, nil, err } + if distinct { + h, err := tablecodec.DecodeHandleInUniqueIndexValue(val, isCommon) + return true, h, err + } + return true, nil, nil +} - value, err := txn.Get(context.TODO(), key) - if kv.IsErrNotFound(err) { +func fetchDuplicatedHandleForTempIndexKey(ctx context.Context, tempKey kv.Key, distinct bool, + txn kv.Transaction, tableID, idxID int64, isCommon bool) (foundKey bool, dupHandle kv.Handle, err error) { + tempRawVal, err := getKeyInTxn(ctx, txn, tempKey) + if err != nil { + return false, nil, err + } + if tempRawVal == nil { + originKey := tempKey.Clone() + tablecodec.TempIndexKey2IndexKey(idxID, originKey) + originVal, err := getKeyInTxn(ctx, txn, originKey) + if err != nil || originVal == nil { + return false, nil, err + } + if distinct { + originHandle, err := tablecodec.DecodeHandleInUniqueIndexValue(originVal, isCommon) + if err != nil { + return false, nil, err + } + return true, originHandle, err + } return false, nil, nil } + tempVal, err := tablecodec.DecodeTempIndexValue(tempRawVal, isCommon) if err != nil { return false, nil, err } - - // For distinct index, the value of key is handle. - if distinct { - var handle kv.Handle - handle, err := tablecodec.DecodeHandleInUniqueIndexValue(value, c.tblInfo.IsCommonHandle) - if err != nil { + curElem := tempVal.Current() + if curElem.Delete { + originKey := tempKey.Clone() + tablecodec.TempIndexKey2IndexKey(idxID, originKey) + originVal, err := getKeyInTxn(ctx, txn, originKey) + if err != nil || originVal == nil { return false, nil, err } - if !handle.Equal(h) { - return true, handle, kv.ErrKeyExists + if distinct { + originHandle, err := tablecodec.DecodeHandleInUniqueIndexValue(originVal, isCommon) + if err != nil { + return false, nil, err + } + if originHandle.Equal(curElem.Handle) { + // The key has been deleted. This is not a duplicated key. + return false, nil, nil + } + // The inequality means multiple modifications happened in the same key. + // We use the handle in origin index value to check if the row exists. + recPrefix := tablecodec.GenTableRecordPrefix(tableID) + rowKey := tablecodec.EncodeRecordKey(recPrefix, originHandle) + rowVal, err := getKeyInTxn(ctx, txn, rowKey) + if err != nil || rowVal == nil { + return false, nil, err + } + // The row exists. This is the duplicated key. + return true, originHandle, nil } - return true, handle, nil + return false, nil, nil } + // The value in temp index is not the delete marker. + if distinct { + h, err := tablecodec.DecodeHandleInUniqueIndexValue(curElem.Value, isCommon) + return true, h, err + } + return true, nil, nil +} - return true, h, nil +// getKeyInTxn gets the value of the key in the transaction, and ignore the ErrNotExist error. +func getKeyInTxn(ctx context.Context, txn kv.Transaction, key kv.Key) ([]byte, error) { + val, err := txn.Get(ctx, key) + if err != nil { + if kv.IsErrNotFound(err) { + return nil, nil + } + return nil, err + } + return val, nil } func (c *index) FetchValues(r []types.Datum, vals []types.Datum) ([]types.Datum, error) { diff --git a/table/tables/mutation_checker.go b/table/tables/mutation_checker.go index bf6cc2ffb5853..52b517eb93050 100644 --- a/table/tables/mutation_checker.go +++ b/table/tables/mutation_checker.go @@ -15,7 +15,6 @@ package tables import ( - "bytes" "fmt" "strings" @@ -107,7 +106,7 @@ func CheckDataConsistency( // } if rowInsertion.key != nil { - if err = checkHandleConsistency(rowInsertion, indexMutations, columnMaps.IndexIDToInfo, t.Meta().Name.O); err != nil { + if err = checkHandleConsistency(rowInsertion, indexMutations, columnMaps.IndexIDToInfo, t.Meta()); err != nil { return errors.Trace(err) } } @@ -124,7 +123,7 @@ func CheckDataConsistency( // in row insertions and index insertions are consistent. // A PUT_index implies a PUT_row with the same handle. // Deletions are not checked since the values of deletions are unknown -func checkHandleConsistency(rowInsertion mutation, indexMutations []mutation, indexIDToInfo map[int64]*model.IndexInfo, tableName string) error { +func checkHandleConsistency(rowInsertion mutation, indexMutations []mutation, indexIDToInfo map[int64]*model.IndexInfo, tblInfo *model.TableInfo) error { var insertionHandle kv.Handle var err error @@ -153,11 +152,22 @@ func checkHandleConsistency(rowInsertion mutation, indexMutations []mutation, in value []byte orgKey []byte indexHandle kv.Handle - err error ) if idxID != m.indexID { - value = append(value, m.value[:len(m.value)-1]...) - if len(value) == 0 || (bytes.Equal(value, []byte("delete")) || bytes.Equal(value, []byte("deleteu"))) { + if tablecodec.TempIndexValueIsUntouched(m.value) { + // We never commit the untouched key values to the storage. Skip this check. + continue + } + var tempIdxVal tablecodec.TempIndexValue + tempIdxVal, err = tablecodec.DecodeTempIndexValue(m.value, tblInfo.IsCommonHandle) + if err != nil { + return err + } + if !tempIdxVal.IsEmpty() { + value = tempIdxVal.Current().Value + } + if len(value) == 0 { + // Skip the deleted operation values. continue } orgKey = append(orgKey, m.key...) @@ -171,7 +181,7 @@ func checkHandleConsistency(rowInsertion mutation, indexMutations []mutation, in } // NOTE: handle type can be different, see issue 29520 if indexHandle.IsInt() == insertionHandle.IsInt() && indexHandle.Compare(insertionHandle) != 0 { - err = ErrInconsistentHandle.GenWithStackByArgs(tableName, indexInfo.Name.O, indexHandle, insertionHandle, m, rowInsertion) + err = ErrInconsistentHandle.GenWithStackByArgs(tblInfo.Name, indexInfo.Name.O, indexHandle, insertionHandle, m, rowInsertion) logutil.BgLogger().Error("inconsistent handle in index and record insertions", zap.Error(err)) return err } @@ -210,9 +220,20 @@ func checkIndexKeys( return errors.New("index not found") } + var isTmpIdxValAndDeleted bool // If this is temp index data, need remove last byte of index data. if idxID != m.indexID { - value = append(value, m.value[:len(m.value)-1]...) + if tablecodec.TempIndexValueIsUntouched(m.value) { + // We never commit the untouched key values to the storage. Skip this check. + continue + } + tmpVal, err := tablecodec.DecodeTempIndexValue(m.value, t.Meta().IsCommonHandle) + if err != nil { + return err + } + curElem := tmpVal.Current() + isTmpIdxValAndDeleted = curElem.Delete + value = append(value, curElem.Value...) } else { value = append(value, m.value...) } @@ -237,7 +258,7 @@ func checkIndexKeys( } for i, v := range decodedIndexValues { - fieldType := &t.Columns[indexInfo.Columns[i].Offset].FieldType + fieldType := t.Columns[indexInfo.Columns[i].Offset].FieldType.ArrayType() datum, err := tablecodec.DecodeColumnValue(v, fieldType, sessVars.Location()) if err != nil { return errors.Trace(err) @@ -246,7 +267,7 @@ func checkIndexKeys( } // When it is in add index new backfill state. - if len(value) == 0 || (idxID != m.indexID && (bytes.Equal(value, []byte("deleteu")) || bytes.Equal(value, []byte("delete")))) { + if len(value) == 0 || isTmpIdxValAndDeleted { err = compareIndexData(sessVars.StmtCtx, t.Columns, indexData, rowToRemove, indexInfo, t.Meta()) } else { err = compareIndexData(sessVars.StmtCtx, t.Columns, indexData, rowToInsert, indexInfo, t.Meta()) @@ -348,7 +369,9 @@ func compareIndexData( cols[indexInfo.Columns[i].Offset].ColumnInfo, ) - comparison, err := decodedMutationDatum.Compare(sc, &expectedDatum, collate.GetCollator(decodedMutationDatum.Collation())) + comparison, err := CompareIndexAndVal(sc, expectedDatum, decodedMutationDatum, + collate.GetCollator(decodedMutationDatum.Collation()), + cols[indexInfo.Columns[i].Offset].ColumnInfo.FieldType.IsArray() && expectedDatum.Kind() == types.KindMysqlJSON) if err != nil { return errors.Trace(err) } @@ -365,6 +388,30 @@ func compareIndexData( return nil } +// CompareIndexAndVal compare index valued and row value. +func CompareIndexAndVal(sctx *stmtctx.StatementContext, rowVal types.Datum, idxVal types.Datum, collator collate.Collator, cmpMVIndex bool) (int, error) { + var cmpRes int + var err error + if cmpMVIndex { + // If it is multi-valued index, we should check the JSON contains the indexed value. + bj := rowVal.GetMysqlJSON() + count := bj.GetElemCount() + for elemIdx := 0; elemIdx < count; elemIdx++ { + jsonDatum := types.NewJSONDatum(bj.ArrayGetElem(elemIdx)) + cmpRes, err = jsonDatum.Compare(sctx, &idxVal, collate.GetBinaryCollator()) + if err != nil { + return 0, errors.Trace(err) + } + if cmpRes == 0 { + break + } + } + } else { + cmpRes, err = idxVal.Compare(sctx, &rowVal, collator) + } + return cmpRes, err +} + // getColumnMaps tries to get the columnMaps from transaction options. If there isn't one, it builds one and stores it. // It saves redundant computations of the map. func getColumnMaps(txn kv.Transaction, t *TableCommon) columnMaps { diff --git a/table/tables/mutation_checker_test.go b/table/tables/mutation_checker_test.go index 43fb35c21a5b6..4c44e90a7d244 100644 --- a/table/tables/mutation_checker_test.go +++ b/table/tables/mutation_checker_test.go @@ -310,9 +310,9 @@ func TestCheckIndexKeysAndCheckHandleConsistency(t *testing.T) { require.Nil(t, err) rowMutation := mutation{key: rowKey, value: rowValue} corruptedRowMutation := mutation{key: corruptedRowKey, value: rowValue} - err = checkHandleConsistency(rowMutation, indexMutations, maps.IndexIDToInfo, "t") + err = checkHandleConsistency(rowMutation, indexMutations, maps.IndexIDToInfo, &tableInfo) require.Nil(t, err) - err = checkHandleConsistency(corruptedRowMutation, indexMutations, maps.IndexIDToInfo, "t") + err = checkHandleConsistency(corruptedRowMutation, indexMutations, maps.IndexIDToInfo, &tableInfo) require.NotNil(t, err) } } diff --git a/table/tables/partition.go b/table/tables/partition.go index 6a0b315b856e9..79cc3a3f361a4 100644 --- a/table/tables/partition.go +++ b/table/tables/partition.go @@ -40,6 +40,7 @@ import ( "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/mock" @@ -67,6 +68,7 @@ var _ table.PartitionedTable = &partitionedTable{} // partition also implements the table.Table interface. type partition struct { TableCommon + table *partitionedTable } // GetPhysicalID implements table.Table GetPhysicalID interface. @@ -74,6 +76,16 @@ func (p *partition) GetPhysicalID() int64 { return p.physicalTableID } +// GetPartitionedTable implements table.Table GetPartitionedTable interface. +func (p *partition) GetPartitionedTable() table.PartitionedTable { + return p.table +} + +// GetPartitionedTable implements table.Table GetPartitionedTable interface. +func (t *partitionedTable) GetPartitionedTable() table.PartitionedTable { + return t +} + // partitionedTable implements the table.PartitionedTable interface. // partitionedTable is a table, it contains many Partitions. type partitionedTable struct { @@ -82,11 +94,24 @@ type partitionedTable struct { partitions map[int64]*partition evalBufferTypes []*types.FieldType evalBufferPool sync.Pool + + // Only used during Reorganize partition + // reorganizePartitions is the currently used partitions that are reorganized + reorganizePartitions map[int64]interface{} + // doubleWriteParittions are the partitions not visible, but we should double write to + doubleWritePartitions map[int64]interface{} + reorgPartitionExpr *PartitionExpr } -func newPartitionedTable(tbl *TableCommon, tblInfo *model.TableInfo) (table.Table, error) { +// TODO: Check which data structures that can be shared between all partitions and which +// needs to be copies +func newPartitionedTable(tbl *TableCommon, tblInfo *model.TableInfo) (table.PartitionedTable, error) { + pi := tblInfo.GetPartitionInfo() + if pi == nil || len(pi.Definitions) == 0 { + return nil, table.ErrUnknownPartition + } ret := &partitionedTable{TableCommon: *tbl} - partitionExpr, err := newPartitionExpr(tblInfo) + partitionExpr, err := newPartitionExpr(tblInfo, pi.Definitions) if err != nil { return nil, errors.Trace(err) } @@ -100,7 +125,6 @@ func newPartitionedTable(tbl *TableCommon, tblInfo *model.TableInfo) (table.Tabl if err := initTableIndices(&ret.TableCommon); err != nil { return nil, errors.Trace(err) } - pi := tblInfo.GetPartitionInfo() partitions := make(map[int64]*partition, len(pi.Definitions)) for _, p := range pi.Definitions { var t partition @@ -108,13 +132,101 @@ func newPartitionedTable(tbl *TableCommon, tblInfo *model.TableInfo) (table.Tabl if err != nil { return nil, errors.Trace(err) } + t.table = ret partitions[p.ID] = &t } ret.partitions = partitions + // In StateWriteReorganization we are using the 'old' partition definitions + // and if any new change happens in DroppingDefinitions, it needs to be done + // also in AddingDefinitions (with new evaluation of the new expression) + // In StateDeleteReorganization we are using the 'new' partition definitions + // and if any new change happens in AddingDefinitions, it needs to be done + // also in DroppingDefinitions (since session running on schema version -1) + // should also see the changes + if pi.DDLState == model.StateDeleteReorganization { + origIdx := setIndexesState(ret, pi.DDLState) + defer unsetIndexesState(ret, origIdx) + ret.reorgPartitionExpr, err = newPartitionExpr(tblInfo, pi.DroppingDefinitions) + if err != nil { + return nil, errors.Trace(err) + } + ret.reorganizePartitions = make(map[int64]interface{}, len(pi.AddingDefinitions)) + for _, def := range pi.AddingDefinitions { + ret.reorganizePartitions[def.ID] = nil + } + ret.doubleWritePartitions = make(map[int64]interface{}, len(pi.DroppingDefinitions)) + for _, def := range pi.DroppingDefinitions { + p, err := initPartition(ret, def) + if err != nil { + return nil, err + } + partitions[def.ID] = p + ret.doubleWritePartitions[def.ID] = nil + } + } else { + if len(pi.AddingDefinitions) > 0 { + origIdx := setIndexesState(ret, pi.DDLState) + defer unsetIndexesState(ret, origIdx) + ret.reorgPartitionExpr, err = newPartitionExpr(tblInfo, pi.AddingDefinitions) + if err != nil { + return nil, errors.Trace(err) + } + ret.doubleWritePartitions = make(map[int64]interface{}, len(pi.AddingDefinitions)) + for _, def := range pi.AddingDefinitions { + ret.doubleWritePartitions[def.ID] = nil + p, err := initPartition(ret, def) + if err != nil { + return nil, err + } + partitions[def.ID] = p + } + } + if len(pi.DroppingDefinitions) > 0 { + ret.reorganizePartitions = make(map[int64]interface{}, len(pi.DroppingDefinitions)) + for _, def := range pi.DroppingDefinitions { + ret.reorganizePartitions[def.ID] = nil + } + } + } return ret, nil } -func newPartitionExpr(tblInfo *model.TableInfo) (*PartitionExpr, error) { +func setIndexesState(t *partitionedTable, state model.SchemaState) []*model.IndexInfo { + orig := t.meta.Indices + t.meta.Indices = make([]*model.IndexInfo, 0, len(orig)) + for i := range orig { + t.meta.Indices = append(t.meta.Indices, orig[i].Clone()) + if t.meta.Indices[i].State == model.StatePublic { + switch state { + case model.StateDeleteOnly, model.StateNone: + t.meta.Indices[i].State = model.StateDeleteOnly + case model.StatePublic: + // Keep as is + default: + // use the 'StateWriteReorganization' here, since StateDeleteReorganization + // would skip index writes. + t.meta.Indices[i].State = model.StateWriteReorganization + } + } + } + return orig +} + +func unsetIndexesState(t *partitionedTable, orig []*model.IndexInfo) { + t.meta.Indices = orig +} + +func initPartition(t *partitionedTable, def model.PartitionDefinition) (*partition, error) { + var newPart partition + err := initTableCommonWithIndices(&newPart.TableCommon, t.meta, def.ID, t.Columns, t.allocs) + if err != nil { + return nil, err + } + newPart.table = t + return &newPart, nil +} + +func newPartitionExpr(tblInfo *model.TableInfo, defs []model.PartitionDefinition) (*PartitionExpr, error) { // a partitioned table cannot rely on session context/sql modes, so use a default one! ctx := mock.NewContext() dbName := model.NewCIStr(ctx.GetSessionVars().CurrentDB) @@ -125,11 +237,11 @@ func newPartitionExpr(tblInfo *model.TableInfo) (*PartitionExpr, error) { pi := tblInfo.GetPartitionInfo() switch pi.Type { case model.PartitionTypeRange: - return generateRangePartitionExpr(ctx, pi, columns, names) + return generateRangePartitionExpr(ctx, pi, defs, columns, names) case model.PartitionTypeHash: return generateHashPartitionExpr(ctx, pi, columns, names) case model.PartitionTypeList: - return generateListPartitionExpr(ctx, tblInfo, columns, names) + return generateListPartitionExpr(ctx, tblInfo, defs, columns, names) } panic("cannot reach here") } @@ -148,8 +260,6 @@ type PartitionExpr struct { *ForRangeColumnsPruning // ColOffset is the offsets of partition columns. ColumnOffset []int - // InValues: x in (1,2); x in (3,4); x in (5,6), used for list partition. - InValues []expression.Expression *ForListPruning } @@ -182,19 +292,19 @@ type ForRangeColumnsPruning struct { LessThan [][]*expression.Expression } -func dataForRangeColumnsPruning(ctx sessionctx.Context, pi *model.PartitionInfo, schema *expression.Schema, names []*types.FieldName, p *parser.Parser) (*ForRangeColumnsPruning, error) { +func dataForRangeColumnsPruning(ctx sessionctx.Context, defs []model.PartitionDefinition, schema *expression.Schema, names []*types.FieldName, p *parser.Parser) (*ForRangeColumnsPruning, error) { var res ForRangeColumnsPruning - res.LessThan = make([][]*expression.Expression, 0, len(pi.Definitions)) - for i := 0; i < len(pi.Definitions); i++ { - lessThanCols := make([]*expression.Expression, 0, len(pi.Columns)) - for j := range pi.Definitions[i].LessThan { - if strings.EqualFold(pi.Definitions[i].LessThan[j], "MAXVALUE") { + res.LessThan = make([][]*expression.Expression, 0, len(defs)) + for i := 0; i < len(defs); i++ { + lessThanCols := make([]*expression.Expression, 0, len(defs[i].LessThan)) + for j := range defs[i].LessThan { + if strings.EqualFold(defs[i].LessThan[j], "MAXVALUE") { // Use a nil pointer instead of math.MaxInt64 to avoid the corner cases. lessThanCols = append(lessThanCols, nil) // No column after MAXVALUE matters break } - tmp, err := parseSimpleExprWithNames(p, ctx, pi.Definitions[i].LessThan[j], schema, names) + tmp, err := parseSimpleExprWithNames(p, ctx, defs[i].LessThan[j], schema, names) if err != nil { return nil, err } @@ -426,29 +536,29 @@ type ForRangePruning struct { Unsigned bool } -// dataForRangePruning extracts the less than parts from 'partition p0 less than xx ... partitoin p1 less than ...' -func dataForRangePruning(sctx sessionctx.Context, pi *model.PartitionInfo) (*ForRangePruning, error) { +// dataForRangePruning extracts the less than parts from 'partition p0 less than xx ... partition p1 less than ...' +func dataForRangePruning(sctx sessionctx.Context, defs []model.PartitionDefinition) (*ForRangePruning, error) { var maxValue bool var unsigned bool - lessThan := make([]int64, len(pi.Definitions)) - for i := 0; i < len(pi.Definitions); i++ { - if strings.EqualFold(pi.Definitions[i].LessThan[0], "MAXVALUE") { + lessThan := make([]int64, len(defs)) + for i := 0; i < len(defs); i++ { + if strings.EqualFold(defs[i].LessThan[0], "MAXVALUE") { // Use a bool flag instead of math.MaxInt64 to avoid the corner cases. maxValue = true } else { var err error - lessThan[i], err = strconv.ParseInt(pi.Definitions[i].LessThan[0], 10, 64) + lessThan[i], err = strconv.ParseInt(defs[i].LessThan[0], 10, 64) var numErr *strconv.NumError if stderr.As(err, &numErr) && numErr.Err == strconv.ErrRange { var tmp uint64 - tmp, err = strconv.ParseUint(pi.Definitions[i].LessThan[0], 10, 64) + tmp, err = strconv.ParseUint(defs[i].LessThan[0], 10, 64) lessThan[i] = int64(tmp) unsigned = true } if err != nil { - val, ok := fixOldVersionPartitionInfo(sctx, pi.Definitions[i].LessThan[0]) + val, ok := fixOldVersionPartitionInfo(sctx, defs[i].LessThan[0]) if !ok { - logutil.BgLogger().Error("wrong partition definition", zap.String("less than", pi.Definitions[i].LessThan[0])) + logutil.BgLogger().Error("wrong partition definition", zap.String("less than", defs[i].LessThan[0])) return nil, errors.WithStack(err) } lessThan[i] = val @@ -490,40 +600,14 @@ func rangePartitionExprStrings(pi *model.PartitionInfo) []string { } func generateRangePartitionExpr(ctx sessionctx.Context, pi *model.PartitionInfo, - columns []*expression.Column, names types.NameSlice) (*PartitionExpr, error) { + defs []model.PartitionDefinition, columns []*expression.Column, names types.NameSlice) (*PartitionExpr, error) { // The caller should assure partition info is not nil. - locateExprs := make([]expression.Expression, 0, len(pi.Definitions)) - var buf bytes.Buffer p := parser.New() schema := expression.NewSchema(columns...) partStrs := rangePartitionExprStrings(pi) - for i := 0; i < len(pi.Definitions); i++ { - if strings.EqualFold(pi.Definitions[i].LessThan[0], "MAXVALUE") { - // Expr less than maxvalue is always true. - fmt.Fprintf(&buf, "true") - } else { - maxValueFound := false - for j := range partStrs[1:] { - if strings.EqualFold(pi.Definitions[i].LessThan[j+1], "MAXVALUE") { - // if any column will be less than MAXVALUE, so change < to <= of the previous prefix of columns - fmt.Fprintf(&buf, "((%s) <= (%s))", strings.Join(partStrs[:j+1], ","), strings.Join(pi.Definitions[i].LessThan[:j+1], ",")) - maxValueFound = true - break - } - } - if !maxValueFound { - fmt.Fprintf(&buf, "((%s) < (%s))", strings.Join(partStrs, ","), strings.Join(pi.Definitions[i].LessThan, ",")) - } - } - - expr, err := parseSimpleExprWithNames(p, ctx, buf.String(), schema, names) - if err != nil { - // If it got an error here, ddl may hang forever, so this error log is important. - logutil.BgLogger().Error("wrong table partition expression", zap.String("expression", buf.String()), zap.Error(err)) - return nil, errors.Trace(err) - } - locateExprs = append(locateExprs, expr) - buf.Reset() + locateExprs, err := getRangeLocateExprs(ctx, p, defs, partStrs, schema, names) + if err != nil { + return nil, errors.Trace(err) } ret := &PartitionExpr{ UpperBounds: locateExprs, @@ -536,14 +620,14 @@ func generateRangePartitionExpr(ctx sessionctx.Context, pi *model.PartitionInfo, ret.ColumnOffset = offset if len(pi.Columns) < 1 { - tmp, err := dataForRangePruning(ctx, pi) + tmp, err := dataForRangePruning(ctx, defs) if err != nil { return nil, errors.Trace(err) } ret.Expr = partExpr ret.ForRangePruning = tmp } else { - tmp, err := dataForRangeColumnsPruning(ctx, pi, schema, names, p) + tmp, err := dataForRangeColumnsPruning(ctx, defs, schema, names, p) if err != nil { return nil, errors.Trace(err) } @@ -552,6 +636,40 @@ func generateRangePartitionExpr(ctx sessionctx.Context, pi *model.PartitionInfo, return ret, nil } +func getRangeLocateExprs(ctx sessionctx.Context, p *parser.Parser, defs []model.PartitionDefinition, partStrs []string, schema *expression.Schema, names types.NameSlice) ([]expression.Expression, error) { + var buf bytes.Buffer + locateExprs := make([]expression.Expression, 0, len(defs)) + for i := 0; i < len(defs); i++ { + if strings.EqualFold(defs[i].LessThan[0], "MAXVALUE") { + // Expr less than maxvalue is always true. + fmt.Fprintf(&buf, "true") + } else { + maxValueFound := false + for j := range partStrs[1:] { + if strings.EqualFold(defs[i].LessThan[j+1], "MAXVALUE") { + // if any column will be less than MAXVALUE, so change < to <= of the previous prefix of columns + fmt.Fprintf(&buf, "((%s) <= (%s))", strings.Join(partStrs[:j+1], ","), strings.Join(defs[i].LessThan[:j+1], ",")) + maxValueFound = true + break + } + } + if !maxValueFound { + fmt.Fprintf(&buf, "((%s) < (%s))", strings.Join(partStrs, ","), strings.Join(defs[i].LessThan, ",")) + } + } + + expr, err := parseSimpleExprWithNames(p, ctx, buf.String(), schema, names) + if err != nil { + // If it got an error here, ddl may hang forever, so this error log is important. + logutil.BgLogger().Error("wrong table partition expression", zap.String("expression", buf.String()), zap.Error(err)) + return nil, errors.Trace(err) + } + locateExprs = append(locateExprs, expr) + buf.Reset() + } + return locateExprs, nil +} + func getColumnsOffset(cols, columns []*expression.Column) []int { colsOffset := make([]int, len(cols)) for i, col := range columns { @@ -603,7 +721,7 @@ func extractPartitionExprColumns(ctx sessionctx.Context, pi *model.PartitionInfo } func generateListPartitionExpr(ctx sessionctx.Context, tblInfo *model.TableInfo, - columns []*expression.Column, names types.NameSlice) (*PartitionExpr, error) { + defs []model.PartitionDefinition, columns []*expression.Column, names types.NameSlice) (*PartitionExpr, error) { // The caller should assure partition info is not nil. pi := tblInfo.GetPartitionInfo() partExpr, exprCols, offset, err := extractPartitionExprColumns(ctx, pi, columns, names) @@ -612,9 +730,9 @@ func generateListPartitionExpr(ctx sessionctx.Context, tblInfo *model.TableInfo, } listPrune := &ForListPruning{} if len(pi.Columns) == 0 { - err = listPrune.buildListPruner(ctx, tblInfo, exprCols, columns, names) + err = listPrune.buildListPruner(ctx, tblInfo, defs, exprCols, columns, names) } else { - err = listPrune.buildListColumnsPruner(ctx, tblInfo, columns, names) + err = listPrune.buildListColumnsPruner(ctx, tblInfo, defs, columns, names) } if err != nil { return nil, err @@ -627,7 +745,7 @@ func generateListPartitionExpr(ctx sessionctx.Context, tblInfo *model.TableInfo, return ret, nil } -func (lp *ForListPruning) buildListPruner(ctx sessionctx.Context, tblInfo *model.TableInfo, exprCols []*expression.Column, +func (lp *ForListPruning) buildListPruner(ctx sessionctx.Context, tblInfo *model.TableInfo, defs []model.PartitionDefinition, exprCols []*expression.Column, columns []*expression.Column, names types.NameSlice) error { pi := tblInfo.GetPartitionInfo() schema := expression.NewSchema(columns...) @@ -638,7 +756,7 @@ func (lp *ForListPruning) buildListPruner(ctx sessionctx.Context, tblInfo *model logutil.BgLogger().Error("wrong table partition expression", zap.String("expression", pi.Expr), zap.Error(err)) return errors.Trace(err) } - // Since need to change the column index of the expresion, clone the expression first. + // Since need to change the column index of the expression, clone the expression first. lp.LocateExpr = expr.Clone() lp.PruneExprCols = exprCols lp.PruneExpr = expr.Clone() @@ -650,14 +768,15 @@ func (lp *ForListPruning) buildListPruner(ctx sessionctx.Context, tblInfo *model } c.Index = idx } - err = lp.buildListPartitionValueMap(ctx, tblInfo, schema, names, p) + err = lp.buildListPartitionValueMap(ctx, defs, schema, names, p) if err != nil { return err } return nil } -func (lp *ForListPruning) buildListColumnsPruner(ctx sessionctx.Context, tblInfo *model.TableInfo, +func (lp *ForListPruning) buildListColumnsPruner(ctx sessionctx.Context, + tblInfo *model.TableInfo, defs []model.PartitionDefinition, columns []*expression.Column, names types.NameSlice) error { pi := tblInfo.GetPartitionInfo() schema := expression.NewSchema(columns...) @@ -683,7 +802,7 @@ func (lp *ForListPruning) buildListColumnsPruner(ctx sessionctx.Context, tblInfo valueMap: make(map[string]ListPartitionLocation), sorted: btree.NewG[*btreeListColumnItem](btreeDegree, lessBtreeListColumnItem), } - err := colPrune.buildPartitionValueMapAndSorted(p) + err := colPrune.buildPartitionValueMapAndSorted(p, defs) if err != nil { return err } @@ -696,12 +815,11 @@ func (lp *ForListPruning) buildListColumnsPruner(ctx sessionctx.Context, tblInfo // buildListPartitionValueMap builds list partition value map. // The map is column value -> partition index. // colIdx is the column index in the list columns. -func (lp *ForListPruning) buildListPartitionValueMap(ctx sessionctx.Context, tblInfo *model.TableInfo, +func (lp *ForListPruning) buildListPartitionValueMap(ctx sessionctx.Context, defs []model.PartitionDefinition, schema *expression.Schema, names types.NameSlice, p *parser.Parser) error { - pi := tblInfo.GetPartitionInfo() lp.valueMap = map[int64]int{} lp.nullPartitionIdx = -1 - for partitionIdx, def := range pi.Definitions { + for partitionIdx, def := range defs { for _, vs := range def.InValues { expr, err := parseSimpleExprWithNames(p, ctx, vs[0], schema, names) if err != nil { @@ -770,26 +888,27 @@ func (lp *ForListPruning) locateListColumnsPartitionByRow(ctx sessionctx.Context // buildPartitionValueMapAndSorted builds list columns partition value map for the specified column. // It also builds list columns partition value btree for the specified column. // colIdx is the specified column index in the list columns. -func (lp *ForListColumnPruning) buildPartitionValueMapAndSorted(p *parser.Parser) error { +func (lp *ForListColumnPruning) buildPartitionValueMapAndSorted(p *parser.Parser, + defs []model.PartitionDefinition) error { l := len(lp.valueMap) if l != 0 { return nil } - return lp.buildListPartitionValueMapAndSorted(p) + return lp.buildListPartitionValueMapAndSorted(p, defs) } // RebuildPartitionValueMapAndSorted rebuilds list columns partition value map for the specified column. -func (lp *ForListColumnPruning) RebuildPartitionValueMapAndSorted(p *parser.Parser) error { +func (lp *ForListColumnPruning) RebuildPartitionValueMapAndSorted(p *parser.Parser, + defs []model.PartitionDefinition) error { lp.valueMap = make(map[string]ListPartitionLocation, len(lp.valueMap)) lp.sorted.Clear(false) - return lp.buildListPartitionValueMapAndSorted(p) + return lp.buildListPartitionValueMapAndSorted(p, defs) } -func (lp *ForListColumnPruning) buildListPartitionValueMapAndSorted(p *parser.Parser) error { - pi := lp.tblInfo.GetPartitionInfo() +func (lp *ForListColumnPruning) buildListPartitionValueMapAndSorted(p *parser.Parser, defs []model.PartitionDefinition) error { sc := lp.ctx.GetSessionVars().StmtCtx - for partitionIdx, def := range pi.Definitions { + for partitionIdx, def := range defs { for groupIdx, vs := range def.InValues { keyBytes, err := lp.genConstExprKey(lp.ctx, sc, vs[lp.colIdx], lp.schema, lp.names, p) if err != nil { @@ -935,15 +1054,24 @@ func generateHashPartitionExpr(ctx sessionctx.Context, pi *model.PartitionInfo, } // PartitionExpr returns the partition expression. -func (t *partitionedTable) PartitionExpr() (*PartitionExpr, error) { - return t.partitionExpr, nil +func (t *partitionedTable) PartitionExpr() *PartitionExpr { + return t.partitionExpr } -func (t *partitionedTable) GetPartitionColumnNames() []model.CIStr { +func (t *partitionedTable) GetPartitionColumnIDs() []int64 { // PARTITION BY {LIST|RANGE} COLUMNS uses columns directly without expressions pi := t.Meta().Partition if len(pi.Columns) > 0 { - return pi.Columns + colIDs := make([]int64, 0, len(pi.Columns)) + for _, name := range pi.Columns { + col := table.FindColLowerCase(t.Cols(), name.L) + if col == nil { + // For safety, should not happen + continue + } + colIDs = append(colIDs, col.ID) + } + return colIDs } partitionCols := expression.ExtractColumns(t.partitionExpr.Expr) @@ -951,7 +1079,16 @@ func (t *partitionedTable) GetPartitionColumnNames() []model.CIStr { for _, col := range partitionCols { colIDs = append(colIDs, col.ID) } - colNames := make([]model.CIStr, 0, len(partitionCols)) + return colIDs +} + +func (t *partitionedTable) GetPartitionColumnNames() []model.CIStr { + pi := t.Meta().Partition + if len(pi.Columns) > 0 { + return pi.Columns + } + colIDs := t.GetPartitionColumnIDs() + colNames := make([]model.CIStr, 0, len(colIDs)) for _, colID := range colIDs { for _, col := range t.Cols() { if col.ID == colID { @@ -969,7 +1106,7 @@ func PartitionRecordKey(pid int64, handle int64) kv.Key { } func (t *partitionedTable) CheckForExchangePartition(ctx sessionctx.Context, pi *model.PartitionInfo, r []types.Datum, pid int64) error { - defID, err := t.locatePartition(ctx, pi, r) + defID, err := t.locatePartition(ctx, r) if err != nil { return err } @@ -979,36 +1116,59 @@ func (t *partitionedTable) CheckForExchangePartition(ctx sessionctx.Context, pi return nil } -// locatePartition returns the partition ID of the input record. -func (t *partitionedTable) locatePartition(ctx sessionctx.Context, pi *model.PartitionInfo, r []types.Datum) (int64, error) { +// locatePartitionCommon returns the partition idx of the input record. +func (t *partitionedTable) locatePartitionCommon(ctx sessionctx.Context, pi *model.PartitionInfo, partitionExpr *PartitionExpr, r []types.Datum) (int, error) { var err error var idx int switch t.meta.Partition.Type { case model.PartitionTypeRange: if len(pi.Columns) == 0 { - idx, err = t.locateRangePartition(ctx, pi, r) + idx, err = t.locateRangePartition(ctx, partitionExpr, r) } else { - idx, err = t.locateRangeColumnPartition(ctx, pi, r) + idx, err = t.locateRangeColumnPartition(ctx, partitionExpr, r) } case model.PartitionTypeHash: + // Note that only LIST and RANGE supports REORGANIZE PARTITION + // TODO: Add support for ADD PARTITION and COALESCE PARTITION for HASH idx, err = t.locateHashPartition(ctx, pi, r) case model.PartitionTypeList: - idx, err = t.locateListPartition(ctx, pi, r) + idx, err = t.locateListPartition(ctx, partitionExpr, r) } if err != nil { return 0, errors.Trace(err) } + return idx, nil +} + +func (t *partitionedTable) locatePartition(ctx sessionctx.Context, r []types.Datum) (int64, error) { + pi := t.Meta().GetPartitionInfo() + idx, err := t.locatePartitionCommon(ctx, pi, t.partitionExpr, r) + if err != nil { + return 0, errors.Trace(err) + } return pi.Definitions[idx].ID, nil } -func (t *partitionedTable) locateRangeColumnPartition(ctx sessionctx.Context, pi *model.PartitionInfo, r []types.Datum) (int, error) { +func (t *partitionedTable) locateReorgPartition(ctx sessionctx.Context, r []types.Datum) (int64, error) { + pi := t.Meta().GetPartitionInfo() + idx, err := t.locatePartitionCommon(ctx, pi, t.reorgPartitionExpr, r) + if err != nil { + return 0, errors.Trace(err) + } + if pi.DDLState == model.StateDeleteReorganization { + return pi.DroppingDefinitions[idx].ID, nil + } + return pi.AddingDefinitions[idx].ID, nil +} + +func (t *partitionedTable) locateRangeColumnPartition(ctx sessionctx.Context, partitionExpr *PartitionExpr, r []types.Datum) (int, error) { + upperBounds := partitionExpr.UpperBounds var lastError error - partitionExprs := t.partitionExpr.UpperBounds evalBuffer := t.evalBufferPool.Get().(*chunk.MutRow) defer t.evalBufferPool.Put(evalBuffer) - idx := sort.Search(len(partitionExprs), func(i int) bool { + idx := sort.Search(len(upperBounds), func(i int) bool { evalBuffer.SetDatums(r...) - ret, isNull, err := partitionExprs[i].EvalInt(ctx, evalBuffer.ToRow()) + ret, isNull, err := upperBounds[i].EvalInt(ctx, evalBuffer.ToRow()) if err != nil { lastError = err return true // Does not matter, will propagate the last error anyway. @@ -1023,11 +1183,11 @@ func (t *partitionedTable) locateRangeColumnPartition(ctx sessionctx.Context, pi if lastError != nil { return 0, errors.Trace(lastError) } - if idx >= len(partitionExprs) { + if idx >= len(upperBounds) { // The data does not belong to any of the partition returns `table has no partition for value %s`. var valueMsg string - if pi.Expr != "" { - e, err := expression.ParseSimpleExprWithTableInfo(ctx, pi.Expr, t.meta) + if t.meta.Partition.Expr != "" { + e, err := expression.ParseSimpleExprWithTableInfo(ctx, t.meta.Partition.Expr, t.meta) if err == nil { val, _, err := e.EvalInt(ctx, chunk.MutRowFromDatums(r).ToRow()) if err == nil { @@ -1043,15 +1203,15 @@ func (t *partitionedTable) locateRangeColumnPartition(ctx sessionctx.Context, pi return idx, nil } -func (t *partitionedTable) locateListPartition(ctx sessionctx.Context, pi *model.PartitionInfo, r []types.Datum) (int, error) { - lp := t.partitionExpr.ForListPruning +func (t *partitionedTable) locateListPartition(ctx sessionctx.Context, partitionExpr *PartitionExpr, r []types.Datum) (int, error) { + lp := partitionExpr.ForListPruning if len(lp.ColPrunes) == 0 { return lp.locateListPartitionByRow(ctx, r) } return lp.locateListColumnsPartitionByRow(ctx, r) } -func (t *partitionedTable) locateRangePartition(ctx sessionctx.Context, pi *model.PartitionInfo, r []types.Datum) (int, error) { +func (t *partitionedTable) locateRangePartition(ctx sessionctx.Context, partitionExpr *PartitionExpr, r []types.Datum) (int, error) { var ( ret int64 val int64 @@ -1074,7 +1234,7 @@ func (t *partitionedTable) locateRangePartition(ctx sessionctx.Context, pi *mode ret = val } unsigned := mysql.HasUnsignedFlag(t.partitionExpr.Expr.GetType().GetFlag()) - ranges := t.partitionExpr.ForRangePruning + ranges := partitionExpr.ForRangePruning length := len(ranges.LessThan) pos := sort.Search(length, func(i int) bool { if isNull { @@ -1088,8 +1248,8 @@ func (t *partitionedTable) locateRangePartition(ctx sessionctx.Context, pi *mode if pos < 0 || pos >= length { // The data does not belong to any of the partition returns `table has no partition for value %s`. var valueMsg string - if pi.Expr != "" { - e, err := expression.ParseSimpleExprWithTableInfo(ctx, pi.Expr, t.meta) + if t.meta.Partition.Expr != "" { + e, err := expression.ParseSimpleExprWithTableInfo(ctx, t.meta.Partition.Expr, t.meta) if err == nil { val, _, err := e.EvalInt(ctx, chunk.MutRowFromDatums(r).ToRow()) if err == nil { @@ -1147,16 +1307,39 @@ func (t *partitionedTable) locateHashPartition(ctx sessionctx.Context, pi *model func (t *partitionedTable) GetPartition(pid int64) table.PhysicalTable { // Attention, can't simply use `return t.partitions[pid]` here. // Because A nil of type *partition is a kind of `table.PhysicalTable` - p, ok := t.partitions[pid] + part, ok := t.partitions[pid] if !ok { + // Should never happen! return nil } - return p + return part +} + +// GetReorganizedPartitionedTable returns the same table +// but only with the AddingDefinitions used. +func GetReorganizedPartitionedTable(t table.Table) (table.PartitionedTable, error) { + // This is used during Reorganize partitions; All data from DroppingDefinitions + // will be copied to AddingDefinitions, so only setup with AddingDefinitions! + + // Do not change any Definitions of t, but create a new struct. + if t.GetPartitionedTable() == nil { + return nil, dbterror.ErrUnsupportedReorganizePartition.GenWithStackByArgs() + } + tblInfo := t.Meta().Clone() + tblInfo.Partition.Definitions = tblInfo.Partition.AddingDefinitions + tblInfo.Partition.AddingDefinitions = nil + tblInfo.Partition.DroppingDefinitions = nil + var tc TableCommon + initTableCommon(&tc, tblInfo, tblInfo.ID, t.Cols(), t.Allocators(nil)) + + // and rebuild the partitioning structure + + return newPartitionedTable(&tc, tblInfo) } // GetPartitionByRow returns a Table, which is actually a Partition. func (t *partitionedTable) GetPartitionByRow(ctx sessionctx.Context, r []types.Datum) (table.PhysicalTable, error) { - pid, err := t.locatePartition(ctx, t.Meta().GetPartitionInfo(), r) + pid, err := t.locatePartition(ctx, r) if err != nil { return nil, errors.Trace(err) } @@ -1165,7 +1348,7 @@ func (t *partitionedTable) GetPartitionByRow(ctx sessionctx.Context, r []types.D // GetPartitionByRow returns a Table, which is actually a Partition. func (t *partitionTableWithGivenSets) GetPartitionByRow(ctx sessionctx.Context, r []types.Datum) (table.PhysicalTable, error) { - pid, err := t.locatePartition(ctx, t.Meta().GetPartitionInfo(), r) + pid, err := t.locatePartition(ctx, r) if err != nil { return nil, errors.Trace(err) } @@ -1181,8 +1364,7 @@ func (t *partitionedTable) AddRecord(ctx sessionctx.Context, r []types.Datum, op } func partitionedTableAddRecord(ctx sessionctx.Context, t *partitionedTable, r []types.Datum, partitionSelection map[int64]struct{}, opts []table.AddRecordOption) (recordID kv.Handle, err error) { - partitionInfo := t.meta.GetPartitionInfo() - pid, err := t.locatePartition(ctx, partitionInfo, r) + pid, err := t.locatePartition(ctx, r) if err != nil { return nil, errors.Trace(err) } @@ -1193,7 +1375,23 @@ func partitionedTableAddRecord(ctx sessionctx.Context, t *partitionedTable, r [] } } tbl := t.GetPartition(pid) - return tbl.AddRecord(ctx, r, opts...) + recordID, err = tbl.AddRecord(ctx, r, opts...) + if err != nil { + return + } + if _, ok := t.reorganizePartitions[pid]; ok { + // Double write to the ongoing reorganized partition + pid, err = t.locateReorgPartition(ctx, r) + if err != nil { + return nil, errors.Trace(err) + } + tbl = t.GetPartition(pid) + recordID, err = tbl.AddRecord(ctx, r, opts...) + if err != nil { + return + } + } + return } // partitionTableWithGivenSets is used for this kind of grammar: partition (p0,p1) @@ -1230,19 +1428,37 @@ func (t *partitionTableWithGivenSets) GetAllPartitionIDs() []int64 { // RemoveRecord implements table.Table RemoveRecord interface. func (t *partitionedTable) RemoveRecord(ctx sessionctx.Context, h kv.Handle, r []types.Datum) error { - partitionInfo := t.meta.GetPartitionInfo() - pid, err := t.locatePartition(ctx, partitionInfo, r) + pid, err := t.locatePartition(ctx, r) if err != nil { return errors.Trace(err) } tbl := t.GetPartition(pid) - return tbl.RemoveRecord(ctx, h, r) + err = tbl.RemoveRecord(ctx, h, r) + if err != nil { + return errors.Trace(err) + } + + if _, ok := t.reorganizePartitions[pid]; ok { + pid, err = t.locateReorgPartition(ctx, r) + if err != nil { + return errors.Trace(err) + } + tbl = t.GetPartition(pid) + err = tbl.RemoveRecord(ctx, h, r) + if err != nil { + return errors.Trace(err) + } + } + return nil } func (t *partitionedTable) GetAllPartitionIDs() []int64 { ptIDs := make([]int64, 0, len(t.partitions)) for id := range t.partitions { + if _, ok := t.doubleWritePartitions[id]; ok { + continue + } ptIDs = append(ptIDs, id) } return ptIDs @@ -1260,12 +1476,11 @@ func (t *partitionTableWithGivenSets) UpdateRecord(ctx context.Context, sctx ses } func partitionedTableUpdateRecord(gctx context.Context, ctx sessionctx.Context, t *partitionedTable, h kv.Handle, currData, newData []types.Datum, touched []bool, partitionSelection map[int64]struct{}) error { - partitionInfo := t.meta.GetPartitionInfo() - from, err := t.locatePartition(ctx, partitionInfo, currData) + from, err := t.locatePartition(ctx, currData) if err != nil { return errors.Trace(err) } - to, err := t.locatePartition(ctx, partitionInfo, newData) + to, err := t.locatePartition(ctx, newData) if err != nil { return errors.Trace(err) } @@ -1297,11 +1512,82 @@ func partitionedTableUpdateRecord(gctx context.Context, ctx sessionctx.Context, logutil.BgLogger().Error("update partition record fails", zap.String("message", "new record inserted while old record is not removed"), zap.Error(err)) return errors.Trace(err) } + newTo, newFrom := int64(0), int64(0) + if _, ok := t.reorganizePartitions[to]; ok { + newTo, err = t.locateReorgPartition(ctx, newData) + // There might be valid cases when errors should be accepted? + if err != nil { + return errors.Trace(err) + } + } + if _, ok := t.reorganizePartitions[from]; ok { + newFrom, err = t.locateReorgPartition(ctx, currData) + // There might be valid cases when errors should be accepted? + if err != nil { + return errors.Trace(err) + } + } + if newTo == newFrom && newTo != 0 { + // Update needs to be done in StateDeleteOnly as well + tbl := t.GetPartition(newTo) + return tbl.UpdateRecord(gctx, ctx, h, currData, newData, touched) + } + if newTo != 0 && t.Meta().GetPartitionInfo().DDLState != model.StateDeleteOnly { + tbl := t.GetPartition(newTo) + _, err = tbl.AddRecord(ctx, newData) + if err != nil { + return errors.Trace(err) + } + } + if newFrom != 0 { + tbl := t.GetPartition(newFrom) + err = tbl.RemoveRecord(ctx, h, currData) + // TODO: Can this happen? When the data is not yet backfilled? + if err != nil { + return errors.Trace(err) + } + } return nil } - tbl := t.GetPartition(to) - return tbl.UpdateRecord(gctx, ctx, h, currData, newData, touched) + err = tbl.UpdateRecord(gctx, ctx, h, currData, newData, touched) + if err != nil { + return errors.Trace(err) + } + if _, ok := t.reorganizePartitions[to]; ok { + // Even if to == from, in the reorganized partitions they may differ + // like in case of a split + newTo, err := t.locateReorgPartition(ctx, newData) + if err != nil { + return errors.Trace(err) + } + newFrom, err := t.locateReorgPartition(ctx, currData) + if err != nil { + return errors.Trace(err) + } + if newTo == newFrom { + // Update needs to be done in StateDeleteOnly as well + tbl = t.GetPartition(newTo) + err = tbl.UpdateRecord(gctx, ctx, h, currData, newData, touched) + if err != nil { + return errors.Trace(err) + } + return nil + } + if t.Meta().GetPartitionInfo().DDLState != model.StateDeleteOnly { + tbl = t.GetPartition(newTo) + _, err = tbl.AddRecord(ctx, newData) + if err != nil { + return errors.Trace(err) + } + } + tbl = t.GetPartition(newFrom) + err = tbl.RemoveRecord(ctx, h, currData) + if err != nil { + return errors.Trace(err) + } + } + return nil } // FindPartitionByName finds partition in table meta by name. diff --git a/table/tables/partition_test.go b/table/tables/partition_test.go index cc8dd90a44737..0bac493aa7f35 100644 --- a/table/tables/partition_test.go +++ b/table/tables/partition_test.go @@ -273,10 +273,9 @@ func TestGeneratePartitionExpr(t *testing.T) { tbl, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) require.NoError(t, err) type partitionExpr interface { - PartitionExpr() (*tables.PartitionExpr, error) + PartitionExpr() *tables.PartitionExpr } - pe, err := tbl.(partitionExpr).PartitionExpr() - require.NoError(t, err) + pe := tbl.(partitionExpr).PartitionExpr() upperBounds := []string{ "lt(t1.id, 4)", diff --git a/table/tables/tables.go b/table/tables/tables.go index 631b26ef4296e..25b1301d7bb00 100644 --- a/table/tables/tables.go +++ b/table/tables/tables.go @@ -27,7 +27,6 @@ import ( "sync" "time" - "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/kv" @@ -50,6 +49,7 @@ import ( "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/stringutil" "github.com/pingcap/tidb/util/tableutil" + "github.com/pingcap/tidb/util/tracing" "github.com/pingcap/tipb/go-binlog" "github.com/pingcap/tipb/go-tipb" "go.uber.org/zap" @@ -57,6 +57,7 @@ import ( // TableCommon is shared by both Table and partition. type TableCommon struct { + // TODO: Why do we need tableID, when it is already in meta.ID ? tableID int64 // physicalTableID is a unique int64 to identify a physical table. physicalTableID int64 @@ -85,7 +86,7 @@ func MockTableFromMeta(tblInfo *model.TableInfo) table.Table { } var t TableCommon - initTableCommon(&t, tblInfo, tblInfo.ID, columns, nil) + initTableCommon(&t, tblInfo, tblInfo.ID, columns, autoid.NewAllocators(false)) if tblInfo.TableCacheStatusType != model.TableCacheStatusDisable { ret, err := newCachedTable(&t) if err != nil { @@ -235,6 +236,11 @@ func (t *TableCommon) GetPhysicalID() int64 { return t.physicalTableID } +// GetPartitionedTable implements table.Table GetPhysicalID interface. +func (t *TableCommon) GetPartitionedTable() table.PartitionedTable { + return nil +} + type getColsMode int64 const ( @@ -526,7 +532,12 @@ func (t *TableCommon) rebuildIndices(ctx sessionctx.Context, txn kv.Transaction, break } // If txn is auto commit and index is untouched, no need to write index value. - if untouched && !ctx.GetSessionVars().InTxn() { + // If InHandleForeignKeyTrigger or ForeignKeyTriggerCtx.HasFKCascades is true indicate we may have + // foreign key cascade need to handle later, then we still need to write index value, + // otherwise, the later foreign cascade executor may see data-index inconsistency in txn-mem-buffer. + sessVars := ctx.GetSessionVars() + if untouched && !sessVars.InTxn() && + !sessVars.StmtCtx.InHandleForeignKeyTrigger && !sessVars.StmtCtx.ForeignKeyTriggerCtx.HasFKCascades { continue } newVs, err := idx.FetchValues(newData, nil) @@ -695,11 +706,9 @@ func (t *TableCommon) AddRecord(sctx sessionctx.Context, r []types.Datum, opts . var ctx context.Context if opt.Ctx != nil { ctx = opt.Ctx - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("table.AddRecord", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } + var r tracing.Region + r, ctx = tracing.StartRegionEx(ctx, "table.AddRecord") + defer r.End() } else { ctx = context.Background() } @@ -921,6 +930,9 @@ func (t *TableCommon) AddRecord(sctx sessionctx.Context, r []types.Datum, opts . return nil, err } } + if shouldIncreaseTTLMetricCount(t.meta) { + sctx.GetSessionVars().TxnCtx.InsertTTLRowsCount += 1 + } if sessVars.TxnCtx == nil { return recordID, nil } @@ -1299,9 +1311,32 @@ func (t *TableCommon) removeRowData(ctx sessionctx.Context, h kv.Handle) error { } } }) - err = txn.SetAssertion(key, kv.SetAssertExist) - if err != nil { - return err + doAssert := true + p := t.Meta().Partition + if p != nil { + // This disables asserting during Reorganize Partition. + switch ctx.GetSessionVars().AssertionLevel { + case variable.AssertionLevelFast: + // Fast option, just skip assertion for all partitions. + if p.DDLState != model.StateNone && p.DDLState != model.StatePublic { + doAssert = false + } + case variable.AssertionLevelStrict: + // Strict, only disable assertion for intermediate partitions. + // If there were an easy way to get from a TableCommon back to the partitioned table... + for i := range p.AddingDefinitions { + if t.physicalTableID == p.AddingDefinitions[i].ID { + doAssert = false + break + } + } + } + } + if doAssert { + err = txn.SetAssertion(key, kv.SetAssertExist) + if err != nil { + return err + } } return txn.Delete(key) } @@ -1516,8 +1551,7 @@ func allocHandleIDs(ctx context.Context, sctx sessionctx.Context, t table.Table, // shard = 0010000000000000000000000000000000000000000000000000000000000000 return 0, 0, autoid.ErrAutoincReadFailed } - txnCtx := sctx.GetSessionVars().TxnCtx - shard := txnCtx.GetCurrentShard(int(n)) + shard := sctx.GetSessionVars().GetCurrentShard(int(n)) base = shardFmt.Compose(shard, base) maxID = shardFmt.Compose(shard, maxID) } @@ -1542,7 +1576,7 @@ func (t *TableCommon) Allocators(ctx sessionctx.Context) autoid.Allocators { // Use an independent allocator for global temporary tables. if t.meta.TempTableType == model.TempTableGlobal { if alloc := ctx.GetSessionVars().GetTemporaryTable(t.meta).GetAutoIDAllocator(); alloc != nil { - return autoid.Allocators{alloc} + return autoid.NewAllocators(false, alloc) } // If the session is not in a txn, for example, in "show create table", use the original allocator. // Otherwise the would be a nil pointer dereference. @@ -1552,8 +1586,9 @@ func (t *TableCommon) Allocators(ctx sessionctx.Context) autoid.Allocators { // Replace the row id allocator with the one in session variables. sessAlloc := ctx.GetSessionVars().IDAllocator - retAllocs := make([]autoid.Allocator, 0, len(t.allocs)) - copy(retAllocs, t.allocs) + allocs := t.allocs.Allocs + retAllocs := make([]autoid.Allocator, 0, len(allocs)) + copy(retAllocs, allocs) overwritten := false for i, a := range retAllocs { @@ -1566,7 +1601,7 @@ func (t *TableCommon) Allocators(ctx sessionctx.Context) autoid.Allocators { if !overwritten { retAllocs = append(retAllocs, sessAlloc) } - return retAllocs + return autoid.NewAllocators(t.allocs.SepAutoInc, retAllocs...) } // Type implements table.Table Type interface. @@ -1589,6 +1624,10 @@ func shouldWriteBinlog(ctx sessionctx.Context, tblInfo *model.TableInfo) bool { return !ctx.GetSessionVars().InRestrictedSQL } +func shouldIncreaseTTLMetricCount(tblInfo *model.TableInfo) bool { + return tblInfo.TTLInfo != nil +} + func (t *TableCommon) getMutation(ctx sessionctx.Context) *binlog.TableMutation { return ctx.StmtGetMutation(t.tableID) } @@ -1884,28 +1923,37 @@ func TryGetHandleRestoredDataWrapper(tblInfo *model.TableInfo, row []types.Datum } else { datum = row[pkCol.Offset] } - // Try to truncate index values. - // Says that primary key(a (8)), - // For index t(a), don't truncate the value. - // For index t(a(9)), truncate to a(9). - // For index t(a(7)), truncate to a(8). - truncateTargetCol := pkIdxCol - for _, idxCol := range idx.Columns { - if idxCol.Offset == pkCol.Offset { - truncateTargetCol = maxIndexLen(pkIdxCol, idxCol) - break - } - } - tablecodec.TruncateIndexValue(&datum, truncateTargetCol, pkCol) - if collate.IsBinCollation(pkCol.GetCollate()) { - rsData = append(rsData, types.NewIntDatum(stringutil.GetTailSpaceCount(datum.GetString()))) - } else { - rsData = append(rsData, datum) - } + TryTruncateRestoredData(&datum, pkCol, pkIdxCol, idx) + ConvertDatumToTailSpaceCount(&datum, pkCol) + rsData = append(rsData, datum) } return rsData } +// TryTruncateRestoredData tries to truncate index values. +// Says that primary key(a (8)), +// For index t(a), don't truncate the value. +// For index t(a(9)), truncate to a(9). +// For index t(a(7)), truncate to a(8). +func TryTruncateRestoredData(datum *types.Datum, pkCol *model.ColumnInfo, + pkIdxCol *model.IndexColumn, idx *model.IndexInfo) { + truncateTargetCol := pkIdxCol + for _, idxCol := range idx.Columns { + if idxCol.Offset == pkIdxCol.Offset { + truncateTargetCol = maxIndexLen(pkIdxCol, idxCol) + break + } + } + tablecodec.TruncateIndexValue(datum, truncateTargetCol, pkCol) +} + +// ConvertDatumToTailSpaceCount converts a string datum to an int datum that represents the tail space count. +func ConvertDatumToTailSpaceCount(datum *types.Datum, col *model.ColumnInfo) { + if collate.IsBinCollation(col.GetCollate()) { + *datum = types.NewIntDatum(stringutil.GetTailSpaceCount(datum.GetString())) + } +} + func maxIndexLen(idxA, idxB *model.IndexColumn) *model.IndexColumn { if idxA.Length == types.UnspecifiedLength { return idxA @@ -1920,7 +1968,7 @@ func maxIndexLen(idxA, idxB *model.IndexColumn) *model.IndexColumn { } func getSequenceAllocator(allocs autoid.Allocators) (autoid.Allocator, error) { - for _, alloc := range allocs { + for _, alloc := range allocs.Allocs { if alloc.GetType() == autoid.SequenceType { return alloc, nil } @@ -1934,7 +1982,7 @@ func BuildTableScanFromInfos(tableInfo *model.TableInfo, columnInfos []*model.Co pkColIds := TryGetCommonPkColumnIds(tableInfo) tsExec := &tipb.TableScan{ TableId: tableInfo.ID, - Columns: util.ColumnsToProto(columnInfos, tableInfo.PKIsHandle), + Columns: util.ColumnsToProto(columnInfos, tableInfo.PKIsHandle, false), PrimaryColumnIds: pkColIds, } if tableInfo.IsCommonHandle { @@ -1948,7 +1996,7 @@ func BuildPartitionTableScanFromInfos(tableInfo *model.TableInfo, columnInfos [] pkColIds := TryGetCommonPkColumnIds(tableInfo) tsExec := &tipb.PartitionTableScan{ TableId: tableInfo.ID, - Columns: util.ColumnsToProto(columnInfos, tableInfo.PKIsHandle), + Columns: util.ColumnsToProto(columnInfos, tableInfo.PKIsHandle, false), PrimaryColumnIds: pkColIds, IsFastScan: &fastScan, } diff --git a/table/tables/tables_test.go b/table/tables/tables_test.go index d659f918a8168..46981958fbeb5 100644 --- a/table/tables/tables_test.go +++ b/table/tables/tables_test.go @@ -333,7 +333,7 @@ func TestUnsignedPK(t *testing.T) { require.NoError(t, err) require.Equal(t, 2, len(row)) require.Equal(t, types.KindUint64, row[0].Kind()) - tk.Session().StmtCommit() + tk.Session().StmtCommit(context.Background()) txn, err := tk.Session().Txn(true) require.NoError(t, err) require.Nil(t, txn.Commit(context.Background())) @@ -378,18 +378,18 @@ func TestTableFromMeta(t *testing.T) { // For test coverage tbInfo.Columns[0].GeneratedExprString = "a" - _, err = tables.TableFromMeta(nil, tbInfo) + _, err = tables.TableFromMeta(autoid.NewAllocators(false), tbInfo) require.NoError(t, err) tbInfo.Columns[0].GeneratedExprString = "test" - _, err = tables.TableFromMeta(nil, tbInfo) + _, err = tables.TableFromMeta(autoid.NewAllocators(false), tbInfo) require.Error(t, err) tbInfo.Columns[0].State = model.StateNone - tb, err = tables.TableFromMeta(nil, tbInfo) + tb, err = tables.TableFromMeta(autoid.NewAllocators(false), tbInfo) require.Nil(t, tb) require.Error(t, err) tbInfo.State = model.StateNone - tb, err = tables.TableFromMeta(nil, tbInfo) + tb, err = tables.TableFromMeta(autoid.NewAllocators(false), tbInfo) require.Nil(t, tb) require.Error(t, err) @@ -639,7 +639,7 @@ func TestAddRecordWithCtx(t *testing.T) { require.NoError(t, err) require.Equal(t, len(records), i) - tk.Session().StmtCommit() + tk.Session().StmtCommit(context.Background()) txn, err := tk.Session().Txn(true) require.NoError(t, err) require.Nil(t, txn.Commit(context.Background())) diff --git a/table/temptable/BUILD.bazel b/table/temptable/BUILD.bazel index 30c41bd1c55b3..8487a26533b51 100644 --- a/table/temptable/BUILD.bazel +++ b/table/temptable/BUILD.bazel @@ -41,6 +41,7 @@ go_test( deps = [ "//infoschema", "//kv", + "//meta/autoid", "//parser/model", "//parser/mysql", "//sessionctx", diff --git a/table/temptable/ddl.go b/table/temptable/ddl.go index ccad2b7b0214c..d464cb3c48618 100644 --- a/table/temptable/ddl.go +++ b/table/temptable/ddl.go @@ -182,7 +182,7 @@ func newTemporaryTableFromTableInfo(sctx sessionctx.Context, tbInfo *model.Table if alloc != nil { allocs = append(allocs, alloc) } - return tables.TableFromMeta(allocs, tbInfo) + return tables.TableFromMeta(autoid.NewAllocators(false, allocs...), tbInfo) } // GetTemporaryTableDDL gets the temptable.TemporaryTableDDL from session context diff --git a/table/temptable/main_test.go b/table/temptable/main_test.go index 7dbc5e86d37d9..8c5c4f557e1ae 100644 --- a/table/temptable/main_test.go +++ b/table/temptable/main_test.go @@ -22,6 +22,7 @@ import ( "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/table" @@ -86,7 +87,7 @@ func (is *mockedInfoSchema) TableByID(tblID int64) (table.Table, bool) { State: model.StatePublic, } - tbl, err := table.TableFromMeta(nil, tblInfo) + tbl, err := table.TableFromMeta(autoid.NewAllocators(false), tblInfo) require.NoError(is.t, err) return tbl, true diff --git a/tablecodec/BUILD.bazel b/tablecodec/BUILD.bazel index 5752a60ddfdd1..9e0515d8fda23 100644 --- a/tablecodec/BUILD.bazel +++ b/tablecodec/BUILD.bazel @@ -21,6 +21,8 @@ go_library( "//util/rowcodec", "//util/stringutil", "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_kvproto//pkg/kvrpcpb", + "@com_github_tikv_client_go_v2//tikv", ], ) @@ -34,6 +36,7 @@ go_test( ], embed = [":tablecodec"], flaky = True, + shard_count = 30, deps = [ "//kv", "//parser/mysql", @@ -47,6 +50,7 @@ go_test( "//util/rowcodec", "@com_github_pingcap_failpoint//:failpoint", "@com_github_stretchr_testify//require", + "@com_github_tikv_client_go_v2//tikv", "@org_uber_go_goleak//:goleak", ], ) diff --git a/tablecodec/tablecodec.go b/tablecodec/tablecodec.go index b9400b0271d41..e5adfa6f91b32 100644 --- a/tablecodec/tablecodec.go +++ b/tablecodec/tablecodec.go @@ -23,6 +23,7 @@ import ( "unicode/utf8" "github.com/pingcap/errors" + "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/charset" @@ -37,6 +38,7 @@ import ( "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/rowcodec" "github.com/pingcap/tidb/util/stringutil" + "github.com/tikv/client-go/v2/tikv" ) var ( @@ -209,6 +211,15 @@ func EncodeMetaKey(key []byte, field []byte) kv.Key { return ek } +// EncodeMetaKeyPrefix encodes the key prefix into meta key +func EncodeMetaKeyPrefix(key []byte) kv.Key { + ek := make([]byte, 0, len(metaPrefix)+codec.EncodedBytesLength(len(key))+8) + ek = append(ek, metaPrefix...) + ek = codec.EncodeBytes(ek, key) + ek = codec.EncodeUint(ek, uint64(structure.HashData)) + return ek +} + // DecodeMetaKey decodes the key and get the meta key and meta field. func DecodeMetaKey(ek kv.Key) (key []byte, field []byte, err error) { var tp uint64 @@ -268,7 +279,16 @@ func DecodeKeyHead(key kv.Key) (tableID int64, indexID int64, isRecordKey bool, // DecodeTableID decodes the table ID of the key, if the key is not table key, returns 0. func DecodeTableID(key kv.Key) int64 { if !key.HasPrefix(tablePrefix) { - return 0 + // If the key is in API V2, then ignore the prefix + _, k, err := tikv.DecodeKey(key, kvrpcpb.APIVersion_V2) + if err != nil { + terror.Log(errors.Trace(err)) + return 0 + } + key = k + if !key.HasPrefix(tablePrefix) { + return 0 + } } key = key[len(tablePrefix):] _, tableID, err := codec.DecodeInt(key) @@ -1143,6 +1163,219 @@ func TempIndexKey2IndexKey(originIdxID int64, tempIdxKey []byte) { binary.BigEndian.PutUint64(tempIdxKey[prefixLen:], eid) } +// CheckTempIndexKey checks whether the input key is for a temp index. +func CheckTempIndexKey(indexKey []byte) (isTemp bool, originIdxID int64) { + var ( + indexIDKey []byte + indexID int64 + tempIndexID int64 + ) + // Get encoded indexID from key, Add uint64 8 byte length. + indexIDKey = indexKey[prefixLen : prefixLen+8] + indexID = codec.DecodeCmpUintToInt(binary.BigEndian.Uint64(indexIDKey)) + tempIndexID = int64(TempIndexPrefix) | indexID + return tempIndexID == indexID, indexID & IndexIDMask +} + +// TempIndexValueFlag is the flag of temporary index value. +type TempIndexValueFlag byte + +const ( + // TempIndexValueFlagNormal means the following value is a distinct the normal index value. + TempIndexValueFlagNormal TempIndexValueFlag = iota + // TempIndexValueFlagNonDistinctNormal means the following value is the non-distinct normal index value. + TempIndexValueFlagNonDistinctNormal + // TempIndexValueFlagDeleted means the following value is the distinct and deleted index value. + TempIndexValueFlagDeleted + // TempIndexValueFlagNonDistinctDeleted means the following value is the non-distinct deleted index value. + TempIndexValueFlagNonDistinctDeleted +) + +// TempIndexValue is the value of temporary index. +// It contains one or more element, each element represents a history index operations on the original index. +// A temp index value element is encoded as one of: +// - [flag 1 byte][value_length 2 bytes ] [value value_len bytes] [key_version 1 byte] {distinct normal} +// - [flag 1 byte][value value_len bytes] [key_version 1 byte] {non-distinct normal} +// - [flag 1 byte][handle_length 2 bytes] [handle handle_len bytes] [key_version 1 byte] {distinct deleted} +// - [flag 1 byte] [key_version 1 byte] {non-distinct deleted} +// +// The temp index value is encoded as: +// - [element 1][element 2]...[element n] {for distinct values} +// - [element 1] {for non-distinct values} +type TempIndexValue []*TempIndexValueElem + +// IsEmpty checks whether the value is empty. +func (v TempIndexValue) IsEmpty() bool { + return len(v) == 0 +} + +// Current returns the current latest temp index value. +func (v TempIndexValue) Current() *TempIndexValueElem { + return v[len(v)-1] +} + +// FilterOverwritten is used by the temp index merge process to remove the overwritten index operations. +// For example, the value {temp_idx_key -> [h2, h2d, h3, h1d]} recorded four operations on the original index. +// Since 'h2d' overwrites 'h2', we can remove 'h2' from the value. +func (v TempIndexValue) FilterOverwritten() TempIndexValue { + if len(v) <= 1 || !v[0].Distinct { + return v + } + occurred := kv.NewHandleMap() + for i := len(v) - 1; i >= 0; i-- { + if _, ok := occurred.Get(v[i].Handle); !ok { + occurred.Set(v[i].Handle, struct{}{}) + } else { + v[i] = nil + } + } + ret := v[:0] + for _, elem := range v { + if elem != nil { + ret = append(ret, elem) + } + } + return ret +} + +// TempIndexValueElem represents a history index operations on the original index. +// A temp index value element is encoded as one of: +// - [flag 1 byte][value_length 2 bytes ] [value value_len bytes] [key_version 1 byte] {distinct normal} +// - [flag 1 byte][value value_len bytes] [key_version 1 byte] {non-distinct normal} +// - [flag 1 byte][handle_length 2 bytes] [handle handle_len bytes] [key_version 1 byte] {distinct deleted} +// - [flag 1 byte] [key_version 1 byte] {non-distinct deleted} +type TempIndexValueElem struct { + Value []byte + Handle kv.Handle + KeyVer byte + Delete bool + Distinct bool +} + +// Encode encodes the temp index value. +func (v *TempIndexValueElem) Encode(buf []byte) []byte { + if v.Delete { + if v.Distinct { + handle := v.Handle + var hEncoded []byte + var hLen uint16 + if handle.IsInt() { + hEncoded = codec.EncodeUint(hEncoded, uint64(handle.IntValue())) + hLen = 8 + } else { + hEncoded = handle.Encoded() + hLen = uint16(len(hEncoded)) + } + // flag + handle length + handle + temp key version + if buf == nil { + buf = make([]byte, 0, hLen+4) + } + buf = append(buf, byte(TempIndexValueFlagDeleted)) + buf = append(buf, byte(hLen>>8), byte(hLen)) + buf = append(buf, hEncoded...) + buf = append(buf, v.KeyVer) + return buf + } + // flag + temp key version + if buf == nil { + buf = make([]byte, 0, 2) + } + buf = append(buf, byte(TempIndexValueFlagNonDistinctDeleted)) + buf = append(buf, v.KeyVer) + return buf + } + if v.Distinct { + // flag + value length + value + temp key version + if buf == nil { + buf = make([]byte, 0, len(v.Value)+4) + } + buf = append(buf, byte(TempIndexValueFlagNormal)) + vLen := uint16(len(v.Value)) + buf = append(buf, byte(vLen>>8), byte(vLen)) + buf = append(buf, v.Value...) + buf = append(buf, v.KeyVer) + return buf + } + // flag + value + temp key version + if buf == nil { + buf = make([]byte, 0, len(v.Value)+2) + } + buf = append(buf, byte(TempIndexValueFlagNonDistinctNormal)) + buf = append(buf, v.Value...) + buf = append(buf, v.KeyVer) + return buf +} + +// DecodeTempIndexValue decodes the temp index value. +func DecodeTempIndexValue(value []byte, isCommonHandle bool) (TempIndexValue, error) { + var ( + values []*TempIndexValueElem + err error + ) + for len(value) > 0 { + v := &TempIndexValueElem{} + value, err = v.DecodeOne(value, isCommonHandle) + if err != nil { + return nil, err + } + values = append(values, v) + } + return values, nil +} + +// DecodeOne decodes one temp index value element. +func (v *TempIndexValueElem) DecodeOne(b []byte, isCommonHandle bool) (remain []byte, err error) { + flag := TempIndexValueFlag(b[0]) + b = b[1:] + switch flag { + case TempIndexValueFlagNormal: + vLen := (uint16(b[0]) << 8) + uint16(b[1]) + b = b[2:] + v.Value = b[:vLen] + b = b[vLen:] + v.KeyVer = b[0] + b = b[1:] + v.Distinct = true + v.Handle, err = DecodeHandleInUniqueIndexValue(v.Value, isCommonHandle) + return b, err + case TempIndexValueFlagNonDistinctNormal: + v.Value = b[:len(b)-1] + v.KeyVer = b[len(b)-1] + return nil, nil + case TempIndexValueFlagDeleted: + hLen := (uint16(b[0]) << 8) + uint16(b[1]) + b = b[2:] + if isCommonHandle { + v.Handle, _ = kv.NewCommonHandle(b[:hLen]) + } else { + v.Handle = decodeIntHandleInIndexValue(b[:hLen]) + } + b = b[hLen:] + v.KeyVer = b[0] + b = b[1:] + v.Distinct = true + v.Delete = true + return b, nil + case TempIndexValueFlagNonDistinctDeleted: + v.KeyVer = b[0] + b = b[1:] + v.Delete = true + return b, nil + default: + return nil, errors.New("invalid temp index value") + } +} + +// TempIndexValueIsUntouched returns true if the value is untouched. +// All the temp index value has the suffix of temp key version. +// All the temp key versions differ from the uncommitted KV flag. +func TempIndexValueIsUntouched(b []byte) bool { + if len(b) > 0 && b[len(b)-1] == kv.UnCommitIndexKVFlag { + return true + } + return false +} + // GenIndexValuePortal is the portal for generating index value. // Value layout: // @@ -1613,3 +1846,30 @@ func IndexKVIsUnique(value []byte) bool { segs := SplitIndexValue(value) return segs.IntHandle != nil || segs.CommonHandle != nil } + +// VerifyTableIDForRanges verifies that all given ranges are valid to decode the table id. +func VerifyTableIDForRanges(keyRanges *kv.KeyRanges) ([]int64, error) { + tids := make([]int64, 0, keyRanges.PartitionNum()) + collectFunc := func(ranges []kv.KeyRange, _ []int) error { + if len(ranges) == 0 { + return nil + } + tid := DecodeTableID(ranges[0].StartKey) + if tid <= 0 { + return errors.New("Incorrect keyRange is constrcuted") + } + tids = append(tids, tid) + for i := 1; i < len(ranges); i++ { + tmpTID := DecodeTableID(ranges[i].StartKey) + if tmpTID <= 0 { + return errors.New("Incorrect keyRange is constrcuted") + } + if tid != tmpTID { + return errors.Errorf("Using multi partition's ranges as single table's") + } + } + return nil + } + err := keyRanges.ForEachPartitionWithErr(collectFunc) + return tids, err +} diff --git a/tablecodec/tablecodec_test.go b/tablecodec/tablecodec_test.go index 6632aaf2c1727..45020e034938c 100644 --- a/tablecodec/tablecodec_test.go +++ b/tablecodec/tablecodec_test.go @@ -30,6 +30,7 @@ import ( "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/rowcodec" "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/tikv" ) // TestTableCodec tests some functions in package tablecodec @@ -610,3 +611,109 @@ func TestTempIndexKey(t *testing.T) { require.Equal(t, tid, tableID) require.Equal(t, indexID, iid) } + +func TestTempIndexValueCodec(t *testing.T) { + // Test encode temp index value. + encodedValue, err := codec.EncodeValue(&stmtctx.StatementContext{TimeZone: time.UTC}, nil, types.NewIntDatum(1)) + require.NoError(t, err) + encodedValueCopy := make([]byte, len(encodedValue)) + copy(encodedValueCopy, encodedValue) + + tempIdxVal := TempIndexValueElem{ + Value: encodedValue, + KeyVer: 'b', + } + val := tempIdxVal.Encode(nil) + var newTempIdxVal TempIndexValueElem + remain, err := newTempIdxVal.DecodeOne(val, false) + require.NoError(t, err) + require.Equal(t, 0, len(remain)) + require.EqualValues(t, tempIdxVal, newTempIdxVal) + + idxVal := EncodeHandleInUniqueIndexValue(kv.IntHandle(100), false) + tempIdxVal = TempIndexValueElem{ + Value: idxVal, + KeyVer: 'm', + Distinct: true, + } + newTempIdxVal = TempIndexValueElem{} + val = tempIdxVal.Encode(nil) + remain, err = newTempIdxVal.DecodeOne(val, false) + require.NoError(t, err) + require.Equal(t, 0, len(remain)) + require.Equal(t, newTempIdxVal.Handle.IntValue(), int64(100)) + newTempIdxVal.Handle = nil + require.EqualValues(t, tempIdxVal, newTempIdxVal) + + tempIdxVal = TempIndexValueElem{ + Delete: true, + KeyVer: 'b', + } + newTempIdxVal = TempIndexValueElem{} + val = tempIdxVal.Encode(nil) + remain, err = newTempIdxVal.DecodeOne(val, false) + require.NoError(t, err) + require.Equal(t, 0, len(remain)) + require.EqualValues(t, tempIdxVal, newTempIdxVal) + + tempIdxVal = TempIndexValueElem{ + Delete: true, + KeyVer: 'b', + Distinct: true, + Handle: kv.IntHandle(100), + } + newTempIdxVal = TempIndexValueElem{} + val = tempIdxVal.Encode(nil) + remain, err = newTempIdxVal.DecodeOne(val, false) + require.NoError(t, err) + require.Equal(t, 0, len(remain)) + require.EqualValues(t, tempIdxVal, newTempIdxVal) + + // Test multiple temp index value elements. + idxVal = EncodeHandleInUniqueIndexValue(kv.IntHandle(100), false) + tempIdxVal = TempIndexValueElem{ + Value: idxVal, + KeyVer: 'm', + Distinct: true, + } + tempIdxVal2 := TempIndexValueElem{ + Handle: kv.IntHandle(100), + KeyVer: 'm', + Distinct: true, + Delete: true, + } + idxVal3 := EncodeHandleInUniqueIndexValue(kv.IntHandle(101), false) + tempIdxVal3 := TempIndexValueElem{ + Value: idxVal3, + KeyVer: 'm', + Distinct: true, + } + val = tempIdxVal.Encode(nil) + val = tempIdxVal2.Encode(val) + val = tempIdxVal3.Encode(val) + var result TempIndexValue + result, err = DecodeTempIndexValue(val, false) + require.NoError(t, err) + require.Equal(t, 3, len(result)) + require.Equal(t, result[0].Handle.IntValue(), int64(100)) + require.Equal(t, result[1].Handle.IntValue(), int64(100)) + require.Equal(t, result[2].Handle.IntValue(), int64(101)) +} + +func TestV2TableCodec(t *testing.T) { + const tableID int64 = 31415926 + key := EncodeTablePrefix(tableID) + c, err := tikv.NewCodecV2(tikv.ModeTxn, 271828) + require.NoError(t, err) + key = c.EncodeKey(key) + tbid := DecodeTableID(key) + require.Equal(t, tableID, tbid) + + key = []byte("x001HelloWorld") + tbid = DecodeTableID(key) + require.Equal(t, int64(0), tbid) + + key = []byte("x001x001t123") + tbid = DecodeTableID(key) + require.Equal(t, int64(0), tbid) +} diff --git a/telemetry/BUILD.bazel b/telemetry/BUILD.bazel index df7de986555a6..12c9f049675da 100644 --- a/telemetry/BUILD.bazel +++ b/telemetry/BUILD.bazel @@ -13,6 +13,7 @@ go_library( "id.go", "status.go", "telemetry.go", + "ttl.go", "util.go", ], importpath = "github.com/pingcap/tidb/telemetry", @@ -24,6 +25,7 @@ go_library( "//infoschema", "//kv", "//metrics", + "//parser/ast", "//parser/model", "//parser/mysql", "//sessionctx", @@ -60,7 +62,9 @@ go_test( ], embed = [":telemetry"], flaky = True, + shard_count = 30, deps = [ + "//autoid_service", "//config", "//ddl", "//domain", @@ -74,6 +78,7 @@ go_test( "//testkit", "//testkit/testsetup", "@com_github_jeffail_gabs_v2//:gabs", + "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/metapb", "@com_github_stretchr_testify//require", "@com_github_tikv_client_go_v2//testutils", diff --git a/telemetry/cte_test/cte_test.go b/telemetry/cte_test/cte_test.go index fac26ddb2f403..a99e8a6bac498 100644 --- a/telemetry/cte_test/cte_test.go +++ b/telemetry/cte_test/cte_test.go @@ -40,6 +40,7 @@ func TestMain(m *testing.M) { goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("syscall.syscall"), } goleak.VerifyTestMain(m, opts...) diff --git a/telemetry/data.go b/telemetry/data.go index 0008b7fc8b88b..a3dc3947954dd 100644 --- a/telemetry/data.go +++ b/telemetry/data.go @@ -69,6 +69,9 @@ func postReportTelemetryData() { PostSavepointCount() postReportLazyPessimisticUniqueCheckSetCount() postReportDDLUsage() + postReportIndexMergeUsage() + postStoreBatchUsage() + postReportAggressiveLockingUsageCounter() } // PostReportTelemetryDataForTest is for test. diff --git a/telemetry/data_feature_usage.go b/telemetry/data_feature_usage.go index 3766945536d9c..1d782dcd53632 100644 --- a/telemetry/data_feature_usage.go +++ b/telemetry/data_feature_usage.go @@ -17,6 +17,7 @@ package telemetry import ( "context" "errors" + "strconv" "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/config" @@ -29,6 +30,7 @@ import ( "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/sqlexec" "github.com/tikv/client-go/v2/metrics" + "go.uber.org/zap" ) // emptyClusterIndexUsage is empty ClusterIndexUsage, deprecated. @@ -58,6 +60,10 @@ type featureUsage struct { DDLUsageCounter *m.DDLUsageCounter `json:"DDLUsageCounter"` EnableGlobalMemoryControl bool `json:"enableGlobalMemoryControl"` AutoIDNoCache bool `json:"autoIDNoCache"` + IndexMergeUsageCounter *m.IndexMergeUsageCounter `json:"indexMergeUsageCounter"` + ResourceControlUsage *resourceControlUsage `json:"resourceControl"` + TTLUsage *ttlUsageCounter `json:"ttlUsage"` + StoreBatchCoprUsage *m.StoreBatchCoprCounter `json:"storeBatchCopr"` } type placementPolicyUsage struct { @@ -68,12 +74,17 @@ type placementPolicyUsage struct { NumPartitionWithExplicitPolicies uint64 `json:"numPartitionWithExplicitPolicies"` } +type resourceControlUsage struct { + Enabled bool `json:"resourceControlEnabled"` + NumResourceGroups uint64 `json:"numResourceGroups"` +} + func getFeatureUsage(ctx context.Context, sctx sessionctx.Context) (*featureUsage, error) { var usage featureUsage var err error usage.NewClusterIndex, usage.ClusterIndex, err = getClusterIndexUsageInfo(ctx, sctx) if err != nil { - logutil.BgLogger().Info(err.Error()) + logutil.BgLogger().Info("Failed to get feature usage", zap.Error(err)) return nil, err } @@ -108,14 +119,21 @@ func getFeatureUsage(ctx context.Context, sctx sessionctx.Context) (*featureUsag usage.EnableGlobalMemoryControl = getGlobalMemoryControl() + usage.IndexMergeUsageCounter = getIndexMergeUsageInfo() + + usage.TTLUsage = getTTLUsageInfo(ctx, sctx) + + usage.StoreBatchCoprUsage = getStoreBatchUsage(sctx) + return &usage, nil } -// collectFeatureUsageFromInfoschema updates the usage for temporary table, cached table and placement policies. +// collectFeatureUsageFromInfoschema updates the usage for temporary table, cached table, placement policies and resource groups. func collectFeatureUsageFromInfoschema(ctx sessionctx.Context, usage *featureUsage) { if usage.PlacementPolicyUsage == nil { usage.PlacementPolicyUsage = &placementPolicyUsage{} } + is := GetDomainInfoSchema(ctx) for _, dbInfo := range is.AllSchemas() { if dbInfo.PlacementPolicyRef != nil { @@ -146,8 +164,13 @@ func collectFeatureUsageFromInfoschema(ctx sessionctx.Context, usage *featureUsa } } } - usage.PlacementPolicyUsage.NumPlacementPolicies += uint64(len(is.AllPlacementPolicies())) + + if usage.ResourceControlUsage == nil { + usage.ResourceControlUsage = &resourceControlUsage{} + } + usage.ResourceControlUsage.NumResourceGroups = uint64(len(is.AllResourceGroups())) + usage.ResourceControlUsage.Enabled = variable.EnableResourceControl.Load() } // GetDomainInfoSchema is used by the telemetry package to get the latest schema information @@ -223,15 +246,17 @@ func getClusterIndexUsageInfo(ctx context.Context, sctx sessionctx.Context) (ncu // TxnUsage records the usage info of transaction related features, including // async-commit, 1PC and counters of transactions committed with different protocols. type TxnUsage struct { - AsyncCommitUsed bool `json:"asyncCommitUsed"` - OnePCUsed bool `json:"onePCUsed"` - TxnCommitCounter metrics.TxnCommitCounter `json:"txnCommitCounter"` - MutationCheckerUsed bool `json:"mutationCheckerUsed"` - AssertionLevel string `json:"assertionLevel"` - RcCheckTS bool `json:"rcCheckTS"` - RCWriteCheckTS bool `json:"rcWriteCheckTS"` - SavepointCounter int64 `json:"SavepointCounter"` - LazyUniqueCheckSetCounter int64 `json:"lazyUniqueCheckSetCounter"` + AsyncCommitUsed bool `json:"asyncCommitUsed"` + OnePCUsed bool `json:"onePCUsed"` + TxnCommitCounter metrics.TxnCommitCounter `json:"txnCommitCounter"` + MutationCheckerUsed bool `json:"mutationCheckerUsed"` + AssertionLevel string `json:"assertionLevel"` + RcCheckTS bool `json:"rcCheckTS"` + RCWriteCheckTS bool `json:"rcWriteCheckTS"` + AggressiveLocking bool `json:"aggressiveLocking"` + SavepointCounter int64 `json:"SavepointCounter"` + LazyUniqueCheckSetCounter int64 `json:"lazyUniqueCheckSetCounter"` + AggressiveLockingUsageCounter m.AggressiveLockingUsageCounter `json:"AggressiveLockingUsageCounter"` } var initialTxnCommitCounter metrics.TxnCommitCounter @@ -244,6 +269,9 @@ var initialTablePartitionCounter m.TablePartitionUsageCounter var initialSavepointStmtCounter int64 var initialLazyPessimisticUniqueCheckSetCount int64 var initialDDLUsageCounter m.DDLUsageCounter +var initialIndexMergeCounter m.IndexMergeUsageCounter +var initialStoreBatchCoprCounter m.StoreBatchCoprCounter +var initialAggressiveLockingUsageCounter m.AggressiveLockingUsageCounter // getTxnUsageInfo gets the usage info of transaction related features. It's exported for tests. func getTxnUsageInfo(ctx sessionctx.Context) *TxnUsage { @@ -273,13 +301,23 @@ func getTxnUsageInfo(ctx sessionctx.Context) *TxnUsage { if val, err := ctx.GetSessionVars().GetGlobalSystemVar(context.Background(), variable.TiDBRCWriteCheckTs); err == nil { rcWriteCheckTSUsed = val == variable.On } + aggressiveLockingUsed := false + if val, err := ctx.GetSessionVars().GetGlobalSystemVar(context.Background(), variable.TiDBPessimisticTransactionAggressiveLocking); err == nil { + aggressiveLockingUsed = val == variable.On + } + currSavepointCount := m.GetSavepointStmtCounter() diffSavepointCount := currSavepointCount - initialSavepointStmtCounter + currLazyUniqueCheckSetCount := m.GetLazyPessimisticUniqueCheckSetCounter() diffLazyUniqueCheckSetCount := currLazyUniqueCheckSetCount - initialLazyPessimisticUniqueCheckSetCount + + currAggressiveLockingUsageCounter := m.GetAggressiveLockingUsageCounter() + diffAggressiveLockingUsageCounter := currAggressiveLockingUsageCounter.Sub(initialAggressiveLockingUsageCounter) + return &TxnUsage{asyncCommitUsed, onePCUsed, diff, mutationCheckerUsed, assertionUsed, rcCheckTSUsed, rcWriteCheckTSUsed, - diffSavepointCount, diffLazyUniqueCheckSetCount, + aggressiveLockingUsed, diffSavepointCount, diffLazyUniqueCheckSetCount, diffAggressiveLockingUsageCounter, } } @@ -304,6 +342,10 @@ func postReportLazyPessimisticUniqueCheckSetCount() { initialLazyPessimisticUniqueCheckSetCount = m.GetLazyPessimisticUniqueCheckSetCounter() } +func postReportAggressiveLockingUsageCounter() { + initialAggressiveLockingUsageCounter = m.GetAggressiveLockingUsageCounter() +} + // getCTEUsageInfo gets the CTE usages. func getCTEUsageInfo() *m.CTEUsageCounter { curr := m.GetCTECounter() @@ -402,3 +444,28 @@ func getDDLUsageInfo(ctx sessionctx.Context) *m.DDLUsageCounter { func getGlobalMemoryControl() bool { return memory.ServerMemoryLimit.Load() > 0 } + +func postReportIndexMergeUsage() { + initialIndexMergeCounter = m.GetIndexMergeCounter() +} + +func getIndexMergeUsageInfo() *m.IndexMergeUsageCounter { + curr := m.GetIndexMergeCounter() + diff := curr.Sub(initialIndexMergeCounter) + return &diff +} + +func getStoreBatchUsage(ctx sessionctx.Context) *m.StoreBatchCoprCounter { + curr := m.GetStoreBatchCoprCounter() + diff := curr.Sub(initialStoreBatchCoprCounter) + if val, err := ctx.GetSessionVars().GetGlobalSystemVar(context.Background(), variable.TiDBStoreBatchSize); err == nil { + if batchSize, err := strconv.Atoi(val); err == nil { + diff.BatchSize = batchSize + } + } + return &diff +} + +func postStoreBatchUsage() { + initialStoreBatchCoprCounter = m.GetStoreBatchCoprCounter() +} diff --git a/telemetry/data_feature_usage_test.go b/telemetry/data_feature_usage_test.go index f2d212f39b41b..278ef894e3474 100644 --- a/telemetry/data_feature_usage_test.go +++ b/telemetry/data_feature_usage_test.go @@ -15,11 +15,17 @@ package telemetry_test import ( + "encoding/json" "fmt" + "strings" "testing" + "time" + "github.com/pingcap/failpoint" + _ "github.com/pingcap/tidb/autoid_service" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/telemetry" "github.com/pingcap/tidb/testkit" @@ -68,6 +74,14 @@ func TestTxnUsageInfo(t *testing.T) { tk.MustExec(fmt.Sprintf("set global %s = 1", variable.TiDBRCWriteCheckTs)) txnUsage = telemetry.GetTxnUsageInfo(tk.Session()) require.True(t, txnUsage.RCWriteCheckTS) + + tk.MustExec(fmt.Sprintf("set global %s = 0", variable.TiDBPessimisticTransactionAggressiveLocking)) + txnUsage = telemetry.GetTxnUsageInfo(tk.Session()) + require.False(t, txnUsage.AggressiveLocking) + + tk.MustExec(fmt.Sprintf("set global %s = 1", variable.TiDBPessimisticTransactionAggressiveLocking)) + txnUsage = telemetry.GetTxnUsageInfo(tk.Session()) + require.True(t, txnUsage.AggressiveLocking) }) t.Run("Count", func(t *testing.T) { @@ -143,7 +157,7 @@ func TestAutoIDNoCache(t *testing.T) { usage, err = telemetry.GetFeatureUsage(tk.Session()) require.NoError(t, err) require.True(t, usage.AutoIDNoCache) - tk.MustExec("alter table tele_autoid auto_id_cache=0") + tk.MustExec("drop table tele_autoid") usage, err = telemetry.GetFeatureUsage(tk.Session()) require.NoError(t, err) require.False(t, usage.AutoIDNoCache) @@ -239,6 +253,7 @@ func TestTablePartition(t *testing.T) { require.Equal(t, int64(0), usage.TablePartition.TablePartitionCreateIntervalPartitionsCnt) require.Equal(t, int64(0), usage.TablePartition.TablePartitionAddIntervalPartitionsCnt) require.Equal(t, int64(0), usage.TablePartition.TablePartitionDropIntervalPartitionsCnt) + require.Equal(t, int64(0), usage.TablePartition.TablePartitionReorganizePartitionCnt) telemetry.PostReportTelemetryDataForTest() tk.MustExec("drop table if exists pt1") @@ -250,6 +265,7 @@ func TestTablePartition(t *testing.T) { "partition p4 values less than (15))") tk.MustExec("alter table pt1 first partition less than (9)") tk.MustExec("alter table pt1 last partition less than (21)") + tk.MustExec("alter table pt1 reorganize partition p4 into (partition p4 values less than (13), partition p5 values less than (15))") tk.MustExec("drop table if exists pt1") tk.MustExec("create table pt1 (d datetime primary key, v varchar(255)) partition by range columns(d)" + " interval (1 day) first partition less than ('2022-01-01') last partition less than ('2022-02-22')") @@ -274,6 +290,7 @@ func TestTablePartition(t *testing.T) { require.Equal(t, int64(1), usage.TablePartition.TablePartitionCreateIntervalPartitionsCnt) require.Equal(t, int64(1), usage.TablePartition.TablePartitionAddIntervalPartitionsCnt) require.Equal(t, int64(1), usage.TablePartition.TablePartitionDropIntervalPartitionsCnt) + require.Equal(t, int64(1), usage.TablePartition.TablePartitionReorganizePartitionCnt) tk.MustExec("drop table if exists pt2") tk.MustExec("create table pt2 (a int,b int) partition by range(a) (" + @@ -286,6 +303,12 @@ func TestTablePartition(t *testing.T) { usage, err = telemetry.GetFeatureUsage(tk.Session()) require.NoError(t, err) require.Equal(t, int64(1), usage.ExchangePartition.ExchangePartitionCnt) + + require.Equal(t, int64(0), usage.TablePartition.TablePartitionComactCnt) + tk.MustExec(`alter table pt2 compact partition p0 tiflash replica;`) + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, int64(1), usage.TablePartition.TablePartitionComactCnt) } func TestPlacementPolicies(t *testing.T) { @@ -330,6 +353,45 @@ func TestPlacementPolicies(t *testing.T) { require.Equal(t, uint64(1), usage.PlacementPolicyUsage.NumPartitionWithExplicitPolicies) } +func TestResourceGroups(t *testing.T) { + store := testkit.CreateMockStore(t) + + tk := testkit.NewTestKit(t, store) + + usage, err := telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, uint64(0), usage.ResourceControlUsage.NumResourceGroups) + require.Equal(t, false, usage.ResourceControlUsage.Enabled) + + tk.MustExec("set global tidb_enable_resource_control = 'ON'") + tk.MustExec("create resource group x ru_per_sec=100") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, true, usage.ResourceControlUsage.Enabled) + require.Equal(t, uint64(1), usage.ResourceControlUsage.NumResourceGroups) + + tk.MustExec("create resource group y ru_per_sec=100") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, uint64(2), usage.ResourceControlUsage.NumResourceGroups) + + tk.MustExec("alter resource group y ru_per_sec=200") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, uint64(2), usage.ResourceControlUsage.NumResourceGroups) + + tk.MustExec("drop resource group y") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, uint64(1), usage.ResourceControlUsage.NumResourceGroups) + + tk.MustExec("set global tidb_enable_resource_control = 'OFF'") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, uint64(1), usage.ResourceControlUsage.NumResourceGroups) + require.Equal(t, false, usage.ResourceControlUsage.Enabled) +} + func TestAutoCapture(t *testing.T) { store := testkit.CreateMockStore(t) @@ -373,12 +435,18 @@ func TestNonTransactionalUsage(t *testing.T) { usage, err := telemetry.GetFeatureUsage(tk.Session()) require.NoError(t, err) require.Equal(t, int64(0), usage.NonTransactionalUsage.DeleteCount) + require.Equal(t, int64(0), usage.NonTransactionalUsage.UpdateCount) + require.Equal(t, int64(0), usage.NonTransactionalUsage.InsertCount) tk.MustExec("create table t(a int);") tk.MustExec("batch limit 1 delete from t") + tk.MustExec("batch limit 1 update t set a = 1") + tk.MustExec("batch limit 1 insert into t select * from t") usage, err = telemetry.GetFeatureUsage(tk.Session()) require.NoError(t, err) require.Equal(t, int64(1), usage.NonTransactionalUsage.DeleteCount) + require.Equal(t, int64(1), usage.NonTransactionalUsage.UpdateCount) + require.Equal(t, int64(1), usage.NonTransactionalUsage.InsertCount) } func TestGlobalKillUsageInfo(t *testing.T) { @@ -487,10 +555,6 @@ func TestFlashbackCluster(t *testing.T) { } func TestAddIndexAccelerationAndMDL(t *testing.T) { - if !variable.EnableConcurrentDDL.Load() { - t.Skipf("test requires concurrent ddl") - } - store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) usage, err := telemetry.GetFeatureUsage(tk.Session()) @@ -498,7 +562,7 @@ func TestAddIndexAccelerationAndMDL(t *testing.T) { require.NoError(t, err) allow := ddl.IsEnableFastReorg() - require.Equal(t, false, allow) + require.Equal(t, true, allow) tk.MustExec("set global tidb_enable_metadata_lock = 0") tk.MustExec("use test") tk.MustExec("drop table if exists tele_t") @@ -507,7 +571,7 @@ func TestAddIndexAccelerationAndMDL(t *testing.T) { tk.MustExec("alter table tele_t add index idx_org(b)") usage, err = telemetry.GetFeatureUsage(tk.Session()) require.NoError(t, err) - require.Equal(t, int64(0), usage.DDLUsageCounter.AddIndexIngestUsed) + require.Equal(t, int64(1), usage.DDLUsageCounter.AddIndexIngestUsed) require.Equal(t, false, usage.DDLUsageCounter.MetadataLockUsed) tk.MustExec("set @@global.tidb_ddl_enable_fast_reorg = on") @@ -516,14 +580,46 @@ func TestAddIndexAccelerationAndMDL(t *testing.T) { require.Equal(t, true, allow) usage, err = telemetry.GetFeatureUsage(tk.Session()) require.NoError(t, err) - require.Equal(t, int64(0), usage.DDLUsageCounter.AddIndexIngestUsed) + require.Equal(t, int64(1), usage.DDLUsageCounter.AddIndexIngestUsed) tk.MustExec("alter table tele_t add index idx_new(b)") usage, err = telemetry.GetFeatureUsage(tk.Session()) require.NoError(t, err) - require.Equal(t, int64(1), usage.DDLUsageCounter.AddIndexIngestUsed) + require.Equal(t, int64(2), usage.DDLUsageCounter.AddIndexIngestUsed) require.Equal(t, true, usage.DDLUsageCounter.MetadataLockUsed) } +func TestDistReorgUsage(t *testing.T) { + t.Skip("skip in order to pass the test quickly") + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + usage, err := telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + initCount := usage.DDLUsageCounter.DistReorgUsed + + tk.MustExec("set @@global.tidb_ddl_distribute_reorg = off") + allow := variable.DDLEnableDistributeReorg.Load() + require.Equal(t, false, allow) + tk.MustExec("use test") + tk.MustExec("drop table if exists tele_t") + tk.MustExec("create table tele_t(id int, b int)") + tk.MustExec("insert into tele_t values(1,1),(2,2);") + tk.MustExec("alter table tele_t add index idx_org(b)") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, initCount, usage.DDLUsageCounter.DistReorgUsed) + + tk.MustExec("set @@global.tidb_ddl_distribute_reorg = on") + allow = variable.DDLEnableDistributeReorg.Load() + require.Equal(t, true, allow) + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, initCount, usage.DDLUsageCounter.DistReorgUsed) + tk.MustExec("alter table tele_t add index idx_new(b)") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, initCount+1, usage.DDLUsageCounter.DistReorgUsed) +} + func TestGlobalMemoryControl(t *testing.T) { store := testkit.CreateMockStore(t) @@ -542,3 +638,321 @@ func TestGlobalMemoryControl(t *testing.T) { require.NoError(t, err) require.False(t, usage.EnableGlobalMemoryControl) } + +func TestIndexMergeUsage(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("create table t1(c1 int, c2 int, index idx1(c1), index idx2(c2))") + res := tk.MustQuery("explain select /*+ use_index_merge(t1, idx1, idx2) */ * from t1 where c1 = 1 and c2 = 1").Rows() + require.Contains(t, res[0][0], "IndexMerge") + + usage, err := telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, usage.IndexMergeUsageCounter.IndexMergeUsed, int64(0)) + + tk.MustExec("select /*+ use_index_merge(t1, idx1, idx2) */ * from t1 where c1 = 1 and c2 = 1") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, int64(1), usage.IndexMergeUsageCounter.IndexMergeUsed) + + tk.MustExec("select /*+ use_index_merge(t1, idx1, idx2) */ * from t1 where c1 = 1 or c2 = 1") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, int64(2), usage.IndexMergeUsageCounter.IndexMergeUsed) + + tk.MustExec("select /*+ no_index_merge() */ * from t1 where c1 = 1 or c2 = 1") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, int64(2), usage.IndexMergeUsageCounter.IndexMergeUsed) +} + +func TestTTLTelemetry(t *testing.T) { + timeFormat := "2006-01-02 15:04:05" + dateFormat := "2006-01-02" + + now := time.Now() + curDate := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()) + if interval := curDate.Add(time.Hour * 24).Sub(now); interval > 0 && interval < 5*time.Minute { + // make sure testing is not running at the end of one day + time.Sleep(interval) + } + + store, do := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("set @@global.tidb_ttl_job_enable=0") + + getTTLTable := func(name string) *model.TableInfo { + tbl, err := do.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr(name)) + require.NoError(t, err) + require.NotNil(t, tbl.Meta().TTLInfo) + return tbl.Meta() + } + + jobIDIdx := 1 + insertTTLHistory := func(tblName string, partitionName string, createTime, finishTime, ttlExpire time.Time, scanError string, totalRows, errorRows int64, status string) { + defer func() { + jobIDIdx++ + }() + + tbl := getTTLTable(tblName) + tblID := tbl.ID + partitionID := tbl.ID + if partitionName != "" { + for _, def := range tbl.Partition.Definitions { + if def.Name.L == strings.ToLower(partitionName) { + partitionID = def.ID + } + } + require.NotEqual(t, tblID, partitionID) + } + + summary := make(map[string]interface{}) + summary["total_rows"] = totalRows + summary["success_rows"] = totalRows - errorRows + summary["error_rows"] = errorRows + summary["total_scan_task"] = 1 + summary["scheduled_scan_task"] = 1 + summary["finished_scan_task"] = 1 + if scanError != "" { + summary["scan_task_err"] = scanError + } + + summaryText, err := json.Marshal(summary) + require.NoError(t, err) + + tk.MustExec("insert into "+ + "mysql.tidb_ttl_job_history ("+ + " job_id, table_id, parent_table_id, table_schema, table_name, partition_name, "+ + " create_time, finish_time, ttl_expire, summary_text, "+ + " expired_rows, deleted_rows, error_delete_rows, status) "+ + "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + jobIDIdx, partitionID, tblID, "test", tblName, partitionName, + createTime.Format(timeFormat), finishTime.Format(timeFormat), ttlExpire.Format(timeFormat), summaryText, + totalRows, totalRows-errorRows, errorRows, status, + ) + } + + oneDayAgoDate := curDate.Add(-24 * time.Hour) + // start today, end today + times11 := []time.Time{curDate.Add(time.Hour), curDate.Add(2 * time.Hour), curDate} + // start yesterday, end today + times21 := []time.Time{curDate.Add(-2 * time.Hour), curDate, curDate.Add(-3 * time.Hour)} + // start yesterday, end yesterday + times31 := []time.Time{oneDayAgoDate, oneDayAgoDate.Add(time.Hour), oneDayAgoDate.Add(-time.Hour)} + times32 := []time.Time{oneDayAgoDate.Add(2 * time.Hour), oneDayAgoDate.Add(3 * time.Hour), oneDayAgoDate.Add(time.Hour)} + times33 := []time.Time{oneDayAgoDate.Add(4 * time.Hour), oneDayAgoDate.Add(5 * time.Hour), oneDayAgoDate.Add(3 * time.Hour)} + // start 2 days ago, end yesterday + times41 := []time.Time{oneDayAgoDate.Add(-2 * time.Hour), oneDayAgoDate.Add(time.Hour), oneDayAgoDate.Add(-3 * time.Hour)} + // start two days ago, end two days ago + times51 := []time.Time{oneDayAgoDate.Add(-5 * time.Hour), oneDayAgoDate.Add(-4 * time.Hour), oneDayAgoDate.Add(-6 * time.Hour)} + + tk.MustExec("create table t1 (t timestamp) TTL=`t` + interval 1 hour") + insertTTLHistory("t1", "", times11[0], times11[1], times11[2], "", 100000000, 0, "finished") + insertTTLHistory("t1", "", times21[0], times21[1], times21[2], "", 100000000, 0, "finished") + insertTTLHistory("t1", "", times31[0], times31[1], times31[2], "err1", 112600, 110000, "finished") + insertTTLHistory("t1", "", times32[0], times32[1], times32[2], "", 2600, 0, "timeout") + insertTTLHistory("t1", "", times33[0], times33[1], times33[2], "", 2600, 0, "finished") + insertTTLHistory("t1", "", times41[0], times41[1], times41[2], "", 2600, 0, "finished") + insertTTLHistory("t1", "", times51[0], times51[1], times51[2], "", 100000000, 1, "finished") + + usage, err := telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + checkTableHistWithDeleteRows := func(vals ...int64) { + require.Equal(t, 5, len(vals)) + require.Equal(t, 5, len(usage.TTLUsage.TableHistWithDeleteRows)) + require.Equal(t, int64(10*1000), *usage.TTLUsage.TableHistWithDeleteRows[0].LessThan) + require.Equal(t, vals[0], usage.TTLUsage.TableHistWithDeleteRows[0].Count) + require.Equal(t, int64(100*1000), *usage.TTLUsage.TableHistWithDeleteRows[1].LessThan) + require.Equal(t, vals[1], usage.TTLUsage.TableHistWithDeleteRows[1].Count) + require.Equal(t, int64(1000*1000), *usage.TTLUsage.TableHistWithDeleteRows[2].LessThan) + require.Equal(t, vals[2], usage.TTLUsage.TableHistWithDeleteRows[2].Count) + require.Equal(t, int64(10*1000*1000), *usage.TTLUsage.TableHistWithDeleteRows[3].LessThan) + require.Equal(t, vals[3], usage.TTLUsage.TableHistWithDeleteRows[3].Count) + require.True(t, usage.TTLUsage.TableHistWithDeleteRows[4].LessThanMax) + require.Nil(t, usage.TTLUsage.TableHistWithDeleteRows[4].LessThan) + require.Equal(t, vals[4], usage.TTLUsage.TableHistWithDeleteRows[4].Count) + } + + checkTableHistWithDelay := func(vals ...int64) { + require.Equal(t, 5, len(vals)) + require.Equal(t, 5, len(usage.TTLUsage.TableHistWithDelayTime)) + require.Equal(t, int64(1), *usage.TTLUsage.TableHistWithDelayTime[0].LessThan) + require.Equal(t, vals[0], usage.TTLUsage.TableHistWithDelayTime[0].Count) + require.Equal(t, int64(6), *usage.TTLUsage.TableHistWithDelayTime[1].LessThan) + require.Equal(t, vals[1], usage.TTLUsage.TableHistWithDelayTime[1].Count) + require.Equal(t, int64(24), *usage.TTLUsage.TableHistWithDelayTime[2].LessThan) + require.Equal(t, vals[2], usage.TTLUsage.TableHistWithDelayTime[2].Count) + require.Equal(t, int64(72), *usage.TTLUsage.TableHistWithDelayTime[3].LessThan) + require.Equal(t, vals[3], usage.TTLUsage.TableHistWithDelayTime[3].Count) + require.True(t, usage.TTLUsage.TableHistWithDelayTime[4].LessThanMax) + require.Nil(t, usage.TTLUsage.TableHistWithDelayTime[4].LessThan) + require.Equal(t, vals[4], usage.TTLUsage.TableHistWithDelayTime[4].Count) + } + + require.False(t, usage.TTLUsage.TTLJobEnabled) + require.Equal(t, int64(1), usage.TTLUsage.TTLTables) + require.Equal(t, int64(1), usage.TTLUsage.TTLJobEnabledTables) + require.Equal(t, oneDayAgoDate.Format(dateFormat), usage.TTLUsage.TTLHistDate) + checkTableHistWithDeleteRows(0, 1, 0, 0, 0) + checkTableHistWithDelay(0, 0, 1, 0, 0) + + tk.MustExec("create table t2 (t timestamp) TTL=`t` + interval 20 hour") + tk.MustExec("set @@global.tidb_ttl_job_enable=1") + insertTTLHistory("t2", "", times31[0], times31[1], times31[2], "", 9999, 0, "finished") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.True(t, usage.TTLUsage.TTLJobEnabled) + require.Equal(t, int64(2), usage.TTLUsage.TTLTables) + require.Equal(t, int64(2), usage.TTLUsage.TTLJobEnabledTables) + require.Equal(t, oneDayAgoDate.Format(dateFormat), usage.TTLUsage.TTLHistDate) + checkTableHistWithDeleteRows(1, 1, 0, 0, 0) + checkTableHistWithDelay(0, 1, 1, 0, 0) + + tk.MustExec("create table t3 (t timestamp) TTL=`t` + interval 1 hour TTL_ENABLE='OFF'") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.True(t, usage.TTLUsage.TTLJobEnabled) + require.Equal(t, int64(3), usage.TTLUsage.TTLTables) + require.Equal(t, int64(2), usage.TTLUsage.TTLJobEnabledTables) + require.Equal(t, oneDayAgoDate.Format(dateFormat), usage.TTLUsage.TTLHistDate) + checkTableHistWithDeleteRows(1, 1, 0, 0, 0) + checkTableHistWithDelay(0, 1, 1, 0, 1) +} + +func TestStoreBatchCopr(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + init, err := telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, init.StoreBatchCoprUsage.BatchSize, 4) + + tk.MustExec("drop table if exists tele_batch_t") + tk.MustExec("create table tele_batch_t (id int primary key, c int, k int, index i(k))") + tk.MustExec("select * from tele_batch_t force index(i) where k between 1 and 10 and k % 2 != 0") + usage, err := telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, usage.StoreBatchCoprUsage.BatchSize, 4) + diff := usage.StoreBatchCoprUsage.Sub(*init.StoreBatchCoprUsage) + require.Equal(t, diff.BatchedQuery, int64(1)) + require.Equal(t, diff.BatchedQueryTask, int64(0)) + require.Equal(t, diff.BatchedCount, int64(0)) + require.Equal(t, diff.BatchedFallbackCount, int64(0)) + + tk.MustExec("insert into tele_batch_t values(1, 1, 1), (2, 2, 2), (3, 3, 3), (5, 5, 5), (7, 7, 7)") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/store/copr/setRangesPerTask", "return(1)")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/store/copr/setRangesPerTask")) + }() + tk.MustQuery("select * from tele_batch_t force index(i) where k between 1 and 3 and k % 2 != 0").Sort(). + Check(testkit.Rows("1 1 1", "3 3 3")) + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, usage.StoreBatchCoprUsage.BatchSize, 4) + diff = usage.StoreBatchCoprUsage.Sub(*init.StoreBatchCoprUsage) + require.Equal(t, diff.BatchedQuery, int64(2)) + require.Equal(t, diff.BatchedQueryTask, int64(2)) + require.Equal(t, diff.BatchedCount, int64(1)) + require.Equal(t, diff.BatchedFallbackCount, int64(0)) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/store/copr/batchCopRegionError", "return")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/store/copr/batchCopRegionError")) + }() + tk.MustQuery("select * from tele_batch_t force index(i) where k between 1 and 3 and k % 2 != 0").Sort(). + Check(testkit.Rows("1 1 1", "3 3 3")) + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, usage.StoreBatchCoprUsage.BatchSize, 4) + diff = usage.StoreBatchCoprUsage.Sub(*init.StoreBatchCoprUsage) + require.Equal(t, diff.BatchedQuery, int64(3)) + require.Equal(t, diff.BatchedQueryTask, int64(4)) + require.Equal(t, diff.BatchedCount, int64(1)) + require.Equal(t, diff.BatchedFallbackCount, int64(1)) + + tk.MustExec("set global tidb_store_batch_size = 0") + tk.MustExec("set session tidb_store_batch_size = 0") + tk.MustQuery("select * from tele_batch_t force index(i) where k between 1 and 3 and k % 2 != 0").Sort(). + Check(testkit.Rows("1 1 1", "3 3 3")) + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, usage.StoreBatchCoprUsage.BatchSize, 0) + diff = usage.StoreBatchCoprUsage.Sub(*init.StoreBatchCoprUsage) + require.Equal(t, diff.BatchedQuery, int64(3)) + require.Equal(t, diff.BatchedQueryTask, int64(4)) + require.Equal(t, diff.BatchedCount, int64(1)) + require.Equal(t, diff.BatchedFallbackCount, int64(1)) +} + +func TestAggressiveLockingUsage(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk2 := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("create table t (id int primary key, v int)") + tk.MustExec("insert into t values (1, 1), (2, 2)") + + usage, err := telemetry.GetFeatureUsage(tk2.Session()) + require.NoError(t, err) + require.Equal(t, int64(0), usage.Txn.AggressiveLockingUsageCounter.TxnAggressiveLockingUsed) + require.Equal(t, int64(0), usage.Txn.AggressiveLockingUsageCounter.TxnAggressiveLockingEffective) + + tk.MustExec("set @@tidb_pessimistic_txn_aggressive_locking = 1") + + tk.MustExec("begin pessimistic") + tk.MustExec("update t set v = v + 1 where id = 1") + usage, err = telemetry.GetFeatureUsage(tk2.Session()) + // Not counted before transaction committing. + require.NoError(t, err) + require.Equal(t, int64(0), usage.Txn.AggressiveLockingUsageCounter.TxnAggressiveLockingUsed) + require.Equal(t, int64(0), usage.Txn.AggressiveLockingUsageCounter.TxnAggressiveLockingEffective) + + tk.MustExec("commit") + usage, err = telemetry.GetFeatureUsage(tk2.Session()) + require.NoError(t, err) + require.Equal(t, int64(1), usage.Txn.AggressiveLockingUsageCounter.TxnAggressiveLockingUsed) + require.Equal(t, int64(0), usage.Txn.AggressiveLockingUsageCounter.TxnAggressiveLockingEffective) + + // Counted by transaction instead of by statement. + tk.MustExec("begin pessimistic") + tk.MustExec("update t set v = v + 1 where id = 1") + tk.MustExec("update t set v = v + 1 where id = 2") + tk.MustExec("commit") + usage, err = telemetry.GetFeatureUsage(tk2.Session()) + require.NoError(t, err) + require.Equal(t, int64(2), usage.Txn.AggressiveLockingUsageCounter.TxnAggressiveLockingUsed) + require.Equal(t, int64(0), usage.Txn.AggressiveLockingUsageCounter.TxnAggressiveLockingEffective) + + // Effective only when LockedWithConflict occurs. + tk3 := testkit.NewTestKit(t, store) + tk3.MustExec("use test") + tk.MustExec("begin pessimistic") + tk3.MustExec("begin pessimistic") + tk3.MustExec("update t set v = v + 1 where id = 1") + ch := make(chan interface{}) + go func() { + tk.MustExec("update t set v = v + 1 where id = 1") + ch <- nil + }() + select { + case <-ch: + require.Fail(t, "expected statement to be blocked but finished") + case <-time.After(time.Millisecond * 100): + } + tk3.MustExec("commit") + select { + case <-time.After(time.Second): + require.Fail(t, "expected statement to be resumed but still blocked") + case <-ch: + } + tk.MustExec("commit") + usage, err = telemetry.GetFeatureUsage(tk2.Session()) + require.NoError(t, err) + require.Equal(t, int64(3), usage.Txn.AggressiveLockingUsageCounter.TxnAggressiveLockingUsed) + require.Equal(t, int64(1), usage.Txn.AggressiveLockingUsageCounter.TxnAggressiveLockingEffective) +} diff --git a/telemetry/data_slow_query.go b/telemetry/data_slow_query.go index 791b5f9b51bbe..b686db8d41105 100644 --- a/telemetry/data_slow_query.go +++ b/telemetry/data_slow_query.go @@ -64,7 +64,7 @@ var ( func getSlowQueryStats() (*slowQueryStats, error) { slowQueryBucket, err := getSlowQueryBucket() if err != nil { - logutil.BgLogger().Info(err.Error()) + logutil.BgLogger().Info("Failed to get Slow Query Stats", zap.Error(err)) return nil, err } diff --git a/telemetry/data_window.go b/telemetry/data_window.go index b0be7b841cbea..49a4037591b16 100644 --- a/telemetry/data_window.go +++ b/telemetry/data_window.go @@ -25,6 +25,7 @@ import ( promv1 "github.com/prometheus/client_golang/api/prometheus/v1" pmodel "github.com/prometheus/common/model" "go.uber.org/atomic" + "go.uber.org/zap" ) var ( @@ -253,7 +254,8 @@ func RotateSubWindow() { err := readSQLMetric(time.Now(), &thisSubWindow.SQLUsage) if err != nil { - logutil.BgLogger().Info("Error exists when getting the SQL Metric.") + logutil.BgLogger().Info("Error exists when getting the SQL Metric.", + zap.Error(err)) } thisSubWindow.SQLUsage.SQLTotal = getSQLSum(&thisSubWindow.SQLUsage.SQLType) diff --git a/telemetry/data_window_test.go b/telemetry/data_window_test.go index 94146863ea9bd..0bd171caf3775 100644 --- a/telemetry/data_window_test.go +++ b/telemetry/data_window_test.go @@ -94,9 +94,11 @@ func TestTiflashUsage(t *testing.T) { require.Equal(t, telemetry.CurrentTiflashTableScanCount.String(), "0") require.Equal(t, telemetry.CurrentTiflashTableScanWithFastScanCount.String(), "0") - tk.MustExec("set session tidb_isolation_read_engines='tiflash';select count(*) from t") + tk.MustExec("set session tidb_isolation_read_engines='tiflash';") + tk.MustQuery(`select count(*) from t`) tk.MustExec(`set @@session.tiflash_fastscan=ON`) - tk.MustExec(`set session tidb_isolation_read_engines="tiflash";select count(*) from test.t`) + tk.MustExec(`set session tidb_isolation_read_engines="tiflash";`) + tk.MustQuery(`select count(*) from test.t`) tk.Session().Close() require.Equal(t, telemetry.CurrentTiflashTableScanCount.String(), "2") diff --git a/telemetry/main_test.go b/telemetry/main_test.go index 0e8d98b2a4f6c..8478a3ead4084 100644 --- a/telemetry/main_test.go +++ b/telemetry/main_test.go @@ -41,6 +41,8 @@ func TestMain(m *testing.M) { goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + goleak.IgnoreTopFunction("net/http.(*persistConn).writeLoop"), + goleak.IgnoreTopFunction("internal/poll.runtime_pollWait"), } goleak.VerifyTestMain(m, opts...) diff --git a/telemetry/ttl.go b/telemetry/ttl.go new file mode 100644 index 0000000000000..b9c8c0210fb0c --- /dev/null +++ b/telemetry/ttl.go @@ -0,0 +1,214 @@ +// Copyright 2023 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 telemetry + +import ( + "context" + "fmt" + "math" + "time" + + "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/sqlexec" + "go.uber.org/zap" +) + +const ( + // selectDeletedRowsOneDaySQL selects the deleted rows for each table of last day + selectDeletedRowsOneDaySQL = `SELECT parent_table_id, CAST(SUM(deleted_rows) AS SIGNED) + FROM + mysql.tidb_ttl_job_history + WHERE + create_time >= CURDATE() - INTERVAL 7 DAY + AND finish_time >= CURDATE() - INTERVAL 1 DAY + AND finish_time < CURDATE() + GROUP BY parent_table_id;` + // selectDelaySQL selects the deletion delay in minute for each table at the end of last day + selectDelaySQL = `SELECT + parent_table_id, TIMESTAMPDIFF(MINUTE, MIN(tm), CURDATE()) AS ttl_minutes + FROM + ( + SELECT + table_id, + parent_table_id, + MAX(ttl_expire) AS tm + FROM + mysql.tidb_ttl_job_history + WHERE + create_time > CURDATE() - INTERVAL 7 DAY + AND finish_time < CURDATE() + AND status = 'finished' + AND JSON_VALID(summary_text) + AND summary_text ->> "$.scan_task_err" IS NULL + GROUP BY + table_id, parent_table_id + ) t + GROUP BY parent_table_id;` +) + +type ttlHistItem struct { + // LessThan is not null means it collects the count of items with condition [prevLessThan, LessThan) + // Notice that it's type is an int64 pointer to forbid serializing it when it is not set. + LessThan *int64 `json:"less_than,omitempty"` + // LessThanMax is true means the condition is [prevLessThan, MAX) + LessThanMax bool `json:"less_than_max,omitempty"` + // Count is the count of items that fit the condition + Count int64 `json:"count"` +} + +type ttlUsageCounter struct { + TTLJobEnabled bool `json:"ttl_job_enabled"` + TTLTables int64 `json:"ttl_table_count"` + TTLJobEnabledTables int64 `json:"ttl_job_enabled_tables"` + TTLHistDate string `json:"ttl_hist_date"` + TableHistWithDeleteRows []*ttlHistItem `json:"table_hist_with_delete_rows"` + TableHistWithDelayTime []*ttlHistItem `json:"table_hist_with_delay_time"` +} + +func int64Pointer(val int64) *int64 { + v := val + return &v +} + +func (c *ttlUsageCounter) UpdateTableHistWithDeleteRows(rows int64) { + for _, item := range c.TableHistWithDeleteRows { + if item.LessThanMax || rows < *item.LessThan { + item.Count++ + return + } + } +} + +func (c *ttlUsageCounter) UpdateTableHistWithDelayTime(tblCnt int, hours int64) { + for _, item := range c.TableHistWithDelayTime { + if item.LessThanMax || hours < *item.LessThan { + item.Count += int64(tblCnt) + return + } + } +} + +func getTTLUsageInfo(ctx context.Context, sctx sessionctx.Context) (counter *ttlUsageCounter) { + counter = &ttlUsageCounter{ + TTLJobEnabled: variable.EnableTTLJob.Load(), + TTLHistDate: time.Now().Add(-24 * time.Hour).Format("2006-01-02"), + TableHistWithDeleteRows: []*ttlHistItem{ + { + LessThan: int64Pointer(10 * 1000), + }, + { + LessThan: int64Pointer(100 * 1000), + }, + { + LessThan: int64Pointer(1000 * 1000), + }, + { + LessThan: int64Pointer(10000 * 1000), + }, + { + LessThanMax: true, + }, + }, + TableHistWithDelayTime: []*ttlHistItem{ + { + LessThan: int64Pointer(1), + }, + { + LessThan: int64Pointer(6), + }, + { + LessThan: int64Pointer(24), + }, + { + LessThan: int64Pointer(72), + }, + { + LessThanMax: true, + }, + }, + } + + is, ok := sctx.GetDomainInfoSchema().(infoschema.InfoSchema) + if !ok { + // it should never happen + logutil.BgLogger().Error(fmt.Sprintf("GetDomainInfoSchema returns a invalid type: %T", is)) + return + } + + ttlTables := make(map[int64]*model.TableInfo) + for _, db := range is.AllSchemas() { + for _, tbl := range is.SchemaTables(db.Name) { + tblInfo := tbl.Meta() + if tblInfo.State != model.StatePublic || tblInfo.TTLInfo == nil { + continue + } + + counter.TTLTables++ + if tblInfo.TTLInfo.Enable { + counter.TTLJobEnabledTables++ + } + ttlTables[tblInfo.ID] = tblInfo + } + } + + exec := sctx.(sqlexec.RestrictedSQLExecutor) + rows, _, err := exec.ExecRestrictedSQL(ctx, nil, selectDeletedRowsOneDaySQL) + if err != nil { + logutil.BgLogger().Error("exec sql error", zap.String("SQL", selectDeletedRowsOneDaySQL), zap.Error(err)) + } else { + for _, row := range rows { + counter.UpdateTableHistWithDeleteRows(row.GetInt64(1)) + } + } + + rows, _, err = exec.ExecRestrictedSQL(ctx, nil, selectDelaySQL) + if err != nil { + logutil.BgLogger().Error("exec sql error", zap.String("SQL", selectDelaySQL), zap.Error(err)) + } else { + noHistoryTables := len(ttlTables) + for _, row := range rows { + tblID := row.GetInt64(0) + tbl, ok := ttlTables[tblID] + if !ok { + // table not exist, maybe truncated or deleted + continue + } + noHistoryTables-- + + evalIntervalSQL := fmt.Sprintf( + "SELECT TIMESTAMPDIFF(HOUR, CURDATE() - INTERVAL %d MINUTE, CURDATE() - INTERVAL %s %s)", + row.GetInt64(1), tbl.TTLInfo.IntervalExprStr, ast.TimeUnitType(tbl.TTLInfo.IntervalTimeUnit).String(), + ) + + innerRows, _, err := exec.ExecRestrictedSQL(ctx, nil, evalIntervalSQL) + if err != nil || len(innerRows) == 0 { + logutil.BgLogger().Error("exec sql error or empty rows returned", zap.String("SQL", evalIntervalSQL), zap.Error(err)) + continue + } + + hours := innerRows[0].GetInt64(0) + counter.UpdateTableHistWithDelayTime(1, hours) + } + + // When no history found for a table, use max delay + counter.UpdateTableHistWithDelayTime(noHistoryTables, math.MaxInt64) + } + return +} diff --git a/testkit/BUILD.bazel b/testkit/BUILD.bazel index 39cedb2ce0b53..3e33b8bd3f555 100644 --- a/testkit/BUILD.bazel +++ b/testkit/BUILD.bazel @@ -21,6 +21,7 @@ go_library( "//parser/ast", "//parser/terror", "//planner/core", + "//resourcemanager", "//session", "//session/txninfo", "//sessionctx/variable", @@ -30,6 +31,8 @@ go_library( "//util/breakpoint", "//util/chunk", "//util/gctuner", + "//util/intest", + "//util/mathutil", "//util/sqlexec", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", diff --git a/testkit/asynctestkit.go b/testkit/asynctestkit.go index aa0f3fcadf8ef..a875088c82abf 100644 --- a/testkit/asynctestkit.go +++ b/testkit/asynctestkit.go @@ -183,6 +183,21 @@ func (tk *AsyncTestKit) MustExec(ctx context.Context, sql string, args ...interf } } +// MustGetErrMsg executes a sql statement and assert its error message. +func (tk *AsyncTestKit) MustGetErrMsg(ctx context.Context, sql string, errStr string) { + err := tk.ExecToErr(ctx, sql) + tk.require.EqualError(err, errStr) +} + +// ExecToErr executes a sql statement and discard results. +func (tk *AsyncTestKit) ExecToErr(ctx context.Context, sql string, args ...interface{}) error { + res, err := tk.Exec(ctx, sql, args...) + if res != nil { + tk.require.NoError(res.Close()) + } + return err +} + // MustQuery query the statements and returns result rows. // If expected result is set it asserts the query result equals expected result. func (tk *AsyncTestKit) MustQuery(ctx context.Context, sql string, args ...interface{}) *Result { diff --git a/testkit/mocksessionmanager.go b/testkit/mocksessionmanager.go index 403c917066d34..550ff69132d91 100644 --- a/testkit/mocksessionmanager.go +++ b/testkit/mocksessionmanager.go @@ -18,6 +18,7 @@ import ( "crypto/tls" "sync" + "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" @@ -31,6 +32,7 @@ type MockSessionManager struct { PSMu sync.RWMutex SerID uint64 TxnInfo []*txninfo.TxnInfo + Dom *domain.Domain conn map[uint64]session.Session mu sync.Mutex } @@ -68,6 +70,11 @@ func (msm *MockSessionManager) ShowProcessList() map[uint64]*util.ProcessInfo { ret[connID] = pi.ShowProcess() } msm.mu.Unlock() + if msm.Dom != nil { + for connID, pi := range msm.Dom.SysProcTracker().GetSysProcessList() { + ret[connID] = pi + } + } return ret } @@ -85,6 +92,11 @@ func (msm *MockSessionManager) GetProcessInfo(id uint64) (*util.ProcessInfo, boo if sess := msm.conn[id]; sess != nil { return sess.ShowProcess(), true } + if msm.Dom != nil { + if pinfo, ok := msm.Dom.SysProcTracker().GetSysProcessList()[id]; ok { + return pinfo, true + } + } return &util.ProcessInfo{}, false } @@ -133,7 +145,7 @@ func (msm *MockSessionManager) KillNonFlashbackClusterConn() { } } -// CheckOldRunningTxn is to get all startTS of every transactions running in the current internal sessions +// CheckOldRunningTxn implement SessionManager interface. func (msm *MockSessionManager) CheckOldRunningTxn(job2ver map[int64]int64, job2ids map[int64]string) { msm.mu.Lock() for _, se := range msm.conn { @@ -141,3 +153,25 @@ func (msm *MockSessionManager) CheckOldRunningTxn(job2ver map[int64]int64, job2i } msm.mu.Unlock() } + +// GetMinStartTS implements SessionManager interface. +func (msm *MockSessionManager) GetMinStartTS(lowerBound uint64) (ts uint64) { + msm.PSMu.RLock() + defer msm.PSMu.RUnlock() + if len(msm.PS) > 0 { + for _, pi := range msm.PS { + if thisTS := pi.GetMinStartTS(lowerBound); thisTS > lowerBound && (thisTS < ts || ts == 0) { + ts = thisTS + } + } + return + } + msm.mu.Lock() + defer msm.mu.Unlock() + for _, s := range msm.conn { + if thisTS := s.ShowProcess().GetMinStartTS(lowerBound); thisTS > lowerBound && (thisTS < ts || ts == 0) { + ts = thisTS + } + } + return +} diff --git a/testkit/mockstore.go b/testkit/mockstore.go index 525381dd9c148..c0cfb83a53149 100644 --- a/testkit/mockstore.go +++ b/testkit/mockstore.go @@ -24,6 +24,7 @@ import ( "github.com/pingcap/tidb/ddl/schematracker" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/resourcemanager" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store/driver" "github.com/pingcap/tidb/store/mockstore" @@ -80,6 +81,7 @@ func bootstrap(t testing.TB, store kv.Storage, lease time.Duration) *domain.Doma session.SetSchemaLease(lease) session.DisableStats4Test() domain.DisablePlanReplayerBackgroundJob4Test() + domain.DisableDumpHistoricalStats4Test() dom, err := session.BootstrapSession(store) require.NoError(t, err) @@ -90,6 +92,7 @@ func bootstrap(t testing.TB, store kv.Storage, lease time.Duration) *domain.Doma err := store.Close() require.NoError(t, err) view.Stop() + resourcemanager.InstanceResourceManager.Reset() }) return dom } diff --git a/testkit/result.go b/testkit/result.go index 0f7ad0ce53cbc..210d32d4c57b9 100644 --- a/testkit/result.go +++ b/testkit/result.go @@ -49,6 +49,11 @@ func (res *Result) Check(expected [][]interface{}) { res.require.Equal(needBuff.String(), resBuff.String(), res.comment) } +// AddComment adds the extra comment for the Result's output. +func (res *Result) AddComment(c string) { + res.comment += "\n" + c +} + // CheckWithFunc asserts the result match the expected results in the way `f` specifies. func (res *Result) CheckWithFunc(expected [][]interface{}, f func([]string, []interface{}) bool) { res.require.Equal(len(res.rows), len(expected), res.comment+"\nResult length mismatch") diff --git a/testkit/testkit.go b/testkit/testkit.go index 25479bc862d96..75355d075fbe1 100644 --- a/testkit/testkit.go +++ b/testkit/testkit.go @@ -19,6 +19,7 @@ package testkit import ( "context" "fmt" + "runtime" "strings" "sync" "testing" @@ -32,6 +33,8 @@ import ( "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/intest" + "github.com/pingcap/tidb/util/mathutil" "github.com/pingcap/tidb/util/sqlexec" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -54,6 +57,8 @@ type TestKit struct { // NewTestKit returns a new *TestKit. func NewTestKit(t testing.TB, store kv.Storage) *TestKit { + require.True(t, intest.InTest, "you should add --tags=intest when to test") + runtime.GOMAXPROCS(mathutil.Min(16, runtime.GOMAXPROCS(0))) tk := &TestKit{ require: require.New(t), assert: assert.New(t), @@ -231,6 +236,29 @@ func (tk *TestKit) HasPlan(sql string, plan string, args ...interface{}) bool { return false } +// HasTiFlashPlan checks if the result execution plan contains TiFlash plan. +func (tk *TestKit) HasTiFlashPlan(sql string, args ...interface{}) bool { + rs := tk.MustQuery("explain "+sql, args...) + for i := range rs.rows { + if strings.Contains(rs.rows[i][2], "tiflash") { + return true + } + } + return false +} + +// HasPlanForLastExecution checks if the execution plan of the last execution contains specific plan. +func (tk *TestKit) HasPlanForLastExecution(plan string) bool { + connID := tk.session.GetSessionVars().ConnectionID + rs := tk.MustQuery(fmt.Sprintf("explain for connection %d", connID)) + for i := range rs.rows { + if strings.Contains(rs.rows[i][0], plan) { + return true + } + } + return false +} + // HasKeywordInOperatorInfo checks if the result execution plan contains specific keyword in the operator info. func (tk *TestKit) HasKeywordInOperatorInfo(sql string, keyword string, args ...interface{}) bool { rs := tk.MustQuery("explain "+sql, args...) diff --git a/testkit/testutil/require.go b/testkit/testutil/require.go index 90b157fcb7591..09e8e871312ae 100644 --- a/testkit/testutil/require.go +++ b/testkit/testutil/require.go @@ -17,6 +17,7 @@ package testutil import ( + "math/rand" "testing" "github.com/pingcap/tidb/kv" @@ -75,3 +76,14 @@ func CompareUnorderedStringSlice(a []string, b []string) bool { } return len(m) == 0 } + +var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") + +// RandStringRunes generate random string of length n. +func RandStringRunes(n int) string { + b := make([]rune, n) + for i := range b { + b[i] = letterRunes[rand.Intn(len(letterRunes))] + } + return string(b) +} diff --git a/tests/realtikvtest/addindextest/BUILD.bazel b/tests/realtikvtest/addindextest/BUILD.bazel index 1a9951fd86a51..573fb1f531abc 100644 --- a/tests/realtikvtest/addindextest/BUILD.bazel +++ b/tests/realtikvtest/addindextest/BUILD.bazel @@ -33,10 +33,19 @@ go_test( ], embed = [":addindextest"], deps = [ + "//br/pkg/lightning/backend/local", "//config", + "//ddl", "//ddl/ingest", + "//ddl/testutil", + "//domain", + "//errno", + "//parser/model", + "//sessionctx/variable", "//testkit", "//tests/realtikvtest", + "@com_github_pingcap_failpoint//:failpoint", + "@com_github_stretchr_testify//assert", "@com_github_stretchr_testify//require", ], ) diff --git a/tests/realtikvtest/addindextest/add_index_test.go b/tests/realtikvtest/addindextest/add_index_test.go index 7dd4919570594..1c1403f66a922 100644 --- a/tests/realtikvtest/addindextest/add_index_test.go +++ b/tests/realtikvtest/addindextest/add_index_test.go @@ -100,3 +100,29 @@ func TestCreateMultiColsIndex(t *testing.T) { ctx := initTest(t) testTwoColsFrame(ctx, coliIDs, coljIDs, addIndexMultiCols) } + +func TestAddForeignKeyWithAutoCreateIndex(t *testing.T) { + store := realtikvtest.CreateMockStoreAndSetup(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("drop database if exists fk_index;") + tk.MustExec("create database fk_index;") + tk.MustExec("use fk_index;") + tk.MustExec(`set global tidb_ddl_enable_fast_reorg=1;`) + tk.MustExec("create table employee (id bigint auto_increment key, pid bigint)") + tk.MustExec("insert into employee (id) values (1),(2),(3),(4),(5),(6),(7),(8)") + for i := 0; i < 14; i++ { + tk.MustExec("insert into employee (pid) select pid from employee") + } + tk.MustExec("update employee set pid=id-1 where id>1") + tk.MustQuery("select count(*) from employee").Check(testkit.Rows("131072")) + tk.MustExec("alter table employee add foreign key fk_1(pid) references employee(id)") + tk.MustExec("alter table employee drop foreign key fk_1") + tk.MustExec("alter table employee drop index fk_1") + tk.MustExec("update employee set pid=0 where id=1") + tk.MustGetErrMsg("alter table employee add foreign key fk_1(pid) references employee(id)", + "[ddl:1452]Cannot add or update a child row: a foreign key constraint fails (`fk_index`.`employee`, CONSTRAINT `fk_1` FOREIGN KEY (`pid`) REFERENCES `employee` (`id`))") + tk.MustExec("update employee set pid=null where id=1") + tk.MustExec("insert into employee (pid) select pid from employee") + tk.MustExec("update employee set pid=id-1 where id>1 and pid is null") + tk.MustExec("alter table employee add foreign key fk_1(pid) references employee(id)") +} diff --git a/tests/realtikvtest/addindextest/integration_test.go b/tests/realtikvtest/addindextest/integration_test.go index 19c8977242b3b..e5c147d3337a3 100644 --- a/tests/realtikvtest/addindextest/integration_test.go +++ b/tests/realtikvtest/addindextest/integration_test.go @@ -18,11 +18,21 @@ import ( "fmt" "strings" "sync" + "sync/atomic" "testing" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/br/pkg/lightning/backend/local" + "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/ddl/ingest" + "github.com/pingcap/tidb/ddl/testutil" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/tests/realtikvtest" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -34,6 +44,8 @@ func TestAddIndexIngestMemoryUsage(t *testing.T) { tk.MustExec("use addindexlit;") tk.MustExec(`set global tidb_ddl_enable_fast_reorg=on;`) + local.RunInTest = true + tk.MustExec("create table t (a int, b int, c int);") var sb strings.Builder sb.WriteString("insert into t values ") @@ -51,6 +63,7 @@ func TestAddIndexIngestMemoryUsage(t *testing.T) { tk.MustExec("alter table t add unique index idx1(b);") tk.MustExec("admin check table t;") require.Equal(t, int64(0), ingest.LitMemRoot.CurrentUsage()) + require.NoError(t, local.LastAlloc.CheckRefCnt()) } func TestAddIndexIngestLimitOneBackend(t *testing.T) { @@ -97,3 +110,355 @@ func TestAddIndexIngestLimitOneBackend(t *testing.T) { require.True(t, strings.Contains(rows[0][3].(string) /* job_type */, "ingest")) require.Equal(t, rows[0][7].(string) /* row_count */, "3") } + +func TestAddIndexIngestWriterCountOnPartitionTable(t *testing.T) { + store := realtikvtest.CreateMockStoreAndSetup(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("drop database if exists addindexlit;") + tk.MustExec("create database addindexlit;") + tk.MustExec("use addindexlit;") + tk.MustExec(`set global tidb_ddl_enable_fast_reorg=on;`) + + tk.MustExec("create table t (a int primary key) partition by hash(a) partitions 32;") + var sb strings.Builder + sb.WriteString("insert into t values ") + for i := 0; i < 100; i++ { + sb.WriteString(fmt.Sprintf("(%d)", i)) + if i != 99 { + sb.WriteString(",") + } + } + tk.MustExec(sb.String()) + tk.MustExec("alter table t add index idx(a);") + rows := tk.MustQuery("admin show ddl jobs 1;").Rows() + require.Len(t, rows, 1) + jobTp := rows[0][3].(string) + require.True(t, strings.Contains(jobTp, "ingest"), jobTp) +} + +func TestIngestMVIndexOnPartitionTable(t *testing.T) { + store := realtikvtest.CreateMockStoreAndSetup(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("drop database if exists addindexlit;") + tk.MustExec("create database addindexlit;") + tk.MustExec("use addindexlit;") + tk.MustExec(`set global tidb_ddl_enable_fast_reorg=on;`) + + tk.MustExec("create table t (pk int primary key, a json) partition by hash(pk) partitions 32;") + var sb strings.Builder + sb.WriteString("insert into t values ") + for i := 0; i < 10240; i++ { + sb.WriteString(fmt.Sprintf("(%d, '[%d, %d, %d]')", i, i+1, i+2, i+3)) + if i != 10240-1 { + sb.WriteString(",") + } + } + tk.MustExec(sb.String()) + tk.MustExec("alter table t add index idx((cast(a as signed array)));") + rows := tk.MustQuery("admin show ddl jobs 1;").Rows() + require.Len(t, rows, 1) + jobTp := rows[0][3].(string) + require.True(t, strings.Contains(jobTp, "ingest"), jobTp) + tk.MustExec("admin check table t") + + tk.MustExec("drop table t") + tk.MustExec("create table t (pk int primary key, a json) partition by hash(pk) partitions 32;") + tk.MustExec(sb.String()) + var wg sync.WaitGroup + wg.Add(1) + go func() { + n := 10240 + internalTK := testkit.NewTestKit(t, store) + internalTK.MustExec("use addindexlit;") + + for i := 0; i < 1024; i++ { + internalTK.MustExec(fmt.Sprintf("insert into t values (%d, '[%d, %d, %d]')", n, n, n+1, n+2)) + internalTK.MustExec(fmt.Sprintf("delete from t where pk = %d", n-10)) + internalTK.MustExec(fmt.Sprintf("update t set a = '[%d, %d, %d]' where pk = %d", n-3, n-2, n+1000, n-5)) + n++ + } + wg.Done() + }() + tk.MustExec("alter table t add index idx((cast(a as signed array)));") + wg.Wait() + tk.MustExec("admin check table t") +} + +func TestAddIndexIngestAdjustBackfillWorker(t *testing.T) { + if variable.DDLEnableDistributeReorg.Load() { + t.Skip("dist reorg didn't support checkBackfillWorkerNum, skip this test") + } + store := realtikvtest.CreateMockStoreAndSetup(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("drop database if exists addindexlit;") + tk.MustExec("create database addindexlit;") + tk.MustExec("use addindexlit;") + tk.MustExec(`set global tidb_ddl_enable_fast_reorg=on;`) + tk.MustExec("set @@global.tidb_ddl_reorg_worker_cnt = 1;") + tk.MustExec("create table t (a int primary key);") + var sb strings.Builder + sb.WriteString("insert into t values ") + for i := 0; i < 20; i++ { + sb.WriteString(fmt.Sprintf("(%d000)", i)) + if i != 19 { + sb.WriteString(",") + } + } + tk.MustExec(sb.String()) + tk.MustQuery("split table t between (0) and (20000) regions 20;").Check(testkit.Rows("19 1")) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/checkBackfillWorkerNum", `return(true)`)) + done := make(chan error, 1) + atomic.StoreInt32(&ddl.TestCheckWorkerNumber, 1) + testutil.SessionExecInGoroutine(store, "addindexlit", "alter table t add index idx(a);", done) + checkNum := 0 + + running := true + cnt := [3]int{1, 2, 4} + offset := 0 + for running { + select { + case err := <-done: + require.NoError(t, err) + running = false + case wg := <-ddl.TestCheckWorkerNumCh: + offset = (offset + 1) % 3 + tk.MustExec(fmt.Sprintf("set @@global.tidb_ddl_reorg_worker_cnt=%d", cnt[offset])) + atomic.StoreInt32(&ddl.TestCheckWorkerNumber, int32(cnt[offset])/2+1) + checkNum++ + wg.Done() + } + } + + require.Greater(t, checkNum, 5) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/checkBackfillWorkerNum")) + tk.MustExec("admin check table t;") + rows := tk.MustQuery("admin show ddl jobs 1;").Rows() + require.Len(t, rows, 1) + jobTp := rows[0][3].(string) + require.True(t, strings.Contains(jobTp, "ingest"), jobTp) + tk.MustExec("set @@global.tidb_ddl_reorg_worker_cnt = 4;") +} + +func TestAddIndexIngestAdjustBackfillWorkerCountFail(t *testing.T) { + store := realtikvtest.CreateMockStoreAndSetup(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("drop database if exists addindexlit;") + tk.MustExec("create database addindexlit;") + tk.MustExec("use addindexlit;") + tk.MustExec(`set global tidb_ddl_enable_fast_reorg=on;`) + ingest.ImporterRangeConcurrencyForTest = &atomic.Int32{} + ingest.ImporterRangeConcurrencyForTest.Store(2) + tk.MustExec("set @@global.tidb_ddl_reorg_worker_cnt = 20;") + tk.MustExec("create table t (a int primary key);") + var sb strings.Builder + sb.WriteString("insert into t values ") + for i := 0; i < 20; i++ { + sb.WriteString(fmt.Sprintf("(%d000)", i)) + if i != 19 { + sb.WriteString(",") + } + } + tk.MustExec(sb.String()) + tk.MustQuery("split table t between (0) and (20000) regions 20;").Check(testkit.Rows("19 1")) + tk.MustExec("alter table t add index idx(a);") + rows := tk.MustQuery("admin show ddl jobs 1;").Rows() + require.Len(t, rows, 1) + jobTp := rows[0][3].(string) + require.True(t, strings.Contains(jobTp, "ingest"), jobTp) + tk.MustExec("set @@global.tidb_ddl_reorg_worker_cnt = 4;") + ingest.ImporterRangeConcurrencyForTest = nil +} + +func TestAddIndexIngestGeneratedColumns(t *testing.T) { + store := realtikvtest.CreateMockStoreAndSetup(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("drop database if exists addindexlit;") + tk.MustExec("create database addindexlit;") + tk.MustExec("use addindexlit;") + tk.MustExec(`set global tidb_ddl_enable_fast_reorg=on;`) + assertLastNDDLUseIngest := func(n int) { + tk.MustExec("admin check table t;") + rows := tk.MustQuery(fmt.Sprintf("admin show ddl jobs %d;", n)).Rows() + require.Len(t, rows, n) + for i := 0; i < n; i++ { + jobTp := rows[i][3].(string) + require.True(t, strings.Contains(jobTp, "ingest"), jobTp) + } + } + tk.MustExec("create table t (a int, b int, c int as (b+10), d int as (b+c), primary key (a) clustered);") + tk.MustExec("insert into t (a, b) values (1, 1), (2, 2), (3, 3);") + tk.MustExec("alter table t add index idx(c);") + tk.MustExec("alter table t add index idx1(c, a);") + tk.MustExec("alter table t add index idx2(a);") + tk.MustExec("alter table t add index idx3(d);") + tk.MustExec("alter table t add index idx4(d, c);") + tk.MustQuery("select * from t;").Check(testkit.Rows("1 1 11 12", "2 2 12 14", "3 3 13 16")) + assertLastNDDLUseIngest(5) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b char(10), c char(10) as (concat(b, 'x')), d int, e char(20) as (c));") + tk.MustExec("insert into t (a, b, d) values (1, '1', 1), (2, '2', 2), (3, '3', 3);") + tk.MustExec("alter table t add index idx(c);") + tk.MustExec("alter table t add index idx1(a, c);") + tk.MustExec("alter table t add index idx2(c(7));") + tk.MustExec("alter table t add index idx3(e(5));") + tk.MustQuery("select * from t;").Check(testkit.Rows("1 1 1x 1 1x", "2 2 2x 2 2x", "3 3 3x 3 3x")) + assertLastNDDLUseIngest(4) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b char(10), c tinyint, d int as (a + c), e bigint as (d - a), primary key(b, a) clustered);") + tk.MustExec("insert into t (a, b, c) values (1, '1', 1), (2, '2', 2), (3, '3', 3);") + tk.MustExec("alter table t add index idx(d);") + tk.MustExec("alter table t add index idx1(b(2), d);") + tk.MustExec("alter table t add index idx2(d, c);") + tk.MustExec("alter table t add index idx3(e);") + tk.MustQuery("select * from t;").Check(testkit.Rows("1 1 1 2 1", "2 2 2 4 2", "3 3 3 6 3")) + assertLastNDDLUseIngest(4) +} + +func TestAddIndexIngestEmptyTable(t *testing.T) { + store := realtikvtest.CreateMockStoreAndSetup(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("drop database if exists addindexlit;") + tk.MustExec("create database addindexlit;") + tk.MustExec("use addindexlit;") + tk.MustExec("create table t (a int);") + tk.MustExec(`set global tidb_ddl_enable_fast_reorg=on;`) + tk.MustExec("alter table t add index idx(a);") + + rows := tk.MustQuery("admin show ddl jobs 1;").Rows() + require.Len(t, rows, 1) + jobTp := rows[0][3].(string) + require.True(t, strings.Contains(jobTp, "ingest"), jobTp) +} + +func TestAddIndexIngestRestoredData(t *testing.T) { + store := realtikvtest.CreateMockStoreAndSetup(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("drop database if exists addindexlit;") + tk.MustExec("create database addindexlit;") + tk.MustExec("use addindexlit;") + tk.MustExec(`set global tidb_ddl_enable_fast_reorg=on;`) + + tk.MustExec(` + CREATE TABLE tbl_5 ( + col_21 time DEFAULT '04:48:17', + col_22 varchar(403) COLLATE utf8_unicode_ci DEFAULT NULL, + col_23 year(4) NOT NULL, + col_24 char(182) CHARACTER SET gbk COLLATE gbk_chinese_ci NOT NULL, + col_25 set('Alice','Bob','Charlie','David') COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (col_24(3)) /*T![clustered_index] CLUSTERED */, + KEY idx_10 (col_22) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + `) + tk.MustExec("INSERT INTO tbl_5 VALUES ('15:33:15','&U+x1',2007,'','Bob');") + tk.MustExec("alter table tbl_5 add unique key idx_13 ( col_23 );") + tk.MustExec("admin check table tbl_5;") + rows := tk.MustQuery("admin show ddl jobs 1;").Rows() + require.Len(t, rows, 1) + jobTp := rows[0][3].(string) + require.True(t, strings.Contains(jobTp, "ingest"), jobTp) +} + +func TestAddIndexIngestPanicOnCopRead(t *testing.T) { + store := realtikvtest.CreateMockStoreAndSetup(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("drop database if exists addindexlit;") + tk.MustExec("create database addindexlit;") + tk.MustExec("use addindexlit;") + tk.MustExec(`set global tidb_ddl_enable_fast_reorg=on;`) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/MockCopSenderPanic", "return(true)")) + tk.MustExec("create table t (a int, b int, c int, d int, primary key (a) clustered);") + tk.MustExec("insert into t (a, b, c, d) values (1, 1, 1, 1), (2, 2, 2, 2), (3, 3, 3, 3);") + tk.MustExec("alter table t add index idx(b);") + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/MockCopSenderPanic")) + rows := tk.MustQuery("admin show ddl jobs 1;").Rows() + require.Len(t, rows, 1) + jobTp := rows[0][3].(string) + // Fallback to txn-merge process. + require.True(t, strings.Contains(jobTp, "txn-merge"), jobTp) +} + +func TestAddIndexIngestUniqueKey(t *testing.T) { + store := realtikvtest.CreateMockStoreAndSetup(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("drop database if exists addindexlit;") + tk.MustExec("create database addindexlit;") + tk.MustExec("use addindexlit;") + tk.MustExec(`set global tidb_ddl_enable_fast_reorg=on;`) + + tk.MustExec("create table t (a int primary key, b int);") + tk.MustExec("insert into t values (1, 1), (10000, 1);") + tk.MustExec("split table t by (5000);") + tk.MustGetErrMsg("alter table t add unique index idx(b);", "[kv:1062]Duplicate entry '1' for key 't.idx'") + + tk.MustExec("drop table t;") + tk.MustExec("create table t (a varchar(255) primary key, b int);") + tk.MustExec("insert into t values ('a', 1), ('z', 1);") + tk.MustExec("split table t by ('m');") + tk.MustGetErrMsg("alter table t add unique index idx(b);", "[kv:1062]Duplicate entry '1' for key 't.idx'") + + tk.MustExec("drop table t;") + tk.MustExec("create table t (a varchar(255) primary key, b int, c char(5));") + tk.MustExec("insert into t values ('a', 1, 'c1'), ('d', 2, 'c1'), ('x', 1, 'c2'), ('z', 1, 'c1');") + tk.MustExec("split table t by ('m');") + tk.MustGetErrMsg("alter table t add unique index idx(b, c);", "[kv:1062]Duplicate entry '1-c1' for key 't.idx'") +} + +func TestAddIndexIngestCancel(t *testing.T) { + store, dom := realtikvtest.CreateMockStoreAndDomainAndSetup(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("drop database if exists addindexlit;") + tk.MustExec("create database addindexlit;") + tk.MustExec("use addindexlit;") + tk.MustExec(`set global tidb_ddl_enable_fast_reorg=on;`) + tk.MustExec("create table t (a int, b int);") + tk.MustExec("insert into t (a, b) values (1, 1), (2, 2), (3, 3);") + defHook := dom.DDL().GetHook() + customHook := newTestCallBack(t, dom) + cancelled := false + customHook.OnJobRunBeforeExported = func(job *model.Job) { + if cancelled { + return + } + if job.Type == model.ActionAddIndex && job.SchemaState == model.StateWriteReorganization { + idx := testutil.FindIdxInfo(dom, "addindexlit", "t", "idx") + if idx == nil { + return + } + if idx.BackfillState == model.BackfillStateRunning { + tk2 := testkit.NewTestKit(t, store) + rs, err := tk2.Exec(fmt.Sprintf("admin cancel ddl jobs %d", job.ID)) + assert.NoError(t, err) + assert.NoError(t, rs.Close()) + cancelled = true + } + } + } + dom.DDL().SetHook(customHook) + tk.MustGetErrCode("alter table t add index idx(b);", errno.ErrCancelledDDLJob) + require.True(t, cancelled) + dom.DDL().SetHook(defHook) + require.Empty(t, ingest.LitBackCtxMgr.Keys()) +} + +type testCallback struct { + ddl.Callback + OnJobRunBeforeExported func(job *model.Job) +} + +func newTestCallBack(t *testing.T, dom *domain.Domain) *testCallback { + defHookFactory, err := ddl.GetCustomizedHook("default_hook") + require.NoError(t, err) + return &testCallback{ + Callback: defHookFactory(dom), + } +} + +func (c *testCallback) OnJobRunBefore(job *model.Job) { + if c.OnJobRunBeforeExported != nil { + c.OnJobRunBeforeExported(job) + } +} diff --git a/tests/realtikvtest/addindextest/main_test.go b/tests/realtikvtest/addindextest/main_test.go index 5171b56a48d1a..a308c7831a249 100644 --- a/tests/realtikvtest/addindextest/main_test.go +++ b/tests/realtikvtest/addindextest/main_test.go @@ -18,6 +18,7 @@ import ( "flag" "testing" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/tests/realtikvtest" ) @@ -26,5 +27,8 @@ import ( var FullMode = flag.Bool("full-mode", false, "whether tests run in full mode") func TestMain(m *testing.M) { + config.UpdateGlobal(func(conf *config.Config) { + conf.Store = "tikv" + }) realtikvtest.RunTestMain(m) } diff --git a/tests/realtikvtest/brietest/BUILD.bazel b/tests/realtikvtest/brietest/BUILD.bazel index 49ea32406c7d6..c3118c4d7a88a 100644 --- a/tests/realtikvtest/brietest/BUILD.bazel +++ b/tests/realtikvtest/brietest/BUILD.bazel @@ -6,25 +6,20 @@ go_test( srcs = [ "backup_restore_test.go", "binlog_test.go", - "flashback_test.go", "main_test.go", ], flaky = True, race = "on", deps = [ "//config", - "//ddl/util", "//parser/mysql", "//sessionctx/binloginfo", "//store/mockstore/mockcopr", "//testkit", "//testkit/testsetup", "//tests/realtikvtest", - "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_tipb//go-binlog", "@com_github_stretchr_testify//require", - "@com_github_tikv_client_go_v2//oracle", - "@com_github_tikv_client_go_v2//util", "@org_golang_google_grpc//:grpc", "@org_uber_go_goleak//:goleak", ], diff --git a/tests/realtikvtest/brietest/flashback_test.go b/tests/realtikvtest/brietest/flashback_test.go deleted file mode 100644 index 322359fff411a..0000000000000 --- a/tests/realtikvtest/brietest/flashback_test.go +++ /dev/null @@ -1,92 +0,0 @@ -// 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, -// 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 brietest - -import ( - "context" - "fmt" - "testing" - "time" - - "github.com/pingcap/failpoint" - ddlutil "github.com/pingcap/tidb/ddl/util" - "github.com/pingcap/tidb/testkit" - "github.com/pingcap/tidb/tests/realtikvtest" - "github.com/stretchr/testify/require" - "github.com/tikv/client-go/v2/oracle" - tikvutil "github.com/tikv/client-go/v2/util" -) - -// MockGC is used to make GC work in the test environment. -func MockGC(tk *testkit.TestKit) (string, string, string, func()) { - originGC := ddlutil.IsEmulatorGCEnable() - resetGC := func() { - if originGC { - ddlutil.EmulatorGCEnable() - } else { - ddlutil.EmulatorGCDisable() - } - } - - // disable emulator GC. - // Otherwise emulator GC will delete table record as soon as possible after execute drop table ddl. - ddlutil.EmulatorGCDisable() - timeBeforeDrop := time.Now().Add(0 - 48*60*60*time.Second).Format(tikvutil.GCTimeFormat) - timeAfterDrop := time.Now().Add(48 * 60 * 60 * time.Second).Format(tikvutil.GCTimeFormat) - safePointSQL := `INSERT HIGH_PRIORITY INTO mysql.tidb VALUES ('tikv_gc_safe_point', '%[1]s', '') - ON DUPLICATE KEY - UPDATE variable_value = '%[1]s'` - // clear GC variables first. - tk.MustExec("delete from mysql.tidb where variable_name in ( 'tikv_gc_safe_point','tikv_gc_enable' )") - return timeBeforeDrop, timeAfterDrop, safePointSQL, resetGC -} - -func TestFlashback(t *testing.T) { - if *realtikvtest.WithRealTiKV { - store := realtikvtest.CreateMockStoreAndSetup(t) - - tk := testkit.NewTestKit(t, store) - - timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk) - defer resetGC() - - tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int, index i(a))") - tk.MustExec("insert t values (1), (2), (3)") - - time.Sleep(1 * time.Second) - - ts, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) - require.NoError(t, err) - - injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second)) - require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS", - fmt.Sprintf("return(%v)", injectSafeTS))) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS", - fmt.Sprintf("return(%v)", injectSafeTS))) - - tk.MustExec("insert t values (4), (5), (6)") - tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) - - tk.MustExec("admin check table t") - require.Equal(t, tk.MustQuery("select max(a) from t").Rows()[0][0], "3") - require.Equal(t, tk.MustQuery("select max(a) from t use index(i)").Rows()[0][0], "3") - - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS")) - require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS")) - } -} diff --git a/tests/realtikvtest/flashbacktest/BUILD.bazel b/tests/realtikvtest/flashbacktest/BUILD.bazel new file mode 100644 index 0000000000000..a3d81277e6e06 --- /dev/null +++ b/tests/realtikvtest/flashbacktest/BUILD.bazel @@ -0,0 +1,28 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_test") + +go_test( + name = "flashbacktest_test", + srcs = [ + "flashback_test.go", + "main_test.go", + ], + flaky = True, + race = "on", + deps = [ + "//ddl", + "//ddl/util", + "//domain", + "//errno", + "//meta", + "//parser/model", + "//testkit", + "//testkit/testsetup", + "//tests/realtikvtest", + "@com_github_pingcap_failpoint//:failpoint", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + "@com_github_tikv_client_go_v2//oracle", + "@com_github_tikv_client_go_v2//util", + "@org_uber_go_goleak//:goleak", + ], +) diff --git a/tests/realtikvtest/flashbacktest/flashback_test.go b/tests/realtikvtest/flashbacktest/flashback_test.go new file mode 100644 index 0000000000000..f40632484c4d5 --- /dev/null +++ b/tests/realtikvtest/flashbacktest/flashback_test.go @@ -0,0 +1,599 @@ +// 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, +// 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 flashbacktest + +import ( + "context" + "fmt" + "strings" + "testing" + "time" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/ddl" + ddlutil "github.com/pingcap/tidb/ddl/util" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/meta" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/tests/realtikvtest" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/oracle" + tikvutil "github.com/tikv/client-go/v2/util" +) + +// MockGC is used to make GC work in the test environment. +func MockGC(tk *testkit.TestKit) (string, string, string, func()) { + originGC := ddlutil.IsEmulatorGCEnable() + resetGC := func() { + if originGC { + ddlutil.EmulatorGCEnable() + } else { + ddlutil.EmulatorGCDisable() + } + } + + // disable emulator GC. + // Otherwise emulator GC will delete table record as soon as possible after execute drop table ddl. + ddlutil.EmulatorGCDisable() + timeBeforeDrop := time.Now().Add(0 - 48*60*60*time.Second).Format(tikvutil.GCTimeFormat) + timeAfterDrop := time.Now().Add(48 * 60 * 60 * time.Second).Format(tikvutil.GCTimeFormat) + safePointSQL := `INSERT HIGH_PRIORITY INTO mysql.tidb VALUES ('tikv_gc_safe_point', '%[1]s', '') + ON DUPLICATE KEY + UPDATE variable_value = '%[1]s'` + // clear GC variables first. + tk.MustExec("delete from mysql.tidb where variable_name in ( 'tikv_gc_safe_point','tikv_gc_enable' )") + return timeBeforeDrop, timeAfterDrop, safePointSQL, resetGC +} + +func TestFlashback(t *testing.T) { + if *realtikvtest.WithRealTiKV { + store := realtikvtest.CreateMockStoreAndSetup(t) + + tk := testkit.NewTestKit(t, store) + + timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk) + defer resetGC() + + tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, index i(a))") + tk.MustExec("insert t values (1), (2), (3)") + + time.Sleep(1 * time.Second) + + ts, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) + require.NoError(t, err) + + injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", + fmt.Sprintf("return(%v)", injectSafeTS))) + + tk.MustExec("insert t values (4), (5), (6)") + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + + tk.MustExec("admin check table t") + require.Equal(t, tk.MustQuery("select max(a) from t").Rows()[0][0], "3") + require.Equal(t, tk.MustQuery("select max(a) from t use index(i)").Rows()[0][0], "3") + + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) + } +} + +func TestPrepareFlashbackFailed(t *testing.T) { + if *realtikvtest.WithRealTiKV { + store := realtikvtest.CreateMockStoreAndSetup(t) + + tk := testkit.NewTestKit(t, store) + + timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk) + defer resetGC() + + tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, index i(a))") + tk.MustExec("insert t values (1), (2), (3)") + + time.Sleep(1 * time.Second) + + ts, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) + require.NoError(t, err) + + injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", + fmt.Sprintf("return(%v)", injectSafeTS))) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockPrepareMeetsEpochNotMatch", `return(true)`)) + + tk.MustExec("insert t values (4), (5), (6)") + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + + tk.MustExec("admin check table t") + require.Equal(t, tk.MustQuery("select max(a) from t").Rows()[0][0], "3") + require.Equal(t, tk.MustQuery("select max(a) from t use index(i)").Rows()[0][0], "3") + + jobMeta := tk.MustQuery("select job_meta from mysql.tidb_ddl_history order by job_id desc limit 1").Rows()[0][0].(string) + job := model.Job{} + require.NoError(t, job.Decode([]byte(jobMeta))) + require.Equal(t, job.ErrorCount, int64(0)) + + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockPrepareMeetsEpochNotMatch")) + } +} + +func TestFlashbackAddDropIndex(t *testing.T) { + if *realtikvtest.WithRealTiKV { + store := realtikvtest.CreateMockStoreAndSetup(t) + + tk := testkit.NewTestKit(t, store) + + timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk) + defer resetGC() + + tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, index i(a))") + tk.MustExec("insert t values (1), (2), (3)") + prevGCCount := tk.MustQuery("select count(*) from mysql.gc_delete_range").Rows()[0][0] + + time.Sleep(1 * time.Second) + + ts, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) + require.NoError(t, err) + + tk.MustExec("alter table t add index k(a)") + require.Equal(t, tk.MustQuery("select max(a) from t use index(k)").Rows()[0][0], "3") + tk.MustExec("alter table t drop index i") + tk.MustGetErrCode("select max(a) from t use index(i)", errno.ErrKeyDoesNotExist) + require.Greater(t, tk.MustQuery("select count(*) from mysql.gc_delete_range").Rows()[0][0], prevGCCount) + + injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", + fmt.Sprintf("return(%v)", injectSafeTS))) + + tk.MustExec("insert t values (4), (5), (6)") + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + + tk.MustExec("admin check table t") + require.Equal(t, tk.MustQuery("select max(a) from t use index(i)").Rows()[0][0], "3") + tk.MustGetErrCode("select max(a) from t use index(k)", errno.ErrKeyDoesNotExist) + require.Equal(t, tk.MustQuery("select count(*) from mysql.gc_delete_range").Rows()[0][0], prevGCCount) + + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) + } +} + +func TestFlashbackAddDropModifyColumn(t *testing.T) { + if *realtikvtest.WithRealTiKV { + store := realtikvtest.CreateMockStoreAndSetup(t) + + tk := testkit.NewTestKit(t, store) + + timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk) + defer resetGC() + + tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, index i(a))") + tk.MustExec("insert t values (1, 1), (2, 2), (3, 3)") + + time.Sleep(1 * time.Second) + + ts, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) + require.NoError(t, err) + + tk.MustExec("alter table t add column c int") + tk.MustExec("alter table t drop column b") + tk.MustExec("alter table t modify column a tinyint") + require.Equal(t, tk.MustQuery("show create table t").Rows()[0][1], "CREATE TABLE `t` (\n"+ + " `a` tinyint(4) DEFAULT NULL,\n"+ + " `c` int(11) DEFAULT NULL,\n"+ + " KEY `i` (`a`)\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") + + injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", + fmt.Sprintf("return(%v)", injectSafeTS))) + + tk.MustExec("insert t values (4, 4), (5, 5), (6, 6)") + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + + tk.MustExec("admin check table t") + require.Equal(t, tk.MustQuery("show create table t").Rows()[0][1], "CREATE TABLE `t` (\n"+ + " `a` int(11) DEFAULT NULL,\n"+ + " `b` int(11) DEFAULT NULL,\n"+ + " KEY `i` (`a`)\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") + require.Equal(t, tk.MustQuery("select max(b) from t").Rows()[0][0], "3") + + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) + } +} + +func TestFlashbackBasicRenameDropCreateTable(t *testing.T) { + if *realtikvtest.WithRealTiKV { + store := realtikvtest.CreateMockStoreAndSetup(t) + + tk := testkit.NewTestKit(t, store) + + timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk) + defer resetGC() + + tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) + tk.MustExec("use test") + tk.MustExec("drop table if exists t, t1, t2, t3") + tk.MustExec("create table t(a int, index i(a))") + tk.MustExec("insert t values (1), (2), (3)") + tk.MustExec("create table t1(a int, index i(a))") + tk.MustExec("insert t1 values (4), (5), (6)") + prevGCCount := tk.MustQuery("select count(*) from mysql.gc_delete_range").Rows()[0][0] + + time.Sleep(1 * time.Second) + + ts, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) + require.NoError(t, err) + + tk.MustExec("rename table t to t3") + tk.MustExec("drop table t1") + tk.MustExec("create table t2(a int, index i(a))") + tk.MustExec("insert t2 values (7), (8), (9)") + + require.Equal(t, tk.MustQuery("select max(a) from t3").Rows()[0][0], "3") + require.Equal(t, tk.MustQuery("select max(a) from t2").Rows()[0][0], "9") + + require.Greater(t, tk.MustQuery("select count(*) from mysql.gc_delete_range").Rows()[0][0], prevGCCount) + + injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second)) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", + fmt.Sprintf("return(%v)", injectSafeTS))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + + tk.MustExec("admin check table t") + require.Equal(t, tk.MustQuery("select max(a) from t").Rows()[0][0], "3") + tk.MustExec("admin check table t1") + require.Equal(t, tk.MustQuery("select max(a) from t1").Rows()[0][0], "6") + require.Equal(t, tk.MustQuery("select count(*) from mysql.gc_delete_range").Rows()[0][0], prevGCCount) + + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) + } +} + +func TestFlashbackCreateDropTableWithData(t *testing.T) { + if *realtikvtest.WithRealTiKV { + store := realtikvtest.CreateMockStoreAndSetup(t) + + tk := testkit.NewTestKit(t, store) + + timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk) + defer resetGC() + + tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) + tk.MustExec("use test") + tk.MustExec("create table t(a int)") + + time.Sleep(1 * time.Second) + ts, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) + require.NoError(t, err) + + tk.MustExec("insert into t values (1)") + tk.MustExec("drop table t") + tk.MustExec("create table t(b int)") + tk.MustExec("insert into t(b) values (1)") + + injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second)) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", + fmt.Sprintf("return(%v)", injectSafeTS))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + + tk.MustExec("admin check table t") + require.Equal(t, tk.MustQuery("select count(a) from t").Rows()[0][0], "0") + + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) + } +} + +func TestFlashbackCreateDropSchema(t *testing.T) { + if *realtikvtest.WithRealTiKV { + store := realtikvtest.CreateMockStoreAndSetup(t) + + tk := testkit.NewTestKit(t, store) + + timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk) + defer resetGC() + + tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) + tk.MustExec("use test") + tk.MustExec("create table t(a int, index k(a))") + tk.MustExec("insert into t values (1),(2)") + + time.Sleep(1 * time.Second) + ts, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) + require.NoError(t, err) + + tk.MustExec("drop schema test") + tk.MustExec("create schema test1") + tk.MustExec("create schema test2") + tk.MustExec("use test1") + tk.MustGetErrCode("use test", errno.ErrBadDB) + tk.MustExec("use test2") + tk.MustExec("drop schema test2") + + injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second)) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", + fmt.Sprintf("return(%v)", injectSafeTS))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + + tk.MustExec("admin check table test.t") + res := tk.MustQuery("select max(a) from test.t").Rows() + require.Equal(t, res[0][0], "2") + tk.MustGetErrCode("use test1", errno.ErrBadDB) + tk.MustGetErrCode("use test2", errno.ErrBadDB) + + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) + } +} + +func TestFlashbackAutoID(t *testing.T) { + if *realtikvtest.WithRealTiKV { + store := realtikvtest.CreateMockStoreAndSetup(t) + + tk := testkit.NewTestKit(t, store) + + timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk) + defer resetGC() + + tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) + tk.MustExec("use test") + tk.MustExec("create table t(a int auto_increment, primary key(a)) auto_id_cache 100") + tk.MustExec("insert into t values (),()") + + time.Sleep(1 * time.Second) + ts, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) + require.NoError(t, err) + + tk.MustExec("insert into t values (),()") + res := tk.MustQuery("select max(a) from test.t").Rows() + require.Equal(t, res[0][0], "4") + tk.MustExec("drop table t") + + injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second)) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", + fmt.Sprintf("return(%v)", injectSafeTS))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + + tk.MustExec("admin check table t") + res = tk.MustQuery("select max(a) from t").Rows() + require.Equal(t, res[0][0], "2") + tk.MustExec("insert into t values ()") + res = tk.MustQuery("select max(a) from t").Rows() + require.Equal(t, res[0][0], "101") + + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) + } +} + +func TestFlashbackSequence(t *testing.T) { + if *realtikvtest.WithRealTiKV { + store := realtikvtest.CreateMockStoreAndSetup(t) + + tk := testkit.NewTestKit(t, store) + + timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk) + defer resetGC() + + tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) + tk.MustExec("use test") + tk.MustExec("create sequence seq cache 100") + res := tk.MustQuery("select nextval(seq)").Rows() + require.Equal(t, res[0][0], "1") + + time.Sleep(1 * time.Second) + ts, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) + require.NoError(t, err) + + res = tk.MustQuery("select nextval(seq)").Rows() + require.Equal(t, res[0][0], "2") + tk.MustExec("drop sequence seq") + + injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second)) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", + fmt.Sprintf("return(%v)", injectSafeTS))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + + // flashback schema and skip cached values + res = tk.MustQuery("select nextval(seq)").Rows() + require.Equal(t, res[0][0], "101") + + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) + } +} + +func TestFlashbackPartitionTable(t *testing.T) { + if *realtikvtest.WithRealTiKV { + store := realtikvtest.CreateMockStoreAndSetup(t) + + tk := testkit.NewTestKit(t, store) + + timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk) + defer resetGC() + + tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) + tk.MustExec("use test") + tk.MustExec("create table t(a int) partition by range(`a`) " + + "(partition `a_1` values less than (25), " + + "partition `a_2` values less than (75), " + + "partition `a_3` values less than (200))") + + for i := 0; i < 100; i++ { + tk.MustExec(fmt.Sprintf("insert into t values (%d)", i)) + } + + time.Sleep(1 * time.Second) + ts, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) + require.NoError(t, err) + + tk.MustExec("alter table t drop partition `a_3`") + tk.MustExec("alter table t add partition (partition `a_3` values less than (300))") + res := tk.MustQuery("select max(a) from t").Rows() + require.Equal(t, res[0][0], "74") + tk.MustExec("drop table t") + + injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second)) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", + fmt.Sprintf("return(%v)", injectSafeTS))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + + tk.MustExec("admin check table t") + res = tk.MustQuery("select max(a), min(a), count(*) from t").Rows() + require.Equal(t, res[0][0], "99") + require.Equal(t, res[0][1], "0") + require.Equal(t, res[0][2], "100") + tk.MustExec("insert into t values (100), (-1)") + res = tk.MustQuery("select max(a), min(a), count(*) from t").Rows() + require.Equal(t, res[0][0], "100") + require.Equal(t, res[0][1], "-1") + require.Equal(t, res[0][2], "102") + + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) + } +} + +func TestFlashbackTmpTable(t *testing.T) { + if *realtikvtest.WithRealTiKV { + store := realtikvtest.CreateMockStoreAndSetup(t) + + tk := testkit.NewTestKit(t, store) + + timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk) + defer resetGC() + + tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) + tk.MustExec("use test") + tk.MustExec("create temporary table t(a int)") + + // test flashback tmp table data + time.Sleep(1 * time.Second) + ts, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) + require.NoError(t, err) + + tk.MustExec("insert into t values (1), (2), (3)") + + injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second)) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", + fmt.Sprintf("return(%v)", injectSafeTS))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + + res := tk.MustQuery("select max(a) from t").Rows() + require.Equal(t, res[0][0], "3") + + // test flashback tmp table schema + time.Sleep(1 * time.Second) + ts, err = tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) + require.NoError(t, err) + + tk.MustExec("drop table t") + + injectSafeTS = oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second)) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", + fmt.Sprintf("return(%v)", injectSafeTS))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + + tk.MustGetErrCode("select * from t", errno.ErrNoSuchTable) + + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) + } +} + +func TestFlashbackInProcessErrorMsg(t *testing.T) { + if *realtikvtest.WithRealTiKV { + store, dom := realtikvtest.CreateMockStoreAndDomainAndSetup(t) + + originHook := dom.DDL().GetHook() + + tk := testkit.NewTestKit(t, store) + timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk) + defer resetGC() + + tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int)") + + time.Sleep(1 * time.Second) + ts, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) + require.NoError(t, err) + + // do some ddl and dml + tk.MustExec("alter table t add index k(a)") + tk.MustExec("insert into t values (1), (2), (3)") + + injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS", + fmt.Sprintf("return(%v)", injectSafeTS))) + + hook := newTestCallBack(t, dom) + hook.OnJobRunBeforeExported = func(job *model.Job) { + if job.Type == model.ActionFlashbackCluster && job.SchemaState == model.StateWriteReorganization { + txn, err := store.Begin() + assert.NoError(t, err) + _, err = meta.NewMeta(txn).ListDatabases() + errorMsg := err.Error() + assert.Contains(t, errorMsg, "is in flashback progress, FlashbackStartTS is ") + slices := strings.Split(errorMsg, "is in flashback progress, FlashbackStartTS is ") + assert.Equal(t, len(slices), 2) + assert.NotEqual(t, slices[1], "0") + txn.Rollback() + } + } + dom.DDL().SetHook(hook) + tk.Exec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + dom.DDL().SetHook(originHook) + + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS")) + } +} + +type testCallback struct { + ddl.Callback + OnJobRunBeforeExported func(job *model.Job) +} + +func newTestCallBack(t *testing.T, dom *domain.Domain) *testCallback { + defHookFactory, err := ddl.GetCustomizedHook("default_hook") + require.NoError(t, err) + return &testCallback{ + Callback: defHookFactory(dom), + } +} + +func (c *testCallback) OnJobRunBefore(job *model.Job) { + if c.OnJobRunBeforeExported != nil { + c.OnJobRunBeforeExported(job) + } +} diff --git a/tests/realtikvtest/flashbacktest/main_test.go b/tests/realtikvtest/flashbacktest/main_test.go new file mode 100644 index 0000000000000..d24310861a836 --- /dev/null +++ b/tests/realtikvtest/flashbacktest/main_test.go @@ -0,0 +1,39 @@ +// 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, +// 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 flashbacktest + +import ( + "testing" + + "github.com/pingcap/tidb/testkit/testsetup" + "github.com/pingcap/tidb/tests/realtikvtest" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + opts := []goleak.Option{ + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("google.golang.org/grpc.(*ccBalancerWrapper).watcher"), + goleak.IgnoreTopFunction("google.golang.org/grpc/internal/transport.(*http2Client).keepalive"), + goleak.IgnoreTopFunction("google.golang.org/grpc/internal/transport.(*controlBuffer).get"), + goleak.IgnoreTopFunction("net/http.(*persistConn).writeLoop"), + goleak.IgnoreTopFunction("internal/poll.runtime_pollWait"), + } + testsetup.SetupForCommonTest() + goleak.VerifyTestMain(m, opts...) + realtikvtest.RunTestMain(m) +} diff --git a/tests/realtikvtest/pessimistictest/BUILD.bazel b/tests/realtikvtest/pessimistictest/BUILD.bazel index 97890c8b8b70b..201a27a3c26c7 100644 --- a/tests/realtikvtest/pessimistictest/BUILD.bazel +++ b/tests/realtikvtest/pessimistictest/BUILD.bazel @@ -11,6 +11,7 @@ go_test( deps = [ "//config", "//domain", + "//errno", "//expression", "//kv", "//parser", @@ -18,6 +19,7 @@ go_test( "//parser/model", "//parser/mysql", "//parser/terror", + "//planner/core", "//session", "//sessionctx/variable", "//sessiontxn", diff --git a/tests/realtikvtest/pessimistictest/pessimistic_test.go b/tests/realtikvtest/pessimistictest/pessimistic_test.go index 5e2da1d200651..a73a36de109cf 100644 --- a/tests/realtikvtest/pessimistictest/pessimistic_test.go +++ b/tests/realtikvtest/pessimistictest/pessimistic_test.go @@ -28,6 +28,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser" @@ -35,6 +36,7 @@ import ( "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" + plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/sessiontxn" @@ -188,6 +190,7 @@ func TestTxnMode(t *testing.T) { } func TestDeadlock(t *testing.T) { + t.Skip("deadlock") deadlockhistory.GlobalDeadlockHistory.Clear() deadlockhistory.GlobalDeadlockHistory.Resize(10) @@ -359,9 +362,9 @@ func TestInsertOnDup(t *testing.T) { tk.MustExec("drop table if exists dup") tk.MustExec("create table dup (id int primary key, c int)") + tk2.MustExec("insert dup values (1, 1)") tk.MustExec("begin pessimistic") - tk2.MustExec("insert dup values (1, 1)") tk.MustExec("insert dup values (1, 1) on duplicate key update c = c + 1") tk.MustExec("commit") tk.MustQuery("select * from dup").Check(testkit.Rows("1 2")) @@ -379,6 +382,8 @@ func TestPointGetOverflow(t *testing.T) { } func TestPointGetKeyLock(t *testing.T) { + t.Skip("deadlock") + store := realtikvtest.CreateMockStoreAndSetup(t) tk := testkit.NewTestKit(t, store) @@ -396,9 +401,9 @@ func TestPointGetKeyLock(t *testing.T) { go func() { tk2.MustExec("begin pessimistic") _, err1 := tk2.Exec("insert point values (1, 1, 1)") - require.True(t, kv.ErrKeyExists.Equal(err1)) + require.True(t, kv.ErrKeyExists.Equal(err1), "error: %+q", err1) _, err1 = tk2.Exec("insert point values (2, 2, 2)") - require.True(t, kv.ErrKeyExists.Equal(err1)) + require.True(t, kv.ErrKeyExists.Equal(err1), "error: %+q", err1) tk2.MustExec("rollback") <-syncCh }() @@ -1834,105 +1839,6 @@ func TestPointGetWithDeleteInMem(t *testing.T) { tk.MustExec("drop table if exists uk") } -func TestPessimisticTxnWithDDLAddDropColumn(t *testing.T) { - store := realtikvtest.CreateMockStoreAndSetup(t) - - tk := testkit.NewTestKit(t, store) - tk2 := testkit.NewTestKit(t, store) - tk.MustExec("set global tidb_enable_metadata_lock=0") - tk.MustExec("use test") - tk2.MustExec("use test") - tk.MustExec("drop table if exists t1") - tk.MustExec("create table t1 (c1 int primary key, c2 int)") - tk.MustExec("insert t1 values (1, 77), (2, 88)") - tk.MustExec("alter table t1 add index k2(c2)") - tk.MustExec("alter table t1 drop index k2") - - // tk2 starts a pessimistic transaction and make some changes on table t1. - // tk executes some ddl statements add/drop column on table t1. - tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") - tk.MustExec("begin pessimistic") - tk.MustExec("update t1 set c2 = c1 * 10") - tk2.MustExec("alter table t1 add column c3 int after c1") - tk.MustExec("commit") - tk.MustExec("admin check table t1") - tk.MustQuery("select * from t1").Check(testkit.Rows("1 10", "2 20")) - - tk.MustExec("begin pessimistic") - tk.MustExec("insert into t1 values(5, 5, 5)") - tk2.MustExec("alter table t1 drop column c3") - tk2.MustExec("alter table t1 drop column c2") - tk.MustExec("commit") - tk.MustQuery("select * from t1").Check(testkit.Rows("1", "2", "5")) -} - -func TestPessimisticTxnWithDDLChangeColumn(t *testing.T) { - store := realtikvtest.CreateMockStoreAndSetup(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set global tidb_enable_metadata_lock=0") - tk2 := testkit.NewTestKit(t, store) - tk2.MustExec("use test") - - tk.MustExec("drop table if exists t1") - tk.MustExec("create table t1 (c1 int primary key, c2 int, c3 varchar(10))") - tk.MustExec("insert t1 values (1, 77, 'a'), (2, 88, 'b')") - - // Extend column field length is acceptable. - tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") - tk.MustExec("begin pessimistic") - tk.MustExec("update t1 set c2 = c1 * 10") - tk2.MustExec("alter table t1 modify column c2 bigint") - tk.MustExec("commit") - tk.MustExec("begin pessimistic") - tk.MustExec("update t1 set c3 = 'aba'") - tk2.MustExec("alter table t1 modify column c3 varchar(30)") - tk.MustExec("commit") - tk2.MustExec("admin check table t1") - tk.MustQuery("select * from t1").Check(testkit.Rows("1 10 aba", "2 20 aba")) - - // Change column from nullable to not null is not allowed by now. - tk.MustExec("begin pessimistic") - tk.MustExec("insert into t1(c1) values(100)") - tk2.MustExec("alter table t1 change column c2 cc2 bigint not null") - require.Error(t, tk.ExecToErr("commit")) - - // Change default value is rejected. - tk2.MustExec("create table ta(a bigint primary key auto_random(3), b varchar(255) default 'old');") - tk2.MustExec("insert into ta(b) values('a')") - tk.MustExec("begin pessimistic") - tk.MustExec("insert into ta values()") - tk2.MustExec("alter table ta modify column b varchar(300) default 'new';") - require.Error(t, tk.ExecToErr("commit")) - tk2.MustQuery("select b from ta").Check(testkit.Rows("a")) - - // Change default value with add index. There is a new MultipleKeyFlag flag on the index key, and the column is changed, - // the flag check will fail. - tk2.MustExec("insert into ta values()") - tk.MustExec("begin pessimistic") - tk.MustExec("insert into ta(b) values('inserted_value')") - tk.MustExec("insert into ta values()") - tk.MustExec("insert into ta values()") - tk2.MustExec("alter table ta add index i1(b)") - tk2.MustExec("alter table ta change column b b varchar(301) default 'newest'") - tk2.MustExec("alter table ta modify column b varchar(301) default 'new'") - require.Error(t, tk.ExecToErr("commit")) - tk2.MustExec("admin check table ta") - tk2.MustQuery("select count(b) from ta use index(i1) where b = 'new'").Check(testkit.Rows("1")) - - // Change default value to now(). - tk2.MustExec("create table tbl_time(c1 int, c_time timestamp)") - tk2.MustExec("insert into tbl_time(c1) values(1)") - tk.MustExec("begin pessimistic") - tk.MustExec("insert into tbl_time(c1) values(2)") - tk2.MustExec("alter table tbl_time modify column c_time timestamp default now()") - tk2.MustExec("insert into tbl_time(c1) values(3)") - tk2.MustExec("insert into tbl_time(c1) values(4)") - require.Error(t, tk.ExecToErr("commit")) - tk2.MustQuery("select count(1) from tbl_time where c_time is not null").Check(testkit.Rows("2")) -} - func TestPessimisticUnionForUpdate(t *testing.T) { store := realtikvtest.CreateMockStoreAndSetup(t) @@ -2133,54 +2039,6 @@ func TestInsertDupKeyAfterLockBatchPointGet(t *testing.T) { require.True(t, terror.ErrorEqual(err, kv.ErrKeyExists)) } -func TestAmendTxnVariable(t *testing.T) { - store := realtikvtest.CreateMockStoreAndSetup(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set global tidb_enable_metadata_lock=0") - tk2 := testkit.NewTestKit(t, store) - tk2.MustExec("use test") - tk3 := testkit.NewTestKit(t, store) - tk3.MustExec("use test") - - tk2.MustExec("drop table if exists t1") - tk2.MustExec("create table t1(c1 int primary key, c2 int, c3 int, unique key uk(c2));") - tk2.MustExec("insert into t1 values(1, 1, 1);") - tk2.MustExec("insert into t1 values(2, 2, 2);") - - // Set off the session variable. - tk3.MustExec("set tidb_enable_amend_pessimistic_txn = 0;") - tk3.MustExec("begin pessimistic") - tk3.MustExec("insert into t1 values(3, 3, 3)") - tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") - tk.MustExec("begin pessimistic") - tk.MustExec("insert into t1 values(4, 4, 4)") - tk2.MustExec("alter table t1 add column new_col int") - require.Error(t, tk3.ExecToErr("commit")) - tk.MustExec("commit") - tk2.MustQuery("select * from t1").Check(testkit.Rows("1 1 1 ", "2 2 2 ", "4 4 4 ")) - tk.MustExec("set tidb_enable_amend_pessimistic_txn = 0;") - - // Set off the global variable. - tk2.MustExec("set global tidb_enable_amend_pessimistic_txn = 0;") - - tk4 := testkit.NewTestKit(t, store) - tk4.MustExec("use test") - - tk4.MustQuery(`show variables like "tidb_enable_amend_pessimistic_txn"`).Check(testkit.Rows("tidb_enable_amend_pessimistic_txn OFF")) - tk4.MustExec("begin pessimistic") - tk4.MustExec("insert into t1 values(5, 5, 5, 5)") - tk2.MustExec("alter table t1 drop column new_col") - require.Error(t, tk4.ExecToErr("commit")) - tk4.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") - tk4.MustExec("begin pessimistic") - tk4.MustExec("insert into t1 values(5, 5, 5)") - tk2.MustExec("alter table t1 add column new_col2 int") - tk4.MustExec("commit") - tk2.MustQuery("select * from t1").Check(testkit.Rows("1 1 1 ", "2 2 2 ", "4 4 4 ", "5 5 5 ")) -} - func TestSelectForUpdateWaitSeconds(t *testing.T) { store := realtikvtest.CreateMockStoreAndSetup(t) @@ -2303,9 +2161,7 @@ func TestAsyncCommitWithSchemaChange(t *testing.T) { tk.MustExec("insert into tk values(1, 1, 1)") tk2 := createAsyncCommitTestKit(t, store) tk3 := createAsyncCommitTestKit(t, store) - tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") - tk2.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") - tk3.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") + tk.MustExec("set global tidb_ddl_enable_fast_reorg = 0;") // The txn tk writes something but with failpoint the primary key is not committed. tk.MustExec("begin pessimistic") @@ -2362,12 +2218,6 @@ func Test1PCWithSchemaChange(t *testing.T) { t.Skip("This test is unstable as depending on time.Sleep") } - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.TiKVClient.AsyncCommit.SafeWindow = time.Second - conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 - }) - store := realtikvtest.CreateMockStoreAndSetup(t) tk := create1PCTestKit(t, store) @@ -2377,9 +2227,7 @@ func Test1PCWithSchemaChange(t *testing.T) { tk.MustExec("drop table if exists tk") tk.MustExec("create table tk (c1 int primary key, c2 int)") tk.MustExec("insert into tk values (1, 1)") - tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") - tk2.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") - tk3.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") + tk.MustExec("set global tidb_ddl_enable_fast_reorg = 0;") tk.MustExec("begin pessimistic") tk.MustExec("insert into tk values(2, 2)") @@ -2417,302 +2265,6 @@ func Test1PCWithSchemaChange(t *testing.T) { tk3.MustExec("admin check table tk") } -func TestAmendForUniqueIndex(t *testing.T) { - store := realtikvtest.CreateMockStoreAndSetup(t) - - tk := testkit.NewTestKit(t, store) - tk2 := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk2.MustExec("use test") - tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") - - tk2.MustExec("drop table if exists t1") - tk2.MustExec("create table t1(c1 int primary key, c2 int, c3 int, unique key uk(c2));") - tk2.MustExec("insert into t1 values(1, 1, 1);") - tk2.MustExec("insert into t1 values(2, 2, 2);") - - // New value has duplicates. - tk.MustExec("begin pessimistic") - tk.MustExec("insert into t1 values(3, 3, 3)") - tk.MustExec("insert into t1 values(4, 4, 3)") - tk2.MustExec("alter table t1 add unique index uk1(c3)") - require.Error(t, tk.ExecToErr("commit")) - tk2.MustExec("alter table t1 drop index uk1") - tk2.MustExec("admin check table t1") - - // New values has duplicates with old values. - tk.MustExec("begin pessimistic") - tk.MustExec("insert into t1 values(3, 3, 3)") - tk.MustExec("insert into t1 values(4, 4, 1)") - tk2.MustExec("alter table t1 add unique index uk1(c3)") - require.Error(t, tk.ExecToErr("commit")) - tk2.MustExec("admin check table t1") - - // Put new values. - tk2.MustQuery("select * from t1 for update").Check(testkit.Rows("1 1 1", "2 2 2")) - tk2.MustExec("alter table t1 drop index uk1") - tk.MustExec("begin pessimistic") - tk2.MustExec("alter table t1 add unique index uk1(c3)") - tk.MustExec("insert into t1 values(5, 5, 5)") - tk.MustExec("commit") - tk2.MustExec("admin check table t1") - - // Update the old value with same unique key value, should abort. - tk2.MustExec("drop table if exists t;") - tk2.MustExec("create table t (id int auto_increment primary key, c int);") - tk2.MustExec("insert into t (id, c) values (1, 2), (3, 4);") - tk.MustExec("begin pessimistic") - tk2.MustExec("alter table t add unique index uk(c);") - tk.MustExec("update t set c = 2 where id = 3;") - require.Error(t, tk.ExecToErr("commit")) - tk2.MustExec("admin check table t") - - // Update the old value with same unique key, but the row key has changed. - tk2.MustExec("drop table if exists t;") - tk2.MustExec("create table t (id int auto_increment primary key, c int);") - tk2.MustExec("insert into t (id, c) values (1, 2), (3, 4);") - tk.MustExec("begin pessimistic") - tk.MustExec("insert into t values (3, 2) on duplicate key update id = values(id) and c = values(c)") - finishCh := make(chan error) - go func() { - err := tk2.ExecToErr("alter table t add unique index uk(c);") - finishCh <- err - }() - time.Sleep(300 * time.Millisecond) - tk.MustExec("commit") - err := <-finishCh - require.NoError(t, err) - tk2.MustExec("admin check table t") - - // Update the old value with same unique key, but the row key has changed. - /* TODO this case could not pass using unistore because of https://github.com/ngaut/unistore/issues/428. - // Reopen it after fix the unistore issue. - tk2.MustExec("drop table if exists t;") - tk2.MustExec("create table t (id int auto_increment primary key, c int);") - tk2.MustExec("insert into t (id, c) values (1, 2), (3, 4);") - tk.MustExec("begin pessimistic") - tk2.MustExec("alter table t add unique index uk(c);") - tk.MustExec("insert into t values (3, 2) on duplicate key update id = values(id) and c = values(c)") - tk.MustExec("commit") - tk2.MustExec("admin check table t") - */ - - // Test pessimistic retry for unique index amend. - tk2.MustExec("drop table if exists t;") - tk2.MustExec("create table t (id int key, c int);") - tk2.MustExec("insert into t (id, c) values (1, 1), (2, 2);") - tk.MustExec("begin pessimistic") - tk2.MustExec("alter table t add unique index uk(c)") - tk.MustExec("insert into t values(3, 5)") - tk.MustExec("update t set c = 4 where c = 2") - errCh := make(chan error, 1) - go func() { - var err error - err = tk2.ExecToErr("begin pessimistic") - if err != nil { - errCh <- err - return - } - err = tk2.ExecToErr("insert into t values(5, 5)") - if err != nil { - errCh <- err - return - } - err = tk2.ExecToErr("delete from t where id = 5") - if err != nil { - errCh <- err - return - } - // let commit in tk start. - errCh <- err - time.Sleep(time.Millisecond * 100) - err = tk2.ExecToErr("commit") - errCh <- err - }() - err = <-errCh - require.Equal(t, nil, err) - tk.MustExec("commit") - tk.MustExec("admin check table t") - err = <-errCh - require.Equal(t, nil, err) -} - -func TestAmendWithColumnTypeChange(t *testing.T) { - store := realtikvtest.CreateMockStoreAndSetup(t) - - tk := testkit.NewTestKit(t, store) - tk2 := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set global tidb_enable_metadata_lock=0") - tk2.MustExec("use test") - - tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") - - tk2.MustExec("drop table if exists t") - tk2.MustExec("create table t (id int primary key, v varchar(10));") - tk.MustExec("begin pessimistic") - tk.MustExec("insert into t values (1, \"123456789\")") - tk2.MustExec("alter table t modify column v varchar(5);") - require.Error(t, tk.ExecToErr("commit")) -} - -func TestIssue21498(t *testing.T) { - store := realtikvtest.CreateMockStoreAndSetup(t) - - tk := testkit.NewTestKit(t, store) - tk2 := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk2.MustExec("use test") - tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1") - - for _, partition := range []bool{false, true} { - // RC test - tk.MustExec("drop table if exists t, t1") - createTable := "create table t (id int primary key, v int, index iv (v))" - if partition { - createTable += " partition by range (id) (partition p0 values less than (0),partition p1 values less than (1),partition p2 values less than (2),partition p3 values less than (3),partition pn values less than MAXVALUE)" - } - tk.MustExec(createTable) - tk.MustExec("insert into t values (1, 10), (2, 20), (3, 30), (4, 40)") - tk.MustExec("create table t1(id int)") - tk.MustExec("insert into t1 values(1)") - - tk.MustExec("set tx_isolation = 'READ-COMMITTED'") - tk.MustExec("begin pessimistic") - tk.MustQuery("select * from t where v = 10").Check(testkit.Rows("1 10")) - - tk2.MustExec("alter table t drop index iv") - tk2.MustExec("update t set v = 11 where id = 1") - - tk.MustQuery("select * from t where v = 10").Check(testkit.Rows()) - tk.MustQuery("select * from t where v = 11").Check(testkit.Rows("1 11")) - tk.MustQuery("select * from t where id = 1").Check(testkit.Rows("1 11")) - tk.MustExec("admin check table t") - tk.MustExec("commit") - - tk.MustExec("drop table if exists t") - createTable = "create table t (id int primary key, v int, index iv (v), v2 int)" - if partition { - createTable += " partition by range (id) (partition p0 values less than (0),partition p1 values less than (1),partition p2 values less than (2),partition p3 values less than (3),partition pn values less than MAXVALUE)" - } - tk.MustExec(createTable) - tk.MustExec("insert into t values (1, 10, 100), (2, 20, 200), (3, 30, 300), (4, 40, 400)") - - tk.MustExec("begin pessimistic") - tk.MustQuery("select * from t use index (iv) where v = 10").Check(testkit.Rows("1 10 100")) - tk2.MustExec("alter table t drop index iv") - tk2.MustExec("update t set v = 11 where id = 1") - err := tk.ExecToErr("select * from t use index (iv) where v = 10") - require.Equal(t, "[planner:1176]Key 'iv' doesn't exist in table 't'", err.Error()) - tk.MustQuery("select * from t where v = 10").Check(testkit.Rows()) - tk2.MustExec("update t set id = 5 where id = 1") - err = tk.ExecToErr("select * from t use index (iv) where v = 10") // select with - require.Equal(t, "[planner:1176]Key 'iv' doesn't exist in table 't'", err.Error()) - tk.MustQuery("select * from t where v = 10").Check(testkit.Rows()) - if !partition { - // amend transaction does not support partition table - tk.MustExec("insert into t(id, v, v2) select 6, v + 20, v2 + 200 from t where id = 4") // insert ... select with index unchanged - } - err = tk.ExecToErr("insert into t(id, v, v2) select 7, v + 30, v2 + 300 from t use index (iv) where id = 4") // insert ... select with index changed - require.Equal(t, "[planner:1176]Key 'iv' doesn't exist in table 't'", err.Error()) - tk.MustExec("admin check table t") // check consistency inside txn - tk.MustExec("commit") - if !partition { - tk.MustQuery("select * from t").Check(testkit.Rows("2 20 200", "3 30 300", "4 40 400", "5 11 100", "6 60 600")) - } - tk.MustExec("admin check table t") // check consistency out of txn - - // RR test for non partition - if partition { - continue - } - - tk.MustExec("set tx_isolation = 'REPEATABLE-READ'") - tk2.MustExec("alter table t add unique index iv(v)") - tk.MustExec("begin pessimistic") - tk2.MustExec("alter table t drop index iv") - tk2.MustExec("update t set v = 21 where v = 20") - tk2.MustExec("update t set v = 31 where v = 30") - tk.MustExec("update t set v = 22 where v = 21") // fast path - tk.CheckExecResult(1, 0) - tk.MustExec("update t set v = 23 where v = 22") - tk.CheckExecResult(1, 0) - tk.MustExec("update t set v = 32 where v >= 31 and v < 40") // common path - tk.CheckExecResult(1, 0) - tk.MustExec("commit") - tk.MustQuery("select * from t").Check(testkit.Rows("2 23 200", "3 32 300", "4 40 400", "5 11 100", "6 60 600")) - - tk2.MustExec("alter table t add unique index iv(v)") - tk.MustExec("begin pessimistic") - tk2.MustExec("alter table t drop index iv") - tk2.MustExec("update t set v = 24 where v = 23") - tk2.MustExec("update t set v = 41 where v = 40") - // fast path - tk.MustQuery("select * from t where v = 23").Check(testkit.Rows("2 23 200")) - tk.MustQuery("select * from t where v = 24").Check(testkit.Rows()) - tk.MustQuery("select * from t where v = 23 for update").Check(testkit.Rows()) - tk.MustQuery("select * from t where v = 24 for update").Check(testkit.Rows("2 24 200")) - tk.MustQuery("select (select id from t where v = 23), id from t1 for update").Check(testkit.Rows("2 1")) - tk.MustQuery("select (select id from t where v = 24), id from t1 for update").Check(testkit.Rows(" 1")) - tk.MustQuery("select (select id from t where v = 23 for update), id from t1").Check(testkit.Rows(" 1")) - tk.MustQuery("select (select id from t where v = 24 for update), id from t1").Check(testkit.Rows("2 1")) - tk.MustQuery("select (select id + 1 from t where v = 24 for update), id from t1").Check(testkit.Rows("3 1")) - // sub queries - tk.MustQuery("select (select id from (select id from t where v = 24 for update) tmp for update), (select id from t where v = 23), id from t where v = 23").Check(testkit.Rows("2 2 2")) - tk.MustQuery("select (select id + (select id from t where v = 23) from (select id from t where v = 24 for update) tmp), id from t where v = 23").Check(testkit.Rows("4 2")) - tk.MustQuery("select (select id + (select id from t where v = 23) from (select id from t where v = 24 for update) tmp for update), id from t where v = 23").Check(testkit.Rows("4 2")) - tk.MustQuery("select (select id + (select id from t where v = 23 for update) from (select id from t where v = 24 for update) tmp), id from t where v = 23").Check(testkit.Rows(" 2")) - tk.MustQuery("select (select id + (select id from t where v = 23 for update) from (select id from t where v = 24 for update) tmp for update), id from t where v = 23").Check(testkit.Rows(" 2")) - tk.MustQuery("select (select id + (select id from t where v = 23) from (select id from t where v = 23) tmp), id from t where v = 24 for update").Check(testkit.Rows("4 2")) - tk.MustQuery("select (select id + (select id from t where v = 23) from (select id from t where v = 24 for update) tmp), id from t where v = 24 for update").Check(testkit.Rows("4 2")) - tk.MustQuery("select (select id + (select id from t where v = 24 for update) from (select id from t where v = 23) tmp), id from t where v = 24 for update").Check(testkit.Rows("4 2")) - - // test index look up - tk.MustQuery("select * from t s, t t1 where s.v = 23 and s.id = t1.id").Check(testkit.Rows("2 23 200 2 23 200")) - tk.MustQuery("select * from t s, t t1 where s.v = 24 and s.id = t1.id").Check(testkit.Rows()) - tk.MustQuery("select * from t s, t t1 where s.v = 23 and s.id = t1.id for update").Check(testkit.Rows()) - // TODO: Do the same with Partitioned Table!!! Since this query leads to two columns in SelectLocExec.tblID2Handle!!! - tk.MustQuery("select * from t s, t t1 where s.v = 24 and s.id = t1.id for update").Check(testkit.Rows("2 24 200 2 24 200")) - tk.MustExec("delete from t where v = 24") - tk.CheckExecResult(1, 0) - // common path - tk.MustQuery("select * from t where v >= 41 and v < 50").Check(testkit.Rows()) - tk.MustQuery("select * from t where v >= 41 and v < 50 for update").Check(testkit.Rows("4 41 400")) - tk.MustExec("delete from t where v >= 41 and v < 50") - tk.CheckExecResult(1, 0) - tk.MustExec("commit") - tk.MustQuery("select * from t").Check(testkit.Rows("3 32 300", "5 11 100", "6 60 600")) - - tk2.MustExec("alter table t add unique index iv(v)") - tk.MustExec("begin pessimistic") - tk2.MustExec("alter table t drop index iv") - tk2.MustExec("update t set v = 33 where v = 32") - tk.MustExec("insert into t(id, v, v2) select 3 * id, 3 * v, 3 * v2 from t where v = 33") - tk.CheckExecResult(1, 0) - tk.MustExec("insert into t(id, v, v2) select (select 4 * id from t where v = 32) id, 4 * v, 4 * v2 from t where v = 33") - tk.CheckExecResult(1, 0) - err = tk.ExecToErr("insert into t(id, v, v2) select (select 4 * id from t where v = 33) id, 4 * v, 4 * v2 from t where v = 33") - require.Error(t, err) - require.Equal(t, "[table:1048]Column 'id' cannot be null", err.Error()) - tk.MustExec("commit") - tk.MustQuery("select * from t").Check(testkit.Rows("3 33 300", "5 11 100", "6 60 600", "9 99 900", "12 132 1200")) - - tk2.MustExec("alter table t add unique index iv(v)") - tk2.MustExec("drop table if exists t1") - tk2.MustExec("create table t1(id int primary key, v int, index iv (v), v2 int)") - tk.MustExec("begin pessimistic") - tk2.MustExec("alter table t drop index iv") - tk2.MustExec("update t set v = 34 where v = 33") - tk2.MustExec("update t set v = 12 where v = 11") - tk.MustExec("insert into t1(id, v, v2) select * from t where v = 33") - tk.CheckExecResult(0, 0) - tk.MustExec("insert into t1(id, v, v2) select * from t where v = 12") - tk.CheckExecResult(1, 0) - tk.MustExec("commit") - tk.MustQuery("select * from t1").Check(testkit.Rows("5 12 100")) - } -} - func TestPlanCacheSchemaChange(t *testing.T) { store := realtikvtest.CreateMockStoreAndSetup(t) tmp := testkit.NewTestKit(t, store) @@ -2732,8 +2284,7 @@ func TestPlanCacheSchemaChange(t *testing.T) { tk.MustExec("create table t (id int primary key, v int, unique index iv (v), vv int)") tk.MustExec("insert into t values(1, 1, 1), (2, 2, 2), (4, 4, 4)") - tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1") - tk2.MustExec("set tidb_enable_amend_pessimistic_txn = 1") + tk.MustExec("set global tidb_ddl_enable_fast_reorg = 0") // generate plan cache tk.MustExec("prepare update_stmt from 'update t set vv = vv + 1 where v = ?'") @@ -2806,6 +2357,66 @@ func TestAsyncCommitCalTSFail(t *testing.T) { tk2.MustExec("commit") } +func TestAsyncCommitAndForeignKey(t *testing.T) { + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.TiKVClient.AsyncCommit.SafeWindow = time.Second + conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 + }) + store := realtikvtest.CreateMockStoreAndSetup(t) + tk := createAsyncCommitTestKit(t, store) + tk.MustExec("drop table if exists t_parent, t_child") + tk.MustExec("create table t_parent (id int primary key)") + tk.MustExec("create table t_child (id int primary key, pid int, foreign key (pid) references t_parent(id) on delete cascade on update cascade)") + tk.MustExec("insert into t_parent values (1),(2),(3),(4)") + tk.MustExec("insert into t_child values (1,1),(2,2),(3,3)") + tk.MustExec("set tidb_enable_1pc = true") + tk.MustExec("begin pessimistic") + tk.MustExec("delete from t_parent where id in (1,4)") + tk.MustExec("update t_parent set id=22 where id=2") + tk.MustExec("commit") + tk.MustQuery("select * from t_parent order by id").Check(testkit.Rows("3", "22")) + tk.MustQuery("select * from t_child order by id").Check(testkit.Rows("2 22", "3 3")) +} + +func TestTransactionIsolationAndForeignKey(t *testing.T) { + if !*realtikvtest.WithRealTiKV { + t.Skip("The test only support test with tikv.") + } + store := realtikvtest.CreateMockStoreAndSetup(t) + tk := testkit.NewTestKit(t, store) + tk2 := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk2.MustExec("use test") + tk.MustExec("drop table if exists t1,t2") + tk.MustExec("create table t1 (id int primary key)") + tk.MustExec("create table t2 (id int primary key, pid int, foreign key (pid) references t1(id) on delete cascade on update cascade)") + tk.MustExec("insert into t1 values (1)") + tk.MustExec("set tx_isolation = 'READ-COMMITTED'") + tk.MustExec("begin pessimistic") + tk.MustExec("insert into t2 values (1,1)") + tk.MustGetDBError("insert into t2 values (2,2)", plannercore.ErrNoReferencedRow2) + tk2.MustExec("insert into t1 values (2)") + tk.MustQuery("select * from t1").Check(testkit.Rows("1", "2")) + tk.MustExec("insert into t2 values (2,2)") + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + tk2.MustExec("delete from t1 where id=2") + }() + time.Sleep(time.Millisecond * 10) + tk.MustExec("commit") + wg.Wait() + tk.MustQuery("select * from t1").Check(testkit.Rows("1")) + tk.MustQuery("select * from t2").Check(testkit.Rows("1 1")) + tk2.MustExec("delete from t1 where id=1") + tk.MustQuery("select * from t1").Check(testkit.Rows()) + tk.MustQuery("select * from t2").Check(testkit.Rows()) + tk.MustExec("admin check table t1") + tk.MustExec("admin check table t2") +} + func TestChangeLockToPut(t *testing.T) { store := realtikvtest.CreateMockStoreAndSetup(t) @@ -2885,175 +2496,6 @@ func createTable(part bool, columnNames []string, columnTypes []string) string { return str } -func TestAmendForIndexChange(t *testing.T) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.TiKVClient.AsyncCommit.SafeWindow = 0 - conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 - }) - store := realtikvtest.CreateMockStoreAndSetup(t) - - tk := testkit.NewTestKit(t, store) - tk2 := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set global tidb_enable_metadata_lock=0") - tk2.MustExec("use test") - - tk.MustExec("set tidb_enable_amend_pessimistic_txn = ON;") - tk.Session().GetSessionVars().EnableAsyncCommit = false - tk.Session().GetSessionVars().Enable1PC = false - - tk2.MustExec("drop table if exists t1") - - // Add some different column types. - columnNames := []string{"c_int", "c_str", "c_datetime", "c_timestamp", "c_double", "c_decimal", "c_float"} - columnTypes := []string{"int", "varchar(40)", "datetime", "timestamp", "double", "decimal(12, 6)", "float"} - - addIndexFunc := func(idxName string, part bool, a, b int) string { - var str string - str = "alter table t" - if part { - str = "alter table t_part" - } - str += " add index " + idxName + " (" - str += strings.Join(columnNames[a:b], ",") - str += ")" - return str - } - - for i := 0; i < len(columnTypes); i++ { - for j := i + 1; j <= len(columnTypes); j++ { - // Create table and prepare some data. - tk2.MustExec("drop table if exists t") - tk2.MustExec("drop table if exists t_part") - tk2.MustExec(createTable(false, columnNames, columnTypes)) - tk2.MustExec(createTable(true, columnNames, columnTypes)) - tk2.MustExec(`insert into t values(1, "1", "2000-01-01", "2020-01-01", "1.1", "123.321", 1.1)`) - tk2.MustExec(`insert into t values(2, "2", "2000-01-02", "2020-01-02", "2.2", "223.322", 2.2)`) - tk2.MustExec(`insert into t_part values(1, "1", "2000-01-01", "2020-01-01", "1.1", "123.321", 1.1)`) - tk2.MustExec(`insert into t_part values(2, "2", "2000-01-02", "2020-01-02", "2.2", "223.322", 2.2)`) - - // Start a pessimistic transaction, the amend should succeed for common table. - tk.MustExec("begin pessimistic") - tk.MustExec(`insert into t values(5, "555", "2000-01-05", "2020-01-05", "5.5", "555.555", 5.5)`) - idxName := fmt.Sprintf("index%d%d", i, j) - tk2.MustExec(addIndexFunc(idxName, false, i, j)) - tk.MustExec("commit") - tk2.MustExec("admin check table t") - - tk.MustExec("begin pessimistic") - tk.MustExec(`insert into t values(6, "666", "2000-01-06", "2020-01-06", "6.6", "666.666", 6.6)`) - tk2.MustExec(fmt.Sprintf(`alter table t drop index %s`, idxName)) - tk.MustExec("commit") - tk2.MustExec("admin check table t") - tk2.MustQuery("select count(*) from t").Check(testkit.Rows("4")) - - // Start a pessimistic transaction for partition table, the amend should fail. - tk.MustExec("begin pessimistic") - tk.MustExec(`insert into t_part values(5, "555", "2000-01-05", "2020-01-05", "5.5", "555.555", 5.5)`) - tk2.MustExec(addIndexFunc(idxName, true, i, j)) - require.Error(t, tk.ExecToErr("commit")) - tk2.MustExec("admin check table t_part") - - tk.MustExec("begin pessimistic") - tk.MustExec(`insert into t_part values(6, "666", "2000-01-06", "2020-01-06", "6.6", "666.666", 6.6)`) - tk2.MustExec(fmt.Sprintf(`alter table t_part drop index %s`, idxName)) - require.Error(t, tk.ExecToErr("commit")) - tk2.MustExec("admin check table t_part") - tk2.MustQuery("select count(*) from t_part").Check(testkit.Rows("2")) - } - } -} - -func TestAmendForColumnChange(t *testing.T) { - store := realtikvtest.CreateMockStoreAndSetup(t) - - tk := testkit.NewTestKit(t, store) - tk2 := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set global tidb_enable_metadata_lock=0") - tk2.MustExec("use test") - - tk.MustExec("set tidb_enable_amend_pessimistic_txn = ON;") - tk2.MustExec("drop table if exists t1") - - // Add some different column types. - columnNames := []string{"c_int", "c_str", "c_datetime", "c_timestamp", "c_double", "c_decimal", "c_float"} - columnTypes := []string{"int", "varchar(40)", "datetime", "timestamp", "double", "decimal(12, 6)", "float"} - colChangeDDLs := []string{ - "alter table %s change column c_int c_int bigint", - "alter table %s modify column c_str varchar(55)", - "alter table %s modify column c_datetime datetime", - "alter table %s modify column c_timestamp timestamp", - "alter table %s modify column c_double double default NULL", - "alter table %s modify column c_int bigint(20) default 100", - "alter table %s change column c_float c_float float", - "alter table %s modify column c_int bigint(20)", - } - amendSucc := []bool{ - true, - true, - true, - true, - true, - false, - true, - true, - } - colChangeFunc := func(part bool, i int) string { - var sql string - sql = colChangeDDLs[i] - if part { - sql = fmt.Sprintf(sql, "t_part") - } else { - sql = fmt.Sprintf(sql, "t") - } - return sql - } - - for i := 0; i < len(colChangeDDLs); i++ { - // Create table and prepare some data. - tk2.MustExec("drop table if exists t") - tk2.MustExec("drop table if exists t_part") - tk2.MustExec(createTable(false, columnNames, columnTypes)) - tk2.MustExec(createTable(true, columnNames, columnTypes)) - tk2.MustExec(`insert into t values(1, "1", "2000-01-01", "2020-01-01", "1.1", "123.321", 1.1)`) - tk2.MustExec(`insert into t values(2, "2", "2000-01-02", "2020-01-02", "2.2", "223.322", 2.2)`) - tk2.MustExec(`insert into t_part values(1, "1", "2000-01-01", "2020-01-01", "1.1", "123.321", 1.1)`) - tk2.MustExec(`insert into t_part values(2, "2", "2000-01-02", "2020-01-02", "2.2", "223.322", 2.2)`) - - // Start a pessimistic transaction, the amend should succeed for common table. - tk.MustExec("begin pessimistic") - tk.MustExec(`insert into t values(5, "555", "2000-01-05", "2020-01-05", "5.5", "555.555", 5.5)`) - tk2.MustExec(colChangeFunc(false, i)) - if amendSucc[i] { - tk.MustExec("commit") - } else { - require.Error(t, tk.ExecToErr("commit")) - } - tk2.MustExec("admin check table t") - if amendSucc[i] { - tk2.MustQuery("select count(*) from t").Check(testkit.Rows("3")) - } else { - tk2.MustQuery("select count(*) from t").Check(testkit.Rows("2")) - } - - // Start a pessimistic transaction for partition table, the amend should fail. - if i == 5 { - // alter table t_part modify column c_int bigint(20) default 100 - // Unsupported modify column: can't change the partitioning column, since it would require reorganize all partitions - // Skip this case - continue - } - tk.MustExec("begin pessimistic") - tk.MustExec(`insert into t_part values(5, "555", "2000-01-05", "2020-01-05", "5.5", "555.555", 5.5)`) - tk2.MustExec(colChangeFunc(true, i)) - require.Error(t, tk.ExecToErr("commit")) - tk2.MustExec("admin check table t_part") - tk2.MustQuery("select count(*) from t_part").Check(testkit.Rows("2")) - } -} - func TestPessimisticAutoCommitTxn(t *testing.T) { store := realtikvtest.CreateMockStoreAndSetup(t) @@ -3062,13 +2504,21 @@ func TestPessimisticAutoCommitTxn(t *testing.T) { tk.MustExec("set tidb_txn_mode = 'pessimistic'") tk.MustExec("drop table if exists t") - tk.MustExec("create table t (i int)") + tk.MustExec("create table t (i int primary key)") tk.MustExec("insert into t values (1)") tk.MustExec("set autocommit = on") rows := tk.MustQuery("explain update t set i = -i").Rows() explain := fmt.Sprintf("%v", rows[1]) require.NotRegexp(t, ".*SelectLock.*", explain) + rows = tk.MustQuery("explain update t set i = -i where i = -1").Rows() + explain = fmt.Sprintf("%v", rows[1]) + require.Regexp(t, ".*handle:-1.*", explain) + require.NotRegexp(t, ".*handle:-1, lock.*", explain) + rows = tk.MustQuery("explain update t set i = -i where i in (-1, 1)").Rows() + explain = fmt.Sprintf("%v", rows[1]) + require.Regexp(t, ".*handle:\\[-1 1\\].*", explain) + require.NotRegexp(t, ".*handle:\\[-1 1\\].*, lock.*", explain) originCfg := config.GetGlobalConfig() defer config.StoreGlobalConfig(originCfg) @@ -3079,6 +2529,12 @@ func TestPessimisticAutoCommitTxn(t *testing.T) { rows = tk.MustQuery("explain update t set i = -i").Rows() explain = fmt.Sprintf("%v", rows[1]) require.Regexp(t, ".*SelectLock.*", explain) + rows = tk.MustQuery("explain update t set i = -i where i = -1").Rows() + explain = fmt.Sprintf("%v", rows[1]) + require.Regexp(t, ".*handle:-1, lock.*", explain) + rows = tk.MustQuery("explain update t set i = -i where i in (-1, 1)").Rows() + explain = fmt.Sprintf("%v", rows[1]) + require.Regexp(t, ".*handle:\\[-1 1\\].*, lock.*", explain) } func TestPessimisticLockOnPartition(t *testing.T) { @@ -3577,3 +3033,326 @@ func TestLazyUniquenessCheckWithSavepoint(t *testing.T) { err := tk.ExecToErr("savepoint s1") require.ErrorContains(t, err, "savepoint is not supported in pessimistic transactions when in-place constraint check is disabled") } + +func mustExecAsync(tk *testkit.TestKit, sql string, args ...interface{}) <-chan struct{} { + ch := make(chan struct{}) + go func() { + defer func() { ch <- struct{}{} }() + tk.MustExec(sql, args...) + }() + return ch +} + +func mustQueryAsync(tk *testkit.TestKit, sql string, args ...interface{}) <-chan *testkit.Result { + ch := make(chan *testkit.Result) + go func() { + ch <- tk.MustQuery(sql, args...) + }() + return ch +} + +func mustTimeout[T interface{}](t *testing.T, ch <-chan T, timeout time.Duration) { + select { + case res := <-ch: + require.FailNow(t, fmt.Sprintf("received signal when not expected: %v", res)) + case <-time.After(timeout): + } +} + +func mustRecv[T interface{}](t *testing.T, ch <-chan T) T { + select { + case <-time.After(time.Second): + case res := <-ch: + return res + } + require.FailNow(t, "signal not received after waiting for one second") + panic("unreachable") +} + +func TestAggressiveLockingBasic(t *testing.T) { + store := realtikvtest.CreateMockStoreAndSetup(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + + // TODO: Check aggressive locking is indeed used and the RPC is avoided when doing pessimistic retry. + + tk.MustExec("set @@tidb_pessimistic_txn_aggressive_locking = 1") + tk.MustExec("create table t (id int primary key, k int unique, v int)") + tk.MustExec("insert into t values (1, 1, 1)") + + // Woken up by a rolled back transaction. + tk.MustExec("begin pessimistic") + tk2.MustExec("begin pessimistic") + tk2.MustExec("update t set v = v + 1 where id = 1") + res := mustExecAsync(tk, "update t set v = v + 1 where id = 1") + mustTimeout(t, res, time.Millisecond*100) + tk2.MustExec("rollback") + mustRecv(t, res) + tk.MustQuery("select * from t").Check(testkit.Rows("1 1 2")) + tk.MustExec("commit") + tk.MustQuery("select * from t").Check(testkit.Rows("1 1 2")) + + // Woken up by a committed transaction. + tk.MustExec("begin pessimistic") + tk2.MustExec("begin pessimistic") + tk2.MustExec("update t set v = v + 1 where id = 1") + res = mustExecAsync(tk, "update t set v = v + 1 where id = 1") + mustTimeout(t, res, time.Millisecond*100) + tk2.MustExec("commit") + mustRecv(t, res) + tk.MustQuery("select * from t").Check(testkit.Rows("1 1 4")) + tk.MustExec("commit") + tk.MustQuery("select * from t").Check(testkit.Rows("1 1 4")) + + // Lock conflict occurs on the second LockKeys invocation in one statement. + tk.MustExec("begin pessimistic") + tk2.MustExec("begin pessimistic") + tk2.MustExec("update t set v = v + 1 where id = 1") + res = mustExecAsync(tk, "update t set v = v + 1 where k = 1") + mustTimeout(t, res, time.Millisecond*100) + tk2.MustExec("commit") + mustRecv(t, res) + tk.MustQuery("select * from t").Check(testkit.Rows("1 1 6")) + tk.MustExec("commit") + tk.MustQuery("select * from t").Check(testkit.Rows("1 1 6")) + + // Lock one key (the row key) in aggressive locking mode, and then falls back due to multiple keys needs to be + // locked then (the unique index keys, one deleted and one added). + tk.MustExec("begin pessimistic") + tk2.MustExec("begin pessimistic") + tk2.MustExec("update t set v = v + 1 where id = 1") + tk2.MustQuery("select * from t where k = 2 for update").Check(testkit.Rows()) + res = mustExecAsync(tk, "update t set k = k + 1 where id = 1") + mustTimeout(t, res, time.Millisecond*100) + tk2.MustExec("commit") + mustRecv(t, res) + tk.MustQuery("select * from t").Check(testkit.Rows("1 2 7")) + tk.MustExec("commit") + tk.MustQuery("select * from t").Check(testkit.Rows("1 2 7")) + + // Test consistency in the RC behavior of DMLs. + tk3 := testkit.NewTestKit(t, store) + tk3.MustExec("use test") + tk.MustExec("insert into t values (3, 3, 4), (4, 4, 4)") + tk.MustExec("begin pessimistic") + tk2.MustExec("begin pessimistic") + tk2.MustExec("update t set v = v + 1 where id = 3") + res = mustExecAsync(tk, "with c as (select /*+ MERGE() */ * from t where id = 3 for update) update c join t on c.v = t.v set t.v = t.v + 1") + mustTimeout(t, res, time.Millisecond*100) + tk3.MustExec("insert into t values (5, 5, 5)") + tk2.MustExec("commit") + mustRecv(t, res) + tk.MustExec("commit") + tk.MustQuery("select * from t").Check(testkit.Rows("1 2 7", "3 3 6", "4 4 4", "5 5 6")) + + tk.MustExec("begin pessimistic") + tk2.MustExec("begin pessimistic") + tk2.MustExec("select * from t where id = 4 for update") + res = mustExecAsync(tk, "update t set v = v + 1") + mustTimeout(t, res, time.Millisecond*100) + tk3.MustExec("insert into t values (6, 6, 6)") + tk2.MustExec("commit") + mustRecv(t, res) + tk.MustQuery("select * from t").Check(testkit.Rows("1 2 8", "3 3 7", "4 4 5", "5 5 7", "6 6 7")) + tk.MustExec("commit") +} + +func TestAggressiveLockingInsert(t *testing.T) { + store := realtikvtest.CreateMockStoreAndSetup(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + + tk.MustExec("set @@tidb_pessimistic_txn_aggressive_locking = 1") + tk.MustExec("create table t (id int primary key, v int)") + + tk.MustExec("begin pessimistic") + tk2.MustExec("begin pessimistic") + tk2.MustExec("insert into t values (1, 20)") + ch := make(chan struct{}) + go func() { + tk.MustGetErrCode("insert into t values (1, 10)", errno.ErrDupEntry) + ch <- struct{}{} + }() + mustTimeout(t, ch, time.Millisecond*100) + tk2.MustExec("commit") + mustRecv(t, ch) + tk.MustExec("rollback") + tk.MustQuery("select * from t").Check(testkit.Rows("1 20")) + + tk.MustExec("begin pessimistic") + tk2.MustExec("begin pessimistic") + tk2.MustExec("delete from t where id = 1") + res := mustExecAsync(tk, "insert into t values (1, 10)") + mustTimeout(t, res, time.Millisecond*100) + tk2.MustExec("commit") + mustRecv(t, res) + tk.MustExec("commit") + tk.MustQuery("select * from t").Check(testkit.Rows("1 10")) +} + +func TestAggressiveLockingLockWithConflictIdempotency(t *testing.T) { + store := realtikvtest.CreateMockStoreAndSetup(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk2 := testkit.NewTestKit(t, store) + // Avoid tk2 being affected by the failpoint (but the failpoint will still be triggered).. + tk2.Session().SetConnectionID(0) + tk2.MustExec("use test") + + tk.MustExec("set @@tidb_pessimistic_txn_aggressive_locking = 1") + tk.MustExec("create table t (id int primary key, v int)") + tk.MustExec("insert into t values (1, 1)") + + tk.MustExec("begin pessimistic") + tk2.MustExec("begin pessimistic") + tk2.MustExec("update t set v = v + 1 where id = 1") + // It's not sure whether `tk`'s pessimistic lock response or `tk2`'s commit response arrives first, so inject twice. + require.NoError(t, failpoint.Enable("tikvclient/rpcFailOnRecv", "2*return")) + res := mustExecAsync(tk, "update t set v = v + 10 where id = 1") + mustTimeout(t, res, time.Millisecond*100) + tk2.MustExec("commit") + mustRecv(t, res) + require.NoError(t, failpoint.Disable("tikvclient/rpcFailOnRecv")) + tk.MustExec("commit") + tk.MustQuery("select * from t").Check(testkit.Rows("1 12")) +} + +func TestAggressiveLockingRetry(t *testing.T) { + store := realtikvtest.CreateMockStoreAndSetup(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + + mustLocked := func(stmt string) { + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("begin pessimistic") + tk.MustGetErrCode(stmt, errno.ErrLockAcquireFailAndNoWaitSet) + tk.MustExec("rollback") + } + + tk.MustExec("set @@tidb_pessimistic_txn_aggressive_locking = 1") + tk.MustExec("create table t1 (id int primary key, v int)") + tk.MustExec("create table t2 (id int primary key, v int)") + tk.MustExec("create table t3 (id int primary key, v int, v2 int)") + tk.MustExec("insert into t1 values (1, 10)") + tk.MustExec("insert into t2 values (10, 100), (11, 101)") + tk.MustExec("insert into t3 values (100, 100, 100), (101, 200, 200)") + + // Test the case that the locks to acquire didn't change. + tk.MustExec("begin pessimistic") + tk2.MustExec("begin pessimistic") + tk2.MustExec("update t3 set v2 = v2 + 1 where id = 100") + // It's rare that a statement causes multiple LockKeys invocation and each involves one single key, but it's + // theoretically possible. CTE makes it simple to construct this kind of test cases. + // Let t1's column `v` points to an `id` in t2, and so do t2 and t3. + // The update part is blocked. + res := mustExecAsync(tk, ` + with + c1 as (select /*+ MERGE() */ * from t1 where id = 1), + c2 as (select /*+ MERGE() */ t2.* from c1 join t2 on c1.v = t2.id for update) + update c2 join t3 on c2.v = t3.id set t3.v = t3.v + 1 + `) + mustTimeout(t, res, time.Millisecond*50) + + // Pause on pessimistic retry. + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/pessimisticSelectForUpdateRetry", "pause")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/pessimisticDMLRetry", "pause")) + tk2.MustExec("commit") + mustTimeout(t, res, time.Millisecond*50) + + // Check that tk didn't release its lock at the time that the stmt retry begins. + mustLocked("select * from t2 where id = 10 for update nowait") + + // Still locked after the retry. + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/pessimisticSelectForUpdateRetry")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/pessimisticDMLRetry")) + mustRecv(t, res) + mustLocked("select * from t2 where id = 10 for update nowait") + + tk.MustExec("commit") + tk.MustQuery("select * from t3").Check(testkit.Rows("100 101 101", "101 200 200")) + + // Test the case that the locks to acquire changes after retry. This is done be letting `tk2` update table `t1` + // which is not locked by the `tk`. + tk.MustExec("begin pessimistic") + tk2.MustExec("begin pessimistic") + tk2.MustExec("update t3 set v2 = v2 + 1 where id = 100") + res = mustExecAsync(tk, ` + with + c1 as (select /*+ MERGE() */ * from t1 where id = 1), + c2 as (select /*+ MERGE() */ t2.* from c1 join t2 on c1.v = t2.id for update) + update c2 join t3 on c2.v = t3.id set t3.v = t3.v + 1 + `) + mustTimeout(t, res, time.Millisecond*50) + + tk2.MustExec("update t1 set v = 11 where id = 1") + // Pause on pessimistic retry. + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/pessimisticSelectForUpdateRetry", "pause")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/pessimisticDMLRetry", "pause")) + tk2.MustExec("commit") + mustTimeout(t, res, time.Millisecond*50) + + // Check that tk didn't release its lock at the time that the stmt retry begins. + mustLocked("select * from t2 where id = 10 for update nowait") + + // The lock is released after the pessimistic retry, but the other row is locked instead. + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/pessimisticSelectForUpdateRetry")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/pessimisticDMLRetry")) + mustRecv(t, res) + tk2.MustExec("begin pessimistic") + tk2.MustQuery("select * from t2 where id = 10 for update").Check(testkit.Rows("10 100")) + tk2.MustExec("rollback") + mustLocked("select * from t2 where id = 11 for update nowait") + + tk.MustExec("commit") + tk.MustQuery("select * from t3").Check(testkit.Rows("100 101 102", "101 201 200")) +} + +func TestIssue40114(t *testing.T) { + store := realtikvtest.CreateMockStoreAndSetup(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + + tk.MustExec("create table t (id int primary key, v int)") + tk.MustExec("insert into t values (1, 1), (2, 2)") + + require.NoError(t, failpoint.Enable("tikvclient/twoPCRequestBatchSizeLimit", "return")) + require.NoError(t, failpoint.Enable("tikvclient/beforeAsyncPessimisticRollback", `return("skip")`)) + defer func() { + require.NoError(t, failpoint.Disable("tikvclient/twoPCRequestBatchSizeLimit")) + require.NoError(t, failpoint.Disable("tikvclient/beforeAsyncPessimisticRollback")) + }() + + tk.MustExec("set @@innodb_lock_wait_timeout = 1") + tk.MustExec("begin pessimistic") + tk2.MustExec("begin pessimistic") + // tk2 block tk on row 2. + tk2.MustExec("update t set v = v + 1 where id = 2") + // tk wait until timeout. + tk.MustGetErrCode("delete from t where id = 1 or id = 2", mysql.ErrLockWaitTimeout) + tk2.MustExec("commit") + // Now, row 1 should have been successfully locked since it's not in the same batch with row 2 (controlled by + // failpoint `twoPCRequestBatchSizeLimit`); then it's not pessimisticRollback-ed (controlled by failpoint + // `beforeAsyncPessimisticRollback`, which simulates a network fault). + // Ensure the row is still locked. + time.Sleep(time.Millisecond * 50) + tk2.MustExec("begin pessimistic") + tk2.MustGetErrCode("select * from t where id = 1 for update nowait", mysql.ErrLockAcquireFailAndNoWaitSet) + tk2.MustExec("rollback") + + // tk is still in transaction. + tk.MustQuery("select @@tidb_current_ts = 0").Check(testkit.Rows("0")) + // This will unexpectedly succeed in issue 40114. + tk.MustGetErrCode("insert into t values (1, 2)", mysql.ErrDupEntry) + tk.MustExec("commit") + tk.MustExec("admin check table t") + tk.MustQuery("select * from t").Check(testkit.Rows("1 1", "2 3")) +} diff --git a/tests/realtikvtest/sessiontest/session_fail_test.go b/tests/realtikvtest/sessiontest/session_fail_test.go index 919932e6f9357..a3df51be821c0 100644 --- a/tests/realtikvtest/sessiontest/session_fail_test.go +++ b/tests/realtikvtest/sessiontest/session_fail_test.go @@ -200,7 +200,6 @@ func TestAutoCommitNeedNotLinearizability(t *testing.T) { func TestKill(t *testing.T) { store := realtikvtest.CreateMockStoreAndSetup(t) - tk := testkit.NewTestKit(t, store) tk.MustExec("kill connection_id();") } diff --git a/tests/realtikvtest/statisticstest/BUILD.bazel b/tests/realtikvtest/statisticstest/BUILD.bazel index 1203b0366c08b..e9d8f215e7939 100644 --- a/tests/realtikvtest/statisticstest/BUILD.bazel +++ b/tests/realtikvtest/statisticstest/BUILD.bazel @@ -12,9 +12,7 @@ go_test( deps = [ "//statistics/handle", "//testkit", - "//testkit/testsetup", "//tests/realtikvtest", "@com_github_stretchr_testify//require", - "@org_uber_go_goleak//:goleak", ], ) diff --git a/tests/realtikvtest/statisticstest/main_test.go b/tests/realtikvtest/statisticstest/main_test.go index 5fef5b584be04..3010d3ee88066 100644 --- a/tests/realtikvtest/statisticstest/main_test.go +++ b/tests/realtikvtest/statisticstest/main_test.go @@ -17,20 +17,9 @@ package statisticstest import ( "testing" - "github.com/pingcap/tidb/testkit/testsetup" "github.com/pingcap/tidb/tests/realtikvtest" - "go.uber.org/goleak" ) func TestMain(m *testing.M) { - opts := []goleak.Option{ - goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), - goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), - goleak.IgnoreTopFunction("google.golang.org/grpc.(*ccBalancerWrapper).watcher"), - goleak.IgnoreTopFunction("internal/poll.runtime_pollWait"), - goleak.IgnoreTopFunction("net/http.(*persistConn).writeLoop"), - } - testsetup.SetupForCommonTest() - goleak.VerifyTestMain(m, opts...) realtikvtest.RunTestMain(m) } diff --git a/tests/realtikvtest/testkit.go b/tests/realtikvtest/testkit.go index b3ae5f3c6a2ac..8b05e1518e3ff 100644 --- a/tests/realtikvtest/testkit.go +++ b/tests/realtikvtest/testkit.go @@ -19,6 +19,7 @@ package realtikvtest import ( "flag" "fmt" + "strings" "sync/atomic" "testing" "time" @@ -40,8 +41,17 @@ import ( "go.uber.org/goleak" ) -// WithRealTiKV is a flag identify whether tests run with real TiKV -var WithRealTiKV = flag.Bool("with-real-tikv", false, "whether tests run with real TiKV") +var ( + // WithRealTiKV is a flag identify whether tests run with real TiKV + WithRealTiKV = flag.Bool("with-real-tikv", false, "whether tests run with real TiKV") + + // TiKVPath is the path of the TiKV Storage. + TiKVPath = flag.String("tikv-path", "tikv://127.0.0.1:2379?disableGC=true", "TiKV addr") + + // KeyspaceName is an option to specify the name of keyspace that the tests run on, + // this option is only valid while the flag WithRealTiKV is set. + KeyspaceName = flag.String("keyspace-name", "", "the name of keyspace that the tests run on") +) // RunTestMain run common setups for all real tikv tests. func RunTestMain(m *testing.M) { @@ -97,8 +107,9 @@ func CreateMockStoreAndDomainAndSetup(t *testing.T, opts ...mockstore.MockTiKVSt var d driver.TiKVDriver config.UpdateGlobal(func(conf *config.Config) { conf.TxnLocalLatches.Enabled = false + conf.KeyspaceName = *KeyspaceName }) - store, err = d.Open("tikv://127.0.0.1:2379?disableGC=true") + store, err = d.Open(*TiKVPath) require.NoError(t, err) dom, err = session.BootstrapSession(store) @@ -110,8 +121,12 @@ func CreateMockStoreAndDomainAndSetup(t *testing.T, opts ...mockstore.MockTiKVSt tk.MustExec(fmt.Sprintf("set global innodb_lock_wait_timeout = %d", variable.DefInnodbLockWaitTimeout)) tk.MustExec("use test") rs := tk.MustQuery("show tables") + tables := []string{} for _, row := range rs.Rows() { - tk.MustExec(fmt.Sprintf("drop table %s", row[0])) + tables = append(tables, fmt.Sprintf("`%v`", row[0])) + } + if len(tables) > 0 { + tk.MustExec(fmt.Sprintf("drop table %s", strings.Join(tables, ","))) } } else { store, err = mockstore.NewMockStore(opts...) diff --git a/tests/realtikvtest/txntest/txn_state_test.go b/tests/realtikvtest/txntest/txn_state_test.go index 59049dd129151..b8a687a074964 100644 --- a/tests/realtikvtest/txntest/txn_state_test.go +++ b/tests/realtikvtest/txntest/txn_state_test.go @@ -128,14 +128,30 @@ func TestEntriesCountAndSize(t *testing.T) { tk.MustExec("insert into t(a) values (1);") info := tk.Session().TxnInfo() require.Equal(t, uint64(1), info.EntriesCount) - require.Equal(t, uint64(29), info.EntriesSize) tk.MustExec("insert into t(a) values (2);") info = tk.Session().TxnInfo() require.Equal(t, uint64(2), info.EntriesCount) - require.Equal(t, uint64(58), info.EntriesSize) tk.MustExec("commit;") } +func TestMemDBTracker(t *testing.T) { + store := realtikvtest.CreateMockStoreAndSetup(t) + tk := testkit.NewTestKit(t, store) + session := tk.Session() + tk.MustExec("use test") + tk.MustExec("create table t (id int)") + tk.MustExec("begin") + for i := 0; i < (1 << 10); i++ { + tk.MustExec("insert t (id) values (1)") + } + require.Less(t, int64(1<<(10+4)), session.GetSessionVars().MemDBFootprint.BytesConsumed()) + require.Greater(t, int64(1<<(14+4)), session.GetSessionVars().MemDBFootprint.BytesConsumed()) + for i := 0; i < (1 << 14); i++ { + tk.MustExec("insert t (id) values (1)") + } + require.Less(t, int64(1<<(14+4)), session.GetSessionVars().MemDBFootprint.BytesConsumed()) +} + func TestRunning(t *testing.T) { store := realtikvtest.CreateMockStoreAndSetup(t) diff --git a/tidb-binlog/pump_client/BUILD.bazel b/tidb-binlog/pump_client/BUILD.bazel index ad98822adaf5b..863fe7b61f8f9 100644 --- a/tidb-binlog/pump_client/BUILD.bazel +++ b/tidb-binlog/pump_client/BUILD.bazel @@ -21,6 +21,7 @@ go_library( "@org_golang_google_grpc//:grpc", "@org_golang_google_grpc//codes", "@org_golang_google_grpc//credentials", + "@org_golang_google_grpc//credentials/insecure", "@org_golang_google_grpc//status", "@org_uber_go_zap//:zap", ], @@ -41,5 +42,6 @@ go_test( "@com_github_pingcap_tipb//go-binlog", "@com_github_stretchr_testify//require", "@org_golang_google_grpc//:grpc", + "@org_golang_google_grpc//credentials/insecure", ], ) diff --git a/tidb-binlog/pump_client/bench_test.go b/tidb-binlog/pump_client/bench_test.go index fe3eb2f6ffb30..ae93203319e21 100644 --- a/tidb-binlog/pump_client/bench_test.go +++ b/tidb-binlog/pump_client/bench_test.go @@ -23,6 +23,7 @@ import ( pb "github.com/pingcap/tipb/go-binlog" "github.com/stretchr/testify/require" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) func Benchmark100Thread(b *testing.B) { @@ -86,7 +87,7 @@ func createMockPumpsClientAndServer(b *testing.B) (*PumpsClient, *mockPumpServer return net.DialTimeout("tcp", addr, timeout) }) - clientCon, err := grpc.Dial(addr, opt, grpc.WithInsecure()) + clientCon, err := grpc.Dial(addr, opt, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { b.Fatal(err) } diff --git a/tidb-binlog/pump_client/client_test.go b/tidb-binlog/pump_client/client_test.go index ac287773072ed..974ed76d29aa8 100644 --- a/tidb-binlog/pump_client/client_test.go +++ b/tidb-binlog/pump_client/client_test.go @@ -27,6 +27,7 @@ import ( "github.com/pingcap/tipb/go-binlog" "github.com/stretchr/testify/require" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) var ( @@ -176,7 +177,7 @@ func TestWriteBinlog(t *testing.T) { opt := grpc.WithDialer(func(addr string, timeout time.Duration) (net.Conn, error) { return net.DialTimeout(cfg.serverMode, addr, timeout) }) - clientCon, err := grpc.Dial(cfg.addr, opt, grpc.WithInsecure()) + clientCon, err := grpc.Dial(cfg.addr, opt, grpc.WithTransportCredentials(insecure.NewCredentials())) require.NoError(t, err) require.NotNil(t, clientCon) pumpClient := mockPumpsClient(binlog.NewPumpClient(clientCon), true) diff --git a/tidb-binlog/pump_client/pump.go b/tidb-binlog/pump_client/pump.go index 82fa48da92da2..4459bb1bfc5ef 100644 --- a/tidb-binlog/pump_client/pump.go +++ b/tidb-binlog/pump_client/pump.go @@ -29,6 +29,7 @@ import ( "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" ) var ( @@ -103,7 +104,7 @@ func (p *PumpStatus) createGrpcClient() error { if p.security != nil { clientConn, err = grpc.Dial(p.Addr, dialerOpt, grpc.WithTransportCredentials(credentials.NewTLS(p.security))) } else { - clientConn, err = grpc.Dial(p.Addr, dialerOpt, grpc.WithInsecure()) + clientConn, err = grpc.Dial(p.Addr, dialerOpt, grpc.WithTransportCredentials(insecure.NewCredentials())) } if err != nil { atomic.AddInt64(&p.ErrNum, 1) diff --git a/tidb-server/BUILD.bazel b/tidb-server/BUILD.bazel index d85652de2db88..f6fce7424a1eb 100644 --- a/tidb-server/BUILD.bazel +++ b/tidb-server/BUILD.bazel @@ -22,6 +22,7 @@ go_library( "//planner/core", "//plugin", "//privilege/privileges", + "//resourcemanager", "//server", "//session", "//session/txninfo", @@ -29,6 +30,7 @@ go_library( "//sessionctx/variable", "//statistics", "//store", + "//store/copr", "//store/driver", "//store/mockstore", "//store/mockstore/unistore/metrics", @@ -45,9 +47,11 @@ go_library( "//util/printer", "//util/sem", "//util/signal", + "//util/stmtsummary/v2:stmtsummary", "//util/sys/linux", "//util/sys/storage", "//util/systimemon", + "//util/tiflashcompute", "//util/topsql", "//util/versioninfo", "@com_github_coreos_go_semver//semver", diff --git a/tidb-server/main.go b/tidb-server/main.go index dc43f13ff8bc2..4aeb6df33122b 100644 --- a/tidb-server/main.go +++ b/tidb-server/main.go @@ -47,6 +47,7 @@ import ( plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/plugin" "github.com/pingcap/tidb/privilege/privileges" + "github.com/pingcap/tidb/resourcemanager" "github.com/pingcap/tidb/server" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/session/txninfo" @@ -54,6 +55,7 @@ import ( "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" kvstore "github.com/pingcap/tidb/store" + "github.com/pingcap/tidb/store/copr" "github.com/pingcap/tidb/store/driver" "github.com/pingcap/tidb/store/mockstore" uni_metrics "github.com/pingcap/tidb/store/mockstore/unistore/metrics" @@ -70,9 +72,11 @@ import ( "github.com/pingcap/tidb/util/printer" "github.com/pingcap/tidb/util/sem" "github.com/pingcap/tidb/util/signal" + stmtsummaryv2 "github.com/pingcap/tidb/util/stmtsummary/v2" "github.com/pingcap/tidb/util/sys/linux" storageSys "github.com/pingcap/tidb/util/sys/storage" "github.com/pingcap/tidb/util/systimemon" + "github.com/pingcap/tidb/util/tiflashcompute" "github.com/pingcap/tidb/util/topsql" "github.com/pingcap/tidb/util/versioninfo" "github.com/prometheus/client_golang/prometheus" @@ -119,8 +123,11 @@ const ( nmProxyProtocolHeaderTimeout = "proxy-protocol-header-timeout" nmAffinityCPU = "affinity-cpus" - nmInitializeSecure = "initialize-secure" - nmInitializeInsecure = "initialize-insecure" + nmInitializeSecure = "initialize-secure" + nmInitializeInsecure = "initialize-insecure" + nmInitializeSQLFile = "initialize-sql-file" + nmDisconnectOnExpiredPassword = "disconnect-on-expired-password" + nmKeyspaceName = "keyspace-name" ) var ( @@ -164,9 +171,12 @@ var ( proxyProtocolNetworks = flag.String(nmProxyProtocolNetworks, "", "proxy protocol networks allowed IP or *, empty mean disable proxy protocol support") proxyProtocolHeaderTimeout = flag.Uint(nmProxyProtocolHeaderTimeout, 5, "proxy protocol header read timeout, unit is second. (Deprecated: as proxy protocol using lazy mode, header read timeout no longer used)") - // Security - initializeSecure = flagBoolean(nmInitializeSecure, false, "bootstrap tidb-server in secure mode") - initializeInsecure = flagBoolean(nmInitializeInsecure, true, "bootstrap tidb-server in insecure mode") + // Bootstrap and security + initializeSecure = flagBoolean(nmInitializeSecure, false, "bootstrap tidb-server in secure mode") + initializeInsecure = flagBoolean(nmInitializeInsecure, true, "bootstrap tidb-server in insecure mode") + initializeSQLFile = flag.String(nmInitializeSQLFile, "", "SQL file to execute on first bootstrap") + disconnectOnExpiredPassword = flagBoolean(nmDisconnectOnExpiredPassword, true, "the server disconnects the client when the password is expired") + keyspaceName = flag.String(nmKeyspaceName, "", "keyspace name.") ) func main() { @@ -192,10 +202,23 @@ func main() { } setupLog() setupExtensions() + setupStmtSummary() err := cpuprofile.StartCPUProfiler() terror.MustNil(err) + if config.GetGlobalConfig().DisaggregatedTiFlash && config.GetGlobalConfig().UseAutoScaler { + clusterID, err := config.GetAutoScalerClusterID() + terror.MustNil(err) + + err = tiflashcompute.InitGlobalTopoFetcher( + config.GetGlobalConfig().TiFlashComputeAutoScalerType, + config.GetGlobalConfig().TiFlashComputeAutoScalerAddr, + clusterID, + config.GetGlobalConfig().IsTiFlashComputeFixedPool) + terror.MustNil(err) + } + // Enable failpoints in tikv/client-go if the test API is enabled. // It appears in the main function to be set before any use of client-go to prevent data race. if _, err := failpoint.Status("github.com/pingcap/tidb/server/enableTestAPI"); err == nil { @@ -209,8 +232,16 @@ func main() { printInfo() setupBinlogClient() setupMetrics() - storage, dom := createStoreAndDomain() + + keyspaceName := config.GetGlobalKeyspaceName() + + resourcemanager.InstanceResourceManager.Start() + storage, dom := createStoreAndDomain(keyspaceName) svr := createServer(storage, dom) + err = driver.TrySetupGlobalResourceController(context.Background(), dom.ServerID(), storage) + if err != nil { + logutil.BgLogger().Warn("failed to setup global resource controller", zap.Error(err)) + } // Register error API is not thread-safe, the caller MUST NOT register errors after initialization. // To prevent misuse, set a flag to indicate that register new error will panic immediately. @@ -222,6 +253,7 @@ func main() { svr.Close() cleanup(svr, storage, dom, graceful) cpuprofile.StopCPUProfiler() + resourcemanager.InstanceResourceManager.Stop() close(exited) }) topsql.SetupTopSQL() @@ -299,12 +331,18 @@ func registerMetrics() { } } -func createStoreAndDomain() (kv.Storage, *domain.Domain) { +func createStoreAndDomain(keyspaceName string) (kv.Storage, *domain.Domain) { cfg := config.GetGlobalConfig() - fullPath := fmt.Sprintf("%s://%s", cfg.Store, cfg.Path) + var fullPath string + if keyspaceName == "" { + fullPath = fmt.Sprintf("%s://%s", cfg.Store, cfg.Path) + } else { + fullPath = fmt.Sprintf("%s://%s?keyspaceName=%s", cfg.Store, cfg.Path, keyspaceName) + } var err error storage, err := kvstore.New(fullPath) terror.MustNil(err) + copr.GlobalMPPFailedStoreProber.Run() err = infosync.CheckTiKVVersion(storage, *semver.New(versioninfo.TiKVMinVersion)) terror.MustNil(err) // Bootstrap a session to load information schema. @@ -441,7 +479,6 @@ func overrideConfig(cfg *config.Config) { cfg.Port = uint(p) } if actualFlags[nmCors] { - fmt.Println(cors) cfg.Cors = *cors } if actualFlags[nmStore] { @@ -525,7 +562,7 @@ func overrideConfig(cfg *config.Config) { // Sanity check: can't specify both options if actualFlags[nmInitializeSecure] && actualFlags[nmInitializeInsecure] { - err = fmt.Errorf("the options --initialize-insecure and --initialize-secure are mutually exclusive") + err = fmt.Errorf("the options -initialize-insecure and -initialize-secure are mutually exclusive") terror.MustNil(err) } // The option --initialize-secure=true ensures that a secure bootstrap is used. @@ -537,13 +574,30 @@ func overrideConfig(cfg *config.Config) { if actualFlags[nmInitializeInsecure] { cfg.Security.SecureBootstrap = !*initializeInsecure } + if actualFlags[nmDisconnectOnExpiredPassword] { + cfg.Security.DisconnectOnExpiredPassword = *disconnectOnExpiredPassword + } // Secure bootstrap initializes with Socket authentication // which is not supported on windows. Only the insecure bootstrap // method is supported. if runtime.GOOS == "windows" && cfg.Security.SecureBootstrap { - err = fmt.Errorf("the option --initialize-secure is not supported on Windows") + err = fmt.Errorf("the option -initialize-secure is not supported on Windows") terror.MustNil(err) } + // Initialize SQL File is used to run a set of SQL statements after first bootstrap. + // It is important in the use case that you want to set GLOBAL variables, which + // are persisted to the cluster and not read from a config file. + if actualFlags[nmInitializeSQLFile] { + if _, err := os.Stat(*initializeSQLFile); err != nil { + err = fmt.Errorf("can not access -initialize-sql-file %s", *initializeSQLFile) + terror.MustNil(err) + } + cfg.InitializeSQLFile = *initializeSQLFile + } + + if actualFlags[nmKeyspaceName] { + cfg.KeyspaceName = *keyspaceName + } } func setVersions() { @@ -629,8 +683,13 @@ func setGlobalVars() { } plannercore.AllowCartesianProduct.Store(cfg.Performance.CrossJoin) privileges.SkipWithGrant = cfg.Security.SkipGrantTable - kv.TxnTotalSizeLimit = cfg.Performance.TxnTotalSizeLimit - if cfg.Performance.TxnEntrySizeLimit > 120*1024*1024 { + if cfg.Performance.TxnTotalSizeLimit == config.DefTxnTotalSizeLimit { + // practically deprecate the config, let the new session memory tracker take charge of it. + kv.TxnTotalSizeLimit = config.SuperLargeTxnSize + } else { + kv.TxnTotalSizeLimit = cfg.Performance.TxnTotalSizeLimit + } + if cfg.Performance.TxnEntrySizeLimit > config.MaxTxnEntrySizeLimit { log.Fatal("cannot set txn entry size limit larger than 120M") } kv.TxnEntrySizeLimit = cfg.Performance.TxnEntrySizeLimit @@ -641,6 +700,7 @@ func setGlobalVars() { variable.ProcessGeneralLog.Store(cfg.Instance.TiDBGeneralLog) variable.EnablePProfSQLCPU.Store(cfg.Instance.EnablePProfSQLCPU) variable.EnableRCReadCheckTS.Store(cfg.Instance.TiDBRCReadCheckTS) + variable.IsSandBoxModeEnabled.Store(!cfg.Security.DisconnectOnExpiredPassword) atomic.StoreUint32(&variable.DDLSlowOprThreshold, cfg.Instance.DDLSlowOprThreshold) atomic.StoreUint64(&variable.ExpensiveQueryTimeThreshold, cfg.Instance.ExpensiveQueryTimeThreshold) @@ -773,16 +833,7 @@ func setupMetrics() { systimeErrHandler := func() { metrics.TimeJumpBackCounter.Inc() } - callBackCount := 0 - successCallBack := func() { - callBackCount++ - // It is callback by monitor per second, we increase metrics.KeepAliveCounter per 5s. - if callBackCount >= 5 { - callBackCount = 0 - metrics.KeepAliveCounter.Inc() - } - } - go systimemon.StartMonitor(time.Now, systimeErrHandler, successCallBack) + go systimemon.StartMonitor(time.Now, systimeErrHandler) pushMetric(cfg.Status.MetricsAddr, time.Duration(cfg.Status.MetricsInterval)*time.Second) } @@ -801,6 +852,7 @@ func setupTracing() { func closeDomainAndStorage(storage kv.Storage, dom *domain.Domain) { tikv.StoreShuttingDown(1) dom.Close() + copr.GlobalMPPFailedStoreProber.Stop() err := storage.Close() terror.Log(errors.Trace(err)) } @@ -809,6 +861,9 @@ func cleanup(svr *server.Server, storage kv.Storage, dom *domain.Domain, gracefu if graceful { done := make(chan struct{}) svr.GracefulDown(context.Background(), done) + // Kill sys processes such as auto analyze. Otherwise, tidb-server cannot exit until auto analyze is finished. + // See https://github.com/pingcap/tidb/issues/40038 for details. + svr.KillSysProcesses() } else { svr.TryGracefulDown() } @@ -829,3 +884,18 @@ func stringToList(repairString string) []string { return r == ',' || r == ' ' || r == '"' }) } + +func setupStmtSummary() { + instanceCfg := config.GetGlobalConfig().Instance + if instanceCfg.StmtSummaryEnablePersistent { + err := stmtsummaryv2.Setup(&stmtsummaryv2.Config{ + Filename: instanceCfg.StmtSummaryFilename, + FileMaxSize: instanceCfg.StmtSummaryFileMaxSize, + FileMaxDays: instanceCfg.StmtSummaryFileMaxDays, + FileMaxBackups: instanceCfg.StmtSummaryFileMaxBackups, + }) + if err != nil { + logutil.BgLogger().Error("failed to setup statements summary", zap.Error(err)) + } + } +} diff --git a/tools/check/revive.toml b/tools/check/revive.toml index aec448993d8e2..59c0fa9ba1710 100644 --- a/tools/check/revive.toml +++ b/tools/check/revive.toml @@ -29,7 +29,7 @@ warningCode = -1 [rule.var-naming] [rule.package-comments] [rule.range] -[rule.receiver-naming] +#[rule.receiver-naming] [rule.indent-error-flow] [rule.superfluous-else] [rule.modifies-parameter] diff --git a/tools/check/ut.go b/tools/check/ut.go index 08b31d243a157..32f85b422109b 100644 --- a/tools/check/ut.go +++ b/tools/check/ut.go @@ -837,7 +837,7 @@ func skipDIR(pkg string) bool { func buildTestBinary(pkg string) error { // go test -c - cmd := exec.Command("go", "test", "-c", "-vet", "off", "-o", testFileName(pkg)) + cmd := exec.Command("go", "test", "-c", "-vet", "off", "--tags=intest", "-o", testFileName(pkg)) if coverprofile != "" { cmd.Args = append(cmd.Args, "-cover") } diff --git a/ttl/cache/BUILD.bazel b/ttl/cache/BUILD.bazel new file mode 100644 index 0000000000000..1e448cbeccf3f --- /dev/null +++ b/ttl/cache/BUILD.bazel @@ -0,0 +1,71 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "cache", + srcs = [ + "base.go", + "infoschema.go", + "table.go", + "task.go", + "ttlstatus.go", + ], + importpath = "github.com/pingcap/tidb/ttl/cache", + visibility = ["//visibility:public"], + deps = [ + "//infoschema", + "//kv", + "//parser/ast", + "//parser/model", + "//parser/mysql", + "//parser/terror", + "//sessionctx", + "//table/tables", + "//tablecodec", + "//ttl/session", + "//types", + "//util/chunk", + "//util/codec", + "//util/logutil", + "//util/mathutil", + "@com_github_pingcap_errors//:errors", + "@com_github_tikv_client_go_v2//tikv", + "@org_uber_go_zap//:zap", + ], +) + +go_test( + name = "cache_test", + timeout = "short", + srcs = [ + "base_test.go", + "infoschema_test.go", + "main_test.go", + "split_test.go", + "table_test.go", + "task_test.go", + "ttlstatus_test.go", + ], + embed = [":cache"], + flaky = True, + shard_count = 50, + deps = [ + "//infoschema", + "//kv", + "//parser/model", + "//server", + "//session", + "//store/helper", + "//tablecodec", + "//testkit", + "//testkit/testsetup", + "//ttl/session", + "//types", + "//util/codec", + "@com_github_pingcap_kvproto//pkg/metapb", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + "@com_github_tikv_client_go_v2//tikv", + "@com_github_tikv_pd_client//:client", + "@org_uber_go_goleak//:goleak", + ], +) diff --git a/ttl/cache/base.go b/ttl/cache/base.go new file mode 100644 index 0000000000000..bf23dd8e14bb1 --- /dev/null +++ b/ttl/cache/base.go @@ -0,0 +1,45 @@ +// 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, +// 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 cache + +import ( + "time" +) + +type baseCache struct { + interval time.Duration + + updateTime time.Time +} + +func newBaseCache(interval time.Duration) baseCache { + return baseCache{ + interval: interval, + } +} + +// ShouldUpdate returns whether this cache needs update +func (bc *baseCache) ShouldUpdate() bool { + return time.Since(bc.updateTime) > bc.interval +} + +// SetInterval sets the interval of updating cache +func (bc *baseCache) SetInterval(interval time.Duration) { + bc.interval = interval +} + +func (bc *baseCache) GetInterval() time.Duration { + return bc.interval +} diff --git a/ttl/cache/base_test.go b/ttl/cache/base_test.go new file mode 100644 index 0000000000000..838cfbbf55329 --- /dev/null +++ b/ttl/cache/base_test.go @@ -0,0 +1,33 @@ +// 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, +// 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 cache + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestBaseCache(t *testing.T) { + baseCache := newBaseCache(time.Nanosecond) + time.Sleep(time.Microsecond) + + assert.True(t, baseCache.ShouldUpdate()) + + baseCache.updateTime = time.Now() + baseCache.SetInterval(time.Hour) + assert.False(t, baseCache.ShouldUpdate()) +} diff --git a/ttl/cache/infoschema.go b/ttl/cache/infoschema.go new file mode 100644 index 0000000000000..f68429f5520d4 --- /dev/null +++ b/ttl/cache/infoschema.go @@ -0,0 +1,107 @@ +// 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, +// 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 cache + +import ( + "time" + + "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/ttl/session" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" +) + +// InfoSchemaCache is the cache for InfoSchema, it builds a map from physical table id to physical table information +type InfoSchemaCache struct { + baseCache + + schemaVer int64 + Tables map[int64]*PhysicalTable +} + +// NewInfoSchemaCache creates the cache for info schema +func NewInfoSchemaCache(updateInterval time.Duration) *InfoSchemaCache { + return &InfoSchemaCache{ + baseCache: newBaseCache(updateInterval), + Tables: make(map[int64]*PhysicalTable), + } +} + +// Update updates the info schema cache +func (isc *InfoSchemaCache) Update(se session.Session) error { + is := se.GetDomainInfoSchema().(infoschema.InfoSchema) + + if isc.schemaVer == is.SchemaMetaVersion() { + return nil + } + + newTables := make(map[int64]*PhysicalTable, len(isc.Tables)) + for _, db := range is.AllSchemas() { + for _, tbl := range is.SchemaTables(db.Name) { + tblInfo := tbl.Meta() + if tblInfo.TTLInfo == nil || !tblInfo.TTLInfo.Enable || tblInfo.State != model.StatePublic { + continue + } + + logger := logutil.BgLogger().With(zap.String("schema", db.Name.L), zap.Int64("tableID", tblInfo.ID), zap.String("tableName", tblInfo.Name.L)) + + if tblInfo.Partition == nil { + ttlTable, err := isc.newTable(db.Name, tblInfo, nil) + if err != nil { + logger.Warn("fail to build info schema cache", zap.Error(err)) + continue + } + newTables[tblInfo.ID] = ttlTable + continue + } + + for _, par := range tblInfo.Partition.Definitions { + par := par + ttlTable, err := isc.newTable(db.Name, tblInfo, &par) + if err != nil { + logger.Warn("fail to build info schema cache", zap.Int64("partitionID", par.ID), zap.String("partition", par.Name.L), zap.Error(err)) + continue + } + newTables[par.ID] = ttlTable + } + } + } + + isc.schemaVer = is.SchemaMetaVersion() + isc.Tables = newTables + isc.updateTime = time.Now() + return nil +} + +func (isc *InfoSchemaCache) newTable(schema model.CIStr, tblInfo *model.TableInfo, par *model.PartitionDefinition) (*PhysicalTable, error) { + id := tblInfo.ID + if par != nil { + id = par.ID + } + + if isc.Tables != nil { + ttlTable, ok := isc.Tables[id] + if ok && ttlTable.TableInfo == tblInfo { + return ttlTable, nil + } + } + + partitionName := model.NewCIStr("") + if par != nil { + partitionName = par.Name + } + return NewPhysicalTable(schema, tblInfo, partitionName) +} diff --git a/ttl/cache/infoschema_test.go b/ttl/cache/infoschema_test.go new file mode 100644 index 0000000000000..ef428e4399c25 --- /dev/null +++ b/ttl/cache/infoschema_test.go @@ -0,0 +1,73 @@ +// 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, +// 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 cache_test + +import ( + "testing" + "time" + + "github.com/pingcap/tidb/server" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/ttl/session" + "github.com/stretchr/testify/assert" +) + +func TestInfoSchemaCache(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + sv := server.CreateMockServer(t, store) + sv.SetDomain(dom) + defer sv.Close() + + conn := server.CreateMockConn(t, sv) + sctx := conn.Context().Session + tk := testkit.NewTestKitWithSession(t, store, sctx) + se := session.NewSession(sctx, sctx, func(_ session.Session) {}) + + isc := cache.NewInfoSchemaCache(time.Hour) + + // test should update + assert.True(t, isc.ShouldUpdate()) + assert.NoError(t, isc.Update(se)) + assert.False(t, isc.ShouldUpdate()) + + // test new tables are synced + assert.Equal(t, 0, len(isc.Tables)) + tk.MustExec("create table test.t(created_at datetime) ttl = created_at + INTERVAL 5 YEAR") + assert.NoError(t, isc.Update(se)) + assert.Equal(t, 1, len(isc.Tables)) + for _, table := range isc.Tables { + assert.Equal(t, "t", table.TableInfo.Name.L) + } + + // test new partitioned table are synced + tk.MustExec("drop table test.t") + tk.MustExec(`create table test.t(created_at datetime) + ttl = created_at + INTERVAL 5 YEAR + partition by range (YEAR(created_at)) ( + partition p0 values less than (1991), + partition p1 values less than (2000) + ) + `) + assert.NoError(t, isc.Update(se)) + assert.Equal(t, 2, len(isc.Tables)) + partitions := []string{} + for id, table := range isc.Tables { + assert.Equal(t, "t", table.TableInfo.Name.L) + assert.Equal(t, id, table.PartitionDef.ID) + partitions = append(partitions, table.PartitionDef.Name.L) + } + assert.ElementsMatch(t, []string{"p0", "p1"}, partitions) +} diff --git a/ttl/cache/main_test.go b/ttl/cache/main_test.go new file mode 100644 index 0000000000000..e3846871bb55b --- /dev/null +++ b/ttl/cache/main_test.go @@ -0,0 +1,33 @@ +// 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, +// 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 cache_test + +import ( + "testing" + + "github.com/pingcap/tidb/testkit/testsetup" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + testsetup.SetupForCommonTest() + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } + goleak.VerifyTestMain(m, opts...) +} diff --git a/ttl/cache/split_test.go b/ttl/cache/split_test.go new file mode 100644 index 0000000000000..35638f1d1f409 --- /dev/null +++ b/ttl/cache/split_test.go @@ -0,0 +1,817 @@ +// 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, +// 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 cache_test + +import ( + "context" + "fmt" + "math" + "sort" + "testing" + + "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/store/helper" + "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/codec" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/tikv" + pd "github.com/tikv/pd/client" +) + +func newMockRegion(regionID uint64, startKey []byte, endKey []byte) *pd.Region { + leader := &metapb.Peer{ + Id: regionID, + StoreId: 1, + Role: metapb.PeerRole_Voter, + } + + return &pd.Region{ + Meta: &metapb.Region{ + Id: regionID, + StartKey: startKey, + EndKey: endKey, + Peers: []*metapb.Peer{leader}, + }, + Leader: leader, + } +} + +type mockPDClient struct { + t *testing.T + pd.Client + regions []*pd.Region + regionsSorted bool +} + +func (c *mockPDClient) ScanRegions(_ context.Context, key, endKey []byte, limit int) ([]*pd.Region, error) { + if len(c.regions) == 0 { + return []*pd.Region{newMockRegion(1, []byte{}, []byte{0xFF, 0xFF})}, nil + } + + if !c.regionsSorted { + sort.Slice(c.regions, func(i, j int) bool { + return kv.Key(c.regions[i].Meta.StartKey).Cmp(c.regions[j].Meta.StartKey) < 0 + }) + c.regionsSorted = true + } + + regions := []*pd.Region{newMockRegion(1, []byte{}, c.regions[0].Meta.StartKey)} + regions = append(regions, c.regions...) + regions = append(regions, newMockRegion(2, c.regions[len(c.regions)-1].Meta.EndKey, []byte{0xFF, 0xFF, 0xFF})) + + result := make([]*pd.Region, 0) + for _, r := range regions { + if kv.Key(r.Meta.StartKey).Cmp(endKey) >= 0 { + continue + } + + if kv.Key(r.Meta.EndKey).Cmp(key) <= 0 { + continue + } + + if len(result) >= limit { + break + } + + result = append(result, r) + } + return result, nil +} + +func (c *mockPDClient) GetStore(_ context.Context, storeID uint64) (*metapb.Store, error) { + return &metapb.Store{ + Id: storeID, + Address: fmt.Sprintf("127.0.0.%d", storeID), + }, nil +} + +type mockTiKVStore struct { + t *testing.T + helper.Storage + pdClient *mockPDClient + cache *tikv.RegionCache + nextRegionID uint64 +} + +func newMockTiKVStore(t *testing.T) *mockTiKVStore { + pdClient := &mockPDClient{t: t} + s := &mockTiKVStore{ + t: t, + pdClient: pdClient, + cache: tikv.NewRegionCache(pdClient), + nextRegionID: 1000, + } + s.refreshCache() + t.Cleanup(func() { + s.cache.Close() + }) + return s +} + +func (s *mockTiKVStore) addFullTableRegion(tableID ...int64) *mockTiKVStore { + prefix1 := tablecodec.GenTablePrefix(tableID[0]) + prefix2 := tablecodec.GenTablePrefix(tableID[len(tableID)-1]) + return s.addRegion(prefix1, prefix2.PrefixNext()) +} + +func (s *mockTiKVStore) addRegionBeginWithTablePrefix(tableID int64, handle kv.Handle) *mockTiKVStore { + start := tablecodec.GenTablePrefix(tableID) + end := tablecodec.EncodeRowKeyWithHandle(tableID, handle) + return s.addRegion(start, end) +} + +func (s *mockTiKVStore) addRegionEndWithTablePrefix(handle kv.Handle, tableID int64) *mockTiKVStore { + start := tablecodec.EncodeRowKeyWithHandle(tableID, handle) + end := tablecodec.GenTablePrefix(tableID + 1) + return s.addRegion(start, end) +} + +func (s *mockTiKVStore) addRegionWithTablePrefix(tableID int64, start kv.Handle, end kv.Handle) *mockTiKVStore { + startKey := tablecodec.EncodeRowKeyWithHandle(tableID, start) + endKey := tablecodec.EncodeRowKeyWithHandle(tableID, end) + return s.addRegion(startKey, endKey) +} + +func (s *mockTiKVStore) addRegion(key, endKey []byte) *mockTiKVStore { + require.True(s.t, kv.Key(endKey).Cmp(key) > 0) + if len(s.pdClient.regions) > 0 { + lastRegion := s.pdClient.regions[len(s.pdClient.regions)-1] + require.True(s.t, kv.Key(endKey).Cmp(lastRegion.Meta.EndKey) >= 0) + } + + regionID := s.nextRegionID + s.nextRegionID++ + leader := &metapb.Peer{ + Id: regionID, + StoreId: 1, + Role: metapb.PeerRole_Voter, + } + + s.pdClient.regions = append(s.pdClient.regions, &pd.Region{ + Meta: &metapb.Region{ + Id: regionID, + StartKey: key, + EndKey: endKey, + Peers: []*metapb.Peer{leader}, + }, + Leader: leader, + }) + + s.pdClient.regionsSorted = false + s.refreshCache() + return s +} + +func (s *mockTiKVStore) refreshCache() { + _, err := s.cache.LoadRegionsInKeyRange( + tikv.NewBackofferWithVars(context.Background(), 1000, nil), + []byte{}, + []byte{0xFF}, + ) + require.NoError(s.t, err) +} + +func (s *mockTiKVStore) batchAddIntHandleRegions(tblID int64, regionCnt int, regionSize int, offset int64) (end kv.IntHandle) { + for i := 0; i < regionCnt; i++ { + start := kv.IntHandle(offset + int64(i*regionSize)) + end = kv.IntHandle(start.IntValue() + int64(regionSize)) + s.addRegionWithTablePrefix(tblID, start, end) + } + return +} + +func (s *mockTiKVStore) clearRegions() { + s.pdClient.regions = nil + s.cache.Close() + s.cache = tikv.NewRegionCache(s.pdClient) + s.refreshCache() +} + +func (s *mockTiKVStore) newCommonHandle(ds ...types.Datum) *kv.CommonHandle { + encoded, err := codec.EncodeKey(nil, nil, ds...) + require.NoError(s.t, err) + h, err := kv.NewCommonHandle(encoded) + require.NoError(s.t, err) + return h +} + +func (s *mockTiKVStore) GetRegionCache() *tikv.RegionCache { + return s.cache +} + +func bytesHandle(t *testing.T, data []byte) kv.Handle { + encoded, err := codec.EncodeKey(nil, nil, types.NewBytesDatum(data)) + require.NoError(t, err) + h, err := kv.NewCommonHandle(encoded) + require.NoError(t, err) + return h +} + +func createTTLTable(t *testing.T, tk *testkit.TestKit, name string, option string) *cache.PhysicalTable { + if option == "" { + return createTTLTableWithSQL(t, tk, name, fmt.Sprintf("create table test.%s(t timestamp) TTL = `t` + interval 1 day", name)) + } + + return createTTLTableWithSQL(t, tk, name, fmt.Sprintf("create table test.%s(id %s primary key, t timestamp) TTL = `t` + interval 1 day", name, option)) +} + +func create2PKTTLTable(t *testing.T, tk *testkit.TestKit, name string, option string) *cache.PhysicalTable { + return createTTLTableWithSQL(t, tk, name, fmt.Sprintf("create table test.%s(id %s, id2 int, t timestamp, primary key(id, id2)) TTL = `t` + interval 1 day", name, option)) +} + +func createTTLTableWithSQL(t *testing.T, tk *testkit.TestKit, name string, sql string) *cache.PhysicalTable { + tk.MustExec(sql) + is, ok := tk.Session().GetDomainInfoSchema().(infoschema.InfoSchema) + require.True(t, ok) + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr(name)) + require.NoError(t, err) + ttlTbl, err := cache.NewPhysicalTable(model.NewCIStr("test"), tbl.Meta(), model.NewCIStr("")) + require.NoError(t, err) + return ttlTbl +} + +func checkRange(t *testing.T, r cache.ScanRange, start, end types.Datum) { + if start.IsNull() { + require.Nil(t, r.Start) + } else { + require.Equal(t, 1, len(r.Start)) + require.Equal(t, start.Kind(), r.Start[0].Kind()) + require.Equal(t, start.GetValue(), r.Start[0].GetValue()) + } + + if end.IsNull() { + require.Nil(t, r.End) + } else { + require.Equal(t, 1, len(r.End)) + require.Equal(t, end.Kind(), r.End[0].Kind()) + require.Equal(t, end.GetValue(), r.End[0].GetValue()) + } +} + +func TestSplitTTLScanRangesWithSignedInt(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tbls := []*cache.PhysicalTable{ + createTTLTable(t, tk, "t1", "tinyint"), + createTTLTable(t, tk, "t2", "smallint"), + createTTLTable(t, tk, "t3", "mediumint"), + createTTLTable(t, tk, "t4", "int"), + createTTLTable(t, tk, "t5", "bigint"), + createTTLTable(t, tk, "t6", ""), // no clustered + create2PKTTLTable(t, tk, "t7", "tinyint"), + } + + tikvStore := newMockTiKVStore(t) + for _, tbl := range tbls { + // test only one region + tikvStore.clearRegions() + ranges, err := tbl.SplitScanRanges(context.TODO(), tikvStore, 4) + require.NoError(t, err) + require.Equal(t, 1, len(ranges)) + checkRange(t, ranges[0], types.Datum{}, types.Datum{}) + + // test share regions with other table + tikvStore.clearRegions() + tikvStore.addRegion( + tablecodec.GenTablePrefix(tbl.ID-1), + tablecodec.GenTablePrefix(tbl.ID+1), + ) + ranges, err = tbl.SplitScanRanges(context.TODO(), tikvStore, 4) + require.NoError(t, err) + require.Equal(t, 1, len(ranges)) + checkRange(t, ranges[0], types.Datum{}, types.Datum{}) + + // test one table has multiple regions + tikvStore.clearRegions() + tikvStore.addRegionBeginWithTablePrefix(tbl.ID, kv.IntHandle(0)) + end := tikvStore.batchAddIntHandleRegions(tbl.ID, 8, 100, 0) + tikvStore.addRegionEndWithTablePrefix(end, tbl.ID) + ranges, err = tbl.SplitScanRanges(context.TODO(), tikvStore, 4) + require.NoError(t, err) + require.Equal(t, 4, len(ranges)) + checkRange(t, ranges[0], types.Datum{}, types.NewIntDatum(200)) + checkRange(t, ranges[1], types.NewIntDatum(200), types.NewIntDatum(500)) + checkRange(t, ranges[2], types.NewIntDatum(500), types.NewIntDatum(700)) + checkRange(t, ranges[3], types.NewIntDatum(700), types.Datum{}) + + // test one table has multiple regions and one table region across 0 + tikvStore.clearRegions() + tikvStore.addRegionBeginWithTablePrefix(tbl.ID, kv.IntHandle(-350)) + end = tikvStore.batchAddIntHandleRegions(tbl.ID, 8, 100, -350) + tikvStore.addRegionEndWithTablePrefix(end, tbl.ID) + ranges, err = tbl.SplitScanRanges(context.TODO(), tikvStore, 5) + require.NoError(t, err) + require.Equal(t, 5, len(ranges)) + checkRange(t, ranges[0], types.Datum{}, types.NewIntDatum(-250)) + checkRange(t, ranges[1], types.NewIntDatum(-250), types.NewIntDatum(-50)) + checkRange(t, ranges[2], types.NewIntDatum(-50), types.NewIntDatum(150)) + checkRange(t, ranges[3], types.NewIntDatum(150), types.NewIntDatum(350)) + checkRange(t, ranges[4], types.NewIntDatum(350), types.Datum{}) + } +} + +func TestSplitTTLScanRangesWithUnsignedInt(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tbls := []*cache.PhysicalTable{ + createTTLTable(t, tk, "t1", "tinyint unsigned"), + createTTLTable(t, tk, "t2", "smallint unsigned"), + createTTLTable(t, tk, "t3", "mediumint unsigned"), + createTTLTable(t, tk, "t4", "int unsigned"), + createTTLTable(t, tk, "t5", "bigint unsigned"), + create2PKTTLTable(t, tk, "t6", "tinyint unsigned"), + } + + tikvStore := newMockTiKVStore(t) + for _, tbl := range tbls { + // test only one region + tikvStore.clearRegions() + ranges, err := tbl.SplitScanRanges(context.TODO(), tikvStore, 4) + require.NoError(t, err) + require.Equal(t, 1, len(ranges)) + checkRange(t, ranges[0], types.Datum{}, types.Datum{}) + + // test share regions with other table + tikvStore.clearRegions() + tikvStore.addRegion( + tablecodec.GenTablePrefix(tbl.ID-1), + tablecodec.GenTablePrefix(tbl.ID+1), + ) + ranges, err = tbl.SplitScanRanges(context.TODO(), tikvStore, 4) + require.NoError(t, err) + require.Equal(t, 1, len(ranges)) + checkRange(t, ranges[0], types.Datum{}, types.Datum{}) + + // test one table has multiple regions: [MinInt64, a) [a, b) [b, 0) [0, c) [c, d) [d, MaxInt64] + tikvStore.clearRegions() + tikvStore.addRegionBeginWithTablePrefix(tbl.ID, kv.IntHandle(-200)) + end := tikvStore.batchAddIntHandleRegions(tbl.ID, 4, 100, -200) + tikvStore.addRegionEndWithTablePrefix(end, tbl.ID) + ranges, err = tbl.SplitScanRanges(context.TODO(), tikvStore, 6) + require.NoError(t, err) + require.Equal(t, 6, len(ranges)) + checkRange(t, ranges[0], types.NewUintDatum(uint64(math.MaxInt64)+1), types.NewUintDatum(uint64(math.MaxUint64)-199)) + checkRange(t, ranges[1], types.NewUintDatum(uint64(math.MaxUint64)-199), types.NewUintDatum(uint64(math.MaxUint64)-99)) + checkRange(t, ranges[2], types.NewUintDatum(uint64(math.MaxUint64)-99), types.Datum{}) + checkRange(t, ranges[3], types.Datum{}, types.NewUintDatum(100)) + checkRange(t, ranges[4], types.NewUintDatum(100), types.NewUintDatum(200)) + checkRange(t, ranges[5], types.NewUintDatum(200), types.NewUintDatum(uint64(math.MaxInt64)+1)) + + // test one table has multiple regions: [MinInt64, a) [a, b) [b, c) [c, d) [d, MaxInt64], b < 0 < c + tikvStore.clearRegions() + tikvStore.addRegionBeginWithTablePrefix(tbl.ID, kv.IntHandle(-150)) + end = tikvStore.batchAddIntHandleRegions(tbl.ID, 3, 100, -150) + tikvStore.addRegionEndWithTablePrefix(end, tbl.ID) + ranges, err = tbl.SplitScanRanges(context.TODO(), tikvStore, 5) + require.NoError(t, err) + require.Equal(t, 6, len(ranges)) + checkRange(t, ranges[0], types.NewUintDatum(uint64(math.MaxInt64)+1), types.NewUintDatum(uint64(math.MaxUint64)-149)) + checkRange(t, ranges[1], types.NewUintDatum(uint64(math.MaxUint64)-149), types.NewUintDatum(uint64(math.MaxUint64)-49)) + checkRange(t, ranges[2], types.NewUintDatum(uint64(math.MaxUint64)-49), types.Datum{}) + checkRange(t, ranges[3], types.Datum{}, types.NewUintDatum(50)) + checkRange(t, ranges[4], types.NewUintDatum(50), types.NewUintDatum(150)) + checkRange(t, ranges[5], types.NewUintDatum(150), types.NewUintDatum(uint64(math.MaxInt64)+1)) + } +} + +func TestSplitTTLScanRangesWithBytes(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tbls := []*cache.PhysicalTable{ + createTTLTable(t, tk, "t1", "binary(32)"), + createTTLTable(t, tk, "t2", "char(32) CHARACTER SET BINARY"), + createTTLTable(t, tk, "t3", "varchar(32) CHARACTER SET BINARY"), + createTTLTable(t, tk, "t4", "bit(32)"), + create2PKTTLTable(t, tk, "t5", "binary(32)"), + } + + tikvStore := newMockTiKVStore(t) + for _, tbl := range tbls { + // test only one region + tikvStore.clearRegions() + ranges, err := tbl.SplitScanRanges(context.TODO(), tikvStore, 4) + require.NoError(t, err) + require.Equal(t, 1, len(ranges)) + checkRange(t, ranges[0], types.Datum{}, types.Datum{}) + + // test share regions with other table + tikvStore.clearRegions() + tikvStore.addRegion( + tablecodec.GenTablePrefix(tbl.ID-1), + tablecodec.GenTablePrefix(tbl.ID+1), + ) + ranges, err = tbl.SplitScanRanges(context.TODO(), tikvStore, 4) + require.NoError(t, err) + require.Equal(t, 1, len(ranges)) + checkRange(t, ranges[0], types.Datum{}, types.Datum{}) + + // test one table has multiple regions + tikvStore.clearRegions() + tikvStore.addRegionBeginWithTablePrefix(tbl.ID, bytesHandle(t, []byte{1, 2, 3})) + tikvStore.addRegionWithTablePrefix(tbl.ID, bytesHandle(t, []byte{1, 2, 3}), bytesHandle(t, []byte{1, 2, 3, 4})) + tikvStore.addRegionWithTablePrefix(tbl.ID, bytesHandle(t, []byte{1, 2, 3, 4}), bytesHandle(t, []byte{1, 2, 3, 4, 5})) + tikvStore.addRegionWithTablePrefix(tbl.ID, bytesHandle(t, []byte{1, 2, 3, 4, 5}), bytesHandle(t, []byte{1, 2, 4})) + tikvStore.addRegionWithTablePrefix(tbl.ID, bytesHandle(t, []byte{1, 2, 4}), bytesHandle(t, []byte{1, 2, 5})) + tikvStore.addRegionEndWithTablePrefix(bytesHandle(t, []byte{1, 2, 5}), tbl.ID) + ranges, err = tbl.SplitScanRanges(context.TODO(), tikvStore, 4) + require.NoError(t, err) + require.Equal(t, 4, len(ranges)) + checkRange(t, ranges[0], types.Datum{}, types.NewBytesDatum([]byte{1, 2, 3, 4})) + checkRange(t, ranges[1], types.NewBytesDatum([]byte{1, 2, 3, 4}), types.NewBytesDatum([]byte{1, 2, 4})) + checkRange(t, ranges[2], types.NewBytesDatum([]byte{1, 2, 4}), types.NewBytesDatum([]byte{1, 2, 5})) + checkRange(t, ranges[3], types.NewBytesDatum([]byte{1, 2, 5}), types.Datum{}) + } +} + +func TestNoTTLSplitSupportTables(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tbls := []*cache.PhysicalTable{ + createTTLTable(t, tk, "t1", "char(32) CHARACTER SET UTF8MB4"), + createTTLTable(t, tk, "t2", "varchar(32) CHARACTER SET UTF8MB4"), + createTTLTable(t, tk, "t4", "decimal(32, 2)"), + create2PKTTLTable(t, tk, "t5", "char(32) CHARACTER SET UTF8MB4"), + } + + tikvStore := newMockTiKVStore(t) + for _, tbl := range tbls { + // test only one region + tikvStore.clearRegions() + ranges, err := tbl.SplitScanRanges(context.TODO(), tikvStore, 4) + require.NoError(t, err) + require.Equal(t, 1, len(ranges)) + checkRange(t, ranges[0], types.Datum{}, types.Datum{}) + + // test share regions with other table + tikvStore.clearRegions() + tikvStore.addRegion( + tablecodec.GenTablePrefix(tbl.ID-1), + tablecodec.GenTablePrefix(tbl.ID+1), + ) + ranges, err = tbl.SplitScanRanges(context.TODO(), tikvStore, 4) + require.NoError(t, err) + require.Equal(t, 1, len(ranges)) + checkRange(t, ranges[0], types.Datum{}, types.Datum{}) + + // test one table has multiple regions + tikvStore.clearRegions() + tikvStore.addRegionBeginWithTablePrefix(tbl.ID, bytesHandle(t, []byte{1, 2, 3})) + tikvStore.addRegionWithTablePrefix(tbl.ID, bytesHandle(t, []byte{1, 2, 3}), bytesHandle(t, []byte{1, 2, 3, 4})) + tikvStore.addRegionEndWithTablePrefix(bytesHandle(t, []byte{1, 2, 3, 4}), tbl.ID) + ranges, err = tbl.SplitScanRanges(context.TODO(), tikvStore, 3) + require.NoError(t, err) + require.Equal(t, 1, len(ranges)) + checkRange(t, ranges[0], types.Datum{}, types.Datum{}) + } +} + +func TestGetNextBytesHandleDatum(t *testing.T) { + tblID := int64(7) + buildHandleBytes := func(data []byte) []byte { + handleBytes, err := codec.EncodeKey(nil, nil, types.NewBytesDatum(data)) + require.NoError(t, err) + return handleBytes + } + + buildRowKey := func(handleBytes []byte) kv.Key { + return tablecodec.EncodeRowKey(tblID, handleBytes) + } + + buildBytesRowKey := func(data []byte) kv.Key { + return buildRowKey(buildHandleBytes(data)) + } + + binaryDataStartPos := len(tablecodec.GenTableRecordPrefix(tblID)) + 1 + cases := []struct { + key interface{} + result []byte + isNull bool + }{ + { + key: buildBytesRowKey([]byte{}), + result: []byte{}, + }, + { + key: buildBytesRowKey([]byte{1, 2, 3}), + result: []byte{1, 2, 3}, + }, + { + key: buildBytesRowKey([]byte{1, 2, 3, 0}), + result: []byte{1, 2, 3, 0}, + }, + { + key: buildBytesRowKey([]byte{1, 2, 3, 4, 5, 6, 7, 8}), + result: []byte{1, 2, 3, 4, 5, 6, 7, 8}, + }, + { + key: buildBytesRowKey([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9}), + result: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + key: buildBytesRowKey([]byte{1, 2, 3, 4, 5, 6, 7, 8, 0}), + result: []byte{1, 2, 3, 4, 5, 6, 7, 8, 0}, + }, + { + key: append(buildBytesRowKey([]byte{1, 2, 3, 4, 5, 6, 7, 8, 0}), 0), + result: []byte{1, 2, 3, 4, 5, 6, 7, 8, 0, 0}, + }, + { + key: append(buildBytesRowKey([]byte{1, 2, 3, 4, 5, 6, 7, 8, 0}), 1), + result: []byte{1, 2, 3, 4, 5, 6, 7, 8, 0, 0}, + }, + { + key: []byte{}, + result: []byte{}, + }, + { + key: tablecodec.GenTableRecordPrefix(tblID), + result: []byte{}, + }, + { + key: tablecodec.GenTableRecordPrefix(tblID - 1), + result: []byte{}, + }, + { + key: tablecodec.GenTablePrefix(tblID).PrefixNext(), + isNull: true, + }, + { + key: buildRowKey([]byte{0}), + result: []byte{}, + }, + { + key: buildRowKey([]byte{1}), + result: []byte{}, + }, + { + key: buildRowKey([]byte{2}), + isNull: true, + }, + { + // recordPrefix + bytesFlag + [0] + key: buildBytesRowKey([]byte{})[:binaryDataStartPos+1], + result: []byte{}, + }, + { + // recordPrefix + bytesFlag + [0, 0, 0, 0, 0, 0, 0, 0] + key: buildBytesRowKey([]byte{})[:binaryDataStartPos+8], + result: []byte{}, + }, + { + // recordPrefix + bytesFlag + [1] + key: buildBytesRowKey([]byte{1, 2, 3})[:binaryDataStartPos+1], + result: []byte{1}, + }, + { + // recordPrefix + bytesFlag + [1, 2, 3] + key: buildBytesRowKey([]byte{1, 2, 3})[:binaryDataStartPos+3], + result: []byte{1, 2, 3}, + }, + { + // recordPrefix + bytesFlag + [1, 2, 3, 0] + key: buildBytesRowKey([]byte{1, 2, 3})[:binaryDataStartPos+4], + result: []byte{1, 2, 3}, + }, + { + // recordPrefix + bytesFlag + [1, 2, 3, 0, 0, 0, 0, 0, 247] + key: func() []byte { + bs := buildBytesRowKey([]byte{1, 2, 3}) + bs[len(bs)-1] = 247 + return bs + }, + result: []byte{1, 2, 3}, + }, + { + // recordPrefix + bytesFlag + [1, 2, 3, 0, 0, 0, 0, 0, 0] + key: func() []byte { + bs := buildBytesRowKey([]byte{1, 2, 3}) + bs[len(bs)-1] = 0 + return bs + }, + result: []byte{1, 2, 3}, + }, + { + // recordPrefix + bytesFlag + [1, 2, 3, 4, 5, 6, 7, 8, 254, 9, 0, 0, 0, 0, 0, 0, 0, 248] + key: func() []byte { + bs := buildBytesRowKey([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9}) + bs[len(bs)-10] = 254 + return bs + }, + result: []byte{1, 2, 3, 4, 5, 6, 7, 8}, + }, + { + // recordPrefix + bytesFlag + [1, 2, 3, 4, 5, 6, 7, 0, 254, 9, 0, 0, 0, 0, 0, 0, 0, 248] + key: func() []byte { + bs := buildBytesRowKey([]byte{1, 2, 3, 4, 5, 6, 7, 0, 9}) + bs[len(bs)-10] = 254 + return bs + }, + result: []byte{1, 2, 3, 4, 5, 6, 7, 0}, + }, + { + // recordPrefix + bytesFlag + [1, 2, 3, 4, 5, 6, 7, 0, 253, 9, 0, 0, 0, 0, 0, 0, 0, 248] + key: func() []byte { + bs := buildBytesRowKey([]byte{1, 2, 3, 4, 5, 6, 7, 0, 9}) + bs[len(bs)-10] = 253 + return bs + }, + result: []byte{1, 2, 3, 4, 5, 6, 7}, + }, + { + // recordPrefix + bytesFlag + [1, 2, 3, 4, 5, 6, 7, 8, 255, 9, 0, 0, 0, 0, 0, 0, 0, 247] + key: func() []byte { + bs := buildBytesRowKey([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9}) + bs[len(bs)-1] = 247 + return bs + }, + result: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + // recordPrefix + bytesFlag + [1, 2, 3, 4, 5, 6, 7, 8, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0] + key: func() []byte { + bs := buildBytesRowKey([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9}) + bs[len(bs)-1] = 0 + return bs + }, + result: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + // recordPrefix + bytesFlag + [1, 2, 3, 4, 5, 6, 7, 8, 255, 9, 0, 0, 0, 0, 0, 0, 0] + key: func() []byte { + bs := buildBytesRowKey([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9}) + bs = bs[:len(bs)-1] + return bs + }, + result: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9}, + }, + { + // recordPrefix + bytesFlag + [1, 2, 3, 4, 5, 6, 7, 8, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0] + key: func() []byte { + bs := buildBytesRowKey([]byte{1, 2, 3, 4, 5, 6, 7, 8}) + bs = bs[:len(bs)-1] + return bs + }, + result: []byte{1, 2, 3, 4, 5, 6, 7, 8}, + }, + { + // recordPrefix + bytesFlag + [1, 2, 3, 4, 5, 6, 7, 8, 255, 0, 0, 0, 0, 0, 0, 0, 0, 246] + key: func() []byte { + bs := buildBytesRowKey([]byte{1, 2, 3, 4, 5, 6, 7, 8}) + bs = bs[:len(bs)-1] + return bs + }, + result: []byte{1, 2, 3, 4, 5, 6, 7, 8}, + }, + } + + for i, c := range cases { + var key kv.Key + switch k := c.key.(type) { + case kv.Key: + key = k + case []byte: + key = k + case func() []byte: + key = k() + case func() kv.Key: + key = k() + default: + require.FailNow(t, "%d", i) + } + + d := cache.GetNextBytesHandleDatum(key, tablecodec.GenTableRecordPrefix(tblID)) + if c.isNull { + require.True(t, d.IsNull(), i) + } else { + require.Equal(t, types.KindBytes, d.Kind(), i) + require.Equal(t, c.result, d.GetBytes(), i) + } + } +} +func TestGetNextIntHandle(t *testing.T) { + tblID := int64(7) + cases := []struct { + key interface{} + result int64 + isNull bool + }{ + { + key: tablecodec.EncodeRowKeyWithHandle(tblID, kv.IntHandle(0)), + result: 0, + }, + { + key: tablecodec.EncodeRowKeyWithHandle(tblID, kv.IntHandle(3)), + result: 3, + }, + { + key: tablecodec.EncodeRowKeyWithHandle(tblID, kv.IntHandle(math.MaxInt64)), + result: math.MaxInt64, + }, + { + key: tablecodec.EncodeRowKeyWithHandle(tblID, kv.IntHandle(math.MinInt64)), + result: math.MinInt64, + }, + { + key: append(tablecodec.EncodeRowKeyWithHandle(tblID, kv.IntHandle(7)), 0), + result: 8, + }, + { + key: append(tablecodec.EncodeRowKeyWithHandle(tblID, kv.IntHandle(math.MaxInt64)), 0), + isNull: true, + }, + { + key: append(tablecodec.EncodeRowKeyWithHandle(tblID, kv.IntHandle(math.MinInt64)), 0), + result: math.MinInt64 + 1, + }, + { + key: []byte{}, + result: math.MinInt64, + }, + { + key: tablecodec.GenTableRecordPrefix(tblID), + result: math.MinInt64, + }, + { + key: tablecodec.GenTableRecordPrefix(tblID - 1), + result: math.MinInt64, + }, + { + key: tablecodec.GenTablePrefix(tblID).PrefixNext(), + isNull: true, + }, + { + key: tablecodec.EncodeRowKey(tblID, []byte{0}), + result: codec.DecodeCmpUintToInt(0), + }, + { + key: tablecodec.EncodeRowKey(tblID, []byte{0, 1, 2, 3}), + result: codec.DecodeCmpUintToInt(0x0001020300000000), + }, + { + key: tablecodec.EncodeRowKey(tblID, []byte{8, 1, 2, 3}), + result: codec.DecodeCmpUintToInt(0x0801020300000000), + }, + { + key: tablecodec.EncodeRowKey(tblID, []byte{0, 1, 2, 3, 4, 5, 6, 7, 0}), + result: codec.DecodeCmpUintToInt(0x0001020304050607) + 1, + }, + { + key: tablecodec.EncodeRowKey(tblID, []byte{8, 1, 2, 3, 4, 5, 6, 7, 0}), + result: codec.DecodeCmpUintToInt(0x0801020304050607) + 1, + }, + { + key: tablecodec.EncodeRowKey(tblID, []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}), + result: math.MaxInt64, + }, + { + key: tablecodec.EncodeRowKey(tblID, []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0}), + isNull: true, + }, + } + + for i, c := range cases { + var key kv.Key + switch k := c.key.(type) { + case kv.Key: + key = k + case []byte: + key = k + case func() []byte: + key = k() + case func() kv.Key: + key = k() + default: + require.FailNow(t, "%d", i) + } + + v := cache.GetNextIntHandle(key, tablecodec.GenTableRecordPrefix(tblID)) + if c.isNull { + require.Nil(t, v, i) + } else { + require.IsType(t, kv.IntHandle(0), v, i) + require.Equal(t, c.result, v.IntValue()) + } + } +} diff --git a/ttl/cache/table.go b/ttl/cache/table.go new file mode 100644 index 0000000000000..35aca7f8532b2 --- /dev/null +++ b/ttl/cache/table.go @@ -0,0 +1,473 @@ +// 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, +// 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 cache + +import ( + "context" + "encoding/binary" + "fmt" + "math" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/table/tables" + "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/ttl/session" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/mathutil" + "github.com/tikv/client-go/v2/tikv" +) + +func getTableKeyColumns(tbl *model.TableInfo) ([]*model.ColumnInfo, []*types.FieldType, error) { + if tbl.PKIsHandle { + for i, col := range tbl.Columns { + if mysql.HasPriKeyFlag(col.GetFlag()) { + return []*model.ColumnInfo{tbl.Columns[i]}, []*types.FieldType{&tbl.Columns[i].FieldType}, nil + } + } + return nil, nil, errors.Errorf("Cannot find primary key for table: %s", tbl.Name) + } + + if tbl.IsCommonHandle { + idxInfo := tables.FindPrimaryIndex(tbl) + columns := make([]*model.ColumnInfo, len(idxInfo.Columns)) + fieldTypes := make([]*types.FieldType, len(idxInfo.Columns)) + for i, idxCol := range idxInfo.Columns { + columns[i] = tbl.Columns[idxCol.Offset] + fieldTypes[i] = &tbl.Columns[idxCol.Offset].FieldType + } + return columns, fieldTypes, nil + } + + extraHandleColInfo := model.NewExtraHandleColInfo() + return []*model.ColumnInfo{extraHandleColInfo}, []*types.FieldType{&extraHandleColInfo.FieldType}, nil +} + +// ScanRange is the range to scan. The range is: [Start, End) +type ScanRange struct { + Start []types.Datum + End []types.Datum +} + +func newFullRange() ScanRange { + return ScanRange{} +} + +func newDatumRange(start types.Datum, end types.Datum) (r ScanRange) { + if !start.IsNull() { + r.Start = []types.Datum{start} + } + if !end.IsNull() { + r.End = []types.Datum{end} + } + return r +} + +func nullDatum() types.Datum { + d := types.Datum{} + d.SetNull() + return d +} + +// PhysicalTable is used to provide some information for a physical table in TTL job +type PhysicalTable struct { + // ID is the physical ID of the table + ID int64 + // Schema is the database name of the table + Schema model.CIStr + *model.TableInfo + // Partition is the partition name + Partition model.CIStr + // PartitionDef is the partition definition + PartitionDef *model.PartitionDefinition + // KeyColumns is the cluster index key columns for the table + KeyColumns []*model.ColumnInfo + // KeyColumnTypes is the types of the key columns + KeyColumnTypes []*types.FieldType + // TimeColum is the time column used for TTL + TimeColumn *model.ColumnInfo +} + +// NewPhysicalTable create a new PhysicalTable +func NewPhysicalTable(schema model.CIStr, tbl *model.TableInfo, partition model.CIStr) (*PhysicalTable, error) { + if tbl.State != model.StatePublic { + return nil, errors.Errorf("table '%s.%s' is not a public table", schema, tbl.Name) + } + + ttlInfo := tbl.TTLInfo + if ttlInfo == nil { + return nil, errors.Errorf("table '%s.%s' is not a ttl table", schema, tbl.Name) + } + + timeColumn := tbl.FindPublicColumnByName(ttlInfo.ColumnName.L) + if timeColumn == nil { + return nil, errors.Errorf("time column '%s' is not public in ttl table '%s.%s'", ttlInfo.ColumnName, schema, tbl.Name) + } + + keyColumns, keyColumTypes, err := getTableKeyColumns(tbl) + if err != nil { + return nil, err + } + + var physicalID int64 + var partitionDef *model.PartitionDefinition + if tbl.Partition == nil { + if partition.L != "" { + return nil, errors.Errorf("table '%s.%s' is not a partitioned table", schema, tbl.Name) + } + physicalID = tbl.ID + } else { + if partition.L == "" { + return nil, errors.Errorf("partition name is required, table '%s.%s' is a partitioned table", schema, tbl.Name) + } + + for i := range tbl.Partition.Definitions { + def := &tbl.Partition.Definitions[i] + if def.Name.L == partition.L { + partitionDef = def + } + } + + if partitionDef == nil { + return nil, errors.Errorf("partition '%s' is not found in ttl table '%s.%s'", partition.O, schema, tbl.Name) + } + + physicalID = partitionDef.ID + } + + return &PhysicalTable{ + ID: physicalID, + Schema: schema, + TableInfo: tbl, + Partition: partition, + PartitionDef: partitionDef, + KeyColumns: keyColumns, + KeyColumnTypes: keyColumTypes, + TimeColumn: timeColumn, + }, nil +} + +// ValidateKeyPrefix validates a key prefix +func (t *PhysicalTable) ValidateKeyPrefix(key []types.Datum) error { + if len(key) > len(t.KeyColumns) { + return errors.Errorf("invalid key length: %d, expected %d", len(key), len(t.KeyColumns)) + } + return nil +} + +// EvalExpireTime returns the expired time +func (t *PhysicalTable) EvalExpireTime(ctx context.Context, se session.Session, now time.Time) (expire time.Time, err error) { + tz := se.GetSessionVars().Location() + + expireExpr := t.TTLInfo.IntervalExprStr + unit := ast.TimeUnitType(t.TTLInfo.IntervalTimeUnit) + + var rows []chunk.Row + rows, err = se.ExecuteSQL( + ctx, + // FROM_UNIXTIME does not support negative value, so we use `FROM_UNIXTIME(0) + INTERVAL ` to present current time + fmt.Sprintf("SELECT FROM_UNIXTIME(0) + INTERVAL %d SECOND - INTERVAL %s %s", now.Unix(), expireExpr, unit.String()), + ) + + if err != nil { + return + } + + tm := rows[0].GetTime(0) + return tm.CoreTime().GoTime(tz) +} + +// SplitScanRanges split ranges for TTL scan +func (t *PhysicalTable) SplitScanRanges(ctx context.Context, store kv.Storage, splitCnt int) ([]ScanRange, error) { + if len(t.KeyColumns) < 1 || splitCnt <= 1 { + return []ScanRange{newFullRange()}, nil + } + + tikvStore, ok := store.(tikv.Storage) + if !ok { + return []ScanRange{newFullRange()}, nil + } + + ft := t.KeyColumns[0].FieldType + switch ft.GetType() { + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeLong, mysql.TypeLonglong, mysql.TypeInt24: + return t.splitIntRanges(ctx, tikvStore, splitCnt) + case mysql.TypeBit: + return t.splitBinaryRanges(ctx, tikvStore, splitCnt) + case mysql.TypeString, mysql.TypeVarString, mysql.TypeVarchar: + if mysql.HasBinaryFlag(ft.GetFlag()) { + return t.splitBinaryRanges(ctx, tikvStore, splitCnt) + } + } + return []ScanRange{newFullRange()}, nil +} + +func unsignedEdge(d types.Datum) types.Datum { + if d.IsNull() { + return types.NewUintDatum(uint64(math.MaxInt64 + 1)) + } + if d.GetInt64() == 0 { + return nullDatum() + } + return types.NewUintDatum(uint64(d.GetInt64())) +} + +func (t *PhysicalTable) splitIntRanges(ctx context.Context, store tikv.Storage, splitCnt int) ([]ScanRange, error) { + recordPrefix := tablecodec.GenTableRecordPrefix(t.ID) + startKey, endKey := tablecodec.GetTableHandleKeyRange(t.ID) + keyRanges, err := t.splitRawKeyRanges(ctx, store, startKey, endKey, splitCnt) + if err != nil { + return nil, err + } + + if len(keyRanges) <= 1 { + return []ScanRange{newFullRange()}, nil + } + + ft := t.KeyColumnTypes[0] + unsigned := mysql.HasUnsignedFlag(ft.GetFlag()) + scanRanges := make([]ScanRange, 0, len(keyRanges)+1) + curScanStart := nullDatum() + for i, keyRange := range keyRanges { + if i != 0 && curScanStart.IsNull() { + break + } + + curScanEnd := nullDatum() + if i < len(keyRanges)-1 { + if val := GetNextIntHandle(keyRange.EndKey, recordPrefix); val != nil { + curScanEnd = types.NewIntDatum(val.IntValue()) + } + } + + if !curScanStart.IsNull() && !curScanEnd.IsNull() && curScanStart.GetInt64() >= curScanEnd.GetInt64() { + continue + } + + if !unsigned { + // primary key is signed or range + scanRanges = append(scanRanges, newDatumRange(curScanStart, curScanEnd)) + } else if !curScanStart.IsNull() && curScanStart.GetInt64() >= 0 { + // primary key is unsigned and range is in the right half side + scanRanges = append(scanRanges, newDatumRange(unsignedEdge(curScanStart), unsignedEdge(curScanEnd))) + } else if !curScanEnd.IsNull() && curScanEnd.GetInt64() <= 0 { + // primary key is unsigned and range is in the left half side + scanRanges = append(scanRanges, newDatumRange(unsignedEdge(curScanStart), unsignedEdge(curScanEnd))) + } else { + // primary key is unsigned and the start > math.MaxInt64 && end < math.MaxInt64 + // we must split it to two ranges + scanRanges = append(scanRanges, + newDatumRange(unsignedEdge(curScanStart), nullDatum()), + newDatumRange(nullDatum(), unsignedEdge(curScanEnd)), + ) + } + curScanStart = curScanEnd + } + return scanRanges, nil +} + +func (t *PhysicalTable) splitBinaryRanges(ctx context.Context, store tikv.Storage, splitCnt int) ([]ScanRange, error) { + recordPrefix := tablecodec.GenTableRecordPrefix(t.ID) + startKey, endKey := recordPrefix, recordPrefix.PrefixNext() + keyRanges, err := t.splitRawKeyRanges(ctx, store, startKey, endKey, splitCnt) + if err != nil { + return nil, err + } + + if len(keyRanges) <= 1 { + return []ScanRange{newFullRange()}, nil + } + + scanRanges := make([]ScanRange, 0, len(keyRanges)) + curScanStart := nullDatum() + for i, keyRange := range keyRanges { + if i != 0 && curScanStart.IsNull() { + break + } + + curScanEnd := nullDatum() + if i != len(keyRanges)-1 { + curScanEnd = GetNextBytesHandleDatum(keyRange.EndKey, recordPrefix) + } + + if !curScanStart.IsNull() && !curScanEnd.IsNull() && kv.Key(curScanStart.GetBytes()).Cmp(curScanEnd.GetBytes()) >= 0 { + continue + } + + scanRanges = append(scanRanges, newDatumRange(curScanStart, curScanEnd)) + curScanStart = curScanEnd + } + return scanRanges, nil +} + +func (t *PhysicalTable) splitRawKeyRanges(ctx context.Context, store tikv.Storage, startKey, endKey kv.Key, splitCnt int) ([]kv.KeyRange, error) { + regionCache := store.GetRegionCache() + regionIDs, err := regionCache.ListRegionIDsInKeyRange(tikv.NewBackofferWithVars(ctx, 20000, nil), startKey, endKey) + if err != nil { + return nil, err + } + + regionsPerRange := len(regionIDs) / splitCnt + oversizeCnt := len(regionIDs) % splitCnt + ranges := make([]kv.KeyRange, 0, mathutil.Min(len(regionIDs), splitCnt)) + for len(regionIDs) > 0 { + startRegion, err := regionCache.LocateRegionByID(tikv.NewBackofferWithVars(ctx, 20000, nil), regionIDs[0]) + if err != nil { + return nil, err + } + + endRegionIdx := regionsPerRange - 1 + if oversizeCnt > 0 { + endRegionIdx++ + } + + endRegion, err := regionCache.LocateRegionByID(tikv.NewBackofferWithVars(ctx, 20000, nil), regionIDs[endRegionIdx]) + if err != nil { + return nil, err + } + + rangeStartKey := kv.Key(startRegion.StartKey) + if rangeStartKey.Cmp(startKey) < 0 { + rangeStartKey = startKey + } + + rangeEndKey := kv.Key(endRegion.EndKey) + if rangeEndKey.Cmp(endKey) > 0 { + rangeEndKey = endKey + } + + ranges = append(ranges, kv.KeyRange{StartKey: rangeStartKey, EndKey: rangeEndKey}) + oversizeCnt-- + regionIDs = regionIDs[endRegionIdx+1:] + } + return ranges, nil +} + +var emptyBytesHandleKey kv.Key + +func init() { + key, err := codec.EncodeKey(nil, nil, types.NewBytesDatum(nil)) + terror.MustNil(err) + emptyBytesHandleKey = key +} + +// GetNextIntHandle is used for int handle tables. It returns the min handle whose encoded key is or after argument `key` +// If it cannot find a valid value, a null datum will be returned. +func GetNextIntHandle(key kv.Key, recordPrefix []byte) kv.Handle { + if key.Cmp(recordPrefix) > 0 && !key.HasPrefix(recordPrefix) { + return nil + } + + if key.Cmp(recordPrefix) <= 0 { + return kv.IntHandle(math.MinInt64) + } + + suffix := key[len(recordPrefix):] + encodedVal := suffix + if len(suffix) < 8 { + encodedVal = make([]byte, 8) + copy(encodedVal, suffix) + } + + findNext := false + if len(suffix) > 8 { + findNext = true + encodedVal = encodedVal[:8] + } + + u := codec.DecodeCmpUintToInt(binary.BigEndian.Uint64(encodedVal)) + if !findNext { + return kv.IntHandle(u) + } + + if u == math.MaxInt64 { + return nil + } + + return kv.IntHandle(u + 1) +} + +// GetNextBytesHandleDatum is used for a table with one binary or string column common handle. +// It returns the minValue whose encoded key is or after argument `key` +// If it cannot find a valid value, a null datum will be returned. +func GetNextBytesHandleDatum(key kv.Key, recordPrefix []byte) (d types.Datum) { + if key.Cmp(recordPrefix) > 0 && !key.HasPrefix(recordPrefix) { + d.SetNull() + return d + } + + if key.Cmp(recordPrefix) <= 0 { + d.SetBytes([]byte{}) + return d + } + + encodedVal := key[len(recordPrefix):] + if encodedVal[0] < emptyBytesHandleKey[0] { + d.SetBytes([]byte{}) + return d + } + + if encodedVal[0] > emptyBytesHandleKey[0] { + d.SetNull() + return d + } + + if remain, v, err := codec.DecodeOne(encodedVal); err == nil { + if len(remain) > 0 { + v.SetBytes(kv.Key(v.GetBytes()).Next()) + } + return v + } + + encodedVal = encodedVal[1:] + brokenGroupEndIdx := len(encodedVal) - 1 + brokenGroupEmptyBytes := len(encodedVal) % 9 + for i := 7; i+1 < len(encodedVal); i += 9 { + if emptyBytes := 255 - int(encodedVal[i+1]); emptyBytes != 0 || i+1 == len(encodedVal)-1 { + brokenGroupEndIdx = i + brokenGroupEmptyBytes = emptyBytes + break + } + } + + for i := 0; i < brokenGroupEmptyBytes; i++ { + if encodedVal[brokenGroupEndIdx] > 0 { + break + } + brokenGroupEndIdx-- + } + + if brokenGroupEndIdx < 0 { + d.SetBytes(nil) + return d + } + + val := make([]byte, 0, len(encodedVal)) + for i := 0; i <= brokenGroupEndIdx; i++ { + if i%9 == 8 { + continue + } + val = append(val, encodedVal[i]) + } + d.SetBytes(val) + return d +} diff --git a/ttl/cache/table_test.go b/ttl/cache/table_test.go new file mode 100644 index 0000000000000..ca280d9b36251 --- /dev/null +++ b/ttl/cache/table_test.go @@ -0,0 +1,216 @@ +// 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, +// 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 cache_test + +import ( + "context" + "fmt" + "testing" + "time" + + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/ttl/session" + "github.com/stretchr/testify/require" +) + +func TestNewTTLTable(t *testing.T) { + cases := []struct { + db string + tbl string + def string + timeCol string + keyCols []string + }{ + { + db: "test", + tbl: "t1", + def: "(a int)", + }, + { + db: "test", + tbl: "ttl1", + def: "(a int, t datetime) ttl = `t` + interval 2 hour", + timeCol: "t", + keyCols: []string{"_tidb_rowid"}, + }, + { + db: "test", + tbl: "ttl2", + def: "(id int primary key, t datetime) ttl = `t` + interval 3 hour", + timeCol: "t", + keyCols: []string{"id"}, + }, + { + db: "test", + tbl: "ttl3", + def: "(a int, b varchar(32), c binary(32), t datetime, primary key (a, b, c)) ttl = `t` + interval 1 month", + timeCol: "t", + keyCols: []string{"a", "b", "c"}, + }, + { + db: "test", + tbl: "ttl4", + def: "(id int primary key, t datetime) " + + "ttl = `t` + interval 1 day " + + "PARTITION BY RANGE (id) (" + + " PARTITION p0 VALUES LESS THAN (10)," + + " PARTITION p1 VALUES LESS THAN (100)," + + " PARTITION p2 VALUES LESS THAN (1000)," + + " PARTITION p3 VALUES LESS THAN MAXVALUE)", + timeCol: "t", + keyCols: []string{"id"}, + }, + { + db: "test", + tbl: "ttl5", + def: "(id int primary key nonclustered, t datetime) ttl = `t` + interval 3 hour", + timeCol: "t", + keyCols: []string{"_tidb_rowid"}, + }, + } + + store, do := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + + for _, c := range cases { + tk.MustExec("use " + c.db) + tk.MustExec("create table " + c.tbl + c.def) + } + + for _, c := range cases { + is := do.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr(c.db), model.NewCIStr(c.tbl)) + require.NoError(t, err) + tblInfo := tbl.Meta() + var physicalTbls []*cache.PhysicalTable + if tblInfo.Partition == nil { + ttlTbl, err := cache.NewPhysicalTable(model.NewCIStr(c.db), tblInfo, model.NewCIStr("")) + if c.timeCol == "" { + require.Error(t, err) + continue + } + require.NoError(t, err) + physicalTbls = append(physicalTbls, ttlTbl) + } else { + for _, partition := range tblInfo.Partition.Definitions { + ttlTbl, err := cache.NewPhysicalTable(model.NewCIStr(c.db), tblInfo, partition.Name) + if c.timeCol == "" { + require.Error(t, err) + continue + } + require.NoError(t, err) + physicalTbls = append(physicalTbls, ttlTbl) + } + if c.timeCol == "" { + continue + } + } + + for i, ttlTbl := range physicalTbls { + require.Equal(t, c.db, ttlTbl.Schema.O) + require.Same(t, tblInfo, ttlTbl.TableInfo) + timeColumn := tblInfo.FindPublicColumnByName(c.timeCol) + require.NotNil(t, timeColumn) + require.Same(t, timeColumn, ttlTbl.TimeColumn) + + if tblInfo.Partition == nil { + require.Equal(t, ttlTbl.TableInfo.ID, ttlTbl.ID) + require.Equal(t, "", ttlTbl.Partition.L) + require.Nil(t, ttlTbl.PartitionDef) + } else { + def := tblInfo.Partition.Definitions[i] + require.Equal(t, def.ID, ttlTbl.ID) + require.Equal(t, def.Name.L, ttlTbl.Partition.L) + require.Equal(t, def, *(ttlTbl.PartitionDef)) + } + + require.Equal(t, len(c.keyCols), len(ttlTbl.KeyColumns)) + require.Equal(t, len(c.keyCols), len(ttlTbl.KeyColumnTypes)) + + for j, keyCol := range c.keyCols { + msg := fmt.Sprintf("%s, col: %s", c.tbl, keyCol) + var col *model.ColumnInfo + if keyCol == model.ExtraHandleName.L { + col = model.NewExtraHandleColInfo() + } else { + col = tblInfo.FindPublicColumnByName(keyCol) + } + colJ := ttlTbl.KeyColumns[j] + colFieldJ := ttlTbl.KeyColumnTypes[j] + + require.NotNil(t, col, msg) + require.Equal(t, col.ID, colJ.ID, msg) + require.Equal(t, col.Name.L, colJ.Name.L, msg) + require.Equal(t, col.FieldType, colJ.FieldType, msg) + require.Equal(t, col.FieldType, *colFieldJ, msg) + } + } + } +} + +func TestEvalTTLExpireTime(t *testing.T) { + store, do := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("create table test.t(a int, t datetime) ttl = `t` + interval 1 day") + tk.MustExec("create table test.t2(a int, t datetime) ttl = `t` + interval 3 month") + + tb, err := do.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + tblInfo := tb.Meta() + ttlTbl, err := cache.NewPhysicalTable(model.NewCIStr("test"), tblInfo, model.NewCIStr("")) + require.NoError(t, err) + + tb2, err := do.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t2")) + require.NoError(t, err) + tblInfo2 := tb2.Meta() + ttlTbl2, err := cache.NewPhysicalTable(model.NewCIStr("test"), tblInfo2, model.NewCIStr("")) + require.NoError(t, err) + + se := session.NewSession(tk.Session(), tk.Session(), nil) + + now := time.UnixMilli(0) + tz1, err := time.LoadLocation("Asia/Shanghai") + require.NoError(t, err) + tz2, err := time.LoadLocation("Europe/Berlin") + require.NoError(t, err) + + se.GetSessionVars().TimeZone = tz1 + tm, err := ttlTbl.EvalExpireTime(context.TODO(), se, now) + require.NoError(t, err) + require.Equal(t, now.Add(-time.Hour*24).Unix(), tm.Unix()) + require.Equal(t, "1969-12-31 08:00:00", tm.Format("2006-01-02 15:04:05")) + require.Equal(t, tz1.String(), tm.Location().String()) + + se.GetSessionVars().TimeZone = tz2 + tm, err = ttlTbl.EvalExpireTime(context.TODO(), se, now) + require.NoError(t, err) + require.Equal(t, now.Add(-time.Hour*24).Unix(), tm.Unix()) + require.Equal(t, "1969-12-31 01:00:00", tm.Format("2006-01-02 15:04:05")) + require.Equal(t, tz2.String(), tm.Location().String()) + + se.GetSessionVars().TimeZone = tz1 + tm, err = ttlTbl2.EvalExpireTime(context.TODO(), se, now) + require.NoError(t, err) + require.Equal(t, "1969-10-01 08:00:00", tm.Format("2006-01-02 15:04:05")) + require.Equal(t, tz1.String(), tm.Location().String()) + + se.GetSessionVars().TimeZone = tz2 + tm, err = ttlTbl2.EvalExpireTime(context.TODO(), se, now) + require.NoError(t, err) + require.Equal(t, "1969-10-01 01:00:00", tm.Format("2006-01-02 15:04:05")) + require.Equal(t, tz2.String(), tm.Location().String()) +} diff --git a/ttl/cache/task.go b/ttl/cache/task.go new file mode 100644 index 0000000000000..5ba2f427f67c8 --- /dev/null +++ b/ttl/cache/task.go @@ -0,0 +1,193 @@ +// Copyright 2023 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 cache + +import ( + "encoding/json" + "time" + + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/codec" +) + +const selectFromTTLTask = `SELECT LOW_PRIORITY + job_id, + table_id, + scan_id, + scan_range_start, + scan_range_end, + expire_time, + owner_id, + owner_addr, + owner_hb_time, + status, + status_update_time, + state, + created_time FROM mysql.tidb_ttl_task` +const insertIntoTTLTask = `INSERT LOW_PRIORITY INTO mysql.tidb_ttl_task SET + job_id = %?, + table_id = %?, + scan_id = %?, + scan_range_start = %?, + scan_range_end = %?, + expire_time = %?, + created_time = %?` + +// SelectFromTTLTaskWithJobID returns an SQL statement to get all tasks of the specified job in mysql.tidb_ttl_task +func SelectFromTTLTaskWithJobID(jobID string) (string, []interface{}) { + return selectFromTTLTask + " WHERE job_id = %?", []interface{}{jobID} +} + +// SelectFromTTLTaskWithID returns an SQL statement to get all tasks of the specified job and scanID in mysql.tidb_ttl_task +func SelectFromTTLTaskWithID(jobID string, scanID int64) (string, []interface{}) { + return selectFromTTLTask + " WHERE job_id = %? AND scan_id = %?", []interface{}{jobID, scanID} +} + +// PeekWaitingTTLTask returns an SQL statement to get `limit` waiting ttl task +func PeekWaitingTTLTask(hbExpire time.Time) (string, []interface{}) { + return selectFromTTLTask + " WHERE status = 'waiting' OR (owner_hb_time < %? AND status = 'running') ORDER BY created_time ASC", []interface{}{hbExpire.Format("2006-01-02 15:04:05")} +} + +// InsertIntoTTLTask returns an SQL statement to insert a ttl task into mysql.tidb_ttl_task +func InsertIntoTTLTask(sctx sessionctx.Context, jobID string, tableID int64, scanID int, scanRangeStart []types.Datum, scanRangeEnd []types.Datum, expireTime time.Time, createdTime time.Time) (string, []interface{}, error) { + rangeStart, err := codec.EncodeKey(sctx.GetSessionVars().StmtCtx, []byte{}, scanRangeStart...) + if err != nil { + return "", nil, err + } + rangeEnd, err := codec.EncodeKey(sctx.GetSessionVars().StmtCtx, []byte{}, scanRangeEnd...) + if err != nil { + return "", nil, err + } + return insertIntoTTLTask, []interface{}{jobID, tableID, int64(scanID), rangeStart, rangeEnd, expireTime, createdTime}, nil +} + +// TaskStatus represents the current status of a task +type TaskStatus string + +const ( + // TaskStatusWaiting means the task hasn't started + TaskStatusWaiting TaskStatus = "waiting" + // TaskStatusRunning means this task is running + TaskStatusRunning = "running" + // TaskStatusFinished means this task has finished + TaskStatusFinished = "finished" +) + +// TTLTask is a row recorded in mysql.tidb_ttl_task +type TTLTask struct { + JobID string + TableID int64 + ScanID int64 + ScanRangeStart []types.Datum + ScanRangeEnd []types.Datum + ExpireTime time.Time + OwnerID string + OwnerAddr string + OwnerHBTime time.Time + Status TaskStatus + StatusUpdateTime time.Time + State *TTLTaskState + CreatedTime time.Time +} + +// TTLTaskState records the internal states of the ttl task +type TTLTaskState struct { + TotalRows uint64 `json:"total_rows"` + SuccessRows uint64 `json:"success_rows"` + ErrorRows uint64 `json:"error_rows"` + + ScanTaskErr string `json:"scan_task_err"` +} + +// RowToTTLTask converts a row into TTL task +func RowToTTLTask(sctx sessionctx.Context, row chunk.Row) (*TTLTask, error) { + var err error + timeZone := sctx.GetSessionVars().Location() + + task := &TTLTask{ + JobID: row.GetString(0), + TableID: row.GetInt64(1), + ScanID: row.GetInt64(2), + } + if !row.IsNull(3) { + scanRangeStartBuf := row.GetBytes(3) + // it's still posibble to be empty even this column is not NULL + if len(scanRangeStartBuf) > 0 { + task.ScanRangeStart, err = codec.Decode(scanRangeStartBuf, len(scanRangeStartBuf)) + if err != nil { + return nil, err + } + } + } + if !row.IsNull(4) { + scanRangeEndBuf := row.GetBytes(4) + // it's still posibble to be empty even this column is not NULL + if len(scanRangeEndBuf) > 0 { + task.ScanRangeEnd, err = codec.Decode(scanRangeEndBuf, len(scanRangeEndBuf)) + if err != nil { + return nil, err + } + } + } + + task.ExpireTime, err = row.GetTime(5).GoTime(timeZone) + if err != nil { + return nil, err + } + + if !row.IsNull(6) { + task.OwnerID = row.GetString(6) + } + if !row.IsNull(7) { + task.OwnerAddr = row.GetString(7) + } + if !row.IsNull(8) { + task.OwnerHBTime, err = row.GetTime(8).GoTime(timeZone) + if err != nil { + return nil, err + } + } + if !row.IsNull(9) { + status := row.GetString(9) + if len(status) == 0 { + status = "waiting" + } + task.Status = TaskStatus(status) + } + if !row.IsNull(10) { + task.StatusUpdateTime, err = row.GetTime(10).GoTime(timeZone) + if err != nil { + return nil, err + } + } + if !row.IsNull(11) { + stateStr := row.GetString(11) + state := &TTLTaskState{} + err = json.Unmarshal([]byte(stateStr), state) + if err != nil { + return nil, err + } + task.State = state + } + + task.CreatedTime, err = row.GetTime(12).GoTime(timeZone) + if err != nil { + return nil, err + } + + return task, nil +} diff --git a/ttl/cache/task_test.go b/ttl/cache/task_test.go new file mode 100644 index 0000000000000..ad1f71278b102 --- /dev/null +++ b/ttl/cache/task_test.go @@ -0,0 +1,117 @@ +// Copyright 2023 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 cache_test + +import ( + "context" + "testing" + "time" + + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/codec" + "github.com/stretchr/testify/require" +) + +type taskGetter struct { + ctx context.Context + t *testing.T + tk *testkit.TestKit +} + +func newTaskGetter(ctx context.Context, t *testing.T, tk *testkit.TestKit) *taskGetter { + return &taskGetter{ + ctx, t, tk, + } +} + +func (tg *taskGetter) mustGetTestTask() *cache.TTLTask { + sql, args := cache.SelectFromTTLTaskWithJobID("test-job") + rs, err := tg.tk.Session().ExecuteInternal(tg.ctx, sql, args...) + require.NoError(tg.t, err) + rows, err := session.GetRows4Test(context.Background(), tg.tk.Session(), rs) + require.NoError(tg.t, err) + task, err := cache.RowToTTLTask(tg.tk.Session(), rows[0]) + require.NoError(tg.t, err) + return task +} + +func TestRowToTTLTask(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.Session().GetSessionVars().TimeZone = time.Local + + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnTTL) + tg := newTaskGetter(ctx, t, tk) + + now := time.Now() + now = now.Round(time.Second) + + sql, args, err := cache.InsertIntoTTLTask(tk.Session(), "test-job", 1, 1, nil, nil, now, now) + require.NoError(t, err) + // tk.MustExec cannot handle the NULL parameter, use the `tk.Session().ExecuteInternal` instead here. + _, err = tk.Session().ExecuteInternal(ctx, sql, args...) + require.NoError(t, err) + task := tg.mustGetTestTask() + require.Equal(t, "test-job", task.JobID) + require.Equal(t, int64(1), task.TableID) + require.Equal(t, int64(1), task.ScanID) + require.Nil(t, task.ScanRangeStart) + require.Nil(t, task.ScanRangeEnd) + require.Equal(t, now, task.ExpireTime) + require.Equal(t, now, task.CreatedTime) + + rangeStart, err := codec.EncodeKey(tk.Session().GetSessionVars().StmtCtx, []byte{}, []types.Datum{types.NewDatum(1)}...) + require.NoError(t, err) + rangeEnd, err := codec.EncodeKey(tk.Session().GetSessionVars().StmtCtx, []byte{}, []types.Datum{types.NewDatum(2)}...) + require.NoError(t, err) + tk.MustExec("UPDATE mysql.tidb_ttl_task SET scan_range_start = ?, scan_range_end = ? WHERE job_id = 'test-job'", rangeStart, rangeEnd) + + task = tg.mustGetTestTask() + require.Equal(t, []types.Datum{types.NewDatum(1)}, task.ScanRangeStart) + require.Equal(t, []types.Datum{types.NewDatum(2)}, task.ScanRangeEnd) +} + +func TestInsertIntoTTLTask(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.Session().GetSessionVars().TimeZone = time.Local + + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnTTL) + tg := newTaskGetter(ctx, t, tk) + + rangeStart := []types.Datum{types.NewDatum(1)} + rangeEnd := []types.Datum{types.NewDatum(2)} + + now := time.Now() + now = now.Round(time.Second) + + sql, args, err := cache.InsertIntoTTLTask(tk.Session(), "test-job", 1, 1, rangeStart, rangeEnd, now, now) + require.NoError(t, err) + // tk.MustExec cannot handle the NULL parameter, use the `tk.Session().ExecuteInternal` instead here. + _, err = tk.Session().ExecuteInternal(ctx, sql, args...) + require.NoError(t, err) + task := tg.mustGetTestTask() + require.Equal(t, "test-job", task.JobID) + require.Equal(t, int64(1), task.TableID) + require.Equal(t, int64(1), task.ScanID) + require.Equal(t, []types.Datum{types.NewDatum(1)}, task.ScanRangeStart) + require.Equal(t, []types.Datum{types.NewDatum(2)}, task.ScanRangeEnd) + require.Equal(t, now, task.ExpireTime) + require.Equal(t, now, task.CreatedTime) +} diff --git a/ttl/cache/ttlstatus.go b/ttl/cache/ttlstatus.go new file mode 100644 index 0000000000000..b21a50a161f79 --- /dev/null +++ b/ttl/cache/ttlstatus.go @@ -0,0 +1,195 @@ +// 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, +// 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 cache + +import ( + "context" + "time" + + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/ttl/session" + "github.com/pingcap/tidb/util/chunk" +) + +// JobStatus represents the current status of a job +type JobStatus string + +const ( + // JobStatusWaiting means the job hasn't started + JobStatusWaiting JobStatus = "waiting" + // JobStatusRunning means this job is running + JobStatusRunning JobStatus = "running" + // JobStatusCancelling means this job is being canceled, but not canceled yet + JobStatusCancelling JobStatus = "cancelling" + // JobStatusCancelled means this job has been canceled successfully + JobStatusCancelled JobStatus = "cancelled" + // JobStatusTimeout means this job has timeout + JobStatusTimeout JobStatus = "timeout" + // JobStatusFinished means job has been finished + JobStatusFinished JobStatus = "finished" +) + +const selectFromTTLTableStatus = "SELECT LOW_PRIORITY table_id,parent_table_id,table_statistics,last_job_id,last_job_start_time,last_job_finish_time,last_job_ttl_expire,last_job_summary,current_job_id,current_job_owner_id,current_job_owner_addr,current_job_owner_hb_time,current_job_start_time,current_job_ttl_expire,current_job_state,current_job_status,current_job_status_update_time FROM mysql.tidb_ttl_table_status" + +// SelectFromTTLTableStatusWithID returns an SQL statement to get the table status from table id +func SelectFromTTLTableStatusWithID(tableID int64) (string, []interface{}) { + return selectFromTTLTableStatus + " WHERE table_id = %?", []interface{}{tableID} +} + +// TableStatus contains the corresponding information in the system table `mysql.tidb_ttl_table_status` +type TableStatus struct { + TableID int64 + ParentTableID int64 + + TableStatistics string + + LastJobID string + LastJobStartTime time.Time + LastJobFinishTime time.Time + LastJobTTLExpire time.Time + LastJobSummary string + + CurrentJobID string + CurrentJobOwnerID string + CurrentJobOwnerAddr string + CurrentJobOwnerHBTime time.Time + CurrentJobStartTime time.Time + CurrentJobTTLExpire time.Time + + CurrentJobState string + CurrentJobStatus JobStatus + CurrentJobStatusUpdateTime time.Time +} + +// TableStatusCache is the cache for ttl table status, it builds a map from physical table id to the table status +type TableStatusCache struct { + baseCache + + Tables map[int64]*TableStatus +} + +// NewTableStatusCache creates cache for ttl table status +func NewTableStatusCache(updateInterval time.Duration) *TableStatusCache { + return &TableStatusCache{ + baseCache: newBaseCache(updateInterval), + Tables: make(map[int64]*TableStatus), + } +} + +// Update updates the table status cache +func (tsc *TableStatusCache) Update(ctx context.Context, se session.Session) error { + rows, err := se.ExecuteSQL(ctx, selectFromTTLTableStatus) + if err != nil { + return err + } + + newTables := make(map[int64]*TableStatus, len(rows)) + for _, row := range rows { + status, err := RowToTableStatus(se, row) + if err != nil { + return err + } + + newTables[status.TableID] = status + } + tsc.Tables = newTables + tsc.updateTime = time.Now() + return nil +} + +// RowToTableStatus converts a row to table status +func RowToTableStatus(sctx sessionctx.Context, row chunk.Row) (*TableStatus, error) { + var err error + timeZone := sctx.GetSessionVars().Location() + + status := &TableStatus{ + TableID: row.GetInt64(0), + } + if !row.IsNull(1) { + status.ParentTableID = row.GetInt64(1) + } + if !row.IsNull(2) { + status.TableStatistics = row.GetString(2) + } + if !row.IsNull(3) { + status.LastJobID = row.GetString(3) + } + if !row.IsNull(4) { + status.LastJobStartTime, err = row.GetTime(4).GoTime(timeZone) + if err != nil { + return nil, err + } + } + if !row.IsNull(5) { + status.LastJobFinishTime, err = row.GetTime(5).GoTime(timeZone) + if err != nil { + return nil, err + } + } + if !row.IsNull(6) { + status.LastJobTTLExpire, err = row.GetTime(6).GoTime(timeZone) + if err != nil { + return nil, err + } + } + if !row.IsNull(7) { + status.LastJobSummary = row.GetString(7) + } + if !row.IsNull(8) { + status.CurrentJobID = row.GetString(8) + } + if !row.IsNull(9) { + status.CurrentJobOwnerID = row.GetString(9) + } + if !row.IsNull(10) { + status.CurrentJobOwnerAddr = row.GetString(10) + } + if !row.IsNull(11) { + status.CurrentJobOwnerHBTime, err = row.GetTime(11).GoTime(timeZone) + if err != nil { + return nil, err + } + } + if !row.IsNull(12) { + status.CurrentJobStartTime, err = row.GetTime(12).GoTime(timeZone) + if err != nil { + return nil, err + } + } + if !row.IsNull(13) { + status.CurrentJobTTLExpire, err = row.GetTime(13).GoTime(timeZone) + if err != nil { + return nil, err + } + } + if !row.IsNull(14) { + status.CurrentJobState = row.GetString(14) + } + if !row.IsNull(15) { + jobStatus := row.GetString(15) + if len(jobStatus) == 0 { + jobStatus = "waiting" + } + status.CurrentJobStatus = JobStatus(jobStatus) + } + if !row.IsNull(16) { + status.CurrentJobStatusUpdateTime, err = row.GetTime(16).GoTime(timeZone) + if err != nil { + return nil, err + } + } + + return status, nil +} diff --git a/ttl/cache/ttlstatus_test.go b/ttl/cache/ttlstatus_test.go new file mode 100644 index 0000000000000..a73d3675d0e6d --- /dev/null +++ b/ttl/cache/ttlstatus_test.go @@ -0,0 +1,181 @@ +// 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, +// 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 cache_test + +import ( + "context" + "fmt" + "testing" + "time" + + "github.com/pingcap/tidb/server" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/ttl/session" + "github.com/stretchr/testify/assert" +) + +func TestTTLStatusCache(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + sv := server.CreateMockServer(t, store) + sv.SetDomain(dom) + defer sv.Close() + + conn := server.CreateMockConn(t, sv) + sctx := conn.Context().Session + tk := testkit.NewTestKitWithSession(t, store, sctx) + ttlSession := session.NewSession(sctx, tk.Session(), func(_ session.Session) {}) + + isc := cache.NewTableStatusCache(time.Hour) + + // test should update + assert.True(t, isc.ShouldUpdate()) + assert.NoError(t, isc.Update(context.Background(), ttlSession)) + assert.False(t, isc.ShouldUpdate()) + + // test new entries are synced + tk.MustExec("insert into mysql.tidb_ttl_table_status(table_id, parent_table_id) values (1, 2)") + assert.NoError(t, isc.Update(context.Background(), ttlSession)) + assert.Equal(t, 1, len(isc.Tables)) + tk.MustExec("delete from mysql.tidb_ttl_table_status where table_id = 1") + assert.NoError(t, isc.Update(context.Background(), ttlSession)) + assert.Equal(t, 0, len(isc.Tables)) + + timeZone := tk.Session().GetSessionVars().TimeZone + + // test every field of tidb_ttl_table_status can be extracted well + testCases := []struct { + columnName string + sqlLiteral string + assert func(table *cache.TableStatus) + }{ + { + "parent_table_id", + "2", + func(table *cache.TableStatus) { assert.Equal(t, int64(2), table.ParentTableID) }, + }, + { + "table_statistics", + "'test str'", + func(table *cache.TableStatus) { assert.Equal(t, "test str", table.TableStatistics) }, + }, + { + "last_job_id", + "'test job id'", + func(table *cache.TableStatus) { assert.Equal(t, "test job id", table.LastJobID) }, + }, + { + "last_job_start_time", + "'2022-12-01 16:49:01'", + func(table *cache.TableStatus) { + expectedTime, err := time.ParseInLocation("2006-01-02 15:04:05", "2022-12-01 16:49:01", timeZone) + assert.NoError(t, err) + assert.Equal(t, expectedTime, table.LastJobStartTime) + }, + }, + { + "last_job_finish_time", + "'2022-12-01 16:50:01'", + func(table *cache.TableStatus) { + expectedTime, err := time.ParseInLocation("2006-01-02 15:04:05", "2022-12-01 16:50:01", timeZone) + assert.NoError(t, err) + assert.Equal(t, expectedTime, table.LastJobFinishTime) + }, + }, + { + "last_job_ttl_expire", + "'2022-12-01 16:51:01'", + func(table *cache.TableStatus) { + expectedTime, err := time.ParseInLocation("2006-01-02 15:04:05", "2022-12-01 16:51:01", timeZone) + assert.NoError(t, err) + assert.Equal(t, expectedTime, table.LastJobTTLExpire) + }, + }, + { + "last_job_summary", + "'test summary'", + func(table *cache.TableStatus) { assert.Equal(t, "test summary", table.LastJobSummary) }, + }, + { + "current_job_id", + "'test current job id'", + func(table *cache.TableStatus) { assert.Equal(t, "test current job id", table.CurrentJobID) }, + }, + { + "current_job_owner_id", + "'test current job owner id'", + func(table *cache.TableStatus) { assert.Equal(t, "test current job owner id", table.CurrentJobOwnerID) }, + }, + { + "current_job_owner_hb_time", + "'2022-12-01 16:52:01'", + func(table *cache.TableStatus) { + expectedTime, err := time.ParseInLocation("2006-01-02 15:04:05", "2022-12-01 16:52:01", timeZone) + assert.NoError(t, err) + assert.Equal(t, expectedTime, table.CurrentJobOwnerHBTime) + }, + }, + { + "current_job_start_time", + "'2022-12-01 16:53:01'", + func(table *cache.TableStatus) { + expectedTime, err := time.ParseInLocation("2006-01-02 15:04:05", "2022-12-01 16:53:01", timeZone) + assert.NoError(t, err) + assert.Equal(t, expectedTime, table.CurrentJobStartTime) + }, + }, + { + "current_job_ttl_expire", + "'2022-12-01 16:54:01'", + func(table *cache.TableStatus) { + expectedTime, err := time.ParseInLocation("2006-01-02 15:04:05", "2022-12-01 16:54:01", timeZone) + assert.NoError(t, err) + assert.Equal(t, expectedTime, table.CurrentJobTTLExpire) + }, + }, + { + "current_job_state", + "'test state'", + func(table *cache.TableStatus) { assert.Equal(t, "test state", table.CurrentJobState) }, + }, + { + "current_job_status", + "'test status'", + func(table *cache.TableStatus) { + assert.Equal(t, cache.JobStatus("test status"), table.CurrentJobStatus) + }, + }, + { + "current_job_status_update_time", + "'2022-12-01 16:55:01'", + func(table *cache.TableStatus) { + expectedTime, err := time.ParseInLocation("2006-01-02 15:04:05", "2022-12-01 16:55:01", timeZone) + assert.NoError(t, err) + assert.Equal(t, expectedTime, table.CurrentJobStatusUpdateTime) + }, + }, + } + for index, testCase := range testCases { + t.Run(testCase.columnName, func(t *testing.T) { + sql := fmt.Sprintf(`insert into mysql.tidb_ttl_table_status (table_id, %s) values (%d, %s)`, + testCase.columnName, index, testCase.sqlLiteral) + + tk.MustExec(sql) + assert.NoError(t, isc.Update(context.Background(), ttlSession)) + assert.Equal(t, index+1, len(isc.Tables)) + testCase.assert(isc.Tables[int64(index)]) + }) + } +} diff --git a/ttl/client/BUILD.bazel b/ttl/client/BUILD.bazel new file mode 100644 index 0000000000000..6c045a6e08fe9 --- /dev/null +++ b/ttl/client/BUILD.bazel @@ -0,0 +1,33 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "client", + srcs = [ + "command.go", + "notification.go", + ], + importpath = "github.com/pingcap/tidb/ttl/client", + visibility = ["//visibility:public"], + deps = [ + "//ddl/util", + "//util/logutil", + "@com_github_google_uuid//:uuid", + "@com_github_pingcap_errors//:errors", + "@io_etcd_go_etcd_client_v3//:client", + "@org_uber_go_zap//:zap", + ], +) + +go_test( + name = "client_test", + timeout = "short", + srcs = ["command_test.go"], + embed = [":client"], + flaky = True, + shard_count = 5, + deps = [ + "@com_github_pingcap_errors//:errors", + "@com_github_stretchr_testify//require", + "@io_etcd_go_etcd_tests_v3//integration", + ], +) diff --git a/ttl/client/command.go b/ttl/client/command.go new file mode 100644 index 0000000000000..a285d9b186e3c --- /dev/null +++ b/ttl/client/command.go @@ -0,0 +1,431 @@ +// Copyright 2023 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 client + +import ( + "context" + "encoding/json" + "strings" + "sync" + "time" + + "github.com/google/uuid" + "github.com/pingcap/errors" + "github.com/pingcap/tidb/util/logutil" + clientv3 "go.etcd.io/etcd/client/v3" + "go.uber.org/zap" +) + +const ( + ttlCmdKeyLeaseSeconds int64 = 60 + ttlCmdKeyRequestPrefix = "/tidb/ttl/cmd/req/" + ttlCmdKeyResponsePrefix = "/tidb/ttl/cmd/resp/" + ttlCmdTypeTriggerTTLJob = "trigger_ttl_job" +) + +// CmdRequest is the request for a TTL command +type CmdRequest struct { + RequestID string `json:"request_id"` + CmdType string `json:"cmd_type"` + Data json.RawMessage `json:"data"` +} + +// GetTriggerTTLJobRequest returns the `TriggerNewTTLJobRequest` object if command type is 'trigger_ttl_job', +// otherwise, (nil, false) will be returned +func (r *CmdRequest) GetTriggerTTLJobRequest() (*TriggerNewTTLJobRequest, bool) { + if r.CmdType != ttlCmdTypeTriggerTTLJob { + return nil, false + } + + var req TriggerNewTTLJobRequest + if err := json.Unmarshal(r.Data, &req); err != nil { + return nil, false + } + return &req, true +} + +type cmdResponse struct { + RequestID string `json:"request_id"` + ErrorMessage string `json:"error_message"` + Data json.RawMessage `json:"data"` +} + +// TriggerNewTTLJobRequest is the command detail to trigger a TTL job +type TriggerNewTTLJobRequest struct { + DBName string `json:"db_name"` + TableName string `json:"table_name"` +} + +// TriggerNewTTLJobTableResult is the table detail of `TriggerNewTTLJobResponse` +type TriggerNewTTLJobTableResult struct { + TableID int64 `json:"table_id"` + DBName string `json:"db_name"` + TableName string `json:"table_name"` + PartitionName string `json:"partition_name,omitempty"` + JobID string `json:"job_id"` + ErrorMessage string `json:"error_message"` +} + +// TriggerNewTTLJobResponse is the response detail for trigger_ttl_job command +type TriggerNewTTLJobResponse struct { + TableResult []*TriggerNewTTLJobTableResult `json:"table_result"` +} + +// CommandClient is an interface used to send and response command of TTL jobs +type CommandClient interface { + // Command sends a command and waits for response. The first value of the return is the requestID, it always not empty. + Command(ctx context.Context, cmdType string, obj interface{}, response interface{}) (string, error) + // WatchCommand watches the commands that are sent + WatchCommand(ctx context.Context) <-chan *CmdRequest + // TakeCommand takes a command to ensure only one can handle the command. + // If the first return value is true, it means you have taken the command successfully, and you should call `ResponseCommand` + // after processed the command. Otherwise, you should not process this command because it is not belong to you. + TakeCommand(ctx context.Context, reqID string) (bool, error) + // ResponseCommand responses the result of the command. `TakeCommand` must be called first before `ResponseCommand` + // obj is the response object to the sender, if obj is an error, the sender will receive an error too. + ResponseCommand(ctx context.Context, reqID string, obj interface{}) error +} + +// TriggerNewTTLJob triggers a new TTL job +func TriggerNewTTLJob(ctx context.Context, cli CommandClient, dbName, tableName string) (*TriggerNewTTLJobResponse, error) { + var resp TriggerNewTTLJobResponse + _, err := cli.Command(ctx, ttlCmdTypeTriggerTTLJob, &TriggerNewTTLJobRequest{ + DBName: dbName, + TableName: tableName, + }, &resp) + + if err != nil { + return nil, err + } + return &resp, nil +} + +// etcdClient is the client of etcd which implements the commandCli and notificationCli interface +type etcdClient struct { + etcdCli *clientv3.Client +} + +// NewCommandClient creates a command client with etcd +func NewCommandClient(etcdCli *clientv3.Client) CommandClient { + return &etcdClient{ + etcdCli: etcdCli, + } +} + +func (c *etcdClient) sendCmd(ctx context.Context, cmdType string, obj interface{}) (string, error) { + reqID := uuid.New().String() + data, err := json.Marshal(obj) + if err != nil { + return reqID, err + } + + requestJSON, err := json.Marshal(&CmdRequest{ + RequestID: reqID, + CmdType: cmdType, + Data: data, + }) + if err != nil { + return reqID, err + } + + lease, err := c.etcdCli.Grant(ctx, ttlCmdKeyLeaseSeconds) + if err != nil { + return reqID, err + } + + if _, err = c.etcdCli.Put(ctx, ttlCmdKeyRequestPrefix+reqID, string(requestJSON), clientv3.WithLease(lease.ID)); err != nil { + return reqID, err + } + + return reqID, nil +} + +func (c *etcdClient) waitCmdResponse(ctx context.Context, reqID string, obj interface{}) error { + ctx, cancel := context.WithTimeout(ctx, time.Second*time.Duration(ttlCmdKeyLeaseSeconds)) + defer cancel() + + key := ttlCmdKeyResponsePrefix + reqID + ch := c.etcdCli.Watch(ctx, key) + ticker := time.NewTimer(time.Second) + defer ticker.Stop() + + var respData []byte +loop: + for { + select { + case <-ticker.C: + response, err := c.etcdCli.Get(ctx, key) + if err != nil { + return err + } + + if len(response.Kvs) > 0 { + respData = response.Kvs[0].Value + break loop + } + case resp := <-ch: + for _, event := range resp.Events { + if event.Type == clientv3.EventTypePut { + respData = event.Kv.Value + break loop + } + } + } + } + + var cmdResp cmdResponse + if err := json.Unmarshal(respData, &cmdResp); err != nil { + return err + } + + if cmdResp.ErrorMessage != "" { + return errors.New(cmdResp.ErrorMessage) + } + + return json.Unmarshal(cmdResp.Data, obj) +} + +// Command implements the CommandClient +func (c *etcdClient) Command(ctx context.Context, cmdType string, request interface{}, response interface{}) (string, error) { + requestID, err := c.sendCmd(ctx, cmdType, request) + if err != nil { + return requestID, err + } + return requestID, c.waitCmdResponse(ctx, requestID, &response) +} + +// TakeCommand implements the CommandClient +func (c *etcdClient) TakeCommand(ctx context.Context, reqID string) (bool, error) { + resp, err := c.etcdCli.Delete(ctx, ttlCmdKeyRequestPrefix+reqID) + if err != nil { + return false, err + } + return resp.Deleted > 0, nil +} + +// ResponseCommand implements the CommandClient +func (c *etcdClient) ResponseCommand(ctx context.Context, reqID string, obj interface{}) error { + resp := &cmdResponse{ + RequestID: reqID, + } + + if err, ok := obj.(error); ok { + resp.ErrorMessage = err.Error() + } else { + data, err := json.Marshal(obj) + if err != nil { + return err + } + resp.Data = data + } + + respJSON, err := json.Marshal(resp) + if err != nil { + return err + } + + lease, err := c.etcdCli.Grant(ctx, ttlCmdKeyLeaseSeconds) + if err != nil { + return err + } + + _, err = c.etcdCli.Put(ctx, ttlCmdKeyResponsePrefix+reqID, string(respJSON), clientv3.WithLease(lease.ID)) + return err +} + +// WatchCommand implements the CommandClient +func (c *etcdClient) WatchCommand(ctx context.Context) <-chan *CmdRequest { + ch := make(chan *CmdRequest) + go func() { + ctx, cancel := context.WithCancel(ctx) + defer func() { + cancel() + close(ch) + }() + + etcdCh := c.etcdCli.Watch(ctx, ttlCmdKeyRequestPrefix, clientv3.WithPrefix()) + for resp := range etcdCh { + for _, event := range resp.Events { + if event.Type != clientv3.EventTypePut { + continue + } + + var request CmdRequest + if err := json.Unmarshal(event.Kv.Value, &request); err != nil { + logutil.BgLogger().Error( + "failed to parse ttl cmd payload", + zap.Error(err), + zap.ByteString("key", event.Kv.Key), + zap.ByteString("value", event.Kv.Value), + ) + } + + select { + case ch <- &request: + case <-ctx.Done(): + return + } + } + } + }() + + return ch +} + +// mockClient is a mock implementation for CommandCli and NotificationCli +type mockClient struct { + sync.Mutex + store map[string]interface{} + commandWatchers []chan *CmdRequest + notificationWatchers map[string][]chan clientv3.WatchResponse +} + +// NewMockCommandClient creates a mock command client +func NewMockCommandClient() CommandClient { + return &mockClient{ + store: make(map[string]interface{}), + commandWatchers: make([]chan *CmdRequest, 0, 1), + notificationWatchers: make(map[string][]chan clientv3.WatchResponse), + } +} + +// Command implements the CommandClient +func (c *mockClient) Command(ctx context.Context, cmdType string, request interface{}, response interface{}) (string, error) { + ctx, cancel := context.WithTimeout(ctx, time.Second*time.Duration(ttlCmdKeyLeaseSeconds)) + defer cancel() + + reqID, err := c.sendCmd(ctx, cmdType, request) + if err != nil { + return reqID, err + } + + responseKey := ttlCmdKeyResponsePrefix + reqID + for ctx.Err() == nil { + c.Lock() + val, ok := c.store[responseKey] + c.Unlock() + + if !ok { + continue + } + + res, ok := val.(*cmdResponse) + if !ok { + return reqID, errors.New("response cannot be casted to *cmdResponse") + } + + if res.ErrorMessage != "" { + return reqID, errors.New(res.ErrorMessage) + } + + if err = json.Unmarshal(res.Data, response); err != nil { + return reqID, err + } + return reqID, nil + } + return reqID, ctx.Err() +} + +func (c *mockClient) sendCmd(ctx context.Context, cmdType string, request interface{}) (string, error) { + reqID := uuid.New().String() + data, err := json.Marshal(request) + if err != nil { + return reqID, err + } + + req := &CmdRequest{ + RequestID: reqID, + CmdType: cmdType, + Data: data, + } + + c.Lock() + defer c.Unlock() + key := ttlCmdKeyRequestPrefix + reqID + c.store[key] = req + for _, ch := range c.commandWatchers { + select { + case <-ctx.Done(): + return reqID, ctx.Err() + case ch <- req: + default: + return reqID, errors.New("watcher channel is blocked") + } + } + return reqID, nil +} + +// TakeCommand implements the CommandClient +func (c *mockClient) TakeCommand(_ context.Context, reqID string) (bool, error) { + c.Lock() + defer c.Unlock() + key := ttlCmdKeyRequestPrefix + reqID + if _, ok := c.store[key]; ok { + delete(c.store, key) + return true, nil + } + return false, nil +} + +// ResponseCommand implements the CommandClient +func (c *mockClient) ResponseCommand(_ context.Context, reqID string, obj interface{}) error { + c.Lock() + defer c.Unlock() + + resp := &cmdResponse{ + RequestID: reqID, + } + + if respErr, ok := obj.(error); ok { + resp.ErrorMessage = respErr.Error() + } else { + jsonData, err := json.Marshal(obj) + if err != nil { + return err + } + resp.Data = jsonData + } + + c.store[ttlCmdKeyResponsePrefix+reqID] = resp + return nil +} + +// WatchCommand implements the CommandClient +func (c *mockClient) WatchCommand(ctx context.Context) <-chan *CmdRequest { + c.Lock() + defer c.Unlock() + ch := make(chan *CmdRequest, 16+len(c.store)) + c.commandWatchers = append(c.commandWatchers, ch) + for key, val := range c.store { + if strings.HasPrefix(key, ttlCmdKeyRequestPrefix) { + if req, ok := val.(*CmdRequest); ok { + ch <- req + } + } + } + go func() { + <-ctx.Done() + c.Lock() + defer c.Unlock() + for i, chItem := range c.commandWatchers { + if chItem == ch { + c.commandWatchers = append(c.commandWatchers[:i], c.commandWatchers[i+1:]...) + break + } + } + close(ch) + }() + return ch +} diff --git a/ttl/client/command_test.go b/ttl/client/command_test.go new file mode 100644 index 0000000000000..69cde75309ad6 --- /dev/null +++ b/ttl/client/command_test.go @@ -0,0 +1,139 @@ +// Copyright 2023 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 client + +import ( + "context" + "encoding/json" + "testing" + "time" + + "github.com/pingcap/errors" + "github.com/stretchr/testify/require" + "go.etcd.io/etcd/tests/v3/integration" +) + +type mockCmdRequest struct { + V1 string `json:"v_1"` + V2 int `json:"v_2"` +} + +type mockCmdResponse struct { + V3 string `json:"v_3"` + V4 int `json:"v_4"` +} + +func TestCommandClient(t *testing.T) { + integration.BeforeTestExternal(t) + + cluster := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1}) + defer cluster.Terminate(t) + etcd := cluster.RandClient() + + etcdCli := NewCommandClient(etcd) + mockCli := NewMockCommandClient() + + ctx, cancel := context.WithTimeout(context.TODO(), time.Minute) + defer cancel() + + resCh := make(chan *mockCmdResponse) + defer close(resCh) + + for _, cli := range []CommandClient{etcdCli, mockCli} { + var sendRequestID, recvRequestID string + + // send command + go func() { + var err error + var res mockCmdResponse + defer func() { + resCh <- &res + }() + req := &mockCmdRequest{V1: "1", V2: 2} + sendRequestID, err = cli.Command(ctx, "type1", req, &res) + require.NoError(t, err) + require.NotEmpty(t, sendRequestID) + }() + + // check the received command and send response + watcher := cli.WatchCommand(ctx) + select { + case cmd, ok := <-watcher: + require.True(t, ok) + require.NotNil(t, cmd) + require.Equal(t, "type1", cmd.CmdType) + recvRequestID = cmd.RequestID + var gotReq mockCmdRequest + require.NoError(t, json.Unmarshal(cmd.Data, &gotReq)) + require.Equal(t, "1", gotReq.V1) + require.Equal(t, 2, gotReq.V2) + ok, err := cli.TakeCommand(ctx, recvRequestID) + require.NoError(t, err) + require.True(t, ok) + require.NoError(t, cli.ResponseCommand(ctx, cmd.RequestID, &mockCmdResponse{V3: "3", V4: 4})) + case <-ctx.Done(): + require.FailNow(t, ctx.Err().Error()) + } + + // check received response + select { + case res := <-resCh: + require.NotNil(t, res) + require.Equal(t, recvRequestID, sendRequestID) + require.Equal(t, "3", res.V3) + require.Equal(t, 4, res.V4) + case <-ctx.Done(): + require.FailNow(t, ctx.Err().Error()) + } + + // Take command again should return false, nil + ok, err := cli.TakeCommand(ctx, recvRequestID) + require.NoError(t, err) + require.False(t, ok) + + // send command and expect an error + go func() { + var err error + var res mockCmdResponse + defer func() { + resCh <- &res + }() + req := &mockCmdRequest{V1: "1", V2: 2} + sendRequestID, err = cli.Command(ctx, "type1", req, &res) + require.NotEmpty(t, sendRequestID) + require.EqualError(t, err, "mockErr") + }() + + // response an error + watcher = cli.WatchCommand(ctx) + select { + case cmd, ok := <-watcher: + require.True(t, ok) + require.NotNil(t, cmd) + _, err = cli.TakeCommand(ctx, cmd.RequestID) + require.NoError(t, err) + require.NoError(t, cli.ResponseCommand(ctx, cmd.RequestID, errors.New("mockErr"))) + case <-ctx.Done(): + require.FailNow(t, ctx.Err().Error()) + } + + // wait send goroutine exit + select { + case <-resCh: + case <-ctx.Done(): + require.FailNow(t, ctx.Err().Error()) + } + } +} diff --git a/ttl/client/notification.go b/ttl/client/notification.go new file mode 100644 index 0000000000000..d65405b5bf06b --- /dev/null +++ b/ttl/client/notification.go @@ -0,0 +1,79 @@ +// Copyright 2023 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 client + +import ( + "context" + + "github.com/pingcap/tidb/ddl/util" + clientv3 "go.etcd.io/etcd/client/v3" +) + +const ttlNotificationPrefix string = "/tidb/ttl/notification/" + +// NotificationClient is a client to notify other TTL workers +type NotificationClient interface { + // Notify sends a notification + Notify(ctx context.Context, typ string, data string) error + // WatchNotification opens a channel, in which we could receive all notifications + WatchNotification(ctx context.Context, typ string) clientv3.WatchChan +} + +// NewNotificationClient creates a notification client with etcd +func NewNotificationClient(etcdCli *clientv3.Client) NotificationClient { + return &etcdClient{ + etcdCli: etcdCli, + } +} + +// Notify stores the corresponding K-V in the etcd +func (c *etcdClient) Notify(ctx context.Context, typ string, data string) error { + return util.PutKVToEtcd(ctx, c.etcdCli, 1, ttlNotificationPrefix+typ, data) +} + +// WatchNotification returns a go channel to get notification +func (c *etcdClient) WatchNotification(ctx context.Context, typ string) clientv3.WatchChan { + return c.etcdCli.Watch(ctx, ttlNotificationPrefix+typ) +} + +// NewMockNotificationClient creates a mock notification client +func NewMockNotificationClient() NotificationClient { + return &mockClient{ + store: make(map[string]interface{}), + commandWatchers: make([]chan *CmdRequest, 0, 1), + notificationWatchers: make(map[string][]chan clientv3.WatchResponse), + } +} + +// Notify implements the NotificationClient +func (c *mockClient) Notify(_ context.Context, typ string, data string) error { + c.Lock() + defer c.Unlock() + + for _, ch := range c.notificationWatchers[typ] { + ch <- clientv3.WatchResponse{} + } + return nil +} + +// WatchNotification implements the NotificationClient +func (c *mockClient) WatchNotification(_ context.Context, typ string) clientv3.WatchChan { + c.Lock() + defer c.Unlock() + + ch := make(chan clientv3.WatchResponse, 8) + c.notificationWatchers[typ] = append(c.notificationWatchers[typ], ch) + return ch +} diff --git a/ttl/metrics/BUILD.bazel b/ttl/metrics/BUILD.bazel new file mode 100644 index 0000000000000..5945532cfda66 --- /dev/null +++ b/ttl/metrics/BUILD.bazel @@ -0,0 +1,22 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "metrics", + srcs = ["metrics.go"], + importpath = "github.com/pingcap/tidb/ttl/metrics", + visibility = ["//visibility:public"], + deps = [ + "//metrics", + "@com_github_prometheus_client_golang//prometheus", + ], +) + +go_test( + name = "metrics_test", + timeout = "short", + srcs = ["metrics_test.go"], + embed = [":metrics"], + flaky = True, + shard_count = 5, + deps = ["@com_github_stretchr_testify//require"], +) diff --git a/ttl/metrics/metrics.go b/ttl/metrics/metrics.go new file mode 100644 index 0000000000000..da9549cdb023d --- /dev/null +++ b/ttl/metrics/metrics.go @@ -0,0 +1,152 @@ +// 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, +// 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 metrics + +import ( + "context" + "time" + + "github.com/pingcap/tidb/metrics" + "github.com/prometheus/client_golang/prometheus" +) + +// Phases to trace +var ( + PhaseIdle = "idle" + PhaseBeginTxn = "begin_txn" + PhaseCommitTxn = "commit_txn" + PhaseQuery = "query" + PhaseCheckTTL = "check_ttl" + PhaseWaitRetry = "wait_retry" + PhaseDispatch = "dispatch" + PhaseWaitToken = "wait_token" + PhaseOther = "other" +) + +// TTL metrics +var ( + SelectSuccessDuration = metrics.TTLQueryDuration.With(prometheus.Labels{metrics.LblSQLType: "select", metrics.LblResult: metrics.LblOK}) + SelectErrorDuration = metrics.TTLQueryDuration.With(prometheus.Labels{metrics.LblSQLType: "select", metrics.LblResult: metrics.LblError}) + DeleteSuccessDuration = metrics.TTLQueryDuration.With(prometheus.Labels{metrics.LblSQLType: "delete", metrics.LblResult: metrics.LblOK}) + DeleteErrorDuration = metrics.TTLQueryDuration.With(prometheus.Labels{metrics.LblSQLType: "delete", metrics.LblResult: metrics.LblError}) + + ScannedExpiredRows = metrics.TTLProcessedExpiredRowsCounter.With(prometheus.Labels{metrics.LblSQLType: "select", metrics.LblResult: metrics.LblOK}) + DeleteSuccessExpiredRows = metrics.TTLProcessedExpiredRowsCounter.With(prometheus.Labels{metrics.LblSQLType: "delete", metrics.LblResult: metrics.LblOK}) + DeleteErrorExpiredRows = metrics.TTLProcessedExpiredRowsCounter.With(prometheus.Labels{metrics.LblSQLType: "delete", metrics.LblResult: metrics.LblError}) + + RunningJobsCnt = metrics.TTLJobStatus.With(prometheus.Labels{metrics.LblType: "running"}) + CancellingJobsCnt = metrics.TTLJobStatus.With(prometheus.Labels{metrics.LblType: "cancelling"}) + + ScanningTaskCnt = metrics.TTLTaskStatus.With(prometheus.Labels{metrics.LblType: "scanning"}) + DeletingTaskCnt = metrics.TTLTaskStatus.With(prometheus.Labels{metrics.LblType: "deleting"}) +) + +func initWorkerPhases(workerType string) map[string]prometheus.Counter { + return map[string]prometheus.Counter{ + PhaseIdle: metrics.TTLPhaseTime.WithLabelValues(workerType, PhaseIdle), + PhaseBeginTxn: metrics.TTLPhaseTime.WithLabelValues(workerType, PhaseBeginTxn), + PhaseCommitTxn: metrics.TTLPhaseTime.WithLabelValues(workerType, PhaseCommitTxn), + PhaseQuery: metrics.TTLPhaseTime.WithLabelValues(workerType, PhaseQuery), + PhaseWaitRetry: metrics.TTLPhaseTime.WithLabelValues(workerType, PhaseWaitRetry), + PhaseDispatch: metrics.TTLPhaseTime.WithLabelValues(workerType, PhaseDispatch), + PhaseCheckTTL: metrics.TTLPhaseTime.WithLabelValues(workerType, PhaseCheckTTL), + PhaseWaitToken: metrics.TTLPhaseTime.WithLabelValues(workerType, PhaseWaitToken), + PhaseOther: metrics.TTLPhaseTime.WithLabelValues(workerType, PhaseOther), + } +} + +var scanWorkerPhases = initWorkerPhases("scan_worker") +var deleteWorkerPhases = initWorkerPhases("delete_worker") + +// PhaseTracer is used to tracer the phases duration +type PhaseTracer struct { + getTime func() time.Time + recordDuration func(phase string, duration time.Duration) + + phase string + phaseTime time.Time +} + +// NewScanWorkerPhaseTracer returns a tracer for scan worker +func NewScanWorkerPhaseTracer() *PhaseTracer { + return newPhaseTracer(time.Now, func(status string, duration time.Duration) { + if counter, ok := scanWorkerPhases[status]; ok { + counter.Add(duration.Seconds()) + } + }) +} + +// NewDeleteWorkerPhaseTracer returns a tracer for delete worker +func NewDeleteWorkerPhaseTracer() *PhaseTracer { + return newPhaseTracer(time.Now, func(status string, duration time.Duration) { + if counter, ok := deleteWorkerPhases[status]; ok { + counter.Add(duration.Seconds()) + } + }) +} + +func newPhaseTracer(getTime func() time.Time, recordDuration func(status string, duration time.Duration)) *PhaseTracer { + return &PhaseTracer{ + getTime: getTime, + recordDuration: recordDuration, + phaseTime: getTime(), + } +} + +// Phase returns the current phase +func (t *PhaseTracer) Phase() string { + if t == nil { + return "" + } + return t.phase +} + +// EnterPhase enters into a new phase +func (t *PhaseTracer) EnterPhase(phase string) { + if t == nil { + return + } + + now := t.getTime() + if t.phase != "" { + t.recordDuration(t.phase, now.Sub(t.phaseTime)) + } + + t.phase = phase + t.phaseTime = now +} + +// EndPhase ends the current phase +func (t *PhaseTracer) EndPhase() { + if t == nil { + return + } + t.EnterPhase("") +} + +type ttlPhaseTraceKey struct{} + +// CtxWithPhaseTracer create a new context with tracer +func CtxWithPhaseTracer(ctx context.Context, tracer *PhaseTracer) context.Context { + return context.WithValue(ctx, ttlPhaseTraceKey{}, tracer) +} + +// PhaseTracerFromCtx returns a tracer from a given context +func PhaseTracerFromCtx(ctx context.Context) *PhaseTracer { + if tracer, ok := ctx.Value(ttlPhaseTraceKey{}).(*PhaseTracer); ok { + return tracer + } + return nil +} diff --git a/ttl/metrics/metrics_test.go b/ttl/metrics/metrics_test.go new file mode 100644 index 0000000000000..68ca303756ce0 --- /dev/null +++ b/ttl/metrics/metrics_test.go @@ -0,0 +1,70 @@ +// 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, +// 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 metrics + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestPhaseTracer(t *testing.T) { + tm := time.Now() + getTime := func() time.Time { + return tm + } + + lastReportStatus := "" + lastReportDuration := time.Duration(0) + resetReport := func() { + lastReportStatus = "" + lastReportDuration = time.Duration(0) + } + + tracer := newPhaseTracer(getTime, func(status string, duration time.Duration) { + require.Equal(t, "", lastReportStatus) + require.Equal(t, int64(0), lastReportDuration.Nanoseconds()) + lastReportStatus = status + lastReportDuration = duration + }) + + resetReport() + tm = tm.Add(time.Second * 2) + tracer.EnterPhase("p1") + require.Equal(t, "", lastReportStatus) + require.Equal(t, int64(0), lastReportDuration.Nanoseconds()) + require.Equal(t, "p1", tracer.Phase()) + + tm = tm.Add(time.Second * 5) + tracer.EnterPhase("p2") + require.Equal(t, "p1", lastReportStatus) + require.Equal(t, time.Second*5, lastReportDuration) + require.Equal(t, "p2", tracer.Phase()) + + resetReport() + tm = tm.Add(time.Second * 10) + tracer.EnterPhase("p2") + require.Equal(t, "p2", lastReportStatus) + require.Equal(t, time.Second*10, lastReportDuration) + require.Equal(t, "p2", tracer.Phase()) + + resetReport() + tm = tm.Add(time.Second * 20) + tracer.EndPhase() + require.Equal(t, "p2", lastReportStatus) + require.Equal(t, time.Second*20, lastReportDuration) + require.Equal(t, "", tracer.Phase()) +} diff --git a/ttl/session/BUILD.bazel b/ttl/session/BUILD.bazel new file mode 100644 index 0000000000000..a98067cff9854 --- /dev/null +++ b/ttl/session/BUILD.bazel @@ -0,0 +1,41 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "session", + srcs = ["session.go"], + importpath = "github.com/pingcap/tidb/ttl/session", + visibility = ["//visibility:public"], + deps = [ + "//infoschema", + "//kv", + "//parser/terror", + "//sessionctx", + "//sessionctx/variable", + "//sessiontxn", + "//ttl/metrics", + "//util/chunk", + "//util/sqlexec", + "@com_github_pingcap_errors//:errors", + ], +) + +go_test( + name = "session_test", + timeout = "short", + srcs = [ + "main_test.go", + "session_test.go", + "sysvar_test.go", + ], + flaky = True, + shard_count = 5, + deps = [ + ":session", + "//sessionctx/variable", + "//testkit", + "//testkit/testsetup", + "@com_github_pingcap_errors//:errors", + "@com_github_stretchr_testify//require", + "@org_uber_go_goleak//:goleak", + ], +) diff --git a/ttl/session/main_test.go b/ttl/session/main_test.go new file mode 100644 index 0000000000000..330dcd581dbff --- /dev/null +++ b/ttl/session/main_test.go @@ -0,0 +1,33 @@ +// 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, +// 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 session_test + +import ( + "testing" + + "github.com/pingcap/tidb/testkit/testsetup" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + testsetup.SetupForCommonTest() + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } + goleak.VerifyTestMain(m, opts...) +} diff --git a/ttl/session/session.go b/ttl/session/session.go new file mode 100644 index 0000000000000..a413cdadf03ff --- /dev/null +++ b/ttl/session/session.go @@ -0,0 +1,184 @@ +// 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, +// 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 session + +import ( + "context" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/sessiontxn" + "github.com/pingcap/tidb/ttl/metrics" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/sqlexec" +) + +// TxnMode represents using optimistic or pessimistic mode in the transaction +type TxnMode int + +const ( + // TxnModeOptimistic means using the optimistic transaction with "BEGIN OPTIMISTIC" + TxnModeOptimistic TxnMode = iota + // TxnModePessimistic means using the pessimistic transaction with "BEGIN PESSIMISTIC" + TxnModePessimistic +) + +// Session is used to execute queries for TTL case +type Session interface { + sessionctx.Context + // SessionInfoSchema returns information schema of current session + SessionInfoSchema() infoschema.InfoSchema + // ExecuteSQL executes the sql + ExecuteSQL(ctx context.Context, sql string, args ...interface{}) ([]chunk.Row, error) + // RunInTxn executes the specified function in a txn + RunInTxn(ctx context.Context, fn func() error, mode TxnMode) (err error) + // ResetWithGlobalTimeZone resets the session time zone to global time zone + ResetWithGlobalTimeZone(ctx context.Context) error + // Close closes the session + Close() + // Now returns the current time in location specified by session var + Now() time.Time +} + +type session struct { + sessionctx.Context + sqlExec sqlexec.SQLExecutor + closeFn func(Session) +} + +// NewSession creates a new Session +func NewSession(sctx sessionctx.Context, sqlExec sqlexec.SQLExecutor, closeFn func(Session)) Session { + return &session{ + Context: sctx, + sqlExec: sqlExec, + closeFn: closeFn, + } +} + +// SessionInfoSchema returns information schema of current session +func (s *session) SessionInfoSchema() infoschema.InfoSchema { + if s.Context == nil { + return nil + } + return sessiontxn.GetTxnManager(s.Context).GetTxnInfoSchema() +} + +// ExecuteSQL executes the sql +func (s *session) ExecuteSQL(ctx context.Context, sql string, args ...interface{}) ([]chunk.Row, error) { + if s.sqlExec == nil { + return nil, errors.New("session is closed") + } + + ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnTTL) + rs, err := s.sqlExec.ExecuteInternal(ctx, sql, args...) + if err != nil { + return nil, err + } + + if rs == nil { + return nil, nil + } + + defer func() { + terror.Log(rs.Close()) + }() + + return sqlexec.DrainRecordSet(ctx, rs, 8) +} + +// RunInTxn executes the specified function in a txn +func (s *session) RunInTxn(ctx context.Context, fn func() error, txnMode TxnMode) (err error) { + tracer := metrics.PhaseTracerFromCtx(ctx) + defer tracer.EnterPhase(tracer.Phase()) + + tracer.EnterPhase(metrics.PhaseBeginTxn) + sql := "BEGIN " + switch txnMode { + case TxnModeOptimistic: + sql += "OPTIMISTIC" + case TxnModePessimistic: + sql += "PESSIMISTIC" + default: + return errors.New("unknown transaction mode") + } + if _, err = s.ExecuteSQL(ctx, sql); err != nil { + return err + } + tracer.EnterPhase(metrics.PhaseOther) + + success := false + defer func() { + if !success { + _, rollbackErr := s.ExecuteSQL(ctx, "ROLLBACK") + terror.Log(rollbackErr) + } + }() + + if err = fn(); err != nil { + return err + } + + tracer.EnterPhase(metrics.PhaseCommitTxn) + if _, err = s.ExecuteSQL(ctx, "COMMIT"); err != nil { + return err + } + tracer.EnterPhase(metrics.PhaseOther) + + success = true + return err +} + +// ResetWithGlobalTimeZone resets the session time zone to global time zone +func (s *session) ResetWithGlobalTimeZone(ctx context.Context) error { + sessVar := s.GetSessionVars() + if sessVar.TimeZone != nil { + globalTZ, err := sessVar.GetGlobalSystemVar(ctx, variable.TimeZone) + if err != nil { + return err + } + + tz, err := sessVar.GetSessionOrGlobalSystemVar(ctx, variable.TimeZone) + if err != nil { + return err + } + + if globalTZ == tz { + return nil + } + } + + _, err := s.ExecuteSQL(ctx, "SET @@time_zone=@@global.time_zone") + return err +} + +// Close closes the session +func (s *session) Close() { + if s.closeFn != nil { + s.closeFn(s) + s.Context = nil + s.sqlExec = nil + s.closeFn = nil + } +} + +// Now returns the current time in the location of time_zone session var +func (s *session) Now() time.Time { + return time.Now().In(s.Context.GetSessionVars().Location()) +} diff --git a/ttl/session/session_test.go b/ttl/session/session_test.go new file mode 100644 index 0000000000000..607c7a2319342 --- /dev/null +++ b/ttl/session/session_test.go @@ -0,0 +1,66 @@ +// 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, +// 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 session_test + +import ( + "context" + "testing" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/ttl/session" + "github.com/stretchr/testify/require" +) + +func TestSessionRunInTxn(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(id int primary key, v int)") + se := session.NewSession(tk.Session(), tk.Session(), nil) + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + + require.NoError(t, se.RunInTxn(context.TODO(), func() error { + tk.MustExec("insert into t values (1, 10)") + return nil + }, session.TxnModeOptimistic)) + tk2.MustQuery("select * from t order by id asc").Check(testkit.Rows("1 10")) + + err := se.RunInTxn(context.TODO(), func() error { + tk.MustExec("insert into t values (2, 20)") + return errors.New("mockErr") + }, session.TxnModeOptimistic) + require.EqualError(t, err, "mockErr") + tk2.MustQuery("select * from t order by id asc").Check(testkit.Rows("1 10")) + + require.NoError(t, se.RunInTxn(context.TODO(), func() error { + tk.MustExec("insert into t values (3, 30)") + return nil + }, session.TxnModeOptimistic)) + tk2.MustQuery("select * from t order by id asc").Check(testkit.Rows("1 10", "3 30")) +} + +func TestSessionResetTimeZone(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.time_zone='UTC'") + tk.MustExec("set @@time_zone='Asia/Shanghai'") + + se := session.NewSession(tk.Session(), tk.Session(), nil) + tk.MustQuery("select @@time_zone").Check(testkit.Rows("Asia/Shanghai")) + require.NoError(t, se.ResetWithGlobalTimeZone(context.TODO())) + tk.MustQuery("select @@time_zone").Check(testkit.Rows("UTC")) +} diff --git a/ttl/session/sysvar_test.go b/ttl/session/sysvar_test.go new file mode 100644 index 0000000000000..58f61c3cc88bb --- /dev/null +++ b/ttl/session/sysvar_test.go @@ -0,0 +1,125 @@ +// 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, +// 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 session_test + +import ( + "fmt" + "strconv" + "testing" + + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/require" +) + +func TestSysVarTTLJobEnable(t *testing.T) { + origEnableDDL := variable.EnableTTLJob.Load() + defer func() { + variable.EnableTTLJob.Store(origEnableDDL) + }() + + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_ttl_job_enable=0") + require.False(t, variable.EnableTTLJob.Load()) + tk.MustQuery("select @@global.tidb_ttl_job_enable").Check(testkit.Rows("0")) + tk.MustQuery("select @@tidb_ttl_job_enable").Check(testkit.Rows("0")) + + tk.MustExec("set @@global.tidb_ttl_job_enable=1") + require.True(t, variable.EnableTTLJob.Load()) + tk.MustQuery("select @@global.tidb_ttl_job_enable").Check(testkit.Rows("1")) + tk.MustQuery("select @@tidb_ttl_job_enable").Check(testkit.Rows("1")) + + tk.MustExec("set @@global.tidb_ttl_job_enable=0") + require.False(t, variable.EnableTTLJob.Load()) + tk.MustQuery("select @@global.tidb_ttl_job_enable").Check(testkit.Rows("0")) + tk.MustQuery("select @@tidb_ttl_job_enable").Check(testkit.Rows("0")) +} + +func TestSysVarTTLScanBatchSize(t *testing.T) { + origScanBatchSize := variable.TTLScanBatchSize.Load() + defer func() { + variable.TTLScanBatchSize.Store(origScanBatchSize) + }() + + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_ttl_scan_batch_size=789") + require.Equal(t, int64(789), variable.TTLScanBatchSize.Load()) + tk.MustQuery("select @@global.tidb_ttl_scan_batch_size").Check(testkit.Rows("789")) + tk.MustQuery("select @@tidb_ttl_scan_batch_size").Check(testkit.Rows("789")) + + tk.MustExec("set @@global.tidb_ttl_scan_batch_size=0") + require.Equal(t, int64(1), variable.TTLScanBatchSize.Load()) + tk.MustQuery("select @@global.tidb_ttl_scan_batch_size").Check(testkit.Rows("1")) + tk.MustQuery("select @@tidb_ttl_scan_batch_size").Check(testkit.Rows("1")) + + maxVal := int64(variable.DefTiDBTTLScanBatchMaxSize) + tk.MustExec(fmt.Sprintf("set @@global.tidb_ttl_scan_batch_size=%d", maxVal+1)) + require.Equal(t, maxVal, variable.TTLScanBatchSize.Load()) + tk.MustQuery("select @@global.tidb_ttl_scan_batch_size").Check(testkit.Rows(strconv.FormatInt(maxVal, 10))) + tk.MustQuery("select @@tidb_ttl_scan_batch_size").Check(testkit.Rows(strconv.FormatInt(maxVal, 10))) +} + +func TestSysVarTTLScanDeleteBatchSize(t *testing.T) { + origScanBatchSize := variable.TTLScanBatchSize.Load() + defer func() { + variable.TTLScanBatchSize.Store(origScanBatchSize) + }() + + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@global.tidb_ttl_delete_batch_size=789") + require.Equal(t, int64(789), variable.TTLDeleteBatchSize.Load()) + tk.MustQuery("select @@global.tidb_ttl_delete_batch_size").Check(testkit.Rows("789")) + tk.MustQuery("select @@tidb_ttl_delete_batch_size").Check(testkit.Rows("789")) + + tk.MustExec("set @@global.tidb_ttl_delete_batch_size=0") + require.Equal(t, int64(1), variable.TTLDeleteBatchSize.Load()) + tk.MustQuery("select @@global.tidb_ttl_delete_batch_size").Check(testkit.Rows("1")) + tk.MustQuery("select @@tidb_ttl_delete_batch_size").Check(testkit.Rows("1")) + + maxVal := int64(variable.DefTiDBTTLDeleteBatchMaxSize) + tk.MustExec(fmt.Sprintf("set @@global.tidb_ttl_delete_batch_size=%d", maxVal+1)) + require.Equal(t, maxVal, variable.TTLDeleteBatchSize.Load()) + tk.MustQuery("select @@global.tidb_ttl_delete_batch_size").Check(testkit.Rows(strconv.FormatInt(maxVal, 10))) + tk.MustQuery("select @@tidb_ttl_delete_batch_size").Check(testkit.Rows(strconv.FormatInt(maxVal, 10))) +} + +func TestSysVarTTLScanDeleteLimit(t *testing.T) { + origDeleteLimit := variable.TTLDeleteRateLimit.Load() + defer func() { + variable.TTLDeleteRateLimit.Store(origDeleteLimit) + }() + + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustQuery("select @@global.tidb_ttl_delete_rate_limit").Check(testkit.Rows("0")) + + tk.MustExec("set @@global.tidb_ttl_delete_rate_limit=100000") + require.Equal(t, int64(100000), variable.TTLDeleteRateLimit.Load()) + tk.MustQuery("select @@global.tidb_ttl_delete_rate_limit").Check(testkit.Rows("100000")) + tk.MustQuery("select @@tidb_ttl_delete_rate_limit").Check(testkit.Rows("100000")) + + tk.MustExec("set @@global.tidb_ttl_delete_rate_limit=0") + require.Equal(t, int64(0), variable.TTLDeleteRateLimit.Load()) + tk.MustQuery("select @@global.tidb_ttl_delete_rate_limit").Check(testkit.Rows("0")) + tk.MustQuery("select @@tidb_ttl_delete_rate_limit").Check(testkit.Rows("0")) + + tk.MustExec("set @@global.tidb_ttl_delete_rate_limit=-1") + require.Equal(t, int64(0), variable.TTLDeleteRateLimit.Load()) + tk.MustQuery("select @@global.tidb_ttl_delete_rate_limit").Check(testkit.Rows("0")) + tk.MustQuery("select @@tidb_ttl_delete_rate_limit").Check(testkit.Rows("0")) +} diff --git a/ttl/sqlbuilder/BUILD.bazel b/ttl/sqlbuilder/BUILD.bazel new file mode 100644 index 0000000000000..5eafc4a7748d3 --- /dev/null +++ b/ttl/sqlbuilder/BUILD.bazel @@ -0,0 +1,46 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "sqlbuilder", + srcs = ["sql.go"], + importpath = "github.com/pingcap/tidb/ttl/sqlbuilder", + visibility = ["//visibility:public"], + deps = [ + "//parser/ast", + "//parser/format", + "//parser/model", + "//parser/mysql", + "//ttl/cache", + "//types", + "//util/sqlexec", + "@com_github_pkg_errors//:errors", + ], +) + +go_test( + name = "sqlbuilder_test", + timeout = "short", + srcs = [ + "main_test.go", + "sql_test.go", + ], + flaky = True, + shard_count = 5, + deps = [ + ":sqlbuilder", + "//kv", + "//parser", + "//parser/ast", + "//parser/model", + "//parser/mysql", + "//parser/terror", + "//testkit", + "//testkit/testsetup", + "//ttl/cache", + "//types", + "//util/dbterror", + "//util/sqlexec", + "@com_github_stretchr_testify//require", + "@org_uber_go_goleak//:goleak", + ], +) diff --git a/ttl/sqlbuilder/main_test.go b/ttl/sqlbuilder/main_test.go new file mode 100644 index 0000000000000..76cecabaf752c --- /dev/null +++ b/ttl/sqlbuilder/main_test.go @@ -0,0 +1,33 @@ +// 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, +// 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 sqlbuilder_test + +import ( + "testing" + + "github.com/pingcap/tidb/testkit/testsetup" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + testsetup.SetupForCommonTest() + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } + goleak.VerifyTestMain(m, opts...) +} diff --git a/ttl/sqlbuilder/sql.go b/ttl/sqlbuilder/sql.go new file mode 100644 index 0000000000000..23cd292e78210 --- /dev/null +++ b/ttl/sqlbuilder/sql.go @@ -0,0 +1,481 @@ +// 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, +// 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 sqlbuilder + +import ( + "encoding/hex" + "fmt" + "io" + "strconv" + "strings" + "time" + + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/format" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/sqlexec" + "github.com/pkg/errors" +) + +func writeHex(in io.Writer, d types.Datum) error { + _, err := fmt.Fprintf(in, "x'%s'", hex.EncodeToString(d.GetBytes())) + return err +} + +func writeDatum(restoreCtx *format.RestoreCtx, d types.Datum, ft *types.FieldType) error { + switch ft.GetType() { + case mysql.TypeBit, mysql.TypeBlob, mysql.TypeLongBlob, mysql.TypeTinyBlob: + return writeHex(restoreCtx.In, d) + case mysql.TypeString, mysql.TypeVarString, mysql.TypeVarchar, mysql.TypeEnum, mysql.TypeSet: + if mysql.HasBinaryFlag(ft.GetFlag()) { + return writeHex(restoreCtx.In, d) + } + _, err := fmt.Fprintf(restoreCtx.In, "'%s'", sqlexec.EscapeString(d.GetString())) + return err + } + expr := ast.NewValueExpr(d.GetValue(), ft.GetCharset(), ft.GetCollate()) + return expr.Restore(restoreCtx) +} + +// FormatSQLDatum formats the datum to a value string in sql +func FormatSQLDatum(d types.Datum, ft *types.FieldType) (string, error) { + var sb strings.Builder + ctx := format.NewRestoreCtx(format.DefaultRestoreFlags, &sb) + if err := writeDatum(ctx, d, ft); err != nil { + return "", err + } + return sb.String(), nil +} + +type sqlBuilderState int + +const ( + writeBegin sqlBuilderState = iota + writeSelOrDel + writeWhere + writeOrderBy + writeLimit + writeDone +) + +// SQLBuilder is used to build SQLs for TTL +type SQLBuilder struct { + tbl *cache.PhysicalTable + sb strings.Builder + restoreCtx *format.RestoreCtx + state sqlBuilderState + + isReadOnly bool + hasWriteExpireCond bool +} + +// NewSQLBuilder creates a new TTLSQLBuilder +func NewSQLBuilder(tbl *cache.PhysicalTable) *SQLBuilder { + b := &SQLBuilder{tbl: tbl, state: writeBegin} + b.restoreCtx = format.NewRestoreCtx(format.DefaultRestoreFlags, &b.sb) + return b +} + +// Build builds the final sql +func (b *SQLBuilder) Build() (string, error) { + if b.state == writeBegin { + return "", errors.Errorf("invalid state: %v", b.state) + } + + if !b.isReadOnly && !b.hasWriteExpireCond { + // check whether the `timeRow < expire_time` condition has been written to make sure this SQL is safe. + return "", errors.New("expire condition not write") + } + + if b.state != writeDone { + b.state = writeDone + } + + return b.sb.String(), nil +} + +// WriteSelect writes a select statement to select key columns without any condition +func (b *SQLBuilder) WriteSelect() error { + if b.state != writeBegin { + return errors.Errorf("invalid state: %v", b.state) + } + b.restoreCtx.WritePlain("SELECT LOW_PRIORITY ") + b.writeColNames(b.tbl.KeyColumns, false) + b.restoreCtx.WritePlain(" FROM ") + if err := b.writeTblName(); err != nil { + return err + } + if par := b.tbl.PartitionDef; par != nil { + b.restoreCtx.WritePlain(" PARTITION(") + b.restoreCtx.WriteName(par.Name.O) + b.restoreCtx.WritePlain(")") + } + b.state = writeSelOrDel + b.isReadOnly = true + return nil +} + +// WriteDelete writes a delete statement without any condition +func (b *SQLBuilder) WriteDelete() error { + if b.state != writeBegin { + return errors.Errorf("invalid state: %v", b.state) + } + b.restoreCtx.WritePlain("DELETE LOW_PRIORITY FROM ") + if err := b.writeTblName(); err != nil { + return err + } + if par := b.tbl.PartitionDef; par != nil { + b.restoreCtx.WritePlain(" PARTITION(") + b.restoreCtx.WriteName(par.Name.O) + b.restoreCtx.WritePlain(")") + } + b.state = writeSelOrDel + return nil +} + +// WriteCommonCondition writes a new condition +func (b *SQLBuilder) WriteCommonCondition(cols []*model.ColumnInfo, op string, dp []types.Datum) error { + switch b.state { + case writeSelOrDel: + b.restoreCtx.WritePlain(" WHERE ") + b.state = writeWhere + case writeWhere: + b.restoreCtx.WritePlain(" AND ") + default: + return errors.Errorf("invalid state: %v", b.state) + } + + b.writeColNames(cols, len(cols) > 1) + b.restoreCtx.WritePlain(" ") + b.restoreCtx.WritePlain(op) + b.restoreCtx.WritePlain(" ") + return b.writeDataPoint(cols, dp) +} + +// WriteExpireCondition writes a condition with the time column +func (b *SQLBuilder) WriteExpireCondition(expire time.Time) error { + switch b.state { + case writeSelOrDel: + b.restoreCtx.WritePlain(" WHERE ") + b.state = writeWhere + case writeWhere: + b.restoreCtx.WritePlain(" AND ") + default: + return errors.Errorf("invalid state: %v", b.state) + } + + b.writeColNames([]*model.ColumnInfo{b.tbl.TimeColumn}, false) + b.restoreCtx.WritePlain(" < ") + b.restoreCtx.WritePlain("FROM_UNIXTIME(") + b.restoreCtx.WritePlain(strconv.FormatInt(expire.Unix(), 10)) + b.restoreCtx.WritePlain(")") + b.hasWriteExpireCond = true + return nil +} + +// WriteInCondition writes an IN condition +func (b *SQLBuilder) WriteInCondition(cols []*model.ColumnInfo, dps ...[]types.Datum) error { + switch b.state { + case writeSelOrDel: + b.restoreCtx.WritePlain(" WHERE ") + b.state = writeWhere + case writeWhere: + b.restoreCtx.WritePlain(" AND ") + default: + return errors.Errorf("invalid state: %v", b.state) + } + + b.writeColNames(cols, len(cols) > 1) + b.restoreCtx.WritePlain(" IN ") + b.restoreCtx.WritePlain("(") + first := true + for _, v := range dps { + if first { + first = false + } else { + b.restoreCtx.WritePlain(", ") + } + if err := b.writeDataPoint(cols, v); err != nil { + return err + } + } + b.restoreCtx.WritePlain(")") + return nil +} + +// WriteOrderBy writes order by +func (b *SQLBuilder) WriteOrderBy(cols []*model.ColumnInfo, desc bool) error { + if b.state != writeSelOrDel && b.state != writeWhere { + return errors.Errorf("invalid state: %v", b.state) + } + b.state = writeOrderBy + b.restoreCtx.WritePlain(" ORDER BY ") + b.writeColNames(cols, false) + if desc { + b.restoreCtx.WritePlain(" DESC") + } else { + b.restoreCtx.WritePlain(" ASC") + } + return nil +} + +// WriteLimit writes the limit +func (b *SQLBuilder) WriteLimit(n int) error { + if b.state != writeSelOrDel && b.state != writeWhere && b.state != writeOrderBy { + return errors.Errorf("invalid state: %v", b.state) + } + b.state = writeLimit + b.restoreCtx.WritePlain(" LIMIT ") + b.restoreCtx.WritePlain(strconv.Itoa(n)) + return nil +} + +func (b *SQLBuilder) writeTblName() error { + tn := ast.TableName{Schema: b.tbl.Schema, Name: b.tbl.Name} + return tn.Restore(b.restoreCtx) +} + +func (b *SQLBuilder) writeColName(col *model.ColumnInfo) { + b.restoreCtx.WriteName(col.Name.O) +} + +func (b *SQLBuilder) writeColNames(cols []*model.ColumnInfo, writeBrackets bool) { + if writeBrackets { + b.restoreCtx.WritePlain("(") + } + + first := true + for _, col := range cols { + if first { + first = false + } else { + b.restoreCtx.WritePlain(", ") + } + b.writeColName(col) + } + + if writeBrackets { + b.restoreCtx.WritePlain(")") + } +} + +func (b *SQLBuilder) writeDataPoint(cols []*model.ColumnInfo, dp []types.Datum) error { + writeBrackets := len(cols) > 1 + if len(cols) != len(dp) { + return errors.Errorf("col count not match %d != %d", len(cols), len(dp)) + } + + if writeBrackets { + b.restoreCtx.WritePlain("(") + } + + first := true + for i, d := range dp { + if first { + first = false + } else { + b.restoreCtx.WritePlain(", ") + } + if err := writeDatum(b.restoreCtx, d, &cols[i].FieldType); err != nil { + return err + } + } + + if writeBrackets { + b.restoreCtx.WritePlain(")") + } + + return nil +} + +// ScanQueryGenerator generates SQLs for scan task +type ScanQueryGenerator struct { + tbl *cache.PhysicalTable + expire time.Time + keyRangeStart []types.Datum + keyRangeEnd []types.Datum + stack [][]types.Datum + limit int + firstBuild bool + exhausted bool +} + +// NewScanQueryGenerator creates a new ScanQueryGenerator +func NewScanQueryGenerator(tbl *cache.PhysicalTable, expire time.Time, rangeStart []types.Datum, rangeEnd []types.Datum) (*ScanQueryGenerator, error) { + if err := tbl.ValidateKeyPrefix(rangeStart); err != nil { + return nil, err + } + + if err := tbl.ValidateKeyPrefix(rangeEnd); err != nil { + return nil, err + } + + return &ScanQueryGenerator{ + tbl: tbl, + expire: expire, + keyRangeStart: rangeStart, + keyRangeEnd: rangeEnd, + firstBuild: true, + }, nil +} + +// NextSQL creates next sql of the scan task +func (g *ScanQueryGenerator) NextSQL(continueFromResult [][]types.Datum, nextLimit int) (string, error) { + if g.exhausted { + return "", errors.New("generator is exhausted") + } + + if nextLimit <= 0 { + return "", errors.Errorf("invalid limit '%d'", nextLimit) + } + + defer func() { + g.firstBuild = false + }() + + if g.stack == nil { + g.stack = make([][]types.Datum, 0, len(g.tbl.KeyColumns)) + } + + if len(continueFromResult) >= g.limit { + var continueFromKey []types.Datum + if cnt := len(continueFromResult); cnt > 0 { + continueFromKey = continueFromResult[cnt-1] + } + if err := g.setStack(continueFromKey); err != nil { + return "", err + } + } else { + if l := len(g.stack); l > 0 { + g.stack = g.stack[:l-1] + } + if len(g.stack) == 0 { + g.exhausted = true + } + } + g.limit = nextLimit + return g.buildSQL() +} + +// IsExhausted returns whether the generator is exhausted +func (g *ScanQueryGenerator) IsExhausted() bool { + return g.exhausted +} + +func (g *ScanQueryGenerator) setStack(key []types.Datum) error { + if key == nil { + key = g.keyRangeStart + } + + if key == nil { + g.stack = g.stack[:0] + return nil + } + + if err := g.tbl.ValidateKeyPrefix(key); err != nil { + return err + } + + g.stack = g.stack[:len(key)] + for i := 0; i < len(key); i++ { + g.stack[i] = key[0 : i+1] + } + return nil +} + +func (g *ScanQueryGenerator) buildSQL() (string, error) { + if g.limit <= 0 { + return "", errors.Errorf("invalid limit '%d'", g.limit) + } + + if g.exhausted { + return "", nil + } + + b := NewSQLBuilder(g.tbl) + if err := b.WriteSelect(); err != nil { + return "", err + } + if len(g.stack) > 0 { + for i, d := range g.stack[len(g.stack)-1] { + col := []*model.ColumnInfo{g.tbl.KeyColumns[i]} + val := []types.Datum{d} + var err error + if i < len(g.stack)-1 { + err = b.WriteCommonCondition(col, "=", val) + } else if g.firstBuild { + // When `g.firstBuild == true`, that means we are querying rows after range start, because range is defined + // as [start, end), we should use ">=" to find the rows including start key. + err = b.WriteCommonCondition(col, ">=", val) + } else { + // Otherwise when `g.firstBuild != true`, that means we are continuing with the previous result, we should use + // ">" to exclude the previous row. + err = b.WriteCommonCondition(col, ">", val) + } + if err != nil { + return "", err + } + } + } + + if len(g.keyRangeEnd) > 0 { + if err := b.WriteCommonCondition(g.tbl.KeyColumns[0:len(g.keyRangeEnd)], "<", g.keyRangeEnd); err != nil { + return "", err + } + } + + if err := b.WriteExpireCondition(g.expire); err != nil { + return "", err + } + + if err := b.WriteOrderBy(g.tbl.KeyColumns, false); err != nil { + return "", err + } + + if err := b.WriteLimit(g.limit); err != nil { + return "", err + } + + return b.Build() +} + +// BuildDeleteSQL builds a delete SQL +func BuildDeleteSQL(tbl *cache.PhysicalTable, rows [][]types.Datum, expire time.Time) (string, error) { + if len(rows) == 0 { + return "", errors.New("Cannot build delete SQL with empty rows") + } + + b := NewSQLBuilder(tbl) + if err := b.WriteDelete(); err != nil { + return "", err + } + + if err := b.WriteInCondition(tbl.KeyColumns, rows...); err != nil { + return "", err + } + + if err := b.WriteExpireCondition(expire); err != nil { + return "", err + } + + if err := b.WriteLimit(len(rows)); err != nil { + return "", err + } + + return b.Build() +} diff --git a/ttl/sqlbuilder/sql_test.go b/ttl/sqlbuilder/sql_test.go new file mode 100644 index 0000000000000..d93acccf19963 --- /dev/null +++ b/ttl/sqlbuilder/sql_test.go @@ -0,0 +1,949 @@ +// 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, +// 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 sqlbuilder_test + +import ( + "context" + "fmt" + "strings" + "testing" + "time" + + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/ttl/sqlbuilder" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/dbterror" + "github.com/pingcap/tidb/util/sqlexec" + "github.com/stretchr/testify/require" +) + +func TestEscape(t *testing.T) { + tb := &cache.PhysicalTable{ + Schema: model.NewCIStr("testp;\"';123`456"), + TableInfo: &model.TableInfo{ + Name: model.NewCIStr("tp\"';123`456"), + }, + KeyColumns: []*model.ColumnInfo{ + {Name: model.NewCIStr("col1\"';123`456"), FieldType: *types.NewFieldType(mysql.TypeString)}, + }, + TimeColumn: &model.ColumnInfo{ + Name: model.NewCIStr("time\"';123`456"), + FieldType: *types.NewFieldType(mysql.TypeDatetime), + }, + PartitionDef: &model.PartitionDefinition{ + Name: model.NewCIStr("p1\"';123`456"), + }, + } + + buildSelect := func(d []types.Datum) string { + b := sqlbuilder.NewSQLBuilder(tb) + require.NoError(t, b.WriteSelect()) + require.NoError(t, b.WriteCommonCondition(tb.KeyColumns, ">", d)) + require.NoError(t, b.WriteExpireCondition(time.UnixMilli(0).In(time.UTC))) + s, err := b.Build() + require.NoError(t, err) + return s + } + + buildDelete := func(ds ...[]types.Datum) string { + b := sqlbuilder.NewSQLBuilder(tb) + require.NoError(t, b.WriteDelete()) + require.NoError(t, b.WriteInCondition(tb.KeyColumns, ds...)) + require.NoError(t, b.WriteExpireCondition(time.UnixMilli(0).In(time.UTC))) + s, err := b.Build() + require.NoError(t, err) + return s + } + + cases := []struct { + tp string + ds [][]types.Datum + sql string + }{ + { + tp: "select", + ds: [][]types.Datum{d("key1'\";123`456")}, + sql: "SELECT LOW_PRIORITY `col1\"';123``456` FROM `testp;\"';123``456`.`tp\"';123``456` PARTITION(`p1\"';123``456`) WHERE `col1\"';123``456` > 'key1\\'\\\";123`456' AND `time\"';123``456` < FROM_UNIXTIME(0)", + }, + { + tp: "delete", + ds: [][]types.Datum{d("key2'\";123`456")}, + sql: "DELETE LOW_PRIORITY FROM `testp;\"';123``456`.`tp\"';123``456` PARTITION(`p1\"';123``456`) WHERE `col1\"';123``456` IN ('key2\\'\\\";123`456') AND `time\"';123``456` < FROM_UNIXTIME(0)", + }, + { + tp: "delete", + ds: [][]types.Datum{d("key3'\";123`456"), d("key4'`\"")}, + sql: "DELETE LOW_PRIORITY FROM `testp;\"';123``456`.`tp\"';123``456` PARTITION(`p1\"';123``456`) WHERE `col1\"';123``456` IN ('key3\\'\\\";123`456', 'key4\\'`\\\"') AND `time\"';123``456` < FROM_UNIXTIME(0)", + }, + } + + for _, c := range cases { + switch c.tp { + case "select": + require.Equal(t, 1, len(c.ds)) + require.Equal(t, c.sql, buildSelect(c.ds[0])) + case "delete": + require.Equal(t, c.sql, buildDelete(c.ds...)) + default: + require.FailNow(t, "invalid tp: %s", c.tp) + } + + p := parser.New() + stmts, _, err := p.Parse(c.sql, "", "") + require.Equal(t, 1, len(stmts)) + require.NoError(t, err) + + var tbName *ast.TableName + var keyColumnName, timeColumnName string + var values []string + var timeFunc string + var timeTS int64 + switch c.tp { + case "select": + stmt, ok := stmts[0].(*ast.SelectStmt) + require.True(t, ok) + tbName = stmt.From.TableRefs.Left.(*ast.TableSource).Source.(*ast.TableName) + and := stmt.Where.(*ast.BinaryOperationExpr) + cond1 := and.L.(*ast.BinaryOperationExpr) + keyColumnName = cond1.L.(*ast.ColumnNameExpr).Name.Name.O + values = []string{cond1.R.(ast.ValueExpr).GetValue().(string)} + cond2 := and.R.(*ast.BinaryOperationExpr) + timeColumnName = cond2.L.(*ast.ColumnNameExpr).Name.Name.O + timeFunc = cond2.R.(*ast.FuncCallExpr).FnName.L + timeTS = cond2.R.(*ast.FuncCallExpr).Args[0].(ast.ValueExpr).GetValue().(int64) + case "delete": + stmt, ok := stmts[0].(*ast.DeleteStmt) + require.True(t, ok) + tbName = stmt.TableRefs.TableRefs.Left.(*ast.TableSource).Source.(*ast.TableName) + and := stmt.Where.(*ast.BinaryOperationExpr) + cond1 := and.L.(*ast.PatternInExpr) + keyColumnName = cond1.Expr.(*ast.ColumnNameExpr).Name.Name.O + require.Equal(t, len(c.ds), len(cond1.List)) + values = make([]string, 0, len(c.ds)) + for _, expr := range cond1.List { + values = append(values, expr.(ast.ValueExpr).GetValue().(string)) + } + cond2 := and.R.(*ast.BinaryOperationExpr) + timeColumnName = cond2.L.(*ast.ColumnNameExpr).Name.Name.O + timeFunc = cond2.R.(*ast.FuncCallExpr).FnName.L + timeTS = cond2.R.(*ast.FuncCallExpr).Args[0].(ast.ValueExpr).GetValue().(int64) + default: + require.FailNow(t, "invalid tp: %s", c.tp) + } + + require.Equal(t, tb.Schema.O, tbName.Schema.O) + require.Equal(t, tb.Name.O, tbName.Name.O) + require.Equal(t, 1, len(tbName.PartitionNames)) + require.Equal(t, tb.PartitionDef.Name.O, tbName.PartitionNames[0].O) + require.Equal(t, tb.KeyColumns[0].Name.O, keyColumnName) + require.Equal(t, tb.TimeColumn.Name.O, timeColumnName) + for i, row := range c.ds { + require.Equal(t, row[0].GetString(), values[i]) + } + require.Equal(t, "from_unixtime", timeFunc) + require.Equal(t, int64(0), timeTS) + } +} + +func TestFormatSQLDatum(t *testing.T) { + // invalid pk types contains the types that should not exist in primary keys of a TTL table. + // We do not need to check sqlbuilder.FormatSQLDatum for these types + invalidPKTypes := []struct { + types []string + err *terror.Error + }{ + { + types: []string{"json"}, + err: dbterror.ErrJSONUsedAsKey, + }, + { + types: []string{"blob"}, + err: dbterror.ErrBlobKeyWithoutLength, + }, + { + types: []string{"blob(8)"}, + err: dbterror.ErrBlobKeyWithoutLength, + }, + { + types: []string{"text"}, + err: dbterror.ErrBlobKeyWithoutLength, + }, + { + types: []string{"text(8)"}, + err: dbterror.ErrBlobKeyWithoutLength, + }, + { + types: []string{"int", "json"}, + err: dbterror.ErrJSONUsedAsKey, + }, + { + types: []string{"int", "blob"}, + err: dbterror.ErrBlobKeyWithoutLength, + }, + { + types: []string{"int", "text"}, + err: dbterror.ErrBlobKeyWithoutLength, + }, + { + types: []string{"float"}, + err: dbterror.ErrUnsupportedPrimaryKeyTypeWithTTL, + }, + { + types: []string{"double"}, + err: dbterror.ErrUnsupportedPrimaryKeyTypeWithTTL, + }, + { + types: []string{"int", "float"}, + err: dbterror.ErrUnsupportedPrimaryKeyTypeWithTTL, + }, + { + types: []string{"int", "double"}, + err: dbterror.ErrUnsupportedPrimaryKeyTypeWithTTL, + }, + } + + cases := []struct { + ft string + values []interface{} + hex bool + }{ + { + ft: "int", + values: []interface{}{1, 2, 3, -12}, + }, + { + ft: "decimal(5, 2)", + values: []interface{}{"0.3", "128.71", "-245.32"}, + }, + { + ft: "varchar(32) CHARACTER SET latin1", + values: []interface{}{ + "aa';delete from t where 1;", + string([]byte{0xf1, 0xf2}), + string([]byte{0xf1, 0xf2, 0xf3, 0xf4}), + }, + }, + { + ft: "char(32) CHARACTER SET utf8mb4", + values: []interface{}{ + "demo", + "\n123", + "aa';delete from t where 1;", + "你好👋", + }, + }, + { + ft: "varchar(32) CHARACTER SET utf8mb4", + values: []interface{}{ + "demo", + "aa';delete from t where 1;", + "你好👋", + }, + }, + { + ft: "varchar(32) CHARACTER SET binary", + values: []interface{}{ + string([]byte{0xf1, 0xf2, 0xf3, 0xf4}), + "你好👋", + "abcdef", + }, + hex: true, + }, + { + ft: "binary(8)", + values: []interface{}{ + string([]byte{0xf1, 0xf2}), + string([]byte{0xf1, 0xf2, 0xf3, 0xf4}), + }, + hex: true, + }, + { + ft: "blob", + values: []interface{}{ + string([]byte{0xf1, 0xf2}), + string([]byte{0xf1, 0xf2, 0xf3, 0xf4}), + }, + hex: true, + }, + { + ft: "bit(1)", + values: []interface{}{0, 1}, + hex: true, + }, + { + ft: "date", + values: []interface{}{"2022-01-02", "1900-12-31"}, + }, + { + ft: "time", + values: []interface{}{"00:00", "01:23", "13:51:22"}, + }, + { + ft: "datetime", + values: []interface{}{"2022-01-02 12:11:11", "2022-01-02"}, + }, + { + ft: "datetime(6)", + values: []interface{}{"2022-01-02 12:11:11.123456"}, + }, + { + ft: "timestamp", + values: []interface{}{"2022-01-02 12:11:11", "2022-01-02"}, + }, + { + ft: "timestamp(6)", + values: []interface{}{"2022-01-02 12:11:11.123456"}, + }, + { + ft: "enum('e1', 'e2', \"e3'\", 'e4\"', ';你好👋')", + values: []interface{}{"e1", "e2", "e3'", "e4\"", ";你好👋"}, + }, + { + ft: "set('e1', 'e2', \"e3'\", 'e4\"', ';你好👋')", + values: []interface{}{"", "e1", "e2", "e3'", "e4\"", ";你好👋"}, + }, + } + + store, do := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + for _, c := range invalidPKTypes { + var sb strings.Builder + sb.WriteString("create table t(") + cols := make([]string, 0, len(invalidPKTypes)) + for i, tp := range c.types { + colName := fmt.Sprintf("pk%d", i) + cols = append(cols, colName) + sb.WriteString(colName) + sb.WriteString(" ") + sb.WriteString(tp) + sb.WriteString(", ") + } + sb.WriteString("t timestamp, ") + sb.WriteString("primary key (") + sb.WriteString(strings.Join(cols, ", ")) + sb.WriteString(")) TTL=`t` + INTERVAL 1 DAY") + tk.MustGetDBError(sb.String(), c.err) + } + + // create a table with n columns + var sb strings.Builder + sb.WriteString("CREATE TABLE t (id varchar(32) primary key") + for i, c := range cases { + _, err := fmt.Fprintf(&sb, ",\n col%d %s DEFAULT NULL", i, c.ft) + require.NoError(t, err) + } + sb.WriteString("\n);") + tk.MustExec(sb.String()) + + tbl, err := do.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + + for i, c := range cases { + for j, v := range c.values { + tk.MustExec(fmt.Sprintf("insert into t (id, col%d) values ('%d-%d', ?)", i, i, j), v) + } + } + + ctx := kv.WithInternalSourceType(context.TODO(), kv.InternalTxnOthers) + for i, c := range cases { + for j := range c.values { + rowID := fmt.Sprintf("%d-%d", i, j) + colName := fmt.Sprintf("col%d", i) + exec, ok := tk.Session().(sqlexec.SQLExecutor) + require.True(t, ok) + selectSQL := fmt.Sprintf("select %s from t where id='%s'", colName, rowID) + rs, err := exec.ExecuteInternal(ctx, selectSQL) + require.NoError(t, err, selectSQL) + rows, err := sqlexec.DrainRecordSet(ctx, rs, 1) + require.NoError(t, err, selectSQL) + require.Equal(t, 1, len(rows), selectSQL) + col := tbl.Meta().FindPublicColumnByName(colName) + d := rows[0].GetDatum(0, &col.FieldType) + s, err := sqlbuilder.FormatSQLDatum(d, &col.FieldType) + require.NoError(t, err) + tk.MustQuery("select id from t where " + colName + "=" + s).Check(testkit.Rows(rowID)) + if c.hex { + require.True(t, strings.HasPrefix(s, "x'"), "ft: %s, got: %s", c.ft, s) + } + } + } +} + +func TestSQLBuilder(t *testing.T) { + must := func(err error) { + require.NoError(t, err) + } + + mustBuild := func(b *sqlbuilder.SQLBuilder, str string) { + s, err := b.Build() + require.NoError(t, err) + require.Equal(t, str, s) + } + + var b *sqlbuilder.SQLBuilder + + t1 := &cache.PhysicalTable{ + Schema: model.NewCIStr("test"), + TableInfo: &model.TableInfo{ + Name: model.NewCIStr("t1"), + }, + KeyColumns: []*model.ColumnInfo{ + {Name: model.NewCIStr("id"), FieldType: *types.NewFieldType(mysql.TypeVarchar)}, + }, + TimeColumn: &model.ColumnInfo{ + Name: model.NewCIStr("time"), + FieldType: *types.NewFieldType(mysql.TypeDatetime), + }, + } + + t2 := &cache.PhysicalTable{ + Schema: model.NewCIStr("test2"), + TableInfo: &model.TableInfo{ + Name: model.NewCIStr("t2"), + }, + KeyColumns: []*model.ColumnInfo{ + {Name: model.NewCIStr("a"), FieldType: *types.NewFieldType(mysql.TypeVarchar)}, + {Name: model.NewCIStr("b"), FieldType: *types.NewFieldType(mysql.TypeInt24)}, + }, + TimeColumn: &model.ColumnInfo{ + Name: model.NewCIStr("time"), + FieldType: *types.NewFieldType(mysql.TypeDatetime), + }, + } + + tp := &cache.PhysicalTable{ + Schema: model.NewCIStr("testp"), + TableInfo: &model.TableInfo{ + Name: model.NewCIStr("tp"), + }, + KeyColumns: t1.KeyColumns, + TimeColumn: t1.TimeColumn, + PartitionDef: &model.PartitionDefinition{ + Name: model.NewCIStr("p1"), + }, + } + + // test build select queries + b = sqlbuilder.NewSQLBuilder(t1) + must(b.WriteSelect()) + mustBuild(b, "SELECT LOW_PRIORITY `id` FROM `test`.`t1`") + + b = sqlbuilder.NewSQLBuilder(t1) + must(b.WriteSelect()) + must(b.WriteCommonCondition(t1.KeyColumns, ">", d("a1"))) + mustBuild(b, "SELECT LOW_PRIORITY `id` FROM `test`.`t1` WHERE `id` > 'a1'") + + b = sqlbuilder.NewSQLBuilder(t1) + must(b.WriteSelect()) + must(b.WriteCommonCondition(t1.KeyColumns, ">", d("a1"))) + must(b.WriteCommonCondition(t1.KeyColumns, "<=", d("c3"))) + mustBuild(b, "SELECT LOW_PRIORITY `id` FROM `test`.`t1` WHERE `id` > 'a1' AND `id` <= 'c3'") + + b = sqlbuilder.NewSQLBuilder(t1) + must(b.WriteSelect()) + shLoc, err := time.LoadLocation("Asia/Shanghai") + require.NoError(t, err) + must(b.WriteExpireCondition(time.UnixMilli(0).In(shLoc))) + mustBuild(b, "SELECT LOW_PRIORITY `id` FROM `test`.`t1` WHERE `time` < FROM_UNIXTIME(0)") + + b = sqlbuilder.NewSQLBuilder(t1) + must(b.WriteSelect()) + must(b.WriteCommonCondition(t1.KeyColumns, ">", d("a1"))) + must(b.WriteCommonCondition(t1.KeyColumns, "<=", d("c3"))) + must(b.WriteExpireCondition(time.UnixMilli(0).In(time.UTC))) + mustBuild(b, "SELECT LOW_PRIORITY `id` FROM `test`.`t1` WHERE `id` > 'a1' AND `id` <= 'c3' AND `time` < FROM_UNIXTIME(0)") + + b = sqlbuilder.NewSQLBuilder(t1) + must(b.WriteSelect()) + must(b.WriteOrderBy(t1.KeyColumns, false)) + mustBuild(b, "SELECT LOW_PRIORITY `id` FROM `test`.`t1` ORDER BY `id` ASC") + + b = sqlbuilder.NewSQLBuilder(t1) + must(b.WriteSelect()) + must(b.WriteOrderBy(t1.KeyColumns, true)) + mustBuild(b, "SELECT LOW_PRIORITY `id` FROM `test`.`t1` ORDER BY `id` DESC") + + b = sqlbuilder.NewSQLBuilder(t1) + must(b.WriteSelect()) + must(b.WriteOrderBy(t1.KeyColumns, false)) + must(b.WriteLimit(128)) + mustBuild(b, "SELECT LOW_PRIORITY `id` FROM `test`.`t1` ORDER BY `id` ASC LIMIT 128") + + b = sqlbuilder.NewSQLBuilder(t1) + must(b.WriteSelect()) + must(b.WriteCommonCondition(t1.KeyColumns, ">", d("';``~?%\"\n"))) + mustBuild(b, "SELECT LOW_PRIORITY `id` FROM `test`.`t1` WHERE `id` > '\\';``~?%\\\"\\n'") + + b = sqlbuilder.NewSQLBuilder(t1) + must(b.WriteSelect()) + must(b.WriteCommonCondition(t1.KeyColumns, ">", d("a1';'"))) + must(b.WriteCommonCondition(t1.KeyColumns, "<=", d("a2\""))) + must(b.WriteExpireCondition(time.UnixMilli(0).In(time.UTC))) + must(b.WriteOrderBy(t1.KeyColumns, false)) + must(b.WriteLimit(128)) + mustBuild(b, "SELECT LOW_PRIORITY `id` FROM `test`.`t1` WHERE `id` > 'a1\\';\\'' AND `id` <= 'a2\\\"' AND `time` < FROM_UNIXTIME(0) ORDER BY `id` ASC LIMIT 128") + + b = sqlbuilder.NewSQLBuilder(t2) + must(b.WriteSelect()) + must(b.WriteCommonCondition(t2.KeyColumns, ">", d("x1", 20))) + mustBuild(b, "SELECT LOW_PRIORITY `a`, `b` FROM `test2`.`t2` WHERE (`a`, `b`) > ('x1', 20)") + + b = sqlbuilder.NewSQLBuilder(t2) + must(b.WriteSelect()) + must(b.WriteCommonCondition(t2.KeyColumns, "<=", d("x2", 21))) + must(b.WriteExpireCondition(time.UnixMilli(0).In(time.UTC))) + must(b.WriteOrderBy(t2.KeyColumns, false)) + must(b.WriteLimit(100)) + mustBuild(b, "SELECT LOW_PRIORITY `a`, `b` FROM `test2`.`t2` WHERE (`a`, `b`) <= ('x2', 21) AND `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b` ASC LIMIT 100") + + b = sqlbuilder.NewSQLBuilder(t2) + must(b.WriteSelect()) + must(b.WriteCommonCondition(t2.KeyColumns[0:1], "=", d("x3"))) + must(b.WriteCommonCondition(t2.KeyColumns[1:2], ">", d(31))) + must(b.WriteExpireCondition(time.UnixMilli(0).In(time.UTC))) + must(b.WriteOrderBy(t2.KeyColumns, false)) + must(b.WriteLimit(100)) + mustBuild(b, "SELECT LOW_PRIORITY `a`, `b` FROM `test2`.`t2` WHERE `a` = 'x3' AND `b` > 31 AND `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b` ASC LIMIT 100") + + // test build delete queries + b = sqlbuilder.NewSQLBuilder(t1) + must(b.WriteDelete()) + _, err = b.Build() + require.EqualError(t, err, "expire condition not write") + + b = sqlbuilder.NewSQLBuilder(t1) + must(b.WriteDelete()) + must(b.WriteInCondition(t1.KeyColumns, d("a"))) + must(b.WriteExpireCondition(time.UnixMilli(0).In(time.UTC))) + mustBuild(b, "DELETE LOW_PRIORITY FROM `test`.`t1` WHERE `id` IN ('a') AND `time` < FROM_UNIXTIME(0)") + + b = sqlbuilder.NewSQLBuilder(t1) + must(b.WriteDelete()) + must(b.WriteInCondition(t1.KeyColumns, d("a"), d("b"))) + must(b.WriteExpireCondition(time.UnixMilli(0).In(time.UTC))) + mustBuild(b, "DELETE LOW_PRIORITY FROM `test`.`t1` WHERE `id` IN ('a', 'b') AND `time` < FROM_UNIXTIME(0)") + + b = sqlbuilder.NewSQLBuilder(t1) + must(b.WriteDelete()) + must(b.WriteInCondition(t2.KeyColumns, d("a", 1))) + must(b.WriteExpireCondition(time.UnixMilli(0).In(time.UTC))) + must(b.WriteLimit(100)) + mustBuild(b, "DELETE LOW_PRIORITY FROM `test`.`t1` WHERE (`a`, `b`) IN (('a', 1)) AND `time` < FROM_UNIXTIME(0) LIMIT 100") + + b = sqlbuilder.NewSQLBuilder(t1) + must(b.WriteDelete()) + must(b.WriteInCondition(t2.KeyColumns, d("a", 1), d("b", 2))) + must(b.WriteExpireCondition(time.UnixMilli(0).In(time.UTC))) + must(b.WriteLimit(100)) + mustBuild(b, "DELETE LOW_PRIORITY FROM `test`.`t1` WHERE (`a`, `b`) IN (('a', 1), ('b', 2)) AND `time` < FROM_UNIXTIME(0) LIMIT 100") + + b = sqlbuilder.NewSQLBuilder(t1) + must(b.WriteDelete()) + must(b.WriteInCondition(t2.KeyColumns, d("a", 1), d("b", 2))) + must(b.WriteExpireCondition(time.UnixMilli(0).In(time.UTC))) + mustBuild(b, "DELETE LOW_PRIORITY FROM `test`.`t1` WHERE (`a`, `b`) IN (('a', 1), ('b', 2)) AND `time` < FROM_UNIXTIME(0)") + + // test select partition table + b = sqlbuilder.NewSQLBuilder(tp) + must(b.WriteSelect()) + must(b.WriteCommonCondition(tp.KeyColumns, ">", d("a1"))) + must(b.WriteExpireCondition(time.UnixMilli(0).In(time.UTC))) + mustBuild(b, "SELECT LOW_PRIORITY `id` FROM `testp`.`tp` PARTITION(`p1`) WHERE `id` > 'a1' AND `time` < FROM_UNIXTIME(0)") + + b = sqlbuilder.NewSQLBuilder(tp) + must(b.WriteDelete()) + must(b.WriteInCondition(tp.KeyColumns, d("a"), d("b"))) + must(b.WriteExpireCondition(time.UnixMilli(0).In(time.UTC))) + mustBuild(b, "DELETE LOW_PRIORITY FROM `testp`.`tp` PARTITION(`p1`) WHERE `id` IN ('a', 'b') AND `time` < FROM_UNIXTIME(0)") +} + +func TestScanQueryGenerator(t *testing.T) { + t1 := &cache.PhysicalTable{ + Schema: model.NewCIStr("test"), + TableInfo: &model.TableInfo{ + Name: model.NewCIStr("t1"), + }, + KeyColumns: []*model.ColumnInfo{ + {Name: model.NewCIStr("id"), FieldType: *types.NewFieldType(mysql.TypeInt24)}, + }, + TimeColumn: &model.ColumnInfo{ + Name: model.NewCIStr("time"), + FieldType: *types.NewFieldType(mysql.TypeDatetime), + }, + } + + t2 := &cache.PhysicalTable{ + Schema: model.NewCIStr("test2"), + TableInfo: &model.TableInfo{ + Name: model.NewCIStr("t2"), + }, + KeyColumns: []*model.ColumnInfo{ + {Name: model.NewCIStr("a"), FieldType: *types.NewFieldType(mysql.TypeInt24)}, + {Name: model.NewCIStr("b"), FieldType: *types.NewFieldType(mysql.TypeVarchar)}, + {Name: model.NewCIStr("c"), FieldType: types.NewFieldTypeBuilder().SetType(mysql.TypeString).SetFlag(mysql.BinaryFlag).Build()}, + }, + TimeColumn: &model.ColumnInfo{ + Name: model.NewCIStr("time"), + FieldType: *types.NewFieldType(mysql.TypeDatetime), + }, + } + + result := func(last []types.Datum, n int) [][]types.Datum { + ds := make([][]types.Datum, n) + ds[n-1] = last + return ds + } + + cases := []struct { + tbl *cache.PhysicalTable + expire time.Time + rangeStart []types.Datum + rangeEnd []types.Datum + path [][]interface{} + }{ + { + tbl: t1, + expire: time.UnixMilli(0).In(time.UTC), + path: [][]interface{}{ + { + nil, 3, + "SELECT LOW_PRIORITY `id` FROM `test`.`t1` WHERE `time` < FROM_UNIXTIME(0) ORDER BY `id` ASC LIMIT 3", + }, + { + nil, 5, "", + }, + }, + }, + { + tbl: t1, + expire: time.UnixMilli(0).In(time.UTC), + path: [][]interface{}{ + { + nil, 3, + "SELECT LOW_PRIORITY `id` FROM `test`.`t1` WHERE `time` < FROM_UNIXTIME(0) ORDER BY `id` ASC LIMIT 3", + }, + { + [][]types.Datum{}, 5, "", + }, + }, + }, + { + tbl: t1, + expire: time.UnixMilli(0).In(time.UTC), + rangeStart: d(1), + rangeEnd: d(100), + path: [][]interface{}{ + { + nil, 3, + "SELECT LOW_PRIORITY `id` FROM `test`.`t1` WHERE `id` >= 1 AND `id` < 100 AND `time` < FROM_UNIXTIME(0) ORDER BY `id` ASC LIMIT 3", + }, + { + result(d(10), 3), 5, + "SELECT LOW_PRIORITY `id` FROM `test`.`t1` WHERE `id` > 10 AND `id` < 100 AND `time` < FROM_UNIXTIME(0) ORDER BY `id` ASC LIMIT 5", + }, + { + result(d(15), 4), 5, + "", + }, + }, + }, + { + tbl: t1, + expire: time.UnixMilli(0).In(time.UTC), + path: [][]interface{}{ + { + nil, 3, + "SELECT LOW_PRIORITY `id` FROM `test`.`t1` WHERE `time` < FROM_UNIXTIME(0) ORDER BY `id` ASC LIMIT 3", + }, + { + result(d(2), 3), 5, + "SELECT LOW_PRIORITY `id` FROM `test`.`t1` WHERE `id` > 2 AND `time` < FROM_UNIXTIME(0) ORDER BY `id` ASC LIMIT 5", + }, + { + result(d(4), 5), 6, + "SELECT LOW_PRIORITY `id` FROM `test`.`t1` WHERE `id` > 4 AND `time` < FROM_UNIXTIME(0) ORDER BY `id` ASC LIMIT 6", + }, + { + result(d(7), 5), 5, "", + }, + }, + }, + { + tbl: t2, + expire: time.UnixMilli(0).In(time.UTC), + path: [][]interface{}{ + { + nil, 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + { + nil, 5, "", + }, + }, + }, + { + tbl: t2, + expire: time.UnixMilli(0).In(time.UTC), + path: [][]interface{}{ + { + nil, 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + { + nil, 5, "", + }, + }, + }, + { + tbl: t2, + expire: time.UnixMilli(0).In(time.UTC), + path: [][]interface{}{ + { + nil, 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + { + [][]types.Datum{}, 5, "", + }, + }, + }, + { + tbl: t2, + expire: time.UnixMilli(0).In(time.UTC), + path: [][]interface{}{ + { + nil, 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + { + result(d(1, "x", []byte{0xf0}), 4), 5, "", + }, + }, + }, + { + tbl: t2, + expire: time.UnixMilli(0).In(time.UTC), + rangeStart: d(1, "x", []byte{0xe}), + rangeEnd: d(100, "z", []byte{0xff}), + path: [][]interface{}{ + { + nil, 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `a` = 1 AND `b` = 'x' AND `c` >= x'0e' AND (`a`, `b`, `c`) < (100, 'z', x'ff') AND `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + { + result(d(1, "x", []byte{0x1a}), 5), 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `a` = 1 AND `b` = 'x' AND `c` > x'1a' AND (`a`, `b`, `c`) < (100, 'z', x'ff') AND `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + { + result(d(1, "x", []byte{0x20}), 4), 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `a` = 1 AND `b` > 'x' AND (`a`, `b`, `c`) < (100, 'z', x'ff') AND `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + { + result(d(1, "y", []byte{0x0a}), 5), 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `a` = 1 AND `b` = 'y' AND `c` > x'0a' AND (`a`, `b`, `c`) < (100, 'z', x'ff') AND `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + { + result(d(1, "y", []byte{0x11}), 4), 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `a` = 1 AND `b` > 'y' AND (`a`, `b`, `c`) < (100, 'z', x'ff') AND `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + { + result(d(1, "z", []byte{0x02}), 4), 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `a` > 1 AND (`a`, `b`, `c`) < (100, 'z', x'ff') AND `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + { + result(d(3, "a", []byte{0x01}), 5), 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `a` = 3 AND `b` = 'a' AND `c` > x'01' AND (`a`, `b`, `c`) < (100, 'z', x'ff') AND `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + { + result(d(3, "a", []byte{0x11}), 4), 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `a` = 3 AND `b` > 'a' AND (`a`, `b`, `c`) < (100, 'z', x'ff') AND `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + { + result(d(3, "c", []byte{0x12}), 4), 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `a` > 3 AND (`a`, `b`, `c`) < (100, 'z', x'ff') AND `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + { + result(d(5, "e", []byte{0xa1}), 4), 5, "", + }, + }, + }, + { + tbl: t2, + expire: time.UnixMilli(0).In(time.UTC), + rangeStart: d(1), + rangeEnd: d(100), + path: [][]interface{}{ + { + nil, 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `a` >= 1 AND `a` < 100 AND `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + { + result(d(1, "x", []byte{0x1a}), 5), 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `a` = 1 AND `b` = 'x' AND `c` > x'1a' AND `a` < 100 AND `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + { + result(d(1, "x", []byte{0x20}), 4), 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `a` = 1 AND `b` > 'x' AND `a` < 100 AND `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + { + result(d(1, "y", []byte{0x0a}), 4), 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `a` > 1 AND `a` < 100 AND `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + }, + }, + { + tbl: t2, + expire: time.UnixMilli(0).In(time.UTC), + rangeStart: d(1, "x"), + rangeEnd: d(100, "z"), + path: [][]interface{}{ + { + nil, 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `a` = 1 AND `b` >= 'x' AND (`a`, `b`) < (100, 'z') AND `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + { + result(d(1, "x", []byte{0x1a}), 5), 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `a` = 1 AND `b` = 'x' AND `c` > x'1a' AND (`a`, `b`) < (100, 'z') AND `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + { + result(d(1, "x", []byte{0x20}), 4), 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `a` = 1 AND `b` > 'x' AND (`a`, `b`) < (100, 'z') AND `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + { + result(d(1, "y", []byte{0x0a}), 4), 5, + "SELECT LOW_PRIORITY `a`, `b`, `c` FROM `test2`.`t2` WHERE `a` > 1 AND (`a`, `b`) < (100, 'z') AND `time` < FROM_UNIXTIME(0) ORDER BY `a`, `b`, `c` ASC LIMIT 5", + }, + }, + }, + } + + for i, c := range cases { + g, err := sqlbuilder.NewScanQueryGenerator(c.tbl, c.expire, c.rangeStart, c.rangeEnd) + require.NoError(t, err, fmt.Sprintf("%d", i)) + for j, p := range c.path { + msg := fmt.Sprintf("%d-%d", i, j) + var result [][]types.Datum + require.Equal(t, 3, len(p), msg) + if arg := p[0]; arg != nil { + r, ok := arg.([][]types.Datum) + require.True(t, ok, msg) + result = r + } + limit, ok := p[1].(int) + require.True(t, ok, msg) + sql, ok := p[2].(string) + require.True(t, ok, msg) + s, err := g.NextSQL(result, limit) + require.NoError(t, err, msg) + require.Equal(t, sql, s, msg) + require.Equal(t, s == "", g.IsExhausted(), msg) + } + } +} + +func TestBuildDeleteSQL(t *testing.T) { + t1 := &cache.PhysicalTable{ + Schema: model.NewCIStr("test"), + TableInfo: &model.TableInfo{ + Name: model.NewCIStr("t1"), + }, + KeyColumns: []*model.ColumnInfo{ + {Name: model.NewCIStr("id"), FieldType: *types.NewFieldType(mysql.TypeInt24)}, + }, + TimeColumn: &model.ColumnInfo{ + Name: model.NewCIStr("time"), + FieldType: *types.NewFieldType(mysql.TypeDatetime), + }, + } + + t2 := &cache.PhysicalTable{ + Schema: model.NewCIStr("test2"), + TableInfo: &model.TableInfo{ + Name: model.NewCIStr("t2"), + }, + KeyColumns: []*model.ColumnInfo{ + {Name: model.NewCIStr("a"), FieldType: *types.NewFieldType(mysql.TypeInt24)}, + {Name: model.NewCIStr("b"), FieldType: *types.NewFieldType(mysql.TypeVarchar)}, + }, + TimeColumn: &model.ColumnInfo{ + Name: model.NewCIStr("time"), + FieldType: *types.NewFieldType(mysql.TypeDatetime), + }, + } + + cases := []struct { + tbl *cache.PhysicalTable + expire time.Time + rows [][]types.Datum + sql string + }{ + { + tbl: t1, + expire: time.UnixMilli(0).In(time.UTC), + rows: [][]types.Datum{d(1)}, + sql: "DELETE LOW_PRIORITY FROM `test`.`t1` WHERE `id` IN (1) AND `time` < FROM_UNIXTIME(0) LIMIT 1", + }, + { + tbl: t1, + expire: time.UnixMilli(0).In(time.UTC), + rows: [][]types.Datum{d(2), d(3), d(4)}, + sql: "DELETE LOW_PRIORITY FROM `test`.`t1` WHERE `id` IN (2, 3, 4) AND `time` < FROM_UNIXTIME(0) LIMIT 3", + }, + { + tbl: t2, + expire: time.UnixMilli(0).In(time.UTC), + rows: [][]types.Datum{d(1, "a")}, + sql: "DELETE LOW_PRIORITY FROM `test2`.`t2` WHERE (`a`, `b`) IN ((1, 'a')) AND `time` < FROM_UNIXTIME(0) LIMIT 1", + }, + { + tbl: t2, + expire: time.UnixMilli(0).In(time.UTC), + rows: [][]types.Datum{d(1, "a"), d(2, "b")}, + sql: "DELETE LOW_PRIORITY FROM `test2`.`t2` WHERE (`a`, `b`) IN ((1, 'a'), (2, 'b')) AND `time` < FROM_UNIXTIME(0) LIMIT 2", + }, + } + + for _, c := range cases { + sql, err := sqlbuilder.BuildDeleteSQL(c.tbl, c.rows, c.expire) + require.NoError(t, err) + require.Equal(t, c.sql, sql) + } +} + +func d(vs ...interface{}) []types.Datum { + datums := make([]types.Datum, len(vs)) + for i, v := range vs { + switch val := v.(type) { + case string: + datums[i] = types.NewStringDatum(val) + case int: + datums[i] = types.NewIntDatum(int64(val)) + case []byte: + datums[i] = types.NewBytesDatum(val) + default: + panic(fmt.Sprintf("invalid value type: %T, value: %v", v, v)) + } + } + return datums +} diff --git a/ttl/ttlworker/BUILD.bazel b/ttl/ttlworker/BUILD.bazel new file mode 100644 index 0000000000000..943f206ec16fe --- /dev/null +++ b/ttl/ttlworker/BUILD.bazel @@ -0,0 +1,90 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "ttlworker", + srcs = [ + "config.go", + "del.go", + "job.go", + "job_manager.go", + "scan.go", + "session.go", + "task_manager.go", + "worker.go", + ], + importpath = "github.com/pingcap/tidb/ttl/ttlworker", + visibility = ["//visibility:public"], + deps = [ + "//kv", + "//parser/duration", + "//parser/terror", + "//sessionctx", + "//sessionctx/variable", + "//ttl/cache", + "//ttl/client", + "//ttl/metrics", + "//ttl/session", + "//ttl/sqlbuilder", + "//types", + "//util", + "//util/chunk", + "//util/logutil", + "//util/sqlexec", + "//util/timeutil", + "@com_github_google_uuid//:uuid", + "@com_github_ngaut_pools//:pools", + "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_failpoint//:failpoint", + "@io_etcd_go_etcd_client_v3//:client", + "@org_golang_x_time//rate", + "@org_uber_go_multierr//:multierr", + "@org_uber_go_zap//:zap", + ], +) + +go_test( + name = "ttlworker_test", + timeout = "short", + srcs = [ + "del_test.go", + "job_manager_integration_test.go", + "job_manager_test.go", + "scan_test.go", + "session_test.go", + "task_manager_integration_test.go", + "task_manager_test.go", + ], + embed = [":ttlworker"], + flaky = True, + race = "on", + shard_count = 30, + deps = [ + "//domain", + "//infoschema", + "//kv", + "//parser/ast", + "//parser/model", + "//parser/mysql", + "//session", + "//sessionctx", + "//sessionctx/variable", + "//statistics/handle", + "//testkit", + "//ttl/cache", + "//ttl/client", + "//ttl/metrics", + "//ttl/session", + "//types", + "//util/chunk", + "//util/logutil", + "@com_github_ngaut_pools//:pools", + "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_failpoint//:failpoint", + "@com_github_prometheus_client_model//go", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + "@org_golang_x_time//rate", + "@org_uber_go_atomic//:atomic", + "@org_uber_go_zap//:zap", + ], +) diff --git a/ttl/ttlworker/config.go b/ttl/ttlworker/config.go new file mode 100644 index 0000000000000..89ca9eedae010 --- /dev/null +++ b/ttl/ttlworker/config.go @@ -0,0 +1,63 @@ +// 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, +// 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 ttlworker + +import ( + "time" + + "github.com/pingcap/failpoint" +) + +const jobManagerLoopTickerInterval = 10 * time.Second + +const updateInfoSchemaCacheInterval = 2 * time.Minute +const updateTTLTableStatusCacheInterval = 2 * time.Minute + +const ttlInternalSQLTimeout = 30 * time.Second +const resizeWorkersInterval = 30 * time.Second +const splitScanCount = 64 +const ttlJobTimeout = 6 * time.Hour + +const taskManagerLoopTickerInterval = time.Minute +const ttlTaskHeartBeatTickerInterval = time.Minute +const ttlGCInterval = time.Hour + +func getUpdateInfoSchemaCacheInterval() time.Duration { + failpoint.Inject("update-info-schema-cache-interval", func(val failpoint.Value) time.Duration { + return time.Duration(val.(int)) + }) + return updateInfoSchemaCacheInterval +} + +func getUpdateTTLTableStatusCacheInterval() time.Duration { + failpoint.Inject("update-status-table-cache-interval", func(val failpoint.Value) time.Duration { + return time.Duration(val.(int)) + }) + return updateTTLTableStatusCacheInterval +} + +func getResizeWorkersInterval() time.Duration { + failpoint.Inject("resize-workers-interval", func(val failpoint.Value) time.Duration { + return time.Duration(val.(int)) + }) + return resizeWorkersInterval +} + +func getTaskManagerLoopTickerInterval() time.Duration { + failpoint.Inject("task-manager-loop-interval", func(val failpoint.Value) time.Duration { + return time.Duration(val.(int)) + }) + return taskManagerLoopTickerInterval +} diff --git a/ttl/ttlworker/del.go b/ttl/ttlworker/del.go new file mode 100644 index 0000000000000..a578f75adbd1e --- /dev/null +++ b/ttl/ttlworker/del.go @@ -0,0 +1,298 @@ +// 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, +// 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 ttlworker + +import ( + "container/list" + "context" + "fmt" + "sync" + "sync/atomic" + "time" + + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/ttl/metrics" + "github.com/pingcap/tidb/ttl/session" + "github.com/pingcap/tidb/ttl/sqlbuilder" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" + "golang.org/x/time/rate" +) + +const ( + delMaxRetry = 3 + delRetryBufferSize = 128 + delRetryInterval = time.Second * 5 +) + +var globalDelRateLimiter = newDelRateLimiter() + +type delRateLimiter struct { + sync.Mutex + limiter *rate.Limiter + limit atomic.Int64 +} + +func newDelRateLimiter() *delRateLimiter { + limiter := &delRateLimiter{} + limiter.limiter = rate.NewLimiter(0, 1) + limiter.limit.Store(0) + return limiter +} + +func (l *delRateLimiter) Wait(ctx context.Context) error { + limit := l.limit.Load() + if variable.TTLDeleteRateLimit.Load() != limit { + limit = l.reset() + } + + if limit == 0 { + return ctx.Err() + } + + return l.limiter.Wait(ctx) +} + +func (l *delRateLimiter) reset() (newLimit int64) { + l.Lock() + defer l.Unlock() + newLimit = variable.TTLDeleteRateLimit.Load() + if newLimit != l.limit.Load() { + l.limit.Store(newLimit) + l.limiter.SetLimit(rate.Limit(newLimit)) + } + return +} + +type ttlDeleteTask struct { + tbl *cache.PhysicalTable + expire time.Time + rows [][]types.Datum + statistics *ttlStatistics +} + +func (t *ttlDeleteTask) doDelete(ctx context.Context, rawSe session.Session) (retryRows [][]types.Datum) { + tracer := metrics.PhaseTracerFromCtx(ctx) + defer tracer.EnterPhase(tracer.Phase()) + tracer.EnterPhase(metrics.PhaseOther) + + leftRows := t.rows + se := newTableSession(rawSe, t.tbl, t.expire) + for len(leftRows) > 0 { + maxBatch := variable.TTLDeleteBatchSize.Load() + var delBatch [][]types.Datum + if int64(len(leftRows)) < maxBatch { + delBatch = leftRows + leftRows = nil + } else { + delBatch = leftRows[0:maxBatch] + leftRows = leftRows[maxBatch:] + } + + sql, err := sqlbuilder.BuildDeleteSQL(t.tbl, delBatch, t.expire) + if err != nil { + t.statistics.IncErrorRows(len(delBatch)) + logutil.BgLogger().Warn( + "build delete SQL in TTL failed", + zap.Error(err), + zap.String("table", t.tbl.Schema.O+"."+t.tbl.Name.O), + ) + return + } + + tracer.EnterPhase(metrics.PhaseWaitToken) + if err = globalDelRateLimiter.Wait(ctx); err != nil { + t.statistics.IncErrorRows(len(delBatch)) + return + } + tracer.EnterPhase(metrics.PhaseOther) + + sqlStart := time.Now() + _, needRetry, err := se.ExecuteSQLWithCheck(ctx, sql) + sqlInterval := time.Since(sqlStart) + if err != nil { + metrics.DeleteErrorDuration.Observe(sqlInterval.Seconds()) + needRetry = needRetry && ctx.Err() == nil + logutil.BgLogger().Warn( + "delete SQL in TTL failed", + zap.Error(err), + zap.String("SQL", sql), + zap.Bool("needRetry", needRetry), + ) + + if needRetry { + if retryRows == nil { + retryRows = make([][]types.Datum, 0, len(leftRows)+len(delBatch)) + } + retryRows = append(retryRows, delBatch...) + } else { + t.statistics.IncErrorRows(len(delBatch)) + } + continue + } + + metrics.DeleteSuccessDuration.Observe(sqlInterval.Seconds()) + t.statistics.IncSuccessRows(len(delBatch)) + } + return retryRows +} + +type ttlDelRetryItem struct { + task *ttlDeleteTask + retryCnt int + inTime time.Time +} + +type ttlDelRetryBuffer struct { + list *list.List + maxSize int + maxRetry int + retryInterval time.Duration + getTime func() time.Time +} + +func newTTLDelRetryBuffer() *ttlDelRetryBuffer { + return &ttlDelRetryBuffer{ + list: list.New(), + maxSize: delRetryBufferSize, + maxRetry: delMaxRetry, + retryInterval: delRetryInterval, + getTime: time.Now, + } +} + +func (b *ttlDelRetryBuffer) Len() int { + return b.list.Len() +} + +func (b *ttlDelRetryBuffer) RecordTaskResult(task *ttlDeleteTask, retryRows [][]types.Datum) { + b.recordRetryItem(task, retryRows, 0) +} + +func (b *ttlDelRetryBuffer) DoRetry(do func(*ttlDeleteTask) [][]types.Datum) time.Duration { + for b.list.Len() > 0 { + ele := b.list.Front() + item, ok := ele.Value.(*ttlDelRetryItem) + if !ok { + logutil.BgLogger().Error(fmt.Sprintf("invalid retry buffer item type: %T", ele)) + b.list.Remove(ele) + continue + } + + now := b.getTime() + interval := now.Sub(item.inTime) + if interval < b.retryInterval { + return b.retryInterval - interval + } + + b.list.Remove(ele) + if retryRows := do(item.task); len(retryRows) > 0 { + b.recordRetryItem(item.task, retryRows, item.retryCnt+1) + } + } + return b.retryInterval +} + +func (b *ttlDelRetryBuffer) recordRetryItem(task *ttlDeleteTask, retryRows [][]types.Datum, retryCnt int) bool { + if len(retryRows) == 0 { + return false + } + + if retryCnt >= b.maxRetry { + task.statistics.IncErrorRows(len(retryRows)) + return false + } + + for b.list.Len() > 0 && b.list.Len() >= b.maxSize { + ele := b.list.Front() + if item, ok := ele.Value.(*ttlDelRetryItem); ok { + item.task.statistics.IncErrorRows(len(item.task.rows)) + } else { + logutil.BgLogger().Error(fmt.Sprintf("invalid retry buffer item type: %T", ele)) + } + b.list.Remove(b.list.Front()) + } + + newTask := *task + newTask.rows = retryRows + b.list.PushBack(&ttlDelRetryItem{ + task: &newTask, + inTime: b.getTime(), + retryCnt: retryCnt, + }) + return true +} + +type ttlDeleteWorker struct { + baseWorker + delCh <-chan *ttlDeleteTask + sessionPool sessionPool + retryBuffer *ttlDelRetryBuffer +} + +func newDeleteWorker(delCh <-chan *ttlDeleteTask, sessPool sessionPool) *ttlDeleteWorker { + w := &ttlDeleteWorker{ + delCh: delCh, + sessionPool: sessPool, + retryBuffer: newTTLDelRetryBuffer(), + } + w.init(w.loop) + return w +} + +func (w *ttlDeleteWorker) loop() error { + tracer := metrics.NewDeleteWorkerPhaseTracer() + defer func() { + tracer.EndPhase() + logutil.BgLogger().Info("ttlDeleteWorker loop exited.") + }() + + tracer.EnterPhase(metrics.PhaseOther) + se, err := getSession(w.sessionPool) + if err != nil { + return err + } + + ctx := metrics.CtxWithPhaseTracer(w.baseWorker.ctx, tracer) + + doRetry := func(task *ttlDeleteTask) [][]types.Datum { + return task.doDelete(ctx, se) + } + + timer := time.NewTimer(w.retryBuffer.retryInterval) + defer timer.Stop() + + for w.Status() == workerStatusRunning { + tracer.EnterPhase(metrics.PhaseIdle) + select { + case <-ctx.Done(): + return nil + case <-timer.C: + tracer.EnterPhase(metrics.PhaseOther) + nextInterval := w.retryBuffer.DoRetry(doRetry) + timer.Reset(nextInterval) + case task, ok := <-w.delCh: + tracer.EnterPhase(metrics.PhaseOther) + if !ok { + return nil + } + retryRows := task.doDelete(ctx, se) + w.retryBuffer.RecordTaskResult(task, retryRows) + } + } + return nil +} diff --git a/ttl/ttlworker/del_test.go b/ttl/ttlworker/del_test.go new file mode 100644 index 0000000000000..524b45c9c8806 --- /dev/null +++ b/ttl/ttlworker/del_test.go @@ -0,0 +1,389 @@ +// 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, +// 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 ttlworker + +import ( + "context" + "errors" + "strings" + "testing" + "time" + + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/stretchr/testify/require" + "golang.org/x/time/rate" +) + +func TestTTLDelRetryBuffer(t *testing.T) { + createTask := func(name string) (*ttlDeleteTask, [][]types.Datum, *ttlStatistics) { + rows := make([][]types.Datum, 10) + statistics := &ttlStatistics{} + statistics.IncTotalRows(10) + task := &ttlDeleteTask{ + tbl: newMockTTLTbl(t, name), + expire: time.UnixMilli(0), + rows: rows, + statistics: statistics, + } + return task, rows, statistics + } + + shouldNotDoRetry := func(task *ttlDeleteTask) [][]types.Datum { + require.FailNow(t, "should not do retry") + return nil + } + + start := time.UnixMilli(0) + tm := start + buffer := newTTLDelRetryBuffer() + require.Equal(t, delRetryBufferSize, buffer.maxSize) + require.Equal(t, delMaxRetry, buffer.maxRetry) + require.Equal(t, delRetryInterval, buffer.retryInterval) + + buffer.maxSize = 3 + buffer.maxRetry = 2 + buffer.retryInterval = 10 * time.Second + buffer.getTime = func() time.Time { + return tm + } + + // add success task + task1, rows1, statics1 := createTask("t1") + buffer.RecordTaskResult(task1, nil) + require.Equal(t, 0, buffer.Len()) + buffer.DoRetry(shouldNotDoRetry) + require.Equal(t, uint64(0), statics1.ErrorRows.Load()) + + // add a task with 1 failed rows + buffer.RecordTaskResult(task1, rows1[:1]) + require.Equal(t, 1, buffer.Len()) + buffer.DoRetry(shouldNotDoRetry) + require.Equal(t, uint64(0), statics1.ErrorRows.Load()) + + // add another task with 2 failed rows + tm = tm.Add(time.Second) + task2, rows2, statics2 := createTask("t2") + buffer.RecordTaskResult(task2, rows2[:2]) + require.Equal(t, 2, buffer.Len()) + buffer.DoRetry(shouldNotDoRetry) + require.Equal(t, uint64(0), statics2.ErrorRows.Load()) + + // add another task with 3 failed rows + tm = tm.Add(time.Second) + task3, rows3, statics3 := createTask("t3") + buffer.RecordTaskResult(task3, rows3[:3]) + require.Equal(t, 3, buffer.Len()) + buffer.DoRetry(shouldNotDoRetry) + require.Equal(t, uint64(0), statics3.ErrorRows.Load()) + + // add new task will eliminate old tasks + tm = tm.Add(time.Second) + task4, rows4, statics4 := createTask("t4") + buffer.RecordTaskResult(task4, rows4[:4]) + require.Equal(t, 3, buffer.Len()) + buffer.DoRetry(shouldNotDoRetry) + require.Equal(t, uint64(0), statics4.ErrorRows.Load()) + require.Equal(t, uint64(1), statics1.ErrorRows.Load()) + + // poll up-to-date tasks + tm = tm.Add(10*time.Second - time.Millisecond) + tasks := make([]*ttlDeleteTask, 0) + doRetrySuccess := func(task *ttlDeleteTask) [][]types.Datum { + task.statistics.IncSuccessRows(len(task.rows)) + tasks = append(tasks, task) + return nil + } + nextInterval := buffer.DoRetry(doRetrySuccess) + require.Equal(t, time.Millisecond, nextInterval) + require.Equal(t, 2, len(tasks)) + require.Equal(t, "t2", tasks[0].tbl.Name.L) + require.Equal(t, time.UnixMilli(0), tasks[0].expire) + require.Equal(t, 2, len(tasks[0].rows)) + require.Equal(t, uint64(2), statics2.SuccessRows.Load()) + require.Equal(t, uint64(0), statics2.ErrorRows.Load()) + require.Equal(t, "t3", tasks[1].tbl.Name.L) + require.Equal(t, time.UnixMilli(0), tasks[0].expire) + require.Equal(t, 3, len(tasks[1].rows)) + require.Equal(t, 1, buffer.Len()) + require.Equal(t, uint64(3), statics3.SuccessRows.Load()) + require.Equal(t, uint64(0), statics3.ErrorRows.Load()) + require.Equal(t, uint64(0), statics4.SuccessRows.Load()) + require.Equal(t, uint64(0), statics4.ErrorRows.Load()) + + // poll next + tm = tm.Add(time.Millisecond) + tasks = make([]*ttlDeleteTask, 0) + nextInterval = buffer.DoRetry(doRetrySuccess) + require.Equal(t, 10*time.Second, nextInterval) + require.Equal(t, 1, len(tasks)) + require.Equal(t, "t4", tasks[0].tbl.Name.L) + require.Equal(t, time.UnixMilli(0), tasks[0].expire) + require.Equal(t, 4, len(tasks[0].rows)) + require.Equal(t, 0, buffer.Len()) + require.Equal(t, uint64(4), statics4.SuccessRows.Load()) + require.Equal(t, uint64(0), statics4.ErrorRows.Load()) + + // test retry max count + retryCnt := 0 + doRetryFail := func(task *ttlDeleteTask) [][]types.Datum { + retryCnt++ + task.statistics.SuccessRows.Add(1) + return task.rows[1:] + } + task5, rows5, statics5 := createTask("t5") + buffer.RecordTaskResult(task5, rows5[:5]) + require.Equal(t, 1, buffer.Len()) + tm = tm.Add(10 * time.Second) + nextInterval = buffer.DoRetry(doRetryFail) + require.Equal(t, 10*time.Second, nextInterval) + require.Equal(t, uint64(1), statics5.SuccessRows.Load()) + require.Equal(t, uint64(0), statics5.ErrorRows.Load()) + require.Equal(t, 1, retryCnt) + tm = tm.Add(10 * time.Second) + buffer.DoRetry(doRetryFail) + require.Equal(t, uint64(2), statics5.SuccessRows.Load()) + require.Equal(t, uint64(3), statics5.ErrorRows.Load()) + require.Equal(t, 2, retryCnt) + require.Equal(t, 0, buffer.Len()) + + // test task should be immutable + require.Equal(t, 10, len(task5.rows)) +} + +func TestTTLDeleteTaskDoDelete(t *testing.T) { + origBatchSize := variable.TTLDeleteBatchSize.Load() + variable.TTLDeleteBatchSize.Store(3) + defer variable.TTLDeleteBatchSize.Store(origBatchSize) + + t1 := newMockTTLTbl(t, "t1") + t2 := newMockTTLTbl(t, "t2") + t3 := newMockTTLTbl(t, "t3") + t4 := newMockTTLTbl(t, "t4") + s := newMockSession(t) + invokes := 0 + s.executeSQL = func(ctx context.Context, sql string, args ...interface{}) ([]chunk.Row, error) { + invokes++ + s.sessionInfoSchema = newMockInfoSchema(t1.TableInfo, t2.TableInfo, t3.TableInfo, t4.TableInfo) + if strings.Contains(sql, "`t1`") { + return nil, nil + } + + if strings.Contains(sql, "`t2`") { + return nil, errors.New("mockErr") + } + + if strings.Contains(sql, "`t3`") { + s.sessionInfoSchema = newMockInfoSchema() + return nil, nil + } + + if strings.Contains(sql, "`t4`") { + switch invokes { + case 1: + return nil, nil + case 2, 4: + return nil, errors.New("mockErr") + case 3: + s.sessionInfoSchema = newMockInfoSchema() + return nil, nil + } + } + + require.FailNow(t, "") + return nil, nil + } + + nRows := func(n int) [][]types.Datum { + rows := make([][]types.Datum, n) + for i := 0; i < n; i++ { + rows[i] = []types.Datum{ + types.NewIntDatum(int64(i)), + } + } + return rows + } + + delTask := func(t *cache.PhysicalTable) *ttlDeleteTask { + task := &ttlDeleteTask{ + tbl: t, + expire: time.UnixMilli(0), + rows: nRows(10), + statistics: &ttlStatistics{}, + } + task.statistics.TotalRows.Add(10) + return task + } + + cases := []struct { + task *ttlDeleteTask + retryRows []int + successRows int + errorRows int + }{ + { + task: delTask(t1), + retryRows: nil, + successRows: 10, + errorRows: 0, + }, + { + task: delTask(t2), + retryRows: []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + successRows: 0, + errorRows: 0, + }, + { + task: delTask(t3), + retryRows: nil, + successRows: 0, + errorRows: 10, + }, + { + task: delTask(t4), + retryRows: []int{3, 4, 5, 9}, + successRows: 3, + errorRows: 3, + }, + } + + for _, c := range cases { + invokes = 0 + retryRows := c.task.doDelete(context.Background(), s) + require.Equal(t, 4, invokes) + if c.retryRows == nil { + require.Nil(t, retryRows) + } + require.Equal(t, len(c.retryRows), len(retryRows)) + for i, row := range retryRows { + require.Equal(t, int64(c.retryRows[i]), row[0].GetInt64()) + } + require.Equal(t, uint64(10), c.task.statistics.TotalRows.Load()) + require.Equal(t, uint64(c.successRows), c.task.statistics.SuccessRows.Load()) + require.Equal(t, uint64(c.errorRows), c.task.statistics.ErrorRows.Load()) + } +} + +func TestTTLDeleteRateLimiter(t *testing.T) { + origDeleteLimit := variable.TTLDeleteRateLimit.Load() + defer func() { + variable.TTLDeleteRateLimit.Store(origDeleteLimit) + }() + + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer func() { + if cancel != nil { + cancel() + } + }() + + variable.TTLDeleteRateLimit.Store(100000) + require.NoError(t, globalDelRateLimiter.Wait(ctx)) + require.Equal(t, rate.Limit(100000), globalDelRateLimiter.limiter.Limit()) + require.Equal(t, int64(100000), globalDelRateLimiter.limit.Load()) + + variable.TTLDeleteRateLimit.Store(0) + require.NoError(t, globalDelRateLimiter.Wait(ctx)) + require.Equal(t, rate.Limit(0), globalDelRateLimiter.limiter.Limit()) + require.Equal(t, int64(0), globalDelRateLimiter.limit.Load()) + + // 0 stands for no limit + require.NoError(t, globalDelRateLimiter.Wait(ctx)) + // cancel ctx returns an error + cancel() + cancel = nil + require.EqualError(t, globalDelRateLimiter.Wait(ctx), "context canceled") +} + +func TestTTLDeleteTaskWorker(t *testing.T) { + origBatchSize := variable.TTLDeleteBatchSize.Load() + variable.TTLDeleteBatchSize.Store(3) + defer variable.TTLDeleteBatchSize.Store(origBatchSize) + + t1 := newMockTTLTbl(t, "t1") + t2 := newMockTTLTbl(t, "t2") + t3 := newMockTTLTbl(t, "t3") + s := newMockSession(t) + pool := newMockSessionPool(t) + pool.se = s + + sqlMap := make(map[string]struct{}) + s.executeSQL = func(ctx context.Context, sql string, args ...interface{}) ([]chunk.Row, error) { + pool.lastSession.sessionInfoSchema = newMockInfoSchema(t1.TableInfo, t2.TableInfo, t3.TableInfo) + if strings.Contains(sql, "`t1`") { + return nil, nil + } + + if strings.Contains(sql, "`t2`") { + if _, ok := sqlMap[sql]; ok { + return nil, nil + } + sqlMap[sql] = struct{}{} + return nil, errors.New("mockErr") + } + + if strings.Contains(sql, "`t3`") { + pool.lastSession.sessionInfoSchema = newMockInfoSchema() + return nil, nil + } + + require.FailNow(t, "") + return nil, nil + } + + delCh := make(chan *ttlDeleteTask) + w := newDeleteWorker(delCh, pool) + w.retryBuffer.retryInterval = time.Millisecond + require.Equal(t, workerStatusCreated, w.Status()) + w.Start() + require.Equal(t, workerStatusRunning, w.Status()) + defer func() { + w.Stop() + require.NoError(t, w.WaitStopped(context.TODO(), 10*time.Second)) + }() + + tasks := make([]*ttlDeleteTask, 0) + for _, tbl := range []*cache.PhysicalTable{t1, t2, t3} { + task := &ttlDeleteTask{ + tbl: tbl, + expire: time.UnixMilli(0), + rows: [][]types.Datum{ + {types.NewIntDatum(1)}, + {types.NewIntDatum(2)}, + {types.NewIntDatum(3)}, + }, + statistics: &ttlStatistics{}, + } + task.statistics.TotalRows.Add(3) + tasks = append(tasks, task) + select { + case delCh <- task: + case <-time.After(time.Second): + require.FailNow(t, "") + } + } + + time.Sleep(time.Millisecond * 100) + require.Equal(t, uint64(3), tasks[0].statistics.SuccessRows.Load()) + require.Equal(t, uint64(0), tasks[0].statistics.ErrorRows.Load()) + + require.Equal(t, uint64(3), tasks[1].statistics.SuccessRows.Load()) + require.Equal(t, uint64(0), tasks[1].statistics.ErrorRows.Load()) + + require.Equal(t, uint64(0), tasks[2].statistics.SuccessRows.Load()) + require.Equal(t, uint64(3), tasks[2].statistics.ErrorRows.Load()) +} diff --git a/ttl/ttlworker/job.go b/ttl/ttlworker/job.go new file mode 100644 index 0000000000000..5ba91dcc375a0 --- /dev/null +++ b/ttl/ttlworker/job.go @@ -0,0 +1,151 @@ +// 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, +// 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 ttlworker + +import ( + "context" + "sync" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/ttl/session" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" +) + +const updateJobCurrentStatusTemplate = "UPDATE mysql.tidb_ttl_table_status SET current_job_status = %? WHERE table_id = %? AND current_job_status = %? AND current_job_id = %?" +const finishJobTemplate = `UPDATE mysql.tidb_ttl_table_status + SET last_job_id = current_job_id, + last_job_start_time = current_job_start_time, + last_job_finish_time = %?, + last_job_ttl_expire = current_job_ttl_expire, + last_job_summary = %?, + current_job_id = NULL, + current_job_owner_id = NULL, + current_job_owner_hb_time = NULL, + current_job_start_time = NULL, + current_job_ttl_expire = NULL, + current_job_state = NULL, + current_job_status = NULL, + current_job_status_update_time = NULL + WHERE table_id = %? AND current_job_id = %?` +const removeTaskForJobTemplate = "DELETE FROM mysql.tidb_ttl_task WHERE job_id = %?" +const addJobHistoryTemplate = `INSERT INTO + mysql.tidb_ttl_job_history ( + job_id, + table_id, + parent_table_id, + table_schema, + table_name, + partition_name, + create_time, + finish_time, + ttl_expire, + summary_text, + expired_rows, + deleted_rows, + error_delete_rows, + status + ) +VALUES + (%?, %?, %?, %?, %?, %?, %?, %?, %?, %?, %?, %?, %?, %?)` + +func updateJobCurrentStatusSQL(tableID int64, oldStatus cache.JobStatus, newStatus cache.JobStatus, jobID string) (string, []interface{}) { + return updateJobCurrentStatusTemplate, []interface{}{string(newStatus), tableID, string(oldStatus), jobID} +} + +func finishJobSQL(tableID int64, finishTime time.Time, summary string, jobID string) (string, []interface{}) { + return finishJobTemplate, []interface{}{finishTime.Format(timeFormat), summary, tableID, jobID} +} + +func removeTaskForJob(jobID string) (string, []interface{}) { + return removeTaskForJobTemplate, []interface{}{jobID} +} + +func addJobHistorySQL(job *ttlJob, finishTime time.Time, summary *TTLSummary) (string, []interface{}) { + status := cache.JobStatusFinished + if job.status == cache.JobStatusTimeout || job.status == cache.JobStatusCancelled { + status = job.status + } + + var partitionName interface{} + if job.tbl.Partition.O != "" { + partitionName = job.tbl.Partition.O + } + + return addJobHistoryTemplate, []interface{}{ + job.id, + job.tbl.ID, + job.tbl.TableInfo.ID, + job.tbl.Schema.O, + job.tbl.Name.O, + partitionName, + job.createTime.Format(timeFormat), + finishTime.Format(timeFormat), + job.ttlExpireTime.Format(timeFormat), + summary.SummaryText, + summary.TotalRows, + summary.SuccessRows, + summary.ErrorRows, + string(status), + } +} + +type ttlJob struct { + id string + ownerID string + + createTime time.Time + ttlExpireTime time.Time + + tbl *cache.PhysicalTable + + // status is the only field which should be protected by a mutex, as `Cancel` may be called at any time, and will + // change the status + statusMutex sync.Mutex + status cache.JobStatus +} + +// finish turns current job into last job, and update the error message and statistics summary +func (job *ttlJob) finish(se session.Session, now time.Time, summary *TTLSummary) { + // at this time, the job.ctx may have been canceled (to cancel this job) + // even when it's canceled, we'll need to update the states, so use another context + err := se.RunInTxn(context.TODO(), func() error { + sql, args := finishJobSQL(job.tbl.ID, now, summary.SummaryText, job.id) + _, err := se.ExecuteSQL(context.TODO(), sql, args...) + if err != nil { + return errors.Wrapf(err, "execute sql: %s", sql) + } + + sql, args = removeTaskForJob(job.id) + _, err = se.ExecuteSQL(context.TODO(), sql, args...) + if err != nil { + return errors.Wrapf(err, "execute sql: %s", sql) + } + + sql, args = addJobHistorySQL(job, now, summary) + _, err = se.ExecuteSQL(context.TODO(), sql, args...) + if err != nil { + return errors.Wrapf(err, "execute sql: %s", sql) + } + + return nil + }, session.TxnModeOptimistic) + + if err != nil { + logutil.BgLogger().Error("fail to finish a ttl job", zap.Error(err), zap.Int64("tableID", job.tbl.ID), zap.String("jobID", job.id)) + } +} diff --git a/ttl/ttlworker/job_manager.go b/ttl/ttlworker/job_manager.go new file mode 100644 index 0000000000000..919cc56e7c8da --- /dev/null +++ b/ttl/ttlworker/job_manager.go @@ -0,0 +1,789 @@ +// 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, +// 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 ttlworker + +import ( + "context" + "encoding/json" + "strings" + "time" + + "github.com/google/uuid" + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/duration" + "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/ttl/client" + "github.com/pingcap/tidb/ttl/metrics" + "github.com/pingcap/tidb/ttl/session" + "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/timeutil" + clientv3 "go.etcd.io/etcd/client/v3" + "go.uber.org/multierr" + "go.uber.org/zap" +) + +const scanTaskNotificationType string = "scan" + +const insertNewTableIntoStatusTemplate = "INSERT INTO mysql.tidb_ttl_table_status (table_id,parent_table_id) VALUES (%?, %?)" +const setTableStatusOwnerTemplate = `UPDATE mysql.tidb_ttl_table_status + SET current_job_id = %?, + current_job_owner_id = %?, + current_job_start_time = %?, + current_job_status = 'running', + current_job_status_update_time = %?, + current_job_ttl_expire = %?, + current_job_owner_hb_time = %? + WHERE table_id = %?` +const updateHeartBeatTemplate = "UPDATE mysql.tidb_ttl_table_status SET current_job_owner_hb_time = %? WHERE table_id = %? AND current_job_owner_id = %?" +const taskGCTemplate = `DELETE task FROM + mysql.tidb_ttl_task task + left join + mysql.tidb_ttl_table_status job + ON task.job_id = job.current_job_id + WHERE job.table_id IS NULL` + +const ttlJobHistoryGCTemplate = `DELETE FROM mysql.tidb_ttl_job_history WHERE create_time < CURDATE() - INTERVAL 90 DAY` + +const timeFormat = "2006-01-02 15:04:05" + +func insertNewTableIntoStatusSQL(tableID int64, parentTableID int64) (string, []interface{}) { + return insertNewTableIntoStatusTemplate, []interface{}{tableID, parentTableID} +} + +func setTableStatusOwnerSQL(uuid string, tableID int64, now time.Time, currentJobTTLExpire time.Time, id string) (string, []interface{}) { + return setTableStatusOwnerTemplate, []interface{}{uuid, id, now.Format(timeFormat), now.Format(timeFormat), currentJobTTLExpire.Format(timeFormat), now.Format(timeFormat), tableID} +} + +func updateHeartBeatSQL(tableID int64, now time.Time, id string) (string, []interface{}) { + return updateHeartBeatTemplate, []interface{}{now.Format(timeFormat), tableID, id} +} + +// JobManager schedules and manages the ttl jobs on this instance +type JobManager struct { + // the `runningJobs`, `scanWorkers` and `delWorkers` should be protected by mutex: + // `runningJobs` will be shared in the state loop and schedule loop + // `scanWorkers` and `delWorkers` can be modified by setting variables at any time + baseWorker + + sessPool sessionPool + + // id is the ddl id of this instance + id string + + store kv.Storage + cmdCli client.CommandClient + notificationCli client.NotificationClient + + // infoSchemaCache and tableStatusCache are a cache stores the information from info schema and the tidb_ttl_table_status + // table. They don't need to be protected by mutex, because they are only used in job loop goroutine. + infoSchemaCache *cache.InfoSchemaCache + tableStatusCache *cache.TableStatusCache + + // runningJobs record all ttlJob waiting in local + // when a job for a table is created, it could spawn several scan tasks. If there are too many scan tasks, and they cannot + // be fully consumed by local scan workers, their states should be recorded in the runningJobs, so that we could continue + // to poll scan tasks from the job in the future when there are scan workers in idle. + runningJobs []*ttlJob + + taskManager *taskManager +} + +// NewJobManager creates a new ttl job manager +func NewJobManager(id string, sessPool sessionPool, store kv.Storage, etcdCli *clientv3.Client) (manager *JobManager) { + manager = &JobManager{} + manager.id = id + manager.store = store + manager.sessPool = sessPool + + manager.init(manager.jobLoop) + manager.ctx = logutil.WithKeyValue(manager.ctx, "ttl-worker", "job-manager") + + manager.infoSchemaCache = cache.NewInfoSchemaCache(getUpdateInfoSchemaCacheInterval()) + manager.tableStatusCache = cache.NewTableStatusCache(getUpdateTTLTableStatusCacheInterval()) + + if etcdCli != nil { + manager.cmdCli = client.NewCommandClient(etcdCli) + manager.notificationCli = client.NewNotificationClient(etcdCli) + } else { + manager.cmdCli = client.NewMockCommandClient() + manager.notificationCli = client.NewMockNotificationClient() + } + + manager.taskManager = newTaskManager(manager.ctx, sessPool, manager.infoSchemaCache, id) + + return +} + +func (m *JobManager) jobLoop() error { + se, err := getSession(m.sessPool) + if err != nil { + return err + } + + defer func() { + err = multierr.Combine(err, multierr.Combine(m.taskManager.resizeScanWorkers(0), m.taskManager.resizeDelWorkers(0))) + se.Close() + logutil.Logger(m.ctx).Info("ttlJobManager loop exited.") + }() + + infoSchemaCacheUpdateTicker := time.Tick(m.infoSchemaCache.GetInterval()) + tableStatusCacheUpdateTicker := time.Tick(m.tableStatusCache.GetInterval()) + resizeWorkersTicker := time.Tick(getResizeWorkersInterval()) + gcTicker := time.Tick(ttlGCInterval) + + scheduleJobTicker := time.Tick(jobManagerLoopTickerInterval) + jobCheckTicker := time.Tick(jobManagerLoopTickerInterval) + updateJobHeartBeatTicker := time.Tick(jobManagerLoopTickerInterval) + + scheduleTaskTicker := time.Tick(getTaskManagerLoopTickerInterval()) + updateTaskHeartBeatTicker := time.Tick(ttlTaskHeartBeatTickerInterval) + taskCheckTicker := time.Tick(time.Second * 5) + checkScanTaskFinishedTicker := time.Tick(getTaskManagerLoopTickerInterval()) + + cmdWatcher := m.cmdCli.WatchCommand(m.ctx) + scanTaskNotificationWatcher := m.notificationCli.WatchNotification(m.ctx, scanTaskNotificationType) + m.taskManager.resizeWorkersWithSysVar() + for { + m.reportMetrics() + m.taskManager.reportMetrics() + now := se.Now() + + select { + // misc + case <-m.ctx.Done(): + return nil + case <-infoSchemaCacheUpdateTicker: + err := m.updateInfoSchemaCache(se) + if err != nil { + logutil.Logger(m.ctx).Warn("fail to update info schema cache", zap.Error(err)) + } + case <-tableStatusCacheUpdateTicker: + err := m.updateTableStatusCache(se) + if err != nil { + logutil.Logger(m.ctx).Warn("fail to update table status cache", zap.Error(err)) + } + case <-gcTicker: + gcCtx, cancel := context.WithTimeout(m.ctx, ttlInternalSQLTimeout) + DoGC(gcCtx, se) + cancel() + // Job Schedule loop: + case <-updateJobHeartBeatTicker: + updateHeartBeatCtx, cancel := context.WithTimeout(m.ctx, ttlInternalSQLTimeout) + err = m.updateHeartBeat(updateHeartBeatCtx, se, now) + if err != nil { + logutil.Logger(m.ctx).Warn("fail to update job heart beat", zap.Error(err)) + } + cancel() + case <-jobCheckTicker: + m.checkFinishedJob(se) + m.checkNotOwnJob() + case <-scheduleJobTicker: + m.rescheduleJobs(se, now) + case cmd, ok := <-cmdWatcher: + if !ok { + if m.ctx.Err() != nil { + return nil + } + + logutil.BgLogger().Warn("The TTL cmd watcher is closed unexpectedly, re-watch it again") + cmdWatcher = m.cmdCli.WatchCommand(m.ctx) + continue + } + + if triggerJobCmd, ok := cmd.GetTriggerTTLJobRequest(); ok { + m.triggerTTLJob(cmd.RequestID, triggerJobCmd, se) + m.rescheduleJobs(se, now) + } + + // Task Manager Loop + case <-scheduleTaskTicker: + m.taskManager.rescheduleTasks(se, now) + case _, ok := <-scanTaskNotificationWatcher: + if !ok { + if m.ctx.Err() != nil { + return nil + } + + logutil.BgLogger().Warn("The TTL scan task notification watcher is closed unexpectedly, re-watch it again") + scanTaskNotificationWatcher = m.notificationCli.WatchNotification(m.ctx, scanTaskNotificationType) + continue + } + m.taskManager.rescheduleTasks(se, now) + case <-taskCheckTicker: + m.taskManager.checkInvalidTask(se) + m.taskManager.checkFinishedTask(se, now) + case <-resizeWorkersTicker: + m.taskManager.resizeWorkersWithSysVar() + case <-updateTaskHeartBeatTicker: + updateHeartBeatCtx, cancel := context.WithTimeout(m.ctx, ttlInternalSQLTimeout) + err = m.taskManager.updateHeartBeat(updateHeartBeatCtx, se, now) + if err != nil { + logutil.Logger(m.ctx).Warn("fail to update task heart beat", zap.Error(err)) + } + cancel() + case <-checkScanTaskFinishedTicker: + if m.taskManager.handleScanFinishedTask() { + m.taskManager.rescheduleTasks(se, now) + } + case <-m.taskManager.notifyStateCh: + if m.taskManager.handleScanFinishedTask() { + m.taskManager.rescheduleTasks(se, now) + } + } + } +} + +func (m *JobManager) triggerTTLJob(requestID string, cmd *client.TriggerNewTTLJobRequest, se session.Session) { + if len(m.runningJobs) > 0 { + // sleep 2 seconds to make sure the TiDB without any job running in it to have a higher priority to take a new job. + time.Sleep(2 * time.Second) + } + + ok, err := m.cmdCli.TakeCommand(m.ctx, requestID) + if err != nil { + logutil.BgLogger().Error("failed to take TTL trigger job command", + zap.String("requestID", requestID), + zap.String("database", cmd.DBName), + zap.String("table", cmd.TableName)) + return + } + + if !ok { + return + } + + logutil.BgLogger().Info("Get a command to trigger a new TTL job", + zap.String("requestID", requestID), + zap.String("database", cmd.DBName), + zap.String("table", cmd.TableName)) + + responseErr := func(err error) { + terror.Log(m.cmdCli.ResponseCommand(m.ctx, requestID, err)) + } + + if err = m.infoSchemaCache.Update(se); err != nil { + responseErr(err) + return + } + + if err = m.tableStatusCache.Update(m.ctx, se); err != nil { + responseErr(err) + return + } + + var tables []*cache.PhysicalTable + for _, tbl := range m.infoSchemaCache.Tables { + if tbl.Schema.L == strings.ToLower(cmd.DBName) && tbl.Name.L == strings.ToLower(cmd.TableName) { + tables = append(tables, tbl) + } + } + + if len(tables) == 0 { + responseErr(errors.Errorf("table %s.%s not exists", cmd.DBName, cmd.TableName)) + return + } + + now := time.Now() + tableResults := make([]*client.TriggerNewTTLJobTableResult, 0, len(tables)) + allError := true + var firstError error + for _, ttlTbl := range tables { + tblResult := &client.TriggerNewTTLJobTableResult{ + TableID: ttlTbl.ID, + DBName: cmd.DBName, + TableName: cmd.TableName, + PartitionName: ttlTbl.Partition.O, + } + + job, err := m.lockNewJob(m.ctx, se, ttlTbl, now, true) + if err != nil { + firstError = err + tblResult.ErrorMessage = err.Error() + tableResults = append(tableResults, tblResult) + continue + } + + allError = false + if job != nil { + m.appendJob(job) + tblResult.JobID = job.id + tableResults = append(tableResults, tblResult) + } + } + + if allError { + responseErr(firstError) + return + } + + terror.Log(m.cmdCli.ResponseCommand(m.ctx, requestID, &client.TriggerNewTTLJobResponse{ + TableResult: tableResults, + })) + + tableResultsJSON, _ := json.Marshal(tableResults) + logutil.BgLogger().Info("Done to trigger a new TTL job", + zap.String("requestID", requestID), + zap.String("database", cmd.DBName), + zap.String("table", cmd.TableName), + zap.ByteString("tableResults", tableResultsJSON), + ) +} + +func (m *JobManager) reportMetrics() { + var runningJobs, cancellingJobs float64 + for _, job := range m.runningJobs { + switch job.status { + case cache.JobStatusRunning: + runningJobs++ + case cache.JobStatusCancelling: + cancellingJobs++ + } + } + metrics.RunningJobsCnt.Set(runningJobs) + metrics.CancellingJobsCnt.Set(cancellingJobs) +} + +// checkNotOwnJob removes the job whose current job owner is not yourself +func (m *JobManager) checkNotOwnJob() { + for _, job := range m.runningJobs { + tableStatus := m.tableStatusCache.Tables[job.tbl.ID] + if tableStatus == nil || tableStatus.CurrentJobOwnerID != m.id { + logger := logutil.Logger(m.ctx).With(zap.String("jobID", job.id)) + if tableStatus != nil { + logger.With(zap.String("newJobOwnerID", tableStatus.CurrentJobOwnerID)) + } + logger.Info("job has been taken over by another node") + m.removeJob(job) + } + } +} + +func (m *JobManager) checkFinishedJob(se session.Session) { +j: + for _, job := range m.runningJobs { + timeoutJobCtx, cancel := context.WithTimeout(m.ctx, ttlInternalSQLTimeout) + + sql, args := cache.SelectFromTTLTaskWithJobID(job.id) + rows, err := se.ExecuteSQL(timeoutJobCtx, sql, args...) + cancel() + if err != nil { + logutil.Logger(m.ctx).Warn("fail to execute sql", zap.String("sql", sql), zap.Any("args", args), zap.Error(err)) + continue + } + + allFinished := true + allTasks := make([]*cache.TTLTask, 0, len(rows)) + for _, r := range rows { + task, err := cache.RowToTTLTask(se, r) + if err != nil { + logutil.Logger(m.ctx).Warn("fail to read task", zap.Error(err)) + continue j + } + allTasks = append(allTasks, task) + + if task.Status != "finished" { + allFinished = false + } + } + + if allFinished { + logutil.Logger(m.ctx).Info("job has finished", zap.String("jobID", job.id)) + summary, err := summarizeTaskResult(allTasks) + if err != nil { + logutil.Logger(m.ctx).Info("fail to summarize job", zap.Error(err)) + } + m.removeJob(job) + job.finish(se, se.Now(), summary) + } + cancel() + } +} + +func (m *JobManager) rescheduleJobs(se session.Session, now time.Time) { + if !variable.EnableTTLJob.Load() || !timeutil.WithinDayTimePeriod(variable.TTLJobScheduleWindowStartTime.Load(), variable.TTLJobScheduleWindowEndTime.Load(), now) { + if len(m.runningJobs) > 0 { + for _, job := range m.runningJobs { + logutil.Logger(m.ctx).Info("cancel job because tidb_ttl_job_enable turned off", zap.String("jobID", job.id)) + + summary, err := summarizeErr(errors.New("ttl job is disabled")) + if err != nil { + logutil.Logger(m.ctx).Info("fail to summarize job", zap.Error(err)) + } + m.removeJob(job) + job.finish(se, now, summary) + } + } + return + } + + // don't lock job if there's no free scan workers in local + // it's a mechanism to avoid too many scan tasks waiting in the ttl_tasks table. + if len(m.taskManager.idleScanWorkers()) == 0 { + return + } + + newJobTables := m.readyForNewJobTables(now) + // TODO: also consider to resume tables, but it's fine to left them there, as other nodes will take this job + // when the heart beat is not sent + for _, table := range newJobTables { + logutil.Logger(m.ctx).Info("try lock new job", zap.Int64("tableID", table.ID)) + job, err := m.lockNewJob(m.ctx, se, table, now, false) + if job != nil { + logutil.Logger(m.ctx).Info("append new running job", zap.String("jobID", job.id), zap.Int64("tableID", job.tbl.ID)) + m.appendJob(job) + } + if err != nil { + logutil.Logger(m.ctx).Warn("fail to create new job", zap.Error(err)) + } + } +} + +func (m *JobManager) localJobs() []*ttlJob { + jobs := make([]*ttlJob, 0, len(m.runningJobs)) + for _, job := range m.runningJobs { + status := m.tableStatusCache.Tables[job.tbl.ID] + if status == nil || status.CurrentJobOwnerID != m.id { + // these jobs will be removed in `checkNotOwnJob` + continue + } + + jobs = append(jobs, job) + } + return jobs +} + +// readyForNewJobTables returns all tables which should spawn a TTL job according to cache +func (m *JobManager) readyForNewJobTables(now time.Time) []*cache.PhysicalTable { + tables := make([]*cache.PhysicalTable, 0, len(m.infoSchemaCache.Tables)) + +tblLoop: + for _, table := range m.infoSchemaCache.Tables { + // If this node already has a job for this table, just ignore. + // Actually, the logic should ensure this condition never meet, we still add the check here to keep safety + // (especially when the content of the status table is incorrect) + for _, job := range m.runningJobs { + if job.tbl.ID == table.ID { + continue tblLoop + } + } + + status := m.tableStatusCache.Tables[table.ID] + ok := m.couldTrySchedule(status, table, now, false) + if ok { + tables = append(tables, table) + } + } + + return tables +} + +// couldTrySchedule returns whether a table should be tried to run TTL +func (m *JobManager) couldTrySchedule(tableStatus *cache.TableStatus, table *cache.PhysicalTable, now time.Time, ignoreScheduleInterval bool) bool { + if tableStatus == nil { + // if the table status hasn't been created, return true + return true + } + if table == nil { + // if the table is not recorded in info schema, return false + return false + } + if tableStatus.CurrentJobOwnerID != "" { + // see whether it's heart beat time is expired + hbTime := tableStatus.CurrentJobOwnerHBTime + // a more concrete value is `2 * max(updateTTLTableStatusCacheInterval, jobManagerLoopTickerInterval)`, but the + // `updateTTLTableStatusCacheInterval` is greater than `jobManagerLoopTickerInterval` in most cases. + if hbTime.Add(2 * getUpdateTTLTableStatusCacheInterval()).Before(now) { + logutil.Logger(m.ctx).Info("task heartbeat has stopped", zap.Int64("tableID", table.ID), zap.Time("hbTime", hbTime), zap.Time("now", now)) + return true + } + return false + } + + if ignoreScheduleInterval || tableStatus.LastJobStartTime.IsZero() { + return true + } + + startTime := tableStatus.LastJobStartTime + + interval := table.TTLInfo.JobInterval + d, err := duration.ParseDuration(interval) + if err != nil { + logutil.Logger(m.ctx).Warn("illegal job interval", zap.String("interval", interval)) + return false + } + return startTime.Add(d).Before(now) +} + +// occupyNewJob tries to occupy a new job in the ttl_table_status table. If it locks successfully, it will create a new +// localJob and return it. +// It could be nil, nil, if the table query doesn't return error but the job has been locked by other instances. +func (m *JobManager) lockNewJob(ctx context.Context, se session.Session, table *cache.PhysicalTable, now time.Time, ignoreScheduleInterval bool) (*ttlJob, error) { + var expireTime time.Time + var jobID string + + err := se.RunInTxn(ctx, func() error { + sql, args := cache.SelectFromTTLTableStatusWithID(table.ID) + // use ` FOR UPDATE NOWAIT`, then if the new job has been locked by other nodes, it will return: + // [tikv:3572]Statement aborted because lock(s) could not be acquired immediately and NOWAIT is set. + // Then this tidb node will not waste resource in calculating the ranges. + rows, err := se.ExecuteSQL(ctx, sql+" FOR UPDATE NOWAIT", args...) + if err != nil { + return errors.Wrapf(err, "execute sql: %s", sql) + } + if len(rows) == 0 { + // cannot find the row, insert the status row + sql, args := insertNewTableIntoStatusSQL(table.ID, table.TableInfo.ID) + _, err = se.ExecuteSQL(ctx, sql, args...) + if err != nil { + return errors.Wrapf(err, "execute sql: %s", sql) + } + sql, args = cache.SelectFromTTLTableStatusWithID(table.ID) + rows, err = se.ExecuteSQL(ctx, sql+" FOR UPDATE NOWAIT", args...) + if err != nil { + return errors.Wrapf(err, "execute sql: %s", sql) + } + if len(rows) == 0 { + return errors.New("table status row still doesn't exist after insertion") + } + } + tableStatus, err := cache.RowToTableStatus(se, rows[0]) + if err != nil { + return err + } + if !m.couldTrySchedule(tableStatus, m.infoSchemaCache.Tables[tableStatus.TableID], now, ignoreScheduleInterval) { + return errors.New("couldn't schedule ttl job") + } + + expireTime, err = table.EvalExpireTime(m.ctx, se, now) + if err != nil { + return err + } + + jobID = uuid.New().String() + jobExist := false + if len(tableStatus.CurrentJobID) > 0 { + // don't create new job if there is already one running + // so the running tasks don't need to be cancelled + jobID = tableStatus.CurrentJobID + expireTime = tableStatus.CurrentJobTTLExpire + jobExist = true + } + failpoint.Inject("set-job-uuid", func(val failpoint.Value) { + jobID = val.(string) + }) + + sql, args = setTableStatusOwnerSQL(jobID, table.ID, now, expireTime, m.id) + _, err = se.ExecuteSQL(ctx, sql, args...) + if err != nil { + return errors.Wrapf(err, "execute sql: %s", sql) + } + + // if the job already exist, don't need to submit scan tasks + if jobExist { + return nil + } + + ranges, err := table.SplitScanRanges(ctx, m.store, splitScanCount) + if err != nil { + return errors.Wrap(err, "split scan ranges") + } + for scanID, r := range ranges { + sql, args, err = cache.InsertIntoTTLTask(se, jobID, table.ID, scanID, r.Start, r.End, expireTime, now) + if err != nil { + return errors.Wrap(err, "encode scan task") + } + _, err = se.ExecuteSQL(ctx, sql, args...) + if err != nil { + return errors.Wrapf(err, "execute sql: %s", sql) + } + } + + return nil + }, session.TxnModePessimistic) + if err != nil { + return nil, err + } + + // successfully update the table status, will need to refresh the cache. + err = m.updateInfoSchemaCache(se) + if err != nil { + return nil, err + } + err = m.updateTableStatusCache(se) + if err != nil { + return nil, err + } + + job := m.createNewJob(jobID, expireTime, now, table) + + // job is created, notify every scan managers to fetch new tasks + err = m.notificationCli.Notify(m.ctx, scanTaskNotificationType, job.id) + if err != nil { + logutil.Logger(m.ctx).Warn("fail to trigger scan tasks", zap.Error(err)) + } + return job, nil +} + +func (m *JobManager) createNewJob(id string, expireTime time.Time, now time.Time, table *cache.PhysicalTable) *ttlJob { + return &ttlJob{ + id: id, + ownerID: m.id, + + createTime: now, + ttlExpireTime: expireTime, + // at least, the info schema cache and table status cache are consistent in table id, so it's safe to get table + // information from schema cache directly + tbl: table, + + status: cache.JobStatusRunning, + } +} + +// updateHeartBeat updates the heartbeat for all task with current instance as owner +func (m *JobManager) updateHeartBeat(ctx context.Context, se session.Session, now time.Time) error { + for _, job := range m.localJobs() { + if job.createTime.Add(ttlJobTimeout).Before(now) { + logutil.Logger(m.ctx).Info("job is timeout", zap.String("jobID", job.id)) + summary, err := summarizeErr(errors.New("job is timeout")) + if err != nil { + logutil.Logger(m.ctx).Info("fail to summarize job", zap.Error(err)) + } + m.removeJob(job) + job.finish(se, now, summary) + continue + } + + sql, args := updateHeartBeatSQL(job.tbl.ID, now, m.id) + _, err := se.ExecuteSQL(ctx, sql, args...) + if err != nil { + return errors.Wrapf(err, "execute sql: %s", sql) + } + } + return nil +} + +// updateInfoSchemaCache updates the cache of information schema +func (m *JobManager) updateInfoSchemaCache(se session.Session) error { + return m.infoSchemaCache.Update(se) +} + +// updateTableStatusCache updates the cache of table status +func (m *JobManager) updateTableStatusCache(se session.Session) error { + cacheUpdateCtx, cancel := context.WithTimeout(m.ctx, ttlInternalSQLTimeout) + defer cancel() + return m.tableStatusCache.Update(cacheUpdateCtx, se) +} + +func (m *JobManager) removeJob(finishedJob *ttlJob) { + for idx, job := range m.runningJobs { + if job.id == finishedJob.id { + if idx+1 < len(m.runningJobs) { + m.runningJobs = append(m.runningJobs[0:idx], m.runningJobs[idx+1:]...) + } else { + m.runningJobs = m.runningJobs[0:idx] + } + return + } + } +} + +func (m *JobManager) appendJob(job *ttlJob) { + m.runningJobs = append(m.runningJobs, job) +} + +// GetCommandCli returns the command client +func (m *JobManager) GetCommandCli() client.CommandClient { + return m.cmdCli +} + +// GetNotificationCli returns the notification client +func (m *JobManager) GetNotificationCli() client.NotificationClient { + return m.notificationCli +} + +// TTLSummary is the summary for TTL job +type TTLSummary struct { + TotalRows uint64 `json:"total_rows"` + SuccessRows uint64 `json:"success_rows"` + ErrorRows uint64 `json:"error_rows"` + + TotalScanTask int `json:"total_scan_task"` + ScheduledScanTask int `json:"scheduled_scan_task"` + FinishedScanTask int `json:"finished_scan_task"` + + ScanTaskErr string `json:"scan_task_err,omitempty"` + SummaryText string `json:"-"` +} + +func summarizeErr(err error) (*TTLSummary, error) { + summary := &TTLSummary{ + ScanTaskErr: err.Error(), + } + + buf, err := json.Marshal(summary) + if err != nil { + return nil, err + } + summary.SummaryText = string(buf) + return summary, nil +} + +func summarizeTaskResult(tasks []*cache.TTLTask) (*TTLSummary, error) { + summary := &TTLSummary{} + var allErr error + for _, t := range tasks { + if t.State != nil { + summary.TotalRows += t.State.TotalRows + summary.SuccessRows += t.State.SuccessRows + summary.ErrorRows += t.State.ErrorRows + if len(t.State.ScanTaskErr) > 0 { + allErr = multierr.Append(allErr, errors.New(t.State.ScanTaskErr)) + } + } + + summary.TotalScanTask += 1 + if t.Status != cache.TaskStatusWaiting { + summary.ScheduledScanTask += 1 + } + if t.Status == cache.TaskStatusFinished { + summary.FinishedScanTask += 1 + } + } + if allErr != nil { + summary.ScanTaskErr = allErr.Error() + } + + buf, err := json.Marshal(summary) + if err != nil { + return nil, err + } + summary.SummaryText = string(buf) + return summary, nil +} + +// DoGC deletes some old TTL job histories and redundant scan tasks +func DoGC(ctx context.Context, se session.Session) { + if _, err := se.ExecuteSQL(ctx, taskGCTemplate); err != nil { + logutil.Logger(ctx).Warn("fail to gc redundant scan task", zap.Error(err)) + } + + if _, err := se.ExecuteSQL(ctx, ttlJobHistoryGCTemplate); err != nil { + logutil.Logger(ctx).Warn("fail to gc ttl job history", zap.Error(err)) + } +} diff --git a/ttl/ttlworker/job_manager_integration_test.go b/ttl/ttlworker/job_manager_integration_test.go new file mode 100644 index 0000000000000..f69d75e58325f --- /dev/null +++ b/ttl/ttlworker/job_manager_integration_test.go @@ -0,0 +1,656 @@ +// 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, +// 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 ttlworker_test + +import ( + "context" + "encoding/json" + "fmt" + "strconv" + "strings" + "sync" + "testing" + "time" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/model" + dbsession "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/statistics/handle" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/ttl/client" + "github.com/pingcap/tidb/ttl/metrics" + "github.com/pingcap/tidb/ttl/session" + "github.com/pingcap/tidb/ttl/ttlworker" + "github.com/pingcap/tidb/util/logutil" + dto "github.com/prometheus/client_model/go" + "github.com/stretchr/testify/require" + "go.uber.org/atomic" + "go.uber.org/zap" +) + +func sessionFactory(t *testing.T, store kv.Storage) func() session.Session { + return func() session.Session { + dbSession, err := dbsession.CreateSession4Test(store) + require.NoError(t, err) + se := session.NewSession(dbSession, dbSession, nil) + + _, err = se.ExecuteSQL(context.Background(), "ROLLBACK") + require.NoError(t, err) + _, err = se.ExecuteSQL(context.Background(), "set tidb_retry_limit=0") + require.NoError(t, err) + + return se + } +} + +func TestParallelLockNewJob(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + waitAndStopTTLManager(t, dom) + + sessionFactory := sessionFactory(t, store) + + testTable := &cache.PhysicalTable{ID: 2, TableInfo: &model.TableInfo{ID: 1, TTLInfo: &model.TTLInfo{IntervalExprStr: "1", IntervalTimeUnit: int(ast.TimeUnitDay), JobInterval: "1h"}}} + // simply lock a new job + m := ttlworker.NewJobManager("test-id", nil, store, nil) + m.InfoSchemaCache().Tables[testTable.ID] = testTable + + se := sessionFactory() + job, err := m.LockNewJob(context.Background(), se, testTable, time.Now(), false) + require.NoError(t, err) + job.Finish(se, time.Now(), &ttlworker.TTLSummary{}) + + // lock one table in parallel, only one of them should lock successfully + testTimes := 100 + concurrency := 5 + now := time.Now() + for i := 0; i < testTimes; i++ { + successCounter := atomic.NewUint64(0) + successJob := &ttlworker.TTLJob{} + + now = now.Add(time.Hour * 48) + + wg := sync.WaitGroup{} + for j := 0; j < concurrency; j++ { + jobManagerID := fmt.Sprintf("test-ttl-manager-%d", j) + wg.Add(1) + go func() { + m := ttlworker.NewJobManager(jobManagerID, nil, store, nil) + m.InfoSchemaCache().Tables[testTable.ID] = testTable + + se := sessionFactory() + job, err := m.LockNewJob(context.Background(), se, testTable, now, false) + if err == nil { + successCounter.Add(1) + successJob = job + } else { + logutil.BgLogger().Info("lock new job with error", zap.Error(err)) + } + wg.Done() + }() + } + wg.Wait() + + require.Equal(t, uint64(1), successCounter.Load()) + successJob.Finish(se, time.Now(), &ttlworker.TTLSummary{}) + } +} + +func TestFinishJob(t *testing.T) { + timeFormat := "2006-01-02 15:04:05" + store, dom := testkit.CreateMockStoreAndDomain(t) + waitAndStopTTLManager(t, dom) + tk := testkit.NewTestKit(t, store) + + sessionFactory := sessionFactory(t, store) + + testTable := &cache.PhysicalTable{ID: 2, Schema: model.NewCIStr("db1"), TableInfo: &model.TableInfo{ID: 1, Name: model.NewCIStr("t1"), TTLInfo: &model.TTLInfo{IntervalExprStr: "1", IntervalTimeUnit: int(ast.TimeUnitDay)}}} + + tk.MustExec("insert into mysql.tidb_ttl_table_status(table_id) values (2)") + + // finish with error + m := ttlworker.NewJobManager("test-id", nil, store, nil) + m.InfoSchemaCache().Tables[testTable.ID] = testTable + se := sessionFactory() + startTime := time.Now() + job, err := m.LockNewJob(context.Background(), se, testTable, startTime, false) + require.NoError(t, err) + + expireTime, err := testTable.EvalExpireTime(context.Background(), se, startTime) + require.NoError(t, err) + + summary := &ttlworker.TTLSummary{ + ScanTaskErr: "\"'an error message contains both single and double quote'\"", + TotalRows: 128, + SuccessRows: 120, + ErrorRows: 8, + } + summaryBytes, err := json.Marshal(summary) + summary.SummaryText = string(summaryBytes) + + require.NoError(t, err) + endTime := time.Now() + job.Finish(se, endTime, summary) + tk.MustQuery("select table_id, last_job_summary from mysql.tidb_ttl_table_status").Check(testkit.Rows("2 " + summary.SummaryText)) + tk.MustQuery("select * from mysql.tidb_ttl_task").Check(testkit.Rows()) + expectedRow := []string{ + job.ID(), "2", "1", "db1", "t1", "", + startTime.Format(timeFormat), endTime.Format(timeFormat), expireTime.Format(timeFormat), + summary.SummaryText, "128", "120", "8", "finished", + } + tk.MustQuery("select * from mysql.tidb_ttl_job_history").Check(testkit.Rows(strings.Join(expectedRow, " "))) +} + +func TestTTLAutoAnalyze(t *testing.T) { + failpoint.Enable("github.com/pingcap/tidb/ttl/ttlworker/update-info-schema-cache-interval", fmt.Sprintf("return(%d)", time.Second)) + defer failpoint.Disable("github.com/pingcap/tidb/ttl/ttlworker/update-info-schema-cache-interval") + failpoint.Enable("github.com/pingcap/tidb/ttl/ttlworker/update-status-table-cache-interval", fmt.Sprintf("return(%d)", time.Second)) + defer failpoint.Disable("github.com/pingcap/tidb/ttl/ttlworker/update-status-table-cache-interval") + failpoint.Enable("github.com/pingcap/tidb/ttl/ttlworker/resize-workers-interval", fmt.Sprintf("return(%d)", time.Second)) + defer failpoint.Disable("github.com/pingcap/tidb/ttl/ttlworker/resize-workers-interval") + failpoint.Enable("github.com/pingcap/tidb/ttl/ttlworker/task-manager-loop-interval", fmt.Sprintf("return(%d)", time.Second)) + defer failpoint.Disable("github.com/pingcap/tidb/ttl/ttlworker/task-manager-loop-interval") + + originAutoAnalyzeMinCnt := handle.AutoAnalyzeMinCnt + handle.AutoAnalyzeMinCnt = 0 + defer func() { + handle.AutoAnalyzeMinCnt = originAutoAnalyzeMinCnt + }() + + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("create table t (id int, created_at datetime) ttl = `created_at` + interval 1 day") + + // insert ten rows, the 2,3,4,6,9,10 of them are expired + for i := 1; i <= 10; i++ { + t := time.Now() + if i%2 == 0 || i%3 == 0 { + t = t.Add(-time.Hour * 48) + } + + tk.MustExec("insert into t values(?, ?)", i, t.Format(time.RFC3339)) + } + // TODO: use a better way to pause and restart ttl worker after analyze the table to make it more stable + // but as the ttl worker takes several seconds to start, it's not too serious. + tk.MustExec("analyze table t") + rows := tk.MustQuery("show stats_meta").Rows() + require.Equal(t, rows[0][4], "0") + require.Equal(t, rows[0][5], "10") + + retryTime := 15 + retryInterval := time.Second * 2 + deleted := false + for retryTime >= 0 { + retryTime-- + time.Sleep(retryInterval) + + rows := tk.MustQuery("select count(*) from t").Rows() + count := rows[0][0].(string) + if count == "3" { + deleted = true + break + } + } + require.True(t, deleted, "ttl should remove expired rows") + + h := dom.StatsHandle() + is := dom.InfoSchema() + require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + require.NoError(t, h.Update(is)) + require.True(t, h.HandleAutoAnalyze(is)) +} + +func TestTriggerTTLJob(t *testing.T) { + failpoint.Enable("github.com/pingcap/tidb/ttl/ttlworker/task-manager-loop-interval", fmt.Sprintf("return(%d)", time.Second)) + defer failpoint.Disable("github.com/pingcap/tidb/ttl/ttlworker/task-manager-loop-interval") + + ctx, cancel := context.WithTimeout(context.TODO(), 5*time.Minute) + defer cancel() + + store, do := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(id int primary key, t timestamp) TTL=`t` + INTERVAL 1 DAY") + tbl, err := do.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + tblID := tbl.Meta().ID + require.NoError(t, err) + + // make sure the table had run a job one time to make the test stable + cli := do.TTLJobManager().GetCommandCli() + _, _ = client.TriggerNewTTLJob(ctx, cli, "test", "t") + r := tk.MustQuery("select last_job_id, current_job_id from mysql.tidb_ttl_table_status where table_id=?", tblID) + require.Equal(t, 1, len(r.Rows())) + waitTTLJobFinished(t, tk, tblID) + + now := time.Now() + nowDateStr := now.Format("2006-01-02 15:04:05.999999") + expire := now.Add(-time.Hour * 25) + expreDateStr := expire.Format("2006-01-02 15:04:05.999999") + tk.MustExec("insert into t values(1, ?)", expreDateStr) + tk.MustExec("insert into t values(2, ?)", nowDateStr) + tk.MustExec("insert into t values(3, ?)", expreDateStr) + tk.MustExec("insert into t values(4, ?)", nowDateStr) + + res, err := client.TriggerNewTTLJob(ctx, cli, "test", "t") + require.NoError(t, err) + require.Equal(t, 1, len(res.TableResult)) + tableResult := res.TableResult[0] + require.Equal(t, tblID, tableResult.TableID) + require.NotEmpty(t, tableResult.JobID) + require.Equal(t, "test", tableResult.DBName) + require.Equal(t, "t", tableResult.TableName) + require.Equal(t, "", tableResult.ErrorMessage) + require.Equal(t, "", tableResult.PartitionName) + + waitTTLJobFinished(t, tk, tblID) + tk.MustQuery("select id from t order by id asc").Check(testkit.Rows("2", "4")) +} + +func TestTTLDeleteWithTimeZoneChange(t *testing.T) { + failpoint.Enable("github.com/pingcap/tidb/ttl/ttlworker/task-manager-loop-interval", fmt.Sprintf("return(%d)", time.Second)) + defer failpoint.Disable("github.com/pingcap/tidb/ttl/ttlworker/task-manager-loop-interval") + + store, do := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("set @@global.time_zone='Asia/Shanghai'") + tk.MustExec("set @@time_zone='Asia/Shanghai'") + + tk.MustExec("create table t1(id int primary key, t datetime) TTL=`t` + INTERVAL 1 DAY TTL_ENABLE='OFF'") + tbl1, err := do.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + require.NoError(t, err) + tblID1 := tbl1.Meta().ID + tk.MustExec("insert into t1 values(1, NOW()), (2, NOW() - INTERVAL 31 HOUR), (3, NOW() - INTERVAL 33 HOUR)") + + tk.MustExec("create table t2(id int primary key, t timestamp) TTL=`t` + INTERVAL 1 DAY TTL_ENABLE='OFF'") + tbl2, err := do.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t2")) + require.NoError(t, err) + tblID2 := tbl2.Meta().ID + tk.MustExec("insert into t2 values(1, NOW()), (2, NOW() - INTERVAL 31 HOUR), (3, NOW() - INTERVAL 33 HOUR)") + + tk.MustExec("set @@global.time_zone='UTC'") + tk.MustExec("set @@time_zone='UTC'") + tk.MustExec("alter table t1 TTL_ENABLE='ON'") + tk.MustExec("alter table t2 TTL_ENABLE='ON'") + + ctx, cancel := context.WithTimeout(context.TODO(), time.Minute) + defer cancel() + cli := do.TTLJobManager().GetCommandCli() + _, _ = client.TriggerNewTTLJob(ctx, cli, "test", "t1") + _, _ = client.TriggerNewTTLJob(ctx, cli, "test", "t2") + + waitTTLJobFinished(t, tk, tblID1) + tk.MustQuery("select id from t1 order by id asc").Check(testkit.Rows("1", "2")) + + waitTTLJobFinished(t, tk, tblID2) + tk.MustQuery("select id from t2 order by id asc").Check(testkit.Rows("1")) +} + +func waitTTLJobFinished(t *testing.T, tk *testkit.TestKit, tableID int64) { + start := time.Now() + for time.Since(start) < time.Minute { + time.Sleep(time.Second) + r := tk.MustQuery("select last_job_id, current_job_id from mysql.tidb_ttl_table_status where table_id=?", tableID) + rows := r.Rows() + if len(rows) == 0 { + continue + } + + if rows[0][0] == "" { + continue + } + + if rows[0][1] != "" { + continue + } + + return + } + require.FailNow(t, "timeout") +} + +func TestTTLJobDisable(t *testing.T) { + failpoint.Enable("github.com/pingcap/tidb/ttl/ttlworker/update-info-schema-cache-interval", fmt.Sprintf("return(%d)", time.Second)) + defer failpoint.Disable("github.com/pingcap/tidb/ttl/ttlworker/update-info-schema-cache-interval") + failpoint.Enable("github.com/pingcap/tidb/ttl/ttlworker/update-status-table-cache-interval", fmt.Sprintf("return(%d)", time.Second)) + defer failpoint.Disable("github.com/pingcap/tidb/ttl/ttlworker/update-status-table-cache-interval") + failpoint.Enable("github.com/pingcap/tidb/ttl/ttlworker/resize-workers-interval", fmt.Sprintf("return(%d)", time.Second)) + defer failpoint.Disable("github.com/pingcap/tidb/ttl/ttlworker/resize-workers-interval") + + originAutoAnalyzeMinCnt := handle.AutoAnalyzeMinCnt + handle.AutoAnalyzeMinCnt = 0 + defer func() { + handle.AutoAnalyzeMinCnt = originAutoAnalyzeMinCnt + }() + + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("create table t (id int, created_at datetime) ttl = `created_at` + interval 1 day") + + // insert ten rows, the 2,3,4,6,9,10 of them are expired + for i := 1; i <= 10; i++ { + t := time.Now() + if i%2 == 0 || i%3 == 0 { + t = t.Add(-time.Hour * 48) + } + + tk.MustExec("insert into t values(?, ?)", i, t.Format(time.RFC3339)) + } + // turn off the `tidb_ttl_job_enable` + tk.MustExec("set global tidb_ttl_job_enable = 'OFF'") + defer tk.MustExec("set global tidb_ttl_job_enable = 'ON'") + + retryTime := 15 + retryInterval := time.Second * 2 + deleted := false + for retryTime >= 0 { + retryTime-- + time.Sleep(retryInterval) + + rows := tk.MustQuery("select count(*) from t").Rows() + count, err := strconv.Atoi(rows[0][0].(string)) + require.NoError(t, err) + if count < 10 { + deleted = true + break + } + + require.Len(t, dom.TTLJobManager().RunningJobs(), 0) + } + require.False(t, deleted) +} + +func TestRescheduleJobs(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + sessionFactory := sessionFactory(t, store) + + waitAndStopTTLManager(t, dom) + + now := time.Now() + tk.MustExec("create table test.t (id int, created_at datetime) ttl = `created_at` + interval 1 minute ttl_job_interval = '1m'") + table, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnTTL) + + se := sessionFactory() + m := ttlworker.NewJobManager("manager-1", nil, store, nil) + m.TaskManager().ResizeWorkersWithSysVar() + require.NoError(t, m.InfoSchemaCache().Update(se)) + // schedule jobs + m.RescheduleJobs(se, now) + sql, args := cache.SelectFromTTLTableStatusWithID(table.Meta().ID) + rows, err := se.ExecuteSQL(ctx, sql, args...) + require.NoError(t, err) + tableStatus, err := cache.RowToTableStatus(se, rows[0]) + require.NoError(t, err) + + originalJobID := tableStatus.CurrentJobID + require.NotEmpty(t, originalJobID) + require.Equal(t, "manager-1", tableStatus.CurrentJobOwnerID) + // there is already a task + tk.MustQuery("select count(*) from mysql.tidb_ttl_task").Check(testkit.Rows("1")) + + // another manager should get this job, if the heart beat is not updated + anotherManager := ttlworker.NewJobManager("manager-2", nil, store, nil) + anotherManager.TaskManager().ResizeWorkersWithSysVar() + require.NoError(t, anotherManager.InfoSchemaCache().Update(se)) + anotherManager.RescheduleJobs(se, now.Add(time.Hour)) + sql, args = cache.SelectFromTTLTableStatusWithID(table.Meta().ID) + rows, err = se.ExecuteSQL(ctx, sql, args...) + require.NoError(t, err) + tableStatus, err = cache.RowToTableStatus(se, rows[0]) + require.NoError(t, err) + + // but the orignal job should be inherited + require.NotEmpty(t, tableStatus.CurrentJobID) + require.Equal(t, "manager-2", tableStatus.CurrentJobOwnerID) + require.Equal(t, originalJobID, tableStatus.CurrentJobID) + + // if the time leaves the time window, it'll finish the job + tk.MustExec("set global tidb_ttl_job_schedule_window_start_time='23:58'") + tk.MustExec("set global tidb_ttl_job_schedule_window_end_time='23:59'") + anotherManager.RescheduleJobs(se, time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, now.Nanosecond(), now.Location())) + tk.MustQuery("select last_job_summary->>'$.scan_task_err' from mysql.tidb_ttl_table_status").Check(testkit.Rows("ttl job is disabled")) +} + +func TestJobTimeout(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + sessionFactory := sessionFactory(t, store) + + waitAndStopTTLManager(t, dom) + + now := time.Now() + tk.MustExec("create table test.t (id int, created_at datetime) ttl = `created_at` + interval 1 minute ttl_job_interval = '1m'") + table, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnTTL) + + se := sessionFactory() + m := ttlworker.NewJobManager("manager-1", nil, store, nil) + m.TaskManager().ResizeWorkersWithSysVar() + require.NoError(t, m.InfoSchemaCache().Update(se)) + // schedule jobs + m.RescheduleJobs(se, now) + // set the worker to be empty, so none of the tasks will be scheduled + m.TaskManager().SetScanWorkers4Test([]ttlworker.Worker{}) + + sql, args := cache.SelectFromTTLTableStatusWithID(table.Meta().ID) + rows, err := se.ExecuteSQL(ctx, sql, args...) + require.NoError(t, err) + tableStatus, err := cache.RowToTableStatus(se, rows[0]) + require.NoError(t, err) + + require.NotEmpty(t, tableStatus.CurrentJobID) + require.Equal(t, "manager-1", tableStatus.CurrentJobOwnerID) + // there is already a task + tk.MustQuery("select count(*) from mysql.tidb_ttl_task").Check(testkit.Rows("1")) + + // the timeout will be checked while updating heartbeat + require.NoError(t, m.UpdateHeartBeat(ctx, se, now.Add(7*time.Hour))) + tk.MustQuery("select last_job_summary->>'$.scan_task_err' from mysql.tidb_ttl_table_status").Check(testkit.Rows("job is timeout")) + tk.MustQuery("select count(*) from mysql.tidb_ttl_task").Check(testkit.Rows("0")) +} + +func TestTriggerScanTask(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + sessionFactory := sessionFactory(t, store) + now := time.Now() + se := sessionFactory() + + waitAndStopTTLManager(t, dom) + + tk.MustExec("create table test.t (id int, created_at datetime) ttl = `created_at` + interval 1 minute ttl_job_interval = '1m'") + + m := ttlworker.NewJobManager("manager-1", nil, store, nil) + require.NoError(t, m.InfoSchemaCache().Update(se)) + m.TaskManager().ResizeWorkersWithSysVar() + m.Start() + defer func() { + m.Stop() + require.NoError(t, m.WaitStopped(context.Background(), time.Second*10)) + }() + + nCli := m.GetNotificationCli() + wg := &sync.WaitGroup{} + wg.Add(1) + go func() { + <-nCli.WatchNotification(context.Background(), "scan") + wg.Done() + }() + m.RescheduleJobs(se, now) + + // notification is sent + wg.Wait() + + for time.Now().Before(now.Add(time.Second * 5)) { + time.Sleep(time.Second) + rows := tk.MustQuery("SELECT status FROM mysql.tidb_ttl_task").Rows() + if len(rows) == 0 { + break + } + if rows[0][0] == cache.TaskStatusFinished { + break + } + } +} + +func waitAndStopTTLManager(t *testing.T, dom *domain.Domain) { + maxWaitTime := 30 + for { + maxWaitTime-- + if maxWaitTime < 0 { + require.Fail(t, "fail to stop ttl manager") + } + if dom.TTLJobManager() != nil { + dom.TTLJobManager().Stop() + require.NoError(t, dom.TTLJobManager().WaitStopped(context.Background(), time.Second*10)) + return + } + time.Sleep(time.Second) + continue + } +} + +func TestGCScanTasks(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + addTableStatusRecord := func(tableID, parentTableID, curJobID int64) { + tk.MustExec("INSERT INTO mysql.tidb_ttl_table_status (table_id,parent_table_id) VALUES (?, ?)", tableID, parentTableID) + if curJobID == 0 { + return + } + + tk.MustExec(`UPDATE mysql.tidb_ttl_table_status + SET current_job_id = ?, + current_job_owner_id = '12345', + current_job_start_time = NOW(), + current_job_status = 'running', + current_job_status_update_time = NOW(), + current_job_ttl_expire = NOW(), + current_job_owner_hb_time = NOW() + WHERE table_id = ?`, curJobID, tableID) + } + + addScanTaskRecord := func(jobID, tableID, scanID int64) { + tk.MustExec(`INSERT INTO mysql.tidb_ttl_task SET + job_id = ?, + table_id = ?, + scan_id = ?, + expire_time = NOW(), + created_time = NOW()`, jobID, tableID, scanID) + } + + addTableStatusRecord(1, 1, 1) + addScanTaskRecord(1, 1, 1) + addScanTaskRecord(1, 1, 2) + addScanTaskRecord(2, 1, 1) + addScanTaskRecord(2, 1, 2) + addScanTaskRecord(3, 2, 1) + addScanTaskRecord(3, 2, 2) + + se := session.NewSession(tk.Session(), tk.Session(), func(_ session.Session) {}) + ttlworker.DoGC(context.TODO(), se) + tk.MustQuery("select job_id, scan_id from mysql.tidb_ttl_task order by job_id, scan_id asc").Check(testkit.Rows("1 1", "1 2")) +} + +func TestGCTTLHistory(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + addHistory := func(jobID, createdBeforeDays int) { + tk.MustExec(fmt.Sprintf(`INSERT INTO mysql.tidb_ttl_job_history ( + job_id, + table_id, + parent_table_id, + table_schema, + table_name, + partition_name, + create_time, + finish_time, + ttl_expire, + summary_text, + expired_rows, + deleted_rows, + error_delete_rows, + status + ) + VALUES + ( + %d, 1, 1, 'test', 't1', '', + CURDATE() - INTERVAL %d DAY, + CURDATE() - INTERVAL %d DAY + INTERVAL 1 HOUR, + CURDATE() - INTERVAL %d DAY, + "", 100, 100, 0, "finished" + )`, jobID, createdBeforeDays, createdBeforeDays, createdBeforeDays)) + } + + addHistory(1, 1) + addHistory(2, 30) + addHistory(3, 60) + addHistory(4, 89) + addHistory(5, 90) + addHistory(6, 91) + addHistory(7, 100) + se := session.NewSession(tk.Session(), tk.Session(), func(_ session.Session) {}) + ttlworker.DoGC(context.TODO(), se) + tk.MustQuery("select job_id from mysql.tidb_ttl_job_history order by job_id asc").Check(testkit.Rows("1", "2", "3", "4", "5")) +} + +func TestJobMetrics(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + sessionFactory := sessionFactory(t, store) + + waitAndStopTTLManager(t, dom) + + now := time.Now() + tk.MustExec("create table test.t (id int, created_at datetime) ttl = `created_at` + interval 1 minute ttl_job_interval = '1m'") + table, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnTTL) + + se := sessionFactory() + m := ttlworker.NewJobManager("manager-1", nil, store, nil) + m.TaskManager().ResizeWorkersWithSysVar() + require.NoError(t, m.InfoSchemaCache().Update(se)) + // schedule jobs + m.RescheduleJobs(se, now) + // set the worker to be empty, so none of the tasks will be scheduled + m.TaskManager().SetScanWorkers4Test([]ttlworker.Worker{}) + + sql, args := cache.SelectFromTTLTableStatusWithID(table.Meta().ID) + rows, err := se.ExecuteSQL(ctx, sql, args...) + require.NoError(t, err) + tableStatus, err := cache.RowToTableStatus(se, rows[0]) + require.NoError(t, err) + + require.NotEmpty(t, tableStatus.CurrentJobID) + require.Equal(t, "manager-1", tableStatus.CurrentJobOwnerID) + require.Equal(t, cache.JobStatusRunning, tableStatus.CurrentJobStatus) + + m.ReportMetrics() + out := &dto.Metric{} + require.NoError(t, metrics.RunningJobsCnt.Write(out)) + require.Equal(t, float64(1), out.GetGauge().GetValue()) +} diff --git a/ttl/ttlworker/job_manager_test.go b/ttl/ttlworker/job_manager_test.go new file mode 100644 index 0000000000000..311a42072ea91 --- /dev/null +++ b/ttl/ttlworker/job_manager_test.go @@ -0,0 +1,459 @@ +// 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, +// 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 ttlworker + +import ( + "context" + "testing" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/ttl/session" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func newTTLTableStatusRows(status ...*cache.TableStatus) []chunk.Row { + c := chunk.NewChunkWithCapacity([]*types.FieldType{ + types.NewFieldType(mysql.TypeLonglong), // table_id + types.NewFieldType(mysql.TypeLonglong), // parent_table_id + types.NewFieldType(mysql.TypeString), // table_statistics + types.NewFieldType(mysql.TypeString), // last_job_id + types.NewFieldType(mysql.TypeDatetime), // last_job_start_time + types.NewFieldType(mysql.TypeDatetime), // last_job_finish_time + types.NewFieldType(mysql.TypeDatetime), // last_job_ttl_expire + types.NewFieldType(mysql.TypeString), // last_job_summary + types.NewFieldType(mysql.TypeString), // current_job_id + types.NewFieldType(mysql.TypeString), // current_job_owner_id + types.NewFieldType(mysql.TypeString), // current_job_owner_addr + types.NewFieldType(mysql.TypeDatetime), // current_job_hb_time + types.NewFieldType(mysql.TypeDatetime), // current_job_start_time + types.NewFieldType(mysql.TypeDatetime), // current_job_ttl_expire + types.NewFieldType(mysql.TypeString), // current_job_state + types.NewFieldType(mysql.TypeString), // current_job_status + types.NewFieldType(mysql.TypeDatetime), // current_job_status_update_time + }, len(status)) + var rows []chunk.Row + + for _, s := range status { + tableID := types.NewDatum(s.TableID) + c.AppendDatum(0, &tableID) + parentTableID := types.NewDatum(s.ParentTableID) + c.AppendDatum(1, &parentTableID) + if s.TableStatistics == "" { + c.AppendNull(2) + } else { + tableStatistics := types.NewDatum(s.TableStatistics) + c.AppendDatum(2, &tableStatistics) + } + + if s.LastJobID == "" { + c.AppendNull(3) + } else { + lastJobID := types.NewDatum(s.LastJobID) + c.AppendDatum(3, &lastJobID) + } + + lastJobStartTime := types.NewDatum(types.NewTime(types.FromGoTime(s.LastJobStartTime), mysql.TypeDatetime, types.MaxFsp)) + c.AppendDatum(4, &lastJobStartTime) + lastJobFinishTime := types.NewDatum(types.NewTime(types.FromGoTime(s.LastJobFinishTime), mysql.TypeDatetime, types.MaxFsp)) + c.AppendDatum(5, &lastJobFinishTime) + lastJobTTLExpire := types.NewDatum(types.NewTime(types.FromGoTime(s.LastJobTTLExpire), mysql.TypeDatetime, types.MaxFsp)) + c.AppendDatum(6, &lastJobTTLExpire) + + if s.LastJobSummary == "" { + c.AppendNull(7) + } else { + lastJobSummary := types.NewDatum(s.LastJobSummary) + c.AppendDatum(7, &lastJobSummary) + } + if s.CurrentJobID == "" { + c.AppendNull(8) + } else { + currentJobID := types.NewDatum(s.CurrentJobID) + c.AppendDatum(8, ¤tJobID) + } + if s.CurrentJobOwnerID == "" { + c.AppendNull(9) + } else { + currentJobOwnerID := types.NewDatum(s.CurrentJobOwnerID) + c.AppendDatum(9, ¤tJobOwnerID) + } + if s.CurrentJobOwnerAddr == "" { + c.AppendNull(10) + } else { + currentJobOwnerAddr := types.NewDatum(s.CurrentJobOwnerAddr) + c.AppendDatum(10, ¤tJobOwnerAddr) + } + + currentJobOwnerHBTime := types.NewDatum(types.NewTime(types.FromGoTime(s.CurrentJobOwnerHBTime), mysql.TypeDatetime, types.MaxFsp)) + c.AppendDatum(11, ¤tJobOwnerHBTime) + currentJobStartTime := types.NewDatum(types.NewTime(types.FromGoTime(s.CurrentJobStartTime), mysql.TypeDatetime, types.MaxFsp)) + c.AppendDatum(12, ¤tJobStartTime) + currentJobTTLExpire := types.NewDatum(types.NewTime(types.FromGoTime(s.CurrentJobTTLExpire), mysql.TypeDatetime, types.MaxFsp)) + c.AppendDatum(13, ¤tJobTTLExpire) + + if s.CurrentJobState == "" { + c.AppendNull(14) + } else { + currentJobState := types.NewDatum(s.CurrentJobState) + c.AppendDatum(14, ¤tJobState) + } + if s.CurrentJobStatus == "" { + c.AppendNull(15) + } else { + currentJobStatus := types.NewDatum(s.CurrentJobStatus) + c.AppendDatum(15, ¤tJobStatus) + } + + currentJobStatusUpdateTime := types.NewDatum(types.NewTime(types.FromGoTime(s.CurrentJobStatusUpdateTime), mysql.TypeDatetime, types.MaxFsp)) + c.AppendDatum(16, ¤tJobStatusUpdateTime) + } + + iter := chunk.NewIterator4Chunk(c) + for row := iter.Begin(); row != iter.End(); row = iter.Next() { + rows = append(rows, row) + } + return rows +} + +var updateStatusSQL = "SELECT LOW_PRIORITY table_id,parent_table_id,table_statistics,last_job_id,last_job_start_time,last_job_finish_time,last_job_ttl_expire,last_job_summary,current_job_id,current_job_owner_id,current_job_owner_addr,current_job_owner_hb_time,current_job_start_time,current_job_ttl_expire,current_job_state,current_job_status,current_job_status_update_time FROM mysql.tidb_ttl_table_status" + +// TTLJob exports the ttlJob for test +type TTLJob = ttlJob + +// LockNewJob is an exported version of lockNewJob for test +func (m *JobManager) LockNewJob(ctx context.Context, se session.Session, table *cache.PhysicalTable, now time.Time, ignoreScheduleInterval bool) (*TTLJob, error) { + return m.lockNewJob(ctx, se, table, now, ignoreScheduleInterval) +} + +// RunningJobs returns the running jobs inside ttl job manager +func (m *JobManager) RunningJobs() []*TTLJob { + return m.runningJobs +} + +// InfoSchemaCache is an exported getter of infoSchemaCache for test +func (m *JobManager) InfoSchemaCache() *cache.InfoSchemaCache { + return m.infoSchemaCache +} + +// RescheduleJobs is an exported version of rescheduleJobs for test +func (m *JobManager) RescheduleJobs(se session.Session, now time.Time) { + m.rescheduleJobs(se, now) +} + +// TaskManager is an exported getter of task manager for test +func (m *JobManager) TaskManager() *taskManager { + return m.taskManager +} + +// UpdateHeartBeat is an exported version of updateHeartBeat for test +func (m *JobManager) UpdateHeartBeat(ctx context.Context, se session.Session, now time.Time) error { + return m.updateHeartBeat(ctx, se, now) +} + +// ReportMetrics is an exported version of reportMetrics +func (m *JobManager) ReportMetrics() { + m.reportMetrics() +} + +func (j *ttlJob) Finish(se session.Session, now time.Time, summary *TTLSummary) { + j.finish(se, now, summary) +} + +func (j *ttlJob) ID() string { + return j.id +} + +func newMockTTLJob(tbl *cache.PhysicalTable, status cache.JobStatus) *ttlJob { + return &ttlJob{tbl: tbl, status: status} +} + +func TestReadyForNewJobTables(t *testing.T) { + tbl := newMockTTLTbl(t, "t1") + m := NewJobManager("test-id", nil, nil, nil) + m.sessPool = newMockSessionPool(t, tbl) + se := newMockSession(t, tbl) + + tblWithDailyInterval := newMockTTLTbl(t, "t2") + tblWithDailyInterval.TTLInfo.JobInterval = "1d" + + cases := []struct { + name string + infoSchemaTables []*cache.PhysicalTable + tableStatus []*cache.TableStatus + shouldSchedule bool + }{ + // for a newly inserted table, it'll always be scheduled + {"newly created", []*cache.PhysicalTable{tbl}, []*cache.TableStatus{{TableID: tbl.ID, ParentTableID: tbl.ID}}, true}, + // table only in the table status cache will not be scheduled + {"proper subset", []*cache.PhysicalTable{}, []*cache.TableStatus{{TableID: tbl.ID, ParentTableID: tbl.ID}}, false}, + // table whose current job owner id is not empty, and heart beat time is long enough will not be scheduled + {"current job not empty", []*cache.PhysicalTable{tbl}, []*cache.TableStatus{{TableID: tbl.ID, ParentTableID: tbl.ID, CurrentJobOwnerID: "test-another-id", CurrentJobOwnerHBTime: time.Now()}}, false}, + // table whose current job owner id is not empty, but heart beat time is expired will be scheduled + {"hb time expired", []*cache.PhysicalTable{tbl}, []*cache.TableStatus{{TableID: tbl.ID, ParentTableID: tbl.ID, CurrentJobOwnerID: "test-another-id", CurrentJobOwnerHBTime: time.Now().Add(-time.Hour)}}, true}, + // if the last finished time is too near, it will also not be scheduled + {"last start time too near", []*cache.PhysicalTable{tbl}, []*cache.TableStatus{{TableID: tbl.ID, ParentTableID: tbl.ID, LastJobStartTime: time.Now()}}, false}, + // if the last finished time is expired, it will be scheduled + {"last start time expired", []*cache.PhysicalTable{tbl}, []*cache.TableStatus{{TableID: tbl.ID, ParentTableID: tbl.ID, LastJobStartTime: time.Now().Add(-time.Hour * 2)}}, true}, + // if the interval is 24h, and the last finished time is near, it will not be scheduled + {"last start time too near for 24h", []*cache.PhysicalTable{tblWithDailyInterval}, []*cache.TableStatus{{TableID: tblWithDailyInterval.ID, ParentTableID: tblWithDailyInterval.ID, LastJobStartTime: time.Now().Add(-time.Hour * 2)}}, false}, + // if the interval is 24h, and the last finished time is far enough, it will be scheduled + {"last start time far enough for 24h", []*cache.PhysicalTable{tblWithDailyInterval}, []*cache.TableStatus{{TableID: tblWithDailyInterval.ID, ParentTableID: tblWithDailyInterval.ID, LastJobStartTime: time.Now().Add(-time.Hour * 25)}}, true}, + } + + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + m.infoSchemaCache.Tables = make(map[int64]*cache.PhysicalTable) + for _, ist := range c.infoSchemaTables { + m.infoSchemaCache.Tables[ist.ID] = ist + } + m.tableStatusCache.Tables = make(map[int64]*cache.TableStatus) + for _, st := range c.tableStatus { + m.tableStatusCache.Tables[st.TableID] = st + } + + tables := m.readyForNewJobTables(se.Now()) + if c.shouldSchedule { + assert.Len(t, tables, 1) + assert.Equal(t, int64(0), tables[0].ID) + assert.Equal(t, int64(0), tables[0].TableInfo.ID) + } else { + assert.Len(t, tables, 0) + } + }) + } +} + +func TestLockNewTable(t *testing.T) { + now, err := time.Parse(timeFormat, "2022-12-05 17:13:05") + assert.NoError(t, err) + expireTime := now + + testPhysicalTable := &cache.PhysicalTable{ID: 1, TableInfo: &model.TableInfo{ID: 1, TTLInfo: &model.TTLInfo{ColumnName: model.NewCIStr("test"), IntervalExprStr: "5 Year", JobInterval: "1h"}}} + + type executeInfo struct { + sql string + args []interface{} + } + getExecuteInfo := func(sql string, args []interface{}) executeInfo { + return executeInfo{ + sql, + args, + } + } + getExecuteInfoForUpdate := func(sql string, args []interface{}) executeInfo { + return executeInfo{ + sql + " FOR UPDATE NOWAIT", + args, + } + } + getExecuteInfoWithErr := func(sql string, args []interface{}, err error) executeInfo { + require.NoError(t, err) + return executeInfo{ + sql, + args, + } + } + failpoint.Enable("github.com/pingcap/tidb/ttl/ttlworker/set-job-uuid", `return("test-job-id")`) + defer failpoint.Disable("github.com/pingcap/tidb/ttl/ttlworker/set-job-uuid") + + type sqlExecute struct { + executeInfo + + rows []chunk.Row + err error + } + cases := []struct { + name string + table *cache.PhysicalTable + sqls []sqlExecute + hasJob bool + hasError bool + }{ + {"normal lock table", testPhysicalTable, []sqlExecute{ + { + getExecuteInfoForUpdate(cache.SelectFromTTLTableStatusWithID(1)), + newTTLTableStatusRows(&cache.TableStatus{TableID: 1}), nil, + }, + { + getExecuteInfo(setTableStatusOwnerSQL("test-job-id", 1, now, expireTime, "test-id")), + nil, nil, + }, + { + getExecuteInfoWithErr(cache.InsertIntoTTLTask(newMockSession(t), "test-job-id", 1, 0, nil, nil, expireTime, now)), + nil, nil, + }, + { + getExecuteInfo(updateStatusSQL, nil), + newTTLTableStatusRows(&cache.TableStatus{TableID: 1}), nil, + }, + }, true, false}, + {"select nothing", testPhysicalTable, []sqlExecute{ + { + getExecuteInfoForUpdate(cache.SelectFromTTLTableStatusWithID(1)), + nil, nil, + }, + { + getExecuteInfo(insertNewTableIntoStatusSQL(1, 1)), + nil, nil, + }, + { + getExecuteInfoForUpdate(cache.SelectFromTTLTableStatusWithID(1)), + newTTLTableStatusRows(&cache.TableStatus{TableID: 1}), nil, + }, + { + getExecuteInfo(setTableStatusOwnerSQL("test-job-id", 1, now, expireTime, "test-id")), + nil, nil, + }, + { + getExecuteInfoWithErr(cache.InsertIntoTTLTask(newMockSession(t), "test-job-id", 1, 0, nil, nil, expireTime, now)), + nil, nil, + }, + { + getExecuteInfo(updateStatusSQL, nil), + newTTLTableStatusRows(&cache.TableStatus{TableID: 1}), nil, + }, + }, true, false}, + {"return error", testPhysicalTable, []sqlExecute{ + { + getExecuteInfoForUpdate(cache.SelectFromTTLTableStatusWithID(1)), + newTTLTableStatusRows(&cache.TableStatus{TableID: 1}), nil, + }, + { + getExecuteInfo(setTableStatusOwnerSQL("test-job-id", 1, now, expireTime, "test-id")), + nil, errors.New("test error message"), + }, + { + getExecuteInfoWithErr(cache.InsertIntoTTLTask(newMockSession(t), "test-job-id", 1, 0, nil, nil, expireTime, now)), + nil, nil, + }, + }, false, true}, + } + + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + m := NewJobManager("test-id", newMockSessionPool(t), nil, nil) + m.infoSchemaCache.Tables[c.table.ID] = c.table + sqlCounter := 0 + se := newMockSession(t) + se.executeSQL = func(ctx context.Context, sql string, args ...interface{}) (rows []chunk.Row, err error) { + assert.Less(t, sqlCounter, len(c.sqls)) + assert.Equal(t, c.sqls[sqlCounter].sql, sql) + assert.Equal(t, c.sqls[sqlCounter].args, args) + + rows = c.sqls[sqlCounter].rows + err = c.sqls[sqlCounter].err + sqlCounter += 1 + return + } + se.evalExpire = now + + job, err := m.lockNewJob(context.Background(), se, c.table, now, false) + if c.hasJob { + assert.NotNil(t, job) + } else { + assert.Nil(t, job) + } + if c.hasError { + assert.NotNil(t, err) + } else { + assert.Nil(t, err) + } + }) + } +} + +func TestLocalJobs(t *testing.T) { + tbl1 := newMockTTLTbl(t, "t1") + tbl1.ID = 1 + tbl2 := newMockTTLTbl(t, "t2") + tbl2.ID = 2 + m := NewJobManager("test-id", nil, nil, nil) + m.sessPool = newMockSessionPool(t, tbl1, tbl2) + + m.runningJobs = []*ttlJob{{tbl: tbl1, id: "1"}, {tbl: tbl2, id: "2"}} + m.tableStatusCache.Tables = map[int64]*cache.TableStatus{ + tbl1.ID: { + CurrentJobOwnerID: m.id, + }, + tbl2.ID: { + CurrentJobOwnerID: "another-id", + }, + } + assert.Len(t, m.localJobs(), 1) + assert.Equal(t, m.localJobs()[0].id, "1") +} + +func TestRescheduleJobsOutOfWindow(t *testing.T) { + // TODO: use failpoint to mock return job, and schedule + + tbl := newMockTTLTbl(t, "t1") + se := newMockSession(t, tbl) + + scanWorker1 := NewMockScanWorker(t) + scanWorker1.Start() + scanWorker1.setOneRowResult(tbl, 2022) + scanWorker2 := NewMockScanWorker(t) + scanWorker2.Start() + scanWorker2.setOneRowResult(tbl, 2022) + + m := NewJobManager("test-id", nil, nil, nil) + m.sessPool = newMockSessionPool(t, tbl) + m.taskManager.SetScanWorkers4Test([]worker{ + scanWorker1, + scanWorker2, + }) + + // jobs will not be scheduled + m.tableStatusCache.Tables = map[int64]*cache.TableStatus{ + tbl.ID: { + CurrentJobOwnerID: m.id, + }, + } + m.runningJobs = []*ttlJob{newMockTTLJob(tbl, cache.JobStatusWaiting)} + savedttlJobScheduleWindowStartTime := variable.TTLJobScheduleWindowStartTime.Load() + savedttlJobScheduleWindowEndTime := variable.TTLJobScheduleWindowEndTime.Load() + ttlJobScheduleWindowStartTime, _ := time.ParseInLocation(variable.FullDayTimeFormat, "12:00 +0000", time.UTC) + variable.TTLJobScheduleWindowStartTime.Store(ttlJobScheduleWindowStartTime) + ttlJobScheduleWindowEndTime, _ := time.ParseInLocation(variable.FullDayTimeFormat, "12:05 +0000", time.UTC) + variable.TTLJobScheduleWindowEndTime.Store(ttlJobScheduleWindowEndTime) + defer func() { + variable.TTLJobScheduleWindowStartTime.Store(savedttlJobScheduleWindowStartTime) + variable.TTLJobScheduleWindowEndTime.Store(savedttlJobScheduleWindowEndTime) + }() + + now, _ := time.ParseInLocation(variable.FullDayTimeFormat, "12:06 +0000", time.UTC) + m.rescheduleJobs(se, now) + scanWorker1.checkWorkerStatus(workerStatusRunning, true, nil) + scanWorker1.checkPollResult(false, "") + scanWorker2.checkWorkerStatus(workerStatusRunning, true, nil) + scanWorker2.checkPollResult(false, "") + + // jobs will be scheduled within the time window + now, _ = time.ParseInLocation(variable.FullDayTimeFormat, "12:02 +0000", time.UTC) + m.rescheduleJobs(se, now) + //scanWorker1.checkWorkerStatus(workerStatusRunning, false, m.runningJobs[0].tasks[0]) + scanWorker1.checkPollResult(false, "") + scanWorker2.checkWorkerStatus(workerStatusRunning, true, nil) + scanWorker2.checkPollResult(false, "") +} diff --git a/ttl/ttlworker/scan.go b/ttl/ttlworker/scan.go new file mode 100644 index 0000000000000..4cf3d919d9545 --- /dev/null +++ b/ttl/ttlworker/scan.go @@ -0,0 +1,343 @@ +// 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, +// 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 ttlworker + +import ( + "context" + "fmt" + "strconv" + "sync/atomic" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/ttl/metrics" + "github.com/pingcap/tidb/ttl/sqlbuilder" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" +) + +var ( + scanTaskExecuteSQLMaxRetry = 5 + scanTaskExecuteSQLRetryInterval = 2 * time.Second + taskStartCheckErrorRateCnt = 10000 + taskMaxErrorRate = 0.4 +) + +type ttlStatistics struct { + TotalRows atomic.Uint64 + SuccessRows atomic.Uint64 + ErrorRows atomic.Uint64 +} + +func (s *ttlStatistics) IncTotalRows(cnt int) { + metrics.ScannedExpiredRows.Add(float64(cnt)) + s.TotalRows.Add(uint64(cnt)) +} + +func (s *ttlStatistics) IncSuccessRows(cnt int) { + metrics.DeleteSuccessExpiredRows.Add(float64(cnt)) + s.SuccessRows.Add(uint64(cnt)) +} + +func (s *ttlStatistics) IncErrorRows(cnt int) { + metrics.DeleteErrorExpiredRows.Add(float64(cnt)) + s.ErrorRows.Add(uint64(cnt)) +} + +func (s *ttlStatistics) Reset() { + s.SuccessRows.Store(0) + s.ErrorRows.Store(0) + s.TotalRows.Store(0) +} + +func (s *ttlStatistics) String() string { + return fmt.Sprintf("Total Rows: %d, Success Rows: %d, Error Rows: %d", s.TotalRows.Load(), s.SuccessRows.Load(), s.ErrorRows.Load()) +} + +type ttlScanTask struct { + ctx context.Context + + *cache.TTLTask + + tbl *cache.PhysicalTable + statistics *ttlStatistics +} + +type ttlScanTaskExecResult struct { + task *ttlScanTask + err error +} + +func (t *ttlScanTask) result(err error) *ttlScanTaskExecResult { + return &ttlScanTaskExecResult{task: t, err: err} +} + +func (t *ttlScanTask) getDatumRows(rows []chunk.Row) [][]types.Datum { + datums := make([][]types.Datum, len(rows)) + for i, row := range rows { + datums[i] = row.GetDatumRow(t.tbl.KeyColumnTypes) + } + return datums +} + +func (t *ttlScanTask) doScan(ctx context.Context, delCh chan<- *ttlDeleteTask, sessPool sessionPool) *ttlScanTaskExecResult { + // TODO: merge the ctx and the taskCtx in ttl scan task, to allow both "cancel" and gracefully stop workers + // now, the taskCtx is only check at the beginning of every loop + taskCtx := t.ctx + tracer := metrics.PhaseTracerFromCtx(ctx) + defer tracer.EnterPhase(tracer.Phase()) + + tracer.EnterPhase(metrics.PhaseOther) + rawSess, err := getSession(sessPool) + if err != nil { + return t.result(err) + } + defer rawSess.Close() + + origConcurrency := rawSess.GetSessionVars().DistSQLScanConcurrency() + if _, err = rawSess.ExecuteSQL(ctx, "set @@tidb_distsql_scan_concurrency=1"); err != nil { + return t.result(err) + } + + defer func() { + _, err = rawSess.ExecuteSQL(ctx, "set @@tidb_distsql_scan_concurrency="+strconv.Itoa(origConcurrency)) + terror.Log(err) + }() + + sess := newTableSession(rawSess, t.tbl, t.ExpireTime) + generator, err := sqlbuilder.NewScanQueryGenerator(t.tbl, t.ExpireTime, t.ScanRangeStart, t.ScanRangeEnd) + if err != nil { + return t.result(err) + } + + retrySQL := "" + retryTimes := 0 + var lastResult [][]types.Datum + for { + if err = taskCtx.Err(); err != nil { + return t.result(err) + } + if err = ctx.Err(); err != nil { + return t.result(err) + } + + if total := t.statistics.TotalRows.Load(); total > uint64(taskStartCheckErrorRateCnt) { + if t.statistics.ErrorRows.Load() > uint64(float64(total)*taskMaxErrorRate) { + return t.result(errors.Errorf("error exceeds the limit")) + } + } + + sql := retrySQL + if sql == "" { + limit := int(variable.TTLScanBatchSize.Load()) + if sql, err = generator.NextSQL(lastResult, limit); err != nil { + return t.result(err) + } + } + + if sql == "" { + return t.result(nil) + } + + sqlStart := time.Now() + rows, retryable, sqlErr := sess.ExecuteSQLWithCheck(ctx, sql) + selectInterval := time.Since(sqlStart) + if sqlErr != nil { + metrics.SelectErrorDuration.Observe(selectInterval.Seconds()) + needRetry := retryable && retryTimes < scanTaskExecuteSQLMaxRetry && ctx.Err() == nil + logutil.BgLogger().Error("execute query for ttl scan task failed", + zap.String("SQL", sql), + zap.Int("retryTimes", retryTimes), + zap.Bool("needRetry", needRetry), + zap.Error(sqlErr), + ) + + if !needRetry { + return t.result(sqlErr) + } + retrySQL = sql + retryTimes++ + + tracer.EnterPhase(metrics.PhaseWaitRetry) + select { + case <-ctx.Done(): + return t.result(ctx.Err()) + case <-time.After(scanTaskExecuteSQLRetryInterval): + } + tracer.EnterPhase(metrics.PhaseOther) + continue + } + + metrics.SelectSuccessDuration.Observe(selectInterval.Seconds()) + retrySQL = "" + retryTimes = 0 + lastResult = t.getDatumRows(rows) + if len(rows) == 0 { + continue + } + + delTask := &ttlDeleteTask{ + tbl: t.tbl, + expire: t.ExpireTime, + rows: lastResult, + statistics: t.statistics, + } + + tracer.EnterPhase(metrics.PhaseDispatch) + select { + case <-ctx.Done(): + return t.result(ctx.Err()) + case delCh <- delTask: + t.statistics.IncTotalRows(len(lastResult)) + } + tracer.EnterPhase(metrics.PhaseOther) + } +} + +type scanTaskExecEndMsg struct { + result *ttlScanTaskExecResult +} + +type ttlScanWorker struct { + baseWorker + curTask *ttlScanTask + curTaskResult *ttlScanTaskExecResult + delCh chan<- *ttlDeleteTask + notifyStateCh chan<- interface{} + sessionPool sessionPool +} + +func newScanWorker(delCh chan<- *ttlDeleteTask, notifyStateCh chan<- interface{}, sessPool sessionPool) *ttlScanWorker { + w := &ttlScanWorker{ + delCh: delCh, + notifyStateCh: notifyStateCh, + sessionPool: sessPool, + } + w.init(w.loop) + return w +} + +func (w *ttlScanWorker) CouldSchedule() bool { + w.Lock() + defer w.Unlock() + // see `Schedule`. If a `worker.CouldSchedule()` is true, `worker.Schedule` must success + return w.status == workerStatusRunning && w.curTask == nil && w.curTaskResult == nil +} + +func (w *ttlScanWorker) Schedule(task *ttlScanTask) error { + w.Lock() + if w.status != workerStatusRunning { + w.Unlock() + return errors.New("worker is not running") + } + + if w.curTaskResult != nil { + w.Unlock() + return errors.New("the result of previous task has not been polled") + } + + if w.curTask != nil { + w.Unlock() + return errors.New("a task is running") + } + + w.curTask = task + w.curTaskResult = nil + w.Unlock() + w.baseWorker.ch <- task + return nil +} + +func (w *ttlScanWorker) CurrentTask() *ttlScanTask { + w.Lock() + defer w.Unlock() + return w.curTask +} + +func (w *ttlScanWorker) PollTaskResult() *ttlScanTaskExecResult { + w.Lock() + defer w.Unlock() + if r := w.curTaskResult; r != nil { + w.curTask = nil + w.curTaskResult = nil + return r + } + return nil +} + +func (w *ttlScanWorker) loop() error { + ctx := w.baseWorker.ctx + tracer := metrics.NewScanWorkerPhaseTracer() + defer func() { + tracer.EndPhase() + logutil.BgLogger().Info("ttlScanWorker loop exited.") + }() + + ticker := time.Tick(time.Second * 5) + for w.Status() == workerStatusRunning { + tracer.EnterPhase(metrics.PhaseIdle) + select { + case <-ctx.Done(): + return nil + case <-ticker: + // ticker is used to update metrics on time + case msg, ok := <-w.baseWorker.ch: + tracer.EnterPhase(metrics.PhaseOther) + if !ok { + return nil + } + switch task := msg.(type) { + case *ttlScanTask: + w.handleScanTask(tracer, task) + default: + logutil.BgLogger().Warn("unrecognized message for ttlScanWorker", zap.Any("msg", msg)) + } + } + } + return nil +} + +func (w *ttlScanWorker) handleScanTask(tracer *metrics.PhaseTracer, task *ttlScanTask) { + ctx := metrics.CtxWithPhaseTracer(w.ctx, tracer) + result := task.doScan(ctx, w.delCh, w.sessionPool) + if result == nil { + result = task.result(nil) + } + + w.baseWorker.Lock() + w.curTaskResult = result + w.baseWorker.Unlock() + + if w.notifyStateCh != nil { + select { + case w.notifyStateCh <- &scanTaskExecEndMsg{result: result}: + default: + } + } +} + +type scanWorker interface { + worker + + CouldSchedule() bool + Schedule(*ttlScanTask) error + PollTaskResult() *ttlScanTaskExecResult + CurrentTask() *ttlScanTask +} diff --git a/ttl/ttlworker/scan_test.go b/ttl/ttlworker/scan_test.go new file mode 100644 index 0000000000000..3659ce0843617 --- /dev/null +++ b/ttl/ttlworker/scan_test.go @@ -0,0 +1,409 @@ +// 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, +// 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 ttlworker + +import ( + "context" + "fmt" + "testing" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/stretchr/testify/require" +) + +type mockScanWorker struct { + *ttlScanWorker + t *testing.T + delCh chan *ttlDeleteTask + notifyCh chan interface{} + sessPoll *mockSessionPool +} + +func NewMockScanWorker(t *testing.T) *mockScanWorker { + w := &mockScanWorker{ + t: t, + delCh: make(chan *ttlDeleteTask), + notifyCh: make(chan interface{}, 10), + sessPoll: newMockSessionPool(t), + } + + w.ttlScanWorker = newScanWorker(w.delCh, w.notifyCh, w.sessPoll) + require.Equal(t, workerStatusCreated, w.Status()) + require.False(t, w.CouldSchedule()) + result := w.PollTaskResult() + require.Nil(t, result) + return w +} + +func (w *mockScanWorker) checkWorkerStatus(status workerStatus, idle bool, curTask *ttlScanTask) { + require.Equal(w.t, status, w.status) + require.Equal(w.t, idle, w.CouldSchedule()) + require.Same(w.t, curTask, w.CurrentTask()) +} + +func (w *mockScanWorker) checkPollResult(exist bool, err string) { + curTask := w.CurrentTask() + r := w.PollTaskResult() + require.Equal(w.t, exist, r != nil) + if !exist { + require.Nil(w.t, r) + } else { + require.NotNil(w.t, r) + require.NotNil(w.t, r.task) + require.Same(w.t, curTask, r.task) + if err == "" { + require.NoError(w.t, r.err) + } else { + require.EqualError(w.t, r.err, err) + } + } +} + +func (w *mockScanWorker) waitNotifyScanTaskEnd() *scanTaskExecEndMsg { + select { + case msg := <-w.notifyCh: + endMsg, ok := msg.(*scanTaskExecEndMsg) + require.True(w.t, ok) + require.NotNil(w.t, endMsg.result) + require.Same(w.t, w.CurrentTask(), endMsg.result.task) + return endMsg + case <-time.After(10 * time.Second): + require.FailNow(w.t, "timeout") + } + + require.FailNow(w.t, "") + return nil +} + +func (w *mockScanWorker) pollDelTask() *ttlDeleteTask { + select { + case del := <-w.delCh: + require.NotNil(w.t, del) + require.NotNil(w.t, del.statistics) + require.Same(w.t, w.curTask.tbl, del.tbl) + require.Equal(w.t, w.curTask.ExpireTime, del.expire) + require.NotEqual(w.t, 0, len(del.rows)) + return del + case <-time.After(10 * time.Second): + require.FailNow(w.t, "timeout") + } + + require.FailNow(w.t, "") + return nil +} + +func (w *mockScanWorker) setOneRowResult(tbl *cache.PhysicalTable, val ...interface{}) { + w.sessPoll.se.sessionInfoSchema = newMockInfoSchema(tbl.TableInfo) + w.sessPoll.se.rows = newMockRows(w.t, tbl.KeyColumnTypes...).Append(val...).Rows() +} + +func (w *mockScanWorker) clearInfoSchema() { + w.sessPoll.se.sessionInfoSchema = newMockInfoSchema() +} + +func (w *mockScanWorker) stopWithWait() { + w.Stop() + require.NoError(w.t, w.WaitStopped(context.TODO(), 10*time.Second)) +} + +func TestScanWorkerSchedule(t *testing.T) { + origLimit := variable.TTLScanBatchSize.Load() + variable.TTLScanBatchSize.Store(5) + defer variable.TTLScanBatchSize.Store(origLimit) + + tbl := newMockTTLTbl(t, "t1") + w := NewMockScanWorker(t) + w.setOneRowResult(tbl, 7) + defer w.stopWithWait() + + task := &ttlScanTask{ + ctx: context.Background(), + tbl: tbl, + TTLTask: &cache.TTLTask{ + ExpireTime: time.UnixMilli(0), + }, + statistics: &ttlStatistics{}, + } + + require.EqualError(t, w.Schedule(task), "worker is not running") + w.checkWorkerStatus(workerStatusCreated, false, nil) + w.checkPollResult(false, "") + + w.Start() + w.checkWorkerStatus(workerStatusRunning, true, nil) + w.checkPollResult(false, "") + + require.NoError(t, w.Schedule(task)) + w.checkWorkerStatus(workerStatusRunning, false, task) + w.checkPollResult(false, "") + + require.EqualError(t, w.Schedule(task), "a task is running") + w.checkWorkerStatus(workerStatusRunning, false, task) + w.checkPollResult(false, "") + + del := w.pollDelTask() + require.Equal(t, 1, len(del.rows)) + require.Equal(t, 1, len(del.rows[0])) + require.Equal(t, int64(7), del.rows[0][0].GetInt64()) + + msg := w.waitNotifyScanTaskEnd() + require.Same(t, task, msg.result.task) + require.NoError(t, msg.result.err) + w.checkWorkerStatus(workerStatusRunning, false, task) + w.checkPollResult(true, "") + w.checkWorkerStatus(workerStatusRunning, true, nil) + w.checkPollResult(false, "") +} + +func TestScanWorkerScheduleWithFailedTask(t *testing.T) { + origLimit := variable.TTLScanBatchSize.Load() + variable.TTLScanBatchSize.Store(5) + defer variable.TTLScanBatchSize.Store(origLimit) + + tbl := newMockTTLTbl(t, "t1") + w := NewMockScanWorker(t) + w.clearInfoSchema() + defer w.stopWithWait() + + task := &ttlScanTask{ + ctx: context.Background(), + tbl: tbl, + TTLTask: &cache.TTLTask{ + ExpireTime: time.UnixMilli(0), + }, + statistics: &ttlStatistics{}, + } + + w.Start() + w.checkWorkerStatus(workerStatusRunning, true, nil) + w.checkPollResult(false, "") + + require.NoError(t, w.Schedule(task)) + w.checkWorkerStatus(workerStatusRunning, false, task) + msg := w.waitNotifyScanTaskEnd() + require.Same(t, task, msg.result.task) + require.EqualError(t, msg.result.err, "table 'test.t1' meta changed, should abort current job: [schema:1146]Table 'test.t1' doesn't exist") + w.checkWorkerStatus(workerStatusRunning, false, task) + w.checkPollResult(true, msg.result.err.Error()) + w.checkWorkerStatus(workerStatusRunning, true, nil) +} + +type mockScanTask struct { + *ttlScanTask + t *testing.T + tbl *cache.PhysicalTable + sessPool *mockSessionPool + sqlRetry []int + + delCh chan *ttlDeleteTask + prevSQL string + prevSQLRetry int + delTasks []*ttlDeleteTask + schemaChangeIdx int + schemaChangeInRetry int +} + +func newMockScanTask(t *testing.T, sqlCnt int) *mockScanTask { + tbl := newMockTTLTbl(t, "t1") + task := &mockScanTask{ + t: t, + ttlScanTask: &ttlScanTask{ + ctx: context.Background(), + tbl: tbl, + TTLTask: &cache.TTLTask{ + ExpireTime: time.UnixMilli(0), + ScanRangeStart: []types.Datum{types.NewIntDatum(0)}, + }, + statistics: &ttlStatistics{}, + }, + tbl: tbl, + delCh: make(chan *ttlDeleteTask, sqlCnt*(scanTaskExecuteSQLMaxRetry+1)), + sessPool: newMockSessionPool(t), + sqlRetry: make([]int, sqlCnt), + schemaChangeIdx: -1, + } + task.sessPool.se.executeSQL = task.execSQL + return task +} + +func (t *mockScanTask) selectSQL(i int) string { + op := ">" + if i == 0 { + op = ">=" + } + return fmt.Sprintf("SELECT LOW_PRIORITY `_tidb_rowid` FROM `test`.`t1` WHERE `_tidb_rowid` %s %d AND `time` < FROM_UNIXTIME(0) ORDER BY `_tidb_rowid` ASC LIMIT 3", op, i*100) +} + +func (t *mockScanTask) runDoScanForTest(delTaskCnt int, errString string) *ttlScanTaskExecResult { + t.ttlScanTask.statistics.Reset() + origLimit := variable.TTLScanBatchSize.Load() + variable.TTLScanBatchSize.Store(3) + origRetryInterval := scanTaskExecuteSQLRetryInterval + scanTaskExecuteSQLRetryInterval = time.Millisecond + defer func() { + variable.TTLScanBatchSize.Store(origLimit) + scanTaskExecuteSQLRetryInterval = origRetryInterval + }() + + t.sessPool.se.sessionInfoSchema = newMockInfoSchema(t.tbl.TableInfo) + t.prevSQL = "" + t.prevSQLRetry = 0 + t.sessPool.lastSession = nil + r := t.doScan(context.TODO(), t.delCh, t.sessPool) + require.NotNil(t.t, t.sessPool.lastSession) + require.True(t.t, t.sessPool.lastSession.closed) + require.Greater(t.t, t.sessPool.lastSession.resetTimeZoneCalls, 0) + require.NotNil(t.t, r) + require.Same(t.t, t.ttlScanTask, r.task) + if errString == "" { + require.NoError(t.t, r.err) + } else { + require.EqualError(t.t, r.err, errString) + } + + previousIdx := delTaskCnt + if errString == "" { + previousIdx = len(t.sqlRetry) - 1 + } + require.Equal(t.t, t.selectSQL(previousIdx), t.prevSQL) + if errString == "" { + require.Equal(t.t, t.sqlRetry[previousIdx], t.prevSQLRetry) + } else if previousIdx == t.schemaChangeIdx && t.schemaChangeInRetry <= scanTaskExecuteSQLMaxRetry { + require.Equal(t.t, t.schemaChangeInRetry, t.prevSQLRetry) + } else { + require.Equal(t.t, scanTaskExecuteSQLMaxRetry, t.prevSQLRetry) + } + t.delTasks = make([]*ttlDeleteTask, 0, len(t.sqlRetry)) +loop: + for { + select { + case del, ok := <-t.delCh: + if !ok { + break loop + } + t.delTasks = append(t.delTasks, del) + default: + break loop + } + } + + require.Equal(t.t, delTaskCnt, len(t.delTasks)) + expectTotalRows := 0 + for i, del := range t.delTasks { + require.NotNil(t.t, del) + require.NotNil(t.t, del.statistics) + require.Same(t.t, t.statistics, del.statistics) + require.Same(t.t, t.tbl, del.tbl) + require.Equal(t.t, t.ExpireTime, del.expire) + if i < len(t.sqlRetry)-1 { + require.Equal(t.t, 3, len(del.rows)) + require.Equal(t.t, 1, len(del.rows[2])) + require.Equal(t.t, int64((i+1)*100), del.rows[2][0].GetInt64()) + } else { + require.Equal(t.t, 2, len(del.rows)) + } + require.Equal(t.t, 1, len(del.rows[0])) + require.Equal(t.t, int64(i*100+1), del.rows[0][0].GetInt64()) + require.Equal(t.t, 1, len(del.rows[0])) + require.Equal(t.t, int64(i*100+2), del.rows[1][0].GetInt64()) + expectTotalRows += len(del.rows) + } + require.Equal(t.t, expectTotalRows, int(t.statistics.TotalRows.Load())) + return r +} + +func (t *mockScanTask) checkDelTasks(cnt int) { + require.Equal(t.t, cnt, len(t.delTasks)) + for i := 0; i < cnt; i++ { + del := t.delTasks[i] + require.Nil(t.t, del) + require.NotNil(t.t, del.statistics) + require.Same(t.t, t.statistics, del.statistics) + if i < 2 { + require.Equal(t.t, 3, len(del.rows)) + require.Equal(t.t, 1, len(del.rows[2])) + require.Equal(t.t, int64((i+1)*100), del.rows[2][0].GetInt64()) + } else { + require.Equal(t.t, 2, len(del.rows)) + } + require.Equal(t.t, 1, len(del.rows[0])) + require.Equal(t.t, int64(i*100+1), del.rows[0][0].GetInt64()) + require.Equal(t.t, 1, len(del.rows[0])) + require.Equal(t.t, int64(i*100+2), del.rows[1][0].GetInt64()) + } +} + +func (t *mockScanTask) execSQL(_ context.Context, sql string, _ ...interface{}) ([]chunk.Row, error) { + var i int + found := false + for i = 0; i < len(t.sqlRetry); i++ { + if sql == t.selectSQL(i) { + found = true + break + } + } + require.True(t.t, found, sql) + + curRetry := 0 + if sql == t.prevSQL { + curRetry = t.prevSQLRetry + 1 + } + + if curRetry == 0 && i > 0 { + require.Equal(t.t, t.selectSQL(i-1), t.prevSQL) + require.Equal(t.t, t.sqlRetry[i-1], t.prevSQLRetry) + } + t.prevSQL = sql + t.prevSQLRetry = curRetry + require.LessOrEqual(t.t, curRetry, t.sqlRetry[i]) + + if t.schemaChangeIdx == i && t.schemaChangeInRetry == curRetry { + t.sessPool.lastSession.sessionInfoSchema = newMockInfoSchema() + } + + if curRetry < t.sqlRetry[i] { + return nil, errors.New("mockErr") + } + + rows := newMockRows(t.t, t.tbl.KeyColumnTypes...).Append(i*100 + 1).Append(i*100 + 2) + if i < len(t.sqlRetry)-1 { + rows.Append((i + 1) * 100) + } + return rows.Rows(), nil +} + +func TestScanTaskDoScan(t *testing.T) { + task := newMockScanTask(t, 3) + task.sqlRetry[1] = scanTaskExecuteSQLMaxRetry + task.runDoScanForTest(3, "") + + task.sqlRetry[1] = scanTaskExecuteSQLMaxRetry + 1 + task.runDoScanForTest(1, "mockErr") + + task.sqlRetry[1] = scanTaskExecuteSQLMaxRetry + task.schemaChangeIdx = 1 + task.schemaChangeInRetry = 0 + task.runDoScanForTest(1, "table 'test.t1' meta changed, should abort current job: [schema:1146]Table 'test.t1' doesn't exist") + + task.sqlRetry[1] = scanTaskExecuteSQLMaxRetry + task.schemaChangeIdx = 1 + task.schemaChangeInRetry = 2 + task.runDoScanForTest(1, "table 'test.t1' meta changed, should abort current job: [schema:1146]Table 'test.t1' doesn't exist") +} diff --git a/ttl/ttlworker/session.go b/ttl/ttlworker/session.go new file mode 100644 index 0000000000000..d3e0c940e78c7 --- /dev/null +++ b/ttl/ttlworker/session.go @@ -0,0 +1,248 @@ +// 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, +// 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 ttlworker + +import ( + "context" + "fmt" + "time" + + "github.com/ngaut/pools" + "github.com/pingcap/errors" + "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/ttl/metrics" + "github.com/pingcap/tidb/ttl/session" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/sqlexec" + "go.uber.org/zap" +) + +// The following two functions are using `sqlexec.SQLExecutor` to represent session +// which is actually not correct. It's a work around for the cyclic dependency problem. +// It actually doesn't accept arbitrary SQLExecutor, but just `*session.session`, which means +// you cannot pass the `(ttl/session).Session` into it. +// Use `sqlexec.SQLExecutor` and `sessionctx.Session` or another other interface (including +// `interface{}`) here is the same, I just pick one small enough interface. +// Also, we cannot use the functions in `session/session.go` (to avoid cyclic dependency), so +// registering function here is really needed. + +// AttachStatsCollector attaches the stats collector for the session. +// this function is registered in BootstrapSession in /session/session.go +var AttachStatsCollector = func(s sqlexec.SQLExecutor) sqlexec.SQLExecutor { + return s +} + +// DetachStatsCollector removes the stats collector for the session +// this function is registered in BootstrapSession in /session/session.go +var DetachStatsCollector = func(s sqlexec.SQLExecutor) sqlexec.SQLExecutor { + return s +} + +type sessionPool interface { + Get() (pools.Resource, error) + Put(pools.Resource) +} + +func getSession(pool sessionPool) (session.Session, error) { + resource, err := pool.Get() + if err != nil { + return nil, err + } + + if se, ok := resource.(session.Session); ok { + // Only for test, in this case, the return session is mockSession + return se, nil + } + + sctx, ok := resource.(sessionctx.Context) + if !ok { + pool.Put(resource) + return nil, errors.Errorf("%T cannot be casted to sessionctx.Context", sctx) + } + + exec, ok := resource.(sqlexec.SQLExecutor) + if !ok { + pool.Put(resource) + return nil, errors.Errorf("%T cannot be casted to sqlexec.SQLExecutor", sctx) + } + + originalRetryLimit := sctx.GetSessionVars().RetryLimit + originalEnable1PC := sctx.GetSessionVars().Enable1PC + originalEnableAsyncCommit := sctx.GetSessionVars().EnableAsyncCommit + se := session.NewSession(sctx, exec, func(se session.Session) { + _, err = se.ExecuteSQL(context.Background(), fmt.Sprintf("set tidb_retry_limit=%d", originalRetryLimit)) + if err != nil { + logutil.BgLogger().Error("fail to reset tidb_retry_limit", zap.Int64("originalRetryLimit", originalRetryLimit), zap.Error(err)) + } + + if !originalEnable1PC { + _, err = se.ExecuteSQL(context.Background(), "set tidb_enable_1pc=OFF") + terror.Log(err) + } + + if !originalEnableAsyncCommit { + _, err = se.ExecuteSQL(context.Background(), "set tidb_enable_async_commit=OFF") + terror.Log(err) + } + + DetachStatsCollector(exec) + + pool.Put(resource) + }) + + exec = AttachStatsCollector(exec) + + // store and set the retry limit to 0 + _, err = se.ExecuteSQL(context.Background(), "set tidb_retry_limit=0") + if err != nil { + se.Close() + return nil, err + } + + // set enable 1pc to ON + _, err = se.ExecuteSQL(context.Background(), "set tidb_enable_1pc=ON") + if err != nil { + se.Close() + return nil, err + } + + // set enable async commit to ON + _, err = se.ExecuteSQL(context.Background(), "set tidb_enable_async_commit=ON") + if err != nil { + se.Close() + return nil, err + } + + // Force rollback the session to guarantee the session is not in any explicit transaction + if _, err = se.ExecuteSQL(context.Background(), "ROLLBACK"); err != nil { + se.Close() + return nil, err + } + + return se, nil +} + +func newTableSession(se session.Session, tbl *cache.PhysicalTable, expire time.Time) *ttlTableSession { + return &ttlTableSession{ + Session: se, + tbl: tbl, + expire: expire, + } +} + +type ttlTableSession struct { + session.Session + tbl *cache.PhysicalTable + expire time.Time +} + +func (s *ttlTableSession) ExecuteSQLWithCheck(ctx context.Context, sql string) ([]chunk.Row, bool, error) { + tracer := metrics.PhaseTracerFromCtx(ctx) + defer tracer.EnterPhase(tracer.Phase()) + + tracer.EnterPhase(metrics.PhaseOther) + if !variable.EnableTTLJob.Load() { + return nil, false, errors.New("global TTL job is disabled") + } + + if err := s.ResetWithGlobalTimeZone(ctx); err != nil { + return nil, false, err + } + + var result []chunk.Row + shouldRetry := true + err := s.RunInTxn(ctx, func() error { + tracer.EnterPhase(metrics.PhaseQuery) + defer tracer.EnterPhase(tracer.Phase()) + rows, err := s.ExecuteSQL(ctx, sql) + tracer.EnterPhase(metrics.PhaseCheckTTL) + // We must check the configuration after ExecuteSQL because of MDL and the meta the current transaction used + // can only be determined after executed one query. + if validateErr := validateTTLWork(ctx, s.Session, s.tbl, s.expire); validateErr != nil { + shouldRetry = false + return errors.Annotatef(validateErr, "table '%s.%s' meta changed, should abort current job", s.tbl.Schema, s.tbl.Name) + } + + if err != nil { + return err + } + + result = rows + return nil + }, session.TxnModeOptimistic) + + if err != nil { + return nil, shouldRetry, err + } + + return result, false, nil +} + +func validateTTLWork(ctx context.Context, s session.Session, tbl *cache.PhysicalTable, expire time.Time) error { + curTbl, err := s.SessionInfoSchema().TableByName(tbl.Schema, tbl.Name) + if err != nil { + return err + } + + newTblInfo := curTbl.Meta() + if tbl.TableInfo == newTblInfo { + return nil + } + + if tbl.TableInfo.ID != newTblInfo.ID { + return errors.New("table id changed") + } + + newTTLTbl, err := cache.NewPhysicalTable(tbl.Schema, newTblInfo, tbl.Partition) + if err != nil { + return err + } + + if newTTLTbl.ID != tbl.ID { + return errors.New("physical id changed") + } + + if tbl.Partition.L != "" { + if newTTLTbl.PartitionDef.Name.L != tbl.PartitionDef.Name.L { + return errors.New("partition name changed") + } + } + + if !newTTLTbl.TTLInfo.Enable { + return errors.New("table TTL disabled") + } + + if newTTLTbl.TimeColumn.Name.L != tbl.TimeColumn.Name.L { + return errors.New("time column name changed") + } + + if newTblInfo.TTLInfo.IntervalExprStr != tbl.TTLInfo.IntervalExprStr || + newTblInfo.TTLInfo.IntervalTimeUnit != tbl.TTLInfo.IntervalTimeUnit { + newExpireTime, err := newTTLTbl.EvalExpireTime(ctx, s, s.Now()) + if err != nil { + return err + } + + if newExpireTime.Before(expire) { + return errors.New("expire interval changed") + } + } + + return nil +} diff --git a/ttl/ttlworker/session_test.go b/ttl/ttlworker/session_test.go new file mode 100644 index 0000000000000..335f6a5701a99 --- /dev/null +++ b/ttl/ttlworker/session_test.go @@ -0,0 +1,354 @@ +// 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, +// 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 ttlworker + +import ( + "context" + "errors" + "strings" + "testing" + "time" + + "github.com/ngaut/pools" + "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/ttl/session" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/stretchr/testify/require" +) + +func newMockTTLTbl(t *testing.T, name string) *cache.PhysicalTable { + tblInfo := &model.TableInfo{ + Name: model.NewCIStr(name), + Columns: []*model.ColumnInfo{ + { + ID: 1, + Name: model.NewCIStr("time"), + Offset: 0, + FieldType: *types.NewFieldType(mysql.TypeDatetime), + State: model.StatePublic, + }, + }, + TTLInfo: &model.TTLInfo{ + ColumnName: model.NewCIStr("time"), + IntervalExprStr: "1", + IntervalTimeUnit: int(ast.TimeUnitSecond), + Enable: true, + JobInterval: "1h", + }, + State: model.StatePublic, + } + + tbl, err := cache.NewPhysicalTable(model.NewCIStr("test"), tblInfo, model.NewCIStr("")) + require.NoError(t, err) + return tbl +} + +func newMockInfoSchema(tbl ...*model.TableInfo) infoschema.InfoSchema { + return infoschema.MockInfoSchema(tbl) +} + +type mockRows struct { + t *testing.T + fieldTypes []*types.FieldType + *chunk.Chunk +} + +func newMockRows(t *testing.T, fieldTypes ...*types.FieldType) *mockRows { + return &mockRows{ + t: t, + fieldTypes: fieldTypes, + Chunk: chunk.NewChunkWithCapacity(fieldTypes, 8), + } +} + +func (r *mockRows) Append(row ...interface{}) *mockRows { + require.Equal(r.t, len(r.fieldTypes), len(row)) + for i, ft := range r.fieldTypes { + tp := ft.GetType() + switch tp { + case mysql.TypeTimestamp, mysql.TypeDate, mysql.TypeDatetime: + tm, ok := row[i].(time.Time) + require.True(r.t, ok) + r.AppendTime(i, types.NewTime(types.FromGoTime(tm), tp, types.DefaultFsp)) + case mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong: + val, ok := row[i].(int) + require.True(r.t, ok) + r.AppendInt64(i, int64(val)) + default: + require.FailNow(r.t, "unsupported tp %v", tp) + } + } + return r +} + +func (r *mockRows) Rows() []chunk.Row { + rows := make([]chunk.Row, r.NumRows()) + for i := 0; i < r.NumRows(); i++ { + rows[i] = r.GetRow(i) + } + return rows +} + +type mockSessionPool struct { + t *testing.T + se *mockSession + lastSession *mockSession +} + +func (p *mockSessionPool) Get() (pools.Resource, error) { + se := *(p.se) + p.lastSession = &se + return p.lastSession, nil +} + +func (p *mockSessionPool) Put(pools.Resource) {} + +func newMockSessionPool(t *testing.T, tbl ...*cache.PhysicalTable) *mockSessionPool { + return &mockSessionPool{ + se: newMockSession(t, tbl...), + } +} + +type mockSession struct { + t *testing.T + sessionctx.Context + sessionVars *variable.SessionVars + sessionInfoSchema infoschema.InfoSchema + executeSQL func(ctx context.Context, sql string, args ...interface{}) ([]chunk.Row, error) + rows []chunk.Row + execErr error + evalExpire time.Time + resetTimeZoneCalls int + closed bool + commitErr error +} + +func newMockSession(t *testing.T, tbl ...*cache.PhysicalTable) *mockSession { + tbls := make([]*model.TableInfo, len(tbl)) + for i, ttlTbl := range tbl { + tbls[i] = ttlTbl.TableInfo + } + sessVars := variable.NewSessionVars(nil) + sessVars.TimeZone = time.UTC + return &mockSession{ + t: t, + sessionInfoSchema: newMockInfoSchema(tbls...), + evalExpire: time.Now(), + sessionVars: sessVars, + } +} + +func (s *mockSession) GetDomainInfoSchema() sessionctx.InfoschemaMetaVersion { + return s.sessionInfoSchema +} + +func (s *mockSession) SessionInfoSchema() infoschema.InfoSchema { + require.False(s.t, s.closed) + return s.sessionInfoSchema +} + +func (s *mockSession) GetSessionVars() *variable.SessionVars { + require.False(s.t, s.closed) + return s.sessionVars +} + +func (s *mockSession) ExecuteSQL(ctx context.Context, sql string, args ...interface{}) ([]chunk.Row, error) { + require.False(s.t, s.closed) + if strings.HasPrefix(strings.ToUpper(sql), "SELECT FROM_UNIXTIME") { + return newMockRows(s.t, types.NewFieldType(mysql.TypeTimestamp)).Append(s.evalExpire.In(s.GetSessionVars().TimeZone)).Rows(), nil + } + + if strings.HasPrefix(strings.ToUpper(sql), "SET ") { + return nil, nil + } + + if s.executeSQL != nil { + return s.executeSQL(ctx, sql, args...) + } + return s.rows, s.execErr +} + +func (s *mockSession) RunInTxn(_ context.Context, fn func() error, _ session.TxnMode) error { + require.False(s.t, s.closed) + if err := fn(); err != nil { + return err + } + return s.commitErr +} + +func (s *mockSession) ResetWithGlobalTimeZone(_ context.Context) (err error) { + require.False(s.t, s.closed) + s.resetTimeZoneCalls++ + return nil +} + +func (s *mockSession) Close() { + s.closed = true +} + +func (s *mockSession) Now() time.Time { + tz := s.sessionVars.TimeZone + if tz != nil { + tz = time.UTC + } + return time.Now().In(tz) +} + +func TestExecuteSQLWithCheck(t *testing.T) { + ctx := context.TODO() + tbl := newMockTTLTbl(t, "t1") + s := newMockSession(t, tbl) + s.execErr = errors.New("mockErr") + s.rows = newMockRows(t, types.NewFieldType(mysql.TypeInt24)).Append(12).Rows() + tblSe := newTableSession(s, tbl, time.UnixMilli(0).In(time.UTC)) + + rows, shouldRetry, err := tblSe.ExecuteSQLWithCheck(ctx, "select 1") + require.EqualError(t, err, "mockErr") + require.True(t, shouldRetry) + require.Nil(t, rows) + require.Equal(t, 1, s.resetTimeZoneCalls) + + s.sessionInfoSchema = newMockInfoSchema() + rows, shouldRetry, err = tblSe.ExecuteSQLWithCheck(ctx, "select 1") + require.EqualError(t, err, "table 'test.t1' meta changed, should abort current job: [schema:1146]Table 'test.t1' doesn't exist") + require.False(t, shouldRetry) + require.Nil(t, rows) + require.Equal(t, 2, s.resetTimeZoneCalls) + + s.sessionInfoSchema = newMockInfoSchema(tbl.TableInfo) + s.execErr = nil + rows, shouldRetry, err = tblSe.ExecuteSQLWithCheck(ctx, "select 1") + require.NoError(t, err) + require.False(t, shouldRetry) + require.Equal(t, 1, len(rows)) + require.Equal(t, int64(12), rows[0].GetInt64(0)) + require.Equal(t, 3, s.resetTimeZoneCalls) + + s.commitErr = errors.New("mockCommitErr") + rows, shouldRetry, err = tblSe.ExecuteSQLWithCheck(ctx, "select 1") + require.EqualError(t, err, "mockCommitErr") + require.True(t, shouldRetry) + require.Nil(t, rows) + require.Equal(t, 4, s.resetTimeZoneCalls) +} + +func TestValidateTTLWork(t *testing.T) { + ctx := context.TODO() + tbl := newMockTTLTbl(t, "t1") + expire := time.UnixMilli(0).In(time.UTC) + + s := newMockSession(t, tbl) + s.execErr = errors.New("mockErr") + s.evalExpire = time.UnixMilli(0).In(time.UTC) + + // test table dropped + s.sessionInfoSchema = newMockInfoSchema() + err := validateTTLWork(ctx, s, tbl, expire) + require.EqualError(t, err, "[schema:1146]Table 'test.t1' doesn't exist") + + // test TTL option removed + tbl2 := tbl.TableInfo.Clone() + tbl2.TTLInfo = nil + s.sessionInfoSchema = newMockInfoSchema(tbl2) + err = validateTTLWork(ctx, s, tbl, expire) + require.EqualError(t, err, "table 'test.t1' is not a ttl table") + + // test table state not public + tbl2 = tbl.TableInfo.Clone() + tbl2.State = model.StateDeleteOnly + s.sessionInfoSchema = newMockInfoSchema(tbl2) + err = validateTTLWork(ctx, s, tbl, expire) + require.EqualError(t, err, "table 'test.t1' is not a public table") + + // test table name changed + tbl2 = tbl.TableInfo.Clone() + tbl2.Name = model.NewCIStr("testcc") + s.sessionInfoSchema = newMockInfoSchema(tbl2) + err = validateTTLWork(ctx, s, tbl, expire) + require.EqualError(t, err, "[schema:1146]Table 'test.t1' doesn't exist") + + // test table id changed + tbl2 = tbl.TableInfo.Clone() + tbl2.ID = 123 + s.sessionInfoSchema = newMockInfoSchema(tbl2) + err = validateTTLWork(ctx, s, tbl, expire) + require.EqualError(t, err, "table id changed") + + // test time column name changed + tbl2 = tbl.TableInfo.Clone() + tbl2.Columns[0] = tbl2.Columns[0].Clone() + tbl2.Columns[0].Name = model.NewCIStr("time2") + tbl2.TTLInfo.ColumnName = model.NewCIStr("time2") + s.sessionInfoSchema = newMockInfoSchema(tbl2) + err = validateTTLWork(ctx, s, tbl, expire) + require.EqualError(t, err, "time column name changed") + + // test interval changed and expire time before previous + tbl2 = tbl.TableInfo.Clone() + tbl2.TTLInfo.IntervalExprStr = "10" + s.sessionInfoSchema = newMockInfoSchema(tbl2) + s.evalExpire = time.UnixMilli(-1) + err = validateTTLWork(ctx, s, tbl, expire) + require.EqualError(t, err, "expire interval changed") + + tbl2 = tbl.TableInfo.Clone() + tbl2.TTLInfo.IntervalTimeUnit = int(ast.TimeUnitDay) + s.evalExpire = time.UnixMilli(-1) + s.sessionInfoSchema = newMockInfoSchema(tbl2) + err = validateTTLWork(ctx, s, tbl, expire) + require.EqualError(t, err, "expire interval changed") + + // test for safe meta change + tbl2 = tbl.TableInfo.Clone() + tbl2.Columns[0] = tbl2.Columns[0].Clone() + tbl2.Columns[0].ID += 10 + tbl2.Columns[0].FieldType = *types.NewFieldType(mysql.TypeDate) + tbl2.TTLInfo.IntervalExprStr = "100" + s.evalExpire = time.UnixMilli(1000) + s.sessionInfoSchema = newMockInfoSchema(tbl2) + err = validateTTLWork(ctx, s, tbl, expire) + require.NoError(t, err) + + // test table partition name changed + tp := tbl.TableInfo.Clone() + tp.Partition = &model.PartitionInfo{ + Definitions: []model.PartitionDefinition{ + {ID: 1023, Name: model.NewCIStr("p0")}, + }, + } + tbl, err = cache.NewPhysicalTable(model.NewCIStr("test"), tp, model.NewCIStr("p0")) + require.NoError(t, err) + tbl2 = tp.Clone() + tbl2.Partition = tp.Partition.Clone() + tbl2.Partition.Definitions[0].Name = model.NewCIStr("p1") + s.sessionInfoSchema = newMockInfoSchema(tbl2) + err = validateTTLWork(ctx, s, tbl, expire) + require.EqualError(t, err, "partition 'p0' is not found in ttl table 'test.t1'") + + // test table partition id changed + tbl2 = tp.Clone() + tbl2.Partition = tp.Partition.Clone() + tbl2.Partition.Definitions[0].ID += 100 + s.sessionInfoSchema = newMockInfoSchema(tbl2) + err = validateTTLWork(ctx, s, tbl, expire) + require.EqualError(t, err, "physical id changed") +} diff --git a/ttl/ttlworker/task_manager.go b/ttl/ttlworker/task_manager.go new file mode 100644 index 0000000000000..4abd2d0098924 --- /dev/null +++ b/ttl/ttlworker/task_manager.go @@ -0,0 +1,521 @@ +// Copyright 2023 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 ttlworker + +import ( + "context" + "encoding/json" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/ttl/metrics" + "github.com/pingcap/tidb/ttl/session" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/multierr" + "go.uber.org/zap" +) + +const setTTLTaskOwnerTemplate = `UPDATE mysql.tidb_ttl_task + SET owner_id = %?, + owner_hb_time = %?, + status = 'running', + status_update_time = %? + WHERE job_id = %? AND scan_id = %?` + +func setTTLTaskOwnerSQL(jobID string, scanID int64, id string, now time.Time) (string, []interface{}) { + return setTTLTaskOwnerTemplate, []interface{}{id, now.Format(timeFormat), now.Format(timeFormat), jobID, scanID} +} + +const setTTLTaskFinishedTemplate = `UPDATE mysql.tidb_ttl_task + SET status = 'finished', + status_update_time = %?, + state = %? + WHERE job_id = %? AND scan_id = %?` + +func setTTLTaskFinishedSQL(jobID string, scanID int64, state *cache.TTLTaskState, now time.Time) (string, []interface{}, error) { + stateStr, err := json.Marshal(state) + if err != nil { + return "", nil, err + } + return setTTLTaskFinishedTemplate, []interface{}{now.Format(timeFormat), string(stateStr), jobID, scanID}, nil +} + +const updateTTLTaskHeartBeatTempalte = `UPDATE mysql.tidb_ttl_task + SET state = %?, + owner_hb_time = %? + WHERE job_id = %? AND scan_id = %?` + +func updateTTLTaskHeartBeatSQL(jobID string, scanID int64, now time.Time, state *cache.TTLTaskState) (string, []interface{}, error) { + stateStr, err := json.Marshal(state) + if err != nil { + return "", nil, err + } + return updateTTLTaskHeartBeatTempalte, []interface{}{string(stateStr), now.Format(timeFormat), jobID, scanID}, nil +} + +// taskManager schedules and manages the ttl tasks on this instance +type taskManager struct { + ctx context.Context + sessPool sessionPool + + id string + + scanWorkers []worker + delWorkers []worker + + infoSchemaCache *cache.InfoSchemaCache + runningTasks []*runningScanTask + + delCh chan *ttlDeleteTask + notifyStateCh chan interface{} +} + +func newTaskManager(ctx context.Context, sessPool sessionPool, infoSchemaCache *cache.InfoSchemaCache, id string) *taskManager { + return &taskManager{ + ctx: logutil.WithKeyValue(ctx, "ttl-worker", "task-manager"), + sessPool: sessPool, + + id: id, + + scanWorkers: []worker{}, + delWorkers: []worker{}, + + infoSchemaCache: infoSchemaCache, + runningTasks: []*runningScanTask{}, + + delCh: make(chan *ttlDeleteTask), + notifyStateCh: make(chan interface{}, 1), + } +} + +func (m *taskManager) resizeWorkersWithSysVar() { + err := m.resizeScanWorkers(int(variable.TTLScanWorkerCount.Load())) + if err != nil { + logutil.Logger(m.ctx).Warn("fail to resize scan workers", zap.Error(err)) + } + err = m.resizeDelWorkers(int(variable.TTLDeleteWorkerCount.Load())) + if err != nil { + logutil.Logger(m.ctx).Warn("fail to resize delete workers", zap.Error(err)) + } +} + +func (m *taskManager) resizeScanWorkers(count int) error { + var err error + var canceledWorkers []worker + m.scanWorkers, canceledWorkers, err = m.resizeWorkers(m.scanWorkers, count, func() worker { + return newScanWorker(m.delCh, m.notifyStateCh, m.sessPool) + }) + for _, w := range canceledWorkers { + s := w.(scanWorker) + + var jobID string + var scanID int64 + var scanErr error + result := s.PollTaskResult() + if result != nil { + jobID = result.task.JobID + scanID = result.task.ScanID + + scanErr = result.err + } else { + // if the scan worker failed to poll the task, it's possible that the `WaitStopped` has timeout + // we still consider the scan task as finished + curTask := s.CurrentTask() + if curTask == nil { + continue + } + jobID = curTask.JobID + scanID = curTask.ScanID + scanErr = errors.New("timeout to cancel scan task") + } + + task := findTaskWithID(m.runningTasks, jobID, scanID) + if task == nil { + logutil.Logger(m.ctx).Warn("task state changed but job not found", zap.String("jobID", jobID), zap.Int64("scanID", scanID)) + continue + } + logutil.Logger(m.ctx).Debug("scan task finished", zap.String("jobID", task.JobID), zap.Int64("taskID", task.ScanID), zap.Error(scanErr)) + + task.result = result + } + return err +} + +func findTaskWithID(tasks []*runningScanTask, jobID string, scanID int64) *runningScanTask { + for _, t := range tasks { + if t.ScanID == scanID && t.JobID == jobID { + return t + } + } + + return nil +} + +func (m *taskManager) resizeDelWorkers(count int) error { + var err error + m.delWorkers, _, err = m.resizeWorkers(m.delWorkers, count, func() worker { + return newDeleteWorker(m.delCh, m.sessPool) + }) + return err +} + +// resizeWorkers scales the worker, and returns the full set of workers as the first return value. If there are workers +// stopped, return the stopped worker in the second return value +func (m *taskManager) resizeWorkers(workers []worker, count int, factory func() worker) ([]worker, []worker, error) { + if count < len(workers) { + logutil.Logger(m.ctx).Info("shrink ttl worker", zap.Int("originalCount", len(workers)), zap.Int("newCount", count)) + + for _, w := range workers[count:] { + w.Stop() + } + + var errs error + // don't use `m.ctx` here, because when shutdown the server, `m.ctx` has already been cancelled + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + for _, w := range workers[count:] { + err := w.WaitStopped(ctx, 30*time.Second) + if err != nil { + logutil.Logger(m.ctx).Warn("fail to stop ttl worker", zap.Error(err)) + errs = multierr.Append(errs, err) + } + } + cancel() + + // remove the existing workers, and keep the left workers + return workers[:count], workers[count:], errs + } + + if count > len(workers) { + logutil.Logger(m.ctx).Info("scale ttl worker", zap.Int("originalCount", len(workers)), zap.Int("newCount", count)) + + for i := len(workers); i < count; i++ { + w := factory() + w.Start() + workers = append(workers, w) + } + return workers, nil, nil + } + + return workers, nil, nil +} + +// handleScanFinishedTask polls the result from scan worker and returns whether there are result polled +func (m *taskManager) handleScanFinishedTask() bool { + results := m.pollScanWorkerResults() + for _, result := range results { + logger := logutil.Logger(m.ctx).With(zap.Int64("tableID", result.task.tbl.ID), zap.String("jobID", result.task.JobID), zap.Int64("scanID", result.task.ScanID)) + if result.err != nil { + logger = logger.With(zap.Error(result.err)) + } + + task := findTaskWithID(m.runningTasks, result.task.JobID, result.task.ScanID) + if task == nil { + logger.Warn("task state changed but task not found") + continue + } + logger.Info("task scans finished") + task.result = result + } + + return len(results) > 0 +} + +func (m *taskManager) pollScanWorkerResults() []*ttlScanTaskExecResult { + results := make([]*ttlScanTaskExecResult, 0, len(m.scanWorkers)) + for _, w := range m.scanWorkers { + worker := w.(scanWorker) + result := worker.PollTaskResult() + if result != nil { + results = append(results, result) + } + } + + return results +} + +func (m *taskManager) idleScanWorkers() []scanWorker { + workers := make([]scanWorker, 0, len(m.scanWorkers)) + for _, w := range m.scanWorkers { + if w.(scanWorker).CouldSchedule() { + workers = append(workers, w.(scanWorker)) + } + } + return workers +} + +func (m *taskManager) rescheduleTasks(se session.Session, now time.Time) { + idleScanWorkers := m.idleScanWorkers() + if len(idleScanWorkers) == 0 { + return + } + + tasks, err := m.peekWaitingScanTasks(se, now) + if err != nil { + logutil.Logger(m.ctx).Warn("fail to peek scan task", zap.Error(err)) + return + } + + for _, t := range tasks { + logger := logutil.Logger(m.ctx).With(zap.String("jobID", t.JobID), zap.Int64("scanID", t.ScanID)) + + task, err := m.lockScanTask(se, t, now) + if err != nil { + // If other nodes lock the task, it will return an error. It's expected + // so the log level is only `info` + logutil.Logger(m.ctx).Info("fail to lock scan task", zap.Error(err)) + continue + } + + idleWorker := idleScanWorkers[0] + idleScanWorkers = idleScanWorkers[1:] + + err = idleWorker.Schedule(task.ttlScanTask) + if err != nil { + logger.Warn("fail to schedule task", zap.Error(err)) + continue + } + + logger.Info("scheduled ttl task") + m.runningTasks = append(m.runningTasks, task) + + if len(idleScanWorkers) == 0 { + return + } + } +} + +func (m *taskManager) peekWaitingScanTasks(se session.Session, now time.Time) ([]*cache.TTLTask, error) { + sql, args := cache.PeekWaitingTTLTask(now.Add(-2 * ttlTaskHeartBeatTickerInterval)) + rows, err := se.ExecuteSQL(m.ctx, sql, args...) + if err != nil { + return nil, errors.Wrapf(err, "execute sql: %s", sql) + } + + tasks := make([]*cache.TTLTask, 0, len(rows)) + for _, r := range rows { + task, err := cache.RowToTTLTask(se, r) + if err != nil { + return nil, err + } + tasks = append(tasks, task) + } + + return tasks, nil +} + +func (m *taskManager) lockScanTask(se session.Session, task *cache.TTLTask, now time.Time) (*runningScanTask, error) { + ctx := m.ctx + + table, ok := m.infoSchemaCache.Tables[task.TableID] + if !ok { + return nil, errors.Errorf("didn't find table with id: %d", task.TableID) + } + + err := se.RunInTxn(ctx, func() error { + var err error + + task, err = m.syncTaskFromTable(se, task.JobID, task.ScanID, true) + if err != nil { + return err + } + if task.OwnerID != "" && !task.OwnerHBTime.Add(2*jobManagerLoopTickerInterval).Before(now) { + return errors.New("task is already scheduled") + } + + sql, args := setTTLTaskOwnerSQL(task.JobID, task.ScanID, m.id, now) + _, err = se.ExecuteSQL(ctx, sql, args...) + if err != nil { + return errors.Wrapf(err, "execute sql: %s", sql) + } + + return nil + }, session.TxnModePessimistic) + if err != nil { + return nil, err + } + + // update the task after setting status and owner + task, err = m.syncTaskFromTable(se, task.JobID, task.ScanID, false) + if err != nil { + return nil, err + } + + ctx, cancel := context.WithCancel(m.ctx) + scanTask := &ttlScanTask{ + ctx: ctx, + + TTLTask: task, + + tbl: table, + statistics: &ttlStatistics{}, + } + return &runningScanTask{ + scanTask, + cancel, + nil, + }, nil +} + +func (m *taskManager) syncTaskFromTable(se session.Session, jobID string, scanID int64, detectLock bool) (*cache.TTLTask, error) { + ctx := m.ctx + + sql, args := cache.SelectFromTTLTaskWithID(jobID, scanID) + if detectLock { + sql += " FOR UPDATE NOWAIT" + } + rows, err := se.ExecuteSQL(ctx, sql, args...) + if err != nil { + return nil, errors.Wrapf(err, "execute sql: %s", sql) + } + if len(rows) == 0 { + return nil, errors.Errorf("didn't find task with jobID: %s, scanID: %d", jobID, scanID) + } + task, err := cache.RowToTTLTask(se, rows[0]) + if err != nil { + return nil, err + } + + return task, nil +} + +// updateHeartBeat updates the heartbeat for all tasks with current instance as owner +func (m *taskManager) updateHeartBeat(ctx context.Context, se session.Session, now time.Time) error { + for _, task := range m.runningTasks { + state := &cache.TTLTaskState{ + TotalRows: task.statistics.TotalRows.Load(), + SuccessRows: task.statistics.SuccessRows.Load(), + ErrorRows: task.statistics.ErrorRows.Load(), + } + if task.result != nil && task.result.err != nil { + state.ScanTaskErr = task.result.err.Error() + } + + sql, args, err := updateTTLTaskHeartBeatSQL(task.JobID, task.ScanID, now, state) + if err != nil { + return err + } + _, err = se.ExecuteSQL(ctx, sql, args...) + if err != nil { + return errors.Wrapf(err, "execute sql: %s", sql) + } + } + return nil +} + +func (m *taskManager) checkFinishedTask(se session.Session, now time.Time) { + stillRunningTasks := make([]*runningScanTask, 0, len(m.runningTasks)) + for _, task := range m.runningTasks { + if !task.finished() { + stillRunningTasks = append(stillRunningTasks, task) + continue + } + err := m.reportTaskFinished(se, now, task) + if err != nil { + logutil.Logger(m.ctx).Error("fail to report finished task", zap.Error(err)) + stillRunningTasks = append(stillRunningTasks, task) + continue + } + } + + m.runningTasks = stillRunningTasks +} + +func (m *taskManager) reportTaskFinished(se session.Session, now time.Time, task *runningScanTask) error { + state := &cache.TTLTaskState{ + TotalRows: task.statistics.TotalRows.Load(), + SuccessRows: task.statistics.SuccessRows.Load(), + ErrorRows: task.statistics.ErrorRows.Load(), + } + if task.result.err != nil { + state.ScanTaskErr = task.result.err.Error() + } + + sql, args, err := setTTLTaskFinishedSQL(task.JobID, task.ScanID, state, now) + if err != nil { + return err + } + task.Status = cache.TaskStatusFinished + + timeoutCtx, cancel := context.WithTimeout(m.ctx, ttlInternalSQLTimeout) + _, err = se.ExecuteSQL(timeoutCtx, sql, args...) + cancel() + if err != nil { + return err + } + + return nil +} + +// checkInvalidTask removes the task whose owner is not myself or which has disappeared +func (m *taskManager) checkInvalidTask(se session.Session) { + // TODO: optimize this function through cache or something else + ownRunningTask := make([]*runningScanTask, 0, len(m.runningTasks)) + + for _, task := range m.runningTasks { + sql, args := cache.SelectFromTTLTaskWithID(task.JobID, task.ScanID) + + timeoutCtx, cancel := context.WithTimeout(m.ctx, ttlInternalSQLTimeout) + rows, err := se.ExecuteSQL(timeoutCtx, sql, args...) + cancel() + if err != nil { + logutil.Logger(m.ctx).Warn("fail to execute sql", zap.String("sql", sql), zap.Any("args", args), zap.Error(err)) + task.cancel() + continue + } + if len(rows) == 0 { + logutil.Logger(m.ctx).Warn("didn't find task", zap.String("jobID", task.JobID), zap.Int64("scanID", task.ScanID)) + task.cancel() + continue + } + t, err := cache.RowToTTLTask(se, rows[0]) + if err != nil { + logutil.Logger(m.ctx).Warn("fail to get task", zap.Error(err)) + task.cancel() + continue + } + + if t.OwnerID == m.id { + ownRunningTask = append(ownRunningTask, task) + } + } + + m.runningTasks = ownRunningTask +} + +func (m *taskManager) reportMetrics() { + scanningTaskCnt := 0 + deletingTaskCnt := 0 + for _, task := range m.runningTasks { + if task.result != nil { + scanningTaskCnt += 1 + } else { + deletingTaskCnt += 1 + } + } + metrics.ScanningTaskCnt.Set(float64(scanningTaskCnt)) + metrics.DeletingTaskCnt.Set(float64(deletingTaskCnt)) +} + +type runningScanTask struct { + *ttlScanTask + cancel func() + result *ttlScanTaskExecResult +} + +func (t *runningScanTask) finished() bool { + return t.result != nil && t.statistics.TotalRows.Load() == t.statistics.ErrorRows.Load()+t.statistics.SuccessRows.Load() +} diff --git a/ttl/ttlworker/task_manager_integration_test.go b/ttl/ttlworker/task_manager_integration_test.go new file mode 100644 index 0000000000000..19bf25fd3b1d6 --- /dev/null +++ b/ttl/ttlworker/task_manager_integration_test.go @@ -0,0 +1,267 @@ +// Copyright 2023 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 ttlworker_test + +import ( + "context" + "fmt" + "sync" + "testing" + "time" + + "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/ttl/metrics" + "github.com/pingcap/tidb/ttl/ttlworker" + "github.com/pingcap/tidb/util/logutil" + dto "github.com/prometheus/client_model/go" + "github.com/stretchr/testify/require" + "go.uber.org/atomic" + "go.uber.org/zap" +) + +func TestParallelLockNewTask(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnTTL) + tk.MustExec("create table test.t (id int, created_at datetime) TTL= created_at + interval 1 hour") + testTable, err := tk.Session().GetDomainInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + + sessionFactory := sessionFactory(t, store) + se := sessionFactory() + + now := time.Now() + + isc := cache.NewInfoSchemaCache(time.Minute) + require.NoError(t, isc.Update(se)) + m := ttlworker.NewTaskManager(context.Background(), nil, isc, "test-id") + + // insert and lock a new task + sql, args, err := cache.InsertIntoTTLTask(tk.Session(), "test-job", testTable.Meta().ID, 1, nil, nil, now, now) + require.NoError(t, err) + _, err = tk.Session().ExecuteInternal(ctx, sql, args...) + require.NoError(t, err) + _, err = m.LockScanTask(se, &cache.TTLTask{ + ScanID: 1, + JobID: "test-job", + TableID: testTable.Meta().ID, + }, now) + require.NoError(t, err) + tk.MustExec("DELETE FROM mysql.tidb_ttl_task") + + // lock one table in parallel, only one of them should lock successfully + testTimes := 100 + concurrency := 5 + for i := 0; i < testTimes; i++ { + sql, args, err := cache.InsertIntoTTLTask(tk.Session(), "test-job", testTable.Meta().ID, 1, nil, nil, now, now) + require.NoError(t, err) + _, err = tk.Session().ExecuteInternal(ctx, sql, args...) + require.NoError(t, err) + + successCounter := atomic.NewUint64(0) + + now = now.Add(time.Hour * 48) + + wg := sync.WaitGroup{} + for j := 0; j < concurrency; j++ { + scanManagerID := fmt.Sprintf("test-ttl-manager-%d", j) + wg.Add(1) + go func() { + se := sessionFactory() + + isc := cache.NewInfoSchemaCache(time.Minute) + require.NoError(t, isc.Update(se)) + m := ttlworker.NewTaskManager(context.Background(), nil, isc, scanManagerID) + + _, err := m.LockScanTask(se, &cache.TTLTask{ + ScanID: 1, + JobID: "test-job", + TableID: testTable.Meta().ID, + }, now) + if err == nil { + successCounter.Add(1) + } else { + logutil.BgLogger().Info("lock new task with error", zap.Error(err)) + } + wg.Done() + }() + } + wg.Wait() + + require.Equal(t, uint64(1), successCounter.Load()) + tk.MustExec("DELETE FROM mysql.tidb_ttl_task") + } +} + +func TestParallelSchedule(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + waitAndStopTTLManager(t, dom) + tk := testkit.NewTestKit(t, store) + sessionFactory := sessionFactory(t, store) + + tk.MustExec("create table test.t(id int, created_at datetime) ttl=created_at + interval 1 day") + table, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + // 16 tasks and 16 scan workers (in 4 task manager) should be able to be scheduled in a single "reschedule" + for i := 0; i < 16; i++ { + sql := fmt.Sprintf("insert into mysql.tidb_ttl_task(job_id,table_id,scan_id,expire_time,created_time) values ('test-job', %d, %d, NOW(), NOW())", table.Meta().ID, i) + tk.MustExec(sql) + } + isc := cache.NewInfoSchemaCache(time.Second) + require.NoError(t, isc.Update(sessionFactory())) + now := time.Now() + scheduleWg := sync.WaitGroup{} + for i := 0; i < 4; i++ { + workers := []ttlworker.Worker{} + for j := 0; j < 4; j++ { + scanWorker := ttlworker.NewMockScanWorker(t) + scanWorker.Start() + workers = append(workers, scanWorker) + } + + m := ttlworker.NewTaskManager(context.Background(), nil, isc, fmt.Sprintf("task-manager-%d", i)) + m.SetScanWorkers4Test(workers) + scheduleWg.Add(1) + go func() { + se := sessionFactory() + m.RescheduleTasks(se, now) + scheduleWg.Done() + }() + } + scheduleWg.Wait() + // all tasks should have been scheduled + tk.MustQuery("select count(1) from mysql.tidb_ttl_task where status = 'running'").Check(testkit.Rows("16")) + for i := 0; i < 4; i++ { + sql := fmt.Sprintf("select count(1) from mysql.tidb_ttl_task where status = 'running' AND owner_id = 'task-manager-%d'", i) + tk.MustQuery(sql).Check(testkit.Rows("4")) + } +} + +func TestTaskScheduleExpireHeartBeat(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + waitAndStopTTLManager(t, dom) + tk := testkit.NewTestKit(t, store) + sessionFactory := sessionFactory(t, store) + + // create table and scan task + tk.MustExec("create table test.t(id int, created_at datetime) ttl=created_at + interval 1 day") + table, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + sql := fmt.Sprintf("insert into mysql.tidb_ttl_task(job_id,table_id,scan_id,expire_time,created_time) values ('test-job', %d, %d, NOW(), NOW())", table.Meta().ID, 1) + tk.MustExec(sql) + + // update the infoschema cache + isc := cache.NewInfoSchemaCache(time.Second) + require.NoError(t, isc.Update(sessionFactory())) + now := time.Now() + + // schedule in a task manager + scanWorker := ttlworker.NewMockScanWorker(t) + scanWorker.Start() + m := ttlworker.NewTaskManager(context.Background(), nil, isc, "task-manager-1") + m.SetScanWorkers4Test([]ttlworker.Worker{scanWorker}) + m.RescheduleTasks(sessionFactory(), now) + tk.MustQuery("select status,owner_id from mysql.tidb_ttl_task").Check(testkit.Rows("running task-manager-1")) + + // another task manager should fetch this task after heartbeat expire + scanWorker2 := ttlworker.NewMockScanWorker(t) + scanWorker2.Start() + m2 := ttlworker.NewTaskManager(context.Background(), nil, isc, "task-manager-2") + m2.SetScanWorkers4Test([]ttlworker.Worker{scanWorker2}) + m2.RescheduleTasks(sessionFactory(), now.Add(time.Hour)) + tk.MustQuery("select status,owner_id from mysql.tidb_ttl_task").Check(testkit.Rows("running task-manager-2")) + + // another task manager shouldn't fetch this task if it has finished + task := m2.GetRunningTasks()[0] + task.SetResult(nil) + m2.CheckFinishedTask(sessionFactory(), now) + scanWorker3 := ttlworker.NewMockScanWorker(t) + scanWorker3.Start() + m3 := ttlworker.NewTaskManager(context.Background(), nil, isc, "task-manager-3") + m3.SetScanWorkers4Test([]ttlworker.Worker{scanWorker3}) + m3.RescheduleTasks(sessionFactory(), now.Add(time.Hour)) + tk.MustQuery("select status,owner_id from mysql.tidb_ttl_task").Check(testkit.Rows("finished task-manager-2")) +} + +func TestTaskMetrics(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + waitAndStopTTLManager(t, dom) + tk := testkit.NewTestKit(t, store) + sessionFactory := sessionFactory(t, store) + + // create table and scan task + tk.MustExec("create table test.t(id int, created_at datetime) ttl=created_at + interval 1 day") + table, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + sql := fmt.Sprintf("insert into mysql.tidb_ttl_task(job_id,table_id,scan_id,expire_time,created_time) values ('test-job', %d, %d, NOW(), NOW())", table.Meta().ID, 1) + tk.MustExec(sql) + + // update the infoschema cache + isc := cache.NewInfoSchemaCache(time.Second) + require.NoError(t, isc.Update(sessionFactory())) + now := time.Now() + + // schedule in a task manager + scanWorker := ttlworker.NewMockScanWorker(t) + scanWorker.Start() + m := ttlworker.NewTaskManager(context.Background(), nil, isc, "task-manager-1") + m.SetScanWorkers4Test([]ttlworker.Worker{scanWorker}) + m.RescheduleTasks(sessionFactory(), now) + tk.MustQuery("select status,owner_id from mysql.tidb_ttl_task").Check(testkit.Rows("running task-manager-1")) + + m.ReportMetrics() + out := &dto.Metric{} + require.NoError(t, metrics.DeletingTaskCnt.Write(out)) + require.Equal(t, float64(1), out.GetGauge().GetValue()) +} + +func TestRescheduleWithError(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + waitAndStopTTLManager(t, dom) + tk := testkit.NewTestKit(t, store) + + sessionFactory := sessionFactory(t, store) + // insert a wrong scan task with random table id + sql := fmt.Sprintf("insert into mysql.tidb_ttl_task(job_id,table_id,scan_id,expire_time,created_time) values ('test-job', %d, %d, NOW(), NOW())", 613, 1) + tk.MustExec(sql) + + isc := cache.NewInfoSchemaCache(time.Second) + require.NoError(t, isc.Update(sessionFactory())) + now := time.Now() + + // schedule in a task manager + scanWorker := ttlworker.NewMockScanWorker(t) + scanWorker.Start() + m := ttlworker.NewTaskManager(context.Background(), nil, isc, "task-manager-1") + m.SetScanWorkers4Test([]ttlworker.Worker{scanWorker}) + notify := make(chan struct{}) + go func() { + m.RescheduleTasks(sessionFactory(), now) + notify <- struct{}{} + }() + timeout, cancel := context.WithTimeout(context.Background(), time.Second*5) + defer cancel() + + select { + case <-timeout.Done(): + require.Fail(t, "reschedule didn't finish in time") + case <-notify: + } + tk.MustQuery("select status from mysql.tidb_ttl_task").Check(testkit.Rows("waiting")) +} diff --git a/ttl/ttlworker/task_manager_test.go b/ttl/ttlworker/task_manager_test.go new file mode 100644 index 0000000000000..cffb8e071b62d --- /dev/null +++ b/ttl/ttlworker/task_manager_test.go @@ -0,0 +1,141 @@ +// Copyright 2023 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 ttlworker + +import ( + "context" + "testing" + "time" + + "github.com/pingcap/tidb/ttl/cache" + "github.com/pingcap/tidb/ttl/session" + "github.com/stretchr/testify/assert" +) + +// NewTaskManager is an exported version of newTaskManager for test +var NewTaskManager = newTaskManager + +// Worker is an exported version of worker +type Worker = worker + +func (m *taskManager) SetScanWorkers4Test(workers []worker) { + m.scanWorkers = workers +} + +// LockScanTask is an exported version of lockScanTask +func (m *taskManager) LockScanTask(se session.Session, task *cache.TTLTask, now time.Time) (*runningScanTask, error) { + return m.lockScanTask(se, task, now) +} + +// ResizeWorkersWithSysVar is an exported version of resizeWorkersWithSysVar +func (m *taskManager) ResizeWorkersWithSysVar() { + m.resizeWorkersWithSysVar() +} + +// RescheduleTasks is an exported version of rescheduleTasks +func (m *taskManager) RescheduleTasks(se session.Session, now time.Time) { + m.rescheduleTasks(se, now) +} + +// ReportMetrics is an exported version of reportMetrics +func (m *taskManager) ReportMetrics() { + m.reportMetrics() +} + +// CheckFinishedTask is an exported version of checkFinishedTask +func (m *taskManager) CheckFinishedTask(se session.Session, now time.Time) { + m.checkFinishedTask(se, now) +} + +// ReportTaskFinished is an exported version of reportTaskFinished +func (m *taskManager) GetRunningTasks() []*runningScanTask { + return m.runningTasks +} + +// ReportTaskFinished is an exported version of reportTaskFinished +func (t *runningScanTask) SetResult(err error) { + t.result = &ttlScanTaskExecResult{ + task: t.ttlScanTask, + err: err, + } +} + +func TestResizeWorkers(t *testing.T) { + tbl := newMockTTLTbl(t, "t1") + + // scale workers + scanWorker1 := NewMockScanWorker(t) + scanWorker1.Start() + scanWorker2 := NewMockScanWorker(t) + + m := newTaskManager(context.Background(), nil, nil, "test-id") + m.sessPool = newMockSessionPool(t, tbl) + m.SetScanWorkers4Test([]worker{ + scanWorker1, + }) + newWorkers, _, err := m.resizeWorkers(m.scanWorkers, 2, func() worker { + return scanWorker2 + }) + assert.NoError(t, err) + assert.Len(t, newWorkers, 2) + scanWorker1.checkWorkerStatus(workerStatusRunning, true, nil) + scanWorker2.checkWorkerStatus(workerStatusRunning, true, nil) + + // shrink scan workers + scanWorker1 = NewMockScanWorker(t) + scanWorker1.Start() + scanWorker2 = NewMockScanWorker(t) + scanWorker2.Start() + + m = newTaskManager(context.Background(), nil, nil, "test-id") + m.sessPool = newMockSessionPool(t, tbl) + m.SetScanWorkers4Test([]worker{ + scanWorker1, + scanWorker2, + }) + + assert.NoError(t, m.resizeScanWorkers(1)) + scanWorker2.checkWorkerStatus(workerStatusStopped, false, nil) + + // shrink scan workers after job is run + scanWorker1 = NewMockScanWorker(t) + scanWorker1.Start() + scanWorker2 = NewMockScanWorker(t) + scanWorker2.Start() + + m = newTaskManager(context.Background(), nil, nil, "test-id") + m.sessPool = newMockSessionPool(t, tbl) + m.SetScanWorkers4Test([]worker{ + scanWorker1, + scanWorker2, + }) + m.runningTasks = append(m.runningTasks, &runningScanTask{ + ttlScanTask: &ttlScanTask{ + tbl: tbl, + TTLTask: &cache.TTLTask{ + JobID: "test-job-id", + ScanID: 1, + }, + }, + }) + + scanWorker2.curTaskResult = &ttlScanTaskExecResult{task: &ttlScanTask{tbl: tbl, TTLTask: &cache.TTLTask{ + JobID: "test-job-id", + ScanID: 1, + }}} + assert.NoError(t, m.resizeScanWorkers(1)) + scanWorker2.checkWorkerStatus(workerStatusStopped, false, nil) + assert.NotNil(t, m.runningTasks[0].result) +} diff --git a/ttl/ttlworker/worker.go b/ttl/ttlworker/worker.go new file mode 100644 index 0000000000000..c89d90cb1d061 --- /dev/null +++ b/ttl/ttlworker/worker.go @@ -0,0 +1,141 @@ +// 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, +// 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 ttlworker + +import ( + "context" + "sync" + "time" + + "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" +) + +type workerStatus int + +const ( + workerStatusCreated workerStatus = iota + workerStatusRunning + workerStatusStopping + workerStatusStopped +) + +type worker interface { + Start() + Stop() + Status() workerStatus + Error() error + Send() chan<- interface{} + WaitStopped(ctx context.Context, timeout time.Duration) error +} + +type baseWorker struct { + sync.Mutex + ctx context.Context + cancel func() + ch chan interface{} + loopFunc func() error + + err error + status workerStatus + wg util.WaitGroupWrapper +} + +func (w *baseWorker) init(loop func() error) { + w.ctx, w.cancel = context.WithCancel(context.Background()) + w.status = workerStatusCreated + w.loopFunc = loop + w.ch = make(chan interface{}) +} + +func (w *baseWorker) Start() { + w.Lock() + defer w.Unlock() + if w.status != workerStatusCreated { + return + } + + w.wg.Run(w.loop) + w.status = workerStatusRunning +} + +func (w *baseWorker) Stop() { + w.Lock() + defer w.Unlock() + switch w.status { + case workerStatusCreated: + w.cancel() + w.toStopped(nil) + case workerStatusRunning: + w.cancel() + w.status = workerStatusStopping + } +} + +func (w *baseWorker) Status() workerStatus { + w.Lock() + defer w.Unlock() + return w.status +} + +func (w *baseWorker) Error() error { + w.Lock() + defer w.Unlock() + return w.err +} + +func (w *baseWorker) WaitStopped(ctx context.Context, timeout time.Duration) error { + // consider the situation when the worker has stopped, but the context has also stopped. We should + // return without error + if w.Status() == workerStatusStopped { + return nil + } + + ctx, cancel := context.WithTimeout(ctx, timeout) + go func() { + w.wg.Wait() + cancel() + }() + + <-ctx.Done() + if w.Status() != workerStatusStopped { + return ctx.Err() + } + return nil +} + +func (w *baseWorker) Send() chan<- interface{} { + return w.ch +} + +func (w *baseWorker) loop() { + var err error + defer func() { + if r := recover(); r != nil { + logutil.BgLogger().Info("ttl worker panic", zap.Any("recover", r), zap.Stack("stack")) + } + w.Lock() + w.toStopped(err) + w.Unlock() + }() + err = w.loopFunc() +} + +func (w *baseWorker) toStopped(err error) { + w.status = workerStatusStopped + w.err = err + close(w.ch) +} diff --git a/types/const_test.go b/types/const_test.go index 3942b6d1c5fd1..3815efde54338 100644 --- a/types/const_test.go +++ b/types/const_test.go @@ -338,8 +338,7 @@ func TestIgnoreSpaceMode(t *testing.T) { tk.MustExec("DROP TABLE BIT_AND;") tk.MustExec("CREATE TABLE `BIT_AND` (a bigint);") tk.MustExec("DROP TABLE BIT_AND;") - _, err = tk.Exec("CREATE TABLE BIT_AND(a bigint);") - require.Error(t, err) + tk.MustExecToErr("CREATE TABLE BIT_AND(a bigint);") tk.MustExec("CREATE TABLE test.BIT_AND(a bigint);") tk.MustExec("DROP TABLE BIT_AND;") @@ -347,36 +346,29 @@ func TestIgnoreSpaceMode(t *testing.T) { tk.MustExec("DROP TABLE NOW;") tk.MustExec("CREATE TABLE `NOW` (a bigint);") tk.MustExec("DROP TABLE NOW;") - _, err = tk.Exec("CREATE TABLE NOW(a bigint);") - require.Error(t, err) + tk.MustExecToErr("CREATE TABLE NOW(a bigint);") tk.MustExec("CREATE TABLE test.NOW(a bigint);") tk.MustExec("DROP TABLE NOW;") tk.MustExec("set sql_mode='IGNORE_SPACE'") - _, err = tk.Exec("CREATE TABLE COUNT (a bigint);") - require.Error(t, err) + tk.MustExecToErr("CREATE TABLE COUNT (a bigint);") tk.MustExec("CREATE TABLE `COUNT` (a bigint);") tk.MustExec("DROP TABLE COUNT;") - _, err = tk.Exec("CREATE TABLE COUNT(a bigint);") - require.Error(t, err) + tk.MustExecToErr("CREATE TABLE COUNT(a bigint);") tk.MustExec("CREATE TABLE test.COUNT(a bigint);") tk.MustExec("DROP TABLE COUNT;") - _, err = tk.Exec("CREATE TABLE BIT_AND (a bigint);") - require.Error(t, err) + tk.MustExecToErr("CREATE TABLE BIT_AND (a bigint);") tk.MustExec("CREATE TABLE `BIT_AND` (a bigint);") tk.MustExec("DROP TABLE BIT_AND;") - _, err = tk.Exec("CREATE TABLE BIT_AND(a bigint);") - require.Error(t, err) + tk.MustExecToErr("CREATE TABLE BIT_AND(a bigint);") tk.MustExec("CREATE TABLE test.BIT_AND(a bigint);") tk.MustExec("DROP TABLE BIT_AND;") - _, err = tk.Exec("CREATE TABLE NOW (a bigint);") - require.Error(t, err) + tk.MustExecToErr("CREATE TABLE NOW (a bigint);") tk.MustExec("CREATE TABLE `NOW` (a bigint);") tk.MustExec("DROP TABLE NOW;") - _, err = tk.Exec("CREATE TABLE NOW(a bigint);") - require.Error(t, err) + tk.MustExecToErr("CREATE TABLE NOW(a bigint);") tk.MustExec("CREATE TABLE test.NOW(a bigint);") tk.MustExec("DROP TABLE NOW;") } diff --git a/types/convert.go b/types/convert.go index 96a12f64ca641..715f49b140c0c 100644 --- a/types/convert.go +++ b/types/convert.go @@ -52,7 +52,9 @@ func IntergerUnsignedUpperBound(intType byte) uint64 { case mysql.TypeBit: return math.MaxUint64 case mysql.TypeEnum: - return math.MaxUint64 + // enum can have at most 65535 distinct elements + // it would be better to use len(FieldType.GetElems()), but we only have a byte type here + return 65535 case mysql.TypeSet: return math.MaxUint64 default: @@ -73,8 +75,12 @@ func IntergerSignedUpperBound(intType byte) int64 { return math.MaxInt32 case mysql.TypeLonglong: return math.MaxInt64 + case mysql.TypeEnum: + // enum can have at most 65535 distinct elements + // it would be better to use len(FieldType.GetElems()), but we only have a byte type here + return 65535 default: - panic("Input byte is not a mysql type") + panic("Input byte is not a mysql int type") } } @@ -91,6 +97,8 @@ func IntergerSignedLowerBound(intType byte) int64 { return math.MinInt32 case mysql.TypeLonglong: return math.MinInt64 + case mysql.TypeEnum: + return 0 default: panic("Input byte is not a mysql type") } @@ -301,7 +309,7 @@ func StrToUint(sc *stmtctx.StatementContext, str string, isFuncCast bool) (uint6 // StrToDateTime converts str to MySQL DateTime. func StrToDateTime(sc *stmtctx.StatementContext, str string, fsp int) (Time, error) { - return ParseTime(sc, str, mysql.TypeDatetime, fsp) + return ParseTime(sc, str, mysql.TypeDatetime, fsp, nil) } // StrToDuration converts str to Duration. It returns Duration in normal case, @@ -758,6 +766,8 @@ func ToString(value interface{}) (string, error) { return v.String(), nil case Set: return v.String(), nil + case BinaryJSON: + return v.String(), nil default: return "", errors.Errorf("cannot convert %v(type %T) to string", value, value) } diff --git a/types/convert_test.go b/types/convert_test.go index a36ab16f4b5ed..b28560dfbdf75 100644 --- a/types/convert_test.go +++ b/types/convert_test.go @@ -150,14 +150,14 @@ func TestConvertType(t *testing.T) { require.NoError(t, err) require.Equal(t, "10:11:12.1", vv.(Duration).String()) sc := &stmtctx.StatementContext{TimeZone: time.UTC} - vd, err := ParseTime(sc, "2010-10-10 10:11:11.12345", mysql.TypeDatetime, 2) + vd, err := ParseTime(sc, "2010-10-10 10:11:11.12345", mysql.TypeDatetime, 2, nil) require.Equal(t, "2010-10-10 10:11:11.12", vd.String()) require.NoError(t, err) v, err = Convert(vd, ft) require.NoError(t, err) require.Equal(t, "10:11:11.1", v.(Duration).String()) - vt, err := ParseTime(sc, "2010-10-10 10:11:11.12345", mysql.TypeTimestamp, 2) + vt, err := ParseTime(sc, "2010-10-10 10:11:11.12345", mysql.TypeTimestamp, 2, nil) require.Equal(t, "2010-10-10 10:11:11.12", vt.String()) require.NoError(t, err) v, err = Convert(vt, ft) @@ -346,8 +346,7 @@ func TestConvertToString(t *testing.T) { testToString(t, Enum{Name: "a", Value: 1}, "a") testToString(t, Set{Name: "a", Value: 1}, "a") - t1, err := ParseTime(&stmtctx.StatementContext{TimeZone: time.UTC}, - "2011-11-10 11:11:11.999999", mysql.TypeTimestamp, 6) + t1, err := ParseTime(&stmtctx.StatementContext{TimeZone: time.UTC}, "2011-11-10 11:11:11.999999", mysql.TypeTimestamp, 6, nil) require.NoError(t, err) testToString(t, t1, "2011-11-10 11:11:11.999999") diff --git a/types/datum.go b/types/datum.go index 34639cdf10bdb..ec3514de7fd89 100644 --- a/types/datum.go +++ b/types/datum.go @@ -1254,7 +1254,7 @@ func (d *Datum) convertToMysqlTimestamp(sc *stmtctx.StatementContext, target *Fi } t, err = t.RoundFrac(sc, fsp) case KindString, KindBytes: - t, err = ParseTime(sc, d.GetString(), mysql.TypeTimestamp, fsp) + t, err = ParseTime(sc, d.GetString(), mysql.TypeTimestamp, fsp, nil) case KindInt64: t, err = ParseTimeFromNum(sc, d.GetInt64(), mysql.TypeTimestamp, fsp) case KindMysqlDecimal: @@ -1267,7 +1267,7 @@ func (d *Datum) convertToMysqlTimestamp(sc *stmtctx.StatementContext, target *Fi ret.SetMysqlTime(t) return ret, err } - t, err = ParseTime(sc, s, mysql.TypeTimestamp, fsp) + t, err = ParseTime(sc, s, mysql.TypeTimestamp, fsp, nil) default: return invalidConv(d, mysql.TypeTimestamp) } @@ -1308,7 +1308,7 @@ func (d *Datum) convertToMysqlTime(sc *stmtctx.StatementContext, target *FieldTy case KindMysqlDecimal: t, err = ParseTimeFromFloatString(sc, d.GetMysqlDecimal().String(), tp, fsp) case KindString, KindBytes: - t, err = ParseTime(sc, d.GetString(), tp, fsp) + t, err = ParseTime(sc, d.GetString(), tp, fsp, nil) case KindInt64: t, err = ParseTimeFromNum(sc, d.GetInt64(), tp, fsp) case KindUint64: @@ -1327,7 +1327,7 @@ func (d *Datum) convertToMysqlTime(sc *stmtctx.StatementContext, target *FieldTy ret.SetMysqlTime(t) return ret, err } - t, err = ParseTime(sc, s, tp, fsp) + t, err = ParseTime(sc, s, tp, fsp, nil) default: return invalidConv(d, tp) } @@ -2016,6 +2016,10 @@ func (d *Datum) ToMysqlJSON() (j BinaryJSON, err error) { in = d.GetBinaryLiteral().ToString() case KindNull: in = nil + case KindMysqlTime: + in = d.GetMysqlTime() + case KindMysqlDuration: + in = d.GetMysqlDuration() default: in, err = d.ToString() } diff --git a/types/datum_test.go b/types/datum_test.go index 8d06d7439596e..e181dbb58ee01 100644 --- a/types/datum_test.go +++ b/types/datum_test.go @@ -93,7 +93,7 @@ func TestToBool(t *testing.T) { testDatumToBool(t, CreateBinaryJSON(true), 1) testDatumToBool(t, CreateBinaryJSON(false), 1) testDatumToBool(t, CreateBinaryJSON(""), 1) - t1, err := ParseTime(&stmtctx.StatementContext{TimeZone: time.UTC}, "2011-11-10 11:11:11.999999", mysql.TypeTimestamp, 6) + t1, err := ParseTime(&stmtctx.StatementContext{TimeZone: time.UTC}, "2011-11-10 11:11:11.999999", mysql.TypeTimestamp, 6, nil) require.NoError(t, err) testDatumToBool(t, t1, 1) @@ -136,7 +136,7 @@ func TestToInt64(t *testing.T) { t1, err := ParseTime(&stmtctx.StatementContext{ TimeZone: time.UTC, - }, "2011-11-10 11:11:11.999999", mysql.TypeTimestamp, 0) + }, "2011-11-10 11:11:11.999999", mysql.TypeTimestamp, 0, nil) require.NoError(t, err) testDatumToInt64(t, t1, int64(20111110111112)) @@ -226,7 +226,7 @@ func TestConvertToFloat(t *testing.T) { } func mustParseTime(s string, tp byte, fsp int) Time { - t, err := ParseTime(&stmtctx.StatementContext{TimeZone: time.UTC}, s, tp, fsp) + t, err := ParseTime(&stmtctx.StatementContext{TimeZone: time.UTC}, s, tp, fsp, nil) if err != nil { panic("ParseTime fail") } diff --git a/types/errors.go b/types/errors.go index 68b12d48d8218..94ac823891aa2 100644 --- a/types/errors.go +++ b/types/errors.go @@ -82,6 +82,8 @@ var ( ErrSyntax = dbterror.ClassTypes.NewStdErr(mysql.ErrParse, mysql.MySQLErrName[mysql.ErrSyntax]) // ErrWrongValue is returned when the input value is in wrong format. ErrWrongValue = dbterror.ClassTypes.NewStdErr(mysql.ErrTruncatedWrongValue, mysql.MySQLErrName[mysql.ErrWrongValue]) + // ErrWrongValue2 is returned when the input value is in wrong format. + ErrWrongValue2 = dbterror.ClassTypes.NewStdErr(mysql.ErrWrongValue, mysql.MySQLErrName[mysql.ErrWrongValue]) // ErrWrongValueForType is returned when the input value is in wrong format for function. ErrWrongValueForType = dbterror.ClassTypes.NewStdErr(mysql.ErrWrongValueForType, mysql.MySQLErrName[mysql.ErrWrongValueForType]) // ErrPartitionStatsMissing is returned when the partition-level stats is missing and the build global-level stats fails. diff --git a/types/etc.go b/types/etc.go index 56309d0c41ac4..6d371138193f8 100644 --- a/types/etc.go +++ b/types/etc.go @@ -90,6 +90,11 @@ func IsTypeNumeric(tp byte) bool { return false } +// IsTypeBit returns a boolean indicating whether the tp is bit type. +func IsTypeBit(ft *FieldType) bool { + return ft.GetType() == mysql.TypeBit +} + // IsTemporalWithDate returns a boolean indicating // whether the tp is time type with date. func IsTemporalWithDate(tp byte) bool { diff --git a/types/explain_format.go b/types/explain_format.go index 2599f7bb046ed..9ef1dd0ccb975 100644 --- a/types/explain_format.go +++ b/types/explain_format.go @@ -33,6 +33,10 @@ var ( ExplainFormatTrueCardCost = "true_card_cost" // ExplainFormatBinary prints the proto for binary plan. ExplainFormatBinary = "binary" + // ExplainFormatTiDBJSON warp the default result in JSON format + ExplainFormatTiDBJSON = "tidb_json" + // ExplainFormatCostTrace prints the cost and cost formula of each operator. + ExplainFormatCostTrace = "cost_trace" // ExplainFormats stores the valid formats for explain statement, used by validator. ExplainFormats = []string{ @@ -45,5 +49,7 @@ var ( ExplainFormatTraditional, ExplainFormatTrueCardCost, ExplainFormatBinary, + ExplainFormatTiDBJSON, + ExplainFormatCostTrace, } ) diff --git a/types/field_type_builder.go b/types/field_type_builder.go index 7c9f3bdc3177d..81554c4585442 100644 --- a/types/field_type_builder.go +++ b/types/field_type_builder.go @@ -114,6 +114,12 @@ func (b *FieldTypeBuilder) SetElems(elems []string) *FieldTypeBuilder { return b } +// SetArray sets array of the ft +func (b *FieldTypeBuilder) SetArray(x bool) *FieldTypeBuilder { + b.ft.SetArray(x) + return b +} + // Build returns the ft func (b *FieldTypeBuilder) Build() FieldType { return b.ft diff --git a/types/format_test.go b/types/format_test.go index 95f20cacb727e..b852fbb678103 100644 --- a/types/format_test.go +++ b/types/format_test.go @@ -69,7 +69,7 @@ func TestTimeFormatMethod(t *testing.T) { }, } for i, tt := range tblDate { - tm, err := types.ParseTime(sc, tt.Input, mysql.TypeDatetime, 6) + tm, err := types.ParseTime(sc, tt.Input, mysql.TypeDatetime, 6, nil) require.NoErrorf(t, err, "Parse time fail: %s", tt.Input) str, err := tm.DateFormat(tt.Format) diff --git a/types/helper.go b/types/helper.go index 91c7733906b24..e3cc4aaf68cd9 100644 --- a/types/helper.go +++ b/types/helper.go @@ -114,34 +114,6 @@ func isPunctuation(c byte) bool { return (c >= 0x21 && c <= 0x2F) || (c >= 0x3A && c <= 0x40) || (c >= 0x5B && c <= 0x60) || (c >= 0x7B && c <= 0x7E) } -func myMax(a, b int) int { - if a > b { - return a - } - return b -} - -func myMaxInt8(a, b int8) int8 { - if a > b { - return a - } - return b -} - -func myMin(a, b int) int { - if a < b { - return a - } - return b -} - -func myMinInt8(a, b int8) int8 { - if a < b { - return a - } - return b -} - const ( maxUint = uint64(math.MaxUint64) uintCutOff = maxUint/uint64(10) + 1 diff --git a/types/json_binary.go b/types/json_binary.go index eb9a818b6a7f5..cacf5b69b025a 100644 --- a/types/json_binary.go +++ b/types/json_binary.go @@ -31,6 +31,8 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/util/hack" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" "golang.org/x/exp/slices" ) @@ -275,7 +277,8 @@ func (bj BinaryJSON) GetElemCount() int { return int(jsonEndian.Uint32(bj.Value)) } -func (bj BinaryJSON) arrayGetElem(idx int) BinaryJSON { +// ArrayGetElem gets the element of the index `idx`. +func (bj BinaryJSON) ArrayGetElem(idx int) BinaryJSON { return bj.valEntryGet(headerSize + idx*valEntrySize) } @@ -355,7 +358,7 @@ func (bj BinaryJSON) marshalArrayTo(buf []byte) ([]byte, error) { buf = append(buf, ", "...) } var err error - buf, err = bj.arrayGetElem(i).marshalTo(buf) + buf, err = bj.ArrayGetElem(i).marshalTo(buf) if err != nil { return nil, errors.Trace(err) } @@ -557,7 +560,7 @@ func (bj BinaryJSON) HashValue(buf []byte) []byte { elemCount := int(jsonEndian.Uint32(bj.Value)) buf = append(buf, bj.Value[0:dataSizeOff]...) for i := 0; i < elemCount; i++ { - buf = bj.arrayGetElem(i).HashValue(buf) + buf = bj.ArrayGetElem(i).HashValue(buf) } case JSONTypeCodeObject: // this hash value is bidirectional, because you can get the key using the json @@ -577,6 +580,26 @@ func (bj BinaryJSON) HashValue(buf []byte) []byte { return buf } +// GetValue return the primitive value of the JSON. +func (bj BinaryJSON) GetValue() any { + switch bj.TypeCode { + case JSONTypeCodeInt64: + return bj.GetInt64() + case JSONTypeCodeUint64: + return bj.GetUint64() + case JSONTypeCodeDuration: + return bj.GetDuration() + case JSONTypeCodeFloat64: + return bj.GetFloat64() + case JSONTypeCodeString: + return bj.GetString() + case JSONTypeCodeDate, JSONTypeCodeDatetime: + return bj.GetTime() + } + logutil.BgLogger().Error("unreachable JSON type", zap.Any("type", bj.TypeCode)) + return nil +} + // CreateBinaryJSON creates a BinaryJSON from interface. func CreateBinaryJSON(in interface{}) BinaryJSON { bj, err := CreateBinaryJSONWithCheck(in) diff --git a/types/json_binary_functions.go b/types/json_binary_functions.go index 2b02d5a0f65e7..7c4d7bf7f97bc 100644 --- a/types/json_binary_functions.go +++ b/types/json_binary_functions.go @@ -294,7 +294,7 @@ func (bj BinaryJSON) extractTo(buf []BinaryJSON, pathExpr JSONPathExpression, du start, end := currentLeg.arraySelection.getIndexRange(bj) if start >= 0 && start <= end { for i := start; i <= end; i++ { - buf = bj.arrayGetElem(i).extractTo(buf, subPathExpr, dup, one) + buf = bj.ArrayGetElem(i).extractTo(buf, subPathExpr, dup, one) } } } else if currentLeg.typ == jsonPathLegKey && bj.TypeCode == JSONTypeCodeObject { @@ -314,7 +314,7 @@ func (bj BinaryJSON) extractTo(buf []BinaryJSON, pathExpr JSONPathExpression, du if bj.TypeCode == JSONTypeCodeArray { elemCount := bj.GetElemCount() for i := 0; i < elemCount && !jsonFinished(buf, one); i++ { - buf = bj.arrayGetElem(i).extractTo(buf, pathExpr, dup, one) + buf = bj.ArrayGetElem(i).extractTo(buf, pathExpr, dup, one) } } else if bj.TypeCode == JSONTypeCodeObject { elemCount := bj.GetElemCount() @@ -459,12 +459,12 @@ func (bj BinaryJSON) ArrayInsert(pathExpr JSONPathExpression, value BinaryJSON) // Insert into the array newArray := make([]BinaryJSON, 0, count+1) for i := 0; i < idx; i++ { - elem := obj.arrayGetElem(i) + elem := obj.ArrayGetElem(i) newArray = append(newArray, elem) } newArray = append(newArray, value) for i := idx; i < count; i++ { - elem := obj.arrayGetElem(i) + elem := obj.ArrayGetElem(i) newArray = append(newArray, elem) } obj = buildBinaryJSONArray(newArray) @@ -556,7 +556,7 @@ func (bm *binaryModifier) doInsert(path JSONPathExpression, newBj BinaryJSON) { elemCount := parentBj.GetElemCount() elems := make([]BinaryJSON, 0, elemCount+1) for i := 0; i < elemCount; i++ { - elems = append(elems, parentBj.arrayGetElem(i)) + elems = append(elems, parentBj.ArrayGetElem(i)) } elems = append(elems, newBj) bm.modifyValue = buildBinaryJSONArray(elems) @@ -622,7 +622,7 @@ func (bm *binaryModifier) doRemove(path JSONPathExpression) { elems := make([]BinaryJSON, 0, elemCount-1) for i := 0; i < elemCount; i++ { if i != idx { - elems = append(elems, parentBj.arrayGetElem(i)) + elems = append(elems, parentBj.ArrayGetElem(i)) } } bm.modifyValue = buildBinaryJSONArray(elems) @@ -809,8 +809,8 @@ func CompareBinaryJSON(left, right BinaryJSON) int { leftCount := left.GetElemCount() rightCount := right.GetElemCount() for i := 0; i < leftCount && i < rightCount; i++ { - elem1 := left.arrayGetElem(i) - elem2 := right.arrayGetElem(i) + elem1 := left.ArrayGetElem(i) + elem2 := right.ArrayGetElem(i) cmp = CompareBinaryJSON(elem1, elem2) if cmp != 0 { return cmp @@ -993,7 +993,7 @@ func mergeBinaryArray(elems []BinaryJSON) BinaryJSON { } else { childCount := elem.GetElemCount() for j := 0; j < childCount; j++ { - buf = append(buf, elem.arrayGetElem(j)) + buf = append(buf, elem.ArrayGetElem(j)) } } } @@ -1088,7 +1088,7 @@ func ContainsBinaryJSON(obj, target BinaryJSON) bool { if target.TypeCode == JSONTypeCodeArray { elemCount := target.GetElemCount() for i := 0; i < elemCount; i++ { - if !ContainsBinaryJSON(obj, target.arrayGetElem(i)) { + if !ContainsBinaryJSON(obj, target.ArrayGetElem(i)) { return false } } @@ -1096,7 +1096,49 @@ func ContainsBinaryJSON(obj, target BinaryJSON) bool { } elemCount := obj.GetElemCount() for i := 0; i < elemCount; i++ { - if ContainsBinaryJSON(obj.arrayGetElem(i), target) { + if ContainsBinaryJSON(obj.ArrayGetElem(i), target) { + return true + } + } + return false + default: + return CompareBinaryJSON(obj, target) == 0 + } +} + +// OverlapsBinaryJSON is similar with ContainsBinaryJSON, but it checks the `OR` relationship. +func OverlapsBinaryJSON(obj, target BinaryJSON) bool { + if obj.TypeCode != JSONTypeCodeArray && target.TypeCode == JSONTypeCodeArray { + obj, target = target, obj + } + switch obj.TypeCode { + case JSONTypeCodeObject: + if target.TypeCode == JSONTypeCodeObject { + elemCount := target.GetElemCount() + for i := 0; i < elemCount; i++ { + key := target.objectGetKey(i) + val := target.objectGetVal(i) + if exp, exists := obj.objectSearchKey(key); exists && CompareBinaryJSON(exp, val) == 0 { + return true + } + } + } + return false + case JSONTypeCodeArray: + if target.TypeCode == JSONTypeCodeArray { + for i := 0; i < obj.GetElemCount(); i++ { + o := obj.ArrayGetElem(i) + for j := 0; j < target.GetElemCount(); j++ { + if CompareBinaryJSON(o, target.ArrayGetElem(j)) == 0 { + return true + } + } + } + return false + } + elemCount := obj.GetElemCount() + for i := 0; i < elemCount; i++ { + if CompareBinaryJSON(obj.ArrayGetElem(i), target) == 0 { return true } } @@ -1133,7 +1175,7 @@ func (bj BinaryJSON) GetElemDepth() int { elemCount := bj.GetElemCount() maxDepth := 0 for i := 0; i < elemCount; i++ { - obj := bj.arrayGetElem(i) + obj := bj.ArrayGetElem(i) depth := obj.GetElemDepth() if depth > maxDepth { maxDepth = depth @@ -1204,9 +1246,9 @@ func (bj BinaryJSON) extractToCallback(pathExpr JSONPathExpression, callbackFn e switch selection := currentLeg.arraySelection.(type) { case jsonPathArraySelectionAsterisk: for i := 0; i < elemCount; i++ { - // buf = bj.arrayGetElem(i).extractTo(buf, subPathExpr) + // buf = bj.ArrayGetElem(i).extractTo(buf, subPathExpr) path := fullpath.pushBackOneArraySelectionLeg(jsonPathArraySelectionIndex{jsonPathArrayIndexFromStart(i)}) - stop, err = bj.arrayGetElem(i).extractToCallback(subPathExpr, callbackFn, path) + stop, err = bj.ArrayGetElem(i).extractToCallback(subPathExpr, callbackFn, path) if stop || err != nil { return } @@ -1214,9 +1256,9 @@ func (bj BinaryJSON) extractToCallback(pathExpr JSONPathExpression, callbackFn e case jsonPathArraySelectionIndex: idx := selection.index.getIndexFromStart(bj) if idx < elemCount && idx >= 0 { - // buf = bj.arrayGetElem(currentLeg.arraySelection).extractTo(buf, subPathExpr) + // buf = bj.ArrayGetElem(currentLeg.arraySelection).extractTo(buf, subPathExpr) path := fullpath.pushBackOneArraySelectionLeg(currentLeg.arraySelection) - stop, err = bj.arrayGetElem(idx).extractToCallback(subPathExpr, callbackFn, path) + stop, err = bj.ArrayGetElem(idx).extractToCallback(subPathExpr, callbackFn, path) if stop || err != nil { return } @@ -1230,7 +1272,7 @@ func (bj BinaryJSON) extractToCallback(pathExpr JSONPathExpression, callbackFn e if start <= end && start >= 0 { for i := start; i <= end; i++ { path := fullpath.pushBackOneArraySelectionLeg(jsonPathArraySelectionIndex{jsonPathArrayIndexFromStart(i)}) - stop, err = bj.arrayGetElem(i).extractToCallback(subPathExpr, callbackFn, path) + stop, err = bj.ArrayGetElem(i).extractToCallback(subPathExpr, callbackFn, path) if stop || err != nil { return } @@ -1269,9 +1311,9 @@ func (bj BinaryJSON) extractToCallback(pathExpr JSONPathExpression, callbackFn e if bj.TypeCode == JSONTypeCodeArray { elemCount := bj.GetElemCount() for i := 0; i < elemCount; i++ { - // buf = bj.arrayGetElem(i).extractTo(buf, pathExpr) + // buf = bj.ArrayGetElem(i).extractTo(buf, pathExpr) path := fullpath.pushBackOneArraySelectionLeg(jsonPathArraySelectionIndex{jsonPathArrayIndexFromStart(i)}) - stop, err = bj.arrayGetElem(i).extractToCallback(pathExpr, callbackFn, path) + stop, err = bj.ArrayGetElem(i).extractToCallback(pathExpr, callbackFn, path) if stop || err != nil { return } @@ -1315,7 +1357,7 @@ func (bj BinaryJSON) Walk(walkFn BinaryJSONWalkFunc, pathExprList ...JSONPathExp elemCount := bj.GetElemCount() for i := 0; i < elemCount; i++ { path := fullpath.pushBackOneArraySelectionLeg(jsonPathArraySelectionIndex{jsonPathArrayIndexFromStart(i)}) - stop, err = doWalk(path, bj.arrayGetElem(i)) + stop, err = doWalk(path, bj.ArrayGetElem(i)) if stop || err != nil { return } diff --git a/types/mydecimal.go b/types/mydecimal.go index 203211265e0c9..37e724ab61370 100644 --- a/types/mydecimal.go +++ b/types/mydecimal.go @@ -24,6 +24,7 @@ import ( "github.com/pingcap/log" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/util/mathutil" "go.uber.org/zap" ) @@ -353,7 +354,7 @@ func (d *MyDecimal) ToString() (str []byte) { for ; digitsFrac > 0; digitsFrac -= digitsPerWord { x := d.wordBuf[wordIdx] wordIdx++ - for i := myMin(digitsFrac, digitsPerWord); i > 0; i-- { + for i := mathutil.Min(digitsFrac, digitsPerWord); i > 0; i-- { y := x / digMask str[fracIdx] = byte(y) + '0' fracIdx++ @@ -380,7 +381,7 @@ func (d *MyDecimal) ToString() (str []byte) { for ; digitsInt > 0; digitsInt -= digitsPerWord { wordIdx-- x := d.wordBuf[wordIdx] - for i := myMin(digitsInt, digitsPerWord); i > 0; i-- { + for i := mathutil.Min(digitsInt, digitsPerWord); i > 0; i-- { y := x / 10 strIdx-- str[strIdx] = '0' + byte(x-y*10) @@ -840,7 +841,7 @@ func (d *MyDecimal) Round(to *MyDecimal, frac int, roundMode RoundMode) (err err if to != d { copy(to.wordBuf[:], d.wordBuf[:]) to.negative = d.negative - to.digitsInt = int8(myMin(wordsInt, wordBufLen) * digitsPerWord) + to.digitsInt = int8(mathutil.Min(wordsInt, wordBufLen) * digitsPerWord) } if wordsFracTo > wordsFrac { idx := wordsInt + wordsFrac @@ -941,7 +942,7 @@ func (d *MyDecimal) Round(to *MyDecimal, frac int, roundMode RoundMode) (err err frac = wordsFracTo * digitsPerWord err = ErrTruncated } - for toIdx = wordsInt + myMax(wordsFracTo, 0); toIdx > 0; toIdx-- { + for toIdx = wordsInt + mathutil.Max(wordsFracTo, 0); toIdx > 0; toIdx-- { if toIdx < wordBufLen { to.wordBuf[toIdx] = to.wordBuf[toIdx-1] } else { @@ -965,7 +966,7 @@ func (d *MyDecimal) Round(to *MyDecimal, frac int, roundMode RoundMode) (err err /* making 'zero' with the proper scale */ idx := wordsFracTo + 1 to.digitsInt = 1 - to.digitsFrac = int8(myMax(frac, 0)) + to.digitsFrac = int8(mathutil.Max(frac, 0)) to.negative = false for toIdx < idx { to.wordBuf[toIdx] = 0 @@ -1602,7 +1603,7 @@ func DecimalNeg(from *MyDecimal) *MyDecimal { // of `to` may be changed during evaluating. func DecimalAdd(from1, from2, to *MyDecimal) error { from1, from2, to = validateArgs(from1, from2, to) - to.resultFrac = myMaxInt8(from1.resultFrac, from2.resultFrac) + to.resultFrac = mathutil.Max(from1.resultFrac, from2.resultFrac) if from1.negative == from2.negative { return doAdd(from1, from2, to) } @@ -1613,7 +1614,7 @@ func DecimalAdd(from1, from2, to *MyDecimal) error { // DecimalSub subs one decimal from another, sets the result to 'to'. func DecimalSub(from1, from2, to *MyDecimal) error { from1, from2, to = validateArgs(from1, from2, to) - to.resultFrac = myMaxInt8(from1.resultFrac, from2.resultFrac) + to.resultFrac = mathutil.Max(from1.resultFrac, from2.resultFrac) if from1.negative == from2.negative { _, err := doSub(from1, from2, to) return err @@ -1649,7 +1650,7 @@ func doSub(from1, from2, to *MyDecimal) (cmp int, err error) { wordsFrac1 = digitsToWords(int(from1.digitsFrac)) wordsInt2 = digitsToWords(int(from2.digitsInt)) wordsFrac2 = digitsToWords(int(from2.digitsFrac)) - wordsFracTo = myMax(wordsFrac1, wordsFrac2) + wordsFracTo = mathutil.Max(wordsFrac1, wordsFrac2) start1 = 0 stop1 = wordsInt1 @@ -1814,8 +1815,8 @@ func doAdd(from1, from2, to *MyDecimal) error { wordsFrac1 = digitsToWords(int(from1.digitsFrac)) wordsInt2 = digitsToWords(int(from2.digitsInt)) wordsFrac2 = digitsToWords(int(from2.digitsFrac)) - wordsIntTo = myMax(wordsInt1, wordsInt2) - wordsFracTo = myMax(wordsFrac1, wordsFrac2) + wordsIntTo = mathutil.Max(wordsInt1, wordsInt2) + wordsFracTo = mathutil.Max(wordsFrac1, wordsFrac2) ) var x int32 @@ -1839,7 +1840,7 @@ func doAdd(from1, from2, to *MyDecimal) error { idxTo := wordsIntTo + wordsFracTo to.negative = from1.negative to.digitsInt = int8(wordsIntTo * digitsPerWord) - to.digitsFrac = myMaxInt8(from1.digitsFrac, from2.digitsFrac) + to.digitsFrac = mathutil.Max(from1.digitsFrac, from2.digitsFrac) if err != nil { if to.digitsFrac > int8(wordsFracTo*digitsPerWord) { @@ -1977,7 +1978,7 @@ func DecimalMul(from1, from2, to *MyDecimal) error { tmp1 = wordsIntTo tmp2 = wordsFracTo ) - to.resultFrac = myMinInt8(from1.resultFrac+from2.resultFrac, mysql.MaxDecimalScale) + to.resultFrac = mathutil.Min(from1.resultFrac+from2.resultFrac, mysql.MaxDecimalScale) wordsIntTo, wordsFracTo, err = fixWordCntError(wordsIntTo, wordsFracTo) to.negative = from1.negative != from2.negative to.digitsFrac = from1.digitsFrac + from2.digitsFrac @@ -2092,7 +2093,7 @@ func DecimalMul(from1, from2, to *MyDecimal) error { // fracIncr - increment of fraction func DecimalDiv(from1, from2, to *MyDecimal, fracIncr int) error { from1, from2, to = validateArgs(from1, from2, to) - to.resultFrac = myMinInt8(from1.resultFrac+int8(fracIncr), mysql.MaxDecimalScale) + to.resultFrac = mathutil.Min(from1.resultFrac+int8(fracIncr), mysql.MaxDecimalScale) return doDivMod(from1, from2, to, nil, fracIncr) } @@ -2122,7 +2123,7 @@ DecimalMod does modulus of two decimals. */ func DecimalMod(from1, from2, to *MyDecimal) error { from1, from2, to = validateArgs(from1, from2, to) - to.resultFrac = myMaxInt8(from1.resultFrac, from2.resultFrac) + to.resultFrac = mathutil.Max(from1.resultFrac, from2.resultFrac) return doDivMod(from1, from2, nil, to, 0) } @@ -2190,7 +2191,7 @@ func doDivMod(from1, from2, to, mod *MyDecimal, fracIncr int) error { // digitsFrac=max(frac1, frac2), as for subtraction // digitsInt=from2.digitsInt to.negative = from1.negative - to.digitsFrac = myMaxInt8(from1.digitsFrac, from2.digitsFrac) + to.digitsFrac = mathutil.Max(from1.digitsFrac, from2.digitsFrac) } else { wordsFracTo = digitsToWords(frac1 + frac2 + fracIncr) wordsIntTo, wordsFracTo, err = fixWordCntError(wordsIntTo, wordsFracTo) @@ -2355,7 +2356,7 @@ func doDivMod(from1, from2, to, mod *MyDecimal, fracIncr int) error { return ErrOverflow } stop1 = start1 + wordsIntTo + wordsFracTo - to.digitsInt = int8(myMin(wordsIntTo*digitsPerWord, int(from2.digitsInt))) + to.digitsInt = int8(mathutil.Min(wordsIntTo*digitsPerWord, int(from2.digitsInt))) } if wordsIntTo+wordsFracTo > wordBufLen { stop1 -= wordsIntTo + wordsFracTo - wordBufLen diff --git a/types/time.go b/types/time.go index 974b69602dd63..bdf25a7d9752b 100644 --- a/types/time.go +++ b/types/time.go @@ -18,6 +18,7 @@ import ( "bytes" "encoding/json" "fmt" + "io" "math" "regexp" "strconv" @@ -459,7 +460,7 @@ func (t Time) Convert(sc *stmtctx.StatementContext, tp uint8) (Time, error) { } t1.SetType(tp) - err := t1.check(sc) + err := t1.check(sc, nil) return t1, errors.Trace(err) } @@ -490,7 +491,7 @@ func (t Time) Compare(o Time) int { // but parses string to Time then compares. func (t Time) CompareString(sc *stmtctx.StatementContext, str string) (int, error) { // use MaxFsp to parse the string - o, err := ParseTime(sc, str, t.Type(), MaxFsp) + o, err := ParseTime(sc, str, t.Type(), MaxFsp, nil) if err != nil { return 0, errors.Trace(err) } @@ -672,7 +673,7 @@ func (t *Time) FromPackedUint(packed uint64) error { // check whether t matches valid Time format. // If allowZeroInDate is false, it returns ErrZeroDate when month or day is zero. // FIXME: See https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_in_date -func (t Time) check(sc *stmtctx.StatementContext) error { +func (t Time) check(sc *stmtctx.StatementContext, explicitTz *gotime.Location) error { allowZeroInDate := false allowInvalidDate := false // We should avoid passing sc as nil here as far as possible. @@ -683,7 +684,7 @@ func (t Time) check(sc *stmtctx.StatementContext) error { var err error switch t.Type() { case mysql.TypeTimestamp: - err = checkTimestampType(sc, t.coreTime) + err = checkTimestampType(sc, t.coreTime, explicitTz) case mysql.TypeDatetime, mysql.TypeDate: err = checkDatetimeType(t.coreTime, allowZeroInDate, allowInvalidDate) } @@ -692,7 +693,7 @@ func (t Time) check(sc *stmtctx.StatementContext) error { // Check if 't' is valid func (t *Time) Check(sc *stmtctx.StatementContext) error { - return t.check(sc) + return t.check(sc, nil) } // Sub subtracts t1 from t, returns a duration value. @@ -951,7 +952,7 @@ func splitDateTime(format string) (seps []string, fracStr string, hasTZ bool, tz } // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html. -func parseDatetime(sc *stmtctx.StatementContext, str string, fsp int, isFloat bool) (Time, error) { +func parseDatetime(sc *stmtctx.StatementContext, str string, fsp int, isFloat bool, explicitTz *gotime.Location) (Time, error) { var ( year, month, day, hour, minute, second, deltaHour, deltaMinute int fracStr string @@ -1155,6 +1156,9 @@ func parseDatetime(sc *stmtctx.StatementContext, str string, fsp int, isFloat bo hhmmss = true } if err != nil { + if err == io.EOF { + return ZeroDatetime, errors.Trace(ErrWrongValue.GenWithStackByArgs(DateTimeStr, str)) + } return ZeroDatetime, errors.Trace(err) } @@ -1185,7 +1189,12 @@ func parseDatetime(sc *stmtctx.StatementContext, str string, fsp int, isFloat bo } if overflow { // Convert to Go time and add 1 second, to handle input like 2017-01-05 08:40:59.575601 - t1, err := tmp.GoTime(sc.TimeZone) + var t1 gotime.Time + if explicitTz != nil { + t1, err = tmp.GoTime(explicitTz) + } else { + t1, err = tmp.GoTime(sc.TimeZone) + } if err != nil { return ZeroDatetime, errors.Trace(err) } @@ -1218,7 +1227,11 @@ func parseDatetime(sc *stmtctx.StatementContext, str string, fsp int, isFloat bo if err != nil { return ZeroDatetime, errors.Trace(err) } - t1 = t1.In(sc.TimeZone) + if explicitTz != nil { + t1 = t1.In(explicitTz) + } else { + t1 = t1.In(sc.TimeZone) + } tmp = FromGoTime(t1) } @@ -1874,7 +1887,7 @@ func getTime(sc *stmtctx.StatementContext, num, originNum int64, tp byte) (Time, return ZeroDatetime, errors.Trace(ErrWrongValue.GenWithStackByArgs(TimeStr, numStr)) } t := NewTime(ct, tp, DefaultFsp) - err := t.check(sc) + err := t.check(sc, nil) return t, errors.Trace(err) } @@ -1966,8 +1979,9 @@ func parseDateTimeFromNum(sc *stmtctx.StatementContext, num int64) (Time, error) // The valid datetime range is from '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999'. // The valid timestamp range is from '1970-01-01 00:00:01.000000' to '2038-01-19 03:14:07.999999'. // The valid date range is from '1000-01-01' to '9999-12-31' -func ParseTime(sc *stmtctx.StatementContext, str string, tp byte, fsp int) (Time, error) { - return parseTime(sc, str, tp, fsp, false) +// explicitTz is used to handle a data race of timeZone, refer to https://github.com/pingcap/tidb/issues/40710. It only works for timestamp now, be careful to use it! +func ParseTime(sc *stmtctx.StatementContext, str string, tp byte, fsp int, explicitTz *gotime.Location) (Time, error) { + return parseTime(sc, str, tp, fsp, false, explicitTz) } // ParseTimeFromFloatString is similar to ParseTime, except that it's used to parse a float converted string. @@ -1976,22 +1990,22 @@ func ParseTimeFromFloatString(sc *stmtctx.StatementContext, str string, tp byte, if len(str) >= 3 && str[:3] == "0.0" { return NewTime(ZeroCoreTime, tp, DefaultFsp), nil } - return parseTime(sc, str, tp, fsp, true) + return parseTime(sc, str, tp, fsp, true, nil) } -func parseTime(sc *stmtctx.StatementContext, str string, tp byte, fsp int, isFloat bool) (Time, error) { +func parseTime(sc *stmtctx.StatementContext, str string, tp byte, fsp int, isFloat bool, explicitTz *gotime.Location) (Time, error) { fsp, err := CheckFsp(fsp) if err != nil { return NewTime(ZeroCoreTime, tp, DefaultFsp), errors.Trace(err) } - t, err := parseDatetime(sc, str, fsp, isFloat) + t, err := parseDatetime(sc, str, fsp, isFloat, explicitTz) if err != nil { return NewTime(ZeroCoreTime, tp, DefaultFsp), errors.Trace(err) } t.SetType(tp) - if err = t.check(sc); err != nil { + if err = t.check(sc, explicitTz); err != nil { return NewTime(ZeroCoreTime, tp, DefaultFsp), errors.Trace(err) } return t, nil @@ -1999,18 +2013,18 @@ func parseTime(sc *stmtctx.StatementContext, str string, tp byte, fsp int, isFlo // ParseDatetime is a helper function wrapping ParseTime with datetime type and default fsp. func ParseDatetime(sc *stmtctx.StatementContext, str string) (Time, error) { - return ParseTime(sc, str, mysql.TypeDatetime, GetFsp(str)) + return ParseTime(sc, str, mysql.TypeDatetime, GetFsp(str), nil) } // ParseTimestamp is a helper function wrapping ParseTime with timestamp type and default fsp. func ParseTimestamp(sc *stmtctx.StatementContext, str string) (Time, error) { - return ParseTime(sc, str, mysql.TypeTimestamp, GetFsp(str)) + return ParseTime(sc, str, mysql.TypeTimestamp, GetFsp(str), nil) } // ParseDate is a helper function wrapping ParseTime with date type. func ParseDate(sc *stmtctx.StatementContext, str string) (Time, error) { // date has no fractional seconds precision - return ParseTime(sc, str, mysql.TypeDate, MinFsp) + return ParseTime(sc, str, mysql.TypeDate, MinFsp, nil) } // ParseTimeFromYear parse a `YYYY` formed year to corresponded Datetime type. @@ -2054,7 +2068,7 @@ func ParseTimeFromNum(sc *stmtctx.StatementContext, num int64, tp byte, fsp int) t.SetType(tp) t.SetFsp(fsp) - if err := t.check(sc); err != nil { + if err := t.check(sc, nil); err != nil { return NewTime(ZeroCoreTime, tp, DefaultFsp), errors.Trace(err) } return t, nil @@ -2143,7 +2157,7 @@ func checkMonthDay(year, month, day int, allowInvalidDate bool) error { return nil } -func checkTimestampType(sc *stmtctx.StatementContext, t CoreTime) error { +func checkTimestampType(sc *stmtctx.StatementContext, t CoreTime, explicitTz *gotime.Location) error { if compareTime(t, ZeroCoreTime) == 0 { return nil } @@ -2153,9 +2167,13 @@ func checkTimestampType(sc *stmtctx.StatementContext, t CoreTime) error { } var checkTime CoreTime - if sc.TimeZone != BoundTimezone { + tz := sc.TimeZone + if explicitTz != nil { + tz = explicitTz + } + if tz != BoundTimezone { convertTime := NewTime(t, mysql.TypeTimestamp, DefaultFsp) - err := convertTime.ConvertTimeZone(sc.TimeZone, BoundTimezone) + err := convertTime.ConvertTimeZone(tz, BoundTimezone) if err != nil { return err } @@ -2167,7 +2185,7 @@ func checkTimestampType(sc *stmtctx.StatementContext, t CoreTime) error { return errors.Trace(ErrWrongValue.GenWithStackByArgs(TimeStr, t)) } - if _, err := t.GoTime(sc.TimeZone); err != nil { + if _, err := t.GoTime(tz); err != nil { return errors.Trace(err) } @@ -2891,7 +2909,7 @@ func (t *Time) StrToDate(sc *stmtctx.StatementContext, date, format string) bool t.SetCoreTime(tm) t.SetType(mysql.TypeDatetime) - if t.check(sc) != nil { + if t.check(sc, nil) != nil { return false } if warning { diff --git a/types/time_test.go b/types/time_test.go index cf14ca56f8f0a..db74d9642acbe 100644 --- a/types/time_test.go +++ b/types/time_test.go @@ -147,12 +147,12 @@ func TestDateTime(t *testing.T) { } for _, test := range fspTbl { - v, err := types.ParseTime(sc, test.Input, mysql.TypeDatetime, test.Fsp) + v, err := types.ParseTime(sc, test.Input, mysql.TypeDatetime, test.Fsp, nil) require.NoError(t, err) require.Equal(t, test.Expect, v.String()) } - v, _ := types.ParseTime(sc, "121231113045.9999999", mysql.TypeDatetime, 6) + v, _ := types.ParseTime(sc, "121231113045.9999999", mysql.TypeDatetime, 6, nil) require.Equal(t, 46, v.Second()) require.Equal(t, 0, v.Microsecond()) @@ -619,7 +619,7 @@ func TestCodec(t *testing.T) { } for _, test := range tbl { - v, err := types.ParseTime(sc, test, mysql.TypeDatetime, types.MaxFsp) + v, err := types.ParseTime(sc, test, mysql.TypeDatetime, types.MaxFsp, nil) require.NoError(t, err) packed, _ = v.ToPackedUint() @@ -727,7 +727,7 @@ func TestToNumber(t *testing.T) { } for _, test := range tblDateTime { - v, err := types.ParseTime(sc, test.Input, mysql.TypeDatetime, test.Fsp) + v, err := types.ParseTime(sc, test.Input, mysql.TypeDatetime, test.Fsp, nil) require.NoError(t, err) require.Equal(t, test.Expect, v.ToNumber().String()) } @@ -750,7 +750,7 @@ func TestToNumber(t *testing.T) { } for _, test := range tblDate { - v, err := types.ParseTime(sc, test.Input, mysql.TypeDate, 0) + v, err := types.ParseTime(sc, test.Input, mysql.TypeDate, 0, nil) require.NoError(t, err) require.Equal(t, test.Expect, v.ToNumber().String()) } @@ -871,7 +871,7 @@ func TestRoundFrac(t *testing.T) { } for _, tt := range tbl { - v, err := types.ParseTime(sc, tt.Input, mysql.TypeDatetime, types.MaxFsp) + v, err := types.ParseTime(sc, tt.Input, mysql.TypeDatetime, types.MaxFsp, nil) require.NoError(t, err) nv, err := v.RoundFrac(sc, tt.Fsp) require.NoError(t, err) @@ -896,7 +896,7 @@ func TestRoundFrac(t *testing.T) { } for _, tt := range tbl { - v, err := types.ParseTime(sc, tt.Input, mysql.TypeDatetime, types.MaxFsp) + v, err := types.ParseTime(sc, tt.Input, mysql.TypeDatetime, types.MaxFsp, nil) require.NoError(t, err) nv, err := v.RoundFrac(sc, tt.Fsp) require.NoError(t, err) @@ -960,7 +960,7 @@ func TestConvert(t *testing.T) { } for _, tt := range tbl { - v, err := types.ParseTime(sc, tt.Input, mysql.TypeDatetime, tt.Fsp) + v, err := types.ParseTime(sc, tt.Input, mysql.TypeDatetime, tt.Fsp, nil) require.NoError(t, err) nv, err := v.ConvertToDuration() require.NoError(t, err) @@ -1005,7 +1005,7 @@ func TestCompare(t *testing.T) { } for _, tt := range tbl { - v1, err := types.ParseTime(sc, tt.Arg1, mysql.TypeDatetime, types.MaxFsp) + v1, err := types.ParseTime(sc, tt.Arg1, mysql.TypeDatetime, types.MaxFsp, nil) require.NoError(t, err) ret, err := v1.CompareString(nil, tt.Arg2) @@ -1013,7 +1013,7 @@ func TestCompare(t *testing.T) { require.Equal(t, tt.Ret, ret) } - v1, err := types.ParseTime(sc, "2011-10-10 11:11:11", mysql.TypeDatetime, types.MaxFsp) + v1, err := types.ParseTime(sc, "2011-10-10 11:11:11", mysql.TypeDatetime, types.MaxFsp, nil) require.NoError(t, err) res, err := v1.CompareString(nil, "Test should error") require.Error(t, err) @@ -1169,11 +1169,11 @@ func TestTimeAdd(t *testing.T) { TimeZone: time.UTC, } for _, tt := range tbl { - v1, err := types.ParseTime(sc, tt.Arg1, mysql.TypeDatetime, types.MaxFsp) + v1, err := types.ParseTime(sc, tt.Arg1, mysql.TypeDatetime, types.MaxFsp, nil) require.NoError(t, err) dur, _, err := types.ParseDuration(sc, tt.Arg2, types.MaxFsp) require.NoError(t, err) - result, err := types.ParseTime(sc, tt.Ret, mysql.TypeDatetime, types.MaxFsp) + result, err := types.ParseTime(sc, tt.Ret, mysql.TypeDatetime, types.MaxFsp, nil) require.NoError(t, err) v2, err := v1.Add(sc, dur) require.NoError(t, err) @@ -1256,7 +1256,7 @@ func TestCheckTimestamp(t *testing.T) { } for _, tt := range tests { - validTimestamp := types.CheckTimestampTypeForTest(&stmtctx.StatementContext{TimeZone: tt.tz}, tt.input) + validTimestamp := types.CheckTimestampTypeForTest(&stmtctx.StatementContext{TimeZone: tt.tz}, tt.input, nil) if tt.expectRetError { require.Errorf(t, validTimestamp, "For %s %s", tt.input, tt.tz) } else { @@ -1313,7 +1313,7 @@ func TestCheckTimestamp(t *testing.T) { } for _, tt := range tests { - validTimestamp := types.CheckTimestampTypeForTest(&stmtctx.StatementContext{TimeZone: tt.tz}, tt.input) + validTimestamp := types.CheckTimestampTypeForTest(&stmtctx.StatementContext{TimeZone: tt.tz}, tt.input, nil) if tt.expectRetError { require.Errorf(t, validTimestamp, "For %s %s", tt.input, tt.tz) } else { @@ -1991,9 +1991,9 @@ func TestTimeSub(t *testing.T) { TimeZone: time.UTC, } for _, tt := range tbl { - v1, err := types.ParseTime(sc, tt.Arg1, mysql.TypeDatetime, types.MaxFsp) + v1, err := types.ParseTime(sc, tt.Arg1, mysql.TypeDatetime, types.MaxFsp, nil) require.NoError(t, err) - v2, err := types.ParseTime(sc, tt.Arg2, mysql.TypeDatetime, types.MaxFsp) + v2, err := types.ParseTime(sc, tt.Arg2, mysql.TypeDatetime, types.MaxFsp, nil) require.NoError(t, err) dur, _, err := types.ParseDuration(sc, tt.Ret, types.MaxFsp) require.NoError(t, err) @@ -2190,7 +2190,7 @@ func TestParseWithTimezone(t *testing.T) { }, } for ith, ca := range cases { - v, err := types.ParseTime(&stmtctx.StatementContext{TimeZone: ca.sysTZ}, ca.lit, mysql.TypeTimestamp, ca.fsp) + v, err := types.ParseTime(&stmtctx.StatementContext{TimeZone: ca.sysTZ}, ca.lit, mysql.TypeTimestamp, ca.fsp, nil) require.NoErrorf(t, err, "tidb time parse misbehaved on %d", ith) if err != nil { continue @@ -2203,7 +2203,7 @@ func TestParseWithTimezone(t *testing.T) { func TestMarshalTime(t *testing.T) { sc := mock.NewContext().GetSessionVars().StmtCtx - v1, err := types.ParseTime(sc, "2017-01-18 01:01:01.123456", mysql.TypeDatetime, types.MaxFsp) + v1, err := types.ParseTime(sc, "2017-01-18 01:01:01.123456", mysql.TypeDatetime, types.MaxFsp, nil) require.NoError(t, err) j, err := json.Marshal(v1) require.NoError(t, err) @@ -2226,7 +2226,7 @@ func BenchmarkTimeAdd(b *testing.B) { sc := &stmtctx.StatementContext{ TimeZone: time.UTC, } - arg1, _ := types.ParseTime(sc, "2017-01-18", mysql.TypeDatetime, types.MaxFsp) + arg1, _ := types.ParseTime(sc, "2017-01-18", mysql.TypeDatetime, types.MaxFsp, nil) arg2, _, _ := types.ParseDuration(sc, "12:30:59", types.MaxFsp) for i := 0; i < b.N; i++ { _, err := arg1.Add(sc, arg2) diff --git a/util/BUILD.bazel b/util/BUILD.bazel index b63581d187f66..f0a137cb20431 100644 --- a/util/BUILD.bazel +++ b/util/BUILD.bazel @@ -46,6 +46,7 @@ go_library( "@io_etcd_go_etcd_client_v3//:client", "@io_etcd_go_etcd_client_v3//concurrency", "@org_golang_google_grpc//:grpc", + "@org_uber_go_atomic//:atomic", "@org_uber_go_zap//:zap", ], ) diff --git a/util/cgroup/BUILD.bazel b/util/cgroup/BUILD.bazel index a5c5e3f75d358..710c9f930f535 100644 --- a/util/cgroup/BUILD.bazel +++ b/util/cgroup/BUILD.bazel @@ -21,7 +21,11 @@ go_library( go_test( name = "cgroup_test", - srcs = ["cgroup_mock_test.go"], + timeout = "short", + srcs = [ + "cgroup_cpu_test.go", + "cgroup_mock_test.go", + ], embed = [":cgroup"], flaky = True, deps = ["@com_github_stretchr_testify//require"], diff --git a/util/cgroup/cgroup_cpu.go b/util/cgroup/cgroup_cpu.go index 29092c96914b6..fdfdf2c9f979d 100644 --- a/util/cgroup/cgroup_cpu.go +++ b/util/cgroup/cgroup_cpu.go @@ -21,6 +21,8 @@ import ( "github.com/pingcap/errors" ) +var errNoCPUControllerDetected = errors.New("no cpu controller detected") + // Helper function for getCgroupCPU. Root is always "/", except in tests. func getCgroupCPU(root string) (CPUUsage, error) { path, err := detectControlPath(filepath.Join(root, procPathCGroup), "cpu,cpuacct") @@ -30,7 +32,7 @@ func getCgroupCPU(root string) (CPUUsage, error) { // No CPU controller detected if path == "" { - return CPUUsage{}, errors.New("no cpu controller detected") + return CPUUsage{}, errNoCPUControllerDetected } mount, ver, err := getCgroupDetails(filepath.Join(root, procPathMountInfo), path, "cpu,cpuacct") @@ -67,3 +69,12 @@ func getCgroupCPU(root string) (CPUUsage, error) { return res, nil } + +// CPUShares returns the number of CPUs this cgroup can be expected to +// max out. If there's no limit, NumCPU is returned. +func (c CPUUsage) CPUShares() float64 { + if c.Period <= 0 || c.Quota <= 0 { + return float64(c.NumCPU) + } + return float64(c.Quota) / float64(c.Period) +} diff --git a/util/cgroup/cgroup_cpu_linux.go b/util/cgroup/cgroup_cpu_linux.go index 69cde58c5d2cd..0322e6282e5a4 100644 --- a/util/cgroup/cgroup_cpu_linux.go +++ b/util/cgroup/cgroup_cpu_linux.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build linux -// +build linux package cgroup @@ -24,15 +23,6 @@ import ( "strings" ) -// CPUShares returns the number of CPUs this cgroup can be expected to -// max out. If there's no limit, NumCPU is returned. -func (c CPUUsage) CPUShares() float64 { - if c.Period <= 0 || c.Quota <= 0 { - return float64(c.NumCPU) - } - return float64(c.Quota) / float64(c.Period) -} - // GetCgroupCPU returns the CPU usage and quota for the current cgroup. func GetCgroupCPU() (CPUUsage, error) { cpuusage, err := getCgroupCPU("/") diff --git a/util/cgroup/cgroup_cpu_test.go b/util/cgroup/cgroup_cpu_test.go new file mode 100644 index 0000000000000..7c74994a7dbb0 --- /dev/null +++ b/util/cgroup/cgroup_cpu_test.go @@ -0,0 +1,54 @@ +// 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, +// 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. + +//go:build linux + +package cgroup + +import ( + "runtime" + "sync" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestGetCgroupCPU(t *testing.T) { + exit := make(chan struct{}) + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for { + select { + case <-exit: + return + default: + runtime.Gosched() + } + } + }() + } + cpu, err := GetCgroupCPU() + if err == errNoCPUControllerDetected { + require.False(t, InContainer(), "Please check linux version > v4.7.x. This is related to cgroup compatibility.") + } else { + require.NoError(t, err) + require.NotZero(t, cpu.Period) + require.Less(t, int64(1), cpu.Period) + } + close(exit) + wg.Wait() +} diff --git a/util/cgroup/cgroup_cpu_unsupport.go b/util/cgroup/cgroup_cpu_unsupport.go index 8e0550fd7b3a9..97cb9f4ef3b73 100644 --- a/util/cgroup/cgroup_cpu_unsupport.go +++ b/util/cgroup/cgroup_cpu_unsupport.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build !linux -// +build !linux package cgroup diff --git a/util/chunk/alloc.go b/util/chunk/alloc.go index af3385a644389..e9ebaf2e59efd 100644 --- a/util/chunk/alloc.go +++ b/util/chunk/alloc.go @@ -129,11 +129,12 @@ func (a *allocator) Reset() { //column objects and put them to the column allocator for reuse. for id, pool := range a.columnAlloc.pool { - for _, col := range pool.allocColumns { + for i, col := range pool.allocColumns { if (len(pool.freeColumns) < a.columnAlloc.freeColumnsPerType) && checkColumnType(id, col) { col.reset() pool.freeColumns = append(pool.freeColumns, col) } + pool.allocColumns[i] = nil } pool.allocColumns = pool.allocColumns[:0] } @@ -196,6 +197,7 @@ func (cList *columnList) pop() *Column { return nil } col := cList.freeColumns[len(cList.freeColumns)-1] + cList.freeColumns[len(cList.freeColumns)-1] = nil cList.freeColumns = cList.freeColumns[:len(cList.freeColumns)-1] return col } diff --git a/util/chunk/row.go b/util/chunk/row.go index 96aa92acb65fb..70cd974d6ffd5 100644 --- a/util/chunk/row.go +++ b/util/chunk/row.go @@ -115,10 +115,14 @@ func (r Row) GetJSON(colIdx int) types.BinaryJSON { // Keep in mind that GetDatumRow has a reference to r.c, which is a chunk, // this function works only if the underlying chunk is valid or unchanged. func (r Row) GetDatumRow(fields []*types.FieldType) []types.Datum { - datumRow := make([]types.Datum, 0, r.c.NumCols()) - for colIdx := 0; colIdx < r.c.NumCols(); colIdx++ { - datum := r.GetDatum(colIdx, fields[colIdx]) - datumRow = append(datumRow, datum) + datumRow := make([]types.Datum, r.c.NumCols()) + return r.GetDatumRowWithBuffer(fields, datumRow) +} + +// GetDatumRowWithBuffer gets datum using the buffer datumRow. +func (r Row) GetDatumRowWithBuffer(fields []*types.FieldType, datumRow []types.Datum) []types.Datum { + for colIdx := 0; colIdx < len(datumRow); colIdx++ { + r.GetDatumWithBuffer(colIdx, fields[colIdx], &datumRow[colIdx]) } return datumRow } @@ -126,6 +130,12 @@ func (r Row) GetDatumRow(fields []*types.FieldType) []types.Datum { // GetDatum implements the chunk.Row interface. func (r Row) GetDatum(colIdx int, tp *types.FieldType) types.Datum { var d types.Datum + r.GetDatumWithBuffer(colIdx, tp, &d) + return d +} + +// GetDatumWithBuffer gets datum using the buffer d. +func (r Row) GetDatumWithBuffer(colIdx int, tp *types.FieldType, d *types.Datum) types.Datum { switch tp.GetType() { case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong: if !r.IsNull(colIdx) { @@ -192,7 +202,10 @@ func (r Row) GetDatum(colIdx int, tp *types.FieldType) types.Datum { d.SetMysqlJSON(r.GetJSON(colIdx)) } } - return d + if r.IsNull(colIdx) { + d.SetNull() + } + return *d } // GetRaw returns the underlying raw bytes with the colIdx. diff --git a/util/chunk/row_container.go b/util/chunk/row_container.go index d40a9846c47ab..7ae1a67879b03 100644 --- a/util/chunk/row_container.go +++ b/util/chunk/row_container.go @@ -472,14 +472,16 @@ func (c *SortedRowContainer) Close() error { func (c *SortedRowContainer) lessRow(rowI, rowJ Row) bool { for i, colIdx := range c.keyColumns { cmpFunc := c.keyCmpFuncs[i] - cmp := cmpFunc(rowI, colIdx, rowJ, colIdx) - if c.ByItemsDesc[i] { - cmp = -cmp - } - if cmp < 0 { - return true - } else if cmp > 0 { - return false + if cmpFunc != nil { + cmp := cmpFunc(rowI, colIdx, rowJ, colIdx) + if c.ByItemsDesc[i] { + cmp = -cmp + } + if cmp < 0 { + return true + } else if cmp > 0 { + return false + } } } return false diff --git a/util/codec/codec.go b/util/codec/codec.go index a2136d97ed7a0..29af9a2f01f80 100644 --- a/util/codec/codec.go +++ b/util/codec/codec.go @@ -920,6 +920,9 @@ func DecodeAsFloat32(b []byte, tp byte) (remain []byte, d types.Datum, err error } var v float64 b, v, err = DecodeFloat(b) + if err != nil { + return nil, d, err + } d.SetFloat32FromF64(v) return b, d, nil } diff --git a/util/codec/codec_test.go b/util/codec/codec_test.go index 61447827e5650..3e7519d29f455 100644 --- a/util/codec/codec_test.go +++ b/util/codec/codec_test.go @@ -520,7 +520,7 @@ func TestBytes(t *testing.T) { func parseTime(t *testing.T, s string) types.Time { sc := &stmtctx.StatementContext{TimeZone: time.UTC} - m, err := types.ParseTime(sc, s, mysql.TypeDatetime, types.DefaultFsp) + m, err := types.ParseTime(sc, s, mysql.TypeDatetime, types.DefaultFsp, nil) require.NoError(t, err) return m } diff --git a/util/cpu/BUILD.bazel b/util/cpu/BUILD.bazel new file mode 100644 index 0000000000000..1c351382fc238 --- /dev/null +++ b/util/cpu/BUILD.bazel @@ -0,0 +1,27 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "cpu", + srcs = ["cpu.go"], + importpath = "github.com/pingcap/tidb/util/cpu", + visibility = ["//visibility:public"], + deps = [ + "//metrics", + "//util/cgroup", + "//util/mathutil", + "@com_github_cloudfoundry_gosigar//:gosigar", + "@com_github_pingcap_log//:log", + "@org_uber_go_atomic//:atomic", + "@org_uber_go_zap//:zap", + ], +) + +go_test( + name = "cpu_test", + timeout = "short", + srcs = ["cpu_test.go"], + embed = [":cpu"], + flaky = True, + race = "on", + deps = ["@com_github_stretchr_testify//require"], +) diff --git a/util/cpu/cpu.go b/util/cpu/cpu.go new file mode 100644 index 0000000000000..2803b4e106c49 --- /dev/null +++ b/util/cpu/cpu.go @@ -0,0 +1,113 @@ +// 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, +// 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 cpu + +import ( + "os" + "sync" + "time" + + "github.com/cloudfoundry/gosigar" + "github.com/pingcap/log" + "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/util/cgroup" + "github.com/pingcap/tidb/util/mathutil" + "go.uber.org/atomic" + "go.uber.org/zap" +) + +var cpuUsage atomic.Float64 + +// GetCPUUsage returns the cpu usage of the current process. +func GetCPUUsage() float64 { + return cpuUsage.Load() +} + +// Observer is used to observe the cpu usage of the current process. +type Observer struct { + utime int64 + stime int64 + now int64 + exit chan struct{} + cpu mathutil.ExponentialMovingAverage + wg sync.WaitGroup +} + +// NewCPUObserver returns a cpu observer. +func NewCPUObserver() *Observer { + return &Observer{ + exit: make(chan struct{}), + now: time.Now().UnixNano(), + cpu: *mathutil.NewExponentialMovingAverage(0.95, 10), + } +} + +// Start starts the cpu observer. +func (c *Observer) Start() { + c.wg.Add(1) + go func() { + ticker := time.NewTicker(100 * time.Millisecond) + defer func() { + ticker.Stop() + c.wg.Done() + }() + for { + select { + case <-ticker.C: + curr := c.observe() + c.cpu.Add(curr) + cpuUsage.Store(c.cpu.Get()) + metrics.EMACPUUsageGauge.Set(c.cpu.Get()) + case <-c.exit: + return + } + } + }() +} + +// Stop stops the cpu observer. +func (c *Observer) Stop() { + close(c.exit) + c.wg.Wait() +} + +func (c *Observer) observe() float64 { + user, sys, err := getCPUTime() + if err != nil { + log.Error("getCPUTime", zap.Error(err)) + } + cgroupCPU, _ := cgroup.GetCgroupCPU() + cpuShare := cgroupCPU.CPUShares() + now := time.Now().UnixNano() + dur := float64(now - c.now) + utime := user * 1e6 + stime := sys * 1e6 + urate := float64(utime-c.utime) / dur + srate := float64(stime-c.stime) / dur + c.now = now + c.utime = utime + c.stime = stime + return (srate + urate) / cpuShare +} + +// getCPUTime returns the cumulative user/system time (in ms) since the process start. +func getCPUTime() (userTimeMillis, sysTimeMillis int64, err error) { + pid := os.Getpid() + cpuTime := sigar.ProcTime{} + if err := cpuTime.Get(pid); err != nil { + return 0, 0, err + } + return int64(cpuTime.User), int64(cpuTime.Sys), nil +} diff --git a/util/cpu/cpu_test.go b/util/cpu/cpu_test.go new file mode 100644 index 0000000000000..a191227b72f78 --- /dev/null +++ b/util/cpu/cpu_test.go @@ -0,0 +1,51 @@ +// 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, +// 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 cpu + +import ( + "runtime" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestCPUValue(t *testing.T) { + observer := NewCPUObserver() + exit := make(chan struct{}) + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for { + select { + case <-exit: + return + default: + runtime.Gosched() + } + } + }() + } + observer.Start() + time.Sleep(5 * time.Second) + require.GreaterOrEqual(t, GetCPUUsage(), 0.0) + require.Less(t, GetCPUUsage(), 1.0) + observer.Stop() + close(exit) + wg.Wait() +} diff --git a/util/cpuprofile/cpuprofile_test.go b/util/cpuprofile/cpuprofile_test.go index 2d400264ede10..b20428dcf21fd 100644 --- a/util/cpuprofile/cpuprofile_test.go +++ b/util/cpuprofile/cpuprofile_test.go @@ -18,7 +18,6 @@ import ( "bytes" "context" "io" - "io/ioutil" "net" "net/http" "runtime/pprof" @@ -237,7 +236,7 @@ func TestProfileHTTPHandler(t *testing.T) { resp, err = http.Get("http://" + address + "/debug/pprof/profile?seconds=100000") require.NoError(t, err) require.Equal(t, 400, resp.StatusCode) - body, err := ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) require.NoError(t, err) require.Equal(t, "profile duration exceeds server's WriteTimeout\n", string(body)) require.NoError(t, resp.Body.Close()) diff --git a/util/dbterror/ddl_terror.go b/util/dbterror/ddl_terror.go index 65a02fb23da24..ddacf77c025ef 100644 --- a/util/dbterror/ddl_terror.go +++ b/util/dbterror/ddl_terror.go @@ -369,6 +369,8 @@ var ( ErrDependentByFunctionalIndex = ClassDDL.NewStd(mysql.ErrDependentByFunctionalIndex) // ErrFunctionalIndexOnBlob when the expression of expression index returns blob or text. ErrFunctionalIndexOnBlob = ClassDDL.NewStd(mysql.ErrFunctionalIndexOnBlob) + // ErrDependentByPartitionFunctional returns when the dropped column depends by expression partition. + ErrDependentByPartitionFunctional = ClassDDL.NewStd(mysql.ErrDependentByPartitionFunctional) // ErrUnsupportedAlterTableSpec means we don't support this alter table specification (i.e. unknown) ErrUnsupportedAlterTableSpec = ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "Unsupported/unknown ALTER TABLE specification"), nil)) @@ -391,6 +393,8 @@ var ( ErrCannotCancelDDLJob = ClassDDL.NewStd(mysql.ErrCannotCancelDDLJob) // ErrDDLSetting returns when failing to enable/disable DDL ErrDDLSetting = ClassDDL.NewStd(mysql.ErrDDLSetting) + // ErrIngestFailed returns when the DDL ingest job is failed. + ErrIngestFailed = ClassDDL.NewStd(mysql.ErrIngestFailed) // ErrColumnInChange indicates there is modification on the column in parallel. ErrColumnInChange = ClassDDL.NewStd(mysql.ErrColumnInChange) @@ -416,4 +420,20 @@ var ( ErrForeignKeyColumnCannotChangeChild = ClassDDL.NewStd(mysql.ErrForeignKeyColumnCannotChangeChild) // ErrNoReferencedRow2 returns when there are rows in child table don't have related foreign key value in refer table. ErrNoReferencedRow2 = ClassDDL.NewStd(mysql.ErrNoReferencedRow2) + + // ErrUnsupportedColumnInTTLConfig returns when a column type is not expected in TTL config + ErrUnsupportedColumnInTTLConfig = ClassDDL.NewStd(mysql.ErrUnsupportedColumnInTTLConfig) + // ErrTTLColumnCannotDrop returns when a column is dropped while referenced by TTL config + ErrTTLColumnCannotDrop = ClassDDL.NewStd(mysql.ErrTTLColumnCannotDrop) + // ErrSetTTLOptionForNonTTLTable returns when the `TTL_ENABLE` or `TTL_JOB_INTERVAL` option is set on a non-TTL table + ErrSetTTLOptionForNonTTLTable = ClassDDL.NewStd(mysql.ErrSetTTLOptionForNonTTLTable) + // ErrTempTableNotAllowedWithTTL returns when setting TTL config for a temp table + ErrTempTableNotAllowedWithTTL = ClassDDL.NewStd(mysql.ErrTempTableNotAllowedWithTTL) + // ErrUnsupportedTTLReferencedByFK returns when the TTL config is set for a table referenced by foreign key + ErrUnsupportedTTLReferencedByFK = ClassDDL.NewStd(mysql.ErrUnsupportedTTLReferencedByFK) + // ErrUnsupportedPrimaryKeyTypeWithTTL returns when create or alter a table with TTL options but the primary key is not supported + ErrUnsupportedPrimaryKeyTypeWithTTL = ClassDDL.NewStd(mysql.ErrUnsupportedPrimaryKeyTypeWithTTL) + + // ErrNotSupportedYet returns when tidb does not support this feature. + ErrNotSupportedYet = ClassDDL.NewStd(mysql.ErrNotSupportedYet) ) diff --git a/util/dbutil/common.go b/util/dbutil/common.go index df54e18bd6909..31bb6d28f4aa1 100644 --- a/util/dbutil/common.go +++ b/util/dbutil/common.go @@ -551,7 +551,7 @@ func AnalyzeValuesFromBuckets(valueString string, cols []*model.ColumnInfo) ([]s if IsTimeTypeAndNeedDecode(col.GetType()) { // check if values[i] is already a time string sc := &stmtctx.StatementContext{TimeZone: time.UTC} - _, err := types.ParseTime(sc, values[i], col.GetType(), types.MinFsp) + _, err := types.ParseTime(sc, values[i], col.GetType(), types.MinFsp, nil) if err == nil { continue } diff --git a/util/ddl-checker/executable_checker.go b/util/ddl-checker/executable_checker.go index 47fd059a79530..7571cbfe3f524 100644 --- a/util/ddl-checker/executable_checker.go +++ b/util/ddl-checker/executable_checker.go @@ -100,7 +100,7 @@ func (ec *ExecutableChecker) DropTable(context context.Context, tableName string // Close closes the ExecutableChecker func (ec *ExecutableChecker) Close() error { - if !ec.isClosed.CAS(false, true) { + if !ec.isClosed.CompareAndSwap(false, true) { return errors.New("ExecutableChecker is already closed") } ec.session.Close() diff --git a/util/engine/engine.go b/util/engine/engine.go index 68c369154888e..0a1614041f3bc 100644 --- a/util/engine/engine.go +++ b/util/engine/engine.go @@ -21,7 +21,7 @@ import ( // IsTiFlash tests whether the store is based on tiflash engine. func IsTiFlash(store *metapb.Store) bool { for _, label := range store.Labels { - if label.Key == "engine" && label.Value == "tiflash" { + if label.Key == "engine" && (label.Value == "tiflash_compute" || label.Value == "tiflash") { return true } } diff --git a/util/etcd/BUILD.bazel b/util/etcd/BUILD.bazel index 65b3e7a016047..f832e254d74a7 100644 --- a/util/etcd/BUILD.bazel +++ b/util/etcd/BUILD.bazel @@ -8,6 +8,7 @@ go_library( deps = [ "@com_github_pingcap_errors//:errors", "@io_etcd_go_etcd_client_v3//:client", + "@io_etcd_go_etcd_client_v3//namespace", ], ) diff --git a/util/etcd/etcd.go b/util/etcd/etcd.go index 6735adbb9c12a..167889849bf36 100644 --- a/util/etcd/etcd.go +++ b/util/etcd/etcd.go @@ -24,6 +24,7 @@ import ( "github.com/pingcap/errors" clientv3 "go.etcd.io/etcd/client/v3" + "go.etcd.io/etcd/client/v3/namespace" ) // Node organizes the ectd query result as a Trie tree @@ -333,3 +334,10 @@ func keyWithPrefix(prefix, key string) string { return path.Join(prefix, key) } + +// SetEtcdCliByNamespace is used to add an etcd namespace prefix before etcd path. +func SetEtcdCliByNamespace(cli *clientv3.Client, namespacePrefix string) { + cli.KV = namespace.NewKV(cli.KV, namespacePrefix) + cli.Watcher = namespace.NewWatcher(cli.Watcher, namespacePrefix) + cli.Lease = namespace.NewLease(cli.Lease, namespacePrefix) +} diff --git a/util/etcd/etcd_test.go b/util/etcd/etcd_test.go index c99b43bf46841..f98c1393d5f6c 100644 --- a/util/etcd/etcd_test.go +++ b/util/etcd/etcd_test.go @@ -395,3 +395,30 @@ func testSetup(t *testing.T) (context.Context, *Client, *integration.ClusterV3) etcd := NewClient(cluster.RandClient(), "binlog") return context.Background(), etcd, cluster } + +func testSetupOriginal(t *testing.T) (context.Context, *clientv3.Client, *integration.ClusterV3) { + cluster := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1}) + return context.Background(), cluster.RandClient(), cluster +} + +func TestSetEtcdCliByNamespace(t *testing.T) { + integration.BeforeTest(t) + ctx, origEtcdCli, etcdMockCluster := testSetupOriginal(t) + defer etcdMockCluster.Terminate(t) + + namespacePrefix := "testNamespace/" + key := "testkey" + obj := "test" + + unprefixedKV := origEtcdCli.KV + cliNamespace := origEtcdCli + SetEtcdCliByNamespace(cliNamespace, namespacePrefix) + + _, err := cliNamespace.Put(ctx, key, obj) + require.NoError(t, err) + + // verify that kv pair is empty before set + getResp, err := unprefixedKV.Get(ctx, namespacePrefix+key) + require.NoError(t, err) + require.Len(t, getResp.Kvs, 1) +} diff --git a/util/execdetails/execdetails.go b/util/execdetails/execdetails.go index c1c65499ec288..bc88857fe439c 100644 --- a/util/execdetails/execdetails.go +++ b/util/execdetails/execdetails.go @@ -32,19 +32,24 @@ import ( // ExecDetails contains execution detail information. type ExecDetails struct { - BackoffSleep map[string]time.Duration - BackoffTimes map[string]int + DetailsNeedP90 CommitDetail *util.CommitDetails LockKeysDetail *util.LockKeysDetails ScanDetail *util.ScanDetail - CalleeAddress string - TimeDetail util.TimeDetail CopTime time.Duration BackoffTime time.Duration LockKeysDuration time.Duration RequestCount int } +// DetailsNeedP90 contains execution detail information which need calculate P90. +type DetailsNeedP90 struct { + BackoffSleep map[string]time.Duration + BackoffTimes map[string]int + CalleeAddress string + TimeDetail util.TimeDetail +} + type stmtExecDetailKeyType struct{} // StmtExecDetailKey used to carry StmtExecDetail info in context.Context. @@ -320,13 +325,15 @@ func (d ExecDetails) ToZapFields() (fields []zap.Field) { type basicCopRuntimeStats struct { storeType string BasicRuntimeStats - threads int32 + threads int32 + totalTasks int32 + procTimes []time.Duration } // String implements the RuntimeStats interface. func (e *basicCopRuntimeStats) String() string { if e.storeType == "tiflash" { - return fmt.Sprintf("time:%v, loops:%d, threads:%d", FormatDuration(time.Duration(e.consume)), e.loop, e.threads) + return fmt.Sprintf("time:%v, loops:%d, threads:%d, ", FormatDuration(time.Duration(e.consume)), e.loop, e.threads) + e.BasicRuntimeStats.tiflashScanContext.String() } return fmt.Sprintf("time:%v, loops:%d", FormatDuration(time.Duration(e.consume)), e.loop) } @@ -334,9 +341,11 @@ func (e *basicCopRuntimeStats) String() string { // Clone implements the RuntimeStats interface. func (e *basicCopRuntimeStats) Clone() RuntimeStats { return &basicCopRuntimeStats{ - BasicRuntimeStats: BasicRuntimeStats{loop: e.loop, consume: e.consume, rows: e.rows}, + BasicRuntimeStats: BasicRuntimeStats{loop: e.loop, consume: e.consume, rows: e.rows, tiflashScanContext: e.tiflashScanContext.Clone()}, threads: e.threads, storeType: e.storeType, + totalTasks: e.totalTasks, + procTimes: e.procTimes, } } @@ -350,6 +359,13 @@ func (e *basicCopRuntimeStats) Merge(rs RuntimeStats) { e.consume += tmp.consume e.rows += tmp.rows e.threads += tmp.threads + e.totalTasks += tmp.totalTasks + if len(tmp.procTimes) > 0 { + e.procTimes = append(e.procTimes, tmp.procTimes...) + } else { + e.procTimes = append(e.procTimes, time.Duration(tmp.consume)) + } + e.tiflashScanContext.Merge(tmp.tiflashScanContext) } // Tp implements the RuntimeStats interface. @@ -364,7 +380,7 @@ type CopRuntimeStats struct { // have many region leaders, several coprocessor tasks can be sent to the // same tikv-server instance. We have to use a list to maintain all tasks // executed on each instance. - stats map[string][]*basicCopRuntimeStats + stats map[string]*basicCopRuntimeStats scanDetail *util.ScanDetail // do not use kv.StoreType because it will meet cycle import error storeType string @@ -375,35 +391,50 @@ type CopRuntimeStats struct { func (crs *CopRuntimeStats) RecordOneCopTask(address string, summary *tipb.ExecutorExecutionSummary) { crs.Lock() defer crs.Unlock() - crs.stats[address] = append(crs.stats[address], - &basicCopRuntimeStats{BasicRuntimeStats: BasicRuntimeStats{loop: int32(*summary.NumIterations), + + if crs.stats[address] == nil { + crs.stats[address] = &basicCopRuntimeStats{ + storeType: crs.storeType, + } + } + crs.stats[address].Merge(&basicCopRuntimeStats{ + storeType: crs.storeType, + BasicRuntimeStats: BasicRuntimeStats{loop: int32(*summary.NumIterations), consume: int64(*summary.TimeProcessedNs), - rows: int64(*summary.NumProducedRows)}, - threads: int32(summary.GetConcurrency()), - storeType: crs.storeType}) + rows: int64(*summary.NumProducedRows), + tiflashScanContext: TiFlashScanContext{ + totalDmfileScannedPacks: summary.GetTiflashScanContext().GetTotalDmfileScannedPacks(), + totalDmfileSkippedPacks: summary.GetTiflashScanContext().GetTotalDmfileSkippedPacks(), + totalDmfileScannedRows: summary.GetTiflashScanContext().GetTotalDmfileScannedRows(), + totalDmfileSkippedRows: summary.GetTiflashScanContext().GetTotalDmfileSkippedRows(), + totalDmfileRoughSetIndexLoadTimeMs: summary.GetTiflashScanContext().GetTotalDmfileRoughSetIndexLoadTimeMs(), + totalDmfileReadTimeMs: summary.GetTiflashScanContext().GetTotalDmfileReadTimeMs(), + totalCreateSnapshotTimeMs: summary.GetTiflashScanContext().GetTotalCreateSnapshotTimeMs(), + totalLocalRegionNum: summary.GetTiflashScanContext().GetTotalLocalRegionNum(), + totalRemoteRegionNum: summary.GetTiflashScanContext().GetTotalRemoteRegionNum()}}, threads: int32(summary.GetConcurrency()), + totalTasks: 1, + }) } // GetActRows return total rows of CopRuntimeStats. func (crs *CopRuntimeStats) GetActRows() (totalRows int64) { for _, instanceStats := range crs.stats { - for _, stat := range instanceStats { - totalRows += stat.rows - } + totalRows += instanceStats.rows } return totalRows } // MergeBasicStats traverses basicCopRuntimeStats in the CopRuntimeStats and collects some useful information. -func (crs *CopRuntimeStats) MergeBasicStats() (procTimes []time.Duration, totalTime time.Duration, totalTasks, totalLoops, totalThreads int32) { +func (crs *CopRuntimeStats) MergeBasicStats() (procTimes []time.Duration, totalTime time.Duration, totalTasks, totalLoops, totalThreads int32, totalTiFlashScanContext TiFlashScanContext) { procTimes = make([]time.Duration, 0, 32) + totalTiFlashScanContext = TiFlashScanContext{} for _, instanceStats := range crs.stats { - for _, stat := range instanceStats { - procTimes = append(procTimes, time.Duration(stat.consume)*time.Nanosecond) - totalTime += time.Duration(stat.consume) - totalLoops += stat.loop - totalThreads += stat.threads - totalTasks++ - } + procTimes = append(procTimes, instanceStats.procTimes...) + totalTime += time.Duration(instanceStats.consume) + totalLoops += instanceStats.loop + totalThreads += instanceStats.threads + totalTiFlashScanContext.Merge(instanceStats.tiflashScanContext) + totalTasks += instanceStats.totalTasks } return } @@ -413,7 +444,7 @@ func (crs *CopRuntimeStats) String() string { return "" } - procTimes, totalTime, totalTasks, totalLoops, totalThreads := crs.MergeBasicStats() + procTimes, totalTime, totalTasks, totalLoops, totalThreads, totalTiFlashScanContext := crs.MergeBasicStats() avgTime := time.Duration(totalTime.Nanoseconds() / int64(totalTasks)) isTiFlashCop := crs.storeType == "tiflash" @@ -422,6 +453,9 @@ func (crs *CopRuntimeStats) String() string { buf.WriteString(fmt.Sprintf("%v_task:{time:%v, loops:%d", crs.storeType, FormatDuration(procTimes[0]), totalLoops)) if isTiFlashCop { buf.WriteString(fmt.Sprintf(", threads:%d}", totalThreads)) + if !totalTiFlashScanContext.Empty() { + buf.WriteString(", " + totalTiFlashScanContext.String()) + } } else { buf.WriteString("}") } @@ -433,6 +467,9 @@ func (crs *CopRuntimeStats) String() string { FormatDuration(procTimes[n*4/5]), FormatDuration(procTimes[n*19/20]), totalLoops, totalTasks)) if isTiFlashCop { buf.WriteString(fmt.Sprintf(", threads:%d}", totalThreads)) + if !totalTiFlashScanContext.Empty() { + buf.WriteString(", " + totalTiFlashScanContext.String()) + } } else { buf.WriteString("}") } @@ -480,6 +517,10 @@ const ( TpBasicCopRunTimeStats // TpUpdateRuntimeStats is the tp for UpdateRuntimeStats TpUpdateRuntimeStats + // TpFKCheckRuntimeStats is the tp for FKCheckRuntimeStats + TpFKCheckRuntimeStats + // TpFKCascadeRuntimeStats is the tp for FKCascadeRuntimeStats + TpFKCascadeRuntimeStats ) // RuntimeStats is used to express the executor runtime information. @@ -490,6 +531,56 @@ type RuntimeStats interface { Tp() int } +// TiFlashScanContext is used to express the table scan information in tiflash +type TiFlashScanContext struct { + totalDmfileScannedPacks uint64 + totalDmfileScannedRows uint64 + totalDmfileSkippedPacks uint64 + totalDmfileSkippedRows uint64 + totalDmfileRoughSetIndexLoadTimeMs uint64 + totalDmfileReadTimeMs uint64 + totalCreateSnapshotTimeMs uint64 + totalLocalRegionNum uint64 + totalRemoteRegionNum uint64 +} + +// Clone implements the deep copy of * TiFlashshScanContext +func (context *TiFlashScanContext) Clone() TiFlashScanContext { + return TiFlashScanContext{ + totalDmfileScannedPacks: context.totalDmfileScannedPacks, + totalDmfileScannedRows: context.totalDmfileScannedRows, + totalDmfileSkippedPacks: context.totalDmfileSkippedPacks, + totalDmfileSkippedRows: context.totalDmfileSkippedRows, + totalDmfileRoughSetIndexLoadTimeMs: context.totalDmfileRoughSetIndexLoadTimeMs, + totalDmfileReadTimeMs: context.totalDmfileReadTimeMs, + totalCreateSnapshotTimeMs: context.totalCreateSnapshotTimeMs, + totalLocalRegionNum: context.totalLocalRegionNum, + totalRemoteRegionNum: context.totalRemoteRegionNum, + } +} +func (context *TiFlashScanContext) String() string { + return fmt.Sprintf("tiflash_scan:{dtfile:{total_scanned_packs:%d, total_skipped_packs:%d, total_scanned_rows:%d, total_skipped_rows:%d, total_rs_index_load_time: %dms, total_read_time: %dms}, total_create_snapshot_time: %dms, total_local_region_num: %d, total_remote_region_num: %d}", context.totalDmfileScannedPacks, context.totalDmfileSkippedPacks, context.totalDmfileScannedRows, context.totalDmfileSkippedRows, context.totalDmfileRoughSetIndexLoadTimeMs, context.totalDmfileReadTimeMs, context.totalCreateSnapshotTimeMs, context.totalLocalRegionNum, context.totalRemoteRegionNum) +} + +// Merge make sum to merge the information in TiFlashScanContext +func (context *TiFlashScanContext) Merge(other TiFlashScanContext) { + context.totalDmfileScannedPacks += other.totalDmfileScannedPacks + context.totalDmfileScannedRows += other.totalDmfileScannedRows + context.totalDmfileSkippedPacks += other.totalDmfileSkippedPacks + context.totalDmfileSkippedRows += other.totalDmfileSkippedRows + context.totalDmfileRoughSetIndexLoadTimeMs += other.totalDmfileRoughSetIndexLoadTimeMs + context.totalDmfileReadTimeMs += other.totalDmfileReadTimeMs + context.totalCreateSnapshotTimeMs += other.totalCreateSnapshotTimeMs + context.totalLocalRegionNum += other.totalLocalRegionNum + context.totalRemoteRegionNum += other.totalRemoteRegionNum +} + +// Empty check whether TiFlashScanContext is Empty, if scan no pack and skip no pack, we regard it as empty +func (context *TiFlashScanContext) Empty() bool { + res := (context.totalDmfileScannedPacks == 0 && context.totalDmfileSkippedPacks == 0) + return res +} + // BasicRuntimeStats is the basic runtime stats. type BasicRuntimeStats struct { // executor's Next() called times. @@ -498,6 +589,8 @@ type BasicRuntimeStats struct { consume int64 // executor return row count. rows int64 + // executor extra infos + tiflashScanContext TiFlashScanContext } // GetActRows return total rows of BasicRuntimeStats. @@ -508,9 +601,10 @@ func (e *BasicRuntimeStats) GetActRows() int64 { // Clone implements the RuntimeStats interface. func (e *BasicRuntimeStats) Clone() RuntimeStats { return &BasicRuntimeStats{ - loop: e.loop, - consume: e.consume, - rows: e.rows, + loop: e.loop, + consume: e.consume, + rows: e.rows, + tiflashScanContext: e.tiflashScanContext.Clone(), } } @@ -523,6 +617,7 @@ func (e *BasicRuntimeStats) Merge(rs RuntimeStats) { e.loop += tmp.loop e.consume += tmp.consume e.rows += tmp.rows + e.tiflashScanContext.Merge(tmp.tiflashScanContext) } // Tp implements the RuntimeStats interface. @@ -532,65 +627,33 @@ func (*BasicRuntimeStats) Tp() int { // RootRuntimeStats is the executor runtime stats that combine with multiple runtime stats. type RootRuntimeStats struct { - basics []*BasicRuntimeStats - groupRss [][]RuntimeStats + basic *BasicRuntimeStats + groupRss []RuntimeStats } -// GetActRows return total rows of RootRuntimeStats. -func (e *RootRuntimeStats) GetActRows() int64 { - num := int64(0) - for _, basic := range e.basics { - num += basic.GetActRows() - } - return num +// NewRootRuntimeStats returns a new RootRuntimeStats +func NewRootRuntimeStats() *RootRuntimeStats { + return &RootRuntimeStats{} } -// MergeBasicStats merges BasicRuntimeStats in the RootRuntimeStats into single one. -func (e *RootRuntimeStats) MergeBasicStats() *BasicRuntimeStats { - if len(e.basics) == 0 { - return nil - } - basic := e.basics[0].Clone().(*BasicRuntimeStats) - for i := 1; i < len(e.basics); i++ { - basic.Merge(e.basics[i]) - } - return basic -} - -// MergeGroupStats merges every slice in e.groupRss into single RuntimeStats. -func (e *RootRuntimeStats) MergeGroupStats() (res []RuntimeStats) { - if len(e.groupRss) == 0 { - return nil - } - for _, rss := range e.groupRss { - if len(rss) == 0 { - continue - } else if len(rss) == 1 { - res = append(res, rss[0]) - continue - } - rs := rss[0].Clone() - for i := 1; i < len(rss); i++ { - rs.Merge(rss[i]) - } - res = append(res, rs) +// GetActRows return total rows of RootRuntimeStats. +func (e *RootRuntimeStats) GetActRows() int64 { + if e.basic == nil { + return 0 } - return + return e.basic.rows } // MergeStats merges stats in the RootRuntimeStats and return the stats suitable for display directly. func (e *RootRuntimeStats) MergeStats() (basic *BasicRuntimeStats, groups []RuntimeStats) { - basic = e.MergeBasicStats() - groups = e.MergeGroupStats() - return + return e.basic, e.groupRss } // String implements the RuntimeStats interface. func (e *RootRuntimeStats) String() string { basic, groups := e.MergeStats() strs := make([]string, 0, len(groups)+1) - basicStr := basic.String() - if len(basicStr) > 0 { + if basic != nil { strs = append(strs, basic.String()) } for _, group := range groups { @@ -664,38 +727,46 @@ func (e *RuntimeStatsColl) RegisterStats(planID int, info RuntimeStats) { e.mu.Lock() stats, ok := e.rootStats[planID] if !ok { - stats = &RootRuntimeStats{} + stats = NewRootRuntimeStats() e.rootStats[planID] = stats } - if basic, ok := info.(*BasicRuntimeStats); ok { - stats.basics = append(stats.basics, basic) - } else { - tp := info.Tp() - found := false - for i, rss := range stats.groupRss { - if len(rss) == 0 { - continue - } - if rss[0].Tp() == tp { - stats.groupRss[i] = append(stats.groupRss[i], info) - found = true - break - } - } - if !found { - stats.groupRss = append(stats.groupRss, []RuntimeStats{info}) + tp := info.Tp() + found := false + for _, rss := range stats.groupRss { + if rss.Tp() == tp { + rss.Merge(info) + found = true + break } } + if !found { + stats.groupRss = append(stats.groupRss, info.Clone()) + } e.mu.Unlock() } +// GetBasicRuntimeStats gets basicRuntimeStats for a executor. +func (e *RuntimeStatsColl) GetBasicRuntimeStats(planID int) *BasicRuntimeStats { + e.mu.Lock() + defer e.mu.Unlock() + stats, ok := e.rootStats[planID] + if !ok { + stats = NewRootRuntimeStats() + e.rootStats[planID] = stats + } + if stats.basic == nil { + stats.basic = &BasicRuntimeStats{} + } + return stats.basic +} + // GetRootStats gets execStat for a executor. func (e *RuntimeStatsColl) GetRootStats(planID int) *RootRuntimeStats { e.mu.Lock() defer e.mu.Unlock() runtimeStats, exists := e.rootStats[planID] if !exists { - runtimeStats = &RootRuntimeStats{} + runtimeStats = NewRootRuntimeStats() e.rootStats[planID] = runtimeStats } return runtimeStats @@ -719,7 +790,7 @@ func (e *RuntimeStatsColl) GetOrCreateCopStats(planID int, storeType string) *Co copStats, ok := e.copStats[planID] if !ok { copStats = &CopRuntimeStats{ - stats: make(map[string][]*basicCopRuntimeStats), + stats: make(map[string]*basicCopRuntimeStats), scanDetail: &util.ScanDetail{}, storeType: storeType, } diff --git a/util/execdetails/execdetails_test.go b/util/execdetails/execdetails_test.go index 1f14f9f933509..21dd8ec8a9a50 100644 --- a/util/execdetails/execdetails_test.go +++ b/util/execdetails/execdetails_test.go @@ -109,10 +109,10 @@ func TestString(t *testing.T) { RocksdbBlockReadByte: 100, RocksdbBlockReadDuration: time.Millisecond, }, - TimeDetail: util.TimeDetail{ + DetailsNeedP90: DetailsNeedP90{TimeDetail: util.TimeDetail{ ProcessTime: 2*time.Second + 5*time.Millisecond, WaitTime: time.Second, - }, + }}, } expected := "Cop_time: 1.003 Process_time: 2.005 Wait_time: 1 Backoff_time: 1 Request_count: 1 Prewrite_time: 1 Commit_time: " + "1 Get_commit_ts_time: 1 Get_latest_ts_time: 1 Commit_backoff_time: 1 " + @@ -135,9 +135,20 @@ func mockExecutorExecutionSummary(TimeProcessedNs, NumProducedRows, NumIteration NumIterations: &NumIterations, XXX_unrecognized: nil} } -func mockExecutorExecutionSummaryForTiFlash(TimeProcessedNs, NumProducedRows, NumIterations, Concurrency uint64, ExecutorID string) *tipb.ExecutorExecutionSummary { +func mockExecutorExecutionSummaryForTiFlash(TimeProcessedNs, NumProducedRows, NumIterations, Concurrency, totalDmfileScannedPacks, totalDmfileScannedRows, totalDmfileSkippedPacks, totalDmfileSkippedRows, totalDmfileRoughSetIndexLoadTimeMs, totalDmfileReadTimeMs, totalCreateSnapshotTimeMs uint64, totalLocalRegionNum uint64, totalRemoteRegionNum uint64, ExecutorID string) *tipb.ExecutorExecutionSummary { + tiflashScanContext := tipb.TiFlashScanContext{ + TotalDmfileScannedPacks: &totalDmfileScannedPacks, + TotalDmfileSkippedPacks: &totalDmfileSkippedPacks, + TotalDmfileScannedRows: &totalDmfileScannedRows, + TotalDmfileSkippedRows: &totalDmfileSkippedRows, + TotalDmfileRoughSetIndexLoadTimeMs: &totalDmfileRoughSetIndexLoadTimeMs, + TotalDmfileReadTimeMs: &totalDmfileReadTimeMs, + TotalCreateSnapshotTimeMs: &totalCreateSnapshotTimeMs, + TotalLocalRegionNum: &totalLocalRegionNum, + TotalRemoteRegionNum: &totalRemoteRegionNum, + } return &tipb.ExecutorExecutionSummary{TimeProcessedNs: &TimeProcessedNs, NumProducedRows: &NumProducedRows, - NumIterations: &NumIterations, Concurrency: &Concurrency, ExecutorId: &ExecutorID, XXX_unrecognized: nil} + NumIterations: &NumIterations, Concurrency: &Concurrency, ExecutorId: &ExecutorID, DetailInfo: &tipb.ExecutorExecutionSummary_TiflashScanContext{TiflashScanContext: &tiflashScanContext}, XXX_unrecognized: nil} } func TestCopRuntimeStats(t *testing.T) { @@ -170,9 +181,11 @@ func TestCopRuntimeStats(t *testing.T) { copStats := cop.stats["8.8.8.8"] require.NotNil(t, copStats) - copStats[0].SetRowNum(10) - copStats[0].Record(time.Second, 10) - require.Equal(t, "time:1s, loops:2", copStats[0].String()) + newCopStats := &basicCopRuntimeStats{} + newCopStats.SetRowNum(10) + newCopStats.Record(time.Second, 10) + copStats.Merge(newCopStats) + require.Equal(t, "time:1s, loops:2", copStats.String()) require.Equal(t, "tikv_task:{proc max:4ns, min:3ns, avg: 3ns, p80:4ns, p95:4ns, iters:7, tasks:2}", stats.GetOrCreateCopStats(aggID, "tikv").String()) rootStats := stats.GetRootStats(tableReaderID) @@ -184,7 +197,7 @@ func TestCopRuntimeStats(t *testing.T) { cop.scanDetail.RocksdbKeySkippedCount = 0 cop.scanDetail.RocksdbBlockReadCount = 0 // Print all fields even though the value of some fields is 0. - str := "tikv_task:{proc max:1s, min:2ns, avg: 500ms, p80:1s, p95:1s, iters:4, tasks:2}, " + + str := "tikv_task:{proc max:1s, min:1ns, avg: 500ms, p80:1s, p95:1s, iters:4, tasks:2}, " + "scan_detail: {total_keys: 15, rocksdb: {delete_skipped_count: 5, block: {cache_hit_count: 10, read_byte: 100 Bytes}}}" require.Equal(t, str, cop.String()) @@ -197,10 +210,10 @@ func TestCopRuntimeStatsForTiFlash(t *testing.T) { tableScanID := 1 aggID := 2 tableReaderID := 3 - stats.RecordOneCopTask(aggID, "tiflash", "8.8.8.8", mockExecutorExecutionSummaryForTiFlash(1, 1, 1, 1, "tablescan_"+strconv.Itoa(tableScanID))) - stats.RecordOneCopTask(aggID, "tiflash", "8.8.8.9", mockExecutorExecutionSummaryForTiFlash(2, 2, 2, 1, "tablescan_"+strconv.Itoa(tableScanID))) - stats.RecordOneCopTask(tableScanID, "tiflash", "8.8.8.8", mockExecutorExecutionSummaryForTiFlash(3, 3, 3, 1, "aggregation_"+strconv.Itoa(aggID))) - stats.RecordOneCopTask(tableScanID, "tiflash", "8.8.8.9", mockExecutorExecutionSummaryForTiFlash(4, 4, 4, 1, "aggregation_"+strconv.Itoa(aggID))) + stats.RecordOneCopTask(aggID, "tiflash", "8.8.8.8", mockExecutorExecutionSummaryForTiFlash(1, 1, 1, 1, 1, 8192, 0, 0, 15, 200, 40, 10, 4, "tablescan_"+strconv.Itoa(tableScanID))) + stats.RecordOneCopTask(aggID, "tiflash", "8.8.8.9", mockExecutorExecutionSummaryForTiFlash(2, 2, 2, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, "tablescan_"+strconv.Itoa(tableScanID))) + stats.RecordOneCopTask(tableScanID, "tiflash", "8.8.8.8", mockExecutorExecutionSummaryForTiFlash(3, 3, 3, 1, 2, 12000, 1, 6000, 60, 1000, 20, 5, 1, "aggregation_"+strconv.Itoa(aggID))) + stats.RecordOneCopTask(tableScanID, "tiflash", "8.8.8.9", mockExecutorExecutionSummaryForTiFlash(4, 4, 4, 1, 1, 8192, 10, 80000, 40, 2000, 30, 1, 1, "aggregation_"+strconv.Itoa(aggID))) scanDetail := &util.ScanDetail{ TotalKeys: 10, ProcessedKeys: 10, @@ -214,15 +227,15 @@ func TestCopRuntimeStatsForTiFlash(t *testing.T) { require.True(t, stats.ExistsCopStats(tableScanID)) cop := stats.GetOrCreateCopStats(tableScanID, "tiflash") - require.Equal(t, "tiflash_task:{proc max:2ns, min:1ns, avg: 1ns, p80:2ns, p95:2ns, iters:3, tasks:2, threads:2}", cop.String()) + require.Equal(t, "tiflash_task:{proc max:2ns, min:1ns, avg: 1ns, p80:2ns, p95:2ns, iters:3, tasks:2, threads:2}, tiflash_scan:{dtfile:{total_scanned_packs:1, total_skipped_packs:0, total_scanned_rows:8192, total_skipped_rows:0, total_rs_index_load_time: 15ms, total_read_time: 202ms}, total_create_snapshot_time: 40ms, total_local_region_num: 10, total_remote_region_num: 4}", cop.String()) copStats := cop.stats["8.8.8.8"] require.NotNil(t, copStats) - copStats[0].SetRowNum(10) - copStats[0].Record(time.Second, 10) - require.Equal(t, "time:1s, loops:2, threads:1", copStats[0].String()) - expected := "tiflash_task:{proc max:4ns, min:3ns, avg: 3ns, p80:4ns, p95:4ns, iters:7, tasks:2, threads:2}" + copStats.SetRowNum(10) + copStats.Record(time.Second, 10) + require.Equal(t, "time:1s, loops:2, threads:1, tiflash_scan:{dtfile:{total_scanned_packs:1, total_skipped_packs:0, total_scanned_rows:8192, total_skipped_rows:0, total_rs_index_load_time: 15ms, total_read_time: 200ms}, total_create_snapshot_time: 40ms, total_local_region_num: 10, total_remote_region_num: 4}", copStats.String()) + expected := "tiflash_task:{proc max:4ns, min:3ns, avg: 3ns, p80:4ns, p95:4ns, iters:7, tasks:2, threads:2}, tiflash_scan:{dtfile:{total_scanned_packs:3, total_skipped_packs:11, total_scanned_rows:20192, total_skipped_rows:86000, total_rs_index_load_time: 100ms, total_read_time: 3000ms}, total_create_snapshot_time: 50ms, total_local_region_num: 6, total_remote_region_num: 2}" require.Equal(t, expected, stats.GetOrCreateCopStats(aggID, "tiflash").String()) rootStats := stats.GetRootStats(tableReaderID) @@ -376,17 +389,14 @@ func TestRuntimeStatsWithCommit(t *testing.T) { } func TestRootRuntimeStats(t *testing.T) { - basic1 := &BasicRuntimeStats{} - basic2 := &BasicRuntimeStats{} - basic1.Record(time.Second, 20) - basic2.Record(time.Second*2, 30) pid := 1 stmtStats := NewRuntimeStatsColl(nil) - stmtStats.RegisterStats(pid, basic1) - stmtStats.RegisterStats(pid, basic2) + basic1 := stmtStats.GetBasicRuntimeStats(pid) + basic2 := stmtStats.GetBasicRuntimeStats(pid) + basic1.Record(time.Second, 20) + basic2.Record(time.Second*2, 30) concurrency := &RuntimeStatsWithConcurrencyInfo{} concurrency.SetConcurrencyInfo(NewConcurrencyInfo("worker", 15)) - stmtStats.RegisterStats(pid, concurrency) commitDetail := &util.CommitDetails{ GetCommitTsTime: time.Second, PrewriteTime: time.Second, @@ -396,6 +406,7 @@ func TestRootRuntimeStats(t *testing.T) { PrewriteRegionNum: 5, TxnRetry: 2, } + stmtStats.RegisterStats(pid, concurrency) stmtStats.RegisterStats(pid, &RuntimeStatsWithCommit{ Commit: commitDetail, }) diff --git a/util/expensivequery/expensivequery.go b/util/expensivequery/expensivequery.go index e761d98ab05a2..88eb24bdd01dd 100644 --- a/util/expensivequery/expensivequery.go +++ b/util/expensivequery/expensivequery.go @@ -62,9 +62,9 @@ func (eqh *Handle) Run() { } costTime := time.Since(info.Time) - if !info.ExceedExpensiveTimeThresh && costTime >= time.Second*time.Duration(threshold) && log.GetLevel() <= zapcore.WarnLevel { + if time.Since(info.ExpensiveLogTime) > 60*time.Second && costTime >= time.Second*time.Duration(threshold) && log.GetLevel() <= zapcore.WarnLevel { logExpensiveQuery(costTime, info, "expensive_query") - info.ExceedExpensiveTimeThresh = true + info.ExpensiveLogTime = time.Now() } if info.MaxExecutionTime > 0 && costTime > time.Duration(info.MaxExecutionTime)*time.Millisecond { logutil.BgLogger().Warn("execution timeout, kill it", zap.Duration("costTime", costTime), @@ -111,5 +111,9 @@ func (eqh *Handle) LogOnQueryExceedMemQuota(connID uint64) { // logExpensiveQuery logs the queries which exceed the time threshold or memory threshold. func logExpensiveQuery(costTime time.Duration, info *util.ProcessInfo, msg string) { - logutil.BgLogger().Warn(msg, util.GenLogFields(costTime, info, true)...) + fields := util.GenLogFields(costTime, info, true) + if fields == nil { + return + } + logutil.BgLogger().Warn(msg, fields...) } diff --git a/util/gctuner/BUILD.bazel b/util/gctuner/BUILD.bazel index d20f8b6a5b418..f097c68c6b761 100644 --- a/util/gctuner/BUILD.bazel +++ b/util/gctuner/BUILD.bazel @@ -20,6 +20,7 @@ go_library( go_test( name = "gctuner_test", + timeout = "short", srcs = [ "finalizer_test.go", "mem_test.go", diff --git a/util/gctuner/memory_limit_tuner.go b/util/gctuner/memory_limit_tuner.go index 9dba1bd0bd546..1679e012579d0 100644 --- a/util/gctuner/memory_limit_tuner.go +++ b/util/gctuner/memory_limit_tuner.go @@ -38,6 +38,9 @@ type memoryLimitTuner struct { nextGCTriggeredByMemoryLimit atomicutil.Bool } +// fallbackPercentage indicates the fallback memory limit percentage when turning. +const fallbackPercentage float64 = 1.1 + // tuning check the memory nextGC and judge whether this GC is trigger by memory limit. // Go runtime ensure that it will be called serially. func (t *memoryLimitTuner) tuning() { @@ -61,7 +64,7 @@ func (t *memoryLimitTuner) tuning() { go func() { memory.MemoryLimitGCLast.Store(time.Now()) memory.MemoryLimitGCTotal.Add(1) - debug.SetMemoryLimit(math.MaxInt64) + debug.SetMemoryLimit(t.calcMemoryLimit(fallbackPercentage)) resetInterval := 1 * time.Minute // Wait 1 minute and set back, to avoid frequent GC failpoint.Inject("testMemoryLimitTuner", func(val failpoint.Value) { if val, ok := val.(bool); val && ok { @@ -69,7 +72,7 @@ func (t *memoryLimitTuner) tuning() { } }) time.Sleep(resetInterval) - debug.SetMemoryLimit(t.calcMemoryLimit()) + debug.SetMemoryLimit(t.calcMemoryLimit(t.GetPercentage())) for !t.waitingReset.CompareAndSwap(true, false) { continue } @@ -106,23 +109,27 @@ func (t *memoryLimitTuner) GetPercentage() float64 { // UpdateMemoryLimit updates the memory limit. // This function should be called when `tidb_server_memory_limit` or `tidb_server_memory_limit_gc_trigger` is modified. func (t *memoryLimitTuner) UpdateMemoryLimit() { - var memoryLimit = t.calcMemoryLimit() + var memoryLimit = t.calcMemoryLimit(t.GetPercentage()) if memoryLimit == math.MaxInt64 { t.isTuning.Store(false) + memoryLimit = initGOMemoryLimitValue } else { t.isTuning.Store(true) } debug.SetMemoryLimit(memoryLimit) } -func (t *memoryLimitTuner) calcMemoryLimit() int64 { - memoryLimit := int64(float64(memory.ServerMemoryLimit.Load()) * t.percentage.Load()) // `tidb_server_memory_limit` * `tidb_server_memory_limit_gc_trigger` +func (*memoryLimitTuner) calcMemoryLimit(percentage float64) int64 { + memoryLimit := int64(float64(memory.ServerMemoryLimit.Load()) * percentage) // `tidb_server_memory_limit` * `tidb_server_memory_limit_gc_trigger` if memoryLimit == 0 { memoryLimit = math.MaxInt64 } return memoryLimit } +var initGOMemoryLimitValue int64 + func init() { + initGOMemoryLimitValue = debug.SetMemoryLimit(-1) GlobalMemoryLimitTuner.Start() } diff --git a/util/gctuner/memory_limit_tuner_test.go b/util/gctuner/memory_limit_tuner_test.go index 47d1d8409d8b5..c6f63215c01dd 100644 --- a/util/gctuner/memory_limit_tuner_test.go +++ b/util/gctuner/memory_limit_tuner_test.go @@ -15,7 +15,6 @@ package gctuner import ( - "math" "runtime" "runtime/debug" "testing" @@ -76,10 +75,9 @@ func TestGlobalMemoryTuner(t *testing.T) { checkNextGCEqualMemoryLimit := func() { runtime.ReadMemStats(r) nextGC := r.NextGC - memoryLimit := GlobalMemoryLimitTuner.calcMemoryLimit() - // In golang source, nextGC = memoryLimit - three parts memory. So check 90%~100% here. + memoryLimit := GlobalMemoryLimitTuner.calcMemoryLimit(GlobalMemoryLimitTuner.GetPercentage()) + // In golang source, nextGC = memoryLimit - three parts memory. require.True(t, nextGC < uint64(memoryLimit)) - require.True(t, nextGC > uint64(memoryLimit)/10*9) } memory600mb := allocator.alloc(600 << 20) @@ -91,7 +89,7 @@ func TestGlobalMemoryTuner(t *testing.T) { require.True(t, gcNum < getNowGCNum()) // Test waiting for reset time.Sleep(500 * time.Millisecond) - require.Equal(t, int64(math.MaxInt64), debug.SetMemoryLimit(-1)) + require.Equal(t, GlobalMemoryLimitTuner.calcMemoryLimit(fallbackPercentage), debug.SetMemoryLimit(-1)) gcNum = getNowGCNum() memory100mb := allocator.alloc(100 << 20) time.Sleep(100 * time.Millisecond) @@ -102,7 +100,7 @@ func TestGlobalMemoryTuner(t *testing.T) { runtime.GC() // Trigger GC in 80% again time.Sleep(500 * time.Millisecond) - require.Equal(t, GlobalMemoryLimitTuner.calcMemoryLimit(), debug.SetMemoryLimit(-1)) + require.Equal(t, GlobalMemoryLimitTuner.calcMemoryLimit(GlobalMemoryLimitTuner.GetPercentage()), debug.SetMemoryLimit(-1)) time.Sleep(100 * time.Millisecond) gcNum = getNowGCNum() checkNextGCEqualMemoryLimit() diff --git a/util/gctuner/tuner.go b/util/gctuner/tuner.go index ec74f48ec4be0..3332d77b93875 100644 --- a/util/gctuner/tuner.go +++ b/util/gctuner/tuner.go @@ -144,15 +144,18 @@ func (t *tuner) getGCPercent() uint32 { // tuning check the memory inuse and tune GC percent dynamically. // Go runtime ensure that it will be called serially. func (t *tuner) tuning() { + if !EnableGOGCTuner.Load() { + return + } + inuse := readMemoryInuse() threshold := t.getThreshold() // stop gc tuning if threshold <= 0 { return } - if EnableGOGCTuner.Load() { - t.setGCPercent(calcGCPercent(inuse, threshold)) - } + + t.setGCPercent(calcGCPercent(inuse, threshold)) } // threshold = inuse + inuse * (gcPercent / 100) diff --git a/util/generic/BUILD.bazel b/util/generic/BUILD.bazel index 2f89ee97655fd..609168becf49b 100644 --- a/util/generic/BUILD.bazel +++ b/util/generic/BUILD.bazel @@ -9,7 +9,9 @@ go_library( go_test( name = "generic_test", + timeout = "short", srcs = ["sync_map_test.go"], + flaky = True, deps = [ ":generic", "@com_github_stretchr_testify//require", diff --git a/util/gpool/BUILD.bazel b/util/gpool/BUILD.bazel new file mode 100644 index 0000000000000..4f9eb753be57a --- /dev/null +++ b/util/gpool/BUILD.bazel @@ -0,0 +1,12 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "gpool", + srcs = [ + "gpool.go", + "spinlock.go", + ], + importpath = "github.com/pingcap/tidb/util/gpool", + visibility = ["//visibility:public"], + deps = ["@org_uber_go_atomic//:atomic"], +) diff --git a/util/gpool/gpool.go b/util/gpool/gpool.go new file mode 100644 index 0000000000000..dce4eee536165 --- /dev/null +++ b/util/gpool/gpool.go @@ -0,0 +1,84 @@ +// 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, +// 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 gpool + +import ( + "errors" + "sync/atomic" + "time" + + atomicutil "go.uber.org/atomic" +) + +const ( + // DefaultCleanIntervalTime is the interval time to clean up goroutines. + DefaultCleanIntervalTime = 5 * time.Second + + // OPENED represents that the pool is opened. + OPENED = iota + + // CLOSED represents that the pool is closed. + CLOSED +) + +var ( + // ErrPoolClosed will be returned when submitting task to a closed pool. + ErrPoolClosed = errors.New("this pool has been closed") + + // ErrPoolOverload will be returned when the pool is full and no workers available. + ErrPoolOverload = errors.New("too many goroutines blocked on submit or Nonblocking is set") + + // ErrProducerClosed will be returned when the producer is closed. + ErrProducerClosed = errors.New("this producer has been closed") +) + +// BasePool is base class of pool +type BasePool struct { + lastTuneTs atomicutil.Time + name string + generator atomic.Uint64 +} + +// NewBasePool is to create a new BasePool. +func NewBasePool() BasePool { + return BasePool{ + lastTuneTs: *atomicutil.NewTime(time.Now()), + } +} + +// SetName is to set name. +func (p *BasePool) SetName(name string) { + p.name = name +} + +// Name is to get name. +func (p *BasePool) Name() string { + return p.name +} + +// NewTaskID is to get a new task ID. +func (p *BasePool) NewTaskID() uint64 { + return p.generator.Add(1) +} + +// LastTunerTs returns the last time when the pool was tuned. +func (p *BasePool) LastTunerTs() time.Time { + return p.lastTuneTs.Load() +} + +// SetLastTuneTs sets the last time when the pool was tuned. +func (p *BasePool) SetLastTuneTs(t time.Time) { + p.lastTuneTs.Store(t) +} diff --git a/util/gpool/spinlock.go b/util/gpool/spinlock.go new file mode 100644 index 0000000000000..acf7d15192416 --- /dev/null +++ b/util/gpool/spinlock.go @@ -0,0 +1,47 @@ +// 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, +// 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 gpool + +import ( + "runtime" + "sync" + "sync/atomic" +) + +type spinLock uint32 + +const maxBackoff = 16 + +func (sl *spinLock) Lock() { + backoff := 1 + for !atomic.CompareAndSwapUint32((*uint32)(sl), 0, 1) { + // Leverage the exponential backoff algorithm, see https://en.wikipedia.org/wiki/Exponential_backoff. + for i := 0; i < backoff; i++ { + runtime.Gosched() + } + if backoff < maxBackoff { + backoff <<= 1 + } + } +} + +func (sl *spinLock) Unlock() { + atomic.StoreUint32((*uint32)(sl), 0) +} + +// NewSpinLock instantiates a spin-lock. +func NewSpinLock() sync.Locker { + return new(spinLock) +} diff --git a/util/gpool/spmc/BUILD.bazel b/util/gpool/spmc/BUILD.bazel new file mode 100644 index 0000000000000..a3cc3dad188d9 --- /dev/null +++ b/util/gpool/spmc/BUILD.bazel @@ -0,0 +1,50 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "spmc", + srcs = [ + "option.go", + "spmcpool.go", + "worker.go", + "worker_loop_queue.go", + ], + importpath = "github.com/pingcap/tidb/util/gpool/spmc", + visibility = ["//visibility:public"], + deps = [ + "//metrics", + "//resourcemanager", + "//resourcemanager/pooltask", + "//resourcemanager/util", + "//util/gpool", + "//util/logutil", + "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_log//:log", + "@com_github_prometheus_client_golang//prometheus", + "@org_uber_go_atomic//:atomic", + "@org_uber_go_zap//:zap", + ], +) + +go_test( + name = "spmc_test", + timeout = "short", + srcs = [ + "main_test.go", + "spmcpool_benchmark_test.go", + "spmcpool_test.go", + "worker_loop_queue_test.go", + ], + embed = [":spmc"], + flaky = True, + race = "on", + deps = [ + "//resourcemanager/pooltask", + "//resourcemanager/util", + "//testkit/testsetup", + "//util", + "//util/gpool", + "@com_github_stretchr_testify//require", + "@org_uber_go_atomic//:atomic", + "@org_uber_go_goleak//:goleak", + ], +) diff --git a/util/gpool/spmc/main_test.go b/util/gpool/spmc/main_test.go new file mode 100644 index 0000000000000..381e5302598d5 --- /dev/null +++ b/util/gpool/spmc/main_test.go @@ -0,0 +1,27 @@ +// 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, +// 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 spmc + +import ( + "testing" + + "github.com/pingcap/tidb/testkit/testsetup" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + testsetup.SetupForCommonTest() + goleak.VerifyTestMain(m) +} diff --git a/util/gpool/spmc/option.go b/util/gpool/spmc/option.go new file mode 100644 index 0000000000000..af456e3c79772 --- /dev/null +++ b/util/gpool/spmc/option.go @@ -0,0 +1,140 @@ +// 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, +// 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 spmc + +import ( + "time" +) + +const defaultTaskChanLen = 1 + +// Option represents the optional function. +type Option func(opts *Options) + +func loadOptions(options ...Option) *Options { + opts := DefaultOption() + for _, option := range options { + option(opts) + } + return opts +} + +// Options contains all options which will be applied when instantiating an pool. +type Options struct { + // PanicHandler is used to handle panics from each worker goroutine. + // if nil, panics will be thrown out again from worker goroutines. + PanicHandler func(interface{}) + + // ExpiryDuration is a period for the scavenger goroutine to clean up those expired workers, + // the scavenger scans all workers every `ExpiryDuration` and clean up those workers that haven't been + // used for more than `ExpiryDuration`. + ExpiryDuration time.Duration + + // LimitDuration is a period in the limit mode. + LimitDuration time.Duration + + // Max number of goroutine blocking on pool.Submit. + // 0 (default value) means no such limit. + MaxBlockingTasks int + + // When Nonblocking is true, Pool.AddProduce will never be blocked. + // ErrPoolOverload will be returned when Pool.Submit cannot be done at once. + // When Nonblocking is true, MaxBlockingTasks is inoperative. + Nonblocking bool +} + +// DefaultOption is the default option. +func DefaultOption() *Options { + return &Options{ + LimitDuration: 200 * time.Millisecond, + Nonblocking: true, + } +} + +// WithExpiryDuration sets up the interval time of cleaning up goroutines. +func WithExpiryDuration(expiryDuration time.Duration) Option { + return func(opts *Options) { + opts.ExpiryDuration = expiryDuration + } +} + +// WithMaxBlockingTasks sets up the maximum number of goroutines that are blocked when it reaches the capacity of pool. +func WithMaxBlockingTasks(maxBlockingTasks int) Option { + return func(opts *Options) { + opts.MaxBlockingTasks = maxBlockingTasks + } +} + +// WithNonblocking indicates that pool will return nil when there is no available workers. +func WithNonblocking(nonblocking bool) Option { + return func(opts *Options) { + opts.Nonblocking = nonblocking + } +} + +// WithPanicHandler sets up panic handler. +func WithPanicHandler(panicHandler func(interface{})) Option { + return func(opts *Options) { + opts.PanicHandler = panicHandler + } +} + +// TaskOption represents the optional function. +type TaskOption func(opts *TaskOptions) + +func loadTaskOptions(options ...TaskOption) *TaskOptions { + opts := new(TaskOptions) + for _, option := range options { + option(opts) + } + if opts.Concurrency == 0 { + opts.Concurrency = 1 + } + if opts.ResultChanLen == 0 { + opts.ResultChanLen = uint64(opts.Concurrency) + } + if opts.TaskChanLen == 0 { + opts.TaskChanLen = defaultTaskChanLen + } + return opts +} + +// TaskOptions contains all options +type TaskOptions struct { + Concurrency int + ResultChanLen uint64 + TaskChanLen uint64 +} + +// WithResultChanLen is to set the length of result channel. +func WithResultChanLen(resultChanLen uint64) TaskOption { + return func(opts *TaskOptions) { + opts.ResultChanLen = resultChanLen + } +} + +// WithTaskChanLen is to set the length of task channel. +func WithTaskChanLen(taskChanLen uint64) TaskOption { + return func(opts *TaskOptions) { + opts.TaskChanLen = taskChanLen + } +} + +// WithConcurrency is to set the concurrency of task. +func WithConcurrency(c int) TaskOption { + return func(opts *TaskOptions) { + opts.Concurrency = c + } +} diff --git a/util/gpool/spmc/spmcpool.go b/util/gpool/spmc/spmcpool.go new file mode 100644 index 0000000000000..8afdf9db0c253 --- /dev/null +++ b/util/gpool/spmc/spmcpool.go @@ -0,0 +1,478 @@ +// 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, +// 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 spmc + +import ( + "errors" + "sync" + "sync/atomic" + "time" + + "github.com/pingcap/log" + "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/resourcemanager" + "github.com/pingcap/tidb/resourcemanager/pooltask" + "github.com/pingcap/tidb/resourcemanager/util" + "github.com/pingcap/tidb/util/gpool" + "github.com/pingcap/tidb/util/logutil" + "github.com/prometheus/client_golang/prometheus" + atomicutil "go.uber.org/atomic" + "go.uber.org/zap" +) + +// Pool is a single producer, multiple consumer goroutine pool. +// T is the type of the task. We can treat it as input. +// U is the type of the result. We can treat it as output. +// C is the type of the const parameter. if Our task look like y = ax + b, C acts like b as const parameter. +// CT is the type of the context. It needs to be read/written parallel. +// TF is the type of the context getter. It is used to get a context. +// if we don't need to use CT/TF, we can define CT as any and TF as NilContext. +type Pool[T any, U any, C any, CT any, TF pooltask.Context[CT]] struct { + workerCache sync.Pool + lock sync.Locker + stopCh chan struct{} + consumerFunc func(T, C, CT) U + cond *sync.Cond + taskCh chan *pooltask.TaskBox[T, U, C, CT, TF] + workers *loopQueue[T, U, C, CT, TF] + options *Options + gpool.BasePool + taskManager pooltask.TaskManager[T, U, C, CT, TF] + waitingTask atomicutil.Uint32 + capacity atomic.Int32 + running atomic.Int32 + state atomic.Int32 + waiting atomic.Int32 // waiting is the number of goroutines that are waiting for the pool to be available. + heartbeatDone atomic.Bool + concurrencyMetrics prometheus.Gauge +} + +// NewSPMCPool create a single producer, multiple consumer goroutine pool. +func NewSPMCPool[T any, U any, C any, CT any, TF pooltask.Context[CT]](name string, size int32, component util.Component, options ...Option) (*Pool[T, U, C, CT, TF], error) { + opts := loadOptions(options...) + if expiry := opts.ExpiryDuration; expiry <= 0 { + opts.ExpiryDuration = gpool.DefaultCleanIntervalTime + } + result := &Pool[T, U, C, CT, TF]{ + BasePool: gpool.NewBasePool(), + taskCh: make(chan *pooltask.TaskBox[T, U, C, CT, TF], 128), + stopCh: make(chan struct{}), + lock: gpool.NewSpinLock(), + taskManager: pooltask.NewTaskManager[T, U, C, CT, TF](size), + concurrencyMetrics: metrics.PoolConcurrencyCounter.WithLabelValues(name), + options: opts, + } + result.SetName(name) + result.state.Store(int32(gpool.OPENED)) + result.workerCache.New = func() interface{} { + return &goWorker[T, U, C, CT, TF]{ + pool: result, + } + } + result.capacity.Add(size) + result.concurrencyMetrics.Set(float64(size)) + result.workers = newWorkerLoopQueue[T, U, C, CT, TF](int(size)) + result.cond = sync.NewCond(result.lock) + err := resourcemanager.InstanceResourceManager.Register(result, name, component) + if err != nil { + return nil, err + } + // Start a goroutine to clean up expired workers periodically. + go result.purgePeriodically() + return result, nil +} + +// purgePeriodically clears expired workers periodically which runs in an individual goroutine, as a scavenger. +func (p *Pool[T, U, C, CT, TF]) purgePeriodically() { + heartbeat := time.NewTicker(p.options.ExpiryDuration) + defer func() { + heartbeat.Stop() + p.heartbeatDone.Store(true) + }() + for { + select { + case <-heartbeat.C: + case <-p.stopCh: + return + } + + if p.IsClosed() { + break + } + + p.lock.Lock() + expiredWorkers := p.workers.retrieveExpiry(p.options.ExpiryDuration) + p.lock.Unlock() + + // Notify obsolete workers to stop. + // This notification must be outside the p.lock, since w.task + // may be blocking and may consume a lot of time if many workers + // are located on non-local CPUs. + for i := range expiredWorkers { + expiredWorkers[i].taskBoxCh <- nil + expiredWorkers[i] = nil + } + + // There might be a situation where all workers have been cleaned up(no worker is running), + // or another case where the pool capacity has been Tuned up, + // while some invokers still get stuck in "p.cond.Wait()", + // then it ought to wake all those invokers. + if p.Running() == 0 || (p.Waiting() > 0 && p.Free() > 0) || p.waitingTask.Load() > 0 { + p.cond.Broadcast() + } + } +} + +// Tune changes the capacity of this pool, note that it is noneffective to the infinite or pre-allocation pool. +func (p *Pool[T, U, C, CT, TF]) Tune(size int) { + capacity := p.Cap() + if capacity == -1 || size <= 0 || size == capacity { + return + } + if p.taskManager.GetOriginConcurrency()+int32(util.MaxOverclockCount) < int32(size) { + return + } + p.SetLastTuneTs(time.Now()) + p.capacity.Store(int32(size)) + p.concurrencyMetrics.Set(float64(size)) + if size > capacity { + for i := 0; i < size-capacity; i++ { + if tid, boostTask := p.taskManager.Overclock(size); boostTask != nil { + p.addWaitingTask() + newTask := boostTask.Clone() + p.taskManager.AddSubTask(tid, newTask) + p.taskCh <- newTask + } + } + if size-capacity == 1 { + p.cond.Signal() + return + } + p.cond.Broadcast() + return + } + if size < capacity { + p.taskManager.Downclock(size) + } +} + +// Running returns the number of workers currently running. +func (p *Pool[T, U, C, CT, TF]) Running() int { + return int(p.running.Load()) +} + +// Free returns the number of available goroutines to work, -1 indicates this pool is unlimited. +func (p *Pool[T, U, C, CT, TF]) Free() int { + c := p.Cap() + if c < 0 { + return -1 + } + return c - p.Running() +} + +// Waiting returns the number of tasks which are waiting be executed. +func (p *Pool[T, U, C, CT, TF]) Waiting() int { + return int(p.waiting.Load()) +} + +// IsClosed indicates whether the pool is closed. +func (p *Pool[T, U, C, CT, TF]) IsClosed() bool { + return p.state.Load() == gpool.CLOSED +} + +// Cap returns the capacity of this pool. +func (p *Pool[T, U, C, CT, TF]) Cap() int { + return int(p.capacity.Load()) +} + +func (p *Pool[T, U, C, CT, TF]) addRunning(delta int) { + p.running.Add(int32(delta)) +} + +func (p *Pool[T, U, C, CT, TF]) addWaiting(delta int) { + p.waiting.Add(int32(delta)) +} + +func (p *Pool[T, U, C, CT, TF]) addWaitingTask() { + p.waitingTask.Inc() +} + +func (p *Pool[T, U, C, CT, TF]) subWaitingTask() { + p.waitingTask.Dec() +} + +// release closes this pool and releases the worker queue. +func (p *Pool[T, U, C, CT, TF]) release() { + if !p.state.CompareAndSwap(gpool.OPENED, gpool.CLOSED) { + return + } + p.lock.Lock() + p.workers.reset() + p.lock.Unlock() + // There might be some callers waiting in retrieveWorker(), so we need to wake them up to prevent + // those callers blocking infinitely. + p.cond.Broadcast() +} + +func isClose(exitCh chan struct{}) bool { + select { + case <-exitCh: + return true + default: + } + return false +} + +// ReleaseAndWait is like Release, it waits all workers to exit. +func (p *Pool[T, U, C, CT, TF]) ReleaseAndWait() { + if p.IsClosed() || isClose(p.stopCh) { + return + } + + close(p.stopCh) + p.release() + defer resourcemanager.InstanceResourceManager.Unregister(p.Name()) + for { + // Wait for all workers to exit and all task to be completed. + if p.Running() == 0 && p.heartbeatDone.Load() && p.waitingTask.Load() == 0 { + return + } + time.Sleep(5 * time.Millisecond) + } +} + +// SetConsumerFunc is to set ConsumerFunc which is to process the task. +func (p *Pool[T, U, C, CT, TF]) SetConsumerFunc(consumerFunc func(T, C, CT) U) { + p.consumerFunc = consumerFunc +} + +// AddProduceBySlice is to add Produce by a slice. +// Producer need to return ErrProducerClosed when to exit. +func (p *Pool[T, U, C, CT, TF]) AddProduceBySlice(producer func() ([]T, error), constArg C, contextFn TF, options ...TaskOption) (<-chan U, pooltask.TaskController[T, U, C, CT, TF]) { + opt := loadTaskOptions(options...) + taskID := p.NewTaskID() + var wg sync.WaitGroup + result := make(chan U, opt.ResultChanLen) + productExitCh := make(chan struct{}) + inputCh := make(chan pooltask.Task[T], opt.TaskChanLen) + tc := pooltask.NewTaskController[T, U, C, CT, TF](p, taskID, productExitCh, &wg, inputCh, result) + p.taskManager.RegisterTask(taskID, int32(opt.Concurrency)) + for i := 0; i < opt.Concurrency; i++ { + err := p.run() + if err == gpool.ErrPoolClosed { + break + } + taskBox := pooltask.NewTaskBox[T, U, C, CT, TF](constArg, contextFn, &wg, inputCh, result, taskID) + p.addWaitingTask() + p.taskManager.AddSubTask(taskID, &taskBox) + p.taskCh <- &taskBox + } + wg.Add(1) + go func() { + defer func() { + if r := recover(); r != nil { + logutil.BgLogger().Error("producer panic", zap.Any("recover", r), zap.Stack("stack")) + } + close(inputCh) + wg.Done() + }() + for { + if isClose(productExitCh) { + return + } + tasks, err := producer() + if err != nil { + if errors.Is(err, gpool.ErrProducerClosed) { + return + } + log.Error("producer error", zap.Error(err)) + return + } + for _, task := range tasks { + wg.Add(1) + task := pooltask.Task[T]{ + Task: task, + } + inputCh <- task + } + } + }() + return result, tc +} + +// AddProducer is to add producer. +// Producer need to return ErrProducerClosed when to exit. +func (p *Pool[T, U, C, CT, TF]) AddProducer(producer func() (T, error), constArg C, contextFn TF, options ...TaskOption) (<-chan U, pooltask.TaskController[T, U, C, CT, TF]) { + opt := loadTaskOptions(options...) + taskID := p.NewTaskID() + var wg sync.WaitGroup + result := make(chan U, opt.ResultChanLen) + productExitCh := make(chan struct{}) + inputCh := make(chan pooltask.Task[T], opt.TaskChanLen) + p.taskManager.RegisterTask(taskID, int32(opt.Concurrency)) + tc := pooltask.NewTaskController[T, U, C, CT, TF](p, taskID, productExitCh, &wg, inputCh, result) + for i := 0; i < opt.Concurrency; i++ { + err := p.run() + if err == gpool.ErrPoolClosed { + break + } + p.addWaitingTask() + taskBox := pooltask.NewTaskBox[T, U, C, CT, TF](constArg, contextFn, &wg, inputCh, result, taskID) + p.taskManager.AddSubTask(taskID, &taskBox) + p.taskCh <- &taskBox + } + wg.Add(1) + go func() { + defer func() { + if r := recover(); r != nil { + logutil.BgLogger().Error("producer panic", zap.Any("recover", r), zap.Stack("stack")) + } + close(inputCh) + wg.Done() + }() + for { + if isClose(productExitCh) { + return + } + task, err := producer() + if err != nil { + if errors.Is(err, gpool.ErrProducerClosed) { + return + } + log.Error("producer error", zap.Error(err)) + return + } + wg.Add(1) + t := pooltask.Task[T]{ + Task: task, + } + inputCh <- t + } + }() + return result, tc +} + +func (p *Pool[T, U, C, CT, TF]) run() error { + if p.IsClosed() { + return gpool.ErrPoolClosed + } + var w *goWorker[T, U, C, CT, TF] + if w = p.retrieveWorker(); w == nil { + return gpool.ErrPoolOverload + } + return nil +} + +// retrieveWorker returns an available worker to run the tasks. +func (p *Pool[T, U, C, CT, TF]) retrieveWorker() (w *goWorker[T, U, C, CT, TF]) { + spawnWorker := func() { + w = p.workerCache.Get().(*goWorker[T, U, C, CT, TF]) + w.taskBoxCh = p.taskCh + w.run() + } + + p.lock.Lock() + + w = p.workers.detach() + if w != nil { // first try to fetch the worker from the queue + p.lock.Unlock() + } else if capacity := p.Cap(); capacity == -1 || capacity > p.Running() { + // if the worker queue is empty and we don't run out of the pool capacity, + // then just spawn a new worker goroutine. + p.lock.Unlock() + spawnWorker() + } else { // otherwise, we'll have to keep them blocked and wait for at least one worker to be put back into pool. + if p.options.Nonblocking { + p.lock.Unlock() + return + } + retry: + if p.options.MaxBlockingTasks != 0 && p.Waiting() >= p.options.MaxBlockingTasks { + p.lock.Unlock() + return + } + p.addWaiting(1) + p.cond.Wait() // block and wait for an available worker + p.addWaiting(-1) + + if p.IsClosed() { + p.lock.Unlock() + return + } + + var nw int + if nw = p.Running(); nw == 0 { // awakened by the scavenger + p.lock.Unlock() + spawnWorker() + return + } + if w = p.workers.detach(); w == nil { + if nw < p.Cap() { + p.lock.Unlock() + spawnWorker() + return + } + goto retry + } + p.lock.Unlock() + } + return +} + +// revertWorker puts a worker back into free pool, recycling the goroutines. +func (p *Pool[T, U, C, CT, TF]) revertWorker(worker *goWorker[T, U, C, CT, TF]) bool { + if capacity := p.Cap(); capacity > 0 && p.Running() > capacity || p.IsClosed() { + p.cond.Broadcast() + return false + } + worker.recycleTime.Store(time.Now()) + p.lock.Lock() + + if p.IsClosed() { + p.lock.Unlock() + return false + } + + err := p.workers.insert(worker) + if err != nil { + p.lock.Unlock() + if err == errQueueIsFull && p.waitingTask.Load() > 0 { + return true + } + return false + } + + // Notify the invoker stuck in 'retrieveWorker()' of there is an available worker in the worker queue. + p.cond.Signal() + p.lock.Unlock() + return true +} + +// DeleteTask is to delete task. +// Please don't use it manually. +func (p *Pool[T, U, C, CT, TF]) DeleteTask(id uint64) { + p.taskManager.DeleteTask(id) +} + +// StopTask is to stop task by id +// Please don't use it manually. +func (p *Pool[T, U, C, CT, TF]) StopTask(id uint64) { + p.taskManager.StopTask(id) +} + +// ExitSubTask is to reduce the number of subtasks. +func (p *Pool[T, U, C, CT, TF]) ExitSubTask(id uint64) { + p.taskManager.ExitSubTask(id) +} diff --git a/util/gpool/spmc/spmcpool_benchmark_test.go b/util/gpool/spmc/spmcpool_benchmark_test.go new file mode 100644 index 0000000000000..2d2f39511ea1c --- /dev/null +++ b/util/gpool/spmc/spmcpool_benchmark_test.go @@ -0,0 +1,112 @@ +// 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, +// 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 spmc + +import ( + "testing" + "time" + + "github.com/pingcap/tidb/resourcemanager/pooltask" + rmutil "github.com/pingcap/tidb/resourcemanager/util" + "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/gpool" +) + +const ( + RunTimes = 10000 + DefaultExpiredTime = 10 * time.Second +) + +func BenchmarkGPool(b *testing.B) { + p, err := NewSPMCPool[struct{}, struct{}, int, any, pooltask.NilContext]("test", 10, rmutil.UNKNOWN) + if err != nil { + b.Fatal(err) + } + defer p.ReleaseAndWait() + p.SetConsumerFunc(func(a struct{}, b int, c any) struct{} { + return struct{}{} + }) + b.ResetTimer() + for i := 0; i < b.N; i++ { + sema := make(chan struct{}, 10) + var wg util.WaitGroupWrapper + wg.Run(func() { + for j := 0; j < RunTimes; j++ { + sema <- struct{}{} + } + close(sema) + }) + producerFunc := func() (struct{}, error) { + _, ok := <-sema + if ok { + return struct{}{}, nil + } + return struct{}{}, gpool.ErrProducerClosed + } + resultCh, ctl := p.AddProducer(producerFunc, RunTimes, pooltask.NilContext{}, WithConcurrency(6), WithResultChanLen(10)) + exitCh := make(chan struct{}) + wg.Run(func() { + for { + select { + case <-resultCh: + case <-exitCh: + return + } + } + }) + ctl.Wait() + close(exitCh) + wg.Wait() + } +} + +func BenchmarkGoCommon(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + var wg util.WaitGroupWrapper + var wgp util.WaitGroupWrapper + sema := make(chan struct{}, 10) + result := make(chan struct{}, 10) + wg.Run(func() { + for j := 0; j < RunTimes; j++ { + sema <- struct{}{} + } + close(sema) + }) + + for n := 0; n < 6; n++ { + wg.Run(func() { + item, ok := <-sema + if !ok { + return + } + result <- item + }) + } + exitCh := make(chan struct{}) + wgp.Run(func() { + for { + select { + case <-result: + case <-exitCh: + return + } + } + }) + wg.Wait() + close(exitCh) + wgp.Wait() + } +} diff --git a/util/gpool/spmc/spmcpool_test.go b/util/gpool/spmc/spmcpool_test.go new file mode 100644 index 0000000000000..25fb62aaeb0ca --- /dev/null +++ b/util/gpool/spmc/spmcpool_test.go @@ -0,0 +1,476 @@ +// 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, +// 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 spmc + +import ( + "fmt" + "sync" + "sync/atomic" + "testing" + "time" + + "github.com/pingcap/tidb/resourcemanager/pooltask" + rmutil "github.com/pingcap/tidb/resourcemanager/util" + "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/gpool" + "github.com/stretchr/testify/require" +) + +func TestPool(t *testing.T) { + type ConstArgs struct { + a int + } + myArgs := ConstArgs{a: 10} + // init the pool + // input type, output type, constArgs type + pool, err := NewSPMCPool[int, int, ConstArgs, any, pooltask.NilContext]("TestPool", 10, rmutil.UNKNOWN) + require.NoError(t, err) + pool.SetConsumerFunc(func(task int, constArgs ConstArgs, ctx any) int { + return task + constArgs.a + }) + taskCh := make(chan int, 10) + for i := 1; i < 11; i++ { + taskCh <- i + } + pfunc := func() (int, error) { + select { + case task := <-taskCh: + return task, nil + default: + return 0, gpool.ErrProducerClosed + } + } + // add new task + resultCh, control := pool.AddProducer(pfunc, myArgs, pooltask.NilContext{}, WithConcurrency(5)) + + var count atomic.Uint32 + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + for result := range resultCh { + count.Add(1) + require.Greater(t, result, 10) + } + }() + // Waiting task finishing + control.Wait() + wg.Wait() + require.Equal(t, uint32(10), count.Load()) + // close pool + pool.ReleaseAndWait() + + // test renew is normal + pool, err = NewSPMCPool[int, int, ConstArgs, any, pooltask.NilContext]("TestPool", 10, rmutil.UNKNOWN) + require.NoError(t, err) + pool.ReleaseAndWait() +} + +func TestStopPool(t *testing.T) { + type ConstArgs struct { + a int + } + myArgs := ConstArgs{a: 10} + // init the pool + // input type, output type, constArgs type + pool, err := NewSPMCPool[int, int, ConstArgs, any, pooltask.NilContext]("TestPool", 10, rmutil.UNKNOWN) + require.NoError(t, err) + pool.SetConsumerFunc(func(task int, constArgs ConstArgs, ctx any) int { + return task + constArgs.a + }) + + exit := make(chan struct{}) + + pfunc := func() (int, error) { + select { + case <-exit: + return 0, gpool.ErrProducerClosed + default: + return 1, nil + } + } + // add new task + resultCh, control := pool.AddProducer(pfunc, myArgs, pooltask.NilContext{}, WithConcurrency(4)) + + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + for result := range resultCh { + require.Greater(t, result, 10) + } + }() + wg.Add(1) + go func() { + defer wg.Done() + control.Stop() + }() + // Waiting task finishing + control.Wait() + wg.Wait() + // close pool + pool.ReleaseAndWait() +} + +func TestStopPoolWithSlice(t *testing.T) { + type ConstArgs struct { + a int + } + myArgs := ConstArgs{a: 10} + // init the pool + // input type, output type, constArgs type + pool, err := NewSPMCPool[int, int, ConstArgs, any, pooltask.NilContext]("TestStopPoolWithSlice", 3, rmutil.UNKNOWN) + require.NoError(t, err) + pool.SetConsumerFunc(func(task int, constArgs ConstArgs, ctx any) int { + return task + constArgs.a + }) + + exit := make(chan struct{}) + + pfunc := func() ([]int, error) { + select { + case <-exit: + return nil, gpool.ErrProducerClosed + default: + return []int{1, 2, 3}, nil + } + } + // add new task + resultCh, control := pool.AddProduceBySlice(pfunc, myArgs, pooltask.NilContext{}, WithConcurrency(4)) + + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + for result := range resultCh { + require.Greater(t, result, 10) + control.Stop() + } + }() + // Waiting task finishing + control.Wait() + wg.Wait() + // close pool + pool.ReleaseAndWait() +} + +func TestTuneSimplePool(t *testing.T) { + testTunePool(t, "TestTuneSimplePool") +} + +func TestTuneMultiPool(t *testing.T) { + var concurrency = 5 + var wg sync.WaitGroup + wg.Add(concurrency) + for i := 0; i < concurrency; i++ { + go func(id int) { + testTunePool(t, fmt.Sprintf("TestTuneMultiPool%d", id)) + wg.Done() + }(i) + } + wg.Wait() +} + +func testTunePool(t *testing.T, name string) { + type ConstArgs struct { + a int + } + myArgs := ConstArgs{a: 10} + // init the pool + // input type, output type, constArgs type + pool, err := NewSPMCPool[int, int, ConstArgs, any, pooltask.NilContext](name, 10, rmutil.UNKNOWN) + require.NoError(t, err) + pool.SetConsumerFunc(func(task int, constArgs ConstArgs, ctx any) int { + return task + constArgs.a + }) + + exit := make(chan struct{}) + + pfunc := func() (int, error) { + select { + case <-exit: + return 0, gpool.ErrProducerClosed + default: + return 1, nil + } + } + // add new task + resultCh, control := pool.AddProducer(pfunc, myArgs, pooltask.NilContext{}, WithConcurrency(10)) + tid := control.TaskID() + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + for result := range resultCh { + require.Greater(t, result, 10) + } + }() + time.Sleep(1 * time.Second) + downclockPool(t, pool, tid) + overclockPool(t, pool, tid) + + // at Overclock mode + overclockPool(t, pool, tid) + + // Overclock mode, But it is invalid. It should keep the same size. + size := pool.Cap() + pool.Tune(pool.Cap() + 1) + time.Sleep(1 * time.Second) + require.Equal(t, size, pool.Cap()) + require.Equal(t, int32(size), pool.taskManager.Running(tid)) + + for n := pool.Cap(); n > 1; n-- { + downclockPool(t, pool, tid) + } + wg.Add(1) + go func() { + // exit test + control.Stop() + wg.Done() + }() + control.Wait() + wg.Wait() + // close pool + pool.ReleaseAndWait() +} + +func overclockPool[T any, U any, C any, CT any, TF pooltask.Context[CT]](t *testing.T, pool *Pool[T, U, C, CT, TF], tid uint64) { + newSize := pool.Cap() + 1 + pool.Tune(newSize) + time.Sleep(1 * time.Second) + require.Equal(t, newSize, pool.Cap()) + require.Equal(t, int32(newSize), pool.taskManager.Running(tid)) +} + +func downclockPool[T any, U any, C any, CT any, TF pooltask.Context[CT]](t *testing.T, pool *Pool[T, U, C, CT, TF], tid uint64) { + newSize := pool.Cap() - 1 + pool.Tune(newSize) + time.Sleep(1 * time.Second) + require.Equal(t, newSize, pool.Cap()) + require.Equal(t, int32(newSize), pool.taskManager.Running(tid)) +} + +func TestPoolWithEnoughCapacity(t *testing.T) { + const ( + RunTimes = 1000 + poolsize = 30 + concurrency = 6 + ) + p, err := NewSPMCPool[struct{}, struct{}, int, any, pooltask.NilContext]("TestPoolWithEnoughCapa", poolsize, rmutil.UNKNOWN, WithExpiryDuration(DefaultExpiredTime)) + require.NoError(t, err) + defer p.ReleaseAndWait() + p.SetConsumerFunc(func(a struct{}, b int, c any) struct{} { + return struct{}{} + }) + var twg util.WaitGroupWrapper + for i := 0; i < 3; i++ { + twg.Run(func() { + sema := make(chan struct{}, 10) + var wg util.WaitGroupWrapper + exitCh := make(chan struct{}) + wg.Run(func() { + for j := 0; j < RunTimes; j++ { + sema <- struct{}{} + } + close(exitCh) + }) + producerFunc := func() (struct{}, error) { + for { + select { + case <-sema: + return struct{}{}, nil + default: + select { + case <-exitCh: + return struct{}{}, gpool.ErrProducerClosed + default: + } + } + } + } + resultCh, ctl := p.AddProducer(producerFunc, RunTimes, pooltask.NilContext{}, WithConcurrency(concurrency)) + wg.Add(1) + go func() { + defer wg.Done() + for range resultCh { + } + }() + ctl.Wait() + wg.Wait() + }) + } + twg.Wait() +} + +func TestPoolWithoutEnoughCapacity(t *testing.T) { + const ( + RunTimes = 5 + concurrency = 2 + poolsize = 2 + ) + p, err := NewSPMCPool[struct{}, struct{}, int, any, pooltask.NilContext]("TestPoolWithoutEnoughCapacity", poolsize, rmutil.UNKNOWN, + WithExpiryDuration(DefaultExpiredTime)) + require.NoError(t, err) + defer p.ReleaseAndWait() + p.SetConsumerFunc(func(a struct{}, b int, c any) struct{} { + return struct{}{} + }) + var twg sync.WaitGroup + for i := 0; i < 10; i++ { + func() { + sema := make(chan struct{}, 10) + var wg util.WaitGroupWrapper + exitCh := make(chan struct{}) + wg.Add(1) + go func() { + defer wg.Done() + for j := 0; j < RunTimes; j++ { + sema <- struct{}{} + } + close(exitCh) + }() + producerFunc := func() (struct{}, error) { + for { + select { + case <-sema: + return struct{}{}, nil + default: + select { + case <-exitCh: + return struct{}{}, gpool.ErrProducerClosed + default: + } + } + } + } + resultCh, ctl := p.AddProducer(producerFunc, RunTimes, pooltask.NilContext{}, WithConcurrency(concurrency)) + + wg.Add(1) + go func() { + defer wg.Done() + for range resultCh { + } + }() + ctl.Wait() + wg.Wait() + }() + } + twg.Wait() +} + +func TestPoolWithoutEnoughCapacityParallel(t *testing.T) { + const ( + RunTimes = 5 + concurrency = 2 + poolsize = 2 + ) + p, err := NewSPMCPool[struct{}, struct{}, int, any, pooltask.NilContext]("TestPoolWithoutEnoughCapacityParallel", poolsize, rmutil.UNKNOWN, + WithExpiryDuration(DefaultExpiredTime), WithNonblocking(true)) + require.NoError(t, err) + defer p.ReleaseAndWait() + p.SetConsumerFunc(func(a struct{}, b int, c any) struct{} { + return struct{}{} + }) + var twg sync.WaitGroup + for i := 0; i < 10; i++ { + twg.Add(1) + go func() { + defer twg.Done() + sema := make(chan struct{}, 10) + var wg sync.WaitGroup + exitCh := make(chan struct{}) + wg.Add(1) + go func() { + wg.Done() + for j := 0; j < RunTimes; j++ { + sema <- struct{}{} + } + close(exitCh) + }() + producerFunc := func() (struct{}, error) { + for { + select { + case <-sema: + return struct{}{}, nil + default: + select { + case <-exitCh: + return struct{}{}, gpool.ErrProducerClosed + default: + } + } + } + } + resultCh, ctl := p.AddProducer(producerFunc, RunTimes, pooltask.NilContext{}, WithConcurrency(concurrency)) + wg.Add(1) + go func() { + defer wg.Done() + for range resultCh { + } + }() + ctl.Wait() + wg.Wait() + }() + } + twg.Wait() +} + +func TestBenchPool(t *testing.T) { + p, err := NewSPMCPool[struct{}, struct{}, int, any, pooltask.NilContext]("TestBenchPool", 10, + rmutil.UNKNOWN, WithExpiryDuration(DefaultExpiredTime)) + require.NoError(t, err) + defer p.ReleaseAndWait() + p.SetConsumerFunc(func(a struct{}, b int, c any) struct{} { + return struct{}{} + }) + + for i := 0; i < 1000; i++ { + sema := make(chan struct{}, 10) + var wg sync.WaitGroup + exitCh := make(chan struct{}) + wg.Add(1) + go func() { + defer wg.Done() + for j := 0; j < RunTimes; j++ { + sema <- struct{}{} + } + close(exitCh) + }() + producerFunc := func() (struct{}, error) { + for { + select { + case <-sema: + return struct{}{}, nil + default: + select { + case <-exitCh: + return struct{}{}, gpool.ErrProducerClosed + default: + } + } + } + } + resultCh, ctl := p.AddProducer(producerFunc, RunTimes, pooltask.NilContext{}, WithConcurrency(6)) + wg.Add(1) + go func() { + defer wg.Done() + for range resultCh { + } + }() + ctl.Wait() + wg.Wait() + } + p.ReleaseAndWait() +} diff --git a/util/gpool/spmc/worker.go b/util/gpool/spmc/worker.go new file mode 100644 index 0000000000000..6076aacc317ed --- /dev/null +++ b/util/gpool/spmc/worker.go @@ -0,0 +1,83 @@ +// 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, +// 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 spmc + +import ( + "github.com/pingcap/log" + "github.com/pingcap/tidb/resourcemanager/pooltask" + atomicutil "go.uber.org/atomic" + "go.uber.org/zap" +) + +// goWorker is the actual executor who runs the tasks, +// it starts a goroutine that accepts tasks and +// performs function calls. +type goWorker[T any, U any, C any, CT any, TF pooltask.Context[CT]] struct { + // pool who owns this worker. + pool *Pool[T, U, C, CT, TF] + + // taskBoxCh is a job should be done. + taskBoxCh chan *pooltask.TaskBox[T, U, C, CT, TF] + + // recycleTime will be updated when putting a worker back into queue. + recycleTime atomicutil.Time +} + +// run starts a goroutine to repeat the process +// that performs the function calls. +func (w *goWorker[T, U, C, CT, TF]) run() { + w.pool.addRunning(1) + go func() { + defer func() { + w.pool.addRunning(-1) + w.pool.workerCache.Put(w) + if p := recover(); p != nil { + if ph := w.pool.options.PanicHandler; ph != nil { + ph(p) + } else { + log.Error("worker exits from a panic", zap.Any("recover", p), zap.Stack("stack")) + } + } + // Call Signal() here in case there are goroutines waiting for available workers. + w.pool.cond.Signal() + }() + + for f := range w.taskBoxCh { + if f == nil { + return + } + if f.GetStatus() == pooltask.PendingTask { + f.SetStatus(pooltask.RunningTask) + } + w.pool.subWaitingTask() + ctx := f.GetContextFunc().GetContext() + if f.GetResultCh() != nil { + for t := range f.GetTaskCh() { + if f.GetStatus() == pooltask.StopTask { + f.Done() + break + } + f.GetResultCh() <- w.pool.consumerFunc(t.Task, f.ConstArgs(), ctx) + f.Done() + } + } + w.pool.ExitSubTask(f.TaskID()) + f.Finish() + if ok := w.pool.revertWorker(w); !ok { + return + } + } + }() +} diff --git a/util/gpool/spmc/worker_loop_queue.go b/util/gpool/spmc/worker_loop_queue.go new file mode 100644 index 0000000000000..59c7b97fd425a --- /dev/null +++ b/util/gpool/spmc/worker_loop_queue.go @@ -0,0 +1,192 @@ +// 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, +// 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 spmc + +import ( + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/resourcemanager/pooltask" +) + +var ( + // errQueueIsFull will be returned when the worker queue is full. + errQueueIsFull = errors.New("the queue is full") + + // errQueueIsReleased will be returned when trying to insert item to a released worker queue. + errQueueIsReleased = errors.New("the queue is released could not accept item anymore") +) + +type loopQueue[T any, U any, C any, CT any, TF pooltask.Context[CT]] struct { + items []*goWorker[T, U, C, CT, TF] + expiry []*goWorker[T, U, C, CT, TF] + head int + tail int + size int + isFull bool +} + +func newWorkerLoopQueue[T any, U any, C any, CT any, TF pooltask.Context[CT]](size int) *loopQueue[T, U, C, CT, TF] { + return &loopQueue[T, U, C, CT, TF]{ + items: make([]*goWorker[T, U, C, CT, TF], size), + size: size, + } +} + +func (wq *loopQueue[T, U, C, CT, TF]) len() int { + if wq.size == 0 { + return 0 + } + + if wq.head == wq.tail { + if wq.isFull { + return wq.size + } + return 0 + } + + if wq.tail > wq.head { + return wq.tail - wq.head + } + + return wq.size - wq.head + wq.tail +} + +func (wq *loopQueue[T, U, C, CT, TF]) isEmpty() bool { + return wq.head == wq.tail && !wq.isFull +} + +func (wq *loopQueue[T, U, C, CT, TF]) insert(worker *goWorker[T, U, C, CT, TF]) error { + if wq.size == 0 { + return errQueueIsReleased + } + + if wq.isFull { + return errQueueIsFull + } + wq.items[wq.tail] = worker + wq.tail++ + + if wq.tail == wq.size { + wq.tail = 0 + } + if wq.tail == wq.head { + wq.isFull = true + } + + return nil +} + +func (wq *loopQueue[T, U, C, CT, TF]) detach() *goWorker[T, U, C, CT, TF] { + if wq.isEmpty() { + return nil + } + + w := wq.items[wq.head] + wq.items[wq.head] = nil + wq.head++ + if wq.head == wq.size { + wq.head = 0 + } + wq.isFull = false + + return w +} + +func (wq *loopQueue[T, U, C, CT, TF]) retrieveExpiry(duration time.Duration) []*goWorker[T, U, C, CT, TF] { + expiryTime := time.Now().Add(-duration) + index := wq.binarySearch(expiryTime) + if index == -1 { + return nil + } + wq.expiry = wq.expiry[:0] + + if wq.head <= index { + wq.expiry = append(wq.expiry, wq.items[wq.head:index+1]...) + for i := wq.head; i < index+1; i++ { + wq.items[i] = nil + } + } else { + wq.expiry = append(wq.expiry, wq.items[0:index+1]...) + wq.expiry = append(wq.expiry, wq.items[wq.head:]...) + for i := 0; i < index+1; i++ { + wq.items[i] = nil + } + for i := wq.head; i < wq.size; i++ { + wq.items[i] = nil + } + } + head := (index + 1) % wq.size + wq.head = head + if len(wq.expiry) > 0 { + wq.isFull = false + } + + return wq.expiry +} + +// binarySearch is to find the first worker which is idle for more than duration. +func (wq *loopQueue[T, U, C, CT, TF]) binarySearch(expiryTime time.Time) int { + var mid, nlen, basel, tmid int + nlen = len(wq.items) + + // if no need to remove work, return -1 + if wq.isEmpty() || expiryTime.Before(wq.items[wq.head].recycleTime.Load()) { + return -1 + } + + // example + // size = 8, head = 7, tail = 4 + // [ 2, 3, 4, 5, nil, nil, nil, 1] true position + // 0 1 2 3 4 5 6 7 + // tail head + // + // 1 2 3 4 nil nil nil 0 mapped position + // r l + + // base algorithm is a copy from worker_stack + // map head and tail to effective left and right + r := (wq.tail - 1 - wq.head + nlen) % nlen + basel = wq.head + l := 0 + for l <= r { + mid = l + ((r - l) >> 1) + // calculate true mid position from mapped mid position + tmid = (mid + basel + nlen) % nlen + if expiryTime.Before(wq.items[tmid].recycleTime.Load()) { + r = mid - 1 + } else { + l = mid + 1 + } + } + // return true position from mapped position + return (r + basel + nlen) % nlen +} + +func (wq *loopQueue[T, U, C, CT, TF]) reset() { + if wq.isEmpty() { + return + } + +Releasing: + if w := wq.detach(); w != nil { + w.taskBoxCh <- nil + goto Releasing + } + wq.items = wq.items[:0] + wq.size = 0 + wq.head = 0 + wq.tail = 0 +} diff --git a/util/gpool/spmc/worker_loop_queue_test.go b/util/gpool/spmc/worker_loop_queue_test.go new file mode 100644 index 0000000000000..da9bdc8dbc36c --- /dev/null +++ b/util/gpool/spmc/worker_loop_queue_test.go @@ -0,0 +1,184 @@ +// 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, +// 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 spmc + +import ( + "testing" + "time" + + "github.com/pingcap/tidb/resourcemanager/pooltask" + "github.com/stretchr/testify/require" + atomicutil "go.uber.org/atomic" +) + +func TestNewLoopQueue(t *testing.T) { + size := 100 + q := newWorkerLoopQueue[struct{}, struct{}, int, any, pooltask.NilContext](size) + require.EqualValues(t, 0, q.len(), "Len error") + require.Equal(t, true, q.isEmpty(), "IsEmpty error") + require.Nil(t, q.detach(), "Dequeue error") +} + +func TestLoopQueue(t *testing.T) { + size := 10 + q := newWorkerLoopQueue[struct{}, struct{}, int, any, pooltask.NilContext](size) + + for i := 0; i < 5; i++ { + err := q.insert(&goWorker[struct{}, struct{}, int, any, pooltask.NilContext]{recycleTime: *atomicutil.NewTime(time.Now())}) + if err != nil { + break + } + } + require.EqualValues(t, 5, q.len(), "Len error") + _ = q.detach() + require.EqualValues(t, 4, q.len(), "Len error") + + time.Sleep(time.Second) + + for i := 0; i < 6; i++ { + err := q.insert(&goWorker[struct{}, struct{}, int, any, pooltask.NilContext]{recycleTime: *atomicutil.NewTime(time.Now())}) + if err != nil { + break + } + } + require.EqualValues(t, 10, q.len(), "Len error") + + err := q.insert(&goWorker[struct{}, struct{}, int, any, pooltask.NilContext]{recycleTime: *atomicutil.NewTime(time.Now())}) + require.Error(t, err, "Enqueue, error") + + q.retrieveExpiry(time.Second) + require.EqualValuesf(t, 6, q.len(), "Len error: %d", q.len()) +} + +func TestRotatedArraySearch(t *testing.T) { + size := 10 + q := newWorkerLoopQueue[struct{}, struct{}, int, any, pooltask.NilContext](size) + + expiry1 := time.Now() + + _ = q.insert(&goWorker[struct{}, struct{}, int, any, pooltask.NilContext]{recycleTime: *atomicutil.NewTime(time.Now())}) + + require.EqualValues(t, 0, q.binarySearch(time.Now()), "index should be 0") + require.EqualValues(t, -1, q.binarySearch(expiry1), "index should be -1") + + expiry2 := time.Now() + _ = q.insert(&goWorker[struct{}, struct{}, int, any, pooltask.NilContext]{recycleTime: *atomicutil.NewTime(time.Now())}) + require.EqualValues(t, -1, q.binarySearch(expiry1), "index should be -1") + require.EqualValues(t, 0, q.binarySearch(expiry2), "index should be 0") + require.EqualValues(t, 1, q.binarySearch(time.Now()), "index should be 1") + + for i := 0; i < 5; i++ { + _ = q.insert(&goWorker[struct{}, struct{}, int, any, pooltask.NilContext]{recycleTime: *atomicutil.NewTime(time.Now())}) + } + + expiry3 := time.Now() + _ = q.insert(&goWorker[struct{}, struct{}, int, any, pooltask.NilContext]{recycleTime: *atomicutil.NewTime(expiry3)}) + + var err error + for err != errQueueIsFull { + err = q.insert(&goWorker[struct{}, struct{}, int, any, pooltask.NilContext]{recycleTime: *atomicutil.NewTime(time.Now())}) + } + + require.EqualValues(t, 7, q.binarySearch(expiry3), "index should be 7") + + // rotate + for i := 0; i < 6; i++ { + _ = q.detach() + } + + expiry4 := time.Now() + _ = q.insert(&goWorker[struct{}, struct{}, int, any, pooltask.NilContext]{recycleTime: *atomicutil.NewTime(expiry4)}) + + for i := 0; i < 4; i++ { + _ = q.insert(&goWorker[struct{}, struct{}, int, any, pooltask.NilContext]{recycleTime: *atomicutil.NewTime(time.Now())}) + } + // head = 6, tail = 5, insert direction -> + // [expiry4, time, time, time, time, nil/tail, time/head, time, time, time] + require.EqualValues(t, 0, q.binarySearch(expiry4), "index should be 0") + + for i := 0; i < 3; i++ { + _ = q.detach() + } + expiry5 := time.Now() + _ = q.insert(&goWorker[struct{}, struct{}, int, any, pooltask.NilContext]{recycleTime: *atomicutil.NewTime(expiry5)}) + + // head = 6, tail = 5, insert direction -> + // [expiry4, time, time, time, time, expiry5, nil/tail, nil, nil, time/head] + require.EqualValues(t, 5, q.binarySearch(expiry5), "index should be 5") + + for i := 0; i < 3; i++ { + _ = q.insert(&goWorker[struct{}, struct{}, int, any, pooltask.NilContext]{recycleTime: *atomicutil.NewTime(time.Now())}) + } + // head = 9, tail = 9, insert direction -> + // [expiry4, time, time, time, time, expiry5, time, time, time, time/head/tail] + require.EqualValues(t, -1, q.binarySearch(expiry2), "index should be -1") + + require.EqualValues(t, 9, q.binarySearch(q.items[9].recycleTime.Load()), "index should be 9") + require.EqualValues(t, 8, q.binarySearch(time.Now()), "index should be 8") +} + +func TestRetrieveExpiry(t *testing.T) { + size := 10 + q := newWorkerLoopQueue[struct{}, struct{}, int, any, pooltask.NilContext](size) + expirew := make([]*goWorker[struct{}, struct{}, int, any, pooltask.NilContext], 0) + u, _ := time.ParseDuration("1s") + + // test [ time+1s, time+1s, time+1s, time+1s, time+1s, time, time, time, time, time] + for i := 0; i < size/2; i++ { + _ = q.insert(&goWorker[struct{}, struct{}, int, any, pooltask.NilContext]{recycleTime: *atomicutil.NewTime(time.Now())}) + } + expirew = append(expirew, q.items[:size/2]...) + time.Sleep(u) + + for i := 0; i < size/2; i++ { + _ = q.insert(&goWorker[struct{}, struct{}, int, any, pooltask.NilContext]{recycleTime: *atomicutil.NewTime(time.Now())}) + } + workers := q.retrieveExpiry(u) + + require.EqualValues(t, expirew, workers, "expired workers aren't right") + + // test [ time, time, time, time, time, time+1s, time+1s, time+1s, time+1s, time+1s] + time.Sleep(u) + + for i := 0; i < size/2; i++ { + _ = q.insert(&goWorker[struct{}, struct{}, int, any, pooltask.NilContext]{recycleTime: *atomicutil.NewTime(time.Now())}) + } + expirew = expirew[:0] + expirew = append(expirew, q.items[size/2:]...) + + workers2 := q.retrieveExpiry(u) + + require.EqualValues(t, expirew, workers2, "expired workers aren't right") + + // test [ time+1s, time+1s, time+1s, nil, nil, time+1s, time+1s, time+1s, time+1s, time+1s] + for i := 0; i < size/2; i++ { + _ = q.insert(&goWorker[struct{}, struct{}, int, any, pooltask.NilContext]{recycleTime: *atomicutil.NewTime(time.Now())}) + } + for i := 0; i < size/2; i++ { + _ = q.detach() + } + for i := 0; i < 3; i++ { + _ = q.insert(&goWorker[struct{}, struct{}, int, any, pooltask.NilContext]{recycleTime: *atomicutil.NewTime(time.Now())}) + } + time.Sleep(u) + + expirew = expirew[:0] + expirew = append(expirew, q.items[0:3]...) + expirew = append(expirew, q.items[size/2:]...) + + workers3 := q.retrieveExpiry(u) + + require.EqualValues(t, expirew, workers3, "expired workers aren't right") +} diff --git a/util/hint/BUILD.bazel b/util/hint/BUILD.bazel index 05fb356dcfbf2..817a1237fa9df 100644 --- a/util/hint/BUILD.bazel +++ b/util/hint/BUILD.bazel @@ -14,6 +14,7 @@ go_library( "//sessionctx", "//util/dbterror", "//util/logutil", + "@com_github_pingcap_errors//:errors", "@org_uber_go_zap//:zap", ], ) diff --git a/util/hint/hint_processor.go b/util/hint/hint_processor.go index 47613a429d99a..9d3fcf1005858 100644 --- a/util/hint/hint_processor.go +++ b/util/hint/hint_processor.go @@ -19,6 +19,7 @@ import ( "strconv" "strings" + "github.com/pingcap/errors" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" @@ -273,6 +274,13 @@ func ParseHintsSet(p *parser.Parser, sql, charset, collation, db string) (*Hints } for _, tblHint := range tblHints { if tblHint.HintName.L == hintQBName { + if len(tblHint.Tables) > 0 { + newHints = append(newHints, tblHint) + } + continue + } + if processor.isHint4View(tblHint) { + newHints = append(newHints, tblHint) continue } offset := processor.GetHintOffset(tblHint.QBName, curOffset) @@ -318,8 +326,9 @@ type BlockHintProcessor struct { QbHints map[int][]*ast.TableOptimizerHint // Group all hints at same query block. // Used for the view's hint - QbNameMap4View map[string][]ast.HintTable // Map from view's query block name to view's table list. - QbHints4View map[string][]*ast.TableOptimizerHint // Group all hints at same query block for view hints. + QbNameMap4View map[string][]ast.HintTable // Map from view's query block name to view's table list. + QbHints4View map[string][]*ast.TableOptimizerHint // Group all hints at same query block for view hints. + QbNameUsed4View map[string]struct{} // Store all the qb_name hints which are used for view Ctx sessionctx.Context selectStmtOffset int @@ -339,15 +348,14 @@ func (p *BlockHintProcessor) Enter(in ast.Node) (ast.Node, bool) { p.checkQueryBlockHints(node.TableHints, 0) case *ast.SelectStmt: p.selectStmtOffset++ - // Only support view hints which appear in the outer select part - if p.selectStmtOffset == 1 { - // Handle the view hints and update the left hint. - node.TableHints = p.handleViewHints(node.TableHints) - } node.QueryBlockOffset = p.selectStmtOffset + // Handle the view hints and update the left hint. + node.TableHints = p.handleViewHints(node.TableHints, node.QueryBlockOffset) p.checkQueryBlockHints(node.TableHints, node.QueryBlockOffset) case *ast.ExplainStmt: return in, true + case *ast.CreateBindingStmt: + return in, true } return in, false } @@ -366,12 +374,6 @@ func (p *BlockHintProcessor) checkQueryBlockHints(hints []*ast.TableOptimizerHin if hint.HintName.L != hintQBName { continue } - if offset > 1 && len(hint.Tables) > 0 { - if p.Ctx != nil { - p.Ctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("The qb_name hint for view only supports to be defined in the first query block")) - } - continue - } if qbName != "" { if p.Ctx != nil { p.Ctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("There are more than two query names in same query block, using the first one %s", qbName)) @@ -395,7 +397,7 @@ func (p *BlockHintProcessor) checkQueryBlockHints(hints []*ast.TableOptimizerHin } } -func (p *BlockHintProcessor) handleViewHints(hints []*ast.TableOptimizerHint) (leftHints []*ast.TableOptimizerHint) { +func (p *BlockHintProcessor) handleViewHints(hints []*ast.TableOptimizerHint, offset int) (leftHints []*ast.TableOptimizerHint) { if len(hints) == 0 { return } @@ -409,6 +411,7 @@ func (p *BlockHintProcessor) handleViewHints(hints []*ast.TableOptimizerHint) (l usedHints[i] = true if p.QbNameMap4View == nil { p.QbNameMap4View = make(map[string][]ast.HintTable) + p.QbNameUsed4View = make(map[string]struct{}) } qbName := hint.QBName.L if qbName == "" { @@ -419,6 +422,14 @@ func (p *BlockHintProcessor) handleViewHints(hints []*ast.TableOptimizerHint) (l p.Ctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("Duplicate query block name %s for view's query block hint, only the first one is effective", qbName)) } } else { + if offset != 1 { + // If there are some qb_name hints for view are not defined in the first query block, + // we should add the query block number where it is located to the first table in the view's qb_name hint table list. + qbNum := hint.Tables[0].QBName.L + if qbNum == "" { + hint.Tables[0].QBName = model.NewCIStr(fmt.Sprintf("%s%d", defaultSelectBlockPrefix, offset)) + } + } p.QbNameMap4View[qbName] = hint.Tables } } @@ -444,6 +455,10 @@ func (p *BlockHintProcessor) handleViewHints(hints []*ast.TableOptimizerHint) (l break } } + if !ok { + p.Ctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("Only one query block name is allowed in a view hint, otherwise the hint will be invalid")) + usedHints[i] = true + } } } @@ -464,6 +479,18 @@ func (p *BlockHintProcessor) handleViewHints(hints []*ast.TableOptimizerHint) (l return } +// HandleUnusedViewHints handle the unused view hints. +func (p *BlockHintProcessor) HandleUnusedViewHints() { + if p.QbNameMap4View != nil { + for qbName := range p.QbNameMap4View { + _, ok := p.QbNameUsed4View[qbName] + if !ok && p.Ctx != nil { + p.Ctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("The qb_name hint %s is unused, please check whether the table list in the qb_name hint %s is correct", qbName, qbName)) + } + } + } +} + const ( defaultUpdateBlockName = "upd_1" defaultDeleteBlockName = "del_1" @@ -539,6 +566,25 @@ func (p *BlockHintProcessor) checkTableQBName(tables []ast.HintTable) bool { return true } +func (p *BlockHintProcessor) isHint4View(hint *ast.TableOptimizerHint) bool { + if hint.QBName.L != "" { + if p.QbNameMap4View != nil { + _, ok := p.QbNameMap4View[hint.QBName.L] + return ok + } + return false + } + allViewHints := true + for _, table := range hint.Tables { + qbName := table.QBName.L + if _, ok := p.QbNameMap4View[qbName]; !ok { + allViewHints = false + break + } + } + return allViewHints +} + // GetCurrentStmtHints extracts all hints that take effects at current stmt. func (p *BlockHintProcessor) GetCurrentStmtHints(hints []*ast.TableOptimizerHint, currentOffset int) []*ast.TableOptimizerHint { if p.QbHints == nil { @@ -572,3 +618,55 @@ func GenerateQBName(nodeType NodeType, blockOffset int) (model.CIStr, error) { } return model.NewCIStr(fmt.Sprintf("%s%d", defaultSelectBlockPrefix, blockOffset)), nil } + +// CheckBindingFromHistoryBindable checks whether the ast and hint string from history is bindable. +// Not support: +// 1. query use tiFlash engine +// 2. query with sub query +// 3. query with more than 2 table join +func CheckBindingFromHistoryBindable(node ast.Node, hintStr string) error { + // check tiflash + contain := strings.Contains(hintStr, "tiflash") + if contain { + return errors.New("can't create binding for query with tiflash engine") + } + + checker := bindableChecker{ + bindable: true, + tables: make(map[model.CIStr]struct{}, 2), + } + node.Accept(&checker) + return checker.reason +} + +// bindableChecker checks whether a binding from history can be created. +type bindableChecker struct { + bindable bool + reason error + tables map[model.CIStr]struct{} +} + +// Enter implements Visitor interface. +func (checker *bindableChecker) Enter(in ast.Node) (out ast.Node, skipChildren bool) { + switch node := in.(type) { + case *ast.ExistsSubqueryExpr, *ast.SubqueryExpr: + checker.bindable = false + checker.reason = errors.New("can't create binding for query with sub query") + return in, true + case *ast.TableName: + if _, ok := checker.tables[node.Schema]; !ok { + checker.tables[node.Name] = struct{}{} + } + if len(checker.tables) >= 3 { + checker.bindable = false + checker.reason = errors.New("can't create binding for query with more than two table join") + return in, true + } + } + return in, false +} + +// Leave implements Visitor interface. +func (checker *bindableChecker) Leave(in ast.Node) (out ast.Node, ok bool) { + return in, checker.bindable +} diff --git a/util/intest/BUILD.bazel b/util/intest/BUILD.bazel new file mode 100644 index 0000000000000..8eb8b75c1ca25 --- /dev/null +++ b/util/intest/BUILD.bazel @@ -0,0 +1,11 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "intest", + srcs = [ + "common.go", + "intest.go", #keep + ], + importpath = "github.com/pingcap/tidb/util/intest", + visibility = ["//visibility:public"], +) diff --git a/util/intest/common.go b/util/intest/common.go new file mode 100644 index 0000000000000..6e5a6abb17dd4 --- /dev/null +++ b/util/intest/common.go @@ -0,0 +1,20 @@ +// Copyright 2023 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. + +//go:build !intest + +package intest + +// InTest checks if the code is running in test. +const InTest = false diff --git a/util/intest/intest.go b/util/intest/intest.go new file mode 100644 index 0000000000000..a96d2fbf737ef --- /dev/null +++ b/util/intest/intest.go @@ -0,0 +1,20 @@ +// Copyright 2023 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. + +//go:build intest + +package intest + +// InTest checks if the code is running in test. +const InTest = true diff --git a/util/logutil/hex_test.go b/util/logutil/hex_test.go index fac76d0406ad9..35d98310c1bcb 100644 --- a/util/logutil/hex_test.go +++ b/util/logutil/hex_test.go @@ -32,7 +32,7 @@ func TestHex(t *testing.T) { region.StartKey = []byte{'t', 200, '\\', 000, 000, 000, '\\', 000, 000, 000, 37, '-', 000, 000, 000, 000, 000, 000, 000, 37} region.EndKey = []byte("3asg3asd") - expected := "{Id:6662 StartKey:74c85c0000005c000000252d0000000000000025 EndKey:3361736733617364 RegionEpoch: Peers:[] EncryptionMeta: IsInFlashback:false}" + expected := "{Id:6662 StartKey:74c85c0000005c000000252d0000000000000025 EndKey:3361736733617364 RegionEpoch: Peers:[] EncryptionMeta: IsInFlashback:false FlashbackStartTs:0}" require.Equal(t, expected, logutil.Hex(®ion).String()) } diff --git a/util/logutil/log.go b/util/logutil/log.go index 83eb44eb9d2cc..a7d59ae0c2d0f 100644 --- a/util/logutil/log.go +++ b/util/logutil/log.go @@ -111,37 +111,30 @@ func InitLogger(cfg *LogConfig) error { return errors.Trace(err) } - _, _, err = initGRPCLogger(cfg) - if err != nil { - return errors.Trace(err) - } - + initGRPCLogger(gl) return nil } -func initGRPCLogger(cfg *LogConfig) (*zap.Logger, *log.ZapProperties, error) { - // Copy Config struct by assignment. - config := cfg.Config - var l *zap.Logger - var err error - var prop *log.ZapProperties +func initGRPCLogger(gl *zap.Logger) { + level := zapcore.ErrorLevel + verbosity := 0 if len(os.Getenv("GRPC_DEBUG")) > 0 { - config.Level = "debug" - l, prop, err = log.InitLogger(&config, zap.AddStacktrace(zapcore.FatalLevel)) - if err != nil { - return nil, nil, errors.Trace(err) - } - gzap.ReplaceGrpcLoggerV2WithVerbosity(l, 999) - } else { - config.Level = "error" - l, prop, err = log.InitLogger(&config, zap.AddStacktrace(zapcore.FatalLevel)) - if err != nil { - return nil, nil, errors.Trace(err) - } - gzap.ReplaceGrpcLoggerV2(l) + verbosity = 999 + level = zapcore.DebugLevel } - return l, prop, nil + newgl := gl.WithOptions(zap.WrapCore(func(core zapcore.Core) zapcore.Core { + oldcore, ok := core.(*log.TextIOCore) + if !ok { + return oldcore + } + newcore := oldcore.Clone() + leveler := zap.NewAtomicLevel() + leveler.SetLevel(level) + newcore.LevelEnabler = leveler + return newcore + })) + gzap.ReplaceGrpcLoggerV2WithVerbosity(newgl, verbosity) } // ReplaceLogger replace global logger instance with given log config. diff --git a/util/logutil/log_test.go b/util/logutil/log_test.go index d059204973678..57a7786c0e530 100644 --- a/util/logutil/log_test.go +++ b/util/logutil/log_test.go @@ -100,21 +100,6 @@ func TestSetLevel(t *testing.T) { require.Equal(t, zap.DebugLevel, log.GetLevel()) } -func TestGrpcLoggerCreation(t *testing.T) { - level := "info" - conf := NewLogConfig(level, DefaultLogFormat, "", EmptyFileLogConfig, false) - _, p, err := initGRPCLogger(conf) - // assert after init grpc logger, the original conf is not changed - require.Equal(t, conf.Level, level) - require.NoError(t, err) - require.Equal(t, p.Level.Level(), zap.ErrorLevel) - os.Setenv("GRPC_DEBUG", "1") - defer os.Unsetenv("GRPC_DEBUG") - _, newP, err := initGRPCLogger(conf) - require.NoError(t, err) - require.Equal(t, newP.Level.Level(), zap.DebugLevel) -} - func TestSlowQueryLoggerCreation(t *testing.T) { level := "Error" conf := NewLogConfig(level, DefaultLogFormat, "", EmptyFileLogConfig, false) diff --git a/util/mathutil/BUILD.bazel b/util/mathutil/BUILD.bazel index 971a1ded219e4..4d0b9810eaa57 100644 --- a/util/mathutil/BUILD.bazel +++ b/util/mathutil/BUILD.bazel @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "mathutil", srcs = [ + "exponential_average.go", "math.go", "rand.go", ], @@ -15,6 +16,7 @@ go_test( name = "mathutil_test", timeout = "short", srcs = [ + "exponential_average_test.go", "main_test.go", "math_test.go", "rand_test.go", diff --git a/util/mathutil/exponential_average.go b/util/mathutil/exponential_average.go new file mode 100644 index 0000000000000..bf3cb440e0633 --- /dev/null +++ b/util/mathutil/exponential_average.go @@ -0,0 +1,54 @@ +// 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, +// 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 mathutil + +// ExponentialMovingAverage is an exponential moving average measurement implementation. It is not thread-safe. +type ExponentialMovingAverage struct { + value float64 + sum float64 + factor float64 + warmupWindow int + count int +} + +// NewExponentialMovingAverage will create a new ExponentialMovingAverage. +func NewExponentialMovingAverage( + factor float64, + warmupWindow int, +) *ExponentialMovingAverage { + if factor >= 1 || factor <= 0 { + panic("factor must be (0, 1)") + } + return &ExponentialMovingAverage{ + factor: factor, + warmupWindow: warmupWindow, + } +} + +// Add a single sample and update the internal state. +func (m *ExponentialMovingAverage) Add(value float64) { + if m.count < m.warmupWindow { + m.count++ + m.sum += value + m.value = m.sum / float64(m.count) + } else { + m.value = m.value*(1-m.factor) + value*m.factor + } +} + +// Get the current value. +func (m *ExponentialMovingAverage) Get() float64 { + return m.value +} diff --git a/util/mathutil/exponential_average_test.go b/util/mathutil/exponential_average_test.go new file mode 100644 index 0000000000000..b622c780a5ad8 --- /dev/null +++ b/util/mathutil/exponential_average_test.go @@ -0,0 +1,39 @@ +// 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, +// 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 mathutil + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +var samples = [100]float64{ + 1576, 1524, 6746, 6426, 9476, 1721, 8528, 7827, 8613, 6969, 4200, 4686, 2408, 3956, 7105, 1341, + 9938, 9789, 6199, 4868, 4280, 7738, 7219, 3388, 2431, 1193, 1954, 2147, 7726, 3545, 8043, 2379, + 4859, 4247, 2873, 6419, 3114, 3132, 6534, 8515, 1632, 9710, 6699, 1552, 2412, 4679, 4499, 9577, + 7528, 8931, 7904, 5104, 8533, 7633, 4933, 1078, 3209, 1168, 1421, 4495, 2333, 1439, 8584, 7814, + 4320, 9569, 1370, 6635, 7870, 2828, 1599, 3592, 1934, 5944, 9418, 4143, 2285, 6756, 2674, 7293, + 4206, 5279, 9744, 2610, 2760, 9176, 1731, 3877, 2084, 2016, 3505, 5951, 4797, 5948, 8287, 8641, + 9349, 2690, 3820, 3895, +} + +func TestExponential(t *testing.T) { + win := NewExponentialMovingAverage(0.8, 2) + for _, s := range samples { + win.Add(s) + } + require.Equal(t, int64(3886), int64(win.Get())) +} diff --git a/util/memory/memstats.go b/util/memory/memstats.go index cd0074ece52c7..9cc4a3b14fb5a 100644 --- a/util/memory/memstats.go +++ b/util/memory/memstats.go @@ -18,6 +18,8 @@ import ( "runtime" "sync/atomic" "time" + + "github.com/pingcap/failpoint" ) var stats atomic.Pointer[globalMstats] @@ -26,12 +28,18 @@ var stats atomic.Pointer[globalMstats] const ReadMemInterval = 300 * time.Millisecond // ReadMemStats read the mem stats from runtime.ReadMemStats -func ReadMemStats() *runtime.MemStats { +func ReadMemStats() (memStats *runtime.MemStats) { s := stats.Load() if s != nil { - return &s.m + memStats = &s.m + } else { + memStats = ForceReadMemStats() } - return ForceReadMemStats() + failpoint.Inject("ReadMemStats", func(val failpoint.Value) { + injectedSize := val.(int) + memStats.HeapInuse += uint64(injectedSize) + }) + return } // ForceReadMemStats is to force read memory stats. diff --git a/util/memory/tracker.go b/util/memory/tracker.go index 179aa66087497..39261a45355a1 100644 --- a/util/memory/tracker.go +++ b/util/memory/tracker.go @@ -24,7 +24,9 @@ import ( "time" "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/util/logutil" atomicutil "go.uber.org/atomic" + "go.uber.org/zap" "golang.org/x/exp/slices" ) @@ -84,14 +86,16 @@ type Tracker struct { parent *Tracker // The parent memory tracker. sync.Mutex } - label int // Label of this "Tracker". + label int // Label of this "Tracker". + // following fields are used with atomic operations, so make them 64-byte aligned. bytesConsumed int64 // Consumed bytes. bytesReleased int64 // Released bytes. maxConsumed atomicutil.Int64 // max number of bytes consumed during execution. SessionID uint64 // SessionID indicates the sessionID the tracker is bound. NeedKill atomic.Bool // NeedKill indicates whether this session need kill because OOM - IsRootTrackerOfSess bool // IsRootTrackerOfSess indicates whether this tracker is bound for session - isGlobal bool // isGlobal indicates whether this tracker is global tracker + NeedKillReceived sync.Once + IsRootTrackerOfSess bool // IsRootTrackerOfSess indicates whether this tracker is bound for session + isGlobal bool // isGlobal indicates whether this tracker is global tracker } type actionMu struct { @@ -306,7 +310,7 @@ func (t *Tracker) Detach() { t.DetachFromGlobalTracker() return } - if parent.IsRootTrackerOfSess { + if parent.IsRootTrackerOfSess && t.label == LabelForSQLText { parent.actionMuForHardLimit.Lock() parent.actionMuForHardLimit.actionOnExceed = nil parent.actionMuForHardLimit.Unlock() @@ -315,6 +319,7 @@ func (t *Tracker) Detach() { parent.actionMuForSoftLimit.actionOnExceed = nil parent.actionMuForSoftLimit.Unlock() parent.NeedKill.Store(false) + parent.NeedKillReceived = sync.Once{} } parent.remove(t) t.mu.Lock() @@ -412,7 +417,7 @@ func (t *Tracker) Consume(bs int64) { for { maxNow := tracker.maxConsumed.Load() consumed := atomic.LoadInt64(&tracker.bytesConsumed) - if consumed > maxNow && !tracker.maxConsumed.CAS(maxNow, consumed) { + if consumed > maxNow && !tracker.maxConsumed.CompareAndSwap(maxNow, consumed) { continue } if label, ok := MetricsTypes[tracker.label]; ok { @@ -448,6 +453,11 @@ func (t *Tracker) Consume(bs int64) { if bs > 0 && sessionRootTracker != nil { // Kill the Top1 session if sessionRootTracker.NeedKill.Load() { + sessionRootTracker.NeedKillReceived.Do( + func() { + logutil.BgLogger().Warn("global memory controller, NeedKill signal is received successfully", + zap.Uint64("connID", sessionRootTracker.SessionID)) + }) tryActionLastOne(&sessionRootTracker.actionMuForHardLimit, sessionRootTracker) } // Update the Top1 session @@ -752,6 +762,17 @@ func (t *Tracker) CountAllChildrenMemUse() map[string]int64 { return trackerMemUseMap } +// GetChildrenForTest returns children trackers +func (t *Tracker) GetChildrenForTest() []*Tracker { + t.mu.Lock() + defer t.mu.Unlock() + trackers := make([]*Tracker, 0) + for _, list := range t.mu.children { + trackers = append(trackers, list...) + } + return trackers +} + func countChildMem(t *Tracker, familyTreeName string, trackerMemUseMap map[string]int64) { if len(familyTreeName) > 0 { familyTreeName += " <- " @@ -822,6 +843,8 @@ const ( LabelForPreparedPlanCache int = -26 // LabelForSession represents the label of a session. LabelForSession int = -27 + // LabelForMemDB represents the label of the MemDB + LabelForMemDB int = -28 ) // MetricsTypes is used to get label for metrics diff --git a/util/memoryusagealarm/BUILD.bazel b/util/memoryusagealarm/BUILD.bazel index 80d092d6e4723..43ac9094cb002 100644 --- a/util/memoryusagealarm/BUILD.bazel +++ b/util/memoryusagealarm/BUILD.bazel @@ -20,6 +20,7 @@ go_library( go_test( name = "memoryusagealarm_test", + timeout = "short", srcs = ["memoryusagealarm_test.go"], embed = [":memoryusagealarm"], flaky = True, diff --git a/util/memoryusagealarm/memoryusagealarm.go b/util/memoryusagealarm/memoryusagealarm.go index 882d8462ef60b..c8a6fd0eaecda 100644 --- a/util/memoryusagealarm/memoryusagealarm.go +++ b/util/memoryusagealarm/memoryusagealarm.go @@ -266,15 +266,16 @@ func (record *memoryUsageAlarm) printTop10SqlInfo(pinfo []*util.ProcessInfo, f * func (record *memoryUsageAlarm) getTop10SqlInfo(cmp func(i, j *util.ProcessInfo) bool, pinfo []*util.ProcessInfo) strings.Builder { slices.SortFunc(pinfo, cmp) list := pinfo - if len(list) > 10 { - list = list[:10] - } var buf strings.Builder oomAction := variable.OOMAction.Load() serverMemoryLimit := memory.ServerMemoryLimit.Load() - for i, info := range list { + for i, totalCnt := 0, 10; i < len(list) && totalCnt > 0; i++ { + info := list[i] buf.WriteString(fmt.Sprintf("SQL %v: \n", i)) fields := util.GenLogFields(record.lastCheckTime.Sub(info.Time), info, false) + if fields == nil { + continue + } fields = append(fields, zap.String("tidb_mem_oom_action", oomAction)) fields = append(fields, zap.Uint64("tidb_server_memory_limit", serverMemoryLimit)) fields = append(fields, zap.Int64("tidb_mem_quota_query", info.OOMAlarmVariablesInfo.SessionMemQuotaQuery)) @@ -294,6 +295,7 @@ func (record *memoryUsageAlarm) getTop10SqlInfo(cmp func(i, j *util.ProcessInfo) } buf.WriteString("\n") } + totalCnt-- } buf.WriteString("\n") return buf diff --git a/util/memoryusagealarm/memoryusagealarm_test.go b/util/memoryusagealarm/memoryusagealarm_test.go index f0b0af6bd99ec..6e5147805676f 100644 --- a/util/memoryusagealarm/memoryusagealarm_test.go +++ b/util/memoryusagealarm/memoryusagealarm_test.go @@ -104,12 +104,14 @@ func genMockProcessInfoList(memConsumeList []int64, startTimeList []time.Time, s for i := 0; i < size; i++ { tracker := memory.NewTracker(0, 0) tracker.Consume(memConsumeList[i]) + var stmtCtxRefCount stmtctx.ReferenceCount = 0 processInfo := util.ProcessInfo{Time: startTimeList[i], StmtCtx: &stmtctx.StatementContext{}, MemTracker: tracker, StatsInfo: func(interface{}) map[string]uint64 { return map[string]uint64{} }, + RefCountOfStmtCtx: &stmtCtxRefCount, } processInfoList = append(processInfoList, &processInfo) } diff --git a/util/misc.go b/util/misc.go index 0e28baa5f62fc..d336aa5765451 100644 --- a/util/misc.go +++ b/util/misc.go @@ -394,10 +394,10 @@ func TLSCipher2String(n uint16) string { } // ColumnsToProto converts a slice of model.ColumnInfo to a slice of tipb.ColumnInfo. -func ColumnsToProto(columns []*model.ColumnInfo, pkIsHandle bool) []*tipb.ColumnInfo { +func ColumnsToProto(columns []*model.ColumnInfo, pkIsHandle bool, forIndex bool) []*tipb.ColumnInfo { cols := make([]*tipb.ColumnInfo, 0, len(columns)) for _, c := range columns { - col := ColumnToProto(c) + col := ColumnToProto(c, forIndex) // TODO: Here `PkHandle`'s meaning is changed, we will change it to `IsHandle` when tikv's old select logic // is abandoned. if (pkIsHandle && mysql.HasPriKeyFlag(c.GetFlag())) || c.ID == model.ExtraHandleID { @@ -411,7 +411,7 @@ func ColumnsToProto(columns []*model.ColumnInfo, pkIsHandle bool) []*tipb.Column } // ColumnToProto converts model.ColumnInfo to tipb.ColumnInfo. -func ColumnToProto(c *model.ColumnInfo) *tipb.ColumnInfo { +func ColumnToProto(c *model.ColumnInfo, forIndex bool) *tipb.ColumnInfo { pc := &tipb.ColumnInfo{ ColumnId: c.ID, Collation: collate.RewriteNewCollationIDIfNeeded(int32(mysql.CollationNames[c.GetCollate()])), @@ -420,7 +420,12 @@ func ColumnToProto(c *model.ColumnInfo) *tipb.ColumnInfo { Flag: int32(c.GetFlag()), Elems: c.GetElems(), } - pc.Tp = int32(c.GetType()) + if forIndex { + // Use array type for read the multi-valued index. + pc.Tp = int32(c.FieldType.ArrayType().GetType()) + } else { + pc.Tp = int32(c.GetType()) + } return pc } diff --git a/util/misc_test.go b/util/misc_test.go index c1510625593f0..7a5baeb197d28 100644 --- a/util/misc_test.go +++ b/util/misc_test.go @@ -174,8 +174,8 @@ func TestToPB(t *testing.T) { } column2.SetCollate("utf8mb4_bin") - assert.Equal(t, "column_id:1 collation:-45 columnLen:-1 decimal:-1 ", ColumnToProto(column).String()) - assert.Equal(t, "column_id:1 collation:-45 columnLen:-1 decimal:-1 ", ColumnsToProto([]*model.ColumnInfo{column, column2}, false)[0].String()) + assert.Equal(t, "column_id:1 collation:-45 columnLen:-1 decimal:-1 ", ColumnToProto(column, false).String()) + assert.Equal(t, "column_id:1 collation:-45 columnLen:-1 decimal:-1 ", ColumnsToProto([]*model.ColumnInfo{column, column2}, false, false)[0].String()) } func TestComposeURL(t *testing.T) { diff --git a/util/mock/context.go b/util/mock/context.go index d555fbf86c6ff..219b72e310ba3 100644 --- a/util/mock/context.go +++ b/util/mock/context.go @@ -48,16 +48,17 @@ var ( // Context represents mocked sessionctx.Context. type Context struct { - txn wrapTxn // mock global variable - Store kv.Storage // mock global variable - ctx context.Context - sm util.SessionManager - is sessionctx.InfoschemaMetaVersion - values map[fmt.Stringer]interface{} - sessionVars *variable.SessionVars - cancel context.CancelFunc - pcache sessionctx.PlanCache - level kvrpcpb.DiskFullOpt + txn wrapTxn // mock global variable + Store kv.Storage // mock global variable + ctx context.Context + sm util.SessionManager + is sessionctx.InfoschemaMetaVersion + values map[fmt.Stringer]interface{} + sessionVars *variable.SessionVars + cancel context.CancelFunc + pcache sessionctx.PlanCache + level kvrpcpb.DiskFullOpt + inSandBoxMode bool } type wrapTxn struct { @@ -345,11 +346,10 @@ func (*Context) GetTxnWriteThroughputSLI() *sli.TxnWriteThroughputSLI { } // StmtCommit implements the sessionctx.Context interface. -func (*Context) StmtCommit() {} +func (*Context) StmtCommit(context.Context) {} // StmtRollback implements the sessionctx.Context interface. -func (*Context) StmtRollback() { -} +func (*Context) StmtRollback(context.Context, bool) {} // StmtGetMutation implements the sessionctx.Context interface. func (*Context) StmtGetMutation(_ int64) *binlog.TableMutation { @@ -438,6 +438,21 @@ func (*Context) GetExtensions() *extension.SessionExtensions { return nil } +// EnableSandBoxMode enable the sandbox mode. +func (c *Context) EnableSandBoxMode() { + c.inSandBoxMode = true +} + +// DisableSandBoxMode enable the sandbox mode. +func (c *Context) DisableSandBoxMode() { + c.inSandBoxMode = false +} + +// InSandBoxMode indicates that this Session is in sandbox mode +func (c *Context) InSandBoxMode() bool { + return c.inSandBoxMode +} + // Close implements the sessionctx.Context interface. func (*Context) Close() {} diff --git a/util/mock/store.go b/util/mock/store.go index 3e5784fdb4d5a..ea7ca8e55fa3f 100644 --- a/util/mock/store.go +++ b/util/mock/store.go @@ -80,3 +80,8 @@ func (*Store) GetMinSafeTS(_ string) uint64 { func (*Store) GetLockWaits() ([]*deadlockpb.WaitForEntry, error) { return nil, nil } + +// GetCodec implements kv.Storage interface. +func (*Store) GetCodec() tikv.Codec { + return nil +} diff --git a/util/password-validation/BUILD.bazel b/util/password-validation/BUILD.bazel new file mode 100644 index 0000000000000..f81e360882b1b --- /dev/null +++ b/util/password-validation/BUILD.bazel @@ -0,0 +1,25 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "password-validation", + srcs = ["password_validation.go"], + importpath = "github.com/pingcap/tidb/util/password-validation", + visibility = ["//visibility:public"], + deps = [ + "//sessionctx/variable", + "//util/hack", + ], +) + +go_test( + name = "password-validation_test", + timeout = "short", + srcs = ["password_validation_test.go"], + embed = [":password-validation"], + flaky = True, + deps = [ + "//parser/auth", + "//sessionctx/variable", + "@com_github_stretchr_testify//require", + ], +) diff --git a/util/password-validation/password_validation.go b/util/password-validation/password_validation.go new file mode 100644 index 0000000000000..edd0bd39ec38a --- /dev/null +++ b/util/password-validation/password_validation.go @@ -0,0 +1,175 @@ +// 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, +// 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 validator + +import ( + "bytes" + "fmt" + "strconv" + "strings" + "unicode" + + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/util/hack" +) + +const maxPwdValidationLength int = 100 + +const minPwdValidationLength int = 4 + +// ValidateDictionaryPassword checks if the password contains words in the dictionary. +func ValidateDictionaryPassword(pwd string, globalVars *variable.GlobalVarAccessor) (bool, error) { + dictionary, err := (*globalVars).GetGlobalSysVar(variable.ValidatePasswordDictionary) + if err != nil { + return false, err + } + words := strings.Split(dictionary, ";") + if len(words) == 0 { + return true, nil + } + pwd = strings.ToLower(pwd) + for _, word := range words { + if len(word) >= minPwdValidationLength && len(word) <= maxPwdValidationLength { + if strings.Contains(pwd, strings.ToLower(word)) { + return false, nil + } + } + } + return true, nil +} + +// ValidateUserNameInPassword checks whether pwd exists in the dictionary. +func ValidateUserNameInPassword(pwd string, sessionVars *variable.SessionVars) (string, error) { + currentUser := sessionVars.User + globalVars := sessionVars.GlobalVarsAccessor + pwdBytes := hack.Slice(pwd) + if checkUserName, err := globalVars.GetGlobalSysVar(variable.ValidatePasswordCheckUserName); err != nil { + return "", err + } else if currentUser != nil && variable.TiDBOptOn(checkUserName) { + for _, username := range []string{currentUser.AuthUsername, currentUser.Username} { + usernameBytes := hack.Slice(username) + userNameLen := len(usernameBytes) + if userNameLen == 0 { + continue + } + if bytes.Contains(pwdBytes, usernameBytes) { + return "Password Contains User Name", nil + } + usernameReversedBytes := make([]byte, userNameLen) + for i := range usernameBytes { + usernameReversedBytes[i] = usernameBytes[userNameLen-1-i] + } + if bytes.Contains(pwdBytes, usernameReversedBytes) { + return "Password Contains Reversed User Name", nil + } + } + } + return "", nil +} + +// ValidatePasswordLowPolicy checks whether pwd satisfies the low policy of password validation. +func ValidatePasswordLowPolicy(pwd string, globalVars *variable.GlobalVarAccessor) (string, error) { + if validateLengthStr, err := (*globalVars).GetGlobalSysVar(variable.ValidatePasswordLength); err != nil { + return "", err + } else if validateLength, err := strconv.ParseInt(validateLengthStr, 10, 64); err != nil { + return "", err + } else if (int64)(len([]rune(pwd))) < validateLength { + return fmt.Sprintf("Require Password Length: %d", validateLength), nil + } + return "", nil +} + +// ValidatePasswordMediumPolicy checks whether pwd satisfies the medium policy of password validation. +func ValidatePasswordMediumPolicy(pwd string, globalVars *variable.GlobalVarAccessor) (string, error) { + var lowerCaseCount, upperCaseCount, numberCount, specialCharCount int64 + runes := []rune(pwd) + for i := 0; i < len(runes); i++ { + if unicode.IsUpper(runes[i]) { + upperCaseCount++ + } else if unicode.IsLower(runes[i]) { + lowerCaseCount++ + } else if unicode.IsDigit(runes[i]) { + numberCount++ + } else { + specialCharCount++ + } + } + if mixedCaseCountStr, err := (*globalVars).GetGlobalSysVar(variable.ValidatePasswordMixedCaseCount); err != nil { + return "", err + } else if mixedCaseCount, err := strconv.ParseInt(mixedCaseCountStr, 10, 64); err != nil { + return "", err + } else if lowerCaseCount < mixedCaseCount { + return fmt.Sprintf("Require Password Lowercase Count: %d", mixedCaseCount), nil + } else if upperCaseCount < mixedCaseCount { + return fmt.Sprintf("Require Password Uppercase Count: %d", mixedCaseCount), nil + } + if requireNumberCountStr, err := (*globalVars).GetGlobalSysVar(variable.ValidatePasswordNumberCount); err != nil { + return "", err + } else if requireNumberCount, err := strconv.ParseInt(requireNumberCountStr, 10, 64); err != nil { + return "", err + } else if numberCount < requireNumberCount { + return fmt.Sprintf("Require Password Digit Count: %d", requireNumberCount), nil + } + if requireSpecialCharCountStr, err := (*globalVars).GetGlobalSysVar(variable.ValidatePasswordSpecialCharCount); err != nil { + return "", err + } else if requireSpecialCharCount, err := strconv.ParseInt(requireSpecialCharCountStr, 10, 64); err != nil { + return "", err + } else if specialCharCount < requireSpecialCharCount { + return fmt.Sprintf("Require Password Non-alphanumeric Count: %d", requireSpecialCharCount), nil + } + return "", nil +} + +// ValidatePassword checks whether the pwd can be used. +func ValidatePassword(sessionVars *variable.SessionVars, pwd string) error { + globalVars := sessionVars.GlobalVarsAccessor + + validatePolicy, err := globalVars.GetGlobalSysVar(variable.ValidatePasswordPolicy) + if err != nil { + return err + } + if warn, err := ValidateUserNameInPassword(pwd, sessionVars); err != nil { + return err + } else if len(warn) > 0 { + return variable.ErrNotValidPassword.GenWithStack(warn) + } + if warn, err := ValidatePasswordLowPolicy(pwd, &globalVars); err != nil { + return err + } else if len(warn) > 0 { + return variable.ErrNotValidPassword.GenWithStack(warn) + } + // LOW + if validatePolicy == "LOW" { + return nil + } + + // MEDIUM + if warn, err := ValidatePasswordMediumPolicy(pwd, &globalVars); err != nil { + return err + } else if len(warn) > 0 { + return variable.ErrNotValidPassword.GenWithStack(warn) + } + if validatePolicy == "MEDIUM" { + return nil + } + + // STRONG + if ok, err := ValidateDictionaryPassword(pwd, &globalVars); err != nil { + return err + } else if !ok { + return variable.ErrNotValidPassword.GenWithStack("Password contains word in the dictionary") + } + return nil +} diff --git a/util/password-validation/password_validation_test.go b/util/password-validation/password_validation_test.go new file mode 100644 index 0000000000000..8a851b2006203 --- /dev/null +++ b/util/password-validation/password_validation_test.go @@ -0,0 +1,175 @@ +// 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, +// 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 validator + +import ( + "context" + "testing" + + "github.com/pingcap/tidb/parser/auth" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/stretchr/testify/require" +) + +func TestValidateDictionaryPassword(t *testing.T) { + vars := variable.NewSessionVars(nil) + mock := variable.NewMockGlobalAccessor4Tests() + mock.SessionVars = vars + vars.GlobalVarsAccessor = mock + + err := mock.SetGlobalSysVar(context.Background(), variable.ValidatePasswordDictionary, "abc;123;1234;5678;HIJK;中文测试;。,;!") + require.NoError(t, err) + testcases := []struct { + pwd string + result bool + }{ + {"abcdefg", true}, + {"abcd123efg", true}, + {"abcd1234efg", false}, + {"abcd12345efg", false}, + {"abcd123efghij", true}, + {"abcd123efghijk", false}, + {"abcd123efghij中文测试", false}, + {"abcd123。,;!", false}, + } + for _, testcase := range testcases { + ok, err := ValidateDictionaryPassword(testcase.pwd, &vars.GlobalVarsAccessor) + require.NoError(t, err) + require.Equal(t, testcase.result, ok, testcase.pwd) + } +} + +func TestValidateUserNameInPassword(t *testing.T) { + sessionVars := variable.NewSessionVars(nil) + sessionVars.User = &auth.UserIdentity{Username: "user", AuthUsername: "authuser"} + sessionVars.GlobalVarsAccessor = variable.NewMockGlobalAccessor4Tests() + testcases := []struct { + pwd string + warn string + }{ + {"", ""}, + {"user", "Password Contains User Name"}, + {"authuser", "Password Contains User Name"}, + {"resu000", "Password Contains Reversed User Name"}, + {"resuhtua", "Password Contains Reversed User Name"}, + {"User", ""}, + {"authUser", ""}, + {"Resu", ""}, + {"Resuhtua", ""}, + } + // Enable check_user_name + err := sessionVars.GlobalVarsAccessor.SetGlobalSysVar(context.Background(), variable.ValidatePasswordCheckUserName, "ON") + require.NoError(t, err) + for _, testcase := range testcases { + warn, err := ValidateUserNameInPassword(testcase.pwd, sessionVars) + require.NoError(t, err) + require.Equal(t, testcase.warn, warn, testcase.pwd) + } + + // Disable check_user_name + err = sessionVars.GlobalVarsAccessor.SetGlobalSysVar(context.Background(), variable.ValidatePasswordCheckUserName, "OFF") + require.NoError(t, err) + for _, testcase := range testcases { + warn, err := ValidateUserNameInPassword(testcase.pwd, sessionVars) + require.NoError(t, err) + require.Equal(t, "", warn, testcase.pwd) + } +} + +func TestValidatePasswordLowPolicy(t *testing.T) { + sessionVars := variable.NewSessionVars(nil) + sessionVars.GlobalVarsAccessor = variable.NewMockGlobalAccessor4Tests() + sessionVars.GlobalVarsAccessor.(*variable.MockGlobalAccessor).SessionVars = sessionVars + err := sessionVars.GlobalVarsAccessor.SetGlobalSysVar(context.Background(), variable.ValidatePasswordLength, "8") + require.NoError(t, err) + + warn, err := ValidatePasswordLowPolicy("1234", &sessionVars.GlobalVarsAccessor) + require.NoError(t, err) + require.Equal(t, "Require Password Length: 8", warn) + warn, err = ValidatePasswordLowPolicy("12345678", &sessionVars.GlobalVarsAccessor) + require.NoError(t, err) + require.Equal(t, "", warn) + + err = sessionVars.GlobalVarsAccessor.SetGlobalSysVar(context.Background(), variable.ValidatePasswordLength, "12") + require.NoError(t, err) + warn, err = ValidatePasswordLowPolicy("12345678", &sessionVars.GlobalVarsAccessor) + require.NoError(t, err) + require.Equal(t, "Require Password Length: 12", warn) +} + +func TestValidatePasswordMediumPolicy(t *testing.T) { + sessionVars := variable.NewSessionVars(nil) + sessionVars.GlobalVarsAccessor = variable.NewMockGlobalAccessor4Tests() + sessionVars.GlobalVarsAccessor.(*variable.MockGlobalAccessor).SessionVars = sessionVars + + err := sessionVars.GlobalVarsAccessor.SetGlobalSysVar(context.Background(), variable.ValidatePasswordMixedCaseCount, "1") + require.NoError(t, err) + err = sessionVars.GlobalVarsAccessor.SetGlobalSysVar(context.Background(), variable.ValidatePasswordSpecialCharCount, "2") + require.NoError(t, err) + err = sessionVars.GlobalVarsAccessor.SetGlobalSysVar(context.Background(), variable.ValidatePasswordNumberCount, "3") + require.NoError(t, err) + + warn, err := ValidatePasswordMediumPolicy("!@A123", &sessionVars.GlobalVarsAccessor) + require.NoError(t, err) + require.Equal(t, "Require Password Lowercase Count: 1", warn) + warn, err = ValidatePasswordMediumPolicy("!@a123", &sessionVars.GlobalVarsAccessor) + require.NoError(t, err) + require.Equal(t, "Require Password Uppercase Count: 1", warn) + warn, err = ValidatePasswordMediumPolicy("!@Aa12", &sessionVars.GlobalVarsAccessor) + require.NoError(t, err) + require.Equal(t, "Require Password Digit Count: 3", warn) + warn, err = ValidatePasswordMediumPolicy("!Aa123", &sessionVars.GlobalVarsAccessor) + require.NoError(t, err) + require.Equal(t, "Require Password Non-alphanumeric Count: 2", warn) + warn, err = ValidatePasswordMediumPolicy("!@Aa123", &sessionVars.GlobalVarsAccessor) + require.NoError(t, err) + require.Equal(t, "", warn) +} + +func TestValidatePassword(t *testing.T) { + sessionVars := variable.NewSessionVars(nil) + sessionVars.GlobalVarsAccessor = variable.NewMockGlobalAccessor4Tests() + sessionVars.GlobalVarsAccessor.(*variable.MockGlobalAccessor).SessionVars = sessionVars + sessionVars.User = &auth.UserIdentity{Username: "user", AuthUsername: "authuser"} + + err := sessionVars.GlobalVarsAccessor.SetGlobalSysVar(context.Background(), variable.ValidatePasswordPolicy, "LOW") + require.NoError(t, err) + err = ValidatePassword(sessionVars, "1234") + require.Error(t, err) + err = ValidatePassword(sessionVars, "user1234") + require.Error(t, err) + err = ValidatePassword(sessionVars, "authuser1234") + require.Error(t, err) + err = ValidatePassword(sessionVars, "User1234") + require.NoError(t, err) + + err = sessionVars.GlobalVarsAccessor.SetGlobalSysVar(context.Background(), variable.ValidatePasswordPolicy, "MEDIUM") + require.NoError(t, err) + err = ValidatePassword(sessionVars, "User1234") + require.Error(t, err) + err = ValidatePassword(sessionVars, "!User1234") + require.NoError(t, err) + err = ValidatePassword(sessionVars, "!User1234") + require.NoError(t, err) + + err = sessionVars.GlobalVarsAccessor.SetGlobalSysVar(context.Background(), variable.ValidatePasswordPolicy, "STRONG") + require.NoError(t, err) + err = sessionVars.GlobalVarsAccessor.SetGlobalSysVar(context.Background(), variable.ValidatePasswordDictionary, "User") + require.NoError(t, err) + err = ValidatePassword(sessionVars, "!User1234") + require.Error(t, err) + err = ValidatePassword(sessionVars, "!ABcd1234") + require.NoError(t, err) +} diff --git a/util/plancodec/id.go b/util/plancodec/id.go index 8b17660bfa589..0366b7dc3f5a6 100644 --- a/util/plancodec/id.go +++ b/util/plancodec/id.go @@ -127,6 +127,10 @@ const ( TypeCTE = "CTEFullScan" // TypeCTEDefinition is the type of CTE definition TypeCTEDefinition = "CTE" + // TypeForeignKeyCheck is the type of FKCheck + TypeForeignKeyCheck = "Foreign_Key_Check" + // TypeForeignKeyCascade is the type of FKCascade + TypeForeignKeyCascade = "Foreign_Key_Cascade" ) // plan id. @@ -187,6 +191,8 @@ const ( typePartitionUnionID int = 53 typeShuffleID int = 54 typeShuffleReceiverID int = 55 + typeForeignKeyCheck int = 56 + typeForeignKeyCascade int = 57 ) // TypeStringToPhysicalID converts the plan type string to plan id. @@ -302,6 +308,10 @@ func TypeStringToPhysicalID(tp string) int { return typeCTEDefinitionID case TypeCTETable: return typeCTETableID + case TypeForeignKeyCheck: + return typeForeignKeyCheck + case TypeForeignKeyCascade: + return typeForeignKeyCascade } // Should never reach here. return 0 @@ -420,6 +430,10 @@ func PhysicalIDToTypeString(id int) string { return TypeCTEDefinition case typeCTETableID: return TypeCTETable + case typeForeignKeyCheck: + return TypeForeignKeyCheck + case typeForeignKeyCascade: + return TypeForeignKeyCascade } // Should never reach here. diff --git a/util/printer.go b/util/printer.go index 748097f91429a..56724bc1ff664 100644 --- a/util/printer.go +++ b/util/printer.go @@ -31,6 +31,7 @@ var ( ) // GetRawInfo do what its name tells +// nolint:unused func GetRawInfo(app string) string { info := "" info += fmt.Sprintf("App Name: %s\n", app) @@ -43,6 +44,7 @@ func GetRawInfo(app string) string { } // PrintInfo prints the app's basic information in log +// nolint:unused func PrintInfo(app string) { log.Info("Welcome to "+app, zap.String("Release Version", Version), diff --git a/util/processinfo.go b/util/processinfo.go index 6e379e49a8fe7..135b1c58d5676 100644 --- a/util/processinfo.go +++ b/util/processinfo.go @@ -31,6 +31,14 @@ import ( "github.com/tikv/client-go/v2/oracle" ) +// ProtectedTSList holds a list of timestamps that should delay GC. +type ProtectedTSList interface { + // HoldTS holds the timestamp to prevent its data from being GCed. + HoldTS(ts uint64) (unhold func()) + // GetMinProtectedTS returns the minimum protected timestamp that greater than `lowerBound` (0 if no such one). + GetMinProtectedTS(lowerBound uint64) (ts uint64) +} + // OOMAlarmVariablesInfo is a struct for OOM alarm variables. type OOMAlarmVariablesInfo struct { SessionAnalyzeVersion int @@ -40,9 +48,12 @@ type OOMAlarmVariablesInfo struct { // ProcessInfo is a struct used for show processlist statement. type ProcessInfo struct { + ProtectedTSList Time time.Time + ExpensiveLogTime time.Time Plan interface{} StmtCtx *stmtctx.StatementContext + RefCountOfStmtCtx *stmtctx.ReferenceCount MemTracker *memory.Tracker DiskTracker *disk.Tracker StatsInfo func(interface{}) map[string]uint64 @@ -53,17 +64,17 @@ type ProcessInfo struct { User string Info string Port string + ResourceGroupName string PlanExplainRows [][]string OOMAlarmVariablesInfo OOMAlarmVariablesInfo ID uint64 CurTxnStartTS uint64 // MaxExecutionTime is the timeout for select statement, in milliseconds. // If the query takes too long, kill it. - MaxExecutionTime uint64 - State uint16 - Command byte - ExceedExpensiveTimeThresh bool - RedactSQL bool + MaxExecutionTime uint64 + State uint16 + Command byte + RedactSQL bool } // ToRowForShow returns []interface{} for the row data of "SHOW [FULL] PROCESSLIST". @@ -125,7 +136,24 @@ func (pi *ProcessInfo) ToRow(tz *time.Location) []interface{} { diskConsumed = pi.DiskTracker.BytesConsumed() } } - return append(pi.ToRowForShow(true), pi.Digest, bytesConsumed, diskConsumed, pi.txnStartTs(tz)) + return append(pi.ToRowForShow(true), pi.Digest, bytesConsumed, diskConsumed, pi.txnStartTs(tz), pi.ResourceGroupName) +} + +// GetMinStartTS returns the minimum start-ts (used to delay GC) that greater than `lowerBound` (0 if no such one). +func (pi *ProcessInfo) GetMinStartTS(lowerBound uint64) (ts uint64) { + if pi == nil { + return + } + if thisTS := pi.CurTxnStartTS; thisTS > lowerBound && (thisTS < ts || ts == 0) { + ts = thisTS + } + if pi.ProtectedTSList == nil { + return + } + if thisTS := pi.GetMinProtectedTS(lowerBound); thisTS > lowerBound && (thisTS < ts || ts == 0) { + ts = thisTS + } + return } // ascServerStatus is a slice of all defined server status in ascending order. @@ -196,6 +224,8 @@ type SessionManager interface { CheckOldRunningTxn(job2ver map[int64]int64, job2ids map[int64]string) // KillNonFlashbackClusterConn kill all non flashback cluster connections. KillNonFlashbackClusterConn() + // GetMinStartTS returns the minimum start-ts (used to delay GC) that greater than `lowerBound` (0 if no such one). + GetMinStartTS(lowerBound uint64) uint64 } // GlobalConnID is the global connection ID, providing UNIQUE connection IDs across the whole TiDB cluster. diff --git a/util/ranger/detacher.go b/util/ranger/detacher.go index cbeed5b6364de..606f53c40265f 100644 --- a/util/ranger/detacher.go +++ b/util/ranger/detacher.go @@ -581,9 +581,8 @@ func ExtractEqAndInCondition(sctx sessionctx.Context, conditions []expression.Ex points[offset] = rb.intersection(points[offset], rb.build(cond, collator), collator) if len(points[offset]) == 0 { // Early termination if false expression found if expression.MaybeOverOptimized4PlanCache(sctx, conditions) { - // cannot return an empty-range for plan-cache since the range may become non-empty as parameters change - // for safety, return the whole conditions in this case - return nil, conditions, nil, nil, false + // `a>@x and a<@y` --> `invalid-range if @x>=@y` + sctx.GetSessionVars().StmtCtx.SetSkipPlanCache(errors.Errorf("skip plan-cache: some parameters may be overwritten")) } return nil, nil, nil, nil, true } @@ -606,9 +605,8 @@ func ExtractEqAndInCondition(sctx sessionctx.Context, conditions []expression.Ex accesses[i] = nil } else if len(points[i]) == 0 { // Early termination if false expression found if expression.MaybeOverOptimized4PlanCache(sctx, conditions) { - // cannot return an empty-range for plan-cache since the range may become non-empty as parameters change - // for safety, return the whole conditions in this case - return nil, conditions, nil, nil, false + // `a>@x and a<@y` --> `invalid-range if @x>=@y` + sctx.GetSessionVars().StmtCtx.SetSkipPlanCache(errors.Errorf("skip plan-cache: some parameters may be overwritten")) } return nil, nil, nil, nil, true } else { @@ -622,7 +620,7 @@ func ExtractEqAndInCondition(sctx sessionctx.Context, conditions []expression.Ex } if expression.MaybeOverOptimized4PlanCache(sctx, conditions) { // `a=@x and a=@y` --> `a=@x if @x==@y` - sctx.GetSessionVars().StmtCtx.SkipPlanCache = true + sctx.GetSessionVars().StmtCtx.SetSkipPlanCache(errors.Errorf("skip plan-cache: some parameters may be overwritten")) } } } diff --git a/util/ranger/testdata/ranger_suite_out.json b/util/ranger/testdata/ranger_suite_out.json index 3934ff2f7bad3..4a4f0c85e2682 100644 --- a/util/ranger/testdata/ranger_suite_out.json +++ b/util/ranger/testdata/ranger_suite_out.json @@ -9,7 +9,7 @@ "└─Apply 2.00 root CARTESIAN left outer semi join, other cond:eq(test.t.e, Column#26)", " ├─TableReader(Build) 2.00 root data:TableFullScan", " │ └─TableFullScan 2.00 cop[tikv] table:t keep order:false", - " └─HashAgg(Probe) 2.00 root funcs:count(1)->Column#26", + " └─StreamAgg(Probe) 2.00 root funcs:count(1)->Column#26", " └─HashJoin 4.00 root inner join, equal:[eq(test.t.a, test.t.a)]", " ├─IndexReader(Build) 4.00 root index:IndexFullScan", " │ └─IndexFullScan 4.00 cop[tikv] table:t1, index:idx(b, c, d) keep order:false", diff --git a/util/ranger/types.go b/util/ranger/types.go index d0beaa1c19a1d..6c6ab98c52157 100644 --- a/util/ranger/types.go +++ b/util/ranger/types.go @@ -75,6 +75,9 @@ func (ran *Range) Width() int { // Clone clones a Range. func (ran *Range) Clone() *Range { + if ran == nil { + return nil + } newRange := &Range{ LowVal: make([]types.Datum, 0, len(ran.LowVal)), HighVal: make([]types.Datum, 0, len(ran.HighVal)), diff --git a/util/replayer/BUILD.bazel b/util/replayer/BUILD.bazel new file mode 100644 index 0000000000000..bd04735f32d31 --- /dev/null +++ b/util/replayer/BUILD.bazel @@ -0,0 +1,12 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "replayer", + srcs = ["replayer.go"], + importpath = "github.com/pingcap/tidb/util/replayer", + visibility = ["//visibility:public"], + deps = [ + "//config", + "@com_github_pingcap_errors//:errors", + ], +) diff --git a/util/replayer/replayer.go b/util/replayer/replayer.go new file mode 100644 index 0000000000000..de7439bd724f2 --- /dev/null +++ b/util/replayer/replayer.go @@ -0,0 +1,74 @@ +// 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, +// 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 replayer + +import ( + "encoding/base64" + "fmt" + "math/rand" + "os" + "path/filepath" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/config" +) + +// PlanReplayerTaskKey indicates key of a plan replayer task +type PlanReplayerTaskKey struct { + SQLDigest string + PlanDigest string +} + +// GeneratePlanReplayerFile generates plan replayer file +func GeneratePlanReplayerFile(isCapture, isContinuesCapture, enableHistoricalStatsForCapture bool) (*os.File, string, error) { + path := GetPlanReplayerDirName() + err := os.MkdirAll(path, os.ModePerm) + if err != nil { + return nil, "", errors.AddStack(err) + } + fileName, err := generatePlanReplayerFileName(isCapture, isContinuesCapture, enableHistoricalStatsForCapture) + if err != nil { + return nil, "", errors.AddStack(err) + } + zf, err := os.Create(filepath.Join(path, fileName)) + if err != nil { + return nil, "", errors.AddStack(err) + } + return zf, fileName, err +} + +func generatePlanReplayerFileName(isCapture, isContinuesCapture, enableHistoricalStatsForCapture bool) (string, error) { + // Generate key and create zip file + time := time.Now().UnixNano() + b := make([]byte, 16) + //nolint: gosec + _, err := rand.Read(b) + if err != nil { + return "", err + } + key := base64.URLEncoding.EncodeToString(b) + if isContinuesCapture || isCapture && enableHistoricalStatsForCapture { + return fmt.Sprintf("capture_replayer_%v_%v.zip", key, time), nil + } + return fmt.Sprintf("replayer_%v_%v.zip", key, time), nil +} + +// GetPlanReplayerDirName returns plan replayer directory path. +// The path is related to the process id. +func GetPlanReplayerDirName() string { + tidbLogDir := filepath.Dir(config.GetGlobalConfig().Log.File.Filename) + return filepath.Join(tidbLogDir, "replayer") +} diff --git a/util/rowcodec/rowcodec_test.go b/util/rowcodec/rowcodec_test.go index 8ec7f7b5b114a..08c25466a1564 100644 --- a/util/rowcodec/rowcodec_test.go +++ b/util/rowcodec/rowcodec_test.go @@ -291,7 +291,7 @@ func TestTypesNewRowCodec(t *testing.T) { return d } getTime := func(value string) types.Time { - d, err := types.ParseTime(&stmtctx.StatementContext{TimeZone: time.UTC}, value, mysql.TypeTimestamp, 6) + d, err := types.ParseTime(&stmtctx.StatementContext{TimeZone: time.UTC}, value, mysql.TypeTimestamp, 6, nil) require.NoError(t, err) return d } diff --git a/util/sem/sem.go b/util/sem/sem.go index 161334c880a4a..e2364893b05b2 100644 --- a/util/sem/sem.go +++ b/util/sem/sem.go @@ -136,7 +136,6 @@ func IsInvisibleStatusVar(varName string) bool { func IsInvisibleSysVar(varNameInLower string) bool { switch varNameInLower { case variable.TiDBDDLSlowOprThreshold, // ddl_slow_threshold - variable.TiDBAllowRemoveAutoInc, variable.TiDBCheckMb4ValueInUTF8, variable.TiDBConfig, variable.TiDBEnableSlowLog, diff --git a/util/sem/sem_test.go b/util/sem/sem_test.go index cb0c47ad9225d..d19c2af27adcb 100644 --- a/util/sem/sem_test.go +++ b/util/sem/sem_test.go @@ -81,8 +81,8 @@ func TestIsInvisibleSysVar(t *testing.T) { assert.False(IsInvisibleSysVar(variable.Hostname)) // changes the value to default, but is not invisible assert.False(IsInvisibleSysVar(variable.TiDBEnableEnhancedSecurity)) // should be able to see the mode is on. + assert.False(IsInvisibleSysVar(variable.TiDBAllowRemoveAutoInc)) - assert.True(IsInvisibleSysVar(variable.TiDBAllowRemoveAutoInc)) assert.True(IsInvisibleSysVar(variable.TiDBCheckMb4ValueInUTF8)) assert.True(IsInvisibleSysVar(variable.TiDBConfig)) assert.True(IsInvisibleSysVar(variable.TiDBEnableSlowLog)) diff --git a/util/servermemorylimit/BUILD.bazel b/util/servermemorylimit/BUILD.bazel index 9e144b820922e..c8fcc3e3c4c79 100644 --- a/util/servermemorylimit/BUILD.bazel +++ b/util/servermemorylimit/BUILD.bazel @@ -9,13 +9,16 @@ go_library( "//parser/mysql", "//types", "//util", + "//util/logutil", "//util/memory", "@org_uber_go_atomic//:atomic", + "@org_uber_go_zap//:zap", ], ) go_test( name = "servermemorylimit_test", + timeout = "short", srcs = ["servermemorylimit_test.go"], embed = [":servermemorylimit"], flaky = True, diff --git a/util/servermemorylimit/servermemorylimit.go b/util/servermemorylimit/servermemorylimit.go index a13e2e8b0e081..511a86703db17 100644 --- a/util/servermemorylimit/servermemorylimit.go +++ b/util/servermemorylimit/servermemorylimit.go @@ -24,8 +24,10 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/memory" atomicutil "go.uber.org/atomic" + "go.uber.org/zap" ) // Process global Observation indicators for memory limit. @@ -81,12 +83,24 @@ type sessionToBeKilled struct { sqlStartTime time.Time sessionID uint64 sessionTracker *memory.Tracker + + killStartTime time.Time + lastLogTime time.Time } func killSessIfNeeded(s *sessionToBeKilled, bt uint64, sm util.SessionManager) { if s.isKilling { if info, ok := sm.GetProcessInfo(s.sessionID); ok { if info.Time == s.sqlStartTime { + if time.Since(s.lastLogTime) > 5*time.Second { + logutil.BgLogger().Warn(fmt.Sprintf("global memory controller failed to kill the top-consumer in %ds", + time.Since(s.killStartTime)/time.Second), + zap.Uint64("connID", info.ID), + zap.String("sql digest", info.Digest), + zap.String("sql text", fmt.Sprintf("%.100v", info.Info)), + zap.Int64("sql memory usage", info.MemTracker.BytesConsumed())) + s.lastLogTime = time.Now() + } return } } @@ -95,6 +109,7 @@ func killSessIfNeeded(s *sessionToBeKilled, bt uint64, sm util.SessionManager) { memory.MemUsageTop1Tracker.CompareAndSwap(s.sessionTracker, nil) //nolint: all_revive,revive runtime.GC() + logutil.BgLogger().Warn("global memory controller killed the top1 memory consumer successfully") } if bt == 0 { @@ -108,6 +123,14 @@ func killSessIfNeeded(s *sessionToBeKilled, bt uint64, sm util.SessionManager) { t := memory.MemUsageTop1Tracker.Load() if t != nil { if info, ok := sm.GetProcessInfo(t.SessionID); ok { + logutil.BgLogger().Warn("global memory controller tries to kill the top1 memory consumer", + zap.Uint64("connID", info.ID), + zap.String("sql digest", info.Digest), + zap.String("sql text", fmt.Sprintf("%.100v", info.Info)), + zap.Uint64("tidb_server_memory_limit", bt), + zap.Uint64("heap inuse", instanceStats.HeapInuse), + zap.Int64("sql memory usage", info.MemTracker.BytesConsumed()), + ) s.sessionID = t.SessionID s.sqlStartTime = info.Time s.isKilling = true @@ -119,6 +142,8 @@ func killSessIfNeeded(s *sessionToBeKilled, bt uint64, sm util.SessionManager) { SessionKillLast.Store(killTime) IsKilling.Store(true) GlobalMemoryOpsHistoryManager.recordOne(info, killTime, bt, instanceStats.HeapInuse) + s.lastLogTime = time.Now() + s.killStartTime = time.Now() } } } diff --git a/util/set/string_set.go b/util/set/string_set.go index a008612b6ee12..9c2d6946f2683 100644 --- a/util/set/string_set.go +++ b/util/set/string_set.go @@ -52,3 +52,8 @@ func (s StringSet) Intersection(rhs StringSet) StringSet { func (s StringSet) Count() int { return len(s) } + +// Empty returns whether s is empty. +func (s StringSet) Empty() bool { + return len(s) == 0 +} diff --git a/util/signal/BUILD.bazel b/util/signal/BUILD.bazel index af19da427497c..e2963d6f554bb 100644 --- a/util/signal/BUILD.bazel +++ b/util/signal/BUILD.bazel @@ -9,8 +9,31 @@ go_library( ], importpath = "github.com/pingcap/tidb/util/signal", visibility = ["//visibility:public"], - deps = [ - "//util/logutil", - "@org_uber_go_zap//:zap", - ], + deps = select({ + "@io_bazel_rules_go//go/platform:android": [ + "//util/logutil", + "@org_uber_go_zap//:zap", + ], + "@io_bazel_rules_go//go/platform:darwin": [ + "//util/logutil", + "@org_uber_go_zap//:zap", + ], + "@io_bazel_rules_go//go/platform:freebsd": [ + "//util/logutil", + "@org_uber_go_zap//:zap", + ], + "@io_bazel_rules_go//go/platform:ios": [ + "//util/logutil", + "@org_uber_go_zap//:zap", + ], + "@io_bazel_rules_go//go/platform:linux": [ + "//util/logutil", + "@org_uber_go_zap//:zap", + ], + "@io_bazel_rules_go//go/platform:windows": [ + "//util/logutil", + "@org_uber_go_zap//:zap", + ], + "//conditions:default": [], + }), ) diff --git a/util/slice/slice.go b/util/slice/slice.go index 078772d58c15a..12738614a115f 100644 --- a/util/slice/slice.go +++ b/util/slice/slice.go @@ -39,3 +39,16 @@ func AllOf(s interface{}, p func(int) bool) bool { } return NoneOf(s, np) } + +// Copy is a deep copy of the slice. +func Copy[T any](a []*T) []*T { + b := make([]*T, len(a)) + for i, p := range a { + if p == nil { + continue + } + v := *p + b[i] = &v + } + return b +} diff --git a/util/slice/slice_test.go b/util/slice/slice_test.go index 5a9b9ec17100f..787e0584c0f77 100644 --- a/util/slice/slice_test.go +++ b/util/slice/slice_test.go @@ -43,3 +43,19 @@ func TestSlice(t *testing.T) { }) } } + +func TestCopy(t *testing.T) { + type T int + v0, v1, v2, v3 := T(0), T(1), T(2), T(3) + s := []*T{&v0, &v1, &v2, &v3, nil} + e := Copy(s) + require.Equal(t, len(s), len(e)) + for i := range s { + if s[i] == nil { + require.Nil(t, e[i]) + } else { + require.Equal(t, *s[i], *e[i]) + require.True(t, s[i] != e[i]) + } + } +} diff --git a/util/stmtsummary/BUILD.bazel b/util/stmtsummary/BUILD.bazel index 121d09caa6825..3c8c295a5d659 100644 --- a/util/stmtsummary/BUILD.bazel +++ b/util/stmtsummary/BUILD.bazel @@ -15,6 +15,7 @@ go_library( "//parser/mysql", "//sessionctx/stmtctx", "//types", + "//util/chunk", "//util/execdetails", "//util/hack", "//util/kvcache", @@ -23,6 +24,7 @@ go_library( "//util/set", "@com_github_pingcap_failpoint//:failpoint", "@com_github_tikv_client_go_v2//util", + "@org_golang_x_exp//maps", "@org_golang_x_exp//slices", "@org_uber_go_atomic//:atomic", "@org_uber_go_zap//:zap", diff --git a/util/stmtsummary/reader.go b/util/stmtsummary/reader.go index eca48ae4e82eb..e5e9a2db39705 100644 --- a/util/stmtsummary/reader.go +++ b/util/stmtsummary/reader.go @@ -310,6 +310,9 @@ const ( PlanDigestStr = "PLAN_DIGEST" PlanStr = "PLAN" BinaryPlan = "BINARY_PLAN" + Charset = "CHARSET" + Collation = "COLLATION" + PlanHint = "PLAN_HINT" ) type columnValueFactory func(reader *stmtSummaryReader, ssElement *stmtSummaryByDigestElement, ssbd *stmtSummaryByDigest) interface{} @@ -620,4 +623,13 @@ var columnValueFactoryMap = map[string]columnValueFactory{ BinaryPlan: func(_ *stmtSummaryReader, ssElement *stmtSummaryByDigestElement, _ *stmtSummaryByDigest) interface{} { return ssElement.sampleBinaryPlan }, + Charset: func(_ *stmtSummaryReader, ssElement *stmtSummaryByDigestElement, _ *stmtSummaryByDigest) interface{} { + return ssElement.charset + }, + Collation: func(_ *stmtSummaryReader, ssElement *stmtSummaryByDigestElement, _ *stmtSummaryByDigest) interface{} { + return ssElement.collation + }, + PlanHint: func(_ *stmtSummaryReader, ssElement *stmtSummaryByDigestElement, _ *stmtSummaryByDigest) interface{} { + return ssElement.planHint + }, } diff --git a/util/stmtsummary/statement_summary.go b/util/stmtsummary/statement_summary.go index 8582dc522828e..fc49f53ad474a 100644 --- a/util/stmtsummary/statement_summary.go +++ b/util/stmtsummary/statement_summary.go @@ -27,12 +27,14 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/kvcache" "github.com/pingcap/tidb/util/plancodec" "github.com/tikv/client-go/v2/util" atomic2 "go.uber.org/atomic" + "golang.org/x/exp/maps" "golang.org/x/exp/slices" ) @@ -403,8 +405,9 @@ func (ssMap *stmtSummaryByDigestMap) GetMoreThanCntBindableStmt(cnt int64) []*Bi PlanHint: ssElement.planHint, Charset: ssElement.charset, Collation: ssElement.collation, - Users: ssElement.authUsers, + Users: make(map[string]struct{}), } + maps.Copy(stmt.Users, ssElement.authUsers) // If it is SQL command prepare / execute, the ssElement.sampleSQL is `execute ...`, we should get the original select query. // If it is binary protocol prepare / execute, ssbd.normalizedSQL should be same as ssElement.sampleSQL. if ssElement.prepared { @@ -498,6 +501,33 @@ func (ssMap *stmtSummaryByDigestMap) maxSQLLength() int { return int(ssMap.optMaxSQLLength.Load()) } +// GetBindableStmtFromCluster gets users' select/update/delete SQL. +func GetBindableStmtFromCluster(rows []chunk.Row) *BindableStmt { + for _, row := range rows { + user := row.GetString(3) + stmtType := row.GetString(0) + if user != "" && (stmtType == "Select" || stmtType == "Delete" || stmtType == "Update" || stmtType == "Insert" || stmtType == "Replace") { + // Empty auth users means that it is an internal queries. + stmt := &BindableStmt{ + Schema: row.GetString(1), //schemaName + Query: row.GetString(5), //sampleSQL + PlanHint: row.GetString(8), //planHint + Charset: row.GetString(6), //charset + Collation: row.GetString(7), //collation + } + // If it is SQL command prepare / execute, we should remove the arguments + // If it is binary protocol prepare / execute, ssbd.normalizedSQL should be same as ssElement.sampleSQL. + if row.GetInt64(4) == 1 { + if idx := strings.LastIndex(stmt.Query, "[arguments:"); idx != -1 { + stmt.Query = stmt.Query[:idx] + } + } + return stmt + } + } + return nil +} + // newStmtSummaryByDigest creates a stmtSummaryByDigest from StmtExecInfo. func (ssbd *stmtSummaryByDigest) init(sei *StmtExecInfo, _ int64, _ int64, _ int) { // Use "," to separate table names to support FIND_IN_SET. diff --git a/util/stmtsummary/statement_summary_test.go b/util/stmtsummary/statement_summary_test.go index 8ee767f2342e0..ac7e1b06e059b 100644 --- a/util/stmtsummary/statement_summary_test.go +++ b/util/stmtsummary/statement_summary_test.go @@ -175,9 +175,8 @@ func TestAddStatement(t *testing.T) { MaxWaitTime: 2500, }, ExecDetail: &execdetails.ExecDetails{ - CalleeAddress: "202", - BackoffTime: 180, - RequestCount: 20, + BackoffTime: 180, + RequestCount: 20, CommitDetail: &util.CommitDetails{ GetCommitTsTime: 500, PrewriteTime: 50000, @@ -214,9 +213,11 @@ func TestAddStatement(t *testing.T) { RocksdbBlockReadCount: 10, RocksdbBlockReadByte: 1000, }, - TimeDetail: util.TimeDetail{ - ProcessTime: 1500, - WaitTime: 150, + DetailsNeedP90: execdetails.DetailsNeedP90{ + TimeDetail: util.TimeDetail{ + ProcessTime: 1500, + WaitTime: 150, + }, CalleeAddress: "202", }, }, StmtCtx: &stmtctx.StatementContext{ @@ -313,9 +314,8 @@ func TestAddStatement(t *testing.T) { MaxWaitTime: 250, }, ExecDetail: &execdetails.ExecDetails{ - CalleeAddress: "302", - BackoffTime: 18, - RequestCount: 2, + BackoffTime: 18, + RequestCount: 2, CommitDetail: &util.CommitDetails{ GetCommitTsTime: 50, PrewriteTime: 5000, @@ -352,9 +352,12 @@ func TestAddStatement(t *testing.T) { RocksdbBlockReadCount: 10, RocksdbBlockReadByte: 1000, }, - TimeDetail: util.TimeDetail{ - ProcessTime: 150, - WaitTime: 15, + DetailsNeedP90: execdetails.DetailsNeedP90{ + TimeDetail: util.TimeDetail{ + ProcessTime: 150, + WaitTime: 15, + }, + CalleeAddress: "302", }, }, StmtCtx: &stmtctx.StatementContext{ @@ -605,9 +608,8 @@ func generateAnyExecInfo() *StmtExecInfo { MaxWaitTime: 1500, }, ExecDetail: &execdetails.ExecDetails{ - CalleeAddress: "129", - BackoffTime: 80, - RequestCount: 10, + BackoffTime: 80, + RequestCount: 10, CommitDetail: &util.CommitDetails{ GetCommitTsTime: 100, PrewriteTime: 10000, @@ -644,9 +646,12 @@ func generateAnyExecInfo() *StmtExecInfo { RocksdbBlockReadCount: 10, RocksdbBlockReadByte: 1000, }, - TimeDetail: util.TimeDetail{ - ProcessTime: 500, - WaitTime: 50, + DetailsNeedP90: execdetails.DetailsNeedP90{ + TimeDetail: util.TimeDetail{ + ProcessTime: 500, + WaitTime: 50, + }, + CalleeAddress: "129", }, }, StmtCtx: &stmtctx.StatementContext{ diff --git a/util/stmtsummary/v2/BUILD.bazel b/util/stmtsummary/v2/BUILD.bazel new file mode 100644 index 0000000000000..634afc3e2802f --- /dev/null +++ b/util/stmtsummary/v2/BUILD.bazel @@ -0,0 +1,62 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "stmtsummary", + srcs = [ + "column.go", + "logger.go", + "reader.go", + "record.go", + "stmtsummary.go", + ], + importpath = "github.com/pingcap/tidb/util/stmtsummary/v2", + visibility = ["//visibility:public"], + deps = [ + "//config", + "//parser/auth", + "//parser/model", + "//parser/mysql", + "//sessionctx/stmtctx", + "//types", + "//util", + "//util/execdetails", + "//util/hack", + "//util/kvcache", + "//util/logutil", + "//util/plancodec", + "//util/set", + "//util/stmtsummary", + "@com_github_pingcap_log//:log", + "@com_github_tikv_client_go_v2//util", + "@org_golang_x_exp//maps", + "@org_golang_x_exp//slices", + "@org_uber_go_atomic//:atomic", + "@org_uber_go_zap//:zap", + "@org_uber_go_zap//buffer", + "@org_uber_go_zap//zapcore", + ], +) + +go_test( + name = "stmtsummary_test", + timeout = "short", + srcs = [ + "column_test.go", + "main_test.go", + "reader_test.go", + "record_test.go", + "stmtsummary_test.go", + ], + embed = [":stmtsummary"], + flaky = True, + deps = [ + "//parser/auth", + "//parser/model", + "//testkit/testsetup", + "//types", + "//util", + "//util/set", + "@com_github_stretchr_testify//require", + "@org_uber_go_goleak//:goleak", + ], +) diff --git a/util/stmtsummary/v2/column.go b/util/stmtsummary/v2/column.go new file mode 100644 index 0000000000000..471ef29f3659f --- /dev/null +++ b/util/stmtsummary/v2/column.go @@ -0,0 +1,521 @@ +// Copyright 2023 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 stmtsummary + +import ( + "bytes" + "fmt" + "strings" + "time" + + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/plancodec" + "go.uber.org/zap" + "golang.org/x/exp/slices" +) + +// Statements summary table column name. +const ( + ClusterTableInstanceColumnNameStr = "INSTANCE" + SummaryBeginTimeStr = "SUMMARY_BEGIN_TIME" + SummaryEndTimeStr = "SUMMARY_END_TIME" + StmtTypeStr = "STMT_TYPE" + SchemaNameStr = "SCHEMA_NAME" + DigestStr = "DIGEST" + DigestTextStr = "DIGEST_TEXT" + TableNamesStr = "TABLE_NAMES" + IndexNamesStr = "INDEX_NAMES" + SampleUserStr = "SAMPLE_USER" + ExecCountStr = "EXEC_COUNT" + SumErrorsStr = "SUM_ERRORS" + SumWarningsStr = "SUM_WARNINGS" + SumLatencyStr = "SUM_LATENCY" + MaxLatencyStr = "MAX_LATENCY" + MinLatencyStr = "MIN_LATENCY" + AvgLatencyStr = "AVG_LATENCY" + AvgParseLatencyStr = "AVG_PARSE_LATENCY" + MaxParseLatencyStr = "MAX_PARSE_LATENCY" + AvgCompileLatencyStr = "AVG_COMPILE_LATENCY" + MaxCompileLatencyStr = "MAX_COMPILE_LATENCY" + SumCopTaskNumStr = "SUM_COP_TASK_NUM" + MaxCopProcessTimeStr = "MAX_COP_PROCESS_TIME" + MaxCopProcessAddressStr = "MAX_COP_PROCESS_ADDRESS" + MaxCopWaitTimeStr = "MAX_COP_WAIT_TIME" // #nosec G101 + MaxCopWaitAddressStr = "MAX_COP_WAIT_ADDRESS" // #nosec G101 + AvgProcessTimeStr = "AVG_PROCESS_TIME" + MaxProcessTimeStr = "MAX_PROCESS_TIME" + AvgWaitTimeStr = "AVG_WAIT_TIME" + MaxWaitTimeStr = "MAX_WAIT_TIME" + AvgBackoffTimeStr = "AVG_BACKOFF_TIME" + MaxBackoffTimeStr = "MAX_BACKOFF_TIME" + AvgTotalKeysStr = "AVG_TOTAL_KEYS" + MaxTotalKeysStr = "MAX_TOTAL_KEYS" + AvgProcessedKeysStr = "AVG_PROCESSED_KEYS" + MaxProcessedKeysStr = "MAX_PROCESSED_KEYS" + AvgRocksdbDeleteSkippedCountStr = "AVG_ROCKSDB_DELETE_SKIPPED_COUNT" + MaxRocksdbDeleteSkippedCountStr = "MAX_ROCKSDB_DELETE_SKIPPED_COUNT" + AvgRocksdbKeySkippedCountStr = "AVG_ROCKSDB_KEY_SKIPPED_COUNT" + MaxRocksdbKeySkippedCountStr = "MAX_ROCKSDB_KEY_SKIPPED_COUNT" + AvgRocksdbBlockCacheHitCountStr = "AVG_ROCKSDB_BLOCK_CACHE_HIT_COUNT" + MaxRocksdbBlockCacheHitCountStr = "MAX_ROCKSDB_BLOCK_CACHE_HIT_COUNT" + AvgRocksdbBlockReadCountStr = "AVG_ROCKSDB_BLOCK_READ_COUNT" + MaxRocksdbBlockReadCountStr = "MAX_ROCKSDB_BLOCK_READ_COUNT" + AvgRocksdbBlockReadByteStr = "AVG_ROCKSDB_BLOCK_READ_BYTE" + MaxRocksdbBlockReadByteStr = "MAX_ROCKSDB_BLOCK_READ_BYTE" + AvgPrewriteTimeStr = "AVG_PREWRITE_TIME" + MaxPrewriteTimeStr = "MAX_PREWRITE_TIME" + AvgCommitTimeStr = "AVG_COMMIT_TIME" + MaxCommitTimeStr = "MAX_COMMIT_TIME" + AvgGetCommitTsTimeStr = "AVG_GET_COMMIT_TS_TIME" + MaxGetCommitTsTimeStr = "MAX_GET_COMMIT_TS_TIME" + AvgCommitBackoffTimeStr = "AVG_COMMIT_BACKOFF_TIME" + MaxCommitBackoffTimeStr = "MAX_COMMIT_BACKOFF_TIME" + AvgResolveLockTimeStr = "AVG_RESOLVE_LOCK_TIME" + MaxResolveLockTimeStr = "MAX_RESOLVE_LOCK_TIME" + AvgLocalLatchWaitTimeStr = "AVG_LOCAL_LATCH_WAIT_TIME" + MaxLocalLatchWaitTimeStr = "MAX_LOCAL_LATCH_WAIT_TIME" + AvgWriteKeysStr = "AVG_WRITE_KEYS" + MaxWriteKeysStr = "MAX_WRITE_KEYS" + AvgWriteSizeStr = "AVG_WRITE_SIZE" + MaxWriteSizeStr = "MAX_WRITE_SIZE" + AvgPrewriteRegionsStr = "AVG_PREWRITE_REGIONS" + MaxPrewriteRegionsStr = "MAX_PREWRITE_REGIONS" + AvgTxnRetryStr = "AVG_TXN_RETRY" + MaxTxnRetryStr = "MAX_TXN_RETRY" + SumExecRetryStr = "SUM_EXEC_RETRY" + SumExecRetryTimeStr = "SUM_EXEC_RETRY_TIME" + SumBackoffTimesStr = "SUM_BACKOFF_TIMES" + BackoffTypesStr = "BACKOFF_TYPES" + AvgMemStr = "AVG_MEM" + MaxMemStr = "MAX_MEM" + AvgDiskStr = "AVG_DISK" + MaxDiskStr = "MAX_DISK" + AvgKvTimeStr = "AVG_KV_TIME" + AvgPdTimeStr = "AVG_PD_TIME" + AvgBackoffTotalTimeStr = "AVG_BACKOFF_TOTAL_TIME" + AvgWriteSQLRespTimeStr = "AVG_WRITE_SQL_RESP_TIME" + MaxResultRowsStr = "MAX_RESULT_ROWS" + MinResultRowsStr = "MIN_RESULT_ROWS" + AvgResultRowsStr = "AVG_RESULT_ROWS" + PreparedStr = "PREPARED" + AvgAffectedRowsStr = "AVG_AFFECTED_ROWS" + FirstSeenStr = "FIRST_SEEN" + LastSeenStr = "LAST_SEEN" + PlanInCacheStr = "PLAN_IN_CACHE" + PlanCacheHitsStr = "PLAN_CACHE_HITS" + PlanInBindingStr = "PLAN_IN_BINDING" + QuerySampleTextStr = "QUERY_SAMPLE_TEXT" + PrevSampleTextStr = "PREV_SAMPLE_TEXT" + PlanDigestStr = "PLAN_DIGEST" + PlanStr = "PLAN" + BinaryPlan = "BINARY_PLAN" + Charset = "CHARSET" + Collation = "COLLATION" + PlanHint = "PLAN_HINT" +) + +type columnInfo interface { + getInstanceAddr() string + getTimeLocation() *time.Location +} + +type columnFactory func(info columnInfo, record *StmtRecord) interface{} + +var columnFactoryMap = map[string]columnFactory{ + ClusterTableInstanceColumnNameStr: func(info columnInfo, record *StmtRecord) interface{} { + return info.getInstanceAddr() + }, + SummaryBeginTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + beginTime := time.Unix(record.Begin, 0) + if beginTime.Location() != info.getTimeLocation() { + beginTime = beginTime.In(info.getTimeLocation()) + } + return types.NewTime(types.FromGoTime(beginTime), mysql.TypeTimestamp, 0) + }, + SummaryEndTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + endTime := time.Unix(record.End, 0) + if endTime.Location() != info.getTimeLocation() { + endTime = endTime.In(info.getTimeLocation()) + } + return types.NewTime(types.FromGoTime(endTime), mysql.TypeTimestamp, 0) + }, + StmtTypeStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.StmtType + }, + SchemaNameStr: func(info columnInfo, record *StmtRecord) interface{} { + return convertEmptyToNil(record.SchemaName) + }, + DigestStr: func(info columnInfo, record *StmtRecord) interface{} { + return convertEmptyToNil(record.Digest) + }, + DigestTextStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.NormalizedSQL + }, + TableNamesStr: func(info columnInfo, record *StmtRecord) interface{} { + return convertEmptyToNil(record.TableNames) + }, + IndexNamesStr: func(info columnInfo, record *StmtRecord) interface{} { + return convertEmptyToNil(strings.Join(record.IndexNames, ",")) + }, + SampleUserStr: func(info columnInfo, record *StmtRecord) interface{} { + sampleUser := "" + for key := range record.AuthUsers { + sampleUser = key + break + } + return convertEmptyToNil(sampleUser) + }, + ExecCountStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.ExecCount + }, + SumErrorsStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.SumErrors + }, + SumWarningsStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.SumWarnings + }, + SumLatencyStr: func(info columnInfo, record *StmtRecord) interface{} { + return int64(record.SumLatency) + }, + MaxLatencyStr: func(info columnInfo, record *StmtRecord) interface{} { + return int64(record.MaxLatency) + }, + MinLatencyStr: func(info columnInfo, record *StmtRecord) interface{} { + return int64(record.MinLatency) + }, + AvgLatencyStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumLatency), record.ExecCount) + }, + AvgParseLatencyStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumParseLatency), record.ExecCount) + }, + MaxParseLatencyStr: func(info columnInfo, record *StmtRecord) interface{} { + return int64(record.MaxParseLatency) + }, + AvgCompileLatencyStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumCompileLatency), record.ExecCount) + }, + MaxCompileLatencyStr: func(info columnInfo, record *StmtRecord) interface{} { + return int64(record.MaxCompileLatency) + }, + SumCopTaskNumStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.SumNumCopTasks + }, + MaxCopProcessTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return int64(record.MaxCopProcessTime) + }, + MaxCopProcessAddressStr: func(info columnInfo, record *StmtRecord) interface{} { + return convertEmptyToNil(record.MaxCopProcessAddress) + }, + MaxCopWaitTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return int64(record.MaxCopWaitTime) + }, + MaxCopWaitAddressStr: func(info columnInfo, record *StmtRecord) interface{} { + return convertEmptyToNil(record.MaxCopWaitAddress) + }, + AvgProcessTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumProcessTime), record.ExecCount) + }, + MaxProcessTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return int64(record.MaxProcessTime) + }, + AvgWaitTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumWaitTime), record.ExecCount) + }, + MaxWaitTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return int64(record.MaxWaitTime) + }, + AvgBackoffTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumBackoffTime), record.ExecCount) + }, + MaxBackoffTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return int64(record.MaxBackoffTime) + }, + AvgTotalKeysStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(record.SumTotalKeys, record.ExecCount) + }, + MaxTotalKeysStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.MaxTotalKeys + }, + AvgProcessedKeysStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(record.SumProcessedKeys, record.ExecCount) + }, + MaxProcessedKeysStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.MaxProcessedKeys + }, + AvgRocksdbDeleteSkippedCountStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumRocksdbDeleteSkippedCount), record.ExecCount) + }, + MaxRocksdbDeleteSkippedCountStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.MaxRocksdbDeleteSkippedCount + }, + AvgRocksdbKeySkippedCountStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumRocksdbKeySkippedCount), record.ExecCount) + }, + MaxRocksdbKeySkippedCountStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.MaxRocksdbKeySkippedCount + }, + AvgRocksdbBlockCacheHitCountStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumRocksdbBlockCacheHitCount), record.ExecCount) + }, + MaxRocksdbBlockCacheHitCountStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.MaxRocksdbBlockCacheHitCount + }, + AvgRocksdbBlockReadCountStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumRocksdbBlockReadCount), record.ExecCount) + }, + MaxRocksdbBlockReadCountStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.MaxRocksdbBlockReadCount + }, + AvgRocksdbBlockReadByteStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumRocksdbBlockReadByte), record.ExecCount) + }, + MaxRocksdbBlockReadByteStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.MaxRocksdbBlockReadByte + }, + AvgPrewriteTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumPrewriteTime), record.CommitCount) + }, + MaxPrewriteTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return int64(record.MaxPrewriteTime) + }, + AvgCommitTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumCommitTime), record.CommitCount) + }, + MaxCommitTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return int64(record.MaxCommitTime) + }, + AvgGetCommitTsTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumGetCommitTsTime), record.CommitCount) + }, + MaxGetCommitTsTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return int64(record.MaxGetCommitTsTime) + }, + AvgCommitBackoffTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(record.SumCommitBackoffTime, record.CommitCount) + }, + MaxCommitBackoffTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.MaxCommitBackoffTime + }, + AvgResolveLockTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(record.SumResolveLockTime, record.CommitCount) + }, + MaxResolveLockTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.MaxResolveLockTime + }, + AvgLocalLatchWaitTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumLocalLatchTime), record.CommitCount) + }, + MaxLocalLatchWaitTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return int64(record.MaxLocalLatchTime) + }, + AvgWriteKeysStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgFloat(record.SumWriteKeys, record.CommitCount) + }, + MaxWriteKeysStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.MaxWriteKeys + }, + AvgWriteSizeStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgFloat(record.SumWriteSize, record.CommitCount) + }, + MaxWriteSizeStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.MaxWriteSize + }, + AvgPrewriteRegionsStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgFloat(record.SumPrewriteRegionNum, record.CommitCount) + }, + MaxPrewriteRegionsStr: func(info columnInfo, record *StmtRecord) interface{} { + return int(record.MaxPrewriteRegionNum) + }, + AvgTxnRetryStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgFloat(record.SumTxnRetry, record.CommitCount) + }, + MaxTxnRetryStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.MaxTxnRetry + }, + SumExecRetryStr: func(info columnInfo, record *StmtRecord) interface{} { + return int(record.ExecRetryCount) + }, + SumExecRetryTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return int64(record.ExecRetryTime) + }, + SumBackoffTimesStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.SumBackoffTimes + }, + BackoffTypesStr: func(info columnInfo, record *StmtRecord) interface{} { + return formatBackoffTypes(record.BackoffTypes) + }, + AvgMemStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(record.SumMem, record.ExecCount) + }, + MaxMemStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.MaxMem + }, + AvgDiskStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(record.SumDisk, record.ExecCount) + }, + MaxDiskStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.MaxDisk + }, + AvgKvTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumKVTotal), record.CommitCount) + }, + AvgPdTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumPDTotal), record.CommitCount) + }, + AvgBackoffTotalTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumBackoffTotal), record.CommitCount) + }, + AvgWriteSQLRespTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumWriteSQLRespTotal), record.CommitCount) + }, + MaxResultRowsStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.MaxResultRows + }, + MinResultRowsStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.MinResultRows + }, + AvgResultRowsStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(record.SumResultRows, record.ExecCount) + }, + PreparedStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.Prepared + }, + AvgAffectedRowsStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgFloat(int64(record.SumAffectedRows), record.ExecCount) + }, + FirstSeenStr: func(info columnInfo, record *StmtRecord) interface{} { + firstSeen := record.FirstSeen + if firstSeen.Location() != info.getTimeLocation() { + firstSeen = firstSeen.In(info.getTimeLocation()) + } + return types.NewTime(types.FromGoTime(firstSeen), mysql.TypeTimestamp, 0) + }, + LastSeenStr: func(info columnInfo, record *StmtRecord) interface{} { + lastSeen := record.LastSeen + if lastSeen.Location() != info.getTimeLocation() { + lastSeen = lastSeen.In(info.getTimeLocation()) + } + return types.NewTime(types.FromGoTime(lastSeen), mysql.TypeTimestamp, 0) + }, + PlanInCacheStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.PlanInCache + }, + PlanCacheHitsStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.PlanCacheHits + }, + PlanInBindingStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.PlanInBinding + }, + QuerySampleTextStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.SampleSQL + }, + PrevSampleTextStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.PrevSQL + }, + PlanDigestStr: func(info columnInfo, record *StmtRecord) interface{} { + return record.PlanDigest + }, + PlanStr: func(info columnInfo, record *StmtRecord) interface{} { + plan, err := plancodec.DecodePlan(record.SamplePlan) + if err != nil { + logutil.BgLogger().Error("decode plan in statement summary failed", + zap.String("plan", record.SamplePlan), + zap.String("query", record.SampleSQL), zap.Error(err)) + plan = "" + } + return plan + }, + BinaryPlan: func(info columnInfo, record *StmtRecord) interface{} { + return record.SampleBinaryPlan + }, + Charset: func(info columnInfo, record *StmtRecord) interface{} { + return record.Charset + }, + Collation: func(info columnInfo, record *StmtRecord) interface{} { + return record.Collation + }, + PlanHint: func(info columnInfo, record *StmtRecord) interface{} { + return record.PlanHint + }, +} + +func makeColumnFactories(columns []*model.ColumnInfo) []columnFactory { + columnFactories := make([]columnFactory, len(columns)) + for i, col := range columns { + factory, ok := columnFactoryMap[col.Name.O] + if !ok { + panic(fmt.Sprintf("should never happen, should register new column %v into columnValueFactoryMap", col.Name.O)) + } + columnFactories[i] = factory + } + return columnFactories +} + +// Format the backoffType map to a string or nil. +func formatBackoffTypes(backoffMap map[string]int) interface{} { + type backoffStat struct { + backoffType string + count int + } + + size := len(backoffMap) + if size == 0 { + return nil + } + + backoffArray := make([]backoffStat, 0, len(backoffMap)) + for backoffType, count := range backoffMap { + backoffArray = append(backoffArray, backoffStat{backoffType, count}) + } + slices.SortFunc(backoffArray, func(i, j backoffStat) bool { + return i.count > j.count + }) + + var buffer bytes.Buffer + for index, stat := range backoffArray { + if _, err := fmt.Fprintf(&buffer, "%v:%d", stat.backoffType, stat.count); err != nil { + return "FORMAT ERROR" + } + if index < len(backoffArray)-1 { + buffer.WriteString(",") + } + } + return buffer.String() +} + +func avgInt(sum int64, count int64) int64 { + if count > 0 { + return sum / count + } + return 0 +} + +func avgFloat(sum int64, count int64) float64 { + if count > 0 { + return float64(sum) / float64(count) + } + return 0 +} + +func convertEmptyToNil(str string) interface{} { + if str == "" { + return nil + } + return str +} diff --git a/util/stmtsummary/v2/column_test.go b/util/stmtsummary/v2/column_test.go new file mode 100644 index 0000000000000..5e87cbe89a01c --- /dev/null +++ b/util/stmtsummary/v2/column_test.go @@ -0,0 +1,82 @@ +// Copyright 2023 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 stmtsummary + +import ( + "strings" + "testing" + "time" + + "github.com/pingcap/tidb/parser/model" + "github.com/stretchr/testify/require" +) + +func TestColumn(t *testing.T) { + columns := []*model.ColumnInfo{ + {Name: model.NewCIStr(ClusterTableInstanceColumnNameStr)}, + {Name: model.NewCIStr(StmtTypeStr)}, + {Name: model.NewCIStr(SchemaNameStr)}, + {Name: model.NewCIStr(DigestStr)}, + {Name: model.NewCIStr(DigestTextStr)}, + {Name: model.NewCIStr(TableNamesStr)}, + {Name: model.NewCIStr(IndexNamesStr)}, + {Name: model.NewCIStr(SampleUserStr)}, + {Name: model.NewCIStr(ExecCountStr)}, + {Name: model.NewCIStr(SumLatencyStr)}, + {Name: model.NewCIStr(MaxLatencyStr)}, + } + factories := makeColumnFactories(columns) + info := GenerateStmtExecInfo4Test("digest") + record := NewStmtRecord(info) + record.Add(info) + for n, f := range factories { + column := f(mockColumnInfo{}, record) + switch columns[n].Name.O { + case ClusterTableInstanceColumnNameStr: + require.Equal(t, "instance_addr", column) + case StmtTypeStr: + require.Equal(t, record.StmtType, column) + case SchemaNameStr: + require.Equal(t, record.SchemaName, column) + case DigestStr: + require.Equal(t, record.Digest, column) + case DigestTextStr: + require.Equal(t, record.NormalizedSQL, column) + case TableNamesStr: + require.Equal(t, record.TableNames, column) + case IndexNamesStr: + require.Equal(t, strings.Join(record.IndexNames, ","), column) + case SampleUserStr: + require.Equal(t, info.User, column) + case ExecCountStr: + require.Equal(t, int64(1), column) + case SumLatencyStr: + require.Equal(t, int64(record.SumLatency), column) + case MaxLatencyStr: + require.Equal(t, int64(record.MaxLatency), column) + } + } +} + +type mockColumnInfo struct{} + +func (mockColumnInfo) getInstanceAddr() string { + return "instance_addr" +} + +func (mockColumnInfo) getTimeLocation() *time.Location { + loc, _ := time.LoadLocation("Asia/Shanghai") + return loc +} diff --git a/util/stmtsummary/v2/logger.go b/util/stmtsummary/v2/logger.go new file mode 100644 index 0000000000000..5b244a838237b --- /dev/null +++ b/util/stmtsummary/v2/logger.go @@ -0,0 +1,111 @@ +// Copyright 2023 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 stmtsummary + +import ( + "encoding/json" + "fmt" + "time" + + "github.com/pingcap/log" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" + "go.uber.org/zap/buffer" + "go.uber.org/zap/zapcore" +) + +var stmtLogEncoderPool = buffer.NewPool() + +type stmtLogStorage struct { + logger *zap.Logger +} + +func newStmtLogStorage(cfg *log.Config) *stmtLogStorage { + // Create the stmt logger + logger, prop, err := log.InitLogger(cfg) + if err != nil { + logutil.BgLogger().Error("failed to init logger", zap.Error(err)) + return &stmtLogStorage{logger: zap.NewNop()} + } + // Replace 2018-12-19-unified-log-format text encoder with statements encoder + newCore := log.NewTextCore(&stmtLogEncoder{}, prop.Syncer, prop.Level) + logger = logger.WithOptions(zap.WrapCore(func(core zapcore.Core) zapcore.Core { + return newCore + })) + return &stmtLogStorage{logger} +} + +func (s *stmtLogStorage) persist(w *stmtWindow, end time.Time) { + begin := w.begin.Unix() + for _, v := range w.lru.Values() { + r := v.(*lockedStmtRecord) + r.Lock() + r.Begin = begin + r.End = end.Unix() + s.log(r.StmtRecord) + r.Unlock() + } + w.evicted.Lock() + if w.evicted.other.ExecCount > 0 { + w.evicted.other.Begin = begin + w.evicted.other.End = end.Unix() + s.log(w.evicted.other) + } + w.evicted.Unlock() +} + +func (s *stmtLogStorage) log(r *StmtRecord) { + b, err := json.Marshal(r) + if err != nil { + logutil.BgLogger().Warn("failed to marshal statement summary", zap.Error(err)) + return + } + s.logger.Info(string(b)) +} + +type stmtLogEncoder struct{} + +func (*stmtLogEncoder) EncodeEntry(entry zapcore.Entry, _ []zapcore.Field) (*buffer.Buffer, error) { + b := stmtLogEncoderPool.Get() + fmt.Fprintf(b, "%s\n", entry.Message) + return b, nil +} + +func (e *stmtLogEncoder) Clone() zapcore.Encoder { return e } +func (*stmtLogEncoder) AddArray(string, zapcore.ArrayMarshaler) error { return nil } +func (*stmtLogEncoder) AddObject(string, zapcore.ObjectMarshaler) error { return nil } +func (*stmtLogEncoder) AddBinary(string, []byte) {} +func (*stmtLogEncoder) AddByteString(string, []byte) {} +func (*stmtLogEncoder) AddBool(string, bool) {} +func (*stmtLogEncoder) AddComplex128(string, complex128) {} +func (*stmtLogEncoder) AddComplex64(string, complex64) {} +func (*stmtLogEncoder) AddDuration(string, time.Duration) {} +func (*stmtLogEncoder) AddFloat64(string, float64) {} +func (*stmtLogEncoder) AddFloat32(string, float32) {} +func (*stmtLogEncoder) AddInt(string, int) {} +func (*stmtLogEncoder) AddInt64(string, int64) {} +func (*stmtLogEncoder) AddInt32(string, int32) {} +func (*stmtLogEncoder) AddInt16(string, int16) {} +func (*stmtLogEncoder) AddInt8(string, int8) {} +func (*stmtLogEncoder) AddString(string, string) {} +func (*stmtLogEncoder) AddTime(string, time.Time) {} +func (*stmtLogEncoder) AddUint(string, uint) {} +func (*stmtLogEncoder) AddUint64(string, uint64) {} +func (*stmtLogEncoder) AddUint32(string, uint32) {} +func (*stmtLogEncoder) AddUint16(string, uint16) {} +func (*stmtLogEncoder) AddUint8(string, uint8) {} +func (*stmtLogEncoder) AddUintptr(string, uintptr) {} +func (*stmtLogEncoder) AddReflected(string, interface{}) error { return nil } +func (*stmtLogEncoder) OpenNamespace(string) {} diff --git a/util/stmtsummary/v2/main_test.go b/util/stmtsummary/v2/main_test.go new file mode 100644 index 0000000000000..5756815f7492d --- /dev/null +++ b/util/stmtsummary/v2/main_test.go @@ -0,0 +1,33 @@ +// Copyright 2023 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 stmtsummary + +import ( + "testing" + + "github.com/pingcap/tidb/testkit/testsetup" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + testsetup.SetupForCommonTest() + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), + } + goleak.VerifyTestMain(m, opts...) +} diff --git a/util/stmtsummary/v2/reader.go b/util/stmtsummary/v2/reader.go new file mode 100644 index 0000000000000..d7c63e162ed0f --- /dev/null +++ b/util/stmtsummary/v2/reader.go @@ -0,0 +1,863 @@ +// Copyright 2023 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 stmtsummary + +import ( + "bufio" + "context" + "encoding/json" + "io" + "math" + "os" + "path/filepath" + "strings" + "sync" + "time" + + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/parser/auth" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/set" + "go.uber.org/zap" + "golang.org/x/exp/slices" +) + +const ( + logFileTimeFormat = "2006-01-02T15-04-05.000" // depends on lumberjack.go#backupTimeFormat + maxLineSize = 1073741824 + + batchScanSize = 64 +) + +// StmtTimeRange is the time range type used in the stmtsummary package. +// [Begin, End) +type StmtTimeRange struct { + Begin int64 + End int64 +} + +// MemReader is used to read the current window's data maintained in memory by StmtSummary. +type MemReader struct { + s *StmtSummary + columns []*model.ColumnInfo + instanceAddr string + timeLocation *time.Location + + columnFactories []columnFactory + checker *stmtChecker +} + +// NewMemReader creates a MemReader from StmtSummary and other necessary parameters. +func NewMemReader(s *StmtSummary, + columns []*model.ColumnInfo, + instanceAddr string, + timeLocation *time.Location, + user *auth.UserIdentity, + hasProcessPriv bool, + digests set.StringSet, + timeRanges []*StmtTimeRange) *MemReader { + return &MemReader{ + s: s, + columns: columns, + instanceAddr: instanceAddr, + timeLocation: timeLocation, + columnFactories: makeColumnFactories(columns), + checker: &stmtChecker{ + user: user, + hasProcessPriv: hasProcessPriv, + digests: digests, + timeRanges: timeRanges, + }, + } +} + +// Rows returns rows converted from the current window's data maintained +// in memory by StmtSummary. All evicted data will be aggregated into a +// single row appended at the end. +func (r *MemReader) Rows() [][]types.Datum { + if r.s == nil { + return nil + } + end := timeNow().Unix() + r.s.windowLock.Lock() + w := r.s.window + if !r.checker.isTimeValid(w.begin.Unix(), end) { + r.s.windowLock.Unlock() + return nil + } + values := w.lru.Values() + evicted := w.evicted + r.s.windowLock.Unlock() + rows := make([][]types.Datum, 0, len(values)+1) + for _, v := range values { + record := v.(*lockedStmtRecord) + if !r.checker.isDigestValid(record.Digest) { + continue + } + func() { + record.Lock() + defer record.Unlock() + if !r.checker.hasPrivilege(record.AuthUsers) { + return + } + record.Begin = w.begin.Unix() + record.End = end + row := make([]types.Datum, len(r.columnFactories)) + for i, factory := range r.columnFactories { + row[i] = types.NewDatum(factory(r, record.StmtRecord)) + } + rows = append(rows, row) + }() + } + if r.checker.digests == nil { + func() { + evicted.Lock() + defer evicted.Unlock() + if evicted.other.ExecCount == 0 { + return + } + if !r.checker.hasPrivilege(evicted.other.AuthUsers) { + return + } + evicted.other.Begin = w.begin.Unix() + evicted.other.End = end + row := make([]types.Datum, len(r.columnFactories)) + for i, factory := range r.columnFactories { + row[i] = types.NewDatum(factory(r, evicted.other)) + } + rows = append(rows, row) + }() + } + return rows +} + +// getInstanceAddr implements columnInfo. +func (r *MemReader) getInstanceAddr() string { + return r.instanceAddr +} + +// getInstanceAddr implements columnInfo. +func (r *MemReader) getTimeLocation() *time.Location { + return r.timeLocation +} + +// HistoryReader is used to read data that has been persisted to files. +type HistoryReader struct { + ctx context.Context + cancel context.CancelFunc + wg sync.WaitGroup + + instanceAddr string + timeLocation *time.Location + + columnFactories []columnFactory + checker *stmtChecker + files *stmtFiles + + concurrent int + rowsCh <-chan [][]types.Datum + errCh <-chan error +} + +// NewHistoryReader creates a HisroryReader from StmtSummary and other +// necessary parameters. If timeRanges is present, only files within +// the time range will be read. +func NewHistoryReader( + ctx context.Context, + columns []*model.ColumnInfo, + instanceAddr string, + timeLocation *time.Location, + user *auth.UserIdentity, + hasProcessPriv bool, + digests set.StringSet, + timeRanges []*StmtTimeRange, + concurrent int, +) (*HistoryReader, error) { + files, err := newStmtFiles(ctx, timeRanges) + if err != nil { + return nil, err + } + + if concurrent < 2 { + concurrent = 2 + } + rowsCh := make(chan [][]types.Datum, concurrent) + errCh := make(chan error, concurrent) + + ctx, cancel := context.WithCancel(ctx) + r := &HistoryReader{ + ctx: ctx, + cancel: cancel, + + instanceAddr: instanceAddr, + timeLocation: timeLocation, + columnFactories: makeColumnFactories(columns), + checker: &stmtChecker{ + user: user, + hasProcessPriv: hasProcessPriv, + digests: digests, + timeRanges: timeRanges, + }, + files: files, + concurrent: concurrent, + rowsCh: rowsCh, + errCh: errCh, + } + + r.wg.Add(1) + go func() { + defer r.wg.Done() + r.scheduleTasks(rowsCh, errCh) + }() + return r, nil +} + +// Rows returns rows converted from records in files. Reading and parsing +// works asynchronously. If (nil, nil) is returned, it means that the +// reading has been completed. +func (r *HistoryReader) Rows() ([][]types.Datum, error) { + ctx := r.ctx + for { + select { + case err := <-r.errCh: + return nil, err + case rows, ok := <-r.rowsCh: + if !ok { + select { + case err := <-r.errCh: + return nil, err + default: + return nil, nil + } + } + if len(rows) == 0 { + continue + } + return rows, nil + case <-ctx.Done(): + return nil, ctx.Err() + } + } +} + +// Close ends reading and closes all files. +func (r *HistoryReader) Close() error { + r.files.close() + if r.cancel != nil { + r.cancel() + } + r.wg.Wait() + return nil +} + +// 4 roles to handle the read task in pipeline: +// +// ## Pipeline +// . +--------------+ +---------------+ +// == files => | scan workers | == lines => | parse workers | == rows => +// . filesCh +--------------+ linesCh +---------------+ rowsCh +// +// ## Roles +// +--------------+--------------+------------------------------------+ +// | ROLE | COUNT | DESCRIPTION | +// +--------------+--------------+------------------------------------+ +// | Scan Worker | concurrent/2 | Scan files (I/O) first, then help | +// | | | parse workers to parse lines (CPU) | +// +--------------+--------------+------------------------------------+ +// | Parse Worker | concurrent- | Parse lines (CPU) to rows | +// | | concurrent/2 | | +// +--------------+--------------+------------------------------------+ +// | Manager | 1 | Drive the whole process and notify | +// | | | scan workers to switch role | +// +--------------+--------------+------------------------------------+ +// | Monitor | 1 | Cover failures and notify workers | +// | | | to exit | +// +--------------+--------------+------------------------------------+ +func (r *HistoryReader) scheduleTasks( + rowsCh chan<- [][]types.Datum, + errCh chan<- error, +) { + if r.files == nil || len(r.files.files) == 0 { + close(rowsCh) + return + } + + ctx, cancel := context.WithCancel(r.ctx) + defer cancel() + + scanWorker := &stmtScanWorker{ + ctx: ctx, + batchSize: batchScanSize, + checker: r.checker, + } + parseWorker := &stmtParseWorker{ + ctx: ctx, + instanceAddr: r.instanceAddr, + timeLocation: r.timeLocation, + checker: r.checker, + columnFactories: r.columnFactories, + } + + concurrent := r.concurrent + filesCh := make(chan *os.File, concurrent) + linesCh := make(chan [][]byte, concurrent) + innerErrCh := make(chan error, concurrent) + + var scanWg sync.WaitGroup + scanWg.Add(concurrent / 2) + scanDone := scanWg.Done + waitScanAllDone := scanWg.Wait + + var parseWg sync.WaitGroup + parseWg.Add(concurrent) // finally all workers will become parse workers + parseDone := parseWg.Done + waitParseAllDone := parseWg.Wait + + // Half of workers are scheduled to scan files and then parse lines. + for i := 0; i < concurrent/2; i++ { + go func() { + scanWorker.run(filesCh, linesCh, innerErrCh) + scanDone() + + parseWorker.run(linesCh, rowsCh, innerErrCh) + parseDone() + }() + } + + // Remaining workers are scheduled to parse lines. + for i := concurrent / 2; i < concurrent; i++ { + go func() { + parseWorker.run(linesCh, rowsCh, innerErrCh) + parseDone() + }() + } + + // Manager drives the whole process + var mgrWg sync.WaitGroup + mgrWg.Add(1) + go func() { + defer mgrWg.Done() + + func() { + for _, file := range r.files.files { + select { + case filesCh <- file.file: + case <-ctx.Done(): + return + } + } + }() + // No scan tasks to be generating. Notify idle scan + // workers to become parse workers + close(filesCh) + + // No parse tasks to be generating once all scan + // tasks are done. Notify idle parse workers to exit + waitScanAllDone() + close(linesCh) + + // No rows to be generating once all parse tasks + // are done. Notify monitor to close rowsCh + waitParseAllDone() + cancel() + }() + + // Monitor to cover failures and notify workers to exit + select { + case err := <-innerErrCh: + select { + case errCh <- err: + default: + } + cancel() // notify workers to exit + case <-ctx.Done(): + // notified by manager or parent ctx is canceled + } + close(rowsCh) // task done + mgrWg.Wait() +} + +type stmtChecker struct { + user *auth.UserIdentity + hasProcessPriv bool // If the user has the 'PROCESS' privilege, he can read all statements. + digests set.StringSet + timeRanges []*StmtTimeRange +} + +func (c *stmtChecker) hasPrivilege(authUsers map[string]struct{}) bool { + authed := true + if c.user != nil && !c.hasProcessPriv { + if len(authUsers) == 0 { + return false + } + _, authed = authUsers[c.user.Username] + } + return authed +} + +func (c *stmtChecker) isDigestValid(digest string) bool { + if c.digests == nil { + return true + } + return c.digests.Exist(digest) +} + +func (c *stmtChecker) isTimeValid(begin, end int64) bool { + if len(c.timeRanges) == 0 { + return true + } + for _, tr := range c.timeRanges { + if timeRangeOverlap(begin, end, tr.Begin, tr.End) { + return true + } + } + return false +} + +func (c *stmtChecker) needStop(curBegin int64) bool { + if len(c.timeRanges) == 0 { + return false + } + stop := true + for _, tr := range c.timeRanges { + if tr.End == 0 || tr.End >= curBegin { + stop = false + } + } + return stop +} + +type stmtTinyRecord struct { + Begin int64 `json:"begin"` + End int64 `json:"end"` +} + +type stmtFile struct { + file *os.File + begin int64 + end int64 +} + +func openStmtFile(path string) (*stmtFile, error) { + file, err := os.OpenFile(path, os.O_RDONLY, os.ModePerm) + if err != nil { + return nil, err + } + begin, err := parseBeginTsAndReseek(file) + if err != nil { + if err != io.EOF { + _ = file.Close() + return nil, err + } + } + end, err := parseEndTs(file) + if err != nil { + _ = file.Close() + return nil, err + } + + return &stmtFile{ + file: file, + begin: begin, + end: end, + }, nil +} + +func parseBeginTsAndReseek(file *os.File) (int64, error) { + if _, err := file.Seek(0, io.SeekStart); err != nil { + return 0, err + } + firstLine, err := readLine(bufio.NewReader(file)) + if err != nil { + return 0, err + } + if _, err := file.Seek(0, io.SeekStart); err != nil { + return 0, err + } + if len(firstLine) == 0 { + return 0, nil + } + var record stmtTinyRecord + if err := json.Unmarshal(firstLine, &record); err != nil { + return 0, err + } + return record.Begin, nil +} + +func parseEndTs(file *os.File) (int64, error) { + // tidb-statements.log + filename := config.GetGlobalConfig().Instance.StmtSummaryFilename + // .log + ext := filepath.Ext(filename) + // tidb-statements + prefix := filename[:len(filename)-len(ext)] + + // tidb-statements-2022-12-27T16-21-20.245.log + filename = filepath.Base(file.Name()) + // .log + ext = filepath.Ext(file.Name()) + // tidb-statements-2022-12-27T16-21-20.245 + filename = filename[:len(filename)-len(ext)] + + if strings.HasPrefix(filename, prefix+"-") { + // 2022-12-27T16-21-20.245 + timeStr := strings.TrimPrefix(filename, prefix+"-") + end, err := time.ParseInLocation(logFileTimeFormat, timeStr, time.Local) + if err != nil { + return 0, err + } + return end.Unix(), nil + } + return 0, nil +} + +func (f *stmtFile) close() error { + if f.file != nil { + return f.file.Close() + } + return nil +} + +type stmtFiles struct { + files []*stmtFile +} + +func newStmtFiles(ctx context.Context, timeRanges []*StmtTimeRange) (*stmtFiles, error) { + filename := config.GetGlobalConfig().Instance.StmtSummaryFilename + ext := filepath.Ext(filename) + prefix := filename[:len(filename)-len(ext)] + var files []*stmtFile + walkFn := func(path string, info os.DirEntry) error { + if info.IsDir() { + return nil + } + if !strings.HasPrefix(path, prefix) { + return nil + } + if isCtxDone(ctx) { + return ctx.Err() + } + file, err := openStmtFile(path) + if err != nil { + logutil.BgLogger().Warn("failed to open or parse statements file", zap.Error(err), zap.String("path", path)) + return nil + } + if len(timeRanges) == 0 { + files = append(files, file) + return nil + } + for _, tr := range timeRanges { + if timeRangeOverlap(file.begin, file.end, tr.Begin, tr.End) { + files = append(files, file) + return nil + } + } + return nil + } + + dir := filepath.Dir(filename) + entries, err := os.ReadDir(dir) + if err != nil { + return nil, err + } + for _, entry := range entries { + if err := walkFn(filepath.Join(dir, entry.Name()), entry); err != nil { + for _, f := range files { + _ = f.close() + } + return nil, err + } + } + slices.SortFunc(files, func(i, j *stmtFile) bool { + return i.begin < j.begin + }) + return &stmtFiles{files: files}, nil +} + +func (f *stmtFiles) close() { + for _, f := range f.files { + _ = f.close() + } +} + +type stmtScanWorker struct { + ctx context.Context + batchSize int + checker *stmtChecker +} + +func (w *stmtScanWorker) run( + fileCh <-chan *os.File, + linesCh chan<- [][]byte, + errCh chan<- error, +) { + for { + select { + case file, ok := <-fileCh: + if !ok { + return + } + w.handleFile(file, linesCh, errCh) + case <-w.ctx.Done(): + return + } + } +} + +func (w *stmtScanWorker) handleFile( + file *os.File, + linesCh chan<- [][]byte, + errCh chan<- error, +) { + if file == nil { + return + } + + reader := bufio.NewReader(file) + for { + if isCtxDone(w.ctx) { + return + } + + lines, err := w.readlines(reader) + if err == io.EOF { + return + } + if err != nil { + w.putErr(err, errCh) + return + } + + w.putLines(lines, linesCh) + } +} + +func (w *stmtScanWorker) putErr( + err error, + errCh chan<- error, +) { + select { + case errCh <- err: + case <-w.ctx.Done(): + } +} + +func (w *stmtScanWorker) putLines( + lines [][]byte, + linesCh chan<- [][]byte, +) { + select { + case linesCh <- lines: + case <-w.ctx.Done(): + } +} + +func (w *stmtScanWorker) readlines(reader *bufio.Reader) ([][]byte, error) { + firstLine, err := readLine(reader) + if err != nil { + return nil, err + } + + record, err := w.parse(firstLine) + if err != nil { + return nil, err + } + + if w.needStop(record) { + // done because remaining lines in file + // are not in the time range + return nil, io.EOF + } + + lines := make([][]byte, 0, w.batchSize) + lines = append(lines, firstLine) + + newLines, err := readLines(reader, w.batchSize-1) + if err == io.EOF { + return lines, nil + } + if err != nil { + return nil, err + } + + lines = append(lines, newLines...) + return lines, nil +} + +func (*stmtScanWorker) parse(raw []byte) (*stmtTinyRecord, error) { + var record stmtTinyRecord + if err := json.Unmarshal(raw, &record); err != nil { + return nil, err + } + return &record, nil +} + +func (w *stmtScanWorker) needStop(record *stmtTinyRecord) bool { + return w.checker.needStop(record.Begin) +} + +type stmtParseWorker struct { + ctx context.Context + instanceAddr string + timeLocation *time.Location + checker *stmtChecker + columnFactories []columnFactory +} + +func (w *stmtParseWorker) run( + linesCh <-chan [][]byte, + rowsCh chan<- [][]types.Datum, + errCh chan<- error, +) { + for { + select { + case lines, ok := <-linesCh: + if !ok { + return + } + w.handleLines(lines, rowsCh, errCh) + case <-w.ctx.Done(): + return + } + } +} + +func (w *stmtParseWorker) handleLines( + lines [][]byte, + rowsCh chan<- [][]types.Datum, + errCh chan<- error, +) { + if len(lines) == 0 { + return + } + + rows := make([][]types.Datum, 0, len(lines)) + for _, line := range lines { + record, err := w.parse(line) + if err != nil { + w.putErr(err, errCh) + return + } + + if w.needStop(record) { + break + } + + if !w.matchConds(record) { + continue + } + + row := w.buildRow(record) + rows = append(rows, row) + } + + if len(rows) > 0 { + w.putRows(rows, rowsCh) + } +} + +func (w *stmtParseWorker) putErr( + err error, + errCh chan<- error, +) { + select { + case errCh <- err: + case <-w.ctx.Done(): + } +} + +func (w *stmtParseWorker) putRows( + rows [][]types.Datum, + rowsCh chan<- [][]types.Datum, +) { + select { + case rowsCh <- rows: + case <-w.ctx.Done(): + } +} + +func (*stmtParseWorker) parse(raw []byte) (*StmtRecord, error) { + var record StmtRecord + if err := json.Unmarshal(raw, &record); err != nil { + return nil, err + } + return &record, nil +} + +func (w *stmtParseWorker) needStop(record *StmtRecord) bool { + return w.checker.needStop(record.Begin) +} + +func (w *stmtParseWorker) matchConds(record *StmtRecord) bool { + if !w.checker.isTimeValid(record.Begin, record.End) { + return false + } + if !w.checker.isDigestValid(record.Digest) { + return false + } + if !w.checker.hasPrivilege(record.AuthUsers) { + return false + } + return true +} + +func (w *stmtParseWorker) buildRow(record *StmtRecord) []types.Datum { + row := make([]types.Datum, len(w.columnFactories)) + for n, factory := range w.columnFactories { + row[n] = types.NewDatum(factory(w, record)) + } + return row +} + +// getInstanceAddr implements columnInfo. +func (w *stmtParseWorker) getInstanceAddr() string { + return w.instanceAddr +} + +// getInstanceAddr implements columnInfo. +func (w *stmtParseWorker) getTimeLocation() *time.Location { + return w.timeLocation +} + +func isCtxDone(ctx context.Context) bool { + select { + case <-ctx.Done(): + return true + default: + return false + } +} + +func readLine(reader *bufio.Reader) ([]byte, error) { + return util.ReadLine(reader, maxLineSize) +} + +func readLines(reader *bufio.Reader, count int) ([][]byte, error) { + return util.ReadLines(reader, count, maxLineSize) +} + +func timeRangeOverlap(aBegin, aEnd, bBegin, bEnd int64) bool { + if aEnd == 0 || aEnd < aBegin { + aEnd = math.MaxInt64 + } + if bEnd == 0 || bEnd < bBegin { + bEnd = math.MaxInt64 + } + // https://stackoverflow.com/questions/3269434/whats-the-most-efficient-way-to-test-if-two-ranges-overlap + return aBegin <= bEnd && aEnd >= bBegin +} diff --git a/util/stmtsummary/v2/reader_test.go b/util/stmtsummary/v2/reader_test.go new file mode 100644 index 0000000000000..626560a318910 --- /dev/null +++ b/util/stmtsummary/v2/reader_test.go @@ -0,0 +1,393 @@ +// Copyright 2023 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 stmtsummary + +import ( + "bufio" + "context" + "os" + "testing" + "time" + + "github.com/pingcap/tidb/parser/auth" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/set" + "github.com/stretchr/testify/require" +) + +func TestTimeRangeOverlap(t *testing.T) { + require.False(t, timeRangeOverlap(1, 2, 3, 4)) + require.False(t, timeRangeOverlap(3, 4, 1, 2)) + require.True(t, timeRangeOverlap(1, 2, 2, 3)) + require.True(t, timeRangeOverlap(1, 3, 2, 4)) + require.True(t, timeRangeOverlap(2, 4, 1, 3)) + require.True(t, timeRangeOverlap(1, 0, 3, 4)) + require.True(t, timeRangeOverlap(1, 0, 2, 0)) +} + +func TestStmtFile(t *testing.T) { + filename := "tidb-statements-2022-12-27T16-21-20.245.log" + + file, err := os.Create(filename) + require.NoError(t, err) + defer func() { + require.NoError(t, os.Remove(filename)) + }() + _, err = file.WriteString("{\"begin\":1,\"end\":2}\n") + require.NoError(t, err) + _, err = file.WriteString("{\"begin\":3,\"end\":4}\n") + require.NoError(t, err) + require.NoError(t, file.Close()) + + f, err := openStmtFile(filename) + require.NoError(t, err) + defer func() { + require.NoError(t, f.file.Close()) + }() + require.Equal(t, int64(1), f.begin) + require.Equal(t, int64(1672129280), f.end) // 2022-12-27T16-21-20.245 == 1672129280 + + // Check if seek 0. + firstLine, err := util.ReadLine(bufio.NewReader(f.file), maxLineSize) + require.NoError(t, err) + require.Equal(t, `{"begin":1,"end":2}`, string(firstLine)) +} + +func TestStmtFiles(t *testing.T) { + filename1 := "tidb-statements-2022-12-27T16-21-20.245.log" + filename2 := "tidb-statements.log" + + file, err := os.Create(filename1) + require.NoError(t, err) + defer func() { + require.NoError(t, os.Remove(filename1)) + }() + _, err = file.WriteString("{\"begin\":1672128520,\"end\":1672128530}\n") + require.NoError(t, err) + _, err = file.WriteString("{\"begin\":1672129270,\"end\":1672129280}\n") + require.NoError(t, err) + require.NoError(t, file.Close()) + + file, err = os.Create(filename2) + require.NoError(t, err) + defer func() { + require.NoError(t, os.Remove(filename2)) + }() + _, err = file.WriteString("{\"begin\":1672129270,\"end\":1672129280}\n") + require.NoError(t, err) + _, err = file.WriteString("{\"begin\":1672129380,\"end\":1672129390}\n") + require.NoError(t, err) + require.NoError(t, file.Close()) + + func() { + files, err := newStmtFiles(context.Background(), nil) + require.NoError(t, err) + defer files.close() + require.Len(t, files.files, 2) + require.Equal(t, filename1, files.files[0].file.Name()) + require.Equal(t, filename2, files.files[1].file.Name()) + }() + + func() { + files, err := newStmtFiles(context.Background(), []*StmtTimeRange{ + {Begin: 1672129270, End: 1672129271}, + }) + require.NoError(t, err) + defer files.close() + require.Len(t, files.files, 2) + require.Equal(t, filename1, files.files[0].file.Name()) + require.Equal(t, filename2, files.files[1].file.Name()) + }() + + func() { + files, err := newStmtFiles(context.Background(), []*StmtTimeRange{ + {Begin: 0, End: 1672129270}, + }) + require.NoError(t, err) + defer files.close() + require.Len(t, files.files, 2) + require.Equal(t, filename1, files.files[0].file.Name()) + require.Equal(t, filename2, files.files[1].file.Name()) + }() + + func() { + files, err := newStmtFiles(context.Background(), []*StmtTimeRange{ + {Begin: 0, End: 1672129269}, + }) + require.NoError(t, err) + defer files.close() + require.Len(t, files.files, 1) + require.Equal(t, filename1, files.files[0].file.Name()) + }() + + func() { + files, err := newStmtFiles(context.Background(), []*StmtTimeRange{ + {Begin: 0, End: 1}, + }) + require.NoError(t, err) + defer files.close() + require.Empty(t, files.files) + }() + + func() { + files, err := newStmtFiles(context.Background(), []*StmtTimeRange{ + {Begin: 1672129281, End: 0}, + }) + require.NoError(t, err) + defer files.close() + require.Len(t, files.files, 1) + require.Equal(t, filename2, files.files[0].file.Name()) + }() +} + +func TestStmtChecker(t *testing.T) { + checker := &stmtChecker{} + require.True(t, checker.hasPrivilege(nil)) + + checker = &stmtChecker{ + user: &auth.UserIdentity{Username: "user1"}, + } + require.False(t, checker.hasPrivilege(nil)) + require.False(t, checker.hasPrivilege(map[string]struct{}{"user2": {}})) + require.True(t, checker.hasPrivilege(map[string]struct{}{"user1": {}, "user2": {}})) + + checker = &stmtChecker{} + require.True(t, checker.isDigestValid("digest1")) + + checker = &stmtChecker{ + digests: set.NewStringSet("digest2"), + } + require.False(t, checker.isDigestValid("digest1")) + require.True(t, checker.isDigestValid("digest2")) + + checker = &stmtChecker{ + digests: set.NewStringSet("digest1", "digest2"), + } + require.True(t, checker.isDigestValid("digest1")) + require.True(t, checker.isDigestValid("digest2")) + + checker = &stmtChecker{} + require.True(t, checker.isTimeValid(1, 2)) + require.False(t, checker.needStop(2)) + require.False(t, checker.needStop(3)) + + checker = &stmtChecker{ + timeRanges: []*StmtTimeRange{ + {Begin: 1, End: 2}, + }, + } + require.True(t, checker.isTimeValid(1, 2)) + require.False(t, checker.isTimeValid(3, 4)) + require.False(t, checker.needStop(2)) + require.True(t, checker.needStop(3)) +} + +func TestMemReader(t *testing.T) { + timeLocation, err := time.LoadLocation("Asia/Shanghai") + require.NoError(t, err) + columns := []*model.ColumnInfo{ + {Name: model.NewCIStr(DigestStr)}, + {Name: model.NewCIStr(ExecCountStr)}, + } + + ss := NewStmtSummary4Test(3) + defer ss.Close() + + ss.Add(GenerateStmtExecInfo4Test("digest1")) + ss.Add(GenerateStmtExecInfo4Test("digest1")) + ss.Add(GenerateStmtExecInfo4Test("digest2")) + ss.Add(GenerateStmtExecInfo4Test("digest2")) + ss.Add(GenerateStmtExecInfo4Test("digest3")) + ss.Add(GenerateStmtExecInfo4Test("digest3")) + ss.Add(GenerateStmtExecInfo4Test("digest4")) + ss.Add(GenerateStmtExecInfo4Test("digest4")) + ss.Add(GenerateStmtExecInfo4Test("digest5")) + ss.Add(GenerateStmtExecInfo4Test("digest5")) + reader := NewMemReader(ss, columns, "", timeLocation, nil, false, nil, nil) + rows := reader.Rows() + require.Len(t, rows, 4) // 3 rows + 1 other + require.Equal(t, len(reader.columnFactories), len(rows[0])) + evicted := ss.Evicted() + require.Len(t, evicted, 3) // begin, end, count +} + +func TestHistoryReader(t *testing.T) { + filename1 := "tidb-statements-2022-12-27T16-21-20.245.log" + filename2 := "tidb-statements.log" + + file, err := os.Create(filename1) + require.NoError(t, err) + defer func() { + require.NoError(t, os.Remove(filename1)) + }() + _, err = file.WriteString("{\"begin\":1672128520,\"end\":1672128530,\"digest\":\"digest1\",\"exec_count\":10}\n") + require.NoError(t, err) + _, err = file.WriteString("{\"begin\":1672129270,\"end\":1672129280,\"digest\":\"digest2\",\"exec_count\":20}\n") + require.NoError(t, err) + require.NoError(t, file.Close()) + + file, err = os.Create(filename2) + require.NoError(t, err) + defer func() { + require.NoError(t, os.Remove(filename2)) + }() + _, err = file.WriteString("{\"begin\":1672129270,\"end\":1672129280,\"digest\":\"digest2\",\"exec_count\":30}\n") + require.NoError(t, err) + _, err = file.WriteString("{\"begin\":1672129380,\"end\":1672129390,\"digest\":\"digest3\",\"exec_count\":40}\n") + require.NoError(t, err) + require.NoError(t, file.Close()) + + timeLocation, err := time.LoadLocation("Asia/Shanghai") + require.NoError(t, err) + columns := []*model.ColumnInfo{ + {Name: model.NewCIStr(DigestStr)}, + {Name: model.NewCIStr(ExecCountStr)}, + } + + func() { + reader, err := NewHistoryReader(context.Background(), columns, "", timeLocation, nil, false, nil, nil, 2) + require.NoError(t, err) + defer reader.Close() + rows := readAllRows(t, reader) + require.Len(t, rows, 4) + for _, row := range rows { + require.Equal(t, len(columns), len(row)) + } + }() + + func() { + reader, err := NewHistoryReader(context.Background(), columns, "", timeLocation, nil, false, set.NewStringSet("digest2"), nil, 2) + require.NoError(t, err) + defer reader.Close() + rows := readAllRows(t, reader) + require.Len(t, rows, 2) + for _, row := range rows { + require.Equal(t, len(columns), len(row)) + } + }() + + func() { + reader, err := NewHistoryReader(context.Background(), columns, "", timeLocation, nil, false, nil, []*StmtTimeRange{ + {Begin: 0, End: 1672128520 - 1}, + }, 2) + require.NoError(t, err) + defer reader.Close() + rows := readAllRows(t, reader) + require.Len(t, rows, 0) + }() + + func() { + reader, err := NewHistoryReader(context.Background(), columns, "", timeLocation, nil, false, nil, []*StmtTimeRange{ + {Begin: 0, End: 1672129270 - 1}, + }, 2) + require.NoError(t, err) + defer reader.Close() + rows := readAllRows(t, reader) + require.Len(t, rows, 1) + for _, row := range rows { + require.Equal(t, len(columns), len(row)) + } + }() + + func() { + reader, err := NewHistoryReader(context.Background(), columns, "", timeLocation, nil, false, nil, []*StmtTimeRange{ + {Begin: 0, End: 1672129270}, + }, 2) + require.NoError(t, err) + defer reader.Close() + rows := readAllRows(t, reader) + require.Len(t, rows, 3) + for _, row := range rows { + require.Equal(t, len(columns), len(row)) + } + }() + + func() { + reader, err := NewHistoryReader(context.Background(), columns, "", timeLocation, nil, false, nil, []*StmtTimeRange{ + {Begin: 0, End: 1672129380}, + }, 2) + require.NoError(t, err) + defer reader.Close() + rows := readAllRows(t, reader) + require.Len(t, rows, 4) + for _, row := range rows { + require.Equal(t, len(columns), len(row)) + } + }() + + func() { + reader, err := NewHistoryReader(context.Background(), columns, "", timeLocation, nil, false, nil, []*StmtTimeRange{ + {Begin: 1672129270, End: 1672129380}, + }, 2) + require.NoError(t, err) + defer reader.Close() + rows := readAllRows(t, reader) + require.Len(t, rows, 3) + for _, row := range rows { + require.Equal(t, len(columns), len(row)) + } + }() + + func() { + reader, err := NewHistoryReader(context.Background(), columns, "", timeLocation, nil, false, nil, []*StmtTimeRange{ + {Begin: 1672129390, End: 0}, + }, 2) + require.NoError(t, err) + defer reader.Close() + rows := readAllRows(t, reader) + require.Len(t, rows, 1) + for _, row := range rows { + require.Equal(t, len(columns), len(row)) + } + }() + + func() { + reader, err := NewHistoryReader(context.Background(), columns, "", timeLocation, nil, false, nil, []*StmtTimeRange{ + {Begin: 1672129391, End: 0}, + }, 2) + require.NoError(t, err) + defer reader.Close() + rows := readAllRows(t, reader) + require.Len(t, rows, 0) + }() + + func() { + reader, err := NewHistoryReader(context.Background(), columns, "", timeLocation, nil, false, nil, []*StmtTimeRange{ + {Begin: 0, End: 0}, + }, 2) + require.NoError(t, err) + defer reader.Close() + rows := readAllRows(t, reader) + require.Len(t, rows, 4) + for _, row := range rows { + require.Equal(t, len(columns), len(row)) + } + }() +} + +func readAllRows(t *testing.T, reader *HistoryReader) [][]types.Datum { + var results [][]types.Datum + for { + rows, err := reader.Rows() + require.NoError(t, err) + if rows == nil { + break + } + results = append(results, rows...) + } + return results +} diff --git a/util/stmtsummary/v2/record.go b/util/stmtsummary/v2/record.go new file mode 100644 index 0000000000000..2bc92a8fd3217 --- /dev/null +++ b/util/stmtsummary/v2/record.go @@ -0,0 +1,661 @@ +// Copyright 2023 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 stmtsummary + +import ( + "bytes" + "fmt" + "math" + "strings" + "sync" + "sync/atomic" + "time" + + "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/util/execdetails" + "github.com/pingcap/tidb/util/plancodec" + "github.com/pingcap/tidb/util/stmtsummary" + "github.com/tikv/client-go/v2/util" +) + +// MaxEncodedPlanSizeInBytes is the upper limit of the size of the plan and the binary plan in the stmt summary. +var MaxEncodedPlanSizeInBytes = 1024 * 1024 + +// StmtRecord represents a statement statistics record. +// StmtRecord is addable and mergable. +type StmtRecord struct { + // Each record is summarized between [Begin, End). + Begin int64 `json:"begin"` + End int64 `json:"end"` + // Immutable + SchemaName string `json:"schema_name"` + Digest string `json:"digest"` + PlanDigest string `json:"plan_digest"` + StmtType string `json:"stmt_type"` + NormalizedSQL string `json:"normalized_sql"` + TableNames string `json:"table_names"` + IsInternal bool `json:"is_internal"` + // Basic + SampleSQL string `json:"sample_sql"` + Charset string `json:"charset"` + Collation string `json:"collation"` + PrevSQL string `json:"prev_sql"` + SamplePlan string `json:"sample_plan"` + SampleBinaryPlan string `json:"sample_binary_plan"` + PlanHint string `json:"plan_hint"` + IndexNames []string `json:"index_names"` + ExecCount int64 `json:"exec_count"` + SumErrors int `json:"sum_errors"` + SumWarnings int `json:"sum_warnings"` + // Latency + SumLatency time.Duration `json:"sum_latency"` + MaxLatency time.Duration `json:"max_latency"` + MinLatency time.Duration `json:"min_latency"` + SumParseLatency time.Duration `json:"sum_parse_latency"` + MaxParseLatency time.Duration `json:"max_parse_latency"` + SumCompileLatency time.Duration `json:"sum_compile_latency"` + MaxCompileLatency time.Duration `json:"max_compile_latency"` + // Coprocessor + SumNumCopTasks int64 `json:"sum_num_cop_tasks"` + MaxCopProcessTime time.Duration `json:"max_cop_process_time"` + MaxCopProcessAddress string `json:"max_cop_process_address"` + MaxCopWaitTime time.Duration `json:"max_cop_wait_time"` + MaxCopWaitAddress string `json:"max_cop_wait_address"` + // TiKV + SumProcessTime time.Duration `json:"sum_process_time"` + MaxProcessTime time.Duration `json:"max_process_time"` + SumWaitTime time.Duration `json:"sum_wait_time"` + MaxWaitTime time.Duration `json:"max_wait_time"` + SumBackoffTime time.Duration `json:"sum_backoff_time"` + MaxBackoffTime time.Duration `json:"max_backoff_time"` + SumTotalKeys int64 `json:"sum_total_keys"` + MaxTotalKeys int64 `json:"max_total_keys"` + SumProcessedKeys int64 `json:"sum_processed_keys"` + MaxProcessedKeys int64 `json:"max_processed_keys"` + SumRocksdbDeleteSkippedCount uint64 `json:"sum_rocksdb_delete_skipped_count"` + MaxRocksdbDeleteSkippedCount uint64 `json:"max_rocksdb_delete_skipped_count"` + SumRocksdbKeySkippedCount uint64 `json:"sum_rocksdb_key_skipped_count"` + MaxRocksdbKeySkippedCount uint64 `json:"max_rocksdb_key_skipped_count"` + SumRocksdbBlockCacheHitCount uint64 `json:"sum_rocksdb_block_cache_hit_count"` + MaxRocksdbBlockCacheHitCount uint64 `json:"max_rocksdb_block_cache_hit_count"` + SumRocksdbBlockReadCount uint64 `json:"sum_rocksdb_block_read_count"` + MaxRocksdbBlockReadCount uint64 `json:"max_rocksdb_block_read_count"` + SumRocksdbBlockReadByte uint64 `json:"sum_rocksdb_block_read_byte"` + MaxRocksdbBlockReadByte uint64 `json:"max_rocksdb_block_read_byte"` + // Txn + CommitCount int64 `json:"commit_count"` + SumGetCommitTsTime time.Duration `json:"sum_get_commit_ts_time"` + MaxGetCommitTsTime time.Duration `json:"max_get_commit_ts_time"` + SumPrewriteTime time.Duration `json:"sum_prewrite_time"` + MaxPrewriteTime time.Duration `json:"max_prewrite_time"` + SumCommitTime time.Duration `json:"sum_commit_time"` + MaxCommitTime time.Duration `json:"max_commit_time"` + SumLocalLatchTime time.Duration `json:"sum_local_latch_time"` + MaxLocalLatchTime time.Duration `json:"max_local_latch_time"` + SumCommitBackoffTime int64 `json:"sum_commit_backoff_time"` + MaxCommitBackoffTime int64 `json:"max_commit_backoff_time"` + SumResolveLockTime int64 `json:"sum_resolve_lock_time"` + MaxResolveLockTime int64 `json:"max_resolve_lock_time"` + SumWriteKeys int64 `json:"sum_write_keys"` + MaxWriteKeys int `json:"max_write_keys"` + SumWriteSize int64 `json:"sum_write_size"` + MaxWriteSize int `json:"max_write_size"` + SumPrewriteRegionNum int64 `json:"sum_prewrite_region_num"` + MaxPrewriteRegionNum int32 `json:"max_prewrite_region_num"` + SumTxnRetry int64 `json:"sum_txn_retry"` + MaxTxnRetry int `json:"max_txn_retry"` + SumBackoffTimes int64 `json:"sum_backoff_times"` + BackoffTypes map[string]int `json:"backoff_types"` + AuthUsers map[string]struct{} `json:"auth_users"` + // Other + SumMem int64 `json:"sum_mem"` + MaxMem int64 `json:"max_mem"` + SumDisk int64 `json:"sum_disk"` + MaxDisk int64 `json:"max_disk"` + SumAffectedRows uint64 `json:"sum_affected_rows"` + SumKVTotal time.Duration `json:"sum_kv_total"` + SumPDTotal time.Duration `json:"sum_pd_total"` + SumBackoffTotal time.Duration `json:"sum_backoff_total"` + SumWriteSQLRespTotal time.Duration `json:"sum_write_sql_resp_total"` + SumResultRows int64 `json:"sum_result_rows"` + MaxResultRows int64 `json:"max_result_rows"` + MinResultRows int64 `json:"min_result_rows"` + Prepared bool `json:"prepared"` + // The first time this type of SQL executes. + FirstSeen time.Time `json:"first_seen"` + // The last time this type of SQL executes. + LastSeen time.Time `json:"last_seen"` + // Plan cache + PlanInCache bool `json:"plan_in_cache"` + PlanCacheHits int64 `json:"plan_cache_hits"` + PlanInBinding bool `json:"plan_in_binding"` + // Pessimistic execution retry information. + ExecRetryCount uint `json:"exec_retry_count"` + ExecRetryTime time.Duration `json:"exec_retry_time"` +} + +// NewStmtRecord creates a new StmtRecord from StmtExecInfo. +// StmtExecInfo is only used to initialize the basic information +// of StmtRecord. Next we need to call StmtRecord.Add to add the +// statistics of the StmtExecInfo into the StmtRecord. +func NewStmtRecord(info *stmtsummary.StmtExecInfo) *StmtRecord { + // Use "," to separate table names to support FIND_IN_SET. + var buffer bytes.Buffer + for i, value := range info.StmtCtx.Tables { + // In `create database` statement, DB name is not empty but table name is empty. + if len(value.Table) == 0 { + continue + } + buffer.WriteString(strings.ToLower(value.DB)) + buffer.WriteString(".") + buffer.WriteString(strings.ToLower(value.Table)) + if i < len(info.StmtCtx.Tables)-1 { + buffer.WriteString(",") + } + } + tableNames := buffer.String() + planDigest := info.PlanDigest + if info.PlanDigestGen != nil && len(planDigest) == 0 { + // It comes here only when the plan is 'Point_Get'. + planDigest = info.PlanDigestGen() + } + // sampleSQL / authUsers(sampleUser) / samplePlan / prevSQL / indexNames store the values shown at the first time, + // because it compacts performance to update every time. + samplePlan, planHint := info.PlanGenerator() + if len(samplePlan) > MaxEncodedPlanSizeInBytes { + samplePlan = plancodec.PlanDiscardedEncoded + } + binPlan := "" + if info.BinaryPlanGenerator != nil { + binPlan = info.BinaryPlanGenerator() + if len(binPlan) > MaxEncodedPlanSizeInBytes { + binPlan = plancodec.BinaryPlanDiscardedEncoded + } + } + return &StmtRecord{ + SchemaName: info.SchemaName, + Digest: info.Digest, + PlanDigest: planDigest, + StmtType: info.StmtCtx.StmtType, + NormalizedSQL: info.NormalizedSQL, + TableNames: tableNames, + IsInternal: info.IsInternal, + SampleSQL: formatSQL(info.OriginalSQL), + Charset: info.Charset, + Collation: info.Collation, + // PrevSQL is already truncated to cfg.Log.QueryLogMaxLen. + PrevSQL: info.PrevSQL, + // SamplePlan needs to be decoded so it can't be truncated. + SamplePlan: samplePlan, + SampleBinaryPlan: binPlan, + PlanHint: planHint, + IndexNames: info.StmtCtx.IndexNames, + MinLatency: info.TotalLatency, + BackoffTypes: make(map[string]int), + AuthUsers: make(map[string]struct{}), + MinResultRows: math.MaxInt64, + Prepared: info.Prepared, + FirstSeen: info.StartTime, + LastSeen: info.StartTime, + } +} + +// Add adds the statistics of StmtExecInfo to StmtRecord. +func (r *StmtRecord) Add(info *stmtsummary.StmtExecInfo) { + r.IsInternal = r.IsInternal && info.IsInternal + // Add user to auth users set + if len(info.User) > 0 { + r.AuthUsers[info.User] = struct{}{} + } + r.ExecCount++ + if !info.Succeed { + r.SumErrors++ + } + r.SumWarnings += int(info.StmtCtx.WarningCount()) + // Latency + r.SumLatency += info.TotalLatency + if info.TotalLatency > r.MaxLatency { + r.MaxLatency = info.TotalLatency + } + if info.TotalLatency < r.MinLatency { + r.MinLatency = info.TotalLatency + } + r.SumParseLatency += info.ParseLatency + if info.ParseLatency > r.MaxParseLatency { + r.MaxParseLatency = info.ParseLatency + } + r.SumCompileLatency += info.CompileLatency + if info.CompileLatency > r.MaxCompileLatency { + r.MaxCompileLatency = info.CompileLatency + } + // Coprocessor + numCopTasks := int64(info.CopTasks.NumCopTasks) + r.SumNumCopTasks += numCopTasks + if info.CopTasks.MaxProcessTime > r.MaxCopProcessTime { + r.MaxCopProcessTime = info.CopTasks.MaxProcessTime + r.MaxCopProcessAddress = info.CopTasks.MaxProcessAddress + } + if info.CopTasks.MaxWaitTime > r.MaxCopWaitTime { + r.MaxCopWaitTime = info.CopTasks.MaxWaitTime + r.MaxCopWaitAddress = info.CopTasks.MaxWaitAddress + } + // TiKV + r.SumProcessTime += info.ExecDetail.TimeDetail.ProcessTime + if info.ExecDetail.TimeDetail.ProcessTime > r.MaxProcessTime { + r.MaxProcessTime = info.ExecDetail.TimeDetail.ProcessTime + } + r.SumWaitTime += info.ExecDetail.TimeDetail.WaitTime + if info.ExecDetail.TimeDetail.WaitTime > r.MaxWaitTime { + r.MaxWaitTime = info.ExecDetail.TimeDetail.WaitTime + } + r.SumBackoffTime += info.ExecDetail.BackoffTime + if info.ExecDetail.BackoffTime > r.MaxBackoffTime { + r.MaxBackoffTime = info.ExecDetail.BackoffTime + } + if info.ExecDetail.ScanDetail != nil { + r.SumTotalKeys += info.ExecDetail.ScanDetail.TotalKeys + if info.ExecDetail.ScanDetail.TotalKeys > r.MaxTotalKeys { + r.MaxTotalKeys = info.ExecDetail.ScanDetail.TotalKeys + } + r.SumProcessedKeys += info.ExecDetail.ScanDetail.ProcessedKeys + if info.ExecDetail.ScanDetail.ProcessedKeys > r.MaxProcessedKeys { + r.MaxProcessedKeys = info.ExecDetail.ScanDetail.ProcessedKeys + } + r.SumRocksdbDeleteSkippedCount += info.ExecDetail.ScanDetail.RocksdbDeleteSkippedCount + if info.ExecDetail.ScanDetail.RocksdbDeleteSkippedCount > r.MaxRocksdbDeleteSkippedCount { + r.MaxRocksdbDeleteSkippedCount = info.ExecDetail.ScanDetail.RocksdbDeleteSkippedCount + } + r.SumRocksdbKeySkippedCount += info.ExecDetail.ScanDetail.RocksdbKeySkippedCount + if info.ExecDetail.ScanDetail.RocksdbKeySkippedCount > r.MaxRocksdbKeySkippedCount { + r.MaxRocksdbKeySkippedCount = info.ExecDetail.ScanDetail.RocksdbKeySkippedCount + } + r.SumRocksdbBlockCacheHitCount += info.ExecDetail.ScanDetail.RocksdbBlockCacheHitCount + if info.ExecDetail.ScanDetail.RocksdbBlockCacheHitCount > r.MaxRocksdbBlockCacheHitCount { + r.MaxRocksdbBlockCacheHitCount = info.ExecDetail.ScanDetail.RocksdbBlockCacheHitCount + } + r.SumRocksdbBlockReadCount += info.ExecDetail.ScanDetail.RocksdbBlockReadCount + if info.ExecDetail.ScanDetail.RocksdbBlockReadCount > r.MaxRocksdbBlockReadCount { + r.MaxRocksdbBlockReadCount = info.ExecDetail.ScanDetail.RocksdbBlockReadCount + } + r.SumRocksdbBlockReadByte += info.ExecDetail.ScanDetail.RocksdbBlockReadByte + if info.ExecDetail.ScanDetail.RocksdbBlockReadByte > r.MaxRocksdbBlockReadByte { + r.MaxRocksdbBlockReadByte = info.ExecDetail.ScanDetail.RocksdbBlockReadByte + } + } + // Txn + commitDetails := info.ExecDetail.CommitDetail + if commitDetails != nil { + r.CommitCount++ + r.SumPrewriteTime += commitDetails.PrewriteTime + if commitDetails.PrewriteTime > r.MaxPrewriteTime { + r.MaxPrewriteTime = commitDetails.PrewriteTime + } + r.SumCommitTime += commitDetails.CommitTime + if commitDetails.CommitTime > r.MaxCommitTime { + r.MaxCommitTime = commitDetails.CommitTime + } + r.SumGetCommitTsTime += commitDetails.GetCommitTsTime + if commitDetails.GetCommitTsTime > r.MaxGetCommitTsTime { + r.MaxGetCommitTsTime = commitDetails.GetCommitTsTime + } + resolveLockTime := atomic.LoadInt64(&commitDetails.ResolveLock.ResolveLockTime) + r.SumResolveLockTime += resolveLockTime + if resolveLockTime > r.MaxResolveLockTime { + r.MaxResolveLockTime = resolveLockTime + } + r.SumLocalLatchTime += commitDetails.LocalLatchTime + if commitDetails.LocalLatchTime > r.MaxLocalLatchTime { + r.MaxLocalLatchTime = commitDetails.LocalLatchTime + } + r.SumWriteKeys += int64(commitDetails.WriteKeys) + if commitDetails.WriteKeys > r.MaxWriteKeys { + r.MaxWriteKeys = commitDetails.WriteKeys + } + r.SumWriteSize += int64(commitDetails.WriteSize) + if commitDetails.WriteSize > r.MaxWriteSize { + r.MaxWriteSize = commitDetails.WriteSize + } + prewriteRegionNum := atomic.LoadInt32(&commitDetails.PrewriteRegionNum) + r.SumPrewriteRegionNum += int64(prewriteRegionNum) + if prewriteRegionNum > r.MaxPrewriteRegionNum { + r.MaxPrewriteRegionNum = prewriteRegionNum + } + r.SumTxnRetry += int64(commitDetails.TxnRetry) + if commitDetails.TxnRetry > r.MaxTxnRetry { + r.MaxTxnRetry = commitDetails.TxnRetry + } + commitDetails.Mu.Lock() + commitBackoffTime := commitDetails.Mu.CommitBackoffTime + r.SumCommitBackoffTime += commitBackoffTime + if commitBackoffTime > r.MaxCommitBackoffTime { + r.MaxCommitBackoffTime = commitBackoffTime + } + r.SumBackoffTimes += int64(len(commitDetails.Mu.PrewriteBackoffTypes)) + for _, backoffType := range commitDetails.Mu.PrewriteBackoffTypes { + r.BackoffTypes[backoffType]++ + } + r.SumBackoffTimes += int64(len(commitDetails.Mu.CommitBackoffTypes)) + for _, backoffType := range commitDetails.Mu.CommitBackoffTypes { + r.BackoffTypes[backoffType]++ + } + commitDetails.Mu.Unlock() + } + // Plan cache + if info.PlanInCache { + r.PlanInCache = true + r.PlanCacheHits++ + } else { + r.PlanInCache = false + } + // SPM + if info.PlanInBinding { + r.PlanInBinding = true + } else { + r.PlanInBinding = false + } + // Other + r.SumAffectedRows += info.StmtCtx.AffectedRows() + r.SumMem += info.MemMax + if info.MemMax > r.MaxMem { + r.MaxMem = info.MemMax + } + r.SumDisk += info.DiskMax + if info.DiskMax > r.MaxDisk { + r.MaxDisk = info.DiskMax + } + if info.StartTime.Before(r.FirstSeen) { + r.FirstSeen = info.StartTime + } + if r.LastSeen.Before(info.StartTime) { + r.LastSeen = info.StartTime + } + if info.ExecRetryCount > 0 { + r.ExecRetryCount += info.ExecRetryCount + r.ExecRetryTime += info.ExecRetryTime + } + if info.ResultRows > 0 { + r.SumResultRows += info.ResultRows + if r.MaxResultRows < info.ResultRows { + r.MaxResultRows = info.ResultRows + } + if r.MinResultRows > info.ResultRows { + r.MinResultRows = info.ResultRows + } + } else { + r.MinResultRows = 0 + } + r.SumKVTotal += time.Duration(atomic.LoadInt64(&info.TiKVExecDetails.WaitKVRespDuration)) + r.SumPDTotal += time.Duration(atomic.LoadInt64(&info.TiKVExecDetails.WaitPDRespDuration)) + r.SumBackoffTotal += time.Duration(atomic.LoadInt64(&info.TiKVExecDetails.BackoffDuration)) + r.SumWriteSQLRespTotal += info.StmtExecDetails.WriteSQLRespDuration +} + +// Merge merges the statistics of another StmtRecord to this StmtRecord. +func (r *StmtRecord) Merge(other *StmtRecord) { + // User + for user := range other.AuthUsers { + r.AuthUsers[user] = struct{}{} + } + // ExecCount and SumWarnings + r.ExecCount += other.ExecCount + r.SumWarnings += other.SumWarnings + // Latency + r.SumLatency += other.SumLatency + if r.MaxLatency < other.MaxLatency { + r.MaxLatency = other.MaxLatency + } + if r.MinLatency > other.MinLatency { + r.MinLatency = other.MinLatency + } + r.SumParseLatency += other.SumParseLatency + if r.MaxParseLatency < other.MaxParseLatency { + r.MaxParseLatency = other.MaxParseLatency + } + r.SumCompileLatency += other.SumCompileLatency + if r.MaxCompileLatency < other.MaxCompileLatency { + r.MaxCompileLatency = other.MaxCompileLatency + } + // Coprocessor + r.SumNumCopTasks += other.SumNumCopTasks + if r.MaxCopProcessTime < other.MaxCopProcessTime { + r.MaxCopProcessTime = other.MaxCopProcessTime + r.MaxCopProcessAddress = other.MaxCopProcessAddress + } + if r.MaxCopWaitTime < other.MaxCopWaitTime { + r.MaxCopWaitTime = other.MaxCopWaitTime + r.MaxCopWaitAddress = other.MaxCopWaitAddress + } + // TiKV + r.SumProcessTime += other.SumProcessTime + if r.MaxProcessTime < other.MaxProcessTime { + r.MaxProcessTime = other.MaxProcessTime + } + r.SumWaitTime += other.SumWaitTime + if r.MaxWaitTime < other.MaxWaitTime { + r.MaxWaitTime = other.MaxWaitTime + } + r.SumBackoffTime += other.SumBackoffTime + if r.MaxBackoffTime < other.MaxBackoffTime { + r.MaxBackoffTime = other.MaxBackoffTime + } + r.SumTotalKeys += other.SumTotalKeys + if r.MaxTotalKeys < other.MaxTotalKeys { + r.MaxTotalKeys = other.MaxTotalKeys + } + r.SumProcessedKeys += other.SumProcessedKeys + if r.MaxProcessedKeys < other.MaxProcessedKeys { + r.MaxProcessedKeys = other.MaxProcessedKeys + } + r.SumRocksdbDeleteSkippedCount += other.SumRocksdbDeleteSkippedCount + if r.MaxRocksdbDeleteSkippedCount < other.MaxRocksdbDeleteSkippedCount { + r.MaxRocksdbDeleteSkippedCount = other.MaxRocksdbDeleteSkippedCount + } + r.SumRocksdbKeySkippedCount += other.SumRocksdbKeySkippedCount + if r.MaxRocksdbKeySkippedCount < other.MaxRocksdbKeySkippedCount { + r.MaxRocksdbKeySkippedCount = other.MaxRocksdbKeySkippedCount + } + r.SumRocksdbBlockCacheHitCount += other.SumRocksdbBlockCacheHitCount + if r.MaxRocksdbBlockCacheHitCount < other.MaxRocksdbBlockCacheHitCount { + r.MaxRocksdbBlockCacheHitCount = other.MaxRocksdbBlockCacheHitCount + } + r.SumRocksdbBlockReadCount += other.SumRocksdbBlockReadCount + if r.MaxRocksdbBlockReadCount < other.MaxRocksdbBlockReadCount { + r.MaxRocksdbBlockReadCount = other.MaxRocksdbBlockReadCount + } + r.SumRocksdbBlockReadByte += other.SumRocksdbBlockReadByte + if r.MaxRocksdbBlockReadByte < other.MaxRocksdbBlockReadByte { + r.MaxRocksdbBlockReadByte = other.MaxRocksdbBlockReadByte + } + // Txn + r.CommitCount += other.CommitCount + r.SumPrewriteTime += other.SumPrewriteTime + if r.MaxPrewriteTime < other.MaxPrewriteTime { + r.MaxPrewriteTime = other.MaxPrewriteTime + } + r.SumCommitTime += other.SumCommitTime + if r.MaxCommitTime < other.MaxCommitTime { + r.MaxCommitTime = other.MaxCommitTime + } + r.SumGetCommitTsTime += other.SumGetCommitTsTime + if r.MaxGetCommitTsTime < other.MaxGetCommitTsTime { + r.MaxGetCommitTsTime = other.MaxGetCommitTsTime + } + r.SumCommitBackoffTime += other.SumCommitBackoffTime + if r.MaxCommitBackoffTime < other.MaxCommitBackoffTime { + r.MaxCommitBackoffTime = other.MaxCommitBackoffTime + } + r.SumResolveLockTime += other.SumResolveLockTime + if r.MaxResolveLockTime < other.MaxResolveLockTime { + r.MaxResolveLockTime = other.MaxResolveLockTime + } + r.SumLocalLatchTime += other.SumLocalLatchTime + if r.MaxLocalLatchTime < other.MaxLocalLatchTime { + r.MaxLocalLatchTime = other.MaxLocalLatchTime + } + r.SumWriteKeys += other.SumWriteKeys + if r.MaxWriteKeys < other.MaxWriteKeys { + r.MaxWriteKeys = other.MaxWriteKeys + } + r.SumWriteSize += other.SumWriteSize + if r.MaxWriteSize < other.MaxWriteSize { + r.MaxWriteSize = other.MaxWriteSize + } + r.SumPrewriteRegionNum += other.SumPrewriteRegionNum + if r.MaxPrewriteRegionNum < other.MaxPrewriteRegionNum { + r.MaxPrewriteRegionNum = other.MaxPrewriteRegionNum + } + r.SumTxnRetry += other.SumTxnRetry + if r.MaxTxnRetry < other.MaxTxnRetry { + r.MaxTxnRetry = other.MaxTxnRetry + } + r.SumBackoffTimes += other.SumBackoffTimes + for backoffType, backoffValue := range other.BackoffTypes { + _, ok := r.BackoffTypes[backoffType] + if ok { + r.BackoffTypes[backoffType] += backoffValue + } else { + r.BackoffTypes[backoffType] = backoffValue + } + } + // Plan cache + r.PlanCacheHits += other.PlanCacheHits + // Other + r.SumAffectedRows += other.SumAffectedRows + r.SumMem += other.SumMem + if r.MaxMem < other.MaxMem { + r.MaxMem = other.MaxMem + } + r.SumDisk += other.SumDisk + if r.MaxDisk < other.MaxDisk { + r.MaxDisk = other.MaxDisk + } + if r.FirstSeen.After(other.FirstSeen) { + r.FirstSeen = other.FirstSeen + } + if r.LastSeen.Before(other.LastSeen) { + r.LastSeen = other.LastSeen + } + r.ExecRetryCount += other.ExecRetryCount + r.ExecRetryTime += other.ExecRetryTime + r.SumKVTotal += other.SumKVTotal + r.SumPDTotal += other.SumPDTotal + r.SumBackoffTotal += other.SumBackoffTotal + r.SumWriteSQLRespTotal += other.SumWriteSQLRespTotal + r.SumErrors += other.SumErrors +} + +// Truncate SQL to maxSQLLength. +func formatSQL(sql string) string { + maxSQLLength := int(maxSQLLength()) + length := len(sql) + if length > maxSQLLength { + sql = fmt.Sprintf("%.*s(len:%d)", maxSQLLength, sql, length) + } + return sql +} + +func maxSQLLength() uint32 { + if GlobalStmtSummary != nil { + return GlobalStmtSummary.MaxSQLLength() + } + return 4096 +} + +// GenerateStmtExecInfo4Test generates a new StmtExecInfo for testing purposes. +func GenerateStmtExecInfo4Test(digest string) *stmtsummary.StmtExecInfo { + tables := []stmtctx.TableEntry{{DB: "db1", Table: "tb1"}, {DB: "db2", Table: "tb2"}} + indexes := []string{"a"} + stmtExecInfo := &stmtsummary.StmtExecInfo{ + SchemaName: "schema_name", + OriginalSQL: "original_sql1", + NormalizedSQL: "normalized_sql", + Digest: digest, + PlanDigest: "plan_digest", + PlanGenerator: func() (string, string) { return "", "" }, + User: "user", + TotalLatency: 10000, + ParseLatency: 100, + CompileLatency: 1000, + CopTasks: &stmtctx.CopTasksDetails{ + NumCopTasks: 10, + AvgProcessTime: 1000, + P90ProcessTime: 10000, + MaxProcessAddress: "127", + MaxProcessTime: 15000, + AvgWaitTime: 100, + P90WaitTime: 1000, + MaxWaitAddress: "128", + MaxWaitTime: 1500, + }, + ExecDetail: &execdetails.ExecDetails{ + BackoffTime: 80, + RequestCount: 10, + CommitDetail: &util.CommitDetails{ + GetCommitTsTime: 100, + PrewriteTime: 10000, + CommitTime: 1000, + LocalLatchTime: 10, + Mu: struct { + sync.Mutex + CommitBackoffTime int64 + PrewriteBackoffTypes []string + CommitBackoffTypes []string + SlowestPrewrite util.ReqDetailInfo + CommitPrimary util.ReqDetailInfo + }{ + CommitBackoffTime: 200, + PrewriteBackoffTypes: []string{"txnlock"}, + CommitBackoffTypes: []string{}, + SlowestPrewrite: util.ReqDetailInfo{}, + CommitPrimary: util.ReqDetailInfo{}, + }, + WriteKeys: 20000, + WriteSize: 200000, + PrewriteRegionNum: 20, + TxnRetry: 2, + ResolveLock: util.ResolveLockDetail{ + ResolveLockTime: 2000, + }, + }, + ScanDetail: &util.ScanDetail{ + TotalKeys: 1000, + ProcessedKeys: 500, + RocksdbDeleteSkippedCount: 100, + RocksdbKeySkippedCount: 10, + RocksdbBlockCacheHitCount: 10, + RocksdbBlockReadCount: 10, + RocksdbBlockReadByte: 1000, + }, + DetailsNeedP90: execdetails.DetailsNeedP90{ + TimeDetail: util.TimeDetail{ + ProcessTime: 500, + WaitTime: 50, + }, + CalleeAddress: "129", + }, + }, + StmtCtx: &stmtctx.StatementContext{ + StmtType: "Select", + Tables: tables, + IndexNames: indexes, + }, + MemMax: 10000, + DiskMax: 10000, + StartTime: time.Date(2019, 1, 1, 10, 10, 10, 10, time.UTC), + Succeed: true, + } + stmtExecInfo.StmtCtx.AddAffectedRows(10000) + return stmtExecInfo +} diff --git a/util/stmtsummary/v2/record_test.go b/util/stmtsummary/v2/record_test.go new file mode 100644 index 0000000000000..dd3064daba732 --- /dev/null +++ b/util/stmtsummary/v2/record_test.go @@ -0,0 +1,64 @@ +// Copyright 2023 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 stmtsummary + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestStmtRecord(t *testing.T) { + info := GenerateStmtExecInfo4Test("digest1") + record1 := NewStmtRecord(info) + require.Equal(t, info.SchemaName, record1.SchemaName) + require.Equal(t, info.Digest, record1.Digest) + require.Equal(t, info.PlanDigest, record1.PlanDigest) + require.Equal(t, info.StmtCtx.StmtType, record1.StmtType) + require.Equal(t, info.NormalizedSQL, record1.NormalizedSQL) + require.Equal(t, "db1.tb1,db2.tb2", record1.TableNames) + require.Equal(t, info.IsInternal, record1.IsInternal) + require.Equal(t, formatSQL(info.OriginalSQL), record1.SampleSQL) + require.Equal(t, info.Charset, record1.Charset) + require.Equal(t, info.Collation, record1.Collation) + require.Equal(t, info.PrevSQL, record1.PrevSQL) + require.Equal(t, info.StmtCtx.IndexNames, record1.IndexNames) + require.Equal(t, info.TotalLatency, record1.MinLatency) + require.Equal(t, info.Prepared, record1.Prepared) + require.Equal(t, info.StartTime, record1.FirstSeen) + require.Equal(t, info.StartTime, record1.LastSeen) + require.Empty(t, record1.AuthUsers) + require.Zero(t, record1.ExecCount) + require.Zero(t, record1.SumLatency) + require.Zero(t, record1.MaxLatency) + + record1.Add(info) + require.Len(t, record1.AuthUsers, 1) + require.Contains(t, record1.AuthUsers, "user") + require.Equal(t, int64(1), record1.ExecCount) + require.Equal(t, info.TotalLatency, record1.SumLatency) + require.Equal(t, info.TotalLatency, record1.MaxLatency) + require.Equal(t, info.TotalLatency, record1.MinLatency) + + record2 := NewStmtRecord(info) + record2.Add(info) + record2.Merge(record1) + require.Len(t, record2.AuthUsers, 1) + require.Contains(t, record2.AuthUsers, "user") + require.Equal(t, int64(2), record2.ExecCount) + require.Equal(t, info.TotalLatency*2, record2.SumLatency) + require.Equal(t, info.TotalLatency, record2.MaxLatency) + require.Equal(t, info.TotalLatency, record2.MinLatency) +} diff --git a/util/stmtsummary/v2/stmtsummary.go b/util/stmtsummary/v2/stmtsummary.go new file mode 100644 index 0000000000000..13faffe65a0ea --- /dev/null +++ b/util/stmtsummary/v2/stmtsummary.go @@ -0,0 +1,584 @@ +// Copyright 2023 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 stmtsummary + +import ( + "context" + "errors" + "math" + "sync" + "sync/atomic" + "time" + + "github.com/pingcap/log" + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/hack" + "github.com/pingcap/tidb/util/kvcache" + "github.com/pingcap/tidb/util/stmtsummary" + atomic2 "go.uber.org/atomic" + "golang.org/x/exp/maps" +) + +const ( + defaultEnabled = true + defaultEnableInternalQuery = false + defaultMaxStmtCount = 3000 + defaultMaxSQLLength = 4096 + defaultRefreshInterval = 30 * 60 // 30 min + defaultRotateCheckInterval = 1 // s +) + +var ( + // GlobalStmtSummary is the global StmtSummary instance, we need + // to explicitly call Setup() to initialize it. It will then be + // referenced by SessionVars.StmtSummary for each session. + GlobalStmtSummary *StmtSummary + + timeNow = time.Now +) + +// Setup initializes the GlobalStmtSummary. +func Setup(cfg *Config) (err error) { + GlobalStmtSummary, err = NewStmtSummary(cfg) + return +} + +// Config is the static configuration of StmtSummary. It cannot be +// modified at runtime. +type Config struct { + Filename string + FileMaxSize int + FileMaxDays int + FileMaxBackups int +} + +// StmtSummary represents the complete statements summary statistics. +// It controls data rotation and persistence internally, and provides +// reading interface through MemReader and HistoryReader. +type StmtSummary struct { + ctx context.Context + cancel context.CancelFunc + + optEnabled *atomic2.Bool + optEnableInternalQuery *atomic2.Bool + optMaxStmtCount *atomic2.Uint32 + optMaxSQLLength *atomic2.Uint32 + optRefreshInterval *atomic2.Uint32 + + window *stmtWindow + windowLock sync.Mutex + storage stmtStorage + closeWg sync.WaitGroup + closed atomic.Bool +} + +// NewStmtSummary creates a new StmtSummary from Config. +func NewStmtSummary(cfg *Config) (*StmtSummary, error) { + if cfg.Filename == "" { + return nil, errors.New("stmtsummary: empty filename") + } + + ctx, cancel := context.WithCancel(context.Background()) + s := &StmtSummary{ + ctx: ctx, + cancel: cancel, + + // These options can be changed dynamically at runtime. + // The default values here are just placeholders, and the real values in + // sessionctx/variables/tidb_vars.go will overwrite them after TiDB starts. + optEnabled: atomic2.NewBool(defaultEnabled), + optEnableInternalQuery: atomic2.NewBool(defaultEnableInternalQuery), + optMaxStmtCount: atomic2.NewUint32(defaultMaxStmtCount), + optMaxSQLLength: atomic2.NewUint32(defaultMaxSQLLength), + optRefreshInterval: atomic2.NewUint32(defaultRefreshInterval), + window: newStmtWindow(timeNow(), uint(defaultMaxStmtCount)), + storage: newStmtLogStorage(&log.Config{ + File: log.FileLogConfig{ + Filename: cfg.Filename, + MaxSize: cfg.FileMaxSize, + MaxDays: cfg.FileMaxDays, + MaxBackups: cfg.FileMaxBackups, + }, + }), + } + + s.closeWg.Add(1) + go func() { + defer s.closeWg.Done() + s.rotateLoop() + }() + + return s, nil +} + +// NewStmtSummary4Test creates a new StmtSummary for testing purposes. +func NewStmtSummary4Test(maxStmtCount uint) *StmtSummary { + ctx, cancel := context.WithCancel(context.Background()) + + ss := &StmtSummary{ + ctx: ctx, + cancel: cancel, + + optEnabled: atomic2.NewBool(defaultEnabled), + optEnableInternalQuery: atomic2.NewBool(defaultEnableInternalQuery), + optMaxStmtCount: atomic2.NewUint32(defaultMaxStmtCount), + optMaxSQLLength: atomic2.NewUint32(defaultMaxSQLLength), + optRefreshInterval: atomic2.NewUint32(60 * 60 * 24 * 365), // 1 year + window: newStmtWindow(timeNow(), maxStmtCount), + storage: &mockStmtStorage{}, + } + + ss.closeWg.Add(1) + go func() { + defer ss.closeWg.Done() + ss.rotateLoop() + }() + + return ss +} + +// Enabled returns whether the StmtSummary is enabled. +func (s *StmtSummary) Enabled() bool { + return s.optEnabled.Load() +} + +// SetEnabled is used to enable or disable StmtSummary. If disabled, in-memory +// data will be cleared, (persisted data will still be remained). +func (s *StmtSummary) SetEnabled(v bool) error { + s.optEnabled.Store(v) + if !v { + s.Clear() + } + + return nil +} + +// EnableInternalQuery returns whether the StmtSummary counts internal queries. +func (s *StmtSummary) EnableInternalQuery() bool { + return s.optEnableInternalQuery.Load() +} + +// SetEnableInternalQuery is used to enable or disable StmtSummary's internal +// query statistics. If disabled, in-memory internal queries will be cleared, +// (persisted internal queries will still be remained). +func (s *StmtSummary) SetEnableInternalQuery(v bool) error { + s.optEnableInternalQuery.Store(v) + if !v { + s.ClearInternal() + } + + return nil +} + +// MaxStmtCount returns the maximum number of statements. +func (s *StmtSummary) MaxStmtCount() uint32 { + return s.optMaxStmtCount.Load() +} + +// SetMaxStmtCount is used to set the maximum number of statements. +// If the current number exceeds the maximum number, the excess will be evicted. +func (s *StmtSummary) SetMaxStmtCount(v uint32) error { + if v < 1 { + v = 1 + } + s.optMaxStmtCount.Store(v) + s.windowLock.Lock() + _ = s.window.lru.SetCapacity(uint(v)) + s.windowLock.Unlock() + + return nil +} + +// MaxSQLLength returns the maximum size of a single SQL statement. +func (s *StmtSummary) MaxSQLLength() uint32 { + return s.optMaxSQLLength.Load() +} + +// SetMaxSQLLength sets the maximum size of a single SQL statement. +func (s *StmtSummary) SetMaxSQLLength(v uint32) error { + s.optMaxSQLLength.Store(v) + + return nil +} + +// RefreshInterval returns the period (in seconds) at which the statistics +// window is refreshed (persisted). +func (s *StmtSummary) RefreshInterval() uint32 { + return s.optRefreshInterval.Load() +} + +// SetRefreshInterval sets the period (in seconds) for the statistics window +// to be refreshed (persisted). This may trigger a refresh (persistence) of +// the current statistics window early. +func (s *StmtSummary) SetRefreshInterval(v uint32) error { + if v < 1 { + v = 1 + } + s.optRefreshInterval.Store(v) + + return nil +} + +// Add adds a single stmtsummary.StmtExecInfo to the current statistics window +// of StmtSummary. Before adding, it will check whether the current window has +// expired, and if it has expired, the window will be persisted asynchronously +// and a new window will be created to replace the current one. +func (s *StmtSummary) Add(info *stmtsummary.StmtExecInfo) { + if s.closed.Load() { + return + } + + k := &stmtKey{ + schemaName: info.SchemaName, + digest: info.Digest, + prevDigest: info.PrevSQLDigest, + planDigest: info.PlanDigest, + } + k.Hash() // Calculate hash value in advance, to reduce the time holding the window lock. + + // Add info to the current statistics window. + s.windowLock.Lock() + var record *lockedStmtRecord + if v, ok := s.window.lru.Get(k); ok { + record = v.(*lockedStmtRecord) + } else { + record = &lockedStmtRecord{StmtRecord: NewStmtRecord(info)} + s.window.lru.Put(k, record) + } + s.windowLock.Unlock() + + record.Lock() + record.Add(info) + record.Unlock() +} + +// Evicted returns the number of statements evicted for the current +// time window. The returned type is one row consisting of three +// columns: [BEGIN_TIME, END_TIME, EVICTED_COUNT]. +func (s *StmtSummary) Evicted() []types.Datum { + s.windowLock.Lock() + count := int64(s.window.evicted.count()) + s.windowLock.Unlock() + if count == 0 { + return nil + } + begin := types.NewTime(types.FromGoTime(s.window.begin), mysql.TypeTimestamp, 0) + end := types.NewTime(types.FromGoTime(timeNow()), mysql.TypeTimestamp, 0) + return types.MakeDatums(begin, end, count) +} + +// Clear clears all data in the current window, and the data that +// has been persisted will not be cleared. +func (s *StmtSummary) Clear() { + s.windowLock.Lock() + defer s.windowLock.Unlock() + s.window.clear() +} + +// ClearInternal clears all internal queries of the current window, +// and the data that has been persisted will not be cleared. +func (s *StmtSummary) ClearInternal() { + s.windowLock.Lock() + defer s.windowLock.Unlock() + for _, k := range s.window.lru.Keys() { + v, _ := s.window.lru.Get(k) + if v.(*lockedStmtRecord).IsInternal { + s.window.lru.Delete(k) + } + } +} + +// Close closes the work of StmtSummary. +func (s *StmtSummary) Close() { + if s.cancel != nil { + s.cancel() + s.closeWg.Wait() + } + s.closed.Store(true) +} + +// GetMoreThanCntBindableStmt is used to get bindable statements. +// Statements whose execution times exceed the threshold will be +// returned. Since the historical data has been persisted, we only +// refer to the statistics data of the current window in memory. +func (s *StmtSummary) GetMoreThanCntBindableStmt(cnt int64) []*stmtsummary.BindableStmt { + s.windowLock.Lock() + values := s.window.lru.Values() + s.windowLock.Unlock() + stmts := make([]*stmtsummary.BindableStmt, 0, len(values)) + for _, value := range values { + record := value.(*lockedStmtRecord) + func() { + record.Lock() + defer record.Unlock() + if record.StmtType == "Select" || + record.StmtType == "Delete" || + record.StmtType == "Update" || + record.StmtType == "Insert" || + record.StmtType == "Replace" { + if len(record.AuthUsers) > 0 && record.ExecCount > cnt { + stmt := &stmtsummary.BindableStmt{ + Schema: record.SchemaName, + Query: record.SampleSQL, + PlanHint: record.PlanHint, + Charset: record.Charset, + Collation: record.Collation, + Users: make(map[string]struct{}), + } + maps.Copy(stmt.Users, record.AuthUsers) + + // If it is SQL command prepare / execute, the ssElement.sampleSQL + // is `execute ...`, we should get the original select query. + // If it is binary protocol prepare / execute, ssbd.normalizedSQL + // should be same as ssElement.sampleSQL. + if record.Prepared { + stmt.Query = record.NormalizedSQL + } + stmts = append(stmts, stmt) + } + } + }() + } + return stmts +} + +func (s *StmtSummary) rotateLoop() { + tick := time.NewTicker(defaultRotateCheckInterval * time.Second) + defer tick.Stop() + + for { + select { + case <-s.ctx.Done(): + return + case <-tick.C: + now := timeNow() + s.windowLock.Lock() + // The current window has expired and needs to be refreshed and persisted. + if now.After(s.window.begin.Add(time.Duration(s.RefreshInterval()) * time.Second)) { + s.rotate(now) + } + s.windowLock.Unlock() + } + } +} + +func (s *StmtSummary) rotate(now time.Time) { + w := s.window + s.window = newStmtWindow(now, uint(s.MaxStmtCount())) + size := w.lru.Size() + if size > 0 { + // Persist window asynchronously. + s.closeWg.Add(1) + go func() { + defer s.closeWg.Done() + s.storage.persist(w, now) + }() + } +} + +// stmtWindow represents a single statistical window, which has a begin +// time and an end time. Data within a single window is eliminated +// according to the LRU strategy. All evicted data will be aggregated +// into stmtEvicted. +type stmtWindow struct { + begin time.Time + lru *kvcache.SimpleLRUCache // *stmtKey => *lockedStmtRecord + evicted *stmtEvicted +} + +func newStmtWindow(begin time.Time, capacity uint) *stmtWindow { + w := &stmtWindow{ + begin: begin, + lru: kvcache.NewSimpleLRUCache(capacity, 0, 0), + evicted: newStmtEvicted(), + } + w.lru.SetOnEvict(func(k kvcache.Key, v kvcache.Value) { + r := v.(*lockedStmtRecord) + r.Lock() + defer r.Unlock() + w.evicted.add(k.(*stmtKey), r.StmtRecord) + }) + return w +} + +func (w *stmtWindow) clear() { + w.lru.DeleteAll() + w.evicted = newStmtEvicted() +} + +type stmtStorage interface { + persist(w *stmtWindow, end time.Time) +} + +// stmtKey defines key for stmtElement. +type stmtKey struct { + // Same statements may appear in different schema, but they refer to different tables. + schemaName string + digest string + // The digest of the previous statement. + prevDigest string + // The digest of the plan of this SQL. + planDigest string + // `hash` is the hash value of this object. + hash []byte +} + +// Hash implements SimpleLRUCache.Key. +// Only when current SQL is `commit` do we record `prevSQL`. Otherwise, `prevSQL` is empty. +// `prevSQL` is included in the key To distinguish different transactions. +func (k *stmtKey) Hash() []byte { + if len(k.hash) == 0 { + k.hash = make([]byte, 0, len(k.schemaName)+len(k.digest)+len(k.prevDigest)+len(k.planDigest)) + k.hash = append(k.hash, hack.Slice(k.digest)...) + k.hash = append(k.hash, hack.Slice(k.schemaName)...) + k.hash = append(k.hash, hack.Slice(k.prevDigest)...) + k.hash = append(k.hash, hack.Slice(k.planDigest)...) + } + return k.hash +} + +type stmtEvicted struct { + sync.Mutex + keys map[string]struct{} + other *StmtRecord +} + +func newStmtEvicted() *stmtEvicted { + return &stmtEvicted{ + keys: make(map[string]struct{}), + other: &StmtRecord{ + AuthUsers: make(map[string]struct{}), + MinLatency: time.Duration(math.MaxInt64), + BackoffTypes: make(map[string]int), + FirstSeen: time.Unix(math.MaxInt64, 0), + }, + } +} + +func (e *stmtEvicted) add(key *stmtKey, record *StmtRecord) { + if key == nil || record == nil { + return + } + e.Lock() + defer e.Unlock() + e.keys[string(key.Hash())] = struct{}{} + e.other.Merge(record) +} + +func (e *stmtEvicted) count() int { + e.Lock() + defer e.Unlock() + return len(e.keys) +} + +type lockedStmtRecord struct { + sync.Mutex + *StmtRecord +} + +type mockStmtStorage struct { + windows []*stmtWindow +} + +func (s *mockStmtStorage) persist(w *stmtWindow, _ time.Time) { + s.windows = append(s.windows, w) +} + +/* Public proxy functions between v1 and v2 */ + +// Add wraps GlobalStmtSummary.Add and stmtsummary.StmtSummaryByDigestMap.AddStatement. +func Add(stmtExecInfo *stmtsummary.StmtExecInfo) { + if config.GetGlobalConfig().Instance.StmtSummaryEnablePersistent { + GlobalStmtSummary.Add(stmtExecInfo) + } else { + stmtsummary.StmtSummaryByDigestMap.AddStatement(stmtExecInfo) + } +} + +// Enabled wraps GlobalStmtSummary.Enabled and stmtsummary.StmtSummaryByDigestMap.Enabled. +func Enabled() bool { + if config.GetGlobalConfig().Instance.StmtSummaryEnablePersistent { + return GlobalStmtSummary.Enabled() + } + return stmtsummary.StmtSummaryByDigestMap.Enabled() +} + +// EnabledInternal wraps GlobalStmtSummary.EnableInternalQuery and stmtsummary.StmtSummaryByDigestMap.EnabledInternal. +func EnabledInternal() bool { + if config.GetGlobalConfig().Instance.StmtSummaryEnablePersistent { + return GlobalStmtSummary.EnableInternalQuery() + } + return stmtsummary.StmtSummaryByDigestMap.EnabledInternal() +} + +// SetEnabled wraps GlobalStmtSummary.SetEnabled and stmtsummary.StmtSummaryByDigestMap.SetEnabled. +func SetEnabled(v bool) error { + if config.GetGlobalConfig().Instance.StmtSummaryEnablePersistent { + return GlobalStmtSummary.SetEnabled(v) + } + return stmtsummary.StmtSummaryByDigestMap.SetEnabled(v) +} + +// SetEnableInternalQuery wraps GlobalStmtSummary.SetEnableInternalQuery and +// stmtsummary.StmtSummaryByDigestMap.SetEnabledInternalQuery. +func SetEnableInternalQuery(v bool) error { + if config.GetGlobalConfig().Instance.StmtSummaryEnablePersistent { + return GlobalStmtSummary.SetEnableInternalQuery(v) + } + return stmtsummary.StmtSummaryByDigestMap.SetEnabledInternalQuery(v) +} + +// SetRefreshInterval wraps GlobalStmtSummary.SetRefreshInterval and stmtsummary.StmtSummaryByDigestMap.SetRefreshInterval. +func SetRefreshInterval(v int64) error { + if config.GetGlobalConfig().Instance.StmtSummaryEnablePersistent { + return GlobalStmtSummary.SetRefreshInterval(uint32(v)) + } + return stmtsummary.StmtSummaryByDigestMap.SetRefreshInterval(v) +} + +// SetHistorySize wraps stmtsummary.StmtSummaryByDigestMap.SetHistorySize. +func SetHistorySize(v int) error { + if config.GetGlobalConfig().Instance.StmtSummaryEnablePersistent { + return nil // not support + } + return stmtsummary.StmtSummaryByDigestMap.SetHistorySize(v) +} + +// SetMaxStmtCount wraps GlobalStmtSummary.SetMaxStmtCount and stmtsummary.StmtSummaryByDigestMap.SetMaxStmtCount. +func SetMaxStmtCount(v int) error { + if config.GetGlobalConfig().Instance.StmtSummaryEnablePersistent { + return GlobalStmtSummary.SetMaxStmtCount(uint32(v)) + } + return stmtsummary.StmtSummaryByDigestMap.SetMaxStmtCount(uint(v)) +} + +// SetMaxSQLLength wraps GlobalStmtSummary.SetMaxSQLLength and stmtsummary.StmtSummaryByDigestMap.SetMaxSQLLength. +func SetMaxSQLLength(v int) error { + if config.GetGlobalConfig().Instance.StmtSummaryEnablePersistent { + return GlobalStmtSummary.SetMaxSQLLength(uint32(v)) + } + return stmtsummary.StmtSummaryByDigestMap.SetMaxSQLLength(v) +} + +// GetMoreThanCntBindableStmt wraps GlobalStmtSummary.GetMoreThanCntBindableStmt and +// stmtsummary.StmtSummaryByDigestMap.GetMoreThanCntBindableStmt. +func GetMoreThanCntBindableStmt(frequency int64) []*stmtsummary.BindableStmt { + if config.GetGlobalConfig().Instance.StmtSummaryEnablePersistent { + return GlobalStmtSummary.GetMoreThanCntBindableStmt(frequency) + } + return stmtsummary.StmtSummaryByDigestMap.GetMoreThanCntBindableStmt(frequency) +} diff --git a/util/stmtsummary/v2/stmtsummary_test.go b/util/stmtsummary/v2/stmtsummary_test.go new file mode 100644 index 0000000000000..27e41f5283f4a --- /dev/null +++ b/util/stmtsummary/v2/stmtsummary_test.go @@ -0,0 +1,67 @@ +// Copyright 2023 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 stmtsummary + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestStmtWindow(t *testing.T) { + ss := NewStmtSummary4Test(5) + defer ss.Close() + ss.Add(GenerateStmtExecInfo4Test("digest1")) + ss.Add(GenerateStmtExecInfo4Test("digest1")) + ss.Add(GenerateStmtExecInfo4Test("digest2")) + ss.Add(GenerateStmtExecInfo4Test("digest2")) + ss.Add(GenerateStmtExecInfo4Test("digest3")) + ss.Add(GenerateStmtExecInfo4Test("digest4")) + ss.Add(GenerateStmtExecInfo4Test("digest5")) + ss.Add(GenerateStmtExecInfo4Test("digest6")) + ss.Add(GenerateStmtExecInfo4Test("digest7")) + require.Equal(t, 5, ss.window.lru.Size()) + require.Equal(t, 2, ss.window.evicted.count()) + require.Equal(t, int64(4), ss.window.evicted.other.ExecCount) // digest1 digest1 digest2 digest2 + ss.Clear() + require.Equal(t, 0, ss.window.lru.Size()) + require.Equal(t, 0, ss.window.evicted.count()) + require.Equal(t, int64(0), ss.window.evicted.other.ExecCount) +} + +func TestStmtSummary(t *testing.T) { + ss := NewStmtSummary4Test(3) + defer ss.Close() + + w := ss.window + ss.Add(GenerateStmtExecInfo4Test("digest1")) + ss.Add(GenerateStmtExecInfo4Test("digest2")) + ss.Add(GenerateStmtExecInfo4Test("digest3")) + ss.Add(GenerateStmtExecInfo4Test("digest4")) + ss.Add(GenerateStmtExecInfo4Test("digest5")) + require.Equal(t, 3, w.lru.Size()) + require.Equal(t, 2, w.evicted.count()) + + ss.rotate(timeNow()) + + ss.Add(GenerateStmtExecInfo4Test("digest6")) + ss.Add(GenerateStmtExecInfo4Test("digest7")) + w = ss.window + require.Equal(t, 2, w.lru.Size()) + require.Equal(t, 0, w.evicted.count()) + + ss.Clear() + require.Equal(t, 0, w.lru.Size()) +} diff --git a/ddl/concurrentddltest/BUILD.bazel b/util/stmtsummary/v2/tests/BUILD.bazel similarity index 60% rename from ddl/concurrentddltest/BUILD.bazel rename to util/stmtsummary/v2/tests/BUILD.bazel index 81b86bf3f3856..988cc24c95abb 100644 --- a/ddl/concurrentddltest/BUILD.bazel +++ b/util/stmtsummary/v2/tests/BUILD.bazel @@ -1,24 +1,24 @@ load("@io_bazel_rules_go//go:def.bzl", "go_test") go_test( - name = "concurrentddltest_test", + name = "tests_test", timeout = "short", srcs = [ "main_test.go", - "switch_test.go", + "table_test.go", ], flaky = True, - race = "on", deps = [ "//config", - "//ddl", "//kv", - "//meta", + "//parser/auth", + "//planner/core", + "//session", "//testkit", "//testkit/testsetup", - "//util", + "//util/stmtsummary/v2:stmtsummary", + "@com_github_pingcap_failpoint//:failpoint", "@com_github_stretchr_testify//require", - "@org_uber_go_atomic//:atomic", "@org_uber_go_goleak//:goleak", ], ) diff --git a/util/stmtsummary/v2/tests/main_test.go b/util/stmtsummary/v2/tests/main_test.go new file mode 100644 index 0000000000000..305780d660949 --- /dev/null +++ b/util/stmtsummary/v2/tests/main_test.go @@ -0,0 +1,33 @@ +// Copyright 2023 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 tests + +import ( + "testing" + + "github.com/pingcap/tidb/testkit/testsetup" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + testsetup.SetupForCommonTest() + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), + } + goleak.VerifyTestMain(m, opts...) +} diff --git a/util/stmtsummary/v2/tests/table_test.go b/util/stmtsummary/v2/tests/table_test.go new file mode 100644 index 0000000000000..3712148e7e38e --- /dev/null +++ b/util/stmtsummary/v2/tests/table_test.go @@ -0,0 +1,523 @@ +// Copyright 2023 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 tests + +import ( + "fmt" + "math" + "testing" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/auth" + plannercore "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/testkit" + stmtsummaryv2 "github.com/pingcap/tidb/util/stmtsummary/v2" + "github.com/stretchr/testify/require" +) + +func TestStmtSummaryTable(t *testing.T) { + setupStmtSummary() + defer closeStmtSummary() + + store := testkit.CreateMockStore(t) + tk := newTestKitWithRoot(t, store) + + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + tk.MustQuery("select column_comment from information_schema.columns " + + "where table_name='STATEMENTS_SUMMARY' and column_name='STMT_TYPE'", + ).Check(testkit.Rows("Statement type")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b varchar(10), key k(a))") + + // Clear all statements. + tk.MustExec("set global tidb_enable_stmt_summary = 0") + tk.MustExec("set global tidb_enable_stmt_summary = 1") + tk.MustQuery("select @@global.tidb_enable_stmt_summary").Check(testkit.Rows("1")) + + // Create a new session to test. + tk = newTestKitWithRoot(t, store) + + // Test INSERT + tk.MustExec("insert into t values(1, 'a')") + tk.MustExec("insert into t values(2, 'b')") + tk.MustExec("insert into t VALUES(3, 'c')") + tk.MustExec("/**/insert into t values(4, 'd')") + + sql := "select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, " + + "max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, " + + "max_prewrite_regions, avg_affected_rows, query_sample_text " + + "from information_schema.statements_summary " + + "where digest_text like 'insert into `t`%'" + tk.MustQuery(sql).Check(testkit.Rows("Insert test test.t 4 0 0 0 0 0 2 2 1 1 1 insert into t values(1, 'a')")) + + // Test point get. + tk.MustExec("drop table if exists p") + tk.MustExec("create table p(a int primary key, b int)") + for i := 1; i < 3; i++ { + tk.MustQuery("select b from p where a=1") + expectedResult := fmt.Sprintf("%d \tid \ttask\testRows\toperator info\n\tPoint_Get_1\troot\t1 \ttable:p, handle:1 %s", i, "test.p") + // Also make sure that the plan digest is not empty + sql = "select exec_count, plan, table_names from information_schema.statements_summary " + + "where digest_text like 'select `b` from `p`%' and plan_digest != ''" + tk.MustQuery(sql).Check(testkit.Rows(expectedResult)) + } + + // Point get another database. + tk.MustQuery("select variable_value from mysql.tidb where variable_name = 'system_tz'") + // Test for Encode plan cache. + p1 := tk.Session().GetSessionVars().StmtCtx.GetEncodedPlan() + require.Greater(t, len(p1), 0) + rows := tk.MustQuery("select tidb_decode_plan('" + p1 + "');").Rows() + require.Equal(t, 1, len(rows)) + require.Equal(t, 1, len(rows[0])) + require.Regexp(t, "\n.*Point_Get.*table.tidb, index.PRIMARY.VARIABLE_NAME", rows[0][0]) + + sql = "select table_names from information_schema.statements_summary " + + "where digest_text like 'select `variable_value`%' and `schema_name`='test'" + tk.MustQuery(sql).Check(testkit.Rows("mysql.tidb")) + + // Test `create database`. + tk.MustExec("create database if not exists test") + // Test for Encode plan cache. + p2 := tk.Session().GetSessionVars().StmtCtx.GetEncodedPlan() + require.Equal(t, "", p2) + tk.MustQuery(`select table_names + from information_schema.statements_summary + where digest_text like 'create database%' and schema_name='test'`, + ).Check(testkit.Rows("")) + + // Test SELECT. + const failpointName = "github.com/pingcap/tidb/planner/core/mockPlanRowCount" + require.NoError(t, failpoint.Enable(failpointName, "return(100)")) + defer func() { require.NoError(t, failpoint.Disable(failpointName)) }() + tk.MustQuery("select * from t where a=2") + + // sum_cop_task_num is always 0 if tidb_enable_collect_execution_info disabled + sql = "select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, " + + "max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, " + + "max_prewrite_regions, avg_affected_rows, query_sample_text, plan " + + "from information_schema.statements_summary " + + "where digest_text like 'select * from `t`%'" + tk.MustQuery(sql).Check(testkit.Rows("Select test test.t t:k 1 0 0 0 0 0 0 0 0 0 0 select * from t where a=2 \tid \ttask \testRows\toperator info\n" + + "\tIndexLookUp_10 \troot \t100 \t\n" + + "\t├─IndexRangeScan_8(Build)\tcop[tikv]\t100 \ttable:t, index:k(a), range:[2,2], keep order:false, stats:pseudo\n" + + "\t└─TableRowIDScan_9(Probe)\tcop[tikv]\t100 \ttable:t, keep order:false, stats:pseudo")) + + // select ... order by + tk.MustQuery(`select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, + max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, + max_prewrite_regions, avg_affected_rows, query_sample_text + from information_schema.statements_summary + order by exec_count desc limit 1`, + ).Check(testkit.Rows("Insert test test.t 4 0 0 0 0 0 2 2 1 1 1 insert into t values(1, 'a')")) + + // Test different plans with same digest. + require.NoError(t, failpoint.Enable(failpointName, "return(1000)")) + tk.MustQuery("select * from t where a=3") + sql = "select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, " + + "max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, " + + "max_prewrite_regions, avg_affected_rows, query_sample_text, plan " + + "from information_schema.statements_summary " + + "where digest_text like 'select * from `t`%'" + tk.MustQuery(sql).Check(testkit.Rows( + "Select test test.t t:k 2 0 0 0 0 0 0 0 0 0 0 select * from t where a=2 \tid \ttask \testRows\toperator info\n" + + "\tIndexLookUp_10 \troot \t100 \t\n" + + "\t├─IndexRangeScan_8(Build)\tcop[tikv]\t100 \ttable:t, index:k(a), range:[2,2], keep order:false, stats:pseudo\n" + + "\t└─TableRowIDScan_9(Probe)\tcop[tikv]\t100 \ttable:t, keep order:false, stats:pseudo")) + + // Disable it again. + tk.MustExec("set global tidb_enable_stmt_summary = false") + defer tk.MustExec("set global tidb_enable_stmt_summary = 1") + tk.MustQuery("select @@global.tidb_enable_stmt_summary").Check(testkit.Rows("0")) + + // Create a new session to test + tk = newTestKitWithRoot(t, store) + + // This statement shouldn't be summarized. + tk.MustQuery("select * from t where a=2") + + // The table should be cleared. + tk.MustQuery(`select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, + max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, + max_prewrite_regions, avg_affected_rows, query_sample_text, plan + from information_schema.statements_summary`, + ).Check(testkit.Rows()) + + tk.MustExec("SET GLOBAL tidb_enable_stmt_summary = on") + // It should work immediately. + tk.MustExec("begin") + tk.MustExec("insert into t values(1, 'a')") + tk.MustExec("commit") + sql = "select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, " + + "max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, " + + "max_prewrite_regions, avg_affected_rows, query_sample_text, prev_sample_text " + + "from information_schema.statements_summary " + + "where digest_text like 'insert into `t`%'" + tk.MustQuery(sql).Check(testkit.Rows("Insert test test.t 1 0 0 0 0 0 0 0 0 0 1 insert into t values(1, 'a') ")) + tk.MustQuery(`select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, + max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, + max_prewrite_regions, avg_affected_rows, query_sample_text, prev_sample_text + from information_schema.statements_summary + where digest_text='commit'`, + ).Check(testkit.Rows("Commit test 1 0 0 0 0 0 2 2 1 1 0 commit insert into t values(1, 'a')")) + + tk.MustQuery("select * from t where a=2") + sql = "select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, " + + "max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, " + + "max_prewrite_regions, avg_affected_rows, query_sample_text, plan " + + "from information_schema.statements_summary " + + "where digest_text like 'select * from `t`%'" + tk.MustQuery(sql).Check(testkit.Rows("Select test test.t t:k 1 0 0 0 0 0 0 0 0 0 0 select * from t where a=2 \tid \ttask \testRows\toperator info\n" + + "\tIndexLookUp_10 \troot \t1000 \t\n" + + "\t├─IndexRangeScan_8(Build)\tcop[tikv]\t1000 \ttable:t, index:k(a), range:[2,2], keep order:false, stats:pseudo\n" + + "\t└─TableRowIDScan_9(Probe)\tcop[tikv]\t1000 \ttable:t, keep order:false, stats:pseudo")) + + // Disable it in global scope. + tk.MustExec("set global tidb_enable_stmt_summary = false") + + // Create a new session to test. + tk = newTestKitWithRoot(t, store) + + // Statement summary is disabled. + tk.MustQuery(`select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, + max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, + max_prewrite_regions, avg_affected_rows, query_sample_text, plan + from information_schema.statements_summary`, + ).Check(testkit.Rows()) + + tk.MustExec("set global tidb_enable_stmt_summary = on") + tk.MustExec("set global tidb_stmt_summary_history_size = 24") +} + +func TestStmtSummaryTablePrivilege(t *testing.T) { + setupStmtSummary() + defer closeStmtSummary() + + store := testkit.CreateMockStore(t) + tk := newTestKitWithRoot(t, store) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b varchar(10), key k(a))") + defer tk.MustExec("drop table if exists t") + + // Clear all statements. + tk.MustExec("set global tidb_enable_stmt_summary = 0") + tk.MustExec("set global tidb_enable_stmt_summary = 1") + + // Create a new user to test statements summary table privilege + tk.MustExec("drop user if exists 'test_user'@'localhost'") + tk.MustExec("create user 'test_user'@'localhost'") + defer tk.MustExec("drop user if exists 'test_user'@'localhost'") + tk.MustExec("grant select on test.t to 'test_user'@'localhost'") + tk.MustExec("select * from t where a=1") + result := tk.MustQuery("select * from information_schema.statements_summary where digest_text like 'select * from `t`%'") + require.Equal(t, 1, len(result.Rows())) + result = tk.MustQuery("select * from information_schema.statements_summary_history where digest_text like 'select * from `t`%'") + require.Equal(t, 1, len(result.Rows())) + + tk1 := newTestKit(t, store) + tk1.Session().Auth(&auth.UserIdentity{ + Username: "test_user", + Hostname: "localhost", + AuthUsername: "test_user", + AuthHostname: "localhost", + }, nil, nil) + + result = tk1.MustQuery("select * from information_schema.statements_summary where digest_text like 'select * from `t`%'") + // Ordinary users can not see others' records + require.Equal(t, 0, len(result.Rows())) + result = tk1.MustQuery("select * from information_schema.statements_summary_history where digest_text like 'select * from `t`%'") + require.Equal(t, 0, len(result.Rows())) + tk1.MustExec("select * from t where b=1") + result = tk1.MustQuery("select * from information_schema.statements_summary where digest_text like 'select * from `t`%'") + // Ordinary users can see his own records + require.Equal(t, 1, len(result.Rows())) + result = tk1.MustQuery("select * from information_schema.statements_summary_history where digest_text like 'select * from `t`%'") + require.Equal(t, 1, len(result.Rows())) + + tk.MustExec("grant process on *.* to 'test_user'@'localhost'") + result = tk1.MustQuery("select * from information_schema.statements_summary where digest_text like 'select * from `t`%'") + // Users with 'PROCESS' privileges can query all records. + require.Equal(t, 2, len(result.Rows())) + result = tk1.MustQuery("select * from information_schema.statements_summary_history where digest_text like 'select * from `t`%'") + require.Equal(t, 2, len(result.Rows())) +} + +func TestCapturePrivilege(t *testing.T) { + setupStmtSummary() + defer closeStmtSummary() + + store := testkit.CreateMockStore(t) + tk := newTestKitWithRoot(t, store) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b varchar(10), key k(a))") + defer tk.MustExec("drop table if exists t") + + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(a int, b varchar(10), key k(a))") + defer tk.MustExec("drop table if exists t1") + + // Clear all statements. + tk.MustExec("set global tidb_enable_stmt_summary = 0") + tk.MustExec("set global tidb_enable_stmt_summary = 1") + + // Create a new user to test statements summary table privilege + tk.MustExec("drop user if exists 'test_user'@'localhost'") + tk.MustExec("create user 'test_user'@'localhost'") + defer tk.MustExec("drop user if exists 'test_user'@'localhost'") + tk.MustExec("grant select on test.t1 to 'test_user'@'localhost'") + tk.MustExec("select * from t where a=1") + tk.MustExec("select * from t where a=1") + tk.MustExec("admin capture bindings") + rows := tk.MustQuery("show global bindings").Rows() + require.Len(t, rows, 1) + + tk1 := newTestKit(t, store) + tk1.Session().Auth(&auth.UserIdentity{ + Username: "test_user", + Hostname: "localhost", + AuthUsername: "test_user", + AuthHostname: "localhost", + }, nil, nil) + + rows = tk1.MustQuery("show global bindings").Rows() + // Ordinary users can not see others' records + require.Len(t, rows, 0) + tk1.MustExec("select * from t1 where b=1") + tk1.MustExec("select * from t1 where b=1") + tk1.MustExec("admin capture bindings") + rows = tk1.MustQuery("show global bindings").Rows() + require.Len(t, rows, 1) + + tk.MustExec("grant all on *.* to 'test_user'@'localhost'") + tk1.MustExec("admin capture bindings") + rows = tk1.MustQuery("show global bindings").Rows() + require.Len(t, rows, 2) +} + +func TestStmtSummaryErrorCount(t *testing.T) { + setupStmtSummary() + defer closeStmtSummary() + + store := testkit.CreateMockStore(t) + tk := newTestKitWithRoot(t, store) + + // Clear summaries. + tk.MustExec("set global tidb_enable_stmt_summary = 0") + tk.MustExec("set global tidb_enable_stmt_summary = 1") + + tk.MustExec("use test") + tk.MustExec("drop table if exists stmt_summary_test") + tk.MustExec("create table stmt_summary_test(id int primary key)") + tk.MustExec("insert into stmt_summary_test values(1)") + _, err := tk.Exec("insert into stmt_summary_test values(1)") + require.Error(t, err) + + sql := "select exec_count, sum_errors, sum_warnings from information_schema.statements_summary where digest_text like \"insert into `stmt_summary_test`%\"" + tk.MustQuery(sql).Check(testkit.Rows("2 1 0")) + + tk.MustExec("insert ignore into stmt_summary_test values(1)") + sql = "select exec_count, sum_errors, sum_warnings from information_schema.statements_summary where digest_text like \"insert ignore into `stmt_summary_test`%\"" + tk.MustQuery(sql).Check(testkit.Rows("1 0 1")) +} + +func TestStmtSummaryPreparedStatements(t *testing.T) { + setupStmtSummary() + defer closeStmtSummary() + + store := testkit.CreateMockStore(t) + tk := newTestKitWithRoot(t, store) + + // Clear summaries. + tk.MustExec("set global tidb_enable_stmt_summary = 0") + tk.MustExec("set global tidb_enable_stmt_summary = 1") + + tk.MustExec("use test") + tk.MustExec("prepare stmt from 'select ?'") + tk.MustExec("set @number=1") + tk.MustExec("execute stmt using @number") + + tk.MustQuery(`select exec_count + from information_schema.statements_summary + where digest_text like "prepare%"`).Check(testkit.Rows()) + tk.MustQuery(`select exec_count + from information_schema.statements_summary + where digest_text like "select ?"`).Check(testkit.Rows("1")) +} + +func TestStmtSummarySensitiveQuery(t *testing.T) { + setupStmtSummary() + defer closeStmtSummary() + + store := testkit.CreateMockStore(t) + tk := newTestKitWithRoot(t, store) + + tk.MustExec("set global tidb_enable_stmt_summary = 0") + tk.MustExec("set global tidb_enable_stmt_summary = 1") + tk.MustExec("drop user if exists user_sensitive;") + tk.MustExec("create user user_sensitive identified by '123456789';") + tk.MustExec("alter user 'user_sensitive'@'%' identified by 'abcdefg';") + tk.MustExec("set password for 'user_sensitive'@'%' = 'xyzuvw';") + tk.MustQuery("select query_sample_text from `information_schema`.`STATEMENTS_SUMMARY` " + + "where query_sample_text like '%user_sensitive%' and " + + "(query_sample_text like 'set password%' or query_sample_text like 'create user%' or query_sample_text like 'alter user%') " + + "order by query_sample_text;"). + Check(testkit.Rows( + "alter user {user_sensitive@% password = ***}", + "create user {user_sensitive@% password = ***}", + "set password for user user_sensitive@%", + )) +} + +func TestStmtSummaryTableOther(t *testing.T) { + setupStmtSummary() + defer closeStmtSummary() + + store := testkit.CreateMockStore(t) + tk := newTestKitWithRoot(t, store) + + tk.MustExec("set global tidb_enable_stmt_summary=0") + tk.MustExec("set global tidb_enable_stmt_summary=1") + // set stmt size to 1 + // first sql + tk.MustExec("set global tidb_stmt_summary_max_stmt_count=1") + defer tk.MustExec("set global tidb_stmt_summary_max_stmt_count=100") + // second sql, evict first sql from stmt_summary + tk.MustExec("show databases;") + // third sql, evict second sql from stmt_summary + tk.MustQuery("SELECT DIGEST_TEXT, DIGEST FROM `INFORMATION_SCHEMA`.`STATEMENTS_SUMMARY`;"). + Check(testkit.Rows( + // digest in cache + // "show databases ;" + "show databases ; dcd020298c5f79e8dc9d63b3098083601614a04a52db458738347d15ea5712a1", + // digest evicted + " ", + )) + // forth sql, evict third sql from stmt_summary + tk.MustQuery("SELECT SCHEMA_NAME FROM `INFORMATION_SCHEMA`.`STATEMENTS_SUMMARY`;"). + Check(testkit.Rows( + // digest in cache + "test", // select xx from yy; + // digest evicted + "", + )) +} + +func TestStmtSummaryHistoryTableOther(t *testing.T) { + setupStmtSummary() + defer closeStmtSummary() + + store := testkit.CreateMockStore(t) + tk := newTestKitWithRoot(t, store) + + tk.MustExec("set global tidb_stmt_summary_max_stmt_count = 1") + defer tk.MustExec("set global tidb_stmt_summary_max_stmt_count = 100") + + tk.MustExec("set global tidb_enable_stmt_summary = 0") + tk.MustExec("set global tidb_enable_stmt_summary = 1") + // first sql + tk.MustExec("set global tidb_stmt_summary_max_stmt_count=1") + // second sql, evict first sql from stmt_summary + tk.MustExec("show databases;") + // third sql, evict second sql from stmt_summary + tk.MustQuery("SELECT DIGEST_TEXT, DIGEST FROM `INFORMATION_SCHEMA`.`STATEMENTS_SUMMARY_HISTORY`;"). + Check(testkit.Rows( + // digest in cache + // "show databases ;" + "show databases ; dcd020298c5f79e8dc9d63b3098083601614a04a52db458738347d15ea5712a1", + // digest evicted + " ", + )) + // forth sql, evict third sql from stmt_summary + tk.MustQuery("SELECT SCHEMA_NAME FROM `INFORMATION_SCHEMA`.`STATEMENTS_SUMMARY_HISTORY`;"). + Check(testkit.Rows( + // digest in cache + "test", // select xx from yy; + // digest evicted + "", + )) +} + +func TestPerformanceSchemaforPlanCache(t *testing.T) { + setupStmtSummary() + defer closeStmtSummary() + + store := testkit.CreateMockStore(t) + tmp := testkit.NewTestKit(t, store) + tmp.MustExec("set tidb_enable_prepared_plan_cache=ON") + tk := newTestKitWithPlanCache(t, store) + + // Clear summaries. + tk.MustExec("set global tidb_enable_stmt_summary = 0") + tk.MustExec("set global tidb_enable_stmt_summary = 1") + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int)") + tk.MustExec("prepare stmt from 'select * from t'") + tk.MustExec("execute stmt") + tk.MustQuery("select plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from `t`'").Check( + testkit.Rows("0 0")) + tk.MustExec("execute stmt") + tk.MustExec("execute stmt") + tk.MustExec("execute stmt") + tk.MustQuery("select plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from `t`'").Check( + testkit.Rows("3 1")) +} + +func newTestKit(t *testing.T, store kv.Storage) *testkit.TestKit { + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + return tk +} + +func newTestKitWithRoot(t *testing.T, store kv.Storage) *testkit.TestKit { + tk := newTestKit(t, store) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) + return tk +} + +func newTestKitWithPlanCache(t *testing.T, store kv.Storage) *testkit.TestKit { + tk := testkit.NewTestKit(t, store) + se, err := session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: plannercore.NewLRUPlanCache(100, 0.1, math.MaxUint64, tk.Session()), + }) + require.NoError(t, err) + tk.SetSession(se) + tk.RefreshConnectionID() + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) + return tk +} + +func setupStmtSummary() { + stmtsummaryv2.Setup(&stmtsummaryv2.Config{ + Filename: "tidb-statements.log", + }) + config.UpdateGlobal(func(conf *config.Config) { + conf.Instance.StmtSummaryEnablePersistent = true + }) +} + +func closeStmtSummary() { + config.UpdateGlobal(func(conf *config.Config) { + conf.Instance.StmtSummaryEnablePersistent = false + }) + stmtsummaryv2.GlobalStmtSummary.Close() + stmtsummaryv2.GlobalStmtSummary = nil +} diff --git a/util/syncutil/BUILD.bazel b/util/syncutil/BUILD.bazel new file mode 100644 index 0000000000000..7703cfd35f89b --- /dev/null +++ b/util/syncutil/BUILD.bazel @@ -0,0 +1,12 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "syncutil", + srcs = [ + "mutex_deadlock.go", #keep + "mutex_sync.go", + ], + importpath = "github.com/pingcap/tidb/util/syncutil", + visibility = ["//visibility:public"], + deps = ["@com_github_sasha_s_go_deadlock//:go-deadlock"], #keep +) diff --git a/util/syncutil/mutex_deadlock.go b/util/syncutil/mutex_deadlock.go new file mode 100644 index 0000000000000..8879ff5138104 --- /dev/null +++ b/util/syncutil/mutex_deadlock.go @@ -0,0 +1,40 @@ +// Copyright 2023 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. + +//go:build deadlock + +package syncutil + +import ( + "time" + + deadlock "github.com/sasha-s/go-deadlock" +) + +// EnableDeadlock is a flag to enable deadlock detection. +const EnableDeadlock = true + +func init() { + deadlock.Opts.DeadlockTimeout = 20 * time.Second +} + +// A Mutex is a mutual exclusion lock. +type Mutex struct { + deadlock.Mutex +} + +// An RWMutex is a reader/writer mutual exclusion lock. +type RWMutex struct { + deadlock.RWMutex +} diff --git a/util/syncutil/mutex_sync.go b/util/syncutil/mutex_sync.go new file mode 100644 index 0000000000000..c6bdc55ccf87b --- /dev/null +++ b/util/syncutil/mutex_sync.go @@ -0,0 +1,32 @@ +// Copyright 2023 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. + +//go:build !deadlock + +package syncutil + +import "sync" + +// EnableDeadlock is a flag to enable deadlock detection. +const EnableDeadlock = false + +// A Mutex is a mutual exclusion lock. +type Mutex struct { + sync.Mutex +} + +// An RWMutex is a reader/writer mutual exclusion lock. +type RWMutex struct { + sync.RWMutex +} diff --git a/util/sys/linux/BUILD.bazel b/util/sys/linux/BUILD.bazel index 1212afe2fc3d9..f1363c2cb0d71 100644 --- a/util/sys/linux/BUILD.bazel +++ b/util/sys/linux/BUILD.bazel @@ -9,7 +9,48 @@ go_library( ], importpath = "github.com/pingcap/tidb/util/sys/linux", visibility = ["//visibility:public"], - deps = ["@org_golang_x_sys//unix"], + deps = select({ + "@io_bazel_rules_go//go/platform:aix": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:android": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:darwin": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:dragonfly": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:freebsd": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:illumos": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:ios": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:js": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:linux": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:netbsd": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:openbsd": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:plan9": [ + "@org_golang_x_sys//unix", + ], + "@io_bazel_rules_go//go/platform:solaris": [ + "@org_golang_x_sys//unix", + ], + "//conditions:default": [], + }), ) go_test( diff --git a/util/systimemon/systime_mon.go b/util/systimemon/systime_mon.go index 67b23ed894b5b..26819a4159776 100644 --- a/util/systimemon/systime_mon.go +++ b/util/systimemon/systime_mon.go @@ -22,11 +22,10 @@ import ( ) // StartMonitor calls systimeErrHandler if system time jump backward. -func StartMonitor(now func() time.Time, systimeErrHandler func(), successCallback func()) { +func StartMonitor(now func() time.Time, systimeErrHandler func()) { logutil.BgLogger().Info("start system time monitor") tick := time.NewTicker(100 * time.Millisecond) defer tick.Stop() - tickCount := 0 for { last := now().UnixNano() <-tick.C @@ -34,11 +33,5 @@ func StartMonitor(now func() time.Time, systimeErrHandler func(), successCallbac logutil.BgLogger().Error("system time jump backward", zap.Int64("last", last)) systimeErrHandler() } - // call successCallback per second. - tickCount++ - if tickCount >= 10 { - tickCount = 0 - successCallback() - } } } diff --git a/util/systimemon/systime_mon_test.go b/util/systimemon/systime_mon_test.go index f05098b63db7e..6964a9ac3d70d 100644 --- a/util/systimemon/systime_mon_test.go +++ b/util/systimemon/systime_mon_test.go @@ -35,7 +35,7 @@ func TestSystimeMonitor(t *testing.T) { return time.Now().Add(-2 * time.Second) }, func() { errTriggered.Store(true) - }, func() {}) + }) require.Eventually(t, errTriggered.Load, time.Second, 10*time.Millisecond) } diff --git a/util/testleak/BUILD.bazel b/util/testleak/BUILD.bazel deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/util/tiflashcompute/BUILD.bazel b/util/tiflashcompute/BUILD.bazel new file mode 100644 index 0000000000000..1d897962e04af --- /dev/null +++ b/util/tiflashcompute/BUILD.bazel @@ -0,0 +1,15 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "tiflashcompute", + srcs = ["topo_fetcher.go"], + importpath = "github.com/pingcap/tidb/util/tiflashcompute", + visibility = ["//visibility:public"], + deps = [ + "//errno", + "//util/dbterror", + "//util/logutil", + "@com_github_pingcap_errors//:errors", + "@org_uber_go_zap//:zap", + ], +) diff --git a/util/tiflashcompute/topo_fetcher.go b/util/tiflashcompute/topo_fetcher.go new file mode 100644 index 0000000000000..877d3a0519448 --- /dev/null +++ b/util/tiflashcompute/topo_fetcher.go @@ -0,0 +1,464 @@ +// Copyright 2023 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 tiflashcompute + +import ( + "encoding/json" + "io/ioutil" + "net/http" + "net/url" + "strconv" + "strings" + "sync" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/util/dbterror" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" +) + +var globalTopoFetcher TopoFetcher +var _ TopoFetcher = &MockTopoFetcher{} +var _ TopoFetcher = &AWSTopoFetcher{} +var _ TopoFetcher = &TestTopoFetcher{} + +const ( + // MockASStr is string value for mock AutoScaler. + MockASStr = "mock" + // AWSASStr is string value for aws AutoScaler. + AWSASStr = "aws" + // GCPASStr is string value for gcp AutoScaler. + GCPASStr = "gcp" + // TestASStr is string value for test AutoScaler. + TestASStr = "test" + // InvalidASStr is string value for invalid AutoScaler. + InvalidASStr = "invalid" +) + +const ( + // MockASType is int value for mock AutoScaler. + MockASType int = iota + // AWSASType is int value for aws AutoScaler. + AWSASType + // GCPASType is int value for gcp AutoScaler. + GCPASType + // TestASType is for local tidb test AutoScaler. + TestASType + // InvalidASType is int value for invalid check. + InvalidASType +) + +const ( + // DefAWSAutoScalerAddr is the default address for AWS AutoScaler. + DefAWSAutoScalerAddr = "tiflash-autoscale-lb.tiflash-autoscale.svc.cluster.local:8081" + // DefASStr default AutoScaler. + DefASStr = AWSASStr + + awsFixedPoolHTTPPath = "sharedfixedpool" + awsFetchHTTPPath = "resume-and-get-topology" + httpGetFailedErrMsg = "get tiflash_compute topology failed" + parseTopoTSFailedErrMsg = "parse timestamp of tiflash_compute topology failed" +) + +var errTopoFetcher = dbterror.ClassUtil.NewStd(errno.ErrInternal) + +// TopoFetcher is interface for fetching topo from AutoScaler. +// We support the following kinds of AutoScaler for now: +// 1. MockAutoScaler: Normally for test, can run in local environment. +// 2. AWSAutoScaler: AutoScaler runs on AWS. +// 3. GCPAutoScaler: AutoScaler runs on GCP. +// 4. TestAutoScaler: AutoScaler just for unit test. +type TopoFetcher interface { + // Return tiflash compute topo cache, if topo is empty, will fetch topo from AutoScaler. + // If topo is empty after fetch, will return error. + AssureAndGetTopo() ([]string, error) + + // Always fetch topo from AutoScaler, then return topo. + // If topo is empty, will not return error. You can call AssureAndGetTopo() to make sure topo is not empty. + FetchAndGetTopo() ([]string, error) +} + +// IsValidAutoScalerConfig return true if user config of autoscaler type is valid. +func IsValidAutoScalerConfig(typ string) bool { + t := getAutoScalerType(typ) + return t == MockASType || t == AWSASType || t == GCPASType +} + +// getAutoScalerType return topo fetcher type. +func getAutoScalerType(typ string) int { + switch typ { + case MockASStr: + return MockASType + case AWSASStr: + return AWSASType + case GCPASStr: + return GCPASType + case TestASStr: + return TestASType + default: + return InvalidASType + } +} + +// InitGlobalTopoFetcher init globalTopoFetcher if is in disaggregated-tiflash mode. It's not thread-safe. +func InitGlobalTopoFetcher(typ string, addr string, clusterID string, isFixedPool bool) (err error) { + logutil.BgLogger().Info("init globalTopoFetcher", zap.Any("type", typ), zap.Any("addr", addr), + zap.Any("clusterID", clusterID), zap.Any("isFixedPool", isFixedPool)) + + ft := getAutoScalerType(typ) + switch ft { + case MockASType: + globalTopoFetcher = NewMockAutoScalerFetcher(addr) + case AWSASType: + globalTopoFetcher = NewAWSAutoScalerFetcher(addr, clusterID, isFixedPool) + case GCPASType: + err = errors.Errorf("topo fetch not implemented yet(%s)", typ) + case TestASType: + globalTopoFetcher = NewTestAutoScalerFetcher() + default: + globalTopoFetcher = nil + err = errors.Errorf("unexpected topo fetch type. expect: %s or %s or %s, got %s", + MockASStr, AWSASStr, GCPASStr, typ) + } + return err +} + +// GetGlobalTopoFetcher return global topo fetcher, not thread safe. +func GetGlobalTopoFetcher() TopoFetcher { + return globalTopoFetcher +} + +// MockTopoFetcher will fetch topo from MockAutoScaler. +// MockScaler can run in local environment. +type MockTopoFetcher struct { + mu struct { + sync.RWMutex + topo []string + } + // Mock AutoScaler addr. + addr string +} + +// NewMockAutoScalerFetcher create a new MockTopoFetcher. +func NewMockAutoScalerFetcher(addr string) *MockTopoFetcher { + f := &MockTopoFetcher{} + f.mu.topo = make([]string, 0, 8) + f.addr = addr + return f +} + +// AssureAndGetTopo implements TopoFetcher interface. +func (f *MockTopoFetcher) AssureAndGetTopo() ([]string, error) { + curTopo := f.getTopo() + + if len(curTopo) == 0 { + logutil.BgLogger().Info("tiflash compute topo is empty, updating") + err := f.assureTopo(1) + if err != nil { + return nil, err + } + } + + curTopo = f.getTopo() + logutil.BgLogger().Debug("AssureAndGetTopo", zap.Any("topo", curTopo)) + if len(curTopo) == 0 { + return curTopo, errors.New("topo is still empty after updated from mock AutoScaler") + } + return curTopo, nil +} + +// FetchAndGetTopo implements TopoFetcher interface. +func (f *MockTopoFetcher) FetchAndGetTopo() ([]string, error) { + err := f.fetchTopo() + if err != nil { + return nil, err + } + + curTopo := f.getTopo() + logutil.BgLogger().Debug("FetchAndGetTopo", zap.Any("topo", curTopo)) + return curTopo, nil +} + +// getTopo return the cached topo. +func (f *MockTopoFetcher) getTopo() []string { + f.mu.RLock() + defer f.mu.RUnlock() + return f.mu.topo +} + +// assureTopo will make sure topo is greater than nodeNum. +func (f *MockTopoFetcher) assureTopo(nodeNum int) error { + para := url.Values{} + para.Add("node_num", strconv.Itoa(nodeNum)) + u := url.URL{ + Scheme: "http", + Host: f.addr, + Path: "/assume-and-get-topo", + RawQuery: para.Encode(), + } + url := u.String() + logutil.BgLogger().Info("assureTopo", zap.Any("url", url)) + + newTopo, err := mockHTTPGetAndParseResp(url) + if err != nil { + return err + } + + f.mu.Lock() + defer f.mu.Unlock() + f.mu.topo = newTopo + return nil +} + +// fetchTopo will fetch newest topo from mock autoscaler. +func (f *MockTopoFetcher) fetchTopo() error { + u := url.URL{ + Scheme: "http", + Host: f.addr, + Path: "/fetch_topo", + } + url := u.String() + logutil.BgLogger().Info("fetchTopo", zap.Any("url", url)) + + newTopo, err := mockHTTPGetAndParseResp(url) + if err != nil { + return err + } + + f.mu.Lock() + defer f.mu.Unlock() + f.mu.topo = newTopo + return nil +} + +func httpGetAndParseResp(url string) ([]byte, error) { + resp, err := http.Get(url) + if err != nil { + logutil.BgLogger().Error(err.Error()) + return nil, errTopoFetcher.GenWithStackByArgs(httpGetFailedErrMsg) + } + defer resp.Body.Close() + + b, err := ioutil.ReadAll(resp.Body) + if err != nil { + logutil.BgLogger().Error(err.Error()) + return nil, errTopoFetcher.GenWithStackByArgs(httpGetFailedErrMsg) + } + bStr := string(b) + if resp.StatusCode != http.StatusOK { + logutil.BgLogger().Error("http get mock AutoScaler failed", zap.Any("url", url), + zap.Any("status code", http.StatusText(resp.StatusCode)), + zap.Any("http body", bStr)) + return nil, errTopoFetcher.GenWithStackByArgs(httpGetFailedErrMsg) + } + return b, nil +} + +// mockHTTPGetAndParseResp send http get request and parse topo to []string. +func mockHTTPGetAndParseResp(url string) ([]string, error) { + b, err := httpGetAndParseResp(url) + if err != nil { + return nil, err + } + + // For MockAutoScaler, topo is like: ip:port;ip:port. + bStr := string(b) + newTopo := strings.Split(bStr, ";") + if len(bStr) == 0 || len(newTopo) == 0 { + return nil, errors.New("topo list is empty") + } + logutil.BgLogger().Debug("httpGetAndParseResp succeed", zap.Any("new topo", newTopo)) + return newTopo, nil +} + +// AWSTopoFetcher will fetch topo from AWSAutoScaler. +type AWSTopoFetcher struct { + mu struct { + sync.RWMutex + topo []string + topoTS int64 + } + // AWS AutoScaler addr. + // These should be init when TiDB start, all single threaded, no need to lock. + addr string + clusterID string + isFixedPool bool +} + +type resumeAndGetTopologyResult struct { + HasError int `json:"hasError"` + ErrorInfo string `json:"errorInfo"` + State string `json:"state"` + Topology []string `json:"topology"` + Timestamp string `json:"timestamp"` +} + +// NewAWSAutoScalerFetcher create a new AWSTopoFetcher. +func NewAWSAutoScalerFetcher(addr string, clusterID string, isFixed bool) *AWSTopoFetcher { + f := &AWSTopoFetcher{} + f.mu.topo = make([]string, 0, 8) + f.mu.topoTS = -1 + f.addr = addr + f.clusterID = clusterID + f.isFixedPool = isFixed + return f +} + +// AssureAndGetTopo implements TopoFetcher interface. +func (*AWSTopoFetcher) AssureAndGetTopo() ([]string, error) { + return nil, errors.New("AWSTopoFetcher AssureAndGetTopo not implemented") +} + +// FetchAndGetTopo implements TopoFetcher interface. +func (f *AWSTopoFetcher) FetchAndGetTopo() (curTopo []string, err error) { + defer func() { + logutil.BgLogger().Info("AWSTopoFetcher FetchAndGetTopo done", zap.Any("curTopo", curTopo)) + }() + + if f.isFixedPool { + // todo: delete this when AssureAndGetTopo() is done. + curTopo, _ = f.getTopo() + if len(curTopo) != 0 { + return curTopo, nil + } + + if err = f.fetchFixedPoolTopo(); err != nil { + return nil, err + } + curTopo, _ = f.getTopo() + return curTopo, nil + } + + if err = f.fetchTopo(); err != nil { + return nil, err + } + + curTopo, _ = f.getTopo() + return curTopo, nil +} + +func awsHTTPGetAndParseResp(url string) (*resumeAndGetTopologyResult, error) { + b, err := httpGetAndParseResp(url) + if err != nil { + return nil, err + } + + res := &resumeAndGetTopologyResult{} + if err = json.Unmarshal(b, &res); err != nil { + logutil.BgLogger().Error(err.Error()) + return nil, errTopoFetcher.GenWithStackByArgs(httpGetFailedErrMsg) + } + + logutil.BgLogger().Info("awsHTTPGetAndParseResp succeed", zap.Any("resp", res)) + return res, nil +} + +func (f *AWSTopoFetcher) tryUpdateTopo(newTopo *resumeAndGetTopologyResult) (updated bool, err error) { + cachedTopo, cachedTS := f.getTopo() + newTS, err := strconv.ParseInt(newTopo.Timestamp, 10, 64) + defer func() { + logutil.BgLogger().Info("try update topo", zap.Any("updated", updated), zap.Any("err", err), + zap.Any("cached TS", cachedTS), zap.Any("cached Topo", cachedTopo), + zap.Any("fetch TS", newTopo.Timestamp), zap.Any("converted TS", newTS), zap.Any("fetch topo", newTopo.Topology)) + }() + if err != nil { + return updated, errTopoFetcher.GenWithStackByArgs(parseTopoTSFailedErrMsg) + } + + if cachedTS >= newTS { + return + } + + f.mu.Lock() + defer f.mu.Unlock() + cachedTS = f.mu.topoTS + if cachedTS > newTS { + return + } + updated = true + f.mu.topo = newTopo.Topology + f.mu.topoTS = newTS + return +} + +func (f *AWSTopoFetcher) fetchFixedPoolTopo() error { + u := url.URL{ + Scheme: "http", + Host: f.addr, + Path: awsFixedPoolHTTPPath, + } + url := u.String() + logutil.BgLogger().Info("fetchFixedPoolTopo", zap.Any("url", url)) + + newTopo, err := awsHTTPGetAndParseResp(url) + if err != nil { + return err + } + + _, err = f.tryUpdateTopo(newTopo) + if err != nil { + return err + } + return nil +} + +func (f *AWSTopoFetcher) fetchTopo() error { + para := url.Values{} + para.Add("tidbclusterid", f.clusterID) + u := url.URL{ + Scheme: "http", + Host: f.addr, + Path: awsFetchHTTPPath, + RawQuery: para.Encode(), + } + url := u.String() + logutil.BgLogger().Info("fetchTopo", zap.Any("url", url)) + + newTopo, err := awsHTTPGetAndParseResp(url) + if err != nil { + return err + } + + _, err = f.tryUpdateTopo(newTopo) + if err != nil { + return err + } + return nil +} + +func (f *AWSTopoFetcher) getTopo() ([]string, int64) { + f.mu.RLock() + defer f.mu.RUnlock() + return f.mu.topo, f.mu.topoTS +} + +// TestTopoFetcher will return empty topo list, just for unit test. +type TestTopoFetcher struct{} + +// NewTestAutoScalerFetcher returns TestTopoFetcher. +func NewTestAutoScalerFetcher() *TestTopoFetcher { + return &TestTopoFetcher{} +} + +// AssureAndGetTopo implements TopoFetcher interface. +func (*TestTopoFetcher) AssureAndGetTopo() ([]string, error) { + return []string{}, nil +} + +// FetchAndGetTopo implements TopoFetcher interface. +func (*TestTopoFetcher) FetchAndGetTopo() ([]string, error) { + return []string{}, nil +} diff --git a/util/topsql/BUILD.bazel b/util/topsql/BUILD.bazel index f90cf35b09e8f..9cfac0291454c 100644 --- a/util/topsql/BUILD.bazel +++ b/util/topsql/BUILD.bazel @@ -42,6 +42,7 @@ go_test( "@com_github_pingcap_tipb//go-tipb", "@com_github_stretchr_testify//require", "@org_golang_google_grpc//:grpc", + "@org_golang_google_grpc//credentials/insecure", "@org_golang_google_grpc//keepalive", "@org_uber_go_goleak//:goleak", ], diff --git a/util/topsql/reporter/BUILD.bazel b/util/topsql/reporter/BUILD.bazel index 6c1def091ee39..98a83a0d00910 100644 --- a/util/topsql/reporter/BUILD.bazel +++ b/util/topsql/reporter/BUILD.bazel @@ -27,6 +27,7 @@ go_library( "@com_github_wangjohn_quickselect//:quickselect", "@org_golang_google_grpc//:grpc", "@org_golang_google_grpc//backoff", + "@org_golang_google_grpc//credentials/insecure", "@org_uber_go_atomic//:atomic", "@org_uber_go_zap//:zap", ], diff --git a/util/topsql/reporter/single_target.go b/util/topsql/reporter/single_target.go index bf66414b674d4..16c88956453cd 100644 --- a/util/topsql/reporter/single_target.go +++ b/util/topsql/reporter/single_target.go @@ -28,6 +28,7 @@ import ( "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/backoff" + "google.golang.org/grpc/credentials/insecure" ) const ( @@ -357,7 +358,7 @@ func (*SingleTargetDataSink) dial(ctx context.Context, targetRPCAddr string) (*g dialCtx, targetRPCAddr, grpc.WithBlock(), - grpc.WithInsecure(), + grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithInitialWindowSize(grpcInitialWindowSize), grpc.WithInitialConnWindowSize(grpcInitialConnWindowSize), grpc.WithDefaultCallOptions( diff --git a/util/topsql/topsql_test.go b/util/topsql/topsql_test.go index 04855ac163011..1862b090a94de 100644 --- a/util/topsql/topsql_test.go +++ b/util/topsql/topsql_test.go @@ -32,6 +32,7 @@ import ( "github.com/pingcap/tipb/go-tipb" "github.com/stretchr/testify/require" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/keepalive" ) @@ -241,7 +242,7 @@ func TestTopSQLPubSub(t *testing.T) { conn, err := grpc.Dial( server.Address(), grpc.WithBlock(), - grpc.WithInsecure(), + grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithKeepaliveParams(keepalive.ClientParameters{ Time: 10 * time.Second, Timeout: 3 * time.Second, @@ -363,7 +364,7 @@ func TestPubSubWhenReporterIsStopped(t *testing.T) { conn, err := grpc.Dial( server.Address(), grpc.WithBlock(), - grpc.WithInsecure(), + grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithKeepaliveParams(keepalive.ClientParameters{ Time: 10 * time.Second, Timeout: 3 * time.Second, diff --git a/util/tracing/util.go b/util/tracing/util.go index 34953c72482a6..924e2eb039f44 100644 --- a/util/tracing/util.go +++ b/util/tracing/util.go @@ -16,6 +16,7 @@ package tracing import ( "context" + "runtime/trace" "github.com/opentracing/basictracer-go" "github.com/opentracing/opentracing-go" @@ -66,3 +67,46 @@ func ChildSpanFromContxt(ctx context.Context, opName string) (opentracing.Span, } return noopSpan(), ctx } + +// StartRegion provides better API, integrating both opentracing and runtime.trace facilities into one. +// Recommended usage is +// +// defer tracing.StartRegion(ctx, "myTracedRegion").End() +func StartRegion(ctx context.Context, regionType string) Region { + r := trace.StartRegion(ctx, regionType) + var span1 opentracing.Span + if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { + span1 = span.Tracer().StartSpan(regionType, opentracing.ChildOf(span.Context())) + } + return Region{ + Region: r, + Span: span1, + } +} + +// StartRegionEx returns Region together with the context. +// Recommended usage is +// +// r, ctx := tracing.StartRegionEx(ctx, "myTracedRegion") +// defer r.End() +func StartRegionEx(ctx context.Context, regionType string) (Region, context.Context) { + r := StartRegion(ctx, regionType) + if r.Span != nil { + ctx = opentracing.ContextWithSpan(ctx, r.Span) + } + return r, ctx +} + +// Region is a region of code whose execution time interval is traced. +type Region struct { + *trace.Region + opentracing.Span +} + +// End marks the end of the traced code region. +func (r Region) End() { + if r.Span != nil { + r.Span.Finish() + } + r.Region.End() +} diff --git a/util/util.go b/util/util.go index 8af2876240486..19db12aad1d4a 100644 --- a/util/util.go +++ b/util/util.go @@ -15,9 +15,12 @@ package util import ( + "bufio" + "bytes" "encoding/json" "fmt" - "io/ioutil" + "io" + "net" "net/http" "strconv" "strings" @@ -25,6 +28,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/parser" + "go.uber.org/atomic" "go.uber.org/zap" ) @@ -60,6 +64,8 @@ func StringsToInterfaces(strs []string) []interface{} { // return errors.Trace(err) // } // fmt.Println(resp.IP) +// +// nolint:unused func GetJSON(client *http.Client, url string, v interface{}) error { resp, err := client.Get(url) if err != nil { @@ -68,7 +74,7 @@ func GetJSON(client *http.Client, url string, v interface{}) error { defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - body, err := ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) if err != nil { return errors.Trace(err) } @@ -106,6 +112,11 @@ func Str2Int64Map(str string) map[int64]struct{} { // GenLogFields generate log fields. func GenLogFields(costTime time.Duration, info *ProcessInfo, needTruncateSQL bool) []zap.Field { + if info.RefCountOfStmtCtx != nil && !info.RefCountOfStmtCtx.TryIncrease() { + return nil + } + defer info.RefCountOfStmtCtx.Decrease() + logFields := make([]zap.Field, 0, 20) logFields = append(logFields, zap.String("cost_time", strconv.FormatFloat(costTime.Seconds(), 'f', -1, 64)+"s")) execDetail := info.StmtCtx.GetExecDetails() @@ -169,3 +180,106 @@ func GenLogFields(costTime time.Duration, info *ProcessInfo, needTruncateSQL boo logFields = append(logFields, zap.String("sql", sql)) return logFields } + +// PrintableASCII detects if b is a printable ASCII character. +// Ref to:http://facweb.cs.depaul.edu/sjost/it212/documents/ascii-pr.htm +func PrintableASCII(b byte) bool { + if b < 32 || b > 127 { + return false + } + + return true +} + +// FmtNonASCIIPrintableCharToHex turns non-printable-ASCII characters into Hex +func FmtNonASCIIPrintableCharToHex(str string) string { + var b bytes.Buffer + b.Grow(len(str) * 2) + for i := 0; i < len(str); i++ { + if PrintableASCII(str[i]) { + b.WriteByte(str[i]) + continue + } + + b.WriteString(`\x`) + // turns non-printable-ASCII character into hex-string + b.WriteString(fmt.Sprintf("%02X", str[i])) + } + return b.String() +} + +// TCPConnWithIOCounter is a wrapper of net.TCPConn with counter that accumulates +// the bytes this connection reads/writes. +type TCPConnWithIOCounter struct { + *net.TCPConn + c *atomic.Uint64 +} + +// NewTCPConnWithIOCounter creates a new TCPConnWithIOCounter. +func NewTCPConnWithIOCounter(conn *net.TCPConn, c *atomic.Uint64) net.Conn { + return &TCPConnWithIOCounter{ + TCPConn: conn, + c: c, + } +} + +func (t *TCPConnWithIOCounter) Read(b []byte) (n int, err error) { + n, err = t.TCPConn.Read(b) + t.c.Add(uint64(n)) + return n, err +} + +func (t *TCPConnWithIOCounter) Write(b []byte) (n int, err error) { + n, err = t.TCPConn.Write(b) + t.c.Add(uint64(n)) + return n, err +} + +// ReadLine tries to read a complete line from bufio.Reader. +// maxLineSize specifies the maximum size of a single line. +func ReadLine(reader *bufio.Reader, maxLineSize int) ([]byte, error) { + var resByte []byte + lineByte, isPrefix, err := reader.ReadLine() + if isPrefix { + // Need to read more data. + resByte = make([]byte, len(lineByte), len(lineByte)*2) + } else { + resByte = make([]byte, len(lineByte)) + } + // Use copy here to avoid shallow copy problem. + copy(resByte, lineByte) + if err != nil { + return resByte, err + } + var tempLine []byte + for isPrefix { + tempLine, isPrefix, err = reader.ReadLine() + resByte = append(resByte, tempLine...) // nozero + // Use maxLineSize to check the single line length. + if len(resByte) > maxLineSize { + return resByte, errors.Errorf("single line length exceeds limit: %v", maxLineSize) + } + if err != nil { + return resByte, err + } + } + return resByte, err +} + +// ReadLines tries to read lines from bufio.Reader. +// count specifies the number of lines. +// maxLineSize specifies the maximum size of a single line. +func ReadLines(reader *bufio.Reader, count int, maxLineSize int) ([][]byte, error) { + lines := make([][]byte, 0, count) + for i := 0; i < count; i++ { + line, err := ReadLine(reader, maxLineSize) + if err == io.EOF && len(lines) > 0 { + return lines, nil + } + if err != nil { + return nil, err + } + lines = append(lines, line) + } + return lines, nil +} diff --git a/util/util_test.go b/util/util_test.go index 7eb06e1071073..cdd173e7a6c48 100644 --- a/util/util_test.go +++ b/util/util_test.go @@ -15,12 +15,16 @@ package util import ( + "bufio" + "io" + "strings" "testing" "time" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/util/memory" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestLogFormat(t *testing.T) { @@ -28,6 +32,7 @@ func TestLogFormat(t *testing.T) { mem.Consume(1<<30 + 1<<29 + 1<<28 + 1<<27) mockTooLongQuery := make([]byte, 1024*9) + var refCount stmtctx.ReferenceCount = 0 info := &ProcessInfo{ ID: 233, User: "PingCAP", @@ -38,9 +43,10 @@ func TestLogFormat(t *testing.T) { StatsInfo: func(interface{}) map[string]uint64 { return nil }, - StmtCtx: &stmtctx.StatementContext{}, - MemTracker: mem, - RedactSQL: false, + StmtCtx: &stmtctx.StatementContext{}, + RefCountOfStmtCtx: &refCount, + MemTracker: mem, + RedactSQL: false, } costTime := time.Second * 233 logSQLTruncateLen := 1024 * 8 @@ -70,3 +76,21 @@ func TestLogFormat(t *testing.T) { logFields = GenLogFields(costTime, info, false) assert.Equal(t, len(logFields[6].String), len(mockTooLongQuery)) } + +func TestReadLine(t *testing.T) { + reader := bufio.NewReader(strings.NewReader(`line1 +line2 +line3`)) + line, err := ReadLine(reader, 1024) + require.NoError(t, err) + require.Equal(t, "line1", string(line)) + line, err = ReadLine(reader, 1024) + require.NoError(t, err) + require.Equal(t, "line2", string(line)) + line, err = ReadLine(reader, 1024) + require.NoError(t, err) + require.Equal(t, "line3", string(line)) + line, err = ReadLine(reader, 1024) + require.Equal(t, io.EOF, err) + require.Len(t, line, 0) +} diff --git a/util/wait_group_wrapper.go b/util/wait_group_wrapper.go index 3fb72049f1365..21f808934f8d7 100644 --- a/util/wait_group_wrapper.go +++ b/util/wait_group_wrapper.go @@ -16,8 +16,129 @@ package util import ( "sync" + "time" + + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" ) +// WaitGroupEnhancedWrapper wrapper wg, it provides the basic ability of WaitGroupWrapper with checking unexited process +// if the `exited` signal is true by print them on log. +type WaitGroupEnhancedWrapper struct { + sync.WaitGroup + source string + registerProcess sync.Map +} + +// NewWaitGroupEnhancedWrapper returns WaitGroupEnhancedWrapper, the empty source indicates the unit test, then +// the `checkUnExitedProcess` won't be executed. +func NewWaitGroupEnhancedWrapper(source string, exit chan struct{}, exitedCheck bool) *WaitGroupEnhancedWrapper { + wgew := &WaitGroupEnhancedWrapper{ + source: source, + registerProcess: sync.Map{}, + } + if exitedCheck { + wgew.Add(1) + go wgew.checkUnExitedProcess(exit) + } + return wgew +} + +func (w *WaitGroupEnhancedWrapper) checkUnExitedProcess(exit chan struct{}) { + defer func() { + logutil.BgLogger().Info("waitGroupWrapper exit-checking exited", zap.String("source", w.source)) + w.Done() + }() + logutil.BgLogger().Info("waitGroupWrapper enable exit-checking", zap.String("source", w.source)) + <-exit + logutil.BgLogger().Info("waitGroupWrapper start exit-checking", zap.String("source", w.source)) + if w.check() { + ticker := time.NewTimer(2 * time.Second) + defer ticker.Stop() + for { + <-ticker.C + continueCheck := w.check() + if !continueCheck { + return + } + } + } +} + +func (w *WaitGroupEnhancedWrapper) check() bool { + unexitedProcess := make([]string, 0) + w.registerProcess.Range(func(key, value any) bool { + unexitedProcess = append(unexitedProcess, key.(string)) + return true + }) + if len(unexitedProcess) > 0 { + logutil.BgLogger().Warn("background process unexited while received exited signal", + zap.Strings("process", unexitedProcess), + zap.String("source", w.source)) + return true + } + logutil.BgLogger().Info("waitGroupWrapper finish checking unexited process", zap.String("source", w.source)) + return false +} + +// Run runs a function in a goroutine, adds 1 to WaitGroup +// and calls done when function returns. Please DO NOT use panic +// in the cb function. +// Note that the registered label shouldn't be duplicated. +func (w *WaitGroupEnhancedWrapper) Run(exec func(), label string) { + w.onStart(label) + w.Add(1) + go func() { + defer func() { + w.onExit(label) + w.Done() + }() + exec() + }() +} + +// RunWithRecover wraps goroutine startup call with force recovery, add 1 to WaitGroup +// and call done when function return. +// exec is that execute logic function. recoverFn is that handler will be called after recover and before dump stack, +// passing `nil` means noop. +// Note that the registered label shouldn't be duplicated. +func (w *WaitGroupEnhancedWrapper) RunWithRecover(exec func(), recoverFn func(r interface{}), label string) { + w.onStart(label) + w.Add(1) + go func() { + defer func() { + r := recover() + if r != nil && recoverFn != nil { + logutil.BgLogger().Info("WaitGroupEnhancedWrapper exec panic recovered", zap.String("process", label)) + recoverFn(r) + } + w.onExit(label) + w.Done() + }() + exec() + }() +} + +func (w *WaitGroupEnhancedWrapper) onStart(label string) { + _, ok := w.registerProcess.Load(label) + if ok { + logutil.BgLogger().Panic("WaitGroupEnhancedWrapper received duplicated source process", + zap.String("source", w.source), + zap.String("process", label)) + } + w.registerProcess.Store(label, struct{}{}) + logutil.BgLogger().Info("background process started", + zap.String("source", w.source), + zap.String("process", label)) +} + +func (w *WaitGroupEnhancedWrapper) onExit(label string) { + w.registerProcess.Delete(label) + logutil.BgLogger().Info("background process exited", + zap.String("source", w.source), + zap.String("process", label)) +} + // WaitGroupWrapper is a wrapper for sync.WaitGroup type WaitGroupWrapper struct { sync.WaitGroup diff --git a/util/wait_group_wrapper_test.go b/util/wait_group_wrapper_test.go index 40e66fdaf5759..2d06abdd689df 100644 --- a/util/wait_group_wrapper_test.go +++ b/util/wait_group_wrapper_test.go @@ -15,7 +15,9 @@ package util import ( + "fmt" "testing" + "time" "github.com/stretchr/testify/require" "go.uber.org/atomic" @@ -32,6 +34,16 @@ func TestWaitGroupWrapperRun(t *testing.T) { } wg.Wait() require.Equal(t, expect, val.Load()) + + val.Store(0) + wg2 := NewWaitGroupEnhancedWrapper("", nil, false) + for i := int32(0); i < expect; i++ { + wg2.Run(func() { + val.Inc() + }, fmt.Sprintf("test_%v", i)) + } + wg2.Wait() + require.Equal(t, expect, val.Load()) } func TestWaitGroupWrapperRunWithRecover(t *testing.T) { @@ -47,4 +59,34 @@ func TestWaitGroupWrapperRunWithRecover(t *testing.T) { } wg.Wait() require.Equal(t, expect, val.Load()) + + val.Store(0) + wg2 := NewWaitGroupEnhancedWrapper("", nil, false) + for i := int32(0); i < expect; i++ { + wg2.RunWithRecover(func() { + panic("test1") + }, func(r interface{}) { + val.Inc() + }, fmt.Sprintf("test_%v", i)) + } + wg2.Wait() + require.Equal(t, expect, val.Load()) +} + +func TestWaitGroupWrapperCheck(t *testing.T) { + exit := make(chan struct{}) + wg := NewWaitGroupEnhancedWrapper("", exit, false) + quit := make(chan struct{}) + wg.Run(func() { + <-quit + }, "test") + + // need continue check as existed unexited process + close(exit) + require.True(t, wg.check()) + + // no need to continue check as all process exited + quit <- struct{}{} + time.Sleep(1 * time.Second) + require.False(t, wg.check()) } diff --git a/util/watcher/watcher.go b/util/watcher/watcher.go index d91bd89cd076f..fa09c058217b0 100644 --- a/util/watcher/watcher.go +++ b/util/watcher/watcher.go @@ -63,7 +63,7 @@ func NewWatcher() *Watcher { // Start starts the watching func (w *Watcher) Start(d time.Duration) error { - if !w.running.CAS(0, 1) { + if !w.running.CompareAndSwap(0, 1) { return ErrWatcherStarted } @@ -83,7 +83,7 @@ func (w *Watcher) Start(d time.Duration) error { // Close stops the watching func (w *Watcher) Close() { - if !w.running.CAS(1, 0) { + if !w.running.CompareAndSwap(1, 0) { return }